@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,59 @@
1
+ import { optionalString, recordOrEmpty } from "../../core/cast.js";
2
+ import { defineApiKeyProviderExecutors, defineProviderProxy, mapProviderActionHandlers, providerResponseError, requiredInputString, } from "../provider-runtime.js";
3
+ import { sansanActions } from "./actions.js";
4
+ import { sansanAdminHandlers } from "./admin.js";
5
+ import { sansanBusinessHandlers } from "./business.js";
6
+ import { sansanOrganizationHandlers } from "./organization.js";
7
+ import { executeSansanRead } from "./read.js";
8
+ import { readSansanError, requestSansanJson, sansanApiBaseUrl } from "./request.js";
9
+ const mutations = { ...sansanAdminHandlers, ...sansanBusinessHandlers, ...sansanOrganizationHandlers };
10
+ export const executors = defineApiKeyProviderExecutors("sansan", mapProviderActionHandlers("sansan", sansanActions, (action) => (input, context) => {
11
+ input = { ...input };
12
+ for (const field of [
13
+ "ownerUserId",
14
+ "businessCardId",
15
+ "personId",
16
+ "nextPageToken",
17
+ "departmentId",
18
+ "aclPatternId",
19
+ "aclPatternName",
20
+ "patternId",
21
+ "importId",
22
+ ]) {
23
+ if (input[field] !== undefined)
24
+ input[field] = requiredInputString(input[field], field);
25
+ }
26
+ for (const field of ["tagIds", "internalAttendeeUserIds"]) {
27
+ if (Array.isArray(input[field]))
28
+ input[field] = input[field].map((value) => requiredInputString(value, field));
29
+ }
30
+ if (Array.isArray(input.details))
31
+ input.details = input.details.map((value) => {
32
+ const detail = recordOrEmpty(value);
33
+ return {
34
+ ...detail,
35
+ objectDepartmentId: requiredInputString(detail.objectDepartmentId, "objectDepartmentId"),
36
+ accessibleFieldsSettingsName: requiredInputString(detail.accessibleFieldsSettingsName, "accessibleFieldsSettingsName"),
37
+ };
38
+ });
39
+ const handler = mutations[action.name];
40
+ return handler ? handler(input, context) : executeSansanRead(action.name, input, context);
41
+ }));
42
+ export const credentialValidators = {
43
+ async apiKey(input, { fetcher, signal }) {
44
+ const user = await requestSansanJson("/me", {}, { apiKey: input.apiKey, fetcher, signal, phase: "validate" });
45
+ const accountId = optionalString(user.id);
46
+ if (!accountId)
47
+ throw providerResponseError("Sansan user response is missing id");
48
+ return { profile: { accountId, displayName: optionalString(user.name) ?? accountId }, grantedScopes: [] };
49
+ },
50
+ };
51
+ export const proxy = defineProviderProxy({
52
+ service: "sansan",
53
+ baseUrl: sansanApiBaseUrl,
54
+ auth: { type: "api_key_header", name: "X-Sansan-Api-Key" },
55
+ readError: (response) => readSansanError(response),
56
+ customizeRequest({ headers }) {
57
+ headers.set("accept", "application/json");
58
+ },
59
+ });
@@ -0,0 +1,2 @@
1
+ import type { JsonSchema } from "../../core/types.ts";
2
+ export declare const sansanFileSchema: JsonSchema;
@@ -0,0 +1,8 @@
1
+ import { s } from "../../core/json-schema.js";
2
+ export const sansanFileSchema = s.actionOutput({
3
+ fileId: s.string("The stored transit file identifier."),
4
+ downloadUrl: s.string("The transit file download URL."),
5
+ name: s.string("The file name."),
6
+ mimeType: s.string("The file media type."),
7
+ sizeBytes: s.integer("The file size in bytes."),
8
+ }, "A downloaded file in local transit storage.");
@@ -0,0 +1,11 @@
1
+ import type { TransitFileUpload } from "../../core/types.ts";
2
+ import type { ApiKeyProviderContext } from "../provider-runtime.ts";
3
+ export declare function requireSansanTransit(context: ApiKeyProviderContext): void;
4
+ export declare function downloadSansanSource(url: string, fieldName: string, context: ApiKeyProviderContext, jpeg?: boolean): Promise<Uint8Array>;
5
+ interface SansanMultipart {
6
+ body: Uint8Array<ArrayBuffer>;
7
+ headers: Record<string, string>;
8
+ }
9
+ export declare function encodeSansanMultipart(form: FormData): Promise<SansanMultipart>;
10
+ export declare function uploadSansanDownload(response: Response, name: string, mimeType: string, context: ApiKeyProviderContext): Promise<TransitFileUpload>;
11
+ export {};
@@ -0,0 +1,49 @@
1
+ import { readBoundedResponseBytes, storeResponseInTransit } from "../../core/request.js";
2
+ import { providerInputError, ProviderRequestError, providerResponseError, runProviderRequest, } from "../provider-runtime.js";
3
+ export function requireSansanTransit(context) {
4
+ if (!context.transitFiles)
5
+ throw new ProviderRequestError(501, "Sansan downloads require transit file storage");
6
+ }
7
+ export async function downloadSansanSource(url, fieldName, context, jpeg = false) {
8
+ return runProviderRequest({ label: "Sansan source download", signal: context.signal }, async (signal) => {
9
+ const response = await context.fetcher(url, { signal });
10
+ if (!response.ok)
11
+ throw new ProviderRequestError(response.status, `Cannot download ${fieldName}`);
12
+ const bytes = await readBoundedResponseBytes(response, {
13
+ maxBytes: jpeg ? 5 * 1024 * 1024 : 20 * 1024 * 1024,
14
+ fieldName,
15
+ createError: providerInputError,
16
+ signal,
17
+ });
18
+ if (!bytes.length)
19
+ throw providerInputError(`${fieldName} is empty`);
20
+ if (jpeg && (bytes[0] !== 0xff || bytes[1] !== 0xd8 || bytes[2] !== 0xff))
21
+ throw providerInputError(`${fieldName} must contain a JPEG image`);
22
+ return bytes;
23
+ });
24
+ }
25
+ export async function encodeSansanMultipart(form) {
26
+ // Organization imports require a trailing CRLF and an explicit Content-Length.
27
+ const response = new Response(form);
28
+ const bytes = new Uint8Array(await response.arrayBuffer());
29
+ const hasCrLf = bytes.at(-2) === 13 && bytes.at(-1) === 10;
30
+ const body = hasCrLf ? bytes : new Uint8Array(bytes.length + 2);
31
+ if (!hasCrLf) {
32
+ body.set(bytes);
33
+ body.set([13, 10], bytes.length);
34
+ }
35
+ return {
36
+ body,
37
+ headers: { "content-type": response.headers.get("content-type"), "content-length": String(body.byteLength) },
38
+ };
39
+ }
40
+ export function uploadSansanDownload(response, name, mimeType, context) {
41
+ requireSansanTransit(context);
42
+ return storeResponseInTransit(response, context.transitFiles, {
43
+ name,
44
+ mimeType: response.headers.get("content-type") || mimeType,
45
+ fieldName: "Sansan download",
46
+ createError: providerResponseError,
47
+ signal: context.signal,
48
+ });
49
+ }
@@ -0,0 +1,2 @@
1
+ import type { ActionDefinition } from "../../core/types.ts";
2
+ export declare const sansanOrganizationActions: ActionDefinition[];
@@ -0,0 +1,198 @@
1
+ import { s } from "../../core/json-schema.js";
2
+ import { defineProviderAction } from "../../core/provider-definition.js";
3
+ import { sansanFileSchema } from "./file-schema.js";
4
+ const organizationImportInputSchema = {
5
+ ...s.object("Users and/or departments to check or import. System administrator only.", {
6
+ users: s.array("Structured user rows; Connector builds the official CSV, preserving all columns. Mutually exclusive with usersFileUrl.", s.object("A user import row using official Sansan CSV columns. Submission requires DepartmentId, UserId, UserName and Email; new users also require TempId and EffectiveDateFrom, while existing users require UserUuid. Blank optional cells preserve unchanged values when editing.", {
7
+ TempId: s.string("Temporary alphanumeric ID for a new user; blank when editing. Must be unique within the file.", { maxLength: 256 }),
8
+ UserUuid: s.string("Existing user UUID when editing; blank for a new user."),
9
+ DepartmentId: s.string("Department IDs separated by semicolons; use tempId:ID for a new department in the same import."),
10
+ UserId: s.string("Immutable user login ID, up to 20 characters; alphanumeric or .-_&.", { maxLength: 20 }),
11
+ UserName: s.string("User display name, up to 60 characters.", { maxLength: 60 }),
12
+ AlternativeName: s.string("User name reading.", { maxLength: 256 }),
13
+ Email: s.string("Unique primary user email within the company.", { maxLength: 60 }),
14
+ SubEmail: s.string("Secondary user email.", { maxLength: 60 }),
15
+ EffectiveDateFrom: s.string("Usage start date for new users, today or later in RFC3339 format; blank when unchanged during editing."),
16
+ SamlNameId: s.string("Unique SAML Name ID within the company."),
17
+ Culture: s.integer("Display language: 0 Japanese, 1 English, 2 Simplified Chinese. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 2 }),
18
+ MailFormat: s.integer("Email format: 0 HTML, 1 text. Omission serializes as a blank CSV cell.", {
19
+ minimum: 0,
20
+ maximum: 1,
21
+ }),
22
+ UserType: s.integer("Role: 0 regular, 1 system administrator, 2 departmental administrator. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 2 }),
23
+ CanUpdateData: s.integer("Permission to update all data: 1 granted, 0 denied. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 1 }),
24
+ DataDownloadPrivilege: s.integer("Download permission: 0 none, 1 own data, 2 all data, 3 assigned departments. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 3 }),
25
+ EmailDeliveryPrivilege: s.integer("Email delivery permission: 1 granted, 0 denied. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 1 }),
26
+ DealPrivilege: s.integer("Deal permission: 0 none, 1 regular, 2 administrator. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 2 }),
27
+ ApiIntegrationPrivilege: s.integer("API integration permission: 1 granted, 0 denied. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 1 }),
28
+ UsageStatisticsPrivilege: s.integer("Usage statistics permission: 1 granted, 0 denied. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 1 }),
29
+ OrganizationTreeDownloadPrivilege: s.integer("Organization tree download permission: 1 granted, 0 denied. Omission serializes as a blank CSV cell.", { minimum: 0, maximum: 1 }),
30
+ DeleteFlag: s.integer("Set to 1 to delete the user. Omission serializes as a blank CSV cell.", {
31
+ minimum: 0,
32
+ maximum: 1,
33
+ }),
34
+ SalesforceIntegrationPrivilege: s.string("Retired field, ignored by Sansan; the CSV column is retained even when omitted."),
35
+ }, { required: [] }), { minItems: 1 }),
36
+ departments: s.array("Structured department rows. Mutually exclusive with departmentsFileUrl.", s.object("A department import row using official Sansan CSV columns. Submission requires DepartmentName and either TempId for creation or DepartmentId for editing; the other identifier must be blank or omitted.", {
37
+ TempId: s.string("Temporary alphanumeric ID for a new department; blank when editing.", { maxLength: 256 }),
38
+ DepartmentId: s.string("Existing department ID when editing; blank for a new department."),
39
+ DepartmentName: s.string("Department name.", { maxLength: 30 }),
40
+ DepartmentNamePhonetic: s.string("Department name reading using lowercase Latin letters, digits, and spaces.", { maxLength: 256 }),
41
+ ParentDepartmentId: s.string("Parent department ID or tempId:ID for a parent created in the same import; blank for no parent."),
42
+ Order: s.integer("Department sort order."),
43
+ DeleteFlag: s.integer("Set to 1 to delete the department; it must have no users or child departments.", {
44
+ minimum: 0,
45
+ maximum: 1,
46
+ }),
47
+ }, { required: [] }), { minItems: 1 }),
48
+ usersFileUrl: s.string("Public URL of a UTF-8 user CSV with a header row; maximum 20 MiB per source file.", {
49
+ format: "uri",
50
+ }),
51
+ departmentsFileUrl: s.string("Public URL of a UTF-8 department CSV with a header row; maximum 20 MiB per source file.", { format: "uri" }),
52
+ delimiter: s.stringEnum("CSV delimiter; defaults to comma.", ["comma", "semicolon", "tab", "space"]),
53
+ }, { required: [] }),
54
+ anyOf: [
55
+ { required: ["users"] },
56
+ { required: ["departments"] },
57
+ { required: ["usersFileUrl"] },
58
+ { required: ["departmentsFileUrl"] },
59
+ ],
60
+ allOf: [
61
+ { not: { required: ["users", "usersFileUrl"] } },
62
+ { not: { required: ["departments", "departmentsFileUrl"] } },
63
+ ],
64
+ };
65
+ // Checking accepts incomplete rows for upstream diagnostics; submission enforces creation and update rules.
66
+ const organizationSubmissionInputSchema = {
67
+ ...organizationImportInputSchema,
68
+ allOf: [
69
+ ...organizationImportInputSchema.allOf,
70
+ {
71
+ properties: {
72
+ users: {
73
+ items: {
74
+ required: ["DepartmentId", "UserId", "UserName", "Email"],
75
+ properties: {
76
+ DepartmentId: { minLength: 1 },
77
+ UserId: { minLength: 1 },
78
+ UserName: { minLength: 1 },
79
+ Email: { minLength: 1 },
80
+ },
81
+ oneOf: [
82
+ {
83
+ required: ["TempId", "EffectiveDateFrom"],
84
+ properties: {
85
+ TempId: { minLength: 1 },
86
+ UserUuid: { maxLength: 0 },
87
+ EffectiveDateFrom: { minLength: 1 },
88
+ },
89
+ },
90
+ {
91
+ required: ["UserUuid"],
92
+ properties: {
93
+ UserUuid: { minLength: 1 },
94
+ TempId: { maxLength: 0 },
95
+ },
96
+ },
97
+ ],
98
+ },
99
+ },
100
+ departments: {
101
+ items: {
102
+ required: ["DepartmentName"],
103
+ properties: { DepartmentName: { minLength: 1 } },
104
+ oneOf: [
105
+ {
106
+ required: ["TempId"],
107
+ properties: { TempId: { minLength: 1 }, DepartmentId: { maxLength: 0 } },
108
+ },
109
+ {
110
+ required: ["DepartmentId"],
111
+ properties: { DepartmentId: { minLength: 1 }, TempId: { maxLength: 0 } },
112
+ },
113
+ ],
114
+ },
115
+ },
116
+ },
117
+ },
118
+ ],
119
+ };
120
+ export const sansanOrganizationActions = [
121
+ defineProviderAction("sansan", {
122
+ name: "export_organization_users",
123
+ description: "Export Sansan organization users as a CSV download. System administrator only.",
124
+ operationType: "read",
125
+ requiredScopes: [],
126
+ inputSchema: s.object("User export options.", {
127
+ delimiter: s.stringEnum("CSV delimiter; defaults to comma.", ["comma", "semicolon", "tab", "space"]),
128
+ }, { required: [] }),
129
+ outputSchema: sansanFileSchema,
130
+ }),
131
+ defineProviderAction("sansan", {
132
+ name: "export_organization_departments",
133
+ description: "Export Sansan organization departments as a CSV download. System administrator only.",
134
+ operationType: "read",
135
+ requiredScopes: [],
136
+ inputSchema: s.object("Department export options.", {
137
+ delimiter: s.stringEnum("CSV delimiter; defaults to comma.", ["comma", "semicolon", "tab", "space"]),
138
+ }, { required: [] }),
139
+ outputSchema: sansanFileSchema,
140
+ }),
141
+ defineProviderAction("sansan", {
142
+ name: "check_organization_import",
143
+ description: "Validate user and department import data without applying changes. System administrator only; returns a downloadable CSV report if errors exist.",
144
+ operationType: "read",
145
+ requiredScopes: [],
146
+ inputSchema: organizationImportInputSchema,
147
+ outputSchema: s.object("Organization import validation result.", {
148
+ valid: s.boolean("Whether Sansan returned an empty validation response, indicating valid data."),
149
+ report: s.nullable(sansanFileSchema),
150
+ }, { required: ["valid", "report"] }),
151
+ }),
152
+ defineProviderAction("sansan", {
153
+ name: "submit_organization_import",
154
+ description: "Submit user and department additions, updates, or deletions. System administrator only. DeleteFlag can delete users or departments; preserve the import ID to retrieve results.",
155
+ operationType: "destructive",
156
+ requiredScopes: [],
157
+ inputSchema: organizationSubmissionInputSchema,
158
+ outputSchema: s.object("Submitted organization import.", {
159
+ importId: s.nonEmptyString("The submitted import job ID."),
160
+ }, { additionalProperties: true, required: ["importId"] }),
161
+ asyncLifecycle: {
162
+ startActionId: "sansan.submit_organization_import",
163
+ statusActionId: "sansan.get_organization_import_result",
164
+ },
165
+ }),
166
+ defineProviderAction("sansan", {
167
+ name: "get_organization_import_status",
168
+ description: "Get the current organization import status. System administrator only.",
169
+ operationType: "read",
170
+ requiredScopes: [],
171
+ inputSchema: s.object("Organization import job identifier.", {
172
+ importId: s.nonEmptyString("The import ID returned when the job was submitted."),
173
+ }, { required: ["importId"] }),
174
+ outputSchema: s.object("Organization import status.", {
175
+ importStatus: s.integer("Upstream import status: 0 queued, 1 running, 2 completed, 9 error."),
176
+ status: s.stringEnum("Normalized import status.", ["queued", "running", "completed", "failed"]),
177
+ }, { additionalProperties: true, required: ["importStatus", "status"] }),
178
+ }),
179
+ defineProviderAction("sansan", {
180
+ name: "get_organization_import_result",
181
+ description: "Check an organization import and return its result CSV when completed or failed. System administrator only. The report includes created IDs and row-level errors.",
182
+ operationType: "read",
183
+ requiredScopes: [],
184
+ inputSchema: s.object("Organization import job identifier.", {
185
+ importId: s.nonEmptyString("The import ID returned when the job was submitted."),
186
+ }, { required: ["importId"] }),
187
+ outputSchema: s.object("Organization import state and result report.", {
188
+ importId: s.nonEmptyString("The import ID."),
189
+ importStatus: s.integer("Upstream import status: 0 queued, 1 running, 2 completed, 9 error."),
190
+ status: s.stringEnum("Normalized import status.", ["queued", "running", "completed", "failed"]),
191
+ report: s.nullable(sansanFileSchema),
192
+ }, { additionalProperties: true, required: ["importId", "importStatus", "status", "report"] }),
193
+ asyncLifecycle: {
194
+ startActionId: "sansan.submit_organization_import",
195
+ statusActionId: "sansan.get_organization_import_result",
196
+ },
197
+ }),
198
+ ];
@@ -0,0 +1,2 @@
1
+ export declare const sansanUserColumns: readonly string[];
2
+ export declare const sansanDepartmentColumns: readonly string[];
@@ -0,0 +1,33 @@
1
+ export const sansanUserColumns = [
2
+ "TempId",
3
+ "UserUuid",
4
+ "DepartmentId",
5
+ "UserId",
6
+ "UserName",
7
+ "AlternativeName",
8
+ "Email",
9
+ "SubEmail",
10
+ "EffectiveDateFrom",
11
+ "Culture",
12
+ "MailFormat",
13
+ "SamlNameId",
14
+ "UserType",
15
+ "CanUpdateData",
16
+ "DataDownloadPrivilege",
17
+ "EmailDeliveryPrivilege",
18
+ "SalesforceIntegrationPrivilege",
19
+ "DealPrivilege",
20
+ "ApiIntegrationPrivilege",
21
+ "UsageStatisticsPrivilege",
22
+ "OrganizationTreeDownloadPrivilege",
23
+ "DeleteFlag",
24
+ ];
25
+ export const sansanDepartmentColumns = [
26
+ "TempId",
27
+ "DepartmentId",
28
+ "DepartmentName",
29
+ "DepartmentNamePhonetic",
30
+ "ParentDepartmentId",
31
+ "Order",
32
+ "DeleteFlag",
33
+ ];
@@ -0,0 +1,2 @@
1
+ import type { SansanActionHandler } from "./request.ts";
2
+ export declare const sansanOrganizationHandlers: Record<string, SansanActionHandler>;
@@ -0,0 +1,88 @@
1
+ import { optionalNumber, optionalString } from "../../core/cast.js";
2
+ import { providerResponseError, requiredResponseRecord } from "../provider-runtime.js";
3
+ import { downloadSansanSource, encodeSansanMultipart, requireSansanTransit, uploadSansanDownload } from "./files.js";
4
+ import { sansanDepartmentColumns, sansanUserColumns } from "./organization-columns.js";
5
+ import { requestSansan, requestSansanJson, sansanPathId } from "./request.js";
6
+ export const sansanOrganizationHandlers = {
7
+ async export_organization_users(input, context) {
8
+ return exportOrganization("users", input, context);
9
+ },
10
+ async export_organization_departments(input, context) {
11
+ return exportOrganization("departments", input, context);
12
+ },
13
+ async check_organization_import(input, context) {
14
+ const multipart = await buildOrganizationMultipart(input, context);
15
+ return requestSansan("/organization/check", { method: "POST", query: { delimiter: input.delimiter }, ...multipart }, context, async (response) => {
16
+ const csv = await response.text();
17
+ if (!csv.trim())
18
+ return { valid: true, report: null };
19
+ requireSansanTransit(context);
20
+ const report = await uploadSansanDownload(new Response(csv, { headers: { "content-type": "text/csv" } }), "sansan-import-validation.csv", "text/csv", context);
21
+ return { valid: false, report };
22
+ });
23
+ },
24
+ async submit_organization_import(input, context) {
25
+ const multipart = await buildOrganizationMultipart(input, context);
26
+ const result = await requestSansanJson("/organization/jobs", { method: "POST", query: { delimiter: input.delimiter }, ...multipart }, context);
27
+ if (!optionalString(result.importId))
28
+ throw providerResponseError("Sansan import response is missing importId");
29
+ return result;
30
+ },
31
+ async get_organization_import_status(input, context) {
32
+ return getImportStatus(input, context);
33
+ },
34
+ async get_organization_import_result(input, context) {
35
+ const result = await getImportStatus(input, context);
36
+ let report = null;
37
+ if (result.status === "completed" || result.status === "failed") {
38
+ requireSansanTransit(context);
39
+ const id = sansanPathId(input.importId, "importId");
40
+ report = await requestSansan(`/organization/jobs/${id}/result`, {}, context, (response) => uploadSansanDownload(response, "sansan-import-result.csv", "text/csv", context));
41
+ }
42
+ return { ...result, importId: input.importId, report };
43
+ },
44
+ };
45
+ async function exportOrganization(resource, input, context) {
46
+ requireSansanTransit(context);
47
+ return requestSansan(`/organization/${resource}`, { query: { delimiter: input.delimiter } }, context, (response) => uploadSansanDownload(response, `sansan-${resource}.csv`, "text/csv", context));
48
+ }
49
+ async function getImportStatus(input, context) {
50
+ const id = sansanPathId(input.importId, "importId");
51
+ const result = await requestSansanJson(`/organization/jobs/${id}`, {}, context);
52
+ const code = optionalNumber(result.importStatus);
53
+ const states = { 0: "queued", 1: "running", 2: "completed", 9: "failed" };
54
+ const status = code === undefined ? undefined : states[code];
55
+ if (!status)
56
+ throw providerResponseError("Sansan returned an unknown importStatus");
57
+ return { ...result, importStatus: code, status };
58
+ }
59
+ async function buildOrganizationMultipart(input, context) {
60
+ const form = new FormData();
61
+ const separators = { comma: ",", semicolon: ";", tab: "\t", space: " " };
62
+ const separator = separators[optionalString(input.delimiter) ?? "comma"];
63
+ for (const [field, part, columns] of [
64
+ ["users", "user", sansanUserColumns],
65
+ ["departments", "department", sansanDepartmentColumns],
66
+ ]) {
67
+ const urlField = `${field}FileUrl`;
68
+ if (input[urlField] !== undefined) {
69
+ const bytes = await downloadSansanSource(String(input[urlField]), urlField, context);
70
+ form.append(part, new Blob([bytes], { type: "text/csv" }), `${field}.csv`);
71
+ }
72
+ else if (Array.isArray(input[field])) {
73
+ const rows = input[field].map((row) => requiredResponseRecord(row, "Sansan import row"));
74
+ const csv = [
75
+ columns.join(separator),
76
+ ...rows.map((row) => columns.map((column) => csvCell(row[column], separator)).join(separator)),
77
+ ].join("\r\n") + "\r\n";
78
+ form.append(part, new Blob([csv], { type: "text/csv; charset=utf-8" }), `${field}.csv`);
79
+ }
80
+ }
81
+ return encodeSansanMultipart(form);
82
+ }
83
+ function csvCell(value, separator) {
84
+ const text = value === undefined || value === null ? "" : String(value);
85
+ return [separator, '"', "\r", "\n"].some((character) => text.includes(character))
86
+ ? `"${text.split('"').join('""')}"`
87
+ : text;
88
+ }
@@ -0,0 +1,2 @@
1
+ import type { SansanContext } from "./request.ts";
2
+ export declare function executeSansanRead(name: string, input: Record<string, unknown>, context: SansanContext): Promise<Record<string, unknown>>;
@@ -0,0 +1,25 @@
1
+ import { providerInputError } from "../provider-runtime.js";
2
+ import { normalizeSansanPage, requestSansanJson, sansanPageQuery, sansanPathId } from "./request.js";
3
+ const actionRoutes = {
4
+ get_current_user: { path: "/me" },
5
+ list_business_cards: { path: "/bizCards", list: true },
6
+ search_business_cards: { path: "/bizCards/search", list: true },
7
+ get_business_card: { path: "/bizCards/{id}", idField: "businessCardId" },
8
+ get_person: { path: "/persons/{id}", idField: "personId" },
9
+ list_business_card_tags: { path: "/bizCards/{id}/tags", idField: "businessCardId", list: true },
10
+ list_tags: { path: "/tags", list: true },
11
+ list_contact_reports: { path: "/reports", list: true },
12
+ };
13
+ export async function executeSansanRead(name, input, context) {
14
+ const route = actionRoutes[name];
15
+ if (!route)
16
+ throw providerInputError(`Unknown Sansan read action: ${name}`);
17
+ const query = { ...input };
18
+ let path = route.path;
19
+ if (route.idField) {
20
+ path = path.replace("{id}", sansanPathId(query[route.idField], route.idField));
21
+ delete query[route.idField];
22
+ }
23
+ const result = await requestSansanJson(path, { query: sansanPageQuery(query) }, context);
24
+ return route.list ? normalizeSansanPage(result) : result;
25
+ }
@@ -0,0 +1,22 @@
1
+ import type { ApiKeyProviderContext } from "../provider-runtime.ts";
2
+ import { ProviderRequestError } from "../provider-runtime.ts";
3
+ export declare const sansanApiBaseUrl = "https://api.sansan.com/v6.0";
4
+ export interface SansanContext extends ApiKeyProviderContext {
5
+ phase?: "validate" | "execute";
6
+ }
7
+ export type SansanActionHandler = (input: Record<string, unknown>, context: SansanContext) => Promise<unknown>;
8
+ interface SansanRequest {
9
+ method?: "GET" | "POST" | "PUT" | "DELETE";
10
+ query?: Record<string, unknown>;
11
+ json?: unknown;
12
+ body?: BodyInit;
13
+ headers?: Record<string, string>;
14
+ }
15
+ export declare function requestSansan<T>(path: string, input: SansanRequest, context: SansanContext, consume: (response: Response) => Promise<T>): Promise<T>;
16
+ export declare function requestSansanJson(path: string, input: SansanRequest, context: SansanContext): Promise<Record<string, unknown>>;
17
+ export declare function readSansanJson(response: Response, allowEmpty?: boolean): Promise<unknown>;
18
+ export declare function normalizeSansanPage(payload: Record<string, unknown>): Record<string, unknown>;
19
+ export declare function sansanPathId(value: unknown, field: string): string;
20
+ export declare function sansanPageQuery(query: Record<string, unknown>): Record<string, unknown>;
21
+ export declare function readSansanError(response: Response, phase?: "validate" | "execute"): Promise<ProviderRequestError>;
22
+ export {};
@@ -0,0 +1,94 @@
1
+ import { looseArray, optionalRecord, optionalString } from "../../core/cast.js";
2
+ import { ProviderRequestError, providerInputError, providerResponseError, providerUserAgent, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
3
+ export const sansanApiBaseUrl = "https://api.sansan.com/v6.0";
4
+ export async function requestSansan(path, input, context, consume) {
5
+ return runProviderRequest({ label: "Sansan", signal: context.signal }, async (signal) => {
6
+ const url = new URL(`${sansanApiBaseUrl}${path}`);
7
+ for (const [key, value] of Object.entries(input.query ?? {})) {
8
+ if (value === undefined)
9
+ continue;
10
+ if (Array.isArray(value)) {
11
+ const parameter = key === "tagIds" ? "tagId[]" : path === "/reports" ? `${key}[]` : key;
12
+ for (const item of value)
13
+ url.searchParams.append(parameter, String(item));
14
+ }
15
+ else {
16
+ url.searchParams.set(key, String(value));
17
+ }
18
+ }
19
+ const headers = new Headers(input.headers);
20
+ headers.set("X-Sansan-Api-Key", context.apiKey);
21
+ headers.set("accept", "application/json, text/csv, image/jpeg");
22
+ headers.set("user-agent", providerUserAgent);
23
+ if (input.json !== undefined)
24
+ headers.set("content-type", "application/json");
25
+ const response = await context.fetcher(url, {
26
+ method: input.method ?? "GET",
27
+ headers,
28
+ body: input.json === undefined ? input.body : JSON.stringify(input.json),
29
+ signal,
30
+ });
31
+ if (!response.ok)
32
+ throw await readSansanError(response, context.phase ?? "execute");
33
+ return consume(response);
34
+ });
35
+ }
36
+ export function requestSansanJson(path, input, context) {
37
+ return requestSansan(path, input, context, async (response) => requiredResponseRecord(await readSansanJson(response), "Sansan response"));
38
+ }
39
+ export async function readSansanJson(response, allowEmpty = false) {
40
+ const text = await response.text();
41
+ if (allowEmpty && !text.trim())
42
+ return null;
43
+ try {
44
+ return JSON.parse(text);
45
+ }
46
+ catch {
47
+ throw providerResponseError("Sansan returned invalid JSON");
48
+ }
49
+ }
50
+ export function normalizeSansanPage(payload) {
51
+ if (!Array.isArray(payload.data) || typeof payload.hasMore !== "boolean") {
52
+ throw providerResponseError("Sansan list response is missing data or hasMore");
53
+ }
54
+ const nextPageToken = optionalString(payload.nextPageToken) || null;
55
+ if (payload.hasMore && !nextPageToken) {
56
+ throw providerResponseError("Sansan list response is missing nextPageToken");
57
+ }
58
+ return { ...payload, data: payload.data, hasMore: payload.hasMore, nextPageToken };
59
+ }
60
+ export function sansanPathId(value, field) {
61
+ const id = optionalString(value)?.trim();
62
+ if (!id || id === "." || id === "..") {
63
+ throw providerInputError(`${field} must be a non-empty resource ID, not a dot path segment`);
64
+ }
65
+ return encodeURIComponent(id);
66
+ }
67
+ export function sansanPageQuery(query) {
68
+ const token = optionalString(query.nextPageToken);
69
+ return token ? { nextPageToken: token } : query;
70
+ }
71
+ export async function readSansanError(response, phase = "execute") {
72
+ const text = await response.text();
73
+ let value;
74
+ try {
75
+ value = JSON.parse(text);
76
+ }
77
+ catch {
78
+ value = { message: text };
79
+ }
80
+ const payload = optionalRecord(value);
81
+ const codes = looseArray(payload?.error).flatMap((detail) => {
82
+ const item = optionalRecord(detail);
83
+ const code = optionalString(item?.Code) ?? optionalString(item?.code);
84
+ return code ? [code] : [];
85
+ });
86
+ const detail = optionalString(payload?.message) || `Sansan request failed with status ${response.status}`;
87
+ const message = codes.length ? `${detail} (${codes.join(", ")})` : detail;
88
+ if (codes.includes("invalid_api_key")) {
89
+ return new ProviderRequestError(phase === "validate" ? 400 : 409, message, undefined, phase === "validate" ? "invalid_input" : "authorization_failed");
90
+ }
91
+ if (response.status === 429)
92
+ return new ProviderRequestError(429, message, undefined, "rate_limited");
93
+ return new ProviderRequestError(response.status, message, undefined, "provider_error");
94
+ }
@@ -0,0 +1,7 @@
1
+ import type { JsonSchema } from "../../core/types.ts";
2
+ export declare const businessCardSchema: JsonSchema;
3
+ export declare const userSchema: JsonSchema;
4
+ export declare const reportSchema: JsonSchema;
5
+ export declare const businessCardPageSchema: JsonSchema;
6
+ export declare const tagPageSchema: JsonSchema;
7
+ export declare const reportPageSchema: JsonSchema;