@oomol-lab/open-connector 1.9.0 → 1.9.1

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 (395) hide show
  1. package/assets/open-connector/catalog/apps/agentearth.json +441 -0
  2. package/assets/open-connector/catalog/apps/appgrowing_mcp.json +863 -0
  3. package/assets/open-connector/catalog/apps/arcmira.json +610 -0
  4. package/assets/open-connector/catalog/apps/bainiu.json +654 -0
  5. package/assets/open-connector/catalog/apps/chaport.json +331 -0
  6. package/assets/open-connector/catalog/apps/cnb.json +1408 -0
  7. package/assets/open-connector/catalog/apps/crtsh.json +123 -0
  8. package/assets/open-connector/catalog/apps/eastmoney_miaoxiang.json +406 -0
  9. package/assets/open-connector/catalog/apps/fastmoss_mcp.json +876 -876
  10. package/assets/open-connector/catalog/apps/ftshare.json +1162 -0
  11. package/assets/open-connector/catalog/apps/fusion-api.json +143 -0
  12. package/assets/open-connector/catalog/apps/fxbaogao.json +308 -0
  13. package/assets/open-connector/catalog/apps/github.json +38 -3
  14. package/assets/open-connector/catalog/apps/hrmos_kintai.json +7519 -0
  15. package/assets/open-connector/catalog/apps/humor_api.json +351 -0
  16. package/assets/open-connector/catalog/apps/kaonavi.json +1723 -0
  17. package/assets/open-connector/catalog/apps/linear_mcp.json +882 -22
  18. package/assets/open-connector/catalog/apps/listinggood.json +362 -0
  19. package/assets/open-connector/catalog/apps/notion_mcp.json +338 -1
  20. package/assets/open-connector/catalog/apps/outlook.json +414 -0
  21. package/assets/open-connector/catalog/apps/porteden.json +1258 -0
  22. package/assets/open-connector/catalog/apps/qiuxiaoce.json +915 -0
  23. package/assets/open-connector/catalog/apps/qqmusic.json +1834 -0
  24. package/assets/open-connector/catalog/apps/rakuraku_seisan.json +217 -0
  25. package/assets/open-connector/catalog/apps/redfox.json +9661 -897
  26. package/assets/open-connector/catalog/apps/salesforce.json +4907 -0
  27. package/assets/open-connector/catalog/apps/sansan.json +4594 -0
  28. package/assets/open-connector/catalog/apps/smarthr.json +8071 -0
  29. package/assets/open-connector/catalog/apps/smooth.json +914 -0
  30. package/assets/open-connector/catalog/apps/tapd.json +727 -0
  31. package/assets/open-connector/catalog/apps/tencent_meeting_mcp.json +1301 -0
  32. package/assets/open-connector/catalog/apps/threatfox.json +203 -0
  33. package/assets/open-connector/catalog/apps/tradebee.json +915 -0
  34. package/assets/open-connector/catalog/apps/twittrapi.json +4914 -0
  35. package/assets/open-connector/catalog/apps/urlhaus.json +246 -0
  36. package/assets/open-connector/catalog/apps/weread.json +1514 -0
  37. package/assets/open-connector/catalog/apps/whatsapp.json +12 -0
  38. package/assets/open-connector/catalog/apps/zhiliaobiaoxun.json +812 -0
  39. package/assets/open-connector/catalog/apps-index.json +1 -1
  40. package/package.json +2 -1
  41. package/src/connection-service.js +55 -11
  42. package/src/core/provider-error-codes.d.ts +9 -0
  43. package/src/core/provider-error-codes.js +13 -0
  44. package/src/core/request.d.ts +2 -0
  45. package/src/core/request.js +11 -2
  46. package/src/mail/imap-smtp/protocol.js +4 -3
  47. package/src/oauth/oauth-flow-service.js +1 -0
  48. package/src/oauth/oauth-token.d.ts +2 -0
  49. package/src/providers/17track/runtime.js +17 -20
  50. package/src/providers/action-contracts.generated.d.ts +36 -6
  51. package/src/providers/agentearth/actions.d.ts +2 -0
  52. package/src/providers/agentearth/actions.js +100 -0
  53. package/src/providers/agentearth/executors.d.ts +4 -0
  54. package/src/providers/agentearth/executors.js +109 -0
  55. package/src/providers/appgrowing_mcp/actions.d.ts +2 -0
  56. package/src/providers/appgrowing_mcp/actions.js +175 -0
  57. package/src/providers/appgrowing_mcp/executors.d.ts +4 -0
  58. package/src/providers/appgrowing_mcp/executors.js +66 -0
  59. package/src/providers/arcmira/executors.d.ts +3 -0
  60. package/src/providers/arcmira/executors.js +8 -0
  61. package/src/providers/arcmira/runtime.d.ts +6 -0
  62. package/src/providers/arcmira/runtime.js +41 -0
  63. package/src/providers/bainiu/actions.d.ts +2 -0
  64. package/src/providers/bainiu/actions.js +108 -0
  65. package/src/providers/bainiu/executors.d.ts +4 -0
  66. package/src/providers/bainiu/executors.js +113 -0
  67. package/src/providers/baixiao/executors.js +1 -1
  68. package/src/providers/bing_webmaster/executors.js +1 -1
  69. package/src/providers/chaport/actions.d.ts +2 -0
  70. package/src/providers/chaport/actions.js +70 -0
  71. package/src/providers/chaport/executors.d.ts +4 -0
  72. package/src/providers/chaport/executors.js +128 -0
  73. package/src/providers/clickup/runtime.js +49 -52
  74. package/src/providers/cnb/actions.d.ts +2 -0
  75. package/src/providers/cnb/actions.js +341 -0
  76. package/src/providers/cnb/executors.d.ts +4 -0
  77. package/src/providers/cnb/executors.js +135 -0
  78. package/src/providers/coupontools/runtime.js +11 -14
  79. package/src/providers/crtsh/executors.d.ts +3 -0
  80. package/src/providers/crtsh/executors.js +19 -0
  81. package/src/providers/crtsh/runtime.d.ts +17 -0
  82. package/src/providers/crtsh/runtime.js +84 -0
  83. package/src/providers/eastmoney_miaoxiang/actions.d.ts +2 -0
  84. package/src/providers/eastmoney_miaoxiang/actions.js +95 -0
  85. package/src/providers/eastmoney_miaoxiang/executors.d.ts +4 -0
  86. package/src/providers/eastmoney_miaoxiang/executors.js +81 -0
  87. package/src/providers/fastmoss_mcp/actions-content.d.ts +2 -0
  88. package/src/providers/fastmoss_mcp/actions-content.js +140 -0
  89. package/src/providers/fastmoss_mcp/actions-creator.d.ts +2 -0
  90. package/src/providers/fastmoss_mcp/actions-creator.js +154 -0
  91. package/src/providers/fastmoss_mcp/actions-product.d.ts +2 -0
  92. package/src/providers/fastmoss_mcp/actions-product.js +167 -0
  93. package/src/providers/fastmoss_mcp/actions-research.d.ts +2 -0
  94. package/src/providers/fastmoss_mcp/actions-research.js +174 -0
  95. package/src/providers/fastmoss_mcp/actions-shop.d.ts +2 -0
  96. package/src/providers/fastmoss_mcp/actions-shop.js +142 -0
  97. package/src/providers/fastmoss_mcp/actions.js +11 -12
  98. package/src/providers/fastmoss_mcp/schemas.d.ts +51 -0
  99. package/src/providers/fastmoss_mcp/schemas.js +52 -0
  100. package/src/providers/ftshare/actions.d.ts +2 -0
  101. package/src/providers/ftshare/actions.js +124 -0
  102. package/src/providers/ftshare/executors.d.ts +4 -0
  103. package/src/providers/ftshare/executors.js +102 -0
  104. package/src/providers/fusion-api/operations.js +37 -0
  105. package/src/providers/fxbaogao/actions.d.ts +2 -0
  106. package/src/providers/fxbaogao/actions.js +74 -0
  107. package/src/providers/fxbaogao/executors.d.ts +4 -0
  108. package/src/providers/fxbaogao/executors.js +155 -0
  109. package/src/providers/github/app-installation.d.ts +37 -0
  110. package/src/providers/github/app-installation.js +233 -0
  111. package/src/providers/github/executors.js +93 -15
  112. package/src/providers/github/runtime-repository.js +21 -1
  113. package/src/providers/github/runtime-shared.d.ts +2 -0
  114. package/src/providers/github/runtime-shared.js +1 -0
  115. package/src/providers/googledrive/runtime-request.js +3 -3
  116. package/src/providers/hrmos_kintai/actions.d.ts +2 -0
  117. package/src/providers/hrmos_kintai/actions.js +139 -0
  118. package/src/providers/hrmos_kintai/attendance-actions.d.ts +2 -0
  119. package/src/providers/hrmos_kintai/attendance-actions.js +276 -0
  120. package/src/providers/hrmos_kintai/business-actions.d.ts +2 -0
  121. package/src/providers/hrmos_kintai/business-actions.js +143 -0
  122. package/src/providers/hrmos_kintai/business-schemas.d.ts +4 -0
  123. package/src/providers/hrmos_kintai/business-schemas.js +320 -0
  124. package/src/providers/hrmos_kintai/executors.d.ts +4 -0
  125. package/src/providers/hrmos_kintai/executors.js +61 -0
  126. package/src/providers/hrmos_kintai/export-actions.d.ts +2 -0
  127. package/src/providers/hrmos_kintai/export-actions.js +58 -0
  128. package/src/providers/hrmos_kintai/operations.d.ts +9 -0
  129. package/src/providers/hrmos_kintai/operations.js +278 -0
  130. package/src/providers/hrmos_kintai/runtime.d.ts +10 -0
  131. package/src/providers/hrmos_kintai/runtime.js +217 -0
  132. package/src/providers/hrmos_kintai/schemas.d.ts +10 -0
  133. package/src/providers/hrmos_kintai/schemas.js +70 -0
  134. package/src/providers/humor_api/actions.d.ts +2 -0
  135. package/src/providers/humor_api/actions.js +96 -0
  136. package/src/providers/humor_api/executors.d.ts +4 -0
  137. package/src/providers/humor_api/executors.js +76 -0
  138. package/src/providers/kaonavi/actions.d.ts +4 -0
  139. package/src/providers/kaonavi/actions.js +144 -0
  140. package/src/providers/kaonavi/additional-actions.d.ts +10 -0
  141. package/src/providers/kaonavi/additional-actions.js +203 -0
  142. package/src/providers/kaonavi/executors.d.ts +4 -0
  143. package/src/providers/kaonavi/executors.js +69 -0
  144. package/src/providers/kaonavi/runtime.d.ts +4 -0
  145. package/src/providers/kaonavi/runtime.js +69 -0
  146. package/src/providers/linear_mcp/actions.d.ts +14 -0
  147. package/src/providers/linear_mcp/actions.js +134 -0
  148. package/src/providers/linear_mcp/runtime-mcp.d.ts +7 -1
  149. package/src/providers/linear_mcp/runtime-mcp.js +140 -28
  150. package/src/providers/linkfox/runtime.js +48 -51
  151. package/src/providers/listinggood/actions.d.ts +2 -0
  152. package/src/providers/listinggood/actions.js +95 -0
  153. package/src/providers/listinggood/executors.d.ts +4 -0
  154. package/src/providers/listinggood/executors.js +99 -0
  155. package/src/providers/mcp-tools.d.ts +3 -0
  156. package/src/providers/mcp-tools.js +5 -4
  157. package/src/providers/notion_mcp/executors.js +53 -24
  158. package/src/providers/notion_mcp/mcp-response.d.ts +26 -0
  159. package/src/providers/notion_mcp/mcp-response.js +95 -0
  160. package/src/providers/omise/executors.js +1 -1
  161. package/src/providers/outlook/executors.js +35 -2
  162. package/src/providers/porteden/actions.d.ts +2 -0
  163. package/src/providers/porteden/actions.js +162 -0
  164. package/src/providers/porteden/executors.d.ts +4 -0
  165. package/src/providers/porteden/executors.js +140 -0
  166. package/src/providers/provider-runtime.d.ts +3 -2
  167. package/src/providers/pushover/runtime.js +28 -31
  168. package/src/providers/qianfan/runtime.js +16 -19
  169. package/src/providers/qiuxiaoce/actions.d.ts +2 -0
  170. package/src/providers/qiuxiaoce/actions.js +248 -0
  171. package/src/providers/qiuxiaoce/executors.d.ts +4 -0
  172. package/src/providers/qiuxiaoce/executors.js +76 -0
  173. package/src/providers/qiuxiaoce/routes.d.ts +1 -0
  174. package/src/providers/qiuxiaoce/routes.js +20 -0
  175. package/src/providers/qqmusic/actions.d.ts +2 -0
  176. package/src/providers/qqmusic/actions.js +229 -0
  177. package/src/providers/qqmusic/executors.d.ts +4 -0
  178. package/src/providers/qqmusic/executors.js +92 -0
  179. package/src/providers/qqmusic/report-schema.d.ts +4 -0
  180. package/src/providers/qqmusic/report-schema.js +119 -0
  181. package/src/providers/rakuraku_seisan/actions.d.ts +2 -0
  182. package/src/providers/rakuraku_seisan/actions.js +50 -0
  183. package/src/providers/rakuraku_seisan/executors.d.ts +4 -0
  184. package/src/providers/rakuraku_seisan/executors.js +40 -0
  185. package/src/providers/rakuraku_seisan/runtime.d.ts +8 -0
  186. package/src/providers/rakuraku_seisan/runtime.js +251 -0
  187. package/src/providers/redfox/actions-account.d.ts +2 -0
  188. package/src/providers/redfox/actions-account.js +24 -0
  189. package/src/providers/redfox/actions-autohome.d.ts +2 -0
  190. package/src/providers/redfox/actions-autohome.js +51 -0
  191. package/src/providers/redfox/actions-baijiahao.d.ts +2 -0
  192. package/src/providers/redfox/actions-baijiahao.js +58 -0
  193. package/src/providers/redfox/actions-bilibili.d.ts +2 -0
  194. package/src/providers/redfox/actions-bilibili.js +67 -0
  195. package/src/providers/redfox/actions-dongchedi.d.ts +2 -0
  196. package/src/providers/redfox/actions-dongchedi.js +49 -0
  197. package/src/providers/redfox/actions-douyin.d.ts +2 -0
  198. package/src/providers/redfox/actions-douyin.js +297 -0
  199. package/src/providers/redfox/actions-generation.d.ts +2 -0
  200. package/src/providers/redfox/actions-generation.js +293 -0
  201. package/src/providers/redfox/actions-instagram.d.ts +2 -0
  202. package/src/providers/redfox/actions-instagram.js +49 -0
  203. package/src/providers/redfox/actions-kuaishou.d.ts +2 -0
  204. package/src/providers/redfox/actions-kuaishou.js +53 -0
  205. package/src/providers/redfox/actions-search.d.ts +2 -0
  206. package/src/providers/redfox/actions-search.js +125 -0
  207. package/src/providers/redfox/actions-tiktok.d.ts +2 -0
  208. package/src/providers/redfox/actions-tiktok.js +136 -0
  209. package/src/providers/redfox/actions-tools.d.ts +2 -0
  210. package/src/providers/redfox/actions-tools.js +151 -0
  211. package/src/providers/redfox/actions-toutiao.d.ts +2 -0
  212. package/src/providers/redfox/actions-toutiao.js +68 -0
  213. package/src/providers/redfox/actions-transcription.d.ts +2 -0
  214. package/src/providers/redfox/actions-transcription.js +165 -0
  215. package/src/providers/redfox/actions-wechat-channel.d.ts +2 -0
  216. package/src/providers/redfox/actions-wechat-channel.js +63 -0
  217. package/src/providers/redfox/actions-wechat.d.ts +2 -0
  218. package/src/providers/redfox/actions-wechat.js +302 -0
  219. package/src/providers/redfox/actions-weibo.d.ts +2 -0
  220. package/src/providers/redfox/actions-weibo.js +61 -0
  221. package/src/providers/redfox/actions-x.d.ts +2 -0
  222. package/src/providers/redfox/actions-x.js +126 -0
  223. package/src/providers/redfox/actions-xiaohongshu.d.ts +2 -0
  224. package/src/providers/redfox/actions-xiaohongshu.js +244 -0
  225. package/src/providers/redfox/actions-yiche.d.ts +2 -0
  226. package/src/providers/redfox/actions-yiche.js +59 -0
  227. package/src/providers/redfox/actions-youtube.d.ts +2 -0
  228. package/src/providers/redfox/actions-youtube.js +64 -0
  229. package/src/providers/redfox/actions-zhihu.d.ts +2 -0
  230. package/src/providers/redfox/actions-zhihu.js +26 -0
  231. package/src/providers/redfox/actions.d.ts +2 -0
  232. package/src/providers/redfox/actions.js +49 -0
  233. package/src/providers/redfox/executors.d.ts +2 -14
  234. package/src/providers/redfox/executors.js +28 -551
  235. package/src/providers/redfox/routes.d.ts +11 -0
  236. package/src/providers/redfox/routes.js +329 -0
  237. package/src/providers/redfox/runtime.d.ts +6 -0
  238. package/src/providers/redfox/runtime.js +151 -0
  239. package/src/providers/redfox/schemas.d.ts +9 -0
  240. package/src/providers/redfox/schemas.js +40 -0
  241. package/src/providers/registry.generated.js +30 -0
  242. package/src/providers/salesforce/context.d.ts +16 -0
  243. package/src/providers/salesforce/context.js +58 -0
  244. package/src/providers/salesforce/executors.d.ts +5 -0
  245. package/src/providers/salesforce/executors.js +54 -0
  246. package/src/providers/salesforce/media.d.ts +9 -0
  247. package/src/providers/salesforce/media.js +66 -0
  248. package/src/providers/salesforce/oauth.d.ts +2 -0
  249. package/src/providers/salesforce/oauth.js +89 -0
  250. package/src/providers/salesforce/runtime-analytics.d.ts +2 -0
  251. package/src/providers/salesforce/runtime-analytics.js +60 -0
  252. package/src/providers/salesforce/runtime-automation.d.ts +2 -0
  253. package/src/providers/salesforce/runtime-automation.js +64 -0
  254. package/src/providers/salesforce/runtime-base.d.ts +2 -0
  255. package/src/providers/salesforce/runtime-base.js +51 -0
  256. package/src/providers/salesforce/runtime-bulk.d.ts +2 -0
  257. package/src/providers/salesforce/runtime-bulk.js +98 -0
  258. package/src/providers/salesforce/runtime-data.d.ts +2 -0
  259. package/src/providers/salesforce/runtime-data.js +207 -0
  260. package/src/providers/salesforce/runtime-files.d.ts +2 -0
  261. package/src/providers/salesforce/runtime-files.js +108 -0
  262. package/src/providers/salesforce/transport.d.ts +9 -0
  263. package/src/providers/salesforce/transport.js +65 -0
  264. package/src/providers/sansan/actions.d.ts +2 -0
  265. package/src/providers/sansan/actions.js +165 -0
  266. package/src/providers/sansan/admin-actions.d.ts +2 -0
  267. package/src/providers/sansan/admin-actions.js +181 -0
  268. package/src/providers/sansan/admin.d.ts +2 -0
  269. package/src/providers/sansan/admin.js +42 -0
  270. package/src/providers/sansan/business-actions.d.ts +2 -0
  271. package/src/providers/sansan/business-actions.js +160 -0
  272. package/src/providers/sansan/business.d.ts +2 -0
  273. package/src/providers/sansan/business.js +51 -0
  274. package/src/providers/sansan/executors.d.ts +4 -0
  275. package/src/providers/sansan/executors.js +59 -0
  276. package/src/providers/sansan/file-schema.d.ts +2 -0
  277. package/src/providers/sansan/file-schema.js +8 -0
  278. package/src/providers/sansan/files.d.ts +11 -0
  279. package/src/providers/sansan/files.js +49 -0
  280. package/src/providers/sansan/organization-actions.d.ts +2 -0
  281. package/src/providers/sansan/organization-actions.js +198 -0
  282. package/src/providers/sansan/organization-columns.d.ts +2 -0
  283. package/src/providers/sansan/organization-columns.js +33 -0
  284. package/src/providers/sansan/organization.d.ts +2 -0
  285. package/src/providers/sansan/organization.js +88 -0
  286. package/src/providers/sansan/read.d.ts +2 -0
  287. package/src/providers/sansan/read.js +25 -0
  288. package/src/providers/sansan/request.d.ts +22 -0
  289. package/src/providers/sansan/request.js +94 -0
  290. package/src/providers/sansan/schemas.d.ts +7 -0
  291. package/src/providers/sansan/schemas.js +72 -0
  292. package/src/providers/shopee/runtime.d.ts +33 -29
  293. package/src/providers/shopee/runtime.js +166 -169
  294. package/src/providers/smarthr/actions.d.ts +2 -0
  295. package/src/providers/smarthr/actions.js +286 -0
  296. package/src/providers/smarthr/employee-runtime.d.ts +1 -0
  297. package/src/providers/smarthr/employee-runtime.js +63 -0
  298. package/src/providers/smarthr/employee-schema.d.ts +3 -0
  299. package/src/providers/smarthr/employee-schema.js +222 -0
  300. package/src/providers/smarthr/executors.d.ts +4 -0
  301. package/src/providers/smarthr/executors.js +35 -0
  302. package/src/providers/smarthr/pagination.d.ts +1 -0
  303. package/src/providers/smarthr/pagination.js +84 -0
  304. package/src/providers/smarthr/resource-routes.d.ts +16 -0
  305. package/src/providers/smarthr/resource-routes.js +163 -0
  306. package/src/providers/smarthr/runtime.d.ts +13 -0
  307. package/src/providers/smarthr/runtime.js +242 -0
  308. package/src/providers/smarthr/supplemental-actions.d.ts +2 -0
  309. package/src/providers/smarthr/supplemental-actions.js +541 -0
  310. package/src/providers/smooth/actions.d.ts +2 -0
  311. package/src/providers/smooth/actions.js +138 -0
  312. package/src/providers/smooth/executors.d.ts +4 -0
  313. package/src/providers/smooth/executors.js +102 -0
  314. package/src/providers/tapd/actions.d.ts +8 -0
  315. package/src/providers/tapd/actions.js +89 -0
  316. package/src/providers/tapd/executors.d.ts +4 -0
  317. package/src/providers/tapd/executors.js +137 -0
  318. package/src/providers/teable/runtime.js +12 -15
  319. package/src/providers/tencent_meeting_mcp/actions.d.ts +2 -0
  320. package/src/providers/tencent_meeting_mcp/actions.js +420 -0
  321. package/src/providers/tencent_meeting_mcp/executors.d.ts +4 -0
  322. package/src/providers/tencent_meeting_mcp/executors.js +117 -0
  323. package/src/providers/threatfox/executors.d.ts +4 -0
  324. package/src/providers/threatfox/executors.js +40 -0
  325. package/src/providers/threatfox/runtime.d.ts +15 -0
  326. package/src/providers/threatfox/runtime.js +128 -0
  327. package/src/providers/ticket_tailor/runtime.js +1 -1
  328. package/src/providers/ticketmaster/runtime.js +3 -6
  329. package/src/providers/timelinesai/runtime.js +13 -16
  330. package/src/providers/tradebee/actions.d.ts +2 -0
  331. package/src/providers/tradebee/actions.js +176 -0
  332. package/src/providers/tradebee/executors.d.ts +4 -0
  333. package/src/providers/tradebee/executors.js +83 -0
  334. package/src/providers/twittrapi/executors.d.ts +4 -0
  335. package/src/providers/twittrapi/executors.js +17 -0
  336. package/src/providers/twittrapi/runtime.d.ts +12 -0
  337. package/src/providers/twittrapi/runtime.js +203 -0
  338. package/src/providers/urlhaus/executors.d.ts +4 -0
  339. package/src/providers/urlhaus/executors.js +40 -0
  340. package/src/providers/urlhaus/runtime.d.ts +15 -0
  341. package/src/providers/urlhaus/runtime.js +142 -0
  342. package/src/providers/wangdian/runtime.js +16 -19
  343. package/src/providers/weread/actions.d.ts +2 -0
  344. package/src/providers/weread/actions.js +424 -0
  345. package/src/providers/weread/executors.d.ts +4 -0
  346. package/src/providers/weread/executors.js +98 -0
  347. package/src/providers/whatsapp/runtime.js +6 -1
  348. package/src/providers/workast/runtime.js +12 -17
  349. package/src/providers/youzan/runtime.js +21 -24
  350. package/src/providers/zenkit/runtime.js +13 -19
  351. package/src/providers/zhiliaobiaoxun/actions.d.ts +2 -0
  352. package/src/providers/zhiliaobiaoxun/actions.js +138 -0
  353. package/src/providers/zhiliaobiaoxun/executors.d.ts +4 -0
  354. package/src/providers/zhiliaobiaoxun/executors.js +78 -0
  355. package/src/server/api/auth.d.ts +2 -0
  356. package/src/server/api/auth.js +2 -1
  357. package/src/server/api/console-catalog-routes.d.ts +17 -0
  358. package/src/server/api/console-catalog-routes.js +88 -0
  359. package/src/server/api/console-oauth-routes.d.ts +18 -0
  360. package/src/server/api/console-oauth-routes.js +298 -0
  361. package/src/server/api/docs-routes.d.ts +12 -0
  362. package/src/server/api/docs-routes.js +38 -0
  363. package/src/server/api/http-utils.d.ts +1 -0
  364. package/src/server/api/http-utils.js +8 -0
  365. package/src/server/api/marketplace-routes.d.ts +7 -0
  366. package/src/server/api/marketplace-routes.js +62 -0
  367. package/src/server/api/mcp-routes.d.ts +18 -0
  368. package/src/server/api/mcp-routes.js +37 -0
  369. package/src/server/api/policy-routes.d.ts +13 -0
  370. package/src/server/api/policy-routes.js +50 -0
  371. package/src/server/api/policy-snapshot.d.ts +14 -0
  372. package/src/server/api/policy-snapshot.js +30 -0
  373. package/src/server/api/run-log-routes.d.ts +7 -0
  374. package/src/server/api/run-log-routes.js +70 -0
  375. package/src/server/api/runtime-api.d.ts +0 -7
  376. package/src/server/api/runtime-api.js +0 -13
  377. package/src/server/api/runtime-app-routes.d.ts +10 -0
  378. package/src/server/api/runtime-app-routes.js +72 -0
  379. package/src/server/api/runtime-catalog-routes.d.ts +37 -0
  380. package/src/server/api/runtime-catalog-routes.js +133 -0
  381. package/src/server/api/runtime-execution-routes.d.ts +16 -0
  382. package/src/server/api/runtime-execution-routes.js +198 -0
  383. package/src/server/api/saas-oauth-routes.d.ts +9 -0
  384. package/src/server/api/saas-oauth-routes.js +27 -0
  385. package/src/server/api/saas-project-routes.d.ts +7 -0
  386. package/src/server/api/saas-project-routes.js +16 -0
  387. package/src/server/api/transit-file-routes.d.ts +9 -0
  388. package/src/server/api/transit-file-routes.js +49 -0
  389. package/src/server/api/trigger-routes.d.ts +15 -0
  390. package/src/server/api/trigger-routes.js +48 -0
  391. package/src/server/connect-app.d.ts +1 -0
  392. package/src/server/connect-app.js +3 -1
  393. package/src/server/connect-server.d.ts +3 -54
  394. package/src/server/connect-server.js +95 -1148
  395. package/src/providers/fastmoss_mcp/official-tools.json +0 -2922
@@ -0,0 +1,64 @@
1
+ import { recordOrEmpty } from "../../core/cast.js";
2
+ import { providerInputError } from "../provider-runtime.js";
3
+ import { queryPath, segment } from "./context.js";
4
+ function invocablePath(d, base, detail) {
5
+ if (d.category === "standard" && d.actionType !== undefined)
6
+ throw providerInputError("actionType is only valid for custom actions");
7
+ if (d.category === "custom" && detail && !d.actionType)
8
+ throw providerInputError("Custom actions require actionType");
9
+ return `${base}/actions/${segment(d.category)}${d.actionType ? `/${segment(d.actionType)}` : ""}${detail ? `/${segment(d.actionName)}` : ""}`;
10
+ }
11
+ async function sendEmail(d, c) {
12
+ const email = recordOrEmpty(d.email);
13
+ const recipients = [email.recipientAddresses, email.ccAddresses, email.bccAddresses].reduce((sum, list) => sum + (Array.isArray(list) ? list.length : 0), email.recipientId ? 1 : 0);
14
+ if (!recipients || recipients > 150)
15
+ throw providerInputError("Email requires between 1 and 150 recipients");
16
+ if (email.senderType === "OrgWideEmailAddress" && !email.senderAddress)
17
+ throw providerInputError("OrgWideEmailAddress requires senderAddress");
18
+ if (email.logEmailOnSend && !email.recipientId && !email.relatedRecordId)
19
+ throw providerInputError("logEmailOnSend requires recipientId or relatedRecordId");
20
+ return c.items(`${c.base}/actions/standard/emailSimple`, "POST", { inputs: [email] });
21
+ }
22
+ export const salesforceAutomationHandlers = {
23
+ async list_email_templates(d, c) {
24
+ const filters = [
25
+ d.includeInactive ? undefined : "IsActive = true",
26
+ d.folderId ? `FolderId = '${String(d.folderId)}'` : undefined,
27
+ ].filter(Boolean);
28
+ const q = `SELECT Id, Name, DeveloperName, Subject, TemplateType, FolderId, IsActive FROM EmailTemplate${filters.length ? ` WHERE ${filters.join(" AND ")}` : ""} ORDER BY Name LIMIT ${d.limit ?? 200}`;
29
+ return c.object(queryPath(`${c.base}/query`, { q }));
30
+ },
31
+ async get_email_template(d, c) {
32
+ return {
33
+ record: await c.object(queryPath(`${c.base}/sobjects/EmailTemplate/${segment(d.templateId)}`, {
34
+ fields: "Id,Name,DeveloperName,Subject,Body,HtmlValue,TemplateType,FolderId,IsActive",
35
+ })),
36
+ };
37
+ },
38
+ send_email: sendEmail,
39
+ send_email_from_template: sendEmail,
40
+ async list_invocable_actions(d, c) {
41
+ return { result: await c.request(invocablePath(d, c.base, false)) };
42
+ },
43
+ async describe_invocable_action(d, c) {
44
+ return { result: await c.request(invocablePath(d, c.base, true)) };
45
+ },
46
+ async invoke_action(d, c) {
47
+ return c.items(invocablePath(d, c.base, true), "POST", { inputs: d.inputs });
48
+ },
49
+ async list_quick_actions(d, c) {
50
+ return {
51
+ result: await c.request(`${c.base}${d.objectName ? `/sobjects/${segment(d.objectName)}` : ""}/quickActions/`),
52
+ };
53
+ },
54
+ async get_quick_action_defaults(d, c) {
55
+ return {
56
+ result: await c.request(`${c.base}/sobjects/${segment(d.objectName)}/quickActions/${segment(d.actionName)}/defaultValues/${d.contextId ? segment(d.contextId) : ""}`),
57
+ };
58
+ },
59
+ async execute_quick_action(d, c) {
60
+ return {
61
+ result: await c.request(`${c.base}${d.objectName ? `/sobjects/${segment(d.objectName)}` : ""}/quickActions/${segment(d.actionName)}`, "POST", { contextId: d.contextId, record: d.fields }),
62
+ };
63
+ },
64
+ };
@@ -0,0 +1,2 @@
1
+ import type { SalesforceHandler } from "./context.ts";
2
+ export declare const salesforceBaseHandlers: Record<string, SalesforceHandler>;
@@ -0,0 +1,51 @@
1
+ import { requiredResponseRecord } from "../provider-runtime.js";
2
+ import { queryPath, segment } from "./context.js";
3
+ import { salesforceRequest } from "./transport.js";
4
+ export const salesforceBaseHandlers = {
5
+ async list_objects(_d, c) {
6
+ return c.object(`${c.base}/sobjects/`);
7
+ },
8
+ async describe_object(d, c) {
9
+ return c.object(`${c.base}/sobjects/${segment(d.objectName)}/describe`);
10
+ },
11
+ async query(d, c) {
12
+ const headers = new Headers({ authorization: `Bearer ${c.accessToken}` });
13
+ if (d.batchSize !== undefined)
14
+ headers.set("Sforce-Query-Options", `batchSize=${d.batchSize}`);
15
+ return requiredResponseRecord((await salesforceRequest(new URL(queryPath(`${c.base}/${d.includeDeleted ? "queryAll" : "query"}`, { q: d.soql }), c.origin), { headers }, c.fetcher, c.signal)).body, "Salesforce query");
16
+ },
17
+ async query_more(d, c) {
18
+ const headers = new Headers({ authorization: `Bearer ${c.accessToken}` });
19
+ if (d.batchSize !== undefined)
20
+ headers.set("Sforce-Query-Options", `batchSize=${d.batchSize}`);
21
+ return requiredResponseRecord((await salesforceRequest(new URL(String(d.nextRecordsUrl), c.origin), { headers }, c.fetcher, c.signal)).body, "Salesforce query");
22
+ },
23
+ async get_record(d, c) {
24
+ return {
25
+ record: await c.object(queryPath(`${c.base}/sobjects/${segment(d.objectName)}/${segment(d.recordId)}`, { fields: d.fields })),
26
+ };
27
+ },
28
+ async create_record(d, c) {
29
+ return c.object(`${c.base}/sobjects/${segment(d.objectName)}`, "POST", d.fields);
30
+ },
31
+ async update_record(d, c) {
32
+ const result = await c.request(`${c.base}/sobjects/${segment(d.objectName)}/${segment(d.recordId)}`, "PATCH", d.fields);
33
+ return result === undefined
34
+ ? { success: true, id: d.recordId }
35
+ : requiredResponseRecord(result, "Salesforce response");
36
+ },
37
+ async delete_record(d, c) {
38
+ const result = await c.request(`${c.base}/sobjects/${segment(d.objectName)}/${segment(d.recordId)}`, "DELETE");
39
+ return result === undefined
40
+ ? { success: true, id: d.recordId }
41
+ : requiredResponseRecord(result, "Salesforce response");
42
+ },
43
+ async upsert_record(d, c) {
44
+ const result = await c.request(queryPath(`${c.base}/sobjects/${segment(d.objectName)}/${segment(d.externalIdField)}/${segment(d.externalId)}`, {
45
+ updateOnly: d.updateOnly,
46
+ }), "PATCH", d.fields);
47
+ return result === undefined
48
+ ? { success: true, created: false }
49
+ : requiredResponseRecord(result, "Salesforce response");
50
+ },
51
+ };
@@ -0,0 +1,2 @@
1
+ import type { SalesforceHandler } from "./context.ts";
2
+ export declare const salesforceBulkHandlers: Record<string, SalesforceHandler>;
@@ -0,0 +1,98 @@
1
+ import { recordOrEmpty, requiredString } from "../../core/cast.js";
2
+ import { providerInputError, providerResponseError, ProviderRequestError } from "../provider-runtime.js";
3
+ import { queryPath, segment } from "./context.js";
4
+ import { downloadSalesforceSource, requireSalesforceTransit, saveSalesforceDownload } from "./media.js";
5
+ function jobResult(job, kind, version) {
6
+ return {
7
+ handle: { jobId: requiredString(job.id, "Bulk job ID", providerResponseError), kind, apiVersion: version },
8
+ state: requiredString(job.state, "Bulk job state", providerResponseError),
9
+ job,
10
+ };
11
+ }
12
+ function jobPath(handle) {
13
+ return `/services/data/v${segment(handle.apiVersion)}/jobs/${segment(handle.kind)}/${segment(handle.jobId)}`;
14
+ }
15
+ async function readJob(d, c) {
16
+ const handle = recordOrEmpty(d.handle);
17
+ const job = await c.object(jobPath(handle));
18
+ return { ...jobResult(job, String(handle.kind), String(handle.apiVersion)), path: jobPath(handle) };
19
+ }
20
+ export const salesforceBulkHandlers = {
21
+ async submit_bulk_query(d, c) {
22
+ return jobResult(await c.object(`${c.base}/jobs/query`, "POST", {
23
+ operation: d.includeDeleted ? "queryAll" : "query",
24
+ query: d.soql,
25
+ contentType: "CSV",
26
+ columnDelimiter: d.columnDelimiter,
27
+ lineEnding: d.lineEnding,
28
+ }), "query", c.version);
29
+ },
30
+ async get_bulk_query_result(d, c) {
31
+ const { path, ...output } = await readJob(d, c);
32
+ if (output.state !== "JobComplete" || d.download === false)
33
+ return output;
34
+ requireSalesforceTransit(c);
35
+ const downloaded = await c.response(queryPath(`${path}/results`, { locator: d.locator, maxRecords: d.maxRecords }), { headers: { accept: "text/csv" } }, async (response, signal) => {
36
+ const locator = response.headers.get("Sforce-Locator");
37
+ if (!locator) {
38
+ await response.body?.cancel();
39
+ throw providerResponseError("Salesforce query results are missing Sforce-Locator; pagination completeness is unknown");
40
+ }
41
+ const count = response.headers.get("Sforce-NumberOfRecords");
42
+ const result = await saveSalesforceDownload(c, response, `${output.handle.jobId}.csv`, "text/csv", signal);
43
+ return {
44
+ result,
45
+ nextLocator: locator === "null" ? null : locator,
46
+ numberOfRecords: count !== null && Number.isFinite(Number(count)) ? Number(count) : undefined,
47
+ };
48
+ });
49
+ return { ...output, ...downloaded };
50
+ },
51
+ async submit_bulk_ingest(d, c) {
52
+ if (d.operation === "upsert" && !d.externalIdField)
53
+ throw providerInputError("Bulk upsert requires externalIdField");
54
+ const source = await downloadSalesforceSource(String(d.csvUrl), 100_000_000, c);
55
+ let created;
56
+ try {
57
+ created = await c.object(`${c.base}/jobs/ingest`, "POST", {
58
+ object: d.objectName,
59
+ operation: d.operation,
60
+ contentType: "CSV",
61
+ externalIdFieldName: d.externalIdField,
62
+ assignmentRuleId: d.assignmentRuleId,
63
+ columnDelimiter: d.columnDelimiter,
64
+ lineEnding: d.lineEnding,
65
+ });
66
+ const id = requiredString(created.id, "Bulk job ID", providerResponseError);
67
+ await c.response(`${c.base}/jobs/ingest/${segment(id)}/batches`, {
68
+ method: "PUT",
69
+ headers: { "content-type": "text/csv", "content-length": String(source.sizeBytes) },
70
+ body: source.body,
71
+ }, async (response) => {
72
+ await response.body?.cancel();
73
+ });
74
+ return jobResult(await c.object(`${c.base}/jobs/ingest/${segment(id)}`, "PATCH", { state: "UploadComplete" }), "ingest", c.version);
75
+ }
76
+ catch (error) {
77
+ if (!created)
78
+ throw error;
79
+ throw new ProviderRequestError(error instanceof ProviderRequestError ? error.status : 502, `Salesforce ingest job ${String(created.id)} was created but submission failed. Inspect or cancel this ingest job with API ${c.version} before resubmitting. ${error instanceof Error ? error.message : "Unknown failure"}`, undefined, error instanceof ProviderRequestError ? error.code : "provider_error");
80
+ }
81
+ finally {
82
+ await source.cleanup();
83
+ }
84
+ },
85
+ async get_bulk_ingest_result(d, c) {
86
+ const { path, ...output } = await readJob(d, c);
87
+ if (!["JobComplete", "Failed", "Aborted"].includes(output.state) || d.download === false)
88
+ return output;
89
+ requireSalesforceTransit(c);
90
+ const type = String(d.resultType ?? (output.state === "JobComplete" ? "failedResults" : "unprocessedrecords"));
91
+ const result = await c.response(`${path}/${type}`, { headers: { accept: "text/csv" } }, (response, signal) => saveSalesforceDownload(c, response, `${output.handle.jobId}-${type}.csv`, "text/csv", signal));
92
+ return { ...output, result };
93
+ },
94
+ async cancel_bulk_job(d, c) {
95
+ const handle = recordOrEmpty(d.handle);
96
+ return jobResult(await c.object(jobPath(handle), "PATCH", { state: "Aborted" }), String(handle.kind), String(handle.apiVersion));
97
+ },
98
+ };
@@ -0,0 +1,2 @@
1
+ import type { SalesforceHandler } from "./context.ts";
2
+ export declare const salesforceDataHandlers: Record<string, SalesforceHandler>;
@@ -0,0 +1,207 @@
1
+ import { recordOrEmpty } from "../../core/cast.js";
2
+ import { providerInputError } from "../provider-runtime.js";
3
+ import { requiredResponseRecord } from "../provider-runtime.js";
4
+ import { queryPath, segment } from "./context.js";
5
+ import { salesforceRequest, salesforceOrigin } from "./transport.js";
6
+ function rejectReservedFields(fields) {
7
+ if (Object.keys(fields).some((key) => ["attributes", "id"].includes(key.toLowerCase())))
8
+ throw providerInputError("Use recordId and objectName instead of fields.Id or fields.attributes");
9
+ }
10
+ function validateComposite(requests, graph) {
11
+ const references = new Set();
12
+ let collectionQueries = 0;
13
+ for (const request of requests) {
14
+ if (Object.keys(recordOrEmpty(request.httpHeaders)).some((header) => ["accept", "authorization", "content-type"].includes(header.toLowerCase())))
15
+ throw providerInputError("Composite subrequests inherit Accept, Authorization and Content-Type; do not override them");
16
+ const ref = String(request.referenceId);
17
+ if (references.has(ref))
18
+ throw providerInputError("Composite reference IDs must be unique");
19
+ references.add(ref);
20
+ const path = String(request.url);
21
+ const resourcePath = path.split("?")[0];
22
+ const parts = resourcePath.split("/");
23
+ if (!path.startsWith("/services/data/v") ||
24
+ parts.length < 5 ||
25
+ path.includes("\\") ||
26
+ path.includes("#") ||
27
+ parts.slice(4).some((part) => {
28
+ try {
29
+ const decoded = decodeURIComponent(part);
30
+ return decoded === "." || decoded === "..";
31
+ }
32
+ catch {
33
+ return true;
34
+ }
35
+ }))
36
+ throw providerInputError("Invalid composite resource URL");
37
+ const resource = parts[4]?.split("?")[0];
38
+ const collection = resource === "composite" && parts[5]?.split("?")[0] === "sobjects";
39
+ if (resource !== "sobjects" && (graph || (!collection && resource !== "query" && resource !== "queryAll")))
40
+ throw providerInputError("Resource is not supported by Salesforce Composite");
41
+ if (collection || resource === "query" || resource === "queryAll")
42
+ collectionQueries++;
43
+ }
44
+ if (!graph && collectionQueries > 5)
45
+ throw providerInputError("Composite allows at most five queries or collections");
46
+ }
47
+ function validateTree(records, rootType) {
48
+ let count = 0;
49
+ const types = new Set();
50
+ const refs = new Set();
51
+ function visit(nodes, depth, root) {
52
+ if (depth > 5)
53
+ throw providerInputError("Record trees support at most five levels");
54
+ for (const node of nodes) {
55
+ const record = recordOrEmpty(node);
56
+ const attrs = recordOrEmpty(record.attributes);
57
+ if (typeof attrs.type !== "string" ||
58
+ typeof attrs.referenceId !== "string" ||
59
+ !attrs.referenceId ||
60
+ (root && attrs.type !== rootType))
61
+ throw providerInputError("Tree records require attributes.type and referenceId; root type must match objectName");
62
+ if (refs.has(attrs.referenceId))
63
+ throw providerInputError("Tree reference IDs must be unique");
64
+ refs.add(attrs.referenceId);
65
+ types.add(attrs.type);
66
+ count++;
67
+ if (count > 200 || types.size > 5)
68
+ throw providerInputError("Record trees allow 200 records and five object types");
69
+ for (const value of Object.values(record)) {
70
+ const nested = recordOrEmpty(value);
71
+ if (Array.isArray(nested.records))
72
+ visit(nested.records, depth + 1, false);
73
+ }
74
+ }
75
+ }
76
+ visit(records, 1, true);
77
+ }
78
+ export const salesforceDataHandlers = {
79
+ async search_records(d, c) {
80
+ return c.object(queryPath(`${c.base}/search`, { q: d.sosl }));
81
+ },
82
+ async parameterized_search(d, c) {
83
+ return c.object(`${c.base}/parameterizedSearch`, "POST", d.request);
84
+ },
85
+ async get_record_by_external_id(d, c) {
86
+ return {
87
+ record: await c.object(queryPath(`${c.base}/sobjects/${segment(d.objectName)}/${segment(d.externalIdField)}/${segment(d.externalId)}`, { fields: d.fields })),
88
+ };
89
+ },
90
+ async get_related_records(d, c) {
91
+ return {
92
+ result: await c.request(queryPath(`${c.base}/sobjects/${segment(d.objectName)}/${segment(d.recordId)}/${d.relationships.map(segment).join("/")}`, { fields: d.fields })),
93
+ };
94
+ },
95
+ async list_updated_records(d, c) {
96
+ validateWindow(d);
97
+ return c.object(queryPath(`${c.base}/sobjects/${segment(d.objectName)}/updated/`, {
98
+ start: d.start,
99
+ end: d.end,
100
+ }));
101
+ },
102
+ async list_deleted_records(d, c) {
103
+ validateWindow(d);
104
+ return c.object(queryPath(`${c.base}/sobjects/${segment(d.objectName)}/deleted/`, {
105
+ start: d.start,
106
+ end: d.end,
107
+ }));
108
+ },
109
+ async get_record_counts(d, c) {
110
+ return c.object(queryPath(`${c.base}/limits/recordCount`, { sObjects: d.objectNames }));
111
+ },
112
+ async get_records(d, c) {
113
+ return c.items(`${c.base}/composite/sobjects/${segment(d.objectName)}`, "POST", {
114
+ recordIds: d.recordIds,
115
+ fieldNames: d.fields,
116
+ });
117
+ },
118
+ async create_records(d, c) {
119
+ return collectionWrite(d, c, false);
120
+ },
121
+ async update_records(d, c) {
122
+ return collectionWrite(d, c, true);
123
+ },
124
+ async upsert_records(d, c) {
125
+ const records = d.records.map((fields) => {
126
+ rejectReservedFields(fields);
127
+ if (!Object.hasOwn(fields, String(d.externalIdField)))
128
+ throw providerInputError("Each upsert record must contain the external ID field");
129
+ return { ...fields, attributes: { type: d.objectName } };
130
+ });
131
+ return c.items(`${c.base}/composite/sobjects/${segment(d.objectName)}/${segment(d.externalIdField)}`, "PATCH", {
132
+ records,
133
+ allOrNone: d.allOrNone,
134
+ });
135
+ },
136
+ async delete_records(d, c) {
137
+ return c.items(queryPath(`${c.base}/composite/sobjects`, { ids: d.recordIds, allOrNone: d.allOrNone }), "DELETE");
138
+ },
139
+ async create_record_tree(d, c) {
140
+ validateTree(d.records, String(d.objectName));
141
+ return c.object(`${c.base}/composite/tree/${segment(d.objectName)}`, "POST", {
142
+ records: d.records,
143
+ });
144
+ },
145
+ async execute_composite(d, c) {
146
+ validateComposite(d.requests, false);
147
+ return c.object(`${c.base}/composite`, "POST", {
148
+ compositeRequest: d.requests,
149
+ allOrNone: d.allOrNone,
150
+ collateSubrequests: d.collateSubrequests,
151
+ });
152
+ },
153
+ async execute_composite_graph(d, c) {
154
+ const graphs = d.graphs;
155
+ if (new Set(graphs.map((g) => g.graphId)).size !== graphs.length ||
156
+ graphs.reduce((sum, g) => sum + g.compositeRequest.length, 0) > 500)
157
+ throw providerInputError("Graphs require unique IDs and at most 500 total subrequests");
158
+ for (const graph of graphs)
159
+ validateComposite(graph.compositeRequest, true);
160
+ return c.object(`${c.base}/composite/graph`, "POST", { graphs });
161
+ },
162
+ async list_list_views(d, c) {
163
+ return c.object(`${c.base}/sobjects/${segment(d.objectName)}/listviews`);
164
+ },
165
+ async describe_list_view(d, c) {
166
+ return c.object(`${c.base}/sobjects/${segment(d.objectName)}/listviews/${segment(d.listViewId)}/describe`);
167
+ },
168
+ async get_list_view_records(d, c) {
169
+ return c.object(queryPath(`${c.base}/sobjects/${segment(d.objectName)}/listviews/${segment(d.listViewId)}/results`, {
170
+ limit: d.limit,
171
+ offset: d.offset,
172
+ }));
173
+ },
174
+ async get_picklist_values(d, c) {
175
+ return c.object(`${c.base}/ui-api/object-info/${segment(d.objectName)}/picklist-values/${segment(d.recordTypeId)}`);
176
+ },
177
+ async get_current_user(_d, c) {
178
+ const url = new URL(String(c.providerSecret?.identityUrl));
179
+ salesforceOrigin(url.origin, "identityUrl");
180
+ return {
181
+ user: requiredResponseRecord((await salesforceRequest(url, { headers: { authorization: `Bearer ${c.accessToken}` } }, c.fetcher, c.signal))
182
+ .body, "Salesforce identity"),
183
+ };
184
+ },
185
+ async get_org_limits(_d, c) {
186
+ return { limits: await c.object(`${c.base}/limits`) };
187
+ },
188
+ };
189
+ function validateWindow(d) {
190
+ if (Date.parse(String(d.start)) >= Date.parse(String(d.end)))
191
+ throw providerInputError("start must precede end");
192
+ }
193
+ async function collectionWrite(d, c, update) {
194
+ const records = d.records.map((entry) => {
195
+ const fields = recordOrEmpty(entry.fields);
196
+ rejectReservedFields(fields);
197
+ return {
198
+ ...fields,
199
+ attributes: { type: entry.objectName },
200
+ Id: update ? entry.recordId : undefined,
201
+ };
202
+ });
203
+ return c.items(`${c.base}/composite/sobjects`, update ? "PATCH" : "POST", {
204
+ records,
205
+ allOrNone: d.allOrNone,
206
+ });
207
+ }
@@ -0,0 +1,2 @@
1
+ import type { SalesforceHandler } from "./context.ts";
2
+ export declare const salesforceFileHandlers: Record<string, SalesforceHandler>;
@@ -0,0 +1,108 @@
1
+ import { recordOrEmpty, optionalString, requiredString } from "../../core/cast.js";
2
+ import { providerInputError, providerResponseError, requiredResponseRecord } from "../provider-runtime.js";
3
+ import { queryPath, segment } from "./context.js";
4
+ import { downloadSalesforceSource, requireSalesforceTransit, saveSalesforceDownload } from "./media.js";
5
+ export const salesforceFileHandlers = {
6
+ async upload_file(d, c) {
7
+ const filename = String(d.filename);
8
+ if (["\r", "\n", "\0", '"', "\\", "/"].some((char) => filename.includes(char)) ||
9
+ filename === "." ||
10
+ filename === "..")
11
+ throw providerInputError("filename must be a plain file name without header control characters");
12
+ const metadata = recordOrEmpty(d.metadata);
13
+ if (Object.keys(metadata).some((key) => ["versiondata", "id", "attributes"].includes(key.toLowerCase())))
14
+ throw providerInputError("metadata cannot include VersionData, Id or attributes");
15
+ const source = await downloadSalesforceSource(String(d.fileUrl), 2 * 1024 ** 3, c);
16
+ const boundary = `salesforce-${Array.from(crypto.getRandomValues(new Uint8Array(16)), (byte) => byte.toString(16).padStart(2, "0")).join("")}`;
17
+ const encoder = new TextEncoder();
18
+ const prefix = encoder.encode(`--${boundary}\r\nContent-Disposition: form-data; name="entity_content"\r\nContent-Type: application/json\r\n\r\n${JSON.stringify({ Title: filename, PathOnClient: filename, ...metadata })}\r\n--${boundary}\r\nContent-Disposition: form-data; name="VersionData"; filename="${filename}"\r\nContent-Type: application/octet-stream\r\n\r\n`);
19
+ const suffix = encoder.encode(`\r\n--${boundary}--\r\n`);
20
+ const reader = source.body.getReader();
21
+ let started = false;
22
+ const body = new ReadableStream({
23
+ async pull(controller) {
24
+ if (!started) {
25
+ started = true;
26
+ controller.enqueue(prefix);
27
+ return;
28
+ }
29
+ const chunk = await reader.read();
30
+ if (chunk.done) {
31
+ controller.enqueue(suffix);
32
+ controller.close();
33
+ reader.releaseLock();
34
+ }
35
+ else
36
+ controller.enqueue(chunk.value);
37
+ },
38
+ async cancel(reason) {
39
+ await reader.cancel(reason);
40
+ reader.releaseLock();
41
+ },
42
+ });
43
+ try {
44
+ return await c.response(`${c.base}/sobjects/ContentVersion`, {
45
+ method: "POST",
46
+ headers: {
47
+ "content-type": `multipart/form-data; boundary=${boundary}`,
48
+ "content-length": String(prefix.byteLength + source.sizeBytes + suffix.byteLength),
49
+ },
50
+ body,
51
+ }, async (response) => requiredResponseRecord(await response.json(), "ContentVersion result"));
52
+ }
53
+ finally {
54
+ await reader.cancel().catch(() => undefined);
55
+ reader.releaseLock();
56
+ await source.cleanup();
57
+ }
58
+ },
59
+ async get_file(d, c) {
60
+ return { record: await c.object(`${c.base}/sobjects/ContentDocument/${segment(d.fileId)}`) };
61
+ },
62
+ async download_file(d, c) {
63
+ requireSalesforceTransit(c);
64
+ const document = await c.object(queryPath(`${c.base}/sobjects/ContentDocument/${segment(d.fileId)}`, {
65
+ fields: "Id,Title,LatestPublishedVersionId,FileExtension",
66
+ }));
67
+ const versionId = d.versionId ?? requiredString(document.LatestPublishedVersionId, "latest file version ID", providerResponseError);
68
+ if (d.versionId) {
69
+ const version = await c.object(queryPath(`${c.base}/sobjects/ContentVersion/${segment(versionId)}`, { fields: "ContentDocumentId" }));
70
+ if (!sameSalesforceId(String(version.ContentDocumentId), String(d.fileId)))
71
+ throw providerInputError("versionId does not belong to fileId");
72
+ }
73
+ const extension = optionalString(document.FileExtension);
74
+ const name = `${optionalString(document.Title) ?? String(d.fileId)}${extension ? `.${extension}` : ""}`;
75
+ return c.response(`${c.base}/sobjects/ContentVersion/${segment(versionId)}/VersionData`, { method: "GET", headers: { accept: "application/octet-stream" } }, (response, signal) => saveSalesforceDownload(c, response, name, response.headers.get("content-type") ?? "application/octet-stream", signal));
76
+ },
77
+ async list_record_files(d, c) {
78
+ return c.object(queryPath(`${c.base}/query`, {
79
+ q: `SELECT Id, ContentDocumentId, LinkedEntityId, ShareType, Visibility, ContentDocument.Title, ContentDocument.LatestPublishedVersionId FROM ContentDocumentLink WHERE LinkedEntityId = '${d.recordId}'`,
80
+ }));
81
+ },
82
+ async list_file_shares(d, c) {
83
+ return c.object(queryPath(`${c.base}/query`, {
84
+ q: `SELECT Id, ContentDocumentId, LinkedEntityId, ShareType, Visibility FROM ContentDocumentLink WHERE ContentDocumentId = '${d.fileId}'`,
85
+ }));
86
+ },
87
+ async link_file(d, c) {
88
+ return c.object(`${c.base}/sobjects/ContentDocumentLink`, "POST", {
89
+ ContentDocumentId: d.fileId,
90
+ LinkedEntityId: d.recordId,
91
+ ShareType: d.shareType ?? "V",
92
+ Visibility: d.visibility,
93
+ });
94
+ },
95
+ async unlink_file(d, c) {
96
+ await c.request(`${c.base}/sobjects/ContentDocumentLink/${segment(d.linkId)}`, "DELETE");
97
+ return { success: true };
98
+ },
99
+ async delete_file(d, c) {
100
+ await c.request(`${c.base}/sobjects/ContentDocument/${segment(d.fileId)}`, "DELETE");
101
+ return { success: true };
102
+ },
103
+ };
104
+ function sameSalesforceId(left, right) {
105
+ return left.length === 18 && right.length === 18
106
+ ? left.toLowerCase() === right.toLowerCase()
107
+ : left.slice(0, 15) === right.slice(0, 15);
108
+ }
@@ -0,0 +1,9 @@
1
+ import { ProviderRequestError } from "../provider-runtime.ts";
2
+ export declare const salesforceFileRequestTimeoutMs = 300000;
3
+ export declare function salesforceOrigin(value: string, fieldName: string): string;
4
+ export declare function withSalesforceResponse<T>(url: URL, init: RequestInit, fetcher: typeof fetch, consume: (response: Response, signal: AbortSignal) => Promise<T>, timeoutMs?: number, parentSignal?: AbortSignal): Promise<T>;
5
+ export declare function readSalesforceError(response: Response): Promise<ProviderRequestError>;
6
+ export declare function salesforceRequest(url: URL, init: RequestInit, fetcher: typeof fetch, signal?: AbortSignal): Promise<{
7
+ status: number;
8
+ body: unknown;
9
+ }>;
@@ -0,0 +1,65 @@
1
+ import { optionalRecord, optionalString } from "../../core/cast.js";
2
+ import { assertPublicHttpUrl } from "../../core/request.js";
3
+ import { isAbortLikeError, providerInputError, providerResponseError, ProviderRequestError, providerUserAgent, runProviderRequest, } from "../provider-runtime.js";
4
+ // File transfers have a deliberate five-minute budget; JSON uses the shared default.
5
+ export const salesforceFileRequestTimeoutMs = 300_000;
6
+ export function salesforceOrigin(value, fieldName) {
7
+ const url = assertPublicHttpUrl(value, { fieldName, createError: providerInputError });
8
+ if (url.protocol !== "https:" ||
9
+ !url.hostname.endsWith(".salesforce.com") ||
10
+ url.port ||
11
+ url.username ||
12
+ url.password ||
13
+ url.pathname !== "/" ||
14
+ url.search ||
15
+ url.hash) {
16
+ throw providerInputError(`${fieldName} must be a Salesforce HTTPS origin`);
17
+ }
18
+ return url.origin;
19
+ }
20
+ export async function withSalesforceResponse(url, init, fetcher, consume, timeoutMs, parentSignal) {
21
+ return runProviderRequest({ label: "Salesforce", timeoutMs, signal: parentSignal }, async (signal) => {
22
+ const headers = new Headers(init.headers);
23
+ if (!headers.has("accept"))
24
+ headers.set("accept", "application/json");
25
+ headers.set("user-agent", providerUserAgent);
26
+ const request = {
27
+ ...init,
28
+ headers,
29
+ signal,
30
+ redirect: "manual",
31
+ duplex: init.body instanceof ReadableStream ? "half" : undefined,
32
+ };
33
+ const response = await fetcher(url, request);
34
+ if (!response.ok)
35
+ throw await readSalesforceError(response);
36
+ return consume(response, signal);
37
+ });
38
+ }
39
+ export async function readSalesforceError(response) {
40
+ const payload = await response.json().catch((error) => {
41
+ if (isAbortLikeError(error))
42
+ throw error;
43
+ return undefined;
44
+ });
45
+ const error = optionalRecord(Array.isArray(payload) ? payload[0] : payload);
46
+ const code = optionalString(error?.errorCode) ?? optionalString(error?.error);
47
+ const message = optionalString(error?.message) ?? optionalString(error?.error_description);
48
+ // INVALID_SESSION_ID proves only the access token expired, not the refresh token.
49
+ return new ProviderRequestError(response.status, ["Salesforce", code, message ?? `HTTP ${response.status}`].filter(Boolean).join(": "), { errorCode: code, errorDescription: message }, "provider_error");
50
+ }
51
+ export function salesforceRequest(url, init, fetcher, signal) {
52
+ return withSalesforceResponse(url, init, fetcher, async (response) => {
53
+ const text = response.status === 204 ? "" : await response.text();
54
+ let body;
55
+ if (text) {
56
+ try {
57
+ body = JSON.parse(text);
58
+ }
59
+ catch {
60
+ throw providerResponseError("Salesforce returned invalid JSON");
61
+ }
62
+ }
63
+ return { status: response.status, body };
64
+ }, undefined, signal);
65
+ }
@@ -0,0 +1,2 @@
1
+ import type { ActionDefinition } from "../../core/types.ts";
2
+ export declare const sansanActions: ActionDefinition[];