@oomol-lab/open-connector 1.9.2 → 1.9.3

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 (486) hide show
  1. package/README.md +4 -2
  2. package/assets/open-connector/catalog/apps/allratestoday.json +174 -0
  3. package/assets/open-connector/catalog/apps/slackbot.json +20 -1
  4. package/assets/open-connector/catalog/apps-index.json +1 -1
  5. package/package.json +1 -1
  6. package/src/connection-error.d.ts +7 -0
  7. package/src/connection-error.js +10 -0
  8. package/src/connection-service.d.ts +2 -50
  9. package/src/connection-service.js +6 -130
  10. package/src/connection-store.d.ts +41 -0
  11. package/src/connection-store.js +1 -0
  12. package/src/core/guarded-fetch.d.ts +3 -0
  13. package/src/core/guarded-fetch.js +8 -1
  14. package/src/core/provider-network-policy.d.ts +15 -0
  15. package/src/core/provider-network-policy.js +11 -0
  16. package/src/core/request.d.ts +18 -14
  17. package/src/core/request.js +11 -35
  18. package/src/credential-resolver.d.ts +24 -0
  19. package/src/credential-resolver.js +131 -0
  20. package/src/mcp.js +1 -1
  21. package/src/oauth/oauth-client-config-service.d.ts +1 -1
  22. package/src/oauth/oauth-client-config-service.js +14 -2
  23. package/src/oauth/oauth-credential-refresh-service.js +1 -1
  24. package/src/oauth/oauth-flow-service.d.ts +9 -1
  25. package/src/oauth/oauth-flow-service.js +11 -1
  26. package/src/providers/abuseipdb/executors.js +3 -4
  27. package/src/providers/action-contracts.generated.d.ts +1 -0
  28. package/src/providers/addressfinder/executors.js +2 -3
  29. package/src/providers/aeroleads/executors.js +3 -3
  30. package/src/providers/affinity/runtime.js +6 -7
  31. package/src/providers/aftership/executors.js +2 -2
  32. package/src/providers/agent_mail/runtime.js +2 -2
  33. package/src/providers/agentql/runtime.js +2 -2
  34. package/src/providers/agenty/runtime.js +5 -6
  35. package/src/providers/agiled/runtime.d.ts +0 -1
  36. package/src/providers/agiled/runtime.js +2 -3
  37. package/src/providers/agility/runtime.js +2 -3
  38. package/src/providers/ahrefs/runtime.js +3 -3
  39. package/src/providers/aifinmarket/runtime.js +6 -7
  40. package/src/providers/airtable/executors.js +3 -3
  41. package/src/providers/alchemy/runtime.js +2 -2
  42. package/src/providers/algolia/runtime.js +3 -3
  43. package/src/providers/aliyun_oss/executors.js +7 -7
  44. package/src/providers/allratestoday/executors.d.ts +3 -0
  45. package/src/providers/allratestoday/executors.js +18 -0
  46. package/src/providers/allratestoday/runtime.d.ts +17 -0
  47. package/src/providers/allratestoday/runtime.js +104 -0
  48. package/src/providers/alpaca/runtime.js +2 -3
  49. package/src/providers/alpha_vantage/runtime.js +2 -2
  50. package/src/providers/alt_text_ai/runtime.js +2 -2
  51. package/src/providers/altiria/executors.js +3 -3
  52. package/src/providers/amap/runtime.js +3 -3
  53. package/src/providers/ambee/runtime.js +2 -2
  54. package/src/providers/ambivo/executors.js +3 -3
  55. package/src/providers/amilia/runtime.js +1 -1
  56. package/src/providers/amplemarket/runtime.js +2 -2
  57. package/src/providers/amplitude/runtime.js +3 -3
  58. package/src/providers/anysearch/runtime.js +4 -4
  59. package/src/providers/apaleo/runtime.js +2 -2
  60. package/src/providers/api_sports/executors.js +3 -4
  61. package/src/providers/apiverve/executors.js +2 -3
  62. package/src/providers/apollo/executors.js +2 -3
  63. package/src/providers/appcircle/runtime.js +5 -5
  64. package/src/providers/appdrag/executors.js +2 -3
  65. package/src/providers/arcgis_online/executors.js +2 -2
  66. package/src/providers/auth0_management/runtime.js +2 -3
  67. package/src/providers/autoblogger/executors.js +3 -3
  68. package/src/providers/baidu_maps/runtime.js +3 -3
  69. package/src/providers/baidu_netdisk/runtime-mcp.js +3 -4
  70. package/src/providers/bark/executors.js +5 -5
  71. package/src/providers/bitrise/runtime.js +3 -3
  72. package/src/providers/bouncer/executors.js +3 -4
  73. package/src/providers/browse_ai/runtime.js +3 -4
  74. package/src/providers/browserstack/executors.js +6 -7
  75. package/src/providers/buildkite/runtime.js +3 -3
  76. package/src/providers/bunnycdn/runtime.js +3 -3
  77. package/src/providers/businessmap/runtime.js +6 -7
  78. package/src/providers/buttondown/runtime.js +2 -2
  79. package/src/providers/byteforms/runtime.js +2 -2
  80. package/src/providers/calendly/runtime.js +2 -2
  81. package/src/providers/captainbi/runtime.js +6 -6
  82. package/src/providers/castingwords/runtime.js +1 -1
  83. package/src/providers/chatpdf/runtime.js +4 -4
  84. package/src/providers/check/executors.js +3 -4
  85. package/src/providers/checkly/executors.js +3 -4
  86. package/src/providers/chengxin/runtime.js +3 -3
  87. package/src/providers/cincopa/executors.js +3 -4
  88. package/src/providers/circle/executors.js +3 -4
  89. package/src/providers/clearout/executors.js +1 -2
  90. package/src/providers/clickhelp/runtime.js +5 -5
  91. package/src/providers/clickhouse/runtime.js +4 -4
  92. package/src/providers/clinicalkey/runtime.js +3 -3
  93. package/src/providers/clinicaltrials_gov/runtime.js +4 -5
  94. package/src/providers/clockify/runtime.js +4 -4
  95. package/src/providers/close/runtime.js +3 -3
  96. package/src/providers/cloudconvert/runtime.js +8 -9
  97. package/src/providers/cloudflare_dns/runtime.js +2 -2
  98. package/src/providers/cloudflare_email_routing/runtime.js +2 -2
  99. package/src/providers/cloudflare_r2/runtime.js +5 -5
  100. package/src/providers/cloudflare_worker/runtime.js +10 -10
  101. package/src/providers/cloudinary/runtime.js +4 -4
  102. package/src/providers/cloudlayer/runtime.js +5 -5
  103. package/src/providers/codacy/runtime.js +2 -2
  104. package/src/providers/codemagic/runtime.js +2 -2
  105. package/src/providers/confluence/executors.js +4 -4
  106. package/src/providers/confluence/runtime.d.ts +0 -1
  107. package/src/providers/confluence/runtime.js +6 -7
  108. package/src/providers/contactout/runtime.js +5 -5
  109. package/src/providers/contentful/runtime.js +2 -2
  110. package/src/providers/contentstack_content_delivery/runtime.js +1 -1
  111. package/src/providers/cronly/runtime.js +2 -2
  112. package/src/providers/crossref/runtime.js +3 -3
  113. package/src/providers/cutt_ly/runtime.js +3 -3
  114. package/src/providers/cyberimpact/runtime.js +3 -3
  115. package/src/providers/dachser/executors.js +2 -2
  116. package/src/providers/dailybot/runtime.js +1 -1
  117. package/src/providers/databox/runtime.js +2 -2
  118. package/src/providers/databricks/runtime.js +2 -2
  119. package/src/providers/datacite/runtime.js +1 -1
  120. package/src/providers/datadog/executors.js +3 -4
  121. package/src/providers/datascope/runtime.js +2 -2
  122. package/src/providers/daytona/executors.js +3 -3
  123. package/src/providers/deepgram/runtime.js +2 -2
  124. package/src/providers/deepl/runtime.js +4 -4
  125. package/src/providers/detrack/executors.js +5 -5
  126. package/src/providers/deutschlandgpt/runtime.js +2 -2
  127. package/src/providers/dialmycalls/runtime.js +4 -4
  128. package/src/providers/diffbot/executors.js +4 -4
  129. package/src/providers/digistore24/executors.js +3 -3
  130. package/src/providers/dingtalk_bot/executors.js +1 -1
  131. package/src/providers/discourse/executors.d.ts +0 -1
  132. package/src/providers/discourse/executors.js +6 -7
  133. package/src/providers/docugenerate/runtime.js +3 -3
  134. package/src/providers/doppler/runtime.shared.js +3 -3
  135. package/src/providers/doppler_marketing_automation/runtime.js +4 -4
  136. package/src/providers/dovetail/runtime.js +2 -2
  137. package/src/providers/dropcontact/runtime.js +3 -3
  138. package/src/providers/dub/executors.js +6 -6
  139. package/src/providers/dumplingai/runtime.js +2 -2
  140. package/src/providers/elevenlabs/executors.js +4 -4
  141. package/src/providers/elevenreader/runtime.js +1 -1
  142. package/src/providers/emailoctopus/runtime.js +4 -4
  143. package/src/providers/embase/runtime.js +3 -3
  144. package/src/providers/emelia/executors.js +2 -2
  145. package/src/providers/enigma/executors.js +3 -3
  146. package/src/providers/eodhd_apis/executors.js +2 -2
  147. package/src/providers/eventzilla/runtime.js +3 -4
  148. package/src/providers/evervault/runtime.js +1 -1
  149. package/src/providers/excalidraw_mcp/runtime.js +3 -4
  150. package/src/providers/excel/runtime.js +6 -6
  151. package/src/providers/expofp/runtime.js +2 -2
  152. package/src/providers/faktoora/runtime.js +5 -5
  153. package/src/providers/fast_note_sync/runtime.js +2 -2
  154. package/src/providers/feathery/executors.js +2 -3
  155. package/src/providers/feishu_app_bot/executors.js +2 -3
  156. package/src/providers/feishu_custom_bot/executors.js +2 -3
  157. package/src/providers/ffhub/executors.js +2 -3
  158. package/src/providers/fidel_api/executors.js +2 -3
  159. package/src/providers/files_com/executors.js +2 -3
  160. package/src/providers/fireberry/runtime.d.ts +0 -1
  161. package/src/providers/fireberry/runtime.js +3 -4
  162. package/src/providers/firehydrant/executors.js +2 -3
  163. package/src/providers/float/executors.js +2 -3
  164. package/src/providers/flomo/executors.js +5 -6
  165. package/src/providers/flowiseai/executors.js +2 -3
  166. package/src/providers/fluxguard/executors.js +2 -3
  167. package/src/providers/folk/executors.js +2 -3
  168. package/src/providers/football_data/executors.js +2 -3
  169. package/src/providers/forem/executors.js +2 -3
  170. package/src/providers/formbricks/executors.js +2 -3
  171. package/src/providers/formsite/executors.js +3 -4
  172. package/src/providers/formspree/executors.js +2 -2
  173. package/src/providers/freshdesk/executors.js +3 -4
  174. package/src/providers/freshservice/executors.js +3 -4
  175. package/src/providers/freshteam/runtime.js +3 -4
  176. package/src/providers/full_contact/executors.js +3 -3
  177. package/src/providers/fusion-api/runtime.js +2 -3
  178. package/src/providers/gagelist/executors.js +3 -3
  179. package/src/providers/gainsight_nxt/executors.js +2 -2
  180. package/src/providers/gamma/executors.js +4 -3
  181. package/src/providers/gangtise/runtime.js +3 -4
  182. package/src/providers/gatherup/runtime.js +1 -1
  183. package/src/providers/geckoboard/executors.js +2 -3
  184. package/src/providers/gemini/runtime.d.ts +0 -1
  185. package/src/providers/gemini/runtime.js +5 -6
  186. package/src/providers/genpage/runtime.js +2 -2
  187. package/src/providers/geokeo/executors.js +4 -4
  188. package/src/providers/getnote/runtime.js +2 -3
  189. package/src/providers/github/runtime-shared.js +2 -2
  190. package/src/providers/glyphic/runtime.js +3 -4
  191. package/src/providers/gmail/executors.js +125 -27
  192. package/src/providers/gong/runtime.js +6 -7
  193. package/src/providers/googlecalendar/runtime-shared.js +3 -4
  194. package/src/providers/googledrive/runtime-request.js +2 -3
  195. package/src/providers/googlesheets/runtime-shared.js +3 -4
  196. package/src/providers/gorgias/runtime.js +4 -4
  197. package/src/providers/gotify/executors.js +7 -8
  198. package/src/providers/greenhouse/executors.js +3 -3
  199. package/src/providers/gumloop/executors.js +2 -3
  200. package/src/providers/gumroad/executors.js +2 -3
  201. package/src/providers/habitica/executors.js +2 -3
  202. package/src/providers/hackerrank_work/executors.js +2 -3
  203. package/src/providers/harvest/executors.js +3 -4
  204. package/src/providers/haveibeenpwned/executors.js +2 -3
  205. package/src/providers/headout/executors.js +3 -4
  206. package/src/providers/healthchecks_io/executors.js +2 -3
  207. package/src/providers/helium10/runtime.js +4 -5
  208. package/src/providers/helpdesk/runtime.js +4 -4
  209. package/src/providers/home_assistant/runtime-ws.js +9 -10
  210. package/src/providers/hotjar/executors.js +4 -4
  211. package/src/providers/httpsms/runtime.js +3 -4
  212. package/src/providers/hub_planner/executors.js +3 -3
  213. package/src/providers/hubspot/runtime.js +3 -4
  214. package/src/providers/humaans/runtime.js +3 -3
  215. package/src/providers/hunter/runtime.js +3 -3
  216. package/src/providers/icypeas/executors.js +3 -4
  217. package/src/providers/ima/runtime.js +7 -7
  218. package/src/providers/infolobby/runtime.js +6 -6
  219. package/src/providers/instabot/runtime.js +6 -6
  220. package/src/providers/instatus/runtime.js +4 -4
  221. package/src/providers/intuiface/executors.js +3 -3
  222. package/src/providers/iplocate/runtime.js +4 -5
  223. package/src/providers/ipregistry/executors.js +2 -2
  224. package/src/providers/jiminny/runtime.js +4 -4
  225. package/src/providers/jin10/executors.js +4 -5
  226. package/src/providers/jira/executors.js +4 -4
  227. package/src/providers/kaleido/runtime.js +2 -2
  228. package/src/providers/kandji/runtime.js +2 -2
  229. package/src/providers/keygen/executors.js +4 -4
  230. package/src/providers/keyword/runtime.js +2 -2
  231. package/src/providers/kie_ai/executors.js +1 -1
  232. package/src/providers/kintone/runtime.js +1 -1
  233. package/src/providers/kit/runtime.js +2 -2
  234. package/src/providers/klangio/runtime.js +4 -4
  235. package/src/providers/klaviyo/executors.js +1 -1
  236. package/src/providers/klazify/executors.js +3 -3
  237. package/src/providers/klipfolio/runtime.js +3 -3
  238. package/src/providers/knack/executors.js +1 -1
  239. package/src/providers/kommo/runtime.js +2 -2
  240. package/src/providers/kontent_ai/executors.js +3 -4
  241. package/src/providers/l2s/executors.js +3 -4
  242. package/src/providers/latchshot/executors.js +2 -2
  243. package/src/providers/leadboxer/runtime.js +4 -4
  244. package/src/providers/leadiq/runtime.js +4 -4
  245. package/src/providers/linguapop/runtime.js +1 -1
  246. package/src/providers/lingvanex_translation_api/runtime.js +5 -6
  247. package/src/providers/lingxing_mcp/runtime.js +3 -4
  248. package/src/providers/linkup/runtime.js +5 -6
  249. package/src/providers/liveagent/executors.js +6 -6
  250. package/src/providers/loops/executors.js +2 -2
  251. package/src/providers/loyjoy/runtime.js +2 -2
  252. package/src/providers/loyverse/executors.js +4 -4
  253. package/src/providers/lusha/runtime.js +3 -3
  254. package/src/providers/mailbluster/runtime.js +3 -4
  255. package/src/providers/mailcoach/runtime.js +4 -4
  256. package/src/providers/mailgenius/executors.js +3 -4
  257. package/src/providers/mailjet/runtime.js +3 -3
  258. package/src/providers/mails_so/runtime.js +1 -1
  259. package/src/providers/mailsoftly/runtime.js +5 -5
  260. package/src/providers/mailtrap/runtime.js +4 -5
  261. package/src/providers/manus/runtime.js +3 -3
  262. package/src/providers/mautic/runtime.js +3 -3
  263. package/src/providers/megaventory/runtime.js +3 -3
  264. package/src/providers/memberstack/runtime.js +2 -2
  265. package/src/providers/mendeley/executors.js +2 -3
  266. package/src/providers/mindbody/runtime.js +3 -3
  267. package/src/providers/minerstat/executors.js +3 -3
  268. package/src/providers/mintlify/runtime.js +3 -3
  269. package/src/providers/missive/executors.js +3 -5
  270. package/src/providers/mixpanel/executors.js +3 -3
  271. package/src/providers/mobile_text_alerts/runtime.js +3 -3
  272. package/src/providers/mocean/executors.js +3 -3
  273. package/src/providers/moco/executors.js +5 -5
  274. package/src/providers/moesif/runtime.js +4 -4
  275. package/src/providers/monday/runtime-common.js +3 -3
  276. package/src/providers/monica_crm/runtime.js +4 -4
  277. package/src/providers/moorcheh/runtime.js +3 -3
  278. package/src/providers/more_trees/runtime.d.ts +0 -1
  279. package/src/providers/more_trees/runtime.js +7 -8
  280. package/src/providers/moxie/runtime.js +2 -2
  281. package/src/providers/msg91/runtime.js +4 -4
  282. package/src/providers/mx/runtime.js +1 -1
  283. package/src/providers/needle/runtime.js +3 -4
  284. package/src/providers/netlify/runtime.js +2 -3
  285. package/src/providers/niftyimages/executors.js +2 -2
  286. package/src/providers/northbeam/runtime.js +1 -1
  287. package/src/providers/nozbe_teams/executors.js +4 -4
  288. package/src/providers/npm/runtime.js +4 -4
  289. package/src/providers/nusii_proposals/runtime.js +2 -2
  290. package/src/providers/ocr_web_service/executors.js +4 -4
  291. package/src/providers/octopus_deploy/executors.js +3 -3
  292. package/src/providers/oksign/runtime.js +3 -4
  293. package/src/providers/one_drive/executors.js +6 -6
  294. package/src/providers/one_password_events/runtime.js +1 -1
  295. package/src/providers/onfleet/runtime.js +3 -3
  296. package/src/providers/onlyoffice_docspace/runtime.js +4 -4
  297. package/src/providers/oomnitza/runtime.js +3 -4
  298. package/src/providers/otter_ai/executors.js +2 -2
  299. package/src/providers/oura/runtime.js +1 -1
  300. package/src/providers/paddle/executors.js +3 -3
  301. package/src/providers/pagerduty/runtime.js +2 -2
  302. package/src/providers/paradym/runtime.js +4 -4
  303. package/src/providers/parallel/runtime.js +3 -3
  304. package/src/providers/partner_stack_partner/runtime.js +1 -1
  305. package/src/providers/payrexx/runtime.js +5 -6
  306. package/src/providers/permit_io/runtime.js +2 -2
  307. package/src/providers/pinboard/executors.js +5 -6
  308. package/src/providers/pinpoint/runtime.js +2 -2
  309. package/src/providers/placid/runtime.js +3 -3
  310. package/src/providers/plain/runtime.js +5 -5
  311. package/src/providers/planetscale/runtime.js +2 -2
  312. package/src/providers/planhat/executors.js +6 -6
  313. package/src/providers/plausible_analytics/runtime.js +3 -3
  314. package/src/providers/posthog/runtime.js +3 -3
  315. package/src/providers/predis_ai/executors.js +3 -3
  316. package/src/providers/printavo/runtime.js +2 -2
  317. package/src/providers/prospeo/runtime.js +2 -3
  318. package/src/providers/provider-runtime.d.ts +13 -1
  319. package/src/providers/provider-runtime.js +25 -10
  320. package/src/providers/push_by_techulus/executors.js +3 -4
  321. package/src/providers/pushover/runtime.js +4 -5
  322. package/src/providers/pushsafer/runtime.js +4 -5
  323. package/src/providers/pylon/runtime.js +2 -2
  324. package/src/providers/qase/runtime.js +3 -3
  325. package/src/providers/qdrant/runtime.js +1 -1
  326. package/src/providers/qichacha/runtime.js +2 -2
  327. package/src/providers/qingflow/runtime.js +2 -2
  328. package/src/providers/quickchart/runtime.js +2 -2
  329. package/src/providers/quintadb/runtime.js +2 -2
  330. package/src/providers/quo/runtime.js +2 -2
  331. package/src/providers/rawg/runtime.js +4 -4
  332. package/src/providers/razorpay/runtime.js +4 -5
  333. package/src/providers/readme/runtime.js +6 -6
  334. package/src/providers/referralhero/runtime.js +3 -3
  335. package/src/providers/registry.generated.js +1 -0
  336. package/src/providers/render/executors.js +3 -3
  337. package/src/providers/respond_io/executors.js +3 -3
  338. package/src/providers/reversecontact/runtime.js +3 -3
  339. package/src/providers/ritekit/executors.js +2 -2
  340. package/src/providers/riveter/executors.js +2 -3
  341. package/src/providers/rocket_chat/executors.js +3 -4
  342. package/src/providers/rocket_reach/executors.js +3 -4
  343. package/src/providers/saucelabs/runtime.js +4 -4
  344. package/src/providers/scopus/runtime.js +3 -3
  345. package/src/providers/scrape_do/executors.js +2 -2
  346. package/src/providers/scraperapi/runtime.js +4 -4
  347. package/src/providers/scrapfly/executors.js +2 -2
  348. package/src/providers/scrapingant/executors.js +6 -7
  349. package/src/providers/scrapingbee/executors.js +3 -3
  350. package/src/providers/scrapingdog/executors.js +1 -1
  351. package/src/providers/screenshot_fyi/executors.js +3 -4
  352. package/src/providers/screenshotbase/runtime.js +3 -3
  353. package/src/providers/search_api/runtime.js +2 -2
  354. package/src/providers/securitytrails/executors.js +2 -2
  355. package/src/providers/semantic_scholar/executors.js +2 -2
  356. package/src/providers/sendbird/executors.js +2 -2
  357. package/src/providers/sendfox/executors.js +3 -3
  358. package/src/providers/sendgrid/executors.js +5 -5
  359. package/src/providers/sendmator/runtime.js +3 -4
  360. package/src/providers/seqera/runtime.js +3 -4
  361. package/src/providers/serveravatar/executors.js +3 -3
  362. package/src/providers/sheetdb/runtime.js +2 -2
  363. package/src/providers/short_menu/runtime.js +3 -3
  364. package/src/providers/shortcut/runtime.js +3 -3
  365. package/src/providers/shortpixel/runtime.js +2 -2
  366. package/src/providers/shotstack/runtime.js +4 -4
  367. package/src/providers/signpath/runtime.js +2 -2
  368. package/src/providers/signwell/runtime.js +5 -6
  369. package/src/providers/similarweb_digitalrank_api/runtime.js +3 -3
  370. package/src/providers/simla/runtime.js +5 -5
  371. package/src/providers/simplybook_me/executors.js +6 -6
  372. package/src/providers/sitespeakai/runtime.js +3 -3
  373. package/src/providers/slickdeals/runtime.js +2 -3
  374. package/src/providers/smartsuite/runtime.js +3 -3
  375. package/src/providers/sonarcloud/runtime.js +5 -5
  376. package/src/providers/sorftime/runtime.js +8 -8
  377. package/src/providers/spider/runtime.js +2 -2
  378. package/src/providers/splunk_http_event_collector/runtime.js +7 -8
  379. package/src/providers/sportsdata/runtime.js +4 -4
  380. package/src/providers/spyfu/runtime.js +4 -5
  381. package/src/providers/square/runtime.js +4 -4
  382. package/src/providers/stannp/runtime.js +2 -2
  383. package/src/providers/stripe/executors.js +2 -2
  384. package/src/providers/supermemory/runtime.js +3 -3
  385. package/src/providers/survey_monkey/runtime.js +3 -3
  386. package/src/providers/taiga/runtime.js +4 -4
  387. package/src/providers/talenox/executors.js +4 -4
  388. package/src/providers/tally/runtime.js +3 -3
  389. package/src/providers/tavily/runtime.js +3 -4
  390. package/src/providers/teamcamp/executors.js +2 -2
  391. package/src/providers/teamtailor/executors.js +2 -2
  392. package/src/providers/telegram/executors.js +6 -7
  393. package/src/providers/teltel/executors.js +2 -2
  394. package/src/providers/templated/executors.js +3 -3
  395. package/src/providers/tencent_docs/runtime.js +4 -4
  396. package/src/providers/tencent_maps/runtime.js +3 -3
  397. package/src/providers/textcortex/runtime.js +3 -3
  398. package/src/providers/the_cat_api/runtime.js +3 -3
  399. package/src/providers/the_colony/runtime.js +3 -3
  400. package/src/providers/the_odds_api/runtime.js +3 -4
  401. package/src/providers/the_official_board/runtime.js +4 -4
  402. package/src/providers/thehive/runtime.js +1 -1
  403. package/src/providers/tikhub/endpoint-catalog.js +2 -3
  404. package/src/providers/tiktok_business/runtime.js +2 -2
  405. package/src/providers/timecamp/runtime.js +2 -2
  406. package/src/providers/timelink/runtime.js +2 -2
  407. package/src/providers/totp/runtime.js +4 -5
  408. package/src/providers/trawlingweb/runtime.js +2 -2
  409. package/src/providers/trilium/runtime.js +2 -2
  410. package/src/providers/triple_whale/runtime.js +3 -3
  411. package/src/providers/truvera/runtime.js +2 -2
  412. package/src/providers/tuskr/runtime.js +2 -2
  413. package/src/providers/typebot/runtime.js +2 -2
  414. package/src/providers/typeform/runtime.js +2 -2
  415. package/src/providers/uptimerobot/executors.js +3 -4
  416. package/src/providers/v2ex/runtime.js +8 -9
  417. package/src/providers/valyu/runtime.js +3 -3
  418. package/src/providers/vapi/runtime.js +4 -4
  419. package/src/providers/vectorshift/runtime.js +3 -3
  420. package/src/providers/venafitlsprotectcloud/runtime.js +2 -3
  421. package/src/providers/venafitlsprotectdatacenter/runtime.js +2 -3
  422. package/src/providers/vida/runtime.js +4 -4
  423. package/src/providers/vonage/runtime.js +3 -3
  424. package/src/providers/walmart_marketplace/runtime.js +5 -5
  425. package/src/providers/weatherapi/executors.js +3 -4
  426. package/src/providers/web_of_science/runtime.js +4 -4
  427. package/src/providers/web_of_science_expanded/runtime.js +9 -9
  428. package/src/providers/webex/runtime.js +3 -3
  429. package/src/providers/webinarjam/runtime.js +4 -4
  430. package/src/providers/webscraping_ai/runtime.js +3 -3
  431. package/src/providers/webvizio/runtime.js +3 -4
  432. package/src/providers/wecom_bot/smart-runtime.js +4 -5
  433. package/src/providers/wecom_mcp/runtime.js +3 -4
  434. package/src/providers/wejam_ai/runtime.js +3 -3
  435. package/src/providers/wolfram_alpha_api/runtime.js +3 -3
  436. package/src/providers/woocommerce/runtime.js +1 -1
  437. package/src/providers/woodpecker_co/executors.js +3 -4
  438. package/src/providers/woot/runtime.js +6 -6
  439. package/src/providers/workable/runtime.js +3 -3
  440. package/src/providers/workday/runtime.js +4 -4
  441. package/src/providers/workiom/runtime.js +2 -2
  442. package/src/providers/workiz/runtime.js +2 -2
  443. package/src/providers/workpath/executors.js +3 -4
  444. package/src/providers/worksnaps/executors.js +2 -2
  445. package/src/providers/y_gy/runtime.js +2 -2
  446. package/src/providers/zenscrape/runtime.js +3 -3
  447. package/src/providers/zep/runtime.js +4 -4
  448. package/src/providers/zeplin/runtime.js +2 -2
  449. package/src/providers/zhihu/executors.js +6 -6
  450. package/src/providers/zylvie/runtime.js +4 -4
  451. package/src/saas/saas-cleanup-service.d.ts +2 -0
  452. package/src/saas/saas-cleanup-service.js +2 -1
  453. package/src/saas/saas-execution-service.d.ts +1 -1
  454. package/src/server/actions/action-runner.js +1 -1
  455. package/src/server/api/auth.js +3 -0
  456. package/src/server/api/connection-routes.js +1 -1
  457. package/src/server/api/console-catalog-routes.js +1 -1
  458. package/src/server/api/console-oauth-routes.d.ts +3 -1
  459. package/src/server/api/console-oauth-routes.js +22 -9
  460. package/src/server/api/oauth-completion-page.d.ts +57 -0
  461. package/src/server/api/oauth-completion-page.js +135 -10
  462. package/src/server/api/openapi.d.ts +5 -0
  463. package/src/server/api/openapi.js +62 -2
  464. package/src/server/api/runtime-api.d.ts +2 -1
  465. package/src/server/api/runtime-app-routes.js +1 -1
  466. package/src/server/api/runtime-execution-routes.js +2 -1
  467. package/src/server/connect-app.d.ts +4 -0
  468. package/src/server/connect-app.js +14 -1
  469. package/src/server/connect-server.d.ts +6 -0
  470. package/src/server/connect-server.js +114 -4
  471. package/src/server/connector-runtime.d.ts +6 -8
  472. package/src/server/connector-runtime.js +8 -28
  473. package/src/server/proxy/proxy-runner.js +1 -1
  474. package/src/server/slack-event-verification.d.ts +37 -0
  475. package/src/server/slack-event-verification.js +91 -0
  476. package/src/server/storage/connection-request-store.d.ts +1 -1
  477. package/src/server/storage/connection-store.d.ts +1 -1
  478. package/src/server/storage/postgres/runtime-store.d.ts +1 -1
  479. package/src/server/storage/runtime-database.d.ts +1 -1
  480. package/src/server/storage/saas-project-store.d.ts +1 -1
  481. package/src/triggers/maintenance.d.ts +2 -0
  482. package/src/triggers/maintenance.js +2 -1
  483. package/src/triggers/sources/slack-signature.d.ts +10 -0
  484. package/src/triggers/sources/slack-signature.js +13 -0
  485. package/src/triggers/sources/slack.js +9 -11
  486. package/src/triggers/trigger-runner.js +1 -1
@@ -0,0 +1,131 @@
1
+ import { ConnectionError } from "./connection-error.js";
2
+ import { withProviderHttpDispatchResult } from "./providers/provider-runtime.js";
3
+ const OAUTH_REFRESH_PERSIST_ATTEMPTS = 3;
4
+ /**
5
+ * Lays a refresh result onto the connection's current credential. A refresh owns the token
6
+ * fields and the metadata keys it changed; everything else on `current` belongs to whoever
7
+ * bumped the revision and is kept.
8
+ */
9
+ function mergeRefreshedOAuthCredential(current, spent, refreshed) {
10
+ const metadata = { ...current.metadata };
11
+ for (const [key, value] of Object.entries(refreshed.metadata)) {
12
+ if (JSON.stringify(value) !== JSON.stringify(spent.metadata[key]))
13
+ metadata[key] = value;
14
+ }
15
+ // A successful refresh proves the authorization is live, so a concurrent refusal's mark is stale.
16
+ delete metadata.oauthReauthRequired;
17
+ return {
18
+ ...current,
19
+ accessToken: refreshed.accessToken,
20
+ tokenType: refreshed.tokenType,
21
+ expiresAt: refreshed.expiresAt,
22
+ refreshToken: refreshed.refreshToken,
23
+ providerSecret: refreshed.providerSecret,
24
+ metadata,
25
+ };
26
+ }
27
+ /** Resolves stored credentials and owns refresh coalescing and revision-safe persistence. */
28
+ export class CredentialResolver {
29
+ store;
30
+ oauthCredentials;
31
+ providerHttpDispatch;
32
+ oauthCredentialRefreshes = new Map();
33
+ constructor(options) {
34
+ this.store = options.store;
35
+ this.oauthCredentials = options.oauthCredentials;
36
+ this.providerHttpDispatch = options.providerHttpDispatch;
37
+ }
38
+ async resolve(connection) {
39
+ return connection.credential.authType === "oauth2"
40
+ ? this.resolveOAuthCredential(connection, connection.credential)
41
+ : connection.credential;
42
+ }
43
+ async resolveOAuthCredential(connection, credential) {
44
+ const service = connection.service;
45
+ if (credential.metadata.oauthReauthRequired === true) {
46
+ throw new ConnectionError("oauth_reauth_required", `OAuth authorization is no longer valid. Reconnect ${service}.`);
47
+ }
48
+ if (!isOAuthCredentialExpired(credential)) {
49
+ return credential;
50
+ }
51
+ if (!credential.refreshToken) {
52
+ throw new ConnectionError("oauth_token_expired", `${service} OAuth access token expired and no refresh token is available. Reconnect ${service}.`);
53
+ }
54
+ if (!this.oauthCredentials) {
55
+ throw new ConnectionError("oauth_refresh_unavailable", `${service} OAuth access token expired and this runtime cannot refresh it.`);
56
+ }
57
+ // Single-flight on the refresh token being spent, not the row revision: a single-use
58
+ // (rotating) refresh token must reach the provider once even when an unrelated write
59
+ // bumps the revision mid-refresh. A new authorization must refresh independently,
60
+ // even when the provider reuses the same refresh token across reconnects.
61
+ const refreshKey = JSON.stringify([
62
+ connection.id,
63
+ credential.refreshToken,
64
+ credential.metadata.oauthAuthorizationId,
65
+ ]);
66
+ const currentRefresh = this.oauthCredentialRefreshes.get(refreshKey);
67
+ if (currentRefresh) {
68
+ return currentRefresh;
69
+ }
70
+ const refresh = this.refreshOAuthCredential(connection, credential, this.oauthCredentials);
71
+ this.oauthCredentialRefreshes.set(refreshKey, refresh);
72
+ try {
73
+ return await refresh;
74
+ }
75
+ finally {
76
+ if (this.oauthCredentialRefreshes.get(refreshKey) === refresh) {
77
+ this.oauthCredentialRefreshes.delete(refreshKey);
78
+ }
79
+ }
80
+ }
81
+ async refreshOAuthCredential(connection, credential, refresher) {
82
+ const { id, revision, service, connectionName } = connection;
83
+ let nextCredential;
84
+ try {
85
+ nextCredential = await withProviderHttpDispatchResult({ operation: "oauth", service, connectionId: id, connectionName }, () => refresher.refresh(service, credential), this.providerHttpDispatch);
86
+ }
87
+ catch (error) {
88
+ if (error instanceof ConnectionError && error.code === "oauth_reauth_required") {
89
+ // The revision fence prevents a late refusal from marking a replacement authorization as expired.
90
+ await this.store.updateCredential({
91
+ id,
92
+ revision,
93
+ service,
94
+ connectionName,
95
+ credential: { ...credential, metadata: { ...credential.metadata, oauthReauthRequired: true } },
96
+ }, true);
97
+ }
98
+ throw error;
99
+ }
100
+ // The provider has now spent the old refresh token. With rotating single-use refresh
101
+ // tokens, discarding `nextCredential` loses the connection for good, so a lost
102
+ // revision race re-reads the row and lands the refreshed token fields on the latest
103
+ // revision, as long as that row still holds the credential this refresh spent.
104
+ let target = { ...connection, source: "local", credential: nextCredential };
105
+ for (let attempt = 0; attempt < OAUTH_REFRESH_PERSIST_ATTEMPTS; attempt++) {
106
+ if (await this.store.updateCredential(target, true))
107
+ return target.credential;
108
+ const current = await this.store.get(service, connectionName);
109
+ if (current?.source === "saas" ||
110
+ current?.id !== id ||
111
+ current.credential.authType !== "oauth2" ||
112
+ current.credential.refreshToken !== credential.refreshToken ||
113
+ current.credential.metadata.oauthAuthorizationId !== credential.metadata.oauthAuthorizationId) {
114
+ // Deleted, converted, reconnected, or already rotated elsewhere: never overwrite it.
115
+ break;
116
+ }
117
+ target = {
118
+ ...current,
119
+ credential: mergeRefreshedOAuthCredential(current.credential, credential, nextCredential),
120
+ };
121
+ }
122
+ throw new ConnectionError("connection_not_found", `${service} connection changed while its OAuth credential was refreshing. Retry the action.`);
123
+ }
124
+ }
125
+ export function isOAuthCredentialExpired(credential) {
126
+ if (!credential.expiresAt) {
127
+ return false;
128
+ }
129
+ const expiresAt = Date.parse(credential.expiresAt);
130
+ return Number.isFinite(expiresAt) && expiresAt <= Date.now() + 60_000;
131
+ }
package/src/mcp.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createMcpHandler, McpServer } from "@modelcontextprotocol/server";
2
2
  import * as z from "zod/v4";
3
- import { ConnectionError } from "./connection-service.js";
3
+ import { ConnectionError } from "./connection-error.js";
4
4
  import { createActionSearchIndexProvider, searchActions as searchActionIndex } from "./core/action-search.js";
5
5
  import { describeSchemaType, readSchemaProperties, readSchemaRequired } from "./core/json-schema.js";
6
6
  import { renderActionMarkdown } from "./server/api/action-markdown.js";
@@ -20,7 +20,7 @@ export type OAuthClientConfig = {
20
20
  };
21
21
  export interface OAuthClientConfigInput {
22
22
  clientId: string;
23
- clientSecret: string;
23
+ clientSecret?: string;
24
24
  /** Non-empty provider-declared scope subset to request. Omit to use every provider default. */
25
25
  requestedScopes?: string[];
26
26
  /** Absolute redirect URI override, any scheme. Omit to use the runtime callback. */
@@ -34,14 +34,26 @@ export class OAuthClientConfigService {
34
34
  return normalizeStoredOAuthClientConfig(await this.store.get(service));
35
35
  }
36
36
  async upsertConfig(input) {
37
- const config = this.normalizeConfig(input.service, input);
37
+ const previous = await this.getConfig(input.service);
38
+ const sameClient = previous?.clientId === input.clientId.trim();
39
+ const secretExtra = sameClient ? { ...previous?.secretExtra } : {};
40
+ for (const field of filterClientConfigFields(this.getOAuthDefinition(input.service).clientConfigFields, "secretExtra")) {
41
+ if (input.extra && field.key in input.extra)
42
+ secretExtra[field.key] = input.extra[field.key];
43
+ }
44
+ Object.assign(secretExtra, input.secretExtra);
45
+ const config = this.normalizeConfig(input.service, {
46
+ ...input,
47
+ clientSecret: input.clientSecret ?? (sameClient ? previous?.clientSecret : undefined),
48
+ secretExtra,
49
+ });
38
50
  await this.store.set(config);
39
51
  return this.toSummary(input.service, this.getOAuthDefinition(input.service), config);
40
52
  }
41
53
  normalizeConfig(service, input) {
42
54
  const auth = this.getOAuthDefinition(service);
43
55
  const clientId = input.clientId.trim();
44
- const clientSecret = input.clientSecret.trim();
56
+ const clientSecret = (input.clientSecret ?? "").trim();
45
57
  if (!clientId) {
46
58
  throw new OAuthClientConfigError("invalid_input", "clientId is required.");
47
59
  }
@@ -1,4 +1,4 @@
1
- import { ConnectionError } from "../connection-service.js";
1
+ import { ConnectionError } from "../connection-error.js";
2
2
  import { optionalRecord, stringRecord } from "../core/cast.js";
3
3
  import { providerFetch } from "../providers/provider-runtime.js";
4
4
  import { readOAuthClientConfigMetadata } from "./oauth-client-config-service.js";
@@ -1,4 +1,5 @@
1
- import type { StoredConnection, ConnectionService } from "../connection-service.ts";
1
+ import type { ConnectionService } from "../connection-service.ts";
2
+ import type { StoredConnection } from "../connection-store.ts";
2
3
  import type { IProviderLoader } from "../providers/provider-loader.ts";
3
4
  import type { SaasOAuthService } from "../saas/saas-oauth-service.ts";
4
5
  import type { ISecretCodec } from "../server/secrets/secret-codec-core.ts";
@@ -81,6 +82,13 @@ export declare class OAuthFlowService {
81
82
  startConnectionRequest(input: OAuthConnectionRequestInput): Promise<OAuthConnectionRequestStart>;
82
83
  getConnectionRequest(id: string, owner: string): Promise<ConnectionRequest | undefined>;
83
84
  rejectAuthorization(state: string, denied: boolean): Promise<string | undefined>;
85
+ /**
86
+ * Ends a runtime authorization (`POST /api/oauth/authorizations`) that the
87
+ * provider refused, so a later callback for the same state cannot complete
88
+ * it. Returns false when no such authorization was pending (unknown, or
89
+ * already completed or refused by another callback).
90
+ */
91
+ discardAuthorization(state: string): Promise<boolean>;
84
92
  private prepareAuthorization;
85
93
  completeAuthorization(input: OAuthAuthorizationCompleteInput): Promise<{
86
94
  service: string;
@@ -1,5 +1,6 @@
1
1
  import { createHash, randomBytes } from "node:crypto";
2
- import { ConnectionError, normalizeConnectionName } from "../connection-service.js";
2
+ import { ConnectionError } from "../connection-error.js";
3
+ import { normalizeConnectionName } from "../connection-service.js";
3
4
  import { providerFetch, ProviderDispatchRequestError, withProviderHttpDispatchResult, } from "../providers/provider-runtime.js";
4
5
  import { requestAuthorizationCodeToken } from "./oauth-token.js";
5
6
  /**
@@ -97,6 +98,15 @@ export class OAuthFlowService {
97
98
  await this.requests.fail(pending.connectionRequestId, denied ? "invalid_input" : "provider_error", denied ? "Authorization was denied." : "OAuth connection failed.");
98
99
  return callbackReturnUri(pending, "error", denied ? "invalid_input" : "provider_error", denied ? "Authorization was denied." : "OAuth connection failed.");
99
100
  }
101
+ /**
102
+ * Ends a runtime authorization (`POST /api/oauth/authorizations`) that the
103
+ * provider refused, so a later callback for the same state cannot complete
104
+ * it. Returns false when no such authorization was pending (unknown, or
105
+ * already completed or refused by another callback).
106
+ */
107
+ async discardAuthorization(state) {
108
+ return (await this.states.take(state)) !== undefined;
109
+ }
100
110
  async prepareAuthorization(input, requestConfig) {
101
111
  const { service } = input;
102
112
  const connectionName = normalizeConnectionName(input.connectionName);
@@ -1,9 +1,8 @@
1
1
  import { isIP } from "node:net";
2
2
  import { nullableString, optionalBoolean, optionalInteger, optionalRecord, optionalString } from "../../core/cast.js";
3
- import { defineProviderExecutors, defineProviderProxy, isAbortLikeError, providerUserAgent, ProviderRequestError, requireApiKeyCredential, requiredResponseRecord, } from "../provider-runtime.js";
3
+ import { defineProviderExecutors, defineProviderProxy, isAbortLikeError, providerUserAgent, ProviderRequestError, requireApiKeyCredential, requiredResponseRecord, defaultProviderRequestTimeoutMs, } from "../provider-runtime.js";
4
4
  const service = "abuseipdb";
5
5
  const abuseipdbApiBaseUrl = "https://api.abuseipdb.com/api/v2";
6
- const abuseipdbDefaultRequestTimeoutMs = 30_000;
7
6
  const abuseipdbValidationIpAddress = "8.8.8.8";
8
7
  export const abuseipdbActionHandlers = {
9
8
  check_ip(input, context) {
@@ -182,8 +181,8 @@ async function requestAbuseipdbJson(input) {
182
181
  let response;
183
182
  let payload;
184
183
  const signal = input.context.signal
185
- ? AbortSignal.any([input.context.signal, AbortSignal.timeout(abuseipdbDefaultRequestTimeoutMs)])
186
- : AbortSignal.timeout(abuseipdbDefaultRequestTimeoutMs);
184
+ ? AbortSignal.any([input.context.signal, AbortSignal.timeout(defaultProviderRequestTimeoutMs)])
185
+ : AbortSignal.timeout(defaultProviderRequestTimeoutMs);
187
186
  try {
188
187
  response = await input.context.fetcher(buildAbuseipdbUrl(input.path, input.query ?? {}), {
189
188
  method: "GET",
@@ -52,6 +52,7 @@ export interface ProviderActionNames {
52
52
  aliyun_oss: "list_buckets" | "list_objects" | "head_object" | "download_object" | "put_object" | "delete_object" | "generate_presigned_url";
53
53
  aliyun_sls: "list_projects" | "list_projects_across_regions" | "list_logstores" | "query_logs" | "get_histograms";
54
54
  aliyun_sts: "assume_role";
55
+ allratestoday: "get_latest_rates" | "convert";
55
56
  alpaca: "get_account" | "list_assets" | "get_asset" | "list_positions" | "get_position" | "list_orders" | "get_order" | "get_market_clock" | "list_watchlists" | "get_watchlist" | "list_account_activities" | "get_account_config" | "get_account_portfolio_history" | "get_market_calendar" | "list_corporate_actions" | "get_stock_bars" | "get_crypto_bars" | "list_option_contracts" | "get_option_contract" | "get_stock_snapshots" | "get_crypto_snapshots" | "list_news";
56
57
  alpha_vantage: "search_symbols" | "get_global_quote" | "get_intraday_time_series" | "get_daily_time_series" | "get_daily_adjusted_time_series" | "get_weekly_time_series" | "get_weekly_adjusted_time_series" | "get_monthly_time_series" | "get_monthly_adjusted_time_series" | "get_realtime_bulk_quotes" | "get_top_gainers_losers" | "get_market_status" | "get_currency_exchange_rate" | "get_fx_intraday" | "get_fx_daily" | "get_fx_weekly" | "get_fx_monthly" | "get_crypto_intraday" | "get_digital_currency_daily" | "get_digital_currency_weekly" | "get_digital_currency_monthly" | "get_company_overview" | "get_etf_profile" | "get_income_statement" | "get_balance_sheet" | "get_cash_flow" | "get_earnings" | "get_earnings_estimates" | "get_listing_status" | "get_earnings_calendar" | "get_ipo_calendar" | "get_dividends" | "get_splits" | "get_insider_transactions" | "get_institutional_holdings" | "get_earnings_call_transcript" | "get_historical_options" | "get_realtime_options" | "get_news_sentiment" | "get_sector_performance" | "get_commodity_data" | "get_macro_indicator" | "get_technical_indicator" | "call_official_function";
57
58
  alt_text_ai: "get_account" | "create_image" | "list_images" | "get_image" | "search_images" | "delete_image" | "scrape_page";
@@ -1,8 +1,7 @@
1
1
  import { compactObject, optionalBoolean, optionalBooleanOrNull, optionalInteger, optionalRecord, optionalString, } from "../../core/cast.js";
2
- import { defineProviderExecutors, defineProviderProxy, isAbortLikeError, providerUserAgent, ProviderRequestError, requireApiKeyCredential, } from "../provider-runtime.js";
2
+ import { defineProviderExecutors, defineProviderProxy, isAbortLikeError, providerUserAgent, ProviderRequestError, requireApiKeyCredential, defaultProviderRequestTimeoutMs, } from "../provider-runtime.js";
3
3
  const service = "addressfinder";
4
4
  const addressfinderApiBaseUrl = "https://api.addressfinder.io/api/";
5
- const addressfinderDefaultRequestTimeoutMs = 30_000;
6
5
  const addressfinderValidationEndpoint = "/nz/address/autocomplete";
7
6
  export const addressfinderActionHandlers = {
8
7
  find_au_addresses(input, context) {
@@ -182,7 +181,7 @@ async function requestAndWrapAddressfinderJson(input) {
182
181
  return input.normalize(payload);
183
182
  }
184
183
  async function requestAddressfinderJson(input) {
185
- const timeoutSignal = AbortSignal.timeout(addressfinderDefaultRequestTimeoutMs);
184
+ const timeoutSignal = AbortSignal.timeout(defaultProviderRequestTimeoutMs);
186
185
  const signal = input.signal ? AbortSignal.any([input.signal, timeoutSignal]) : timeoutSignal;
187
186
  try {
188
187
  const response = await input.fetcher(buildAddressfinderUrl(input.path, input.apiKey, input.query), {
@@ -1,5 +1,5 @@
1
1
  import { optionalRecord, optionalString } from "../../core/cast.js";
2
- import { defineProviderExecutors, defineProviderProxy, providerUserAgent, ProviderRequestError, requireApiKeyCredential, } from "../provider-runtime.js";
2
+ import { defineProviderExecutors, defineProviderProxy, providerUserAgent, ProviderRequestError, requireApiKeyCredential, providerInputError, providerResponseError, } from "../provider-runtime.js";
3
3
  const service = "aeroleads";
4
4
  const aeroleadsApiBaseUrl = "https://aeroleads.com";
5
5
  const linkedinDetailsPath = "/api/get_linkedin_details";
@@ -170,7 +170,7 @@ function mapAeroleadsError(status, message) {
170
170
  return new ProviderRequestError(status, message);
171
171
  }
172
172
  if (status >= 400 && status < 500) {
173
- return new ProviderRequestError(400, message);
173
+ return providerInputError(message);
174
174
  }
175
- return new ProviderRequestError(502, message);
175
+ return providerResponseError(message);
176
176
  }
@@ -1,8 +1,7 @@
1
1
  import { compactObject, nullableString, optionalRecord, optionalString } from "../../core/cast.js";
2
- import { isAbortLikeError, providerUserAgent, ProviderRequestError } from "../provider-runtime.js";
2
+ import { isAbortLikeError, providerUserAgent, ProviderRequestError, providerInputError, providerResponseError, defaultProviderRequestTimeoutMs, } from "../provider-runtime.js";
3
3
  export const affinityApiBaseUrl = "https://api.affinity.co";
4
4
  export const affinityValidationPath = "/v2/auth/whoami";
5
- const affinityRequestTimeoutMs = 30_000;
6
5
  export const affinityActionHandlers = {
7
6
  get_current_user(_input, context) {
8
7
  return getCurrentUser(context);
@@ -186,7 +185,7 @@ async function affinityRequest(path, query, apiKey, fetcher, mode, signal) {
186
185
  }
187
186
  url.searchParams.set(key, value);
188
187
  }
189
- const timeoutSignal = AbortSignal.timeout(affinityRequestTimeoutMs);
188
+ const timeoutSignal = AbortSignal.timeout(defaultProviderRequestTimeoutMs);
190
189
  const requestSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
191
190
  let response;
192
191
  try {
@@ -233,18 +232,18 @@ function buildAffinityError(status, payload, mode) {
233
232
  return new ProviderRequestError(429, message);
234
233
  }
235
234
  if (mode === "validation" && status === 401) {
236
- return new ProviderRequestError(400, message);
235
+ return providerInputError(message);
237
236
  }
238
237
  if (mode === "execution" && (status === 401 || status === 403)) {
239
238
  return new ProviderRequestError(status, message);
240
239
  }
241
240
  if (status === 404) {
242
- return new ProviderRequestError(400, message);
241
+ return providerInputError(message);
243
242
  }
244
243
  if (status >= 400 && status < 500) {
245
- return new ProviderRequestError(400, message);
244
+ return providerInputError(message);
246
245
  }
247
- return new ProviderRequestError(502, message);
246
+ return providerResponseError(message);
248
247
  }
249
248
  function extractAffinityErrorMessage(payload) {
250
249
  if (typeof payload === "string" && payload.trim().length > 0) {
@@ -1,6 +1,6 @@
1
1
  import { CastError, compactObject, optionalRecord, optionalString } from "../../core/cast.js";
2
2
  import { encodePathSegment } from "../../core/request.js";
3
- import { createProviderFetch, defineProviderProxy, ProviderRequestError, providerUserAgent, requireApiKeyCredential, toProviderExecutionError, } from "../provider-runtime.js";
3
+ import { createProviderFetch, defineProviderProxy, ProviderRequestError, providerUserAgent, requireApiKeyCredential, toProviderExecutionError, providerInputError, } from "../provider-runtime.js";
4
4
  const service = "aftership";
5
5
  const aftershipApiBaseUrl = "https://api.aftership.com/tracking/2026-01";
6
6
  const aftershipFetch = createProviderFetch({ skipDnsValidation: true });
@@ -172,7 +172,7 @@ function createAftershipError(response, payload, phase) {
172
172
  const message = readAftershipErrorMessage(payload) ?? `AfterShip API request failed with status ${response.status}`;
173
173
  if (response.status === 401 || response.status === 403) {
174
174
  if (phase === "validate") {
175
- return new ProviderRequestError(400, message);
175
+ return providerInputError(message);
176
176
  }
177
177
  return new ProviderRequestError(response.status, message, payload);
178
178
  }
@@ -1,5 +1,5 @@
1
1
  import { compactObject, optionalInteger, optionalRecord, optionalString } from "../../core/cast.js";
2
- import { mapProviderActionHandlers, providerUserAgent, ProviderRequestError } from "../provider-runtime.js";
2
+ import { mapProviderActionHandlers, providerUserAgent, ProviderRequestError, providerInputError, } from "../provider-runtime.js";
3
3
  import { agentMailOperations } from "./actions.js";
4
4
  export const agentMailApiBaseUrl = "https://api.agentmail.to";
5
5
  export const agentMailActionHandlers = mapProviderActionHandlers("agent_mail", agentMailOperations, ({ operation }) => (input, context) => executeAgentMailOperation(input, context, operation));
@@ -147,7 +147,7 @@ function createAgentMailError(response, payload, phase, notFoundAsInvalidInput =
147
147
  return new ProviderRequestError(phase === "validate" ? 400 : 401, message);
148
148
  }
149
149
  if (response.status === 404 && notFoundAsInvalidInput) {
150
- return new ProviderRequestError(400, message);
150
+ return providerInputError(message);
151
151
  }
152
152
  if (response.status === 400 || response.status === 404 || response.status === 422) {
153
153
  return new ProviderRequestError(response.status, message);
@@ -1,5 +1,5 @@
1
1
  import { compactObject, optionalBoolean, optionalInteger, optionalRecord, optionalString } from "../../core/cast.js";
2
- import { providerUserAgent, ProviderRequestError } from "../provider-runtime.js";
2
+ import { providerUserAgent, ProviderRequestError, providerInputError } from "../provider-runtime.js";
3
3
  export const agentqlApiBaseUrl = "https://api.agentql.com";
4
4
  const usagePath = "/v1/usage";
5
5
  const queryDataPath = "/v1/query-data";
@@ -154,7 +154,7 @@ function createAgentqlError(response, payload, phase) {
154
154
  return new ProviderRequestError(429, message);
155
155
  }
156
156
  if (phase === "validate" && (response.status === 401 || response.status === 403)) {
157
- return new ProviderRequestError(400, message);
157
+ return providerInputError(message);
158
158
  }
159
159
  if (response.status >= 400 && response.status < 500) {
160
160
  return new ProviderRequestError(response.status, message);
@@ -1,10 +1,9 @@
1
1
  import { compactObject, optionalRecord, optionalString, recordOrEmpty, requiredRecord } from "../../core/cast.js";
2
2
  import { storeResponseInTransit } from "../../core/request.js";
3
- import { providerFetch, ProviderRequestError, providerUserAgent } from "../provider-runtime.js";
3
+ import { providerFetch, ProviderRequestError, providerUserAgent, defaultProviderRequestTimeoutMs, } from "../provider-runtime.js";
4
4
  export const agentyApiBaseUrl = "https://api.agenty.com/v2";
5
5
  export const agentyBrowserBaseUrl = "https://browser.agenty.com/api";
6
6
  const agentyValidationPath = "/agents";
7
- const agentyTimeoutMs = 30_000;
8
7
  export const agentyActionHandlers = {
9
8
  get_page_content(input, context) {
10
9
  return getPageContent(input, context);
@@ -455,7 +454,7 @@ async function downloadJobResult(input, context) {
455
454
  });
456
455
  const record = unwrapAgentyPayload(payload);
457
456
  const downloadUrl = asRequiredString(record.downloadlink ?? record.downloadLink, "downloadlink");
458
- const timeoutSignal = AbortSignal.timeout(agentyTimeoutMs);
457
+ const timeoutSignal = AbortSignal.timeout(defaultProviderRequestTimeoutMs);
459
458
  const signal = context.signal ? AbortSignal.any([context.signal, timeoutSignal]) : timeoutSignal;
460
459
  try {
461
460
  const response = await context.fetcher(downloadUrl, {
@@ -555,7 +554,7 @@ async function requestAgentyApiJson(input) {
555
554
  });
556
555
  }
557
556
  async function requestAgentyApiResponse(input) {
558
- const timeoutSignal = AbortSignal.timeout(agentyTimeoutMs);
557
+ const timeoutSignal = AbortSignal.timeout(defaultProviderRequestTimeoutMs);
559
558
  const signal = input.context.signal ? AbortSignal.any([input.context.signal, timeoutSignal]) : timeoutSignal;
560
559
  try {
561
560
  const response = await input.context.fetcher(buildAgentyUrl(input.baseUrl ?? agentyApiBaseUrl, input.path, input.query), {
@@ -585,7 +584,7 @@ async function requestAgentyApiResponse(input) {
585
584
  }
586
585
  }
587
586
  async function requestAgentyBrowser(input) {
588
- const timeoutSignal = AbortSignal.timeout(agentyTimeoutMs);
587
+ const timeoutSignal = AbortSignal.timeout(defaultProviderRequestTimeoutMs);
589
588
  const signal = input.context.signal ? AbortSignal.any([input.context.signal, timeoutSignal]) : timeoutSignal;
590
589
  try {
591
590
  const response = await input.context.fetcher(buildAgentyUrl(agentyBrowserBaseUrl, input.path), {
@@ -615,7 +614,7 @@ async function requestAgentyBrowser(input) {
615
614
  }
616
615
  }
617
616
  async function requestAgentyJson(input) {
618
- const timeoutSignal = AbortSignal.timeout(agentyTimeoutMs);
617
+ const timeoutSignal = AbortSignal.timeout(defaultProviderRequestTimeoutMs);
619
618
  const signal = input.signal ? AbortSignal.any([input.signal, timeoutSignal]) : timeoutSignal;
620
619
  try {
621
620
  const response = await input.fetcher(buildAgentyUrl(input.baseUrl, input.path, input.query), {
@@ -1,7 +1,6 @@
1
1
  import type { CredentialValidationResult } from "../../core/types.ts";
2
2
  import type { ProviderActionHandlers } from "../provider-runtime.ts";
3
3
  export declare const agiledApiBaseUrl = "https://my.agiled.app/api/v1";
4
- export declare const agiledDefaultRequestTimeoutMs = 30000;
5
4
  interface AgiledActionContext {
6
5
  apiKey: string;
7
6
  brand: string;
@@ -1,7 +1,6 @@
1
1
  import { compactObject, optionalRecord, optionalString } from "../../core/cast.js";
2
- import { providerUserAgent, ProviderRequestError } from "../provider-runtime.js";
2
+ import { providerUserAgent, ProviderRequestError, defaultProviderRequestTimeoutMs } from "../provider-runtime.js";
3
3
  export const agiledApiBaseUrl = "https://my.agiled.app/api/v1";
4
- export const agiledDefaultRequestTimeoutMs = 30_000;
5
4
  export const agiledActionHandlers = {
6
5
  list_contacts(_input, context) {
7
6
  return listAgiledItems("contacts", "/contacts", context);
@@ -143,7 +142,7 @@ function buildRequestOptions(context) {
143
142
  };
144
143
  }
145
144
  async function requestAgiledJson(path, options) {
146
- const timeoutSignal = AbortSignal.timeout(agiledDefaultRequestTimeoutMs);
145
+ const timeoutSignal = AbortSignal.timeout(defaultProviderRequestTimeoutMs);
147
146
  const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
148
147
  try {
149
148
  const response = await options.fetcher(buildAgiledUrl(path, options.apiKey), {
@@ -1,7 +1,6 @@
1
1
  import { booleanString, compactObject, optionalInteger, optionalRecord, optionalString } from "../../core/cast.js";
2
- import { providerUserAgent, ProviderRequestError } from "../provider-runtime.js";
2
+ import { providerUserAgent, ProviderRequestError, defaultProviderRequestTimeoutMs } from "../provider-runtime.js";
3
3
  export const agilityApiBaseUrl = "https://api.aglty.io";
4
- const agilityDefaultRequestTimeoutMs = 30_000;
5
4
  export const agilityActionHandlers = {
6
5
  async list_content_models(input, context) {
7
6
  const payload = await requestAgilityJson({
@@ -156,7 +155,7 @@ export async function validateAgilityCredential(input, fetcher, signal) {
156
155
  };
157
156
  }
158
157
  async function requestAgilityJson(input) {
159
- const timeoutSignal = AbortSignal.timeout(agilityDefaultRequestTimeoutMs);
158
+ const timeoutSignal = AbortSignal.timeout(defaultProviderRequestTimeoutMs);
160
159
  const signal = input.signal ? AbortSignal.any([input.signal, timeoutSignal]) : timeoutSignal;
161
160
  try {
162
161
  const response = await input.fetcher(buildAgilityUrl(input.path, input.params), {
@@ -1,5 +1,5 @@
1
1
  import { compactObject, optionalNumber, optionalRecord, optionalString } from "../../core/cast.js";
2
- import { providerUserAgent, ProviderRequestError } from "../provider-runtime.js";
2
+ import { providerUserAgent, ProviderRequestError, providerInputError } from "../provider-runtime.js";
3
3
  export const ahrefsApiBaseUrl = "https://api.ahrefs.com/v3";
4
4
  const limitsAndUsagePath = "/subscription-info/limits-and-usage";
5
5
  export const ahrefsActionHandlers = {
@@ -140,13 +140,13 @@ function createAhrefsError(status, payload, phase) {
140
140
  return new ProviderRequestError(429, message);
141
141
  }
142
142
  if (phase === "validate" && (status === 401 || status === 403)) {
143
- return new ProviderRequestError(400, message);
143
+ return providerInputError(message);
144
144
  }
145
145
  if (phase === "execute" && (status === 401 || status === 403)) {
146
146
  return new ProviderRequestError(401, message);
147
147
  }
148
148
  if (phase === "execute" && [400, 404, 422].includes(status)) {
149
- return new ProviderRequestError(400, message);
149
+ return providerInputError(message);
150
150
  }
151
151
  return new ProviderRequestError(status || 500, message);
152
152
  }
@@ -1,8 +1,7 @@
1
1
  import { withMcpClient } from "../mcp-client.js";
2
- import { ProviderRequestError, providerUserAgent } from "../provider-runtime.js";
2
+ import { ProviderRequestError, providerUserAgent, providerInputError, providerResponseError, defaultProviderRequestTimeoutMs, } from "../provider-runtime.js";
3
3
  const origin = "https://mcp.wind.com.cn";
4
4
  const actionTimeoutMs = 28_000;
5
- const validationTimeoutMs = 30_000;
6
5
  const maxResponseBytes = 16 * 1024 * 1024;
7
6
  const maxToolPages = 100;
8
7
  const maxTools = 10_000;
@@ -106,7 +105,7 @@ export async function callTool(actionName, input, context) {
106
105
  return { result };
107
106
  }
108
107
  export async function discoverAccessibleTools(context) {
109
- const deadline = Date.now() + validationTimeoutMs;
108
+ const deadline = Date.now() + defaultProviderRequestTimeoutMs;
110
109
  let lastError;
111
110
  for (const serverType of serverTypes) {
112
111
  const remaining = deadline - Date.now();
@@ -300,7 +299,7 @@ function classifyWindError(message, phase) {
300
299
  "indicator_not_found",
301
300
  "market_target_not_found",
302
301
  ]))
303
- return new ProviderRequestError(400, message);
302
+ return providerInputError(message);
304
303
  const namesParameter = includesAny(normalized, ["参数", "字段", "param", "argument", "field"]);
305
304
  const invalid = includesAny(normalized, [
306
305
  "错误",
@@ -315,16 +314,16 @@ function classifyWindError(message, phase) {
315
314
  "required",
316
315
  ]);
317
316
  if (namesParameter && invalid)
318
- return new ProviderRequestError(400, message);
317
+ return providerInputError(message);
319
318
  if (includesAny(normalized, ["route_error", "unknown server_type", "未知 server_type"]))
320
- return new ProviderRequestError(400, message);
319
+ return providerInputError(message);
321
320
  return undefined;
322
321
  }
323
322
  function transformWindToolResult(result, apiKey) {
324
323
  const cloned = structuredClone(result);
325
324
  const error = readEmbeddedWindError(cloned, apiKey);
326
325
  if (error)
327
- throw new ProviderRequestError(502, error);
326
+ throw providerResponseError(error);
328
327
  return asRecord(cloned)?.structuredContent ?? cloned;
329
328
  }
330
329
  function readEmbeddedWindError(result, apiKey) {
@@ -1,5 +1,5 @@
1
1
  import { compactObject, objectArray, optionalBoolean, optionalInteger, optionalRecord, optionalString, optionalStringArray, } from "../../core/cast.js";
2
- import { defineBearerProviderExecutors, defineProviderProxy, ProviderRequestError, providerResponseError, providerUserAgent, requiredResponseRecord, } from "../provider-runtime.js";
2
+ import { defineBearerProviderExecutors, defineProviderProxy, ProviderRequestError, providerResponseError, providerUserAgent, requiredResponseRecord, providerInputError, } from "../provider-runtime.js";
3
3
  import { airtableRecordChanged } from "./trigger-on-record-changed.js";
4
4
  export const airtableApiBaseUrl = "https://api.airtable.com";
5
5
  const service = "airtable";
@@ -360,10 +360,10 @@ function createAirtableError(response, payload, mode, notFoundAsInvalidInput) {
360
360
  return new ProviderRequestError(mode === "validate" ? 400 : response.status, message);
361
361
  }
362
362
  if (notFoundAsInvalidInput && response.status === 404) {
363
- return new ProviderRequestError(400, message);
363
+ return providerInputError(message);
364
364
  }
365
365
  if (response.status === 422) {
366
- return new ProviderRequestError(400, message);
366
+ return providerInputError(message);
367
367
  }
368
368
  if (response.status === 429) {
369
369
  return new ProviderRequestError(429, message);
@@ -1,5 +1,5 @@
1
1
  import { compactObject, optionalBoolean } from "../../core/cast.js";
2
- import { providerUserAgent, ProviderRequestError } from "../provider-runtime.js";
2
+ import { providerUserAgent, ProviderRequestError, providerInputError } from "../provider-runtime.js";
3
3
  export const alchemyRpcBaseUrl = "https://eth-mainnet.g.alchemy.com/v2";
4
4
  export const alchemyNftBaseUrl = "https://eth-mainnet.g.alchemy.com/nft/v3";
5
5
  export const alchemyActionHandlers = {
@@ -248,7 +248,7 @@ function createAlchemyHttpError(status, payload, phase) {
248
248
  return new ProviderRequestError(phase === "validate" ? 400 : status, message);
249
249
  }
250
250
  if (status === 400 || status === 404) {
251
- return new ProviderRequestError(400, message);
251
+ return providerInputError(message);
252
252
  }
253
253
  return new ProviderRequestError(status || 500, message);
254
254
  }
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { compactObject, optionalBoolean, optionalNumber, optionalRecord, optionalString } from "../../core/cast.js";
3
- import { providerUserAgent, ProviderRequestError } from "../provider-runtime.js";
3
+ import { providerUserAgent, ProviderRequestError, providerInputError } from "../provider-runtime.js";
4
4
  export const algoliaActionHandlers = {
5
5
  list_indices(input, context) {
6
6
  return listAlgoliaIndices(input, context);
@@ -345,7 +345,7 @@ function createAlgoliaError(response, payload, phase, notFoundAsInvalidInput) {
345
345
  readOptionalString(record.error) ??
346
346
  `algolia request failed with ${response.status}`;
347
347
  if (response.status === 400) {
348
- return new ProviderRequestError(400, message);
348
+ return providerInputError(message);
349
349
  }
350
350
  if (response.status === 401) {
351
351
  return new ProviderRequestError(phase === "validate" ? 400 : 401, message);
@@ -354,7 +354,7 @@ function createAlgoliaError(response, payload, phase, notFoundAsInvalidInput) {
354
354
  return new ProviderRequestError(phase === "validate" ? 400 : 403, message);
355
355
  }
356
356
  if (response.status === 404 && notFoundAsInvalidInput) {
357
- return new ProviderRequestError(400, message);
357
+ return providerInputError(message);
358
358
  }
359
359
  if (response.status === 429) {
360
360
  return new ProviderRequestError(429, message);