@agenticmail/enterprise 0.5.319 → 0.5.321

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 (330) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/CODE_OF_CONDUCT.md +31 -0
  3. package/README.md +118 -38
  4. package/SECURITY.md +42 -0
  5. package/dist/agent-heartbeat-3FWNHZFX.js +510 -0
  6. package/dist/agent-heartbeat-4RWHZR7H.js +510 -0
  7. package/dist/agent-heartbeat-6ZGB5ILY.js +510 -0
  8. package/dist/agent-heartbeat-BIVHLKFM.js +510 -0
  9. package/dist/agent-heartbeat-HRKVFK2T.js +510 -0
  10. package/dist/agent-heartbeat-JC5GWVXD.js +510 -0
  11. package/dist/agent-heartbeat-K6A4HMHB.js +510 -0
  12. package/dist/agent-heartbeat-LCDXWFVB.js +510 -0
  13. package/dist/agent-heartbeat-P7HZCZAQ.js +510 -0
  14. package/dist/agent-heartbeat-PUIRSNIO.js +510 -0
  15. package/dist/agent-heartbeat-SN5ILQ6Y.js +510 -0
  16. package/dist/agent-heartbeat-TW5YTDYC.js +510 -0
  17. package/dist/agent-heartbeat-Z2QQXROL.js +510 -0
  18. package/dist/agent-notify-OEQBCZLN.js +43 -0
  19. package/dist/{agent-tools-263HM5QU.js → agent-tools-3W7XLUYA.js} +1 -1
  20. package/dist/agent-tools-4QK7LLNP.js +9 -0
  21. package/dist/agent-tools-54VZGT6L.js +9 -0
  22. package/dist/{agent-tools-AT4D276V.js → agent-tools-AYYDPO27.js} +7 -7
  23. package/dist/{agent-tools-MSTAPX2I.js → agent-tools-F2X47FKF.js} +7 -7
  24. package/dist/{agent-tools-FA26SY5O.js → agent-tools-O6W3QAZL.js} +11 -6
  25. package/dist/agent-tools-OAWVZBMW.js +9 -0
  26. package/dist/agent-tools-QCCU74PN.js +13949 -0
  27. package/dist/chunk-2LHUARN6.js +4929 -0
  28. package/dist/chunk-2WVCNCYC.js +5087 -0
  29. package/dist/{chunk-6PWDS7KY.js → chunk-3FM6YQUK.js} +20 -20
  30. package/dist/chunk-3UAFHUEC.js +212 -0
  31. package/dist/{chunk-WJO57PMO.js → chunk-46GOWZT4.js} +20 -20
  32. package/dist/{chunk-BNRE7TSX.js → chunk-5KYJAUZV.js} +3 -3
  33. package/dist/chunk-6C5PKREN.js +467 -0
  34. package/dist/{chunk-447MTPZF.js → chunk-6ZMLNEHB.js} +3 -3
  35. package/dist/chunk-BPZQT5N5.js +25652 -0
  36. package/dist/chunk-BQM7MBPS.js +1380 -0
  37. package/dist/{chunk-ZRFKGPIU.js → chunk-C52OQNNY.js} +20 -20
  38. package/dist/chunk-C7HGQF4Y.js +25652 -0
  39. package/dist/chunk-CAHNZGGK.js +25656 -0
  40. package/dist/{chunk-FL3CH3ET.js → chunk-CK7R6UHE.js} +51 -27
  41. package/dist/chunk-D36RPWB7.js +25652 -0
  42. package/dist/{chunk-36NM2B4C.js → chunk-DJK2UPFH.js} +63 -93
  43. package/dist/chunk-DM7FTF7W.js +4929 -0
  44. package/dist/chunk-DMD24UFZ.js +5101 -0
  45. package/dist/{chunk-36XNMIHA.js → chunk-DXZGPUAF.js} +20 -20
  46. package/dist/chunk-F46WB5IL.js +5087 -0
  47. package/dist/chunk-F5QG5SQH.js +5087 -0
  48. package/dist/{chunk-JGEVQZDR.js → chunk-FLQ5FLHW.js} +13 -16
  49. package/dist/chunk-H7GP733U.js +5087 -0
  50. package/dist/{chunk-OZSQLOV6.js → chunk-HHBXWB5U.js} +415 -19
  51. package/dist/{chunk-D24JY75H.js → chunk-IMXS4N6W.js} +3 -3
  52. package/dist/{chunk-6PVBV6ZP.js → chunk-JNMDD7JY.js} +3 -3
  53. package/dist/chunk-JTV5LA47.js +1519 -0
  54. package/dist/chunk-KV6G7NZX.js +1519 -0
  55. package/dist/chunk-MU5MEBIK.js +1519 -0
  56. package/dist/chunk-NLT5MC7X.js +465 -0
  57. package/dist/{chunk-GTFZZUXX.js → chunk-NVLYIM4J.js} +51 -27
  58. package/dist/{chunk-6G5SXLXC.js → chunk-NZY2BIZH.js} +63 -93
  59. package/dist/chunk-O42L6G67.js +1519 -0
  60. package/dist/chunk-OCNERGGM.js +4891 -0
  61. package/dist/chunk-OJSNHONE.js +1519 -0
  62. package/dist/{chunk-2TAZJWJN.js → chunk-OWL3QVH7.js} +18 -0
  63. package/dist/{chunk-P3HVY2HS.js → chunk-OWTLNV4Q.js} +382 -7
  64. package/dist/chunk-PCNYEP6T.js +4891 -0
  65. package/dist/{chunk-YL3Z5KPR.js → chunk-PI4AQ4Z6.js} +438 -15
  66. package/dist/chunk-PN3EGTCA.js +194 -0
  67. package/dist/chunk-Q37UKNRC.js +1519 -0
  68. package/dist/chunk-QXTC6J7H.js +5087 -0
  69. package/dist/{chunk-SPBQVNDI.js → chunk-RKERL5LZ.js} +25 -21
  70. package/dist/chunk-RVBK2IOX.js +25652 -0
  71. package/dist/chunk-SAKODCZ5.js +4891 -0
  72. package/dist/{chunk-XV4TU65E.js → chunk-SALGFC5L.js} +51 -27
  73. package/dist/chunk-STGWZ2MS.js +1519 -0
  74. package/dist/chunk-UY3ZVQDP.js +25652 -0
  75. package/dist/chunk-V6OSD62M.js +5087 -0
  76. package/dist/chunk-VP6YAHX4.js +1519 -0
  77. package/dist/chunk-WDYJOEAI.js +5087 -0
  78. package/dist/chunk-WEAFQNOS.js +195 -0
  79. package/dist/chunk-XKUSAZGP.js +5087 -0
  80. package/dist/chunk-Z6K5FKAB.js +548 -0
  81. package/dist/chunk-ZGE3XAXY.js +1519 -0
  82. package/dist/chunk-ZGYVXYQQ.js +3296 -0
  83. package/dist/cli-agent-7TB2BWS6.js +2370 -0
  84. package/dist/cli-agent-AKXFFST2.js +2370 -0
  85. package/dist/cli-agent-DZTKLITB.js +2357 -0
  86. package/dist/cli-agent-FOF7PFEP.js +2357 -0
  87. package/dist/cli-agent-H74M2ZYN.js +2357 -0
  88. package/dist/cli-agent-HORWVPHB.js +2370 -0
  89. package/dist/cli-agent-HSZT6SKF.js +2423 -0
  90. package/dist/cli-agent-JLUQ4ZU6.js +2424 -0
  91. package/dist/cli-agent-MVCDH4HV.js +2370 -0
  92. package/dist/cli-agent-NZXOEPJ2.js +2357 -0
  93. package/dist/cli-agent-PADN3QRC.js +2357 -0
  94. package/dist/cli-agent-QAYEX3BE.js +2441 -0
  95. package/dist/cli-agent-QT64DT5J.js +2370 -0
  96. package/dist/cli-agent-TFL2M6UK.js +2424 -0
  97. package/dist/cli-agent-UIKXATTD.js +2357 -0
  98. package/dist/cli-agent-UJN6FYTO.js +2370 -0
  99. package/dist/cli-agent-VIQAYVY4.js +2357 -0
  100. package/dist/cli-agent-WNWFVOFM.js +2370 -0
  101. package/dist/cli-agent-XBQX67VJ.js +2423 -0
  102. package/dist/cli-agent-ZLSC6FF4.js +2357 -0
  103. package/dist/cli-serve-2IL5DTEY.js +153 -0
  104. package/dist/cli-serve-47N5UKKW.js +153 -0
  105. package/dist/cli-serve-4XGZFUV2.js +140 -0
  106. package/dist/cli-serve-6OT3UEAN.js +140 -0
  107. package/dist/cli-serve-7L6EY5UH.js +153 -0
  108. package/dist/cli-serve-BDGOOOKQ.js +260 -0
  109. package/dist/cli-serve-BFNIW2LF.js +153 -0
  110. package/dist/cli-serve-C7MN6U5Q.js +153 -0
  111. package/dist/cli-serve-CR3OY3IM.js +153 -0
  112. package/dist/cli-serve-DAJFRWQ7.js +153 -0
  113. package/dist/cli-serve-FW6FHFW4.js +153 -0
  114. package/dist/cli-serve-GEEOQS77.js +153 -0
  115. package/dist/cli-serve-H562I3ZK.js +153 -0
  116. package/dist/cli-serve-HDQZF4C4.js +153 -0
  117. package/dist/cli-serve-LICAOMEB.js +140 -0
  118. package/dist/cli-serve-LLGYLWFS.js +153 -0
  119. package/dist/cli-serve-N3OISDNB.js +153 -0
  120. package/dist/cli-serve-TIZ27EVR.js +153 -0
  121. package/dist/cli-serve-TUNI2RCN.js +153 -0
  122. package/dist/cli-serve-WNOZMAWD.js +153 -0
  123. package/dist/cli-validate-Z726VJCN.js +150 -0
  124. package/dist/cli.js +4 -4
  125. package/dist/connection-manager-KAWEUWUR.js +9 -0
  126. package/dist/dashboard/app.js +9 -3
  127. package/dist/dashboard/components/knowledge-link.js +15 -0
  128. package/dist/dashboard/components/settings-help.js +4 -2
  129. package/dist/dashboard/docs/agent-deployment.html +33 -1
  130. package/dist/dashboard/docs/settings-network.html +321 -0
  131. package/dist/dashboard/docs/settings-security.html +347 -0
  132. package/dist/dashboard/docs/settings-tool-security.html +176 -0
  133. package/dist/dashboard/docs/settings.html +36 -16
  134. package/dist/dashboard/pages/agent-detail/deployment.js +39 -6
  135. package/dist/dashboard/pages/agent-detail/tools.js +10 -0
  136. package/dist/dashboard/pages/database-access.js +4 -3
  137. package/dist/dashboard/pages/settings.js +174 -37
  138. package/dist/dashboard/pages/task-pipeline.js +400 -843
  139. package/dist/db-adapter-2T56ORSD.js +7 -0
  140. package/dist/db-adapter-IRHOUMVC.js +7 -0
  141. package/dist/index.js +41 -41
  142. package/dist/microsoft-VREAZ7M2.js +3955 -0
  143. package/dist/routes-3MMLQTB6.js +90 -0
  144. package/dist/routes-4ZUIJ4HE.js +90 -0
  145. package/dist/routes-5MXHKKH4.js +90 -0
  146. package/dist/routes-64NJFK3B.js +90 -0
  147. package/dist/routes-6AKQ2LBV.js +90 -0
  148. package/dist/routes-CRRBUDO4.js +90 -0
  149. package/dist/routes-DIAF3MC3.js +90 -0
  150. package/dist/routes-KMUNU6CY.js +90 -0
  151. package/dist/routes-LRRLXIZR.js +90 -0
  152. package/dist/routes-N647AJYG.js +90 -0
  153. package/dist/routes-SSSELAAR.js +90 -0
  154. package/dist/routes-STERVGKJ.js +90 -0
  155. package/dist/routes-ZEZZACZP.js +90 -0
  156. package/dist/runtime-5EQN4GFM.js +45 -0
  157. package/dist/runtime-5LP7PUD4.js +45 -0
  158. package/dist/runtime-6BULDBR3.js +45 -0
  159. package/dist/runtime-6YEENDN3.js +45 -0
  160. package/dist/runtime-7LQFRG3B.js +45 -0
  161. package/dist/runtime-AMXJU2MB.js +45 -0
  162. package/dist/runtime-D6WSE7FG.js +45 -0
  163. package/dist/runtime-EYVN7NFJ.js +45 -0
  164. package/dist/runtime-F6RPWQVW.js +45 -0
  165. package/dist/runtime-FYMJURFC.js +45 -0
  166. package/dist/runtime-JRNBL4O4.js +45 -0
  167. package/dist/runtime-OM2NIBMI.js +45 -0
  168. package/dist/runtime-QWPVD7CY.js +45 -0
  169. package/dist/runtime-YLIIPTE4.js +45 -0
  170. package/dist/runtime-YU6P22CG.js +45 -0
  171. package/dist/screen-unlock-4RPZBHOI.js +118 -0
  172. package/dist/server-AMCSXINC.js +28 -0
  173. package/dist/server-CU6LVQS4.js +28 -0
  174. package/dist/server-DFYGH2CV.js +28 -0
  175. package/dist/server-EELWOC3X.js +28 -0
  176. package/dist/server-EN5E2OWQ.js +28 -0
  177. package/dist/server-GW2HYJYI.js +28 -0
  178. package/dist/server-J25NCRWJ.js +28 -0
  179. package/dist/server-JDGNOTFV.js +28 -0
  180. package/dist/server-NE5HD5DJ.js +28 -0
  181. package/dist/server-NQOT7W77.js +28 -0
  182. package/dist/server-PWE5PQTR.js +28 -0
  183. package/dist/server-Q2Q32H2B.js +28 -0
  184. package/dist/server-Q77ME7TL.js +28 -0
  185. package/dist/server-WLLH4WST.js +28 -0
  186. package/dist/server-WTUJ2O3F.js +28 -0
  187. package/dist/server-X4CJTHHF.js +28 -0
  188. package/dist/server-XK3ILCJC.js +28 -0
  189. package/dist/server-ZRD3NDJE.js +28 -0
  190. package/dist/setup-44VBAO4J.js +20 -0
  191. package/dist/setup-4ONNQBWB.js +20 -0
  192. package/dist/setup-4OSBXSCL.js +20 -0
  193. package/dist/setup-4QFGRBLZ.js +20 -0
  194. package/dist/setup-6766SGAR.js +20 -0
  195. package/dist/setup-AYY24DKM.js +20 -0
  196. package/dist/setup-B34N4HPU.js +20 -0
  197. package/dist/setup-E2YLC2EY.js +20 -0
  198. package/dist/setup-ER6NXTY5.js +20 -0
  199. package/dist/setup-H2AGCBW5.js +20 -0
  200. package/dist/setup-ICOZRKCX.js +20 -0
  201. package/dist/setup-JFTJH7UF.js +20 -0
  202. package/dist/setup-PRFNI6YW.js +20 -0
  203. package/dist/setup-RAHBMYHE.js +20 -0
  204. package/dist/setup-TXPR5UQX.js +20 -0
  205. package/dist/setup-XCJMELVU.js +20 -0
  206. package/dist/setup-XIYEIFVK.js +20 -0
  207. package/dist/setup-Z4PZSHBI.js +20 -0
  208. package/dist/skills-FR7I5V7H.js +16 -0
  209. package/dist/skills-HCVBA6PK.js +16 -0
  210. package/dist/system-prompts-TM7OA32C.js +913 -0
  211. package/dist/task-queue-O7IVZYUO.js +9 -0
  212. package/dist/transport-encryption-2T7PIXKG.js +25 -0
  213. package/logs/cloudflared-error.log +61 -0
  214. package/logs/cloudflared-out.log +0 -0
  215. package/logs/enterprise-error.log +0 -0
  216. package/logs/enterprise-out.log +3 -0
  217. package/logs/fola-error.log +0 -0
  218. package/logs/fola-out.log +0 -0
  219. package/logs/john-error.log +8 -0
  220. package/logs/john-out.log +0 -0
  221. package/package.json +31 -3
  222. package/src/agent-tools/tool-resolver.ts +50 -61
  223. package/src/agent-tools/tools/enterprise-database.ts +5 -5
  224. package/src/agent-tools/tools/local/dependency-manager.ts +2 -2
  225. package/src/agent-tools/tools/microsoft/graph-api.ts +137 -26
  226. package/src/agent-tools/tools/microsoft/outlook-mail.ts +392 -100
  227. package/src/agent-tools/tools/microsoft/teams.ts +267 -48
  228. package/src/auth/routes.ts +4 -4
  229. package/src/cli-agent.ts +108 -8
  230. package/src/cli-serve.ts +140 -0
  231. package/src/dashboard/app.js +9 -3
  232. package/src/dashboard/components/knowledge-link.js +15 -0
  233. package/src/dashboard/components/settings-help.js +4 -2
  234. package/src/dashboard/docs/agent-deployment.html +33 -1
  235. package/src/dashboard/docs/settings-network.html +321 -0
  236. package/src/dashboard/docs/settings-security.html +347 -0
  237. package/src/dashboard/docs/settings-tool-security.html +176 -0
  238. package/src/dashboard/docs/settings.html +36 -16
  239. package/src/dashboard/pages/agent-detail/deployment.js +39 -6
  240. package/src/dashboard/pages/agent-detail/tools.js +10 -0
  241. package/src/dashboard/pages/database-access.js +4 -3
  242. package/src/dashboard/pages/settings.js +174 -37
  243. package/src/dashboard/pages/task-pipeline.js +400 -843
  244. package/src/database-access/agent-tools.ts +78 -63
  245. package/src/database-access/connection-manager.ts +13 -2
  246. package/src/database-access/routes.ts +13 -1
  247. package/src/db/adapter.ts +1 -0
  248. package/src/engine/agent-memory.ts +2 -1
  249. package/src/engine/agent-notify.ts +50 -0
  250. package/src/engine/agent-routes.ts +257 -4
  251. package/src/engine/db-adapter.ts +16 -0
  252. package/src/engine/lifecycle.ts +4 -0
  253. package/src/engine/routes.ts +4 -3
  254. package/src/engine/screen-unlock.ts +136 -0
  255. package/src/engine/skills/database-access.ts +78 -0
  256. package/src/engine/skills/index.ts +3 -2
  257. package/src/engine/skills.ts +2 -0
  258. package/src/engine/task-queue-routes.ts +18 -0
  259. package/src/engine/task-queue.ts +15 -2
  260. package/src/middleware/transport-encryption.ts +1 -4
  261. package/src/runtime/agent-loop.ts +4 -0
  262. package/src/runtime/index.ts +15 -6
  263. package/src/server.ts +14 -1
  264. package/src/system-prompts/google/index.ts +1 -2
  265. package/src/system-prompts/index.ts +1 -1
  266. package/src/system-prompts/microsoft/contacts.ts +34 -0
  267. package/src/system-prompts/microsoft/excel.ts +52 -0
  268. package/src/system-prompts/microsoft/index.ts +31 -0
  269. package/src/system-prompts/microsoft/onedrive.ts +41 -0
  270. package/src/system-prompts/microsoft/onenote.ts +36 -0
  271. package/src/system-prompts/microsoft/outlook-calendar.ts +37 -0
  272. package/src/system-prompts/microsoft/outlook-mail.ts +46 -0
  273. package/src/system-prompts/microsoft/planner.ts +37 -0
  274. package/src/system-prompts/microsoft/powerbi.ts +38 -0
  275. package/src/system-prompts/microsoft/powerpoint.ts +35 -0
  276. package/src/system-prompts/microsoft/sharepoint.ts +44 -0
  277. package/src/system-prompts/microsoft/teams.ts +49 -0
  278. package/src/system-prompts/microsoft/todo.ts +37 -0
  279. package/src/types/hono-env.ts +4 -0
  280. package/.github/CODEOWNERS +0 -23
  281. package/.github/workflows/publish-community-skills.yml +0 -121
  282. package/.github/workflows/validate-community-skills.yml +0 -172
  283. package/agriculture_southwest_nigeria_research.txt +0 -10
  284. package/boa_credit_cards_research.txt +0 -10
  285. package/customer_support_research_feb2026.txt +0 -10
  286. package/dist/agent-tools-LRA7PPXG.js +0 -13922
  287. package/dist/agent-tools-VAU5DOQB.js +0 -13910
  288. package/dist/agent-tools-VWV7OWXU.js +0 -13922
  289. package/dist/chunk-2Z7MWTCX.js +0 -4977
  290. package/dist/chunk-3T4XU3VV.js +0 -5010
  291. package/dist/chunk-445QM4NX.js +0 -5061
  292. package/dist/chunk-5TW3Y7DJ.js +0 -1519
  293. package/dist/chunk-6I7VY3LT.js +0 -5060
  294. package/dist/chunk-6W5EK3UP.js +0 -4977
  295. package/dist/chunk-AQMSHJQT.js +0 -5069
  296. package/dist/chunk-ASSQW7HX.js +0 -5051
  297. package/dist/chunk-CIN27FGC.js +0 -5037
  298. package/dist/chunk-CMXY3NUB.js +0 -4977
  299. package/dist/chunk-DRLMRUDP.js +0 -5052
  300. package/dist/chunk-EHI7Z446.js +0 -1519
  301. package/dist/chunk-FEAILFAQ.js +0 -1519
  302. package/dist/chunk-GA3PYBZL.js +0 -1519
  303. package/dist/chunk-GWX63G5J.js +0 -1519
  304. package/dist/chunk-HHMZ4UY6.js +0 -1519
  305. package/dist/chunk-HVQMNF7E.js +0 -4921
  306. package/dist/chunk-HXM7F3YN.js +0 -1519
  307. package/dist/chunk-K6NGOUXG.js +0 -5060
  308. package/dist/chunk-KPG5WINJ.js +0 -4977
  309. package/dist/chunk-LBCUBYDL.js +0 -1519
  310. package/dist/chunk-LIRQSWLR.js +0 -5014
  311. package/dist/chunk-LRCKO5KE.js +0 -1519
  312. package/dist/chunk-M7XL3DJD.js +0 -5069
  313. package/dist/chunk-MHJULEIQ.js +0 -1519
  314. package/dist/chunk-MJGGW6MC.js +0 -106
  315. package/dist/chunk-MMYBDHDB.js +0 -4921
  316. package/dist/chunk-MQT5FXKD.js +0 -1519
  317. package/dist/chunk-OIMPEQF5.js +0 -4977
  318. package/dist/chunk-OOU7JUYE.js +0 -542
  319. package/dist/chunk-OW4GLBHP.js +0 -1519
  320. package/dist/chunk-Q4K4MMLU.js +0 -4977
  321. package/dist/chunk-RUK4CRPF.js +0 -1519
  322. package/dist/chunk-T7H65XQY.js +0 -1519
  323. package/dist/chunk-TQVFWG57.js +0 -5064
  324. package/dist/chunk-UEPK3IMC.js +0 -1519
  325. package/dist/chunk-VUWTXJH6.js +0 -1519
  326. package/dist/chunk-WCPGGSAD.js +0 -1519
  327. package/dist/chunk-WO63NZOJ.js +0 -1519
  328. package/dist/chunk-YPJDRVUM.js +0 -5064
  329. package/dist/chunk-ZROMH5DL.js +0 -4921
  330. package/src/dashboard/docs/_template.txt +0 -92
@@ -0,0 +1,9 @@
1
+ import {
2
+ TaskQueueManager,
3
+ init_task_queue
4
+ } from "./chunk-Z6K5FKAB.js";
5
+ import "./chunk-KFQGP6VL.js";
6
+ init_task_queue();
7
+ export {
8
+ TaskQueueManager
9
+ };
@@ -0,0 +1,25 @@
1
+ import {
2
+ DEFAULT_SENSITIVE_ENDPOINTS,
3
+ decryptPayload,
4
+ encryptPayload,
5
+ getConfig,
6
+ init_transport_encryption,
7
+ loadConfig,
8
+ resetKeys,
9
+ setSettingsDb,
10
+ setTransportEncryptionConfig,
11
+ transportEncryptionMiddleware
12
+ } from "./chunk-FLQ5FLHW.js";
13
+ import "./chunk-KFQGP6VL.js";
14
+ init_transport_encryption();
15
+ export {
16
+ DEFAULT_SENSITIVE_ENDPOINTS,
17
+ decryptPayload,
18
+ encryptPayload,
19
+ getConfig,
20
+ loadConfig,
21
+ resetKeys,
22
+ setSettingsDb,
23
+ setTransportEncryptionConfig,
24
+ transportEncryptionMiddleware
25
+ };
@@ -0,0 +1,61 @@
1
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Starting tunnel tunnelID=18dbfae9-fe5c-4380-a5c7-e5e875255b06
2
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Version 2026.2.0 (Checksum dc6e60da390e702c4db3332d0cc9cf4e98a88df99f17273e9b3d83f435695fb4)
3
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF GOOS: darwin, GOVersion: go1.25.7, GoArch: arm64
4
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Settings: map[cred-file:/Users/ope/.cloudflared/18dbfae9-fe5c-4380-a5c7-e5e875255b06.json credentials-file:/Users/ope/.cloudflared/18dbfae9-fe5c-4380-a5c7-e5e875255b06.json]
5
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF cloudflared will not automatically update if installed by a package manager.
6
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Generated Connector ID: 5680022c-ff41-4224-8d2f-238ae9392416
7
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Initial protocol quic
8
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF ICMP proxy will use 192.168.86.21 as source for IPv4
9
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF ICMP proxy will use fe80::1c9c:15a9:2404:3154 in zone en1 as source for IPv6
10
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Created ICMP proxy listening on 192.168.86.21:0
11
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF ICMP proxy will use 192.168.86.21 as source for IPv4
12
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF ICMP proxy will use fe80::1c9c:15a9:2404:3154 in zone en1 as source for IPv6
13
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Starting metrics server on 127.0.0.1:20241/metrics
14
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=0 event=0 ip=198.41.200.63
15
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Registered tunnel connection connIndex=0 connection=4853aaeb-0b59-40b7-adab-55225c98aaa2 event=0 ip=198.41.200.63 location=atl10 protocol=quic
16
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=1 event=0 ip=198.41.192.7
17
+ 2026-03-05 06:30:17: 2026-03-05T05:30:17Z INF Registered tunnel connection connIndex=1 connection=721bad3b-ceeb-4173-8af3-61ef604bef42 event=0 ip=198.41.192.7 location=atl06 protocol=quic
18
+ 2026-03-05 06:30:18: 2026-03-05T05:30:18Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=2 event=0 ip=198.41.192.167
19
+ 2026-03-05 06:30:18: 2026-03-05T05:30:18Z INF Registered tunnel connection connIndex=2 connection=2c61322a-dbcd-4842-bc5a-24abb5dd04e7 event=0 ip=198.41.192.167 location=atl01 protocol=quic
20
+ 2026-03-05 06:30:19: 2026-03-05T05:30:19Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=3 event=0 ip=198.41.200.43
21
+ 2026-03-05 06:30:19: 2026-03-05T05:30:19Z INF Registered tunnel connection connIndex=3 connection=3f85a46d-7759-4483-a267-f9e342905648 event=0 ip=198.41.200.43 location=atl14 protocol=quic
22
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z INF Initiating graceful shutdown due to signal interrupt ...
23
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR failed to run the datagram handler error="Application error 0x0 (remote)" connIndex=0 event=0 ip=198.41.200.63
24
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR failed to serve tunnel connection error="accept stream listener encountered a failure while serving" connIndex=0 event=0 ip=198.41.200.63
25
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR Serve tunnel error error="accept stream listener encountered a failure while serving" connIndex=0 event=0 ip=198.41.200.63
26
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z INF Retrying connection in up to 1s connIndex=0 event=0 ip=198.41.200.63
27
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR Connection terminated connIndex=0
28
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR failed to run the datagram handler error="Application error 0x0 (remote)" connIndex=2 event=0 ip=198.41.192.167
29
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR failed to serve tunnel connection error="accept stream listener encountered a failure while serving" connIndex=2 event=0 ip=198.41.192.167
30
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR Serve tunnel error error="accept stream listener encountered a failure while serving" connIndex=2 event=0 ip=198.41.192.167
31
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z INF Retrying connection in up to 1s connIndex=2 event=0 ip=198.41.192.167
32
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR Connection terminated connIndex=2
33
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR failed to run the datagram handler error="context canceled" connIndex=1 event=0 ip=198.41.192.7
34
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR failed to serve tunnel connection error="accept stream listener encountered a failure while serving" connIndex=1 event=0 ip=198.41.192.7
35
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR Serve tunnel error error="accept stream listener encountered a failure while serving" connIndex=1 event=0 ip=198.41.192.7
36
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z INF Retrying connection in up to 1s connIndex=1 event=0 ip=198.41.192.7
37
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z ERR Connection terminated connIndex=1
38
+ 2026-03-05 06:31:03: 2026-03-05T05:31:03Z INF Unregistered tunnel connection connIndex=3 event=0 ip=198.41.200.43
39
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF Starting tunnel tunnelID=18dbfae9-fe5c-4380-a5c7-e5e875255b06
40
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF Version 2026.2.0 (Checksum dc6e60da390e702c4db3332d0cc9cf4e98a88df99f17273e9b3d83f435695fb4)
41
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF GOOS: darwin, GOVersion: go1.25.7, GoArch: arm64
42
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF Settings: map[cred-file:/Users/ope/.cloudflared/18dbfae9-fe5c-4380-a5c7-e5e875255b06.json credentials-file:/Users/ope/.cloudflared/18dbfae9-fe5c-4380-a5c7-e5e875255b06.json]
43
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF cloudflared will not automatically update if installed by a package manager.
44
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF Generated Connector ID: cc6e6cb6-caac-477f-a1a2-d86368d41607
45
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF Initial protocol quic
46
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF ICMP proxy will use 192.168.86.21 as source for IPv4
47
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF ICMP proxy will use fe80::1c9c:15a9:2404:3154 in zone en1 as source for IPv6
48
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF Created ICMP proxy listening on 192.168.86.21:0
49
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF ICMP proxy will use 192.168.86.21 as source for IPv4
50
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF ICMP proxy will use fe80::1c9c:15a9:2404:3154 in zone en1 as source for IPv6
51
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF Starting metrics server on 127.0.0.1:20241/metrics
52
+ 2026-03-05 06:31:08: 2026-03-05T05:31:08Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=0 event=0 ip=198.41.192.107
53
+ 2026-03-05 06:31:09: 2026-03-05T05:31:09Z INF Registered tunnel connection connIndex=0 connection=edb70b98-0105-4afd-bb75-6c2ec9ca0a53 event=0 ip=198.41.192.107 location=atl12 protocol=quic
54
+ 2026-03-05 06:31:09: 2026-03-05T05:31:09Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=1 event=0 ip=198.41.200.63
55
+ 2026-03-05 06:31:09: 2026-03-05T05:31:09Z INF Registered tunnel connection connIndex=1 connection=826299ab-8cff-4806-8890-55db7e5620d0 event=0 ip=198.41.200.63 location=atl11 protocol=quic
56
+ 2026-03-05 06:31:10: 2026-03-05T05:31:10Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=2 event=0 ip=198.41.192.57
57
+ 2026-03-05 06:31:10: 2026-03-05T05:31:10Z INF Registered tunnel connection connIndex=2 connection=9ceb7c37-a55c-4516-bbd0-e69f4f0c1152 event=0 ip=198.41.192.57 location=atl12 protocol=quic
58
+ 2026-03-05 06:31:11: 2026-03-05T05:31:11Z INF Tunnel connection curve preferences: [X25519MLKEM768 CurveP256] connIndex=3 event=0 ip=198.41.200.53
59
+ 2026-03-05 06:31:11: 2026-03-05T05:31:11Z INF Registered tunnel connection connIndex=3 connection=3b74716b-204c-459d-b533-31e1307e1ea8 event=0 ip=198.41.200.53 location=atl11 protocol=quic
60
+ 2026-03-05 06:35:14: 2026-03-05T05:35:14Z ERR error="unexpected EOF" connIndex=3 event=1 ingressRule=0 originService=http://localhost:3100
61
+ 2026-03-05 06:35:14: 2026-03-05T05:35:14Z ERR Request failed error="unexpected EOF" connIndex=3 dest=https://enterprise.agenticmail.io/api/engine/task-pipeline/stream event=0 ip=198.41.200.53 type=http
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ 2026-03-05 06:30:17: Loaded config from /Users/ope/Desktop/projects/agenticmail/enterprise/.env
2
+ 2026-03-05 06:31:08: Loaded config from /Users/ope/Desktop/projects/agenticmail/enterprise/.env
3
+ 2026-03-05 06:35:14: Loaded config from /Users/ope/Desktop/projects/agenticmail/enterprise/.env
File without changes
File without changes
@@ -0,0 +1,8 @@
1
+ 2026-03-05 06:30:17: ERROR: DATABASE_URL is required
2
+ 2026-03-05 06:30:19: ERROR: DATABASE_URL is required
3
+ 2026-03-05 06:30:22: ERROR: DATABASE_URL is required
4
+ 2026-03-05 06:30:27: ERROR: DATABASE_URL is required
5
+ 2026-03-05 06:30:34: ERROR: DATABASE_URL is required
6
+ 2026-03-05 06:30:44: ERROR: DATABASE_URL is required
7
+ 2026-03-05 06:30:59: ERROR: DATABASE_URL is required
8
+ 2026-03-05 06:31:11: Fatal error: current transaction is aborted, commands ignored until end of transaction block
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticmail/enterprise",
3
- "version": "0.5.319",
3
+ "version": "0.5.321",
4
4
  "description": "AgenticMail Enterprise — cloud-hosted AI agent identity, email, auth & compliance for organizations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,10 +28,31 @@
28
28
  "saml",
29
29
  "oidc",
30
30
  "scim",
31
- "identity"
31
+ "identity",
32
+ "ai-agents",
33
+ "agent-platform",
34
+ "microsoft-365",
35
+ "google-workspace",
36
+ "compliance",
37
+ "soc2",
38
+ "gdpr",
39
+ "dlp",
40
+ "data-loss-prevention",
41
+ "oauth",
42
+ "multi-tenant",
43
+ "workforce-management",
44
+ "task-pipeline",
45
+ "telegram-bot",
46
+ "whatsapp-bot",
47
+ "voice-ai",
48
+ "google-meet",
49
+ "dependency-management",
50
+ "audit-log",
51
+ "rbac",
52
+ "encryption"
32
53
  ],
33
54
  "author": "Ope Olatunji (https://github.com/ope-olatunji)",
34
- "homepage": "https://github.com/agenticmail/enterprise",
55
+ "homepage": "https://agenticmail.io",
35
56
  "repository": {
36
57
  "type": "git",
37
58
  "url": "https://github.com/agenticmail/enterprise.git"
@@ -90,5 +111,12 @@
90
111
  "mongodb": "^6.3.0",
91
112
  "mysql2": "^3.9.0",
92
113
  "postgres": "^3.4.0"
114
+ },
115
+ "engines": {
116
+ "node": ">=18.0.0"
117
+ },
118
+ "funding": {
119
+ "type": "individual",
120
+ "url": "https://agenticmail.io"
93
121
  }
94
122
  }
@@ -81,7 +81,10 @@ export type ToolSet =
81
81
  // Management (hierarchy, delegation, escalation)
82
82
  | 'management'
83
83
  // Integrations
84
- | 'mcp_bridge';
84
+ | 'mcp_bridge'
85
+ // Aliases (legacy/shorthand)
86
+ | 'filesystem'
87
+ | 'web';
85
88
 
86
89
  // ─── Tier Classification ─────────────────────────────────
87
90
 
@@ -131,6 +134,8 @@ const TIER_MAP: Record<ToolSet, ToolTier> = {
131
134
  msg_whatsapp: 2,
132
135
  msg_telegram: 2,
133
136
  mcp_bridge: 3,
137
+ filesystem: 2,
138
+ web: 2,
134
139
  };
135
140
 
136
141
  // ─── Exhaustive Tool Registry ────────────────────────────
@@ -501,67 +506,28 @@ export function clearSessionToolState(sessionId: string): void {
501
506
  // Which Tier 2 sets get auto-loaded for each context.
502
507
  // Tier 1 is ALWAYS loaded. Tier 3 is NEVER auto-loaded (must be requested).
503
508
 
509
+ const _ALL_SETS = Object.keys(TIER_MAP) as ToolSet[];
510
+
511
+ // Tier 2 sets that are commonly needed — loaded for most contexts
512
+ const _COMMON_T2: ToolSet[] = ['local_filesystem', 'local_shell', 'browser', 'system', 'ent_knowledge'];
513
+
504
514
  const CONTEXT_PROMOTIONS: Record<SessionContext, ToolSet[]> = {
505
- // Meeting: voice + calendar (check schedule)
506
- meeting: [
507
- 'meeting_voice',
508
- 'gws_calendar',
509
- ],
510
-
511
- // Chat (Google Chat): GWS chat tools + browser + calendar + knowledge
512
- chat: [
513
- 'gws_chat',
514
- 'browser',
515
- 'gws_calendar',
516
- 'ent_knowledge',
517
- ],
518
-
519
- // WhatsApp: messaging + essential file/shell tools for media processing
520
- whatsapp: [
521
- 'msg_whatsapp',
522
- 'browser',
523
- 'local_shell',
524
- 'filesystem',
525
- 'web',
526
- ],
527
-
528
- // Telegram: messaging + essential file/shell tools for media processing
529
- telegram: [
530
- 'msg_telegram',
531
- 'browser',
532
- 'local_shell',
533
- 'filesystem',
534
- 'web',
535
- ],
536
-
537
- // Email handler: focused email + lookups
538
- email: [
539
- 'system',
540
- 'gws_gmail',
541
- 'gws_calendar',
542
- 'gws_contacts',
543
- 'gws_drive',
544
- 'gws_tasks',
545
- 'agenticmail',
546
- 'ent_documents',
547
- 'ent_knowledge',
548
- ],
549
-
550
- // Task: broad access for autonomous work
551
- task: [
552
- 'browser', 'system',
553
- 'visual_memory',
554
- 'meeting_lifecycle',
555
- 'gws_gmail', 'gws_calendar', 'gws_drive',
556
- 'gws_docs', 'gws_sheets', 'gws_contacts',
557
- 'gws_tasks', 'gws_maps',
558
- 'ent_database', 'ent_spreadsheet', 'ent_documents',
559
- 'ent_http', 'ent_security', 'ent_code', 'ent_diff',
560
- 'agenticmail', 'mcp_bridge',
561
- ],
562
-
563
- // Full: everything
564
- full: Object.keys(TIER_MAP) as ToolSet[],
515
+ // Meeting: voice + lifecycle essential, plus common tools
516
+ meeting: ['meeting_voice', 'meeting_lifecycle', ..._COMMON_T2],
517
+
518
+ // Chat (webchat/generic): common tools only — rest loaded on demand via signals or request_tools
519
+ chat: _COMMON_T2,
520
+
521
+ // Messaging channels: load the relevant channel's tools + common tools
522
+ // The agent's OWN channel tools are essential (Tier 1-like for that session)
523
+ // Other channel tools and specialist tools load on demand
524
+ whatsapp: ['msg_whatsapp', ..._COMMON_T2],
525
+ telegram: ['msg_telegram', ..._COMMON_T2],
526
+ email: ['agenticmail', 'gws_gmail', ..._COMMON_T2],
527
+
528
+ // Task/full: broader set for agent-to-agent work
529
+ task: ['agenticmail', ..._COMMON_T2],
530
+ full: _ALL_SETS,
565
531
  };
566
532
 
567
533
  // ─── Conversation Signal Detection ───────────────────────
@@ -619,6 +585,27 @@ const SIGNAL_RULES: SignalRule[] = [
619
585
  // Knowledge base / hub
620
586
  { patterns: [/\bknowledge\s*base\b/i, /\bknowledge\s*hub\b/i, /\bfaq\b/i, /\bdocumentation\b/i, /\bwiki\b/i, /\bhow\s+do\s+(we|i)\b/i, /\bwhat.*(policy|process|procedure)\b/i, /\bcompany.*(guide|handbook)\b/i],
621
587
  sets: ['ent_knowledge'] },
588
+ // WhatsApp (cross-channel)
589
+ { patterns: [/\bwhatsapp\b/i, /\bsend.*whatsapp\b/i, /\bwa\s+message\b/i],
590
+ sets: ['msg_whatsapp'] },
591
+ // Telegram (cross-channel)
592
+ { patterns: [/\btelegram\b/i, /\bsend.*telegram\b/i, /\btg\s+message\b/i],
593
+ sets: ['msg_telegram'] },
594
+ // Spreadsheet / CSV
595
+ { patterns: [/\bcsv\b/i, /\bspreadsheet\b/i, /\btransform.*data\b/i, /\bpivot\b/i],
596
+ sets: ['ent_spreadsheet'] },
597
+ // Diff
598
+ { patterns: [/\bdiff\b/i, /\bcompare.*files?\b/i, /\bwhat.*changed\b/i],
599
+ sets: ['ent_diff'] },
600
+ // Tasks (Google)
601
+ { patterns: [/\bgoogle\s*tasks?\b/i, /\btask\s*list\b/i, /\btodo\b/i],
602
+ sets: ['gws_tasks'] },
603
+ // Visual memory
604
+ { patterns: [/\bscreenshot\b/i, /\bcapture\b/i, /\bvision\b/i, /\bwhat.*see\b/i, /\blook\s*at\b/i],
605
+ sets: ['visual_memory'] },
606
+ // AgenticMail (broader)
607
+ { patterns: [/\bsend.*email\b/i, /\bwrite.*email\b/i, /\bdraft\b/i, /\binbox\b/i, /\bcheck.*mail\b/i],
608
+ sets: ['agenticmail'] },
622
609
  ];
623
610
 
624
611
  /**
@@ -823,6 +810,8 @@ const SET_DESCRIPTIONS: Record<ToolSet, string> = {
823
810
  msg_telegram: 'Telegram messaging, media, and file download (5 tools)',
824
811
  management: 'Team management — delegate tasks, escalate, org chart (10 tools)',
825
812
  mcp_bridge: 'MCP integration adapters',
813
+ filesystem: 'File system tools (alias)',
814
+ web: 'Web tools (alias)',
826
815
  };
827
816
 
828
817
  function createRequestToolsTool(
@@ -52,7 +52,7 @@ export function createDatabaseTools(options?: ToolCreationOptions): AnyAgentTool
52
52
  var entDbQuery: AnyAgentTool = {
53
53
  name: 'ent_db_query',
54
54
  label: 'Database Query',
55
- description: 'Execute a read-only SQL query against a database connection.',
55
+ description: 'Execute a read-only SQL query against a LOCAL SQLite database file. For external/cloud databases, use db_query instead.',
56
56
  category: 'utility',
57
57
  risk: 'medium',
58
58
  parameters: {
@@ -220,8 +220,8 @@ export function createDatabaseTools(options?: ToolCreationOptions): AnyAgentTool
220
220
 
221
221
  var entDbConnections: AnyAgentTool = {
222
222
  name: 'ent_db_connections',
223
- label: 'List Database Connections',
224
- description: 'List all available database connections that can be used with other database ...',
223
+ label: 'List Local Database Files',
224
+ description: 'List LOCAL SQLite database files found in the workspace directory. ONLY for local .db/.sqlite files on this machine. For external/cloud databases (Postgres, MySQL, Supabase, etc.) granted by your admin, use db_list_connections instead.',
225
225
  category: 'utility',
226
226
  risk: 'low',
227
227
  parameters: {
@@ -265,8 +265,8 @@ export function createDatabaseTools(options?: ToolCreationOptions): AnyAgentTool
265
265
 
266
266
  var entDbTables: AnyAgentTool = {
267
267
  name: 'ent_db_tables',
268
- label: 'List Tables',
269
- description: 'List all tables in a database connection.',
268
+ label: 'List Local DB Tables',
269
+ description: 'List all tables in a LOCAL SQLite database file. For external/cloud databases, use db_list_tables instead.',
270
270
  category: 'utility',
271
271
  risk: 'low',
272
272
  parameters: {
@@ -426,8 +426,8 @@ export function createDependencyManagerTools(): ToolDefinition[] {
426
426
  else {
427
427
  // Try to figure out a manager
428
428
  var mgrs = await detectPackageManagers();
429
- var fallback: PkgManager = IS_WINDOWS ? (mgrs.includes('choco') ? 'choco' : mgrs.includes('winget') ? 'winget' : 'npm') : IS_MAC ? 'brew' : (mgrs.includes('apt') ? 'apt' : 'npm');
430
- resolved = { mgr: fallback, pkg: input.package, isLocal: fallback === 'npm' || fallback === 'pip' };
429
+ var fallback = (IS_WINDOWS ? (mgrs.includes('choco') ? 'choco' : mgrs.includes('winget') ? 'winget' : 'npm') : IS_MAC ? 'brew' : (mgrs.includes('apt') ? 'apt' : 'npm')) as PkgManager;
430
+ resolved = { mgr: fallback, pkg: input.package, isLocal: fallback === 'npm' || (fallback as string) === 'pip' };
431
431
  }
432
432
  }
433
433
  if (!resolved) {
@@ -1,26 +1,32 @@
1
1
  /**
2
- * Microsoft Graph API helper
2
+ * Microsoft Graph API Helper
3
3
  *
4
- * Shared fetch wrapper for all Microsoft 365 tools.
5
- * Uses Microsoft Graph API v1.0.
4
+ * Enhanced shared fetch wrapper for all Microsoft 365 tools.
5
+ * Supports pagination, batch requests, retry with backoff, and rate limiting.
6
6
  */
7
7
 
8
8
  const GRAPH_BASE = 'https://graph.microsoft.com/v1.0';
9
+ const GRAPH_BETA = 'https://graph.microsoft.com/beta';
9
10
 
10
- export async function graph(
11
- token: string,
12
- path: string,
13
- opts?: {
14
- method?: string;
15
- body?: any;
16
- query?: Record<string, string>;
17
- rawBody?: BodyInit;
18
- headers?: Record<string, string>;
19
- beta?: boolean;
20
- }
21
- ): Promise<any> {
11
+ export interface GraphOptions {
12
+ method?: string;
13
+ body?: any;
14
+ query?: Record<string, string>;
15
+ rawBody?: BodyInit;
16
+ headers?: Record<string, string>;
17
+ beta?: boolean;
18
+ /** Max retries on 429/5xx (default: 3) */
19
+ retries?: number;
20
+ /** Return raw Response instead of parsed JSON */
21
+ raw?: boolean;
22
+ }
23
+
24
+ /**
25
+ * Core Graph API fetch — handles auth, JSON, retries, rate-limit backoff.
26
+ */
27
+ export async function graph(token: string, path: string, opts?: GraphOptions): Promise<any> {
22
28
  const method = opts?.method || 'GET';
23
- const base = opts?.beta ? 'https://graph.microsoft.com/beta' : GRAPH_BASE;
29
+ const base = opts?.beta ? GRAPH_BETA : GRAPH_BASE;
24
30
  const url = new URL(base + path);
25
31
  if (opts?.query) {
26
32
  for (const [k, v] of Object.entries(opts.query)) {
@@ -34,17 +40,122 @@ export async function graph(
34
40
  if (!opts?.rawBody && !opts?.headers?.['Content-Type']) {
35
41
  headers['Content-Type'] = 'application/json';
36
42
  }
37
- const res = await fetch(url.toString(), {
38
- method,
39
- headers,
40
- body: opts?.rawBody || (opts?.body ? JSON.stringify(opts.body) : undefined),
43
+
44
+ const maxRetries = opts?.retries ?? 3;
45
+ let lastError: Error | null = null;
46
+
47
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
48
+ try {
49
+ const res = await fetch(url.toString(), {
50
+ method,
51
+ headers,
52
+ body: opts?.rawBody || (opts?.body ? JSON.stringify(opts.body) : undefined),
53
+ });
54
+
55
+ // Rate limited — back off using Retry-After header
56
+ if (res.status === 429 && attempt < maxRetries) {
57
+ const retryAfter = parseInt(res.headers.get('Retry-After') || '5', 10);
58
+ await sleep(retryAfter * 1000);
59
+ continue;
60
+ }
61
+
62
+ // Server error — exponential backoff
63
+ if (res.status >= 500 && attempt < maxRetries) {
64
+ await sleep(Math.pow(2, attempt) * 1000);
65
+ continue;
66
+ }
67
+
68
+ if (opts?.raw) return res;
69
+
70
+ if (!res.ok) {
71
+ const err = await res.text();
72
+ throw new Error(`Graph ${method} ${path} ${res.status}: ${err}`);
73
+ }
74
+ if (res.status === 204 || res.status === 202) return {};
75
+ const ct = res.headers.get('content-type') || '';
76
+ if (ct.includes('application/json')) return res.json();
77
+ return { content: await res.text() };
78
+ } catch (e: any) {
79
+ lastError = e;
80
+ if (attempt < maxRetries && e.message?.includes('fetch failed')) {
81
+ await sleep(Math.pow(2, attempt) * 1000);
82
+ continue;
83
+ }
84
+ throw e;
85
+ }
86
+ }
87
+ throw lastError || new Error('Graph request failed after retries');
88
+ }
89
+
90
+ /**
91
+ * Auto-paginate a Graph API collection. Follows @odata.nextLink up to maxPages.
92
+ * Returns all items concatenated.
93
+ */
94
+ export async function graphPaginate(
95
+ token: string,
96
+ path: string,
97
+ opts?: GraphOptions & { maxPages?: number; maxItems?: number }
98
+ ): Promise<any[]> {
99
+ const maxPages = opts?.maxPages ?? 10;
100
+ const maxItems = opts?.maxItems ?? 500;
101
+ const items: any[] = [];
102
+ let nextUrl: string | null = null;
103
+ let page = 0;
104
+
105
+ // First request
106
+ const first = await graph(token, path, opts);
107
+ items.push(...(first.value || []));
108
+ nextUrl = first['@odata.nextLink'] || null;
109
+
110
+ // Follow pagination
111
+ while (nextUrl && ++page < maxPages && items.length < maxItems) {
112
+ const res = await fetch(nextUrl, {
113
+ headers: { Authorization: `Bearer ${token}` },
114
+ });
115
+ if (!res.ok) break;
116
+ const data = await res.json();
117
+ items.push(...(data.value || []));
118
+ nextUrl = data['@odata.nextLink'] || null;
119
+ }
120
+
121
+ return items.slice(0, maxItems);
122
+ }
123
+
124
+ /**
125
+ * Execute a JSON batch request (up to 20 requests per batch).
126
+ * https://learn.microsoft.com/en-us/graph/json-batching
127
+ */
128
+ export async function graphBatch(
129
+ token: string,
130
+ requests: Array<{
131
+ id: string;
132
+ method: string;
133
+ url: string;
134
+ body?: any;
135
+ headers?: Record<string, string>;
136
+ }>,
137
+ opts?: { beta?: boolean }
138
+ ): Promise<Map<string, { status: number; body: any }>> {
139
+ const base = opts?.beta ? GRAPH_BETA : GRAPH_BASE;
140
+ const res = await fetch(`${base}/$batch`, {
141
+ method: 'POST',
142
+ headers: {
143
+ Authorization: `Bearer ${token}`,
144
+ 'Content-Type': 'application/json',
145
+ },
146
+ body: JSON.stringify({ requests }),
41
147
  });
42
148
  if (!res.ok) {
43
- const err = await res.text();
44
- throw new Error(`Microsoft Graph ${res.status}: ${err}`);
149
+ throw new Error(`Graph batch ${res.status}: ${await res.text()}`);
150
+ }
151
+ const data = await res.json();
152
+ const results = new Map<string, { status: number; body: any }>();
153
+ for (const r of data.responses || []) {
154
+ results.set(r.id, { status: r.status, body: r.body });
45
155
  }
46
- if (res.status === 204) return {};
47
- const ct = res.headers.get('content-type') || '';
48
- if (ct.includes('application/json')) return res.json();
49
- return { content: await res.text() };
156
+ return results;
157
+ }
158
+
159
+ function sleep(ms: number): Promise<void> {
160
+ return new Promise(resolve => setTimeout(resolve, ms));
50
161
  }