runline 0.35.0 → 0.37.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 +82 -0
  4. package/dist/credentials/aws-plugin.js +184 -0
  5. package/dist/credentials/aws.d.ts +52 -0
  6. package/dist/credentials/aws.js +312 -0
  7. package/dist/credentials/broker.d.ts +11 -0
  8. package/dist/{plugins/_shared/credentialAdapter.js → credentials/broker.js} +96 -45
  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 +111 -27
  19. package/dist/credentials/types.d.ts +70 -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,82 @@
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
+ * - `awsProfile` names an AWS CLI profile (an SSO login) whose key this
39
+ * process signs with in place of a stored one; a host that stores the
40
+ * key ignores it.
41
+ */
42
+ export declare function awsCredential(spec: AwsCredentialSpec): CredentialDeclaration;
43
+ /**
44
+ * A failed AWS response by its status and the AWS error code it names
45
+ * (`AccessDeniedException`, `InvalidInstanceId.NotFound`). The message
46
+ * AWS sends with it, which can quote request data, never reaches the
47
+ * error. The status and code ride on the error for callers that branch.
48
+ */
49
+ export declare function awsFailed(plugin: string, response: Response): Promise<Error & {
50
+ status: number;
51
+ code?: string;
52
+ }>;
53
+ /**
54
+ * One call of an AWS JSON-protocol service (SSM, CloudWatch Logs,
55
+ * Secrets Manager, CloudWatch): `operation` is the full
56
+ * `X-Amz-Target`, e.g. `AmazonSSM.SendCommand`; `version` is the
57
+ * service's JSON protocol version.
58
+ */
59
+ export declare function awsJson<T = unknown>(ctx: ActionContext, declaration: CredentialDeclaration, plugin: string, call: {
60
+ target: string;
61
+ operation: string;
62
+ version: "1.0" | "1.1";
63
+ input?: unknown;
64
+ }): Promise<T>;
65
+ /**
66
+ * One call of an AWS Query-protocol service (EC2, STS): the action's
67
+ * parameters as the API names them, lists already numbered
68
+ * (`Filter.1.Name`). Answers the `<Action>Response` element as data;
69
+ * `awsList` reads its lists.
70
+ */
71
+ export declare function awsQuery(ctx: ActionContext, declaration: CredentialDeclaration, plugin: string, call: {
72
+ target: string;
73
+ action: string;
74
+ version: string;
75
+ params?: Record<string, string | number | boolean | undefined>;
76
+ }): Promise<Record<string, unknown>>;
77
+ /**
78
+ * The entries of an AWS XML list: EC2's `<item>` and the query
79
+ * services' `<member>` elements, one or many, and none for an empty or
80
+ * absent list.
81
+ */
82
+ export declare function awsList(value: unknown): unknown[];
@@ -0,0 +1,184 @@
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, awsProfileName, 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
+ * - `awsProfile` names an AWS CLI profile (an SSO login) whose key this
61
+ * process signs with in place of a stored one; a host that stores the
62
+ * key ignores it.
63
+ */
64
+ export function awsCredential(spec) {
65
+ const key = { credential: AwsAccessKeySchema };
66
+ const localSecret = {
67
+ accessKeyId: { field: "accessKeyId" },
68
+ secretAccessKey: { field: "secretAccessKey" },
69
+ sessionToken: { field: "sessionToken" },
70
+ };
71
+ return (config) => {
72
+ const targets = spec.targets(config);
73
+ const probe = spec.probe ? { probe: spec.probe } : {};
74
+ const profile = configString(config.awsProfile);
75
+ const awsProfile = profile === undefined ? undefined : awsProfileName(profile);
76
+ const roleArn = configString(config.roleArn);
77
+ const externalId = configString(config.roleExternalId);
78
+ const durationSeconds = configInteger(config.roleDurationSeconds);
79
+ return {
80
+ type: {
81
+ id: spec.id,
82
+ methods: {
83
+ accessKey: {
84
+ schema: t.Object(key, STRICT),
85
+ authentication: { kind: "awsSigV4", field: "credential" },
86
+ targets,
87
+ ...probe,
88
+ },
89
+ assumeRole: {
90
+ schema: t.Object({ ...key, session: t.Optional(AwsSessionSchema) }, STRICT),
91
+ authentication: {
92
+ kind: "awsSigV4",
93
+ field: "credential",
94
+ assumeRole: { sessionField: "session" },
95
+ },
96
+ targets,
97
+ ...probe,
98
+ },
99
+ },
100
+ },
101
+ ...(awsProfile === undefined ? { localSecret } : { awsProfile }),
102
+ ...(roleArn === undefined
103
+ ? { method: "accessKey" }
104
+ : {
105
+ method: "assumeRole",
106
+ awsRole: awsRole({
107
+ roleArn,
108
+ sessionName: configString(config.roleSessionName) ?? "runline",
109
+ ...(externalId === undefined ? {} : { externalId }),
110
+ ...(durationSeconds === undefined ? {} : { durationSeconds }),
111
+ region: configString(config.stsRegion) ??
112
+ configString(config.region) ??
113
+ "us-east-1",
114
+ }),
115
+ }),
116
+ };
117
+ };
118
+ }
119
+ /**
120
+ * A failed AWS response by its status and the AWS error code it names
121
+ * (`AccessDeniedException`, `InvalidInstanceId.NotFound`). The message
122
+ * AWS sends with it, which can quote request data, never reaches the
123
+ * error. The status and code ride on the error for callers that branch.
124
+ */
125
+ export async function awsFailed(plugin, response) {
126
+ const code = errorIdentifier(awsErrorCode(await response.text()));
127
+ return Object.assign(new Error(failureMessage(plugin, response.status, { code })), { status: response.status, ...(code ? { code } : {}) });
128
+ }
129
+ /**
130
+ * One call of an AWS JSON-protocol service (SSM, CloudWatch Logs,
131
+ * Secrets Manager, CloudWatch): `operation` is the full
132
+ * `X-Amz-Target`, e.g. `AmazonSSM.SendCommand`; `version` is the
133
+ * service's JSON protocol version.
134
+ */
135
+ export async function awsJson(ctx, declaration, plugin, call) {
136
+ const response = await credentialRequest(ctx, declaration, {
137
+ target: call.target,
138
+ path: "",
139
+ method: "POST",
140
+ headers: {
141
+ "Content-Type": `application/x-amz-json-${call.version}`,
142
+ "X-Amz-Target": call.operation,
143
+ },
144
+ body: JSON.stringify(call.input ?? {}),
145
+ });
146
+ if (!response.ok)
147
+ throw await awsFailed(plugin, response);
148
+ return jsonAnswer(response);
149
+ }
150
+ /**
151
+ * One call of an AWS Query-protocol service (EC2, STS): the action's
152
+ * parameters as the API names them, lists already numbered
153
+ * (`Filter.1.Name`). Answers the `<Action>Response` element as data;
154
+ * `awsList` reads its lists.
155
+ */
156
+ export async function awsQuery(ctx, declaration, plugin, call) {
157
+ const response = await credentialRequest(ctx, declaration, {
158
+ target: call.target,
159
+ path: "",
160
+ method: "POST",
161
+ headers: { Accept: "text/xml" },
162
+ form: { Action: call.action, Version: call.version, ...call.params },
163
+ });
164
+ if (!response.ok)
165
+ throw await awsFailed(plugin, response);
166
+ const answer = parseAwsXml(await response.text())[`${call.action}Response`];
167
+ if (!answer || typeof answer !== "object")
168
+ throw new AuthError("invalid_response");
169
+ return answer;
170
+ }
171
+ /**
172
+ * The entries of an AWS XML list: EC2's `<item>` and the query
173
+ * services' `<member>` elements, one or many, and none for an empty or
174
+ * absent list.
175
+ */
176
+ export function awsList(value) {
177
+ if (!value || typeof value !== "object")
178
+ return [];
179
+ const holder = value;
180
+ const entries = holder.item ?? holder.member;
181
+ if (entries === undefined || entries === "")
182
+ return [];
183
+ return Array.isArray(entries) ? entries : [entries];
184
+ }
@@ -0,0 +1,52 @@
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 profile name from config; anything else is refused before the CLI runs. */
18
+ export declare function awsProfileName(value: unknown): string;
19
+ /**
20
+ * The access key of an AWS CLI profile, as the CLI resolves it: an SSO
21
+ * login, an assumed role, or a key in `~/.aws/credentials`, through
22
+ * `aws configure export-credentials` (the `credential_process` contract).
23
+ * Held until five minutes before it expires; however many callers find
24
+ * it missing or stale, one CLI run serves them all, and a failed run is
25
+ * not held.
26
+ */
27
+ export declare function awsProfileKey(name: string): Promise<AwsAccessKey>;
28
+ /** A role as STS accepts it; anything else is refused before any request. */
29
+ export declare function awsRole(role: AwsRole): AwsRole;
30
+ /**
31
+ * An AWS XML answer as plain data. Element text is a string; lists are
32
+ * `item` or `member` entries. AWS sends no document type, and one that
33
+ * declares entities could expand without bound, so a DOCTYPE is refused.
34
+ */
35
+ export declare function parseAwsXml(text: string): Record<string, unknown>;
36
+ /**
37
+ * An AWS error's code, from any of its envelopes: a JSON `__type`
38
+ * (`com.amazonaws.ssm#InvalidInstanceId` → `InvalidInstanceId`) or `code`,
39
+ * a query `ErrorResponse`, or EC2's `Response.Errors`. Undefined when the
40
+ * body names none.
41
+ */
42
+ export declare function awsErrorCode(text: string): string | undefined;
43
+ export interface AssumeRoleOptions {
44
+ fetch: typeof globalThis.fetch;
45
+ timeoutMs: number;
46
+ }
47
+ /**
48
+ * A new session for `role`, requested from STS with `key`. A refused
49
+ * key is reconnect_required; any other refusal (no permission to assume
50
+ * the role, a trust policy mismatch) is provider_rejected.
51
+ */
52
+ export declare function assumeAwsRole(key: AwsAccessKey, role: AwsRole, options: AssumeRoleOptions): Promise<Omit<AwsSession, "revision">>;
@@ -0,0 +1,312 @@
1
+ import { execFile } from "node:child_process";
2
+ import { XMLParser } from "fast-xml-parser";
3
+ import { AuthError } from "../auth/errors.js";
4
+ import { sendResource } from "./http.js";
5
+ import { secret } from "./policy.js";
6
+ import { signSigV4 } from "./sigv4.js";
7
+ /**
8
+ * AWS endpoints, roles and responses: what SigV4 methods sign for, and
9
+ * how a role session is issued. The signature itself is sigv4.ts.
10
+ */
11
+ /** A region code: `us-east-1`, `eu-central-2`, `us-gov-west-1`, `cn-north-1`. */
12
+ const REGION = /^[a-z]{2}(?:-[a-z]+)+-\d{1,2}$/;
13
+ /** A service's endpoint prefix: `ec2`, `ssm`, `logs`, `monitoring`. */
14
+ const SERVICE = /^[a-z0-9][a-z0-9-]{0,62}$/;
15
+ /** A region from public config; anything else would sign for the wrong place. */
16
+ export function awsRegion(value) {
17
+ if (typeof value !== "string" || !REGION.test(value))
18
+ throw new AuthError("invalid_credentials");
19
+ return value;
20
+ }
21
+ /** Whether a target's signing scope names a well-formed service and region. */
22
+ export function isAwsScope(value) {
23
+ const scope = value;
24
+ return (!!scope &&
25
+ typeof scope.service === "string" &&
26
+ SERVICE.test(scope.service) &&
27
+ typeof scope.region === "string" &&
28
+ REGION.test(scope.region));
29
+ }
30
+ /**
31
+ * The regional HTTPS endpoint of `service`: `https://<service>.<region>.
32
+ * amazonaws.com/`, or `.amazonaws.com.cn` in the China partition.
33
+ */
34
+ export function awsEndpoint(service, region) {
35
+ if (!SERVICE.test(service))
36
+ throw new AuthError("invalid_definition");
37
+ const domain = awsRegion(region).startsWith("cn-")
38
+ ? "amazonaws.com.cn"
39
+ : "amazonaws.com";
40
+ return `https://${service}.${region}.${domain}/`;
41
+ }
42
+ /**
43
+ * An access key that can sign: an ID and a session token that go into
44
+ * headers as they are (`secret`), and a secret that only keys the
45
+ * signature. Anything else is refused before any request.
46
+ */
47
+ export function awsAccessKey(value) {
48
+ const key = value;
49
+ if (typeof key?.secretAccessKey !== "string" || !key.secretAccessKey)
50
+ throw new AuthError("invalid_credentials");
51
+ return {
52
+ accessKeyId: secret(key.accessKeyId),
53
+ secretAccessKey: key.secretAccessKey,
54
+ ...(key.sessionToken === undefined
55
+ ? {}
56
+ : { sessionToken: secret(key.sessionToken) }),
57
+ };
58
+ }
59
+ /** An AWS CLI profile name, as `~/.aws/config` section names allow it. */
60
+ const PROFILE = /^[\w+=,.@-]{1,64}$/;
61
+ /** A profile name from config; anything else is refused before the CLI runs. */
62
+ export function awsProfileName(value) {
63
+ if (typeof value !== "string" || !PROFILE.test(value))
64
+ throw new AuthError("invalid_credentials");
65
+ return value;
66
+ }
67
+ /** A profile's key is used until this long before it expires. */
68
+ const PROFILE_KEY_MARGIN_MS = 5 * 60_000;
69
+ /**
70
+ * Each profile's key as this process holds it: settled while it lasts,
71
+ * or still in flight, so concurrent callers share one CLI run.
72
+ */
73
+ const profileKeys = new Map();
74
+ /** A key a provider issued: one that cannot sign is a malformed answer. */
75
+ function issuedKey(value) {
76
+ try {
77
+ return awsAccessKey(value);
78
+ }
79
+ catch {
80
+ throw new AuthError("invalid_response");
81
+ }
82
+ }
83
+ /**
84
+ * Why the CLI produced no key: it is not installed, it ran out of time,
85
+ * it answered more than a key, or it refused (no login, or an expired
86
+ * SSO session, which `aws sso login` mends).
87
+ */
88
+ function cliFailure(error) {
89
+ if (error.code === "ENOENT")
90
+ return new AuthError("invalid_credentials");
91
+ if (error.code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER")
92
+ return new AuthError("invalid_response");
93
+ if (error.killed)
94
+ return new AuthError("request_failed");
95
+ return new AuthError("reconnect_required");
96
+ }
97
+ /** One CLI run: the profile's key, as `credential_process` defines it. */
98
+ async function exportProfileKey(profile) {
99
+ const stdout = await new Promise((resolve, reject) => {
100
+ execFile("aws", [
101
+ "configure",
102
+ "export-credentials",
103
+ "--profile",
104
+ profile,
105
+ "--format",
106
+ "process",
107
+ ], { timeout: 30_000, maxBuffer: 64 * 1024 }, (error, out) => (error ? reject(cliFailure(error)) : resolve(out)));
108
+ });
109
+ let exported;
110
+ try {
111
+ exported = JSON.parse(stdout);
112
+ }
113
+ catch {
114
+ throw new AuthError("invalid_response");
115
+ }
116
+ const expiresAt = exported.Expiration === undefined
117
+ ? undefined
118
+ : Date.parse(String(exported.Expiration));
119
+ if (exported.Version !== 1 ||
120
+ (expiresAt !== undefined && !Number.isSafeInteger(expiresAt)))
121
+ throw new AuthError("invalid_response");
122
+ return {
123
+ key: issuedKey({
124
+ accessKeyId: exported.AccessKeyId,
125
+ secretAccessKey: exported.SecretAccessKey,
126
+ ...(exported.SessionToken === undefined
127
+ ? {}
128
+ : { sessionToken: exported.SessionToken }),
129
+ }),
130
+ expiresAt,
131
+ };
132
+ }
133
+ /**
134
+ * The access key of an AWS CLI profile, as the CLI resolves it: an SSO
135
+ * login, an assumed role, or a key in `~/.aws/credentials`, through
136
+ * `aws configure export-credentials` (the `credential_process` contract).
137
+ * Held until five minutes before it expires; however many callers find
138
+ * it missing or stale, one CLI run serves them all, and a failed run is
139
+ * not held.
140
+ */
141
+ export async function awsProfileKey(name) {
142
+ const profile = awsProfileName(name);
143
+ for (;;) {
144
+ const held = profileKeys.get(profile);
145
+ if (!held)
146
+ break;
147
+ const { key, expiresAt } = await held;
148
+ if (expiresAt === undefined ||
149
+ expiresAt > Date.now() + PROFILE_KEY_MARGIN_MS)
150
+ return key;
151
+ // Stale: refresh it, unless another caller already started to.
152
+ if (profileKeys.get(profile) === held)
153
+ break;
154
+ }
155
+ const exporting = exportProfileKey(profile);
156
+ profileKeys.set(profile, exporting);
157
+ exporting.catch(() => {
158
+ if (profileKeys.get(profile) === exporting)
159
+ profileKeys.delete(profile);
160
+ });
161
+ return (await exporting).key;
162
+ }
163
+ /** `arn:<partition>:iam::<account>:role/<path/name>`, as IAM allows it. */
164
+ const ROLE_ARN = /^arn:aws(?:-[a-z]+)*:iam::\d{12}:role\/[\w+=,.@/-]{1,512}$/;
165
+ const SESSION_NAME = /^[\w+=,.@-]{2,64}$/;
166
+ const EXTERNAL_ID = /^[\w+=,.@:/-]{2,1224}$/;
167
+ /** A role as STS accepts it; anything else is refused before any request. */
168
+ export function awsRole(role) {
169
+ if (!ROLE_ARN.test(role.roleArn) ||
170
+ !SESSION_NAME.test(role.sessionName) ||
171
+ (role.externalId !== undefined && !EXTERNAL_ID.test(role.externalId)) ||
172
+ (role.durationSeconds !== undefined &&
173
+ (!Number.isInteger(role.durationSeconds) ||
174
+ role.durationSeconds < 900 ||
175
+ role.durationSeconds > 43_200)))
176
+ throw new AuthError("invalid_credentials");
177
+ return { ...role, region: awsRegion(role.region) };
178
+ }
179
+ const xml = new XMLParser({
180
+ ignoreAttributes: true,
181
+ ignoreDeclaration: true,
182
+ // Values stay strings: an account ID or a volume size is not ours to coerce.
183
+ parseTagValue: false,
184
+ trimValues: true,
185
+ processEntities: true,
186
+ htmlEntities: false,
187
+ });
188
+ /**
189
+ * An AWS XML answer as plain data. Element text is a string; lists are
190
+ * `item` or `member` entries. AWS sends no document type, and one that
191
+ * declares entities could expand without bound, so a DOCTYPE is refused.
192
+ */
193
+ export function parseAwsXml(text) {
194
+ if (/<!DOCTYPE/i.test(text))
195
+ throw new AuthError("invalid_response");
196
+ try {
197
+ const parsed = xml.parse(text, true);
198
+ if (!parsed || typeof parsed !== "object")
199
+ throw new Error();
200
+ return parsed;
201
+ }
202
+ catch {
203
+ throw new AuthError("invalid_response");
204
+ }
205
+ }
206
+ /**
207
+ * An AWS error's code, from any of its envelopes: a JSON `__type`
208
+ * (`com.amazonaws.ssm#InvalidInstanceId` → `InvalidInstanceId`) or `code`,
209
+ * a query `ErrorResponse`, or EC2's `Response.Errors`. Undefined when the
210
+ * body names none.
211
+ */
212
+ export function awsErrorCode(text) {
213
+ const trimmed = text.trim();
214
+ if (trimmed.startsWith("{")) {
215
+ try {
216
+ const body = JSON.parse(trimmed);
217
+ const code = body.__type ?? body.code ?? body.Code;
218
+ return typeof code === "string" ? code.split("#").pop() : undefined;
219
+ }
220
+ catch {
221
+ return undefined;
222
+ }
223
+ }
224
+ if (!trimmed.startsWith("<"))
225
+ return undefined;
226
+ try {
227
+ const body = parseAwsXml(trimmed);
228
+ const envelope = (body.ErrorResponse ?? body.Response);
229
+ const error = (envelope?.Error ??
230
+ envelope?.Errors?.Error);
231
+ const first = Array.isArray(error) ? error[0] : error;
232
+ return typeof first?.Code === "string" ? first.Code : undefined;
233
+ }
234
+ catch {
235
+ return undefined;
236
+ }
237
+ }
238
+ /** STS codes that mean the signing key itself is unusable: a reconnect, not a retry. */
239
+ const REJECTED_KEY = new Set([
240
+ "InvalidClientTokenId",
241
+ "SignatureDoesNotMatch",
242
+ "ExpiredToken",
243
+ "InvalidAccessKeyId",
244
+ "UnrecognizedClientException",
245
+ ]);
246
+ /**
247
+ * A new session for `role`, requested from STS with `key`. A refused
248
+ * key is reconnect_required; any other refusal (no permission to assume
249
+ * the role, a trust policy mismatch) is provider_rejected.
250
+ */
251
+ export async function assumeAwsRole(key, role, options) {
252
+ const signing = awsAccessKey(key);
253
+ const valid = awsRole(role);
254
+ const endpoint = new URL(awsEndpoint("sts", valid.region));
255
+ const body = Buffer.from(new URLSearchParams({
256
+ Action: "AssumeRole",
257
+ Version: "2011-06-15",
258
+ RoleArn: valid.roleArn,
259
+ RoleSessionName: valid.sessionName,
260
+ ...(valid.externalId === undefined
261
+ ? {}
262
+ : { ExternalId: valid.externalId }),
263
+ ...(valid.durationSeconds === undefined
264
+ ? {}
265
+ : { DurationSeconds: String(valid.durationSeconds) }),
266
+ }).toString());
267
+ const contentType = "application/x-www-form-urlencoded; charset=utf-8";
268
+ const now = Date.now();
269
+ const signed = signSigV4({
270
+ method: "POST",
271
+ host: endpoint.host,
272
+ path: endpoint.pathname,
273
+ query: [],
274
+ headers: [["content-type", contentType]],
275
+ body,
276
+ }, signing, { service: "sts", region: valid.region }, new Date(now));
277
+ let response;
278
+ try {
279
+ response = await sendResource(endpoint.toString(), "POST", new Headers({ "content-type": contentType, ...signed }), body, {
280
+ fetch: options.fetch,
281
+ timeoutMs: options.timeoutMs,
282
+ maxResponseBytes: 64 * 1024,
283
+ });
284
+ }
285
+ catch {
286
+ throw new AuthError("request_failed");
287
+ }
288
+ const text = await response.text();
289
+ if (!response.ok) {
290
+ const code = awsErrorCode(text);
291
+ throw new AuthError(code && REJECTED_KEY.has(code)
292
+ ? "reconnect_required"
293
+ : "provider_rejected", response.status);
294
+ }
295
+ const result = parseAwsXml(text).AssumeRoleResponse?.AssumeRoleResult?.Credentials;
296
+ const expiresAt = Date.parse(String(result?.Expiration));
297
+ if (typeof result?.SessionToken !== "string" ||
298
+ !Number.isSafeInteger(expiresAt) ||
299
+ expiresAt <= now)
300
+ throw new AuthError("invalid_response");
301
+ const session = issuedKey({
302
+ accessKeyId: result.AccessKeyId,
303
+ secretAccessKey: result.SecretAccessKey,
304
+ sessionToken: result.SessionToken,
305
+ });
306
+ return {
307
+ accessKeyId: session.accessKeyId,
308
+ secretAccessKey: session.secretAccessKey,
309
+ sessionToken: result.SessionToken,
310
+ expiresAt,
311
+ };
312
+ }
@@ -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;