@arbium/enterprise-agent-connect 0.0.0-stage → 0.1.2-dev.d2aa5ca

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 (319) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +264 -2
  3. package/dist/connectors/dell-techdirect/connector.json +39 -0
  4. package/dist/connectors/dell-techdirect/index.d.ts +8 -0
  5. package/dist/connectors/dell-techdirect/index.js +7 -0
  6. package/dist/connectors/dell-techdirect/index.js.map +1 -0
  7. package/dist/connectors/dell-techdirect/tools.d.ts +2 -0
  8. package/dist/connectors/dell-techdirect/tools.js +49 -0
  9. package/dist/connectors/dell-techdirect/tools.js.map +1 -0
  10. package/dist/connectors/dell-techdirect/vendor.d.ts +6 -0
  11. package/dist/connectors/dell-techdirect/vendor.js +57 -0
  12. package/dist/connectors/dell-techdirect/vendor.js.map +1 -0
  13. package/dist/connectors/dynamics-365/connector.json +213 -0
  14. package/dist/connectors/dynamics-365/index.d.ts +11 -0
  15. package/dist/connectors/dynamics-365/index.js +10 -0
  16. package/dist/connectors/dynamics-365/index.js.map +1 -0
  17. package/dist/connectors/dynamics-365/tools.d.ts +35 -0
  18. package/dist/connectors/dynamics-365/tools.js +806 -0
  19. package/dist/connectors/dynamics-365/tools.js.map +1 -0
  20. package/dist/connectors/dynamics-365/vendor.d.ts +9 -0
  21. package/dist/connectors/dynamics-365/vendor.js +110 -0
  22. package/dist/connectors/dynamics-365/vendor.js.map +1 -0
  23. package/dist/connectors/entra/connector.json +85 -0
  24. package/dist/connectors/entra/index.d.ts +2 -0
  25. package/dist/connectors/entra/index.js +4 -0
  26. package/dist/connectors/entra/index.js.map +1 -0
  27. package/dist/connectors/entra/tools.d.ts +14 -0
  28. package/dist/connectors/entra/tools.js +262 -0
  29. package/dist/connectors/entra/tools.js.map +1 -0
  30. package/dist/connectors/fedex/connector.json +118 -0
  31. package/dist/connectors/fedex/index.d.ts +8 -0
  32. package/dist/connectors/fedex/index.js +7 -0
  33. package/dist/connectors/fedex/index.js.map +1 -0
  34. package/dist/connectors/fedex/tools.d.ts +3 -0
  35. package/dist/connectors/fedex/tools.js +152 -0
  36. package/dist/connectors/fedex/tools.js.map +1 -0
  37. package/dist/connectors/fedex/vendor.d.ts +7 -0
  38. package/dist/connectors/fedex/vendor.js +98 -0
  39. package/dist/connectors/fedex/vendor.js.map +1 -0
  40. package/dist/connectors/gong/connector.json +127 -0
  41. package/dist/connectors/gong/index.d.ts +8 -0
  42. package/dist/connectors/gong/index.js +7 -0
  43. package/dist/connectors/gong/index.js.map +1 -0
  44. package/dist/connectors/gong/tools.d.ts +8 -0
  45. package/dist/connectors/gong/tools.js +424 -0
  46. package/dist/connectors/gong/tools.js.map +1 -0
  47. package/dist/connectors/gong/vendor.d.ts +4 -0
  48. package/dist/connectors/gong/vendor.js +97 -0
  49. package/dist/connectors/gong/vendor.js.map +1 -0
  50. package/dist/connectors/http/index.d.ts +38 -0
  51. package/dist/connectors/http/index.js +322 -0
  52. package/dist/connectors/http/index.js.map +1 -0
  53. package/dist/connectors/intune/connector.json +106 -0
  54. package/dist/connectors/intune/index.d.ts +2 -0
  55. package/dist/connectors/intune/index.js +4 -0
  56. package/dist/connectors/intune/index.js.map +1 -0
  57. package/dist/connectors/intune/tools.d.ts +12 -0
  58. package/dist/connectors/intune/tools.js +416 -0
  59. package/dist/connectors/intune/tools.js.map +1 -0
  60. package/dist/connectors/jamf/connector.json +182 -0
  61. package/dist/connectors/jamf/index.d.ts +8 -0
  62. package/dist/connectors/jamf/index.js +7 -0
  63. package/dist/connectors/jamf/index.js.map +1 -0
  64. package/dist/connectors/jamf/tools.d.ts +7 -0
  65. package/dist/connectors/jamf/tools.js +659 -0
  66. package/dist/connectors/jamf/tools.js.map +1 -0
  67. package/dist/connectors/jamf/vendor.d.ts +5 -0
  68. package/dist/connectors/jamf/vendor.js +66 -0
  69. package/dist/connectors/jamf/vendor.js.map +1 -0
  70. package/dist/connectors/jira/connector.json +272 -0
  71. package/dist/connectors/jira/index.d.ts +8 -0
  72. package/dist/connectors/jira/index.js +7 -0
  73. package/dist/connectors/jira/index.js.map +1 -0
  74. package/dist/connectors/jira/jql.d.ts +4 -0
  75. package/dist/connectors/jira/jql.js +67 -0
  76. package/dist/connectors/jira/jql.js.map +1 -0
  77. package/dist/connectors/jira/tools.d.ts +3 -0
  78. package/dist/connectors/jira/tools.js +464 -0
  79. package/dist/connectors/jira/tools.js.map +1 -0
  80. package/dist/connectors/jira/vendor.d.ts +3 -0
  81. package/dist/connectors/jira/vendor.js +94 -0
  82. package/dist/connectors/jira/vendor.js.map +1 -0
  83. package/dist/connectors/microsoft/client.d.ts +58 -0
  84. package/dist/connectors/microsoft/client.js +434 -0
  85. package/dist/connectors/microsoft/client.js.map +1 -0
  86. package/dist/connectors/microsoft/provider.json +118 -0
  87. package/dist/connectors/netsuite/connector.json +315 -0
  88. package/dist/connectors/netsuite/index.d.ts +8 -0
  89. package/dist/connectors/netsuite/index.js +7 -0
  90. package/dist/connectors/netsuite/index.js.map +1 -0
  91. package/dist/connectors/netsuite/tools.d.ts +24 -0
  92. package/dist/connectors/netsuite/tools.js +447 -0
  93. package/dist/connectors/netsuite/tools.js.map +1 -0
  94. package/dist/connectors/netsuite/vendor.d.ts +26 -0
  95. package/dist/connectors/netsuite/vendor.js +248 -0
  96. package/dist/connectors/netsuite/vendor.js.map +1 -0
  97. package/dist/connectors/odata/index.d.ts +36 -0
  98. package/dist/connectors/odata/index.js +460 -0
  99. package/dist/connectors/odata/index.js.map +1 -0
  100. package/dist/connectors/okta/connector.json +193 -0
  101. package/dist/connectors/okta/index.d.ts +8 -0
  102. package/dist/connectors/okta/index.js +7 -0
  103. package/dist/connectors/okta/index.js.map +1 -0
  104. package/dist/connectors/okta/tools.d.ts +6 -0
  105. package/dist/connectors/okta/tools.js +429 -0
  106. package/dist/connectors/okta/tools.js.map +1 -0
  107. package/dist/connectors/okta/vendor.d.ts +14 -0
  108. package/dist/connectors/okta/vendor.js +203 -0
  109. package/dist/connectors/okta/vendor.js.map +1 -0
  110. package/dist/connectors/outlook-calendar/connector.json +136 -0
  111. package/dist/connectors/outlook-calendar/index.d.ts +2 -0
  112. package/dist/connectors/outlook-calendar/index.js +4 -0
  113. package/dist/connectors/outlook-calendar/index.js.map +1 -0
  114. package/dist/connectors/outlook-calendar/tools.d.ts +65 -0
  115. package/dist/connectors/outlook-calendar/tools.js +398 -0
  116. package/dist/connectors/outlook-calendar/tools.js.map +1 -0
  117. package/dist/connectors/outlook-mail/connector.json +154 -0
  118. package/dist/connectors/outlook-mail/index.d.ts +2 -0
  119. package/dist/connectors/outlook-mail/index.js +4 -0
  120. package/dist/connectors/outlook-mail/index.js.map +1 -0
  121. package/dist/connectors/outlook-mail/tools.d.ts +8 -0
  122. package/dist/connectors/outlook-mail/tools.js +236 -0
  123. package/dist/connectors/outlook-mail/tools.js.map +1 -0
  124. package/dist/connectors/salesforce/connector.json +122 -0
  125. package/dist/connectors/salesforce/index.d.ts +8 -0
  126. package/dist/connectors/salesforce/index.js +7 -0
  127. package/dist/connectors/salesforce/index.js.map +1 -0
  128. package/dist/connectors/salesforce/soql.d.ts +3 -0
  129. package/dist/connectors/salesforce/soql.js +60 -0
  130. package/dist/connectors/salesforce/soql.js.map +1 -0
  131. package/dist/connectors/salesforce/tools.d.ts +9 -0
  132. package/dist/connectors/salesforce/tools.js +234 -0
  133. package/dist/connectors/salesforce/tools.js.map +1 -0
  134. package/dist/connectors/salesforce/vendor.d.ts +3 -0
  135. package/dist/connectors/salesforce/vendor.js +107 -0
  136. package/dist/connectors/salesforce/vendor.js.map +1 -0
  137. package/dist/connectors/sap-s4hana/connector.json +263 -0
  138. package/dist/connectors/sap-s4hana/index.d.ts +8 -0
  139. package/dist/connectors/sap-s4hana/index.js +7 -0
  140. package/dist/connectors/sap-s4hana/index.js.map +1 -0
  141. package/dist/connectors/sap-s4hana/tools.d.ts +4 -0
  142. package/dist/connectors/sap-s4hana/tools.js +761 -0
  143. package/dist/connectors/sap-s4hana/tools.js.map +1 -0
  144. package/dist/connectors/sap-s4hana/vendor.d.ts +5 -0
  145. package/dist/connectors/sap-s4hana/vendor.js +176 -0
  146. package/dist/connectors/sap-s4hana/vendor.js.map +1 -0
  147. package/dist/connectors/servicenow/connector.json +228 -0
  148. package/dist/connectors/servicenow/index.d.ts +8 -0
  149. package/dist/connectors/servicenow/index.js +7 -0
  150. package/dist/connectors/servicenow/index.js.map +1 -0
  151. package/dist/connectors/servicenow/tools.d.ts +4 -0
  152. package/dist/connectors/servicenow/tools.js +884 -0
  153. package/dist/connectors/servicenow/tools.js.map +1 -0
  154. package/dist/connectors/servicenow/vendor.d.ts +4 -0
  155. package/dist/connectors/servicenow/vendor.js +109 -0
  156. package/dist/connectors/servicenow/vendor.js.map +1 -0
  157. package/dist/connectors/sharepoint-files/connector.json +194 -0
  158. package/dist/connectors/sharepoint-files/excel.d.ts +16 -0
  159. package/dist/connectors/sharepoint-files/excel.js +300 -0
  160. package/dist/connectors/sharepoint-files/excel.js.map +1 -0
  161. package/dist/connectors/sharepoint-files/index.d.ts +11 -0
  162. package/dist/connectors/sharepoint-files/index.js +12 -0
  163. package/dist/connectors/sharepoint-files/index.js.map +1 -0
  164. package/dist/connectors/sharepoint-files/tools.d.ts +52 -0
  165. package/dist/connectors/sharepoint-files/tools.js +365 -0
  166. package/dist/connectors/sharepoint-files/tools.js.map +1 -0
  167. package/dist/connectors/sharepoint-files/vendor.d.ts +11 -0
  168. package/dist/connectors/sharepoint-files/vendor.js +167 -0
  169. package/dist/connectors/sharepoint-files/vendor.js.map +1 -0
  170. package/dist/connectors/slack/connector.json +148 -0
  171. package/dist/connectors/slack/index.d.ts +8 -0
  172. package/dist/connectors/slack/index.js +7 -0
  173. package/dist/connectors/slack/index.js.map +1 -0
  174. package/dist/connectors/slack/tools.d.ts +3 -0
  175. package/dist/connectors/slack/tools.js +355 -0
  176. package/dist/connectors/slack/tools.js.map +1 -0
  177. package/dist/connectors/slack/vendor.d.ts +17 -0
  178. package/dist/connectors/slack/vendor.js +195 -0
  179. package/dist/connectors/slack/vendor.js.map +1 -0
  180. package/dist/connectors/soap/index.d.ts +19 -0
  181. package/dist/connectors/soap/index.js +248 -0
  182. package/dist/connectors/soap/index.js.map +1 -0
  183. package/dist/connectors/soap/xml.d.ts +12 -0
  184. package/dist/connectors/soap/xml.js +126 -0
  185. package/dist/connectors/soap/xml.js.map +1 -0
  186. package/dist/connectors/sql/engines.d.ts +58 -0
  187. package/dist/connectors/sql/engines.js +292 -0
  188. package/dist/connectors/sql/engines.js.map +1 -0
  189. package/dist/connectors/sql/index.d.ts +19 -0
  190. package/dist/connectors/sql/index.js +212 -0
  191. package/dist/connectors/sql/index.js.map +1 -0
  192. package/dist/connectors/teams/connector.json +298 -0
  193. package/dist/connectors/teams/index.d.ts +2 -0
  194. package/dist/connectors/teams/index.js +5 -0
  195. package/dist/connectors/teams/index.js.map +1 -0
  196. package/dist/connectors/teams/tools.d.ts +2 -0
  197. package/dist/connectors/teams/tools.js +391 -0
  198. package/dist/connectors/teams/tools.js.map +1 -0
  199. package/dist/connectors/workday/connector.json +186 -0
  200. package/dist/connectors/workday/index.d.ts +8 -0
  201. package/dist/connectors/workday/index.js +7 -0
  202. package/dist/connectors/workday/index.js.map +1 -0
  203. package/dist/connectors/workday/tools.d.ts +33 -0
  204. package/dist/connectors/workday/tools.js +410 -0
  205. package/dist/connectors/workday/tools.js.map +1 -0
  206. package/dist/connectors/workday/vendor.d.ts +18 -0
  207. package/dist/connectors/workday/vendor.js +195 -0
  208. package/dist/connectors/workday/vendor.js.map +1 -0
  209. package/dist/packages/connector-kit/src/branding.d.ts +57 -0
  210. package/dist/packages/connector-kit/src/branding.js +102 -0
  211. package/dist/packages/connector-kit/src/branding.js.map +1 -0
  212. package/dist/packages/connector-kit/src/certificate.d.ts +19 -0
  213. package/dist/packages/connector-kit/src/certificate.js +84 -0
  214. package/dist/packages/connector-kit/src/certificate.js.map +1 -0
  215. package/dist/packages/connector-kit/src/common.d.ts +40 -0
  216. package/dist/packages/connector-kit/src/common.js +107 -0
  217. package/dist/packages/connector-kit/src/common.js.map +1 -0
  218. package/dist/packages/connector-kit/src/connector.d.ts +1346 -0
  219. package/dist/packages/connector-kit/src/connector.js +1034 -0
  220. package/dist/packages/connector-kit/src/connector.js.map +1 -0
  221. package/dist/packages/connector-kit/src/index.d.ts +5 -0
  222. package/dist/packages/connector-kit/src/index.js +5 -0
  223. package/dist/packages/connector-kit/src/index.js.map +1 -0
  224. package/dist/packages/connector-kit/src/oauth.d.ts +15 -0
  225. package/dist/packages/connector-kit/src/oauth.js +96 -0
  226. package/dist/packages/connector-kit/src/oauth.js.map +1 -0
  227. package/dist/packages/connector-kit/src/types.d.ts +85 -0
  228. package/dist/packages/connector-kit/src/types.js +20 -0
  229. package/dist/packages/connector-kit/src/types.js.map +1 -0
  230. package/dist/packages/server/migrations/0001_tables.sql +268 -0
  231. package/dist/packages/server/migrations/0002_organizations.sql +72 -0
  232. package/dist/packages/server/migrations/0003_drop_unused.sql +3 -0
  233. package/dist/packages/server/migrations/0004_trigger_runners.sql +15 -0
  234. package/dist/packages/server/migrations/0005_run_runner.sql +3 -0
  235. package/dist/packages/server/migrations/0006_approvals.sql +36 -0
  236. package/dist/packages/server/migrations/0007_app_events.sql +110 -0
  237. package/dist/packages/server/migrations/rollback/to-legacy.sql +90 -0
  238. package/dist/packages/server/src/api.d.ts +3714 -0
  239. package/dist/packages/server/src/api.js +818 -0
  240. package/dist/packages/server/src/api.js.map +1 -0
  241. package/dist/packages/server/src/app.d.ts +23 -0
  242. package/dist/packages/server/src/app.js +467 -0
  243. package/dist/packages/server/src/app.js.map +1 -0
  244. package/dist/packages/server/src/builtin.d.ts +4 -0
  245. package/dist/packages/server/src/builtin.js +42 -0
  246. package/dist/packages/server/src/builtin.js.map +1 -0
  247. package/dist/packages/server/src/consent.d.ts +27 -0
  248. package/dist/packages/server/src/consent.js +36 -0
  249. package/dist/packages/server/src/consent.js.map +1 -0
  250. package/dist/packages/server/src/events/admin.d.ts +156 -0
  251. package/dist/packages/server/src/events/admin.js +255 -0
  252. package/dist/packages/server/src/events/admin.js.map +1 -0
  253. package/dist/packages/server/src/events/deliver.d.ts +43 -0
  254. package/dist/packages/server/src/events/deliver.js +129 -0
  255. package/dist/packages/server/src/events/deliver.js.map +1 -0
  256. package/dist/packages/server/src/events/runtime.d.ts +28 -0
  257. package/dist/packages/server/src/events/runtime.js +397 -0
  258. package/dist/packages/server/src/events/runtime.js.map +1 -0
  259. package/dist/packages/server/src/events/store.d.ts +172 -0
  260. package/dist/packages/server/src/events/store.js +275 -0
  261. package/dist/packages/server/src/events/store.js.map +1 -0
  262. package/dist/packages/server/src/index.d.ts +40 -0
  263. package/dist/packages/server/src/index.js +185 -0
  264. package/dist/packages/server/src/index.js.map +1 -0
  265. package/dist/packages/server/src/migrate.d.ts +11 -0
  266. package/dist/packages/server/src/migrate.js +134 -0
  267. package/dist/packages/server/src/migrate.js.map +1 -0
  268. package/dist/packages/server/src/openapi.d.ts +4 -0
  269. package/dist/packages/server/src/openapi.js +101 -0
  270. package/dist/packages/server/src/openapi.js.map +1 -0
  271. package/dist/packages/server/src/queue.d.ts +10 -0
  272. package/dist/packages/server/src/queue.js +45 -0
  273. package/dist/packages/server/src/queue.js.map +1 -0
  274. package/dist/packages/server/src/secrets.d.ts +19 -0
  275. package/dist/packages/server/src/secrets.js +76 -0
  276. package/dist/packages/server/src/secrets.js.map +1 -0
  277. package/dist/packages/server/src/server.d.ts +1 -0
  278. package/dist/packages/server/src/server.js +82 -0
  279. package/dist/packages/server/src/server.js.map +1 -0
  280. package/dist/packages/server/src/service.d.ts +760 -0
  281. package/dist/packages/server/src/service.js +918 -0
  282. package/dist/packages/server/src/service.js.map +1 -0
  283. package/dist/packages/server/src/store.d.ts +158 -0
  284. package/dist/packages/server/src/store.js +415 -0
  285. package/dist/packages/server/src/store.js.map +1 -0
  286. package/dist/packages/server/src/teams/activity.d.ts +123 -0
  287. package/dist/packages/server/src/teams/activity.js +188 -0
  288. package/dist/packages/server/src/teams/activity.js.map +1 -0
  289. package/dist/packages/server/src/teams/admin.d.ts +335 -0
  290. package/dist/packages/server/src/teams/admin.js +699 -0
  291. package/dist/packages/server/src/teams/admin.js.map +1 -0
  292. package/dist/packages/server/src/teams/approval.d.ts +57 -0
  293. package/dist/packages/server/src/teams/approval.js +118 -0
  294. package/dist/packages/server/src/teams/approval.js.map +1 -0
  295. package/dist/packages/server/src/teams/bot.d.ts +25 -0
  296. package/dist/packages/server/src/teams/bot.js +124 -0
  297. package/dist/packages/server/src/teams/bot.js.map +1 -0
  298. package/dist/packages/server/src/teams/claude.d.ts +46 -0
  299. package/dist/packages/server/src/teams/claude.js +165 -0
  300. package/dist/packages/server/src/teams/claude.js.map +1 -0
  301. package/dist/packages/server/src/teams/jwt.d.ts +17 -0
  302. package/dist/packages/server/src/teams/jwt.js +121 -0
  303. package/dist/packages/server/src/teams/jwt.js.map +1 -0
  304. package/dist/packages/server/src/teams/package.d.ts +79 -0
  305. package/dist/packages/server/src/teams/package.js +319 -0
  306. package/dist/packages/server/src/teams/package.js.map +1 -0
  307. package/dist/packages/server/src/teams/provision.d.ts +84 -0
  308. package/dist/packages/server/src/teams/provision.js +505 -0
  309. package/dist/packages/server/src/teams/provision.js.map +1 -0
  310. package/dist/packages/server/src/teams/runner.d.ts +80 -0
  311. package/dist/packages/server/src/teams/runner.js +187 -0
  312. package/dist/packages/server/src/teams/runner.js.map +1 -0
  313. package/dist/packages/server/src/teams/runtime.d.ts +91 -0
  314. package/dist/packages/server/src/teams/runtime.js +679 -0
  315. package/dist/packages/server/src/teams/runtime.js.map +1 -0
  316. package/dist/packages/server/src/teams/store.d.ts +233 -0
  317. package/dist/packages/server/src/teams/store.js +507 -0
  318. package/dist/packages/server/src/teams/store.js.map +1 -0
  319. package/package.json +68 -4
@@ -0,0 +1,398 @@
1
+ import { z } from "zod";
2
+ import { audited, Denied, json, } from "../../packages/connector-kit/src/common.js";
3
+ import { mailboxPath, nextPage, ok, pageParam } from "../outlook-mail/tools.js";
4
+ // The calendar of the mailbox in the agent's grant. No tool takes a mailbox argument, and
5
+ // event ids are only ever looked up under that mailbox, where Exchange finds no other
6
+ // mailbox's events.
7
+ export const MAX_RANGE_DAYS = 62;
8
+ const EVENT_ID = /^[A-Za-z0-9_=-]{1,1024}$/;
9
+ // A moment with its offset, so the window means the same thing to the service and Microsoft.
10
+ const INSTANT = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d{1,7})?)?(Z|[+-]\d{2}:\d{2})$/;
11
+ // A wall-clock time read in `time_zone`, as Microsoft's events take it.
12
+ const LOCAL = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2})?$/;
13
+ const TIME_ZONE = /^[A-Za-z0-9_/+ .()-]{1,100}$/;
14
+ const DATE = /^\d{4}-\d{2}-\d{2}$/;
15
+ const FIELDS = "id,subject,start,end,location,organizer,attendees,isAllDay,isCancelled,showAs,bodyPreview," +
16
+ "type,seriesMasterId,recurrence,isOrganizer,responseStatus";
17
+ export const MAX_OCCURRENCES = 999;
18
+ const DAYS = [
19
+ "sunday",
20
+ "monday",
21
+ "tuesday",
22
+ "wednesday",
23
+ "thursday",
24
+ "friday",
25
+ "saturday",
26
+ ];
27
+ // The tool's names for Microsoft's response actions.
28
+ const RESPONSES = {
29
+ accept: "accept",
30
+ tentatively_accept: "tentativelyAccept",
31
+ decline: "decline",
32
+ };
33
+ function eventPath(ctx, id) {
34
+ if (!EVENT_ID.test(id))
35
+ throw new Denied("Give an event id from calendar_list_events");
36
+ return `${mailboxPath(ctx)}/events/${encodeURIComponent(id)}`;
37
+ }
38
+ // Date.parse rolls a day that does not exist (February 31, 24:00) into the next one; reading it
39
+ // back shows whether it did.
40
+ const exists = (value, iso) => {
41
+ const ms = Date.parse(iso);
42
+ return Number.isFinite(ms) && new Date(ms).toISOString().startsWith(value);
43
+ };
44
+ const isDate = (value) => DATE.test(value) && exists(value, `${value}T00:00:00Z`);
45
+ /** The listing window as UTC instants; refused when unbounded, reversed or too long. */
46
+ export function eventWindow(start, end) {
47
+ if (!INSTANT.test(start) || !INSTANT.test(end))
48
+ throw new Denied("Give start and end as date-times with an offset, e.g. 2026-10-21T09:00:00Z");
49
+ const from = Date.parse(start);
50
+ const to = Date.parse(end);
51
+ const real = (v) => isDate(v.slice(0, 10)) && Number(v.slice(11, 13)) < 24;
52
+ if (!Number.isFinite(from) || !Number.isFinite(to) || !real(start) || !real(end))
53
+ throw new Denied("start or end is not a date");
54
+ if (to <= from)
55
+ throw new Denied("end must be after start");
56
+ if (to - from > MAX_RANGE_DAYS * 86_400_000)
57
+ throw new Denied(`List at most ${MAX_RANGE_DAYS} days at a time`);
58
+ return { start: new Date(from).toISOString(), end: new Date(to).toISOString() };
59
+ }
60
+ function when(value, timeZone) {
61
+ if (!LOCAL.test(value) || !exists(value, `${value}Z`))
62
+ throw new Denied(`${value} is not a date-time such as 2026-10-21T09:00`);
63
+ if (!TIME_ZONE.test(timeZone))
64
+ throw new Denied(`${timeZone} is not a time zone name`);
65
+ return { dateTime: value, timeZone };
66
+ }
67
+ function checkOrder(start, end) {
68
+ if (Date.parse(`${end.dateTime}Z`) <= Date.parse(`${start.dateTime}Z`))
69
+ throw new Denied("end must be after start");
70
+ }
71
+ /**
72
+ * Microsoft's patternedRecurrence for a series whose first event starts on `startDate`
73
+ * (YYYY-MM-DD, read in `timeZone`). Monthly and yearly repeat on the start's day (and month);
74
+ * weekly defaults to the start's weekday. Every series ends, by date or by count.
75
+ * https://learn.microsoft.com/graph/outlook-schedule-recurring-events
76
+ */
77
+ export function recurrence(r, startDate, timeZone) {
78
+ if (!isDate(startDate))
79
+ throw new Denied(`${startDate} is not a date`);
80
+ if (!TIME_ZONE.test(timeZone))
81
+ throw new Denied(`${timeZone} is not a time zone name`);
82
+ if ((r.end_date === undefined) === (r.count === undefined))
83
+ throw new Denied("Give the series either an end_date or a count, not both");
84
+ if (r.days_of_week && r.pattern !== "weekly")
85
+ throw new Denied("days_of_week is only for a weekly pattern");
86
+ const start = new Date(`${startDate}T00:00:00Z`);
87
+ const pattern = r.pattern === "daily"
88
+ ? { type: "daily", interval: r.interval }
89
+ : r.pattern === "weekly"
90
+ ? {
91
+ type: "weekly",
92
+ interval: r.interval,
93
+ daysOfWeek: [...new Set(r.days_of_week ?? [DAYS[start.getUTCDay()]])],
94
+ }
95
+ : r.pattern === "monthly"
96
+ ? { type: "absoluteMonthly", interval: r.interval, dayOfMonth: start.getUTCDate() }
97
+ : {
98
+ type: "absoluteYearly",
99
+ interval: r.interval,
100
+ dayOfMonth: start.getUTCDate(),
101
+ month: start.getUTCMonth() + 1,
102
+ };
103
+ if (r.end_date !== undefined) {
104
+ if (!isDate(r.end_date))
105
+ throw new Denied(`${r.end_date} is not a date such as 2026-12-31`);
106
+ if (r.end_date < startDate)
107
+ throw new Denied("end_date must not be before the first event");
108
+ }
109
+ const range = r.end_date !== undefined
110
+ ? { type: "endDate", startDate, endDate: r.end_date, recurrenceTimeZone: timeZone }
111
+ : {
112
+ type: "numbered",
113
+ startDate,
114
+ numberOfOccurrences: r.count,
115
+ recurrenceTimeZone: timeZone,
116
+ };
117
+ return { pattern, range };
118
+ }
119
+ // The event a change applies to. An occurrence's id changes that occurrence only; with
120
+ // `series`, the change goes to its series master, so every occurrence follows. A master's own
121
+ // id needs `series`, so a whole series is never changed or deleted by accident.
122
+ async function target(ctx, mark, id, series) {
123
+ const e = await ok(ctx, mark, {
124
+ method: "GET",
125
+ path: `${eventPath(ctx, id)}?$select=id,type,seriesMasterId,recurrence`,
126
+ });
127
+ if (e.type === "seriesMaster") {
128
+ if (!series)
129
+ throw new Denied("This id is a whole series. Pass series: true to change every occurrence, or give one occurrence's id from calendar_list_events");
130
+ return { id, recurrence: e.recurrence };
131
+ }
132
+ if (!series)
133
+ return { id };
134
+ if (!e.seriesMasterId)
135
+ throw new Denied("This event is not part of a series");
136
+ const master = await ok(ctx, mark, {
137
+ method: "GET",
138
+ path: `${eventPath(ctx, e.seriesMasterId)}?$select=id,recurrence`,
139
+ });
140
+ return { id: e.seriesMasterId, recurrence: master.recurrence };
141
+ }
142
+ // Microsoft answers a create or update in the zone it was sent in, whatever the Prefer header
143
+ // says; reading the event back gives UTC, as the list and get tools do.
144
+ async function inUtc(ctx, mark, id) {
145
+ return ok(ctx, mark, {
146
+ method: "GET",
147
+ path: `${eventPath(ctx, id)}?$select=${FIELDS}`,
148
+ headers: { prefer: 'outlook.timezone="UTC"' },
149
+ });
150
+ }
151
+ const address = (a) => a?.emailAddress?.address ?? null;
152
+ const attendees = (list) => list.map((address) => ({ emailAddress: { address }, type: "required" }));
153
+ function summary(e) {
154
+ return {
155
+ id: e.id,
156
+ subject: e.subject ?? "",
157
+ start: e.start ?? null,
158
+ end: e.end ?? null,
159
+ all_day: e.isAllDay ?? false,
160
+ cancelled: e.isCancelled ?? false,
161
+ show_as: e.showAs ?? null,
162
+ location: e.location?.displayName ?? "",
163
+ organizer: address(e.organizer),
164
+ attendees: (e.attendees ?? []).map((a) => ({
165
+ email: address(a),
166
+ response: a.status?.response ?? null,
167
+ })),
168
+ preview: e.bodyPreview ?? "",
169
+ // singleInstance, occurrence, exception (a changed occurrence) or seriesMaster.
170
+ type: e.type ?? null,
171
+ series_id: e.seriesMasterId ?? null,
172
+ recurrence: e.recurrence ?? null,
173
+ is_organizer: e.isOrganizer ?? null,
174
+ my_response: e.responseStatus?.response ?? null,
175
+ };
176
+ }
177
+ export const calendarTools = {
178
+ names: [
179
+ "calendar_list_events",
180
+ "calendar_get_event",
181
+ "calendar_create_event",
182
+ "calendar_update_event",
183
+ "calendar_delete_event",
184
+ "calendar_respond_to_event",
185
+ ],
186
+ register(server, ctx, allowed) {
187
+ const readOnly = { readOnlyHint: true, openWorldHint: true };
188
+ const writes = { readOnlyHint: false, destructiveHint: false, openWorldHint: true };
189
+ const eventId = z.string().max(1100).describe("Id from calendar_list_events.");
190
+ const emails = z.array(z.email()).max(50);
191
+ const timeZone = z
192
+ .string()
193
+ .max(100)
194
+ .describe("Time zone of start and end, e.g. UTC or Europe/London.");
195
+ // Text and wall-clock times are checked inside audited(), so a refusal is logged.
196
+ const local = z.string().max(40);
197
+ const repeat = z
198
+ .object({
199
+ pattern: z.enum(["daily", "weekly", "monthly", "yearly"]),
200
+ interval: z
201
+ .number()
202
+ .int()
203
+ .min(1)
204
+ .max(99)
205
+ .default(1)
206
+ .describe("Every this many days, weeks, months or years."),
207
+ days_of_week: z
208
+ .array(z.enum(DAYS))
209
+ .min(1)
210
+ .max(7)
211
+ .optional()
212
+ .describe("Weekly only. Defaults to the start's weekday."),
213
+ end_date: z
214
+ .string()
215
+ .max(10)
216
+ .optional()
217
+ .describe("Last date the series may fall on, e.g. 2026-12-31. Give this or count."),
218
+ count: z.number().int().min(1).max(MAX_OCCURRENCES).optional(),
219
+ })
220
+ .describe("Repeat the event. Monthly and yearly repeat on the start's date. Needs end_date or count.");
221
+ const series = z
222
+ .boolean()
223
+ .default(false)
224
+ .describe("true to apply this to the whole series the event belongs to; false for this one occurrence only.");
225
+ if (allowed.has("calendar_list_events"))
226
+ server.registerTool("calendar_list_events", {
227
+ description: `List events in this agent's calendar between two date-times (at most ${MAX_RANGE_DAYS} days apart), earliest first. Each occurrence of a repeating event is listed on its own. Times come back in UTC. When \`more\` is true, call again with \`cursor\` set to \`next\`.`,
228
+ inputSchema: z.object({
229
+ start: z.string().max(40).describe("e.g. 2026-10-21T00:00:00Z"),
230
+ end: z.string().max(40).describe("e.g. 2026-10-28T00:00:00Z"),
231
+ max_results: z.number().int().min(1).max(100).default(50),
232
+ cursor: z
233
+ .string()
234
+ .max(4000)
235
+ .optional()
236
+ .describe("The `next` value from the previous call with the same window: the following page."),
237
+ }),
238
+ annotations: readOnly,
239
+ }, ({ start, end, max_results, cursor }) => audited(ctx, "calendar_list_events", `${start} → ${end}`, async (mark) => {
240
+ const window = eventWindow(start, end);
241
+ const query = [
242
+ `startDateTime=${encodeURIComponent(window.start)}`,
243
+ `endDateTime=${encodeURIComponent(window.end)}`,
244
+ `$top=${max_results}`,
245
+ `$select=${FIELDS}`,
246
+ "$orderby=start/dateTime",
247
+ ...pageParam(cursor),
248
+ ].join("&");
249
+ const data = await ok(ctx, mark, {
250
+ method: "GET",
251
+ path: `${mailboxPath(ctx)}/calendarView?${query}`,
252
+ headers: { prefer: 'outlook.timezone="UTC"' },
253
+ });
254
+ return json({
255
+ events: data.value.map(summary),
256
+ more: Boolean(data["@odata.nextLink"]),
257
+ next: nextPage(data),
258
+ });
259
+ }));
260
+ if (allowed.has("calendar_get_event"))
261
+ server.registerTool("calendar_get_event", {
262
+ description: "Read one event in this agent's calendar, with its description as text.",
263
+ inputSchema: z.object({ event_id: eventId }),
264
+ annotations: readOnly,
265
+ }, ({ event_id }) => audited(ctx, "calendar_get_event", event_id, async (mark) => {
266
+ const e = await ok(ctx, mark, {
267
+ method: "GET",
268
+ path: `${eventPath(ctx, event_id)}?$select=${FIELDS},body`,
269
+ headers: {
270
+ prefer: 'outlook.timezone="UTC", outlook.body-content-type="text"',
271
+ },
272
+ });
273
+ return json({ ...summary(e), body: e.body?.content ?? "" });
274
+ }));
275
+ if (allowed.has("calendar_create_event"))
276
+ server.registerTool("calendar_create_event", {
277
+ description: "Add an event to this agent's calendar. Attendees are sent an invitation from this agent's mailbox.",
278
+ inputSchema: z.object({
279
+ subject: z.string().min(1).max(255),
280
+ start: local.describe("Wall-clock start, e.g. 2026-10-21T09:00"),
281
+ end: local.describe("Wall-clock end, e.g. 2026-10-21T09:30"),
282
+ time_zone: timeZone.default("UTC"),
283
+ location: z.string().max(255).optional(),
284
+ body: z.string().max(100000).optional(),
285
+ attendees: emails.default([]),
286
+ recurrence: repeat.optional(),
287
+ }),
288
+ annotations: writes,
289
+ }, ({ subject, start, end, time_zone, location, body, attendees: invited, recurrence: r }) => audited(ctx, "calendar_create_event", subject, async (mark, retarget) => {
290
+ const from = when(start, time_zone);
291
+ const to = when(end, time_zone);
292
+ checkOrder(from, to);
293
+ const repeats = r ? { recurrence: recurrence(r, start.slice(0, 10), time_zone) } : {};
294
+ const created = await ok(ctx, mark, {
295
+ method: "POST",
296
+ path: `${mailboxPath(ctx)}/events`,
297
+ body: {
298
+ subject,
299
+ start: from,
300
+ end: to,
301
+ ...(location ? { location: { displayName: location } } : {}),
302
+ ...(body ? { body: { contentType: "Text", content: body } } : {}),
303
+ attendees: attendees(invited),
304
+ ...repeats,
305
+ },
306
+ });
307
+ retarget(created.id);
308
+ return json(summary(await inUtc(ctx, mark, created.id)));
309
+ }));
310
+ if (allowed.has("calendar_update_event"))
311
+ server.registerTool("calendar_update_event", {
312
+ description: "Change an event in this agent's calendar. Only the fields given change; attendees, when given, replace the list and are sent an update. An occurrence's id changes that occurrence only; pass series: true to change the whole series.",
313
+ inputSchema: z.object({
314
+ event_id: eventId,
315
+ subject: z.string().min(1).max(255).optional(),
316
+ start: local.optional(),
317
+ end: local.optional(),
318
+ time_zone: timeZone
319
+ .optional()
320
+ .describe("Time zone of start and end, e.g. Europe/London. Needed with start or end."),
321
+ location: z.string().max(255).optional(),
322
+ body: z.string().max(100000).optional(),
323
+ attendees: emails.optional(),
324
+ series,
325
+ recurrence: repeat
326
+ .optional()
327
+ .describe("A new repeat pattern for the series. Needs series: true."),
328
+ }),
329
+ annotations: writes,
330
+ }, ({ event_id, subject, start, end, time_zone, location, body, attendees: invited, series: whole, recurrence: r, }) => audited(ctx, "calendar_update_event", event_id, async (mark, retarget) => {
331
+ if (r && !whole)
332
+ throw new Denied("Give series: true to change how a series repeats");
333
+ // No default: a time read in the wrong zone would move the event silently.
334
+ if ((start !== undefined || end !== undefined) === (time_zone === undefined))
335
+ throw new Denied("Give time_zone together with start or end, e.g. Europe/London, and not on its own");
336
+ const from = start === undefined ? undefined : when(start, time_zone);
337
+ const to = end === undefined ? undefined : when(end, time_zone);
338
+ if (from && to)
339
+ checkOrder(from, to);
340
+ const patch = {
341
+ ...(subject !== undefined ? { subject } : {}),
342
+ ...(from ? { start: from } : {}),
343
+ ...(to ? { end: to } : {}),
344
+ ...(location !== undefined ? { location: { displayName: location } } : {}),
345
+ ...(body !== undefined ? { body: { contentType: "Text", content: body } } : {}),
346
+ ...(invited !== undefined ? { attendees: attendees(invited) } : {}),
347
+ };
348
+ if (Object.keys(patch).length === 0 && !r)
349
+ throw new Denied("Give at least one field to change");
350
+ const t = await target(ctx, mark, event_id, whole);
351
+ retarget(t.id);
352
+ if (r) {
353
+ // The series' first date and zone stay unless a new start (in time_zone) moves them.
354
+ const range = t.recurrence?.range ?? {};
355
+ const startDate = start?.slice(0, 10) ?? range.startDate;
356
+ const zone = start !== undefined ? time_zone : range.recurrenceTimeZone;
357
+ if (!startDate || !zone)
358
+ throw new Denied("Give start and time_zone with recurrence");
359
+ patch.recurrence = recurrence(r, startDate, zone);
360
+ }
361
+ await ok(ctx, mark, { method: "PATCH", path: eventPath(ctx, t.id), body: patch });
362
+ return json(summary(await inUtc(ctx, mark, t.id)));
363
+ }));
364
+ if (allowed.has("calendar_delete_event"))
365
+ server.registerTool("calendar_delete_event", {
366
+ description: "Delete an event from this agent's calendar. An occurrence's id deletes that occurrence only; pass series: true to delete every occurrence. Attendees are sent a cancellation when this agent organized it.",
367
+ inputSchema: z.object({ event_id: eventId, series }),
368
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
369
+ }, ({ event_id, series: whole }) => audited(ctx, "calendar_delete_event", event_id, async (mark, retarget) => {
370
+ const t = await target(ctx, mark, event_id, whole);
371
+ retarget(t.id);
372
+ await ok(ctx, mark, { method: "DELETE", path: eventPath(ctx, t.id) });
373
+ return json({ deleted: true, series: whole });
374
+ }));
375
+ if (allowed.has("calendar_respond_to_event"))
376
+ server.registerTool("calendar_respond_to_event", {
377
+ description: "Accept, tentatively accept or decline an invitation in this agent's calendar. An occurrence's id answers that occurrence only; a series id answers the whole series. A declined event leaves the calendar.",
378
+ inputSchema: z.object({
379
+ event_id: eventId,
380
+ response: z.enum(["accept", "tentatively_accept", "decline"]),
381
+ comment: z.string().max(10000).optional().describe("Text sent with the answer."),
382
+ send_response: z
383
+ .boolean()
384
+ .default(true)
385
+ .describe("false to answer without emailing the organizer."),
386
+ }),
387
+ annotations: writes,
388
+ }, ({ event_id, response, comment, send_response }) => audited(ctx, "calendar_respond_to_event", event_id, async (mark) => {
389
+ await ok(ctx, mark, {
390
+ method: "POST",
391
+ path: `${eventPath(ctx, event_id)}/${RESPONSES[response]}`,
392
+ body: { ...(comment ? { comment } : {}), sendResponse: send_response },
393
+ });
394
+ return json({ response, sent: send_response });
395
+ }));
396
+ },
397
+ };
398
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../connectors/outlook-calendar/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ {
2
+ "id": "outlook-mail",
3
+ "name": "Outlook mail",
4
+ "description": "Let each agent read and work on mail in its own mailbox.",
5
+ "logo": "/brand/outlook.svg",
6
+ "identity": "Your Microsoft app registration, through the Microsoft connection. Exchange lets it open only the mailboxes you choose for agents, and it uses no Microsoft 365 license.",
7
+ "provider": "microsoft",
8
+ "order": 1,
9
+ "accountKey": "tenantId",
10
+ "connectionKind": "guided",
11
+ "setup": [
12
+ {
13
+ "title": "Make sure the app cannot open every mailbox",
14
+ "body": "Outlook mail needs no Microsoft Graph permission on the app. Do not add Mail.Read, Mail.Send or Mail.ReadWrite under API permissions: they open every mailbox in your organization.",
15
+ "click": [
16
+ "In the Microsoft Entra admin center, go to Entra ID, then App registrations, open {brand.microsoft.appName} and select API permissions.",
17
+ "Check that no Mail permission is listed. Remove any that is."
18
+ ],
19
+ "copy": ["az ad app permission list --id {clientId} -o table"],
20
+ "shell": "bash"
21
+ },
22
+ {
23
+ "title": "Create the {brand.microsoft.mailboxGroup} group",
24
+ "body": "Agents can only reach mailboxes in this mail-enabled security group. Outlook calendar uses the same group, so you create it once. Each agent's mailbox is added to it when you make the agent's API key, on the Integrations tab.",
25
+ "link": {
26
+ "label": "Open the Exchange admin center",
27
+ "href": "https://admin.exchange.microsoft.com/#/groups"
28
+ },
29
+ "click": [
30
+ "In the Exchange admin center, go to Recipients, then Groups, then Mail-enabled security, and select Add a group.",
31
+ "Choose Mail-enabled security and select Next. Name it {brand.microsoft.mailboxGroup}, then Next.",
32
+ "Assign yourself as owner, skip members (you add each agent's mailbox later), then Next.",
33
+ "On Edit settings, enter a group email address such as {brand.microsoft.mailboxGroupAlias}@your-domain, then Next and Create group."
34
+ ],
35
+ "copy": [
36
+ "# Needs the ExchangeOnlineManagement module: Install-Module ExchangeOnlineManagement -Scope CurrentUser",
37
+ "Connect-ExchangeOnline",
38
+ "if (-not (Get-DistributionGroup -Identity '{brand.microsoft.mailboxGroup}' -ErrorAction SilentlyContinue)) { New-DistributionGroup -Name '{brand.microsoft.mailboxGroup}' -Type Security }"
39
+ ],
40
+ "shell": "powershell",
41
+ "confirm": "mailbox-group"
42
+ },
43
+ {
44
+ "title": "Limit the app to the mailboxes in that group",
45
+ "body": "This is the only mail access the app gets. Exchange enforces it, so the app cannot open any other mailbox. The role lines follow what you ticked in step 1; if you tick more later, run the matching New-ManagementRoleAssignment line again. Lines for what already exists (from Outlook calendar) are skipped. Exchange can take up to 2 hours to apply this before Check access passes.",
46
+ "link": {
47
+ "label": "Connect to Exchange Online PowerShell",
48
+ "href": "https://learn.microsoft.com/powershell/exchange/connect-to-exchange-online-powershell"
49
+ },
50
+ "clickUnavailable": true,
51
+ "copy": [
52
+ "# Needs the ExchangeOnlineManagement module: Install-Module ExchangeOnlineManagement -Scope CurrentUser",
53
+ "Connect-ExchangeOnline",
54
+ "if (-not (Get-ServicePrincipal -Identity {clientId} -ErrorAction SilentlyContinue)) { New-ServicePrincipal -AppId {clientId} -ObjectId {servicePrincipalId} -DisplayName \"{brand.microsoft.appName}\" }",
55
+ "if (-not (Get-ManagementScope -Identity \"{brand.microsoft.mailboxGroup}\" -ErrorAction SilentlyContinue)) { New-ManagementScope -Name \"{brand.microsoft.mailboxGroup}\" -RecipientRestrictionFilter \"MemberOfGroup -eq '$((Get-DistributionGroup '{brand.microsoft.mailboxGroup}').DistinguishedName)'\" }",
56
+ "New-ManagementRoleAssignment -Role \"{scope}\" -App {clientId} -CustomResourceScope \"{brand.microsoft.mailboxGroup}\""
57
+ ],
58
+ "shell": "powershell",
59
+ "confirm": "mail-roles"
60
+ }
61
+ ],
62
+ "afterConnect": [],
63
+ "fields": [],
64
+ "capabilities": [
65
+ {
66
+ "id": "read",
67
+ "label": "Read mail",
68
+ "description": "List and read messages in the agent's own mailbox.",
69
+ "required": true,
70
+ "scopes": ["Application Mail.Read"],
71
+ "roles": [],
72
+ "permissions": [],
73
+ "tools": ["mail_list_messages", "mail_get_message"],
74
+ "forbidden": "Microsoft refused this. The app needs the Exchange role {scopes} on the {brand.microsoft.mailboxGroup} scope, and this mailbox must be in that group. A role added in the last hour may not apply yet."
75
+ },
76
+ {
77
+ "id": "send",
78
+ "label": "Send mail",
79
+ "description": "Send new messages and reply from the agent's own mailbox.",
80
+ "scopes": ["Application Mail.Send"],
81
+ "roles": [],
82
+ "permissions": [],
83
+ "tools": ["mail_send", "mail_reply"],
84
+ "forbidden": "Microsoft refused this. The app needs the Exchange role {scopes} on the {brand.microsoft.mailboxGroup} scope, and this mailbox must be in that group. A role added in the last hour may not apply yet."
85
+ },
86
+ {
87
+ "id": "organize",
88
+ "label": "Organize mail",
89
+ "description": "Move messages between folders, flag them and mark them read or unread.",
90
+ "scopes": ["Application Mail.ReadWrite"],
91
+ "roles": [],
92
+ "permissions": [],
93
+ "tools": ["mail_move", "mail_flag", "mail_mark_read"],
94
+ "forbidden": "Microsoft refused this. The app needs the Exchange role {scopes} on the {brand.microsoft.mailboxGroup} scope, and this mailbox must be in that group. A role added in the last hour may not apply yet."
95
+ },
96
+ {
97
+ "id": "delete",
98
+ "label": "Delete mail",
99
+ "description": "Delete messages. They go to Deleted Items, where Microsoft 365 removes them after a while.",
100
+ "destructive": true,
101
+ "scopes": ["Application Mail.ReadWrite"],
102
+ "roles": [],
103
+ "permissions": [],
104
+ "tools": ["mail_delete"],
105
+ "forbidden": "Microsoft refused this. The app needs the Exchange role {scopes} on the {brand.microsoft.mailboxGroup} scope, and this mailbox must be in that group. A role added in the last hour may not apply yet."
106
+ }
107
+ ],
108
+ "limits": [
109
+ {
110
+ "id": "mailbox",
111
+ "label": "Mailbox",
112
+ "help": "The agent's own mailbox, a member of {brand.microsoft.mailboxGroup}. The agent can use no other.",
113
+ "kind": "text",
114
+ "required": true,
115
+ "pattern": "^[A-Za-z0-9._+-]+@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"
116
+ }
117
+ ],
118
+ "verify": {
119
+ "label": "Microsoft Graph permissions on the app (Outlook mail needs none: Exchange limits it to the {brand.microsoft.mailboxGroup} group)",
120
+ "check": "permissions"
121
+ },
122
+ "revoke": "In Exchange Online PowerShell, remove the app's mailbox access with Get-ManagementRoleAssignment -RoleAssignee {clientId} | Remove-ManagementRoleAssignment. To stop every Microsoft app at once, remove the app registration (see the Microsoft connection).",
123
+ "agentAccess": {
124
+ "limit": "mailbox",
125
+ "label": "Exchange lets the app open an agent's mailbox",
126
+ "path": "/v1.0/users/{value}/mailFolders/inbox?$select=id",
127
+ "granted": "The app can open this mailbox.",
128
+ "notGranted": "Exchange does not let the app open this mailbox yet. Check that it is in {brand.microsoft.mailboxGroup}. Also check that the app's mailbox access was given (step 3 on the Outlook mail page), and run Test-ServicePrincipalAuthorization to see which roles apply. Microsoft can take up to about 2 hours to apply a change.",
129
+ "notFound": "Exchange shows the app no mailbox at this address. Either there is none yet (check the address, or wait a few minutes if you just created it), or it is not in {brand.microsoft.mailboxGroup} yet: Exchange answers the same for a mailbox the app may not open. Microsoft can take up to about 2 hours to apply a change.",
130
+ "probes": {
131
+ "send": {
132
+ "method": "POST",
133
+ "path": "/v1.0/users/{value}/sendMail",
134
+ "body": {
135
+ "message": {}
136
+ },
137
+ "allowed": [400]
138
+ },
139
+ "organize": {
140
+ "method": "PATCH",
141
+ "path": "/v1.0/users/{value}/mailFolders/inbox",
142
+ "body": {},
143
+ "allowed": [200]
144
+ },
145
+ "delete": {
146
+ "method": "PATCH",
147
+ "path": "/v1.0/users/{value}/mailFolders/inbox",
148
+ "body": {},
149
+ "allowed": [200]
150
+ }
151
+ },
152
+ "missing": "The app can open this mailbox but Exchange does not let it do this yet: {missing}. Give that role (the step Limit the app to the mailboxes in that group, on the Outlook mail page) and check again. Microsoft can take up to about 2 hours to apply a change."
153
+ }
154
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: import("../../packages/connector-kit/src/connector.js").ConnectorModule;
2
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import { microsoftApp } from "../microsoft/client.js";
2
+ import { microsoftTools } from "./tools.js";
3
+ export default microsoftApp("outlook-mail", microsoftTools);
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../connectors/outlook-mail/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAe,YAAY,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type ToolContext, type Toolset } from "../../packages/connector-kit/src/common.js";
2
+ export declare function nextPage(data: {
3
+ "@odata.nextLink"?: string;
4
+ }): string | null;
5
+ export declare function pageParam(cursor: string | undefined): string[];
6
+ export declare function mailboxPath(ctx: ToolContext): string;
7
+ export declare function ok(ctx: ToolContext, mark: (s: number) => void, req: Parameters<ToolContext["call"]>[0]): Promise<any>;
8
+ export declare const microsoftTools: Toolset;