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,14 +1,11 @@
1
1
  /**
2
2
  * Gmail plugin for runline.
3
3
  *
4
- * Authentication: OAuth2 user flow, seeded once via
5
- * `runline auth gmail`. The connection stores `clientId`,
6
- * `clientSecret`, `refreshToken`, plus cached `accessToken` +
7
- * `accessTokenExpiresAt`. When the cached token is missing or
8
- * within 60 s of expiry, the plugin refreshes against
9
- * `https://oauth2.googleapis.com/token` and persists the new
10
- * token via `ctx.updateConnection`. File-level locking inside
11
- * runline core keeps concurrent refreshes safe.
4
+ * Authentication: the Google grant's OAuth2 user flow, seeded once
5
+ * via `runline auth gmail`, or a service account. The connection
6
+ * stores `clientId`, `clientSecret` and `refreshToken`; the access
7
+ * token is refreshed lazily (60 s skew) and cached on the connection
8
+ * as the grant's, so every Google plugin sharing it signs with it.
12
9
  *
13
10
  * This plugin deliberately doesn't depend on nodemailer or
14
11
  * mailparser. MIME building is a minimal hand-rolled encoder
@@ -21,8 +18,10 @@
21
18
  * or parsed `payload` tree for format=full).
22
19
  */
23
20
  import * as t from "typebox";
21
+ import { DownloadedFile, standardBase64 } from "../../_shared/base64.js";
24
22
  import { renderEmailJsx } from "../../_shared/emailJsx.js";
25
- import { googleJsonRequest } from "../../_shared/googleAuth.js";
23
+ import { pathSegment } from "../../_shared/credentials.js";
24
+ import { googleCredential, googleJsonRequest, googleOAuth, } from "../../_shared/googleAuth.js";
26
25
  import { GoogleTimestamp, Id, NonEmptyString, stringEnum, } from "../../_shared/googleSchemas.js";
27
26
  // ─── Request ─────────────────────────────────────────────────────
28
27
  const API_BASE = "https://gmail.googleapis.com/gmail/v1/users/me";
@@ -86,18 +85,6 @@ function header(name, value) {
86
85
  function foldedBase64ByteLength(length) {
87
86
  return length === 0 ? 0 : length + Math.floor((length - 1) / 76) * CRLF.length;
88
87
  }
89
- function normalizeMimeBase64(value, index) {
90
- const compact = value.replace(/\s+/g, "");
91
- if (!/^[A-Za-z0-9+/=_-]*$/.test(compact)) {
92
- throw new Error(`gmail: attachment ${index} contentBase64 contains invalid base64 characters`);
93
- }
94
- const standard = compact.replace(/-/g, "+").replace(/_/g, "/");
95
- const remainder = standard.length % 4;
96
- if (remainder === 1) {
97
- throw new Error(`gmail: attachment ${index} contentBase64 has invalid base64 length`);
98
- }
99
- return remainder === 0 ? standard : `${standard}${"=".repeat(4 - remainder)}`;
100
- }
101
88
  function foldBase64(encoded) {
102
89
  let folded = "";
103
90
  for (let i = 0; i < encoded.length; i += 76) {
@@ -134,10 +121,20 @@ function normalizeAttachment(input, index) {
134
121
  if (typeof contentBase64 !== "string") {
135
122
  throw new Error(`gmail: attachment ${index} contentBase64 must be a base64 string`);
136
123
  }
124
+ const normalized = standardBase64(contentBase64);
125
+ if (normalized === undefined) {
126
+ throw new Error(`gmail: attachment ${index} contentBase64 is not valid base64`);
127
+ }
128
+ // A download result passed as contentBase64 names its own file and type.
129
+ const result = typeof content === "object" && content ? content : {};
130
+ const named = (value) => typeof value === "string" && value ? value : undefined;
137
131
  return {
138
- name: input.name ?? input.filename ?? `attachment-${index + 1}`,
139
- mimeType: input.mimeType ?? "application/octet-stream",
140
- contentBase64: normalizeMimeBase64(contentBase64, index),
132
+ name: input.name ??
133
+ input.filename ??
134
+ named(result.name) ??
135
+ `attachment-${index + 1}`,
136
+ mimeType: input.mimeType ?? named(result.mimeType) ?? "application/octet-stream",
137
+ contentBase64: normalized,
141
138
  };
142
139
  }
143
140
  function attachmentPart(att) {
@@ -431,13 +428,10 @@ function simplifyMessage(raw, labels) {
431
428
  * `References` headers plus the original `threadId`.
432
429
  */
433
430
  async function replyToMessage(ctx, messageId, p) {
434
- if (p.replyToSenderOnly && p.replyToRecipientsOnly) {
435
- throw new Error("gmail: replyToSenderOnly and replyToRecipientsOnly are mutually exclusive");
436
- }
437
431
  // Render before any network round-trip so malformed jsx fails
438
432
  // without spending Gmail API calls.
439
433
  const { text, html } = await resolveBody(p);
440
- const original = (await gmailRequest(ctx, "GET", `/messages/${messageId}`, undefined, { format: "metadata", metadataHeaders: REPLY_METADATA_HEADERS }));
434
+ const original = (await gmailRequest(ctx, "GET", `/messages/${pathSegment(messageId)}`, undefined, { format: "metadata", metadataHeaders: REPLY_METADATA_HEADERS }));
441
435
  const subject = findHeader(original.payload, "Subject") ?? "";
442
436
  const messageIdHeader = findHeader(original.payload, "Message-ID") ?? "";
443
437
  const threadId = original.threadId;
@@ -514,10 +508,7 @@ const MessageListVisibility = stringEnum(["show", "hide"]);
514
508
  const MetadataHeaders = t.Array(t.String());
515
509
  const LabelIds = t.Array(NonEmptyString, { minItems: 1 });
516
510
  const MaxResults = t.Integer({ minimum: 1, maximum: 500 });
517
- const AttachmentContent = t.Union([
518
- t.String(),
519
- t.Object({ contentBase64: t.String() }, strict),
520
- ]);
511
+ const AttachmentContent = t.Union([t.String(), DownloadedFile]);
521
512
  const Attachment = t.Object({
522
513
  name: t.Optional(t.String()),
523
514
  filename: t.Optional(t.String()),
@@ -580,60 +571,8 @@ const ListInput = t.Object(ListFields, strict);
580
571
  export default function gmail(rl) {
581
572
  rl.setName("gmail");
582
573
  rl.setVersion("0.1.0");
583
- rl.setOAuth({
584
- authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
585
- tokenUrl: "https://oauth2.googleapis.com/token",
586
- scopes: SCOPES,
587
- // access_type=offline + prompt=consent are both required to
588
- // make Google return a refresh token. Without them, repeat
589
- // logins skip the refresh_token field in the response.
590
- authParams: { access_type: "offline", prompt: "consent" },
591
- setupHelp: [
592
- "You need a Google Cloud OAuth client. Takes ~5 minutes, one time.",
593
- "Do the steps in order — skipping step 4 causes a 403 when you log in.",
594
- "",
595
- "1. Create a Google Cloud project (or pick an existing one):",
596
- " https://console.cloud.google.com/projectcreate",
597
- " Make sure the new project is selected in the top navigation dropdown.",
598
- "",
599
- "2. Enable the Gmail API for that project:",
600
- " https://console.cloud.google.com/apis/library/gmail.googleapis.com",
601
- " Click 'Enable'.",
602
- "",
603
- "3. Configure the OAuth consent screen (first time only):",
604
- " https://console.cloud.google.com/apis/credentials/consent",
605
- " Click 'Get started' and fill in:",
606
- " • App name: runline (or whatever)",
607
- " • User support email: your email",
608
- " • Audience: External",
609
- " • Developer contact: your email",
610
- " You can skip the Scopes screen — runline declares scopes at auth time.",
611
- "",
612
- "4. Add yourself as a test user (required — External apps in Testing mode",
613
- " only allow authentication from addresses on this list):",
614
- " https://console.cloud.google.com/auth/audience",
615
- " Under 'Test users', click '+ Add users' and enter the Gmail address",
616
- " you'll use to log in. Consent and refresh tokens expire every 7 days",
617
- " while the app is in Testing mode.",
618
- "",
619
- "5. Create the OAuth client:",
620
- " https://console.cloud.google.com/apis/credentials",
621
- " • + Create credentials → OAuth client ID",
622
- " • Application type: Web application",
623
- " • Name: runline (or whatever)",
624
- " • Authorized redirect URIs → + Add URI:",
625
- " {{redirectUri}}",
626
- " • Click Create, then copy the Client ID and Client Secret from the",
627
- " dialog — the secret is only shown once.",
628
- "",
629
- "6. Paste them below (or re-run with --client-id / --client-secret,",
630
- " or export GMAIL_CLIENT_ID and GMAIL_CLIENT_SECRET).",
631
- "",
632
- "During login you'll see a 'Google hasn't verified this app' warning.",
633
- "Click 'Advanced → Go to runline (unsafe)' to continue — this is",
634
- "expected for apps in Testing mode.",
635
- ],
636
- });
574
+ rl.setCredential(googleCredential("gmail", SCOPES));
575
+ rl.setOAuth(googleOAuth("gmail", SCOPES, "GMAIL"));
637
576
  rl.setConnectionSchema({
638
577
  authMethod: { type: "string", required: false, description: "delegated or serviceAccount (legacy configs infer the method)" },
639
578
  clientId: {
@@ -750,7 +689,7 @@ export default function gmail(rl) {
750
689
  const qs = { format: p.format ?? "full" };
751
690
  if (p.metadataHeaders)
752
691
  qs.metadataHeaders = p.metadataHeaders;
753
- const raw = (await gmailRequest(ctx, "GET", `/messages/${p.id}`, undefined, qs));
692
+ const raw = (await gmailRequest(ctx, "GET", `/messages/${pathSegment(p.id)}`, undefined, qs));
754
693
  if (!p.simple)
755
694
  return raw;
756
695
  const labels = await loadLabelMap(ctx);
@@ -778,7 +717,7 @@ export default function gmail(rl) {
778
717
  inputSchema: IdInput,
779
718
  async execute(input, ctx) {
780
719
  const { id } = input;
781
- return gmailRequest(ctx, "DELETE", `/messages/${id}`);
720
+ return gmailRequest(ctx, "DELETE", `/messages/${pathSegment(id)}`);
782
721
  },
783
722
  });
784
723
  rl.registerAction("message.trash", {
@@ -787,7 +726,7 @@ export default function gmail(rl) {
787
726
  inputSchema: IdInput,
788
727
  async execute(input, ctx) {
789
728
  const { id } = input;
790
- return gmailRequest(ctx, "POST", `/messages/${id}/trash`);
729
+ return gmailRequest(ctx, "POST", `/messages/${pathSegment(id)}/trash`);
791
730
  },
792
731
  });
793
732
  rl.registerAction("message.untrash", {
@@ -796,7 +735,7 @@ export default function gmail(rl) {
796
735
  inputSchema: IdInput,
797
736
  async execute(input, ctx) {
798
737
  const { id } = input;
799
- return gmailRequest(ctx, "POST", `/messages/${id}/untrash`);
738
+ return gmailRequest(ctx, "POST", `/messages/${pathSegment(id)}/untrash`);
800
739
  },
801
740
  });
802
741
  rl.registerAction("message.markAsRead", {
@@ -805,7 +744,7 @@ export default function gmail(rl) {
805
744
  inputSchema: IdInput,
806
745
  async execute(input, ctx) {
807
746
  const { id } = input;
808
- return gmailRequest(ctx, "POST", `/messages/${id}/modify`, {
747
+ return gmailRequest(ctx, "POST", `/messages/${pathSegment(id)}/modify`, {
809
748
  removeLabelIds: ["UNREAD"],
810
749
  });
811
750
  },
@@ -816,7 +755,7 @@ export default function gmail(rl) {
816
755
  inputSchema: IdInput,
817
756
  async execute(input, ctx) {
818
757
  const { id } = input;
819
- return gmailRequest(ctx, "POST", `/messages/${id}/modify`, {
758
+ return gmailRequest(ctx, "POST", `/messages/${pathSegment(id)}/modify`, {
820
759
  addLabelIds: ["UNREAD"],
821
760
  });
822
761
  },
@@ -827,7 +766,7 @@ export default function gmail(rl) {
827
766
  inputSchema: t.Object({ id: Id, labelIds: LabelIds }, strict),
828
767
  async execute(input, ctx) {
829
768
  const { id, labelIds } = input;
830
- return gmailRequest(ctx, "POST", `/messages/${id}/modify`, {
769
+ return gmailRequest(ctx, "POST", `/messages/${pathSegment(id)}/modify`, {
831
770
  addLabelIds: labelIds,
832
771
  });
833
772
  },
@@ -838,7 +777,7 @@ export default function gmail(rl) {
838
777
  inputSchema: t.Object({ id: Id, labelIds: LabelIds }, strict),
839
778
  async execute(input, ctx) {
840
779
  const { id, labelIds } = input;
841
- return gmailRequest(ctx, "POST", `/messages/${id}/modify`, {
780
+ return gmailRequest(ctx, "POST", `/messages/${pathSegment(id)}/modify`, {
842
781
  removeLabelIds: labelIds,
843
782
  });
844
783
  },
@@ -849,7 +788,7 @@ export default function gmail(rl) {
849
788
  inputSchema: t.Object({ messageId: Id, attachmentId: Id }, strict),
850
789
  async execute(input, ctx) {
851
790
  const { messageId, attachmentId } = input;
852
- return gmailRequest(ctx, "GET", `/messages/${messageId}/attachments/${attachmentId}`);
791
+ return gmailRequest(ctx, "GET", `/messages/${pathSegment(messageId)}/attachments/${pathSegment(attachmentId)}`);
853
792
  },
854
793
  });
855
794
  // ── Thread ────────────────────────────────────────────
@@ -869,7 +808,7 @@ export default function gmail(rl) {
869
808
  const qs = { format: p.format ?? "full" };
870
809
  if (p.metadataHeaders)
871
810
  qs.metadataHeaders = p.metadataHeaders;
872
- const raw = (await gmailRequest(ctx, "GET", `/threads/${p.id}`, undefined, qs));
811
+ const raw = (await gmailRequest(ctx, "GET", `/threads/${pathSegment(p.id)}`, undefined, qs));
873
812
  if (!p.simple)
874
813
  return raw;
875
814
  const labels = await loadLabelMap(ctx);
@@ -896,7 +835,7 @@ export default function gmail(rl) {
896
835
  inputSchema: IdInput,
897
836
  async execute(input, ctx) {
898
837
  const { id } = input;
899
- return gmailRequest(ctx, "DELETE", `/threads/${id}`);
838
+ return gmailRequest(ctx, "DELETE", `/threads/${pathSegment(id)}`);
900
839
  },
901
840
  });
902
841
  rl.registerAction("thread.trash", {
@@ -905,7 +844,7 @@ export default function gmail(rl) {
905
844
  inputSchema: IdInput,
906
845
  async execute(input, ctx) {
907
846
  const { id } = input;
908
- return gmailRequest(ctx, "POST", `/threads/${id}/trash`);
847
+ return gmailRequest(ctx, "POST", `/threads/${pathSegment(id)}/trash`);
909
848
  },
910
849
  });
911
850
  rl.registerAction("thread.untrash", {
@@ -914,7 +853,7 @@ export default function gmail(rl) {
914
853
  inputSchema: IdInput,
915
854
  async execute(input, ctx) {
916
855
  const { id } = input;
917
- return gmailRequest(ctx, "POST", `/threads/${id}/untrash`);
856
+ return gmailRequest(ctx, "POST", `/threads/${pathSegment(id)}/untrash`);
918
857
  },
919
858
  });
920
859
  rl.registerAction("thread.addLabels", {
@@ -923,7 +862,7 @@ export default function gmail(rl) {
923
862
  inputSchema: t.Object({ id: Id, labelIds: LabelIds }, strict),
924
863
  async execute(input, ctx) {
925
864
  const { id, labelIds } = input;
926
- return gmailRequest(ctx, "POST", `/threads/${id}/modify`, {
865
+ return gmailRequest(ctx, "POST", `/threads/${pathSegment(id)}/modify`, {
927
866
  addLabelIds: labelIds,
928
867
  });
929
868
  },
@@ -934,7 +873,7 @@ export default function gmail(rl) {
934
873
  inputSchema: t.Object({ id: Id, labelIds: LabelIds }, strict),
935
874
  async execute(input, ctx) {
936
875
  const { id, labelIds } = input;
937
- return gmailRequest(ctx, "POST", `/threads/${id}/modify`, {
876
+ return gmailRequest(ctx, "POST", `/threads/${pathSegment(id)}/modify`, {
938
877
  removeLabelIds: labelIds,
939
878
  });
940
879
  },
@@ -945,7 +884,7 @@ export default function gmail(rl) {
945
884
  inputSchema: t.Object({ id: Id, ...ReplyFields }, ReplyOptions),
946
885
  async execute(input, ctx) {
947
886
  const p = (input ?? {});
948
- const thread = (await gmailRequest(ctx, "GET", `/threads/${p.id}`, undefined, { format: "minimal" }));
887
+ const thread = (await gmailRequest(ctx, "GET", `/threads/${pathSegment(p.id)}`, undefined, { format: "minimal" }));
949
888
  const last = thread.messages?.[thread.messages.length - 1];
950
889
  if (!last?.id) {
951
890
  throw new Error(`gmail: thread ${p.id} has no messages to reply to`);
@@ -991,7 +930,7 @@ export default function gmail(rl) {
991
930
  // thread and set In-Reply-To/References so Gmail places the
992
931
  // draft into the conversation correctly.
993
932
  if (p.threadId) {
994
- const thread = (await gmailRequest(ctx, "GET", `/threads/${p.threadId}`, undefined, { format: "metadata", metadataHeaders: ["Message-ID"] }));
933
+ const thread = (await gmailRequest(ctx, "GET", `/threads/${pathSegment(p.threadId)}`, undefined, { format: "metadata", metadataHeaders: ["Message-ID"] }));
995
934
  const last = thread.messages?.[thread.messages.length - 1];
996
935
  const mid = findHeader(last?.payload, "Message-ID");
997
936
  if (mid) {
@@ -1012,7 +951,7 @@ export default function gmail(rl) {
1012
951
  async execute(input, ctx) {
1013
952
  const p = (input ?? {});
1014
953
  const qs = { format: p.format ?? "full" };
1015
- return gmailRequest(ctx, "GET", `/drafts/${p.id}`, undefined, qs);
954
+ return gmailRequest(ctx, "GET", `/drafts/${pathSegment(p.id)}`, undefined, qs);
1016
955
  },
1017
956
  });
1018
957
  rl.registerAction("draft.list", {
@@ -1047,7 +986,7 @@ export default function gmail(rl) {
1047
986
  inputSchema: IdInput,
1048
987
  async execute(input, ctx) {
1049
988
  const { id } = input;
1050
- return gmailRequest(ctx, "DELETE", `/drafts/${id}`);
989
+ return gmailRequest(ctx, "DELETE", `/drafts/${pathSegment(id)}`);
1051
990
  },
1052
991
  });
1053
992
  rl.registerAction("draft.send", {
@@ -1086,7 +1025,7 @@ export default function gmail(rl) {
1086
1025
  inputSchema: IdInput,
1087
1026
  async execute(input, ctx) {
1088
1027
  const { id } = input;
1089
- return gmailRequest(ctx, "GET", `/labels/${id}`);
1028
+ return gmailRequest(ctx, "GET", `/labels/${pathSegment(id)}`);
1090
1029
  },
1091
1030
  });
1092
1031
  rl.registerAction("label.list", {
@@ -1104,7 +1043,7 @@ export default function gmail(rl) {
1104
1043
  inputSchema: IdInput,
1105
1044
  async execute(input, ctx) {
1106
1045
  const { id } = input;
1107
- return gmailRequest(ctx, "DELETE", `/labels/${id}`);
1046
+ return gmailRequest(ctx, "DELETE", `/labels/${pathSegment(id)}`);
1108
1047
  },
1109
1048
  });
1110
1049
  rl.registerAction("label.update", {
@@ -1134,7 +1073,7 @@ export default function gmail(rl) {
1134
1073
  if (p.messageListVisibility) {
1135
1074
  body.messageListVisibility = p.messageListVisibility;
1136
1075
  }
1137
- return gmailRequest(ctx, "PATCH", `/labels/${p.id}`, body);
1076
+ return gmailRequest(ctx, "PATCH", `/labels/${pathSegment(p.id)}`, body);
1138
1077
  },
1139
1078
  });
1140
1079
  // ── Profile / aliases ─────────────────────────────────
@@ -0,0 +1,16 @@
1
+ import { httpsBase, staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * An access key and secret as the Basic pair, on the connection's Gong
4
+ * API base (api.gong.io, or the account's regional base) beneath /v2/.
5
+ */
6
+ export const gongCredential = staticCredential({
7
+ id: "gong",
8
+ auth: { kind: "basic" },
9
+ local: { username: "accessKey", password: "accessKeySecret" },
10
+ targets: (config) => ({
11
+ api: {
12
+ baseUrl: httpsBase(config.baseUrl ?? "https://api.gong.io", "v2/"),
13
+ methods: ["POST"],
14
+ },
15
+ }),
16
+ });
@@ -1,27 +1,21 @@
1
- async function apiRequest(baseUrl, accessKey, accessKeySecret, method, endpoint, body) {
2
- const opts = {
3
- method,
4
- headers: {
5
- Authorization: `Basic ${btoa(`${accessKey}:${accessKeySecret}`)}`,
6
- "Content-Type": "application/json",
7
- },
8
- };
9
- if (body && Object.keys(body).length > 0) {
10
- opts.body = JSON.stringify(body);
11
- }
12
- const res = await fetch(`${baseUrl}${endpoint}`, opts);
13
- if (!res.ok)
14
- throw new Error(`Gong API error ${res.status}: ${await res.text()}`);
15
- return res.json();
1
+ import { credentialJson } from "../../_shared/credentials.js";
2
+ import { gongCredential } from "./credentials.js";
3
+ function api(ctx, path, body) {
4
+ return credentialJson(ctx, gongCredential, "gong", {
5
+ target: "api",
6
+ path,
7
+ method: "POST",
8
+ json: body,
9
+ });
16
10
  }
17
- async function paginate(baseUrl, accessKey, accessKeySecret, endpoint, body, resultKey, limit) {
11
+ async function paginate(ctx, path, body, resultKey, limit) {
18
12
  const results = [];
19
13
  let cursor;
20
14
  do {
21
15
  const reqBody = { ...body };
22
16
  if (cursor)
23
17
  reqBody.cursor = cursor;
24
- const data = (await apiRequest(baseUrl, accessKey, accessKeySecret, "POST", endpoint, reqBody));
18
+ const data = (await api(ctx, path, reqBody));
25
19
  const items = data[resultKey] ?? [];
26
20
  results.push(...items);
27
21
  cursor = data.records?.cursor;
@@ -30,16 +24,10 @@ async function paginate(baseUrl, accessKey, accessKeySecret, endpoint, body, res
30
24
  } while (cursor);
31
25
  return limit ? results.slice(0, limit) : results;
32
26
  }
33
- function getConn(ctx) {
34
- return {
35
- baseUrl: (ctx.connection.config.baseUrl ?? "https://api.gong.io").replace(/\/$/, ""),
36
- accessKey: ctx.connection.config.accessKey,
37
- accessKeySecret: ctx.connection.config.accessKeySecret,
38
- };
39
- }
40
27
  export default function gong(rl) {
41
28
  rl.setName("gong");
42
29
  rl.setVersion("0.1.0");
30
+ rl.setCredential(gongCredential);
43
31
  rl.setConnectionSchema({
44
32
  baseUrl: {
45
33
  type: "string",
@@ -74,11 +62,10 @@ export default function gong(rl) {
74
62
  },
75
63
  async execute(input, ctx) {
76
64
  const { callId, contentSelector } = input;
77
- const { baseUrl, accessKey, accessKeySecret } = getConn(ctx);
78
65
  const body = { filter: { callIds: [callId] } };
79
66
  if (contentSelector)
80
67
  body.contentSelector = contentSelector;
81
- const data = (await apiRequest(baseUrl, accessKey, accessKeySecret, "POST", "/v2/calls/extensive", body));
68
+ const data = (await api(ctx, "calls/extensive", body));
82
69
  const calls = data.calls;
83
70
  return calls?.[0];
84
71
  },
@@ -116,7 +103,6 @@ export default function gong(rl) {
116
103
  },
117
104
  async execute(input, ctx) {
118
105
  const { limit, fromDateTime, toDateTime, workspaceId, callIds, primaryUserIds, } = (input ?? {});
119
- const { baseUrl, accessKey, accessKeySecret } = getConn(ctx);
120
106
  const filter = {};
121
107
  if (fromDateTime)
122
108
  filter.fromDateTime = fromDateTime;
@@ -128,7 +114,7 @@ export default function gong(rl) {
128
114
  filter.callIds = callIds;
129
115
  if (primaryUserIds)
130
116
  filter.primaryUserIds = primaryUserIds;
131
- return paginate(baseUrl, accessKey, accessKeySecret, "/v2/calls/extensive", { filter }, "calls", limit);
117
+ return paginate(ctx, "calls/extensive", { filter }, "calls", limit);
132
118
  },
133
119
  });
134
120
  rl.registerAction("user.get", {
@@ -139,8 +125,7 @@ export default function gong(rl) {
139
125
  },
140
126
  async execute(input, ctx) {
141
127
  const { userId } = input;
142
- const { baseUrl, accessKey, accessKeySecret } = getConn(ctx);
143
- const data = (await apiRequest(baseUrl, accessKey, accessKeySecret, "POST", "/v2/users/extensive", {
128
+ const data = (await api(ctx, "users/extensive", {
144
129
  filter: { userIds: [userId] },
145
130
  }));
146
131
  const users = data.users;
@@ -170,7 +155,6 @@ export default function gong(rl) {
170
155
  },
171
156
  async execute(input, ctx) {
172
157
  const { limit, createdFromDateTime, createdToDateTime, userIds } = (input ?? {});
173
- const { baseUrl, accessKey, accessKeySecret } = getConn(ctx);
174
158
  const filter = {};
175
159
  if (createdFromDateTime)
176
160
  filter.createdFromDateTime = createdFromDateTime;
@@ -178,7 +162,7 @@ export default function gong(rl) {
178
162
  filter.createdToDateTime = createdToDateTime;
179
163
  if (userIds)
180
164
  filter.userIds = userIds;
181
- return paginate(baseUrl, accessKey, accessKeySecret, "/v2/users/extensive", { filter }, "users", limit);
165
+ return paginate(ctx, "users/extensive", { filter }, "users", limit);
182
166
  },
183
167
  });
184
168
  }