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
@@ -35,7 +35,8 @@
35
35
  * raw rows / objects and callers post-filter.
36
36
  */
37
37
  import * as t from "typebox";
38
- import { googleJsonRequest } from "../../_shared/googleAuth.js";
38
+ import { pathSegment } from "../../_shared/credentials.js";
39
+ import { googleCredential, googleJsonRequest, googleOAuth, } from "../../_shared/googleAuth.js";
39
40
  import { Id, JsonValue, NonEmptyString, NonNegativeInteger, PositiveInteger, RawGoogleObject, StringArray, stringEnum, } from "../../_shared/googleSchemas.js";
40
41
  const ROW_NUMBER = "row_number";
41
42
  const sheetReferenceSchema = t.Union([NonEmptyString, NonNegativeInteger]);
@@ -80,19 +81,16 @@ async function sheetsRequest(ctx, method, path, body, qs, baseOverride) {
80
81
  }
81
82
  // ─── A1 helpers ─────────────────────────────────────────────────
82
83
  /**
83
- * Encode a range like `Sheet1!A1:B5` for use in a URL. Google's
84
- * docs are explicit that the sheet-name portion needs URL-encoding
85
- * (for non-ASCII / spaces) but the range portion should not be, so
86
- * we split on `!` and encode only the left side. A bare sheet name
87
- * gets wrapped in single quotes so Sheets doesn't try to parse
88
- * something like `ABC` as an A1 range.
84
+ * A range like `Sheet1!A1:B5` as one encoded path segment, as Google's
85
+ * own clients send it. A bare sheet name is wrapped in single quotes so
86
+ * Sheets doesn't parse something like `ABC` as an A1 range.
89
87
  */
90
88
  function encodeA1(range) {
91
- if (range.includes("!")) {
92
- const [sheet, ranges] = range.split("!");
93
- return `${encodeURIComponent(sheet)}!${ranges}`;
94
- }
95
- return encodeURIComponent(`'${range}'`);
89
+ return pathSegment(range.includes("!") ? range : `'${range}'`);
90
+ }
91
+ /** A spreadsheet's API path, its ID one path segment. */
92
+ function spreadsheetPath(spreadsheetId) {
93
+ return `/v4/spreadsheets/${pathSegment(spreadsheetId)}`;
96
94
  }
97
95
  function columnNumberToLetter(n) {
98
96
  let s = "";
@@ -155,11 +153,11 @@ function rowsToObjects(rows, headerRow) {
155
153
  }
156
154
  // ─── Sheet operations (shared helpers) ──────────────────────────
157
155
  async function getValues(ctx, spreadsheetId, range, valueRenderOption = "FORMATTED_VALUE", dateTimeRenderOption = "FORMATTED_STRING") {
158
- const res = (await sheetsRequest(ctx, "GET", `/v4/spreadsheets/${spreadsheetId}/values/${encodeA1(range)}`, undefined, { valueRenderOption, dateTimeRenderOption }));
156
+ const res = (await sheetsRequest(ctx, "GET", `${spreadsheetPath(spreadsheetId)}/values/${encodeA1(range)}`, undefined, { valueRenderOption, dateTimeRenderOption }));
159
157
  return res.values ?? [];
160
158
  }
161
159
  async function getSheetProperties(ctx, spreadsheetId) {
162
- const res = (await sheetsRequest(ctx, "GET", `/v4/spreadsheets/${spreadsheetId}`, undefined, { fields: "sheets.properties" }));
160
+ const res = (await sheetsRequest(ctx, "GET", spreadsheetPath(spreadsheetId), undefined, { fields: "sheets.properties" }));
163
161
  return res.sheets.map((s) => s.properties);
164
162
  }
165
163
  async function resolveSheetId(ctx, spreadsheetId, sheetNameOrId) {
@@ -176,10 +174,10 @@ async function resolveSheetId(ctx, spreadsheetId, sheetNameOrId) {
176
174
  return match.sheetId;
177
175
  }
178
176
  async function batchValuesUpdate(ctx, spreadsheetId, data, valueInputOption) {
179
- return sheetsRequest(ctx, "POST", `/v4/spreadsheets/${spreadsheetId}/values:batchUpdate`, { data, valueInputOption });
177
+ return sheetsRequest(ctx, "POST", `${spreadsheetPath(spreadsheetId)}/values:batchUpdate`, { data, valueInputOption });
180
178
  }
181
179
  async function spreadsheetBatchUpdate(ctx, spreadsheetId, requests) {
182
- return sheetsRequest(ctx, "POST", `/v4/spreadsheets/${spreadsheetId}:batchUpdate`, { requests });
180
+ return sheetsRequest(ctx, "POST", `${spreadsheetPath(spreadsheetId)}:batchUpdate`, { requests });
183
181
  }
184
182
  async function appendEmptyRow(ctx, spreadsheetId, sheetId) {
185
183
  // Called before every non-API-append write to protect the
@@ -339,39 +337,8 @@ function a1RangeToGridRange(a1, sheetId) {
339
337
  export default function googleSheets(rl) {
340
338
  rl.setName("googleSheets");
341
339
  rl.setVersion("0.1.0");
342
- rl.setOAuth({
343
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
344
- tokenUrl: "https://oauth2.googleapis.com/token",
345
- scopes: SCOPES,
346
- authParams: { access_type: "offline", prompt: "consent" },
347
- setupHelp: [
348
- "You need a Google Cloud OAuth client. Takes ~5 minutes, one time.",
349
- "",
350
- "1. Create or pick a Google Cloud project:",
351
- " https://console.cloud.google.com/projectcreate",
352
- "",
353
- "2. Enable the Google Sheets API (and Drive API, required for",
354
- " spreadsheet.delete):",
355
- " https://console.cloud.google.com/apis/library/sheets.googleapis.com",
356
- " https://console.cloud.google.com/apis/library/drive.googleapis.com",
357
- "",
358
- "3. Configure the OAuth consent screen:",
359
- " https://console.cloud.google.com/apis/credentials/consent",
360
- " • Audience: External",
361
- "",
362
- "4. Add yourself as a test user:",
363
- " https://console.cloud.google.com/auth/audience",
364
- "",
365
- "5. Create the OAuth client:",
366
- " https://console.cloud.google.com/apis/credentials",
367
- " • + Create credentials → OAuth client ID",
368
- " • Application type: Web application",
369
- " • Authorized redirect URIs → + Add URI: {{redirectUri}}",
370
- "",
371
- "6. Paste the Client ID and Client Secret below, or export",
372
- " GOOGLE_SHEETS_CLIENT_ID and GOOGLE_SHEETS_CLIENT_SECRET.",
373
- ],
374
- });
340
+ rl.setCredential(googleCredential("googleSheets", SCOPES));
341
+ rl.setOAuth(googleOAuth("googleSheets", SCOPES, "GOOGLE_SHEETS"));
375
342
  rl.setConnectionSchema({
376
343
  authMethod: { type: "string", required: false, description: "delegated or serviceAccount (legacy configs infer the method)" },
377
344
  clientId: {
@@ -464,7 +431,7 @@ export default function googleSheets(rl) {
464
431
  qs.ranges = p.ranges;
465
432
  if (p.fields)
466
433
  qs.fields = p.fields;
467
- return sheetsRequest(ctx, "GET", `/v4/spreadsheets/${p.spreadsheetId}`, undefined, qs);
434
+ return sheetsRequest(ctx, "GET", spreadsheetPath(p.spreadsheetId), undefined, qs);
468
435
  },
469
436
  });
470
437
  rl.registerAction("spreadsheet.delete", {
@@ -473,7 +440,7 @@ export default function googleSheets(rl) {
473
440
  inputSchema: t.Object({ spreadsheetId: Id }, { additionalProperties: false }),
474
441
  async execute(input, ctx) {
475
442
  const p = (input ?? {});
476
- await sheetsRequest(ctx, "DELETE", `/drive/v3/files/${p.spreadsheetId}`, undefined, undefined, "https://www.googleapis.com");
443
+ await sheetsRequest(ctx, "DELETE", `/drive/v3/files/${pathSegment(p.spreadsheetId)}`, undefined, undefined, "https://www.googleapis.com");
477
444
  return { success: true };
478
445
  },
479
446
  });
@@ -627,12 +594,12 @@ export default function googleSheets(rl) {
627
594
  if (newCols.length > 0) {
628
595
  headers = [...headers, ...newCols];
629
596
  // Write the extended header row back to the sheet.
630
- await sheetsRequest(ctx, "PUT", `/v4/spreadsheets/${spreadsheetId}/values/${encodeA1(`${sheetName}!A${headerRowIdx + 1}`)}`, { range: `${sheetName}!A${headerRowIdx + 1}`, values: [headers] }, { valueInputOption });
597
+ await sheetsRequest(ctx, "PUT", `${spreadsheetPath(spreadsheetId)}/values/${encodeA1(`${sheetName}!A${headerRowIdx + 1}`)}`, { range: `${sheetName}!A${headerRowIdx + 1}`, values: [headers] }, { valueInputOption });
631
598
  }
632
599
  values = objectsToRows(rows, headers);
633
600
  }
634
601
  if (p.useAppend) {
635
- return sheetsRequest(ctx, "POST", `/v4/spreadsheets/${spreadsheetId}/values/${encodeA1(sheetName)}:append`, { range: sheetName, values }, { valueInputOption, insertDataOption: "INSERT_ROWS" });
602
+ return sheetsRequest(ctx, "POST", `${spreadsheetPath(spreadsheetId)}/values/${encodeA1(sheetName)}:append`, { range: sheetName, values }, { valueInputOption, insertDataOption: "INSERT_ROWS" });
636
603
  }
637
604
  // PUT at lastRow+1: calculate lastRow from current sheet contents.
638
605
  const existing = await getValues(ctx, spreadsheetId, sheetName, "UNFORMATTED_VALUE");
@@ -640,7 +607,7 @@ export default function googleSheets(rl) {
640
607
  const sheetId = await resolveSheetId(ctx, spreadsheetId, sheetName);
641
608
  await appendEmptyRow(ctx, spreadsheetId, sheetId);
642
609
  const targetRange = `${sheetName}!${lastRow + 1}:${lastRow + values.length}`;
643
- return sheetsRequest(ctx, "PUT", `/v4/spreadsheets/${spreadsheetId}/values/${encodeA1(targetRange)}`, { range: targetRange, values }, { valueInputOption });
610
+ return sheetsRequest(ctx, "PUT", `${spreadsheetPath(spreadsheetId)}/values/${encodeA1(targetRange)}`, { range: targetRange, values }, { valueInputOption });
644
611
  },
645
612
  });
646
613
  // ── Update ────────────────────────────────────────────
@@ -782,13 +749,13 @@ export default function googleSheets(rl) {
782
749
  }
783
750
  if (mode === "wholeSheet" && p.keepFirstRow) {
784
751
  const firstRow = await getValues(ctx, p.spreadsheetId, `${sheetName}!1:1`, "FORMATTED_VALUE");
785
- await sheetsRequest(ctx, "POST", `/v4/spreadsheets/${p.spreadsheetId}/values/${encodeA1(range)}:clear`, {});
752
+ await sheetsRequest(ctx, "POST", `${spreadsheetPath(p.spreadsheetId)}/values/${encodeA1(range)}:clear`, {});
786
753
  if (firstRow.length > 0) {
787
- await sheetsRequest(ctx, "PUT", `/v4/spreadsheets/${p.spreadsheetId}/values/${encodeA1(`${sheetName}!1:1`)}`, { range: `${sheetName}!1:1`, values: firstRow }, { valueInputOption: "RAW" });
754
+ await sheetsRequest(ctx, "PUT", `${spreadsheetPath(p.spreadsheetId)}/values/${encodeA1(`${sheetName}!1:1`)}`, { range: `${sheetName}!1:1`, values: firstRow }, { valueInputOption: "RAW" });
788
755
  }
789
756
  return { success: true };
790
757
  }
791
- return sheetsRequest(ctx, "POST", `/v4/spreadsheets/${p.spreadsheetId}/values/${encodeA1(range)}:clear`, {});
758
+ return sheetsRequest(ctx, "POST", `${spreadsheetPath(p.spreadsheetId)}/values/${encodeA1(range)}:clear`, {});
792
759
  },
793
760
  });
794
761
  // ── Delete rows/columns ───────────────────────────────
@@ -887,7 +854,7 @@ export default function googleSheets(rl) {
887
854
  // If we added new columns, extend the header row on the sheet first.
888
855
  if (prepared.newColumns.length > 0) {
889
856
  headers = [...headers, ...prepared.newColumns];
890
- await sheetsRequest(ctx, "PUT", `/v4/spreadsheets/${spreadsheetId}/values/${encodeA1(`${sheetName}!${headerRowIdx + 1}:${headerRowIdx + 1}`)}`, {
857
+ await sheetsRequest(ctx, "PUT", `${spreadsheetPath(spreadsheetId)}/values/${encodeA1(`${sheetName}!${headerRowIdx + 1}:${headerRowIdx + 1}`)}`, {
891
858
  range: `${sheetName}!${headerRowIdx + 1}:${headerRowIdx + 1}`,
892
859
  values: [headers],
893
860
  }, { valueInputOption });
@@ -904,13 +871,13 @@ export default function googleSheets(rl) {
904
871
  if (upsert && prepared.appendData.length > 0) {
905
872
  const values = objectsToRows(prepared.appendData, headers);
906
873
  if (p.useAppend) {
907
- await sheetsRequest(ctx, "POST", `/v4/spreadsheets/${spreadsheetId}/values/${encodeA1(sheetName)}:append`, { range: sheetName, values }, { valueInputOption, insertDataOption: "INSERT_ROWS" });
874
+ await sheetsRequest(ctx, "POST", `${spreadsheetPath(spreadsheetId)}/values/${encodeA1(sheetName)}:append`, { range: sheetName, values }, { valueInputOption, insertDataOption: "INSERT_ROWS" });
908
875
  }
909
876
  else {
910
877
  const lastRow = sheetData.length;
911
878
  await appendEmptyRow(ctx, spreadsheetId, sheetId);
912
879
  const targetRange = `${sheetName}!${lastRow + 1}:${lastRow + values.length}`;
913
- await sheetsRequest(ctx, "PUT", `/v4/spreadsheets/${spreadsheetId}/values/${encodeA1(targetRange)}`, { range: targetRange, values }, { valueInputOption });
880
+ await sheetsRequest(ctx, "PUT", `${spreadsheetPath(spreadsheetId)}/values/${encodeA1(targetRange)}`, { range: targetRange, values }, { valueInputOption });
914
881
  }
915
882
  }
916
883
  return {
@@ -21,7 +21,8 @@
21
21
  */
22
22
  import { writeFileSync } from "node:fs";
23
23
  import * as t from "typebox";
24
- import { googleJsonRequest, googleDownload } from "../../_shared/googleAuth.js";
24
+ import { pathSegment } from "../../_shared/credentials.js";
25
+ import { googleCredential, googleDownload, googleJsonRequest, googleOAuth, } from "../../_shared/googleAuth.js";
25
26
  import { Id, NonEmptyString, PositiveInteger, RawGoogleObject, StringArray, stringEnum, } from "../../_shared/googleSchemas.js";
26
27
  // ─── Request ─────────────────────────────────────────────────────
27
28
  const API_BASE = "https://slides.googleapis.com/v1";
@@ -38,44 +39,15 @@ function extractPresentationId(input) {
38
39
  if (!input)
39
40
  throw new Error("googleSlides: presentationId or URL is required");
40
41
  const m = input.match(PRES_URL_REGEX);
41
- return m ? m[1] : input;
42
+ return pathSegment(m ? m[1] : input);
42
43
  }
43
44
  // ─── Plugin ──────────────────────────────────────────────────────
44
45
  const SCOPES = ["https://www.googleapis.com/auth/presentations"];
45
46
  export default function googleSlides(rl) {
46
47
  rl.setName("googleSlides");
47
48
  rl.setVersion("0.1.0");
48
- rl.setOAuth({
49
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
50
- tokenUrl: "https://oauth2.googleapis.com/token",
51
- scopes: SCOPES,
52
- authParams: { access_type: "offline", prompt: "consent" },
53
- setupHelp: [
54
- "You need a Google Cloud OAuth client. Takes ~5 minutes, one time.",
55
- "",
56
- "1. Create or pick a Google Cloud project:",
57
- " https://console.cloud.google.com/projectcreate",
58
- "",
59
- "2. Enable the Google Slides API:",
60
- " https://console.cloud.google.com/apis/library/slides.googleapis.com",
61
- "",
62
- "3. Configure the OAuth consent screen:",
63
- " https://console.cloud.google.com/apis/credentials/consent",
64
- " • Audience: External",
65
- "",
66
- "4. Add yourself as a test user:",
67
- " https://console.cloud.google.com/auth/audience",
68
- "",
69
- "5. Create the OAuth client:",
70
- " https://console.cloud.google.com/apis/credentials",
71
- " • + Create credentials → OAuth client ID",
72
- " • Application type: Web application",
73
- " • Authorized redirect URIs → + Add URI: {{redirectUri}}",
74
- "",
75
- "6. Paste the Client ID and Client Secret below, or export",
76
- " GOOGLE_SLIDES_CLIENT_ID and GOOGLE_SLIDES_CLIENT_SECRET.",
77
- ],
78
- });
49
+ rl.setCredential(googleCredential("googleSlides", SCOPES));
50
+ rl.setOAuth(googleOAuth("googleSlides", SCOPES, "GOOGLE_SLIDES"));
79
51
  rl.setConnectionSchema({
80
52
  authMethod: { type: "string", required: false, description: "delegated or serviceAccount (legacy configs infer the method)" },
81
53
  clientId: {
@@ -224,7 +196,7 @@ export default function googleSlides(rl) {
224
196
  async execute(input, ctx) {
225
197
  const p = (input ?? {});
226
198
  const id = extractPresentationId(p.presentation);
227
- return slidesRequest(ctx, "GET", `/presentations/${id}/pages/${p.pageObjectId}`);
199
+ return slidesRequest(ctx, "GET", `/presentations/${id}/pages/${pathSegment(p.pageObjectId)}`);
228
200
  },
229
201
  });
230
202
  rl.registerAction("page.getThumbnail", {
@@ -251,7 +223,7 @@ export default function googleSlides(rl) {
251
223
  qs["thumbnailProperties.mimeType"] = p.mimeType;
252
224
  if (p.thumbnailSize)
253
225
  qs["thumbnailProperties.thumbnailSize"] = p.thumbnailSize;
254
- const res = (await slidesRequest(ctx, "GET", `/presentations/${id}/pages/${p.pageObjectId}/thumbnail`, undefined, qs));
226
+ const res = (await slidesRequest(ctx, "GET", `/presentations/${id}/pages/${pathSegment(p.pageObjectId)}/thumbnail`, undefined, qs));
255
227
  if (!p.savePath && !p.download)
256
228
  return res;
257
229
  // contentUrl is a signed Google URL — fetch without auth headers.
@@ -20,7 +20,8 @@
20
20
  * normalize ISO input via `Date.toISOString()` when detected.
21
21
  */
22
22
  import * as t from "typebox";
23
- import { googleJsonRequest } from "../../_shared/googleAuth.js";
23
+ import { pathSegment } from "../../_shared/credentials.js";
24
+ import { googleCredential, googleJsonRequest, googleOAuth, } from "../../_shared/googleAuth.js";
24
25
  import { GoogleTimestamp, Id, stringEnum, } from "../../_shared/googleSchemas.js";
25
26
  // ─── Request ─────────────────────────────────────────────────────
26
27
  const API_BASE = "https://tasks.googleapis.com/tasks/v1";
@@ -69,37 +70,8 @@ const pageSizeSchema = t.Integer({ minimum: 1, maximum: 100 });
69
70
  export default function googleTasks(rl) {
70
71
  rl.setName("googleTasks");
71
72
  rl.setVersion("0.1.0");
72
- rl.setOAuth({
73
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
74
- tokenUrl: "https://oauth2.googleapis.com/token",
75
- scopes: SCOPES,
76
- authParams: { access_type: "offline", prompt: "consent" },
77
- setupHelp: [
78
- "You need a Google Cloud OAuth client. Takes ~5 minutes, one time.",
79
- "",
80
- "1. Create or pick a Google Cloud project:",
81
- " https://console.cloud.google.com/projectcreate",
82
- "",
83
- "2. Enable the Google Tasks API:",
84
- " https://console.cloud.google.com/apis/library/tasks.googleapis.com",
85
- "",
86
- "3. Configure the OAuth consent screen:",
87
- " https://console.cloud.google.com/apis/credentials/consent",
88
- " • Audience: External",
89
- "",
90
- "4. Add yourself as a test user:",
91
- " https://console.cloud.google.com/auth/audience",
92
- "",
93
- "5. Create the OAuth client:",
94
- " https://console.cloud.google.com/apis/credentials",
95
- " • + Create credentials → OAuth client ID",
96
- " • Application type: Web application",
97
- " • Authorized redirect URIs → + Add URI: {{redirectUri}}",
98
- "",
99
- "6. Paste the Client ID and Client Secret below, or export",
100
- " GOOGLE_TASKS_CLIENT_ID and GOOGLE_TASKS_CLIENT_SECRET.",
101
- ],
102
- });
73
+ rl.setCredential(googleCredential("googleTasks", SCOPES));
74
+ rl.setOAuth(googleOAuth("googleTasks", SCOPES, "GOOGLE_TASKS"));
103
75
  rl.setConnectionSchema({
104
76
  authMethod: { type: "string", required: false, description: "delegated or serviceAccount (legacy configs infer the method)" },
105
77
  clientId: { type: "string", required: false, env: "GOOGLE_TASKS_CLIENT_ID" },
@@ -140,7 +112,7 @@ export default function googleTasks(rl) {
140
112
  inputSchema: t.Object({ taskListId: Id }, { additionalProperties: false }),
141
113
  async execute(input, ctx) {
142
114
  const p = (input ?? {});
143
- return tasksRequest(ctx, "GET", `/users/@me/lists/${p.taskListId}`);
115
+ return tasksRequest(ctx, "GET", `/users/@me/lists/${pathSegment(p.taskListId)}`);
144
116
  },
145
117
  });
146
118
  rl.registerAction("taskList.create", {
@@ -161,7 +133,7 @@ export default function googleTasks(rl) {
161
133
  }, { additionalProperties: false }),
162
134
  async execute(input, ctx) {
163
135
  const p = (input ?? {});
164
- return tasksRequest(ctx, "PATCH", `/users/@me/lists/${p.taskListId}`, {
136
+ return tasksRequest(ctx, "PATCH", `/users/@me/lists/${pathSegment(p.taskListId)}`, {
165
137
  title: p.title,
166
138
  });
167
139
  },
@@ -172,7 +144,7 @@ export default function googleTasks(rl) {
172
144
  inputSchema: t.Object({ taskListId: Id }, { additionalProperties: false }),
173
145
  async execute(input, ctx) {
174
146
  const p = (input ?? {});
175
- await tasksRequest(ctx, "DELETE", `/users/@me/lists/${p.taskListId}`);
147
+ await tasksRequest(ctx, "DELETE", `/users/@me/lists/${pathSegment(p.taskListId)}`);
176
148
  return { success: true };
177
149
  },
178
150
  });
@@ -217,7 +189,7 @@ export default function googleTasks(rl) {
217
189
  qs.parent = p.parent;
218
190
  if (p.previous)
219
191
  qs.previous = p.previous;
220
- return tasksRequest(ctx, "POST", `/lists/${p.taskListId}/tasks`, body, qs);
192
+ return tasksRequest(ctx, "POST", `/lists/${pathSegment(p.taskListId)}/tasks`, body, qs);
221
193
  },
222
194
  });
223
195
  rl.registerAction("task.get", {
@@ -229,7 +201,7 @@ export default function googleTasks(rl) {
229
201
  }, { additionalProperties: false }),
230
202
  async execute(input, ctx) {
231
203
  const p = (input ?? {});
232
- return tasksRequest(ctx, "GET", `/lists/${p.taskListId}/tasks/${p.taskId}`);
204
+ return tasksRequest(ctx, "GET", `/lists/${pathSegment(p.taskListId)}/tasks/${pathSegment(p.taskId)}`);
233
205
  },
234
206
  });
235
207
  rl.registerAction("task.list", {
@@ -263,7 +235,7 @@ export default function googleTasks(rl) {
263
235
  }
264
236
  if (p.pageToken)
265
237
  qs.pageToken = p.pageToken;
266
- const path = `/lists/${p.taskListId}/tasks`;
238
+ const path = `/lists/${pathSegment(p.taskListId)}/tasks`;
267
239
  if (p.returnAll)
268
240
  return paginateAll(ctx, path, qs);
269
241
  if (p.maxResults)
@@ -315,7 +287,7 @@ export default function googleTasks(rl) {
315
287
  if (Object.keys(body).length === 0) {
316
288
  throw new Error("googleTasks: nothing to update");
317
289
  }
318
- return tasksRequest(ctx, "PATCH", `/lists/${p.taskListId}/tasks/${p.taskId}`, body);
290
+ return tasksRequest(ctx, "PATCH", `/lists/${pathSegment(p.taskListId)}/tasks/${pathSegment(p.taskId)}`, body);
319
291
  },
320
292
  });
321
293
  rl.registerAction("task.delete", {
@@ -327,7 +299,7 @@ export default function googleTasks(rl) {
327
299
  }, { additionalProperties: false }),
328
300
  async execute(input, ctx) {
329
301
  const p = (input ?? {});
330
- await tasksRequest(ctx, "DELETE", `/lists/${p.taskListId}/tasks/${p.taskId}`);
302
+ await tasksRequest(ctx, "DELETE", `/lists/${pathSegment(p.taskListId)}/tasks/${pathSegment(p.taskId)}`);
331
303
  return { success: true };
332
304
  },
333
305
  });
@@ -347,7 +319,7 @@ export default function googleTasks(rl) {
347
319
  qs.parent = p.parent;
348
320
  if (p.previous)
349
321
  qs.previous = p.previous;
350
- return tasksRequest(ctx, "POST", `/lists/${p.taskListId}/tasks/${p.taskId}/move`, undefined, qs);
322
+ return tasksRequest(ctx, "POST", `/lists/${pathSegment(p.taskListId)}/tasks/${pathSegment(p.taskId)}/move`, undefined, qs);
351
323
  },
352
324
  });
353
325
  rl.registerAction("task.clear", {
@@ -356,7 +328,7 @@ export default function googleTasks(rl) {
356
328
  inputSchema: t.Object({ taskListId: Id }, { additionalProperties: false }),
357
329
  async execute(input, ctx) {
358
330
  const p = (input ?? {});
359
- await tasksRequest(ctx, "POST", `/lists/${p.taskListId}/clear`);
331
+ await tasksRequest(ctx, "POST", `/lists/${pathSegment(p.taskListId)}/clear`);
360
332
  return { success: true };
361
333
  },
362
334
  });
@@ -0,0 +1,32 @@
1
+ import { httpsBase, staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * An application token that sends messages and a client token that reads
4
+ * and deletes them, each in the X-Gotify-Key header on its own target of
5
+ * the connection's HTTPS server.
6
+ */
7
+ export const gotifyCredential = staticCredential({
8
+ id: "gotify",
9
+ auth: {
10
+ kind: "static",
11
+ parts: ["appToken", "clientToken"],
12
+ placements: [
13
+ {
14
+ in: "header",
15
+ part: "appToken",
16
+ name: "X-Gotify-Key",
17
+ targets: ["app"],
18
+ },
19
+ {
20
+ in: "header",
21
+ part: "clientToken",
22
+ name: "X-Gotify-Key",
23
+ targets: ["client"],
24
+ },
25
+ ],
26
+ },
27
+ local: { appToken: "appApiToken", clientToken: "clientApiToken" },
28
+ targets: (config) => ({
29
+ app: { baseUrl: httpsBase(config.url, ""), methods: ["POST"] },
30
+ client: { baseUrl: httpsBase(config.url, ""), methods: ["GET", "DELETE"] },
31
+ }),
32
+ });
@@ -1,35 +1,19 @@
1
- async function apiRequest(url, token, method, endpoint, body, qs) {
2
- const fullUrl = new URL(`${url}${endpoint}`);
3
- if (qs) {
4
- for (const [k, v] of Object.entries(qs)) {
5
- if (v !== undefined && v !== null)
6
- fullUrl.searchParams.set(k, String(v));
7
- }
8
- }
9
- const opts = {
1
+ import { credentialJson, pathSegment } from "../../_shared/credentials.js";
2
+ import { gotifyCredential } from "./credentials.js";
3
+ /** A Gotify call on the app target (sending) or the client target (reading, deleting). */
4
+ function apiRequest(ctx, target, method, path, body, query) {
5
+ return credentialJson(ctx, gotifyCredential, "gotify", {
6
+ target,
7
+ path,
10
8
  method,
11
- headers: {
12
- "X-Gotify-Key": token,
13
- Accept: "application/json",
14
- "Content-Type": "application/json",
15
- },
16
- };
17
- if (body &&
18
- Object.keys(body).length > 0 &&
19
- method !== "GET" &&
20
- method !== "DELETE") {
21
- opts.body = JSON.stringify(body);
22
- }
23
- const res = await fetch(fullUrl.toString(), opts);
24
- if (!res.ok)
25
- throw new Error(`Gotify API error ${res.status}: ${await res.text()}`);
26
- if (res.status === 204)
27
- return { success: true };
28
- return res.json();
9
+ query,
10
+ json: body,
11
+ });
29
12
  }
30
13
  export default function gotify(rl) {
31
14
  rl.setName("gotify");
32
15
  rl.setVersion("0.1.0");
16
+ rl.setCredential(gotifyCredential);
33
17
  rl.setConnectionSchema({
34
18
  url: {
35
19
  type: "string",
@@ -69,8 +53,6 @@ export default function gotify(rl) {
69
53
  },
70
54
  async execute(input, ctx) {
71
55
  const { message, title, priority, contentType } = input;
72
- const url = ctx.connection.config.url.replace(/\/$/, "");
73
- const token = ctx.connection.config.appApiToken;
74
56
  const body = { message };
75
57
  if (title)
76
58
  body.title = title;
@@ -78,7 +60,7 @@ export default function gotify(rl) {
78
60
  body.priority = priority;
79
61
  if (contentType)
80
62
  body.extras = { "client::display": { contentType } };
81
- return apiRequest(url, token, "POST", "/message", body);
63
+ return apiRequest(ctx, "app", "POST", "message", body);
82
64
  },
83
65
  });
84
66
  rl.registerAction("message.delete", {
@@ -88,9 +70,7 @@ export default function gotify(rl) {
88
70
  messageId: { type: "string", required: true, description: "Message ID" },
89
71
  },
90
72
  async execute(input, ctx) {
91
- const url = ctx.connection.config.url.replace(/\/$/, "");
92
- const token = ctx.connection.config.clientApiToken;
93
- await apiRequest(url, token, "DELETE", `/message/${input.messageId}`);
73
+ await apiRequest(ctx, "client", "DELETE", `message/${pathSegment(input.messageId)}`);
94
74
  return { success: true };
95
75
  },
96
76
  });
@@ -102,12 +82,10 @@ export default function gotify(rl) {
102
82
  },
103
83
  async execute(input, ctx) {
104
84
  const { limit } = (input ?? {});
105
- const url = ctx.connection.config.url.replace(/\/$/, "");
106
- const token = ctx.connection.config.clientApiToken;
107
85
  const qs = {};
108
86
  if (limit)
109
87
  qs.limit = limit;
110
- const data = (await apiRequest(url, token, "GET", "/message", undefined, qs));
88
+ const data = (await apiRequest(ctx, "client", "GET", "message", undefined, qs));
111
89
  return data.messages;
112
90
  },
113
91
  });
@@ -0,0 +1,13 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /** An OAuth2 access token, sent as a bearer to GoTo's one API origin. */
3
+ export const gotowebinarCredential = staticCredential({
4
+ id: "gotowebinar",
5
+ auth: { kind: "bearer" },
6
+ local: { secret: "accessToken" },
7
+ targets: {
8
+ api: {
9
+ baseUrl: "https://api.getgo.com/G2W/rest/v2/",
10
+ methods: ["GET", "POST", "PUT", "DELETE"],
11
+ },
12
+ },
13
+ });