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,26 +1,18 @@
1
- const BASE = "https://stackby.com/api/betav1";
2
- async function apiRequest(apiKey, method, endpoint, body, qs) {
3
- const url = new URL(`${BASE}${endpoint}`);
4
- if (qs) {
5
- for (const [k, v] of Object.entries(qs)) {
6
- if (v !== undefined && v !== null)
7
- url.searchParams.set(k, String(v));
8
- }
9
- }
10
- const init = {
1
+ import { credentialJson, pathSegment } from "../../_shared/credentials.js";
2
+ import { stackbyCredential } from "./credentials.js";
3
+ function apiRequest(ctx, method, endpoint, body, qs) {
4
+ return credentialJson(ctx, stackbyCredential, "stackby", {
5
+ target: "api",
6
+ path: endpoint,
11
7
  method,
12
- headers: { "api-key": apiKey, "Content-Type": "application/json" },
13
- };
14
- if (body !== undefined)
15
- init.body = JSON.stringify(body);
16
- const res = await fetch(url.toString(), init);
17
- if (!res.ok)
18
- throw new Error(`Stackby error ${res.status}: ${await res.text()}`);
19
- return res.json();
8
+ query: qs,
9
+ ...(body !== undefined ? { json: body } : {}),
10
+ });
20
11
  }
21
12
  export default function stackby(rl) {
22
13
  rl.setName("stackby");
23
14
  rl.setVersion("0.1.0");
15
+ rl.setCredential(stackbyCredential);
24
16
  rl.setConnectionSchema({
25
17
  apiKey: {
26
18
  type: "string",
@@ -29,7 +21,6 @@ export default function stackby(rl) {
29
21
  env: "STACKBY_API_KEY",
30
22
  },
31
23
  });
32
- const key = (ctx) => ctx.connection.config.apiKey;
33
24
  rl.registerAction("row.read", {
34
25
  access: "read",
35
26
  description: "Read a row by ID",
@@ -40,7 +31,7 @@ export default function stackby(rl) {
40
31
  },
41
32
  async execute(input, ctx) {
42
33
  const p = input;
43
- const data = (await apiRequest(key(ctx), "GET", `/rowlist/${p.stackId}/${encodeURIComponent(p.table)}`, undefined, { rowIds: p.rowId }));
34
+ const data = (await apiRequest(ctx, "GET", `rowlist/${pathSegment(p.stackId)}/${pathSegment(p.table)}`, undefined, { rowIds: p.rowId }));
44
35
  return data.map((d) => d.field);
45
36
  },
46
37
  });
@@ -60,7 +51,7 @@ export default function stackby(rl) {
60
51
  qs.view = p.view;
61
52
  if (p.limit)
62
53
  qs.maxrecord = p.limit;
63
- const data = (await apiRequest(key(ctx), "GET", `/rowlist/${p.stackId}/${encodeURIComponent(p.table)}`, undefined, qs));
54
+ const data = (await apiRequest(ctx, "GET", `rowlist/${pathSegment(p.stackId)}/${pathSegment(p.table)}`, undefined, qs));
64
55
  return data.map((d) => d.field);
65
56
  },
66
57
  });
@@ -78,7 +69,7 @@ export default function stackby(rl) {
78
69
  },
79
70
  async execute(input, ctx) {
80
71
  const p = input;
81
- const data = (await apiRequest(key(ctx), "POST", `/rowcreate/${p.stackId}/${encodeURIComponent(p.table)}`, { records: p.records }));
72
+ const data = (await apiRequest(ctx, "POST", `rowcreate/${pathSegment(p.stackId)}/${pathSegment(p.table)}`, { records: p.records }));
82
73
  return data.map((d) => d.field);
83
74
  },
84
75
  });
@@ -92,7 +83,7 @@ export default function stackby(rl) {
92
83
  },
93
84
  async execute(input, ctx) {
94
85
  const p = input;
95
- return apiRequest(key(ctx), "DELETE", `/rowdelete/${p.stackId}/${encodeURIComponent(p.table)}`, undefined, { rowIds: p.rowId });
86
+ return apiRequest(ctx, "DELETE", `rowdelete/${pathSegment(p.stackId)}/${pathSegment(p.table)}`, undefined, { rowIds: p.rowId });
96
87
  },
97
88
  });
98
89
  }
@@ -0,0 +1,27 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * A Steel API key: the steel-api-key header on the REST API, and the
4
+ * apiKey query parameter of a session's CDP socket, which the broker
5
+ * signs — or relays, under a host that keeps the key.
6
+ */
7
+ export const steelCredential = staticCredential({
8
+ id: "steel",
9
+ auth: {
10
+ kind: "static",
11
+ parts: ["apiKey"],
12
+ placements: [
13
+ { in: "header", part: "apiKey", name: "steel-api-key", targets: ["api"] },
14
+ { in: "query", part: "apiKey", name: "apiKey", targets: ["cdp"] },
15
+ ],
16
+ },
17
+ local: { apiKey: "apiKey" },
18
+ targets: {
19
+ // Scrapes, screenshots and PDFs answer once the page has rendered.
20
+ api: {
21
+ baseUrl: "https://api.steel.dev/",
22
+ methods: ["GET", "POST", "PUT", "PATCH", "DELETE"],
23
+ timeoutMs: 120_000,
24
+ },
25
+ cdp: { baseUrl: "wss://connect.steel.dev/", methods: ["GET"], socket: true },
26
+ },
27
+ });
@@ -1,5 +1,6 @@
1
1
  import * as t from "typebox";
2
- import { SESSION_OPTIONS_SCHEMA, api, cdpUrl, compactRecord } from "./shared.js";
2
+ import { pathSegment } from "../../_shared/credentials.js";
3
+ import { SESSION_OPTIONS_SCHEMA, api, compactRecord, socketUrl } from "./shared.js";
3
4
  const SCRAPE_SCHEMA = {
4
5
  url: t.String({ description: "URL to scrape" }),
5
6
  format: t.Optional(t.Array(t.String(), { description: "Formats: html, cleaned_html, markdown, readability" })),
@@ -90,9 +91,9 @@ export function registerBrowserActions(rl) {
90
91
  "Install it, or use the steel.page.* actions, which need nothing installed.");
91
92
  }
92
93
  const session = await api(ctx, "/v1/sessions", { method: "POST", body: compactRecord(sessionOptions) });
93
- const endpoint = cdpUrl(ctx, String(session.id));
94
94
  let browser;
95
95
  try {
96
+ const endpoint = await socketUrl(ctx, String(session.id));
96
97
  // No fallback shim on purpose. A hand-rolled lookalike that
97
98
  // answers to the same names but implements a fraction of the API
98
99
  // does not fail — it returns wrong results, which is worse.
@@ -106,7 +107,7 @@ export function registerBrowserActions(rl) {
106
107
  finally {
107
108
  await browser?.close()?.catch?.(() => { });
108
109
  if (release !== false && session.id) {
109
- await api(ctx, `/v1/sessions/${encodeURIComponent(String(session.id))}/release`, { method: "POST" }).catch(() => { });
110
+ await api(ctx, `/v1/sessions/${pathSegment(session.id)}/release`, { method: "POST" }).catch(() => { });
110
111
  }
111
112
  }
112
113
  },
@@ -1,22 +1,23 @@
1
1
  import * as t from "typebox";
2
+ import { pathSegment } from "../../_shared/credentials.js";
2
3
  import { api, compactRecord } from "./shared.js";
3
4
  export function registerCaptchaActions(rl) {
4
5
  rl.registerAction("captcha.status", {
5
6
  access: "read",
6
7
  description: "Get CAPTCHA detection/solving status for a Steel session.",
7
8
  inputSchema: t.Object({ sessionId: t.String() }),
8
- async execute(input, ctx) { return api(ctx, `/v1/sessions/${encodeURIComponent(input.sessionId)}/captchas/status`); },
9
+ async execute(input, ctx) { return api(ctx, `/v1/sessions/${pathSegment(input.sessionId)}/captchas/status`); },
9
10
  });
10
11
  rl.registerAction("captcha.solve", {
11
12
  access: "write",
12
13
  description: "Trigger CAPTCHA solving for all detected CAPTCHAs or a specific task/url/page.",
13
14
  inputSchema: t.Object({ sessionId: t.String(), taskId: t.Optional(t.String()), url: t.Optional(t.String()), pageId: t.Optional(t.String()) }),
14
- async execute(input, ctx) { const { sessionId, ...body } = input; return api(ctx, `/v1/sessions/${encodeURIComponent(String(sessionId))}/captchas/solve`, { method: "POST", body: compactRecord(body) }); },
15
+ async execute(input, ctx) { const { sessionId, ...body } = input; return api(ctx, `/v1/sessions/${pathSegment(sessionId)}/captchas/solve`, { method: "POST", body: compactRecord(body) }); },
15
16
  });
16
17
  rl.registerAction("captcha.solveImage", {
17
18
  access: "write",
18
19
  description: "Solve an image CAPTCHA by XPath selectors.",
19
20
  inputSchema: t.Object({ sessionId: t.String(), imageXPath: t.String(), inputXPath: t.String(), url: t.Optional(t.String()) }),
20
- async execute(input, ctx) { const { sessionId, ...body } = input; return api(ctx, `/v1/sessions/${encodeURIComponent(String(sessionId))}/captchas/solve-image`, { method: "POST", body: compactRecord(body) }); },
21
+ async execute(input, ctx) { const { sessionId, ...body } = input; return api(ctx, `/v1/sessions/${pathSegment(sessionId)}/captchas/solve-image`, { method: "POST", body: compactRecord(body) }); },
21
22
  });
22
23
  }
@@ -1,4 +1,5 @@
1
1
  import * as t from "typebox";
2
+ import { pathSegment } from "../../_shared/credentials.js";
2
3
  import { api } from "./shared.js";
3
4
  function extensionForm(input) {
4
5
  const form = new FormData();
@@ -29,7 +30,7 @@ export function registerExtensionActions(rl) {
29
30
  inputSchema: t.Object({ id: t.String(), url: t.String() }),
30
31
  async execute(input, ctx) {
31
32
  const { id, ...body } = input;
32
- return api(ctx, `/v1/extensions/${encodeURIComponent(String(id))}`, { method: "PUT", body: extensionForm(body) });
33
+ return api(ctx, `/v1/extensions/${pathSegment(id)}`, { method: "PUT", body: extensionForm(body) });
33
34
  },
34
35
  });
35
36
  rl.registerAction("extension.delete", {
@@ -37,7 +38,7 @@ export function registerExtensionActions(rl) {
37
38
  description: "Delete an extension by ID.",
38
39
  inputSchema: t.Object({ id: t.String() }),
39
40
  async execute(input, ctx) {
40
- return api(ctx, `/v1/extensions/${encodeURIComponent(input.id)}`, { method: "DELETE" });
41
+ return api(ctx, `/v1/extensions/${pathSegment(input.id)}`, { method: "DELETE" });
41
42
  },
42
43
  });
43
44
  rl.registerAction("extension.deleteAll", {
@@ -1,4 +1,5 @@
1
1
  import * as t from "typebox";
2
+ import { pathSegment, pathSegments } from "../../_shared/credentials.js";
2
3
  import { api } from "./shared.js";
3
4
  function fileSchema() {
4
5
  return {
@@ -13,11 +14,9 @@ function fileForm(input) {
13
14
  form.set("path", String(input.path));
14
15
  return form;
15
16
  }
16
- function normalizeFilePath(path) {
17
- return String(path).replace(/^\/files\/+/, "").replace(/^\/+/, "");
18
- }
17
+ /** A file path beneath `files/`, each segment encoded; a leading `/files/` or `/` is dropped. */
19
18
  function encodeFilePath(path) {
20
- return normalizeFilePath(path).split("/").map(encodeURIComponent).join("/");
19
+ return pathSegments(String(path).replace(/^\/files\/+/, "").replace(/^\/+/, ""));
21
20
  }
22
21
  export function registerFileActions(rl) {
23
22
  rl.registerAction("file.list", {
@@ -57,7 +56,7 @@ export function registerFileActions(rl) {
57
56
  description: "List files in a Steel session filesystem.",
58
57
  inputSchema: t.Object({ sessionId: t.String() }),
59
58
  async execute(input, ctx) {
60
- return api(ctx, `/v1/sessions/${encodeURIComponent(input.sessionId)}/files`);
59
+ return api(ctx, `/v1/sessions/${pathSegment(input.sessionId)}/files`);
61
60
  },
62
61
  });
63
62
  rl.registerAction("sessionFile.upload", {
@@ -66,7 +65,7 @@ export function registerFileActions(rl) {
66
65
  inputSchema: t.Object({ sessionId: t.String(), ...fileSchema() }),
67
66
  async execute(input, ctx) {
68
67
  const { sessionId, ...body } = input;
69
- return api(ctx, `/v1/sessions/${encodeURIComponent(String(sessionId))}/files`, { method: "POST", body: fileForm(body) });
68
+ return api(ctx, `/v1/sessions/${pathSegment(sessionId)}/files`, { method: "POST", body: fileForm(body) });
70
69
  },
71
70
  });
72
71
  rl.registerAction("sessionFile.download", {
@@ -75,7 +74,7 @@ export function registerFileActions(rl) {
75
74
  inputSchema: t.Object({ sessionId: t.String(), path: t.String() }),
76
75
  async execute(input, ctx) {
77
76
  const { sessionId, path } = input;
78
- return api(ctx, `/v1/sessions/${encodeURIComponent(String(sessionId))}/files/${encodeFilePath(path)}`);
77
+ return api(ctx, `/v1/sessions/${pathSegment(sessionId)}/files/${encodeFilePath(path)}`);
79
78
  },
80
79
  });
81
80
  rl.registerAction("sessionFile.downloadArchive", {
@@ -83,7 +82,7 @@ export function registerFileActions(rl) {
83
82
  description: "Download/read the zip archive of all files in a session.",
84
83
  inputSchema: t.Object({ sessionId: t.String() }),
85
84
  async execute(input, ctx) {
86
- return api(ctx, `/v1/sessions/${encodeURIComponent(input.sessionId)}/files.zip`);
85
+ return api(ctx, `/v1/sessions/${pathSegment(input.sessionId)}/files.zip`);
87
86
  },
88
87
  });
89
88
  rl.registerAction("sessionFile.delete", {
@@ -92,7 +91,7 @@ export function registerFileActions(rl) {
92
91
  inputSchema: t.Object({ sessionId: t.String(), path: t.String() }),
93
92
  async execute(input, ctx) {
94
93
  const { sessionId, path } = input;
95
- return api(ctx, `/v1/sessions/${encodeURIComponent(String(sessionId))}/files/${encodeFilePath(path)}`, { method: "DELETE" });
94
+ return api(ctx, `/v1/sessions/${pathSegment(sessionId)}/files/${encodeFilePath(path)}`, { method: "DELETE" });
96
95
  },
97
96
  });
98
97
  rl.registerAction("sessionFile.deleteAll", {
@@ -100,7 +99,7 @@ export function registerFileActions(rl) {
100
99
  description: "Delete all files in a session filesystem.",
101
100
  inputSchema: t.Object({ sessionId: t.String() }),
102
101
  async execute(input, ctx) {
103
- return api(ctx, `/v1/sessions/${encodeURIComponent(input.sessionId)}/files`, { method: "DELETE" });
102
+ return api(ctx, `/v1/sessions/${pathSegment(input.sessionId)}/files`, { method: "DELETE" });
104
103
  },
105
104
  });
106
105
  }
@@ -1,4 +1,5 @@
1
1
  import * as t from "typebox";
2
+ import { steelCredential } from "./auth.js";
2
3
  import { registerBrowserActions } from "./browser.js";
3
4
  import { registerCaptchaActions } from "./captchas.js";
4
5
  import { registerCredentialActions } from "./credentials.js";
@@ -10,6 +11,7 @@ import { registerSessionActions } from "./sessions.js";
10
11
  export default function steel(rl) {
11
12
  rl.setName("steel");
12
13
  rl.setVersion("0.1.0");
14
+ rl.setCredential(steelCredential);
13
15
  rl.setConnectionSchema(t.Object({
14
16
  apiKey: t.String({
15
17
  description: "Steel API key (https://app.steel.dev/settings/api-keys)",
@@ -22,7 +22,7 @@
22
22
  * freely: losing one costs latency, never correctness.
23
23
  */
24
24
  import * as t from "typebox";
25
- import { cdpUrl, compactRecord } from "../shared.js";
25
+ import { compactRecord, socketUrl } from "../shared.js";
26
26
  import { attachToPage, attachToTarget, CdpError, connectCdp, } from "./cdp.js";
27
27
  import { CdpDriver } from "./driver.js";
28
28
  import { SENSITIVE_VALUE_MARKER } from "./page-snapshot.js";
@@ -40,7 +40,7 @@ const targetId = t.Optional(t.String({
40
40
  description: "Page target id from page.targets; defaults to the session's first page.",
41
41
  }));
42
42
  async function open(ctx, id, target) {
43
- const cdp = await connectCdp(cdpUrl(ctx, id));
43
+ const cdp = await connectCdp(await socketUrl(ctx, id));
44
44
  try {
45
45
  const page = target
46
46
  ? await attachToTarget(cdp, target)
@@ -486,7 +486,7 @@ export function registerPageActions(rl) {
486
486
  const args = input;
487
487
  // Browser-level, not page-level: this is the one action that is not
488
488
  // scoped to a single target, so it uses its own short-lived socket.
489
- const cdp = await connectCdp(cdpUrl(ctx, String(args.sessionId)));
489
+ const cdp = await connectCdp(await socketUrl(ctx, String(args.sessionId)));
490
490
  try {
491
491
  if (args.action === "new") {
492
492
  const created = (await cdp.send("Target.createTarget", {
@@ -1,4 +1,5 @@
1
1
  import * as t from "typebox";
2
+ import { pathSegment } from "../../_shared/credentials.js";
2
3
  import { api } from "./shared.js";
3
4
  function profileForm(input) {
4
5
  const form = new FormData();
@@ -23,7 +24,7 @@ export function registerProfileActions(rl) {
23
24
  description: "Get a Steel profile by ID.",
24
25
  inputSchema: t.Object({ id: t.String() }),
25
26
  async execute(input, ctx) {
26
- return api(ctx, `/v1/profiles/${encodeURIComponent(input.id)}`);
27
+ return api(ctx, `/v1/profiles/${pathSegment(input.id)}`);
27
28
  },
28
29
  });
29
30
  rl.registerAction("profile.create", {
@@ -39,7 +40,7 @@ export function registerProfileActions(rl) {
39
40
  body: { timeout: 60000, inactivityTimeout: 30000, ...input, persistProfile: true },
40
41
  });
41
42
  try {
42
- await api(ctx, `/v1/sessions/${encodeURIComponent(String(session.id))}/release`, { method: "POST" });
43
+ await api(ctx, `/v1/sessions/${pathSegment(session.id)}/release`, { method: "POST" });
43
44
  }
44
45
  catch {
45
46
  // Profile creation is tied to session release. Return the session metadata even if release cleanup fails.
@@ -53,7 +54,7 @@ export function registerProfileActions(rl) {
53
54
  inputSchema: t.Object({ id: t.String(), userAgent: t.Optional(t.String()), proxy: t.Optional(t.Any()), metadata: t.Optional(t.Any()) }),
54
55
  async execute(input, ctx) {
55
56
  const { id, ...body } = input;
56
- return api(ctx, `/v1/profiles/${encodeURIComponent(String(id))}`, { method: "PATCH", body: profileForm(body) });
57
+ return api(ctx, `/v1/profiles/${pathSegment(id)}`, { method: "PATCH", body: profileForm(body) });
57
58
  },
58
59
  });
59
60
  }
@@ -1,5 +1,6 @@
1
1
  import * as t from "typebox";
2
- import { LIST_INPUT_SCHEMA, SESSION_OPTIONS_SCHEMA, api, cdpUrl, compactRecord } from "./shared.js";
2
+ import { pathSegment } from "../../_shared/credentials.js";
3
+ import { LIST_INPUT_SCHEMA, SESSION_OPTIONS_SCHEMA, api, compactRecord, socketUrl } from "./shared.js";
3
4
  export function registerSessionActions(rl) {
4
5
  rl.registerAction("session.create", {
5
6
  access: "write",
@@ -22,7 +23,7 @@ export function registerSessionActions(rl) {
22
23
  description: "Get a Steel session by ID.",
23
24
  inputSchema: t.Object({ id: t.String({ description: "Session ID" }) }),
24
25
  async execute(input, ctx) {
25
- return api(ctx, `/v1/sessions/${encodeURIComponent(input.id)}`);
26
+ return api(ctx, `/v1/sessions/${pathSegment(input.id)}`);
26
27
  },
27
28
  });
28
29
  rl.registerAction("session.release", {
@@ -30,7 +31,7 @@ export function registerSessionActions(rl) {
30
31
  description: "Release a Steel session when work is done.",
31
32
  inputSchema: t.Object({ id: t.String({ description: "Session ID" }) }),
32
33
  async execute(input, ctx) {
33
- return api(ctx, `/v1/sessions/${encodeURIComponent(input.id)}/release`, { method: "POST" });
34
+ return api(ctx, `/v1/sessions/${pathSegment(input.id)}/release`, { method: "POST" });
34
35
  },
35
36
  });
36
37
  rl.registerAction("session.releaseAll", {
@@ -46,7 +47,7 @@ export function registerSessionActions(rl) {
46
47
  for (const session of live) {
47
48
  const id = String(session.id);
48
49
  try {
49
- released.push({ id, result: await api(ctx, `/v1/sessions/${encodeURIComponent(id)}/release`, { method: "POST" }) });
50
+ released.push({ id, result: await api(ctx, `/v1/sessions/${pathSegment(id)}/release`, { method: "POST" }) });
50
51
  }
51
52
  catch (error) {
52
53
  failed.push({ id, error: String(error.message ?? error) });
@@ -60,7 +61,7 @@ export function registerSessionActions(rl) {
60
61
  description: "Capture cookies/localStorage context from a live session. Treat output as sensitive auth material.",
61
62
  inputSchema: t.Object({ id: t.String({ description: "Session ID" }) }),
62
63
  async execute(input, ctx) {
63
- return api(ctx, `/v1/sessions/${encodeURIComponent(input.id)}/context`);
64
+ return api(ctx, `/v1/sessions/${pathSegment(input.id)}/context`);
64
65
  },
65
66
  });
66
67
  rl.registerAction("session.traces", {
@@ -73,7 +74,7 @@ export function registerSessionActions(rl) {
73
74
  }),
74
75
  async execute(input, ctx) {
75
76
  const { id, ...query } = input;
76
- return api(ctx, `/v1/sessions/${encodeURIComponent(String(id))}/agent-traces`, { query });
77
+ return api(ctx, `/v1/sessions/${pathSegment(id)}/agent-traces`, { query });
77
78
  },
78
79
  });
79
80
  rl.registerAction("session.computer", {
@@ -94,7 +95,7 @@ export function registerSessionActions(rl) {
94
95
  async execute(input, ctx) {
95
96
  const { id, deltaX, deltaY, ...body } = input;
96
97
  const payload = compactRecord({ ...body, delta_x: deltaX, delta_y: deltaY });
97
- return api(ctx, `/v1/sessions/${encodeURIComponent(String(id))}/computer`, { method: "POST", body: payload });
98
+ return api(ctx, `/v1/sessions/${pathSegment(id)}/computer`, { method: "POST", body: payload });
98
99
  },
99
100
  });
100
101
  rl.registerAction("session.events", {
@@ -102,7 +103,7 @@ export function registerSessionActions(rl) {
102
103
  description: "Fetch legacy recorded session events for replay tooling.",
103
104
  inputSchema: t.Object({ id: t.String({ description: "Session ID" }) }),
104
105
  async execute(input, ctx) {
105
- return api(ctx, `/v1/sessions/${encodeURIComponent(input.id)}/events`);
106
+ return api(ctx, `/v1/sessions/${pathSegment(input.id)}/events`);
106
107
  },
107
108
  });
108
109
  rl.registerAction("session.hls", {
@@ -110,16 +111,15 @@ export function registerSessionActions(rl) {
110
111
  description: "Fetch the HLS playlist for a recorded headful Steel session.",
111
112
  inputSchema: t.Object({ id: t.String({ description: "Session ID" }) }),
112
113
  async execute(input, ctx) {
113
- return api(ctx, `/v1/sessions/${encodeURIComponent(input.id)}/hls`);
114
+ return api(ctx, `/v1/sessions/${pathSegment(input.id)}/hls`);
114
115
  },
115
116
  });
116
117
  rl.registerAction("session.cdpUrl", {
117
118
  access: "read",
118
- description: "Build a Playwright/Puppeteer CDP URL for a Steel session using the configured API key.",
119
- inputSchema: t.Object({ id: t.String({ description: "Session ID" }), websocketUrl: t.Optional(t.String({ description: "Optional websocketUrl returned by session.create. If omitted, uses wss://connect.steel.dev with sessionId." })) }),
119
+ description: "A Playwright/Puppeteer CDP URL for a Steel session. Locally it carries the connection's API key, so treat it as secret; under a host that keeps the key it is the host's relay.",
120
+ inputSchema: t.Object({ id: t.String({ description: "Session ID" }) }),
120
121
  async execute(input, ctx) {
121
- const { id, websocketUrl } = input;
122
- return { cdpUrl: cdpUrl(ctx, id, websocketUrl) };
122
+ return { cdpUrl: await socketUrl(ctx, input.id) };
123
123
  },
124
124
  });
125
125
  }
@@ -1,61 +1,31 @@
1
1
  import * as t from "typebox";
2
- const BASE_URL = "https://api.steel.dev";
3
- export function apiKey(ctx) {
4
- return ctx.connection.config.apiKey;
5
- }
2
+ import { credentialOk, credentialSocketUrl, jsonAnswer, multipartBody } from "../../_shared/credentials.js";
3
+ import { steelCredential } from "./auth.js";
4
+ /** A REST call: a JSON answer parsed, any other answer (a file) as text. */
6
5
  export async function api(ctx, path, options = {}) {
7
- const url = new URL(path, BASE_URL);
8
- for (const [key, value] of Object.entries(options.query ?? {})) {
9
- if (value === undefined || value === null || value === "")
10
- continue;
11
- if (Array.isArray(value)) {
12
- for (const item of value)
13
- url.searchParams.append(key, String(item));
14
- }
15
- else {
16
- url.searchParams.set(key, String(value));
17
- }
18
- }
19
- const headers = {
20
- "steel-api-key": apiKey(ctx),
21
- ...(options.headers ?? {}),
22
- };
23
- let body;
24
- if (options.body !== undefined) {
25
- if (options.body instanceof FormData) {
26
- body = options.body;
27
- }
28
- else {
29
- headers["Content-Type"] = "application/json";
30
- body = JSON.stringify(options.body);
31
- }
32
- }
33
- const res = await fetch(url.toString(), {
6
+ const query = Object.fromEntries(Object.entries(options.query ?? {}).filter(([, value]) => value !== ""));
7
+ const upload = options.body instanceof FormData ? await multipartBody(options.body) : undefined;
8
+ const res = await credentialOk(ctx, steelCredential, "steel", {
9
+ target: "api",
10
+ path: path.replace(/^\//, ""),
34
11
  method: options.method ?? "GET",
35
- headers,
36
- body,
12
+ query,
13
+ ...(upload
14
+ ? { body: upload.body, headers: { "Content-Type": upload.contentType } }
15
+ : options.body !== undefined
16
+ ? { json: options.body }
17
+ : {}),
37
18
  });
38
- const text = await res.text();
39
- if (!res.ok)
40
- throw new Error(`Steel API error ${res.status}: ${text || res.statusText}`);
41
- if (!text)
42
- return {};
43
- const contentType = res.headers.get("content-type") ?? "";
44
- if (contentType.includes("application/json") || text.startsWith("{") || text.startsWith("["))
45
- return JSON.parse(text);
46
- return text;
19
+ const type = res.headers.get("content-type") ?? "";
20
+ return res.status === 204 || type.includes("application/json") ? jsonAnswer(res) : res.text();
47
21
  }
48
22
  /**
49
- * The CDP endpoint for a session. One definition: this URL carries the
50
- * API key, so a second hand-written copy is a second place to leak it or
51
- * to forget encoding.
23
+ * The CDP socket URL for a session, from the broker: signed with the key
24
+ * by the local signer, or a relay the host controls. One definition, so
25
+ * no copy builds a key-bearing URL by hand.
52
26
  */
53
- export function cdpUrl(ctx, sessionId, websocketUrl) {
54
- const key = encodeURIComponent(apiKey(ctx));
55
- if (websocketUrl) {
56
- return `${websocketUrl}${websocketUrl.includes("?") ? "&" : "?"}apiKey=${key}`;
57
- }
58
- return `wss://connect.steel.dev?apiKey=${key}&sessionId=${encodeURIComponent(sessionId)}`;
27
+ export function socketUrl(ctx, sessionId) {
28
+ return credentialSocketUrl(ctx, steelCredential, { target: "cdp", path: "", query: { sessionId } });
59
29
  }
60
30
  export function compactRecord(input) {
61
31
  return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined && value !== null));
@@ -0,0 +1,37 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * A Content Delivery token, appended as the token query parameter on the
4
+ * content API, and a Management API token, sent in Authorization on the
5
+ * management API. A connection may hold either or both; a call to an API
6
+ * whose token it lacks is refused.
7
+ */
8
+ export const storyblokCredential = staticCredential({
9
+ id: "storyblok",
10
+ auth: {
11
+ kind: "static",
12
+ parts: ["contentToken", "managementToken"],
13
+ optionalParts: ["contentToken", "managementToken"],
14
+ placements: [
15
+ {
16
+ in: "query",
17
+ part: "contentToken",
18
+ name: "token",
19
+ targets: ["content"],
20
+ },
21
+ {
22
+ in: "header",
23
+ part: "managementToken",
24
+ name: "Authorization",
25
+ targets: ["management"],
26
+ },
27
+ ],
28
+ },
29
+ local: { contentToken: "contentToken", managementToken: "managementToken" },
30
+ targets: {
31
+ content: { baseUrl: "https://api.storyblok.com/v1/cdn/", methods: ["GET"] },
32
+ management: {
33
+ baseUrl: "https://mapi.storyblok.com/v1/spaces/",
34
+ methods: ["GET", "DELETE"],
35
+ },
36
+ },
37
+ });