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,47 +1,24 @@
1
- async function apiRequest(baseUrl, username, password, method, endpoint, body, qs) {
2
- const url = new URL(`${baseUrl}${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 = {
1
+ import { credentialOk, jsonOrAcknowledged, pathSegment, } from "../../_shared/credentials.js";
2
+ import { elasticsearchCredential } from "./credentials.js";
3
+ async function req(ctx, method, path, body, query) {
4
+ const res = await credentialOk(ctx, elasticsearchCredential, "elasticsearch", {
5
+ target: "api",
6
+ path,
10
7
  method,
11
- headers: {
12
- Authorization: `Basic ${btoa(`${username}:${password}`)}`,
13
- "Content-Type": "application/json",
14
- },
15
- };
16
- if (body &&
17
- Object.keys(body).length > 0 &&
18
- method !== "GET" &&
19
- method !== "DELETE") {
20
- opts.body = JSON.stringify(body);
21
- }
22
- const res = await fetch(url.toString(), opts);
23
- if (!res.ok)
24
- throw new Error(`Elasticsearch error ${res.status}: ${await res.text()}`);
25
- const ct = res.headers.get("content-type") ?? "";
26
- if (ct.includes("application/json"))
27
- return res.json();
28
- return { success: true };
29
- }
30
- function getConn(ctx) {
31
- const cfg = ctx.connection.config;
32
- return {
33
- baseUrl: cfg.baseUrl.replace(/\/$/, ""),
34
- username: cfg.username ?? "",
35
- password: cfg.password ?? "",
36
- };
37
- }
38
- function req(ctx, method, endpoint, body, qs) {
39
- const { baseUrl, username, password } = getConn(ctx);
40
- return apiRequest(baseUrl, username, password, method, endpoint, body, qs);
8
+ query,
9
+ ...(body &&
10
+ Object.keys(body).length > 0 &&
11
+ method !== "GET" &&
12
+ method !== "DELETE"
13
+ ? { json: body }
14
+ : {}),
15
+ });
16
+ return jsonOrAcknowledged(res);
41
17
  }
42
18
  export default function elasticsearch(rl) {
43
19
  rl.setName("elasticsearch");
44
20
  rl.setVersion("0.1.0");
21
+ rl.setCredential(elasticsearchCredential);
45
22
  rl.setConnectionSchema({
46
23
  baseUrl: {
47
24
  type: "string",
@@ -77,7 +54,9 @@ export default function elasticsearch(rl) {
77
54
  },
78
55
  async execute(input, ctx) {
79
56
  const { index, id, body } = input;
80
- const endpoint = id ? `/${index}/_doc/${id}` : `/${index}/_doc`;
57
+ const endpoint = id
58
+ ? `${pathSegment(index)}/_doc/${pathSegment(id)}`
59
+ : `${pathSegment(index)}/_doc`;
81
60
  return req(ctx, id ? "PUT" : "POST", endpoint, body);
82
61
  },
83
62
  });
@@ -90,7 +69,7 @@ export default function elasticsearch(rl) {
90
69
  },
91
70
  async execute(input, ctx) {
92
71
  const { index, id } = input;
93
- return req(ctx, "GET", `/${index}/_doc/${id}`);
72
+ return req(ctx, "GET", `${pathSegment(index)}/_doc/${pathSegment(id)}`);
94
73
  },
95
74
  });
96
75
  rl.registerAction("document.update", {
@@ -107,7 +86,7 @@ export default function elasticsearch(rl) {
107
86
  },
108
87
  async execute(input, ctx) {
109
88
  const { index, id, body } = input;
110
- return req(ctx, "POST", `/${index}/_update/${id}`, { doc: body });
89
+ return req(ctx, "POST", `${pathSegment(index)}/_update/${pathSegment(id)}`, { doc: body });
111
90
  },
112
91
  });
113
92
  rl.registerAction("document.delete", {
@@ -119,7 +98,7 @@ export default function elasticsearch(rl) {
119
98
  },
120
99
  async execute(input, ctx) {
121
100
  const { index, id } = input;
122
- return req(ctx, "DELETE", `/${index}/_doc/${id}`);
101
+ return req(ctx, "DELETE", `${pathSegment(index)}/_doc/${pathSegment(id)}`);
123
102
  },
124
103
  });
125
104
  rl.registerAction("document.search", {
@@ -151,7 +130,7 @@ export default function elasticsearch(rl) {
151
130
  body.from = offset;
152
131
  if (sort)
153
132
  body.sort = sort;
154
- const data = (await req(ctx, "POST", `/${index}/_search`, body));
133
+ const data = (await req(ctx, "POST", `${pathSegment(index)}/_search`, body));
155
134
  return data.hits?.hits;
156
135
  },
157
136
  });
@@ -179,7 +158,7 @@ export default function elasticsearch(rl) {
179
158
  body.settings = settings;
180
159
  if (mappings)
181
160
  body.mappings = mappings;
182
- return req(ctx, "PUT", `/${index}`, Object.keys(body).length > 0 ? body : undefined);
161
+ return req(ctx, "PUT", pathSegment(index), body);
183
162
  },
184
163
  });
185
164
  rl.registerAction("index.get", {
@@ -189,14 +168,14 @@ export default function elasticsearch(rl) {
189
168
  index: { type: "string", required: true, description: "Index name" },
190
169
  },
191
170
  async execute(input, ctx) {
192
- return req(ctx, "GET", `/${input.index}`);
171
+ return req(ctx, "GET", pathSegment(input.index));
193
172
  },
194
173
  });
195
174
  rl.registerAction("index.list", {
196
175
  access: "read",
197
176
  description: "List all indices",
198
177
  async execute(_input, ctx) {
199
- return req(ctx, "GET", "/_cat/indices", undefined, { format: "json" });
178
+ return req(ctx, "GET", "_cat/indices", undefined, { format: "json" });
200
179
  },
201
180
  });
202
181
  rl.registerAction("index.delete", {
@@ -206,7 +185,7 @@ export default function elasticsearch(rl) {
206
185
  index: { type: "string", required: true, description: "Index name" },
207
186
  },
208
187
  async execute(input, ctx) {
209
- return req(ctx, "DELETE", `/${input.index}`);
188
+ return req(ctx, "DELETE", pathSegment(input.index));
210
189
  },
211
190
  });
212
191
  }
@@ -0,0 +1,30 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * The longest request deadline: the input schemas' `timeout` maximum and the
4
+ * `audio` target's deadline, at the transport's default host ceiling.
5
+ */
6
+ export const MAX_TIMEOUT_MS = 10 * 60_000;
7
+ /**
8
+ * An ElevenLabs API key, sent as `xi-api-key` to the one API origin. The
9
+ * `audio` target carries generation, transcription, and downloads: it
10
+ * declares `MAX_TIMEOUT_MS` and the 100 MiB audio ceiling, both capped by
11
+ * the host. The `api` target is the catalog
12
+ * and management surface on the transport defaults.
13
+ */
14
+ export const elevenlabsCredential = staticCredential({
15
+ id: "elevenlabs",
16
+ auth: { kind: "apiKey", header: "xi-api-key" },
17
+ local: { secret: "apiKey" },
18
+ targets: {
19
+ api: {
20
+ baseUrl: "https://api.elevenlabs.io/",
21
+ methods: ["GET", "POST", "DELETE"],
22
+ },
23
+ audio: {
24
+ baseUrl: "https://api.elevenlabs.io/",
25
+ methods: ["GET", "POST"],
26
+ timeoutMs: MAX_TIMEOUT_MS,
27
+ maxResponseBytes: 100 * 1024 * 1024,
28
+ },
29
+ },
30
+ });
@@ -1,4 +1,5 @@
1
1
  import * as t from "typebox";
2
+ import { elevenlabsCredential } from "./credentials.js";
2
3
  import { audioOptions, formatSchema, musicSchema as music, STRICT, seed, speechControls, text, timeout, voiceSettings, } from "./schemas.js";
3
4
  import { appendFile, audioRequest, jsonRequest, voiceForm, voicePath, } from "./shared.js";
4
5
  import { registerWorkflows } from "./workflows.js";
@@ -89,6 +90,7 @@ const sound = t.Object({
89
90
  export default function elevenlabs(rl) {
90
91
  rl.setName("elevenlabs");
91
92
  rl.setVersion("0.1.0");
93
+ rl.setCredential(elevenlabsCredential);
92
94
  registerWorkflows(rl);
93
95
  rl.setConnectionSchema(t.Object({
94
96
  apiKey: t.String({
@@ -226,7 +228,8 @@ export default function elevenlabs(rl) {
226
228
  if (value !== undefined)
227
229
  form.append(key, String(value));
228
230
  }
229
- return jsonRequest(ctx, "/v1/speech-to-text", "transcription", { method: "POST", body: form }, p.timeoutMs ?? 300_000);
231
+ // The audio target carries the long transcription deadline.
232
+ return jsonRequest(ctx, "/v1/speech-to-text", "transcription", { method: "POST", body: form }, p.timeoutMs ?? 300_000, "audio");
230
233
  },
231
234
  });
232
235
  rl.registerAction("music.create", {
@@ -1,9 +1,10 @@
1
1
  import * as t from "typebox";
2
+ import { MAX_TIMEOUT_MS } from "./credentials.js";
2
3
  export const STRICT = { additionalProperties: false };
3
4
  export const text = t.String({ minLength: 1, pattern: "\\S" });
4
5
  export const timeout = t.Integer({
5
6
  minimum: 1000,
6
- maximum: 3_600_000,
7
+ maximum: MAX_TIMEOUT_MS,
7
8
  default: 300_000,
8
9
  description: "Request deadline including the response body; does not cancel provider work.",
9
10
  });
@@ -1,42 +1,93 @@
1
- import { constants } from "node:fs";
2
- import { open } from "node:fs/promises";
3
1
  import { basename } from "node:path";
2
+ import { AuthError } from "runline";
4
3
  import * as t from "typebox";
5
4
  import { Check } from "typebox/value";
6
- import { authedFetch } from "../../_shared/authedFetch.js";
5
+ import { credentialBroker } from "../../_shared/credentialAdapter.js";
6
+ import { multipartBody, pathSegment, responseFailed, } from "../../_shared/credentials.js";
7
+ import { readLocalFile } from "../../_shared/localFile.js";
7
8
  import { SEND_FILE_NOTE, writeMediaFile } from "../../_shared/mediaFile.js";
8
- import { obj, readBounded, readBoundedBytes, seg, } from "../../_shared/provider.js";
9
- export const voicePath = (id) => seg(id, "voice id", "elevenlabs");
9
+ import { obj, readBounded, readBoundedBytes } from "../../_shared/provider.js";
10
+ import { elevenlabsCredential } from "./credentials.js";
11
+ export const voicePath = (id) => pathSegment(id);
10
12
  const JSON_LIMIT = 8 * 1024 * 1024;
11
13
  const AUDIO_LIMIT = 100 * 1024 * 1024;
12
- /** A fixed origin, no redirects or retries, and one deadline through body consumption. */
13
- async function request(ctx, path, init, timeoutMs, consume) {
14
- const key = ctx.connection.config.apiKey;
15
- if (typeof key !== "string" || !key.trim())
16
- throw new Error("Missing ELEVENLABS_API_KEY");
14
+ /**
15
+ * The caller-tunable deadline over a brokered exchange. The transport
16
+ * buffers the body, so the race bounds the whole exchange; on timeout the
17
+ * brokered call runs on to the target's own deadline, and its late outcome
18
+ * is observed so it cannot become an unhandled rejection.
19
+ */
20
+ async function withDeadline(work, timeoutMs) {
21
+ let timer;
22
+ try {
23
+ return await Promise.race([
24
+ work,
25
+ new Promise((_, reject) => {
26
+ timer = setTimeout(() => {
27
+ work.catch(() => { });
28
+ reject(new Error("elevenlabs: request timed out"));
29
+ }, timeoutMs);
30
+ }),
31
+ ]);
32
+ }
33
+ finally {
34
+ clearTimeout(timer);
35
+ }
36
+ }
37
+ /** Every credential-bearing request signs through the declared credential. */
38
+ async function request(ctx, target, path, init, timeoutMs, consume) {
17
39
  let requestId = null;
18
40
  try {
19
- const response = await authedFetch(`https://api.elevenlabs.io${path}`, {
20
- ...init,
21
- headers: {
22
- "xi-api-key": key.trim(),
23
- ...(typeof init.body === "string"
24
- ? { "content-type": "application/json" }
25
- : {}),
26
- },
27
- signal: AbortSignal.timeout(timeoutMs),
28
- });
41
+ const headers = {};
42
+ let body;
43
+ if (typeof init.body === "string") {
44
+ body = init.body;
45
+ headers["content-type"] = "application/json";
46
+ }
47
+ else if (init.body !== undefined) {
48
+ const multipart = await multipartBody(init.body);
49
+ body = multipart.body;
50
+ headers["content-type"] = multipart.contentType;
51
+ }
52
+ const response = await withDeadline(credentialBroker(ctx, elevenlabsCredential).request({
53
+ target,
54
+ path: path.replace(/^\//, ""),
55
+ method: init.method ?? "GET",
56
+ headers,
57
+ ...(body !== undefined ? { body } : {}),
58
+ }), timeoutMs);
29
59
  requestId = response.headers.get("request-id");
30
60
  // Both JSON and audio errors use the provider's JSON error envelope.
31
61
  if (!response.ok)
32
- await json(response);
62
+ throw await responseFailed("elevenlabs", response, errorEnvelope);
33
63
  return await consume(response);
34
64
  }
35
65
  catch (error) {
66
+ // The request id and retry guidance join the message; a transport
67
+ // failure keeps its code, so callers can still tell why it failed.
36
68
  const mutation = init.method && init.method !== "GET";
37
- throw new Error(`${error instanceof Error ? error.message : String(error)}${requestId ? ` (requestId ${requestId})` : ""}${mutation ? ". Request may have been applied or billed; do not retry automatically." : ""}`, { cause: error });
69
+ const wrapped = new Error(`${error instanceof Error ? error.message : String(error)}${requestId ? ` (requestId ${requestId})` : ""}${mutation ? ". Request may have been applied or billed; do not retry automatically." : ""}`, { cause: error });
70
+ if (error instanceof AuthError)
71
+ wrapped.code = error.code;
72
+ throw wrapped;
38
73
  }
39
74
  }
75
+ /**
76
+ * The error envelope's `detail`: a status code (or a bare code string), or
77
+ * the validation entries whose `loc` paths name the offending fields.
78
+ */
79
+ function errorEnvelope(body) {
80
+ const detail = obj(body).detail;
81
+ return {
82
+ code: typeof detail === "string" ? detail : obj(detail).status,
83
+ param: Array.isArray(detail)
84
+ ? detail.map((entry) => {
85
+ const loc = obj(entry).loc;
86
+ return Array.isArray(loc) ? loc.join(".") : loc;
87
+ })
88
+ : undefined,
89
+ };
90
+ }
40
91
  async function json(response, limit = JSON_LIMIT) {
41
92
  const text = await readBounded(response, limit, `elevenlabs: JSON exceeds ${limit / (1024 * 1024)} MiB`);
42
93
  let body;
@@ -44,23 +95,7 @@ async function json(response, limit = JSON_LIMIT) {
44
95
  body = text ? JSON.parse(text) : null;
45
96
  }
46
97
  catch {
47
- throw new Error(`elevenlabs HTTP ${response.status}: non-JSON response`);
48
- }
49
- if (!response.ok) {
50
- const detail = obj(body).detail;
51
- const error = obj(detail);
52
- // Include provider error messages and locations, not validation input payloads.
53
- const message = typeof detail === "string"
54
- ? detail
55
- : Array.isArray(detail)
56
- ? detail
57
- .map((v) => {
58
- const e = obj(v);
59
- return `${Array.isArray(e.loc) ? e.loc.join(".") : "body"}: ${e.msg ?? "invalid"}`;
60
- })
61
- .join("; ")
62
- : `${error.status ?? "request failed"}: ${error.message ?? ""}`;
63
- throw new Error(`elevenlabs HTTP ${response.status}: ${message.slice(0, 1000)}`);
98
+ throw new Error("elevenlabs: non-JSON response");
64
99
  }
65
100
  if (body === null || typeof body !== "object")
66
101
  throw new Error("elevenlabs: expected a JSON object or array");
@@ -105,8 +140,8 @@ const responses = {
105
140
  }),
106
141
  dictionary: t.Object({ id, version_id: id }),
107
142
  };
108
- export async function jsonRequest(ctx, path, expected, init = {}, timeoutMs = 60_000) {
109
- return request(ctx, path, init, timeoutMs, async (response) => {
143
+ export async function jsonRequest(ctx, path, expected, init = {}, timeoutMs = 60_000, target = "api") {
144
+ return request(ctx, target, path, init, timeoutMs, async (response) => {
110
145
  const body = await json(response);
111
146
  if (!Check(responses[expected], body))
112
147
  throw new Error(`elevenlabs: invalid ${expected} response`);
@@ -182,7 +217,7 @@ export async function audioRequest(ctx, path, body, options) {
182
217
  }
183
218
  /** All generated, aligned, isolated, and recovered audio uses the same file writer. */
184
219
  export async function binaryRequest(ctx, path, init, options) {
185
- return request(ctx, path, init, options.timeoutMs ?? 300_000, async (response) => {
220
+ return request(ctx, "audio", path, init, options.timeoutMs ?? 300_000, async (response) => {
186
221
  let bytes;
187
222
  let timestamps = {};
188
223
  let mime;
@@ -248,25 +283,15 @@ export async function voiceForm(input) {
248
283
  form.append("remove_background_noise", String(input.removeBackgroundNoise));
249
284
  return form;
250
285
  }
251
- /** Bound uploads before allocating; read through the same handle to avoid stat/read races. */
286
+ const UPLOAD_RULE = "elevenlabs: each input must be a nonempty regular file of at most 25 MiB";
287
+ /** A local upload as one form part, bounded and read by the shared reader. */
252
288
  export async function appendFile(form, field, path) {
253
- // Nonblocking open lets fstat reject FIFOs without waiting for a writer.
254
- const file = await open(path, constants.O_RDONLY | constants.O_NONBLOCK);
255
- try {
256
- const stat = await file.stat();
257
- if (!stat.isFile() || stat.size === 0 || stat.size > 25 * 1024 * 1024)
258
- throw new Error("elevenlabs: each input must be a nonempty regular file of at most 25 MiB");
259
- const bytes = Buffer.alloc(stat.size);
260
- let offset = 0;
261
- while (offset < bytes.length) {
262
- const { bytesRead } = await file.read(bytes, offset, bytes.length - offset, offset);
263
- if (!bytesRead)
264
- throw new Error("elevenlabs: input file changed while reading");
265
- offset += bytesRead;
266
- }
267
- form.append(field, new Blob([bytes]), basename(path));
268
- }
269
- finally {
270
- await file.close();
271
- }
289
+ const bytes = await readLocalFile(path, {
290
+ subject: `elevenlabs: ${field}`,
291
+ maxBytes: 25 * 1024 * 1024,
292
+ oversize: UPLOAD_RULE,
293
+ });
294
+ if (!bytes.length)
295
+ throw new Error(UPLOAD_RULE);
296
+ form.append(field, new Blob([bytes]), basename(path));
272
297
  }
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { seg } from "../../_shared/provider.js";
2
+ import { pathSegment } from "../../_shared/credentials.js";
3
3
  import { audioOptions, dictionaries, fileOptions, normalization, STRICT, seed, text, voiceSettings, } from "./schemas.js";
4
4
  import { appendFile, audioRequest, binaryRequest, jsonRequest, voiceForm, voicePath, } from "./shared.js";
5
5
  const dialogue = t.Object({
@@ -65,7 +65,7 @@ const dictionaryCreate = t.Object({
65
65
  }, STRICT),
66
66
  ]), { minItems: 1 }),
67
67
  }, STRICT);
68
- const historyPath = (id) => `/v1/history/${seg(id, "history item id", "elevenlabs")}`;
68
+ const historyPath = (id) => `/v1/history/${pathSegment(id)}`;
69
69
  export function registerWorkflows(rl) {
70
70
  rl.registerAction("dialogue.create", {
71
71
  access: "write",
@@ -0,0 +1,14 @@
1
+ import { staticCredential } from "../../_shared/credentials.js";
2
+ /** An API key, sent raw (no scheme) on the Authorization header to Emelia's
3
+ * one GraphQL endpoint. */
4
+ export const emeliaCredential = staticCredential({
5
+ id: "emelia",
6
+ auth: { kind: "apiKey", header: "Authorization" },
7
+ local: { secret: "apiKey" },
8
+ targets: {
9
+ gql: {
10
+ baseUrl: "https://graphql.emelia.io/",
11
+ methods: ["POST"],
12
+ },
13
+ },
14
+ });
@@ -1,26 +1,23 @@
1
- const GQL_URL = "https://graphql.emelia.io/graphql";
2
- async function gql(apiKey, query, variables) {
1
+ import { credentialJson, graphqlFailed } from "../../_shared/credentials.js";
2
+ import { emeliaCredential } from "./credentials.js";
3
+ async function gql(ctx, query, variables) {
3
4
  const body = { query };
4
5
  if (variables)
5
6
  body.variables = variables;
6
- const res = await fetch(GQL_URL, {
7
+ const data = (await credentialJson(ctx, emeliaCredential, "emelia", {
8
+ target: "gql",
9
+ path: "graphql",
7
10
  method: "POST",
8
- headers: {
9
- Authorization: apiKey,
10
- "Content-Type": "application/json",
11
- },
12
- body: JSON.stringify(body),
13
- });
14
- if (!res.ok)
15
- throw new Error(`Emelia API error ${res.status}: ${await res.text()}`);
16
- const data = (await res.json());
11
+ json: body,
12
+ }));
17
13
  if (data.errors)
18
- throw new Error(`Emelia GraphQL error: ${JSON.stringify(data.errors)}`);
14
+ throw graphqlFailed("emelia", data.errors);
19
15
  return data.data;
20
16
  }
21
17
  export default function emelia(rl) {
22
18
  rl.setName("emelia");
23
19
  rl.setVersion("0.1.0");
20
+ rl.setCredential(emeliaCredential);
24
21
  rl.setConnectionSchema({
25
22
  apiKey: {
26
23
  type: "string",
@@ -29,7 +26,6 @@ export default function emelia(rl) {
29
26
  env: "EMELIA_API_KEY",
30
27
  },
31
28
  });
32
- const key = (ctx) => ctx.connection.config.apiKey;
33
29
  // ── Campaign ────────────────────────────────────────
34
30
  rl.registerAction("campaign.create", {
35
31
  access: "write",
@@ -38,7 +34,7 @@ export default function emelia(rl) {
38
34
  name: { type: "string", required: true, description: "Campaign name" },
39
35
  },
40
36
  async execute(input, ctx) {
41
- const data = await gql(key(ctx), `
37
+ const data = await gql(ctx, `
42
38
  mutation createCampaign($name: String!) {
43
39
  createCampaign(name: $name) { _id name status createdAt provider startAt estimatedEnd }
44
40
  }`, { name: input.name });
@@ -56,7 +52,7 @@ export default function emelia(rl) {
56
52
  },
57
53
  },
58
54
  async execute(input, ctx) {
59
- const data = await gql(key(ctx), `
55
+ const data = await gql(ctx, `
60
56
  query campaign($id: ID!) {
61
57
  campaign(id: $id) {
62
58
  _id name status createdAt provider startAt estimatedEnd
@@ -75,7 +71,7 @@ export default function emelia(rl) {
75
71
  },
76
72
  async execute(input, ctx) {
77
73
  const { limit } = (input ?? {});
78
- const data = await gql(key(ctx), `
74
+ const data = await gql(ctx, `
79
75
  query all_campaigns {
80
76
  all_campaigns {
81
77
  _id name status createdAt
@@ -115,7 +111,7 @@ export default function emelia(rl) {
115
111
  contact.lastName = lastName;
116
112
  if (customFields)
117
113
  Object.assign(contact, customFields);
118
- const data = await gql(key(ctx), `
114
+ const data = await gql(ctx, `
119
115
  mutation AddContactToCampaignHook($id: ID!, $contact: JSON!) {
120
116
  addContactToCampaignHook(id: $id, contact: $contact)
121
117
  }`, { id: campaignId, contact });
@@ -133,7 +129,7 @@ export default function emelia(rl) {
133
129
  },
134
130
  },
135
131
  async execute(input, ctx) {
136
- await gql(key(ctx), `mutation startCampaign($id: ID!) { startCampaign(id: $id) }`, { id: input.campaignId });
132
+ await gql(ctx, `mutation startCampaign($id: ID!) { startCampaign(id: $id) }`, { id: input.campaignId });
137
133
  return { success: true };
138
134
  },
139
135
  });
@@ -148,7 +144,7 @@ export default function emelia(rl) {
148
144
  },
149
145
  },
150
146
  async execute(input, ctx) {
151
- await gql(key(ctx), `mutation pauseCampaign($id: ID!) { pauseCampaign(id: $id) }`, { id: input.campaignId });
147
+ await gql(ctx, `mutation pauseCampaign($id: ID!) { pauseCampaign(id: $id) }`, { id: input.campaignId });
152
148
  return { success: true };
153
149
  },
154
150
  });
@@ -189,7 +185,7 @@ export default function emelia(rl) {
189
185
  },
190
186
  async execute(input, ctx) {
191
187
  const { campaignId, name, copySettings = true, copyMails = true, copyContacts = false, copyProvider = true, } = input;
192
- const data = await gql(key(ctx), `
188
+ const data = await gql(ctx, `
193
189
  mutation duplicateCampaign($fromId: ID!, $name: String!, $copySettings: Boolean!, $copyMails: Boolean!, $copyContacts: Boolean!, $copyProvider: Boolean!) {
194
190
  duplicateCampaign(fromId: $fromId, name: $name, copySettings: $copySettings, copyMails: $copyMails, copyContacts: $copyContacts, copyProvider: $copyProvider)
195
191
  }`, {
@@ -212,7 +208,7 @@ export default function emelia(rl) {
212
208
  },
213
209
  async execute(input, ctx) {
214
210
  const { limit } = (input ?? {});
215
- const data = await gql(key(ctx), `
211
+ const data = await gql(ctx, `
216
212
  query contact_lists {
217
213
  contact_lists { _id name contactCount fields usedInCampaign }
218
214
  }`);
@@ -249,7 +245,7 @@ export default function emelia(rl) {
249
245
  contact.lastName = lastName;
250
246
  if (customFields)
251
247
  Object.assign(contact, customFields);
252
- const data = await gql(key(ctx), `
248
+ const data = await gql(ctx, `
253
249
  mutation AddContactsToListHook($id: ID!, $contact: JSON!) {
254
250
  addContactsToListHook(id: $id, contact: $contact)
255
251
  }`, { id: contactListId, contact });
@@ -0,0 +1,27 @@
1
+ import { httpsBase, staticCredential } from "../../_shared/credentials.js";
2
+ /**
3
+ * The API key and secret joined as `token {apiKey}:{apiSecret}` in the
4
+ * Authorization header, on the configured instance's own /api/ base. The
5
+ * host is public config and must be HTTPS.
6
+ */
7
+ export const erpnextCredential = staticCredential({
8
+ id: "erpnext",
9
+ auth: { kind: "apiKey", header: "Authorization", prefix: "token " },
10
+ local: {
11
+ secret: {
12
+ concat: [{ field: "apiKey" }, { value: ":" }, { field: "apiSecret" }],
13
+ },
14
+ },
15
+ targets: (config) => ({
16
+ api: {
17
+ baseUrl: httpsBase(config.host, "api/"),
18
+ methods: ["GET", "POST", "PUT", "DELETE"],
19
+ },
20
+ }),
21
+ probe: {
22
+ target: "api",
23
+ path: "method/frappe.auth.get_logged_user",
24
+ method: "GET",
25
+ acceptedStatuses: [200],
26
+ },
27
+ });