@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,365 @@
1
+ import { z } from "zod";
2
+ import { normalizeSiteUrl, sitePath } from "./vendor.js";
3
+ import { ConnectError } from "../../packages/connector-kit/src/types.js";
4
+ import { audited, Denied, json, listLimit, mapLimit, VendorFailed, } from "../../packages/connector-kit/src/common.js";
5
+ // Files in the SharePoint sites of the agent's grant (its `sites` limit, and within a site
6
+ // the folder its `folders` limit names, if any), and the directory. Microsoft also enforces
7
+ // the site grants the customer gave the app (Sites.Selected).
8
+ export const MAX_READ_BYTES = 1_000_000;
9
+ // The MCP endpoint takes request bodies up to 4 MiB, and base64 grows a file by a third.
10
+ export const MAX_UPLOAD_BYTES = 3_000_000;
11
+ const ITEM_ID = /^[A-Za-z0-9!_-]{1,256}$/;
12
+ const GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
13
+ const ITEM_FIELDS = "id,name,size,file,folder,webUrl,lastModifiedDateTime,parentReference,remoteItem";
14
+ const TEXT_TYPES = /^(text\/|application\/(json|xml|csv|x-yaml|yaml|javascript|sql)\b|[^;]*\+(json|xml)\b)/;
15
+ export async function ok(ctx, mark, req) {
16
+ const res = await ctx.call(req);
17
+ mark(res.status);
18
+ if (res.status < 200 || res.status >= 300) {
19
+ const message = res.data?.error?.message;
20
+ throw new VendorFailed(res.status, `Microsoft Graph answered ${res.status}${message ? `: ${message}` : ""}`);
21
+ }
22
+ return res.data;
23
+ }
24
+ // The key's sites, kept to those the connection was made with: a stale or typed-in address
25
+ // outside them is never reached, even if the app holds a wider Sites permission.
26
+ export function grantedSites(ctx) {
27
+ const sites = listLimit(ctx.limits, "sites");
28
+ if (!sites)
29
+ throw new Denied("No sites are set for this agent. Ask an administrator to add some.");
30
+ const connected = (ctx.config.sites ?? "").split("\n").filter(Boolean);
31
+ return sites.map((s) => normalizeSiteUrl(s)).filter((s) => connected.includes(s));
32
+ }
33
+ function checkSite(ctx, site) {
34
+ let normalized;
35
+ try {
36
+ normalized = normalizeSiteUrl(site);
37
+ }
38
+ catch (error) {
39
+ if (error instanceof ConnectError)
40
+ throw new Denied("Give a site address from graph_list_sites");
41
+ throw error;
42
+ }
43
+ if (!grantedSites(ctx).includes(normalized))
44
+ throw new Denied(`This agent is not allowed to use ${site}`);
45
+ return normalized;
46
+ }
47
+ // A path inside a site's document library, as its segments. Refused: . and .., characters
48
+ // SharePoint does not allow in names, % (no encoded path ever reaches Graph), control
49
+ // characters, and names SharePoint would trim (outer spaces, a trailing dot).
50
+ // eslint-disable-next-line no-control-regex -- control characters are what it refuses
51
+ const BAD_NAME = /[\\:?#*"<>|%\u0000-\u001f\u007f]/;
52
+ const badName = (p) => p === "." ||
53
+ p === ".." ||
54
+ BAD_NAME.test(p) ||
55
+ p !== p.trim() ||
56
+ p.endsWith(".") ||
57
+ p.length > 255;
58
+ export function pathSegments(raw) {
59
+ const parts = raw.split("/").filter(Boolean);
60
+ if (parts.some(badName))
61
+ throw new Denied(`${raw} is not a folder path such as Reports/2026`);
62
+ return parts;
63
+ }
64
+ /** A folder path inside a site's document library, as Graph path segments. */
65
+ export function folderPath(raw) {
66
+ return pathSegments(raw).map(encodeURIComponent).join("/");
67
+ }
68
+ function fileName(raw) {
69
+ if (!raw || raw.includes("/") || badName(raw))
70
+ throw new Denied("Give a file name without slashes or special characters");
71
+ return encodeURIComponent(raw);
72
+ }
73
+ // SharePoint compares names without case. Both foldings must agree, so a character JavaScript
74
+ // folds into another (the Kelvin sign into k) does not pass for the folder's own name.
75
+ const sameName = (a, b) => {
76
+ const [x, y] = [a.normalize("NFC"), b.normalize("NFC")];
77
+ return x.toLowerCase() === y.toLowerCase() && x.toUpperCase() === y.toUpperCase();
78
+ };
79
+ /** Whether `path` is `folder` or inside it. */
80
+ export function within(path, folder) {
81
+ return folder.length <= path.length && folder.every((f, i) => sameName(f, path[i]));
82
+ }
83
+ // The folder the key is kept to in a site (its `folders` limit), null for the whole site.
84
+ export function keptFolder(ctx, site) {
85
+ const folders = mapLimit(ctx.limits, "folders");
86
+ if (!folders)
87
+ return null;
88
+ const granted = normalizeSiteUrl(site);
89
+ const entry = Object.entries(folders).find(([k]) => normalizeSiteUrl(k) === granted);
90
+ if (!entry)
91
+ return null;
92
+ const folder = pathSegments(entry[1]);
93
+ return folder.length ? folder : null;
94
+ }
95
+ /** The folder a call asks for, as segments: by default the key's folder, never outside it. */
96
+ export function targetFolder(ctx, site, raw) {
97
+ const path = pathSegments(raw);
98
+ const kept = keptFolder(ctx, checkSite(ctx, site));
99
+ if (!kept)
100
+ return path;
101
+ if (!path.length)
102
+ return kept;
103
+ if (!within(path, kept))
104
+ throw new Denied(`This agent may only use the ${kept.join("/")} folder in ${site}`);
105
+ return path;
106
+ }
107
+ // The site's Graph id, read back by address (which must still be the one granted), and the
108
+ // folder the key is kept to there.
109
+ export async function openSite(ctx, mark, site) {
110
+ const granted = checkSite(ctx, site);
111
+ const folder = keptFolder(ctx, granted);
112
+ const found = await ok(ctx, mark, {
113
+ method: "GET",
114
+ path: `${sitePath(granted)}?$select=id,webUrl`,
115
+ });
116
+ if (!found?.id || normalizeSiteUrl(found.webUrl ?? "") !== granted)
117
+ throw new Denied(`${site} did not resolve to the site this agent may use`);
118
+ return { id: found.id, folder };
119
+ }
120
+ // Whether an item is in the site Graph names `id` ("host,site collection id,web id"). An item's
121
+ // parentReference.siteId is the site collection id alone (seen live), or the whole id.
122
+ export function inSite(item, id) {
123
+ const own = item.parentReference?.siteId?.toLowerCase();
124
+ return Boolean(own) && (own === id.toLowerCase() || own === id.split(",")[1]?.toLowerCase());
125
+ }
126
+ // Graph ids are opaque: an item id from another site can be asked for under this site's
127
+ // path, so the item's own site is read back and must match.
128
+ export function checkItemSite(item, id) {
129
+ if (!inSite(item, id))
130
+ throw new Denied("That file is not in a site this agent may use");
131
+ }
132
+ /** The folder an item sits in, from its parent's percent-encoded path ("/drive/root:/A/B"). */
133
+ export function itemFolder(item) {
134
+ const match = /^\/drives?(?:\/[^/]+)?\/root:(.*)$/.exec(item.parentReference?.path ?? "");
135
+ if (!match)
136
+ throw new Denied("Could not tell which folder that file is in");
137
+ // Split before decoding, so an encoded slash stays inside its name.
138
+ try {
139
+ return match[1].split("/").filter(Boolean).map(decodeURIComponent);
140
+ }
141
+ catch {
142
+ throw new Denied("Could not tell which folder that file is in");
143
+ }
144
+ }
145
+ // An item read by id must be in the site, in the site's own document library (its default
146
+ // drive, the only one paths reach), and inside the key's folder there.
147
+ export async function checkItem(ctx, mark, site, item) {
148
+ checkItemSite(item, site.id);
149
+ if (item.remoteItem)
150
+ throw new Denied("That is a shortcut to something outside this site");
151
+ const drive = await ok(ctx, mark, {
152
+ method: "GET",
153
+ path: `/v1.0/sites/${encodeURIComponent(site.id)}/drive?$select=id`,
154
+ });
155
+ if (!drive?.id || item.parentReference?.driveId !== drive.id)
156
+ throw new Denied("That file is not in this site's document library");
157
+ if (site.folder && !within(itemFolder(item), site.folder))
158
+ throw new Denied(`This agent may only use the ${site.folder.join("/")} folder in this site`);
159
+ }
160
+ /** Where a folder listing continues: Graph's $skiptoken from its next page link. */
161
+ export const cursorArg = z
162
+ .string()
163
+ .max(4000)
164
+ .optional()
165
+ .describe("The `next` value from the previous call with the same arguments: the following page.");
166
+ export const nextCursor = (data) => {
167
+ const link = data["@odata.nextLink"];
168
+ return link ? (URL.parse(link)?.searchParams.get("$skiptoken") ?? null) : null;
169
+ };
170
+ export const pageQuery = (top, cursor) => `$top=${top}${cursor ? `&$skiptoken=${encodeURIComponent(cursor)}` : ""}`;
171
+ function summary(item) {
172
+ return {
173
+ id: item.id,
174
+ name: item.name ?? "",
175
+ kind: item.folder ? "folder" : "file",
176
+ size: item.size ?? null,
177
+ type: item.file?.mimeType ?? null,
178
+ modified: item.lastModifiedDateTime ?? null,
179
+ url: item.webUrl ?? null,
180
+ };
181
+ }
182
+ // Buffer.from(x, "base64") skips characters it does not know, which would upload a
183
+ // corrupted file without an error.
184
+ export function decodeBase64(raw) {
185
+ const compact = raw.replace(/\s+/g, "");
186
+ if (compact.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(compact))
187
+ throw new Denied("content is not valid base64");
188
+ return Buffer.from(compact, "base64");
189
+ }
190
+ export function isText(mimeType) {
191
+ return Boolean(mimeType && TEXT_TYPES.test(mimeType.toLowerCase()));
192
+ }
193
+ export const graphTools = {
194
+ names: [
195
+ "graph_list_sites",
196
+ "graph_list_files",
197
+ "graph_read_file",
198
+ "graph_upload_file",
199
+ "graph_list_users",
200
+ ],
201
+ register(server, ctx, allowed) {
202
+ const readOnly = { readOnlyHint: true, openWorldHint: true };
203
+ const site = z.string().max(500).describe("Site address from graph_list_sites.");
204
+ const folderArg = z
205
+ .string()
206
+ .max(1000)
207
+ .default("")
208
+ .describe("Folder path, e.g. Reports/2026. Empty: the top, or this agent's folder.");
209
+ if (allowed.has("graph_list_sites"))
210
+ server.registerTool("graph_list_sites", {
211
+ description: "List the SharePoint sites this agent may use. only_folder: the one folder it may use there.",
212
+ inputSchema: z.object({}),
213
+ annotations: readOnly,
214
+ }, () => audited(ctx, "graph_list_sites", null, async (mark) => {
215
+ const sites = [];
216
+ for (const url of grantedSites(ctx)) {
217
+ const res = await ctx.call({
218
+ method: "GET",
219
+ path: `${sitePath(url)}?$select=id,displayName,description,webUrl`,
220
+ });
221
+ mark(res.status);
222
+ const data = res.data;
223
+ sites.push(res.status === 200
224
+ ? {
225
+ site: url,
226
+ name: data?.displayName ?? "",
227
+ description: data?.description ?? "",
228
+ ...(keptFolder(ctx, url)
229
+ ? { only_folder: keptFolder(ctx, url).join("/") }
230
+ : {}),
231
+ }
232
+ : { site: url, unavailable: `Microsoft Graph answered ${res.status}` });
233
+ }
234
+ return json({ sites });
235
+ }));
236
+ if (allowed.has("graph_list_files"))
237
+ server.registerTool("graph_list_files", {
238
+ description: "List files and folders in a site's document library, at its top or in a folder. When `more` is true, call again with `cursor` set to `next` for the following page.",
239
+ inputSchema: z.object({
240
+ site,
241
+ folder: folderArg,
242
+ max_results: z.number().int().min(1).max(200).default(50),
243
+ cursor: cursorArg,
244
+ }),
245
+ annotations: readOnly,
246
+ }, ({ site: s, folder, max_results, cursor }) => audited(ctx, "graph_list_files", `${s} ${folder}`.trim(), async (mark) => {
247
+ const path = targetFolder(ctx, s, folder).map(encodeURIComponent).join("/");
248
+ const { id } = await openSite(ctx, mark, s);
249
+ const base = `/v1.0/sites/${encodeURIComponent(id)}/drive/root`;
250
+ const data = await ok(ctx, mark, {
251
+ method: "GET",
252
+ path: `${path ? `${base}:/${path}:` : base}/children?${pageQuery(max_results, cursor)}&$select=${ITEM_FIELDS}`,
253
+ });
254
+ const items = data.value.filter((i) => !i.remoteItem && inSite(i, id));
255
+ return json({
256
+ items: items.map(summary),
257
+ more: Boolean(data["@odata.nextLink"]),
258
+ next: nextCursor(data),
259
+ });
260
+ }));
261
+ if (allowed.has("graph_read_file"))
262
+ server.registerTool("graph_read_file", {
263
+ description: `Read a text file (up to ${MAX_READ_BYTES / 1_000_000} MB) from a site's document library. Other files return their details only.`,
264
+ inputSchema: z.object({
265
+ site,
266
+ item_id: z.string().max(300).describe("File id from graph_list_files."),
267
+ }),
268
+ annotations: readOnly,
269
+ }, ({ site: s, item_id }) => audited(ctx, "graph_read_file", `${s} ${item_id}`, async (mark) => {
270
+ if (!ITEM_ID.test(item_id))
271
+ throw new Denied("Give a file id from graph_list_files");
272
+ const opened = await openSite(ctx, mark, s);
273
+ const path = `/v1.0/sites/${encodeURIComponent(opened.id)}/drive/items/${encodeURIComponent(item_id)}`;
274
+ const item = await ok(ctx, mark, {
275
+ method: "GET",
276
+ path: `${path}?$select=${ITEM_FIELDS}`,
277
+ });
278
+ await checkItem(ctx, mark, opened, item);
279
+ if (item.folder)
280
+ throw new Denied("That is a folder. Use graph_list_files.");
281
+ const details = summary(item);
282
+ if (!isText(item.file?.mimeType))
283
+ return json({
284
+ ...details,
285
+ content: null,
286
+ note: "Not a text file, so it is not downloaded.",
287
+ });
288
+ if ((item.size ?? Infinity) > MAX_READ_BYTES)
289
+ return json({ ...details, content: null, note: "Too large to read here." });
290
+ const content = await ok(ctx, mark, {
291
+ method: "GET",
292
+ path: `${path}/content`,
293
+ responseType: "text",
294
+ });
295
+ return json({ ...details, content: String(content ?? "") });
296
+ }));
297
+ if (allowed.has("graph_upload_file"))
298
+ server.registerTool("graph_upload_file", {
299
+ description: `Add a file (up to ${MAX_UPLOAD_BYTES / 1_000_000} MB) to a site's document library, or replace one when replace is true.`,
300
+ inputSchema: z.object({
301
+ site,
302
+ folder: folderArg,
303
+ name: z.string().max(255).describe("File name, e.g. summary.md."),
304
+ content: z.string().max(4_100_000),
305
+ encoding: z.enum(["text", "base64"]).default("text"),
306
+ replace: z.boolean().default(false).describe("Replace a file of the same name."),
307
+ }),
308
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
309
+ }, ({ site: s, folder, name, content, encoding, replace }) => audited(ctx, "graph_upload_file", `${s} ${folder}/${name}`, async (mark, retarget) => {
310
+ const path = [
311
+ ...targetFolder(ctx, s, folder).map(encodeURIComponent),
312
+ fileName(name),
313
+ ].join("/");
314
+ const bytes = new Uint8Array(encoding === "base64" ? decodeBase64(content) : Buffer.from(content, "utf8"));
315
+ if (bytes.byteLength > MAX_UPLOAD_BYTES)
316
+ throw new Denied(`Files up to ${MAX_UPLOAD_BYTES / 1_000_000} MB can be added`);
317
+ const { id } = await openSite(ctx, mark, s);
318
+ const conflict = replace ? "replace" : "fail";
319
+ const item = await ok(ctx, mark, {
320
+ method: "PUT",
321
+ path: `/v1.0/sites/${encodeURIComponent(id)}/drive/root:/${path}:/content?@microsoft.graph.conflictBehavior=${conflict}`,
322
+ body: bytes,
323
+ });
324
+ retarget(`${s} ${item.id}`);
325
+ return json(summary(item));
326
+ }));
327
+ if (allowed.has("graph_list_users"))
328
+ server.registerTool("graph_list_users", {
329
+ description: "Find people in the organization by name, or list a group's members. Returns names, email addresses and job titles. When `more` is true, call again with `cursor` set to `next`.",
330
+ inputSchema: z.object({
331
+ search: z.string().max(100).optional().describe("Part of a name or email address."),
332
+ group_id: z.string().max(36).optional().describe("A group's id, to list its members."),
333
+ max_results: z.number().int().min(1).max(100).default(25),
334
+ cursor: cursorArg.describe("The `next` value from the previous call with the same search and group: the following page."),
335
+ }),
336
+ annotations: readOnly,
337
+ }, ({ search, group_id, max_results, cursor }) => audited(ctx, "graph_list_users", group_id ?? search ?? null, async (mark) => {
338
+ if (group_id !== undefined && !GUID.test(group_id))
339
+ throw new Denied("Give a group id, a GUID");
340
+ const fields = "id,displayName,mail,jobTitle,department";
341
+ const query = [`$select=${fields}`, pageQuery(max_results, cursor)];
342
+ const words = search?.replaceAll('"', "").trim();
343
+ if (words)
344
+ query.push(`$search=${encodeURIComponent(`"displayName:${words}" OR "mail:${words}"`)}`);
345
+ const base = group_id
346
+ ? `/v1.0/groups/${group_id}/members/microsoft.graph.user`
347
+ : "/v1.0/users";
348
+ const data = await ok(ctx, mark, {
349
+ method: "GET",
350
+ path: `${base}?${query.join("&")}`,
351
+ // $search needs this header.
352
+ headers: words ? { consistencylevel: "eventual" } : {},
353
+ });
354
+ const users = data.value.map((u) => ({
355
+ id: u.id,
356
+ name: u.displayName ?? null,
357
+ email: u.mail ?? null,
358
+ title: u.jobTitle ?? null,
359
+ department: u.department ?? null,
360
+ }));
361
+ return json({ users, more: Boolean(data["@odata.nextLink"]), next: nextCursor(data) });
362
+ }));
363
+ },
364
+ };
365
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../connectors/sharepoint-files/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MicrosoftClient } from "../microsoft/client.js";
2
+ import { type Vendor } from "../../packages/connector-kit/src/types.js";
3
+ export declare const MAX_SITES = 50;
4
+ /** A SharePoint site address as admins paste it, reduced to the site's own address. */
5
+ export declare function normalizeSiteUrl(input: string): string;
6
+ /** The Graph path that reads a site by its address. */
7
+ export declare function sitePath(siteUrl: string): string;
8
+ /** Site addresses, normalized, each once, at most MAX_SITES. */
9
+ export declare function normalizeSites(raw: string[]): string[];
10
+ export declare const configSites: (config: Record<string, string>) => string[];
11
+ export declare function sitesVendor(ms: MicrosoftClient): Vendor;
@@ -0,0 +1,167 @@
1
+ import { brand } from "../../packages/connector-kit/src/branding.js";
2
+ import { ConnectError } from "../../packages/connector-kit/src/types.js";
3
+ // SharePoint sites through the Microsoft connection, for SharePoint files and spreadsheets. Under
4
+ // Sites.Selected the app reaches only the sites granted to it, one by one; with the "all sites,
5
+ // read-only" choice (Sites.Read.All) it reads every site. Either way the admin adds the sites
6
+ // agents may use one at a time (config.sites), and each key is kept to its own.
7
+ // A OneDrive is a person's site (https://<tenant>-my.sharepoint.com/personal/<name>), reached
8
+ // only when it is added and granted like any other.
9
+ const SITE_URL = /^https:\/\/[a-z0-9-]+\.sharepoint\.com(\/(sites|teams|personal)\/[a-z0-9][a-z0-9._-]*)?$/;
10
+ const SITE_KINDS = ["sites", "teams", "personal"];
11
+ export const MAX_SITES = 50;
12
+ /** A SharePoint site address as admins paste it, reduced to the site's own address. */
13
+ export function normalizeSiteUrl(input) {
14
+ const url = URL.parse(input.trim());
15
+ const parts = url?.pathname.toLowerCase().split("/").filter(Boolean) ?? [];
16
+ let name = "";
17
+ try {
18
+ name = decodeURIComponent(parts[1] ?? "");
19
+ }
20
+ catch {
21
+ // Not a valid escape: the pattern below refuses it.
22
+ name = "";
23
+ }
24
+ // A bare host is the root site; any other path must start with a site kind, so a typo
25
+ // such as /site/Finance is refused rather than widened to the root site.
26
+ const site = url &&
27
+ url.protocol === "https:" &&
28
+ !url.port &&
29
+ (!parts.length || SITE_KINDS.includes(parts[0]))
30
+ ? `https://${url.hostname}${parts.length ? `/${parts[0]}/${name}` : ""}`
31
+ : "";
32
+ if (!SITE_URL.test(site))
33
+ throw new ConnectError(`${input.trim() || "A site"} is not a SharePoint site address, such as https://your-company.sharepoint.com/sites/Finance`);
34
+ return site;
35
+ }
36
+ /** The Graph path that reads a site by its address. */
37
+ export function sitePath(siteUrl) {
38
+ const { hostname, pathname } = new URL(normalizeSiteUrl(siteUrl));
39
+ return pathname === "/"
40
+ ? `/v1.0/sites/${hostname}`
41
+ : `/v1.0/sites/${hostname}:${pathname.split("/").map(encodeURIComponent).join("/")}`;
42
+ }
43
+ /** Site addresses, normalized, each once, at most MAX_SITES. */
44
+ export function normalizeSites(raw) {
45
+ const sites = [...new Set(raw.filter((s) => s.trim()).map(normalizeSiteUrl))];
46
+ if (sites.length > MAX_SITES)
47
+ throw new ConnectError(`Add at most ${MAX_SITES} sites`);
48
+ return sites;
49
+ }
50
+ export const configSites = (config) => (config.sites ?? "").split("\n").filter(Boolean);
51
+ const writeProbe = () => `${brand().resourcePrefix}-access-check.txt`;
52
+ export function sitesVendor(ms) {
53
+ const { call } = ms;
54
+ // Opens the site by its address, then reads its document library: what agents need.
55
+ async function access(connection, raw, write) {
56
+ const site = normalizeSiteUrl(raw);
57
+ const refused = (status) => status === 401 || status === 403
58
+ ? {
59
+ status: "not_granted",
60
+ message: "Microsoft has not given the app access to this site yet. Run the command below, or send the note to whoever manages SharePoint, then check again.",
61
+ }
62
+ : status === 404 || status === 400
63
+ ? {
64
+ status: "not_found",
65
+ message: "There is no site at this address. Open it in a browser to check it.",
66
+ }
67
+ : {
68
+ status: "failed",
69
+ message: `Microsoft answered ${status}. Check again later.`,
70
+ };
71
+ const res = await call(connection, {
72
+ method: "GET",
73
+ path: `${sitePath(site)}?$select=id,webUrl,displayName`,
74
+ });
75
+ const found = res.data;
76
+ if (res.status !== 200 || !found?.id)
77
+ return { site, name: null, ...refused(res.status) };
78
+ const name = found.displayName ?? null;
79
+ const drive = await call(connection, {
80
+ method: "GET",
81
+ path: `/v1.0/sites/${encodeURIComponent(found.id)}/drive/root?$select=id`,
82
+ });
83
+ if (drive.status !== 200)
84
+ return { site, name, ...refused(drive.status) };
85
+ if (write) {
86
+ // Opening an upload session proves write access. SharePoint may hold the name meanwhile,
87
+ // so the session is cancelled at once; nothing is uploaded.
88
+ const upload = await call(connection, {
89
+ method: "POST",
90
+ path: `/v1.0/sites/${encodeURIComponent(found.id)}/drive/root:/${writeProbe()}:/createUploadSession`,
91
+ body: { item: { "@microsoft.graph.conflictBehavior": "fail" } },
92
+ });
93
+ if (upload.status === 401 || upload.status === 403)
94
+ return {
95
+ site,
96
+ name,
97
+ status: "not_granted",
98
+ message: "The app can read this site but not change files there. Run the command below (it gives write access), or send the note to whoever manages SharePoint, then check again.",
99
+ };
100
+ // 409: a file by that name is already there, which still means the app may write.
101
+ if (upload.status !== 200 && upload.status !== 409)
102
+ return {
103
+ site,
104
+ name,
105
+ status: "failed",
106
+ message: `Microsoft answered ${upload.status} when ${brand().productName} checked write access. Check again later.`,
107
+ };
108
+ const uploadUrl = upload.data?.uploadUrl;
109
+ if (upload.status === 200) {
110
+ if (!uploadUrl)
111
+ throw new Error("Microsoft opened an upload session without its address");
112
+ const cancelled = await ms.cancelUpload(uploadUrl);
113
+ if (cancelled !== 204)
114
+ console.error(`[agent-connect] write check upload session not cancelled: ${cancelled}`);
115
+ }
116
+ }
117
+ return {
118
+ site,
119
+ name,
120
+ status: "granted",
121
+ message: write
122
+ ? "Agents can open and change this site's files."
123
+ : "Agents can open this site's files.",
124
+ };
125
+ }
126
+ return {
127
+ async connect(fields, provider, previous) {
128
+ if (!provider)
129
+ throw new Error("Site apps connect through the Microsoft connection");
130
+ // Sites are added after connecting, and kept across a reconnect.
131
+ const sites = configSites(previous ?? {});
132
+ return {
133
+ config: {
134
+ ...(fields.access ? { access: fields.access } : {}),
135
+ ...(sites.length ? { sites: sites.join("\n") } : {}),
136
+ },
137
+ secret: {},
138
+ accountLabel: provider.accountLabel,
139
+ };
140
+ },
141
+ call,
142
+ sites: { normalize: normalizeSites, access },
143
+ checks: {
144
+ permissions: ms.permissions,
145
+ async sites(connection) {
146
+ const values = [];
147
+ const waiting = [];
148
+ for (const site of configSites(connection.config)) {
149
+ const res = await call(connection, {
150
+ method: "GET",
151
+ path: `${sitePath(site)}?$select=id`,
152
+ });
153
+ (res.status === 200 ? values : waiting).push(site);
154
+ }
155
+ return {
156
+ values,
157
+ ...(waiting.length
158
+ ? {
159
+ warning: `The app cannot open ${waiting.join(", ")} yet. Give it access, then check again.`,
160
+ }
161
+ : {}),
162
+ };
163
+ },
164
+ },
165
+ };
166
+ }
167
+ //# sourceMappingURL=vendor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../../connectors/sharepoint-files/vendor.ts"],"names":[],"mappings":"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"}