@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
package/src/core/cast.js CHANGED
@@ -196,9 +196,12 @@ export function optionalNumber(value) {
196
196
  /**
197
197
  * Return a finite number from a number or numeric string when present. Examples:
198
198
  * `optionalNumberLike("1.5") => 1.5`, `optionalNumberLike("x") => undefined`.
199
+ *
200
+ * A blank or whitespace-only string is reported as missing rather than parsed, because
201
+ * `Number(" ")` is `0` and a blank field would otherwise surface as a real zero.
199
202
  */
200
203
  export function optionalNumberLike(value) {
201
- const parsed = typeof value === "number" ? value : typeof value === "string" && value !== "" ? Number(value) : Number.NaN;
204
+ const parsed = typeof value === "number" ? value : typeof value === "string" && value.trim() !== "" ? Number(value) : Number.NaN;
202
205
  return Number.isFinite(parsed) ? parsed : undefined;
203
206
  }
204
207
  /**
@@ -309,6 +312,20 @@ export function pickOptionalInteger(input, ...keys) {
309
312
  export function nullableString(value) {
310
313
  return value === null ? null : optionalString(value);
311
314
  }
315
+ /**
316
+ * Return a string exactly as provided, null, or undefined when the value is not a string. Examples:
317
+ * `nullableRawString(null) => null`, `nullableRawString("") => ""`, `nullableRawString(1) => undefined`.
318
+ */
319
+ export function nullableRawString(value) {
320
+ return value === null ? null : optionalRawString(value);
321
+ }
322
+ /**
323
+ * Return a boolean, null, or undefined when the value is not a boolean. Examples:
324
+ * `nullableBoolean(null) => null`, `nullableBoolean(false) => false`, `nullableBoolean("true") => undefined`.
325
+ */
326
+ export function nullableBoolean(value) {
327
+ return value === null ? null : optionalBoolean(value);
328
+ }
312
329
  /**
313
330
  * Return a string or null when the value is not a string.
314
331
  */
@@ -24,8 +24,12 @@ export interface GuardedFetchOptions {
24
24
  * load are honored.
25
25
  */
26
26
  allowPrivateNetwork?: boolean | (() => boolean);
27
+ /** Whether deployment trusted hosts may bypass private DNS answers. Defaults to true. */
28
+ allowTrustedHosts?: boolean;
27
29
  /** Error factory for guard violations. Defaults to TypeError. */
28
30
  createError?: (message: string) => Error;
31
+ /** Error factory for DNS lookup failures. Defaults to createError. */
32
+ createResolutionError?: (message: string) => Error;
29
33
  /** Maximum redirect hops followed before the request fails. */
30
34
  maxRedirects?: number;
31
35
  /**
@@ -132,12 +136,16 @@ export declare function unwrapGuardedFetch(fetcher: typeof fetch | undefined): t
132
136
  * so this layer applies there too. Only on a runtime without `node:dns` does it
133
137
  * degrade to a no-op, leaving the URL-literal and redirect-`Location` checks.
134
138
  *
135
- * Callers that pass `redirect: "manual"` or `redirect: "error"` keep native
136
- * semantics: the first response (or native redirect error) is returned after
137
- * the initial URL and its resolved addresses are validated.
139
+ * Callers that pass `redirect: "manual"` keep native semantics: the first
140
+ * response, including an unfollowed 3xx, is returned after the initial URL and
141
+ * its resolved addresses are validated, so the caller's `!response.ok` check
142
+ * rejects a redirect. Use "manual" rather than `redirect: "error"` to refuse
143
+ * redirects: Cloudflare Workers does not implement "error" and throws
144
+ * `TypeError: Invalid redirect value` before sending the request.
138
145
  */
139
146
  export declare function createGuardedFetch(options?: GuardedFetchOptions): typeof fetch;
140
147
  export interface GuardedEgressUrlOptions {
148
+ allowTrustedHosts?: boolean;
141
149
  /** Field name used in guard violation messages, e.g. `"request URL"`. */
142
150
  fieldName: string;
143
151
  /** Error factory for guard violations. */
@@ -125,9 +125,12 @@ export function unwrapGuardedFetch(fetcher) {
125
125
  * so this layer applies there too. Only on a runtime without `node:dns` does it
126
126
  * degrade to a no-op, leaving the URL-literal and redirect-`Location` checks.
127
127
  *
128
- * Callers that pass `redirect: "manual"` or `redirect: "error"` keep native
129
- * semantics: the first response (or native redirect error) is returned after
130
- * the initial URL and its resolved addresses are validated.
128
+ * Callers that pass `redirect: "manual"` keep native semantics: the first
129
+ * response, including an unfollowed 3xx, is returned after the initial URL and
130
+ * its resolved addresses are validated, so the caller's `!response.ok` check
131
+ * rejects a redirect. Use "manual" rather than `redirect: "error"` to refuse
132
+ * redirects: Cloudflare Workers does not implement "error" and throws
133
+ * `TypeError: Invalid redirect value` before sending the request.
131
134
  */
132
135
  export function createGuardedFetch(options = {}) {
133
136
  const baseFetch = unwrapGuardedFetch(options.fetch);
@@ -151,7 +154,14 @@ export function createGuardedFetch(options = {}) {
151
154
  : options.lookup === undefined
152
155
  ? await resolveDefaultLookup()
153
156
  : options.lookup;
154
- const guardHop = (value, fieldName) => assertGuardedEgressUrl(value, { fieldName, createError, allowPrivateNetwork, lookup });
157
+ const guardHop = (value, fieldName) => assertGuardedEgressUrl(value, {
158
+ fieldName,
159
+ createError,
160
+ allowPrivateNetwork,
161
+ lookup,
162
+ allowTrustedHosts: options.allowTrustedHosts,
163
+ createResolutionError: options.createResolutionError,
164
+ });
155
165
  const request = input instanceof Request ? input : undefined;
156
166
  let url = await guardHop(request?.url ?? (input instanceof URL ? input.href : String(input)), "request URL");
157
167
  const redirectMode = init?.redirect ?? request?.redirect ?? "follow";
@@ -252,6 +262,7 @@ export async function resolveGuardedEgressTarget(value, options) {
252
262
  createError: options.createError,
253
263
  createResolutionError: options.createResolutionError ?? options.createError,
254
264
  lookup,
265
+ allowTrustedHosts: options.allowTrustedHosts !== false,
255
266
  });
256
267
  return { url, addresses };
257
268
  }
@@ -286,7 +297,7 @@ async function assertResolvedAddressesAllowed(hostname, fieldName, policy) {
286
297
  // Deployment-level trusted-host setting, resolved per request so a bootstrap that
287
298
  // configures it after module load is honored. It may open private and
288
299
  // VPN-mapped results, while unsafe special-use targets remain blocked.
289
- const trustedHost = isEgressTrustedHost(hostname);
300
+ const trustedHost = policy.allowTrustedHosts && isEgressTrustedHost(hostname);
290
301
  for (const entry of results) {
291
302
  if (entry && typeof entry.address === "string") {
292
303
  const addressClass = classifyIpAddress(entry.address);
@@ -308,8 +319,9 @@ async function assertResolvedAddressesAllowed(hostname, fieldName, policy) {
308
319
  // would turn the guard into a DNS/internal-range probe oracle, a property
309
320
  // src/mail/imap-smtp/host-pinning.test.ts asserts.
310
321
  throw policy.createError(`${fieldName} must not resolve to private or reserved IP addresses ` +
311
- `(if this host is reached through a corporate VPN or split DNS, add it to ` +
312
- `OOMOL_CONNECT_EGRESS_TRUSTED_HOSTS)`);
322
+ (policy.allowTrustedHosts
323
+ ? `(if this host is reached through a corporate VPN or split DNS, add it to OOMOL_CONNECT_EGRESS_TRUSTED_HOSTS)`
324
+ : `(check proxy Fake-IP and DNS settings; this request requires a public address)`));
313
325
  }
314
326
  }
315
327
  return results;
@@ -16,15 +16,26 @@ const scenarioByService = new Map([
16
16
  ["aliyunoss", "data-storage"],
17
17
  ["amap", "productivity"],
18
18
  ["aivoov", "ai"],
19
+ ["aifinmarket", "investment"],
20
+ ["alpaca", "investment"],
21
+ ["alphavantage", "investment"],
19
22
  ["anthropic", "ai"],
20
23
  ["apininjas", "developer"],
21
24
  ["awss3", "data-storage"],
22
25
  ["asindataapi", "cross-border-ecommerce"],
23
26
  ["baselinker", "cross-border-ecommerce"],
27
+ ["beaconchain", "investment"],
28
+ ["benzinga", "investment"],
24
29
  ["bigcommerce", "cross-border-ecommerce"],
25
30
  ["captainbi", "cross-border-ecommerce"],
26
31
  ["cin7core", "cross-border-ecommerce"],
27
32
  ["circleci", "developer"],
33
+ ["coinbase", "investment"],
34
+ ["coingecko", "investment"],
35
+ ["coinmarketcal", "investment"],
36
+ ["coinmarketcap", "investment"],
37
+ ["coinranking", "investment"],
38
+ ["cryptoapis", "investment"],
28
39
  ["clickup", "productivity"],
29
40
  ["cloudflaredns", "developer"],
30
41
  ["cloudflarer2", "data-storage"],
@@ -39,15 +50,22 @@ const scenarioByService = new Map([
39
50
  ["dockerhub", "developer"],
40
51
  ["elevenlabs", "ai"],
41
52
  ["easypost", "cross-border-ecommerce"],
53
+ ["eodhdapis", "investment"],
42
54
  ["exa", "ai"],
43
55
  ["falai", "ai"],
44
56
  ["feishu", "communication"],
45
57
  ["feishuappbot", "communication"],
46
58
  ["feishucustombot", "communication"],
47
59
  ["figma", "productivity"],
60
+ ["finage", "investment"],
61
+ ["finchina", "investment"],
62
+ ["financialmodelingprep", "investment"],
48
63
  ["firecrawl", "developer"],
64
+ ["futunn", "investment"],
65
+ ["gangtise", "investment"],
49
66
  ["gemini", "ai"],
50
67
  ["giphy", "marketing"],
68
+ ["gildata", "investment"],
51
69
  ["github", "developer"],
52
70
  ["gitlab", "developer"],
53
71
  ["gmail", "communication"],
@@ -55,18 +73,29 @@ const scenarioByService = new Map([
55
73
  ["googlebigquery", "data-storage"],
56
74
  ["googlecalendar", "productivity"],
57
75
  ["googleforms", "productivity"],
58
- ["googlephotos", "docs"],
76
+ ["googlephotos", "communication"],
59
77
  ["googlesearchconsole", "marketing"],
60
78
  ["googlesheets", "productivity"],
61
79
  ["googletasks", "productivity"],
62
80
  ["hubspot", "marketing"],
63
81
  ["helium10", "cross-border-ecommerce"],
82
+ ["hithinkfinance", "investment"],
83
+ ["investodaymcp", "investment"],
84
+ ["intrinio", "investment"],
85
+ ["jin10", "investment"],
64
86
  ["jumpseller", "cross-border-ecommerce"],
65
87
  ["linkfox", "cross-border-ecommerce"],
66
88
  ["lingxingmcp", "cross-border-ecommerce"],
89
+ ["longbridge", "investment"],
90
+ ["luno", "investment"],
67
91
  ["mailchimp", "marketing"],
68
92
  ["mailgun", "communication"],
93
+ ["marketstack", "investment"],
94
+ ["metatraderapi", "investment"],
69
95
  ["monday", "productivity"],
96
+ ["nasdaq", "investment"],
97
+ ["polygonio", "investment"],
98
+ ["quantdata", "investment"],
70
99
  ["openai", "ai"],
71
100
  ["outlook", "communication"],
72
101
  ["perplexity", "ai"],
@@ -80,7 +109,11 @@ const scenarioByService = new Map([
80
109
  ["storecensus", "cross-border-ecommerce"],
81
110
  ["storeleads", "cross-border-ecommerce"],
82
111
  ["telegram", "communication"],
112
+ ["tokenmetrics", "investment"],
113
+ ["tongdaxin", "investment"],
83
114
  ["trello", "productivity"],
115
+ ["tushare", "investment"],
116
+ ["twelvedata", "investment"],
84
117
  ["twilio", "communication"],
85
118
  ["triplewhale", "cross-border-ecommerce"],
86
119
  ["vercel", "developer"],
@@ -93,26 +126,32 @@ const scenarioByService = new Map([
93
126
  ["shippo", "cross-border-ecommerce"],
94
127
  ["shipstation", "cross-border-ecommerce"],
95
128
  ["vtex", "cross-border-ecommerce"],
129
+ ["uniswapapi", "investment"],
130
+ ["yingmimcp", "investment"],
96
131
  ["woocommerce", "cross-border-ecommerce"],
97
- ["box", "docs"],
98
- ["confluence", "docs"],
99
- ["crowdin", "docs"],
100
- ["docparser", "docs"],
101
- ["dropbox", "docs"],
102
- ["googledocs", "docs"],
103
- ["googledrive", "docs"],
104
- ["googleslides", "docs"],
105
- ["notion", "docs"],
106
- ["onlyofficedocspace", "docs"],
132
+ ["box", "communication"],
133
+ ["confluence", "communication"],
134
+ ["crowdin", "communication"],
135
+ ["docparser", "communication"],
136
+ ["dropbox", "communication"],
137
+ ["googledocs", "communication"],
138
+ ["googledrive", "communication"],
139
+ ["googleslides", "communication"],
140
+ ["notion", "communication"],
141
+ ["onlyofficedocspace", "communication"],
107
142
  ]);
108
143
  const scenarioByCategory = new Map([
109
144
  ["ai", "ai"],
110
145
  ["communication", "communication"],
146
+ ["collaboration", "communication"],
111
147
  ["data", "data-storage"],
112
148
  ["dataanalytics", "data-storage"],
113
149
  ["developertools", "developer"],
150
+ ["docs", "communication"],
151
+ ["documents", "communication"],
114
152
  ["infrastructure", "developer"],
115
153
  ["marketing", "marketing"],
154
+ ["knowledge", "communication"],
116
155
  ["productivity", "productivity"],
117
156
  ["security", "developer"],
118
157
  ["social", "marketing"],
@@ -121,8 +160,23 @@ const scenarioByCategory = new Map([
121
160
  const scenarioKeywords = [
122
161
  ["ai", ["agent", "ai", "embedding", "llm", "model", "prompt", "transcrib", "vector"]],
123
162
  ["cross-border-ecommerce", ["ecommerce", "marketplace", "order fulfillment", "seller", "storefront"]],
124
- ["communication", ["chat", "email", "inbox", "messaging", "notification", "sms", "video meeting"]],
125
- ["docs", ["document", "knowledge base", "wiki"]],
163
+ ["investment", ["brokerage", "crypto", "investment", "market data", "portfolio", "stock market", "trading"]],
164
+ [
165
+ "communication",
166
+ [
167
+ "chat",
168
+ "document",
169
+ "drive",
170
+ "email",
171
+ "inbox",
172
+ "knowledge base",
173
+ "messaging",
174
+ "notification",
175
+ "sms",
176
+ "video meeting",
177
+ "wiki",
178
+ ],
179
+ ],
126
180
  ["productivity", ["calendar", "project management", "schedule", "task management", "todo"]],
127
181
  ["marketing", ["advertising", "analytics", "crm", "lead generation", "marketing", "seo"]],
128
182
  ["data-storage", ["database", "data warehouse", "object storage", "search index"]],
@@ -0,0 +1,33 @@
1
+ export type RemoteHttpFailure = "invalid_url" | "dns" | "redirect" | "network" | "invalid_json" | "too_large";
2
+ export declare class RemoteHttpError extends Error {
3
+ readonly kind: RemoteHttpFailure;
4
+ constructor(kind: RemoteHttpFailure, message: string);
5
+ }
6
+ export interface RemoteHttpOptions {
7
+ url: string | URL;
8
+ label: string;
9
+ init?: RequestInit;
10
+ timeoutMs?: number;
11
+ fetcher?: typeof fetch;
12
+ requireHttps?: boolean;
13
+ allowTrustedHosts?: boolean;
14
+ }
15
+ export interface RemoteJsonOptions {
16
+ label: string;
17
+ maxBytes: number;
18
+ signal?: AbortSignal;
19
+ }
20
+ /** Keep the request budget active through response consumption; never follow redirects with a service key. */
21
+ export declare function requestRemote<T>(options: RemoteHttpOptions, consume: (response: Response, signal: AbortSignal | undefined) => Promise<T>): Promise<T>;
22
+ /** Limits decoded transport bytes, including chunked and error responses, without exposing raw JSON errors. */
23
+ export declare function readRemoteJson(response: Response, options: RemoteJsonOptions): Promise<unknown>;
24
+ export declare function isSuccessEnvelope(value: unknown): value is {
25
+ success: true;
26
+ data: unknown;
27
+ };
28
+ export declare function isFailureEnvelope(value: unknown): value is {
29
+ success: false;
30
+ message: string;
31
+ errorCode: string;
32
+ data: unknown;
33
+ };
@@ -0,0 +1,104 @@
1
+ import { isAbortLikeError } from "../providers/provider-runtime.js";
2
+ import { optionalRecord } from "./cast.js";
3
+ import { createGuardedFetch } from "./guarded-fetch.js";
4
+ import { assertPublicHttpUrl, readBoundedResponseBytes } from "./request.js";
5
+ export class RemoteHttpError extends Error {
6
+ kind;
7
+ constructor(kind, message) {
8
+ super(message);
9
+ this.kind = kind;
10
+ }
11
+ }
12
+ /** Keep the request budget active through response consumption; never follow redirects with a service key. */
13
+ export async function requestRemote(options, consume) {
14
+ const url = assertPublicHttpUrl(String(options.url), {
15
+ fieldName: `${options.label} URL`,
16
+ createError: (message) => new RemoteHttpError("invalid_url", message),
17
+ });
18
+ if (options.requireHttps !== false && url.protocol !== "https:") {
19
+ throw new RemoteHttpError("invalid_url", `${options.label} requires HTTPS.`);
20
+ }
21
+ if (url.username || url.password || url.hash) {
22
+ throw new RemoteHttpError("invalid_url", `${options.label} does not allow URL credentials or fragments.`);
23
+ }
24
+ const signals = [
25
+ options.init?.signal,
26
+ options.timeoutMs === undefined ? undefined : AbortSignal.timeout(options.timeoutMs),
27
+ ].filter((signal) => signal != null);
28
+ const signal = signals.length ? AbortSignal.any(signals) : undefined;
29
+ signal?.throwIfAborted();
30
+ const guardOptions = {
31
+ fetch: options.fetcher,
32
+ allowTrustedHosts: options.allowTrustedHosts ?? false,
33
+ createError: (message) => new RemoteHttpError("invalid_url", message),
34
+ createResolutionError: (message) => new RemoteHttpError("dns", message),
35
+ };
36
+ const run = async () => {
37
+ let response;
38
+ try {
39
+ response = await createGuardedFetch(guardOptions)(url, { ...options.init, redirect: "manual", signal });
40
+ }
41
+ catch (error) {
42
+ signal?.throwIfAborted();
43
+ if (error instanceof RemoteHttpError || isAbortLikeError(error))
44
+ throw error;
45
+ throw new RemoteHttpError("network", `${options.label} request failed.`);
46
+ }
47
+ try {
48
+ signal?.throwIfAborted();
49
+ if (response.status >= 300 && response.status < 400) {
50
+ throw new RemoteHttpError("redirect", `${options.label} redirects are not allowed.`);
51
+ }
52
+ return await consume(response, signal);
53
+ }
54
+ finally {
55
+ if (!response.bodyUsed)
56
+ void response.body?.cancel().catch(() => undefined);
57
+ }
58
+ };
59
+ if (!signal)
60
+ return run();
61
+ let abort = () => undefined;
62
+ const aborted = new Promise((_resolve, reject) => {
63
+ abort = () => reject(signal.reason);
64
+ signal.addEventListener("abort", abort, { once: true });
65
+ });
66
+ try {
67
+ return await Promise.race([run(), aborted]);
68
+ }
69
+ finally {
70
+ signal.removeEventListener("abort", abort);
71
+ }
72
+ }
73
+ /** Limits decoded transport bytes, including chunked and error responses, without exposing raw JSON errors. */
74
+ export async function readRemoteJson(response, options) {
75
+ let bytes;
76
+ try {
77
+ bytes = await readBoundedResponseBytes(response, {
78
+ maxBytes: options.maxBytes,
79
+ fieldName: options.label,
80
+ signal: options.signal,
81
+ createError: (message) => new RemoteHttpError("too_large", message),
82
+ });
83
+ }
84
+ catch (error) {
85
+ options.signal?.throwIfAborted();
86
+ if (error instanceof RemoteHttpError || isAbortLikeError(error))
87
+ throw error;
88
+ throw new RemoteHttpError("network", `${options.label} could not be read.`);
89
+ }
90
+ try {
91
+ return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
92
+ }
93
+ catch {
94
+ throw new RemoteHttpError("invalid_json", `${options.label} is not valid JSON.`);
95
+ }
96
+ }
97
+ export function isSuccessEnvelope(value) {
98
+ const record = optionalRecord(value);
99
+ return record?.success === true && "data" in record;
100
+ }
101
+ export function isFailureEnvelope(value) {
102
+ const record = optionalRecord(value);
103
+ return record?.success === false && typeof record.message === "string" && typeof record.errorCode === "string";
104
+ }
@@ -31,6 +31,7 @@ export interface BoundedResponseBytesOptions {
31
31
  maxBytes: number;
32
32
  fieldName: string;
33
33
  createError: (message: string) => Error;
34
+ signal?: AbortSignal;
34
35
  }
35
36
  /**
36
37
  * Read a response body into memory while enforcing a byte limit.
@@ -58,8 +58,12 @@ export function compactJson(value) {
58
58
  * Read a response body into memory while enforcing a byte limit.
59
59
  */
60
60
  export async function readBoundedResponseBytes(response, options) {
61
+ options.signal?.throwIfAborted();
61
62
  const contentLength = parseContentLength(response.headers.get("content-length"));
62
63
  if (contentLength !== undefined) {
64
+ if (contentLength > options.maxBytes) {
65
+ void response.body?.cancel().catch(() => undefined);
66
+ }
63
67
  assertMaxBytes(contentLength, options);
64
68
  }
65
69
  if (!response.body) {
@@ -68,23 +72,29 @@ export async function readBoundedResponseBytes(response, options) {
68
72
  return bytes;
69
73
  }
70
74
  const reader = response.body.getReader();
75
+ const abort = () => {
76
+ void reader.cancel().catch(() => undefined);
77
+ };
78
+ options.signal?.addEventListener("abort", abort, { once: true });
71
79
  const chunks = [];
72
80
  let totalBytes = 0;
73
81
  try {
74
82
  while (true) {
75
83
  const { done, value } = await reader.read();
84
+ options.signal?.throwIfAborted();
76
85
  if (done) {
77
86
  break;
78
87
  }
79
88
  totalBytes += value.byteLength;
80
89
  if (totalBytes > options.maxBytes) {
81
- await reader.cancel().catch(() => undefined);
90
+ void reader.cancel().catch(() => undefined);
82
91
  throw options.createError(`${options.fieldName} exceeds ${options.maxBytes} bytes`);
83
92
  }
84
93
  chunks.push(value);
85
94
  }
86
95
  }
87
96
  finally {
97
+ options.signal?.removeEventListener("abort", abort);
88
98
  reader.releaseLock();
89
99
  }
90
100
  const bytes = new Uint8Array(totalBytes);
@@ -1,3 +1,5 @@
1
+ import type { TriggerKeySnapshot } from "../triggers/common/types.ts";
2
+ import type { TriggerPermission } from "../triggers/metadata.ts";
1
3
  /**
2
4
  * JSON Schema object used for action input and output contracts.
3
5
  *
@@ -17,7 +19,7 @@ export type AuthType = "no_auth" | "api_key" | "custom_credential" | "oauth2";
17
19
  * Provider definitions do not need to repeat this field: the catalog builder
18
20
  * adds it to runtime entries through the shared scenario resolver.
19
21
  */
20
- export type ProviderScenario = "ai" | "cross-border-ecommerce" | "communication" | "docs" | "productivity" | "marketing" | "data-storage" | "developer" | "other";
22
+ export type ProviderScenario = "ai" | "cross-border-ecommerce" | "investment" | "communication" | "productivity" | "marketing" | "data-storage" | "developer" | "other";
21
23
  /**
22
24
  * A single credential field that users can configure for a provider.
23
25
  */
@@ -248,6 +250,8 @@ export type ProviderDefinition = {
248
250
  iconUrl?: string;
249
251
  /** Public action catalog for this provider. */
250
252
  actions: readonly ActionDefinition[];
253
+ triggers?: readonly TriggerKeySnapshot[];
254
+ triggerPermissions?: readonly TriggerPermission[];
251
255
  };
252
256
  /**
253
257
  * A credential resolved for action execution.
@@ -85,5 +85,4 @@ export declare class MarketplaceService {
85
85
  private discover;
86
86
  private validateApiKey;
87
87
  private ensureProviderPreferences;
88
- private fetch;
89
88
  }