opensentinel 3.1.1 → 3.6.1

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 (325) hide show
  1. package/README.md +126 -83
  2. package/dist/agent-manager-7N7REQZQ.js +39 -0
  3. package/dist/agent-processor-I23VWQY3.js +280 -0
  4. package/dist/agent-processor-I23VWQY3.js.map +1 -0
  5. package/dist/agent-types-2T4PXLFQ.js +12 -0
  6. package/dist/alerting-4I37GG4U.js +699 -0
  7. package/dist/alerting-4I37GG4U.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/{archiver-AVNBYCKQ.js → archiver-XLRIIXPY.js} +86 -17
  11. package/dist/archiver-XLRIIXPY.js.map +1 -0
  12. package/dist/{audit-logger-OBPR7CRO.js → audit-logger-AU3TMWKI.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-MU2TJQ3Y.js +46 -0
  20. package/dist/brain-SLA474EU.js +65 -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-6PMVAAA7.js → chunk-2RGPWU77.js} +3 -3
  24. package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
  25. package/dist/{chunk-MXAPLSJ5.js → chunk-45YXODSB.js} +2 -2
  26. package/dist/{chunk-SJSUSJ47.js → chunk-4YJRBMMA.js} +2 -2
  27. package/dist/chunk-643M3AP5.js +564 -0
  28. package/dist/chunk-643M3AP5.js.map +1 -0
  29. package/dist/{chunk-766ASQWE.js → chunk-6JY4HNUH.js} +2413 -2368
  30. package/dist/chunk-6JY4HNUH.js.map +1 -0
  31. package/dist/chunk-6LTLIYAQ.js +194 -0
  32. package/dist/chunk-6LTLIYAQ.js.map +1 -0
  33. package/dist/chunk-6UZPE35A.js +724 -0
  34. package/dist/chunk-6UZPE35A.js.map +1 -0
  35. package/dist/chunk-6W6PTJFT.js +181 -0
  36. package/dist/chunk-6W6PTJFT.js.map +1 -0
  37. package/dist/chunk-7MZN73J2.js +162 -0
  38. package/dist/chunk-7MZN73J2.js.map +1 -0
  39. package/dist/{chunk-SVAPX2XN.js → chunk-A24GPVLY.js} +9 -7
  40. package/dist/{chunk-SVAPX2XN.js.map → chunk-A24GPVLY.js.map} +1 -1
  41. package/dist/chunk-AD6YEH6U.js +3408 -0
  42. package/dist/chunk-AD6YEH6U.js.map +1 -0
  43. package/dist/chunk-ADTDYJO7.js +265 -0
  44. package/dist/chunk-ADTDYJO7.js.map +1 -0
  45. package/dist/{chunk-WRAKK6K6.js → chunk-AR34B6XR.js} +5 -3
  46. package/dist/{chunk-WRAKK6K6.js.map → chunk-AR34B6XR.js.map} +1 -1
  47. package/dist/chunk-BMOUYXLX.js +418 -0
  48. package/dist/chunk-BMOUYXLX.js.map +1 -0
  49. package/dist/chunk-C6PELIHS.js +60 -0
  50. package/dist/chunk-C6PELIHS.js.map +1 -0
  51. package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
  52. package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
  53. package/dist/chunk-DOYGMNMK.js.map +1 -0
  54. package/dist/chunk-FFV2SXFD.js +380 -0
  55. package/dist/chunk-FFV2SXFD.js.map +1 -0
  56. package/dist/{chunk-EVE7MIIY.js → chunk-GUKKW7JI.js} +15 -16
  57. package/dist/chunk-GUKKW7JI.js.map +1 -0
  58. package/dist/{chunk-66OJ3WB4.js → chunk-H3BOLSTS.js} +2 -2
  59. package/dist/chunk-HKOPRRDJ.js +1021 -0
  60. package/dist/chunk-HKOPRRDJ.js.map +1 -0
  61. package/dist/{chunk-BXZ6EA52.js → chunk-HTF2GIQC.js} +57 -3
  62. package/dist/chunk-HTF2GIQC.js.map +1 -0
  63. package/dist/{chunk-TYAGMJNV.js → chunk-JOA5A3G3.js} +5 -5
  64. package/dist/{chunk-OCVQGBJK.js → chunk-KABG5PG3.js} +6 -4
  65. package/dist/{chunk-OCVQGBJK.js.map → chunk-KABG5PG3.js.map} +1 -1
  66. package/dist/{chunk-VEHFVBLI.js → chunk-KT7NLIXP.js} +2 -2
  67. package/dist/chunk-LFDXEYYB.js +150 -0
  68. package/dist/chunk-LFDXEYYB.js.map +1 -0
  69. package/dist/{chunk-I6BDYQIG.js → chunk-M7YLQHFP.js} +6 -6
  70. package/dist/chunk-M7YLQHFP.js.map +1 -0
  71. package/dist/{chunk-AYUKPTSM.js → chunk-MFK34XSY.js} +96 -218
  72. package/dist/chunk-MFK34XSY.js.map +1 -0
  73. package/dist/chunk-MIC5IBQF.js +386 -0
  74. package/dist/chunk-MIC5IBQF.js.map +1 -0
  75. package/dist/{chunk-4UOE5TUZ.js → chunk-NMSHVO5O.js} +4 -4
  76. package/dist/{chunk-XKYRH4FM.js → chunk-NYVBXUGD.js} +13 -32
  77. package/dist/chunk-NYVBXUGD.js.map +1 -0
  78. package/dist/chunk-ODCFS5WD.js +463 -0
  79. package/dist/chunk-ODCFS5WD.js.map +1 -0
  80. package/dist/{chunk-ZLZKF2PM.js → chunk-PUNIMPMY.js} +32 -2
  81. package/dist/chunk-PUNIMPMY.js.map +1 -0
  82. package/dist/chunk-S4NJJS5C.js +37 -0
  83. package/dist/chunk-S4NJJS5C.js.map +1 -0
  84. package/dist/{chunk-NHMBTUMW.js → chunk-TAAZB5KN.js} +2 -2
  85. package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
  86. package/dist/chunk-U2X2J3FI.js.map +1 -0
  87. package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
  88. package/dist/{chunk-4GLYY4NN.js → chunk-UWUIJTT4.js} +8 -2
  89. package/dist/chunk-UWUIJTT4.js.map +1 -0
  90. package/dist/{chunk-SPPMCAKG.js → chunk-VKMFUIVA.js} +2 -2
  91. package/dist/chunk-VKMFUIVA.js.map +1 -0
  92. package/dist/chunk-WZAH34TG.js +129 -0
  93. package/dist/chunk-WZAH34TG.js.map +1 -0
  94. package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
  95. package/dist/chunk-X6Q3K3L2.js.map +1 -0
  96. package/dist/chunk-XTX7EK43.js +134 -0
  97. package/dist/chunk-XTX7EK43.js.map +1 -0
  98. package/dist/chunk-ZIYTHUM5.js +457 -0
  99. package/dist/chunk-ZIYTHUM5.js.map +1 -0
  100. package/dist/chunker-K6WTR62A.js +12 -0
  101. package/dist/cli.js +1 -1
  102. package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
  103. package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
  104. package/dist/coding-agent-DESSU3AC.js +233 -0
  105. package/dist/coding-agent-DESSU3AC.js.map +1 -0
  106. package/dist/commands/setup.js +1 -1
  107. package/dist/commands/start.js +2 -2
  108. package/dist/commands/status.js +1 -1
  109. package/dist/commands/stop.js +1 -1
  110. package/dist/commands/utils.js +1 -1
  111. package/dist/cost-tracker-EMOIOYH7.js +11 -0
  112. package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
  113. package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
  114. package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
  115. package/dist/db-LRIOKQBO.js +77 -0
  116. package/dist/discord-NKR3X4AV.js +80 -0
  117. package/dist/documents-EYIYLZK2.js +184 -0
  118. package/dist/documents-EYIYLZK2.js.map +1 -0
  119. package/dist/docx-parser-EXL4TN5E.js +16 -0
  120. package/dist/{email-K7LO2IPB.js → email-EAQNULVD.js} +33 -25
  121. package/dist/{email-K7LO2IPB.js.map → email-EAQNULVD.js.map} +1 -1
  122. package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-OGHT6TS5.js} +11 -8
  123. package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-OGHT6TS5.js.map} +1 -1
  124. package/dist/enrichment-pipeline-CMUVBDC7.js +14 -0
  125. package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-4X4JU43O.js} +6 -5
  126. package/dist/env-CHOFICED.js +12 -0
  127. package/dist/error-tracker-SVQSDQDW.js +32 -0
  128. package/dist/finnhub-X7ZMQSXF.js +178 -0
  129. package/dist/finnhub-X7ZMQSXF.js.map +1 -0
  130. package/dist/fred-TMUF3J2V.js +203 -0
  131. package/dist/fred-TMUF3J2V.js.map +1 -0
  132. package/dist/github-KGNILDWJ.js +833 -0
  133. package/dist/github-KGNILDWJ.js.map +1 -0
  134. package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
  135. package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
  136. package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
  137. package/dist/hooks-N4MIFBVM.js +14 -0
  138. package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
  139. package/dist/imessage-V2XNDDHT.js +43 -0
  140. package/dist/inbox-summarizer-DKKRYXDR.js +55 -0
  141. package/dist/{incident-response-C5J7Q6DT.js → incident-response-ZTIKUWEO.js} +8 -6
  142. package/dist/{incident-response-C5J7Q6DT.js.map → incident-response-ZTIKUWEO.js.map} +1 -1
  143. package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
  144. package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
  145. package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
  146. package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
  147. package/dist/knowledge-base-J7PJ7MZ3.js +46 -0
  148. package/dist/lib.d.ts +73 -1
  149. package/dist/lib.js +86 -76
  150. package/dist/lib.js.map +1 -1
  151. package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
  152. package/dist/{matrix-QVHG76I7.js → matrix-XHTR53VQ.js} +29 -21
  153. package/dist/{matrix-QVHG76I7.js.map → matrix-XHTR53VQ.js.map} +1 -1
  154. package/dist/{mcp-3JI6W7ZE.js → mcp-3C2TN67D.js} +3 -3
  155. package/dist/metrics-VJDWQWU7.js +25 -0
  156. package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
  157. package/dist/multi-user-S56GUD6L.js +411 -0
  158. package/dist/multi-user-S56GUD6L.js.map +1 -0
  159. package/dist/{ocr-AC7NPX33.js → ocr-LGUIPKVZ.js} +6 -4
  160. package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
  161. package/dist/osint-agent-RL5XPBRQ.js +189 -0
  162. package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
  163. package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
  164. package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
  165. package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
  166. package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
  167. package/dist/pdf-parser-YLMTTYHL.js +14 -0
  168. package/dist/{presentations-DSV5IHG5.js → presentations-HXTAMGHT.js} +3 -3
  169. package/dist/presentations-HXTAMGHT.js.map +1 -0
  170. package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
  171. package/dist/{providers-J4LYPHDR.js → providers-H6YIC3MG.js} +6 -4
  172. package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
  173. package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
  174. package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
  175. package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
  176. package/dist/research-agent-WCRSY3UZ.js +168 -0
  177. package/dist/research-agent-WCRSY3UZ.js.map +1 -0
  178. package/dist/risk-engine-YKCPT5D5.js +10 -0
  179. package/dist/risk-engine-YKCPT5D5.js.map +1 -0
  180. package/dist/scheduler-CA5UNHZV.js +73 -0
  181. package/dist/scheduler-CA5UNHZV.js.map +1 -0
  182. package/dist/schema-ALJ67YVG.js +72 -0
  183. package/dist/schema-ALJ67YVG.js.map +1 -0
  184. package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
  185. package/dist/search-GMLKBHSW.js.map +1 -0
  186. package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
  187. package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
  188. package/dist/signal-X7IQJGRQ.js +43 -0
  189. package/dist/signal-X7IQJGRQ.js.map +1 -0
  190. package/dist/slack-P2LFUJUQ.js +85 -0
  191. package/dist/slack-P2LFUJUQ.js.map +1 -0
  192. package/dist/{sms-M3JIOTCW.js → sms-4VME2HUL.js} +4 -4
  193. package/dist/sms-4VME2HUL.js.map +1 -0
  194. package/dist/{src-VYUE6LRA.js → src-S5KX4YEV.js} +179 -48
  195. package/dist/src-S5KX4YEV.js.map +1 -0
  196. package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
  197. package/dist/stocks-4M4HZWZS.js.map +1 -0
  198. package/dist/text-extractor-OAUBAW5P.js +12 -0
  199. package/dist/text-extractor-OAUBAW5P.js.map +1 -0
  200. package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
  201. package/dist/text-transform-HCLCUDFZ.js.map +1 -0
  202. package/dist/tools-FGPN522P.js +46 -0
  203. package/dist/tools-FGPN522P.js.map +1 -0
  204. package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
  205. package/dist/tunnel-XOUVVRAK.js.map +1 -0
  206. package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
  207. package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
  208. package/dist/unit-converter-LYPAHU64.js.map +1 -0
  209. package/dist/whatsapp-KRPQ4YUX.js +43 -0
  210. package/dist/whatsapp-KRPQ4YUX.js.map +1 -0
  211. package/dist/{word-document-7B6SJMAY.js → word-document-D6N2C47N.js} +4 -4
  212. package/dist/word-document-D6N2C47N.js.map +1 -0
  213. package/dist/workflow-store-ZYAYE5P6.js +373 -0
  214. package/dist/workflow-store-ZYAYE5P6.js.map +1 -0
  215. package/dist/writing-agent-VDGLNOGO.js +243 -0
  216. package/dist/writing-agent-VDGLNOGO.js.map +1 -0
  217. package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
  218. package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
  219. package/package.json +11 -1
  220. package/dist/archiver-AVNBYCKQ.js.map +0 -1
  221. package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
  222. package/dist/bot-QRARP4UN.js +0 -36
  223. package/dist/brain-7XLLM3KC.js +0 -56
  224. package/dist/chunk-4GLYY4NN.js.map +0 -1
  225. package/dist/chunk-766ASQWE.js.map +0 -1
  226. package/dist/chunk-AYUKPTSM.js.map +0 -1
  227. package/dist/chunk-BRBWNV65.js.map +0 -1
  228. package/dist/chunk-BXZ6EA52.js.map +0 -1
  229. package/dist/chunk-EVE7MIIY.js.map +0 -1
  230. package/dist/chunk-H5RQOFO2.js.map +0 -1
  231. package/dist/chunk-I6BDYQIG.js.map +0 -1
  232. package/dist/chunk-IZJMVV7O.js +0 -347
  233. package/dist/chunk-IZJMVV7O.js.map +0 -1
  234. package/dist/chunk-O7IH7JTI.js +0 -1898
  235. package/dist/chunk-O7IH7JTI.js.map +0 -1
  236. package/dist/chunk-RZ4YESBG.js.map +0 -1
  237. package/dist/chunk-SPPMCAKG.js.map +0 -1
  238. package/dist/chunk-VRD5CYRL.js +0 -1568
  239. package/dist/chunk-VRD5CYRL.js.map +0 -1
  240. package/dist/chunk-XKYRH4FM.js.map +0 -1
  241. package/dist/chunk-ZLZKF2PM.js.map +0 -1
  242. package/dist/discord-B3HUPGQ6.js +0 -70
  243. package/dist/dist-UISMLMFN.js +0 -21847
  244. package/dist/dist-UISMLMFN.js.map +0 -1
  245. package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
  246. package/dist/env-IWXUVTCB.js +0 -12
  247. package/dist/imessage-NGA2XF2V.js +0 -35
  248. package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
  249. package/dist/presentations-DSV5IHG5.js.map +0 -1
  250. package/dist/scheduler-VK4WFERV.js +0 -63
  251. package/dist/signal-6CGDFYL2.js +0 -35
  252. package/dist/slack-IZQWIKOH.js +0 -75
  253. package/dist/src-VYUE6LRA.js.map +0 -1
  254. package/dist/tools-2RLEI2N6.js +0 -38
  255. package/dist/tunnel-IWMXUML4.js.map +0 -1
  256. package/dist/whatsapp-LFX6YKCM.js +0 -35
  257. package/dist/word-document-7B6SJMAY.js.map +0 -1
  258. /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-7N7REQZQ.js.map} +0 -0
  259. /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
  260. /package/dist/{backup-restore-PZ7CYYB7.js.map → audit-logger-AU3TMWKI.js.map} +0 -0
  261. /package/dist/{blocks-R3PODY47.js.map → auth-PH5IHISW.js.map} +0 -0
  262. /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
  263. /package/dist/{bot-QRARP4UN.js.map → backup-restore-72OQTZO3.js.map} +0 -0
  264. /package/dist/{brain-7XLLM3KC.js.map → blocks-YOWOESDD.js.map} +0 -0
  265. /package/dist/{chunk-PLDDJCW6.js.map → bot-MU2TJQ3Y.js.map} +0 -0
  266. /package/dist/{client-ZQSFPMOB.js.map → brain-SLA474EU.js.map} +0 -0
  267. /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
  268. /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
  269. /package/dist/{chunk-6PMVAAA7.js.map → chunk-2RGPWU77.js.map} +0 -0
  270. /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
  271. /package/dist/{chunk-MXAPLSJ5.js.map → chunk-45YXODSB.js.map} +0 -0
  272. /package/dist/{chunk-SJSUSJ47.js.map → chunk-4YJRBMMA.js.map} +0 -0
  273. /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
  274. /package/dist/{chunk-66OJ3WB4.js.map → chunk-H3BOLSTS.js.map} +0 -0
  275. /package/dist/{chunk-TYAGMJNV.js.map → chunk-JOA5A3G3.js.map} +0 -0
  276. /package/dist/{chunk-VEHFVBLI.js.map → chunk-KT7NLIXP.js.map} +0 -0
  277. /package/dist/{chunk-4UOE5TUZ.js.map → chunk-NMSHVO5O.js.map} +0 -0
  278. /package/dist/{chunk-NHMBTUMW.js.map → chunk-TAAZB5KN.js.map} +0 -0
  279. /package/dist/{clipboard-manager-TEO2GEDN.js.map → chunk-UP2VWCW5.js.map} +0 -0
  280. /package/dist/{cron-explain-HHQKPD3M.js.map → chunker-K6WTR62A.js.map} +0 -0
  281. /package/dist/{crypto-4AP47IKC.js.map → client-FOIYPOZQ.js.map} +0 -0
  282. /package/dist/{databases-37X4CI2Y.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
  283. /package/dist/{discord-B3HUPGQ6.js.map → cost-tracker-EMOIOYH7.js.map} +0 -0
  284. /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
  285. /package/dist/{entity-resolution-Y3IUWEAT.js.map → crypto-2VG3RJR2.js.map} +0 -0
  286. /package/dist/{env-IWXUVTCB.js.map → databases-XDPMG5AV.js.map} +0 -0
  287. /package/dist/{hash-tool-ULQYD7B5.js.map → db-LRIOKQBO.js.map} +0 -0
  288. /package/dist/{heartbeat-monitor-GCISLXI3.js.map → discord-NKR3X4AV.js.map} +0 -0
  289. /package/dist/{imessage-NGA2XF2V.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
  290. /package/dist/{inbox-summarizer-NRI4S7IF.js.map → enrichment-pipeline-CMUVBDC7.js.map} +0 -0
  291. /package/dist/{inventory-manager-352OHXWD.js.map → entity-resolution-4X4JU43O.js.map} +0 -0
  292. /package/dist/{json-tool-QE2SYHEG.js.map → env-CHOFICED.js.map} +0 -0
  293. /package/dist/{key-rotation-DPHU4ZTB.js.map → error-tracker-SVQSDQDW.js.map} +0 -0
  294. /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
  295. /package/dist/{mcp-3JI6W7ZE.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
  296. /package/dist/{ocr-AC7NPX33.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
  297. /package/dist/{ollama-BOAMSPLJ.js.map → hooks-N4MIFBVM.js.map} +0 -0
  298. /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
  299. /package/dist/{pages-MI523RB7.js.map → imessage-V2XNDDHT.js.map} +0 -0
  300. /package/dist/{pairing-IFQYCPNS.js.map → inbox-summarizer-DKKRYXDR.js.map} +0 -0
  301. /package/dist/{pdf-ALQVOEJR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
  302. /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
  303. /package/dist/{prometheus-JNT2BD4L.js.map → json-tool-4FK5RNER.js.map} +0 -0
  304. /package/dist/{providers-J4LYPHDR.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
  305. /package/dist/{qr-code-WIX4PB4U.js.map → knowledge-base-J7PJ7MZ3.js.map} +0 -0
  306. /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
  307. /package/dist/{regex-tool-W4ABRKGK.js.map → mcp-3C2TN67D.js.map} +0 -0
  308. /package/dist/{scheduler-VK4WFERV.js.map → metrics-VJDWQWU7.js.map} +0 -0
  309. /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
  310. /package/dist/{search-BCLBO5E3.js.map → ocr-LGUIPKVZ.js.map} +0 -0
  311. /package/dist/{signal-6CGDFYL2.js.map → ollama-J7CU45WT.js.map} +0 -0
  312. /package/dist/{slack-IZQWIKOH.js.map → pages-XDE7JRCA.js.map} +0 -0
  313. /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
  314. /package/dist/{sms-M3JIOTCW.js.map → pairing-77N47RAT.js.map} +0 -0
  315. /package/dist/{stocks-XXWBPOCU.js.map → pdf-67HGXCFJ.js.map} +0 -0
  316. /package/dist/{text-transform-6SGUA5Z4.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
  317. /package/dist/{tools-2RLEI2N6.js.map → prometheus-YETCZO4I.js.map} +0 -0
  318. /package/dist/{unit-converter-ZYXMEZOE.js.map → providers-H6YIC3MG.js.map} +0 -0
  319. /package/dist/{whatsapp-LFX6YKCM.js.map → qr-code-6WZJHRKL.js.map} +0 -0
  320. /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
  321. /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
  322. /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
  323. /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
  324. /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
  325. /package/dist/{zapier-webhook-TBZ5YF2A.js.map → zapier-webhook-NIELLTXR.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/intelligence/risk-engine.ts"],"sourcesContent":["/**\r\n * Risk/Constraint Engine\r\n * Ported from PolyMarketAI (Python) to TypeScript\r\n *\r\n * Non-bypassable safety layer with configurable checks:\r\n * - Rate limiting per action type\r\n * - Cost/budget thresholds\r\n * - Content safety checks\r\n * - Tool execution constraints\r\n * - Kill switch and safe mode\r\n * - Audit trail for all decisions\r\n */\r\n\r\nexport interface RiskCheck {\r\n name: string;\r\n description: string;\r\n severity: \"low\" | \"medium\" | \"high\" | \"critical\";\r\n /** Return true if the check passes (action is safe) */\r\n check: (context: RiskContext) => Promise<boolean> | boolean;\r\n /** Message when check fails */\r\n failMessage: string;\r\n}\r\n\r\nexport interface RiskContext {\r\n action: string;\r\n userId?: string;\r\n toolName?: string;\r\n input?: Record<string, unknown>;\r\n estimatedCost?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface RiskDecision {\r\n allowed: boolean;\r\n checks: Array<{\r\n name: string;\r\n passed: boolean;\r\n severity: string;\r\n message?: string;\r\n }>;\r\n timestamp: Date;\r\n context: RiskContext;\r\n}\r\n\r\nexport interface RiskConfig {\r\n /** Maximum cost per request in USD */\r\n maxCostPerRequest: number;\r\n /** Maximum cost per hour in USD */\r\n maxCostPerHour: number;\r\n /** Maximum cost per day in USD */\r\n maxCostPerDay: number;\r\n /** Maximum tool executions per minute */\r\n maxToolsPerMinute: number;\r\n /** Maximum tool executions per hour */\r\n maxToolsPerHour: number;\r\n /** Maximum messages per minute */\r\n maxMessagesPerMinute: number;\r\n /** Blocked tool names */\r\n blockedTools: string[];\r\n /** Blocked action patterns (regex) */\r\n blockedPatterns: string[];\r\n /** Whether safe mode is active (restricts to read-only operations) */\r\n safeMode: boolean;\r\n /** Kill switch - blocks ALL actions */\r\n killSwitch: boolean;\r\n /** Custom risk checks */\r\n customChecks: RiskCheck[];\r\n /** Maximum single trade size in USD */\r\n maxTradeSize: number;\r\n /** Maximum daily trade spend in USD */\r\n maxDailyTradeSpend: number;\r\n /** Maximum trades per hour */\r\n maxTradesPerHour: number;\r\n}\r\n\r\nconst DEFAULT_CONFIG: RiskConfig = {\r\n maxCostPerRequest: 5.0,\r\n maxCostPerHour: 50.0,\r\n maxCostPerDay: 200.0,\r\n maxToolsPerMinute: 30,\r\n maxToolsPerHour: 500,\r\n maxMessagesPerMinute: 60,\r\n blockedTools: [],\r\n blockedPatterns: [],\r\n safeMode: false,\r\n killSwitch: false,\r\n customChecks: [],\r\n maxTradeSize: 100,\r\n maxDailyTradeSpend: 500,\r\n maxTradesPerHour: 5,\r\n};\r\n\r\n// Tracking state\r\nconst costTracker = {\r\n hourly: new Map<string, { total: number; windowStart: number }>(),\r\n daily: new Map<string, { total: number; windowStart: number }>(),\r\n};\r\n\r\nconst rateTracker = new Map<\r\n string,\r\n { timestamps: number[] }\r\n>();\r\n\r\n// Financial trade spend tracker (daily window)\r\nconst tradeSpendTracker = {\r\n daily: new Map<string, { total: number; windowStart: number }>(),\r\n hourlyCount: new Map<string, { count: number; windowStart: number }>(),\r\n};\r\n\r\nconst auditLog: RiskDecision[] = [];\r\n\r\n/**\r\n * Risk Engine\r\n */\r\nexport class RiskEngine {\r\n private config: RiskConfig;\r\n private checks: RiskCheck[] = [];\r\n\r\n constructor(config: Partial<RiskConfig> = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n this.initializeBuiltInChecks();\r\n this.checks.push(...this.config.customChecks);\r\n }\r\n\r\n private initializeBuiltInChecks(): void {\r\n // Kill switch check\r\n this.checks.push({\r\n name: \"kill_switch\",\r\n description: \"Emergency kill switch - blocks all actions\",\r\n severity: \"critical\",\r\n check: () => !this.config.killSwitch,\r\n failMessage: \"Kill switch is active. All actions are blocked.\",\r\n });\r\n\r\n // Safe mode check\r\n this.checks.push({\r\n name: \"safe_mode\",\r\n description: \"Safe mode restricts to read-only operations\",\r\n severity: \"high\",\r\n check: (ctx) => {\r\n if (!this.config.safeMode) return true;\r\n const readOnlyActions = [\r\n \"read\",\r\n \"search\",\r\n \"list\",\r\n \"get\",\r\n \"query\",\r\n \"analyze\",\r\n \"view\",\r\n ];\r\n return readOnlyActions.some((a) =>\r\n ctx.action.toLowerCase().includes(a)\r\n );\r\n },\r\n failMessage: \"Safe mode is active. Only read-only operations are allowed.\",\r\n });\r\n\r\n // Blocked tools check\r\n this.checks.push({\r\n name: \"blocked_tools\",\r\n description: \"Prevents execution of blocked tools\",\r\n severity: \"high\",\r\n check: (ctx) =>\r\n !ctx.toolName || !this.config.blockedTools.includes(ctx.toolName),\r\n failMessage: \"This tool is blocked by the risk policy.\",\r\n });\r\n\r\n // Blocked patterns check\r\n this.checks.push({\r\n name: \"blocked_patterns\",\r\n description: \"Prevents actions matching blocked patterns\",\r\n severity: \"high\",\r\n check: (ctx) => {\r\n const inputStr = JSON.stringify(ctx.input || {});\r\n return !this.config.blockedPatterns.some((pattern) =>\r\n new RegExp(pattern, \"i\").test(inputStr)\r\n );\r\n },\r\n failMessage: \"Input matches a blocked pattern.\",\r\n });\r\n\r\n // Cost per request check\r\n this.checks.push({\r\n name: \"cost_per_request\",\r\n description: \"Limits cost per individual request\",\r\n severity: \"medium\",\r\n check: (ctx) =>\r\n !ctx.estimatedCost ||\r\n ctx.estimatedCost <= this.config.maxCostPerRequest,\r\n failMessage: `Request exceeds maximum cost of $${this.config.maxCostPerRequest}.`,\r\n });\r\n\r\n // Hourly cost check\r\n this.checks.push({\r\n name: \"hourly_cost_limit\",\r\n description: \"Limits total cost per hour\",\r\n severity: \"high\",\r\n check: (ctx) => {\r\n const key = ctx.userId || \"global\";\r\n const now = Date.now();\r\n const hourMs = 3600 * 1000;\r\n const entry = costTracker.hourly.get(key);\r\n\r\n if (!entry || now - entry.windowStart > hourMs) {\r\n return true;\r\n }\r\n return entry.total + (ctx.estimatedCost || 0) <= this.config.maxCostPerHour;\r\n },\r\n failMessage: `Hourly cost limit of $${this.config.maxCostPerHour} exceeded.`,\r\n });\r\n\r\n // Daily cost check\r\n this.checks.push({\r\n name: \"daily_cost_limit\",\r\n description: \"Limits total cost per day\",\r\n severity: \"high\",\r\n check: (ctx) => {\r\n const key = ctx.userId || \"global\";\r\n const now = Date.now();\r\n const dayMs = 86400 * 1000;\r\n const entry = costTracker.daily.get(key);\r\n\r\n if (!entry || now - entry.windowStart > dayMs) {\r\n return true;\r\n }\r\n return entry.total + (ctx.estimatedCost || 0) <= this.config.maxCostPerDay;\r\n },\r\n failMessage: `Daily cost limit of $${this.config.maxCostPerDay} exceeded.`,\r\n });\r\n\r\n // Rate limit: tools per minute\r\n this.checks.push({\r\n name: \"tool_rate_limit_minute\",\r\n description: \"Limits tool executions per minute\",\r\n severity: \"medium\",\r\n check: (ctx) => {\r\n if (!ctx.toolName) return true;\r\n return this.checkRate(\r\n `tool:${ctx.userId || \"global\"}`,\r\n 60 * 1000,\r\n this.config.maxToolsPerMinute\r\n );\r\n },\r\n failMessage: `Tool execution rate limit exceeded (${this.config.maxToolsPerMinute}/min).`,\r\n });\r\n\r\n // Rate limit: tools per hour\r\n this.checks.push({\r\n name: \"tool_rate_limit_hour\",\r\n description: \"Limits tool executions per hour\",\r\n severity: \"medium\",\r\n check: (ctx) => {\r\n if (!ctx.toolName) return true;\r\n return this.checkRate(\r\n `tool_hourly:${ctx.userId || \"global\"}`,\r\n 3600 * 1000,\r\n this.config.maxToolsPerHour\r\n );\r\n },\r\n failMessage: `Tool execution hourly limit exceeded (${this.config.maxToolsPerHour}/hr).`,\r\n });\r\n\r\n // Rate limit: messages per minute\r\n this.checks.push({\r\n name: \"message_rate_limit\",\r\n description: \"Limits messages per minute\",\r\n severity: \"medium\",\r\n check: (ctx) => {\r\n if (ctx.action !== \"send_message\") return true;\r\n return this.checkRate(\r\n `msg:${ctx.userId || \"global\"}`,\r\n 60 * 1000,\r\n this.config.maxMessagesPerMinute\r\n );\r\n },\r\n failMessage: `Message rate limit exceeded (${this.config.maxMessagesPerMinute}/min).`,\r\n });\r\n\r\n // Command injection check\r\n this.checks.push({\r\n name: \"command_injection\",\r\n description: \"Prevents command injection in tool inputs\",\r\n severity: \"critical\",\r\n check: (ctx) => {\r\n if (!ctx.input) return true;\r\n const dangerousPatterns = [\r\n /;\\s*(rm|del|format|mkfs|dd)\\s/i,\r\n /\\|\\s*(bash|sh|cmd|powershell)/i,\r\n /`[^`]*`/,\r\n /\\$\\([^)]*\\)/,\r\n />\\s*\\/dev\\//i,\r\n ];\r\n const inputStr = JSON.stringify(ctx.input);\r\n return !dangerousPatterns.some((p) => p.test(inputStr));\r\n },\r\n failMessage: \"Potential command injection detected in input.\",\r\n });\r\n\r\n // Sensitive data check\r\n this.checks.push({\r\n name: \"sensitive_data\",\r\n description: \"Prevents leaking sensitive data patterns\",\r\n severity: \"high\",\r\n check: (ctx) => {\r\n if (!ctx.input) return true;\r\n const sensitivePatterns = [\r\n /\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b/, // credit card\r\n /\\b\\d{3}-\\d{2}-\\d{4}\\b/, // SSN\r\n /-----BEGIN\\s+(RSA\\s+)?PRIVATE\\s+KEY-----/, // private key\r\n ];\r\n const inputStr = JSON.stringify(ctx.input);\r\n return !sensitivePatterns.some((p) => p.test(inputStr));\r\n },\r\n failMessage: \"Sensitive data pattern detected in input.\",\r\n });\r\n\r\n // ── Financial Trade Safeguards ─────────────────────────────────────────\r\n\r\n // Trade size limit\r\n this.checks.push({\r\n name: \"trade_size_limit\",\r\n description: \"Blocks orders exceeding maximum single trade size\",\r\n severity: \"critical\",\r\n check: (ctx) => {\r\n if (ctx.toolName !== \"crypto_exchange\") return true;\r\n const input = ctx.input || {};\r\n if (input.action !== \"place_order\") return true;\r\n const estimatedTotal = (input._estimatedTotal as number) || 0;\r\n if (estimatedTotal <= 0) return true;\r\n return estimatedTotal <= this.config.maxTradeSize;\r\n },\r\n failMessage: `Trade exceeds maximum single order size of $${this.config.maxTradeSize}.`,\r\n });\r\n\r\n // Daily trade spend limit\r\n this.checks.push({\r\n name: \"daily_trade_spend_limit\",\r\n description: \"Blocks when daily trade spending cap exceeded\",\r\n severity: \"critical\",\r\n check: (ctx) => {\r\n if (ctx.toolName !== \"crypto_exchange\") return true;\r\n const input = ctx.input || {};\r\n if (input.action !== \"place_order\") return true;\r\n const estimatedTotal = (input._estimatedTotal as number) || 0;\r\n if (estimatedTotal <= 0) return true;\r\n\r\n const key = ctx.userId || \"global\";\r\n const now = Date.now();\r\n const dayMs = 86400 * 1000;\r\n const entry = tradeSpendTracker.daily.get(key);\r\n\r\n if (!entry || now - entry.windowStart > dayMs) {\r\n return true;\r\n }\r\n return entry.total + estimatedTotal <= this.config.maxDailyTradeSpend;\r\n },\r\n failMessage: `Daily trade spend limit of $${this.config.maxDailyTradeSpend} exceeded.`,\r\n });\r\n\r\n // Trade rate limit (per hour)\r\n this.checks.push({\r\n name: \"trade_rate_limit\",\r\n description: \"Blocks when hourly trade count exceeded\",\r\n severity: \"high\",\r\n check: (ctx) => {\r\n if (ctx.toolName !== \"crypto_exchange\") return true;\r\n const input = ctx.input || {};\r\n if (input.action !== \"place_order\") return true;\r\n\r\n const key = ctx.userId || \"global\";\r\n const now = Date.now();\r\n const hourMs = 3600 * 1000;\r\n const entry = tradeSpendTracker.hourlyCount.get(key);\r\n\r\n if (!entry || now - entry.windowStart > hourMs) {\r\n return true;\r\n }\r\n return entry.count < this.config.maxTradesPerHour;\r\n },\r\n failMessage: `Trade rate limit exceeded (${this.config.maxTradesPerHour}/hr).`,\r\n });\r\n }\r\n\r\n private checkRate(key: string, windowMs: number, maxCount: number): boolean {\r\n const now = Date.now();\r\n let entry = rateTracker.get(key);\r\n\r\n if (!entry) {\r\n entry = { timestamps: [] };\r\n rateTracker.set(key, entry);\r\n }\r\n\r\n // Remove expired timestamps\r\n entry.timestamps = entry.timestamps.filter((t) => now - t < windowMs);\r\n\r\n return entry.timestamps.length < maxCount;\r\n }\r\n\r\n private recordRate(key: string): void {\r\n let entry = rateTracker.get(key);\r\n if (!entry) {\r\n entry = { timestamps: [] };\r\n rateTracker.set(key, entry);\r\n }\r\n entry.timestamps.push(Date.now());\r\n }\r\n\r\n /**\r\n * Evaluate all risk checks for an action\r\n * This is the main entry point - NON-BYPASSABLE\r\n */\r\n async evaluate(context: RiskContext): Promise<RiskDecision> {\r\n const results: RiskDecision[\"checks\"] = [];\r\n let allowed = true;\r\n\r\n for (const check of this.checks) {\r\n let passed: boolean;\r\n try {\r\n passed = await check.check(context);\r\n } catch {\r\n passed = false;\r\n }\r\n\r\n results.push({\r\n name: check.name,\r\n passed,\r\n severity: check.severity,\r\n message: passed ? undefined : check.failMessage,\r\n });\r\n\r\n if (!passed && (check.severity === \"critical\" || check.severity === \"high\")) {\r\n allowed = false;\r\n }\r\n }\r\n\r\n const decision: RiskDecision = {\r\n allowed,\r\n checks: results,\r\n timestamp: new Date(),\r\n context,\r\n };\r\n\r\n // Record in audit log\r\n auditLog.push(decision);\r\n if (auditLog.length > 10000) {\r\n auditLog.splice(0, auditLog.length - 5000);\r\n }\r\n\r\n // Record rate tracking if allowed\r\n if (allowed) {\r\n if (context.toolName) {\r\n this.recordRate(`tool:${context.userId || \"global\"}`);\r\n this.recordRate(`tool_hourly:${context.userId || \"global\"}`);\r\n }\r\n if (context.action === \"send_message\") {\r\n this.recordRate(`msg:${context.userId || \"global\"}`);\r\n }\r\n if (context.estimatedCost) {\r\n this.recordCost(context.userId || \"global\", context.estimatedCost);\r\n }\r\n }\r\n\r\n return decision;\r\n }\r\n\r\n private recordCost(userId: string, cost: number): void {\r\n const now = Date.now();\r\n const hourMs = 3600 * 1000;\r\n const dayMs = 86400 * 1000;\r\n\r\n // Hourly\r\n let hourly = costTracker.hourly.get(userId);\r\n if (!hourly || now - hourly.windowStart > hourMs) {\r\n hourly = { total: 0, windowStart: now };\r\n costTracker.hourly.set(userId, hourly);\r\n }\r\n hourly.total += cost;\r\n\r\n // Daily\r\n let daily = costTracker.daily.get(userId);\r\n if (!daily || now - daily.windowStart > dayMs) {\r\n daily = { total: 0, windowStart: now };\r\n costTracker.daily.set(userId, daily);\r\n }\r\n daily.total += cost;\r\n }\r\n\r\n /**\r\n * Add a custom risk check\r\n */\r\n addCheck(check: RiskCheck): void {\r\n this.checks.push(check);\r\n }\r\n\r\n /**\r\n * Activate kill switch\r\n */\r\n activateKillSwitch(): void {\r\n this.config.killSwitch = true;\r\n }\r\n\r\n /**\r\n * Deactivate kill switch\r\n */\r\n deactivateKillSwitch(): void {\r\n this.config.killSwitch = false;\r\n }\r\n\r\n /**\r\n * Enable safe mode\r\n */\r\n enableSafeMode(): void {\r\n this.config.safeMode = true;\r\n }\r\n\r\n /**\r\n * Disable safe mode\r\n */\r\n disableSafeMode(): void {\r\n this.config.safeMode = false;\r\n }\r\n\r\n /**\r\n * Block a tool\r\n */\r\n blockTool(toolName: string): void {\r\n if (!this.config.blockedTools.includes(toolName)) {\r\n this.config.blockedTools.push(toolName);\r\n }\r\n }\r\n\r\n /**\r\n * Unblock a tool\r\n */\r\n unblockTool(toolName: string): void {\r\n this.config.blockedTools = this.config.blockedTools.filter(\r\n (t) => t !== toolName\r\n );\r\n }\r\n\r\n /**\r\n * Get recent audit log\r\n */\r\n getAuditLog(limit = 100): RiskDecision[] {\r\n return auditLog.slice(-limit);\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): RiskConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Update configuration\r\n */\r\n updateConfig(updates: Partial<RiskConfig>): void {\r\n Object.assign(this.config, updates);\r\n }\r\n\r\n /**\r\n * Record trade spend after a successful trade execution.\r\n * Call this after a trade completes to track daily/hourly limits.\r\n */\r\n recordTradeSpend(userId: string, amountUsd: number): void {\r\n const now = Date.now();\r\n const dayMs = 86400 * 1000;\r\n const hourMs = 3600 * 1000;\r\n\r\n // Daily spend\r\n let daily = tradeSpendTracker.daily.get(userId);\r\n if (!daily || now - daily.windowStart > dayMs) {\r\n daily = { total: 0, windowStart: now };\r\n tradeSpendTracker.daily.set(userId, daily);\r\n }\r\n daily.total += amountUsd;\r\n\r\n // Hourly count\r\n let hourly = tradeSpendTracker.hourlyCount.get(userId);\r\n if (!hourly || now - hourly.windowStart > hourMs) {\r\n hourly = { count: 0, windowStart: now };\r\n tradeSpendTracker.hourlyCount.set(userId, hourly);\r\n }\r\n hourly.count += 1;\r\n }\r\n\r\n /**\r\n * Register risk engine as a hook on tool:execute to intercept\r\n * financial tool calls at the hook level.\r\n */\r\n registerAsHook(hookMgr: {\r\n register: (hook: {\r\n event: \"tool:execute\";\r\n phase: \"before\";\r\n name: string;\r\n priority?: number;\r\n handler: (context: any) => Promise<any>;\r\n }) => string;\r\n }): string {\r\n return hookMgr.register({\r\n event: \"tool:execute\",\r\n phase: \"before\",\r\n name: \"risk-engine-financial\",\r\n priority: 3, // Run before tool sandbox (priority 5)\r\n handler: async (context: any) => {\r\n const toolName = context.data.toolName as string || \"\";\r\n const input = (context.data.input as Record<string, unknown>) || {};\r\n\r\n // Only intercept financial tools\r\n if (toolName !== \"crypto_exchange\") return context;\r\n\r\n const decision = await this.evaluate({\r\n action: \"tool_execute\",\r\n userId: context.userId,\r\n toolName,\r\n input,\r\n });\r\n\r\n if (!decision.allowed) {\r\n context.cancelled = true;\r\n const failedChecks = decision.checks\r\n .filter((c: any) => !c.passed)\r\n .map((c: any) => c.message)\r\n .join(\"; \");\r\n context.cancelReason = `[RiskEngine] BLOCKED: ${failedChecks}`;\r\n console.log(`[RiskEngine] Blocked ${toolName}: ${failedChecks}`);\r\n }\r\n\r\n return context;\r\n },\r\n });\r\n }\r\n}\r\n\r\n/** Singleton risk engine instance */\r\nexport const riskEngine = new RiskEngine();\r\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
@@ -130,6 +138,12 @@ var envSchema = z.object({
130
138
  OPENAI_COMPATIBLE_API_KEY: z.string().optional(),
131
139
  OPENAI_COMPATIBLE_BASE_URL: z.string().optional(),
132
140
  OPENAI_COMPATIBLE_MODEL: z.string().optional(),
141
+ // xAI (Grok)
142
+ XAI_API_KEY: z.string().optional(),
143
+ XAI_DEFAULT_MODEL: z.string().optional().default("grok-2"),
144
+ // Google Gemini (optional)
145
+ GEMINI_API_KEY: z.string().optional(),
146
+ GEMINI_DEFAULT_MODEL: z.string().optional().default("gemini-2.0-flash"),
133
147
  // Ollama (local models)
134
148
  OLLAMA_ENABLED: z.coerce.boolean().optional().default(false),
135
149
  OLLAMA_BASE_URL: z.string().optional().default("http://localhost:11434"),
@@ -222,6 +236,22 @@ var envSchema = z.object({
222
236
  MULTISTEP_MAX_STEPS: z.coerce.number().optional().default(2),
223
237
  RETRIEVAL_CACHE_ENABLED: z.coerce.boolean().optional().default(false),
224
238
  CONTEXTUAL_QUERY_ENABLED: z.coerce.boolean().optional().default(false),
239
+ // Agentic RAG Pipeline
240
+ TOOL_CLASSIFIER_ENABLED: z.coerce.boolean().optional().default(false),
241
+ TOOL_CLASSIFIER_TIMEOUT_MS: z.coerce.number().optional().default(5e3),
242
+ TOOL_CLASSIFIER_MAX_CATEGORIES: z.coerce.number().optional().default(3),
243
+ // AI Memory (auto-extract/search)
244
+ AUTO_MEMORY_EXTRACT_ENABLED: z.coerce.boolean().optional().default(false),
245
+ AUTO_MEMORY_EXTRACT_DEDUP_THRESHOLD: z.coerce.number().optional().default(0.9),
246
+ AUTO_MEMORY_SEARCH_THRESHOLD: z.coerce.number().optional().default(0.3),
247
+ // Agentic Pipeline Orchestrator
248
+ AGENTIC_PIPELINE_ENABLED: z.coerce.boolean().optional().default(false),
249
+ AGENTIC_PRE_EXECUTION_ENABLED: z.coerce.boolean().optional().default(false),
250
+ AGENTIC_PRE_EXECUTION_TIMEOUT_MS: z.coerce.number().optional().default(8e3),
251
+ // Agent Processor
252
+ AGENT_PROCESSOR_ENABLED: z.coerce.boolean().optional().default(false),
253
+ AGENT_PROCESSOR_CONCURRENCY: z.coerce.number().optional().default(1),
254
+ AGENT_MAX_TURNS: z.coerce.number().optional().default(20),
225
255
  // SOC 2 Encryption & Audit
226
256
  ENCRYPTION_MASTER_KEY: z.string().optional(),
227
257
  // 32-byte base64 key for field encryption
@@ -246,7 +276,7 @@ function configure(config) {
246
276
  );
247
277
  }
248
278
  _env = result.data;
249
- _providerInitPromise = import("./providers-J4LYPHDR.js").then((m) => m.initializeProviders()).catch(() => {
279
+ _providerInitPromise = import("./providers-H6YIC3MG.js").then((m) => m.initializeProviders()).catch(() => {
250
280
  });
251
281
  return _env;
252
282
  }
@@ -307,4 +337,4 @@ export {
307
337
  ready,
308
338
  env
309
339
  };
310
- //# sourceMappingURL=chunk-ZLZKF2PM.js.map
340
+ //# sourceMappingURL=chunk-PUNIMPMY.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 // 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":[]}
@@ -0,0 +1,37 @@
1
+ import {
2
+ env
3
+ } from "./chunk-PUNIMPMY.js";
4
+ import {
5
+ schema_exports
6
+ } from "./chunk-NYVBXUGD.js";
7
+
8
+ // src/db/index.ts
9
+ import { drizzle } from "drizzle-orm/postgres-js";
10
+ import postgres from "postgres";
11
+ var _client = null;
12
+ var _db = null;
13
+ function getDb() {
14
+ if (!_db) {
15
+ _client = postgres(env.DATABASE_URL);
16
+ _db = drizzle(_client, { schema: schema_exports });
17
+ }
18
+ return _db;
19
+ }
20
+ var db = new Proxy(
21
+ {},
22
+ {
23
+ get(_target, prop) {
24
+ const instance = getDb();
25
+ const value = instance[prop];
26
+ if (typeof value === "function") {
27
+ return value.bind(instance);
28
+ }
29
+ return value;
30
+ }
31
+ }
32
+ );
33
+
34
+ export {
35
+ db
36
+ };
37
+ //# sourceMappingURL=chunk-S4NJJS5C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/index.ts"],"sourcesContent":["import { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport { env } from \"../config/env\";\nimport * as schema from \"./schema\";\n\n// Lazy database connection — created on first access\nlet _client: ReturnType<typeof postgres> | null = null;\nlet _db: ReturnType<typeof drizzle> | null = null;\n\nfunction getDb() {\n if (!_db) {\n _client = postgres(env.DATABASE_URL);\n _db = drizzle(_client, { schema });\n }\n return _db;\n}\n\n// Proxy preserves the `db.select()`, `db.insert()`, `db.execute()` access pattern\n// so all existing consumer files work unchanged.\nexport const db: ReturnType<typeof drizzle<typeof schema>> = new Proxy(\n {} as any,\n {\n get(_target, prop) {\n const instance = getDb();\n const value = (instance as any)[prop];\n if (typeof value === \"function\") {\n return value.bind(instance);\n }\n return value;\n },\n }\n);\n\nexport * from \"./schema\";\n"],"mappings":";;;;;;;;AAAA,SAAS,eAAe;AACxB,OAAO,cAAc;AAKrB,IAAI,UAA8C;AAClD,IAAI,MAAyC;AAE7C,SAAS,QAAQ;AACf,MAAI,CAAC,KAAK;AACR,cAAU,SAAS,IAAI,YAAY;AACnC,UAAM,QAAQ,SAAS,EAAE,uBAAO,CAAC;AAAA,EACnC;AACA,SAAO;AACT;AAIO,IAAM,KAAgD,IAAI;AAAA,EAC/D,CAAC;AAAA,EACD;AAAA,IACE,IAAI,SAAS,MAAM;AACjB,YAAM,WAAW,MAAM;AACvB,YAAM,QAAS,SAAiB,IAAI;AACpC,UAAI,OAAO,UAAU,YAAY;AAC/B,eAAO,MAAM,KAAK,QAAQ;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  chatWithTools
3
- } from "./chunk-766ASQWE.js";
3
+ } from "./chunk-6JY4HNUH.js";
4
4
 
5
5
  // src/inputs/imessage/index.ts
6
6
  var iMessageBot = class {
@@ -213,4 +213,4 @@ export {
213
213
  iMessageBot,
214
214
  imessage_default
215
215
  };
216
- //# sourceMappingURL=chunk-NHMBTUMW.js.map
216
+ //# sourceMappingURL=chunk-TAAZB5KN.js.map
@@ -2,7 +2,7 @@ import {
2
2
  getNotionClient,
3
3
  getRootPageId,
4
4
  init_client
5
- } from "./chunk-VRD5CYRL.js";
5
+ } from "./chunk-C6PELIHS.js";
6
6
 
7
7
  // src/integrations/notion/databases.ts
8
8
  init_client();
@@ -194,7 +194,7 @@ async function createDatabaseEntry(options) {
194
194
  params.cover = { type: "external", external: { url: options.cover } };
195
195
  }
196
196
  if (options.content) {
197
- const { markdownToBlocks, createBlockObject } = await import("./blocks-R3PODY47.js");
197
+ const { markdownToBlocks, createBlockObject } = await import("./blocks-YOWOESDD.js");
198
198
  const blocks = markdownToBlocks(options.content);
199
199
  params.children = blocks.map(createBlockObject);
200
200
  }
@@ -454,4 +454,4 @@ export {
454
454
  archiveDatabaseEntry,
455
455
  createDatabase
456
456
  };
457
- //# sourceMappingURL=chunk-BRBWNV65.js.map
457
+ //# sourceMappingURL=chunk-U2X2J3FI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integrations/notion/databases.ts"],"sourcesContent":["import { getNotionClient, getRootPageId } from \"./client\";\r\n\r\n/**\r\n * Database operations for Notion\r\n * Handles querying databases and creating entries\r\n */\r\n\r\n// Type definitions for API responses\r\ninterface PageObjectResponse {\r\n id: string;\r\n url: string;\r\n created_time: string;\r\n last_edited_time: string;\r\n archived: boolean;\r\n properties: Record<string, any>;\r\n}\r\n\r\ninterface QueryDatabaseParams {\r\n database_id: string;\r\n filter?: any;\r\n sorts?: any[];\r\n start_cursor?: string;\r\n page_size?: number;\r\n}\r\n\r\nexport type PropertyType =\r\n | \"title\"\r\n | \"rich_text\"\r\n | \"number\"\r\n | \"select\"\r\n | \"multi_select\"\r\n | \"date\"\r\n | \"checkbox\"\r\n | \"url\"\r\n | \"email\"\r\n | \"phone_number\"\r\n | \"formula\"\r\n | \"relation\"\r\n | \"rollup\"\r\n | \"created_time\"\r\n | \"created_by\"\r\n | \"last_edited_time\"\r\n | \"last_edited_by\"\r\n | \"files\"\r\n | \"status\";\r\n\r\nexport type FilterOperator =\r\n | \"equals\"\r\n | \"does_not_equal\"\r\n | \"contains\"\r\n | \"does_not_contain\"\r\n | \"starts_with\"\r\n | \"ends_with\"\r\n | \"is_empty\"\r\n | \"is_not_empty\"\r\n | \"greater_than\"\r\n | \"less_than\"\r\n | \"greater_than_or_equal_to\"\r\n | \"less_than_or_equal_to\"\r\n | \"before\"\r\n | \"after\"\r\n | \"on_or_before\"\r\n | \"on_or_after\"\r\n | \"past_week\"\r\n | \"past_month\"\r\n | \"past_year\"\r\n | \"next_week\"\r\n | \"next_month\"\r\n | \"next_year\";\r\n\r\nexport interface FilterCondition {\r\n property: string;\r\n type?: PropertyType;\r\n operator: FilterOperator;\r\n value?: string | number | boolean | Date;\r\n}\r\n\r\nexport interface SortOption {\r\n property?: string;\r\n timestamp?: \"created_time\" | \"last_edited_time\";\r\n direction: \"ascending\" | \"descending\";\r\n}\r\n\r\nexport interface QueryOptions {\r\n filter?: FilterCondition | FilterCondition[];\r\n filterOperator?: \"and\" | \"or\";\r\n sorts?: SortOption[];\r\n startCursor?: string;\r\n pageSize?: number;\r\n}\r\n\r\nexport interface DatabaseEntry {\r\n id: string;\r\n url: string;\r\n createdTime: string;\r\n lastEditedTime: string;\r\n archived: boolean;\r\n properties: Record<string, any>;\r\n}\r\n\r\nexport interface DatabaseInfo {\r\n id: string;\r\n title: string;\r\n description: string;\r\n url: string;\r\n createdTime: string;\r\n lastEditedTime: string;\r\n isInline: boolean;\r\n properties: Record<string, { type: PropertyType; name: string }>;\r\n}\r\n\r\nexport interface CreateEntryOptions {\r\n databaseId: string;\r\n properties: Record<string, any>;\r\n content?: string;\r\n icon?: string;\r\n cover?: string;\r\n}\r\n\r\n/**\r\n * Convert filter condition to Notion API filter format\r\n */\r\nfunction buildFilter(condition: FilterCondition): any {\r\n const { property, type, operator, value } = condition;\r\n\r\n // Determine property type from operator if not specified\r\n let propertyType = type;\r\n if (!propertyType) {\r\n if (\r\n [\r\n \"contains\",\r\n \"does_not_contain\",\r\n \"starts_with\",\r\n \"ends_with\",\r\n \"equals\",\r\n \"does_not_equal\",\r\n ].includes(operator)\r\n ) {\r\n propertyType = \"rich_text\";\r\n } else if (\r\n [\r\n \"greater_than\",\r\n \"less_than\",\r\n \"greater_than_or_equal_to\",\r\n \"less_than_or_equal_to\",\r\n ].includes(operator)\r\n ) {\r\n propertyType = \"number\";\r\n } else if (\r\n [\r\n \"before\",\r\n \"after\",\r\n \"on_or_before\",\r\n \"on_or_after\",\r\n \"past_week\",\r\n \"past_month\",\r\n \"past_year\",\r\n \"next_week\",\r\n \"next_month\",\r\n \"next_year\",\r\n ].includes(operator)\r\n ) {\r\n propertyType = \"date\";\r\n } else if ([\"is_empty\", \"is_not_empty\"].includes(operator)) {\r\n propertyType = \"rich_text\";\r\n }\r\n }\r\n\r\n const filter: any = { property };\r\n\r\n switch (propertyType) {\r\n case \"title\":\r\n case \"rich_text\":\r\n filter[propertyType || \"rich_text\"] = { [operator]: value ?? true };\r\n break;\r\n\r\n case \"number\":\r\n filter.number = { [operator]: value };\r\n break;\r\n\r\n case \"checkbox\":\r\n filter.checkbox = { [operator]: value };\r\n break;\r\n\r\n case \"select\":\r\n filter.select = { [operator]: value };\r\n break;\r\n\r\n case \"multi_select\":\r\n filter.multi_select = { [operator]: value };\r\n break;\r\n\r\n case \"date\":\r\n if (\r\n [\r\n \"past_week\",\r\n \"past_month\",\r\n \"past_year\",\r\n \"next_week\",\r\n \"next_month\",\r\n \"next_year\",\r\n ].includes(operator)\r\n ) {\r\n filter.date = { [operator]: {} };\r\n } else {\r\n filter.date = {\r\n [operator]: value instanceof Date ? value.toISOString() : value,\r\n };\r\n }\r\n break;\r\n\r\n case \"url\":\r\n case \"email\":\r\n case \"phone_number\":\r\n filter[propertyType] = { [operator]: value };\r\n break;\r\n\r\n case \"status\":\r\n filter.status = { [operator]: value };\r\n break;\r\n\r\n default:\r\n filter.rich_text = { [operator]: value ?? true };\r\n }\r\n\r\n return filter;\r\n}\r\n\r\n/**\r\n * Query a Notion database\r\n */\r\nexport async function queryDatabase(\r\n databaseId: string,\r\n options: QueryOptions = {}\r\n): Promise<{\r\n results: DatabaseEntry[];\r\n hasMore: boolean;\r\n nextCursor: string | null;\r\n}> {\r\n const notion = getNotionClient();\r\n\r\n const params: QueryDatabaseParams = {\r\n database_id: databaseId,\r\n };\r\n\r\n // Build filter\r\n if (options.filter) {\r\n if (Array.isArray(options.filter)) {\r\n if (options.filter.length === 1) {\r\n params.filter = buildFilter(options.filter[0]);\r\n } else {\r\n const filters = options.filter.map(buildFilter);\r\n params.filter =\r\n options.filterOperator === \"or\"\r\n ? { or: filters as any }\r\n : { and: filters as any };\r\n }\r\n } else {\r\n params.filter = buildFilter(options.filter);\r\n }\r\n }\r\n\r\n // Build sorts\r\n if (options.sorts) {\r\n params.sorts = options.sorts.map((sort) => {\r\n if (sort.timestamp) {\r\n return { timestamp: sort.timestamp, direction: sort.direction };\r\n }\r\n return { property: sort.property!, direction: sort.direction };\r\n });\r\n }\r\n\r\n // Pagination\r\n if (options.startCursor) {\r\n params.start_cursor = options.startCursor;\r\n }\r\n if (options.pageSize) {\r\n params.page_size = options.pageSize;\r\n }\r\n\r\n // Use dataSources.query for newer SDK versions, fallback to databases.query\r\n const response = await ((notion as any).dataSources?.query?.(params) ??\r\n (notion as any).databases.query(params));\r\n\r\n const results: DatabaseEntry[] = response.results.map((page: any) => {\r\n const p = page as PageObjectResponse;\r\n return {\r\n id: p.id,\r\n url: p.url,\r\n createdTime: p.created_time,\r\n lastEditedTime: p.last_edited_time,\r\n archived: p.archived,\r\n properties: extractPropertyValues(p.properties),\r\n };\r\n });\r\n\r\n return {\r\n results,\r\n hasMore: response.has_more,\r\n nextCursor: response.next_cursor,\r\n };\r\n}\r\n\r\n/**\r\n * Query all results from a database (handles pagination)\r\n */\r\nexport async function queryAllDatabaseEntries(\r\n databaseId: string,\r\n options: Omit<QueryOptions, \"startCursor\" | \"pageSize\"> = {}\r\n): Promise<DatabaseEntry[]> {\r\n const allResults: DatabaseEntry[] = [];\r\n let cursor: string | undefined;\r\n\r\n do {\r\n const response = await queryDatabase(databaseId, {\r\n ...options,\r\n startCursor: cursor,\r\n pageSize: 100,\r\n });\r\n allResults.push(...response.results);\r\n cursor = response.nextCursor ?? undefined;\r\n } while (cursor);\r\n\r\n return allResults;\r\n}\r\n\r\n/**\r\n * Get database information\r\n */\r\nexport async function getDatabase(databaseId: string): Promise<DatabaseInfo> {\r\n const notion = getNotionClient();\r\n\r\n const response = await notion.databases.retrieve({\r\n database_id: databaseId,\r\n }) as any;\r\n\r\n const properties: Record<string, { type: PropertyType; name: string }> = {};\r\n for (const [name, prop] of Object.entries(response.properties || {})) {\r\n const p = prop as any;\r\n properties[name] = {\r\n type: p.type as PropertyType,\r\n name: p.name,\r\n };\r\n }\r\n\r\n return {\r\n id: response.id,\r\n title: response.title.map((t: any) => t.plain_text).join(\"\"),\r\n description: response.description.map((t: any) => t.plain_text).join(\"\"),\r\n url: response.url,\r\n createdTime: response.created_time,\r\n lastEditedTime: response.last_edited_time,\r\n isInline: response.is_inline,\r\n properties,\r\n };\r\n}\r\n\r\n/**\r\n * Create an entry in a database\r\n */\r\nexport async function createDatabaseEntry(\r\n options: CreateEntryOptions\r\n): Promise<DatabaseEntry> {\r\n const notion = getNotionClient();\r\n\r\n const params: any = {\r\n parent: { database_id: options.databaseId },\r\n properties: buildDatabaseProperties(options.properties),\r\n };\r\n\r\n // Add icon\r\n if (options.icon) {\r\n if (options.icon.startsWith(\"http\")) {\r\n params.icon = { type: \"external\", external: { url: options.icon } };\r\n } else {\r\n params.icon = { type: \"emoji\", emoji: options.icon };\r\n }\r\n }\r\n\r\n // Add cover\r\n if (options.cover) {\r\n params.cover = { type: \"external\", external: { url: options.cover } };\r\n }\r\n\r\n // Add content as children\r\n if (options.content) {\r\n const { markdownToBlocks, createBlockObject } = await import(\"./blocks\");\r\n const blocks = markdownToBlocks(options.content);\r\n params.children = blocks.map(createBlockObject);\r\n }\r\n\r\n const response = (await notion.pages.create(params)) as PageObjectResponse;\r\n\r\n return {\r\n id: response.id,\r\n url: response.url,\r\n createdTime: response.created_time,\r\n lastEditedTime: response.last_edited_time,\r\n archived: response.archived,\r\n properties: extractPropertyValues(response.properties),\r\n };\r\n}\r\n\r\n/**\r\n * Update a database entry\r\n */\r\nexport async function updateDatabaseEntry(\r\n pageId: string,\r\n properties: Record<string, any>\r\n): Promise<DatabaseEntry> {\r\n const notion = getNotionClient();\r\n\r\n const response = (await notion.pages.update({\r\n page_id: pageId,\r\n properties: buildDatabaseProperties(properties),\r\n })) as PageObjectResponse;\r\n\r\n return {\r\n id: response.id,\r\n url: response.url,\r\n createdTime: response.created_time,\r\n lastEditedTime: response.last_edited_time,\r\n archived: response.archived,\r\n properties: extractPropertyValues(response.properties),\r\n };\r\n}\r\n\r\n/**\r\n * Archive a database entry\r\n */\r\nexport async function archiveDatabaseEntry(pageId: string): Promise<void> {\r\n const notion = getNotionClient();\r\n\r\n await notion.pages.update({\r\n page_id: pageId,\r\n archived: true,\r\n });\r\n}\r\n\r\n/**\r\n * Create a new database\r\n */\r\nexport async function createDatabase(options: {\r\n parentPageId?: string;\r\n title: string;\r\n properties: Record<string, { type: PropertyType; options?: any }>;\r\n isInline?: boolean;\r\n}): Promise<DatabaseInfo> {\r\n const notion = getNotionClient();\r\n\r\n const parentId = options.parentPageId || getRootPageId();\r\n if (!parentId) {\r\n throw new Error(\"No parent page specified and no root page configured\");\r\n }\r\n\r\n const properties: Record<string, any> = {};\r\n\r\n for (const [name, config] of Object.entries(options.properties)) {\r\n properties[name] = buildPropertySchema(config.type, config.options);\r\n }\r\n\r\n // Ensure there's a title property\r\n if (!Object.values(properties).some((p) => p.type === \"title\")) {\r\n properties[\"Name\"] = { title: {} };\r\n }\r\n\r\n const response = (await notion.databases.create({\r\n parent: { type: \"page_id\", page_id: parentId },\r\n title: [{ text: { content: options.title } }],\r\n properties,\r\n is_inline: options.isInline ?? false,\r\n } as any)) as any;\r\n\r\n const resultProperties: Record<string, { type: PropertyType; name: string }> =\r\n {};\r\n for (const [name, prop] of Object.entries(response.properties || {})) {\r\n const p = prop as any;\r\n resultProperties[name] = {\r\n type: p.type as PropertyType,\r\n name: p.name,\r\n };\r\n }\r\n\r\n return {\r\n id: response.id,\r\n title: response.title.map((t: any) => t.plain_text).join(\"\"),\r\n description: \"\",\r\n url: response.url,\r\n createdTime: response.created_time,\r\n lastEditedTime: response.last_edited_time,\r\n isInline: response.is_inline,\r\n properties: resultProperties,\r\n };\r\n}\r\n\r\n/**\r\n * Build property schema for database creation\r\n */\r\nfunction buildPropertySchema(\r\n type: PropertyType,\r\n options?: any\r\n): Record<string, any> {\r\n switch (type) {\r\n case \"title\":\r\n return { title: {} };\r\n\r\n case \"rich_text\":\r\n return { rich_text: {} };\r\n\r\n case \"number\":\r\n return { number: { format: options?.format || \"number\" } };\r\n\r\n case \"select\":\r\n return {\r\n select: {\r\n options: options?.options?.map((opt: string) => ({ name: opt })) || [],\r\n },\r\n };\r\n\r\n case \"multi_select\":\r\n return {\r\n multi_select: {\r\n options: options?.options?.map((opt: string) => ({ name: opt })) || [],\r\n },\r\n };\r\n\r\n case \"date\":\r\n return { date: {} };\r\n\r\n case \"checkbox\":\r\n return { checkbox: {} };\r\n\r\n case \"url\":\r\n return { url: {} };\r\n\r\n case \"email\":\r\n return { email: {} };\r\n\r\n case \"phone_number\":\r\n return { phone_number: {} };\r\n\r\n case \"status\":\r\n return {\r\n status: {\r\n options:\r\n options?.options?.map((opt: string) => ({ name: opt })) || [\r\n { name: \"Not started\" },\r\n { name: \"In progress\" },\r\n { name: \"Done\" },\r\n ],\r\n },\r\n };\r\n\r\n default:\r\n return { rich_text: {} };\r\n }\r\n}\r\n\r\n/**\r\n * Build database properties for entry creation/update\r\n */\r\nfunction buildDatabaseProperties(\r\n properties: Record<string, any>\r\n): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n for (const [key, value] of Object.entries(properties)) {\r\n if (value === undefined) continue;\r\n\r\n // Handle explicit type specification\r\n if (typeof value === \"object\" && value !== null && value._type) {\r\n const { _type, ...rest } = value;\r\n result[key] = buildTypedProperty(_type, rest);\r\n continue;\r\n }\r\n\r\n // Auto-detect type\r\n if (typeof value === \"string\") {\r\n // Check if it looks like a title property\r\n if (key.toLowerCase() === \"name\" || key.toLowerCase() === \"title\") {\r\n result[key] = { title: [{ text: { content: value } }] };\r\n } else if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\r\n result[key] = { url: value };\r\n } else if (value.includes(\"@\") && value.includes(\".\")) {\r\n result[key] = { email: value };\r\n } else {\r\n result[key] = { rich_text: [{ text: { content: value } }] };\r\n }\r\n } else if (typeof value === \"number\") {\r\n result[key] = { number: value };\r\n } else if (typeof value === \"boolean\") {\r\n result[key] = { checkbox: value };\r\n } else if (value instanceof Date) {\r\n result[key] = { date: { start: value.toISOString() } };\r\n } else if (Array.isArray(value)) {\r\n // Multi-select\r\n result[key] = { multi_select: value.map((v) => ({ name: String(v) })) };\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Build typed property value\r\n */\r\nfunction buildTypedProperty(\r\n type: PropertyType,\r\n value: any\r\n): Record<string, any> {\r\n switch (type) {\r\n case \"title\":\r\n return { title: [{ text: { content: value.content || value } }] };\r\n\r\n case \"rich_text\":\r\n return { rich_text: [{ text: { content: value.content || value } }] };\r\n\r\n case \"number\":\r\n return { number: value.value ?? value };\r\n\r\n case \"select\":\r\n return { select: { name: value.name || value } };\r\n\r\n case \"multi_select\":\r\n const options = Array.isArray(value) ? value : value.options || [value];\r\n return { multi_select: options.map((v: any) => ({ name: v.name || v })) };\r\n\r\n case \"date\":\r\n return {\r\n date: {\r\n start:\r\n value.start instanceof Date\r\n ? value.start.toISOString()\r\n : value.start || value,\r\n end: value.end\r\n ? value.end instanceof Date\r\n ? value.end.toISOString()\r\n : value.end\r\n : undefined,\r\n },\r\n };\r\n\r\n case \"checkbox\":\r\n return { checkbox: value.checked ?? value };\r\n\r\n case \"url\":\r\n return { url: value.url || value };\r\n\r\n case \"email\":\r\n return { email: value.email || value };\r\n\r\n case \"phone_number\":\r\n return { phone_number: value.phone || value };\r\n\r\n case \"status\":\r\n return { status: { name: value.name || value } };\r\n\r\n default:\r\n return { rich_text: [{ text: { content: String(value) } }] };\r\n }\r\n}\r\n\r\n/**\r\n * Extract simplified property values from Notion response\r\n */\r\nfunction extractPropertyValues(\r\n properties: Record<string, any>\r\n): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n for (const [name, prop] of Object.entries(properties)) {\r\n switch (prop.type) {\r\n case \"title\":\r\n result[name] = prop.title?.map((t: any) => t.plain_text).join(\"\") || \"\";\r\n break;\r\n\r\n case \"rich_text\":\r\n result[name] =\r\n prop.rich_text?.map((t: any) => t.plain_text).join(\"\") || \"\";\r\n break;\r\n\r\n case \"number\":\r\n result[name] = prop.number;\r\n break;\r\n\r\n case \"select\":\r\n result[name] = prop.select?.name || null;\r\n break;\r\n\r\n case \"multi_select\":\r\n result[name] = prop.multi_select?.map((s: any) => s.name) || [];\r\n break;\r\n\r\n case \"date\":\r\n result[name] = prop.date\r\n ? { start: prop.date.start, end: prop.date.end }\r\n : null;\r\n break;\r\n\r\n case \"checkbox\":\r\n result[name] = prop.checkbox;\r\n break;\r\n\r\n case \"url\":\r\n result[name] = prop.url;\r\n break;\r\n\r\n case \"email\":\r\n result[name] = prop.email;\r\n break;\r\n\r\n case \"phone_number\":\r\n result[name] = prop.phone_number;\r\n break;\r\n\r\n case \"formula\":\r\n result[name] = prop.formula?.[prop.formula.type];\r\n break;\r\n\r\n case \"relation\":\r\n result[name] = prop.relation?.map((r: any) => r.id) || [];\r\n break;\r\n\r\n case \"rollup\":\r\n result[name] = prop.rollup?.[prop.rollup.type];\r\n break;\r\n\r\n case \"created_time\":\r\n result[name] = prop.created_time;\r\n break;\r\n\r\n case \"created_by\":\r\n result[name] = prop.created_by?.id;\r\n break;\r\n\r\n case \"last_edited_time\":\r\n result[name] = prop.last_edited_time;\r\n break;\r\n\r\n case \"last_edited_by\":\r\n result[name] = prop.last_edited_by?.id;\r\n break;\r\n\r\n case \"files\":\r\n result[name] =\r\n prop.files?.map((f: any) => f.file?.url || f.external?.url) || [];\r\n break;\r\n\r\n case \"status\":\r\n result[name] = prop.status?.name || null;\r\n break;\r\n\r\n default:\r\n result[name] = prop;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,8 +1,6 @@
1
- var __create = Object.create;
2
1
  var __defProp = Object.defineProperty;
3
2
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
4
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
5
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
8
6
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
@@ -28,14 +26,6 @@ var __copyProps = (to, from, except, desc) => {
28
26
  }
29
27
  return to;
30
28
  };
31
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
32
- // If the importer is in node compatibility mode or this is not an ESM
33
- // file that has been converted to a CommonJS file using a Babel-
34
- // compatible transform (i.e. "__esModule" has not been set), then set
35
- // "default" to the CommonJS "module.exports" for node compatibility.
36
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
37
- mod
38
- ));
39
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
40
30
 
41
31
  export {
@@ -43,7 +33,6 @@ export {
43
33
  __esm,
44
34
  __commonJS,
45
35
  __export,
46
- __toESM,
47
36
  __toCommonJS
48
37
  };
49
- //# sourceMappingURL=chunk-PLDDJCW6.js.map
38
+ //# sourceMappingURL=chunk-UP2VWCW5.js.map
@@ -325,8 +325,14 @@ var MCPRegistry = class {
325
325
  async initialize() {
326
326
  const enabledServers = this.config.servers.filter((s) => s.enabled);
327
327
  console.log(`[MCP] Initializing ${enabledServers.length} server(s)...`);
328
+ const withTimeout = (promise, name, ms = 15e3) => Promise.race([
329
+ promise,
330
+ new Promise(
331
+ (_, reject) => setTimeout(() => reject(new Error(`${name} timed out after ${ms / 1e3}s`)), ms)
332
+ )
333
+ ]);
328
334
  const results = await Promise.allSettled(
329
- enabledServers.map((config) => this.connectServer(config))
335
+ enabledServers.map((config) => withTimeout(this.connectServer(config), config.name))
330
336
  );
331
337
  results.forEach((result, index) => {
332
338
  if (result.status === "rejected") {
@@ -649,4 +655,4 @@ export {
649
655
  getMCPToolSummary,
650
656
  findMCPTool
651
657
  };
652
- //# sourceMappingURL=chunk-4GLYY4NN.js.map
658
+ //# sourceMappingURL=chunk-UWUIJTT4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/mcp/client.ts","../src/core/mcp/registry.ts","../src/core/mcp/tool-bridge.ts"],"sourcesContent":["/**\n * MCP Client - Handles communication with MCP servers\n * Supports STDIO and HTTP+SSE transports\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { nanoid } from \"nanoid\";\nimport type {\n MCPServerConfig,\n MCPServerState,\n MCPTool,\n MCPInitializeParams,\n MCPInitializeResult,\n MCPToolListResult,\n MCPToolCallParams,\n MCPToolCallResult,\n MCPToolResult,\n JsonRpcRequest,\n JsonRpcResponse,\n} from \"./types\";\n\nconst MCP_PROTOCOL_VERSION = \"2024-11-05\";\n\nexport class MCPClient {\n private config: MCPServerConfig;\n private state: MCPServerState;\n private process: ChildProcess | null = null;\n private pendingRequests: Map<string | number, {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: Timer;\n }> = new Map();\n private messageBuffer = \"\";\n private requestTimeout: number;\n\n constructor(config: MCPServerConfig, timeout = 30000) {\n this.config = config;\n this.requestTimeout = timeout;\n this.state = {\n config,\n status: \"disconnected\",\n tools: [],\n };\n }\n\n get id(): string {\n return this.config.id;\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get status(): MCPServerState[\"status\"] {\n return this.state.status;\n }\n\n get tools(): MCPTool[] {\n return this.state.tools;\n }\n\n get serverInfo() {\n return this.state.serverInfo;\n }\n\n // ============================================\n // CONNECTION MANAGEMENT\n // ============================================\n\n async connect(): Promise<void> {\n if (this.state.status === \"connected\") {\n return;\n }\n\n this.state.status = \"connecting\";\n\n try {\n if (this.config.transport === \"stdio\") {\n await this.connectStdio();\n } else if (this.config.transport === \"http+sse\") {\n await this.connectHttpSse();\n } else {\n throw new Error(`Unsupported transport: ${this.config.transport}`);\n }\n\n // Initialize MCP connection\n const initResult = await this.initialize();\n this.state.capabilities = initResult.capabilities;\n this.state.serverInfo = initResult.serverInfo;\n\n // Fetch available tools\n await this.refreshTools();\n\n this.state.status = \"connected\";\n this.state.lastActivity = new Date();\n\n console.log(`[MCP] Connected to ${this.name} (${this.state.tools.length} tools)`);\n } catch (error) {\n this.state.status = \"error\";\n this.state.lastError = error instanceof Error ? error.message : \"Unknown error\";\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.state.status === \"disconnected\") {\n return;\n }\n\n // Cancel pending requests\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"Connection closed\"));\n }\n this.pendingRequests.clear();\n\n // Kill subprocess if STDIO\n if (this.process) {\n this.process.kill();\n this.process = null;\n }\n\n this.state.status = \"disconnected\";\n this.state.tools = [];\n console.log(`[MCP] Disconnected from ${this.name}`);\n }\n\n // ============================================\n // STDIO TRANSPORT\n // ============================================\n\n private async connectStdio(): Promise<void> {\n if (!this.config.command) {\n throw new Error(\"STDIO transport requires a command\");\n }\n\n const env: Record<string, string> = {\n ...process.env as Record<string, string>,\n ...this.config.env,\n };\n\n this.process = spawn(\n this.config.command,\n this.config.args || [],\n {\n cwd: this.config.cwd || process.cwd(),\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }\n );\n\n // Start reading stdout in background\n this.readStdout();\n\n // Start reading stderr in background\n this.readStderr();\n\n // Give the process a moment to start\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n\n private readStdout(): void {\n if (!this.process?.stdout) return;\n\n this.process.stdout.on(\"data\", (chunk: Buffer) => {\n this.messageBuffer += chunk.toString();\n this.processMessageBuffer();\n });\n\n this.process.stdout.on(\"error\", (error) => {\n if (this.state.status === \"connected\" || this.state.status === \"connecting\") {\n console.error(`[MCP] ${this.name} stdout error:`, error);\n }\n });\n }\n\n private readStderr(): void {\n if (!this.process?.stderr) return;\n\n this.process.stderr.on(\"data\", (chunk: Buffer) => {\n const text = chunk.toString();\n if (text.trim()) {\n console.log(`[MCP] ${this.name} stderr: ${text.trim()}`);\n }\n });\n }\n\n private processMessageBuffer(): void {\n // JSON-RPC messages are newline-delimited\n const lines = this.messageBuffer.split(\"\\n\");\n this.messageBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n try {\n const message = JSON.parse(line) as JsonRpcResponse;\n this.handleResponse(message);\n } catch {\n console.warn(`[MCP] ${this.name} failed to parse message: ${line.slice(0, 100)}`);\n }\n }\n }\n\n private handleResponse(response: JsonRpcResponse): void {\n if (response.id === undefined || response.id === null) {\n // Notification from server, ignore for now\n return;\n }\n\n const pending = this.pendingRequests.get(response.id);\n if (!pending) {\n console.warn(`[MCP] ${this.name} received response for unknown request: ${response.id}`);\n return;\n }\n\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(response.id);\n\n if (response.error) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n\n private async sendRequest(method: string, params?: unknown): Promise<unknown> {\n if (!this.process?.stdin) {\n throw new Error(\"Not connected\");\n }\n\n const id = nanoid();\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n };\n\n const promise = new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`Request timeout: ${method}`));\n }, this.requestTimeout);\n\n this.pendingRequests.set(id, { resolve, reject, timeout });\n });\n\n // Write request to stdin\n const data = JSON.stringify(request) + \"\\n\";\n this.process.stdin.write(data);\n\n return promise;\n }\n\n // ============================================\n // HTTP+SSE TRANSPORT\n // ============================================\n\n private async connectHttpSse(): Promise<void> {\n if (!this.config.url) {\n throw new Error(\"HTTP+SSE transport requires a URL\");\n }\n\n // For HTTP+SSE, we don't maintain a persistent connection\n // Each request is a separate HTTP call\n // SSE is used for streaming responses (not implemented yet)\n\n // Just verify the server is reachable\n try {\n const response = await fetch(`${this.config.url}/health`, {\n headers: this.config.headers,\n });\n\n if (!response.ok) {\n throw new Error(`Server health check failed: ${response.status}`);\n }\n } catch (error) {\n // Health endpoint might not exist, try main endpoint\n const response = await fetch(this.config.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: \"ping\",\n method: \"ping\",\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Server connection failed: ${response.status}`);\n }\n }\n }\n\n private async sendHttpRequest(method: string, params?: unknown): Promise<unknown> {\n if (!this.config.url) {\n throw new Error(\"HTTP+SSE transport requires a URL\");\n }\n\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: nanoid(),\n method,\n params,\n };\n\n const response = await fetch(this.config.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP request failed: ${response.status}`);\n }\n\n const result = await response.json() as JsonRpcResponse;\n\n if (result.error) {\n throw new Error(result.error.message);\n }\n\n return result.result;\n }\n\n // ============================================\n // MCP PROTOCOL METHODS\n // ============================================\n\n private async initialize(): Promise<MCPInitializeResult> {\n const params: MCPInitializeParams = {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: {\n roots: { listChanged: true },\n },\n clientInfo: {\n name: \"OpenSentinel\",\n version: \"3.0.0\",\n },\n };\n\n const result = await this.request(\"initialize\", params) as MCPInitializeResult;\n\n // Send initialized notification\n await this.notify(\"notifications/initialized\", {});\n\n return result;\n }\n\n async refreshTools(): Promise<MCPTool[]> {\n const result = await this.request(\"tools/list\", {}) as MCPToolListResult;\n this.state.tools = result.tools || [];\n return this.state.tools;\n }\n\n async callTool(name: string, args?: Record<string, unknown>): Promise<MCPToolResult> {\n const params: MCPToolCallParams = {\n name,\n arguments: args,\n };\n\n try {\n const result = await this.request(\"tools/call\", params) as MCPToolCallResult;\n this.state.lastActivity = new Date();\n\n // Extract text content from result\n const textContent = result.content\n .filter((c) => c.type === \"text\" && c.text)\n .map((c) => c.text)\n .join(\"\\n\");\n\n return {\n success: !result.isError,\n output: textContent || JSON.stringify(result.content),\n isError: result.isError,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }\n\n // ============================================\n // GENERIC REQUEST/NOTIFY\n // ============================================\n\n private async request(method: string, params?: unknown): Promise<unknown> {\n if (this.config.transport === \"stdio\") {\n return this.sendRequest(method, params);\n } else {\n return this.sendHttpRequest(method, params);\n }\n }\n\n private async notify(method: string, params?: unknown): Promise<void> {\n if (this.config.transport === \"stdio\" && this.process?.stdin) {\n const notification = {\n jsonrpc: \"2.0\",\n method,\n params,\n };\n this.process.stdin.write(JSON.stringify(notification) + \"\\n\");\n }\n // HTTP+SSE notifications are not typically supported\n }\n\n // ============================================\n // STATE ACCESS\n // ============================================\n\n getState(): MCPServerState {\n return { ...this.state };\n }\n}\n","/**\n * MCP Registry - Manages multiple MCP server connections\n * Aggregates tools from all connected servers\n */\n\nimport { MCPClient } from \"./client\";\nimport type {\n MCPConfig,\n MCPServerConfig,\n MCPServerState,\n MCPTool,\n MCPToolResult,\n} from \"./types\";\n\nexport class MCPRegistry {\n private clients: Map<string, MCPClient> = new Map();\n private config: MCPConfig;\n private defaultTimeout: number;\n\n constructor(config: MCPConfig) {\n this.config = config;\n this.defaultTimeout = config.settings?.timeout || 30000;\n }\n\n // ============================================\n // INITIALIZATION\n // ============================================\n\n /**\n * Connect to all enabled MCP servers\n */\n async initialize(): Promise<void> {\n const enabledServers = this.config.servers.filter((s) => s.enabled);\n\n console.log(`[MCP] Initializing ${enabledServers.length} server(s)...`);\n\n const withTimeout = (promise: Promise<void>, name: string, ms = 15000) =>\n Promise.race([\n promise,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error(`${name} timed out after ${ms / 1000}s`)), ms)\n ),\n ]);\n\n const results = await Promise.allSettled(\n enabledServers.map((config) => withTimeout(this.connectServer(config), config.name))\n );\n\n // Log any failures\n results.forEach((result, index) => {\n if (result.status === \"rejected\") {\n console.error(\n `[MCP] Failed to connect to ${enabledServers[index].name}:`,\n result.reason\n );\n }\n });\n\n const connected = results.filter((r) => r.status === \"fulfilled\").length;\n console.log(`[MCP] Connected to ${connected}/${enabledServers.length} servers`);\n }\n\n /**\n * Connect to a single MCP server\n */\n async connectServer(config: MCPServerConfig): Promise<void> {\n if (this.clients.has(config.id)) {\n throw new Error(`Server ${config.id} already connected`);\n }\n\n const client = new MCPClient(config, this.defaultTimeout);\n await client.connect();\n this.clients.set(config.id, client);\n }\n\n /**\n * Disconnect from a specific server\n */\n async disconnectServer(id: string): Promise<void> {\n const client = this.clients.get(id);\n if (client) {\n await client.disconnect();\n this.clients.delete(id);\n }\n }\n\n /**\n * Disconnect from all servers\n */\n async shutdown(): Promise<void> {\n console.log(\"[MCP] Shutting down all connections...\");\n await Promise.all(\n Array.from(this.clients.values()).map((client) => client.disconnect())\n );\n this.clients.clear();\n }\n\n // ============================================\n // TOOL MANAGEMENT\n // ============================================\n\n /**\n * Get all tools from all connected servers\n * Tools are prefixed with \"mcp_{serverId}_\" for routing\n */\n getAllTools(): Array<{ serverId: string; tool: MCPTool }> {\n const tools: Array<{ serverId: string; tool: MCPTool }> = [];\n\n for (const [serverId, client] of this.clients) {\n if (client.status === \"connected\") {\n for (const tool of client.tools) {\n tools.push({ serverId, tool });\n }\n }\n }\n\n return tools;\n }\n\n /**\n * Get tools from a specific server\n */\n getServerTools(serverId: string): MCPTool[] {\n const client = this.clients.get(serverId);\n return client?.tools || [];\n }\n\n /**\n * Call a tool on a specific server\n */\n async callTool(\n serverId: string,\n toolName: string,\n args?: Record<string, unknown>\n ): Promise<MCPToolResult> {\n const client = this.clients.get(serverId);\n\n if (!client) {\n return {\n success: false,\n error: `MCP server not found: ${serverId}`,\n };\n }\n\n if (client.status !== \"connected\") {\n return {\n success: false,\n error: `MCP server not connected: ${serverId}`,\n };\n }\n\n console.log(`[MCP] Calling ${serverId}:${toolName}`);\n return client.callTool(toolName, args);\n }\n\n // ============================================\n // SERVER MANAGEMENT\n // ============================================\n\n /**\n * Get status of all servers\n */\n getServerStates(): MCPServerState[] {\n return Array.from(this.clients.values()).map((client) => client.getState());\n }\n\n /**\n * Get status of a specific server\n */\n getServerState(serverId: string): MCPServerState | undefined {\n return this.clients.get(serverId)?.getState();\n }\n\n /**\n * Check if a server is connected\n */\n isConnected(serverId: string): boolean {\n const client = this.clients.get(serverId);\n return client?.status === \"connected\";\n }\n\n /**\n * Refresh tools from all connected servers\n */\n async refreshAllTools(): Promise<void> {\n await Promise.all(\n Array.from(this.clients.values())\n .filter((client) => client.status === \"connected\")\n .map((client) => client.refreshTools())\n );\n }\n\n /**\n * Add a new server configuration and optionally connect\n */\n async addServer(config: MCPServerConfig, connect = true): Promise<void> {\n if (this.clients.has(config.id)) {\n throw new Error(`Server ${config.id} already exists`);\n }\n\n this.config.servers.push(config);\n\n if (connect && config.enabled) {\n await this.connectServer(config);\n }\n }\n\n /**\n * Remove a server\n */\n async removeServer(serverId: string): Promise<void> {\n await this.disconnectServer(serverId);\n this.config.servers = this.config.servers.filter((s) => s.id !== serverId);\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): MCPConfig {\n return { ...this.config };\n }\n\n /**\n * Get count of connected servers\n */\n get connectedCount(): number {\n return Array.from(this.clients.values()).filter(\n (c) => c.status === \"connected\"\n ).length;\n }\n\n /**\n * Get total tool count across all servers\n */\n get totalToolCount(): number {\n return this.getAllTools().length;\n }\n}\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\n/**\n * Load MCP configuration from a file\n */\nexport async function loadMCPConfig(path: string): Promise<MCPConfig> {\n try {\n const { readFile, access } = await import(\"node:fs/promises\");\n try {\n await access(path);\n } catch {\n console.log(`[MCP] Config file not found: ${path}, using empty config`);\n return { servers: [] };\n }\n\n const content = await readFile(path, \"utf-8\");\n const config = JSON.parse(content) as MCPConfig;\n\n // Validate config\n if (!Array.isArray(config.servers)) {\n console.warn(\"[MCP] Invalid config: servers must be an array\");\n return { servers: [] };\n }\n\n return config;\n } catch (error) {\n console.error(\"[MCP] Failed to load config:\", error);\n return { servers: [] };\n }\n}\n\n/**\n * Create and initialize an MCP registry from a config file\n */\nexport async function initMCPRegistry(configPath: string): Promise<MCPRegistry> {\n const config = await loadMCPConfig(configPath);\n const registry = new MCPRegistry(config);\n await registry.initialize();\n return registry;\n}\n","/**\n * MCP Tool Bridge - Converts MCP tools to Anthropic format\n * Handles tool routing between native and MCP tools\n */\n\nimport type { Tool } from \"@anthropic-ai/sdk/resources/messages\";\nimport type { MCPRegistry } from \"./registry\";\nimport type { MCPTool, MCPToolProperty, MCPToolResult } from \"./types\";\n\n// MCP tool prefix format: mcp_{serverId}_{toolName}\nconst MCP_TOOL_PREFIX = \"mcp_\";\n\n// ============================================\n// TOOL NAME UTILITIES\n// ============================================\n\n/**\n * Create a prefixed tool name for routing\n */\nexport function createMCPToolName(serverId: string, toolName: string): string {\n // Sanitize serverId and toolName to be safe for use as identifiers\n const safeServerId = serverId.replace(/[^a-zA-Z0-9_]/g, \"_\");\n const safeToolName = toolName.replace(/[^a-zA-Z0-9_]/g, \"_\");\n return `${MCP_TOOL_PREFIX}${safeServerId}__${safeToolName}`;\n}\n\n/**\n * Check if a tool name is an MCP tool\n */\nexport function isMCPTool(name: string): boolean {\n return name.startsWith(MCP_TOOL_PREFIX);\n}\n\n/**\n * Parse an MCP tool name to get serverId and original tool name\n */\nexport function parseMCPToolName(name: string): { serverId: string; toolName: string } | null {\n if (!isMCPTool(name)) {\n return null;\n }\n\n const withoutPrefix = name.slice(MCP_TOOL_PREFIX.length);\n const separatorIndex = withoutPrefix.indexOf(\"__\");\n\n if (separatorIndex === -1) {\n return null;\n }\n\n return {\n serverId: withoutPrefix.slice(0, separatorIndex),\n toolName: withoutPrefix.slice(separatorIndex + 2),\n };\n}\n\n// ============================================\n// SCHEMA CONVERSION\n// ============================================\n\n/**\n * Convert MCP tool property to JSON Schema format\n */\nfunction convertProperty(prop: MCPToolProperty): Record<string, unknown> {\n const result: Record<string, unknown> = {\n type: prop.type,\n };\n\n if (prop.description) {\n result.description = prop.description;\n }\n\n if (prop.enum) {\n result.enum = prop.enum;\n }\n\n if (prop.items) {\n result.items = convertProperty(prop.items);\n }\n\n if (prop.properties) {\n result.properties = Object.fromEntries(\n Object.entries(prop.properties).map(([key, value]) => [\n key,\n convertProperty(value),\n ])\n );\n }\n\n if (prop.required) {\n result.required = prop.required;\n }\n\n return result;\n}\n\n/**\n * Convert MCP tool to Anthropic Tool format\n */\nexport function mcpToolToAnthropicTool(\n serverId: string,\n serverName: string,\n tool: MCPTool\n): Tool {\n const properties: Record<string, Record<string, unknown>> = {};\n\n if (tool.inputSchema.properties) {\n for (const [key, value] of Object.entries(tool.inputSchema.properties)) {\n properties[key] = convertProperty(value);\n }\n }\n\n const inputSchema: Tool.InputSchema = {\n type: \"object\",\n properties,\n required: tool.inputSchema.required || [],\n };\n\n // Create a unique name and add server context to description\n const name = createMCPToolName(serverId, tool.name);\n const description = tool.description\n ? `[${serverName}] ${tool.description}`\n : `[${serverName}] ${tool.name}`;\n\n return {\n name,\n description,\n input_schema: inputSchema,\n };\n}\n\n/**\n * Convert all tools from an MCP registry to Anthropic format\n */\nexport function mcpToolsToAnthropicTools(registry: MCPRegistry): Tool[] {\n const tools: Tool[] = [];\n const serverStates = registry.getServerStates();\n\n for (const state of serverStates) {\n if (state.status !== \"connected\") continue;\n\n const serverName = state.serverInfo?.name || state.config.name;\n\n for (const tool of state.tools) {\n tools.push(mcpToolToAnthropicTool(state.config.id, serverName, tool));\n }\n }\n\n return tools;\n}\n\n// ============================================\n// TOOL EXECUTION\n// ============================================\n\n/**\n * Execute an MCP tool call through the registry\n */\nexport async function executeMCPTool(\n registry: MCPRegistry,\n toolName: string,\n args: Record<string, unknown>\n): Promise<MCPToolResult> {\n const parsed = parseMCPToolName(toolName);\n\n if (!parsed) {\n return {\n success: false,\n error: `Invalid MCP tool name: ${toolName}`,\n };\n }\n\n return registry.callTool(parsed.serverId, parsed.toolName, args);\n}\n\n// ============================================\n// TOOL DISCOVERY\n// ============================================\n\n/**\n * Get a summary of available MCP tools for logging/display\n */\nexport function getMCPToolSummary(registry: MCPRegistry): string {\n const states = registry.getServerStates();\n const lines: string[] = [];\n\n for (const state of states) {\n const status = state.status === \"connected\" ? \"✓\" : \"✗\";\n const serverName = state.serverInfo?.name || state.config.name;\n const toolCount = state.tools.length;\n\n lines.push(` ${status} ${serverName}: ${toolCount} tools`);\n\n if (state.status === \"connected\" && state.tools.length > 0) {\n const toolNames = state.tools.map((t) => t.name).join(\", \");\n lines.push(` Tools: ${toolNames}`);\n } else if (state.lastError) {\n lines.push(` Error: ${state.lastError}`);\n }\n }\n\n if (lines.length === 0) {\n return \" No MCP servers configured\";\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Find an MCP tool by its original name (searches all servers)\n */\nexport function findMCPTool(\n registry: MCPRegistry,\n toolName: string\n): { serverId: string; tool: MCPTool } | null {\n const allTools = registry.getAllTools();\n\n for (const { serverId, tool } of allTools) {\n if (tool.name === toolName) {\n return { serverId, tool };\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  chat
3
- } from "./chunk-766ASQWE.js";
3
+ } from "./chunk-6JY4HNUH.js";
4
4
 
5
5
  // src/integrations/email/email-parser.ts
6
6
  function parseEmail(email) {
@@ -774,4 +774,4 @@ export {
774
774
  analyzeSentiment,
775
775
  inbox_summarizer_default
776
776
  };
777
- //# sourceMappingURL=chunk-SPPMCAKG.js.map
777
+ //# sourceMappingURL=chunk-VKMFUIVA.js.map