@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
@@ -1,9 +1,9 @@
1
1
  import { ProtocolError, SdkHttpError, UnauthorizedError } from "@modelcontextprotocol/client";
2
2
  import { compactObject, looseArray, optionalBoolean, optionalInteger, optionalNumber, optionalRawString, optionalRecord, optionalString, optionalStringArray, requiredRawString, } from "../../core/cast.js";
3
3
  import { withMcpClient } from "../mcp-client.js";
4
- import { defineOAuthProviderExecutors, mapProviderActionSources, providerResponseError, providerUserAgent, ProviderRequestError, requiredInputString, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
4
+ import { defineOAuthProviderExecutors, mapProviderActionSources, providerInputError, providerResponseError, providerUserAgent, ProviderRequestError, requiredInputString, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
5
5
  import { notionMcpEndpoint } from "./endpoints.js";
6
- import { decodeNotionToolText, parseNotionComments, parseNotionPage, parseNotionSearch, parseNotionSelf, parseNotionToolAccess, } from "./mcp-response.js";
6
+ import { decodeNotionToolText, parseNotionComments, parseNotionCreatedComment, parseNotionCreatedPages, parseNotionPage, parseNotionSearch, parseNotionSelf, parseNotionToolAccess, parseNotionUpdatedPage, } from "./mcp-response.js";
7
7
  const service = "notion_mcp";
8
8
  const selfUserId = "self";
9
9
  const toolsByAction = {
@@ -36,7 +36,45 @@ const toolsByAction = {
36
36
  arguments: () => ({}),
37
37
  parse: (value) => ({ tools: parseNotionToolAccess(value) }),
38
38
  },
39
+ create_pages: {
40
+ tool: "notion-create-pages",
41
+ arguments: (input) => {
42
+ const pages = looseArray(input.pages);
43
+ if (pages.length === 0)
44
+ throw providerInputError("pages is required.");
45
+ return { ...compactObject(input), pages };
46
+ },
47
+ parse: (value) => ({ ...parseNotionCreatedPages(value) }),
48
+ },
49
+ update_page: {
50
+ tool: "notion-update-page",
51
+ arguments: (input) => ({
52
+ ...compactObject(input),
53
+ page_id: requiredInputString(input.page_id, "page_id"),
54
+ command: requiredInputString(input.command, "command"),
55
+ }),
56
+ parse: (value, input) => ({
57
+ page_id: requiredInputString(input.page_id, "page_id"),
58
+ ...parseNotionUpdatedPage(value),
59
+ }),
60
+ },
61
+ create_comment: {
62
+ tool: "notion-create-comment",
63
+ arguments: (input) => ({
64
+ ...compactObject(input),
65
+ page_id: requiredInputString(input.page_id, "page_id"),
66
+ markdown: requiredInputString(input.markdown, "markdown"),
67
+ }),
68
+ parse: (value) => compactObject({ comment: parseNotionCreatedComment(value) }),
69
+ },
39
70
  };
71
+ /**
72
+ * The actions that change the workspace. Sign-in requires every read tool and
73
+ * none of these: a workspace whose owner withheld the writes from the
74
+ * connection, or an older server, may not list them, and a credential must
75
+ * not be refused for a tool it would never call.
76
+ */
77
+ const writeActions = new Set(["create_pages", "update_page", "create_comment"]);
40
78
  const handlers = mapProviderActionSources(service, toolsByAction, (_actionName, source) => async (input, context) => {
41
79
  const result = await callNotionTool(context, source.tool, source.arguments(input));
42
80
  return { ...source.parse(result.value, input), raw: result.raw };
@@ -45,14 +83,15 @@ export const executors = defineOAuthProviderExecutors(service, handlers, {
45
83
  skipDnsValidation: true,
46
84
  });
47
85
  export const credentialValidators = {
48
- /** Require every tool the actions map, then identify the user so the account key is the Notion user ID. */
86
+ /** Require the baseline read tools, then identify the user by the Notion user ID. */
49
87
  async oauth2(input, { fetcher, signal }) {
50
88
  const context = { accessToken: input.accessToken, fetcher, signal };
51
- const { toolCount, self } = await withNotionMcpClient(context, "validate", async (client, signal) => {
89
+ const { toolCount, self } = await withNotionMcpClient(context, async (client, signal) => {
52
90
  const tools = await listNotionTools(client, signal);
53
91
  const available = new Set(tools.map((tool) => tool.name));
54
- const missing = Object.values(toolsByAction)
55
- .map((source) => source.tool)
92
+ const missing = Object.entries(toolsByAction)
93
+ .filter(([action]) => !writeActions.has(action))
94
+ .map(([, source]) => source.tool)
56
95
  .filter((tool) => !available.has(tool));
57
96
  if (missing.length > 0) {
58
97
  throw new ProviderRequestError(502, `Notion MCP did not expose the tools this connector needs: ${[...new Set(missing)].join(", ")}.`);
@@ -107,7 +146,7 @@ async function listNotionTools(client, signal) {
107
146
  return tools;
108
147
  }
109
148
  async function callNotionTool(context, name, input) {
110
- const result = await withNotionMcpClient(context, "execute", (client, signal) => client.callTool({ name, arguments: input }, { signal }));
149
+ const result = await withNotionMcpClient(context, (client, signal) => client.callTool({ name, arguments: input }, { signal }));
111
150
  return readNotionToolResult(name, result);
112
151
  }
113
152
  /** The text blocks joined are the raw answer; structured content, when the server sends it, is the value. */
@@ -138,7 +177,7 @@ function notionToolError(name, record) {
138
177
  }
139
178
  return new ProviderRequestError(502, `Notion MCP tool ${name} failed.`, record);
140
179
  }
141
- function withNotionMcpClient(context, phase, run) {
180
+ function withNotionMcpClient(context, run) {
142
181
  return runProviderRequest({ signal: context.signal, label: "Notion MCP" }, (signal) => withMcpClient({
143
182
  endpoint: new URL(notionMcpEndpoint),
144
183
  transport: "streamable_http",
@@ -146,31 +185,21 @@ function withNotionMcpClient(context, phase, run) {
146
185
  headers: { authorization: `Bearer ${context.accessToken}`, "user-agent": providerUserAgent },
147
186
  redirect: "manual",
148
187
  signal,
149
- mapError: (error) => mapNotionMcpError(error, phase),
188
+ mapError: mapNotionMcpError,
150
189
  }, (client) => run(client, signal)));
151
190
  }
152
- /**
153
- * Sign-in reports a rejected token as invalid input (400); a run reports it as an expired authorization (401).
154
- * Anything unrecognized is left to runProviderRequest, which tells a timeout (504) from a failure (502).
155
- */
156
- function mapNotionMcpError(error, phase) {
191
+ // Status alone does not establish that reconnecting can resolve a provider failure.
192
+ function mapNotionMcpError(error) {
157
193
  if (error instanceof ProviderRequestError)
158
194
  return error;
159
- const credentialStatus = phase === "validate" ? 400 : 401;
160
195
  if (error instanceof UnauthorizedError) {
161
- return new ProviderRequestError(credentialStatus, "Notion MCP credential is invalid or expired.");
196
+ return new ProviderRequestError(401, "Notion MCP authorization request failed.", undefined, "provider_error");
162
197
  }
163
198
  if (error instanceof SdkHttpError) {
164
- const status = error.status;
165
- if (status === 401 || status === 403) {
166
- return new ProviderRequestError(credentialStatus, "Notion MCP credential is invalid or expired.");
167
- }
168
- // The SDK error carries the response body; only the status is reported so a token echoed in it never is.
169
- const providerStatus = 400 <= status && status < 500 ? status : 502;
170
- return new ProviderRequestError(providerStatus, `Notion MCP request failed with HTTP ${status}.`);
199
+ return new ProviderRequestError(error.status, `Notion MCP request failed with HTTP ${error.status}.`, undefined, error.status === 429 ? "rate_limited" : "provider_error");
171
200
  }
172
201
  if (error instanceof ProtocolError) {
173
- return new ProviderRequestError(502, `Notion MCP request failed: ${error.message}`);
202
+ return new ProviderRequestError(502, `Notion MCP protocol error ${error.code}.`, undefined, "provider_error");
174
203
  }
175
204
  return error;
176
205
  }
@@ -50,6 +50,11 @@ interface NotionMcpToolAccess {
50
50
  landing_page_url: string | undefined;
51
51
  landing_page_action: string | undefined;
52
52
  }
53
+ interface NotionMcpCreatedPage {
54
+ id?: string;
55
+ url?: string;
56
+ title?: string;
57
+ }
53
58
  /** Notion's tools answer JSON in a text block on most calls and prose or XML fragments on the rest. */
54
59
  export declare function decodeNotionToolText(text: string): unknown;
55
60
  /**
@@ -83,4 +88,25 @@ export declare function parseNotionComments(value: unknown): NotionMcpComment[];
83
88
  * reason it is unavailable. The reason is kept as text and never interpreted.
84
89
  */
85
90
  export declare function parseNotionToolAccess(value: unknown): NotionMcpToolAccess[];
91
+ /**
92
+ * The pages a notion-create-pages answer names, in its order: a `pages`/`results` list of `{id, url, title}`
93
+ * records, a single page record, or the page links in a prose answer, each id read off its link. An async task's
94
+ * id travels beside them when the server deferred the work.
95
+ */
96
+ export declare function parseNotionCreatedPages(value: unknown): {
97
+ pages: NotionMcpCreatedPage[];
98
+ async_task_id?: string;
99
+ };
100
+ /** The page a notion-update-page answer names: its link, when the prose or the record carries one, and a deferred task's id. */
101
+ interface NotionMcpUpdatedPage {
102
+ url?: string;
103
+ async_task_id?: string;
104
+ warnings?: Record<string, unknown>[];
105
+ }
106
+ export declare function parseNotionUpdatedPage(value: unknown): NotionMcpUpdatedPage;
107
+ /** The comment a notion-create-comment answer names: the comment record itself, or the first of a listed shape. */
108
+ export declare function parseNotionCreatedComment(value: unknown): {
109
+ id?: string;
110
+ discussion_id?: string;
111
+ } | undefined;
86
112
  export {};
@@ -6,6 +6,9 @@ const contentOpening = /<content\b[^<>]*>/i;
6
6
  const tagAttribute = /(?<![\w:-])([\w:-]+)\s*=\s*"([^"]*)"/g;
7
7
  const anyTag = /<[^<>]+>/g;
8
8
  const namedEntities = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
9
+ // A Notion page link in prose, and the 32-hex page id a link or an id carries.
10
+ const notionLink = /https:\/\/(?:www\.)?notion\.so\/[^\s)"'<>]+/g;
11
+ const notionPageId = /([0-9a-f]{32})(?:[?#]|$)/i;
9
12
  /** Notion's tools answer JSON in a text block on most calls and prose or XML fragments on the rest. */
10
13
  export function decodeNotionToolText(text) {
11
14
  const trimmed = text.trim();
@@ -143,6 +146,98 @@ export function parseNotionToolAccess(value) {
143
146
  ];
144
147
  });
145
148
  }
149
+ /**
150
+ * The pages a notion-create-pages answer names, in its order: a `pages`/`results` list of `{id, url, title}`
151
+ * records, a single page record, or the page links in a prose answer, each id read off its link. An async task's
152
+ * id travels beside them when the server deferred the work.
153
+ */
154
+ export function parseNotionCreatedPages(value) {
155
+ const record = optionalRecord(value);
156
+ if (record?.object === "async_task") {
157
+ return { pages: [], ...compactObject({ async_task_id: asyncTaskId(record) }) };
158
+ }
159
+ const listed = findList(value, "pages", "results", "created_pages").flatMap((item) => {
160
+ const page = readCreatedPage(item);
161
+ return page ? [page] : [];
162
+ });
163
+ const single = listed.length === 0 ? readCreatedPage(record) : undefined;
164
+ const pages = listed.length > 0 ? listed : single ? [single] : linkedPages(optionalString(value) ?? textOf(record));
165
+ return { pages, ...compactObject({ async_task_id: asyncTaskId(record) }) };
166
+ }
167
+ export function parseNotionUpdatedPage(value) {
168
+ const record = optionalRecord(value);
169
+ const url = (record && pickOptionalString(record, "url")) ?? linkedPages(optionalString(value) ?? textOf(record))[0]?.url;
170
+ return compactObject({
171
+ url,
172
+ async_task_id: asyncTaskId(record),
173
+ warnings: Array.isArray(record?.warnings)
174
+ ? record.warnings.flatMap((value) => {
175
+ const warning = optionalRecord(value);
176
+ return warning ? [warning] : [];
177
+ })
178
+ : undefined,
179
+ });
180
+ }
181
+ /** The comment a notion-create-comment answer names: the comment record itself, or the first of a listed shape. */
182
+ export function parseNotionCreatedComment(value) {
183
+ const record = optionalRecord(value);
184
+ const comment = record && (optionalRecord(record.comment) ?? record);
185
+ const typed = compactObject({
186
+ id: comment && pickOptionalString(comment, "id", "comment_id"),
187
+ discussion_id: comment && pickOptionalString(comment, "discussion_id"),
188
+ });
189
+ if (Object.keys(typed).length > 0)
190
+ return typed;
191
+ const listed = parseNotionComments(value)[0];
192
+ if (!listed)
193
+ return undefined;
194
+ const fromList = compactObject({
195
+ id: listed.id,
196
+ discussion_id: listed.discussion_id,
197
+ });
198
+ return Object.keys(fromList).length > 0 ? fromList : undefined;
199
+ }
200
+ function readCreatedPage(value) {
201
+ const record = optionalRecord(value);
202
+ if (!record)
203
+ return undefined;
204
+ const url = pickOptionalString(record, "url");
205
+ const page = compactObject({
206
+ id: pickOptionalString(record, "id", "page_id") ?? (url && pageIdOf(url)),
207
+ url,
208
+ title: readTitle(record),
209
+ });
210
+ return page.id !== undefined || page.url !== undefined ? page : undefined;
211
+ }
212
+ /** The page links a prose answer carries, each with the id its link ends in, in order and without repeats. */
213
+ function linkedPages(text) {
214
+ if (!text)
215
+ return [];
216
+ const seen = new Set();
217
+ return [...text.matchAll(notionLink)].flatMap((match) => {
218
+ // A link at the end of a sentence carries its punctuation into the match.
219
+ const url = match[0].replace(/[.,;:!?]+$/, "");
220
+ if (seen.has(url))
221
+ return [];
222
+ seen.add(url);
223
+ return [compactObject({ id: pageIdOf(url), url })];
224
+ });
225
+ }
226
+ function pageIdOf(url) {
227
+ return notionPageId.exec(url)?.[1]?.toLowerCase();
228
+ }
229
+ /** The text a tool answered under any of its names, for an answer that was JSON with the prose inside it. */
230
+ function textOf(record) {
231
+ return record ? pickOptionalString(record, "text", "message", "result") : undefined;
232
+ }
233
+ function asyncTaskId(record) {
234
+ if (!record)
235
+ return undefined;
236
+ if (record.object === "async_task")
237
+ return pickOptionalString(record, "id");
238
+ const task = optionalRecord(record.async_task) ?? optionalRecord(record.task);
239
+ return pickOptionalString(record, "async_task_id", "task_id") ?? (task && pickOptionalString(task, "id", "task_id"));
240
+ }
146
241
  /** The first present list among keys of a decoded object, or the value itself when it is a list. */
147
242
  function findList(value, ...keys) {
148
243
  if (Array.isArray(value))
@@ -114,7 +114,7 @@ async function request(path, context, method = "GET", form, query) {
114
114
  }
115
115
  if (!response.ok) {
116
116
  const record = optionalRecord(payload);
117
- throw new ProviderRequestError(response.status, optionalString(record?.message) ?? `Omise request failed with status ${response.status}`, payload, optionalString(record?.code));
117
+ throw new ProviderRequestError(response.status, optionalString(record?.message) ?? `Omise request failed with status ${response.status}`, payload);
118
118
  }
119
119
  return payload;
120
120
  }
@@ -1,5 +1,5 @@
1
- import { compactObject, optionalString, requiredRecord } from "../../core/cast.js";
2
- import { defineOAuthProviderExecutors, defineProviderProxy, providerInputError, ProviderRequestError, } from "../provider-runtime.js";
1
+ import { compactObject, optionalString, requiredBoolean, requiredRecord } from "../../core/cast.js";
2
+ import { defineOAuthProviderExecutors, defineProviderProxy, providerInputError, requiredInputString, ProviderRequestError, } from "../provider-runtime.js";
3
3
  import { microsoftGraphJson, microsoftGraphRequest } from "./microsoft-graph.js";
4
4
  import { outlookMessageReceived } from "./trigger-on-message-received.js";
5
5
  const outlookGraphBaseUrl = "https://graph.microsoft.com/v1.0";
@@ -22,6 +22,30 @@ const outlookActionHandlers = {
22
22
  get_message(input, deps) {
23
23
  return getMessage(input, deps);
24
24
  },
25
+ move_message(input, deps) {
26
+ return moveMessage(input, requiredInputString(input.destinationId, "destinationId"), deps);
27
+ },
28
+ archive_message(input, deps) {
29
+ return moveMessage(input, "archive", deps);
30
+ },
31
+ async delete_message(input, { accessToken, fetcher, signal }) {
32
+ await outlookRequest(`me/messages/${encodeURIComponent(requiredInputString(input.messageId, "messageId"))}`, {
33
+ accessToken,
34
+ fetcher,
35
+ signal,
36
+ method: "DELETE",
37
+ });
38
+ return { success: true };
39
+ },
40
+ set_message_read(input, { accessToken, fetcher, signal }) {
41
+ return outlookJsonRequest(`me/messages/${encodeURIComponent(requiredInputString(input.messageId, "messageId"))}`, {
42
+ accessToken,
43
+ fetcher,
44
+ signal,
45
+ method: "PATCH",
46
+ body: { isRead: requiredBoolean(input.isRead, "isRead", providerInputError) },
47
+ });
48
+ },
25
49
  create_draft(input, deps) {
26
50
  return createDraft(input, deps);
27
51
  },
@@ -229,6 +253,15 @@ async function getMessage(input, { accessToken, fetcher }) {
229
253
  headers,
230
254
  });
231
255
  }
256
+ async function moveMessage(input, destinationId, { accessToken, fetcher, signal }) {
257
+ return outlookJsonRequest(`me/messages/${encodeURIComponent(requiredInputString(input.messageId, "messageId"))}/move`, {
258
+ accessToken,
259
+ fetcher,
260
+ signal,
261
+ method: "POST",
262
+ body: { destinationId },
263
+ });
264
+ }
232
265
  async function createDraft(input, { accessToken, fetcher }) {
233
266
  return outlookJsonRequest("me/messages", {
234
267
  accessToken,
@@ -0,0 +1,2 @@
1
+ import type { ActionDefinition } from "../../core/types.ts";
2
+ export declare const portedenActions: ActionDefinition[];
@@ -0,0 +1,162 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ import { defineProviderAction } from "../../core/provider-definition.js";
3
+ const emailId = s.nonEmptyString("Provider-prefixed email ID, such as google:abc123 or m365:xyz789.");
4
+ const bodyType = s.stringEnum("Body content type; defaults to html.", ["html", "text"]);
5
+ const participant = s.object("Email recipient.", {
6
+ email: s.nonEmptyString("Email address."),
7
+ name: s.string("Display name."),
8
+ }, { optional: ["name"] });
9
+ const recipients = s.array("Recipient addresses and optional display names.", participant, {
10
+ minItems: 1,
11
+ });
12
+ const email = s.looseObject("Email with permission-filtered fields and attachment metadata; additional fields are preserved.", {
13
+ id: s.string("Provider-prefixed email ID."),
14
+ threadId: s.nullable(s.string("Provider-prefixed thread ID.")),
15
+ subject: s.nullable(s.string("Email subject.")),
16
+ from: s.nullable(s.looseObject("Sender details.", {})),
17
+ to: s.nullable(s.array("Recipients.", s.looseObject("Recipient details.", {}))),
18
+ body: s.nullable(s.string("Email body when requested and permitted.")),
19
+ bodyPreview: s.nullable(s.string("Short body preview.")),
20
+ bodyType: s.nullable(s.string("Body content type.")),
21
+ receivedAt: s.nullable(s.string("Receipt timestamp in UTC.")),
22
+ isRead: s.boolean("Whether the email is read."),
23
+ hasAttachments: s.boolean("Whether attachments exist."),
24
+ attachments: s.nullable(s.array("Attachment metadata; no file content is downloaded.", s.looseObject("Attachment details.", {}))),
25
+ labels: s.nullable(s.stringArray("Labels or categories.")),
26
+ provider: s.string("Source provider, such as GOOGLE or M365."),
27
+ emailAccountOwner: s.nullable(s.string("Mailbox owner address.")),
28
+ });
29
+ const sent = s.looseObject("Send result; Microsoft 365 can return null message and thread IDs.", {
30
+ success: s.boolean("Whether the operation succeeded."),
31
+ emailId: s.nullable(s.string("Provider-prefixed sent email ID, when available.")),
32
+ threadId: s.nullable(s.string("Provider-prefixed thread ID, when available.")),
33
+ errorMessage: s.nullable(s.string("Upstream failure details, when available.")),
34
+ });
35
+ const success = s.requiredObject("Successful operation result.", {
36
+ success: s.boolean("Whether the operation succeeded."),
37
+ });
38
+ export const portedenActions = [
39
+ defineProviderAction("porteden", {
40
+ name: "search_emails",
41
+ operationType: "read",
42
+ requiredScopes: [],
43
+ description: "Search emails across connected Gmail and Microsoft 365 accounts. Email access and search_emails permission must be enabled in PortEden; pass nextPageToken as pageToken to continue.",
44
+ inputSchema: s.object("Email search filters and pagination.", {
45
+ q: s.string("Free-text search query."),
46
+ from: s.string("Filter by sender email address."),
47
+ to: s.string("Filter by recipient email address."),
48
+ subject: s.string("Partial subject filter."),
49
+ label: s.string("Label or category filter."),
50
+ unread: s.boolean("Filter by read status; true selects unread emails."),
51
+ after: s.string("Emails received after this UTC timestamp.", { format: "date-time" }),
52
+ before: s.string("Emails received before this UTC timestamp.", { format: "date-time" }),
53
+ hasAttachment: s.boolean("Filter by attachment presence."),
54
+ limit: s.integer("Maximum results; defaults to 20, at most 50.", {
55
+ minimum: 1,
56
+ maximum: 50,
57
+ }),
58
+ includeBody: s.boolean("Include full bodies; defaults to false."),
59
+ pageToken: s.string("Opaque nextPageToken from the previous result."),
60
+ }, { required: [] }),
61
+ outputSchema: s.looseObject("Merged email search results sorted newest first.", {
62
+ emails: s.array("Matching emails.", email),
63
+ totalCount: s.integer("Total matching count reported by PortEden."),
64
+ hasMore: s.boolean("Whether more results are available."),
65
+ nextPageToken: s.nullable(s.string("Opaque continuation token.")),
66
+ accessInfo: s.unknown("Active access restrictions, if present."),
67
+ authWarnings: s.unknown("Upstream account authentication warnings, if present."),
68
+ }),
69
+ }),
70
+ defineProviderAction("porteden", {
71
+ name: "get_email",
72
+ operationType: "read",
73
+ requiredScopes: [],
74
+ description: "Read a provider-prefixed email, including its body by default, subject to PortEden view_email permissions.",
75
+ inputSchema: s.object("Email lookup.", { emailId, includeBody: s.boolean("Include full body; defaults to true.") }, { optional: ["includeBody"] }),
76
+ outputSchema: email,
77
+ }),
78
+ defineProviderAction("porteden", {
79
+ name: "get_thread",
80
+ operationType: "read",
81
+ requiredScopes: [],
82
+ description: "Read a complete email thread in chronological order with body content, subject to PortEden view_thread permissions.",
83
+ inputSchema: s.requiredObject("Thread lookup.", {
84
+ threadId: s.nonEmptyString("Provider-prefixed thread ID, such as google:abc123 or m365:xyz789."),
85
+ }),
86
+ outputSchema: s.looseObject("Email thread.", {
87
+ id: s.string("Provider-prefixed thread ID."),
88
+ subject: s.nullable(s.string("Thread subject.")),
89
+ messages: s.array("Messages in chronological order.", email),
90
+ messageCount: s.integer("Message count."),
91
+ participants: s.array("Thread participants.", s.looseObject("Participant details.", {})),
92
+ lastMessageAt: s.nullable(s.string("Most recent message timestamp.")),
93
+ provider: s.string("Source provider."),
94
+ }),
95
+ }),
96
+ defineProviderAction("porteden", {
97
+ name: "send_email",
98
+ operationType: "write",
99
+ requiredScopes: [],
100
+ description: "Send an email through a connected account with PortEden send_email permission. Choose sendFrom or connectionId when needed; the default account is otherwise used.",
101
+ inputSchema: s.object("New email.", {
102
+ to: recipients,
103
+ cc: s.array("Recipient addresses and optional display names.", participant),
104
+ bcc: s.array("Recipient addresses and optional display names.", participant),
105
+ subject: s.string("Email subject."),
106
+ body: s.string("Email body content."),
107
+ bodyType,
108
+ importance: s.stringEnum("Priority; defaults to normal.", ["low", "normal", "high"]),
109
+ sendFrom: s.nonEmptyString("Connected account email address to send from."),
110
+ connectionId: s.integer("Provider connection ID to send from."),
111
+ }, { optional: ["cc", "bcc", "bodyType", "importance", "sendFrom", "connectionId"] }),
112
+ outputSchema: sent,
113
+ }),
114
+ defineProviderAction("porteden", {
115
+ name: "reply_email",
116
+ operationType: "write",
117
+ requiredScopes: [],
118
+ description: "Reply to an email, preserving its thread, with PortEden reply_to_email permission.",
119
+ inputSchema: s.object("Email reply.", {
120
+ emailId,
121
+ body: s.string("Reply body content."),
122
+ bodyType,
123
+ replyAll: s.boolean("Reply to all original recipients except the sending account; defaults to false."),
124
+ }, { optional: ["bodyType", "replyAll"] }),
125
+ outputSchema: sent,
126
+ }),
127
+ defineProviderAction("porteden", {
128
+ name: "forward_email",
129
+ operationType: "write",
130
+ requiredScopes: [],
131
+ description: "Forward an email to recipients with PortEden forward_email permission.",
132
+ inputSchema: s.object("Email forwarding options.", {
133
+ emailId,
134
+ to: recipients,
135
+ cc: s.array("Recipient addresses and optional display names.", participant),
136
+ body: s.string("Optional message to prepend."),
137
+ bodyType,
138
+ }, { optional: ["cc", "body", "bodyType"] }),
139
+ outputSchema: sent,
140
+ }),
141
+ defineProviderAction("porteden", {
142
+ name: "modify_email",
143
+ operationType: "write",
144
+ requiredScopes: [],
145
+ description: "Change read status or labels/categories. PortEden requires mark_as_read and/or apply_labels permission for the requested changes.",
146
+ inputSchema: s.requireAnyProperty(s.object("Email property changes.", {
147
+ emailId,
148
+ markAsRead: s.boolean("Mark as read (true) or unread (false)."),
149
+ addLabels: s.stringArray("Labels or categories to add."),
150
+ removeLabels: s.stringArray("Labels or categories to remove."),
151
+ }, { optional: ["markAsRead", "addLabels", "removeLabels"] }), ["markAsRead", "addLabels", "removeLabels"]),
152
+ outputSchema: success,
153
+ }),
154
+ defineProviderAction("porteden", {
155
+ name: "delete_email",
156
+ operationType: "destructive",
157
+ requiredScopes: [],
158
+ description: "Move an email to Trash or Deleted Items with PortEden delete_email permission. This is a recoverable soft delete.",
159
+ inputSchema: s.requiredObject("Email to move to trash.", { emailId }),
160
+ outputSchema: success,
161
+ }),
162
+ ];
@@ -0,0 +1,4 @@
1
+ import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ export declare const executors: ProviderExecutors;
3
+ export declare const credentialValidators: CredentialValidators;
4
+ export declare const proxy: ProviderProxyExecutor;
@@ -0,0 +1,140 @@
1
+ import { optionalRecord, optionalRawString } from "../../core/cast.js";
2
+ import { requiredInputString, requiredResponseRecord, ProviderRequestError, runProviderRequest, defineApiKeyProviderExecutors, defineProviderProxy, mapProviderActionHandlers, readProviderProxyErrorMessage, withRetryAfterSeconds, } from "../provider-runtime.js";
3
+ import { portedenActions } from "./actions.js";
4
+ const baseUrl = "https://api.porteden.com";
5
+ const defaultHeaders = { accept: "application/json" };
6
+ async function request({ route, method, data, apiKey, fetcher, parentSignal }) {
7
+ try {
8
+ return await runProviderRequest({ signal: parentSignal, label: "PortEden" }, async (signal) => {
9
+ const url = new URL(`${baseUrl}${route}`);
10
+ if (method === "GET") {
11
+ for (const [key, value] of Object.entries(data)) {
12
+ if (value != null)
13
+ url.searchParams.set(key, String(value));
14
+ }
15
+ }
16
+ const hasBody = method === "POST" || method === "PATCH";
17
+ const headers = new Headers(defaultHeaders);
18
+ headers.set("Authorization", `Bearer ${apiKey}`);
19
+ if (hasBody)
20
+ headers.set("content-type", "application/json");
21
+ const response = await fetcher(url.toString(), {
22
+ method,
23
+ headers,
24
+ body: hasBody ? JSON.stringify(data) : undefined,
25
+ signal,
26
+ });
27
+ if (response.status === 204 && (method === "PATCH" || method === "DELETE"))
28
+ return { success: true };
29
+ const text = await response.text();
30
+ let payload;
31
+ try {
32
+ payload = JSON.parse(text);
33
+ }
34
+ catch {
35
+ payload = undefined;
36
+ }
37
+ const body = optionalRecord(payload);
38
+ if (!response.ok || body?.success === false) {
39
+ const detail = [
40
+ optionalRawString(body?.code),
41
+ optionalRawString(body?.error),
42
+ optionalRawString(body?.message),
43
+ optionalRawString(body?.errorMessage),
44
+ ]
45
+ .filter(Boolean)
46
+ .join(": ") || `HTTP ${response.status}`;
47
+ throw new ProviderRequestError(response.ok ? 502 : response.status, `PortEden request failed: ${detail}`, undefined, body?.error === "API authentication failed"
48
+ ? "authorization_failed"
49
+ : response.status === 429
50
+ ? "rate_limited"
51
+ : "provider_error");
52
+ }
53
+ return requiredResponseRecord(payload, "PortEden response");
54
+ });
55
+ }
56
+ catch (error) {
57
+ if (error instanceof ProviderRequestError)
58
+ error.message = error.message.split(apiKey).join("[REDACTED]");
59
+ throw error;
60
+ }
61
+ }
62
+ const handlers = mapProviderActionHandlers("porteden", portedenActions, (action) => async (dataInput, context) => {
63
+ const { emailId, threadId, ...data } = dataInput;
64
+ let route = "/api/access/email/messages";
65
+ let method = "GET";
66
+ switch (action.name) {
67
+ case "get_email":
68
+ route += `/${encodeURIComponent(String(emailId))}`;
69
+ break;
70
+ case "get_thread":
71
+ route = `/api/access/email/threads/${encodeURIComponent(String(threadId))}`;
72
+ break;
73
+ case "send_email":
74
+ route += "/send";
75
+ method = "POST";
76
+ break;
77
+ case "reply_email":
78
+ route += `/${encodeURIComponent(String(emailId))}/reply`;
79
+ method = "POST";
80
+ break;
81
+ case "forward_email":
82
+ route += `/${encodeURIComponent(String(emailId))}/forward`;
83
+ method = "POST";
84
+ break;
85
+ case "modify_email":
86
+ route += `/${encodeURIComponent(String(emailId))}`;
87
+ method = "PATCH";
88
+ break;
89
+ case "delete_email":
90
+ route += `/${encodeURIComponent(String(emailId))}`;
91
+ method = "DELETE";
92
+ break;
93
+ }
94
+ return request({
95
+ route: route,
96
+ method: method,
97
+ data: data,
98
+ apiKey: context.apiKey,
99
+ fetcher: context.fetcher,
100
+ parentSignal: context.signal,
101
+ });
102
+ });
103
+ export const executors = defineApiKeyProviderExecutors("porteden", handlers, {
104
+ skipDnsValidation: true,
105
+ });
106
+ export const credentialValidators = {
107
+ async apiKey(input, { fetcher, signal }) {
108
+ const body = await request({
109
+ route: "/api/auth/token/status",
110
+ method: "GET",
111
+ data: {},
112
+ apiKey: requiredInputString(input.apiKey, "API Key"),
113
+ fetcher: fetcher,
114
+ parentSignal: signal,
115
+ });
116
+ if (body.authenticated !== true)
117
+ throw new ProviderRequestError(400, "PortEden token is not authenticated", undefined, "invalid_input");
118
+ return {
119
+ profile: {
120
+ displayName: optionalRawString(body.operatorName) || optionalRawString(body.userName) || "PortEden API Key",
121
+ },
122
+ grantedScopes: [],
123
+ metadata: { apiBaseUrl: baseUrl },
124
+ };
125
+ },
126
+ };
127
+ export const proxy = defineProviderProxy({
128
+ service: "porteden",
129
+ baseUrl,
130
+ auth: { type: "api_key_authorization", prefix: "Bearer " },
131
+ skipDnsValidation: true,
132
+ customizeRequest({ headers }) {
133
+ for (const [name, value] of Object.entries({ accept: "application/json" }))
134
+ if (!headers.has(name))
135
+ headers.set(name, value);
136
+ },
137
+ async readError(response) {
138
+ return new ProviderRequestError(response.status, await readProviderProxyErrorMessage(response, "Provider request failed"), withRetryAfterSeconds(response), response.status === 429 ? "rate_limited" : "provider_error");
139
+ },
140
+ });