@oomol-lab/open-connector 1.6.5 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +4 -0
  2. package/assets/open-connector/catalog/apps/airtable.json +134 -0
  3. package/assets/open-connector/catalog/apps/aisa.json +6985 -319
  4. package/assets/open-connector/catalog/apps/baizhi_mcp.json +135 -0
  5. package/assets/open-connector/catalog/apps/cal.json +24 -6
  6. package/assets/open-connector/catalog/apps/discordbot.json +2888 -248
  7. package/assets/open-connector/catalog/apps/drawio_mcp.json +192 -0
  8. package/assets/open-connector/catalog/apps/enormail.json +411 -0
  9. package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
  10. package/assets/open-connector/catalog/apps/firecrawl.json +176 -32
  11. package/assets/open-connector/catalog/apps/framejet.json +273 -0
  12. package/assets/open-connector/catalog/apps/futunn.json +2967 -0
  13. package/assets/open-connector/catalog/apps/github.json +275 -0
  14. package/assets/open-connector/catalog/apps/gitlab.json +125 -0
  15. package/assets/open-connector/catalog/apps/gmail.json +376 -0
  16. package/assets/open-connector/catalog/apps/google_analytics.json +4 -1
  17. package/assets/open-connector/catalog/apps/google_bigquery.json +4 -1
  18. package/assets/open-connector/catalog/apps/google_search_console.json +4 -1
  19. package/assets/open-connector/catalog/apps/googlecalendar.json +210 -1
  20. package/assets/open-connector/catalog/apps/googlechat.json +694 -7
  21. package/assets/open-connector/catalog/apps/googledocs.json +4 -1
  22. package/assets/open-connector/catalog/apps/googledrive.json +479 -0
  23. package/assets/open-connector/catalog/apps/googlesheets.json +148 -1
  24. package/assets/open-connector/catalog/apps/granola.json +23 -0
  25. package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
  26. package/assets/open-connector/catalog/apps/indexed.json +1115 -0
  27. package/assets/open-connector/catalog/apps/keepa.json +3534 -987
  28. package/assets/open-connector/catalog/apps/linear.json +133 -0
  29. package/assets/open-connector/catalog/apps/linear_mcp.json +510 -0
  30. package/assets/open-connector/catalog/apps/moneyforward_mcp.json +1432 -0
  31. package/assets/open-connector/catalog/apps/notion.json +588 -1
  32. package/assets/open-connector/catalog/apps/notion_mcp.json +490 -0
  33. package/assets/open-connector/catalog/apps/odoo.json +619 -0
  34. package/assets/open-connector/catalog/apps/one_drive.json +185 -0
  35. package/assets/open-connector/catalog/apps/outlook.json +212 -8
  36. package/assets/open-connector/catalog/apps/outlook_calendar.json +23 -2
  37. package/assets/open-connector/catalog/apps/postiz.json +334 -0
  38. package/assets/open-connector/catalog/apps/proworkflow.json +529 -0
  39. package/assets/open-connector/catalog/apps/sellersprite_mcp.json +2 -1
  40. package/assets/open-connector/catalog/apps/shopify.json +282 -0
  41. package/assets/open-connector/catalog/apps/slack.json +405 -0
  42. package/assets/open-connector/catalog/apps/slackbot.json +214 -0
  43. package/assets/open-connector/catalog/apps/spotify.json +46 -43
  44. package/assets/open-connector/catalog/apps/stripe.json +96 -0
  45. package/assets/open-connector/catalog/apps/telegram.json +138 -0
  46. package/assets/open-connector/catalog/apps/tencent_docs.json +3 -0
  47. package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
  48. package/assets/open-connector/catalog/apps/wisburg.json +1528 -0
  49. package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
  50. package/assets/open-connector/catalog/apps/youtube.json +4 -1
  51. package/assets/open-connector/catalog/apps/zendesk.json +152 -0
  52. package/assets/open-connector/catalog/apps/zerotier.json +3319 -0
  53. package/assets/open-connector/catalog/apps-index.json +1 -1
  54. package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
  55. package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
  56. package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
  57. package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
  58. package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
  59. package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
  60. package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
  61. package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
  62. package/package.json +2 -2
  63. package/src/connection-service.d.ts +40 -7
  64. package/src/connection-service.js +60 -18
  65. package/src/core/action-policy.d.ts +8 -1
  66. package/src/core/action-policy.js +51 -0
  67. package/src/core/cast.d.ts +13 -0
  68. package/src/core/cast.js +18 -1
  69. package/src/core/guarded-fetch.d.ts +11 -3
  70. package/src/core/guarded-fetch.js +19 -7
  71. package/src/core/provider-scenarios.js +67 -13
  72. package/src/core/remote-http.d.ts +33 -0
  73. package/src/core/remote-http.js +104 -0
  74. package/src/core/request.d.ts +1 -0
  75. package/src/core/request.js +11 -1
  76. package/src/core/types.d.ts +5 -1
  77. package/src/marketplace/marketplace-service.d.ts +0 -1
  78. package/src/marketplace/marketplace-service.js +80 -92
  79. package/src/mcp.js +26 -9
  80. package/src/oauth/oauth-client-config-service.d.ts +16 -1
  81. package/src/oauth/oauth-client-config-service.js +59 -3
  82. package/src/oauth/oauth-flow-service.d.ts +14 -1
  83. package/src/oauth/oauth-flow-service.js +14 -6
  84. package/src/providers/17track/runtime.js +1 -1
  85. package/src/providers/action-contracts.generated.d.ts +20 -6
  86. package/src/providers/aifinmarket/runtime.js +1 -1
  87. package/src/providers/airtable/executors.d.ts +3 -0
  88. package/src/providers/airtable/executors.js +2 -0
  89. package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
  90. package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
  91. package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
  92. package/src/providers/airtable/trigger-on-record-changed.js +235 -0
  93. package/src/providers/aisa/executors.js +912 -50
  94. package/src/providers/aliyun_ack/runtime.js +1 -1
  95. package/src/providers/aliyun_sls/runtime.js +1 -1
  96. package/src/providers/app_store_server/runtime-helpers.js +1 -1
  97. package/src/providers/baizhi_mcp/actions.d.ts +2 -0
  98. package/src/providers/baizhi_mcp/actions.js +40 -0
  99. package/src/providers/baizhi_mcp/executors.d.ts +3 -0
  100. package/src/providers/baizhi_mcp/executors.js +102 -0
  101. package/src/providers/bazhuayu/runtime.js +2 -2
  102. package/src/providers/bilibili/runtime.js +2 -4
  103. package/src/providers/bilibili/upload.js +9 -7
  104. package/src/providers/cal/actions.js +5 -1
  105. package/src/providers/cloudflare_browser_rendering/executors.js +1 -1
  106. package/src/providers/cloudflare_dns/executors.js +1 -1
  107. package/src/providers/{cloudflare-current-user.js → cloudflare_dns/runtime-user.js} +2 -2
  108. package/src/providers/cloudflare_dns/runtime.d.ts +1 -1
  109. package/src/providers/cloudflare_dns/runtime.js +1 -1
  110. package/src/providers/cloudflare_r2/executors.js +1 -1
  111. package/src/providers/cloudflare_r2/runtime.d.ts +1 -1
  112. package/src/providers/cloudflare_r2/runtime.js +1 -1
  113. package/src/providers/cloudflare_worker/executors.js +1 -1
  114. package/src/providers/cloudflare_worker/runtime.d.ts +1 -1
  115. package/src/providers/cloudflare_worker/runtime.js +1 -1
  116. package/src/providers/dingtalk_mcp/runtime.js +1 -1
  117. package/src/providers/discordbot/executors.d.ts +0 -9
  118. package/src/providers/discordbot/executors.js +9 -101
  119. package/src/providers/discordbot/runtime-guilds.d.ts +3 -0
  120. package/src/providers/discordbot/runtime-guilds.js +464 -0
  121. package/src/providers/discordbot/runtime.d.ts +42 -0
  122. package/src/providers/discordbot/runtime.js +124 -0
  123. package/src/providers/drawio_mcp/executors.d.ts +3 -0
  124. package/src/providers/drawio_mcp/executors.js +19 -0
  125. package/src/providers/drawio_mcp/runtime.d.ts +8 -0
  126. package/src/providers/drawio_mcp/runtime.js +175 -0
  127. package/src/providers/enormail/executors.d.ts +4 -0
  128. package/src/providers/enormail/executors.js +97 -0
  129. package/src/providers/fastmoss_mcp/executors.js +2 -2
  130. package/src/providers/feishu_app_bot/executors.d.ts +3 -0
  131. package/src/providers/feishu_app_bot/executors.js +2 -0
  132. package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
  133. package/src/providers/feishu_app_bot/trigger-config.js +10 -0
  134. package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
  135. package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
  136. package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
  137. package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
  138. package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
  139. package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
  140. package/src/providers/finchina/executors.js +1 -1
  141. package/src/providers/framejet/executors.d.ts +4 -0
  142. package/src/providers/framejet/executors.js +19 -0
  143. package/src/providers/framejet/runtime.d.ts +16 -0
  144. package/src/providers/framejet/runtime.js +148 -0
  145. package/src/providers/futunn/actions.d.ts +2 -0
  146. package/src/providers/futunn/actions.js +152 -0
  147. package/src/providers/futunn/actions.research.d.ts +2 -0
  148. package/src/providers/futunn/actions.research.js +423 -0
  149. package/src/providers/futunn/actions.trading.d.ts +2 -0
  150. package/src/providers/futunn/actions.trading.js +204 -0
  151. package/src/providers/futunn/executors.d.ts +3 -0
  152. package/src/providers/futunn/executors.js +24 -0
  153. package/src/providers/futunn/runtime-research.d.ts +3 -0
  154. package/src/providers/futunn/runtime-research.js +133 -0
  155. package/src/providers/futunn/runtime-trading.d.ts +3 -0
  156. package/src/providers/futunn/runtime-trading.js +39 -0
  157. package/src/providers/futunn/runtime.d.ts +2 -0
  158. package/src/providers/futunn/runtime.js +50 -0
  159. package/src/providers/futunn/transport.d.ts +11 -0
  160. package/src/providers/futunn/transport.js +76 -0
  161. package/src/providers/gildata/executors.js +1 -1
  162. package/src/providers/github/executors.d.ts +3 -0
  163. package/src/providers/github/executors.js +6 -0
  164. package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
  165. package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
  166. package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
  167. package/src/providers/github/trigger-on-repo-event.js +168 -0
  168. package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
  169. package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
  170. package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
  171. package/src/providers/github/trigger-watch-pull-request.js +106 -0
  172. package/src/providers/gitlab/executors.d.ts +3 -0
  173. package/src/providers/gitlab/executors.js +2 -0
  174. package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
  175. package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
  176. package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
  177. package/src/providers/gitlab/trigger-on-project-event.js +186 -0
  178. package/src/providers/gmail/executors.d.ts +3 -0
  179. package/src/providers/gmail/executors.js +5 -3
  180. package/src/providers/gmail/message.d.ts +6 -8
  181. package/src/providers/gmail/message.js +4 -0
  182. package/src/providers/gmail/scopes.d.ts +32 -0
  183. package/src/providers/gmail/scopes.js +37 -0
  184. package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
  185. package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
  186. package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
  187. package/src/providers/gmail/trigger-on-message-received.js +232 -0
  188. package/src/providers/google_analytics/executors.js +2 -2
  189. package/src/providers/google_analytics/scopes.js +6 -1
  190. package/src/providers/google_bigquery/executors.js +2 -2
  191. package/src/providers/google_bigquery/scopes.js +2 -0
  192. package/src/providers/google_search_console/executors.js +2 -2
  193. package/src/providers/google_search_console/scopes.js +2 -0
  194. package/src/providers/googleads/executors.js +1 -1
  195. package/src/providers/googleads/scopes.d.ts +1 -3
  196. package/src/providers/googleads/scopes.js +2 -4
  197. package/src/providers/googlecalendar/executors.d.ts +3 -0
  198. package/src/providers/googlecalendar/executors.js +3 -1
  199. package/src/providers/googlecalendar/runtime-shared.js +2 -2
  200. package/src/providers/googlecalendar/scopes.js +2 -0
  201. package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
  202. package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
  203. package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
  204. package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
  205. package/src/providers/googlechat/executors.d.ts +1 -3
  206. package/src/providers/googlechat/executors.js +219 -28
  207. package/src/providers/googlechat/members.d.ts +55 -0
  208. package/src/providers/googlechat/members.js +293 -0
  209. package/src/providers/googlechat/runtime.d.ts +16 -0
  210. package/src/providers/googlechat/runtime.js +25 -0
  211. package/src/providers/googlechat/scopes.d.ts +22 -3
  212. package/src/providers/googlechat/scopes.js +30 -7
  213. package/src/providers/googledocs/executors.js +1 -1
  214. package/src/providers/googledrive/executors.d.ts +3 -0
  215. package/src/providers/googledrive/executors.js +9 -2
  216. package/src/providers/{google-auth.d.ts → googledrive/runtime-auth.d.ts} +2 -2
  217. package/src/providers/{google-auth.js → googledrive/runtime-auth.js} +3 -3
  218. package/src/providers/googledrive/runtime-collaboration.js +1 -1
  219. package/src/providers/{google-runtime.d.ts → googledrive/runtime-request.d.ts} +1 -1
  220. package/src/providers/{google-runtime.js → googledrive/runtime-request.js} +2 -2
  221. package/src/providers/googledrive/trigger-changes.d.ts +12 -0
  222. package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
  223. package/src/providers/googledrive/trigger-changes.definition.js +101 -0
  224. package/src/providers/googledrive/trigger-changes.js +452 -0
  225. package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
  226. package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
  227. package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
  228. package/src/providers/googledrive/trigger-on-file-change.js +258 -0
  229. package/src/providers/googleforms/executors.js +2 -2
  230. package/src/providers/googleforms/scopes.d.ts +0 -3
  231. package/src/providers/googleforms/scopes.js +2 -6
  232. package/src/providers/googlemeet/executors.js +2 -2
  233. package/src/providers/googlemeet/scopes.d.ts +0 -3
  234. package/src/providers/googlemeet/scopes.js +2 -6
  235. package/src/providers/googlesheets/executors.d.ts +3 -0
  236. package/src/providers/googlesheets/executors.js +3 -1
  237. package/src/providers/googlesheets/scopes.js +2 -0
  238. package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
  239. package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
  240. package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
  241. package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
  242. package/src/providers/googleslides/executors.js +2 -2
  243. package/src/providers/googleslides/scopes.d.ts +0 -3
  244. package/src/providers/googleslides/scopes.js +2 -6
  245. package/src/providers/googletasks/executors.js +2 -2
  246. package/src/providers/googletasks/scopes.d.ts +0 -3
  247. package/src/providers/googletasks/scopes.js +2 -6
  248. package/src/providers/granola/actions.js +2 -0
  249. package/src/providers/granola/runtime-mcp.js +2 -0
  250. package/src/providers/granola/runtime.js +2 -2
  251. package/src/providers/hithink_finance/runtime.js +1 -1
  252. package/src/providers/indexed/executors.d.ts +4 -0
  253. package/src/providers/indexed/executors.js +16 -0
  254. package/src/providers/indexed/runtime.d.ts +26 -0
  255. package/src/providers/indexed/runtime.js +129 -0
  256. package/src/providers/indiegogo/executors.js +1 -1
  257. package/src/providers/investoday_mcp/executors.js +2 -2
  258. package/src/providers/iyunbiao/runtime.js +2 -2
  259. package/src/providers/keepa/actions.d.ts +1 -1
  260. package/src/providers/keepa/actions.js +371 -149
  261. package/src/providers/keepa/deal-attributes.d.ts +1 -0
  262. package/src/providers/keepa/deal-attributes.js +26 -0
  263. package/src/providers/keepa/runtime.js +212 -18
  264. package/src/providers/kingdee/executors.js +1 -1
  265. package/src/providers/kingdee/runtime.js +2 -2
  266. package/src/providers/kuaidi100/runtime.js +1 -1
  267. package/src/providers/linear/executors.d.ts +3 -0
  268. package/src/providers/linear/executors.js +14 -9
  269. package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
  270. package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
  271. package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
  272. package/src/providers/linear/trigger-on-issue-changed.js +215 -0
  273. package/src/providers/linear_mcp/actions.d.ts +47 -0
  274. package/src/providers/linear_mcp/actions.js +102 -0
  275. package/src/providers/linear_mcp/endpoints.d.ts +3 -0
  276. package/src/providers/linear_mcp/endpoints.js +3 -0
  277. package/src/providers/linear_mcp/executors.d.ts +3 -0
  278. package/src/providers/linear_mcp/executors.js +9 -0
  279. package/src/providers/linear_mcp/runtime-mcp.d.ts +15 -0
  280. package/src/providers/linear_mcp/runtime-mcp.js +238 -0
  281. package/src/providers/lingxing_mcp/runtime.js +1 -1
  282. package/src/providers/mcdonalds_cn_mcp/runtime.js +1 -1
  283. package/src/providers/metabase/mcp-runtime.js +1 -1
  284. package/src/providers/moneyforward_mcp/executors.d.ts +3 -0
  285. package/src/providers/moneyforward_mcp/executors.js +11 -0
  286. package/src/providers/moneyforward_mcp/manifest.d.ts +31 -0
  287. package/src/providers/moneyforward_mcp/manifest.js +204 -0
  288. package/src/providers/moneyforward_mcp/runtime.d.ts +18 -0
  289. package/src/providers/moneyforward_mcp/runtime.js +296 -0
  290. package/src/providers/notion/executors.d.ts +3 -0
  291. package/src/providers/notion/executors.js +41 -3
  292. package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
  293. package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
  294. package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
  295. package/src/providers/notion/trigger-on-database-page-event.js +293 -0
  296. package/src/providers/notion_mcp/endpoints.d.ts +3 -0
  297. package/src/providers/notion_mcp/endpoints.js +3 -0
  298. package/src/providers/notion_mcp/executors.d.ts +3 -0
  299. package/src/providers/notion_mcp/executors.js +176 -0
  300. package/src/providers/notion_mcp/mcp-response.d.ts +86 -0
  301. package/src/providers/notion_mcp/mcp-response.js +314 -0
  302. package/src/providers/odoo/executors.d.ts +3 -0
  303. package/src/providers/odoo/executors.js +32 -0
  304. package/src/providers/odoo/runtime.d.ts +16 -0
  305. package/src/providers/odoo/runtime.js +140 -0
  306. package/src/providers/one_drive/executors.d.ts +3 -0
  307. package/src/providers/one_drive/executors.js +2 -0
  308. package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
  309. package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
  310. package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
  311. package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
  312. package/src/providers/outlook/executors.d.ts +3 -0
  313. package/src/providers/outlook/executors.js +29 -6
  314. package/src/providers/outlook/microsoft-graph.js +17 -6
  315. package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
  316. package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
  317. package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
  318. package/src/providers/outlook/trigger-on-message-received.js +226 -0
  319. package/src/providers/outlook_calendar/executors.js +30 -7
  320. package/src/providers/patsnap_mcp/executors.js +2 -2
  321. package/src/providers/postiz/executors.d.ts +4 -0
  322. package/src/providers/postiz/executors.js +83 -0
  323. package/src/providers/provider-loader.d.ts +5 -0
  324. package/src/providers/provider-loader.js +4 -0
  325. package/src/providers/provider-runtime.d.ts +15 -0
  326. package/src/providers/provider-runtime.js +57 -4
  327. package/src/providers/proworkflow/executors.d.ts +4 -0
  328. package/src/providers/proworkflow/executors.js +135 -0
  329. package/src/providers/registry.generated.js +14 -0
  330. package/src/providers/scrape_creators/catalog.js +1 -1
  331. package/src/providers/scrape_creators/runtime.js +1 -1
  332. package/src/providers/sellersprite_mcp/executors.js +2 -2
  333. package/src/providers/sellersprite_mcp/official-actions.js +3 -2
  334. package/src/providers/sentry/runtime.js +6 -7
  335. package/src/providers/shopify/executors.d.ts +3 -0
  336. package/src/providers/shopify/executors.js +2 -0
  337. package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
  338. package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
  339. package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
  340. package/src/providers/shopify/trigger-on-shop-event.js +165 -0
  341. package/src/providers/slack/actions.js +52 -3
  342. package/src/providers/slack/executors.d.ts +3 -0
  343. package/src/providers/slack/executors.js +2 -0
  344. package/src/providers/slack/runtime.js +58 -21
  345. package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
  346. package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
  347. package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
  348. package/src/providers/slack/trigger-on-message-posted.js +176 -0
  349. package/src/providers/slickdeals/runtime.js +1 -1
  350. package/src/providers/sorftime_mcp/executors.js +2 -2
  351. package/src/providers/spotify/runtime.js +15 -4
  352. package/src/providers/stripe/executors.d.ts +3 -0
  353. package/src/providers/stripe/executors.js +2 -0
  354. package/src/providers/stripe/trigger-on-event.d.ts +2 -0
  355. package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
  356. package/src/providers/stripe/trigger-on-event.definition.js +43 -0
  357. package/src/providers/stripe/trigger-on-event.js +212 -0
  358. package/src/providers/telegram/executors.d.ts +3 -0
  359. package/src/providers/telegram/executors.js +2 -0
  360. package/src/providers/telegram/trigger-on-update.d.ts +2 -0
  361. package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
  362. package/src/providers/telegram/trigger-on-update.definition.js +78 -0
  363. package/src/providers/telegram/trigger-on-update.js +141 -0
  364. package/src/providers/tikhub/bounded-response.d.ts +1 -1
  365. package/src/providers/tikhub/bounded-response.js +8 -34
  366. package/src/providers/tikhub/endpoint-catalog.js +1 -1
  367. package/src/providers/tikhub/runtime.js +2 -2
  368. package/src/providers/tongdaxin/executors.js +79 -15
  369. package/src/providers/uspto/executors.js +1 -1
  370. package/src/providers/waffo/executors.js +1 -1
  371. package/src/providers/waffo/runtime.js +1 -1
  372. package/src/providers/wecom_mcp/runtime.js +1 -1
  373. package/src/providers/weixin_store/access-token.d.ts +2 -1
  374. package/src/providers/weixin_store/access-token.js +15 -4
  375. package/src/providers/weixin_store/executors.js +97 -12
  376. package/src/providers/wisburg/executors.d.ts +4 -0
  377. package/src/providers/wisburg/executors.js +13 -0
  378. package/src/providers/wisburg/runtime.d.ts +12 -0
  379. package/src/providers/wisburg/runtime.js +133 -0
  380. package/src/providers/woocommerce/executors.d.ts +3 -0
  381. package/src/providers/woocommerce/executors.js +2 -0
  382. package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
  383. package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
  384. package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
  385. package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
  386. package/src/providers/xydc_mcp/executors.js +2 -2
  387. package/src/providers/youtube/executors.js +1 -1
  388. package/src/providers/youtube/runtime.js +1 -1
  389. package/src/providers/zendesk/executors.d.ts +3 -0
  390. package/src/providers/zendesk/executors.js +2 -0
  391. package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
  392. package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
  393. package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
  394. package/src/providers/zendesk/trigger-on-event.js +188 -0
  395. package/src/providers/zerotier/executors.d.ts +9 -0
  396. package/src/providers/zerotier/executors.js +629 -0
  397. package/src/providers/zerotier/runtime.d.ts +54 -0
  398. package/src/providers/zerotier/runtime.js +207 -0
  399. package/src/saas/saas-cleanup-service.d.ts +26 -0
  400. package/src/saas/saas-cleanup-service.js +124 -0
  401. package/src/saas/saas-client.d.ts +86 -0
  402. package/src/saas/saas-client.js +369 -0
  403. package/src/saas/saas-execution-service.d.ts +15 -0
  404. package/src/saas/saas-execution-service.js +21 -0
  405. package/src/saas/saas-oauth-service.d.ts +25 -0
  406. package/src/saas/saas-oauth-service.js +197 -0
  407. package/src/saas/saas-project-service.d.ts +61 -0
  408. package/src/saas/saas-project-service.js +211 -0
  409. package/src/server/actions/action-idempotency.d.ts +1 -0
  410. package/src/server/actions/action-idempotency.js +1 -0
  411. package/src/server/actions/action-runner.d.ts +7 -0
  412. package/src/server/actions/action-runner.js +43 -7
  413. package/src/server/actions/run-log-summary.js +9 -0
  414. package/src/server/api/auth.d.ts +1 -0
  415. package/src/server/api/auth.js +13 -2
  416. package/src/server/api/cache-policy.js +4 -1
  417. package/src/server/api/connection-input.d.ts +7 -1
  418. package/src/server/api/connection-input.js +7 -1
  419. package/src/server/api/connection-routes.d.ts +3 -1
  420. package/src/server/api/connection-routes.js +21 -3
  421. package/src/server/api/http-utils.d.ts +4 -3
  422. package/src/server/api/oauth-completion-page.d.ts +124 -0
  423. package/src/server/api/oauth-completion-page.js +113 -18
  424. package/src/server/api/openapi.js +123 -15
  425. package/src/server/api/policy-input.js +6 -0
  426. package/src/server/api/runtime-api.d.ts +18 -3
  427. package/src/server/api/runtime-api.js +36 -5
  428. package/src/server/api/saas-completion-page.d.ts +2 -0
  429. package/src/server/api/saas-completion-page.js +103 -0
  430. package/src/server/connect-app.d.ts +5 -0
  431. package/src/server/connect-app.js +50 -0
  432. package/src/server/connect-server.d.ts +12 -0
  433. package/src/server/connect-server.js +157 -15
  434. package/src/server/connector-runtime.d.ts +3 -1
  435. package/src/server/connector-runtime.js +5 -2
  436. package/src/server/files/transit-files.js +16 -7
  437. package/src/server/proxy/proxy-runner.d.ts +5 -1
  438. package/src/server/proxy/proxy-runner.js +72 -26
  439. package/src/server/storage/connection-request-store.d.ts +41 -1
  440. package/src/server/storage/connection-request-store.js +245 -20
  441. package/src/server/storage/connection-store.d.ts +16 -0
  442. package/src/server/storage/connection-store.js +119 -0
  443. package/src/server/storage/node-runtime-database.js +3 -3
  444. package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
  445. package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
  446. package/src/server/storage/postgres/runtime-store.d.ts +43 -0
  447. package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
  448. package/src/server/storage/runtime-database.d.ts +4 -0
  449. package/src/server/storage/runtime-sql.d.ts +1 -1
  450. package/src/server/storage/runtime-sql.js +2 -1
  451. package/src/server/storage/runtime-store.d.ts +1 -0
  452. package/src/server/storage/runtime-token-service.d.ts +2 -0
  453. package/src/server/storage/runtime-token-service.js +3 -0
  454. package/src/server/storage/saas-project-store.d.ts +77 -0
  455. package/src/server/storage/saas-project-store.js +273 -0
  456. package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
  457. package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
  458. package/src/server/storage/trigger-store.d.ts +16 -0
  459. package/src/server/storage/trigger-store.js +96 -0
  460. package/src/triggers/common/config.d.ts +2 -0
  461. package/src/triggers/common/config.js +17 -0
  462. package/src/triggers/common/configOptions.d.ts +13 -0
  463. package/src/triggers/common/configOptions.js +1 -0
  464. package/src/triggers/common/encoding.d.ts +3 -0
  465. package/src/triggers/common/encoding.js +19 -0
  466. package/src/triggers/common/integration.d.ts +115 -0
  467. package/src/triggers/common/integration.js +31 -0
  468. package/src/triggers/common/json.d.ts +6 -0
  469. package/src/triggers/common/json.js +91 -0
  470. package/src/triggers/common/poll.d.ts +41 -0
  471. package/src/triggers/common/poll.js +15 -0
  472. package/src/triggers/common/proxy.d.ts +14 -0
  473. package/src/triggers/common/proxy.js +1 -0
  474. package/src/triggers/common/types.d.ts +42 -0
  475. package/src/triggers/common/types.js +1 -0
  476. package/src/triggers/maintenance.d.ts +40 -0
  477. package/src/triggers/maintenance.js +120 -0
  478. package/src/triggers/metadata.d.ts +8 -0
  479. package/src/triggers/metadata.js +1 -0
  480. package/src/triggers/request.d.ts +33 -0
  481. package/src/triggers/request.js +52 -0
  482. package/src/triggers/resources.d.ts +12 -0
  483. package/src/triggers/resources.js +121 -0
  484. package/src/triggers/signature.d.ts +4 -0
  485. package/src/triggers/signature.js +48 -0
  486. package/src/triggers/store.d.ts +29 -0
  487. package/src/triggers/store.js +1 -0
  488. package/src/triggers/subscriptions.d.ts +22 -0
  489. package/src/triggers/subscriptions.js +220 -0
  490. package/src/triggers/trigger-runner.d.ts +34 -0
  491. package/src/triggers/trigger-runner.js +169 -0
  492. package/src/providers/sentry/scopes.d.ts +0 -1
  493. package/src/providers/sentry/scopes.js +0 -7
  494. package/src/server/storage/postgres-runtime-store.d.ts +0 -39
  495. /package/src/providers/{cloudflare-current-user.d.ts → cloudflare_dns/runtime-user.d.ts} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { compactObject, looseArray, optionalBoolean, optionalNumber, optionalRawString, optionalRecord, optionalString, requiredString, } from "../../core/cast.js";
2
2
  import { compactJson, encodePathSegment } from "../../core/request.js";
3
3
  import { microsoftGraphJson, microsoftGraphRequest } from "../outlook/microsoft-graph.js";
4
+ import { providerInputError } from "../provider-runtime.js";
4
5
  import { defineOAuthProviderExecutors, defineProviderProxy, requiredInputString } from "../provider-runtime.js";
5
6
  const service = "outlook_calendar";
6
7
  const graphBaseUrl = "https://graph.microsoft.com/v1.0";
@@ -97,19 +98,31 @@ async function getCalendar(input, context) {
97
98
  return microsoftGraphJson(`me/calendars/${encodePathSegment(id)}`, requestOptions(context, "get calendar", { $select: stringList(input.select) }));
98
99
  }
99
100
  async function listEvents(input, context, calendarView) {
100
- const nextLinkValue = optionalString(input.nextLink);
101
+ // Graph v1.0 tracks calendar changes through calendarView/delta only
102
+ // (events/delta is a beta preview); a nextLink continues the current round,
103
+ // a deltaLink starts the next one.
104
+ const followUpLink = optionalString(input.nextLink) ?? (calendarView ? optionalString(input.deltaLink) : undefined);
105
+ const delta = calendarView && input.delta === true;
106
+ if (delta &&
107
+ !followUpLink &&
108
+ [input.select, input.filter, input.orderby, input.expand].some((value) => value !== undefined)) {
109
+ throw providerInputError("Calendar view delta does not support select, filter, orderby or expand.");
110
+ }
101
111
  const calendar = optionalString(input.calendarId);
102
112
  const collection = calendarView ? "calendarView" : "events";
103
- const path = calendar ? `me/calendars/${encodePathSegment(calendar)}/${collection}` : `me/${collection}`;
104
- const query = nextLinkValue
113
+ const path = `${calendar ? `me/calendars/${encodePathSegment(calendar)}/${collection}` : `me/${collection}`}${delta ? "/delta" : ""}`;
114
+ const query = followUpLink
105
115
  ? undefined
106
116
  : compactObject({
107
117
  ...listQuery(input),
108
118
  startDateTime: calendarView ? optionalString(input.startDateTime) : undefined,
109
119
  endDateTime: calendarView ? optionalString(input.endDateTime) : undefined,
110
120
  });
111
- const payload = await microsoftGraphJson(nextLinkValue ?? path, requestOptions(context, `list ${calendarView ? "calendar view" : "events"}`, query, allowEventNextLink, preferTimeZone(input)));
112
- return listOutput(payload, "events");
121
+ const payload = await microsoftGraphJson(followUpLink ?? path, requestOptions(context, `list ${calendarView ? "calendar view" : "events"}`, query, allowEventNextLink, preferTimeZone(input)));
122
+ // Rows stay raw so a delta round's `@removed` markers pass through. Only the
123
+ // calendar view has delta rounds, so only it reports a deltaLink.
124
+ const output = listOutput(payload, "events");
125
+ return calendarView ? { ...output, deltaLink: optionalString(payload["@odata.deltaLink"]) ?? null } : output;
113
126
  }
114
127
  async function getEvent(input, context) {
115
128
  const id = requiredInputString(input.eventId, "eventId");
@@ -212,16 +225,26 @@ function allowEventNextLink(pathname) {
212
225
  return true;
213
226
  }
214
227
  const segments = pathname.split("/").filter(Boolean);
228
+ // Delta links end in a trailing `delta` segment on the same three shapes,
229
+ // and only for calendarView: events/delta is not on Graph v1.0.
230
+ const delta = segments.length > 3 && segments[segments.length - 1] === "delta";
231
+ if (delta) {
232
+ segments.pop();
233
+ }
234
+ const isEventCollection = (segment) => segment === "calendarView" || (!delta && segment === "events");
235
+ if (delta && segments.length === 3 && segments[0] === "v1.0" && segments[1] === "me") {
236
+ return isEventCollection(segments[2]);
237
+ }
215
238
  if (segments.length === 4 &&
216
239
  segments[0] === "v1.0" &&
217
240
  segments[1] === "me" &&
218
241
  segments[2]?.startsWith("calendars('") &&
219
242
  segments[2].endsWith("')")) {
220
- return segments[3] === "events" || segments[3] === "calendarView";
243
+ return isEventCollection(segments[3]);
221
244
  }
222
245
  return (segments.length === 5 &&
223
246
  segments[0] === "v1.0" &&
224
247
  segments[1] === "me" &&
225
248
  segments[2] === "calendars" &&
226
- (segments[4] === "events" || segments[4] === "calendarView"));
249
+ isEventCollection(segments[4]));
227
250
  }
@@ -37,7 +37,7 @@ export const proxy = defineProviderProxy({
37
37
  return endpoints.has(new URL(endpoint, patsnapMcpOrigin).href);
38
38
  },
39
39
  skipDnsValidation: true,
40
- redirect: "error",
40
+ redirect: "manual",
41
41
  customizeRequest({ headers }) {
42
42
  headers.set("accept", "application/json, text/event-stream");
43
43
  },
@@ -95,7 +95,7 @@ async function withClient(context, server, run) {
95
95
  transport: "streamable_http",
96
96
  fetcher: context.fetcher,
97
97
  headers: { authorization: `Bearer ${context.apiKey}`, "user-agent": providerUserAgent },
98
- redirect: "error",
98
+ redirect: "manual",
99
99
  signal: context.signal,
100
100
  mapError: mapMcpError,
101
101
  }, run);
@@ -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,83 @@
1
+ import { optionalRecord, optionalString } from "../../core/cast.js";
2
+ import { defineApiKeyProviderExecutors, defineProviderProxy, ProviderRequestError, providerUserAgent, readProviderJsonBody, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
3
+ const service = "postiz";
4
+ const baseUrl = "https://api.postiz.com/public/v1";
5
+ const handlers = {
6
+ list_integrations: async (input, context) => readPostizCollection(await request(context, "/integrations", { query: { group: optionalString(input.group) } }), "integrations"),
7
+ list_posts: async (input, context) => requiredResponseRecord(await request(context, "/posts", {
8
+ query: {
9
+ startDate: optionalString(input.startDate),
10
+ endDate: optionalString(input.endDate),
11
+ customer: optionalString(input.customer),
12
+ },
13
+ }), "Postiz posts"),
14
+ upload_from_url: async (input, context) => requiredResponseRecord(await request(context, "/upload-from-url", { method: "POST", body: { url: input.url } }), "Postiz uploaded media"),
15
+ create_post: async (input, context) => readPostizCollection(await request(context, "/posts", { method: "POST", body: input }), "created posts"),
16
+ };
17
+ export const executors = defineApiKeyProviderExecutors(service, handlers, {
18
+ skipDnsValidation: true,
19
+ });
20
+ export const credentialValidators = {
21
+ async apiKey(input, { fetcher, signal }) {
22
+ const result = optionalRecord(await request({ apiKey: input.apiKey, fetcher, signal }, "/is-connected"));
23
+ if (result?.connected !== true) {
24
+ throw new ProviderRequestError(502, "Postiz did not confirm the API key connection");
25
+ }
26
+ return {
27
+ profile: { accountId: "api_key", displayName: "Postiz API Key" },
28
+ grantedScopes: [],
29
+ metadata: { apiBaseUrl: baseUrl },
30
+ };
31
+ },
32
+ };
33
+ export const proxy = defineProviderProxy({
34
+ service,
35
+ baseUrl,
36
+ auth: { type: "api_key_header", name: "Authorization" },
37
+ skipDnsValidation: true,
38
+ customizeRequest({ headers }) {
39
+ if (!headers.has("accept"))
40
+ headers.set("accept", "application/json");
41
+ },
42
+ });
43
+ async function request(context, path, options = {}) {
44
+ return runProviderRequest({ signal: context.signal, label: "Postiz" }, async (signal) => {
45
+ const url = new URL(`${baseUrl}${path}`);
46
+ for (const [key, value] of Object.entries(options.query ?? {})) {
47
+ if (value !== undefined)
48
+ url.searchParams.set(key, value);
49
+ }
50
+ const headers = new Headers({
51
+ accept: "application/json",
52
+ authorization: context.apiKey,
53
+ "user-agent": providerUserAgent,
54
+ });
55
+ if (options.body !== undefined)
56
+ headers.set("content-type", "application/json");
57
+ const response = await context.fetcher(url, {
58
+ method: options.method,
59
+ headers,
60
+ body: options.body === undefined ? undefined : JSON.stringify(options.body),
61
+ signal,
62
+ });
63
+ const payload = await readProviderJsonBody(response, {
64
+ emptyBody: null,
65
+ invalidJsonMessage: "Postiz returned invalid JSON",
66
+ invalidJsonFallback: response.ok ? undefined : (text) => text,
67
+ });
68
+ if (!response.ok) {
69
+ const details = optionalRecord(payload);
70
+ const message = optionalString(details?.message) ??
71
+ optionalString(details?.error) ??
72
+ optionalString(payload) ??
73
+ `Postiz request failed with HTTP ${response.status}`;
74
+ throw new ProviderRequestError(response.status, message, payload);
75
+ }
76
+ return payload;
77
+ });
78
+ }
79
+ function readPostizCollection(value, label) {
80
+ if (!Array.isArray(value))
81
+ throw new ProviderRequestError(502, `Postiz returned invalid ${label}`);
82
+ return value;
83
+ }
@@ -1,6 +1,9 @@
1
1
  import type { ActionExecutor, CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../core/types.ts";
2
2
  import type { ProviderOAuthRuntime } from "../oauth/oauth-token.ts";
3
+ import type { IntegrationDefinition } from "../triggers/common/integration.ts";
4
+ import type { PollDefinition } from "../triggers/common/poll.ts";
3
5
  export interface ExecutorModule {
6
+ triggers?: readonly (IntegrationDefinition | PollDefinition)[];
4
7
  credentialValidators?: CredentialValidators;
5
8
  executors: ProviderExecutors;
6
9
  oauth?: ProviderOAuthRuntime;
@@ -30,6 +33,7 @@ export interface IProviderLoader {
30
33
  * Load a provider credential validator only when a connection is created.
31
34
  */
32
35
  loadCredentialValidators(service: string): Promise<CredentialValidators | undefined>;
36
+ loadTriggerDefinitions?(service: string): Promise<readonly (IntegrationDefinition | PollDefinition)[]>;
33
37
  /** Load provider-specific OAuth operations when the provider defines them. */
34
38
  loadProviderOAuthRuntime?(service: string): Promise<ProviderOAuthRuntime | undefined>;
35
39
  }
@@ -43,5 +47,6 @@ export declare class ProviderLoader implements IProviderLoader {
43
47
  loadProxyExecutor(service: string, _providerDisplayName?: string): Promise<ProviderProxyExecutor | undefined>;
44
48
  loadCredentialValidators(service: string): Promise<CredentialValidators | undefined>;
45
49
  loadProviderOAuthRuntime(service: string): Promise<ProviderOAuthRuntime | undefined>;
50
+ loadTriggerDefinitions(service: string): Promise<readonly (IntegrationDefinition | PollDefinition)[]>;
46
51
  private _findActionExecutor;
47
52
  }
@@ -39,6 +39,10 @@ export class ProviderLoader {
39
39
  }
40
40
  return (await loadRuntime()).oauth;
41
41
  }
42
+ async loadTriggerDefinitions(service) {
43
+ const load = this.executorModules[service];
44
+ return load ? ((await load()).triggers ?? []) : [];
45
+ }
42
46
  _findActionExecutor(service, actionId, executors) {
43
47
  if (!actionId.startsWith(`${service}.`)) {
44
48
  return undefined;
@@ -372,6 +372,21 @@ export declare function setSearchParams(url: URL, query: Record<string, string |
372
372
  * Read a bounded provider error response body as text.
373
373
  */
374
374
  export declare function readProviderErrorTextBody(response: Response, fieldName: string): Promise<string>;
375
+ /**
376
+ * Read a `Retry-After` header as whole seconds from now: an integer delay
377
+ * verbatim, an HTTP-date as the seconds until that instant (never negative).
378
+ * Examples: `"73" => 73`; a date 90 s ahead `=> 90`; absent or unparseable
379
+ * `=> undefined`.
380
+ */
381
+ export declare function readRetryAfterSeconds(headers: Headers, now?: number): number | undefined;
382
+ /**
383
+ * Attach a rate-limited response's `Retry-After` to its error details in the
384
+ * shape Slack established, `details.retryAfterSeconds`, so every provider's
385
+ * 429 (and 503) reaches the action envelope with the same pacing hint.
386
+ * Other statuses, and responses without a usable header, return `details`
387
+ * untouched; non-record details are kept under `body`.
388
+ */
389
+ export declare function withRetryAfterSeconds(response: Response, details?: unknown): unknown;
375
390
  /**
376
391
  * Read a JSON provider response or raise a structured provider request error.
377
392
  */
@@ -264,6 +264,11 @@ export async function readProviderProxyResponse(response, options = {}) {
264
264
  };
265
265
  }
266
266
  export async function readProviderProxyErrorMessage(response, fallbackMessage) {
267
+ // An unfollowed redirect's body usually echoes its `Location`, which may carry a signed target URL.
268
+ if (response.status >= 300 && response.status < 400) {
269
+ await response.body?.cancel().catch(() => undefined);
270
+ return fallbackMessage;
271
+ }
267
272
  const bytes = await readBoundedResponseBytes(response, {
268
273
  maxBytes: defaultProviderProxyMaxResponseBytes,
269
274
  fieldName: "proxy error response",
@@ -356,7 +361,8 @@ export function defineProviderProxy(input) {
356
361
  }
357
362
  const response = await egressFetch(url, init);
358
363
  if (!response.ok) {
359
- if (input.readError) {
364
+ // A provider error parser would surface an unfollowed redirect's body; the shared reader withholds it.
365
+ if (input.readError && (response.status < 300 || response.status >= 400)) {
360
366
  throw await input.readError(response);
361
367
  }
362
368
  throw new ProviderRequestError(response.status, await readProviderProxyErrorMessage(response, `provider request failed with HTTP ${response.status}`));
@@ -679,6 +685,52 @@ export async function readProviderErrorTextBody(response, fieldName) {
679
685
  return "";
680
686
  }
681
687
  }
688
+ // The three HTTP-date forms of RFC 9110 section 5.6.7. Date.parse alone is too
689
+ // lenient for a header: V8 reads "wait 5" as 1 May 2001, and reads the zone-less
690
+ // asctime form as local time although every HTTP-date is UTC.
691
+ const imfFixdatePattern = /^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), \d{2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4} \d{2}:\d{2}:\d{2} GMT$/;
692
+ const rfc850DatePattern = /^(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day, \d{2}-(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{2} \d{2}:\d{2}:\d{2} GMT$/;
693
+ const asctimeDatePattern = /^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ \d]\d \d{2}:\d{2}:\d{2} \d{4}$/;
694
+ /**
695
+ * Read a `Retry-After` header as whole seconds from now: an integer delay
696
+ * verbatim, an HTTP-date as the seconds until that instant (never negative).
697
+ * Examples: `"73" => 73`; a date 90 s ahead `=> 90`; absent or unparseable
698
+ * `=> undefined`.
699
+ */
700
+ export function readRetryAfterSeconds(headers, now = Date.now()) {
701
+ const value = headers.get("retry-after")?.trim();
702
+ if (!value) {
703
+ return undefined;
704
+ }
705
+ if (/^\d+$/.test(value)) {
706
+ const seconds = Number(value);
707
+ return Number.isSafeInteger(seconds) ? seconds : undefined;
708
+ }
709
+ const retryAt = imfFixdatePattern.test(value) || rfc850DatePattern.test(value)
710
+ ? Date.parse(value)
711
+ : asctimeDatePattern.test(value)
712
+ ? Date.parse(`${value} GMT`)
713
+ : Number.NaN;
714
+ return Number.isFinite(retryAt) ? Math.max(0, Math.ceil((retryAt - now) / 1000)) : undefined;
715
+ }
716
+ /**
717
+ * Attach a rate-limited response's `Retry-After` to its error details in the
718
+ * shape Slack established, `details.retryAfterSeconds`, so every provider's
719
+ * 429 (and 503) reaches the action envelope with the same pacing hint.
720
+ * Other statuses, and responses without a usable header, return `details`
721
+ * untouched; non-record details are kept under `body`.
722
+ */
723
+ export function withRetryAfterSeconds(response, details) {
724
+ if (response.status !== 429 && response.status !== 503) {
725
+ return details;
726
+ }
727
+ const retryAfterSeconds = readRetryAfterSeconds(response.headers);
728
+ if (retryAfterSeconds === undefined) {
729
+ return details;
730
+ }
731
+ const record = optionalRecord(details) ?? (details == null ? {} : { body: details });
732
+ return { ...record, retryAfterSeconds };
733
+ }
682
734
  /**
683
735
  * Read a JSON provider response or raise a structured provider request error.
684
736
  */
@@ -806,9 +858,10 @@ export function toProviderExecutionError(error, fallbackMessage) {
806
858
  ? "authorization_failed"
807
859
  : error.status === 429
808
860
  ? "rate_limited"
809
- : error.status < 500
810
- ? "invalid_input"
811
- : "provider_error"),
861
+ : // A 3xx is an upstream redirect that `redirect: "manual"` surfaced unfollowed, not bad input.
862
+ error.status < 500 && (error.status < 300 || error.status >= 400)
863
+ ? "invalid_input"
864
+ : "provider_error"),
812
865
  message: error.message,
813
866
  details: {
814
867
  status: error.status,
@@ -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,135 @@
1
+ import { compactObject, looseArray, optionalRecord, optionalString } from "../../core/cast.js";
2
+ import { defineApiKeyProviderExecutors, defineProviderProxy, providerInputError, ProviderRequestError, providerUserAgent, readProviderJsonBody, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
3
+ const service = "proworkflow";
4
+ const baseUrl = "https://api.proworkflow.com/api/v4";
5
+ const handlers = {
6
+ list_projects: (input, context) => request(context, "/projects", { query: buildListQuery(input) }),
7
+ get_project: (input, context) => request(context, `/projects/${positiveInteger(input.projectId, "projectId")}`, {
8
+ query: { fields: input.fields },
9
+ }),
10
+ update_project: (input, context) => request(context, `/projects/${positiveInteger(input.projectId, "projectId")}`, {
11
+ method: "PUT",
12
+ body: requireUpdateFields(compactObject({
13
+ title: input.title,
14
+ number: input.number,
15
+ description: input.description,
16
+ startdate: input.startDate,
17
+ duedate: input.dueDate,
18
+ completedate: input.completedDate,
19
+ priorityid: input.priorityId,
20
+ managerid: input.managerId,
21
+ companyid: input.companyId,
22
+ notification: input.notification,
23
+ })),
24
+ }),
25
+ list_project_items: (input, context) => request(context, "/projects/items", {
26
+ query: { ...buildListQuery(input), projectid: input.projectId },
27
+ }),
28
+ get_project_item: (input, context) => request(context, `/projects/items/${positiveInteger(input.itemId, "itemId")}`),
29
+ update_project_item: (input, context) => request(context, `/projects/items/${positiveInteger(input.itemId, "itemId")}`, {
30
+ method: "PUT",
31
+ body: requireUpdateFields(compactObject({
32
+ name: input.name,
33
+ code: input.code,
34
+ description: input.description,
35
+ startdate: input.startDate,
36
+ duedate: input.dueDate,
37
+ completedate: input.completedDate,
38
+ status: input.status,
39
+ priorityid: input.priorityId,
40
+ manualPercentageComplete: input.percentComplete,
41
+ })),
42
+ }),
43
+ };
44
+ export const executors = defineApiKeyProviderExecutors(service, handlers, {
45
+ skipDnsValidation: true,
46
+ });
47
+ export const credentialValidators = {
48
+ async apiKey(input, { fetcher, signal }) {
49
+ const payload = requiredResponseRecord(await request({ apiKey: input.apiKey, fetcher, signal }, "/settings/account", {}, "validate"), "ProWorkflow account settings response");
50
+ const data = requiredResponseRecord(payload.data, "ProWorkflow account settings data");
51
+ return {
52
+ profile: { accountId: "api_key", displayName: optionalString(data.accounturl) ?? "ProWorkflow API Key" },
53
+ grantedScopes: [],
54
+ metadata: { apiBaseUrl: baseUrl, validationEndpoint: "/settings/account" },
55
+ };
56
+ },
57
+ };
58
+ export const proxy = defineProviderProxy({
59
+ service,
60
+ baseUrl,
61
+ auth: { type: "api_key_header", name: "apikey" },
62
+ skipDnsValidation: true,
63
+ customizeRequest({ headers }) {
64
+ if (!headers.has("accept"))
65
+ headers.set("accept", "application/json");
66
+ },
67
+ });
68
+ async function request(context, path, options = {}, phase = "execute") {
69
+ return runProviderRequest({ signal: context.signal, label: "ProWorkflow" }, async (signal) => {
70
+ const url = new URL(`${baseUrl}${path}`);
71
+ for (const [key, value] of Object.entries(options.query ?? {})) {
72
+ if (value != null && value !== "")
73
+ url.searchParams.set(key, String(value));
74
+ }
75
+ const response = await context.fetcher(url, {
76
+ method: options.method,
77
+ headers: {
78
+ accept: "application/json",
79
+ apikey: context.apiKey,
80
+ "content-type": "application/json",
81
+ "user-agent": providerUserAgent,
82
+ },
83
+ body: options.body === undefined ? undefined : JSON.stringify(options.body),
84
+ signal,
85
+ });
86
+ const payload = await readProviderJsonBody(response, {
87
+ emptyBody: {},
88
+ invalidJsonMessage: "ProWorkflow returned invalid JSON",
89
+ trimEmptyBody: false,
90
+ });
91
+ if (!response.ok)
92
+ throw createError(response.status, payload, phase);
93
+ return requiredResponseRecord(payload, "ProWorkflow response");
94
+ });
95
+ }
96
+ function buildListQuery(input) {
97
+ if ((input.pageNumber == null) !== (input.pageSize == null)) {
98
+ throw providerInputError("pageNumber and pageSize must be provided together");
99
+ }
100
+ return {
101
+ fields: input.fields,
102
+ q: input.q,
103
+ status: input.status,
104
+ sortby: input.sortBy,
105
+ sortorder: input.sortOrder,
106
+ pagenumber: input.pageNumber,
107
+ pagesize: input.pageSize,
108
+ includetotalrows: input.includeTotalRows,
109
+ companyid: input.companyId,
110
+ };
111
+ }
112
+ function requireUpdateFields(body) {
113
+ if (Object.keys(body).length === 0)
114
+ throw providerInputError("at least one update field is required");
115
+ return body;
116
+ }
117
+ function positiveInteger(value, fieldName) {
118
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 1) {
119
+ throw providerInputError(`${fieldName} must be a positive integer`);
120
+ }
121
+ return value;
122
+ }
123
+ function createError(status, payload, phase) {
124
+ const record = optionalRecord(payload);
125
+ const messages = looseArray(record?.data)
126
+ .filter((item) => typeof item === "string" && item.trim() !== "")
127
+ .join("; ");
128
+ const message = messages || optionalString(record?.message) || `ProWorkflow request failed with ${status}`;
129
+ if (status === 429)
130
+ return new ProviderRequestError(429, message, payload);
131
+ if (phase === "execute" && [400, 404, 422].includes(status)) {
132
+ return new ProviderRequestError(400, message, payload, "invalid_input");
133
+ }
134
+ return new ProviderRequestError(status || 500, message, payload);
135
+ }
@@ -120,6 +120,7 @@ export const executorModules = {
120
120
  baidu_maps: () => import("./baidu_maps/executors.js"),
121
121
  baidu_netdisk: () => import("./baidu_netdisk/executors.js"),
122
122
  baixiao: () => import("./baixiao/executors.js"),
123
+ baizhi_mcp: () => import("./baizhi_mcp/executors.js"),
123
124
  balldontlie_worldcup: () => import("./balldontlie_worldcup/executors.js"),
124
125
  bamboohr: () => import("./bamboohr/executors.js"),
125
126
  bannerbear: () => import("./bannerbear/executors.js"),
@@ -406,6 +407,7 @@ export const executorModules = {
406
407
  doubao_speech: () => import("./doubao_speech/executors.js"),
407
408
  dovetail: () => import("./dovetail/executors.js"),
408
409
  drata: () => import("./drata/executors.js"),
410
+ drawio_mcp: () => import("./drawio_mcp/executors.js"),
409
411
  drimify: () => import("./drimify/executors.js"),
410
412
  dropbox: () => import("./dropbox/executors.js"),
411
413
  dropbox_sign: () => import("./dropbox_sign/executors.js"),
@@ -437,6 +439,7 @@ export const executorModules = {
437
439
  encodian: () => import("./encodian/executors.js"),
438
440
  energy_performance_certificates: () => import("./energy_performance_certificates/executors.js"),
439
441
  enigma: () => import("./enigma/executors.js"),
442
+ enormail: () => import("./enormail/executors.js"),
440
443
  envoy: () => import("./envoy/executors.js"),
441
444
  eodhd_apis: () => import("./eodhd_apis/executors.js"),
442
445
  eraser: () => import("./eraser/executors.js"),
@@ -510,6 +513,7 @@ export const executorModules = {
510
513
  formstack: () => import("./formstack/executors.js"),
511
514
  formstack_documents: () => import("./formstack_documents/executors.js"),
512
515
  foursquare: () => import("./foursquare/executors.js"),
516
+ framejet: () => import("./framejet/executors.js"),
513
517
  fraudlabspro: () => import("./fraudlabspro/executors.js"),
514
518
  freepik: () => import("./freepik/executors.js"),
515
519
  freshdesk: () => import("./freshdesk/executors.js"),
@@ -522,6 +526,7 @@ export const executorModules = {
522
526
  fullenrich: () => import("./fullenrich/executors.js"),
523
527
  fundzwatch: () => import("./fundzwatch/executors.js"),
524
528
  "fusion-api": () => import("./fusion-api/executors.js"),
529
+ futunn: () => import("./futunn/executors.js"),
525
530
  fuxin: () => import("./fuxin/executors.js"),
526
531
  gagelist: () => import("./gagelist/executors.js"),
527
532
  gainsight_nxt: () => import("./gainsight_nxt/executors.js"),
@@ -657,6 +662,7 @@ export const executorModules = {
657
662
  imgix: () => import("./imgix/executors.js"),
658
663
  incident_io: () => import("./incident_io/executors.js"),
659
664
  indeed: () => import("./indeed/executors.js"),
665
+ indexed: () => import("./indexed/executors.js"),
660
666
  indiegogo: () => import("./indiegogo/executors.js"),
661
667
  influxdb_cloud: () => import("./influxdb_cloud/executors.js"),
662
668
  infolobby: () => import("./infolobby/executors.js"),
@@ -768,6 +774,7 @@ export const executorModules = {
768
774
  lightspeed_vt: () => import("./lightspeed_vt/executors.js"),
769
775
  line: () => import("./line/executors.js"),
770
776
  linear: () => import("./linear/executors.js"),
777
+ linear_mcp: () => import("./linear_mcp/executors.js"),
771
778
  linguapop: () => import("./linguapop/executors.js"),
772
779
  lingvanex_translation_api: () => import("./lingvanex_translation_api/executors.js"),
773
780
  lingxing_mcp: () => import("./lingxing_mcp/executors.js"),
@@ -870,6 +877,7 @@ export const executorModules = {
870
877
  mojo_helpdesk: () => import("./mojo_helpdesk/executors.js"),
871
878
  momentum_io: () => import("./momentum_io/executors.js"),
872
879
  monday: () => import("./monday/executors.js"),
880
+ moneyforward_mcp: () => import("./moneyforward_mcp/executors.js"),
873
881
  mongo_db_atlas_administration: () => import("./mongo_db_atlas_administration/executors.js"),
874
882
  monica_crm: () => import("./monica_crm/executors.js"),
875
883
  moonclerk: () => import("./moonclerk/executors.js"),
@@ -919,6 +927,7 @@ export const executorModules = {
919
927
  northbeam: () => import("./northbeam/executors.js"),
920
928
  northflank: () => import("./northflank/executors.js"),
921
929
  notion: () => import("./notion/executors.js"),
930
+ notion_mcp: () => import("./notion_mcp/executors.js"),
922
931
  novu: () => import("./novu/executors.js"),
923
932
  nozbe_teams: () => import("./nozbe_teams/executors.js"),
924
933
  npm: () => import("./npm/executors.js"),
@@ -931,6 +940,7 @@ export const executorModules = {
931
940
  ocrspace: () => import("./ocrspace/executors.js"),
932
941
  octave: () => import("./octave/executors.js"),
933
942
  octopus_deploy: () => import("./octopus_deploy/executors.js"),
943
+ odoo: () => import("./odoo/executors.js"),
934
944
  oksign: () => import("./oksign/executors.js"),
935
945
  okta: () => import("./okta/executors.js"),
936
946
  omise: () => import("./omise/executors.js"),
@@ -1052,6 +1062,7 @@ export const executorModules = {
1052
1062
  postgrid: () => import("./postgrid/executors.js"),
1053
1063
  postgrid_verify: () => import("./postgrid_verify/executors.js"),
1054
1064
  posthog: () => import("./posthog/executors.js"),
1065
+ postiz: () => import("./postiz/executors.js"),
1055
1066
  postman: () => import("./postman/executors.js"),
1056
1067
  postmark: () => import("./postmark/executors.js"),
1057
1068
  practitest: () => import("./practitest/executors.js"),
@@ -1072,6 +1083,7 @@ export const executorModules = {
1072
1083
  projectmanager: () => import("./projectmanager/executors.js"),
1073
1084
  promptlayer: () => import("./promptlayer/executors.js"),
1074
1085
  prospeo: () => import("./prospeo/executors.js"),
1086
+ proworkflow: () => import("./proworkflow/executors.js"),
1075
1087
  proxiedmail: () => import("./proxiedmail/executors.js"),
1076
1088
  prtg_classic: () => import("./prtg_classic/executors.js"),
1077
1089
  pubmed: () => import("./pubmed/executors.js"),
@@ -1494,6 +1506,7 @@ export const executorModules = {
1494
1506
  whop: () => import("./whop/executors.js"),
1495
1507
  winston_ai: () => import("./winston_ai/executors.js"),
1496
1508
  wire2air: () => import("./wire2air/executors.js"),
1509
+ wisburg: () => import("./wisburg/executors.js"),
1497
1510
  wise: () => import("./wise/executors.js"),
1498
1511
  wit_ai: () => import("./wit_ai/executors.js"),
1499
1512
  wiza: () => import("./wiza/executors.js"),
@@ -1542,6 +1555,7 @@ export const executorModules = {
1542
1555
  zep: () => import("./zep/executors.js"),
1543
1556
  zeplin: () => import("./zeplin/executors.js"),
1544
1557
  zerobounce: () => import("./zerobounce/executors.js"),
1558
+ zerotier: () => import("./zerotier/executors.js"),
1545
1559
  zhihu: () => import("./zhihu/executors.js"),
1546
1560
  zigpoll: () => import("./zigpoll/executors.js"),
1547
1561
  zip_archive_api: () => import("./zip_archive_api/executors.js"),
@@ -111,7 +111,7 @@ async function fetchOpenApi(fetcher) {
111
111
  try {
112
112
  const response = await fetcher(openApiUrl, {
113
113
  headers: { accept: "application/json" },
114
- redirect: "error",
114
+ redirect: "manual",
115
115
  signal: timeout.signal,
116
116
  });
117
117
  if (!response.ok)
@@ -95,7 +95,7 @@ async function requestJson(method, path, query, body, apiKey, fetcher, phase, pa
95
95
  method,
96
96
  headers,
97
97
  body: serializedBody,
98
- redirect: "error",
98
+ redirect: "manual",
99
99
  signal: timeout.signal,
100
100
  });
101
101
  const text = await readBoundedResponseText(response, responseMaxBytes, "Scrape Creators response");
@@ -15,7 +15,7 @@ const handlers = mapProviderActionHandlers(service, sellerspriteMcpActions, (_ac
15
15
  if (name === "call_tool") {
16
16
  return (input, context) => call(context, required(input.toolName, "toolName"), object(input.arguments));
17
17
  }
18
- return (input, context) => call(context, name, input);
18
+ return (input, context) => call(context, name, name === "traffic_extend" ? { ...input, queryType: input.queryType ?? 2 } : input);
19
19
  });
20
20
  export const executors = defineApiKeyProviderExecutors(service, handlers, {
21
21
  skipDnsValidation: true,
@@ -39,7 +39,7 @@ export const proxy = defineProviderProxy({
39
39
  auth: { type: "api_key_header", name: "secret-key" },
40
40
  skipDnsValidation: true,
41
41
  timeoutMs,
42
- redirect: "error",
42
+ redirect: "manual",
43
43
  customizeRequest({ url, headers }) {
44
44
  if (url.toString() !== endpoint) {
45
45
  throw new ProviderRequestError(400, "SellerSprite MCP proxy only supports the official /mcp endpoint");
@@ -705,7 +705,7 @@ const parameterDescriptionByToolAndName = {
705
705
  "keyword_miner.filterRootWord": "Root-word filter: 0 includes all keywords and 1 includes only root-word matches.",
706
706
  "keyword_miner.matchType": "Keyword match type: 2 for broad or 3 for phrase.",
707
707
  "traffic_extend.asinList": "Amazon ASINs to query, with at most 20 values.",
708
- "traffic_extend.queryType": "Variation query mode: 0 for all variations, 1 for the best-selling variation, or 2 for the current variation.",
708
+ "traffic_extend.queryType": "Variation query mode: 0 for all variations, 1 for the best-selling variation, or 2 for the current variation; defaults to 2.",
709
709
  "aba_research_weekly.searchModel": "Search model from 1 through 6: popular, changing, sustained growth, rapid growth, potential, or long-tail market.",
710
710
  "aba_research_monthly.searchModel": "Search model from 1 through 6: popular, changing, sustained growth, rapid growth, potential, or long-tail market.",
711
711
  "keyword_order.asins": "Amazon ASINs to query, with at most 20 values.",
@@ -788,7 +788,8 @@ function officialParameterSchema(toolName, name, type) {
788
788
  }
789
789
  const integerValues = integerValuesByToolAndParameter[parameterKey];
790
790
  if (type === "integer" && integerValues) {
791
- return { type: "integer", enum: integerValues, description };
791
+ const schema = { type: "integer", enum: integerValues, description };
792
+ return parameterKey === "traffic_extend.queryType" ? s.withDefault(schema, 2) : schema;
792
793
  }
793
794
  const stringValues = stringValuesByToolAndParameter[parameterKey];
794
795
  if (type === "string" && stringValues) {