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

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 +404 -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,84 @@
1
+ import { ConnectError, type Fetch, type VendorRequest, type VendorResponse } from "../../../connector-kit/src/types.js";
2
+ export declare const ARM = "https://management.azure.com";
3
+ export declare const CATALOG_SCOPE = "https://graph.microsoft.com/AppCatalog.ReadWrite.All";
4
+ /** The live checks the Teams page's set-up-once steps name (`live` in connectors/teams.json). */
5
+ export declare const LIVE_CHECKS: readonly ["azure-target", "azure-role"];
6
+ export type Call = (request: VendorRequest, origin?: string) => Promise<VendorResponse>;
7
+ export type StepState = {
8
+ id: "app" | "principal" | "azureBot" | "channel" | "signIn";
9
+ label: string;
10
+ state: "done" | "failed" | "waiting" | "todo";
11
+ message?: string;
12
+ };
13
+ export type AzureTarget = {
14
+ subscriptionId: string;
15
+ resourceGroup: string;
16
+ };
17
+ export declare function azureTarget(config: Record<string, string>): AzureTarget | null;
18
+ export declare const azureBotName: (botAppId: string) => string;
19
+ /** A Graph refusal in plain words. A missing permission names it. */
20
+ export declare function graphFailure(res: VendorResponse, what: string, permission: string): ConnectError;
21
+ /** An Azure Resource Manager refusal in plain words. */
22
+ export declare function armFailure(res: VendorResponse, target: AzureTarget, what: string, onRoleStep?: boolean): ConnectError;
23
+ export type ProvisionInput = {
24
+ call: Call;
25
+ bot: {
26
+ id: string;
27
+ displayName: string;
28
+ tenantId: string;
29
+ certificate: string;
30
+ };
31
+ config: Record<string, string>;
32
+ save: (config: Record<string, string>) => Promise<void>;
33
+ target: AzureTarget;
34
+ publicUrl: string;
35
+ prove: (botAppId: string) => Promise<void>;
36
+ sleep: (ms: number) => Promise<void>;
37
+ waits?: number[];
38
+ };
39
+ /** Makes the bot in the tenant, each part only if missing, so running it again finishes what
40
+ * an earlier try left. Steps after a failed one are left to do. */
41
+ export declare function provisionBot(input: ProvisionInput): Promise<{
42
+ steps: StepState[];
43
+ botAppId: string | null;
44
+ }>;
45
+ /** Removes what provisioning made: the Azure Bot and the app registration (which also ends
46
+ * its service principal). Each failure is returned in plain words, never dropped. The app
47
+ * registration is kept while its Azure Bot is: the removal script deletes a bot only when its
48
+ * app still carries the bot's unique name. */
49
+ export declare function deprovisionBot(call: Call, config: Record<string, string>): Promise<string[]>;
50
+ export type LiveCheck = {
51
+ state: "done" | "failing" | "todo";
52
+ message: string;
53
+ };
54
+ export declare function setupChecks(call: Call, config: Record<string, string>): Promise<Record<(typeof LIVE_CHECKS)[number], LiveCheck>>;
55
+ /** The id token's claims must be this connection's app, tenant and sign-in, by someone of the
56
+ * organization (a guest names another home in `idp`). */
57
+ export declare function checkSignIn(claims: Record<string, unknown>, expect: {
58
+ clientId: string;
59
+ tenantId: string;
60
+ nonce: string;
61
+ }, now?: number): void;
62
+ /** Publishes the package, or a new version of it, under the manifest id `externalId`. Finds the
63
+ * catalog app first, so publishing twice changes nothing. */
64
+ export declare function publishPackage(input: {
65
+ token: string;
66
+ externalId: string;
67
+ version: string;
68
+ zip: Buffer;
69
+ }, fetchImpl?: Fetch): Promise<{
70
+ catalogAppId: string;
71
+ changed: boolean;
72
+ }>;
73
+ export type InstallKind = "team" | "chat" | "person";
74
+ /** Adds the published app there, consenting to the package's resource-specific permissions
75
+ * (Microsoft requires exactly the package's list). Already there counts as added. */
76
+ export declare function installBot(call: Call, catalogAppId: string, kind: InstallKind, id: string): Promise<"added" | "already">;
77
+ /** Chat ids from a pasted Teams link or the id itself. */
78
+ export declare function chatIdFrom(raw: string): string | null;
79
+ /** Teams or people matching what the admin typed, for the picker. */
80
+ export declare function searchTargets(call: Call, kind: "team" | "person", rawQuery: string): Promise<{
81
+ id: string;
82
+ name: string;
83
+ detail: string | null;
84
+ }[]>;
@@ -0,0 +1,505 @@
1
+ import { X509Certificate } from "node:crypto";
2
+ import { brand } from "../../../connector-kit/src/branding.js";
3
+ import { describeCertificate } from "../../../connector-kit/src/certificate.js";
4
+ import { ConnectError, } from "../../../connector-kit/src/types.js";
5
+ import { RSC_PERMISSIONS } from "./package.js";
6
+ // "Add to Teams": what the Microsoft connection's own app (branding.microsoft.appName) does in the
7
+ // customer's tenant to make an agent's bot, app-only: the bot's app registration and service
8
+ // principal (Application.ReadWrite.OwnedBy), its Azure Bot with the Teams channel (a custom
9
+ // role on one resource group), and installing it where the admin picks
10
+ // (TeamsAppInstallation.ReadWriteAndConsentFor{Team,Chat,User}.All). Publishing to the org's
11
+ // Teams app catalog has no app-only permission, so an administrator signs in for it
12
+ // (delegated AppCatalog.ReadWrite.All). docs/teams.md "Add to Teams".
13
+ export const ARM = "https://management.azure.com";
14
+ const BOT_API = "2022-09-15";
15
+ export const CATALOG_SCOPE = "https://graph.microsoft.com/AppCatalog.ReadWrite.All";
16
+ const GRAPH = "https://graph.microsoft.com";
17
+ const LOGIN = "https://login.microsoftonline.com";
18
+ /** The live checks the Teams page's set-up-once steps name (`live` in connectors/teams.json). */
19
+ export const LIVE_CHECKS = ["azure-target", "azure-role"];
20
+ export function azureTarget(config) {
21
+ const { azureSubscriptionId: subscriptionId, azureResourceGroup: resourceGroup } = config;
22
+ return subscriptionId && resourceGroup ? { subscriptionId, resourceGroup } : null;
23
+ }
24
+ // The same name the setup script gives it, so either way's removal finds it.
25
+ export const azureBotName = (botAppId) => `${brand().resourcePrefix}-${botAppId.slice(0, 8)}`;
26
+ const botPath = (t, name) => `/subscriptions/${t.subscriptionId}/resourceGroups/${encodeURIComponent(t.resourceGroup)}/providers/Microsoft.BotService/botServices/${name}`;
27
+ function errorOf(data) {
28
+ const e = data?.error;
29
+ return {
30
+ code: typeof e?.code === "string" ? e.code : "",
31
+ message: (typeof e?.message === "string" ? e.message : "").split(/\r?\n/)[0].slice(0, 300),
32
+ };
33
+ }
34
+ /** A Graph refusal in plain words. A missing permission names it. */
35
+ export function graphFailure(res, what, permission) {
36
+ const { code, message } = errorOf(res.data);
37
+ if (res.status === 403 && (code === "Authorization_RequestDenied" || code === "Forbidden"))
38
+ return new ConnectError(`Microsoft refused ${what}: ${brand().microsoft.appName} needs the ${permission} permission with admin consent (Add the Microsoft Graph permissions for adding bots, then Grant admin consent, on the Microsoft Teams page).`);
39
+ return new ConnectError(`Microsoft refused ${what} (${res.status}${code ? `, ${code}` : ""})${message ? `: ${message}` : ""}`);
40
+ }
41
+ /** An Azure Resource Manager refusal in plain words. */
42
+ export function armFailure(res, target, what,
43
+ // Shown on the role step itself, which then points at "this step".
44
+ onRoleStep = false) {
45
+ const { code, message } = errorOf(res.data);
46
+ if (code === "AuthorizationFailed" || code === "LinkedAuthorizationFailed")
47
+ return new ConnectError(`${brand().microsoft.appName} has no role on the resource group ${target.resourceGroup} yet (${onRoleStep ? "this step" : `Give ${brand().microsoft.appName} a role on that resource group, on the Microsoft Teams page`}). A new role assignment can take a few minutes to apply.`);
48
+ if (code === "MissingSubscriptionRegistration")
49
+ return new ConnectError(`The subscription ${target.subscriptionId} is not registered for Azure Bot Service yet. Register Microsoft.BotService (Register the Bot Service in the subscription, on the Microsoft Teams page), then try again.`);
50
+ if (code === "ResourceGroupNotFound")
51
+ return new ConnectError(`There is no resource group ${target.resourceGroup} in the subscription ${target.subscriptionId}.`);
52
+ if (code === "SubscriptionNotFound" || code === "InvalidSubscriptionId")
53
+ return new ConnectError(`Azure has no subscription ${target.subscriptionId} that ${brand().microsoft.appName} can see.`);
54
+ return new ConnectError(`Azure refused ${what} (${res.status}${code ? `, ${code}` : ""})${message ? `: ${message}` : ""}`);
55
+ }
56
+ const ok = (res) => res.status >= 200 && res.status < 300;
57
+ // Graph returns a certificate's customKeyIdentifier as its SHA-1 thumbprint, base64.
58
+ function hasCertificate(keys, certificate) {
59
+ const thumbprint = describeCertificate(certificate).thumbprint.toUpperCase();
60
+ return (Array.isArray(keys) ? keys : []).some((k) => {
61
+ const id = k.customKeyIdentifier;
62
+ if (typeof id !== "string")
63
+ return false;
64
+ const bytes = Buffer.from(id, "base64");
65
+ return (bytes.toString("hex").toUpperCase() === thumbprint ||
66
+ bytes.toString("utf8").toUpperCase() === thumbprint);
67
+ });
68
+ }
69
+ const LABELS = {
70
+ app: "App registration with the bot's certificate",
71
+ principal: "Its service principal",
72
+ azureBot: "Azure Bot on the free tier",
73
+ channel: "Teams channel on the Azure Bot",
74
+ signIn: "The bot signs in to Microsoft",
75
+ };
76
+ // Retried while Microsoft replicates a new app (a few seconds, sometimes a minute).
77
+ const REPLICATION_MS = [2000, 4000, 8000];
78
+ /** Makes the bot in the tenant, each part only if missing, so running it again finishes what
79
+ * an earlier try left. Steps after a failed one are left to do. */
80
+ export async function provisionBot(input) {
81
+ const { call, bot, target } = input;
82
+ const waits = input.waits ?? REPLICATION_MS;
83
+ const config = { ...input.config };
84
+ const steps = [];
85
+ let failed = false;
86
+ async function step(id, run) {
87
+ if (failed)
88
+ return void steps.push({ id, label: LABELS[id], state: "todo" });
89
+ try {
90
+ // A message back means it is not done yet, only waiting on Microsoft.
91
+ const waiting = await run();
92
+ if (waiting)
93
+ failed = true;
94
+ steps.push({
95
+ id,
96
+ label: LABELS[id],
97
+ ...(waiting ? { state: "waiting", message: waiting } : { state: "done" }),
98
+ });
99
+ }
100
+ catch (error) {
101
+ if (!(error instanceof ConnectError))
102
+ throw error;
103
+ failed = true;
104
+ steps.push({ id, label: LABELS[id], state: "failed", message: error.message });
105
+ }
106
+ }
107
+ async function retried(attempt, again) {
108
+ let res = await attempt();
109
+ for (const wait of waits) {
110
+ if (!again(res))
111
+ break;
112
+ await input.sleep(wait);
113
+ res = await attempt();
114
+ }
115
+ return res;
116
+ }
117
+ const uniqueName = `${brand().resourcePrefix}-bot-${bot.id}`;
118
+ await step("app", async () => {
119
+ const upsert = await call({
120
+ method: "PATCH",
121
+ path: `/v1.0/applications(uniqueName='${uniqueName}')`,
122
+ headers: { prefer: "create-if-missing" },
123
+ body: {
124
+ displayName: `${bot.displayName} (${brand().productName})`,
125
+ signInAudience: "AzureADMyOrg",
126
+ },
127
+ });
128
+ if (!ok(upsert))
129
+ throw graphFailure(upsert, "creating the bot's app registration", "Application.ReadWrite.OwnedBy");
130
+ const read = await retried(() => call({
131
+ method: "GET",
132
+ path: `/v1.0/applications(uniqueName='${uniqueName}')?$select=id,appId,keyCredentials`,
133
+ }), (r) => r.status === 404);
134
+ if (!ok(read))
135
+ throw graphFailure(read, "reading the bot's app registration", "Application.ReadWrite.OwnedBy");
136
+ const app = read.data;
137
+ config.appObjectId = app.id;
138
+ config.appId = app.appId;
139
+ await input.save(config);
140
+ // The service owns this app's credentials outright (it is the bot's own, found by its unique
141
+ // name), so replacing them all with the current certificate is intended.
142
+ if (!hasCertificate(app.keyCredentials, bot.certificate)) {
143
+ const set = await call({
144
+ method: "PATCH",
145
+ path: `/v1.0/applications/${app.id}`,
146
+ body: {
147
+ keyCredentials: [
148
+ {
149
+ type: "AsymmetricX509Cert",
150
+ usage: "Verify",
151
+ key: new X509Certificate(bot.certificate).raw.toString("base64"),
152
+ displayName: brand().productName,
153
+ },
154
+ ],
155
+ },
156
+ });
157
+ if (!ok(set))
158
+ throw graphFailure(set, "adding the bot's certificate", "Application.ReadWrite.OwnedBy");
159
+ }
160
+ return null;
161
+ });
162
+ const appId = config.appId ?? null;
163
+ await step("principal", async () => {
164
+ const found = await call({
165
+ method: "GET",
166
+ path: `/v1.0/servicePrincipals(appId='${appId}')?$select=id`,
167
+ });
168
+ if (ok(found))
169
+ return null;
170
+ if (found.status !== 404)
171
+ throw graphFailure(found, "reading the bot's service principal", "Application.ReadWrite.OwnedBy");
172
+ const made = await retried(() => call({ method: "POST", path: "/v1.0/servicePrincipals", body: { appId } }),
173
+ // A new app is not known everywhere at once.
174
+ (r) => r.status === 400 || r.status === 404);
175
+ if (!ok(made) && made.status !== 409)
176
+ throw graphFailure(made, "creating the bot's service principal", "Application.ReadWrite.OwnedBy");
177
+ return null;
178
+ });
179
+ const path = appId ? botPath(target, azureBotName(appId)) : "";
180
+ await step("azureBot", async () => {
181
+ // The name holds only 8 hex of the app id, so one made for another app may hold it.
182
+ const found = await call({ method: "GET", path: `${path}?api-version=${BOT_API}` }, ARM);
183
+ if (!ok(found) && found.status !== 404)
184
+ throw armFailure(found, target, "reading the Azure Bot");
185
+ const owner = ok(found)
186
+ ? found.data?.properties?.msaAppId
187
+ : appId;
188
+ if (owner !== appId)
189
+ throw new ConnectError(`An Azure Bot named ${azureBotName(appId)} in ${target.resourceGroup} belongs to another app, so it is left as it is. Rename or remove it, then add the bot again.`);
190
+ const res = await call({
191
+ method: "PUT",
192
+ path: `${path}?api-version=${BOT_API}`,
193
+ body: {
194
+ location: "global",
195
+ kind: "azurebot",
196
+ sku: { name: "F0" },
197
+ properties: {
198
+ displayName: bot.displayName,
199
+ endpoint: `${input.publicUrl}/teams/bots/${appId}/messages`,
200
+ msaAppId: appId,
201
+ msaAppType: "SingleTenant",
202
+ msaAppTenantId: bot.tenantId,
203
+ },
204
+ },
205
+ }, ARM);
206
+ if (!ok(res))
207
+ throw armFailure(res, target, "creating the Azure Bot");
208
+ config.azureBot = path;
209
+ await input.save(config);
210
+ return null;
211
+ });
212
+ await step("channel", async () => {
213
+ const res = await call({
214
+ method: "PUT",
215
+ path: `${path}/channels/MsTeamsChannel?api-version=${BOT_API}`,
216
+ body: {
217
+ location: "global",
218
+ properties: { channelName: "MsTeamsChannel", properties: { isEnabled: true } },
219
+ },
220
+ }, ARM);
221
+ if (!ok(res))
222
+ throw armFailure(res, target, "adding the Teams channel");
223
+ return null;
224
+ });
225
+ let signedIn = false;
226
+ await step("signIn", async () => {
227
+ let last = null;
228
+ for (const wait of [0, ...waits]) {
229
+ if (wait)
230
+ await input.sleep(wait);
231
+ try {
232
+ await input.prove(appId);
233
+ signedIn = true;
234
+ return null;
235
+ }
236
+ catch (error) {
237
+ if (!(error instanceof ConnectError))
238
+ throw error;
239
+ last = error;
240
+ }
241
+ }
242
+ return `Microsoft is still setting up the new app (${last.message}). Select Add to Teams again in a minute: nothing is made twice.`;
243
+ });
244
+ return { steps, botAppId: signedIn ? appId : null };
245
+ }
246
+ /** Removes what provisioning made: the Azure Bot and the app registration (which also ends
247
+ * its service principal). Each failure is returned in plain words, never dropped. The app
248
+ * registration is kept while its Azure Bot is: the removal script deletes a bot only when its
249
+ * app still carries the bot's unique name. */
250
+ export async function deprovisionBot(call, config) {
251
+ const failed = [];
252
+ if (config.azureBot) {
253
+ const res = await call({ method: "DELETE", path: `${config.azureBot}?api-version=${BOT_API}` }, ARM);
254
+ if (!ok(res) && res.status !== 404) {
255
+ const { code, message } = errorOf(res.data);
256
+ return [
257
+ `Azure did not delete the bot (${res.status}${code ? `, ${code}` : ""})${message ? `: ${message}` : ""}`,
258
+ ];
259
+ }
260
+ }
261
+ if (config.appObjectId) {
262
+ const res = await call({ method: "DELETE", path: `/v1.0/applications/${config.appObjectId}` });
263
+ if (!ok(res) && res.status !== 404)
264
+ failed.push(graphFailure(res, "deleting the bot's app registration", "Application.ReadWrite.OwnedBy")
265
+ .message);
266
+ }
267
+ return failed;
268
+ }
269
+ // ---- the set-up-once steps, checked live ----
270
+ // What Add to Teams writes in the resource group.
271
+ const BOT_WRITES = [
272
+ "Microsoft.BotService/botServices/write",
273
+ "Microsoft.BotService/botServices/channels/write",
274
+ ];
275
+ // Azure's permissions answer: one entry per role, each allowing its `actions` (with *
276
+ // wildcards, any case) except its `notActions`.
277
+ function allows(data, action) {
278
+ const matches = (pattern) => typeof pattern === "string" &&
279
+ new RegExp(`^${pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replaceAll("*", ".*")}$`, "i").test(action);
280
+ const entries = data?.value;
281
+ return (Array.isArray(entries) ? entries : []).some((e) => Array.isArray(e.actions) &&
282
+ e.actions.some(matches) &&
283
+ !(Array.isArray(e.notActions) && e.notActions.some(matches)));
284
+ }
285
+ export async function setupChecks(call, config) {
286
+ const target = azureTarget(config);
287
+ if (!target) {
288
+ const todo = {
289
+ state: "todo",
290
+ message: "Enter the subscription and resource group first.",
291
+ };
292
+ return { "azure-target": { state: "todo", message: "Not entered yet." }, "azure-role": todo };
293
+ }
294
+ const saved = {
295
+ state: "done",
296
+ message: `Bots go in the resource group ${target.resourceGroup} of the subscription ${target.subscriptionId}.`,
297
+ };
298
+ let role;
299
+ try {
300
+ // What the Microsoft app may do there (all its role assignments, inherited ones too): seeing
301
+ // the group is not enough, since Add to Teams writes the bot and its channel.
302
+ const res = await call({
303
+ method: "GET",
304
+ path: `/subscriptions/${target.subscriptionId}/resourceGroups/${encodeURIComponent(target.resourceGroup)}/providers/Microsoft.Authorization/permissions?api-version=2022-04-01`,
305
+ }, ARM);
306
+ const missing = ok(res) ? BOT_WRITES.filter((a) => !allows(res.data, a)) : [];
307
+ role = !ok(res)
308
+ ? {
309
+ state: "failing",
310
+ message: armFailure(res, target, "reading its permissions", true).message,
311
+ }
312
+ : missing.length === BOT_WRITES.length
313
+ ? {
314
+ state: "failing",
315
+ message: `${brand().microsoft.appName} has no role on the resource group ${target.resourceGroup} that can create Azure Bots yet (this step). A new role assignment can take a few minutes to apply.`,
316
+ }
317
+ : missing.length
318
+ ? {
319
+ state: "failing",
320
+ message: `${brand().microsoft.appName}'s role on ${target.resourceGroup} lacks ${missing.join(" and ")} (this step).`,
321
+ }
322
+ : {
323
+ state: "done",
324
+ message: `Checked live: ${brand().microsoft.appName} can create and change Azure Bots in ${target.resourceGroup}.`,
325
+ };
326
+ }
327
+ catch (error) {
328
+ if (!(error instanceof ConnectError))
329
+ throw error;
330
+ role = { state: "failing", message: error.message };
331
+ }
332
+ const missingGroup = role.state === "failing" && role.message.startsWith("There is no resource group");
333
+ return {
334
+ "azure-target": missingGroup ? { state: "failing", message: role.message } : saved,
335
+ "azure-role": role,
336
+ };
337
+ }
338
+ // ---- publishing to the org's Teams app catalog, as the administrator who signed in ----
339
+ /** The id token's claims must be this connection's app, tenant and sign-in, by someone of the
340
+ * organization (a guest names another home in `idp`). */
341
+ export function checkSignIn(claims, expect, now = Date.now()) {
342
+ const fresh = typeof claims.exp === "number" && claims.exp * 1000 > now;
343
+ if (claims.aud !== expect.clientId ||
344
+ claims.iss !== `${LOGIN}/${expect.tenantId}/v2.0` ||
345
+ claims.nonce !== expect.nonce ||
346
+ !fresh)
347
+ throw new ConnectError("Microsoft's sign-in did not match this request. Start again.");
348
+ const guest = typeof claims.idp === "string" && !claims.idp.includes(expect.tenantId);
349
+ if (claims.tid !== expect.tenantId || guest)
350
+ throw new ConnectError("Sign in with an administrator of your own organization, not a guest or another organization's account.");
351
+ }
352
+ function catalogFailure(res) {
353
+ const error = res.data?.error;
354
+ const inner = error?.innerError;
355
+ if (inner?.code === "UnableToParseTeamsAppManifest") {
356
+ const details = (Array.isArray(inner.details) ? inner.details : [])
357
+ .map((d) => `${d.target ? `${d.target}: ` : ""}${d.message ?? ""}`)
358
+ .join("; ");
359
+ return new ConnectError(`Microsoft refused the Teams app package: ${details || errorOf(res.data).message}`);
360
+ }
361
+ if (res.status === 403 || res.status === 401)
362
+ return new ConnectError(`Microsoft refused to publish: sign in as a Teams Administrator or Global Administrator, and check that ${brand().microsoft.appName} has AppCatalog.ReadWrite.All with admin consent.`);
363
+ if (res.status === 409)
364
+ return new ConnectError("Your Teams apps already have an app for this bot under another ID. Delete it in the Teams admin center under Teams apps, then Manage apps, and publish again.");
365
+ const { code, message } = errorOf(res.data);
366
+ return new ConnectError(`Microsoft refused to publish (${res.status}${code ? `, ${code}` : ""})${message ? `: ${message}` : ""}`);
367
+ }
368
+ /** Publishes the package, or a new version of it, under the manifest id `externalId`. Finds the
369
+ * catalog app first, so publishing twice changes nothing. */
370
+ export async function publishPackage(input, fetchImpl = fetch) {
371
+ const as = async (path, init) => {
372
+ const res = await fetchImpl(`${GRAPH}${path}`, {
373
+ method: init.method,
374
+ redirect: "error",
375
+ headers: {
376
+ authorization: `Bearer ${input.token}`,
377
+ accept: "application/json",
378
+ ...(init.zip ? { "content-type": "application/zip" } : {}),
379
+ },
380
+ body: init.zip ? new Uint8Array(init.zip) : undefined,
381
+ });
382
+ const text = await res.text();
383
+ let data = null;
384
+ try {
385
+ data = text ? JSON.parse(text) : null;
386
+ }
387
+ catch {
388
+ data = text;
389
+ }
390
+ return { status: res.status, data };
391
+ };
392
+ const q = new URLSearchParams({
393
+ $filter: `externalId eq '${input.externalId}'`,
394
+ $expand: "appDefinitions($select=version)",
395
+ });
396
+ const found = await as(`/v1.0/appCatalogs/teamsApps?${q}`, { method: "GET" });
397
+ if (!ok(found) || errorOf(found.data).code)
398
+ throw catalogFailure(found);
399
+ const existing = found.data.value?.[0];
400
+ if (existing?.appDefinitions?.some((d) => d.version === input.version))
401
+ return { catalogAppId: existing.id, changed: false };
402
+ const res = existing
403
+ ? await as(`/v1.0/appCatalogs/teamsApps/${existing.id}/appDefinitions?requiresReview=false`, {
404
+ method: "POST",
405
+ zip: input.zip,
406
+ })
407
+ : await as("/v1.0/appCatalogs/teamsApps?requiresReview=false", {
408
+ method: "POST",
409
+ zip: input.zip,
410
+ });
411
+ // Microsoft can answer a refused package with 200 and an error body.
412
+ if (!ok(res) || errorOf(res.data).code)
413
+ throw catalogFailure(res);
414
+ const id = existing?.id ?? res.data?.id;
415
+ if (!id)
416
+ throw new ConnectError("Microsoft did not say which app it published");
417
+ return { catalogAppId: id, changed: true };
418
+ }
419
+ const INSTALL = {
420
+ team: {
421
+ path: (id) => `/v1.0/teams/${id}/installedApps`,
422
+ permission: "TeamsAppInstallation.ReadWriteAndConsentForTeam.All",
423
+ what: "team",
424
+ },
425
+ chat: {
426
+ path: (id) => `/v1.0/chats/${encodeURIComponent(id)}/installedApps`,
427
+ permission: "TeamsAppInstallation.ReadWriteAndConsentForChat.All",
428
+ what: "chat",
429
+ },
430
+ person: {
431
+ path: (id) => `/v1.0/users/${id}/teamwork/installedApps`,
432
+ permission: "TeamsAppInstallation.ReadWriteAndConsentForUser.All",
433
+ what: "person",
434
+ },
435
+ };
436
+ /** Adds the published app there, consenting to the package's resource-specific permissions
437
+ * (Microsoft requires exactly the package's list). Already there counts as added. */
438
+ export async function installBot(call, catalogAppId, kind, id) {
439
+ const spec = INSTALL[kind];
440
+ const res = await call({
441
+ method: "POST",
442
+ path: spec.path(id),
443
+ body: {
444
+ "teamsApp@odata.bind": `${GRAPH}/v1.0/appCatalogs/teamsApps/${catalogAppId}`,
445
+ consentedPermissionSet: {
446
+ resourceSpecificPermissions: RSC_PERMISSIONS.map((permissionValue) => ({
447
+ permissionValue,
448
+ permissionType: "application",
449
+ })),
450
+ },
451
+ },
452
+ });
453
+ if (ok(res))
454
+ return "added";
455
+ if (res.status === 409)
456
+ return "already";
457
+ const { code, message } = errorOf(res.data);
458
+ if (res.status === 403 && code !== "Authorization_RequestDenied")
459
+ throw new ConnectError(`Microsoft would not add the bot to this ${spec.what}. Your organization's Teams app settings may block it (the app's status, who it is available to, or a permission policy)${message ? `: ${message}` : "."}`);
460
+ if (res.status === 404)
461
+ throw new ConnectError(`Microsoft found no such ${spec.what}, or the bot is not in your Teams apps yet. Publish it first.`);
462
+ throw graphFailure(res, `adding the bot to this ${spec.what}`, spec.permission);
463
+ }
464
+ /** Chat ids from a pasted Teams link or the id itself. */
465
+ export function chatIdFrom(raw) {
466
+ let text = raw.trim();
467
+ try {
468
+ text = decodeURIComponent(text);
469
+ }
470
+ catch {
471
+ return null;
472
+ }
473
+ return /19:[A-Za-z0-9_.-]+@thread\.(v2|skype)/.exec(text)?.[0] ?? null;
474
+ }
475
+ /** Teams or people matching what the admin typed, for the picker. */
476
+ export async function searchTargets(call, kind, rawQuery) {
477
+ const query = rawQuery.replace(/["\\]/g, "").trim().slice(0, 100);
478
+ if (kind === "team") {
479
+ const q = new URLSearchParams({ $select: "id,displayName,description", $top: "20" });
480
+ if (query)
481
+ q.set("$filter", `startswith(displayName,'${query.replaceAll("'", "''")}')`);
482
+ const res = await call({ method: "GET", path: `/v1.0/teams?${q}` });
483
+ if (!ok(res))
484
+ throw graphFailure(res, "listing teams", "Team.ReadBasic.All");
485
+ return (res.data
486
+ .value ?? []).map((t) => ({ id: t.id, name: t.displayName ?? t.id, detail: t.description || null }));
487
+ }
488
+ if (!query)
489
+ return [];
490
+ const q = new URLSearchParams({
491
+ $search: `"displayName:${query}" OR "mail:${query}"`,
492
+ $select: "id,displayName,mail",
493
+ $top: "20",
494
+ $count: "true",
495
+ });
496
+ const res = await call({
497
+ method: "GET",
498
+ path: `/v1.0/users?${q}`,
499
+ headers: { consistencylevel: "eventual" },
500
+ });
501
+ if (!ok(res))
502
+ throw graphFailure(res, "looking up people", "User.ReadBasic.All");
503
+ return (res.data.value ?? []).map((u) => ({ id: u.id, name: u.displayName ?? u.id, detail: u.mail ?? null }));
504
+ }
505
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../../../../../packages/server/src/teams/provision.ts"],"names":[],"mappings":"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"}