runline 0.32.0 → 0.34.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 (521) 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 +9 -0
  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 +179 -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 +167 -10
  15. package/dist/index.d.ts +5 -5
  16. package/dist/index.js +2 -2
  17. package/dist/plugin/api.d.ts +7 -0
  18. package/dist/plugin/api.js +7 -0
  19. package/dist/plugin/types.d.ts +12 -0
  20. package/dist/plugins/_shared/credentialAdapter.js +79 -15
  21. package/dist/plugins/_shared/credentials.js +389 -0
  22. package/dist/plugins/_shared/googleAuth.js +9 -40
  23. package/dist/plugins/_shared/googleCredentials.js +28 -7
  24. package/dist/plugins/_shared/microsoftAuth.js +13 -44
  25. package/dist/plugins/_shared/microsoftCredentials.js +30 -8
  26. package/dist/plugins/_shared/provider.js +2 -14
  27. package/dist/plugins/_shared/shiftCloud.js +22 -34
  28. package/dist/plugins/_shared/shiftCredentials.js +83 -0
  29. package/dist/plugins/_shared/shiftUpload.js +1 -1
  30. package/dist/plugins/actionNetwork/src/credentials.js +14 -0
  31. package/dist/plugins/actionNetwork/src/index.js +39 -50
  32. package/dist/plugins/activeCampaign/src/credentials.js +22 -0
  33. package/dist/plugins/activeCampaign/src/index.js +61 -132
  34. package/dist/plugins/adalo/src/credentials.js +16 -0
  35. package/dist/plugins/adalo/src/index.js +19 -43
  36. package/dist/plugins/affinity/src/credentials.js +19 -0
  37. package/dist/plugins/affinity/src/index.js +29 -54
  38. package/dist/plugins/agileCrm/src/credentials.js +16 -0
  39. package/dist/plugins/agileCrm/src/index.js +46 -112
  40. package/dist/plugins/airtable/src/credentials.js +19 -0
  41. package/dist/plugins/airtable/src/index.js +37 -50
  42. package/dist/plugins/airtop/src/credentials.js +20 -0
  43. package/dist/plugins/airtop/src/index.js +51 -75
  44. package/dist/plugins/apiTemplateIo/src/credentials.js +19 -0
  45. package/dist/plugins/apiTemplateIo/src/index.js +14 -31
  46. package/dist/plugins/asana/src/credentials.js +19 -0
  47. package/dist/plugins/asana/src/index.js +51 -72
  48. package/dist/plugins/autopilot/src/credentials.js +19 -0
  49. package/dist/plugins/autopilot/src/index.js +38 -45
  50. package/dist/plugins/bambooHr/src/credentials.js +16 -0
  51. package/dist/plugins/bambooHr/src/index.js +41 -67
  52. package/dist/plugins/bannerbear/src/credentials.js +19 -0
  53. package/dist/plugins/bannerbear/src/index.js +15 -27
  54. package/dist/plugins/baserow/src/credentials.js +17 -0
  55. package/dist/plugins/baserow/src/index.js +23 -49
  56. package/dist/plugins/beeminder/src/credentials.js +19 -0
  57. package/dist/plugins/beeminder/src/index.js +32 -54
  58. package/dist/plugins/bitly/src/credentials.js +19 -0
  59. package/dist/plugins/bitly/src/index.js +12 -26
  60. package/dist/plugins/bitwarden/src/credentials.js +62 -0
  61. package/dist/plugins/bitwarden/src/index.js +34 -80
  62. package/dist/plugins/box/src/credentials.js +19 -0
  63. package/dist/plugins/box/src/index.js +24 -49
  64. package/dist/plugins/brandfetch/src/credentials.js +13 -0
  65. package/dist/plugins/brandfetch/src/index.js +12 -17
  66. package/dist/plugins/brevo/src/credentials.js +19 -0
  67. package/dist/plugins/brevo/src/index.js +30 -51
  68. package/dist/plugins/bubble/src/credentials.js +28 -0
  69. package/dist/plugins/bubble/src/index.js +29 -65
  70. package/dist/plugins/chargebee/src/credentials.js +16 -0
  71. package/dist/plugins/chargebee/src/index.js +15 -45
  72. package/dist/plugins/circleci/src/credentials.js +19 -0
  73. package/dist/plugins/circleci/src/index.js +19 -39
  74. package/dist/plugins/ciscoWebex/src/credentials.js +19 -0
  75. package/dist/plugins/ciscoWebex/src/index.js +43 -61
  76. package/dist/plugins/clearbit/src/credentials.js +22 -0
  77. package/dist/plugins/clearbit/src/index.js +11 -21
  78. package/dist/plugins/clickup/src/credentials.js +19 -0
  79. package/dist/plugins/clickup/src/index.js +85 -117
  80. package/dist/plugins/clockify/src/credentials.js +19 -0
  81. package/dist/plugins/clockify/src/index.js +46 -61
  82. package/dist/plugins/cloudflare/src/credentials.js +19 -0
  83. package/dist/plugins/cloudflare/src/index.js +19 -34
  84. package/dist/plugins/cockpit/src/credentials.js +17 -0
  85. package/dist/plugins/cockpit/src/index.js +18 -31
  86. package/dist/plugins/coda/src/credentials.js +19 -0
  87. package/dist/plugins/coda/src/index.js +33 -50
  88. package/dist/plugins/coingecko/src/credentials.js +20 -0
  89. package/dist/plugins/coingecko/src/index.js +24 -34
  90. package/dist/plugins/contentful/src/credentials.js +26 -0
  91. package/dist/plugins/contentful/src/index.js +19 -40
  92. package/dist/plugins/convertkit/src/credentials.js +26 -0
  93. package/dist/plugins/convertkit/src/index.js +27 -45
  94. package/dist/plugins/copper/src/credentials.js +17 -0
  95. package/dist/plugins/copper/src/index.js +25 -47
  96. package/dist/plugins/cortex/src/credentials.js +28 -0
  97. package/dist/plugins/cortex/src/index.js +26 -49
  98. package/dist/plugins/currents/src/credentials.js +19 -0
  99. package/dist/plugins/currents/src/index.js +46 -59
  100. package/dist/plugins/customerIo/src/credentials.js +52 -0
  101. package/dist/plugins/customerIo/src/index.js +30 -58
  102. package/dist/plugins/databricks/src/credentials.js +13 -0
  103. package/dist/plugins/databricks/src/index.js +51 -103
  104. package/dist/plugins/deepl/src/credentials.js +19 -0
  105. package/dist/plugins/deepl/src/index.js +13 -39
  106. package/dist/plugins/demio/src/credentials.js +26 -0
  107. package/dist/plugins/demio/src/index.js +17 -41
  108. package/dist/plugins/dhl/src/credentials.js +13 -0
  109. package/dist/plugins/dhl/src/index.js +8 -19
  110. package/dist/plugins/discord/src/credentials.js +19 -0
  111. package/dist/plugins/discord/src/index.js +30 -58
  112. package/dist/plugins/discourse/src/credentials.js +18 -0
  113. package/dist/plugins/discourse/src/index.js +36 -53
  114. package/dist/plugins/disqus/src/credentials.js +13 -0
  115. package/dist/plugins/disqus/src/index.js +14 -32
  116. package/dist/plugins/drift/src/credentials.js +13 -0
  117. package/dist/plugins/drift/src/index.js +16 -26
  118. package/dist/plugins/dropbox/src/credentials.js +13 -0
  119. package/dist/plugins/dropbox/src/index.js +23 -30
  120. package/dist/plugins/dropcontact/src/credentials.js +13 -0
  121. package/dist/plugins/dropcontact/src/index.js +13 -18
  122. package/dist/plugins/egoi/src/credentials.js +19 -0
  123. package/dist/plugins/egoi/src/index.js +23 -38
  124. package/dist/plugins/elasticsearch/src/credentials.js +18 -0
  125. package/dist/plugins/elasticsearch/src/index.js +27 -48
  126. package/dist/plugins/elevenlabs/src/credentials.js +30 -0
  127. package/dist/plugins/elevenlabs/src/index.js +4 -1
  128. package/dist/plugins/elevenlabs/src/schemas.js +2 -1
  129. package/dist/plugins/elevenlabs/src/shared.js +74 -35
  130. package/dist/plugins/elevenlabs/src/workflows.js +2 -2
  131. package/dist/plugins/emelia/src/credentials.js +14 -0
  132. package/dist/plugins/emelia/src/index.js +19 -23
  133. package/dist/plugins/erpnext/src/credentials.js +27 -0
  134. package/dist/plugins/erpnext/src/index.js +21 -42
  135. package/dist/plugins/facebookGraph/src/credentials.js +20 -0
  136. package/dist/plugins/facebookGraph/src/index.js +39 -37
  137. package/dist/plugins/fal/src/credentials.js +14 -0
  138. package/dist/plugins/fal/src/index.js +4 -2
  139. package/dist/plugins/fal/src/shared.js +58 -63
  140. package/dist/plugins/freshdesk/src/credentials.js +20 -0
  141. package/dist/plugins/freshdesk/src/index.js +25 -46
  142. package/dist/plugins/freshservice/src/credentials.js +16 -0
  143. package/dist/plugins/freshservice/src/index.js +37 -58
  144. package/dist/plugins/freshworksCrm/src/credentials.js +16 -0
  145. package/dist/plugins/freshworksCrm/src/index.js +20 -39
  146. package/dist/plugins/getresponse/src/credentials.js +22 -0
  147. package/dist/plugins/getresponse/src/index.js +20 -32
  148. package/dist/plugins/gett/src/credentials.js +64 -0
  149. package/dist/plugins/gett/src/index.js +11 -6
  150. package/dist/plugins/gett/src/login.js +24 -0
  151. package/dist/plugins/gett/src/session.js +15 -38
  152. package/dist/plugins/gett/src/shared.js +41 -84
  153. package/dist/plugins/ghost/src/credentials.js +36 -0
  154. package/dist/plugins/ghost/src/index.js +18 -59
  155. package/dist/plugins/github/src/credentials.js +18 -0
  156. package/dist/plugins/github/src/index.js +55 -78
  157. package/dist/plugins/gitlab/src/credentials.js +24 -0
  158. package/dist/plugins/gitlab/src/index.js +29 -48
  159. package/dist/plugins/gmail/src/index.js +26 -24
  160. package/dist/plugins/gong/src/credentials.js +16 -0
  161. package/dist/plugins/gong/src/index.js +16 -32
  162. package/dist/plugins/googleAppsScript/src/index.js +108 -42
  163. package/dist/plugins/googleCalendar/src/index.js +15 -13
  164. package/dist/plugins/googleContacts/src/index.js +12 -9
  165. package/dist/plugins/googleDocs/src/index.js +2 -0
  166. package/dist/plugins/googleDocs/src/shared.js +2 -1
  167. package/dist/plugins/googleDrive/src/index.js +50 -53
  168. package/dist/plugins/googleImage/src/credentials.js +14 -0
  169. package/dist/plugins/googleImage/src/index.js +14 -25
  170. package/dist/plugins/googleSheets/src/index.js +26 -27
  171. package/dist/plugins/googleSlides/src/index.js +6 -4
  172. package/dist/plugins/googleTasks/src/index.js +13 -11
  173. package/dist/plugins/gotify/src/credentials.js +32 -0
  174. package/dist/plugins/gotify/src/index.js +14 -36
  175. package/dist/plugins/gotowebinar/src/credentials.js +13 -0
  176. package/dist/plugins/gotowebinar/src/index.js +52 -69
  177. package/dist/plugins/grafana/src/credentials.js +16 -0
  178. package/dist/plugins/grafana/src/index.js +34 -53
  179. package/dist/plugins/graphql/src/credentials.js +42 -0
  180. package/dist/plugins/graphql/src/index.js +21 -46
  181. package/dist/plugins/grist/src/credentials.js +30 -0
  182. package/dist/plugins/grist/src/index.js +14 -43
  183. package/dist/plugins/halopsa/src/credentials.js +56 -0
  184. package/dist/plugins/halopsa/src/index.js +20 -47
  185. package/dist/plugins/harvest/src/credentials.js +20 -0
  186. package/dist/plugins/harvest/src/index.js +24 -43
  187. package/dist/plugins/helpscout/src/credentials.js +13 -0
  188. package/dist/plugins/helpscout/src/index.js +26 -38
  189. package/dist/plugins/highlevel/src/credentials.js +19 -0
  190. package/dist/plugins/highlevel/src/index.js +34 -63
  191. package/dist/plugins/homeAssistant/src/credentials.js +27 -0
  192. package/dist/plugins/homeAssistant/src/index.js +34 -52
  193. package/dist/plugins/hubspot/src/credentials.js +16 -0
  194. package/dist/plugins/hubspot/src/index.js +29 -41
  195. package/dist/plugins/humanticAi/src/credentials.js +13 -0
  196. package/dist/plugins/humanticAi/src/index.js +15 -22
  197. package/dist/plugins/hunter/src/credentials.js +13 -0
  198. package/dist/plugins/hunter/src/index.js +18 -17
  199. package/dist/plugins/intercom/src/credentials.js +19 -0
  200. package/dist/plugins/intercom/src/index.js +25 -38
  201. package/dist/plugins/iterable/src/credentials.js +17 -0
  202. package/dist/plugins/iterable/src/index.js +26 -40
  203. package/dist/plugins/jenkins/src/credentials.js +16 -0
  204. package/dist/plugins/jenkins/src/index.js +22 -36
  205. package/dist/plugins/jira/src/credentials.js +16 -0
  206. package/dist/plugins/jira/src/index.js +35 -61
  207. package/dist/plugins/keap/src/credentials.js +19 -0
  208. package/dist/plugins/keap/src/index.js +43 -71
  209. package/dist/plugins/kobotoolbox/src/credentials.js +13 -0
  210. package/dist/plugins/kobotoolbox/src/index.js +46 -84
  211. package/dist/plugins/lemlist/src/credentials.js +19 -0
  212. package/dist/plugins/lemlist/src/index.js +35 -47
  213. package/dist/plugins/linear/src/attachments.js +7 -7
  214. package/dist/plugins/linear/src/comments.js +7 -7
  215. package/dist/plugins/linear/src/credentials.js +17 -0
  216. package/dist/plugins/linear/src/cycles.js +5 -5
  217. package/dist/plugins/linear/src/index.js +2 -0
  218. package/dist/plugins/linear/src/initiatives.js +6 -6
  219. package/dist/plugins/linear/src/issues.js +14 -14
  220. package/dist/plugins/linear/src/labels.js +6 -6
  221. package/dist/plugins/linear/src/organization.js +2 -2
  222. package/dist/plugins/linear/src/projects.js +12 -12
  223. package/dist/plugins/linear/src/shared.js +34 -32
  224. package/dist/plugins/linear/src/states.js +3 -3
  225. package/dist/plugins/linear/src/teams.js +4 -4
  226. package/dist/plugins/linear/src/users.js +3 -3
  227. package/dist/plugins/linear/src/views.js +5 -5
  228. package/dist/plugins/linear/src/webhooks.js +5 -5
  229. package/dist/plugins/lingvanex/src/credentials.js +13 -0
  230. package/dist/plugins/lingvanex/src/index.js +7 -9
  231. package/dist/plugins/linkedin/src/credentials.js +17 -0
  232. package/dist/plugins/linkedin/src/index.js +13 -17
  233. package/dist/plugins/lonescale/src/credentials.js +13 -0
  234. package/dist/plugins/lonescale/src/index.js +16 -26
  235. package/dist/plugins/magento/src/credentials.js +16 -0
  236. package/dist/plugins/magento/src/index.js +67 -84
  237. package/dist/plugins/mailcheck/src/credentials.js +17 -0
  238. package/dist/plugins/mailcheck/src/index.js +7 -9
  239. package/dist/plugins/mailchimp/src/credentials.js +32 -0
  240. package/dist/plugins/mailchimp/src/index.js +36 -44
  241. package/dist/plugins/mailerlite/src/credentials.js +13 -0
  242. package/dist/plugins/mailerlite/src/index.js +19 -32
  243. package/dist/plugins/mailgun/src/credentials.js +21 -0
  244. package/dist/plugins/mailgun/src/index.js +15 -21
  245. package/dist/plugins/mailjet/src/credentials.js +38 -0
  246. package/dist/plugins/mailjet/src/index.js +60 -115
  247. package/dist/plugins/mandrill/src/credentials.js +17 -0
  248. package/dist/plugins/mandrill/src/index.js +11 -12
  249. package/dist/plugins/marketstack/src/credentials.js +16 -0
  250. package/dist/plugins/marketstack/src/index.js +18 -28
  251. package/dist/plugins/matrix/src/credentials.js +19 -0
  252. package/dist/plugins/matrix/src/index.js +23 -52
  253. package/dist/plugins/mattermost/src/credentials.js +19 -0
  254. package/dist/plugins/mattermost/src/index.js +41 -73
  255. package/dist/plugins/mautic/src/credentials.js +16 -0
  256. package/dist/plugins/mautic/src/index.js +46 -62
  257. package/dist/plugins/medium/src/credentials.js +20 -0
  258. package/dist/plugins/medium/src/index.js +18 -23
  259. package/dist/plugins/messagebird/src/credentials.js +22 -0
  260. package/dist/plugins/messagebird/src/index.js +13 -18
  261. package/dist/plugins/metabase/src/credentials.js +19 -0
  262. package/dist/plugins/metabase/src/index.js +24 -40
  263. package/dist/plugins/microsoftCalendar/src/index.js +48 -12
  264. package/dist/plugins/microsoftFiles/src/index.js +90 -25
  265. package/dist/plugins/microsoftMail/src/index.js +62 -15
  266. package/dist/plugins/misp/src/credentials.js +16 -0
  267. package/dist/plugins/misp/src/index.js +60 -71
  268. package/dist/plugins/mocean/src/credentials.js +17 -0
  269. package/dist/plugins/mocean/src/index.js +11 -23
  270. package/dist/plugins/monday/src/credentials.js +14 -0
  271. package/dist/plugins/monday/src/index.js +31 -44
  272. package/dist/plugins/monicaCrm/src/credentials.js +19 -0
  273. package/dist/plugins/monicaCrm/src/index.js +25 -42
  274. package/dist/plugins/msg91/src/credentials.js +10 -0
  275. package/dist/plugins/msg91/src/index.js +15 -11
  276. package/dist/plugins/nasa/src/credentials.js +22 -0
  277. package/dist/plugins/nasa/src/index.js +24 -28
  278. package/dist/plugins/netlify/src/credentials.js +19 -0
  279. package/dist/plugins/netlify/src/index.js +27 -51
  280. package/dist/plugins/netscalerAdc/src/credentials.js +18 -0
  281. package/dist/plugins/netscalerAdc/src/index.js +16 -31
  282. package/dist/plugins/nextcloud/src/credentials.js +27 -0
  283. package/dist/plugins/nextcloud/src/index.js +55 -109
  284. package/dist/plugins/nocodb/src/credentials.js +16 -0
  285. package/dist/plugins/nocodb/src/index.js +19 -37
  286. package/dist/plugins/notion/src/credentials.js +21 -0
  287. package/dist/plugins/notion/src/index.js +25 -38
  288. package/dist/plugins/npm/src/credentials.js +19 -0
  289. package/dist/plugins/npm/src/index.js +22 -32
  290. package/dist/plugins/odoo/src/credentials.js +21 -0
  291. package/dist/plugins/odoo/src/index.js +53 -69
  292. package/dist/plugins/okta/src/credentials.js +23 -0
  293. package/dist/plugins/okta/src/index.js +30 -35
  294. package/dist/plugins/oneSimpleApi/src/credentials.js +16 -0
  295. package/dist/plugins/oneSimpleApi/src/index.js +19 -24
  296. package/dist/plugins/onfleet/src/credentials.js +23 -0
  297. package/dist/plugins/onfleet/src/index.js +42 -53
  298. package/dist/plugins/openai/src/credentials.js +13 -0
  299. package/dist/plugins/openai/src/index.js +15 -23
  300. package/dist/plugins/openweathermap/src/credentials.js +16 -0
  301. package/dist/plugins/openweathermap/src/index.js +22 -22
  302. package/dist/plugins/oura/src/credentials.js +19 -0
  303. package/dist/plugins/oura/src/index.js +13 -18
  304. package/dist/plugins/paddle/src/credentials.js +27 -0
  305. package/dist/plugins/paddle/src/index.js +20 -36
  306. package/dist/plugins/pagerduty/src/credentials.js +24 -0
  307. package/dist/plugins/pagerduty/src/index.js +30 -39
  308. package/dist/plugins/parallel/src/credentials.js +18 -0
  309. package/dist/plugins/parallel/src/index.js +16 -22
  310. package/dist/plugins/paypal/src/credentials.js +44 -0
  311. package/dist/plugins/paypal/src/index.js +14 -40
  312. package/dist/plugins/peekalink/src/credentials.js +16 -0
  313. package/dist/plugins/peekalink/src/index.js +10 -11
  314. package/dist/plugins/phantombuster/src/credentials.js +19 -0
  315. package/dist/plugins/phantombuster/src/index.js +19 -32
  316. package/dist/plugins/philipsHue/src/credentials.js +17 -0
  317. package/dist/plugins/philipsHue/src/index.js +15 -27
  318. package/dist/plugins/pipedrive/src/credentials.js +26 -0
  319. package/dist/plugins/pipedrive/src/index.js +43 -73
  320. package/dist/plugins/plaud/src/index.js +2 -1
  321. package/dist/plugins/plaud/src/shared.js +23 -19
  322. package/dist/plugins/plivo/src/credentials.js +20 -0
  323. package/dist/plugins/plivo/src/index.js +13 -19
  324. package/dist/plugins/posthog/src/credentials.js +18 -0
  325. package/dist/plugins/posthog/src/index.js +14 -20
  326. package/dist/plugins/profitwell/src/credentials.js +22 -0
  327. package/dist/plugins/profitwell/src/index.js +10 -17
  328. package/dist/plugins/pushbullet/src/credentials.js +19 -0
  329. package/dist/plugins/pushbullet/src/index.js +19 -27
  330. package/dist/plugins/pushcut/src/credentials.js +19 -0
  331. package/dist/plugins/pushcut/src/index.js +7 -8
  332. package/dist/plugins/pushover/src/credentials.js +14 -0
  333. package/dist/plugins/pushover/src/index.js +7 -12
  334. package/dist/plugins/quickbase/src/credentials.js +15 -0
  335. package/dist/plugins/quickbase/src/index.js +24 -34
  336. package/dist/plugins/quickbooks/src/credentials.js +22 -0
  337. package/dist/plugins/quickbooks/src/index.js +17 -46
  338. package/dist/plugins/raindrop/src/credentials.js +19 -0
  339. package/dist/plugins/raindrop/src/index.js +30 -32
  340. package/dist/plugins/recraft/src/credentials.js +13 -0
  341. package/dist/plugins/recraft/src/index.js +38 -27
  342. package/dist/plugins/reddit/src/credentials.js +26 -0
  343. package/dist/plugins/reddit/src/index.js +30 -34
  344. package/dist/plugins/replicate/src/credentials.js +23 -0
  345. package/dist/plugins/replicate/src/index.js +17 -27
  346. package/dist/plugins/rocketchat/src/credentials.js +17 -0
  347. package/dist/plugins/rocketchat/src/index.js +8 -19
  348. package/dist/plugins/rundeck/src/credentials.js +16 -0
  349. package/dist/plugins/rundeck/src/index.js +12 -28
  350. package/dist/plugins/salesforce/src/credentials.js +73 -0
  351. package/dist/plugins/salesforce/src/index.js +6 -0
  352. package/dist/plugins/salesforce/src/metadata.js +3 -16
  353. package/dist/plugins/salesforce/src/shared.js +25 -100
  354. package/dist/plugins/salesforce/src/sobjects.js +10 -9
  355. package/dist/plugins/salesmate/src/credentials.js +17 -0
  356. package/dist/plugins/salesmate/src/index.js +20 -37
  357. package/dist/plugins/securityScorecard/src/credentials.js +22 -0
  358. package/dist/plugins/securityScorecard/src/index.js +24 -37
  359. package/dist/plugins/segment/src/credentials.js +16 -0
  360. package/dist/plugins/segment/src/index.js +12 -16
  361. package/dist/plugins/sendgrid/src/credentials.js +13 -0
  362. package/dist/plugins/sendgrid/src/index.js +31 -35
  363. package/dist/plugins/sendy/src/credentials.js +18 -0
  364. package/dist/plugins/sendy/src/index.js +18 -24
  365. package/dist/plugins/sentry/src/credentials.js +16 -0
  366. package/dist/plugins/sentry/src/index.js +30 -98
  367. package/dist/plugins/servicenow/src/credentials.js +13 -0
  368. package/dist/plugins/servicenow/src/index.js +22 -41
  369. package/dist/plugins/shiftAtlas/src/graph.js +2 -2
  370. package/dist/plugins/shiftAtlas/src/index.js +2 -0
  371. package/dist/plugins/shiftAtlas/src/shared.js +3 -1
  372. package/dist/plugins/shiftBwm/src/collections.js +201 -0
  373. package/dist/plugins/shiftBwm/src/index.js +35 -0
  374. package/dist/plugins/shiftBwm/src/records.js +180 -0
  375. package/dist/plugins/shiftBwm/src/shared.js +168 -0
  376. package/dist/plugins/shiftBwm/src/vendor/client.js +227 -0
  377. package/dist/plugins/shiftBwm/src/vendor/contracts.js +59 -0
  378. package/dist/plugins/shiftBwm/src/vendor/models.js +525 -0
  379. package/dist/plugins/shiftCrm/src/access.js +2 -2
  380. package/dist/plugins/shiftCrm/src/accounts.js +3 -3
  381. package/dist/plugins/shiftCrm/src/activities.js +3 -3
  382. package/dist/plugins/shiftCrm/src/credentials.js +6 -0
  383. package/dist/plugins/shiftCrm/src/index.js +2 -0
  384. package/dist/plugins/shiftCrm/src/opportunities.js +3 -3
  385. package/dist/plugins/shiftCrm/src/people.js +3 -3
  386. package/dist/plugins/shiftCrm/src/records.js +2 -2
  387. package/dist/plugins/shiftCrm/src/shared.js +2 -1
  388. package/dist/plugins/shiftCrm/src/tasks.js +3 -3
  389. package/dist/plugins/shiftObjects/src/credentials.js +2 -0
  390. package/dist/plugins/shiftObjects/src/index.js +2 -0
  391. package/dist/plugins/shiftObjects/src/objects.js +3 -3
  392. package/dist/plugins/shiftOcr/src/credentials.js +8 -0
  393. package/dist/plugins/shiftOcr/src/index.js +5 -2
  394. package/dist/plugins/shiftPages/src/index.js +2 -0
  395. package/dist/plugins/shiftPages/src/pages.js +5 -3
  396. package/dist/plugins/shiftPages/src/shared.js +3 -1
  397. package/dist/plugins/shiftTranscription/src/index.js +2 -0
  398. package/dist/plugins/shiftTranscription/src/shared.js +11 -1
  399. package/dist/plugins/shiftTranscription/src/transcription.js +3 -2
  400. package/dist/plugins/shiftWork/src/index.js +2 -0
  401. package/dist/plugins/shiftWork/src/issue-views.js +5 -5
  402. package/dist/plugins/shiftWork/src/issues.js +11 -7
  403. package/dist/plugins/shiftWork/src/projects.js +3 -3
  404. package/dist/plugins/shiftWork/src/shared.js +3 -1
  405. package/dist/plugins/shopify/src/credentials.js +16 -0
  406. package/dist/plugins/shopify/src/index.js +32 -59
  407. package/dist/plugins/signl4/src/credentials.js +17 -0
  408. package/dist/plugins/signl4/src/index.js +28 -29
  409. package/dist/plugins/slack/src/credentials.js +19 -0
  410. package/dist/plugins/slack/src/index.js +51 -60
  411. package/dist/plugins/sms77/src/credentials.js +17 -0
  412. package/dist/plugins/sms77/src/index.js +11 -16
  413. package/dist/plugins/splunk/src/credentials.js +19 -0
  414. package/dist/plugins/splunk/src/index.js +32 -74
  415. package/dist/plugins/spotify/src/credentials.js +19 -0
  416. package/dist/plugins/spotify/src/index.js +40 -55
  417. package/dist/plugins/stackby/src/credentials.js +13 -0
  418. package/dist/plugins/stackby/src/index.js +14 -23
  419. package/dist/plugins/steel/src/auth.js +27 -0
  420. package/dist/plugins/steel/src/browser.js +4 -3
  421. package/dist/plugins/steel/src/captchas.js +4 -3
  422. package/dist/plugins/steel/src/extensions.js +3 -2
  423. package/dist/plugins/steel/src/files.js +9 -10
  424. package/dist/plugins/steel/src/index.js +2 -0
  425. package/dist/plugins/steel/src/page/tools.js +3 -3
  426. package/dist/plugins/steel/src/profiles.js +4 -3
  427. package/dist/plugins/steel/src/sessions.js +13 -13
  428. package/dist/plugins/steel/src/shared.js +21 -51
  429. package/dist/plugins/storyblok/src/credentials.js +37 -0
  430. package/dist/plugins/storyblok/src/index.js +22 -66
  431. package/dist/plugins/strapi/src/credentials.js +71 -0
  432. package/dist/plugins/strapi/src/index.js +36 -70
  433. package/dist/plugins/strava/src/credentials.js +19 -0
  434. package/dist/plugins/strava/src/index.js +16 -33
  435. package/dist/plugins/stripe/src/credentials.js +19 -0
  436. package/dist/plugins/stripe/src/index.js +44 -58
  437. package/dist/plugins/supabase/src/credentials.js +30 -0
  438. package/dist/plugins/supabase/src/index.js +18 -40
  439. package/dist/plugins/syncromsp/src/credentials.js +16 -0
  440. package/dist/plugins/syncromsp/src/index.js +37 -70
  441. package/dist/plugins/tapfiliate/src/credentials.js +13 -0
  442. package/dist/plugins/tapfiliate/src/index.js +21 -31
  443. package/dist/plugins/telegram/src/credentials.js +20 -0
  444. package/dist/plugins/telegram/src/index.js +31 -39
  445. package/dist/plugins/thehive/src/credentials.js +14 -0
  446. package/dist/plugins/thehive/src/index.js +33 -50
  447. package/dist/plugins/thehiveProject/src/credentials.js +16 -0
  448. package/dist/plugins/thehiveProject/src/index.js +53 -122
  449. package/dist/plugins/todoist/src/credentials.js +26 -0
  450. package/dist/plugins/todoist/src/index.js +49 -79
  451. package/dist/plugins/together/src/credentials.js +16 -0
  452. package/dist/plugins/together/src/index.js +30 -32
  453. package/dist/plugins/travisci/src/credentials.js +24 -0
  454. package/dist/plugins/travisci/src/index.js +16 -30
  455. package/dist/plugins/trello/src/credentials.js +29 -0
  456. package/dist/plugins/trello/src/index.js +49 -64
  457. package/dist/plugins/twake/src/credentials.js +16 -0
  458. package/dist/plugins/twake/src/index.js +8 -10
  459. package/dist/plugins/twilio/src/credentials.js +23 -0
  460. package/dist/plugins/twilio/src/index.js +12 -26
  461. package/dist/plugins/twist/src/credentials.js +13 -0
  462. package/dist/plugins/twist/src/index.js +32 -44
  463. package/dist/plugins/twitter/src/credentials.js +16 -0
  464. package/dist/plugins/twitter/src/index.js +25 -37
  465. package/dist/plugins/typesafe/src/credentials.js +28 -0
  466. package/dist/plugins/typesafe/src/index.js +3 -1
  467. package/dist/plugins/typesafe/src/shared.js +23 -35
  468. package/dist/plugins/unleashedSoftware/src/credentials.js +21 -0
  469. package/dist/plugins/unleashedSoftware/src/index.js +13 -37
  470. package/dist/plugins/uplead/src/credentials.js +16 -0
  471. package/dist/plugins/uplead/src/index.js +11 -16
  472. package/dist/plugins/uproc/src/credentials.js +14 -0
  473. package/dist/plugins/uproc/src/index.js +7 -10
  474. package/dist/plugins/uptimerobot/src/credentials.js +14 -0
  475. package/dist/plugins/uptimerobot/src/index.js +28 -39
  476. package/dist/plugins/urlscanio/src/credentials.js +13 -0
  477. package/dist/plugins/urlscanio/src/index.js +13 -22
  478. package/dist/plugins/vercel/src/credentials.js +19 -0
  479. package/dist/plugins/vercel/src/deployments.js +27 -11
  480. package/dist/plugins/vercel/src/env.js +31 -12
  481. package/dist/plugins/vercel/src/index.js +2 -0
  482. package/dist/plugins/vercel/src/projects.js +6 -3
  483. package/dist/plugins/vercel/src/shared.js +32 -37
  484. package/dist/plugins/vero/src/credentials.js +17 -0
  485. package/dist/plugins/vero/src/index.js +18 -21
  486. package/dist/plugins/vonage/src/credentials.js +17 -0
  487. package/dist/plugins/vonage/src/index.js +14 -18
  488. package/dist/plugins/wekan/src/credentials.js +16 -0
  489. package/dist/plugins/wekan/src/index.js +33 -46
  490. package/dist/plugins/wolt/src/account.js +6 -0
  491. package/dist/plugins/wolt/src/catalog.js +2 -2
  492. package/dist/plugins/wolt/src/credentials.js +64 -0
  493. package/dist/plugins/wolt/src/index.js +8 -3
  494. package/dist/plugins/wolt/src/orders.js +2 -2
  495. package/dist/plugins/wolt/src/public.js +91 -0
  496. package/dist/plugins/wolt/src/shared.js +49 -158
  497. package/dist/plugins/woocommerce/src/credentials.js +16 -0
  498. package/dist/plugins/woocommerce/src/index.js +19 -37
  499. package/dist/plugins/wordpress/src/credentials.js +16 -0
  500. package/dist/plugins/wordpress/src/index.js +23 -42
  501. package/dist/plugins/xai/src/credentials.js +13 -0
  502. package/dist/plugins/xai/src/index.js +31 -30
  503. package/dist/plugins/xero/src/credentials.js +17 -0
  504. package/dist/plugins/xero/src/index.js +19 -36
  505. package/dist/plugins/yourls/src/credentials.js +17 -0
  506. package/dist/plugins/yourls/src/index.js +13 -23
  507. package/dist/plugins/zammad/src/credentials.js +15 -0
  508. package/dist/plugins/zammad/src/index.js +27 -47
  509. package/dist/plugins/zendesk/src/credentials.js +26 -0
  510. package/dist/plugins/zendesk/src/index.js +29 -48
  511. package/dist/plugins/zoho/src/credentials.js +17 -0
  512. package/dist/plugins/zoho/src/index.js +18 -38
  513. package/dist/plugins/zoom/src/credentials.js +19 -0
  514. package/dist/plugins/zoom/src/index.js +15 -30
  515. package/dist/plugins/zulip/src/credentials.js +16 -0
  516. package/dist/plugins/zulip/src/index.js +36 -42
  517. package/dist/sdk.d.ts +8 -0
  518. package/dist/sdk.js +3 -0
  519. package/package.json +3 -2
  520. package/dist/plugins/_shared/authedFetch.js +0 -33
  521. package/dist/plugins/_shared/tokenRefresh.js +0 -41
@@ -0,0 +1,201 @@
1
+ import * as t from "typebox";
2
+ import { call, clientFor, filtersSchema, idempotentClientFor, idOrIds, idSchema, objectTypeSchema, paginationFields, principalSchema, relationshipChangeSchema, STRICT_OBJECT, STRICT_UPDATE_OBJECT, withConflictRetry, } from "./shared.js";
3
+ // ─── saved lists ─────────────────────────────────────────────────
4
+ export function registerSavedListActions(rl) {
5
+ rl.registerAction("savedList.list", {
6
+ access: "read",
7
+ description: "Saved lists: curated sets of records of one object type. Each is { id, fields: { $name, $objectType, $description }, relationships: { $records: { values: [ids] } }, createdAt, updatedAt, archivedAt }.",
8
+ inputSchema: t.Object({}, STRICT_OBJECT),
9
+ async execute(_input, ctx) {
10
+ return call(() => clientFor(ctx).listLists());
11
+ },
12
+ });
13
+ rl.registerAction("savedList.get", {
14
+ access: "read",
15
+ description: "Read one saved list envelope by id.",
16
+ inputSchema: t.Object({ id: idSchema("Saved list ID") }, STRICT_OBJECT),
17
+ async execute(input, ctx) {
18
+ const { id } = input;
19
+ return call(() => clientFor(ctx).getList(id));
20
+ },
21
+ });
22
+ rl.registerAction("savedList.create", {
23
+ access: "write",
24
+ description: "Create a saved list of one object type, optionally seeded with record ids. Returns the list envelope.",
25
+ inputSchema: t.Object({
26
+ name: t.String({ minLength: 1, maxLength: 200 }),
27
+ objectType: objectTypeSchema(),
28
+ description: t.Optional(t.String({ maxLength: 2_000 })),
29
+ records: t.Optional(idOrIds),
30
+ }, STRICT_OBJECT),
31
+ async execute(input, ctx) {
32
+ const { name, objectType, description, records } = input;
33
+ const body = {
34
+ fields: {
35
+ $name: name,
36
+ $objectType: objectType,
37
+ $description: description,
38
+ },
39
+ relationships: records === undefined ? {} : { $records: records },
40
+ };
41
+ return call(() => idempotentClientFor(ctx).createList(body));
42
+ },
43
+ });
44
+ rl.registerAction("savedList.update", {
45
+ access: "write",
46
+ description: "Rename a list, change its description, add/remove/replace its records, or archive/restore it. records takes { add, remove, replace } or a bare id / id array as replace. Lost races retry once.",
47
+ inputSchema: t.Object({
48
+ id: idSchema("Saved list ID"),
49
+ name: t.Optional(t.String({ minLength: 1, maxLength: 200 })),
50
+ description: t.Optional(t.Union([t.String({ maxLength: 2_000 }), t.Null()])),
51
+ records: t.Optional(relationshipChangeSchema),
52
+ archived: t.Optional(t.Boolean()),
53
+ }, STRICT_UPDATE_OBJECT),
54
+ async execute(input, ctx) {
55
+ const { id, name, description, records, archived } = input;
56
+ const body = {};
57
+ if (name !== undefined || description !== undefined) {
58
+ body.fields = {};
59
+ if (name !== undefined)
60
+ body.fields.$name = name;
61
+ if (description !== undefined)
62
+ body.fields.$description = description;
63
+ }
64
+ if (records !== undefined)
65
+ body.relationships = { $records: records };
66
+ if (archived !== undefined)
67
+ body.archived = archived;
68
+ return call(() => withConflictRetry(() => clientFor(ctx).updateList(id, body)));
69
+ },
70
+ });
71
+ rl.registerAction("savedList.records", {
72
+ access: "read",
73
+ description: "The members of a saved list as record envelopes: { data, object: 'list', totalCount }. Accepts the same filters and pagination as record.list.",
74
+ inputSchema: t.Object({
75
+ id: idSchema("Saved list ID"),
76
+ filters: t.Optional(filtersSchema()),
77
+ includeArchived: t.Optional(t.Boolean()),
78
+ ...paginationFields(),
79
+ }, STRICT_OBJECT),
80
+ async execute(input, ctx) {
81
+ const { id, filters, includeArchived, limit, offset } = input;
82
+ return call(() => clientFor(ctx).listListRecords(id, {
83
+ filters,
84
+ includeArchived,
85
+ limit,
86
+ offset,
87
+ }));
88
+ },
89
+ });
90
+ }
91
+ // ─── groups ──────────────────────────────────────────────────────
92
+ export function registerGroupActions(rl) {
93
+ rl.registerAction("group.list", {
94
+ access: "read",
95
+ description: "Groups are the subjects of group visibility: { id, slug, name, description, members: [{ type: user | service, id }] }. A record with visibility.mode 'group' is readable by members of its named groups.",
96
+ inputSchema: t.Object({}, STRICT_OBJECT),
97
+ async execute(_input, ctx) {
98
+ return call(() => clientFor(ctx).listGroups());
99
+ },
100
+ });
101
+ rl.registerAction("group.create", {
102
+ access: "write",
103
+ description: "Create a group, optionally with initial members. Requires the configure scope.",
104
+ inputSchema: t.Object({
105
+ slug: t.String({
106
+ pattern: "^[a-z][a-z0-9_]*$",
107
+ maxLength: 100,
108
+ description: "Stable identifier, e.g. sales",
109
+ }),
110
+ name: t.String({ minLength: 1, maxLength: 200 }),
111
+ description: t.Optional(t.String({ minLength: 1, maxLength: 2_000 })),
112
+ members: t.Optional(t.Array(principalSchema)),
113
+ }, STRICT_OBJECT),
114
+ async execute(input, ctx) {
115
+ const body = input;
116
+ return call(() => idempotentClientFor(ctx).createGroup(body));
117
+ },
118
+ });
119
+ rl.registerAction("group.update", {
120
+ access: "write",
121
+ description: "Rename a group or change its description. Requires the configure scope. Lost races retry once.",
122
+ inputSchema: t.Object({
123
+ id: idSchema("Group ID"),
124
+ name: t.Optional(t.String({ minLength: 1, maxLength: 200 })),
125
+ description: t.Optional(t.Union([t.String({ maxLength: 2_000 }), t.Null()])),
126
+ }, STRICT_UPDATE_OBJECT),
127
+ async execute(input, ctx) {
128
+ const { id, ...body } = input;
129
+ return call(() => withConflictRetry(() => clientFor(ctx).updateGroup(id, body)));
130
+ },
131
+ });
132
+ rl.registerAction("group.updateMembers", {
133
+ access: "write",
134
+ description: "Add and/or remove principals (members or API keys) from a group. Membership changes take effect on the next read. Requires the configure scope.",
135
+ inputSchema: t.Object({
136
+ id: idSchema("Group ID"),
137
+ add: t.Optional(t.Array(principalSchema)),
138
+ remove: t.Optional(t.Array(principalSchema)),
139
+ }, STRICT_UPDATE_OBJECT),
140
+ async execute(input, ctx) {
141
+ const { id, ...body } = input;
142
+ return call(() => clientFor(ctx).updateGroupMembers(id, body));
143
+ },
144
+ });
145
+ rl.registerAction("group.delete", {
146
+ access: "write",
147
+ description: "Delete a group. Records that named only this group become unreadable to its former members. Requires the configure scope.",
148
+ inputSchema: t.Object({ id: idSchema("Group ID") }, STRICT_OBJECT),
149
+ async execute(input, ctx) {
150
+ const { id } = input;
151
+ await call(() => clientFor(ctx).deleteGroup(id));
152
+ return { id, deleted: true };
153
+ },
154
+ });
155
+ }
156
+ // ─── members ─────────────────────────────────────────────────────
157
+ export function registerMemberActions(rl) {
158
+ rl.registerAction("member.list", {
159
+ access: "read",
160
+ description: "The organization's members in envelope form: { data: [{ id, fields: { $name, $email, $role } }], object: 'list', totalCount }. Use the id for $owner, $assignedTo, visibility principals ({ type: 'user', id }), and group members.",
161
+ inputSchema: t.Object({ ...paginationFields() }, STRICT_OBJECT),
162
+ async execute(input, ctx) {
163
+ const { limit, offset } = input;
164
+ return call(() => clientFor(ctx).listMembers({ limit, offset }));
165
+ },
166
+ });
167
+ }
168
+ // ─── files ───────────────────────────────────────────────────────
169
+ export function registerFileActions(rl) {
170
+ rl.registerAction("file.createUpload", {
171
+ access: "write",
172
+ description: "Start a file upload: returns the file ({ id, status: PENDING, ... }) plus a one-time grant { uploadUrl, uploadMethod, uploadHeaders, expiresAt }. PUT the bytes there yourself, then call file.complete, then attach with record.update({ relationships: { $files: { add: fileId } } }).",
173
+ inputSchema: t.Object({
174
+ filename: t.String({ minLength: 1, maxLength: 500 }),
175
+ mimeType: t.String({ minLength: 1, maxLength: 200 }),
176
+ sizeBytes: t.Integer({ minimum: 1 }),
177
+ }, STRICT_OBJECT),
178
+ async execute(input, ctx) {
179
+ const body = input;
180
+ return call(() => idempotentClientFor(ctx).createFileUpload(body));
181
+ },
182
+ });
183
+ rl.registerAction("file.complete", {
184
+ access: "write",
185
+ description: "Finalize an upload after the bytes were PUT to the grant URL. Returns the file with status COMPLETED.",
186
+ inputSchema: t.Object({ id: idSchema("File ID") }, STRICT_OBJECT),
187
+ async execute(input, ctx) {
188
+ const { id } = input;
189
+ return call(() => clientFor(ctx).completeFileUpload(id));
190
+ },
191
+ });
192
+ rl.registerAction("record.fileUrl", {
193
+ access: "read",
194
+ description: "Mint a short-lived download URL for a file attached to a record: { url, expiresAt }. Only succeeds when the caller can see the record.",
195
+ inputSchema: t.Object({ recordId: idSchema("Record ID"), fileId: idSchema("File ID") }, STRICT_OBJECT),
196
+ async execute(input, ctx) {
197
+ const { recordId, fileId } = input;
198
+ return call(() => clientFor(ctx).getRecordFileUrl(recordId, fileId));
199
+ },
200
+ });
201
+ }
@@ -0,0 +1,35 @@
1
+ import * as t from "typebox";
2
+ import { registerFileActions, registerGroupActions, registerMemberActions, registerSavedListActions, } from "./collections.js";
3
+ import { registerRecordActions, registerSchemaActions } from "./records.js";
4
+ import { shiftBwmCredential } from "./shared.js";
5
+ /**
6
+ * Shift Business World Model — an organization's graph of accounts,
7
+ * contacts, opportunities, activities, tasks, notes, and custom object
8
+ * types in the Shift cloud. The API key is the tenant authority; the
9
+ * cloud derives the organization from it (SHFT-852), so no org ID is sent.
10
+ *
11
+ * Every record is an envelope of typed `fields` and typed
12
+ * `relationships`; system keys are $-prefixed; definitions are published
13
+ * per object type and must be read before writing.
14
+ *
15
+ * Requests go through the cloud repo's own BusinessWorldModelClient,
16
+ * vendored under src/vendor (see the SYNCED_FROM headers there), signed
17
+ * through the Shift family's declared credential.
18
+ */
19
+ export default function shiftBwm(rl) {
20
+ rl.setName("shiftBwm");
21
+ rl.setVersion("0.1.0");
22
+ rl.setCredential(shiftBwmCredential);
23
+ rl.setConnectionSchema(t.Object({
24
+ apiKey: t.String({
25
+ description: "Shift Labs API key. A personal token (subject: user) acts as its human and inherits that person's record visibility; an organization key (subject: service) is its own principal, named on records and added to groups like a member. Needs service:business-world-model:read for reads, :write for record writes, :configure for groups.",
26
+ env: "SHIFT_LABS_API_KEY",
27
+ }),
28
+ }));
29
+ registerSchemaActions(rl);
30
+ registerRecordActions(rl);
31
+ registerSavedListActions(rl);
32
+ registerGroupActions(rl);
33
+ registerMemberActions(rl);
34
+ registerFileActions(rl);
35
+ }
@@ -0,0 +1,180 @@
1
+ import * as t from "typebox";
2
+ import { call, clientFor, ENVELOPE_DOC, fieldsWriteSchema, filtersSchema, idempotentClientFor, idSchema, objectTypeSchema, paginationFields, relationshipsCreateSchema, relationshipsUpdateSchema, STRICT_OBJECT, STRICT_UPDATE_OBJECT, visibilitySchema, withConflictRetry, } from "./shared.js";
3
+ const READ_DEFINITIONS_FIRST = "Read definition.get for the object type before writing: it lists every field key, its valueType, and the select options. SINGLE_SELECT / MULTI_SELECT accept an option id or its label. $stage accepts a stage id, or a stage label together with a $pipeline hint. Unknown keys fail with unknown_field / unknown_relationship and the error names the offending param (fields.tier, relationships.$owner).";
4
+ export function registerSchemaActions(rl) {
5
+ rl.registerAction("objectType.list", {
6
+ access: "read",
7
+ description: "List the organization's object types, built-in (account, contact, opportunity, activity, task, note) and custom. Each has slug, label, pluralLabel, system, path. Use the slug as objectType everywhere else.",
8
+ inputSchema: t.Object({}, STRICT_OBJECT),
9
+ async execute(_input, ctx) {
10
+ return call(() => clientFor(ctx).listObjectTypes());
11
+ },
12
+ });
13
+ rl.registerAction("definition.get", {
14
+ access: "read",
15
+ description: `Field and relationship definitions for one object type: everything needed to write, validate, or filter it. fieldDefinitions: { "<key>": { slug, label, valueType, system, readOnly, required, typeConfiguration: { options?: [{ id, label, parentId? }], parentFieldKey?, multipleValues?, unique? } } }. relationshipDefinitions: { "<key>": { label, cardinality: HAS_ONE | HAS_MANY, objectType, inverseKey } }. Value types: TEXT NUMBER CHECKBOX CURRENCY DATE DATETIME EMAIL TELEPHONE URL SOCIAL_HANDLE ADDRESS FULL_NAME MARKDOWN SINGLE_SELECT MULTI_SELECT JSON. Multi-value types (EMAIL, TELEPHONE, URL) take arrays.`,
16
+ inputSchema: t.Object({ objectType: objectTypeSchema() }, STRICT_OBJECT),
17
+ async execute(input, ctx) {
18
+ const { objectType } = input;
19
+ return call(() => clientFor(ctx).getDefinitions(objectType));
20
+ },
21
+ });
22
+ rl.registerAction("pipeline.list", {
23
+ access: "read",
24
+ description: "List opportunity pipelines with their ordered stages ({ id, key, name, position, outcome: open | won | lost }). The same stages appear as $stage options in definition.get({ objectType: 'opportunity' }), each with parentId = pipeline id.",
25
+ inputSchema: t.Object({}, STRICT_OBJECT),
26
+ async execute(_input, ctx) {
27
+ return call(() => clientFor(ctx).listPipelines());
28
+ },
29
+ });
30
+ }
31
+ export function registerRecordActions(rl) {
32
+ rl.registerAction("record.list", {
33
+ access: "read",
34
+ description: `Query records of one object type. Returns { data: [envelopes], object: "list", totalCount }. ${ENVELOPE_DOC} Filters AND together on field or relationship keys; a hidden record is simply absent. Use this to find-or-create: filter on $email / $phone with no operator (multi-value fields reject equal), or $name with equal, then create only when totalCount is 0.`,
35
+ inputSchema: t.Object({
36
+ objectType: objectTypeSchema(),
37
+ filters: t.Optional(filtersSchema()),
38
+ includeArchived: t.Optional(t.Boolean({ description: "Also return archived records" })),
39
+ ...paginationFields(),
40
+ }, STRICT_OBJECT),
41
+ async execute(input, ctx) {
42
+ const { objectType, filters, includeArchived, limit, offset } = input;
43
+ return call(() => clientFor(ctx).listRecords(objectType, {
44
+ filters,
45
+ includeArchived,
46
+ limit,
47
+ offset,
48
+ }));
49
+ },
50
+ });
51
+ rl.registerAction("record.get", {
52
+ access: "read",
53
+ description: `Read one record envelope by id. ${ENVELOPE_DOC} A record the caller cannot see is a 404, same as one that does not exist.`,
54
+ inputSchema: t.Object({ objectType: objectTypeSchema(), id: idSchema("Record ID") }, STRICT_OBJECT),
55
+ async execute(input, ctx) {
56
+ const { objectType, id } = input;
57
+ return call(() => clientFor(ctx).getRecord(objectType, id));
58
+ },
59
+ });
60
+ rl.registerAction("record.create", {
61
+ access: "write",
62
+ description: `Create a record and return its envelope. ${READ_DEFINITIONS_FIRST} Writes take bare values: fields: { "$name": "Acme", "tier": "Gold" }, relationships: { "$owner": "user_1", "$contact": ["con_1"] }. Visibility defaults to org; the actor who restricts a record is always among its readers. Every create carries an Idempotency-Key.`,
63
+ inputSchema: t.Object({
64
+ objectType: objectTypeSchema(),
65
+ fields: fieldsWriteSchema("Field key -> bare value. The required display key differs per type: $name on account, contact, opportunity, and custom types; $title on task and note (note body is $content, activity body is $body, both MARKDOWN); activity has no $name and requires $subject plus $type (free text, e.g. call, email, meeting). Contact identities are $email (array), $phone (array, E.164), $whatsapp (array), $linkedIn (a full https://linkedin.com/in/... URL). Required keys are marked required in definition.get."),
66
+ relationships: t.Optional(relationshipsCreateSchema()),
67
+ externalId: t.Optional(t.String({
68
+ minLength: 1,
69
+ maxLength: 500,
70
+ description: "Caller-owned external identifier",
71
+ })),
72
+ visibility: t.Optional(visibilitySchema()),
73
+ }, STRICT_OBJECT),
74
+ async execute(input, ctx) {
75
+ const { objectType, ...body } = input;
76
+ return call(() => idempotentClientFor(ctx).createRecord(objectType, body));
77
+ },
78
+ });
79
+ rl.registerAction("record.update", {
80
+ access: "write",
81
+ description: `Update a record and return its envelope. Only named fields change; null clears a nullable field. Relationships take { add, remove, replace } per key, or a bare id / id array as shorthand for replace, or null to clear; HAS_ONE never holds more than one value; at most 25 link changes per request. archived: false restores an archived record. ${READ_DEFINITIONS_FIRST} Updates are compare-and-set; a lost race (409 write_conflict) is retried once automatically.`,
82
+ inputSchema: t.Object({
83
+ objectType: objectTypeSchema(),
84
+ id: idSchema("Record ID"),
85
+ fields: t.Optional(fieldsWriteSchema("Field key -> bare value")),
86
+ relationships: t.Optional(relationshipsUpdateSchema()),
87
+ externalId: t.Optional(t.Union([t.String({ maxLength: 500 }), t.Null()])),
88
+ visibility: t.Optional(visibilitySchema()),
89
+ archived: t.Optional(t.Boolean({ description: "true archives, false restores" })),
90
+ },
91
+ // objectType and id both route the request, so a change is a third key.
92
+ { ...STRICT_UPDATE_OBJECT, minProperties: 3 }),
93
+ async execute(input, ctx) {
94
+ const { objectType, id, ...body } = input;
95
+ return call(() => withConflictRetry(() => clientFor(ctx).updateRecord(objectType, id, body)));
96
+ },
97
+ });
98
+ rl.registerAction("record.archive", {
99
+ access: "write",
100
+ description: "Archive a record (soft delete). It leaves default listings, stays readable with includeArchived, and record.update({ archived: false }) restores it. Nothing is destroyed. Returns the archived envelope.",
101
+ inputSchema: t.Object({ objectType: objectTypeSchema(), id: idSchema("Record ID") }, STRICT_OBJECT),
102
+ async execute(input, ctx) {
103
+ const { objectType, id } = input;
104
+ return call(() => clientFor(ctx).archiveRecord(objectType, id));
105
+ },
106
+ });
107
+ rl.registerAction("record.history", {
108
+ access: "read",
109
+ description: 'Values of one field over time, newest first, consecutive duplicates collapsed: { data: [{ value, valueType, displayValue, recordedAt, isCreate }], hasMore, nextCursor }. Every field has history, system and custom alike. Use it for "what changed on X and when".',
110
+ inputSchema: t.Object({
111
+ objectType: objectTypeSchema(),
112
+ id: idSchema("Record ID"),
113
+ field: t.String({
114
+ minLength: 1,
115
+ description: "Field key, e.g. $name, $stage, tier",
116
+ }),
117
+ limit: t.Optional(t.Integer({ minimum: 1, maximum: 100, description: "Default 20" })),
118
+ after: t.Optional(t.String({
119
+ minLength: 1,
120
+ description: "nextCursor from a prior page",
121
+ })),
122
+ }, STRICT_OBJECT),
123
+ async execute(input, ctx) {
124
+ const { objectType, id, field, limit, after } = input;
125
+ return call(() => clientFor(ctx).getFieldHistory(objectType, id, field, { limit, after }));
126
+ },
127
+ });
128
+ rl.registerAction("record.links", {
129
+ access: "read",
130
+ description: "Raw edges touching a record: { outbound: [link], inbound: [link] } where link = { id, fromRecordId, toRecordId, fromObjectType, toObjectType, key, role, attributes, declared, createdAt }. declared is false for an edge no definition covers. Edges whose far end the caller cannot see are hidden.",
131
+ inputSchema: t.Object({
132
+ id: idSchema("Record ID"),
133
+ direction: t.Optional(t.Union([t.Literal("in"), t.Literal("out"), t.Literal("both")], {
134
+ description: "Default both",
135
+ })),
136
+ }, STRICT_OBJECT),
137
+ async execute(input, ctx) {
138
+ const { id, direction } = input;
139
+ return call(() => clientFor(ctx).listLinks(id, direction));
140
+ },
141
+ });
142
+ rl.registerAction("record.changeEvents", {
143
+ access: "read",
144
+ description: "Immutable change events for a record: [{ id, recordId, actor: { type, id }, action: created | updated, before, after, importRunId, createdAt }]. before/after are whole-record snapshots. Prefer record.history when only one field matters.",
145
+ inputSchema: t.Object({ id: idSchema("Record ID") }, STRICT_OBJECT),
146
+ async execute(input, ctx) {
147
+ const { id } = input;
148
+ return call(() => clientFor(ctx).listChangeEvents(id));
149
+ },
150
+ });
151
+ rl.registerAction("record.merge", {
152
+ access: "write",
153
+ description: "Fold a duplicate record into a primary of the same object type in one transaction. Fields keep the primary's value unless it is empty or fieldResolutions names 'duplicate' or a literal { value }; multi-value fields union; every edge, identity, list membership, file, and reader moves to the primary; the duplicate archives with mergedIntoId. Returns { merge: { id, status, summary }, primary, summary }.",
154
+ inputSchema: t.Object({
155
+ objectType: objectTypeSchema(),
156
+ primaryId: idSchema("Record that survives"),
157
+ duplicateId: idSchema("Record folded into the primary"),
158
+ fieldResolutions: t.Optional(t.Record(t.String(), t.Union([
159
+ t.Literal("primary"),
160
+ t.Literal("duplicate"),
161
+ t.Object({ value: t.Unknown() }, STRICT_OBJECT),
162
+ ]), {
163
+ description: "Per field key: keep primary, take duplicate, or set a literal value",
164
+ })),
165
+ }, STRICT_OBJECT),
166
+ async execute(input, ctx) {
167
+ const { objectType, ...body } = input;
168
+ return call(() => idempotentClientFor(ctx).mergeRecords(objectType, body));
169
+ },
170
+ });
171
+ rl.registerAction("merge.get", {
172
+ access: "read",
173
+ description: "Read a past merge by id: { id, objectType, primaryId, duplicateId, status: done | failed, summary: { fieldWriteCount, repointedCount, warnings }, createdAt }.",
174
+ inputSchema: t.Object({ id: idSchema("Merge ID") }, STRICT_OBJECT),
175
+ async execute(input, ctx) {
176
+ const { id } = input;
177
+ return call(() => clientFor(ctx).getMerge(id));
178
+ },
179
+ });
180
+ }
@@ -0,0 +1,168 @@
1
+ import { AuthError } from "runline";
2
+ import * as t from "typebox";
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";
8
+ import { BWM_BUILT_IN_OBJECT_TYPES, BWM_LIST_MAX_LIMIT, } from "./vendor/contracts.js";
9
+ import { BwmFilterOperator } from "./vendor/models.js";
10
+ export { idSchema, STRICT_OBJECT, STRICT_UPDATE_OBJECT, } from "../../_shared/shiftCloud.js";
11
+ export const shiftBwmCredential = shiftCredential();
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
+ }
35
+ /**
36
+ * One client per call. Cheap (prefix + fetch closure), and it lets a
37
+ * create attach its own `Idempotency-Key` without leaking it into the
38
+ * next request.
39
+ */
40
+ export function clientFor(ctx, extraHeaders = {}) {
41
+ return new BusinessWorldModelClient({
42
+ baseUrl: SHIFT_API_URL,
43
+ fetch: brokeredFetch(ctx),
44
+ headers: extraHeaders,
45
+ });
46
+ }
47
+ /** Client whose every mutation carries a fresh `Idempotency-Key`. */
48
+ export function idempotentClientFor(ctx) {
49
+ return clientFor(ctx, { "idempotency-key": crypto.randomUUID() });
50
+ }
51
+ // ─── errors ──────────────────────────────────────────────────────
52
+ /**
53
+ * Only `message` survives the trip back to the agent's code, so the
54
+ * fields the model needs to self-correct — `code` and `param` — are
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.
58
+ */
59
+ export function describeError(err) {
60
+ if (err instanceof BwmClientError) {
61
+ const code = errorIdentifier(err.code);
62
+ const param = errorIdentifier(err.param);
63
+ const error = new Error(failureMessage("shiftBwm", err.status, { code, param }));
64
+ error.status = err.status;
65
+ error.type = errorIdentifier(err.type);
66
+ error.code = code;
67
+ error.param = param;
68
+ return error;
69
+ }
70
+ return err instanceof Error ? err : new Error(String(err));
71
+ }
72
+ export async function call(fn) {
73
+ try {
74
+ return await fn();
75
+ }
76
+ catch (err) {
77
+ throw describeError(err);
78
+ }
79
+ }
80
+ /**
81
+ * Every update is compare-and-set on `updatedAt`; a lost race is
82
+ * `409 write_conflict`. The API asks the loser to re-read and retry,
83
+ * so an update runs once more after a conflict before it fails.
84
+ */
85
+ export async function withConflictRetry(fn) {
86
+ try {
87
+ return await fn();
88
+ }
89
+ catch (err) {
90
+ if (err instanceof BwmClientError && err.code === "write_conflict") {
91
+ return await fn();
92
+ }
93
+ throw err;
94
+ }
95
+ }
96
+ // ─── schema helpers ──────────────────────────────────────────────
97
+ export function objectTypeSchema(description = `Object type: ${BWM_BUILT_IN_OBJECT_TYPES.join(" | ")} or a custom type's slug (see objectType.list).`) {
98
+ return t.String({ minLength: 1, pattern: "^[a-z][a-z0-9_]*$", description });
99
+ }
100
+ export const idOrIds = t.Union([
101
+ t.String({ minLength: 1 }),
102
+ t.Array(t.String({ minLength: 1 })),
103
+ ]);
104
+ /** Link changes on one relationship key, as records and lists both take them. */
105
+ export const relationshipChangeSchema = t.Union([
106
+ idOrIds,
107
+ t.Object({
108
+ add: t.Optional(idOrIds),
109
+ remove: t.Optional(idOrIds),
110
+ replace: t.Optional(t.Union([idOrIds, t.Null()])),
111
+ }, STRICT_OBJECT),
112
+ ]);
113
+ export const principalSchema = t.Object({
114
+ type: t.Union([t.Literal("user"), t.Literal("service")], {
115
+ description: "user: a member (see member.list). service: an API key.",
116
+ }),
117
+ id: t.String({ minLength: 1 }),
118
+ }, STRICT_OBJECT);
119
+ export function fieldsWriteSchema(description) {
120
+ return t.Record(t.String(), t.Unknown(), { description });
121
+ }
122
+ export function relationshipsCreateSchema() {
123
+ return t.Record(t.String(), idOrIds, {
124
+ description: "Relationship key -> record id (HAS_ONE) or array of ids (HAS_MANY). System keys are $-prefixed ($owner, $account, $contact, $attendee, $assignedTo, $files); custom keys are bare slugs.",
125
+ });
126
+ }
127
+ export function relationshipsUpdateSchema() {
128
+ return t.Record(t.String(), t.Union([relationshipChangeSchema, t.Null()]), {
129
+ description: "Relationship key -> { add, remove, replace } ops, or a bare id / id array as shorthand for replace, or null to clear. At most 25 link changes per request.",
130
+ });
131
+ }
132
+ export function visibilitySchema() {
133
+ return t.Object({
134
+ mode: t.Union([t.Literal("org"), t.Literal("group"), t.Literal("private")], {
135
+ description: "org: every member. group: members of the named groups. private: only the named principals. The actor who restricts a record is always a reader.",
136
+ }),
137
+ groups: t.Optional(t.Array(t.String({ minLength: 1 }))),
138
+ principals: t.Optional(t.Array(principalSchema)),
139
+ }, STRICT_OBJECT);
140
+ }
141
+ export function paginationFields() {
142
+ return {
143
+ limit: t.Optional(t.Integer({
144
+ minimum: 1,
145
+ maximum: BWM_LIST_MAX_LIMIT,
146
+ description: `Page size, default 25, max ${BWM_LIST_MAX_LIMIT}`,
147
+ })),
148
+ offset: t.Optional(t.Integer({ minimum: 0, description: "Default 0" })),
149
+ };
150
+ }
151
+ export function filtersSchema() {
152
+ const operators = BwmFilterOperator.options;
153
+ return t.Array(t.Object({
154
+ key: t.String({
155
+ minLength: 1,
156
+ description: "Field or relationship key, e.g. $name, $email, tier, $account",
157
+ }),
158
+ operator: t.Optional(t.Union(operators.map((op) => t.Literal(op)), {
159
+ description: `${operators.join(" | ")}. Omit it and the API picks equal where valid, contains otherwise. Multi-value fields (EMAIL, TELEPHONE, URL) reject equal (unsupported_filter_operator): omit the operator or use contains.`,
160
+ })),
161
+ negate: t.Optional(t.Boolean({ description: "Negate the operator" })),
162
+ value: t.String({
163
+ description: "Comparison value. For relationship keys, a related record id.",
164
+ }),
165
+ }, STRICT_OBJECT), { description: "AND-ed filters" });
166
+ }
167
+ /** The record envelope, as every read returns it and as descriptions cite it. */
168
+ export const ENVELOPE_DOC = `Record envelope: { id, objectType, createdAt, updatedAt, archivedAt, mergedIntoId, externalId, visibility: { mode, groups, principals }, fields: { "<key>": { value, valueType } }, relationships: { "<key>": { cardinality, objectType, values: [ids] } } }. System keys are $-prefixed ($name, $email, $owner, $account, $stage, ...); custom keys are bare slugs. Writes take bare values: fields: { "$name": "Acme" }, relationships: { "$owner": "user_1", "$contact": ["con_1"] }.`;