runline 0.35.0 → 0.36.0

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 (473) hide show
  1. package/dist/auth/errors.d.ts +3 -3
  2. package/dist/auth/errors.js +3 -3
  3. package/dist/credentials/aws-plugin.d.ts +79 -0
  4. package/dist/credentials/aws-plugin.js +179 -0
  5. package/dist/credentials/aws.d.ts +41 -0
  6. package/dist/credentials/aws.js +213 -0
  7. package/dist/credentials/broker.d.ts +11 -0
  8. package/dist/{plugins/_shared/credentialAdapter.js → credentials/broker.js} +91 -41
  9. package/dist/credentials/plugin.d.ts +255 -0
  10. package/dist/{plugins/_shared/credentials.js → credentials/plugin.js} +11 -10
  11. package/dist/credentials/policy.d.ts +11 -3
  12. package/dist/credentials/policy.js +22 -3
  13. package/dist/credentials/registry.d.ts +14 -0
  14. package/dist/credentials/registry.js +55 -2
  15. package/dist/credentials/sigv4.d.ts +47 -0
  16. package/dist/credentials/sigv4.js +145 -0
  17. package/dist/credentials/transport.d.ts +9 -0
  18. package/dist/credentials/transport.js +106 -26
  19. package/dist/credentials/types.d.ts +63 -4
  20. package/dist/index.d.ts +8 -2
  21. package/dist/index.js +5 -1
  22. package/dist/plugins/_shared/googleAuth.js +3 -5
  23. package/dist/plugins/_shared/googleCredentials.js +1 -2
  24. package/dist/plugins/_shared/mediaFile.js +4 -1
  25. package/dist/plugins/_shared/microsoftAuth.js +3 -5
  26. package/dist/plugins/_shared/microsoftCredentials.js +1 -2
  27. package/dist/plugins/_shared/shiftCloud.js +1 -2
  28. package/dist/plugins/_shared/shiftCredentials.js +1 -2
  29. package/dist/plugins/actionNetwork/src/credentials.js +1 -1
  30. package/dist/plugins/actionNetwork/src/index.js +1 -1
  31. package/dist/plugins/activeCampaign/src/credentials.js +1 -1
  32. package/dist/plugins/activeCampaign/src/index.js +1 -1
  33. package/dist/plugins/adalo/src/credentials.js +1 -1
  34. package/dist/plugins/adalo/src/index.js +1 -1
  35. package/dist/plugins/affinity/src/credentials.js +1 -1
  36. package/dist/plugins/affinity/src/index.js +1 -1
  37. package/dist/plugins/agentMail/src/credentials.js +1 -1
  38. package/dist/plugins/agentMail/src/shared.js +1 -2
  39. package/dist/plugins/agileCrm/src/credentials.js +1 -1
  40. package/dist/plugins/agileCrm/src/index.js +1 -1
  41. package/dist/plugins/airtable/src/credentials.js +1 -1
  42. package/dist/plugins/airtable/src/index.js +1 -1
  43. package/dist/plugins/airtop/src/credentials.js +1 -1
  44. package/dist/plugins/airtop/src/index.js +1 -1
  45. package/dist/plugins/apiTemplateIo/src/credentials.js +1 -1
  46. package/dist/plugins/apiTemplateIo/src/index.js +1 -1
  47. package/dist/plugins/asana/src/credentials.js +1 -1
  48. package/dist/plugins/asana/src/index.js +1 -1
  49. package/dist/plugins/autopilot/src/credentials.js +1 -1
  50. package/dist/plugins/autopilot/src/index.js +1 -1
  51. package/dist/plugins/bambooHr/src/credentials.js +1 -1
  52. package/dist/plugins/bambooHr/src/index.js +1 -1
  53. package/dist/plugins/bannerbear/src/credentials.js +1 -1
  54. package/dist/plugins/bannerbear/src/index.js +1 -1
  55. package/dist/plugins/baserow/src/credentials.js +1 -1
  56. package/dist/plugins/baserow/src/index.js +1 -1
  57. package/dist/plugins/beeminder/src/credentials.js +1 -1
  58. package/dist/plugins/beeminder/src/index.js +1 -1
  59. package/dist/plugins/bitly/src/credentials.js +1 -1
  60. package/dist/plugins/bitly/src/index.js +1 -1
  61. package/dist/plugins/bitwarden/src/credentials.js +1 -1
  62. package/dist/plugins/bitwarden/src/index.js +1 -1
  63. package/dist/plugins/box/src/credentials.js +1 -1
  64. package/dist/plugins/box/src/index.js +1 -1
  65. package/dist/plugins/brandfetch/src/credentials.js +1 -1
  66. package/dist/plugins/brandfetch/src/index.js +1 -1
  67. package/dist/plugins/brevo/src/credentials.js +1 -1
  68. package/dist/plugins/brevo/src/index.js +1 -1
  69. package/dist/plugins/bubble/src/credentials.js +1 -1
  70. package/dist/plugins/bubble/src/index.js +1 -1
  71. package/dist/plugins/chargebee/src/credentials.js +1 -1
  72. package/dist/plugins/chargebee/src/index.js +1 -1
  73. package/dist/plugins/circleci/src/credentials.js +1 -1
  74. package/dist/plugins/circleci/src/index.js +1 -1
  75. package/dist/plugins/ciscoWebex/src/credentials.js +1 -1
  76. package/dist/plugins/ciscoWebex/src/index.js +1 -1
  77. package/dist/plugins/clearbit/src/credentials.js +1 -1
  78. package/dist/plugins/clearbit/src/index.js +1 -1
  79. package/dist/plugins/clickup/src/credentials.js +1 -1
  80. package/dist/plugins/clickup/src/index.js +1 -1
  81. package/dist/plugins/clockify/src/credentials.js +1 -1
  82. package/dist/plugins/clockify/src/index.js +1 -1
  83. package/dist/plugins/cloudflare/src/credentials.js +1 -1
  84. package/dist/plugins/cloudflare/src/index.js +1 -1
  85. package/dist/plugins/cockpit/src/credentials.js +1 -1
  86. package/dist/plugins/cockpit/src/index.js +1 -1
  87. package/dist/plugins/coda/src/credentials.js +1 -1
  88. package/dist/plugins/coda/src/index.js +1 -1
  89. package/dist/plugins/coingecko/src/credentials.js +1 -1
  90. package/dist/plugins/coingecko/src/index.js +1 -1
  91. package/dist/plugins/contentful/src/credentials.js +1 -1
  92. package/dist/plugins/contentful/src/index.js +1 -1
  93. package/dist/plugins/convertkit/src/credentials.js +1 -1
  94. package/dist/plugins/convertkit/src/index.js +1 -1
  95. package/dist/plugins/copper/src/credentials.js +1 -1
  96. package/dist/plugins/copper/src/index.js +1 -1
  97. package/dist/plugins/cortex/src/credentials.js +1 -1
  98. package/dist/plugins/cortex/src/index.js +1 -1
  99. package/dist/plugins/currents/src/credentials.js +1 -1
  100. package/dist/plugins/currents/src/index.js +1 -1
  101. package/dist/plugins/customerIo/src/credentials.js +1 -1
  102. package/dist/plugins/customerIo/src/index.js +1 -1
  103. package/dist/plugins/databricks/src/credentials.js +1 -1
  104. package/dist/plugins/databricks/src/index.js +1 -1
  105. package/dist/plugins/deepl/src/credentials.js +1 -1
  106. package/dist/plugins/deepl/src/index.js +1 -1
  107. package/dist/plugins/demio/src/credentials.js +1 -1
  108. package/dist/plugins/demio/src/index.js +1 -1
  109. package/dist/plugins/dhl/src/credentials.js +1 -1
  110. package/dist/plugins/dhl/src/index.js +1 -1
  111. package/dist/plugins/discord/src/credentials.js +1 -1
  112. package/dist/plugins/discord/src/index.js +1 -1
  113. package/dist/plugins/discourse/src/credentials.js +1 -1
  114. package/dist/plugins/discourse/src/index.js +1 -1
  115. package/dist/plugins/disqus/src/credentials.js +1 -1
  116. package/dist/plugins/disqus/src/index.js +1 -1
  117. package/dist/plugins/drift/src/credentials.js +1 -1
  118. package/dist/plugins/drift/src/index.js +1 -1
  119. package/dist/plugins/dropbox/src/credentials.js +1 -1
  120. package/dist/plugins/dropbox/src/index.js +1 -1
  121. package/dist/plugins/dropcontact/src/credentials.js +1 -1
  122. package/dist/plugins/dropcontact/src/index.js +1 -1
  123. package/dist/plugins/egoi/src/credentials.js +1 -1
  124. package/dist/plugins/egoi/src/index.js +1 -1
  125. package/dist/plugins/elasticsearch/src/credentials.js +1 -1
  126. package/dist/plugins/elasticsearch/src/index.js +1 -1
  127. package/dist/plugins/elevenlabs/src/credentials.js +1 -1
  128. package/dist/plugins/elevenlabs/src/shared.js +2 -4
  129. package/dist/plugins/elevenlabs/src/workflows.js +1 -1
  130. package/dist/plugins/emelia/src/credentials.js +1 -1
  131. package/dist/plugins/emelia/src/index.js +1 -1
  132. package/dist/plugins/erpnext/src/credentials.js +1 -1
  133. package/dist/plugins/erpnext/src/index.js +1 -1
  134. package/dist/plugins/facebookGraph/src/credentials.js +1 -1
  135. package/dist/plugins/facebookGraph/src/index.js +1 -2
  136. package/dist/plugins/fal/src/credentials.js +1 -1
  137. package/dist/plugins/fal/src/shared.js +1 -1
  138. package/dist/plugins/freshdesk/src/credentials.js +1 -1
  139. package/dist/plugins/freshdesk/src/index.js +1 -1
  140. package/dist/plugins/freshservice/src/credentials.js +1 -1
  141. package/dist/plugins/freshservice/src/index.js +1 -1
  142. package/dist/plugins/freshworksCrm/src/credentials.js +1 -1
  143. package/dist/plugins/freshworksCrm/src/index.js +1 -1
  144. package/dist/plugins/getresponse/src/credentials.js +1 -1
  145. package/dist/plugins/getresponse/src/index.js +1 -1
  146. package/dist/plugins/gett/src/credentials.js +1 -2
  147. package/dist/plugins/gett/src/index.js +1 -1
  148. package/dist/plugins/gett/src/login.js +1 -1
  149. package/dist/plugins/gett/src/session.js +1 -1
  150. package/dist/plugins/gett/src/shared.js +1 -2
  151. package/dist/plugins/ghost/src/credentials.js +1 -1
  152. package/dist/plugins/ghost/src/index.js +1 -1
  153. package/dist/plugins/github/src/credentials.js +1 -1
  154. package/dist/plugins/github/src/index.js +1 -1
  155. package/dist/plugins/gitlab/src/credentials.js +1 -1
  156. package/dist/plugins/gitlab/src/index.js +1 -1
  157. package/dist/plugins/gmail/src/index.js +1 -1
  158. package/dist/plugins/gong/src/credentials.js +1 -1
  159. package/dist/plugins/gong/src/index.js +1 -1
  160. package/dist/plugins/googleAppsScript/src/index.js +12 -1
  161. package/dist/plugins/googleCalendar/src/index.js +1 -1
  162. package/dist/plugins/googleContacts/src/index.js +1 -1
  163. package/dist/plugins/googleDocs/src/shared.js +1 -1
  164. package/dist/plugins/googleDrive/src/index.js +1 -1
  165. package/dist/plugins/googleImage/src/credentials.js +1 -1
  166. package/dist/plugins/googleImage/src/index.js +1 -1
  167. package/dist/plugins/googleSheets/src/index.js +1 -1
  168. package/dist/plugins/googleSlides/src/index.js +1 -1
  169. package/dist/plugins/googleTasks/src/index.js +1 -1
  170. package/dist/plugins/gotify/src/credentials.js +1 -1
  171. package/dist/plugins/gotify/src/index.js +1 -1
  172. package/dist/plugins/gotowebinar/src/credentials.js +1 -1
  173. package/dist/plugins/gotowebinar/src/index.js +1 -1
  174. package/dist/plugins/grafana/src/credentials.js +1 -1
  175. package/dist/plugins/grafana/src/index.js +1 -1
  176. package/dist/plugins/graphql/src/credentials.js +1 -1
  177. package/dist/plugins/graphql/src/index.js +1 -1
  178. package/dist/plugins/grist/src/credentials.js +1 -1
  179. package/dist/plugins/grist/src/index.js +1 -1
  180. package/dist/plugins/halopsa/src/credentials.js +1 -2
  181. package/dist/plugins/halopsa/src/index.js +1 -1
  182. package/dist/plugins/harvest/src/credentials.js +1 -1
  183. package/dist/plugins/harvest/src/index.js +1 -1
  184. package/dist/plugins/helpscout/src/credentials.js +1 -1
  185. package/dist/plugins/helpscout/src/index.js +1 -1
  186. package/dist/plugins/highlevel/src/credentials.js +1 -1
  187. package/dist/plugins/highlevel/src/index.js +1 -1
  188. package/dist/plugins/homeAssistant/src/credentials.js +1 -1
  189. package/dist/plugins/homeAssistant/src/index.js +1 -1
  190. package/dist/plugins/hubspot/src/credentials.js +1 -1
  191. package/dist/plugins/hubspot/src/index.js +1 -1
  192. package/dist/plugins/humanticAi/src/credentials.js +1 -1
  193. package/dist/plugins/humanticAi/src/index.js +1 -1
  194. package/dist/plugins/hunter/src/credentials.js +1 -1
  195. package/dist/plugins/hunter/src/index.js +1 -1
  196. package/dist/plugins/intercom/src/credentials.js +1 -1
  197. package/dist/plugins/intercom/src/index.js +1 -1
  198. package/dist/plugins/iterable/src/credentials.js +1 -1
  199. package/dist/plugins/iterable/src/index.js +1 -1
  200. package/dist/plugins/jenkins/src/credentials.js +1 -1
  201. package/dist/plugins/jenkins/src/index.js +1 -1
  202. package/dist/plugins/jira/src/credentials.js +1 -1
  203. package/dist/plugins/jira/src/index.js +1 -1
  204. package/dist/plugins/keap/src/credentials.js +1 -1
  205. package/dist/plugins/keap/src/index.js +1 -1
  206. package/dist/plugins/kobotoolbox/src/credentials.js +1 -1
  207. package/dist/plugins/kobotoolbox/src/index.js +1 -1
  208. package/dist/plugins/lemlist/src/credentials.js +1 -1
  209. package/dist/plugins/lemlist/src/index.js +1 -1
  210. package/dist/plugins/linear/src/credentials.js +1 -1
  211. package/dist/plugins/linear/src/shared.js +1 -1
  212. package/dist/plugins/lingvanex/src/credentials.js +1 -1
  213. package/dist/plugins/lingvanex/src/index.js +1 -1
  214. package/dist/plugins/linkedin/src/credentials.js +1 -1
  215. package/dist/plugins/linkedin/src/index.js +1 -1
  216. package/dist/plugins/lonescale/src/credentials.js +1 -1
  217. package/dist/plugins/lonescale/src/index.js +1 -1
  218. package/dist/plugins/magento/src/credentials.js +1 -1
  219. package/dist/plugins/magento/src/index.js +1 -1
  220. package/dist/plugins/mailcheck/src/credentials.js +1 -1
  221. package/dist/plugins/mailcheck/src/index.js +1 -1
  222. package/dist/plugins/mailchimp/src/credentials.js +1 -1
  223. package/dist/plugins/mailchimp/src/index.js +1 -1
  224. package/dist/plugins/mailerlite/src/credentials.js +1 -1
  225. package/dist/plugins/mailerlite/src/index.js +1 -1
  226. package/dist/plugins/mailgun/src/credentials.js +1 -1
  227. package/dist/plugins/mailgun/src/index.js +1 -1
  228. package/dist/plugins/mailjet/src/credentials.js +1 -1
  229. package/dist/plugins/mailjet/src/index.js +1 -1
  230. package/dist/plugins/mandrill/src/credentials.js +1 -1
  231. package/dist/plugins/mandrill/src/index.js +1 -1
  232. package/dist/plugins/marketstack/src/credentials.js +1 -1
  233. package/dist/plugins/marketstack/src/index.js +1 -1
  234. package/dist/plugins/matrix/src/credentials.js +1 -1
  235. package/dist/plugins/matrix/src/index.js +1 -1
  236. package/dist/plugins/mattermost/src/credentials.js +1 -1
  237. package/dist/plugins/mattermost/src/index.js +1 -1
  238. package/dist/plugins/mautic/src/credentials.js +1 -1
  239. package/dist/plugins/mautic/src/index.js +1 -1
  240. package/dist/plugins/medium/src/credentials.js +1 -1
  241. package/dist/plugins/medium/src/index.js +1 -1
  242. package/dist/plugins/messagebird/src/credentials.js +1 -1
  243. package/dist/plugins/messagebird/src/index.js +1 -1
  244. package/dist/plugins/metabase/src/credentials.js +1 -1
  245. package/dist/plugins/metabase/src/index.js +1 -1
  246. package/dist/plugins/microsoftFiles/src/index.js +10 -1
  247. package/dist/plugins/misp/src/credentials.js +1 -1
  248. package/dist/plugins/misp/src/index.js +1 -1
  249. package/dist/plugins/mocean/src/credentials.js +1 -1
  250. package/dist/plugins/mocean/src/index.js +1 -1
  251. package/dist/plugins/monday/src/credentials.js +1 -1
  252. package/dist/plugins/monday/src/index.js +1 -1
  253. package/dist/plugins/monicaCrm/src/credentials.js +1 -1
  254. package/dist/plugins/monicaCrm/src/index.js +1 -1
  255. package/dist/plugins/msg91/src/credentials.js +1 -1
  256. package/dist/plugins/msg91/src/index.js +1 -1
  257. package/dist/plugins/nasa/src/credentials.js +1 -1
  258. package/dist/plugins/nasa/src/index.js +1 -1
  259. package/dist/plugins/netlify/src/credentials.js +1 -1
  260. package/dist/plugins/netlify/src/index.js +1 -1
  261. package/dist/plugins/netscalerAdc/src/credentials.js +1 -1
  262. package/dist/plugins/netscalerAdc/src/index.js +1 -1
  263. package/dist/plugins/nextcloud/src/credentials.js +1 -2
  264. package/dist/plugins/nextcloud/src/index.js +1 -1
  265. package/dist/plugins/nocodb/src/credentials.js +1 -1
  266. package/dist/plugins/nocodb/src/index.js +1 -1
  267. package/dist/plugins/notion/src/credentials.js +1 -1
  268. package/dist/plugins/notion/src/index.js +1 -1
  269. package/dist/plugins/npm/src/credentials.js +1 -1
  270. package/dist/plugins/npm/src/index.js +1 -1
  271. package/dist/plugins/odoo/src/credentials.js +1 -1
  272. package/dist/plugins/odoo/src/index.js +1 -2
  273. package/dist/plugins/okta/src/credentials.js +1 -1
  274. package/dist/plugins/okta/src/index.js +1 -2
  275. package/dist/plugins/oneSimpleApi/src/credentials.js +1 -1
  276. package/dist/plugins/oneSimpleApi/src/index.js +1 -1
  277. package/dist/plugins/onfleet/src/credentials.js +1 -1
  278. package/dist/plugins/onfleet/src/index.js +1 -1
  279. package/dist/plugins/openai/src/credentials.js +1 -1
  280. package/dist/plugins/openai/src/index.js +1 -1
  281. package/dist/plugins/openweathermap/src/credentials.js +1 -1
  282. package/dist/plugins/openweathermap/src/index.js +1 -1
  283. package/dist/plugins/oura/src/credentials.js +1 -1
  284. package/dist/plugins/oura/src/index.js +1 -1
  285. package/dist/plugins/paddle/src/credentials.js +1 -1
  286. package/dist/plugins/paddle/src/index.js +1 -1
  287. package/dist/plugins/pagerduty/src/credentials.js +1 -1
  288. package/dist/plugins/pagerduty/src/index.js +1 -1
  289. package/dist/plugins/parallel/src/credentials.js +1 -1
  290. package/dist/plugins/parallel/src/index.js +15 -1
  291. package/dist/plugins/paypal/src/credentials.js +1 -1
  292. package/dist/plugins/paypal/src/index.js +1 -1
  293. package/dist/plugins/peekalink/src/credentials.js +1 -1
  294. package/dist/plugins/peekalink/src/index.js +1 -1
  295. package/dist/plugins/phantombuster/src/credentials.js +1 -1
  296. package/dist/plugins/phantombuster/src/index.js +1 -1
  297. package/dist/plugins/philipsHue/src/credentials.js +1 -1
  298. package/dist/plugins/philipsHue/src/index.js +1 -1
  299. package/dist/plugins/pipedrive/src/credentials.js +1 -1
  300. package/dist/plugins/pipedrive/src/index.js +1 -1
  301. package/dist/plugins/plaud/src/shared.js +1 -2
  302. package/dist/plugins/plivo/src/credentials.js +1 -1
  303. package/dist/plugins/plivo/src/index.js +1 -1
  304. package/dist/plugins/posthog/src/credentials.js +1 -1
  305. package/dist/plugins/posthog/src/index.js +1 -1
  306. package/dist/plugins/profitwell/src/credentials.js +1 -1
  307. package/dist/plugins/profitwell/src/index.js +1 -1
  308. package/dist/plugins/pushbullet/src/credentials.js +1 -1
  309. package/dist/plugins/pushbullet/src/index.js +1 -1
  310. package/dist/plugins/pushcut/src/credentials.js +1 -1
  311. package/dist/plugins/pushcut/src/index.js +1 -1
  312. package/dist/plugins/pushover/src/credentials.js +1 -1
  313. package/dist/plugins/pushover/src/index.js +1 -1
  314. package/dist/plugins/quickbase/src/credentials.js +1 -1
  315. package/dist/plugins/quickbase/src/index.js +1 -1
  316. package/dist/plugins/quickbooks/src/credentials.js +1 -1
  317. package/dist/plugins/quickbooks/src/index.js +1 -1
  318. package/dist/plugins/raindrop/src/credentials.js +1 -1
  319. package/dist/plugins/raindrop/src/index.js +1 -1
  320. package/dist/plugins/recraft/src/credentials.js +1 -1
  321. package/dist/plugins/recraft/src/index.js +1 -1
  322. package/dist/plugins/reddit/src/credentials.js +1 -1
  323. package/dist/plugins/reddit/src/index.js +1 -1
  324. package/dist/plugins/replicate/src/credentials.js +1 -1
  325. package/dist/plugins/replicate/src/index.js +1 -1
  326. package/dist/plugins/rocketchat/src/credentials.js +1 -1
  327. package/dist/plugins/rocketchat/src/index.js +1 -1
  328. package/dist/plugins/rundeck/src/credentials.js +1 -1
  329. package/dist/plugins/rundeck/src/index.js +1 -1
  330. package/dist/plugins/salesforce/src/credentials.js +1 -2
  331. package/dist/plugins/salesforce/src/shared.js +1 -2
  332. package/dist/plugins/salesforce/src/sobjects.js +1 -1
  333. package/dist/plugins/salesmate/src/credentials.js +1 -1
  334. package/dist/plugins/salesmate/src/index.js +1 -1
  335. package/dist/plugins/securityScorecard/src/credentials.js +1 -1
  336. package/dist/plugins/securityScorecard/src/index.js +1 -1
  337. package/dist/plugins/segment/src/credentials.js +1 -1
  338. package/dist/plugins/segment/src/index.js +1 -1
  339. package/dist/plugins/sendgrid/src/credentials.js +1 -1
  340. package/dist/plugins/sendgrid/src/index.js +1 -2
  341. package/dist/plugins/sendy/src/credentials.js +1 -1
  342. package/dist/plugins/sendy/src/index.js +1 -1
  343. package/dist/plugins/sentry/src/credentials.js +1 -1
  344. package/dist/plugins/sentry/src/index.js +1 -1
  345. package/dist/plugins/servicenow/src/credentials.js +1 -1
  346. package/dist/plugins/servicenow/src/index.js +1 -1
  347. package/dist/plugins/shiftAtlas/src/graph.js +2 -1
  348. package/dist/plugins/shiftAtlas/src/shared.js +1 -1
  349. package/dist/plugins/shiftBwm/src/shared.js +2 -4
  350. package/dist/plugins/shiftCrm/src/access.js +2 -1
  351. package/dist/plugins/shiftCrm/src/accounts.js +2 -1
  352. package/dist/plugins/shiftCrm/src/imports.js +2 -1
  353. package/dist/plugins/shiftCrm/src/opportunities.js +2 -1
  354. package/dist/plugins/shiftCrm/src/people.js +2 -1
  355. package/dist/plugins/shiftCrm/src/records.js +2 -1
  356. package/dist/plugins/shiftCrm/src/shared.js +1 -1
  357. package/dist/plugins/shiftCrm/src/tasks.js +2 -1
  358. package/dist/plugins/shiftObjects/src/objects.js +2 -1
  359. package/dist/plugins/shiftOcr/src/index.js +2 -1
  360. package/dist/plugins/shiftPages/src/pages.js +2 -1
  361. package/dist/plugins/shiftPages/src/shared.js +3 -2
  362. package/dist/plugins/shiftTranscription/src/shared.js +1 -1
  363. package/dist/plugins/shiftTranscription/src/transcription.js +2 -1
  364. package/dist/plugins/shiftWork/src/issue-views.js +2 -1
  365. package/dist/plugins/shiftWork/src/issues.js +2 -1
  366. package/dist/plugins/shiftWork/src/projects.js +2 -1
  367. package/dist/plugins/shiftWork/src/shared.js +1 -1
  368. package/dist/plugins/shopify/src/credentials.js +1 -1
  369. package/dist/plugins/shopify/src/index.js +1 -1
  370. package/dist/plugins/signl4/src/credentials.js +1 -1
  371. package/dist/plugins/signl4/src/index.js +1 -1
  372. package/dist/plugins/slack/src/credentials.js +1 -1
  373. package/dist/plugins/slack/src/index.js +1 -1
  374. package/dist/plugins/sms77/src/credentials.js +1 -1
  375. package/dist/plugins/sms77/src/index.js +1 -1
  376. package/dist/plugins/splunk/src/credentials.js +1 -1
  377. package/dist/plugins/splunk/src/index.js +1 -1
  378. package/dist/plugins/spotify/src/credentials.js +1 -1
  379. package/dist/plugins/spotify/src/index.js +1 -1
  380. package/dist/plugins/stackby/src/credentials.js +1 -1
  381. package/dist/plugins/stackby/src/index.js +1 -1
  382. package/dist/plugins/steel/src/auth.js +1 -1
  383. package/dist/plugins/steel/src/browser.js +1 -1
  384. package/dist/plugins/steel/src/captchas.js +1 -1
  385. package/dist/plugins/steel/src/extensions.js +1 -1
  386. package/dist/plugins/steel/src/files.js +1 -1
  387. package/dist/plugins/steel/src/profiles.js +1 -1
  388. package/dist/plugins/steel/src/sessions.js +1 -1
  389. package/dist/plugins/steel/src/shared.js +1 -1
  390. package/dist/plugins/storyblok/src/credentials.js +1 -1
  391. package/dist/plugins/storyblok/src/index.js +1 -1
  392. package/dist/plugins/strapi/src/credentials.js +1 -1
  393. package/dist/plugins/strapi/src/index.js +1 -1
  394. package/dist/plugins/strava/src/credentials.js +1 -1
  395. package/dist/plugins/strava/src/index.js +1 -1
  396. package/dist/plugins/stripe/src/credentials.js +1 -1
  397. package/dist/plugins/stripe/src/index.js +1 -1
  398. package/dist/plugins/supabase/src/credentials.js +1 -1
  399. package/dist/plugins/supabase/src/index.js +1 -1
  400. package/dist/plugins/syncromsp/src/credentials.js +1 -1
  401. package/dist/plugins/syncromsp/src/index.js +1 -1
  402. package/dist/plugins/tapfiliate/src/credentials.js +1 -1
  403. package/dist/plugins/tapfiliate/src/index.js +1 -1
  404. package/dist/plugins/telegram/src/credentials.js +1 -1
  405. package/dist/plugins/telegram/src/index.js +1 -1
  406. package/dist/plugins/thehive/src/credentials.js +1 -1
  407. package/dist/plugins/thehive/src/index.js +1 -1
  408. package/dist/plugins/thehiveProject/src/credentials.js +1 -1
  409. package/dist/plugins/thehiveProject/src/index.js +1 -1
  410. package/dist/plugins/todoist/src/credentials.js +1 -1
  411. package/dist/plugins/todoist/src/index.js +1 -1
  412. package/dist/plugins/together/src/credentials.js +1 -1
  413. package/dist/plugins/together/src/index.js +1 -1
  414. package/dist/plugins/travisci/src/credentials.js +1 -1
  415. package/dist/plugins/travisci/src/index.js +1 -1
  416. package/dist/plugins/trello/src/credentials.js +1 -1
  417. package/dist/plugins/trello/src/index.js +1 -1
  418. package/dist/plugins/twake/src/credentials.js +1 -1
  419. package/dist/plugins/twake/src/index.js +1 -1
  420. package/dist/plugins/twilio/src/credentials.js +1 -1
  421. package/dist/plugins/twilio/src/index.js +1 -1
  422. package/dist/plugins/twist/src/credentials.js +1 -1
  423. package/dist/plugins/twist/src/index.js +1 -1
  424. package/dist/plugins/twitter/src/credentials.js +1 -1
  425. package/dist/plugins/twitter/src/index.js +1 -1
  426. package/dist/plugins/typesafe/src/credentials.js +1 -1
  427. package/dist/plugins/typesafe/src/shared.js +1 -1
  428. package/dist/plugins/unleashedSoftware/src/credentials.js +1 -1
  429. package/dist/plugins/unleashedSoftware/src/index.js +1 -1
  430. package/dist/plugins/uplead/src/credentials.js +1 -1
  431. package/dist/plugins/uplead/src/index.js +1 -1
  432. package/dist/plugins/uproc/src/credentials.js +1 -1
  433. package/dist/plugins/uproc/src/index.js +1 -1
  434. package/dist/plugins/uptimerobot/src/credentials.js +1 -1
  435. package/dist/plugins/uptimerobot/src/index.js +1 -1
  436. package/dist/plugins/urlscanio/src/credentials.js +1 -1
  437. package/dist/plugins/urlscanio/src/index.js +1 -1
  438. package/dist/plugins/vercel/src/credentials.js +1 -1
  439. package/dist/plugins/vercel/src/deployments.js +1 -1
  440. package/dist/plugins/vercel/src/env.js +1 -1
  441. package/dist/plugins/vercel/src/projects.js +1 -1
  442. package/dist/plugins/vercel/src/shared.js +1 -2
  443. package/dist/plugins/vero/src/credentials.js +1 -1
  444. package/dist/plugins/vero/src/index.js +1 -1
  445. package/dist/plugins/vonage/src/credentials.js +1 -1
  446. package/dist/plugins/vonage/src/index.js +1 -1
  447. package/dist/plugins/wekan/src/credentials.js +1 -1
  448. package/dist/plugins/wekan/src/index.js +1 -1
  449. package/dist/plugins/wolt/src/account.js +1 -1
  450. package/dist/plugins/wolt/src/credentials.js +1 -1
  451. package/dist/plugins/wolt/src/index.js +1 -1
  452. package/dist/plugins/wolt/src/shared.js +1 -2
  453. package/dist/plugins/woocommerce/src/credentials.js +1 -1
  454. package/dist/plugins/woocommerce/src/index.js +1 -1
  455. package/dist/plugins/wordpress/src/credentials.js +1 -1
  456. package/dist/plugins/wordpress/src/index.js +1 -1
  457. package/dist/plugins/xai/src/credentials.js +1 -1
  458. package/dist/plugins/xai/src/index.js +1 -1
  459. package/dist/plugins/xero/src/credentials.js +1 -1
  460. package/dist/plugins/xero/src/index.js +1 -1
  461. package/dist/plugins/yourls/src/credentials.js +1 -1
  462. package/dist/plugins/yourls/src/index.js +1 -1
  463. package/dist/plugins/zammad/src/credentials.js +1 -1
  464. package/dist/plugins/zammad/src/index.js +1 -1
  465. package/dist/plugins/zendesk/src/credentials.js +1 -1
  466. package/dist/plugins/zendesk/src/index.js +1 -1
  467. package/dist/plugins/zoho/src/credentials.js +1 -1
  468. package/dist/plugins/zoho/src/index.js +1 -1
  469. package/dist/plugins/zoom/src/credentials.js +1 -1
  470. package/dist/plugins/zoom/src/index.js +1 -1
  471. package/dist/plugins/zulip/src/credentials.js +1 -1
  472. package/dist/plugins/zulip/src/index.js +1 -1
  473. package/package.json +3 -2
@@ -8,9 +8,9 @@ declare const messages: {
8
8
  readonly binding_changed: "Credential binding identity changed";
9
9
  readonly unsupported_operation: "Authentication operation is not supported";
10
10
  readonly invalid_response: "Invalid provider response";
11
- readonly request_failed: "OAuth token request failed; provider outcome may be unknown";
12
- readonly provider_rejected: "OAuth provider rejected the token request";
13
- readonly reconnect_required: "OAuth grant is invalid; reconnect the account";
11
+ readonly request_failed: "Token request failed; provider outcome may be unknown";
12
+ readonly provider_rejected: "Provider rejected the token request";
13
+ readonly reconnect_required: "Credential is no longer valid; reconnect the account";
14
14
  };
15
15
  export type AuthErrorCode = keyof typeof messages;
16
16
  /** Safe to serialize. No raw response, endpoint URL, credential, or nested cause. */
@@ -8,9 +8,9 @@ const messages = {
8
8
  binding_changed: "Credential binding identity changed",
9
9
  unsupported_operation: "Authentication operation is not supported",
10
10
  invalid_response: "Invalid provider response",
11
- request_failed: "OAuth token request failed; provider outcome may be unknown",
12
- provider_rejected: "OAuth provider rejected the token request",
13
- reconnect_required: "OAuth grant is invalid; reconnect the account",
11
+ request_failed: "Token request failed; provider outcome may be unknown",
12
+ provider_rejected: "Provider rejected the token request",
13
+ reconnect_required: "Credential is no longer valid; reconnect the account",
14
14
  };
15
15
  /** Safe to serialize. No raw response, endpoint URL, credential, or nested cause. */
16
16
  export class AuthError extends Error {
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The plugin side of AWS: one declaration for an AWS connection — an
3
+ * access key, or a role it assumes — and the request paths of the AWS
4
+ * protocols, all signed through the declared credential.
5
+ */
6
+ import type { ActionContext } from "../plugin/types.js";
7
+ import type { CredentialDeclaration, CredentialProbe, CredentialTarget, HttpMethod } from "./types.js";
8
+ /**
9
+ * An AWS endpoint as a declared target: the service's regional HTTPS
10
+ * endpoint, signed for that service and region. `X-Amz-Target`, which
11
+ * names the operation of a JSON-protocol call, is always allowed.
12
+ */
13
+ export declare function awsTarget(service: string, region: string, options?: {
14
+ methods?: HttpMethod[];
15
+ allowedHeaders?: string[];
16
+ timeoutMs?: number;
17
+ maxResponseBytes?: number;
18
+ }): CredentialTarget;
19
+ export interface AwsCredentialSpec {
20
+ /** Credential type id; one per provider family, shared by its plugins. */
21
+ id: string;
22
+ /** The endpoints the plugin calls (`awsTarget`), from public config. */
23
+ targets: (config: Readonly<Record<string, unknown>>) => Record<string, CredentialTarget>;
24
+ probe?: CredentialProbe;
25
+ }
26
+ /**
27
+ * An AWS connection's declaration. The access key — `accessKeyId`,
28
+ * `secretAccessKey`, and a session's `sessionToken` — is the secret; the
29
+ * rest is public config:
30
+ *
31
+ * - `roleArn` selects `assumeRole`: the key only assumes the role, and
32
+ * requests sign with its sessions, renewed before they expire. Without
33
+ * it, `accessKey` signs with the key itself.
34
+ * - `roleSessionName` (default `runline`), `roleExternalId` and
35
+ * `roleDurationSeconds` shape each session request.
36
+ * - `stsRegion`, else `region`, else `us-east-1`, is where sessions are
37
+ * requested.
38
+ */
39
+ export declare function awsCredential(spec: AwsCredentialSpec): CredentialDeclaration;
40
+ /**
41
+ * A failed AWS response by its status and the AWS error code it names
42
+ * (`AccessDeniedException`, `InvalidInstanceId.NotFound`). The message
43
+ * AWS sends with it, which can quote request data, never reaches the
44
+ * error. The status and code ride on the error for callers that branch.
45
+ */
46
+ export declare function awsFailed(plugin: string, response: Response): Promise<Error & {
47
+ status: number;
48
+ code?: string;
49
+ }>;
50
+ /**
51
+ * One call of an AWS JSON-protocol service (SSM, CloudWatch Logs,
52
+ * Secrets Manager, CloudWatch): `operation` is the full
53
+ * `X-Amz-Target`, e.g. `AmazonSSM.SendCommand`; `version` is the
54
+ * service's JSON protocol version.
55
+ */
56
+ export declare function awsJson<T = unknown>(ctx: ActionContext, declaration: CredentialDeclaration, plugin: string, call: {
57
+ target: string;
58
+ operation: string;
59
+ version: "1.0" | "1.1";
60
+ input?: unknown;
61
+ }): Promise<T>;
62
+ /**
63
+ * One call of an AWS Query-protocol service (EC2, STS): the action's
64
+ * parameters as the API names them, lists already numbered
65
+ * (`Filter.1.Name`). Answers the `<Action>Response` element as data;
66
+ * `awsList` reads its lists.
67
+ */
68
+ export declare function awsQuery(ctx: ActionContext, declaration: CredentialDeclaration, plugin: string, call: {
69
+ target: string;
70
+ action: string;
71
+ version: string;
72
+ params?: Record<string, string | number | boolean | undefined>;
73
+ }): Promise<Record<string, unknown>>;
74
+ /**
75
+ * The entries of an AWS XML list: EC2's `<item>` and the query
76
+ * services' `<member>` elements, one or many, and none for an empty or
77
+ * absent list.
78
+ */
79
+ export declare function awsList(value: unknown): unknown[];
@@ -0,0 +1,179 @@
1
+ /**
2
+ * The plugin side of AWS: one declaration for an AWS connection — an
3
+ * access key, or a role it assumes — and the request paths of the AWS
4
+ * protocols, all signed through the declared credential.
5
+ */
6
+ import * as t from "typebox";
7
+ import { AuthError } from "../auth/errors.js";
8
+ import { awsEndpoint, awsErrorCode, awsRole, parseAwsXml } from "./aws.js";
9
+ import { credentialRequest, errorIdentifier, failureMessage, jsonAnswer, } from "./plugin.js";
10
+ import { AwsAccessKeySchema, AwsSessionSchema } from "./registry.js";
11
+ const STRICT = { additionalProperties: false };
12
+ /**
13
+ * An AWS endpoint as a declared target: the service's regional HTTPS
14
+ * endpoint, signed for that service and region. `X-Amz-Target`, which
15
+ * names the operation of a JSON-protocol call, is always allowed.
16
+ */
17
+ export function awsTarget(service, region, options = {}) {
18
+ // The endpoint refuses a malformed service or region, so the scope is sound.
19
+ return {
20
+ baseUrl: awsEndpoint(service, region),
21
+ methods: options.methods ?? ["GET", "POST"],
22
+ allowedHeaders: ["X-Amz-Target", ...(options.allowedHeaders ?? [])],
23
+ aws: { service, region },
24
+ ...(options.timeoutMs !== undefined
25
+ ? { timeoutMs: options.timeoutMs }
26
+ : {}),
27
+ ...(options.maxResponseBytes !== undefined
28
+ ? { maxResponseBytes: options.maxResponseBytes }
29
+ : {}),
30
+ };
31
+ }
32
+ /** A whole number from config, which a CLI or environment gives as a string. */
33
+ function configInteger(value) {
34
+ if (value === undefined || value === null || value === "")
35
+ return undefined;
36
+ const number = typeof value === "string" ? Number(value) : value;
37
+ if (typeof number !== "number" || !Number.isInteger(number))
38
+ throw new AuthError("invalid_credentials");
39
+ return number;
40
+ }
41
+ function configString(value) {
42
+ if (value === undefined || value === null || value === "")
43
+ return undefined;
44
+ if (typeof value !== "string")
45
+ throw new AuthError("invalid_credentials");
46
+ return value;
47
+ }
48
+ /**
49
+ * An AWS connection's declaration. The access key — `accessKeyId`,
50
+ * `secretAccessKey`, and a session's `sessionToken` — is the secret; the
51
+ * rest is public config:
52
+ *
53
+ * - `roleArn` selects `assumeRole`: the key only assumes the role, and
54
+ * requests sign with its sessions, renewed before they expire. Without
55
+ * it, `accessKey` signs with the key itself.
56
+ * - `roleSessionName` (default `runline`), `roleExternalId` and
57
+ * `roleDurationSeconds` shape each session request.
58
+ * - `stsRegion`, else `region`, else `us-east-1`, is where sessions are
59
+ * requested.
60
+ */
61
+ export function awsCredential(spec) {
62
+ const key = { credential: AwsAccessKeySchema };
63
+ const localSecret = {
64
+ accessKeyId: { field: "accessKeyId" },
65
+ secretAccessKey: { field: "secretAccessKey" },
66
+ sessionToken: { field: "sessionToken" },
67
+ };
68
+ return (config) => {
69
+ const targets = spec.targets(config);
70
+ const probe = spec.probe ? { probe: spec.probe } : {};
71
+ const roleArn = configString(config.roleArn);
72
+ const externalId = configString(config.roleExternalId);
73
+ const durationSeconds = configInteger(config.roleDurationSeconds);
74
+ return {
75
+ type: {
76
+ id: spec.id,
77
+ methods: {
78
+ accessKey: {
79
+ schema: t.Object(key, STRICT),
80
+ authentication: { kind: "awsSigV4", field: "credential" },
81
+ targets,
82
+ ...probe,
83
+ },
84
+ assumeRole: {
85
+ schema: t.Object({ ...key, session: t.Optional(AwsSessionSchema) }, STRICT),
86
+ authentication: {
87
+ kind: "awsSigV4",
88
+ field: "credential",
89
+ assumeRole: { sessionField: "session" },
90
+ },
91
+ targets,
92
+ ...probe,
93
+ },
94
+ },
95
+ },
96
+ localSecret,
97
+ ...(roleArn === undefined
98
+ ? { method: "accessKey" }
99
+ : {
100
+ method: "assumeRole",
101
+ awsRole: awsRole({
102
+ roleArn,
103
+ sessionName: configString(config.roleSessionName) ?? "runline",
104
+ ...(externalId === undefined ? {} : { externalId }),
105
+ ...(durationSeconds === undefined ? {} : { durationSeconds }),
106
+ region: configString(config.stsRegion) ??
107
+ configString(config.region) ??
108
+ "us-east-1",
109
+ }),
110
+ }),
111
+ };
112
+ };
113
+ }
114
+ /**
115
+ * A failed AWS response by its status and the AWS error code it names
116
+ * (`AccessDeniedException`, `InvalidInstanceId.NotFound`). The message
117
+ * AWS sends with it, which can quote request data, never reaches the
118
+ * error. The status and code ride on the error for callers that branch.
119
+ */
120
+ export async function awsFailed(plugin, response) {
121
+ const code = errorIdentifier(awsErrorCode(await response.text()));
122
+ return Object.assign(new Error(failureMessage(plugin, response.status, { code })), { status: response.status, ...(code ? { code } : {}) });
123
+ }
124
+ /**
125
+ * One call of an AWS JSON-protocol service (SSM, CloudWatch Logs,
126
+ * Secrets Manager, CloudWatch): `operation` is the full
127
+ * `X-Amz-Target`, e.g. `AmazonSSM.SendCommand`; `version` is the
128
+ * service's JSON protocol version.
129
+ */
130
+ export async function awsJson(ctx, declaration, plugin, call) {
131
+ const response = await credentialRequest(ctx, declaration, {
132
+ target: call.target,
133
+ path: "",
134
+ method: "POST",
135
+ headers: {
136
+ "Content-Type": `application/x-amz-json-${call.version}`,
137
+ "X-Amz-Target": call.operation,
138
+ },
139
+ body: JSON.stringify(call.input ?? {}),
140
+ });
141
+ if (!response.ok)
142
+ throw await awsFailed(plugin, response);
143
+ return jsonAnswer(response);
144
+ }
145
+ /**
146
+ * One call of an AWS Query-protocol service (EC2, STS): the action's
147
+ * parameters as the API names them, lists already numbered
148
+ * (`Filter.1.Name`). Answers the `<Action>Response` element as data;
149
+ * `awsList` reads its lists.
150
+ */
151
+ export async function awsQuery(ctx, declaration, plugin, call) {
152
+ const response = await credentialRequest(ctx, declaration, {
153
+ target: call.target,
154
+ path: "",
155
+ method: "POST",
156
+ headers: { Accept: "text/xml" },
157
+ form: { Action: call.action, Version: call.version, ...call.params },
158
+ });
159
+ if (!response.ok)
160
+ throw await awsFailed(plugin, response);
161
+ const answer = parseAwsXml(await response.text())[`${call.action}Response`];
162
+ if (!answer || typeof answer !== "object")
163
+ throw new AuthError("invalid_response");
164
+ return answer;
165
+ }
166
+ /**
167
+ * The entries of an AWS XML list: EC2's `<item>` and the query
168
+ * services' `<member>` elements, one or many, and none for an empty or
169
+ * absent list.
170
+ */
171
+ export function awsList(value) {
172
+ if (!value || typeof value !== "object")
173
+ return [];
174
+ const holder = value;
175
+ const entries = holder.item ?? holder.member;
176
+ if (entries === undefined || entries === "")
177
+ return [];
178
+ return Array.isArray(entries) ? entries : [entries];
179
+ }
@@ -0,0 +1,41 @@
1
+ import type { AwsAccessKey, AwsRole, AwsSession } from "./types.js";
2
+ /** A region from public config; anything else would sign for the wrong place. */
3
+ export declare function awsRegion(value: unknown): string;
4
+ /** Whether a target's signing scope names a well-formed service and region. */
5
+ export declare function isAwsScope(value: unknown): boolean;
6
+ /**
7
+ * The regional HTTPS endpoint of `service`: `https://<service>.<region>.
8
+ * amazonaws.com/`, or `.amazonaws.com.cn` in the China partition.
9
+ */
10
+ export declare function awsEndpoint(service: string, region: string): string;
11
+ /**
12
+ * An access key that can sign: an ID and a session token that go into
13
+ * headers as they are (`secret`), and a secret that only keys the
14
+ * signature. Anything else is refused before any request.
15
+ */
16
+ export declare function awsAccessKey(value: unknown): AwsAccessKey;
17
+ /** A role as STS accepts it; anything else is refused before any request. */
18
+ export declare function awsRole(role: AwsRole): AwsRole;
19
+ /**
20
+ * An AWS XML answer as plain data. Element text is a string; lists are
21
+ * `item` or `member` entries. AWS sends no document type, and one that
22
+ * declares entities could expand without bound, so a DOCTYPE is refused.
23
+ */
24
+ export declare function parseAwsXml(text: string): Record<string, unknown>;
25
+ /**
26
+ * An AWS error's code, from any of its envelopes: a JSON `__type`
27
+ * (`com.amazonaws.ssm#InvalidInstanceId` → `InvalidInstanceId`) or `code`,
28
+ * a query `ErrorResponse`, or EC2's `Response.Errors`. Undefined when the
29
+ * body names none.
30
+ */
31
+ export declare function awsErrorCode(text: string): string | undefined;
32
+ export interface AssumeRoleOptions {
33
+ fetch: typeof globalThis.fetch;
34
+ timeoutMs: number;
35
+ }
36
+ /**
37
+ * A new session for `role`, requested from STS with `key`. A refused
38
+ * key is reconnect_required; any other refusal (no permission to assume
39
+ * the role, a trust policy mismatch) is provider_rejected.
40
+ */
41
+ export declare function assumeAwsRole(key: AwsAccessKey, role: AwsRole, options: AssumeRoleOptions): Promise<Omit<AwsSession, "revision">>;
@@ -0,0 +1,213 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ import { AuthError } from "../auth/errors.js";
3
+ import { sendResource } from "./http.js";
4
+ import { secret } from "./policy.js";
5
+ import { signSigV4 } from "./sigv4.js";
6
+ /**
7
+ * AWS endpoints, roles and responses: what SigV4 methods sign for, and
8
+ * how a role session is issued. The signature itself is sigv4.ts.
9
+ */
10
+ /** A region code: `us-east-1`, `eu-central-2`, `us-gov-west-1`, `cn-north-1`. */
11
+ const REGION = /^[a-z]{2}(?:-[a-z]+)+-\d{1,2}$/;
12
+ /** A service's endpoint prefix: `ec2`, `ssm`, `logs`, `monitoring`. */
13
+ const SERVICE = /^[a-z0-9][a-z0-9-]{0,62}$/;
14
+ /** A region from public config; anything else would sign for the wrong place. */
15
+ export function awsRegion(value) {
16
+ if (typeof value !== "string" || !REGION.test(value))
17
+ throw new AuthError("invalid_credentials");
18
+ return value;
19
+ }
20
+ /** Whether a target's signing scope names a well-formed service and region. */
21
+ export function isAwsScope(value) {
22
+ const scope = value;
23
+ return (!!scope &&
24
+ typeof scope.service === "string" &&
25
+ SERVICE.test(scope.service) &&
26
+ typeof scope.region === "string" &&
27
+ REGION.test(scope.region));
28
+ }
29
+ /**
30
+ * The regional HTTPS endpoint of `service`: `https://<service>.<region>.
31
+ * amazonaws.com/`, or `.amazonaws.com.cn` in the China partition.
32
+ */
33
+ export function awsEndpoint(service, region) {
34
+ if (!SERVICE.test(service))
35
+ throw new AuthError("invalid_definition");
36
+ const domain = awsRegion(region).startsWith("cn-")
37
+ ? "amazonaws.com.cn"
38
+ : "amazonaws.com";
39
+ return `https://${service}.${region}.${domain}/`;
40
+ }
41
+ /**
42
+ * An access key that can sign: an ID and a session token that go into
43
+ * headers as they are (`secret`), and a secret that only keys the
44
+ * signature. Anything else is refused before any request.
45
+ */
46
+ export function awsAccessKey(value) {
47
+ const key = value;
48
+ if (typeof key?.secretAccessKey !== "string" || !key.secretAccessKey)
49
+ throw new AuthError("invalid_credentials");
50
+ return {
51
+ accessKeyId: secret(key.accessKeyId),
52
+ secretAccessKey: key.secretAccessKey,
53
+ ...(key.sessionToken === undefined
54
+ ? {}
55
+ : { sessionToken: secret(key.sessionToken) }),
56
+ };
57
+ }
58
+ /** `arn:<partition>:iam::<account>:role/<path/name>`, as IAM allows it. */
59
+ const ROLE_ARN = /^arn:aws(?:-[a-z]+)*:iam::\d{12}:role\/[\w+=,.@/-]{1,512}$/;
60
+ const SESSION_NAME = /^[\w+=,.@-]{2,64}$/;
61
+ const EXTERNAL_ID = /^[\w+=,.@:/-]{2,1224}$/;
62
+ /** A role as STS accepts it; anything else is refused before any request. */
63
+ export function awsRole(role) {
64
+ if (!ROLE_ARN.test(role.roleArn) ||
65
+ !SESSION_NAME.test(role.sessionName) ||
66
+ (role.externalId !== undefined && !EXTERNAL_ID.test(role.externalId)) ||
67
+ (role.durationSeconds !== undefined &&
68
+ (!Number.isInteger(role.durationSeconds) ||
69
+ role.durationSeconds < 900 ||
70
+ role.durationSeconds > 43_200)))
71
+ throw new AuthError("invalid_credentials");
72
+ return { ...role, region: awsRegion(role.region) };
73
+ }
74
+ const xml = new XMLParser({
75
+ ignoreAttributes: true,
76
+ ignoreDeclaration: true,
77
+ // Values stay strings: an account ID or a volume size is not ours to coerce.
78
+ parseTagValue: false,
79
+ trimValues: true,
80
+ processEntities: true,
81
+ htmlEntities: false,
82
+ });
83
+ /**
84
+ * An AWS XML answer as plain data. Element text is a string; lists are
85
+ * `item` or `member` entries. AWS sends no document type, and one that
86
+ * declares entities could expand without bound, so a DOCTYPE is refused.
87
+ */
88
+ export function parseAwsXml(text) {
89
+ if (/<!DOCTYPE/i.test(text))
90
+ throw new AuthError("invalid_response");
91
+ try {
92
+ const parsed = xml.parse(text, true);
93
+ if (!parsed || typeof parsed !== "object")
94
+ throw new Error();
95
+ return parsed;
96
+ }
97
+ catch {
98
+ throw new AuthError("invalid_response");
99
+ }
100
+ }
101
+ /**
102
+ * An AWS error's code, from any of its envelopes: a JSON `__type`
103
+ * (`com.amazonaws.ssm#InvalidInstanceId` → `InvalidInstanceId`) or `code`,
104
+ * a query `ErrorResponse`, or EC2's `Response.Errors`. Undefined when the
105
+ * body names none.
106
+ */
107
+ export function awsErrorCode(text) {
108
+ const trimmed = text.trim();
109
+ if (trimmed.startsWith("{")) {
110
+ try {
111
+ const body = JSON.parse(trimmed);
112
+ const code = body.__type ?? body.code ?? body.Code;
113
+ return typeof code === "string" ? code.split("#").pop() : undefined;
114
+ }
115
+ catch {
116
+ return undefined;
117
+ }
118
+ }
119
+ if (!trimmed.startsWith("<"))
120
+ return undefined;
121
+ try {
122
+ const body = parseAwsXml(trimmed);
123
+ const envelope = (body.ErrorResponse ?? body.Response);
124
+ const error = (envelope?.Error ??
125
+ envelope?.Errors?.Error);
126
+ const first = Array.isArray(error) ? error[0] : error;
127
+ return typeof first?.Code === "string" ? first.Code : undefined;
128
+ }
129
+ catch {
130
+ return undefined;
131
+ }
132
+ }
133
+ /** STS codes that mean the signing key itself is unusable: a reconnect, not a retry. */
134
+ const REJECTED_KEY = new Set([
135
+ "InvalidClientTokenId",
136
+ "SignatureDoesNotMatch",
137
+ "ExpiredToken",
138
+ "InvalidAccessKeyId",
139
+ "UnrecognizedClientException",
140
+ ]);
141
+ /**
142
+ * A new session for `role`, requested from STS with `key`. A refused
143
+ * key is reconnect_required; any other refusal (no permission to assume
144
+ * the role, a trust policy mismatch) is provider_rejected.
145
+ */
146
+ export async function assumeAwsRole(key, role, options) {
147
+ const signing = awsAccessKey(key);
148
+ const valid = awsRole(role);
149
+ const endpoint = new URL(awsEndpoint("sts", valid.region));
150
+ const body = Buffer.from(new URLSearchParams({
151
+ Action: "AssumeRole",
152
+ Version: "2011-06-15",
153
+ RoleArn: valid.roleArn,
154
+ RoleSessionName: valid.sessionName,
155
+ ...(valid.externalId === undefined
156
+ ? {}
157
+ : { ExternalId: valid.externalId }),
158
+ ...(valid.durationSeconds === undefined
159
+ ? {}
160
+ : { DurationSeconds: String(valid.durationSeconds) }),
161
+ }).toString());
162
+ const contentType = "application/x-www-form-urlencoded; charset=utf-8";
163
+ const now = Date.now();
164
+ const signed = signSigV4({
165
+ method: "POST",
166
+ host: endpoint.host,
167
+ path: endpoint.pathname,
168
+ query: [],
169
+ headers: [["content-type", contentType]],
170
+ body,
171
+ }, signing, { service: "sts", region: valid.region }, new Date(now));
172
+ let response;
173
+ try {
174
+ response = await sendResource(endpoint.toString(), "POST", new Headers({ "content-type": contentType, ...signed }), body, {
175
+ fetch: options.fetch,
176
+ timeoutMs: options.timeoutMs,
177
+ maxResponseBytes: 64 * 1024,
178
+ });
179
+ }
180
+ catch {
181
+ throw new AuthError("request_failed");
182
+ }
183
+ const text = await response.text();
184
+ if (!response.ok) {
185
+ const code = awsErrorCode(text);
186
+ throw new AuthError(code && REJECTED_KEY.has(code)
187
+ ? "reconnect_required"
188
+ : "provider_rejected", response.status);
189
+ }
190
+ const result = parseAwsXml(text).AssumeRoleResponse?.AssumeRoleResult?.Credentials;
191
+ const expiresAt = Date.parse(String(result?.Expiration));
192
+ if (typeof result?.SessionToken !== "string" ||
193
+ !Number.isSafeInteger(expiresAt) ||
194
+ expiresAt <= now)
195
+ throw new AuthError("invalid_response");
196
+ let session;
197
+ try {
198
+ session = awsAccessKey({
199
+ accessKeyId: result.AccessKeyId,
200
+ secretAccessKey: result.SecretAccessKey,
201
+ sessionToken: result.SessionToken,
202
+ });
203
+ }
204
+ catch {
205
+ throw new AuthError("invalid_response");
206
+ }
207
+ return {
208
+ accessKeyId: session.accessKeyId,
209
+ secretAccessKey: session.secretAccessKey,
210
+ sessionToken: result.SessionToken,
211
+ expiresAt,
212
+ };
213
+ }
@@ -0,0 +1,11 @@
1
+ import type { ActionContext } from "../plugin/types.js";
2
+ import { type CredentialBroker } from "./transport.js";
3
+ import type { CredentialDeclaration } from "./types.js";
4
+ /**
5
+ * Where one action call's authenticated requests go: the host's broker
6
+ * when it supplies one — the credentials then live with the host, and no
7
+ * local signer is built — else this process signs with its own
8
+ * connection, from the plugin's declaration. Plugin-side: the host-side
9
+ * `credentialBroker` option is what supplies `ctx.credentials`.
10
+ */
11
+ export declare function brokerFor(ctx: ActionContext, declaration: CredentialDeclaration): CredentialBroker;