runline 0.33.0 → 0.35.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 (531) hide show
  1. package/dist/auth/oauth2.d.ts +7 -1
  2. package/dist/auth/oauth2.js +10 -0
  3. package/dist/auth/token.d.ts +1 -0
  4. package/dist/auth/token.js +19 -1
  5. package/dist/auth/types.d.ts +22 -1
  6. package/dist/core/engine.d.ts +7 -0
  7. package/dist/core/engine.js +21 -8
  8. package/dist/credentials/policy.d.ts +53 -1
  9. package/dist/credentials/policy.js +146 -6
  10. package/dist/credentials/registry.d.ts +9 -0
  11. package/dist/credentials/registry.js +184 -22
  12. package/dist/credentials/transport.d.ts +48 -2
  13. package/dist/credentials/transport.js +248 -70
  14. package/dist/credentials/types.d.ts +177 -10
  15. package/dist/index.d.ts +6 -5
  16. package/dist/index.js +3 -2
  17. package/dist/plugin/api.d.ts +7 -0
  18. package/dist/plugin/api.js +7 -0
  19. package/dist/plugin/schema.d.ts +16 -4
  20. package/dist/plugin/schema.js +28 -5
  21. package/dist/plugin/types.d.ts +20 -0
  22. package/dist/plugins/_shared/base64.js +30 -0
  23. package/dist/plugins/_shared/credentialAdapter.js +99 -15
  24. package/dist/plugins/_shared/credentials.js +416 -0
  25. package/dist/plugins/_shared/googleAuth.js +69 -39
  26. package/dist/plugins/_shared/googleCredentials.js +68 -14
  27. package/dist/plugins/_shared/localFile.js +40 -0
  28. package/dist/plugins/_shared/mediaFile.js +12 -12
  29. package/dist/plugins/_shared/microsoftAuth.js +31 -47
  30. package/dist/plugins/_shared/microsoftCredentials.js +42 -15
  31. package/dist/plugins/_shared/provider.js +2 -14
  32. package/dist/plugins/_shared/shiftCloud.js +16 -56
  33. package/dist/plugins/_shared/shiftCredentials.js +83 -0
  34. package/dist/plugins/_shared/shiftUpload.js +14 -10
  35. package/dist/plugins/actionNetwork/src/credentials.js +14 -0
  36. package/dist/plugins/actionNetwork/src/index.js +39 -50
  37. package/dist/plugins/activeCampaign/src/credentials.js +22 -0
  38. package/dist/plugins/activeCampaign/src/index.js +61 -132
  39. package/dist/plugins/adalo/src/credentials.js +16 -0
  40. package/dist/plugins/adalo/src/index.js +19 -43
  41. package/dist/plugins/affinity/src/credentials.js +19 -0
  42. package/dist/plugins/affinity/src/index.js +29 -54
  43. package/dist/plugins/agentMail/src/credentials.js +35 -0
  44. package/dist/plugins/agentMail/src/drafts.js +137 -0
  45. package/dist/plugins/agentMail/src/inboxes.js +95 -0
  46. package/dist/plugins/agentMail/src/index.js +35 -0
  47. package/dist/plugins/agentMail/src/messages.js +154 -0
  48. package/dist/plugins/agentMail/src/schemas.js +156 -0
  49. package/dist/plugins/agentMail/src/shared.js +203 -0
  50. package/dist/plugins/agentMail/src/threads.js +75 -0
  51. package/dist/plugins/agileCrm/src/credentials.js +16 -0
  52. package/dist/plugins/agileCrm/src/index.js +46 -112
  53. package/dist/plugins/airtable/src/credentials.js +19 -0
  54. package/dist/plugins/airtable/src/index.js +37 -50
  55. package/dist/plugins/airtop/src/credentials.js +20 -0
  56. package/dist/plugins/airtop/src/index.js +51 -75
  57. package/dist/plugins/apiTemplateIo/src/credentials.js +19 -0
  58. package/dist/plugins/apiTemplateIo/src/index.js +14 -31
  59. package/dist/plugins/asana/src/credentials.js +19 -0
  60. package/dist/plugins/asana/src/index.js +51 -72
  61. package/dist/plugins/autopilot/src/credentials.js +19 -0
  62. package/dist/plugins/autopilot/src/index.js +38 -45
  63. package/dist/plugins/bambooHr/src/credentials.js +16 -0
  64. package/dist/plugins/bambooHr/src/index.js +41 -67
  65. package/dist/plugins/bannerbear/src/credentials.js +19 -0
  66. package/dist/plugins/bannerbear/src/index.js +15 -27
  67. package/dist/plugins/baserow/src/credentials.js +17 -0
  68. package/dist/plugins/baserow/src/index.js +23 -49
  69. package/dist/plugins/beeminder/src/credentials.js +19 -0
  70. package/dist/plugins/beeminder/src/index.js +32 -54
  71. package/dist/plugins/bitly/src/credentials.js +19 -0
  72. package/dist/plugins/bitly/src/index.js +12 -26
  73. package/dist/plugins/bitwarden/src/credentials.js +62 -0
  74. package/dist/plugins/bitwarden/src/index.js +34 -80
  75. package/dist/plugins/box/src/credentials.js +19 -0
  76. package/dist/plugins/box/src/index.js +24 -49
  77. package/dist/plugins/brandfetch/src/credentials.js +13 -0
  78. package/dist/plugins/brandfetch/src/index.js +12 -17
  79. package/dist/plugins/brevo/src/credentials.js +19 -0
  80. package/dist/plugins/brevo/src/index.js +30 -51
  81. package/dist/plugins/bubble/src/credentials.js +28 -0
  82. package/dist/plugins/bubble/src/index.js +29 -65
  83. package/dist/plugins/chargebee/src/credentials.js +16 -0
  84. package/dist/plugins/chargebee/src/index.js +15 -45
  85. package/dist/plugins/circleci/src/credentials.js +19 -0
  86. package/dist/plugins/circleci/src/index.js +19 -39
  87. package/dist/plugins/ciscoWebex/src/credentials.js +19 -0
  88. package/dist/plugins/ciscoWebex/src/index.js +43 -61
  89. package/dist/plugins/clearbit/src/credentials.js +22 -0
  90. package/dist/plugins/clearbit/src/index.js +11 -21
  91. package/dist/plugins/clickup/src/credentials.js +19 -0
  92. package/dist/plugins/clickup/src/index.js +85 -117
  93. package/dist/plugins/clockify/src/credentials.js +19 -0
  94. package/dist/plugins/clockify/src/index.js +46 -61
  95. package/dist/plugins/cloudflare/src/credentials.js +19 -0
  96. package/dist/plugins/cloudflare/src/index.js +19 -34
  97. package/dist/plugins/cockpit/src/credentials.js +17 -0
  98. package/dist/plugins/cockpit/src/index.js +18 -31
  99. package/dist/plugins/coda/src/credentials.js +19 -0
  100. package/dist/plugins/coda/src/index.js +33 -50
  101. package/dist/plugins/coingecko/src/credentials.js +20 -0
  102. package/dist/plugins/coingecko/src/index.js +24 -34
  103. package/dist/plugins/contentful/src/credentials.js +26 -0
  104. package/dist/plugins/contentful/src/index.js +19 -40
  105. package/dist/plugins/convertkit/src/credentials.js +26 -0
  106. package/dist/plugins/convertkit/src/index.js +27 -45
  107. package/dist/plugins/copper/src/credentials.js +17 -0
  108. package/dist/plugins/copper/src/index.js +25 -47
  109. package/dist/plugins/cortex/src/credentials.js +28 -0
  110. package/dist/plugins/cortex/src/index.js +26 -49
  111. package/dist/plugins/currents/src/credentials.js +19 -0
  112. package/dist/plugins/currents/src/index.js +46 -59
  113. package/dist/plugins/customerIo/src/credentials.js +52 -0
  114. package/dist/plugins/customerIo/src/index.js +30 -58
  115. package/dist/plugins/databricks/src/credentials.js +13 -0
  116. package/dist/plugins/databricks/src/index.js +51 -103
  117. package/dist/plugins/deepl/src/credentials.js +19 -0
  118. package/dist/plugins/deepl/src/index.js +13 -39
  119. package/dist/plugins/demio/src/credentials.js +26 -0
  120. package/dist/plugins/demio/src/index.js +17 -41
  121. package/dist/plugins/dhl/src/credentials.js +13 -0
  122. package/dist/plugins/dhl/src/index.js +8 -19
  123. package/dist/plugins/discord/src/credentials.js +19 -0
  124. package/dist/plugins/discord/src/index.js +30 -58
  125. package/dist/plugins/discourse/src/credentials.js +18 -0
  126. package/dist/plugins/discourse/src/index.js +36 -53
  127. package/dist/plugins/disqus/src/credentials.js +13 -0
  128. package/dist/plugins/disqus/src/index.js +14 -32
  129. package/dist/plugins/drift/src/credentials.js +13 -0
  130. package/dist/plugins/drift/src/index.js +16 -26
  131. package/dist/plugins/dropbox/src/credentials.js +13 -0
  132. package/dist/plugins/dropbox/src/index.js +23 -30
  133. package/dist/plugins/dropcontact/src/credentials.js +13 -0
  134. package/dist/plugins/dropcontact/src/index.js +13 -18
  135. package/dist/plugins/egoi/src/credentials.js +19 -0
  136. package/dist/plugins/egoi/src/index.js +23 -38
  137. package/dist/plugins/elasticsearch/src/credentials.js +18 -0
  138. package/dist/plugins/elasticsearch/src/index.js +27 -48
  139. package/dist/plugins/elevenlabs/src/credentials.js +30 -0
  140. package/dist/plugins/elevenlabs/src/index.js +4 -1
  141. package/dist/plugins/elevenlabs/src/schemas.js +2 -1
  142. package/dist/plugins/elevenlabs/src/shared.js +87 -62
  143. package/dist/plugins/elevenlabs/src/workflows.js +2 -2
  144. package/dist/plugins/emelia/src/credentials.js +14 -0
  145. package/dist/plugins/emelia/src/index.js +19 -23
  146. package/dist/plugins/erpnext/src/credentials.js +27 -0
  147. package/dist/plugins/erpnext/src/index.js +21 -42
  148. package/dist/plugins/facebookGraph/src/credentials.js +20 -0
  149. package/dist/plugins/facebookGraph/src/index.js +39 -37
  150. package/dist/plugins/fal/src/credentials.js +14 -0
  151. package/dist/plugins/fal/src/index.js +5 -3
  152. package/dist/plugins/fal/src/shared.js +58 -63
  153. package/dist/plugins/freshdesk/src/credentials.js +20 -0
  154. package/dist/plugins/freshdesk/src/index.js +25 -46
  155. package/dist/plugins/freshservice/src/credentials.js +16 -0
  156. package/dist/plugins/freshservice/src/index.js +37 -58
  157. package/dist/plugins/freshworksCrm/src/credentials.js +16 -0
  158. package/dist/plugins/freshworksCrm/src/index.js +20 -39
  159. package/dist/plugins/getresponse/src/credentials.js +22 -0
  160. package/dist/plugins/getresponse/src/index.js +20 -32
  161. package/dist/plugins/gett/src/credentials.js +64 -0
  162. package/dist/plugins/gett/src/index.js +11 -6
  163. package/dist/plugins/gett/src/login.js +24 -0
  164. package/dist/plugins/gett/src/session.js +15 -38
  165. package/dist/plugins/gett/src/shared.js +41 -84
  166. package/dist/plugins/ghost/src/credentials.js +36 -0
  167. package/dist/plugins/ghost/src/index.js +18 -59
  168. package/dist/plugins/github/src/credentials.js +18 -0
  169. package/dist/plugins/github/src/index.js +55 -78
  170. package/dist/plugins/gitlab/src/credentials.js +24 -0
  171. package/dist/plugins/gitlab/src/index.js +29 -48
  172. package/dist/plugins/gmail/src/index.js +47 -108
  173. package/dist/plugins/gong/src/credentials.js +16 -0
  174. package/dist/plugins/gong/src/index.js +16 -32
  175. package/dist/plugins/googleAppsScript/src/index.js +109 -42
  176. package/dist/plugins/googleCalendar/src/index.js +20 -51
  177. package/dist/plugins/googleContacts/src/index.js +13 -40
  178. package/dist/plugins/googleDocs/src/index.js +3 -32
  179. package/dist/plugins/googleDocs/src/shared.js +2 -1
  180. package/dist/plugins/googleDrive/src/index.js +68 -97
  181. package/dist/plugins/googleImage/src/credentials.js +14 -0
  182. package/dist/plugins/googleImage/src/index.js +15 -26
  183. package/dist/plugins/googleSheets/src/index.js +27 -60
  184. package/dist/plugins/googleSlides/src/index.js +7 -35
  185. package/dist/plugins/googleTasks/src/index.js +14 -42
  186. package/dist/plugins/gotify/src/credentials.js +32 -0
  187. package/dist/plugins/gotify/src/index.js +14 -36
  188. package/dist/plugins/gotowebinar/src/credentials.js +13 -0
  189. package/dist/plugins/gotowebinar/src/index.js +52 -69
  190. package/dist/plugins/grafana/src/credentials.js +16 -0
  191. package/dist/plugins/grafana/src/index.js +34 -53
  192. package/dist/plugins/graphql/src/credentials.js +42 -0
  193. package/dist/plugins/graphql/src/index.js +21 -46
  194. package/dist/plugins/grist/src/credentials.js +30 -0
  195. package/dist/plugins/grist/src/index.js +14 -43
  196. package/dist/plugins/halopsa/src/credentials.js +56 -0
  197. package/dist/plugins/halopsa/src/index.js +20 -47
  198. package/dist/plugins/harvest/src/credentials.js +20 -0
  199. package/dist/plugins/harvest/src/index.js +24 -43
  200. package/dist/plugins/helpscout/src/credentials.js +13 -0
  201. package/dist/plugins/helpscout/src/index.js +26 -38
  202. package/dist/plugins/highlevel/src/credentials.js +19 -0
  203. package/dist/plugins/highlevel/src/index.js +42 -65
  204. package/dist/plugins/homeAssistant/src/credentials.js +27 -0
  205. package/dist/plugins/homeAssistant/src/index.js +34 -52
  206. package/dist/plugins/hubspot/src/credentials.js +16 -0
  207. package/dist/plugins/hubspot/src/index.js +29 -41
  208. package/dist/plugins/humanticAi/src/credentials.js +13 -0
  209. package/dist/plugins/humanticAi/src/index.js +15 -22
  210. package/dist/plugins/hunter/src/credentials.js +13 -0
  211. package/dist/plugins/hunter/src/index.js +18 -17
  212. package/dist/plugins/intercom/src/credentials.js +19 -0
  213. package/dist/plugins/intercom/src/index.js +25 -38
  214. package/dist/plugins/iterable/src/credentials.js +17 -0
  215. package/dist/plugins/iterable/src/index.js +26 -40
  216. package/dist/plugins/jenkins/src/credentials.js +16 -0
  217. package/dist/plugins/jenkins/src/index.js +22 -36
  218. package/dist/plugins/jira/src/credentials.js +16 -0
  219. package/dist/plugins/jira/src/index.js +35 -61
  220. package/dist/plugins/keap/src/credentials.js +19 -0
  221. package/dist/plugins/keap/src/index.js +43 -71
  222. package/dist/plugins/kobotoolbox/src/credentials.js +13 -0
  223. package/dist/plugins/kobotoolbox/src/index.js +46 -84
  224. package/dist/plugins/lemlist/src/credentials.js +19 -0
  225. package/dist/plugins/lemlist/src/index.js +35 -47
  226. package/dist/plugins/linear/src/attachments.js +7 -7
  227. package/dist/plugins/linear/src/comments.js +7 -7
  228. package/dist/plugins/linear/src/credentials.js +17 -0
  229. package/dist/plugins/linear/src/cycles.js +5 -5
  230. package/dist/plugins/linear/src/index.js +2 -0
  231. package/dist/plugins/linear/src/initiatives.js +6 -6
  232. package/dist/plugins/linear/src/issues.js +14 -14
  233. package/dist/plugins/linear/src/labels.js +6 -6
  234. package/dist/plugins/linear/src/organization.js +2 -2
  235. package/dist/plugins/linear/src/projects.js +12 -12
  236. package/dist/plugins/linear/src/shared.js +34 -32
  237. package/dist/plugins/linear/src/states.js +3 -3
  238. package/dist/plugins/linear/src/teams.js +4 -4
  239. package/dist/plugins/linear/src/users.js +3 -3
  240. package/dist/plugins/linear/src/views.js +5 -5
  241. package/dist/plugins/linear/src/webhooks.js +5 -5
  242. package/dist/plugins/lingvanex/src/credentials.js +13 -0
  243. package/dist/plugins/lingvanex/src/index.js +7 -9
  244. package/dist/plugins/linkedin/src/credentials.js +17 -0
  245. package/dist/plugins/linkedin/src/index.js +13 -17
  246. package/dist/plugins/lonescale/src/credentials.js +13 -0
  247. package/dist/plugins/lonescale/src/index.js +16 -26
  248. package/dist/plugins/magento/src/credentials.js +16 -0
  249. package/dist/plugins/magento/src/index.js +67 -84
  250. package/dist/plugins/mailcheck/src/credentials.js +17 -0
  251. package/dist/plugins/mailcheck/src/index.js +7 -9
  252. package/dist/plugins/mailchimp/src/credentials.js +32 -0
  253. package/dist/plugins/mailchimp/src/index.js +36 -44
  254. package/dist/plugins/mailerlite/src/credentials.js +13 -0
  255. package/dist/plugins/mailerlite/src/index.js +19 -32
  256. package/dist/plugins/mailgun/src/credentials.js +21 -0
  257. package/dist/plugins/mailgun/src/index.js +15 -21
  258. package/dist/plugins/mailjet/src/credentials.js +38 -0
  259. package/dist/plugins/mailjet/src/index.js +60 -115
  260. package/dist/plugins/mandrill/src/credentials.js +17 -0
  261. package/dist/plugins/mandrill/src/index.js +11 -12
  262. package/dist/plugins/marketstack/src/credentials.js +16 -0
  263. package/dist/plugins/marketstack/src/index.js +18 -28
  264. package/dist/plugins/matrix/src/credentials.js +19 -0
  265. package/dist/plugins/matrix/src/index.js +23 -52
  266. package/dist/plugins/mattermost/src/credentials.js +19 -0
  267. package/dist/plugins/mattermost/src/index.js +41 -73
  268. package/dist/plugins/mautic/src/credentials.js +16 -0
  269. package/dist/plugins/mautic/src/index.js +46 -62
  270. package/dist/plugins/medium/src/credentials.js +20 -0
  271. package/dist/plugins/medium/src/index.js +18 -23
  272. package/dist/plugins/messagebird/src/credentials.js +22 -0
  273. package/dist/plugins/messagebird/src/index.js +13 -18
  274. package/dist/plugins/metabase/src/credentials.js +19 -0
  275. package/dist/plugins/metabase/src/index.js +24 -40
  276. package/dist/plugins/microsoftCalendar/src/index.js +49 -18
  277. package/dist/plugins/microsoftFiles/src/index.js +95 -31
  278. package/dist/plugins/microsoftMail/src/index.js +63 -21
  279. package/dist/plugins/misp/src/credentials.js +16 -0
  280. package/dist/plugins/misp/src/index.js +60 -71
  281. package/dist/plugins/mocean/src/credentials.js +17 -0
  282. package/dist/plugins/mocean/src/index.js +11 -23
  283. package/dist/plugins/monday/src/credentials.js +14 -0
  284. package/dist/plugins/monday/src/index.js +31 -44
  285. package/dist/plugins/monicaCrm/src/credentials.js +19 -0
  286. package/dist/plugins/monicaCrm/src/index.js +25 -42
  287. package/dist/plugins/msg91/src/credentials.js +10 -0
  288. package/dist/plugins/msg91/src/index.js +15 -11
  289. package/dist/plugins/nasa/src/credentials.js +22 -0
  290. package/dist/plugins/nasa/src/index.js +24 -28
  291. package/dist/plugins/netlify/src/credentials.js +19 -0
  292. package/dist/plugins/netlify/src/index.js +27 -51
  293. package/dist/plugins/netscalerAdc/src/credentials.js +18 -0
  294. package/dist/plugins/netscalerAdc/src/index.js +16 -31
  295. package/dist/plugins/nextcloud/src/credentials.js +27 -0
  296. package/dist/plugins/nextcloud/src/index.js +55 -109
  297. package/dist/plugins/nocodb/src/credentials.js +16 -0
  298. package/dist/plugins/nocodb/src/index.js +19 -37
  299. package/dist/plugins/notion/src/credentials.js +21 -0
  300. package/dist/plugins/notion/src/index.js +25 -38
  301. package/dist/plugins/npm/src/credentials.js +19 -0
  302. package/dist/plugins/npm/src/index.js +22 -32
  303. package/dist/plugins/odoo/src/credentials.js +21 -0
  304. package/dist/plugins/odoo/src/index.js +53 -69
  305. package/dist/plugins/okta/src/credentials.js +23 -0
  306. package/dist/plugins/okta/src/index.js +30 -35
  307. package/dist/plugins/oneSimpleApi/src/credentials.js +16 -0
  308. package/dist/plugins/oneSimpleApi/src/index.js +19 -24
  309. package/dist/plugins/onfleet/src/credentials.js +23 -0
  310. package/dist/plugins/onfleet/src/index.js +42 -53
  311. package/dist/plugins/openai/src/credentials.js +13 -0
  312. package/dist/plugins/openai/src/index.js +16 -24
  313. package/dist/plugins/openweathermap/src/credentials.js +16 -0
  314. package/dist/plugins/openweathermap/src/index.js +22 -22
  315. package/dist/plugins/oura/src/credentials.js +19 -0
  316. package/dist/plugins/oura/src/index.js +13 -18
  317. package/dist/plugins/paddle/src/credentials.js +27 -0
  318. package/dist/plugins/paddle/src/index.js +20 -36
  319. package/dist/plugins/pagerduty/src/credentials.js +24 -0
  320. package/dist/plugins/pagerduty/src/index.js +30 -39
  321. package/dist/plugins/parallel/src/credentials.js +18 -0
  322. package/dist/plugins/parallel/src/index.js +16 -22
  323. package/dist/plugins/paypal/src/credentials.js +44 -0
  324. package/dist/plugins/paypal/src/index.js +14 -40
  325. package/dist/plugins/peekalink/src/credentials.js +16 -0
  326. package/dist/plugins/peekalink/src/index.js +10 -11
  327. package/dist/plugins/phantombuster/src/credentials.js +19 -0
  328. package/dist/plugins/phantombuster/src/index.js +19 -32
  329. package/dist/plugins/philipsHue/src/credentials.js +17 -0
  330. package/dist/plugins/philipsHue/src/index.js +15 -27
  331. package/dist/plugins/pipedrive/src/credentials.js +26 -0
  332. package/dist/plugins/pipedrive/src/index.js +43 -73
  333. package/dist/plugins/plaud/src/index.js +2 -1
  334. package/dist/plugins/plaud/src/shared.js +23 -19
  335. package/dist/plugins/plivo/src/credentials.js +20 -0
  336. package/dist/plugins/plivo/src/index.js +13 -19
  337. package/dist/plugins/posthog/src/credentials.js +18 -0
  338. package/dist/plugins/posthog/src/index.js +14 -20
  339. package/dist/plugins/profitwell/src/credentials.js +22 -0
  340. package/dist/plugins/profitwell/src/index.js +10 -17
  341. package/dist/plugins/pushbullet/src/credentials.js +19 -0
  342. package/dist/plugins/pushbullet/src/index.js +19 -27
  343. package/dist/plugins/pushcut/src/credentials.js +19 -0
  344. package/dist/plugins/pushcut/src/index.js +7 -8
  345. package/dist/plugins/pushover/src/credentials.js +14 -0
  346. package/dist/plugins/pushover/src/index.js +7 -12
  347. package/dist/plugins/quickbase/src/credentials.js +15 -0
  348. package/dist/plugins/quickbase/src/index.js +24 -34
  349. package/dist/plugins/quickbooks/src/credentials.js +22 -0
  350. package/dist/plugins/quickbooks/src/index.js +17 -46
  351. package/dist/plugins/raindrop/src/credentials.js +19 -0
  352. package/dist/plugins/raindrop/src/index.js +30 -32
  353. package/dist/plugins/recraft/src/credentials.js +13 -0
  354. package/dist/plugins/recraft/src/index.js +39 -28
  355. package/dist/plugins/reddit/src/credentials.js +26 -0
  356. package/dist/plugins/reddit/src/index.js +30 -34
  357. package/dist/plugins/replicate/src/credentials.js +23 -0
  358. package/dist/plugins/replicate/src/index.js +18 -28
  359. package/dist/plugins/rocketchat/src/credentials.js +17 -0
  360. package/dist/plugins/rocketchat/src/index.js +8 -19
  361. package/dist/plugins/rundeck/src/credentials.js +16 -0
  362. package/dist/plugins/rundeck/src/index.js +12 -28
  363. package/dist/plugins/salesforce/src/credentials.js +73 -0
  364. package/dist/plugins/salesforce/src/index.js +6 -0
  365. package/dist/plugins/salesforce/src/metadata.js +3 -16
  366. package/dist/plugins/salesforce/src/shared.js +25 -100
  367. package/dist/plugins/salesforce/src/sobjects.js +10 -9
  368. package/dist/plugins/salesmate/src/credentials.js +17 -0
  369. package/dist/plugins/salesmate/src/index.js +20 -37
  370. package/dist/plugins/securityScorecard/src/credentials.js +22 -0
  371. package/dist/plugins/securityScorecard/src/index.js +24 -37
  372. package/dist/plugins/segment/src/credentials.js +16 -0
  373. package/dist/plugins/segment/src/index.js +12 -16
  374. package/dist/plugins/sendgrid/src/credentials.js +13 -0
  375. package/dist/plugins/sendgrid/src/index.js +31 -35
  376. package/dist/plugins/sendy/src/credentials.js +18 -0
  377. package/dist/plugins/sendy/src/index.js +18 -24
  378. package/dist/plugins/sentry/src/credentials.js +16 -0
  379. package/dist/plugins/sentry/src/index.js +30 -98
  380. package/dist/plugins/servicenow/src/credentials.js +13 -0
  381. package/dist/plugins/servicenow/src/index.js +22 -41
  382. package/dist/plugins/shiftAtlas/src/graph.js +2 -2
  383. package/dist/plugins/shiftAtlas/src/index.js +2 -0
  384. package/dist/plugins/shiftAtlas/src/shared.js +3 -1
  385. package/dist/plugins/shiftBwm/src/index.js +4 -2
  386. package/dist/plugins/shiftBwm/src/shared.js +41 -16
  387. package/dist/plugins/shiftCrm/src/access.js +2 -2
  388. package/dist/plugins/shiftCrm/src/accounts.js +3 -3
  389. package/dist/plugins/shiftCrm/src/activities.js +3 -3
  390. package/dist/plugins/shiftCrm/src/credentials.js +6 -0
  391. package/dist/plugins/shiftCrm/src/index.js +2 -0
  392. package/dist/plugins/shiftCrm/src/opportunities.js +3 -3
  393. package/dist/plugins/shiftCrm/src/people.js +3 -3
  394. package/dist/plugins/shiftCrm/src/records.js +2 -2
  395. package/dist/plugins/shiftCrm/src/shared.js +2 -1
  396. package/dist/plugins/shiftCrm/src/tasks.js +3 -3
  397. package/dist/plugins/shiftObjects/src/credentials.js +2 -0
  398. package/dist/plugins/shiftObjects/src/index.js +2 -0
  399. package/dist/plugins/shiftObjects/src/objects.js +4 -3
  400. package/dist/plugins/shiftOcr/src/credentials.js +8 -0
  401. package/dist/plugins/shiftOcr/src/index.js +14 -8
  402. package/dist/plugins/shiftPages/src/index.js +2 -0
  403. package/dist/plugins/shiftPages/src/pages.js +5 -3
  404. package/dist/plugins/shiftPages/src/shared.js +3 -1
  405. package/dist/plugins/shiftTranscription/src/index.js +2 -0
  406. package/dist/plugins/shiftTranscription/src/shared.js +11 -1
  407. package/dist/plugins/shiftTranscription/src/transcription.js +5 -5
  408. package/dist/plugins/shiftWork/src/index.js +2 -0
  409. package/dist/plugins/shiftWork/src/issue-views.js +5 -5
  410. package/dist/plugins/shiftWork/src/issues.js +11 -7
  411. package/dist/plugins/shiftWork/src/projects.js +3 -3
  412. package/dist/plugins/shiftWork/src/shared.js +3 -1
  413. package/dist/plugins/shopify/src/credentials.js +16 -0
  414. package/dist/plugins/shopify/src/index.js +32 -59
  415. package/dist/plugins/signl4/src/credentials.js +17 -0
  416. package/dist/plugins/signl4/src/index.js +28 -29
  417. package/dist/plugins/slack/src/credentials.js +19 -0
  418. package/dist/plugins/slack/src/index.js +51 -60
  419. package/dist/plugins/sms77/src/credentials.js +17 -0
  420. package/dist/plugins/sms77/src/index.js +11 -16
  421. package/dist/plugins/splunk/src/credentials.js +19 -0
  422. package/dist/plugins/splunk/src/index.js +32 -74
  423. package/dist/plugins/spotify/src/credentials.js +19 -0
  424. package/dist/plugins/spotify/src/index.js +40 -55
  425. package/dist/plugins/stackby/src/credentials.js +13 -0
  426. package/dist/plugins/stackby/src/index.js +14 -23
  427. package/dist/plugins/steel/src/auth.js +27 -0
  428. package/dist/plugins/steel/src/browser.js +4 -3
  429. package/dist/plugins/steel/src/captchas.js +4 -3
  430. package/dist/plugins/steel/src/extensions.js +3 -2
  431. package/dist/plugins/steel/src/files.js +9 -10
  432. package/dist/plugins/steel/src/index.js +2 -0
  433. package/dist/plugins/steel/src/page/tools.js +3 -3
  434. package/dist/plugins/steel/src/profiles.js +4 -3
  435. package/dist/plugins/steel/src/sessions.js +13 -13
  436. package/dist/plugins/steel/src/shared.js +21 -51
  437. package/dist/plugins/storyblok/src/credentials.js +37 -0
  438. package/dist/plugins/storyblok/src/index.js +22 -66
  439. package/dist/plugins/strapi/src/credentials.js +71 -0
  440. package/dist/plugins/strapi/src/index.js +36 -70
  441. package/dist/plugins/strava/src/credentials.js +19 -0
  442. package/dist/plugins/strava/src/index.js +16 -33
  443. package/dist/plugins/stripe/src/credentials.js +19 -0
  444. package/dist/plugins/stripe/src/index.js +44 -58
  445. package/dist/plugins/supabase/src/credentials.js +30 -0
  446. package/dist/plugins/supabase/src/index.js +18 -40
  447. package/dist/plugins/syncromsp/src/credentials.js +16 -0
  448. package/dist/plugins/syncromsp/src/index.js +37 -70
  449. package/dist/plugins/tapfiliate/src/credentials.js +13 -0
  450. package/dist/plugins/tapfiliate/src/index.js +21 -31
  451. package/dist/plugins/telegram/src/credentials.js +20 -0
  452. package/dist/plugins/telegram/src/index.js +31 -39
  453. package/dist/plugins/thehive/src/credentials.js +14 -0
  454. package/dist/plugins/thehive/src/index.js +33 -50
  455. package/dist/plugins/thehiveProject/src/credentials.js +16 -0
  456. package/dist/plugins/thehiveProject/src/index.js +53 -122
  457. package/dist/plugins/todoist/src/credentials.js +26 -0
  458. package/dist/plugins/todoist/src/index.js +49 -79
  459. package/dist/plugins/together/src/credentials.js +16 -0
  460. package/dist/plugins/together/src/index.js +31 -33
  461. package/dist/plugins/travisci/src/credentials.js +24 -0
  462. package/dist/plugins/travisci/src/index.js +16 -30
  463. package/dist/plugins/trello/src/credentials.js +29 -0
  464. package/dist/plugins/trello/src/index.js +49 -64
  465. package/dist/plugins/twake/src/credentials.js +16 -0
  466. package/dist/plugins/twake/src/index.js +8 -10
  467. package/dist/plugins/twilio/src/credentials.js +23 -0
  468. package/dist/plugins/twilio/src/index.js +12 -26
  469. package/dist/plugins/twist/src/credentials.js +13 -0
  470. package/dist/plugins/twist/src/index.js +32 -44
  471. package/dist/plugins/twitter/src/credentials.js +16 -0
  472. package/dist/plugins/twitter/src/index.js +25 -37
  473. package/dist/plugins/typesafe/src/credentials.js +28 -0
  474. package/dist/plugins/typesafe/src/index.js +3 -1
  475. package/dist/plugins/typesafe/src/shared.js +23 -35
  476. package/dist/plugins/unleashedSoftware/src/credentials.js +21 -0
  477. package/dist/plugins/unleashedSoftware/src/index.js +13 -37
  478. package/dist/plugins/uplead/src/credentials.js +16 -0
  479. package/dist/plugins/uplead/src/index.js +11 -16
  480. package/dist/plugins/uproc/src/credentials.js +14 -0
  481. package/dist/plugins/uproc/src/index.js +7 -10
  482. package/dist/plugins/uptimerobot/src/credentials.js +14 -0
  483. package/dist/plugins/uptimerobot/src/index.js +28 -39
  484. package/dist/plugins/urlscanio/src/credentials.js +13 -0
  485. package/dist/plugins/urlscanio/src/index.js +13 -22
  486. package/dist/plugins/vercel/src/credentials.js +19 -0
  487. package/dist/plugins/vercel/src/deployments.js +27 -11
  488. package/dist/plugins/vercel/src/env.js +31 -12
  489. package/dist/plugins/vercel/src/index.js +2 -0
  490. package/dist/plugins/vercel/src/projects.js +6 -3
  491. package/dist/plugins/vercel/src/shared.js +32 -37
  492. package/dist/plugins/vero/src/credentials.js +17 -0
  493. package/dist/plugins/vero/src/index.js +18 -21
  494. package/dist/plugins/vonage/src/credentials.js +17 -0
  495. package/dist/plugins/vonage/src/index.js +14 -18
  496. package/dist/plugins/wekan/src/credentials.js +16 -0
  497. package/dist/plugins/wekan/src/index.js +33 -46
  498. package/dist/plugins/wolt/src/account.js +6 -0
  499. package/dist/plugins/wolt/src/catalog.js +2 -2
  500. package/dist/plugins/wolt/src/credentials.js +64 -0
  501. package/dist/plugins/wolt/src/index.js +8 -3
  502. package/dist/plugins/wolt/src/orders.js +2 -2
  503. package/dist/plugins/wolt/src/public.js +91 -0
  504. package/dist/plugins/wolt/src/shared.js +49 -158
  505. package/dist/plugins/woocommerce/src/credentials.js +16 -0
  506. package/dist/plugins/woocommerce/src/index.js +19 -37
  507. package/dist/plugins/wordpress/src/credentials.js +16 -0
  508. package/dist/plugins/wordpress/src/index.js +23 -42
  509. package/dist/plugins/xai/src/credentials.js +13 -0
  510. package/dist/plugins/xai/src/index.js +32 -31
  511. package/dist/plugins/xero/src/credentials.js +17 -0
  512. package/dist/plugins/xero/src/index.js +19 -36
  513. package/dist/plugins/yourls/src/credentials.js +17 -0
  514. package/dist/plugins/yourls/src/index.js +13 -23
  515. package/dist/plugins/zammad/src/credentials.js +15 -0
  516. package/dist/plugins/zammad/src/index.js +27 -47
  517. package/dist/plugins/zendesk/src/credentials.js +26 -0
  518. package/dist/plugins/zendesk/src/index.js +29 -48
  519. package/dist/plugins/zoho/src/credentials.js +17 -0
  520. package/dist/plugins/zoho/src/index.js +18 -38
  521. package/dist/plugins/zoom/src/credentials.js +19 -0
  522. package/dist/plugins/zoom/src/index.js +15 -30
  523. package/dist/plugins/zulip/src/credentials.js +16 -0
  524. package/dist/plugins/zulip/src/index.js +36 -42
  525. package/dist/sdk.d.ts +8 -0
  526. package/dist/sdk.js +3 -0
  527. package/package.json +2 -1
  528. package/dist/plugins/_shared/authedFetch.js +0 -33
  529. package/dist/plugins/_shared/tokenRefresh.js +0 -41
  530. package/dist/tests/helpers/engine-harness.d.ts +0 -1
  531. package/dist/tests/helpers/engine-harness.js +0 -236
@@ -1,9 +1,9 @@
1
- import { randomUUID } from "node:crypto";
1
+ import { createHmac, randomUUID } from "node:crypto";
2
2
  import { Check } from "typebox/value";
3
3
  import { AuthError } from "../auth/errors.js";
4
- import { acquireOAuth2ClientToken, acquireOAuth2JwtToken, refreshOAuth2Token, } from "../auth/oauth2.js";
4
+ import { acquireOAuth2ClientToken, acquireOAuth2JwtToken, acquireOAuth2PasswordToken, refreshOAuth2Token, } from "../auth/oauth2.js";
5
5
  import { sendResource } from "./http.js";
6
- import { headerName, resourceUrl } from "./policy.js";
6
+ import { bodyFields, bodyFormat, bounded, headerName, injectedFields, injectedHeaders, injectedParams, injectedPointers, placementsFor, pointerSlot, refuseCredentialParams, resourceUrl, TARGET_RESPONSE_LIMIT_BYTES, TARGET_TIMEOUT_LIMIT_MS, TRANSPORT_HEADERS, targetBase, targetOf, } from "./policy.js";
7
7
  import { OAuthGrantSchema, validateCredential, } from "./registry.js";
8
8
  function boundSnapshot(binding, method, snapshot) {
9
9
  if (snapshot.name !== binding.identity.name ||
@@ -16,7 +16,7 @@ function grantFrom(method, config) {
16
16
  const auth = method.authentication;
17
17
  if (auth.kind !== "oauth2")
18
18
  throw new AuthError("invalid_definition");
19
- const grant = config[auth.grantField];
19
+ const grant = config[auth.field];
20
20
  if (grant === undefined)
21
21
  return undefined;
22
22
  if (!Check(OAuthGrantSchema, grant))
@@ -33,6 +33,7 @@ function pinBinding(selection) {
33
33
  identity: { ...selection.identity },
34
34
  application: structuredClone(selection.application),
35
35
  jwtIdentity: structuredClone(selection.jwtIdentity),
36
+ resourceOwner: structuredClone(selection.resourceOwner),
36
37
  connection: {
37
38
  read: selection.connection.read.bind(selection.connection),
38
39
  update: selection.connection.update.bind(selection.connection),
@@ -51,6 +52,142 @@ function secret(value) {
51
52
  throw new AuthError("invalid_credentials");
52
53
  return value;
53
54
  }
55
+ /**
56
+ * A part sent whole as a header value, such as `Bearer <token>`: printable
57
+ * ASCII whose interior spaces are part of the value, with no control
58
+ * character and no space at either end.
59
+ */
60
+ function headerValue(value) {
61
+ if (typeof value !== "string" ||
62
+ !value ||
63
+ value !== value.trim() ||
64
+ [...value].some((char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) > 126))
65
+ throw new AuthError("invalid_credentials");
66
+ return value;
67
+ }
68
+ /**
69
+ * RFC 7617 user-pass. A colon in the username, or any byte outside printable
70
+ * ASCII, would make the header ambiguous or encoding-dependent.
71
+ */
72
+ function basicCredentials(username, password) {
73
+ if ((!username && !password) ||
74
+ username.includes(":") ||
75
+ [...username, ...password].some((char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) > 126))
76
+ throw new AuthError("invalid_credentials");
77
+ return Buffer.from(`${username}:${password}`).toString("base64");
78
+ }
79
+ /**
80
+ * A secret as one path segment: `/`, `\`, `?`, `#` and dot segments are
81
+ * refused rather than encoded; `:` and `@`, which RFC 3986 allows in a
82
+ * segment, stay literal (Telegram's `bot<id>:<token>`).
83
+ */
84
+ function pathPart(value) {
85
+ if (value === "." || value === ".." || /[/\\?#]/.test(value))
86
+ throw new AuthError("invalid_credentials");
87
+ return encodeURIComponent(value).replace(/%3A/gi, ":").replace(/%40/gi, "@");
88
+ }
89
+ /**
90
+ * Mints HS256 JWTs from a `<key id>:<hex secret>` key for `audience`,
91
+ * each issued when minted and valid five minutes. Any other key shape is
92
+ * refused here, before any IO.
93
+ */
94
+ function hs256Jwt(key, audience) {
95
+ const match = /^([A-Za-z0-9]+):((?:[0-9a-f]{2})+)$/i.exec(key);
96
+ if (!match)
97
+ throw new AuthError("invalid_credentials");
98
+ const secret = Buffer.from(match[2], "hex");
99
+ const encode = (value) => Buffer.from(JSON.stringify(value)).toString("base64url");
100
+ const header = encode({ alg: "HS256", typ: "JWT", kid: match[1] });
101
+ return () => {
102
+ const iat = Math.floor(Date.now() / 1000);
103
+ const unsigned = `${header}.${encode({ iat, exp: iat + 300, aud: audience })}`;
104
+ const signature = createHmac("sha256", secret)
105
+ .update(unsigned)
106
+ .digest("base64url");
107
+ return `${unsigned}.${signature}`;
108
+ };
109
+ }
110
+ function bearer(token) {
111
+ return ({ headers }) => headers.set("authorization", `Bearer ${token}`);
112
+ }
113
+ /**
114
+ * Adds a field to a JSON-object or form body, whose shape was checked
115
+ * before any IO; with no body, to the query.
116
+ */
117
+ function addField(request, name, value) {
118
+ if (!request.body) {
119
+ request.url.searchParams.append(name, value);
120
+ return;
121
+ }
122
+ const text = request.body.toString();
123
+ if (bodyFormat(request.headers) === "form") {
124
+ const form = new URLSearchParams(text);
125
+ form.append(name, value);
126
+ request.body = Buffer.from(form.toString());
127
+ }
128
+ else {
129
+ request.body = Buffer.from(JSON.stringify({ ...JSON.parse(text), [name]: value }));
130
+ }
131
+ }
132
+ /**
133
+ * A static secret's signer for one target, every part it places checked
134
+ * before any IO. `parts` has passed the method's schema, which the
135
+ * registry pins to exactly the declared parts, each a string; an optional
136
+ * part the connection lacks refuses the targets that place it. A query
137
+ * signature runs last, over the query every other placement has written.
138
+ */
139
+ function placeStatic(auth, parts, target) {
140
+ const part = (name) => {
141
+ const value = parts[name];
142
+ if (value === undefined)
143
+ throw new AuthError("invalid_credentials");
144
+ return value;
145
+ };
146
+ const ordered = placementsFor(auth, target).sort((a, b) => Number(a.in === "querySignature") - Number(b.in === "querySignature"));
147
+ const steps = ordered.map((placement) => {
148
+ if (placement.in === "basic") {
149
+ const value = basicCredentials(part(placement.username), part(placement.password));
150
+ return ({ headers }) => headers.set("authorization", `Basic ${value}`);
151
+ }
152
+ const value = placement.in === "header"
153
+ ? headerValue(part(placement.part))
154
+ : secret(part(placement.part));
155
+ if (placement.in === "query")
156
+ return ({ url }) => url.searchParams.append(placement.name, value);
157
+ if (placement.in === "body")
158
+ return (request) => addField(request, placement.name, value);
159
+ if (placement.in === "jsonPointer")
160
+ return (request) => {
161
+ const json = JSON.parse(String(request.body));
162
+ const slot = pointerSlot(json, placement.pointer);
163
+ if (!slot)
164
+ throw new AuthError("request_not_allowed");
165
+ slot.holder[slot.key] = value;
166
+ request.body = Buffer.from(JSON.stringify(json));
167
+ };
168
+ if (placement.in === "path") {
169
+ const segment = `${placement.prefix ?? ""}${pathPart(value)}`;
170
+ return ({ url, base }) => {
171
+ const rest = url.pathname.slice(base.length);
172
+ url.pathname = `${base}${segment}${rest ? `/${rest}` : ""}`;
173
+ };
174
+ }
175
+ const name = headerName(placement.name);
176
+ if (placement.in === "jwt") {
177
+ const mint = hs256Jwt(value, placement.audience);
178
+ return ({ headers }) => headers.set(name, `${placement.prefix ?? ""}${mint()}`);
179
+ }
180
+ if (placement.in === "querySignature")
181
+ return ({ url, headers }) => headers.set(name, createHmac("sha256", value)
182
+ .update(url.search.slice(1))
183
+ .digest("base64"));
184
+ return ({ headers }) => headers.set(name, `${placement.prefix ?? ""}${value}`);
185
+ });
186
+ return (request) => {
187
+ for (const step of steps)
188
+ step(request);
189
+ };
190
+ }
54
191
  /**
55
192
  * Trusted-host primitive, not a workspace sandbox. Callers authorize a binding on
56
193
  * every invocation. Handles own lifecycle fencing; no second lock or token cache.
@@ -65,17 +202,15 @@ export class CredentialTransport {
65
202
  timeoutMs: options.timeoutMs ?? 20_000,
66
203
  maxResponseBytes: options.maxResponseBytes ?? 8 * 1024 * 1024,
67
204
  maxRequestBytes: options.maxRequestBytes ?? 1024 * 1024,
205
+ maxTargetTimeoutMs: options.maxTargetTimeoutMs ?? 10 * 60_000,
206
+ maxTargetResponseBytes: options.maxTargetResponseBytes ?? 256 * 1024 * 1024,
68
207
  };
69
208
  if (typeof this.options.fetch !== "function" ||
70
- !Number.isInteger(this.options.timeoutMs) ||
71
- this.options.timeoutMs <= 0 ||
72
- this.options.timeoutMs > 120_000 ||
73
- !Number.isSafeInteger(this.options.maxResponseBytes) ||
74
- this.options.maxResponseBytes <= 0 ||
75
- this.options.maxResponseBytes > 64 * 1024 * 1024 ||
76
- !Number.isSafeInteger(this.options.maxRequestBytes) ||
77
- this.options.maxRequestBytes <= 0 ||
78
- this.options.maxRequestBytes > 64 * 1024 * 1024)
209
+ !bounded(this.options.timeoutMs, 120_000) ||
210
+ !bounded(this.options.maxResponseBytes, 64 * 1024 * 1024) ||
211
+ !bounded(this.options.maxRequestBytes, 64 * 1024 * 1024) ||
212
+ !bounded(this.options.maxTargetTimeoutMs, TARGET_TIMEOUT_LIMIT_MS) ||
213
+ !bounded(this.options.maxTargetResponseBytes, TARGET_RESPONSE_LIMIT_BYTES))
79
214
  throw new AuthError("invalid_definition");
80
215
  }
81
216
  async read(binding, method) {
@@ -106,30 +241,9 @@ export class CredentialTransport {
106
241
  (previous.tokens.expiresAt === undefined ||
107
242
  previous.tokens.expiresAt > Date.now())))
108
243
  return;
109
- const options = {
110
- fetch: this.options.fetch,
111
- timeoutMs: this.options.timeoutMs,
112
- };
113
- const jwtIdentity = binding.jwtIdentity;
114
- if (auth.renewal === "jwtBearer" && !jwtIdentity)
115
- throw new AuthError("invalid_credentials");
116
- const tokens = auth.renewal === "refresh"
117
- ? await refreshOAuth2Token(auth.definition, {
118
- application: binding.application,
119
- tokens: previous?.tokens ?? {},
120
- scopes: auth.scopes,
121
- }, options)
122
- : auth.renewal === "jwtBearer" && jwtIdentity
123
- ? await acquireOAuth2JwtToken(auth.definition, {
124
- identity: jwtIdentity,
125
- scopes: auth.scopes ?? [],
126
- }, options)
127
- : await acquireOAuth2ClientToken(auth.definition, {
128
- application: binding.application ?? { clientId: "" },
129
- scopes: auth.scopes,
130
- }, options);
244
+ const tokens = await this.issue(auth, binding, previous);
131
245
  const patch = {
132
- [auth.grantField]: { tokens, revision: randomUUID() },
246
+ [auth.field]: { tokens, revision: randomUUID() },
133
247
  };
134
248
  const next = { ...current, ...patch };
135
249
  validateCredential(method, next);
@@ -153,32 +267,43 @@ export class CredentialTransport {
153
267
  throw new AuthError("invalid_credentials");
154
268
  return grant;
155
269
  }
270
+ /** New tokens by the method's declared renewal, from what the binding supplies. */
271
+ issue(auth, binding, previous) {
272
+ const options = {
273
+ fetch: this.options.fetch,
274
+ timeoutMs: this.options.timeoutMs,
275
+ };
276
+ const { definition, scopes } = auth;
277
+ const { application, jwtIdentity, resourceOwner } = binding;
278
+ if (auth.renewal === "refresh")
279
+ return refreshOAuth2Token(definition, { application, tokens: previous?.tokens ?? {}, scopes }, options);
280
+ if (auth.renewal === "jwtBearer") {
281
+ if (!jwtIdentity)
282
+ throw new AuthError("invalid_credentials");
283
+ return acquireOAuth2JwtToken(definition, { identity: jwtIdentity, scopes: scopes ?? [] }, options);
284
+ }
285
+ if (auth.renewal === "password") {
286
+ if (!resourceOwner)
287
+ throw new AuthError("invalid_credentials");
288
+ return acquireOAuth2PasswordToken(definition, { owner: resourceOwner, application, scopes }, options);
289
+ }
290
+ return acquireOAuth2ClientToken(definition, { application: application ?? { clientId: "" }, scopes }, options);
291
+ }
156
292
  async request(selection, input) {
157
293
  // Pin authority, routing, headers, registration, and replayable bytes before IO.
158
294
  const binding = pinBinding(selection);
159
295
  const method = this.registry.select(binding.type, binding.method);
160
- const target = Object.hasOwn(method.targets, input.target)
161
- ? method.targets[input.target]
162
- : undefined;
163
- if (!target)
296
+ const target = targetOf(method, input.target);
297
+ if (!target || target.socket)
164
298
  throw new AuthError("request_not_allowed");
165
299
  const url = resourceUrl(target, input.path);
166
300
  const verb = input.method ?? "GET";
167
301
  if (!target.methods.includes(verb) ||
168
302
  (input.retry !== undefined && input.retry !== "never"))
169
303
  throw new AuthError("request_not_allowed");
170
- for (const name of url.searchParams.keys()) {
171
- if ([
172
- "access_token",
173
- "refresh_token",
174
- "client_secret",
175
- "api_key",
176
- "authorization",
177
- ].includes(name.toLowerCase()))
178
- throw new AuthError("request_not_allowed");
179
- }
180
304
  const auth = method.authentication;
181
- const authHeader = auth.kind === "apiKey" ? headerName(auth.header) : "authorization";
305
+ refuseCredentialParams(url, injectedParams(auth, input.target));
306
+ const reserved = injectedHeaders(auth, input.target);
182
307
  let headers;
183
308
  let body;
184
309
  try {
@@ -191,13 +316,23 @@ export class CredentialTransport {
191
316
  for (const [name, value] of Object.entries(input.headers ?? {})) {
192
317
  const normalized = headerName(name);
193
318
  if (!allowed.has(normalized) ||
194
- normalized === authHeader ||
195
- normalized === "authorization" ||
319
+ reserved.includes(normalized) ||
320
+ TRANSPORT_HEADERS.includes(normalized) ||
196
321
  normalized === target.idempotency?.header.toLowerCase() ||
197
322
  typeof value !== "string")
198
323
  throw new Error();
199
324
  headers.set(normalized, value);
200
325
  }
326
+ const copies = verb === "COPY" || verb === "MOVE";
327
+ if (copies !== (input.destination !== undefined))
328
+ throw new Error();
329
+ if (input.destination !== undefined) {
330
+ if (typeof input.destination !== "string" ||
331
+ !input.destination ||
332
+ input.destination.includes("?"))
333
+ throw new Error();
334
+ headers.set("destination", resourceUrl(target, input.destination).toString());
335
+ }
201
336
  if (input.body !== undefined) {
202
337
  if (verb === "GET" ||
203
338
  verb === "HEAD" ||
@@ -210,6 +345,21 @@ export class CredentialTransport {
210
345
  if (size > this.options.maxRequestBytes)
211
346
  throw new Error();
212
347
  body = Buffer.from(input.body);
348
+ const fields = injectedFields(auth, input.target).map((name) => name.toLowerCase());
349
+ if (fields.length &&
350
+ bodyFields(headers, body).some((name) => fields.includes(name.toLowerCase())))
351
+ throw new Error();
352
+ }
353
+ const pointers = injectedPointers(auth, input.target);
354
+ if (pointers.length) {
355
+ if (!body || bodyFormat(headers) !== "json")
356
+ throw new Error();
357
+ const json = JSON.parse(body.toString());
358
+ for (const pointer of pointers) {
359
+ const slot = pointerSlot(json, pointer);
360
+ if (!slot || slot.holder[slot.key] !== null)
361
+ throw new Error();
362
+ }
213
363
  }
214
364
  if (input.idempotencyKey !== undefined) {
215
365
  if (!target.idempotency?.methods.includes(verb))
@@ -222,16 +372,24 @@ export class CredentialTransport {
222
372
  }
223
373
  const replay = input.retry !== "never" &&
224
374
  (verb === "GET" || verb === "HEAD" || input.idempotencyKey !== undefined);
225
- let { token, grant } = await this.authorize(binding, method);
226
- const send = async (value) => {
227
- const signed = new Headers(headers);
228
- signed.set(authHeader, auth.kind === "apiKey" ? value : `Bearer ${value}`);
229
- return sendResource(url.toString(), verb, signed, body, {
230
- ...this.options,
375
+ const base = targetBase(target).pathname;
376
+ let { sign, grant } = await this.authorize(binding, method, input.target);
377
+ const send = async (signer) => {
378
+ const outgoing = {
379
+ headers: new Headers(headers),
380
+ url: new URL(url),
381
+ body,
382
+ base,
383
+ };
384
+ signer(outgoing);
385
+ return sendResource(outgoing.url.toString(), verb, outgoing.headers, outgoing.body, {
386
+ fetch: this.options.fetch,
387
+ timeoutMs: Math.min(target.timeoutMs ?? this.options.timeoutMs, this.options.maxTargetTimeoutMs),
388
+ maxResponseBytes: Math.min(target.maxResponseBytes ?? this.options.maxResponseBytes, this.options.maxTargetResponseBytes),
231
389
  resumableUpload: target.resumableUpload,
232
390
  });
233
391
  };
234
- const first = await send(token);
392
+ const first = await send(sign);
235
393
  if (auth.kind !== "oauth2" ||
236
394
  !grant ||
237
395
  !replay ||
@@ -239,7 +397,28 @@ export class CredentialTransport {
239
397
  return first;
240
398
  // Exactly one replay, only after durable renewal (or a newer committed revision).
241
399
  grant = await this.renew(binding, method, grant.revision, true);
242
- return send(secret(grant.tokens.accessToken));
400
+ return send(bearer(secret(grant.tokens.accessToken)));
401
+ }
402
+ /**
403
+ * A socket target's URL, signed by its query placements, for a host's
404
+ * relay or the local signer to open. Nothing is sent.
405
+ */
406
+ async socketUrl(selection, input) {
407
+ const binding = pinBinding(selection);
408
+ const method = this.registry.select(binding.type, binding.method);
409
+ const target = targetOf(method, input.target);
410
+ if (!target?.socket)
411
+ throw new AuthError("request_not_allowed");
412
+ const url = resourceUrl(target, input.path);
413
+ refuseCredentialParams(url, injectedParams(method.authentication, input.target));
414
+ const { sign } = await this.authorize(binding, method, input.target);
415
+ const outgoing = {
416
+ headers: new Headers(),
417
+ url,
418
+ base: targetBase(target).pathname,
419
+ };
420
+ sign(outgoing);
421
+ return outgoing.url.toString();
243
422
  }
244
423
  /** Only a declared read-only probe runs. Results never contain provider text or secrets. */
245
424
  async probe(binding) {
@@ -265,19 +444,18 @@ export class CredentialTransport {
265
444
  };
266
445
  }
267
446
  }
268
- /** Trusted-host compatibility primitive. Never expose raw tokens through a broker. */
269
- async accessToken(selection) {
270
- const binding = pinBinding(selection);
271
- return (await this.authorize(binding, this.registry.select(binding.type, binding.method))).token;
272
- }
273
- async authorize(binding, method) {
447
+ async authorize(binding, method, target) {
274
448
  const config = await this.read(binding, method);
275
449
  const auth = method.authentication;
276
- if (auth.kind !== "oauth2")
277
- return { token: secret(config[auth.field]) };
450
+ if (auth.kind === "none")
451
+ return { sign: () => { } };
452
+ if (auth.kind === "static")
453
+ return {
454
+ sign: placeStatic(auth, config[auth.field], target),
455
+ };
278
456
  let grant = grantFrom(method, config);
279
457
  if (!fresh(grant))
280
458
  grant = await this.renew(binding, method, grant?.revision);
281
- return { token: secret(grant?.tokens.accessToken), grant };
459
+ return { sign: bearer(secret(grant?.tokens.accessToken)), grant };
282
460
  }
283
461
  }
@@ -1,14 +1,31 @@
1
1
  import type { TSchema } from "typebox";
2
- import type { OAuth2Definition, OAuthApplication, OAuthJwtIdentity, OAuthTokens } from "../auth/types.js";
2
+ import type { OAuth2Definition, OAuthApplication, OAuthJwtIdentity, OAuthResourceOwner, OAuthTokens } from "../auth/types.js";
3
3
  import type { ConnectionHandle } from "../connections/types.js";
4
- export type HttpMethod = "GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE";
4
+ /** HTTP methods, and the WebDAV methods a file API needs (RFC 4918). */
5
+ export type HttpMethod = "GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE" | "MKCOL" | "COPY" | "MOVE";
5
6
  /** Host-approved resource boundary. No wildcards, templates, or agent-selected origins. */
6
7
  export interface CredentialTarget {
7
- /** HTTPS URL ending in /. Requests stay beneath this exact origin and path. */
8
+ /**
9
+ * HTTPS URL ending in /, or wss:// for a socket target. Requests stay
10
+ * beneath this exact origin and path.
11
+ */
8
12
  baseUrl: string;
13
+ /**
14
+ * A WebSocket endpoint (a browser's CDP socket): the transport signs its
15
+ * URL with the method's query placements for the plugin to open, and
16
+ * sends no request to it.
17
+ */
18
+ socket?: boolean;
9
19
  methods: HttpMethod[];
10
20
  /** Additional caller-set headers beyond Accept and Content-Type. Auth is reserved. */
11
21
  allowedHeaders?: string[];
22
+ /**
23
+ * The provider addresses one resource by a slashed name inside one
24
+ * segment, encoded (`group%2Fproject`, `@scope%2Fpkg`). Each piece
25
+ * between the decoded slashes must still be non-empty and not a dot
26
+ * segment.
27
+ */
28
+ encodedSlashes?: boolean;
12
29
  /** Google-style PUT upload acknowledgements: allow 308 only without Location. */
13
30
  resumableUpload?: boolean;
14
31
  /** Declare only when the provider guarantees deduplication for these methods. */
@@ -16,22 +33,135 @@ export interface CredentialTarget {
16
33
  header: string;
17
34
  methods: HttpMethod[];
18
35
  };
36
+ /**
37
+ * Deadline for requests to this target when the provider holds them open
38
+ * longer than the transport default (synchronous extraction, long polls).
39
+ * Capped by the host's `maxTargetTimeoutMs`.
40
+ */
41
+ timeoutMs?: number;
42
+ /**
43
+ * Response ceiling for this target when its answers are larger than the
44
+ * transport default (audio, documents). Capped by the host's
45
+ * `maxTargetResponseBytes`.
46
+ */
47
+ maxResponseBytes?: number;
19
48
  }
49
+ /**
50
+ * Where the transport puts a static secret's parts. Every name it sets is
51
+ * reserved: a caller may never supply that header, query parameter or
52
+ * body field.
53
+ */
54
+ export type SecretPlacement = ({
55
+ in: "header";
56
+ part: string;
57
+ name: string;
58
+ /** Fixed scheme before the secret, e.g. "Bearer ", "SSWS " or "Bot ". */
59
+ prefix?: string;
60
+ } | {
61
+ in: "query";
62
+ part: string;
63
+ name: string;
64
+ }
65
+ /**
66
+ * A top-level field of a JSON-object or form body; in the query when
67
+ * the request carries no body.
68
+ */
69
+ | {
70
+ in: "body";
71
+ part: string;
72
+ name: string;
73
+ }
74
+ /**
75
+ * A position deeper in a JSON body, by RFC 6901 pointer (Odoo's
76
+ * `/params/args/2`); the request carries null there for the transport
77
+ * to fill.
78
+ */
79
+ | {
80
+ in: "jsonPointer";
81
+ part: string;
82
+ pointer: string;
83
+ }
84
+ /**
85
+ * The first path segment beneath the target's base, as `<prefix><part>`:
86
+ * Telegram's `bot<token>`, an account ID before its resources.
87
+ */
88
+ | {
89
+ in: "path";
90
+ part: string;
91
+ prefix?: string;
92
+ }
93
+ /** HTTP Basic in Authorization, from two parts; either may be empty. */
94
+ | {
95
+ in: "basic";
96
+ username: string;
97
+ password: string;
98
+ }
99
+ /**
100
+ * An HS256 JWT signed per request from a `<key id>:<hex secret>` part
101
+ * (Ghost's Admin API key) for `audience`, valid five minutes, sent as
102
+ * `<name>: <prefix><token>`.
103
+ */
104
+ | {
105
+ in: "jwt";
106
+ part: string;
107
+ name: string;
108
+ prefix?: string;
109
+ audience: string;
110
+ }
111
+ /**
112
+ * An HMAC-SHA256 of the request's query string as sent, keyed by the
113
+ * part, base64 in header `name` (Unleashed); computed after every other
114
+ * placement, so it signs what goes out.
115
+ */
116
+ | {
117
+ in: "querySignature";
118
+ part: string;
119
+ name: string;
120
+ }) & {
121
+ /**
122
+ * The targets this placement signs; every target when absent. Two
123
+ * credentials in one connection, each for its own API, are two parts
124
+ * scoped to their own targets.
125
+ */
126
+ targets?: string[];
127
+ };
128
+ /**
129
+ * How a request is signed. `field` names the one top-level config field
130
+ * holding the secret: for `static`, a record of the named `parts`
131
+ * (`staticSecretSchema(parts)`), each sent through its placements; for
132
+ * `oauth2`, a revisioned OAuthGrant. `none` signs nothing: the method of a
133
+ * connection that holds no optional credential, still pinned to its
134
+ * targets.
135
+ */
20
136
  export type CredentialAuthentication = {
21
- kind: "apiKey";
22
- field: string;
23
- header: string;
137
+ kind: "none";
24
138
  } | {
25
- kind: "bearer";
139
+ kind: "static";
26
140
  field: string;
141
+ parts: string[];
142
+ /**
143
+ * Parts a connection may lack; a request to a target that places a
144
+ * missing part is refused as invalid_credentials.
145
+ */
146
+ optionalParts?: string[];
147
+ placements: SecretPlacement[];
27
148
  } | {
28
149
  kind: "oauth2";
29
- /** Top-level config field containing a revisioned OAuthGrant. */
30
- grantField: string;
150
+ field: string;
31
151
  definition: OAuth2Definition;
32
152
  /** Explicit renewal strategy, never inferred from available secrets. */
33
- renewal: "refresh" | "clientCredentials" | "jwtBearer";
153
+ renewal: "refresh" | "clientCredentials" | "jwtBearer" | "password";
34
154
  scopes?: string[];
155
+ /**
156
+ * The grant a refresh-renewed token belongs to, shared by every
157
+ * plugin declaring the same id. Its access tokens depend on the
158
+ * grant's client and token endpoint, not on the plugin that asked:
159
+ * the provider answers a refresh with every scope the grant holds
160
+ * (Google requests none; Microsoft returns every scope consented for
161
+ * the resource). One cached token then serves each of its plugins.
162
+ * Only with `renewal: "refresh"`.
163
+ */
164
+ grant?: string;
35
165
  /** Defaults to 401. A 403 must be explicitly documented by the provider. */
36
166
  rejectionStatus?: 401 | 403;
37
167
  };
@@ -55,6 +185,42 @@ export interface CredentialType {
55
185
  id: string;
56
186
  methods: Record<string, CredentialMethod>;
57
187
  }
188
+ /**
189
+ * What a connection signs with: the credential type and method, and the
190
+ * OAuth application, JWT identity and resource owner its config supplies.
191
+ * Derived from the connection's config alone — never from action input.
192
+ */
193
+ export interface CredentialSelection {
194
+ type: CredentialType;
195
+ method: string;
196
+ application?: OAuthApplication;
197
+ jwtIdentity?: OAuthJwtIdentity;
198
+ resourceOwner?: OAuthResourceOwner;
199
+ /**
200
+ * How a process signing with its own flat connection config (the CLI)
201
+ * assembles a static secret: each of its parts, from a named config
202
+ * field, a fixed value, or the two joined in order
203
+ * (`{email}/token`). Names and fixed values only, never a secret. Hosts
204
+ * that store the structured field ignore it.
205
+ */
206
+ localSecret?: Record<string, LocalSecretSource>;
207
+ }
208
+ export type LocalSecretPart = {
209
+ field: string;
210
+ } | {
211
+ value: string;
212
+ };
213
+ export type LocalSecretSource = LocalSecretPart | {
214
+ concat: LocalSecretPart[];
215
+ };
216
+ /**
217
+ * A plugin's statement of how a connection's config becomes its
218
+ * selection. Pure: no IO, no action input. Whoever holds the config signs
219
+ * from it — the plugin's own process, or a host brokering for it, which
220
+ * reads the declaration from the plugin it loaded itself. Throws
221
+ * `invalid_credentials` for a config it cannot sign with.
222
+ */
223
+ export type CredentialDeclaration = (config: Readonly<Record<string, unknown>>) => CredentialSelection;
58
224
  /** Host-authorized selection. Never derive this binding from action input. */
59
225
  export interface CredentialBinding {
60
226
  type: string;
@@ -67,6 +233,7 @@ export interface CredentialBinding {
67
233
  };
68
234
  application?: OAuthApplication;
69
235
  jwtIdentity?: OAuthJwtIdentity;
236
+ resourceOwner?: OAuthResourceOwner;
70
237
  }
71
238
  /** Revision changes on every issuance, even when the provider repeats the token value. */
72
239
  export interface OAuthGrant {