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,24 +1,47 @@
1
+ import { AuthError } from "runline";
1
2
  import * as t from "typebox";
2
- import { apiKey, SHIFT_API_URL, STRICT_OBJECT, shiftFetch, } from "../../_shared/shiftCloud.js";
3
- import { BusinessWorldModelClient, BwmClientError } from "./vendor/client.js";
3
+ import { credentialBroker } from "../../_shared/credentialAdapter.js";
4
+ import { errorIdentifier, failureMessage } from "../../_shared/credentials.js";
5
+ import { SHIFT_API_URL, STRICT_OBJECT } from "../../_shared/shiftCloud.js";
6
+ import { shiftCredential, shiftPath } from "../../_shared/shiftCredentials.js";
7
+ import { BusinessWorldModelClient, BwmClientError, } from "./vendor/client.js";
4
8
  import { BWM_BUILT_IN_OBJECT_TYPES, BWM_LIST_MAX_LIMIT, } from "./vendor/contracts.js";
5
9
  import { BwmFilterOperator } from "./vendor/models.js";
6
10
  export { idSchema, STRICT_OBJECT, STRICT_UPDATE_OBJECT, } from "../../_shared/shiftCloud.js";
11
+ export const shiftBwmCredential = shiftCredential();
7
12
  // ─── client ──────────────────────────────────────────────────────
13
+ /**
14
+ * The vendored client's fetch, sent through the declared credential: the
15
+ * client names Shift API URLs, and each becomes a path beneath the Shift
16
+ * target. The client never holds the key.
17
+ */
18
+ function brokeredFetch(ctx) {
19
+ return (input, init) => {
20
+ const url = new URL(input);
21
+ if (url.origin !== SHIFT_API_URL)
22
+ throw new AuthError("request_not_allowed");
23
+ return credentialBroker(ctx, shiftBwmCredential).request({
24
+ target: "api",
25
+ path: `${shiftPath(url.pathname)}${url.search}`,
26
+ method: (init?.method ?? "GET"),
27
+ headers: {
28
+ Accept: "application/json",
29
+ ...Object.fromEntries(init?.headers ?? []),
30
+ },
31
+ ...(init?.body !== undefined ? { body: init.body } : {}),
32
+ });
33
+ };
34
+ }
8
35
  /**
9
36
  * One client per call. Cheap (prefix + fetch closure), and it lets a
10
37
  * create attach its own `Idempotency-Key` without leaking it into the
11
- * next request. Transport is the shared Shift one: redirects refused,
12
- * one deadline, bounded body.
38
+ * next request.
13
39
  */
14
40
  export function clientFor(ctx, extraHeaders = {}) {
15
41
  return new BusinessWorldModelClient({
16
42
  baseUrl: SHIFT_API_URL,
17
- fetch: shiftFetch,
18
- headers: {
19
- authorization: `Bearer ${apiKey(ctx)}`,
20
- ...extraHeaders,
21
- },
43
+ fetch: brokeredFetch(ctx),
44
+ headers: extraHeaders,
22
45
  });
23
46
  }
24
47
  /** Client whose every mutation carries a fresh `Idempotency-Key`. */
@@ -29,17 +52,19 @@ export function idempotentClientFor(ctx) {
29
52
  /**
30
53
  * Only `message` survives the trip back to the agent's code, so the
31
54
  * fields the model needs to self-correct — `code` and `param` — are
32
- * folded into it. `param` names the offending request location
33
- * (`fields.tier`, `relationships.$owner`).
55
+ * folded into it, as for every Shift plugin. `param` names the offending
56
+ * request location (`fields.tier`, `relationships.$owner`). The service's
57
+ * free-text message can echo request data and is not returned.
34
58
  */
35
59
  export function describeError(err) {
36
60
  if (err instanceof BwmClientError) {
37
- const where = err.param ? ` (param: ${err.param})` : "";
38
- const error = new Error(`Shift Business World Model ${err.status} ${err.code}: ${err.message}${where}`);
61
+ const code = errorIdentifier(err.code);
62
+ const param = errorIdentifier(err.param);
63
+ const error = new Error(failureMessage("shiftBwm", err.status, { code, param }));
39
64
  error.status = err.status;
40
- error.type = err.type;
41
- error.code = err.code;
42
- error.param = err.param;
65
+ error.type = errorIdentifier(err.type);
66
+ error.code = code;
67
+ error.param = param;
43
68
  return error;
44
69
  }
45
70
  return err instanceof Error ? err : new Error(String(err));
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { CRM_ACCESS_ROLE, CRM_BASE, enumSchema, idSchema, listParams, pathSegment, request, STRICT_OBJECT, withQuery, } from "./shared.js";
2
+ import { CRM_ACCESS_ROLE, CRM_BASE, enumSchema, idSchema, pathSegment, request, STRICT_OBJECT, } from "./shared.js";
3
3
  export function registerAccessActions(rl) {
4
4
  rl.registerAction("access.me", {
5
5
  access: "read",
@@ -14,7 +14,7 @@ export function registerAccessActions(rl) {
14
14
  description: "List CRM access grants. Requires a CRM admin grant or admin:* permission.",
15
15
  inputSchema: t.Object({ includeRevoked: t.Optional(t.Boolean()) }, STRICT_OBJECT),
16
16
  async execute(input, ctx) {
17
- const body = await request(ctx, withQuery(`${CRM_BASE}/access`, listParams(input)));
17
+ const body = await request(ctx, `${CRM_BASE}/access`, { query: input });
18
18
  return body.grants;
19
19
  },
20
20
  });
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { CRM_BASE, createRecordFields, idSchema, listParams, paginationFields, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, updateRecordFields, withQuery, } from "./shared.js";
2
+ import { CRM_BASE, createRecordFields, idSchema, paginationFields, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, updateRecordFields, } from "./shared.js";
3
3
  const accountListFields = {
4
4
  search: t.Optional(t.String({ minLength: 1, pattern: "\\S", description: "Name search" })),
5
5
  accountType: t.Optional(t.String({ minLength: 1, description: "Account type filter" })),
@@ -19,7 +19,7 @@ export function registerAccountActions(rl) {
19
19
  description: "List the first page of CRM accounts.",
20
20
  inputSchema: t.Object(accountListFields, STRICT_OBJECT),
21
21
  async execute(input, ctx) {
22
- const body = await request(ctx, withQuery(`${CRM_BASE}/accounts`, listParams(input)));
22
+ const body = await request(ctx, `${CRM_BASE}/accounts`, { query: input });
23
23
  return body.accounts;
24
24
  },
25
25
  });
@@ -28,7 +28,7 @@ export function registerAccountActions(rl) {
28
28
  description: "List a cursor-paginated page of CRM accounts.",
29
29
  inputSchema: t.Object(accountListFields, STRICT_OBJECT),
30
30
  async execute(input, ctx) {
31
- return request(ctx, withQuery(`${CRM_BASE}/accounts`, listParams(input)));
31
+ return request(ctx, `${CRM_BASE}/accounts`, { query: input });
32
32
  },
33
33
  });
34
34
  rl.registerAction("account.get", {
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { assertTimeOrder, CRM_ACTIVITY_DIRECTION, CRM_ACTIVITY_STATUS, CRM_BASE, createRecordFields, enumSchema, idSchema, listParams, paginationFields, request, STRICT_OBJECT, timestampSchema, withQuery, } from "./shared.js";
2
+ import { assertTimeOrder, CRM_ACTIVITY_DIRECTION, CRM_ACTIVITY_STATUS, CRM_BASE, createRecordFields, enumSchema, idSchema, paginationFields, request, STRICT_OBJECT, timestampSchema, } from "./shared.js";
3
3
  const activityListFields = {
4
4
  linkedRecordId: t.Optional(idSchema("Filter by linked CRM record ID")),
5
5
  status: t.Optional(enumSchema("Activity status", CRM_ACTIVITY_STATUS)),
@@ -11,7 +11,7 @@ export function registerActivityActions(rl) {
11
11
  description: "List the first page of CRM activities.",
12
12
  inputSchema: t.Object(activityListFields, STRICT_OBJECT),
13
13
  async execute(input, ctx) {
14
- const body = await request(ctx, withQuery(`${CRM_BASE}/activities`, listParams(input)));
14
+ const body = await request(ctx, `${CRM_BASE}/activities`, { query: input });
15
15
  return body.activities;
16
16
  },
17
17
  });
@@ -20,7 +20,7 @@ export function registerActivityActions(rl) {
20
20
  description: "List a cursor-paginated page of CRM activities.",
21
21
  inputSchema: t.Object(activityListFields, STRICT_OBJECT),
22
22
  async execute(input, ctx) {
23
- return request(ctx, withQuery(`${CRM_BASE}/activities`, listParams(input)));
23
+ return request(ctx, `${CRM_BASE}/activities`, { query: input });
24
24
  },
25
25
  });
26
26
  rl.registerAction("activity.log", {
@@ -0,0 +1,6 @@
1
+ import { shiftClient } from "../../_shared/shiftCredentials.js";
2
+ /**
3
+ * A user-subject Shift CRM API key, signed like every Shift key. The probe
4
+ * reads the key's own CRM access: a key without a grant is rejected there.
5
+ */
6
+ export const { credential: shiftCrmCredential, request } = shiftClient("shiftCrm", { probe: "crm/access/me" });
@@ -2,6 +2,7 @@ import * as t from "typebox";
2
2
  import { registerAccessActions } from "./access.js";
3
3
  import { registerAccountActions } from "./accounts.js";
4
4
  import { registerActivityActions } from "./activities.js";
5
+ import { shiftCrmCredential } from "./credentials.js";
5
6
  import { registerImportActions } from "./imports.js";
6
7
  import { registerOpportunityActions, registerPipelineActions, } from "./opportunities.js";
7
8
  import { registerPersonActions } from "./people.js";
@@ -10,6 +11,7 @@ import { registerTaskActions } from "./tasks.js";
10
11
  export default function shiftCrm(rl) {
11
12
  rl.setName("shiftCrm");
12
13
  rl.setVersion("0.1.0");
14
+ rl.setCredential(shiftCrmCredential);
13
15
  rl.setConnectionSchema(t.Object({
14
16
  apiKey: t.String({
15
17
  description: "User-subject Shift CRM API key minted by an operator via `bun run crm:access key`. It authenticates as its bound user, whose active CRM access grant authorizes data access. Regular Shift cloud service API keys (SHIFT_LABS_API_KEY) cannot reach CRM data.",
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { CRM_BASE, CRM_PIPELINE_OUTCOME, createRecordFields, enumSchema, idSchema, listParams, nullableTimestamp, paginationFields, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, updateRecordFields, withQuery, } from "./shared.js";
2
+ import { CRM_BASE, CRM_PIPELINE_OUTCOME, createRecordFields, enumSchema, idSchema, nullableTimestamp, paginationFields, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, updateRecordFields, } from "./shared.js";
3
3
  const opportunityListFields = {
4
4
  accountId: t.Optional(idSchema("Filter by account record ID")),
5
5
  pipelineId: t.Optional(idSchema("Filter by pipeline ID")),
@@ -70,7 +70,7 @@ export function registerOpportunityActions(rl) {
70
70
  description: "List the first page of CRM opportunities.",
71
71
  inputSchema: t.Object(opportunityListFields, STRICT_OBJECT),
72
72
  async execute(input, ctx) {
73
- const body = await request(ctx, withQuery(`${CRM_BASE}/opportunities`, listParams(input)));
73
+ const body = await request(ctx, `${CRM_BASE}/opportunities`, { query: input });
74
74
  return body.opportunities;
75
75
  },
76
76
  });
@@ -79,7 +79,7 @@ export function registerOpportunityActions(rl) {
79
79
  description: "List a cursor-paginated page of CRM opportunities.",
80
80
  inputSchema: t.Object(opportunityListFields, STRICT_OBJECT),
81
81
  async execute(input, ctx) {
82
- return request(ctx, withQuery(`${CRM_BASE}/opportunities`, listParams(input)));
82
+ return request(ctx, `${CRM_BASE}/opportunities`, { query: input });
83
83
  },
84
84
  });
85
85
  rl.registerAction("opportunity.get", {
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { assertTimeOrder, CRM_BASE, CRM_IDENTITY_KIND, createRecordFields, enumSchema, idSchema, listParams, paginationFields, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, updateRecordFields, withQuery, } from "./shared.js";
2
+ import { assertTimeOrder, CRM_BASE, CRM_IDENTITY_KIND, createRecordFields, enumSchema, idSchema, paginationFields, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, updateRecordFields, } from "./shared.js";
3
3
  const personListFields = {
4
4
  search: t.Optional(t.String({ minLength: 1, pattern: "\\S", description: "Name search" })),
5
5
  accountId: t.Optional(idSchema("Filter by affiliated account record ID")),
@@ -55,7 +55,7 @@ export function registerPersonActions(rl) {
55
55
  description: "List the first page of CRM people.",
56
56
  inputSchema: t.Object(personListFields, STRICT_OBJECT),
57
57
  async execute(input, ctx) {
58
- const body = await request(ctx, withQuery(`${CRM_BASE}/people`, listParams(input)));
58
+ const body = await request(ctx, `${CRM_BASE}/people`, { query: input });
59
59
  return body.people;
60
60
  },
61
61
  });
@@ -64,7 +64,7 @@ export function registerPersonActions(rl) {
64
64
  description: "List a cursor-paginated page of CRM people.",
65
65
  inputSchema: t.Object(personListFields, STRICT_OBJECT),
66
66
  async execute(input, ctx) {
67
- return request(ctx, withQuery(`${CRM_BASE}/people`, listParams(input)));
67
+ return request(ctx, `${CRM_BASE}/people`, { query: input });
68
68
  },
69
69
  });
70
70
  rl.registerAction("person.get", {
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { CRM_BASE, CRM_PROPERTY_DATA_TYPE, enumSchema, idSchema, listParams, pathSegment, recordTypeSchema, request, STRICT_OBJECT, withQuery, } from "./shared.js";
2
+ import { CRM_BASE, CRM_PROPERTY_DATA_TYPE, enumSchema, idSchema, pathSegment, recordTypeSchema, request, STRICT_OBJECT, } from "./shared.js";
3
3
  export function registerRecordActions(rl) {
4
4
  rl.registerAction("record.changeEvents", {
5
5
  access: "read",
@@ -16,7 +16,7 @@ export function registerRecordActions(rl) {
16
16
  description: "List governed custom-property definitions, optionally for one record type.",
17
17
  inputSchema: t.Object({ recordType: t.Optional(recordTypeSchema()) }, STRICT_OBJECT),
18
18
  async execute(input, ctx) {
19
- const body = await request(ctx, withQuery(`${CRM_BASE}/property-definitions`, listParams(input)));
19
+ const body = await request(ctx, `${CRM_BASE}/property-definitions`, { query: input });
20
20
  return body.propertyDefinitions;
21
21
  },
22
22
  });
@@ -1,6 +1,7 @@
1
1
  import * as t from "typebox";
2
2
  import { cursorSchema, enumSchema, idSchema, timestampSchema, } from "../../_shared/shiftCloud.js";
3
- export { enumSchema, idSchema, listParams, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, withQuery, } from "../../_shared/shiftCloud.js";
3
+ export { enumSchema, idSchema, pathSegment, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, } from "../../_shared/shiftCloud.js";
4
+ export { request } from "./credentials.js";
4
5
  export const CRM_BASE = "/v1/crm";
5
6
  export const CRM_ACCESS_ROLE = ["user", "admin"];
6
7
  export const CRM_RECORD_TYPE = [
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { CRM_BASE, CRM_TASK_PRIORITY, CRM_TASK_STATUS, createRecordFields, enumSchema, idSchema, listParams, nullableTimestamp, paginationFields, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, updateRecordFields, withQuery, } from "./shared.js";
2
+ import { CRM_BASE, CRM_TASK_PRIORITY, CRM_TASK_STATUS, createRecordFields, enumSchema, idSchema, nullableTimestamp, paginationFields, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, updateRecordFields, } from "./shared.js";
3
3
  const taskListFields = {
4
4
  linkedRecordId: t.Optional(idSchema("Filter by linked CRM record ID")),
5
5
  status: t.Optional(enumSchema("Task status", CRM_TASK_STATUS)),
@@ -12,7 +12,7 @@ export function registerTaskActions(rl) {
12
12
  description: "List the first page of CRM tasks.",
13
13
  inputSchema: t.Object(taskListFields, STRICT_OBJECT),
14
14
  async execute(input, ctx) {
15
- const body = await request(ctx, withQuery(`${CRM_BASE}/tasks`, listParams(input)));
15
+ const body = await request(ctx, `${CRM_BASE}/tasks`, { query: input });
16
16
  return body.tasks;
17
17
  },
18
18
  });
@@ -21,7 +21,7 @@ export function registerTaskActions(rl) {
21
21
  description: "List a cursor-paginated page of CRM tasks.",
22
22
  inputSchema: t.Object(taskListFields, STRICT_OBJECT),
23
23
  async execute(input, ctx) {
24
- return request(ctx, withQuery(`${CRM_BASE}/tasks`, listParams(input)));
24
+ return request(ctx, `${CRM_BASE}/tasks`, { query: input });
25
25
  },
26
26
  });
27
27
  rl.registerAction("task.get", {
@@ -0,0 +1,2 @@
1
+ import { shiftClient } from "../../_shared/shiftCredentials.js";
2
+ export const { credential: shiftObjectsCredential, request } = shiftClient("shiftObjects");
@@ -1,4 +1,5 @@
1
1
  import * as t from "typebox";
2
+ import { shiftObjectsCredential } from "./credentials.js";
2
3
  import { registerObjectActions } from "./objects.js";
3
4
  /**
4
5
  * Shift Objects — the organization's durable object bucket in the
@@ -10,6 +11,7 @@ import { registerObjectActions } from "./objects.js";
10
11
  export default function shiftObjects(rl) {
11
12
  rl.setName("shiftObjects");
12
13
  rl.setVersion("0.1.0");
14
+ rl.setCredential(shiftObjectsCredential);
13
15
  rl.setConnectionSchema(t.Object({
14
16
  apiKey: t.String({
15
17
  description: "Shift Labs API key",
@@ -1,8 +1,9 @@
1
1
  import { writeFile } from "node:fs/promises";
2
2
  import { basename } from "node:path";
3
3
  import * as t from "typebox";
4
- import { enumSchema, listParams, pathSegment, request, STRICT_OBJECT, withQuery, } from "../../_shared/shiftCloud.js";
4
+ import { enumSchema, pathSegment, STRICT_OBJECT, } from "../../_shared/shiftCloud.js";
5
5
  import { GENERAL_MEDIA_TYPES, mediaTypeFromPath, putThroughGrant, SIGNED_UPLOAD_MAX_BYTES, statUploadFile, } from "../../_shared/shiftUpload.js";
6
+ import { request } from "./credentials.js";
6
7
  const OBJECTS_BASE = "/v1/services/objects";
7
8
  export const OBJECT_STATUS = ["pending_upload", "ready", "archived"];
8
9
  export const OBJECT_LINK_TARGET = [
@@ -83,7 +84,7 @@ export function registerObjectActions(rl) {
83
84
  metadata: fields.metadata,
84
85
  }),
85
86
  });
86
- await putThroughGrant(created.upload, fields.path, contentType, sizeBytes, "Object upload");
87
+ await putThroughGrant(created.upload, fields.path, contentType, "Object upload");
87
88
  return request(ctx, `${OBJECTS_BASE}/objects/${pathSegment(created.object.id)}/complete`, { method: "POST" });
88
89
  },
89
90
  });
@@ -97,7 +98,7 @@ export function registerObjectActions(rl) {
97
98
  ...provenanceFields,
98
99
  }, STRICT_OBJECT),
99
100
  async execute(input, ctx) {
100
- const body = await request(ctx, withQuery(`${OBJECTS_BASE}/objects`, listParams(input)));
101
+ const body = await request(ctx, `${OBJECTS_BASE}/objects`, { query: input });
101
102
  return body.objects;
102
103
  },
103
104
  });
@@ -0,0 +1,8 @@
1
+ import { shiftClient } from "../../_shared/shiftCredentials.js";
2
+ /**
3
+ * Extraction runs synchronously; a long multi-page PDF takes minutes, not
4
+ * seconds. The target declares that deadline so the transport holds the
5
+ * request open for the whole extraction.
6
+ */
7
+ export const EXTRACT_TIMEOUT_MS = 5 * 60_000;
8
+ export const { credential: shiftOcrCredential, request } = shiftClient("shiftOcr", { timeoutMs: EXTRACT_TIMEOUT_MS });
@@ -1,8 +1,9 @@
1
- import { readFile } from "node:fs/promises";
2
1
  import { basename, extname } from "node:path";
3
2
  import * as t from "typebox";
4
- import { request, STRICT_OBJECT } from "../../_shared/shiftCloud.js";
3
+ import { readLocalFile } from "../../_shared/localFile.js";
4
+ import { pathSegment, STRICT_OBJECT, } from "../../_shared/shiftCloud.js";
5
5
  import { putThroughGrant, SIGNED_UPLOAD_MAX_BYTES, statUploadFile, } from "../../_shared/shiftUpload.js";
6
+ import { request, shiftOcrCredential } from "./credentials.js";
6
7
  /**
7
8
  * Shift OCR — text and structured-field extraction from images and
8
9
  * PDFs through the Shift cloud OCR service. The API key is the tenant
@@ -30,8 +31,6 @@ const DOCUMENT_TYPES = {
30
31
  * anything larger uploads to the object bucket instead.
31
32
  */
32
33
  const MAX_INLINE_BYTES = 20 * 1024 * 1024;
33
- /** Extraction runs synchronously; a long multi-page PDF takes minutes, not seconds. */
34
- const EXTRACT_TIMEOUT_MS = 5 * 60_000;
35
34
  async function documentFromPath(ctx, path) {
36
35
  const extension = extname(path).slice(1).toLowerCase();
37
36
  const imageType = IMAGE_TYPES[extension];
@@ -45,7 +44,12 @@ async function documentFromPath(ctx, path) {
45
44
  const mediaType = (imageType ?? documentType);
46
45
  const sizeBytes = await statUploadFile(path, SIGNED_UPLOAD_MAX_BYTES);
47
46
  if (sizeBytes <= MAX_INLINE_BYTES) {
48
- const url = `data:${mediaType};base64,${(await readFile(path)).toString("base64")}`;
47
+ const bytes = await readLocalFile(path, {
48
+ subject: "File",
49
+ maxBytes: MAX_INLINE_BYTES,
50
+ oversize: "File grew past the inline limit while reading; retry",
51
+ });
52
+ const url = `data:${mediaType};base64,${bytes.toString("base64")}`;
49
53
  return imageType
50
54
  ? { type: "image", url }
51
55
  : { type: "document", url, name: basename(path) };
@@ -60,8 +64,8 @@ async function documentFromPath(ctx, path) {
60
64
  filename: basename(path),
61
65
  }),
62
66
  });
63
- await putThroughGrant(created.upload, path, mediaType, sizeBytes);
64
- await request(ctx, `/v1/services/objects/objects/${created.object.id}/complete`, { method: "POST" });
67
+ await putThroughGrant(created.upload, path, mediaType);
68
+ await request(ctx, `/v1/services/objects/objects/${pathSegment(created.object.id)}/complete`, { method: "POST" });
65
69
  return { type: "object", objectId: created.object.id };
66
70
  }
67
71
  function documentFromUrl(url, kind) {
@@ -81,6 +85,7 @@ function documentFromUrl(url, kind) {
81
85
  export default function shiftOcr(rl) {
82
86
  rl.setName("shiftOcr");
83
87
  rl.setVersion("0.1.0");
88
+ rl.setCredential(shiftOcrCredential);
84
89
  rl.setConnectionSchema(t.Object({
85
90
  // Same Shift Labs API key as the shiftLabs plugin; the cloud
86
91
  // derives the organization from it, so no org ID is needed.
@@ -160,6 +165,7 @@ export default function shiftOcr(rl) {
160
165
  : fields.path
161
166
  ? await documentFromPath(ctx, fields.path)
162
167
  : documentFromUrl(fields.url, fields.kind);
168
+ // The target's declared EXTRACT_TIMEOUT_MS covers the synchronous run.
163
169
  return await request(ctx, "/v1/services/ocr/extract", {
164
170
  method: "POST",
165
171
  body: JSON.stringify({
@@ -177,7 +183,7 @@ export default function shiftOcr(rl) {
177
183
  }
178
184
  : {}),
179
185
  }),
180
- }, EXTRACT_TIMEOUT_MS);
186
+ });
181
187
  },
182
188
  });
183
189
  rl.registerAction("ocr.providers", {
@@ -1,5 +1,6 @@
1
1
  import * as t from "typebox";
2
2
  import { registerPageActions } from "./pages.js";
3
+ import { shiftPagesCredential } from "./shared.js";
3
4
  /**
4
5
  * Shift Pages — hosted HTML pages in the Shift cloud: draft, publish,
5
6
  * archive, share with invited viewers, and resolve authenticated
@@ -9,6 +10,7 @@ import { registerPageActions } from "./pages.js";
9
10
  export default function shiftPages(rl) {
10
11
  rl.setName("shiftPages");
11
12
  rl.setVersion("0.1.0");
13
+ rl.setCredential(shiftPagesCredential);
12
14
  rl.setConnectionSchema(t.Object({
13
15
  apiKey: t.String({
14
16
  description: "Shift Labs API key",
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { enumSchema, idSchema, listParams, PAGE_STATUS, PAGE_TYPE, PAGE_VISIBILITY, pageRenderUrl, pathSegment, request, STRICT_OBJECT, timestampSchema, withQuery, } from "./shared.js";
2
+ import { enumSchema, idSchema, PAGE_STATUS, PAGE_TYPE, PAGE_VISIBILITY, pageRenderUrl, pathSegment, request, STRICT_OBJECT, timestampSchema, } from "./shared.js";
3
3
  const PageSlug = t.String({
4
4
  minLength: 1,
5
5
  maxLength: 120,
@@ -26,7 +26,9 @@ export function registerPageActions(rl) {
26
26
  })),
27
27
  }, STRICT_OBJECT),
28
28
  async execute(input, ctx) {
29
- const body = await request(ctx, withQuery("/v1/pages", listParams(input)));
29
+ const body = await request(ctx, "/v1/pages", {
30
+ query: input,
31
+ });
30
32
  return body.pages;
31
33
  },
32
34
  });
@@ -48,7 +50,7 @@ export function registerPageActions(rl) {
48
50
  "deployment must belong to the API key's organization.",
49
51
  inputSchema: t.Object({ deploymentId: idSchema("Managed Vex deployment ID") }, STRICT_OBJECT),
50
52
  async execute(input, ctx) {
51
- const body = await request(ctx, withQuery("/v1/pages/vex-artifacts", listParams(input)));
53
+ const body = await request(ctx, "/v1/pages/vex-artifacts", { query: input });
52
54
  return body.artifacts;
53
55
  },
54
56
  });
@@ -1,5 +1,7 @@
1
1
  import { baseUrl, pathSegment } from "../../_shared/shiftCloud.js";
2
- export { enumSchema, idSchema, listParams, pathSegment, request, STRICT_OBJECT, timestampSchema, withQuery, } from "../../_shared/shiftCloud.js";
2
+ import { shiftClient } from "../../_shared/shiftCredentials.js";
3
+ export { enumSchema, idSchema, pathSegment, STRICT_OBJECT, timestampSchema, } from "../../_shared/shiftCloud.js";
4
+ export const { credential: shiftPagesCredential, request } = shiftClient("shiftPages");
3
5
  export const PAGE_STATUS = ["draft", "published", "archived"];
4
6
  export const PAGE_TYPE = [
5
7
  "hosted_html",
@@ -1,4 +1,5 @@
1
1
  import * as t from "typebox";
2
+ import { shiftTranscriptionCredential } from "./shared.js";
2
3
  import { registerTranscriptionActions } from "./transcription.js";
3
4
  /**
4
5
  * Shift Transcription — audio and video transcription through the
@@ -10,6 +11,7 @@ import { registerTranscriptionActions } from "./transcription.js";
10
11
  export default function shiftTranscription(rl) {
11
12
  rl.setName("shiftTranscription");
12
13
  rl.setVersion("0.2.0");
14
+ rl.setCredential(shiftTranscriptionCredential);
13
15
  rl.setConnectionSchema(t.Object({
14
16
  apiKey: t.String({
15
17
  description: "Shift Labs API key",
@@ -1,3 +1,13 @@
1
- export { enumSchema, pathSegment, request, SHIFT_REQUEST_TIMEOUT_MS, STRICT_OBJECT, } from "../../_shared/shiftCloud.js";
1
+ import { shiftClient } from "../../_shared/shiftCredentials.js";
2
+ export { enumSchema, pathSegment, STRICT_OBJECT, } from "../../_shared/shiftCloud.js";
3
+ /** The longest server-held wait /await accepts: waitSeconds is capped at 120. */
4
+ export const MAX_AWAIT_WAIT_MS = 120_000;
5
+ /**
6
+ * The target's deadline: the /await endpoint holds the request open for up
7
+ * to MAX_AWAIT_WAIT_MS, so the transport allows that wait plus 60 s for the
8
+ * exchange itself. Every other transcription route answers well within it.
9
+ */
10
+ export const AWAIT_DEADLINE_MS = MAX_AWAIT_WAIT_MS + 60_000;
11
+ export const { credential: shiftTranscriptionCredential, request } = shiftClient("shiftTranscription", { timeoutMs: AWAIT_DEADLINE_MS });
2
12
  export const TRANSCRIPTION_LANGUAGE = ["auto", "en", "he"];
3
13
  export const TRANSCRIPT_FORMAT = ["txt", "srt", "vtt", "json"];
@@ -1,6 +1,6 @@
1
1
  import * as t from "typebox";
2
2
  import { AUDIO_VIDEO_MEDIA_TYPES, putThroughGrant, requireMediaType, SIGNED_UPLOAD_MAX_BYTES, statUploadFile, } from "../../_shared/shiftUpload.js";
3
- import { enumSchema, pathSegment, request, SHIFT_REQUEST_TIMEOUT_MS, STRICT_OBJECT, TRANSCRIPT_FORMAT, TRANSCRIPTION_LANGUAGE, } from "./shared.js";
3
+ import { enumSchema, pathSegment, request, STRICT_OBJECT, TRANSCRIPT_FORMAT, TRANSCRIPTION_LANGUAGE, } from "./shared.js";
4
4
  /** Transcript previews returned into the sandbox are capped, not truncated silently. */
5
5
  const MAX_TRANSCRIPT_BYTES = 2 * 1024 * 1024;
6
6
  const Id = t.String({ minLength: 1, pattern: "\\S" });
@@ -48,7 +48,7 @@ export function registerTranscriptionActions(rl) {
48
48
  sizeBytes,
49
49
  }),
50
50
  });
51
- await putThroughGrant(created.upload, fields.path, contentType, sizeBytes, "Media upload");
51
+ await putThroughGrant(created.upload, fields.path, contentType, "Media upload");
52
52
  await request(ctx, `/v1/services/transcription/assets/${pathSegment(created.asset.id)}/complete`, { method: "POST" });
53
53
  const job = await request(ctx, "/v1/services/transcription/jobs", {
54
54
  method: "POST",
@@ -63,9 +63,9 @@ export function registerTranscriptionActions(rl) {
63
63
  if (!fields.waitSeconds)
64
64
  return job;
65
65
  const timeoutMs = Math.min(Math.max(fields.waitSeconds, 1), 120) * 1000;
66
- // The server holds the request open for up to timeoutMs, so the
67
- // client deadline is that wait plus the ordinary allowance.
68
- return request(ctx, `/v1/services/transcription/jobs/${pathSegment(job.id)}/await?timeoutMs=${timeoutMs}`, { method: "POST" }, timeoutMs + SHIFT_REQUEST_TIMEOUT_MS);
66
+ // The server holds the request open for up to timeoutMs; the
67
+ // target's declared AWAIT_DEADLINE_MS covers that wait.
68
+ return request(ctx, `/v1/services/transcription/jobs/${pathSegment(job.id)}/await?timeoutMs=${timeoutMs}`, { method: "POST" });
69
69
  },
70
70
  });
71
71
  rl.registerAction("transcription.job.list", {
@@ -2,6 +2,7 @@ import * as t from "typebox";
2
2
  import { registerIssueViewActions } from "./issue-views.js";
3
3
  import { registerIssueActions } from "./issues.js";
4
4
  import { registerProjectActions } from "./projects.js";
5
+ import { shiftWorkCredential } from "./shared.js";
5
6
  /**
6
7
  * Shift Work — the work-tracking domain of the Shift cloud: Projects,
7
8
  * Issues (with dependencies and comments), and saved Issue Views.
@@ -11,6 +12,7 @@ import { registerProjectActions } from "./projects.js";
11
12
  export default function shiftWork(rl) {
12
13
  rl.setName("shiftWork");
13
14
  rl.setVersion("0.1.0");
15
+ rl.setCredential(shiftWorkCredential);
14
16
  rl.setConnectionSchema(t.Object({
15
17
  apiKey: t.String({
16
18
  description: "Shift Labs API key",
@@ -1,5 +1,5 @@
1
1
  import * as t from "typebox";
2
- import { cursorSchema, enumSchema, ISSUE_PRIORITY, ISSUE_STATUS, ISSUE_VIEW_GROUP, ISSUE_VIEW_LAYOUT, ISSUE_VIEW_SORT, ISSUE_VIEW_VISIBILITY, idSchema, listParams, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, withQuery, } from "./shared.js";
2
+ import { cursorSchema, enumSchema, ISSUE_PRIORITY, ISSUE_STATUS, ISSUE_VIEW_GROUP, ISSUE_VIEW_LAYOUT, ISSUE_VIEW_SORT, ISSUE_VIEW_VISIBILITY, idSchema, pathSegment, request, STRICT_OBJECT, STRICT_UPDATE_OBJECT, timestampSchema, } from "./shared.js";
3
3
  const viewFields = {
4
4
  name: t.String({
5
5
  minLength: 1,
@@ -38,7 +38,7 @@ export function registerIssueViewActions(rl) {
38
38
  description: "List the first page of personal and organization Issue Views.",
39
39
  inputSchema: t.Object(listFields, STRICT_OBJECT),
40
40
  async execute(input, ctx) {
41
- const body = await request(ctx, `/v1/issue-views?${listParams(input)}`);
41
+ const body = await request(ctx, "/v1/issue-views", { query: input });
42
42
  return body.views;
43
43
  },
44
44
  });
@@ -47,7 +47,7 @@ export function registerIssueViewActions(rl) {
47
47
  description: "List a cursor-paginated page of Issue Views.",
48
48
  inputSchema: t.Object(listFields, STRICT_OBJECT),
49
49
  async execute(input, ctx) {
50
- return request(ctx, `/v1/issue-views?${listParams(input)}`);
50
+ return request(ctx, "/v1/issue-views", { query: input });
51
51
  },
52
52
  });
53
53
  rl.registerAction("issueView.get", {
@@ -69,7 +69,7 @@ export function registerIssueViewActions(rl) {
69
69
  }, STRICT_OBJECT),
70
70
  async execute(input, ctx) {
71
71
  const { id, ...pagination } = input;
72
- const body = await request(ctx, withQuery(`/v1/issue-views/${pathSegment(id)}/issues`, listParams(pagination)));
72
+ const body = await request(ctx, `/v1/issue-views/${pathSegment(id)}/issues`, { query: pagination });
73
73
  return body.issues;
74
74
  },
75
75
  });
@@ -83,7 +83,7 @@ export function registerIssueViewActions(rl) {
83
83
  }, STRICT_OBJECT),
84
84
  async execute(input, ctx) {
85
85
  const { id, ...pagination } = input;
86
- return request(ctx, withQuery(`/v1/issue-views/${pathSegment(id)}/issues`, listParams(pagination)));
86
+ return request(ctx, `/v1/issue-views/${pathSegment(id)}/issues`, { query: pagination });
87
87
  },
88
88
  });
89
89
  rl.registerAction("issueView.create", {