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

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 (322) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +269 -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 +228 -0
  14. package/dist/connectors/dynamics-365/index.d.ts +8 -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 +89 -0
  49. package/dist/connectors/gong/vendor.js.map +1 -0
  50. package/dist/connectors/http/index.d.ts +34 -0
  51. package/dist/connectors/http/index.js +325 -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 +70 -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 +100 -0
  82. package/dist/connectors/jira/vendor.js.map +1 -0
  83. package/dist/connectors/microsoft/client.d.ts +66 -0
  84. package/dist/connectors/microsoft/client.js +452 -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 +317 -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 +247 -0
  96. package/dist/connectors/netsuite/vendor.js.map +1 -0
  97. package/dist/connectors/odata/index.d.ts +33 -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 +194 -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 +204 -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 +113 -0
  136. package/dist/connectors/salesforce/vendor.js.map +1 -0
  137. package/dist/connectors/sap-s4hana/connector.json +264 -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 +3 -0
  155. package/dist/connectors/servicenow/vendor.js +106 -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 +8 -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 +189 -0
  179. package/dist/connectors/slack/vendor.js.map +1 -0
  180. package/dist/connectors/soap/index.d.ts +16 -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 +16 -0
  190. package/dist/connectors/sql/index.js +214 -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 +7 -0
  197. package/dist/connectors/teams/tools.js +392 -0
  198. package/dist/connectors/teams/tools.js.map +1 -0
  199. package/dist/connectors/workday/connector.json +188 -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 +199 -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 +36 -0
  216. package/dist/packages/connector-kit/src/common.js +110 -0
  217. package/dist/packages/connector-kit/src/common.js.map +1 -0
  218. package/dist/packages/connector-kit/src/connector.d.ts +1356 -0
  219. package/dist/packages/connector-kit/src/connector.js +1073 -0
  220. package/dist/packages/connector-kit/src/connector.js.map +1 -0
  221. package/dist/packages/connector-kit/src/fetch.d.ts +6 -0
  222. package/dist/packages/connector-kit/src/fetch.js +44 -0
  223. package/dist/packages/connector-kit/src/fetch.js.map +1 -0
  224. package/dist/packages/connector-kit/src/index.d.ts +5 -0
  225. package/dist/packages/connector-kit/src/index.js +6 -0
  226. package/dist/packages/connector-kit/src/index.js.map +1 -0
  227. package/dist/packages/connector-kit/src/oauth.d.ts +15 -0
  228. package/dist/packages/connector-kit/src/oauth.js +98 -0
  229. package/dist/packages/connector-kit/src/oauth.js.map +1 -0
  230. package/dist/packages/connector-kit/src/types.d.ts +87 -0
  231. package/dist/packages/connector-kit/src/types.js +20 -0
  232. package/dist/packages/connector-kit/src/types.js.map +1 -0
  233. package/dist/packages/server/migrations/0001_tables.sql +268 -0
  234. package/dist/packages/server/migrations/0002_organizations.sql +72 -0
  235. package/dist/packages/server/migrations/0003_drop_unused.sql +3 -0
  236. package/dist/packages/server/migrations/0004_trigger_runners.sql +15 -0
  237. package/dist/packages/server/migrations/0005_run_runner.sql +3 -0
  238. package/dist/packages/server/migrations/0006_approvals.sql +36 -0
  239. package/dist/packages/server/migrations/0007_app_events.sql +110 -0
  240. package/dist/packages/server/migrations/rollback/to-legacy.sql +90 -0
  241. package/dist/packages/server/src/api.d.ts +3730 -0
  242. package/dist/packages/server/src/api.js +820 -0
  243. package/dist/packages/server/src/api.js.map +1 -0
  244. package/dist/packages/server/src/app.d.ts +23 -0
  245. package/dist/packages/server/src/app.js +467 -0
  246. package/dist/packages/server/src/app.js.map +1 -0
  247. package/dist/packages/server/src/builtin.d.ts +5 -0
  248. package/dist/packages/server/src/builtin.js +42 -0
  249. package/dist/packages/server/src/builtin.js.map +1 -0
  250. package/dist/packages/server/src/consent.d.ts +27 -0
  251. package/dist/packages/server/src/consent.js +36 -0
  252. package/dist/packages/server/src/consent.js.map +1 -0
  253. package/dist/packages/server/src/events/admin.d.ts +156 -0
  254. package/dist/packages/server/src/events/admin.js +255 -0
  255. package/dist/packages/server/src/events/admin.js.map +1 -0
  256. package/dist/packages/server/src/events/deliver.d.ts +43 -0
  257. package/dist/packages/server/src/events/deliver.js +129 -0
  258. package/dist/packages/server/src/events/deliver.js.map +1 -0
  259. package/dist/packages/server/src/events/runtime.d.ts +28 -0
  260. package/dist/packages/server/src/events/runtime.js +400 -0
  261. package/dist/packages/server/src/events/runtime.js.map +1 -0
  262. package/dist/packages/server/src/events/store.d.ts +172 -0
  263. package/dist/packages/server/src/events/store.js +275 -0
  264. package/dist/packages/server/src/events/store.js.map +1 -0
  265. package/dist/packages/server/src/index.d.ts +40 -0
  266. package/dist/packages/server/src/index.js +186 -0
  267. package/dist/packages/server/src/index.js.map +1 -0
  268. package/dist/packages/server/src/migrate.d.ts +11 -0
  269. package/dist/packages/server/src/migrate.js +134 -0
  270. package/dist/packages/server/src/migrate.js.map +1 -0
  271. package/dist/packages/server/src/openapi.d.ts +4 -0
  272. package/dist/packages/server/src/openapi.js +101 -0
  273. package/dist/packages/server/src/openapi.js.map +1 -0
  274. package/dist/packages/server/src/queue.d.ts +10 -0
  275. package/dist/packages/server/src/queue.js +45 -0
  276. package/dist/packages/server/src/queue.js.map +1 -0
  277. package/dist/packages/server/src/secrets.d.ts +19 -0
  278. package/dist/packages/server/src/secrets.js +76 -0
  279. package/dist/packages/server/src/secrets.js.map +1 -0
  280. package/dist/packages/server/src/server.d.ts +1 -0
  281. package/dist/packages/server/src/server.js +82 -0
  282. package/dist/packages/server/src/server.js.map +1 -0
  283. package/dist/packages/server/src/service.d.ts +767 -0
  284. package/dist/packages/server/src/service.js +924 -0
  285. package/dist/packages/server/src/service.js.map +1 -0
  286. package/dist/packages/server/src/store.d.ts +157 -0
  287. package/dist/packages/server/src/store.js +415 -0
  288. package/dist/packages/server/src/store.js.map +1 -0
  289. package/dist/packages/server/src/teams/activity.d.ts +123 -0
  290. package/dist/packages/server/src/teams/activity.js +188 -0
  291. package/dist/packages/server/src/teams/activity.js.map +1 -0
  292. package/dist/packages/server/src/teams/admin.d.ts +335 -0
  293. package/dist/packages/server/src/teams/admin.js +699 -0
  294. package/dist/packages/server/src/teams/admin.js.map +1 -0
  295. package/dist/packages/server/src/teams/approval.d.ts +57 -0
  296. package/dist/packages/server/src/teams/approval.js +118 -0
  297. package/dist/packages/server/src/teams/approval.js.map +1 -0
  298. package/dist/packages/server/src/teams/bot.d.ts +25 -0
  299. package/dist/packages/server/src/teams/bot.js +124 -0
  300. package/dist/packages/server/src/teams/bot.js.map +1 -0
  301. package/dist/packages/server/src/teams/claude.d.ts +46 -0
  302. package/dist/packages/server/src/teams/claude.js +165 -0
  303. package/dist/packages/server/src/teams/claude.js.map +1 -0
  304. package/dist/packages/server/src/teams/jwt.d.ts +17 -0
  305. package/dist/packages/server/src/teams/jwt.js +121 -0
  306. package/dist/packages/server/src/teams/jwt.js.map +1 -0
  307. package/dist/packages/server/src/teams/package.d.ts +79 -0
  308. package/dist/packages/server/src/teams/package.js +319 -0
  309. package/dist/packages/server/src/teams/package.js.map +1 -0
  310. package/dist/packages/server/src/teams/provision.d.ts +84 -0
  311. package/dist/packages/server/src/teams/provision.js +505 -0
  312. package/dist/packages/server/src/teams/provision.js.map +1 -0
  313. package/dist/packages/server/src/teams/runner.d.ts +80 -0
  314. package/dist/packages/server/src/teams/runner.js +187 -0
  315. package/dist/packages/server/src/teams/runner.js.map +1 -0
  316. package/dist/packages/server/src/teams/runtime.d.ts +91 -0
  317. package/dist/packages/server/src/teams/runtime.js +679 -0
  318. package/dist/packages/server/src/teams/runtime.js.map +1 -0
  319. package/dist/packages/server/src/teams/store.d.ts +233 -0
  320. package/dist/packages/server/src/teams/store.js +507 -0
  321. package/dist/packages/server/src/teams/store.js.map +1 -0
  322. package/package.json +68 -4
@@ -0,0 +1,66 @@
1
+ import type { Toolset } from "../../packages/connector-kit/src/common.js";
2
+ import { type ConnectorContext, type ConnectorModule } from "../../packages/connector-kit/src/connector.js";
3
+ import { type CheckInput, type Fetch, type ProviderClient, type Vendor, type VendorConnection, type VendorRequest } from "../../packages/connector-kit/src/types.js";
4
+ /** config.auth of a connection approved for the shared app. A value stored in existing rows
5
+ * (it predates the service's own name), so it never changes. */
6
+ export declare const SHARED_APP_AUTH = "arbium_app";
7
+ export declare const EXCHANGE_SUFFIX = " (Exchange Online)";
8
+ export declare const GUID: RegExp;
9
+ export type SharedApp = {
10
+ clientId: string;
11
+ clientSecret: string;
12
+ };
13
+ export declare function tokenClaim(jwt: string, claim: string): string | null;
14
+ /** The application permissions in an access token (its `roles` claim). */
15
+ export declare function tokenRoles(jwt: string): string[];
16
+ /** The permissions the ticked capabilities need that the app lacks. Extra ones are the
17
+ * admin's choice, so they are not called out. */
18
+ export declare function compareRoles(granted: string[], input: CheckInput): string | undefined;
19
+ export declare function microsoftClient(options: {
20
+ sharedApp: SharedApp | null;
21
+ }, unguarded?: Fetch, sleep?: (ms: number) => Promise<unknown>): {
22
+ provider: ProviderClient;
23
+ call: (connection: VendorConnection, request: VendorRequest, origin?: string) => Promise<{
24
+ status: number;
25
+ data: unknown;
26
+ headers: {
27
+ [k: string]: string;
28
+ };
29
+ }>;
30
+ permissions: (connection: VendorConnection, input: CheckInput) => Promise<{
31
+ values: string[];
32
+ warning: string | undefined;
33
+ }>;
34
+ cancelUpload: (uploadUrl: string) => Promise<number>;
35
+ delegated: {
36
+ signInUrl(c: VendorConnection, input: {
37
+ state: string;
38
+ redirectUri: string;
39
+ nonce: string;
40
+ scope: string;
41
+ }): string;
42
+ /** The code redeemed with the connection's own credential. Returns the access token and
43
+ * the id token's claims (straight from Microsoft over TLS, so not signature-checked). */
44
+ redeem(c: VendorConnection, input: {
45
+ code: string;
46
+ redirectUri: string;
47
+ scope: string;
48
+ }): Promise<{
49
+ accessToken: string;
50
+ claims: Record<string, unknown>;
51
+ }>;
52
+ };
53
+ };
54
+ export type MicrosoftClient = ReturnType<typeof microsoftClient>;
55
+ /** What a built-in app's module is given: also the deployment's Microsoft client. */
56
+ export type BuiltinContext = ConnectorContext & {
57
+ microsoft: MicrosoftClient;
58
+ };
59
+ export type BuiltinModule = ConnectorModule<BuiltinContext>;
60
+ /** Apps that need only the Microsoft connection: Outlook mail and calendar (mailboxes are
61
+ * reached through the customer's Exchange role assignments to the app, scoped to the
62
+ * branding's mailbox group, never through Graph Mail or Calendars permissions), Teams, Entra ID
63
+ * and Intune. `keep`: the app's own choice fields kept in its config; nothing else the form
64
+ * sends is, so no field can shadow the provider's config. */
65
+ export declare function mailboxVendor(ms: MicrosoftClient, keep?: readonly string[]): Vendor;
66
+ export declare const microsoftApp: (id: string, toolset: Toolset) => BuiltinModule;
@@ -0,0 +1,452 @@
1
+ import { createHash } from "node:crypto";
2
+ import { brand } from "../../packages/connector-kit/src/branding.js";
3
+ import { clientAssertion } from "../../packages/connector-kit/src/certificate.js";
4
+ import { choiceFields, } from "../../packages/connector-kit/src/connector.js";
5
+ import { vendorFetch, vendorUrl } from "../../packages/connector-kit/src/fetch.js";
6
+ import { ConnectError, TokenCache, } from "../../packages/connector-kit/src/types.js";
7
+ // One Microsoft connection per organization, shared by the Microsoft apps (mail, files).
8
+ // Normally the customer's own single-tenant Entra app, signing in with a certificate the
9
+ // service made (client assertion) or a client secret. Where the deployment offers it, instead
10
+ // the deployment's shared multi-tenant app, approved by the customer's administrator.
11
+ // config.auth: "certificate" | "client_secret" | SHARED_APP_AUTH.
12
+ /** config.auth of a connection approved for the shared app. A value stored in existing rows
13
+ * (it predates the service's own name), so it never changes. */
14
+ export const SHARED_APP_AUTH = "arbium_app";
15
+ // Entra role template ids (the same in every tenant) of the roles that can approve an app:
16
+ // Global Administrator, Privileged Role Administrator, Cloud Application Administrator,
17
+ // Application Administrator.
18
+ const APPROVER_ROLES = new Set([
19
+ "62e90394-69f5-4237-9190-012177145e10",
20
+ "e8611ab8-c189-46e8-94e1-60213ab1f814",
21
+ "158c047a-c907-4556-b7ef-446551a6b5f7",
22
+ "9b895d92-2cd3-44c7-9d02-a6ac2d5ea5c3",
23
+ ]);
24
+ const LOGIN = "https://login.microsoftonline.com";
25
+ const GRAPH = "https://graph.microsoft.com";
26
+ // Office 365 Exchange Online: permissions granted on it in Entra (full_access_as_app, its
27
+ // Mail.*) open mailboxes through EWS and never show in a Graph token.
28
+ const EXCHANGE = "https://outlook.office365.com";
29
+ export const EXCHANGE_SUFFIX = " (Exchange Online)";
30
+ export const GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
31
+ // Right after approval Microsoft can take a few seconds to make the app usable in the tenant.
32
+ const CONNECT_RETRY_MS = [3000, 6000, 10000];
33
+ const tokenUrl = (tenant) => `${LOGIN}/${tenant}/oauth2/v2.0/token`;
34
+ // Claims of a token Microsoft just handed us over TLS; no signature check needed.
35
+ function tokenClaims(jwt) {
36
+ try {
37
+ return JSON.parse(Buffer.from(jwt.split(".")[1], "base64url").toString("utf8"));
38
+ }
39
+ catch {
40
+ throw new ConnectError("Microsoft returned an unreadable token");
41
+ }
42
+ }
43
+ export function tokenClaim(jwt, claim) {
44
+ try {
45
+ const value = tokenClaims(jwt)[claim];
46
+ return typeof value === "string" ? value : null;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ /** The application permissions in an access token (its `roles` claim). */
53
+ export function tokenRoles(jwt) {
54
+ const roles = tokenClaims(jwt).roles;
55
+ return (Array.isArray(roles) ? roles : [])
56
+ .filter((r) => typeof r === "string")
57
+ .sort();
58
+ }
59
+ /** The permissions the ticked capabilities need that the app lacks. Extra ones are the
60
+ * admin's choice, so they are not called out. */
61
+ export function compareRoles(granted, input) {
62
+ const missing = input.expected.filter((r) => !granted.includes(r));
63
+ if (!missing.length)
64
+ return undefined;
65
+ const them = missing.length > 1 ? "them" : "it";
66
+ return `Missing: ${missing.join(", ")}. Add ${them} to the app and grant admin consent, or agents cannot do what you ticked.`;
67
+ }
68
+ function safeJson(raw) {
69
+ try {
70
+ return JSON.parse(raw);
71
+ }
72
+ catch {
73
+ return raw;
74
+ }
75
+ }
76
+ export function microsoftClient(options, unguarded = fetch, sleep = (ms) => new Promise((r) => setTimeout(r, ms))) {
77
+ const fetchImpl = vendorFetch("Microsoft", unguarded, (s) => sleep(s * 1000));
78
+ const { sharedApp } = options;
79
+ const tokens = new TokenCache();
80
+ async function requestToken(tenant, form) {
81
+ const res = await fetchImpl(tokenUrl(tenant), {
82
+ method: "POST",
83
+ headers: { "content-type": "application/x-www-form-urlencoded" },
84
+ body: new URLSearchParams(form),
85
+ });
86
+ const body = (await res.json().catch(() => ({})));
87
+ return { ok: res.ok, status: res.status, body };
88
+ }
89
+ // The token request's form for this connection's way of signing in.
90
+ function credentials(c) {
91
+ const { auth, tenantId, clientId, certificate } = c.config;
92
+ if (auth === SHARED_APP_AUTH) {
93
+ if (!sharedApp)
94
+ throw new ConnectError(`This Microsoft connection was approved for ${brand().productName}'s shared app, which this deployment does not offer. Disconnect Microsoft and connect it with your own app registration.`);
95
+ return { client_id: sharedApp.clientId, client_secret: sharedApp.clientSecret };
96
+ }
97
+ if (!GUID.test(tenantId ?? "") || !GUID.test(clientId ?? ""))
98
+ throw new Error("Microsoft connection has no tenantId or clientId");
99
+ if (auth === "client_secret") {
100
+ if (!c.secret.client_secret)
101
+ throw new Error("Microsoft connection has no client secret");
102
+ return { client_id: clientId, client_secret: c.secret.client_secret };
103
+ }
104
+ if (auth === "certificate") {
105
+ if (!certificate || !c.secret.private_key)
106
+ throw new Error("Microsoft connection has no certificate");
107
+ return {
108
+ client_id: clientId,
109
+ client_assertion_type: "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
110
+ client_assertion: clientAssertion({
111
+ clientId,
112
+ tokenUrl: tokenUrl(tenantId),
113
+ certificate,
114
+ privateKey: c.secret.private_key,
115
+ }),
116
+ };
117
+ }
118
+ throw new Error(`Microsoft connection has unknown sign-in ${auth}`);
119
+ }
120
+ // `resource`: the API the token is for, Microsoft Graph unless an app names another (e.g.
121
+ // Exchange Online).
122
+ async function mint(c, resource = GRAPH) {
123
+ const tenant = c.config.tenantId ?? "";
124
+ if (!GUID.test(tenant))
125
+ throw new Error("Microsoft connection has no tenantId");
126
+ const { ok, status, body } = await requestToken(tenant, {
127
+ grant_type: "client_credentials",
128
+ scope: `${resource}/.default`,
129
+ ...credentials(c),
130
+ });
131
+ if (!ok || !body.access_token) {
132
+ const why = (body.error_description ?? body.error ?? String(status)).split(/\r?\n/)[0];
133
+ throw new ConnectError(`Microsoft refused the app's sign-in: ${why.slice(0, 300)}`);
134
+ }
135
+ return { token: body.access_token, expiresIn: body.expires_in ?? 3600 };
136
+ }
137
+ // Cached per credential, so a new certificate or secret never reuses an old token.
138
+ const cacheKey = (c, resource) => createHash("sha256")
139
+ .update([
140
+ resource,
141
+ c.config.auth,
142
+ c.config.tenantId,
143
+ c.config.clientId,
144
+ c.config.certificate,
145
+ c.secret.client_secret,
146
+ ].join("\n"))
147
+ .digest("hex");
148
+ async function send(token, request, origin = GRAPH) {
149
+ // Uploads send the file's bytes; everything else is JSON.
150
+ const raw = request.body instanceof Uint8Array;
151
+ // A file's content answers 302 to a pre-authenticated SharePoint download address, fetched
152
+ // without the token; any other redirect is refused.
153
+ const download = request.responseType === "text" ? unguarded : fetchImpl;
154
+ let res = await download(vendorUrl(origin, request.path), {
155
+ redirect: "manual",
156
+ method: request.method,
157
+ headers: {
158
+ authorization: `Bearer ${token}`,
159
+ accept: "application/json",
160
+ ...request.headers,
161
+ ...(request.body === undefined
162
+ ? {}
163
+ : { "content-type": raw ? "application/octet-stream" : "application/json" }),
164
+ },
165
+ body: request.body === undefined
166
+ ? undefined
167
+ : raw
168
+ ? request.body
169
+ : JSON.stringify(request.body),
170
+ });
171
+ if (download === unguarded && res.status >= 300 && res.status < 400) {
172
+ await res.body?.cancel();
173
+ res = await fetchImpl(sharePointUrl(res.headers.get("location") ?? ""));
174
+ }
175
+ const text = await res.text();
176
+ const asText = request.responseType === "text" && res.ok;
177
+ return {
178
+ status: res.status,
179
+ data: asText ? text : text ? safeJson(text) : null,
180
+ headers: Object.fromEntries(res.headers),
181
+ };
182
+ }
183
+ /** A request to Graph, or to `origin` with a token for it, re-minting the token once on a
184
+ * 401. */
185
+ async function call(connection, request, origin = GRAPH) {
186
+ const key = cacheKey(connection, origin);
187
+ const token = () => tokens.get(key, () => mint(connection, origin));
188
+ let res = await send(await token(), request, origin);
189
+ if (res.status === 401) {
190
+ tokens.forget(key);
191
+ res = await send(await token(), request, origin);
192
+ }
193
+ return res;
194
+ }
195
+ /** Compares the app's permissions, read from fresh Graph and Exchange Online tokens, with
196
+ * what the app's capabilities need. Exchange Online ones are shown with EXCHANGE_SUFFIX.
197
+ * Microsoft calls its tokens opaque to clients, so an unreadable one only means this
198
+ * readout is unavailable; the connection itself still works. */
199
+ async function permissions(connection, input) {
200
+ const [graph, exchange] = await Promise.all([mint(connection), mint(connection, EXCHANGE)]);
201
+ let roles;
202
+ try {
203
+ roles = [
204
+ ...tokenRoles(graph.token),
205
+ ...tokenRoles(exchange.token).map((r) => `${r}${EXCHANGE_SUFFIX}`),
206
+ ];
207
+ }
208
+ catch (error) {
209
+ if (!(error instanceof ConnectError))
210
+ throw error;
211
+ return {
212
+ values: [],
213
+ warning: "Could not read the app's permissions from Microsoft's token.",
214
+ };
215
+ }
216
+ return { values: roles, warning: compareRoles(roles, input) };
217
+ }
218
+ const provider = {
219
+ async connect(fields, existing) {
220
+ const tenantId = fields.tenant_id?.trim().toLowerCase() ?? "";
221
+ const clientId = fields.client_id?.trim().toLowerCase() ?? "";
222
+ const clientSecret = fields.client_secret?.trim() ?? "";
223
+ if (!GUID.test(tenantId))
224
+ throw new ConnectError("Enter the Directory (tenant) ID from the app's Overview page");
225
+ if (!GUID.test(clientId))
226
+ throw new ConnectError("Enter the Application (client) ID from the app's Overview page");
227
+ let connection;
228
+ if (clientSecret)
229
+ connection = {
230
+ config: { auth: "client_secret", tenantId, clientId },
231
+ secret: { client_secret: clientSecret },
232
+ };
233
+ else {
234
+ const certificate = existing?.config.certificate;
235
+ const privateKey = existing?.secret.private_key;
236
+ if (!certificate || !privateKey)
237
+ throw new ConnectError("Create the certificate and upload it to the app, or enter a client secret");
238
+ connection = {
239
+ config: { auth: "certificate", tenantId, clientId, certificate },
240
+ secret: { private_key: privateKey },
241
+ };
242
+ }
243
+ const { token } = await mint(connection);
244
+ const servicePrincipalId = tokenClaim(token, "oid");
245
+ if (!servicePrincipalId)
246
+ throw new Error("Microsoft token has no oid claim");
247
+ if (tokenClaim(token, "tid") !== tenantId)
248
+ throw new ConnectError("Microsoft signed the app in to another organization");
249
+ // A certificate made for rotating stays waiting with the connection.
250
+ const next = existing?.config.nextCertificate;
251
+ return {
252
+ config: {
253
+ ...connection.config,
254
+ servicePrincipalId,
255
+ ...(next ? { nextCertificate: next } : {}),
256
+ },
257
+ secret: {
258
+ ...connection.secret,
259
+ ...(next && existing?.secret.next_private_key
260
+ ? { next_private_key: existing.secret.next_private_key }
261
+ : {}),
262
+ },
263
+ accountLabel: tenantId,
264
+ };
265
+ },
266
+ async verify(connection) {
267
+ await mint(connection);
268
+ },
269
+ ...(sharedApp ? { approval: sharedApproval(sharedApp) } : {}),
270
+ };
271
+ function sharedApproval(app) {
272
+ return {
273
+ clientId: app.clientId,
274
+ consentUrl({ state, redirectUri }) {
275
+ const q = new URLSearchParams({
276
+ client_id: app.clientId,
277
+ scope: `${GRAPH}/.default`,
278
+ redirect_uri: redirectUri,
279
+ state,
280
+ });
281
+ return `${LOGIN}/organizations/v2.0/adminconsent?${q}`;
282
+ },
283
+ signInUrl({ tenant, state, redirectUri, nonce }) {
284
+ if (!GUID.test(tenant))
285
+ throw new ConnectError(`Microsoft did not say which organization approved ${brand().productName}`);
286
+ const q = new URLSearchParams({
287
+ client_id: app.clientId,
288
+ response_type: "code",
289
+ response_mode: "query",
290
+ scope: "openid",
291
+ redirect_uri: redirectUri,
292
+ state,
293
+ nonce,
294
+ });
295
+ return `${LOGIN}/${tenant}/oauth2/v2.0/authorize?${q}`;
296
+ },
297
+ async proveTenant({ tenant, code, redirectUri, nonce }) {
298
+ const { ok, status, body } = await requestToken(tenant, {
299
+ grant_type: "authorization_code",
300
+ client_id: app.clientId,
301
+ client_secret: app.clientSecret,
302
+ code,
303
+ redirect_uri: redirectUri,
304
+ scope: "openid",
305
+ });
306
+ if (!ok || !body.id_token)
307
+ throw new ConnectError(`Microsoft did not confirm the sign-in (${body.error ?? status})`);
308
+ // Straight from Microsoft's token endpoint over TLS with the shared app's secret, so the token's
309
+ // signature need not be checked again (OpenID Connect Core 3.1.3.7).
310
+ const claims = tokenClaims(body.id_token);
311
+ const issuer = `${LOGIN}/${tenant}/v2.0`;
312
+ const fresh = typeof claims.exp === "number" && claims.exp * 1000 > Date.now();
313
+ if (claims.aud !== app.clientId ||
314
+ claims.iss !== issuer ||
315
+ claims.nonce !== nonce ||
316
+ !fresh)
317
+ throw new ConnectError("Microsoft's sign-in did not match this approval. Start again.");
318
+ // A guest signs in to the tenant but belongs to another one (idp names its home).
319
+ const guest = typeof claims.idp === "string" && !claims.idp.includes(tenant);
320
+ if (claims.tid !== tenant || guest)
321
+ throw new ConnectError(`Sign in with an account of the organization that approved ${brand().productName}, not a guest or another organization's account.`);
322
+ // The approval's admin_consent=true came through the browser, so the account signing in
323
+ // must itself hold a role that can approve apps. `wids` is in the id token only when
324
+ // the shared app's manifest sets groupMembershipClaims to DirectoryRole (or All).
325
+ const roles = Array.isArray(claims.wids) ? claims.wids : null;
326
+ if (!roles)
327
+ throw new ConnectError(`Microsoft did not say whether this account is an administrator, so the approval cannot be confirmed. Contact ${brand().productName}.`);
328
+ if (!roles.some((r) => typeof r === "string" && APPROVER_ROLES.has(r.toLowerCase())))
329
+ throw new ConnectError("Sign in with an administrator who can approve apps for your organization (Global Administrator, Privileged Role Administrator, Cloud Application Administrator or Application Administrator).");
330
+ },
331
+ async connect(rawTenant) {
332
+ const tenant = rawTenant.trim().toLowerCase();
333
+ if (!GUID.test(tenant))
334
+ throw new ConnectError(`Microsoft did not say which organization approved ${brand().productName}`);
335
+ const connection = {
336
+ config: { auth: SHARED_APP_AUTH, tenantId: tenant, clientId: app.clientId },
337
+ secret: {},
338
+ };
339
+ let failure = null;
340
+ for (const wait of [0, ...CONNECT_RETRY_MS]) {
341
+ if (wait)
342
+ await sleep(wait);
343
+ try {
344
+ // A fresh token each try: one minted before the approval applied lacks its role.
345
+ const { token } = await mint(connection);
346
+ const org = await send(token, {
347
+ method: "GET",
348
+ path: "/v1.0/organization?$select=displayName,verifiedDomains",
349
+ });
350
+ if (org.status !== 200) {
351
+ failure = new ConnectError(`Microsoft answered ${org.status} when ${brand().productName} checked the connection`);
352
+ continue;
353
+ }
354
+ const servicePrincipalId = tokenClaim(token, "oid");
355
+ if (!servicePrincipalId)
356
+ throw new Error("Microsoft token has no oid claim");
357
+ const info = org.data.value?.[0];
358
+ const domain = info?.verifiedDomains?.find((d) => d.isDefault)?.name;
359
+ const name = info?.displayName ?? tenant;
360
+ return {
361
+ config: { ...connection.config, servicePrincipalId, organization: name },
362
+ secret: {},
363
+ accountLabel: domain ? `${name} (${domain})` : name,
364
+ };
365
+ }
366
+ catch (error) {
367
+ if (!(error instanceof ConnectError))
368
+ throw error;
369
+ failure = error;
370
+ }
371
+ }
372
+ throw failure;
373
+ },
374
+ };
375
+ }
376
+ // Cancels an upload session. Its address is pre-authenticated, so no token is sent, and
377
+ // only a SharePoint address is called.
378
+ async function cancelUpload(uploadUrl) {
379
+ return (await fetchImpl(sharePointUrl(uploadUrl), { method: "DELETE" })).status;
380
+ }
381
+ // An administrator signing in to the connection's own app, for what Microsoft allows only on
382
+ // a person's behalf (publishing to the Teams app catalog). The token is used at once and
383
+ // never kept.
384
+ const delegated = {
385
+ signInUrl(c, input) {
386
+ const { tenantId, clientId } = c.config;
387
+ if (!GUID.test(tenantId ?? "") || !GUID.test(clientId ?? ""))
388
+ throw new Error("Microsoft connection has no tenantId or clientId");
389
+ const q = new URLSearchParams({
390
+ client_id: clientId,
391
+ response_type: "code",
392
+ response_mode: "query",
393
+ scope: `openid ${input.scope}`,
394
+ redirect_uri: input.redirectUri,
395
+ state: input.state,
396
+ nonce: input.nonce,
397
+ prompt: "select_account",
398
+ });
399
+ return `${LOGIN}/${tenantId}/oauth2/v2.0/authorize?${q}`;
400
+ },
401
+ /** The code redeemed with the connection's own credential. Returns the access token and
402
+ * the id token's claims (straight from Microsoft over TLS, so not signature-checked). */
403
+ async redeem(c, input) {
404
+ const { ok, status, body } = await requestToken(c.config.tenantId ?? "", {
405
+ grant_type: "authorization_code",
406
+ code: input.code,
407
+ redirect_uri: input.redirectUri,
408
+ scope: `openid ${input.scope}`,
409
+ ...credentials(c),
410
+ });
411
+ if (!ok || !body.access_token || !body.id_token) {
412
+ const why = (body.error_description ?? body.error ?? String(status)).split(/\r?\n/)[0];
413
+ throw new ConnectError(`Microsoft did not confirm the sign-in: ${why.slice(0, 300)}`);
414
+ }
415
+ return { accessToken: body.access_token, claims: tokenClaims(body.id_token) };
416
+ },
417
+ };
418
+ return { provider, call, permissions, cancelUpload, delegated };
419
+ }
420
+ // Pre-authenticated addresses Graph hands out (downloads, upload sessions) are on SharePoint.
421
+ function sharePointUrl(raw) {
422
+ const url = URL.parse(raw);
423
+ if (url?.protocol !== "https:" || !/\.sharepoint\.com$/i.test(url.hostname))
424
+ throw new ConnectError(`Microsoft pointed to an address that is not SharePoint: ${url?.hostname ?? "none"}`);
425
+ return url.toString();
426
+ }
427
+ /** Apps that need only the Microsoft connection: Outlook mail and calendar (mailboxes are
428
+ * reached through the customer's Exchange role assignments to the app, scoped to the
429
+ * branding's mailbox group, never through Graph Mail or Calendars permissions), Teams, Entra ID
430
+ * and Intune. `keep`: the app's own choice fields kept in its config; nothing else the form
431
+ * sends is, so no field can shadow the provider's config. */
432
+ export function mailboxVendor(ms, keep = []) {
433
+ return {
434
+ async connect(fields, provider) {
435
+ if (!provider)
436
+ throw new Error("Microsoft apps connect through the Microsoft connection");
437
+ const config = Object.fromEntries(keep.filter((k) => fields[k]).map((k) => [k, fields[k]]));
438
+ return { config, secret: {}, accountLabel: provider.accountLabel };
439
+ },
440
+ call: ms.call,
441
+ checks: { permissions: ms.permissions },
442
+ };
443
+ }
444
+ // A Microsoft app keeps its own choice fields (its JSON) and nothing else.
445
+ export const microsoftApp = (id, toolset) => ({
446
+ id,
447
+ create: ({ microsoft, connector }) => ({
448
+ vendor: mailboxVendor(microsoft, choiceFields(connector)),
449
+ toolset,
450
+ }),
451
+ });
452
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../connectors/microsoft/client.ts"],"names":[],"mappings":"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"}