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,45 +1,24 @@
1
- async function apiRequest(host, apiKey, apiSecret, method, endpoint, body, qs) {
2
- const url = new URL(`${host}${endpoint}`);
3
- if (qs) {
4
- for (const [k, v] of Object.entries(qs)) {
5
- if (v !== undefined && v !== null)
6
- url.searchParams.set(k, String(v));
7
- }
8
- }
9
- const opts = {
10
- method,
11
- headers: {
12
- Authorization: `token ${apiKey}:${apiSecret}`,
13
- "Content-Type": "application/json",
14
- Accept: "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(url.toString(), opts);
24
- if (!res.ok)
25
- throw new Error(`ERPNext API error ${res.status}: ${await res.text()}`);
26
- return res.json();
27
- }
28
- function getConn(ctx) {
29
- const cfg = ctx.connection.config;
30
- return {
31
- host: cfg.host.replace(/\/$/, ""),
32
- apiKey: cfg.apiKey,
33
- apiSecret: cfg.apiSecret,
34
- };
35
- }
1
+ import { credentialJson, pathSegment } from "../../_shared/credentials.js";
2
+ import { erpnextCredential } from "./credentials.js";
3
+ /** One ERPNext call: every endpoint is a path beneath the instance's /api/. */
36
4
  function req(ctx, method, endpoint, body, qs) {
37
- const { host, apiKey, apiSecret } = getConn(ctx);
38
- return apiRequest(host, apiKey, apiSecret, method, endpoint, body, qs);
5
+ return credentialJson(ctx, erpnextCredential, "erpnext", {
6
+ target: "api",
7
+ path: endpoint,
8
+ method,
9
+ query: qs,
10
+ ...(body &&
11
+ Object.keys(body).length > 0 &&
12
+ method !== "GET" &&
13
+ method !== "DELETE"
14
+ ? { json: body }
15
+ : {}),
16
+ });
39
17
  }
40
18
  export default function erpnext(rl) {
41
19
  rl.setName("erpnext");
42
20
  rl.setVersion("0.1.0");
21
+ rl.setCredential(erpnextCredential);
43
22
  rl.setConnectionSchema({
44
23
  host: {
45
24
  type: "string",
@@ -77,7 +56,7 @@ export default function erpnext(rl) {
77
56
  },
78
57
  async execute(input, ctx) {
79
58
  const { docType, documentName } = input;
80
- const data = (await req(ctx, "GET", `/api/resource/${encodeURIComponent(docType)}/${encodeURIComponent(documentName)}`));
59
+ const data = (await req(ctx, "GET", `resource/${pathSegment(docType)}/${pathSegment(documentName)}`));
81
60
  return data.data;
82
61
  },
83
62
  });
@@ -122,7 +101,7 @@ export default function erpnext(rl) {
122
101
  qs.limit_start = offset;
123
102
  if (orderBy)
124
103
  qs.order_by = orderBy;
125
- const data = (await req(ctx, "GET", `/api/resource/${encodeURIComponent(docType)}`, undefined, qs));
104
+ const data = (await req(ctx, "GET", `resource/${pathSegment(docType)}`, undefined, qs));
126
105
  return data.data;
127
106
  },
128
107
  });
@@ -139,7 +118,7 @@ export default function erpnext(rl) {
139
118
  },
140
119
  async execute(input, ctx) {
141
120
  const { docType, properties } = input;
142
- const data = (await req(ctx, "POST", `/api/resource/${encodeURIComponent(docType)}`, properties));
121
+ const data = (await req(ctx, "POST", `resource/${pathSegment(docType)}`, properties));
143
122
  return data.data;
144
123
  },
145
124
  });
@@ -161,7 +140,7 @@ export default function erpnext(rl) {
161
140
  },
162
141
  async execute(input, ctx) {
163
142
  const { docType, documentName, properties } = input;
164
- const data = (await req(ctx, "PUT", `/api/resource/${encodeURIComponent(docType)}/${encodeURIComponent(documentName)}`, properties));
143
+ const data = (await req(ctx, "PUT", `resource/${pathSegment(docType)}/${pathSegment(documentName)}`, properties));
165
144
  return data.data;
166
145
  },
167
146
  });
@@ -178,7 +157,7 @@ export default function erpnext(rl) {
178
157
  },
179
158
  async execute(input, ctx) {
180
159
  const { docType, documentName } = input;
181
- await req(ctx, "DELETE", `/api/resource/${encodeURIComponent(docType)}/${encodeURIComponent(documentName)}`);
160
+ await req(ctx, "DELETE", `resource/${pathSegment(docType)}/${pathSegment(documentName)}`);
182
161
  return { success: true };
183
162
  },
184
163
  });
@@ -0,0 +1,20 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * A Meta access token, added by the transport as the access_token query
4
+ * parameter on Meta's Graph API host and its video-upload host.
5
+ */
6
+ export const facebookGraphCredential = staticCredential({
7
+ id: "facebookGraph",
8
+ auth: { kind: "queryKey", param: "access_token" },
9
+ local: { secret: "accessToken" },
10
+ targets: {
11
+ graph: {
12
+ baseUrl: "https://graph.facebook.com/",
13
+ methods: ["GET", "POST", "DELETE"],
14
+ },
15
+ video: {
16
+ baseUrl: "https://graph-video.facebook.com/",
17
+ methods: ["GET", "POST", "DELETE"],
18
+ },
19
+ },
20
+ });
@@ -1,6 +1,15 @@
1
+ import { AuthError } from "runline";
2
+ import { credentialJson, pathSegment } from "../../_shared/credentials.js";
3
+ import { facebookGraphCredential } from "./credentials.js";
4
+ /** Meta's hosts, by the target each is declared as. */
5
+ const HOSTS = {
6
+ "graph.facebook.com": "graph",
7
+ "graph-video.facebook.com": "video",
8
+ };
1
9
  export default function facebookGraph(rl) {
2
10
  rl.setName("facebookGraph");
3
11
  rl.setVersion("0.1.0");
12
+ rl.setCredential(facebookGraphCredential);
4
13
  rl.setConnectionSchema({
5
14
  accessToken: {
6
15
  type: "string",
@@ -56,44 +65,37 @@ export default function facebookGraph(rl) {
56
65
  },
57
66
  async execute(input, ctx) {
58
67
  const { hostUrl = "graph.facebook.com", method = "GET", graphApiVersion = "", node, edge, fields, queryParameters, body, } = input;
59
- const versionPrefix = graphApiVersion ? `${graphApiVersion}/` : "";
60
- let uri = `https://${hostUrl}/${versionPrefix}${node}`;
61
- if (edge)
62
- uri = `${uri}/${edge}`;
63
- const url = new URL(uri);
64
- url.searchParams.set("access_token", ctx.connection.config.accessToken);
65
- if (fields && Array.isArray(fields) && fields.length > 0) {
66
- url.searchParams.set("fields", fields.join(","));
67
- }
68
- if (queryParameters && typeof queryParameters === "object") {
69
- for (const [k, v] of Object.entries(queryParameters)) {
70
- if (v !== undefined && v !== null)
71
- url.searchParams.set(k, String(v));
72
- }
73
- }
74
- const httpMethod = method.toUpperCase();
75
- const opts = {
68
+ const target = Object.hasOwn(HOSTS, String(hostUrl))
69
+ ? HOSTS[String(hostUrl)]
70
+ : undefined;
71
+ if (!target ||
72
+ (graphApiVersion && !/^v\d+\.\d+$/.test(String(graphApiVersion))))
73
+ throw new AuthError("request_not_allowed");
74
+ const httpMethod = String(method).toUpperCase();
75
+ const path = [
76
+ graphApiVersion,
77
+ pathSegment(node),
78
+ edge ? pathSegment(edge) : "",
79
+ ]
80
+ .filter(Boolean)
81
+ .join("/");
82
+ return credentialJson(ctx, facebookGraphCredential, "facebookGraph", {
83
+ target,
84
+ path,
76
85
  method: httpMethod,
77
- headers: { Accept: "application/json,text/*;q=0.99" },
78
- };
79
- if (body &&
80
- typeof body === "object" &&
81
- Object.keys(body).length > 0 &&
82
- httpMethod === "POST") {
83
- opts.headers["Content-Type"] =
84
- "application/json";
85
- opts.body = JSON.stringify(body);
86
- }
87
- const res = await fetch(url.toString(), opts);
88
- if (!res.ok)
89
- throw new Error(`Facebook Graph API error ${res.status}: ${await res.text()}`);
90
- const text = await res.text();
91
- try {
92
- return JSON.parse(text);
93
- }
94
- catch {
95
- return { message: text };
96
- }
86
+ query: {
87
+ ...queryParameters,
88
+ ...(Array.isArray(fields) && fields.length
89
+ ? { fields: fields.join(",") }
90
+ : {}),
91
+ },
92
+ ...(httpMethod === "POST" &&
93
+ body &&
94
+ typeof body === "object" &&
95
+ Object.keys(body).length
96
+ ? { json: body }
97
+ : {}),
98
+ });
97
99
  },
98
100
  });
99
101
  }
@@ -0,0 +1,14 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /** An API key, sent as `Authorization: Key {key}` to fal's queue origin.
3
+ * CDN media downloads are credential-free and stay outside the broker. */
4
+ export const falCredential = staticCredential({
5
+ id: "fal",
6
+ auth: { kind: "apiKey", header: "Authorization", prefix: "Key " },
7
+ local: { secret: "apiKey" },
8
+ targets: {
9
+ queue: {
10
+ baseUrl: "https://queue.fal.run/",
11
+ methods: ["GET", "POST", "PUT"],
12
+ },
13
+ },
14
+ });
@@ -1,6 +1,7 @@
1
1
  import * as t from "typebox";
2
2
  import { readImageInput } from "../../_shared/mediaFile.js";
3
3
  import { parseSize } from "../../_shared/parseSize.js";
4
+ import { falCredential } from "./credentials.js";
4
5
  import { assertModelId, cancel, DEFAULT_TIMEOUT_MS, extraInputSchema, result, runModel, STRICT, saveDirSchema, savedResult, status, submit, timeoutSchema, } from "./shared.js";
5
6
  const IMAGE_MODEL = "fal-ai/flux/schnell";
6
7
  const EDIT_MODEL = "fal-ai/flux-pro/kontext";
@@ -81,6 +82,7 @@ async function generate(ctx, p, model, input, kind) {
81
82
  export default function fal(rl) {
82
83
  rl.setName("fal");
83
84
  rl.setVersion("0.1.0");
85
+ rl.setCredential(falCredential);
84
86
  rl.setConnectionSchema(t.Object({
85
87
  apiKey: t.String({
86
88
  minLength: 1,
@@ -107,7 +109,7 @@ export default function fal(rl) {
107
109
  inputSchema: editSchema,
108
110
  async execute(input, ctx) {
109
111
  const p = input;
110
- const image = readImageInput(p.imagePath, "fal");
112
+ const image = await readImageInput(p.imagePath, "fal");
111
113
  const key = p.imageInputKey ?? "image_url";
112
114
  return generate(ctx, p, p.model ?? EDIT_MODEL, {
113
115
  prompt: p.prompt,
@@ -126,7 +128,7 @@ export default function fal(rl) {
126
128
  });
127
129
  rl.registerAction("run", {
128
130
  access: "write",
129
- description: "Run a fal endpoint with its model-specific input (billed), and wait. Returns raw output plus downloaded files from common top-level image/video/audio/file fields. Automatic downloads accept HTTPS fal.media URLs or data URIs only, up to 512 MiB per file; JSON responses are limited to 32 MiB.",
131
+ description: "Run a fal endpoint with its model-specific input (billed), and wait. Returns raw output plus downloaded files from common top-level image/video/audio/file fields. Automatic downloads accept HTTPS fal.media URLs or data URIs only, up to 512 MiB per file; JSON responses are limited to 64 MiB.",
130
132
  inputSchema: runSchema,
131
133
  async execute(input, ctx) {
132
134
  const p = input;
@@ -161,7 +163,7 @@ export default function fal(rl) {
161
163
  });
162
164
  rl.registerAction("queue.result", {
163
165
  access: "write",
164
- description: "Retrieve completed output without re-running or re-billing. Writes common image/video/audio/file outputs to disk and returns files[].path. Download limits: HTTPS fal.media URLs or data URIs, 512 MiB per file, 60 seconds per file; JSON responses up to 32 MiB.",
166
+ description: "Retrieve completed output without re-running or re-billing. Writes common image/video/audio/file outputs to disk and returns files[].path. Download limits: HTTPS fal.media URLs or data URIs, 512 MiB per file, 60 seconds per file; JSON responses up to 64 MiB.",
165
167
  inputSchema: resultInput,
166
168
  async execute(input, ctx) {
167
169
  const p = input;
@@ -1,14 +1,13 @@
1
1
  import { setTimeout as sleep } from "node:timers/promises";
2
2
  import * as t from "typebox";
3
3
  import { Check } from "typebox/value";
4
- import { authedFetch } from "../../_shared/authedFetch.js";
4
+ import { credentialJson, pathSegment } from "../../_shared/credentials.js";
5
5
  import { SEND_FILE_NOTE, writeMediaFile, } from "../../_shared/mediaFile.js";
6
- import { readBounded, readBoundedBytes, seg } from "../../_shared/provider.js";
6
+ import { readBoundedBytes } from "../../_shared/provider.js";
7
+ import { falCredential } from "./credentials.js";
7
8
  export const STRICT = { additionalProperties: false };
8
9
  export const DEFAULT_TIMEOUT_MS = 300_000;
9
- const QUEUE_BASE = "https://queue.fal.run";
10
10
  const MAX_DOWNLOAD_BYTES = 512 * 1024 * 1024;
11
- const MAX_JSON_BYTES = 32 * 1024 * 1024;
12
11
  const receiptSchema = t.Object({
13
12
  request_id: t.String({ minLength: 1 }),
14
13
  status_url: t.Optional(t.String()),
@@ -40,84 +39,75 @@ export function assertModelId(model) {
40
39
  return id;
41
40
  }
42
41
  /** Queue operations address the application, excluding its inference sub-path. */
43
- function queueUrl(model, suffix = "") {
42
+ function queuePath(model, suffix = "") {
44
43
  const id = assertModelId(model);
45
44
  const parts = id.split("/");
46
45
  const count = parts[0] === "workflows" || parts[0] === "comfy" ? 3 : 2;
47
- return `${QUEUE_BASE}/${suffix ? parts.slice(0, count).join("/") : id}${suffix}`;
46
+ return `${suffix ? parts.slice(0, count).join("/") : id}${suffix}`;
48
47
  }
49
- /** Keep validation field names and error types, without echoing model inputs. */
50
- export function explainFalError(status, body) {
51
- const data = object(body) ? body : {};
52
- const detail = data.detail;
53
- const message = Array.isArray(detail)
54
- ? detail
55
- .filter(object)
56
- .map((entry) => {
57
- const field = Array.isArray(entry.loc) ? entry.loc.join(".") : "body";
58
- return `${field}: ${String(entry.msg ?? "invalid")} [${String(entry.type ?? "error")}]`;
59
- })
60
- .join("; ")
61
- : typeof detail === "string"
62
- ? detail
63
- : typeof data.status === "string"
64
- ? data.status
65
- : "request failed";
66
- const type = typeof data.error_type === "string" ? ` [${data.error_type}]` : "";
67
- return `fal ${status}: ${message.slice(0, 1000)}${type}`;
68
- }
69
- /** All credential-bearing calls use a fixed origin and refuse redirects. */
70
- async function request(ctx, url, init = {}) {
48
+ /**
49
+ * All credential-bearing calls go through the queue target; the transport
50
+ * pins the origin and refuses redirects. Failures are reported by status
51
+ * alone, without echoing provider text.
52
+ */
53
+ async function request(ctx, path, init = {}) {
71
54
  const key = ctx.connection.config.apiKey;
72
- if (typeof key !== "string" || !key.trim())
55
+ if (!ctx.credentials && (typeof key !== "string" || !key.trim()))
73
56
  throw new Error("Missing FAL_KEY. Create a key at https://fal.ai/dashboard/keys.");
74
- const response = await authedFetch(url, {
75
- ...init,
76
- headers: {
77
- authorization: `Key ${key.trim()}`,
78
- accept: "application/json",
79
- "content-type": "application/json",
80
- },
81
- signal: init.signal ?? AbortSignal.timeout(60_000),
57
+ return credentialJson(ctx, falCredential, "fal", {
58
+ target: "queue",
59
+ path,
60
+ method: init.method ?? "GET",
61
+ // Every queue call declares a JSON body type, even bodyless GETs.
62
+ headers: { "Content-Type": "application/json" },
63
+ ...(init.json !== undefined ? { body: JSON.stringify(init.json) } : {}),
64
+ });
65
+ }
66
+ /** The queue deadline stops the wait; the transport bounds the request itself. */
67
+ function raceSignal(promise, signal) {
68
+ // The transport settles the abandoned request on its own; its rejection is handled here.
69
+ promise.catch(() => { });
70
+ return new Promise((resolve, reject) => {
71
+ if (signal.aborted) {
72
+ reject(signal.reason);
73
+ return;
74
+ }
75
+ const onAbort = () => reject(signal.reason);
76
+ signal.addEventListener("abort", onAbort, { once: true });
77
+ promise.then((value) => {
78
+ signal.removeEventListener("abort", onAbort);
79
+ resolve(value);
80
+ }, (error) => {
81
+ signal.removeEventListener("abort", onAbort);
82
+ reject(error);
83
+ });
82
84
  });
83
- const text = await readBounded(response, MAX_JSON_BYTES, "fal: response exceeds 32 MiB");
84
- let body;
85
- try {
86
- body = JSON.parse(text);
87
- }
88
- catch {
89
- throw new Error(`fal HTTP ${response.status}: non-JSON response`);
90
- }
91
- if (!response.ok)
92
- throw new Error(explainFalError(response.status, body));
93
- return body;
94
85
  }
95
- export async function submit(ctx, model, input, signal) {
86
+ export async function submit(ctx, model, input) {
96
87
  // A failed POST can have been accepted, so submissions are never retried here.
97
- const receipt = await request(ctx, queueUrl(model), {
88
+ const receipt = await request(ctx, queuePath(model), {
98
89
  method: "POST",
99
- body: JSON.stringify(input),
100
- signal,
90
+ json: input,
101
91
  });
102
92
  if (!Check(receiptSchema, receipt))
103
93
  throw new Error("fal: invalid submission receipt or no request id; do not resubmit automatically");
104
- seg(receipt.request_id, "request id", "fal");
94
+ pathSegment(receipt.request_id);
105
95
  return receipt;
106
96
  }
107
- export async function status(ctx, model, requestId, logs = false, signal) {
108
- const body = await request(ctx, queueUrl(model, `/requests/${seg(requestId, "request id", "fal")}/status${logs ? "?logs=1" : ""}`), { signal });
97
+ export async function status(ctx, model, requestId, logs = false) {
98
+ const body = await request(ctx, queuePath(model, `/requests/${pathSegment(requestId)}/status${logs ? "?logs=1" : ""}`));
109
99
  if (!Check(statusSchema, body))
110
100
  throw new Error("fal: invalid queue status response");
111
101
  return body;
112
102
  }
113
- export async function result(ctx, model, requestId, signal) {
114
- const body = await request(ctx, queueUrl(model, `/requests/${seg(requestId, "request id", "fal")}`), { signal });
103
+ export async function result(ctx, model, requestId) {
104
+ const body = await request(ctx, queuePath(model, `/requests/${pathSegment(requestId)}`));
115
105
  if (!object(body))
116
106
  throw new Error("fal: expected an object result");
117
107
  return body;
118
108
  }
119
109
  export async function cancel(ctx, model, requestId) {
120
- const body = await request(ctx, queueUrl(model, `/requests/${seg(requestId, "request id", "fal")}/cancel`), { method: "PUT" });
110
+ const body = await request(ctx, queuePath(model, `/requests/${pathSegment(requestId)}/cancel`), { method: "PUT" });
121
111
  if (!object(body) || body.status !== "CANCELLATION_REQUESTED")
122
112
  throw new Error("fal: cancellation was not confirmed");
123
113
  return body;
@@ -127,15 +117,16 @@ export async function runModel(ctx, model, input, timeoutMs) {
127
117
  const signal = AbortSignal.timeout(timeoutMs);
128
118
  let requestId;
129
119
  try {
130
- requestId = (await submit(ctx, model, input, signal)).request_id;
120
+ requestId = (await raceSignal(submit(ctx, model, input), signal))
121
+ .request_id;
131
122
  for (;;) {
132
123
  signal.throwIfAborted();
133
- const current = await status(ctx, model, requestId, false, signal);
124
+ const current = await raceSignal(status(ctx, model, requestId, false), signal);
134
125
  if (current.status === "COMPLETED") {
135
126
  if (current.error || current.error_type)
136
127
  throw new Error(`fal: ${current.error ?? "generation failed"}${current.error_type ? ` [${current.error_type}]` : ""}`);
137
128
  return {
138
- output: await result(ctx, model, requestId, signal),
129
+ output: await raceSignal(result(ctx, model, requestId), signal),
139
130
  requestId,
140
131
  };
141
132
  }
@@ -190,7 +181,11 @@ export function collectMedia(output, kind) {
190
181
  push(output[field]);
191
182
  return found;
192
183
  }
193
- /** Restrict automatic downloads to fal's CDN, including every redirect target. */
184
+ /**
185
+ * Restrict automatic downloads to fal's CDN, including every redirect target.
186
+ * These reads carry no credential, so they do not use the broker:
187
+ * redirects are followed manually, each hop re-validated here.
188
+ */
194
189
  function mediaUrl(value) {
195
190
  const url = new URL(value);
196
191
  if (url.protocol !== "https:" ||
@@ -299,5 +294,5 @@ export const saveDirSchema = t.String({
299
294
  description: "Existing directory for generated files; defaults to the OS temp directory.",
300
295
  });
301
296
  export const extraInputSchema = t.Record(t.String(), t.Unknown(), {
302
- description: "Model-specific fields, overriding action defaults. See https://fal.ai/models/<model>/api. Media downloads support HTTPS fal.media URLs and data URIs, up to 512 MiB each; JSON responses are limited to 32 MiB.",
297
+ description: "Model-specific fields, overriding action defaults. See https://fal.ai/models/<model>/api. Media downloads support HTTPS fal.media URLs and data URIs, up to 512 MiB each; JSON responses are limited to 64 MiB.",
303
298
  });
@@ -0,0 +1,20 @@
1
+ import { hostLabel, staticCredential } from "../../_shared/credentials.js";
2
+ /** An agent API key as the Basic username, with the fixed dummy password "X",
3
+ * to the account's own Freshdesk subdomain. */
4
+ export const freshdeskCredential = staticCredential({
5
+ id: "freshdesk",
6
+ auth: { kind: "basic" },
7
+ local: { username: "apiKey", password: { value: "X" } },
8
+ targets: (config) => ({
9
+ api: {
10
+ baseUrl: `https://${hostLabel(config.domain)}.freshdesk.com/api/v2/`,
11
+ methods: ["GET", "POST", "PUT", "DELETE"],
12
+ },
13
+ }),
14
+ probe: {
15
+ target: "api",
16
+ path: "agents/me",
17
+ method: "GET",
18
+ acceptedStatuses: [200],
19
+ },
20
+ });
@@ -1,3 +1,5 @@
1
+ import { credentialJson, pathSegment } from "../../_shared/credentials.js";
2
+ import { freshdeskCredential } from "./credentials.js";
1
3
  const STATUS = {
2
4
  open: 2,
3
5
  pending: 3,
@@ -19,47 +21,24 @@ const SOURCE = {
19
21
  feedbackWidget: 9,
20
22
  outboundEmail: 10,
21
23
  };
22
- async function apiRequest(domain, apiKey, method, endpoint, body, qs) {
23
- const url = new URL(`https://${domain}.freshdesk.com/api/v2${endpoint}`);
24
- if (qs) {
25
- for (const [k, v] of Object.entries(qs)) {
26
- if (v !== undefined && v !== null)
27
- url.searchParams.set(k, String(v));
28
- }
29
- }
30
- const opts = {
31
- method,
32
- headers: {
33
- Authorization: `Basic ${btoa(`${apiKey}:X`)}`,
34
- "Content-Type": "application/json",
35
- },
36
- };
37
- if (body &&
38
- Object.keys(body).length > 0 &&
39
- method !== "GET" &&
40
- method !== "DELETE") {
41
- opts.body = JSON.stringify(body);
42
- }
43
- const res = await fetch(url.toString(), opts);
44
- if (!res.ok)
45
- throw new Error(`Freshdesk API error ${res.status}: ${await res.text()}`);
46
- if (res.status === 204)
47
- return { success: true };
48
- return res.json();
49
- }
50
- function getConn(ctx) {
51
- return {
52
- domain: ctx.connection.config.domain,
53
- apiKey: ctx.connection.config.apiKey,
54
- };
55
- }
56
24
  function req(ctx, method, endpoint, body, qs) {
57
- const { domain, apiKey } = getConn(ctx);
58
- return apiRequest(domain, apiKey, method, endpoint, body, qs);
25
+ return credentialJson(ctx, freshdeskCredential, "freshdesk", {
26
+ target: "api",
27
+ path: endpoint,
28
+ method,
29
+ query: qs,
30
+ ...(body &&
31
+ Object.keys(body).length > 0 &&
32
+ method !== "GET" &&
33
+ method !== "DELETE"
34
+ ? { json: body }
35
+ : {}),
36
+ });
59
37
  }
60
38
  export default function freshdesk(rl) {
61
39
  rl.setName("freshdesk");
62
40
  rl.setVersion("0.1.0");
41
+ rl.setCredential(freshdeskCredential);
63
42
  rl.setConnectionSchema({
64
43
  domain: {
65
44
  type: "string",
@@ -188,7 +167,7 @@ export default function freshdesk(rl) {
188
167
  body.fr_due_by = i.frDueBy;
189
168
  if (i.customFields)
190
169
  body.custom_fields = i.customFields;
191
- return req(ctx, "POST", "/tickets", body);
170
+ return req(ctx, "POST", "tickets", body);
192
171
  },
193
172
  });
194
173
  rl.registerAction("ticket.get", {
@@ -198,7 +177,7 @@ export default function freshdesk(rl) {
198
177
  ticketId: { type: "string", required: true, description: "Ticket ID" },
199
178
  },
200
179
  async execute(input, ctx) {
201
- return req(ctx, "GET", `/tickets/${input.ticketId}`);
180
+ return req(ctx, "GET", `tickets/${pathSegment(input.ticketId)}`);
202
181
  },
203
182
  });
204
183
  rl.registerAction("ticket.list", {
@@ -265,7 +244,7 @@ export default function freshdesk(rl) {
265
244
  qs.order_type = orderType;
266
245
  if (include)
267
246
  qs.include = include;
268
- return req(ctx, "GET", "/tickets", undefined, qs);
247
+ return req(ctx, "GET", "tickets", undefined, qs);
269
248
  },
270
249
  });
271
250
  rl.registerAction("ticket.update", {
@@ -329,7 +308,7 @@ export default function freshdesk(rl) {
329
308
  body.fr_due_by = frDueBy;
330
309
  if (customFields)
331
310
  body.custom_fields = customFields;
332
- return req(ctx, "PUT", `/tickets/${ticketId}`, body);
311
+ return req(ctx, "PUT", `tickets/${pathSegment(ticketId)}`, body);
333
312
  },
334
313
  });
335
314
  rl.registerAction("ticket.delete", {
@@ -339,7 +318,7 @@ export default function freshdesk(rl) {
339
318
  ticketId: { type: "string", required: true, description: "Ticket ID" },
340
319
  },
341
320
  async execute(input, ctx) {
342
- await req(ctx, "DELETE", `/tickets/${input.ticketId}`);
321
+ await req(ctx, "DELETE", `tickets/${pathSegment(input.ticketId)}`);
343
322
  return { success: true };
344
323
  },
345
324
  });
@@ -388,7 +367,7 @@ export default function freshdesk(rl) {
388
367
  body.company_id = companyId;
389
368
  if (customFields)
390
369
  body.custom_fields = customFields;
391
- return req(ctx, "POST", "/contacts", body);
370
+ return req(ctx, "POST", "contacts", body);
392
371
  },
393
372
  });
394
373
  rl.registerAction("contact.get", {
@@ -398,7 +377,7 @@ export default function freshdesk(rl) {
398
377
  contactId: { type: "string", required: true, description: "Contact ID" },
399
378
  },
400
379
  async execute(input, ctx) {
401
- return req(ctx, "GET", `/contacts/${input.contactId}`);
380
+ return req(ctx, "GET", `contacts/${pathSegment(input.contactId)}`);
402
381
  },
403
382
  });
404
383
  rl.registerAction("contact.list", {
@@ -445,7 +424,7 @@ export default function freshdesk(rl) {
445
424
  qs.company_id = companyId;
446
425
  if (state)
447
426
  qs.state = state;
448
- return req(ctx, "GET", "/contacts", undefined, qs);
427
+ return req(ctx, "GET", "contacts", undefined, qs);
449
428
  },
450
429
  });
451
430
  rl.registerAction("contact.update", {
@@ -485,7 +464,7 @@ export default function freshdesk(rl) {
485
464
  body.tags = tags;
486
465
  if (customFields)
487
466
  body.custom_fields = customFields;
488
- return req(ctx, "PUT", `/contacts/${contactId}`, body);
467
+ return req(ctx, "PUT", `contacts/${pathSegment(contactId)}`, body);
489
468
  },
490
469
  });
491
470
  rl.registerAction("contact.delete", {
@@ -495,7 +474,7 @@ export default function freshdesk(rl) {
495
474
  contactId: { type: "string", required: true, description: "Contact ID" },
496
475
  },
497
476
  async execute(input, ctx) {
498
- await req(ctx, "DELETE", `/contacts/${input.contactId}`);
477
+ await req(ctx, "DELETE", `contacts/${pathSegment(input.contactId)}`);
499
478
  return { success: true };
500
479
  },
501
480
  });
@@ -0,0 +1,16 @@
1
+ import { hostLabel, staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * An API key as the Basic username with Freshservice's fixed "X" password,
4
+ * on the connection's own subdomain of freshservice.com.
5
+ */
6
+ export const freshserviceCredential = staticCredential({
7
+ id: "freshservice",
8
+ auth: { kind: "basic" },
9
+ local: { username: "apiKey", password: { value: "X" } },
10
+ targets: (config) => ({
11
+ api: {
12
+ baseUrl: `https://${hostLabel(config.domain)}.freshservice.com/api/v2/`,
13
+ methods: ["GET", "POST", "PUT", "DELETE"],
14
+ },
15
+ }),
16
+ });