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,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { bindGetAction, bindListAction, gql, key, LABEL_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
2
+ import { bindGetAction, bindListAction, gql, LABEL_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
3
3
  export function registerLabelActions(rl) {
4
4
  const listAction = bindListAction(rl);
5
5
  const getAction = bindGetAction(rl);
@@ -32,7 +32,7 @@ export function registerLabelActions(rl) {
32
32
  async execute(input, ctx) {
33
33
  requireUnscoped(ctx, "label.create");
34
34
  const { replaceTeamLabels, ...fields } = input;
35
- const data = await gql(key(ctx), `mutation($input: IssueLabelCreateInput!, $replaceTeamLabels: Boolean) { issueLabelCreate(input: $input, replaceTeamLabels: $replaceTeamLabels) { success issueLabel { ${LABEL_FIELDS} } } }`, { input: fields, replaceTeamLabels: replaceTeamLabels ?? null });
35
+ const data = await gql(ctx, `mutation($input: IssueLabelCreateInput!, $replaceTeamLabels: Boolean) { issueLabelCreate(input: $input, replaceTeamLabels: $replaceTeamLabels) { success issueLabel { ${LABEL_FIELDS} } } }`, { input: fields, replaceTeamLabels: replaceTeamLabels ?? null });
36
36
  return data.issueLabelCreate?.issueLabel;
37
37
  },
38
38
  });
@@ -56,7 +56,7 @@ export function registerLabelActions(rl) {
56
56
  async execute(input, ctx) {
57
57
  requireUnscoped(ctx, "label.update");
58
58
  const { id, replaceTeamLabels, ...fields } = input;
59
- const data = await gql(key(ctx), `mutation($id: String!, $input: IssueLabelUpdateInput!, $replaceTeamLabels: Boolean) { issueLabelUpdate(id: $id, input: $input, replaceTeamLabels: $replaceTeamLabels) { success issueLabel { ${LABEL_FIELDS} } } }`, { id, input: fields, replaceTeamLabels: replaceTeamLabels ?? null });
59
+ const data = await gql(ctx, `mutation($id: String!, $input: IssueLabelUpdateInput!, $replaceTeamLabels: Boolean) { issueLabelUpdate(id: $id, input: $input, replaceTeamLabels: $replaceTeamLabels) { success issueLabel { ${LABEL_FIELDS} } } }`, { id, input: fields, replaceTeamLabels: replaceTeamLabels ?? null });
60
60
  return data.issueLabelUpdate?.issueLabel;
61
61
  },
62
62
  });
@@ -68,7 +68,7 @@ export function registerLabelActions(rl) {
68
68
  }),
69
69
  async execute(input, ctx) {
70
70
  requireUnscoped(ctx, "label.delete");
71
- const data = await gql(key(ctx), `mutation($id: String!) { issueLabelDelete(id: $id) { success } }`, { id: input.id });
71
+ const data = await gql(ctx, `mutation($id: String!) { issueLabelDelete(id: $id) { success } }`, { id: input.id });
72
72
  return data.issueLabelDelete;
73
73
  },
74
74
  });
@@ -80,7 +80,7 @@ export function registerLabelActions(rl) {
80
80
  }),
81
81
  async execute(input, ctx) {
82
82
  requireUnscoped(ctx, "label.retire");
83
- const data = await gql(key(ctx), `mutation($id: String!) { issueLabelRetire(id: $id) { success issueLabel { ${LABEL_FIELDS} } } }`, { id: input.id });
83
+ const data = await gql(ctx, `mutation($id: String!) { issueLabelRetire(id: $id) { success issueLabel { ${LABEL_FIELDS} } } }`, { id: input.id });
84
84
  return data.issueLabelRetire?.issueLabel;
85
85
  },
86
86
  });
@@ -92,7 +92,7 @@ export function registerLabelActions(rl) {
92
92
  }),
93
93
  async execute(input, ctx) {
94
94
  requireUnscoped(ctx, "label.restore");
95
- const data = await gql(key(ctx), `mutation($id: String!) { issueLabelRestore(id: $id) { success issueLabel { ${LABEL_FIELDS} } } }`, { id: input.id });
95
+ const data = await gql(ctx, `mutation($id: String!) { issueLabelRestore(id: $id) { success issueLabel { ${LABEL_FIELDS} } } }`, { id: input.id });
96
96
  return data.issueLabelRestore?.issueLabel;
97
97
  },
98
98
  });
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { gql, key, ORG_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
2
+ import { gql, ORG_FIELDS, requireUnscoped, withScopedNote } from "./shared.js";
3
3
  export function registerOrganizationActions(rl) {
4
4
  rl.registerAction("org.get", {
5
5
  access: "read",
@@ -7,7 +7,7 @@ export function registerOrganizationActions(rl) {
7
7
  inputSchema: t.Object({}),
8
8
  async execute(_input, ctx) {
9
9
  requireUnscoped(ctx, "org.get");
10
- const data = await gql(key(ctx), `query { organization { ${ORG_FIELDS} } }`);
10
+ const data = await gql(ctx, `query { organization { ${ORG_FIELDS} } }`);
11
11
  return data.organization;
12
12
  },
13
13
  });
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { bindGetAction, bindListAction, gql, key, MILESTONE_FIELDS, PROJECT_FIELDS, PROJECT_UPDATE_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
2
+ import { bindGetAction, bindListAction, gql, MILESTONE_FIELDS, PROJECT_FIELDS, PROJECT_UPDATE_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
3
3
  export function registerProjectActions(rl) {
4
4
  const listAction = bindListAction(rl);
5
5
  const getAction = bindGetAction(rl);
@@ -62,7 +62,7 @@ export function registerProjectActions(rl) {
62
62
  async execute(input, ctx) {
63
63
  requireUnscoped(ctx, "projects.*");
64
64
  const { slackChannelName, ...fields } = input;
65
- const data = await gql(key(ctx), `mutation($input: ProjectCreateInput!, $slackChannelName: String) { projectCreate(input: $input, slackChannelName: $slackChannelName) { success project { ${PROJECT_FIELDS} } } }`, { input: fields, slackChannelName: slackChannelName ?? null });
65
+ const data = await gql(ctx, `mutation($input: ProjectCreateInput!, $slackChannelName: String) { projectCreate(input: $input, slackChannelName: $slackChannelName) { success project { ${PROJECT_FIELDS} } } }`, { input: fields, slackChannelName: slackChannelName ?? null });
66
66
  return data.projectCreate?.project;
67
67
  },
68
68
  });
@@ -120,7 +120,7 @@ export function registerProjectActions(rl) {
120
120
  async execute(input, ctx) {
121
121
  requireUnscoped(ctx, "projects.*");
122
122
  const { id, ...fields } = input;
123
- const data = await gql(key(ctx), `mutation($id: String!, $input: ProjectUpdateInput!) { projectUpdate(id: $id, input: $input) { success project { ${PROJECT_FIELDS} } } }`, { id, input: fields });
123
+ const data = await gql(ctx, `mutation($id: String!, $input: ProjectUpdateInput!) { projectUpdate(id: $id, input: $input) { success project { ${PROJECT_FIELDS} } } }`, { id, input: fields });
124
124
  return data.projectUpdate?.project;
125
125
  },
126
126
  });
@@ -132,7 +132,7 @@ export function registerProjectActions(rl) {
132
132
  }),
133
133
  async execute(input, ctx) {
134
134
  requireUnscoped(ctx, "projects.*");
135
- const data = await gql(key(ctx), `mutation($id: String!) { projectDelete(id: $id) { success } }`, { id: input.id });
135
+ const data = await gql(ctx, `mutation($id: String!) { projectDelete(id: $id) { success } }`, { id: input.id });
136
136
  return data.projectDelete;
137
137
  },
138
138
  });
@@ -146,7 +146,7 @@ export function registerProjectActions(rl) {
146
146
  }),
147
147
  async execute(input, ctx) {
148
148
  requireUnscoped(ctx, "projects.*");
149
- const data = await gql(key(ctx), `mutation($id: String!) { projectUnarchive(id: $id) { success } }`, { id: input.id });
149
+ const data = await gql(ctx, `mutation($id: String!) { projectUnarchive(id: $id) { success } }`, { id: input.id });
150
150
  return data.projectUnarchive;
151
151
  },
152
152
  });
@@ -166,7 +166,7 @@ export function registerProjectActions(rl) {
166
166
  async execute(input, ctx) {
167
167
  requireUnscoped(ctx, "projects.*");
168
168
  const opts = input;
169
- const data = await gql(key(ctx), `query($term: String!, $first: Int, $includeComments: Boolean, $teamId: String) {
169
+ const data = await gql(ctx, `query($term: String!, $first: Int, $includeComments: Boolean, $teamId: String) {
170
170
  searchProjects(term: $term, first: $first, includeComments: $includeComments, teamId: $teamId) {
171
171
  nodes { ${PROJECT_FIELDS} }
172
172
  totalCount
@@ -206,7 +206,7 @@ export function registerProjectActions(rl) {
206
206
  }),
207
207
  async execute(input, ctx) {
208
208
  requireUnscoped(ctx, "projects.*");
209
- const data = await gql(key(ctx), `mutation($input: ProjectMilestoneCreateInput!) { projectMilestoneCreate(input: $input) { success projectMilestone { ${MILESTONE_FIELDS} } } }`, { input: input });
209
+ const data = await gql(ctx, `mutation($input: ProjectMilestoneCreateInput!) { projectMilestoneCreate(input: $input) { success projectMilestone { ${MILESTONE_FIELDS} } } }`, { input: input });
210
210
  return data.projectMilestoneCreate
211
211
  ?.projectMilestone;
212
212
  },
@@ -235,7 +235,7 @@ export function registerProjectActions(rl) {
235
235
  async execute(input, ctx) {
236
236
  requireUnscoped(ctx, "projects.*");
237
237
  const { id, ...fields } = input;
238
- const data = await gql(key(ctx), `mutation($id: String!, $input: ProjectMilestoneUpdateInput!) { projectMilestoneUpdate(id: $id, input: $input) { success projectMilestone { ${MILESTONE_FIELDS} } } }`, { id, input: fields });
238
+ const data = await gql(ctx, `mutation($id: String!, $input: ProjectMilestoneUpdateInput!) { projectMilestoneUpdate(id: $id, input: $input) { success projectMilestone { ${MILESTONE_FIELDS} } } }`, { id, input: fields });
239
239
  return data.projectMilestoneUpdate
240
240
  ?.projectMilestone;
241
241
  },
@@ -250,7 +250,7 @@ export function registerProjectActions(rl) {
250
250
  }),
251
251
  async execute(input, ctx) {
252
252
  requireUnscoped(ctx, "projects.*");
253
- const data = await gql(key(ctx), `mutation($id: String!) { projectMilestoneDelete(id: $id) { success } }`, { id: input.id });
253
+ const data = await gql(ctx, `mutation($id: String!) { projectMilestoneDelete(id: $id) { success } }`, { id: input.id });
254
254
  return data.projectMilestoneDelete;
255
255
  },
256
256
  });
@@ -278,7 +278,7 @@ export function registerProjectActions(rl) {
278
278
  }),
279
279
  async execute(input, ctx) {
280
280
  requireUnscoped(ctx, "projects.*");
281
- const data = await gql(key(ctx), `mutation($input: ProjectUpdateCreateInput!) { projectUpdateCreate(input: $input) { success projectUpdate { ${PROJECT_UPDATE_FIELDS} } } }`, { input: input });
281
+ const data = await gql(ctx, `mutation($input: ProjectUpdateCreateInput!) { projectUpdateCreate(input: $input) { success projectUpdate { ${PROJECT_UPDATE_FIELDS} } } }`, { input: input });
282
282
  return data.projectUpdateCreate
283
283
  ?.projectUpdate;
284
284
  },
@@ -303,7 +303,7 @@ export function registerProjectActions(rl) {
303
303
  async execute(input, ctx) {
304
304
  requireUnscoped(ctx, "projects.*");
305
305
  const { id, ...fields } = input;
306
- const data = await gql(key(ctx), `mutation($id: String!, $input: ProjectUpdateUpdateInput!) { projectUpdateUpdate(id: $id, input: $input) { success projectUpdate { ${PROJECT_UPDATE_FIELDS} } } }`, { id, input: fields });
306
+ const data = await gql(ctx, `mutation($id: String!, $input: ProjectUpdateUpdateInput!) { projectUpdateUpdate(id: $id, input: $input) { success projectUpdate { ${PROJECT_UPDATE_FIELDS} } } }`, { id, input: fields });
307
307
  return data.projectUpdateUpdate
308
308
  ?.projectUpdate;
309
309
  },
@@ -318,7 +318,7 @@ export function registerProjectActions(rl) {
318
318
  }),
319
319
  async execute(input, ctx) {
320
320
  requireUnscoped(ctx, "projects.*");
321
- const data = await gql(key(ctx), `mutation($id: String!) { projectUpdateArchive(id: $id) { success } }`, { id: input.id });
321
+ const data = await gql(ctx, `mutation($id: String!) { projectUpdateArchive(id: $id) { success } }`, { id: input.id });
322
322
  return data.projectUpdateArchive;
323
323
  },
324
324
  });
@@ -1,26 +1,21 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import * as t from "typebox";
3
- import { authedFetch } from "../../_shared/authedFetch.js";
4
- const GQL_URL = "https://api.linear.app/graphql";
5
- export async function gql(apiKey, query, variables) {
3
+ import { credentialJson, graphqlFailed } from "../../_shared/credentials.js";
4
+ import { linearCredential } from "./credentials.js";
5
+ export async function gql(ctx, query, variables) {
6
6
  const body = { query };
7
7
  if (variables)
8
8
  body.variables = variables;
9
- const res = await authedFetch(GQL_URL, {
9
+ const data = (await credentialJson(ctx, linearCredential, "linear", {
10
+ target: "gql",
11
+ path: "graphql",
10
12
  method: "POST",
11
- headers: { Authorization: apiKey, "Content-Type": "application/json" },
12
- body: JSON.stringify(body),
13
- });
14
- if (!res.ok)
15
- throw new Error(`Linear API error ${res.status}: ${await res.text()}`);
16
- const data = (await res.json());
13
+ json: body,
14
+ }));
17
15
  if (data.errors)
18
- throw new Error(`Linear GraphQL error: ${JSON.stringify(data.errors)}`);
16
+ throw graphqlFailed("linear", data.errors);
19
17
  return data.data;
20
18
  }
21
- export function key(ctx) {
22
- return ctx.connection.config.apiKey;
23
- }
24
19
  /**
25
20
  * The configured scope values, verbatim. Each is either a label UUID or a
26
21
  * label name — `resolveScopeLabelIds` turns the latter into the former.
@@ -41,22 +36,28 @@ export function scopeLabelValues(ctx) {
41
36
  }
42
37
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
43
38
  /**
44
- * The workspace's labels, per API key. Linear rejects a non-UUID in
39
+ * The workspace's labels. Linear rejects a non-UUID in
45
40
  * `labels: { id: { in: [...] } }` with "each value in in must be a UUID",
46
41
  * so a human-written scope value like `requester:yosi` breaks every issue
47
42
  * query (SHFT-1644) unless it is resolved to an id first. The directory is
48
- * fetched once per key and re-read on a miss, so a label created later
49
- * still resolves.
43
+ * fetched once per locally signed connection and re-read on a miss, so a
44
+ * label created later still resolves.
50
45
  *
51
- * Keyed by digest, so a long-lived Map never holds the API key itself.
46
+ * Keyed by a digest of the connection config, API key included, so a
47
+ * long-lived Map never holds the key itself. A brokered connection's config
48
+ * holds no key: two people's connections can be identical, and only the
49
+ * broker knows whose workspace answers. Brokered calls read their own
50
+ * directory every time and cache nothing.
52
51
  */
53
52
  const labelDirectories = new Map();
54
- const directoryKey = (apiKey) => createHash("sha256").update(apiKey).digest("hex");
55
- async function fetchLabelDirectory(apiKey) {
53
+ const directoryKey = (ctx) => createHash("sha256")
54
+ .update(JSON.stringify(ctx.connection.config))
55
+ .digest("hex");
56
+ async function fetchLabelDirectory(ctx) {
56
57
  const byName = new Map();
57
58
  let after = null;
58
59
  for (;;) {
59
- const data = await gql(apiKey, `query($after: String) { issueLabels(first: 250, after: $after) { nodes { id name team { key } } pageInfo { hasNextPage endCursor } } }`, { after });
60
+ const data = await gql(ctx, `query($after: String) { issueLabels(first: 250, after: $after) { nodes { id name team { key } } pageInfo { hasNextPage endCursor } } }`, { after });
60
61
  const conn = data.issueLabels;
61
62
  for (const node of conn?.nodes ?? []) {
62
63
  const name = String(node.name);
@@ -84,12 +85,14 @@ async function fetchLabelDirectory(apiKey) {
84
85
  }
85
86
  return byName;
86
87
  }
87
- function labelDirectory(apiKey, { refresh = false } = {}) {
88
- const cacheKey = directoryKey(apiKey);
88
+ function labelDirectory(ctx, { refresh = false } = {}) {
89
+ if (ctx.credentials)
90
+ return fetchLabelDirectory(ctx);
91
+ const cacheKey = directoryKey(ctx);
89
92
  const cached = refresh ? undefined : labelDirectories.get(cacheKey);
90
93
  if (cached)
91
94
  return cached;
92
- const pending = fetchLabelDirectory(apiKey);
95
+ const pending = fetchLabelDirectory(ctx);
93
96
  labelDirectories.set(cacheKey, pending);
94
97
  // A failed lookup must not be cached as the answer for this key.
95
98
  pending.catch(() => {
@@ -124,14 +127,13 @@ export async function resolveScopeLabelIds(ctx) {
124
127
  return [];
125
128
  if (values.every((v) => UUID_RE.test(v)))
126
129
  return values;
127
- const apiKey = key(ctx);
128
130
  const missing = (directory) => values.some((v) => !UUID_RE.test(v) && !directory.has(v.toLowerCase()));
129
- let directory = await labelDirectory(apiKey);
131
+ let directory = await labelDirectory(ctx);
130
132
  // A label created after the directory was cached would otherwise stay
131
133
  // unresolvable for the lifetime of the process: re-read once before
132
134
  // declaring a name unknown.
133
135
  if (missing(directory))
134
- directory = await labelDirectory(apiKey, { refresh: true });
136
+ directory = await labelDirectory(ctx, { refresh: true });
135
137
  return values.map((value) => {
136
138
  if (UUID_RE.test(value))
137
139
  return value;
@@ -164,7 +166,7 @@ export async function issueHasScope(ctx, issue) {
164
166
  labels.some((label) => ids.has(String(label.id))));
165
167
  }
166
168
  export async function getIssueForScope(ctx, issueId) {
167
- const data = await gql(key(ctx), `query($id: String!) { issue(id: $id) { id identifier labels { nodes { id name } } } }`, { id: issueId });
169
+ const data = await gql(ctx, `query($id: String!) { issue(id: $id) { id identifier labels { nodes { id name } } } }`, { id: issueId });
168
170
  return data.issue ?? null;
169
171
  }
170
172
  export async function assertIssueInScope(ctx, issueId) {
@@ -178,7 +180,7 @@ export async function assertIssueInScope(ctx, issueId) {
178
180
  export async function assertCommentInScope(ctx, commentId) {
179
181
  if (!isScoped(ctx))
180
182
  return;
181
- const data = await gql(key(ctx), `query($id: String!) { comment(id: $id) { id issue { id identifier labels { nodes { id name } } } } }`, { id: commentId });
183
+ const data = await gql(ctx, `query($id: String!) { comment(id: $id) { id issue { id identifier labels { nodes { id name } } } } }`, { id: commentId });
182
184
  const issue = data.comment?.issue;
183
185
  if (!issue || !(await issueHasScope(ctx, issue)))
184
186
  throw new Error("Linear comment is not available to this scoped connection");
@@ -186,7 +188,7 @@ export async function assertCommentInScope(ctx, commentId) {
186
188
  export async function assertAttachmentInScope(ctx, attachmentId) {
187
189
  if (!isScoped(ctx))
188
190
  return;
189
- const data = await gql(key(ctx), `query($id: String!) { attachment(id: $id) { id issue { id identifier labels { nodes { id name } } } } }`, { id: attachmentId });
191
+ const data = await gql(ctx, `query($id: String!) { attachment(id: $id) { id issue { id identifier labels { nodes { id name } } } } }`, { id: attachmentId });
190
192
  const issue = data.attachment?.issue;
191
193
  if (!issue || !(await issueHasScope(ctx, issue)))
192
194
  throw new Error("Linear attachment is not available to this scoped connection");
@@ -353,7 +355,7 @@ export function registerListAction(rl, name, description, rootField, filterTypeN
353
355
  requireRootFieldAvailable(ctx, name, rootField);
354
356
  const opts = (input ?? {});
355
357
  const { argsDecl, argsCall, vars } = buildConnArgs(opts, filterTypeName);
356
- const data = await gql(key(ctx), `query${argsDecl} { ${rootField}${argsCall} { nodes { ${selection} } pageInfo { hasNextPage endCursor } } }`, vars);
358
+ const data = await gql(ctx, `query${argsDecl} { ${rootField}${argsCall} { nodes { ${selection} } pageInfo { hasNextPage endCursor } } }`, vars);
357
359
  const conn = data[rootField];
358
360
  return { nodes: conn.nodes, pageInfo: conn.pageInfo };
359
361
  },
@@ -370,7 +372,7 @@ export function registerGetAction(rl, name, description, rootField, selection) {
370
372
  }),
371
373
  async execute(input, ctx) {
372
374
  requireRootFieldAvailable(ctx, name, rootField);
373
- const data = await gql(key(ctx), `query($id: String!) { ${rootField}(id: $id) { ${selection} } }`, { id: input.id });
375
+ const data = await gql(ctx, `query($id: String!) { ${rootField}(id: $id) { ${selection} } }`, { id: input.id });
374
376
  return data[rootField];
375
377
  },
376
378
  });
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { bindGetAction, bindListAction, gql, key, requireUnscoped, STATE_FIELDS, withScopedNote, } from "./shared.js";
2
+ import { bindGetAction, bindListAction, gql, requireUnscoped, STATE_FIELDS, withScopedNote, } from "./shared.js";
3
3
  export function registerStateActions(rl) {
4
4
  const listAction = bindListAction(rl);
5
5
  const getAction = bindGetAction(rl);
@@ -25,7 +25,7 @@ export function registerStateActions(rl) {
25
25
  }),
26
26
  async execute(input, ctx) {
27
27
  requireUnscoped(ctx, "state.create");
28
- const data = await gql(key(ctx), `mutation($input: WorkflowStateCreateInput!) { workflowStateCreate(input: $input) { success workflowState { ${STATE_FIELDS} } } }`, { input: input });
28
+ const data = await gql(ctx, `mutation($input: WorkflowStateCreateInput!) { workflowStateCreate(input: $input) { success workflowState { ${STATE_FIELDS} } } }`, { input: input });
29
29
  return data.workflowStateCreate
30
30
  ?.workflowState;
31
31
  },
@@ -43,7 +43,7 @@ export function registerStateActions(rl) {
43
43
  async execute(input, ctx) {
44
44
  requireUnscoped(ctx, "state.update");
45
45
  const { id, ...fields } = input;
46
- const data = await gql(key(ctx), `mutation($id: String!, $input: WorkflowStateUpdateInput!) { workflowStateUpdate(id: $id, input: $input) { success workflowState { ${STATE_FIELDS} } } }`, { id, input: fields });
46
+ const data = await gql(ctx, `mutation($id: String!, $input: WorkflowStateUpdateInput!) { workflowStateUpdate(id: $id, input: $input) { success workflowState { ${STATE_FIELDS} } } }`, { id, input: fields });
47
47
  return data.workflowStateUpdate
48
48
  ?.workflowState;
49
49
  },
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { bindGetAction, bindListAction, gql, key, requireUnscoped, TEAM_FIELDS, USER_FIELDS, withScopedNote, } from "./shared.js";
2
+ import { bindGetAction, bindListAction, gql, requireUnscoped, TEAM_FIELDS, USER_FIELDS, withScopedNote, } from "./shared.js";
3
3
  export function registerTeamActions(rl) {
4
4
  const listAction = bindListAction(rl);
5
5
  const getAction = bindGetAction(rl);
@@ -42,7 +42,7 @@ export function registerTeamActions(rl) {
42
42
  async execute(input, ctx) {
43
43
  requireUnscoped(ctx, "team.create");
44
44
  const { copySettingsFromTeamId, ...fields } = input;
45
- const data = await gql(key(ctx), `mutation($input: TeamCreateInput!, $copySettingsFromTeamId: String) { teamCreate(input: $input, copySettingsFromTeamId: $copySettingsFromTeamId) { success team { ${TEAM_FIELDS} } } }`, {
45
+ const data = await gql(ctx, `mutation($input: TeamCreateInput!, $copySettingsFromTeamId: String) { teamCreate(input: $input, copySettingsFromTeamId: $copySettingsFromTeamId) { success team { ${TEAM_FIELDS} } } }`, {
46
46
  input: fields,
47
47
  copySettingsFromTeamId: copySettingsFromTeamId ?? null,
48
48
  });
@@ -80,7 +80,7 @@ export function registerTeamActions(rl) {
80
80
  async execute(input, ctx) {
81
81
  requireUnscoped(ctx, "team.update");
82
82
  const { id, ...fields } = input;
83
- const data = await gql(key(ctx), `mutation($id: String!, $input: TeamUpdateInput!) { teamUpdate(id: $id, input: $input) { success team { ${TEAM_FIELDS} } } }`, { id, input: fields });
83
+ const data = await gql(ctx, `mutation($id: String!, $input: TeamUpdateInput!) { teamUpdate(id: $id, input: $input) { success team { ${TEAM_FIELDS} } } }`, { id, input: fields });
84
84
  return data.teamUpdate?.team;
85
85
  },
86
86
  });
@@ -95,7 +95,7 @@ export function registerTeamActions(rl) {
95
95
  // Team membership is workspace metadata, like user.list: readable
96
96
  // under a scoped connection (SHFT-1644).
97
97
  const { teamId, limit } = input;
98
- const data = await gql(key(ctx), `query($id: String!, $first: Int) {
98
+ const data = await gql(ctx, `query($id: String!, $first: Int) {
99
99
  team(id: $id) { members(first: $first) { nodes { ${USER_FIELDS} } } }
100
100
  }`, { id: teamId, first: limit ?? 50 });
101
101
  return data.team?.members?.nodes;
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { bindGetAction, bindListAction, gql, key, requireUnscoped, USER_FIELDS, withScopedNote, } from "./shared.js";
2
+ import { bindGetAction, bindListAction, gql, requireUnscoped, USER_FIELDS, withScopedNote, } from "./shared.js";
3
3
  export function registerUserActions(rl) {
4
4
  const listAction = bindListAction(rl);
5
5
  const getAction = bindGetAction(rl);
@@ -10,7 +10,7 @@ export function registerUserActions(rl) {
10
10
  description: "Get the authenticated user. Use this to resolve 'me' before filtering issues by assignee.",
11
11
  inputSchema: t.Object({}),
12
12
  async execute(_input, ctx) {
13
- const data = await gql(key(ctx), `query { viewer { ${USER_FIELDS} } }`);
13
+ const data = await gql(ctx, `query { viewer { ${USER_FIELDS} } }`);
14
14
  return data.viewer;
15
15
  },
16
16
  });
@@ -36,7 +36,7 @@ export function registerUserActions(rl) {
36
36
  async execute(input, ctx) {
37
37
  requireUnscoped(ctx, "user.update");
38
38
  const { id, ...fields } = input;
39
- const data = await gql(key(ctx), `mutation($id: String!, $input: UserUpdateInput!) { userUpdate(id: $id, input: $input) { success user { ${USER_FIELDS} } } }`, { id, input: fields });
39
+ const data = await gql(ctx, `mutation($id: String!, $input: UserUpdateInput!) { userUpdate(id: $id, input: $input) { success user { ${USER_FIELDS} } } }`, { id, input: fields });
40
40
  return data.userUpdate?.user;
41
41
  },
42
42
  });
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { bindGetAction, bindListAction, buildConnArgs, CUSTOM_VIEW_FIELDS, FEED_ITEM_FIELDS, gql, INITIATIVE_FIELDS, ISSUE_LITE, key, LIST_INPUT_SCHEMA, mergeIssueScopeFilter, PROJECT_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
2
+ import { bindGetAction, bindListAction, buildConnArgs, CUSTOM_VIEW_FIELDS, FEED_ITEM_FIELDS, gql, INITIATIVE_FIELDS, ISSUE_LITE, LIST_INPUT_SCHEMA, mergeIssueScopeFilter, PROJECT_FIELDS, requireUnscoped, withScopedNote, } from "./shared.js";
3
3
  const ISSUE_FILTER_DESCRIPTION = "IssueFilter payload. Examples: label { labels: { id: { in: ['label-id'] } } }; project { project: { id: { eq: 'project-id' } } }; assignee { assignee: { id: { eq: 'user-id' } } }; state { state: { id: { eq: 'state-id' } } }; priority { priority: { eq: 1 } }; due window { dueDate: { gte: '2026-06-09', lte: '2026-06-16' } }; combine with and/or arrays.";
4
4
  export function registerViewActions(rl) {
5
5
  const listAction = bindListAction(rl);
@@ -36,7 +36,7 @@ export function registerViewActions(rl) {
36
36
  callParts.push("includeSubTeams: $includeSubTeams");
37
37
  vars.includeSubTeams = opts.includeSubTeams;
38
38
  }
39
- const data = await gql(key(ctx), `query(${declParts.join(", ")}) {
39
+ const data = await gql(ctx, `query(${declParts.join(", ")}) {
40
40
  customView(id: $id) { ${connectionField}(${callParts.join(", ")}) { nodes { ${selection} } pageInfo { hasNextPage endCursor } } }
41
41
  }`, { id: opts.viewId, ...vars });
42
42
  const conn = (data.customView?.[connectionField] ?? {});
@@ -73,7 +73,7 @@ export function registerViewActions(rl) {
73
73
  }),
74
74
  async execute(input, ctx) {
75
75
  requireUnscoped(ctx, "view.create");
76
- const data = await gql(key(ctx), `mutation($input: CustomViewCreateInput!) { customViewCreate(input: $input) { success customView { ${CUSTOM_VIEW_FIELDS} } } }`, { input: input });
76
+ const data = await gql(ctx, `mutation($input: CustomViewCreateInput!) { customViewCreate(input: $input) { success customView { ${CUSTOM_VIEW_FIELDS} } } }`, { input: input });
77
77
  return data.customViewCreate?.customView;
78
78
  },
79
79
  });
@@ -105,7 +105,7 @@ export function registerViewActions(rl) {
105
105
  async execute(input, ctx) {
106
106
  requireUnscoped(ctx, "view.update");
107
107
  const { id, ...fields } = input;
108
- const data = await gql(key(ctx), `mutation($id: String!, $input: CustomViewUpdateInput!) { customViewUpdate(id: $id, input: $input) { success customView { ${CUSTOM_VIEW_FIELDS} } } }`, { id, input: fields });
108
+ const data = await gql(ctx, `mutation($id: String!, $input: CustomViewUpdateInput!) { customViewUpdate(id: $id, input: $input) { success customView { ${CUSTOM_VIEW_FIELDS} } } }`, { id, input: fields });
109
109
  return data.customViewUpdate?.customView;
110
110
  },
111
111
  });
@@ -119,7 +119,7 @@ export function registerViewActions(rl) {
119
119
  }),
120
120
  async execute(input, ctx) {
121
121
  requireUnscoped(ctx, "view.delete");
122
- const data = await gql(key(ctx), `mutation($id: String!) { customViewDelete(id: $id) { success } }`, { id: input.id });
122
+ const data = await gql(ctx, `mutation($id: String!) { customViewDelete(id: $id) { success } }`, { id: input.id });
123
123
  return data.customViewDelete;
124
124
  },
125
125
  });
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { bindGetAction, bindListAction, gql, key, requireUnscoped, WEBHOOK_FIELDS, withScopedNote, } from "./shared.js";
2
+ import { bindGetAction, bindListAction, gql, requireUnscoped, WEBHOOK_FIELDS, withScopedNote, } from "./shared.js";
3
3
  export function registerWebhookActions(rl) {
4
4
  const listAction = bindListAction(rl);
5
5
  const getAction = bindGetAction(rl);
@@ -34,7 +34,7 @@ export function registerWebhookActions(rl) {
34
34
  }),
35
35
  async execute(input, ctx) {
36
36
  requireUnscoped(ctx, "webhooks.*");
37
- const data = await gql(key(ctx), `mutation($input: WebhookCreateInput!) { webhookCreate(input: $input) { success webhook { ${WEBHOOK_FIELDS} } } }`, { input: input });
37
+ const data = await gql(ctx, `mutation($input: WebhookCreateInput!) { webhookCreate(input: $input) { success webhook { ${WEBHOOK_FIELDS} } } }`, { input: input });
38
38
  return data.webhookCreate?.webhook;
39
39
  },
40
40
  });
@@ -58,7 +58,7 @@ export function registerWebhookActions(rl) {
58
58
  async execute(input, ctx) {
59
59
  requireUnscoped(ctx, "webhooks.*");
60
60
  const { id, ...fields } = input;
61
- const data = await gql(key(ctx), `mutation($id: String!, $input: WebhookUpdateInput!) { webhookUpdate(id: $id, input: $input) { success webhook { ${WEBHOOK_FIELDS} } } }`, { id, input: fields });
61
+ const data = await gql(ctx, `mutation($id: String!, $input: WebhookUpdateInput!) { webhookUpdate(id: $id, input: $input) { success webhook { ${WEBHOOK_FIELDS} } } }`, { id, input: fields });
62
62
  return data.webhookUpdate?.webhook;
63
63
  },
64
64
  });
@@ -70,7 +70,7 @@ export function registerWebhookActions(rl) {
70
70
  }),
71
71
  async execute(input, ctx) {
72
72
  requireUnscoped(ctx, "webhooks.*");
73
- const data = await gql(key(ctx), `mutation($id: String!) { webhookDelete(id: $id) { success } }`, { id: input.id });
73
+ const data = await gql(ctx, `mutation($id: String!) { webhookDelete(id: $id) { success } }`, { id: input.id });
74
74
  return data.webhookDelete;
75
75
  },
76
76
  });
@@ -84,7 +84,7 @@ export function registerWebhookActions(rl) {
84
84
  }),
85
85
  async execute(input, ctx) {
86
86
  requireUnscoped(ctx, "webhooks.*");
87
- const data = await gql(key(ctx), `mutation($id: String!) { webhookRotateSecret(id: $id) { success secret } }`, { id: input.id });
87
+ const data = await gql(ctx, `mutation($id: String!) { webhookRotateSecret(id: $id) { success secret } }`, { id: input.id });
88
88
  return data.webhookRotateSecret;
89
89
  },
90
90
  });
@@ -0,0 +1,13 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /** An API key as a bearer to Lingvanex's one translate endpoint. */
3
+ export const lingvanexCredential = staticCredential({
4
+ id: "lingvanex",
5
+ auth: { kind: "bearer" },
6
+ local: { secret: "apiKey" },
7
+ targets: {
8
+ api: {
9
+ baseUrl: "https://api-b2b.backenster.com/b1/api/v3/",
10
+ methods: ["POST"],
11
+ },
12
+ },
13
+ });
@@ -1,6 +1,9 @@
1
+ import { credentialJson } from "../../_shared/credentials.js";
2
+ import { lingvanexCredential } from "./credentials.js";
1
3
  export default function lingvanex(rl) {
2
4
  rl.setName("lingvanex");
3
5
  rl.setVersion("0.1.0");
6
+ rl.setCredential(lingvanexCredential);
4
7
  rl.setConnectionSchema({
5
8
  apiKey: {
6
9
  type: "string",
@@ -46,17 +49,12 @@ export default function lingvanex(rl) {
46
49
  body.from = src;
47
50
  if (translateMode)
48
51
  body.translateMode = translateMode;
49
- const res = await fetch("https://api-b2b.backenster.com/b1/api/v3/translate", {
52
+ return credentialJson(ctx, lingvanexCredential, "lingvanex", {
53
+ target: "api",
54
+ path: "translate",
50
55
  method: "POST",
51
- headers: {
52
- Authorization: `Bearer ${ctx.connection.config.apiKey}`,
53
- "Content-Type": "application/json",
54
- },
55
- body: JSON.stringify(body),
56
+ json: body,
56
57
  });
57
- if (!res.ok)
58
- throw new Error(`Lingvanex error ${res.status}: ${await res.text()}`);
59
- return res.json();
60
58
  },
61
59
  });
62
60
  }
@@ -0,0 +1,17 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * An OAuth2 access token, sent as a bearer to LinkedIn's versioned REST
4
+ * origin, with the public Restli protocol and API version headers.
5
+ */
6
+ export const linkedinCredential = staticCredential({
7
+ id: "linkedin",
8
+ auth: { kind: "bearer" },
9
+ local: { secret: "accessToken" },
10
+ targets: {
11
+ api: {
12
+ baseUrl: "https://api.linkedin.com/rest/",
13
+ methods: ["POST"],
14
+ allowedHeaders: ["X-Restli-Protocol-Version", "LinkedIn-Version"],
15
+ },
16
+ },
17
+ });
@@ -1,28 +1,24 @@
1
- const BASE_URL = "https://api.linkedin.com";
2
- async function apiRequest(token, method, endpoint, body) {
3
- const isAbsolute = endpoint.startsWith("http");
4
- const url = isAbsolute ? endpoint : `${BASE_URL}/rest${endpoint}`;
5
- const opts = {
1
+ import { credentialOk, jsonAnswer } from "../../_shared/credentials.js";
2
+ import { linkedinCredential } from "./credentials.js";
3
+ async function apiRequest(ctx, method, path, body) {
4
+ const res = await credentialOk(ctx, linkedinCredential, "linkedin", {
5
+ target: "api",
6
+ path,
6
7
  method,
7
8
  headers: {
8
- Authorization: `Bearer ${token}`,
9
- Accept: "application/json",
10
9
  "X-Restli-Protocol-Version": "2.0.0",
11
10
  "LinkedIn-Version": "202504",
12
- "Content-Type": "application/json",
13
11
  },
14
- };
15
- if (body && Object.keys(body).length > 0 && method !== "GET")
16
- opts.body = JSON.stringify(body);
17
- const res = await fetch(url, opts);
12
+ ...(body && Object.keys(body).length > 0 && method !== "GET"
13
+ ? { json: body }
14
+ : {}),
15
+ });
18
16
  if (res.status === 201) {
19
17
  return { urn: res.headers.get("x-restli-id") };
20
18
  }
21
- if (!res.ok)
22
- throw new Error(`LinkedIn API error ${res.status}: ${await res.text()}`);
23
19
  if (res.status === 204)
24
20
  return { success: true };
25
- return res.json();
21
+ return jsonAnswer(res);
26
22
  }
27
23
  // LinkedIn "little text" format escaping
28
24
  function escapeText(text) {
@@ -31,6 +27,7 @@ function escapeText(text) {
31
27
  export default function linkedin(rl) {
32
28
  rl.setName("linkedin");
33
29
  rl.setVersion("0.1.0");
30
+ rl.setCredential(linkedinCredential);
34
31
  rl.setConnectionSchema({
35
32
  accessToken: {
36
33
  type: "string",
@@ -39,7 +36,6 @@ export default function linkedin(rl) {
39
36
  env: "LINKEDIN_ACCESS_TOKEN",
40
37
  },
41
38
  });
42
- const tok = (ctx) => ctx.connection.config.accessToken;
43
39
  rl.registerAction("post.create", {
44
40
  access: "write",
45
41
  description: "Create a post on LinkedIn. Supports text-only, article shares, and text with commentary. Image uploads require binary data and are not supported in this plugin.",
@@ -104,7 +100,7 @@ export default function linkedin(rl) {
104
100
  else {
105
101
  body.commentary = escapedText;
106
102
  }
107
- return apiRequest(tok(ctx), "POST", "/posts", body);
103
+ return apiRequest(ctx, "POST", "posts", body);
108
104
  },
109
105
  });
110
106
  }
@@ -0,0 +1,13 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /** An API key, sent as the X-API-KEY header to LoneScale's public API. */
3
+ export const lonescaleCredential = staticCredential({
4
+ id: "lonescale",
5
+ auth: { kind: "apiKey", header: "X-API-KEY" },
6
+ local: { secret: "apiKey" },
7
+ targets: {
8
+ api: {
9
+ baseUrl: "https://public-api.lonescale.com/",
10
+ methods: ["GET", "POST"],
11
+ },
12
+ },
13
+ });