@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.
- package/README.md +4 -2
- package/assets/open-connector/catalog/apps/allratestoday.json +174 -0
- package/assets/open-connector/catalog/apps/slackbot.json +20 -1
- package/assets/open-connector/catalog/apps-index.json +1 -1
- package/package.json +1 -1
- package/src/connection-error.d.ts +7 -0
- package/src/connection-error.js +10 -0
- package/src/connection-service.d.ts +2 -50
- package/src/connection-service.js +6 -130
- package/src/connection-store.d.ts +41 -0
- package/src/connection-store.js +1 -0
- package/src/core/guarded-fetch.d.ts +3 -0
- package/src/core/guarded-fetch.js +8 -1
- package/src/core/provider-network-policy.d.ts +15 -0
- package/src/core/provider-network-policy.js +11 -0
- package/src/core/request.d.ts +18 -14
- package/src/core/request.js +11 -35
- package/src/credential-resolver.d.ts +24 -0
- package/src/credential-resolver.js +131 -0
- package/src/mcp.js +1 -1
- package/src/oauth/oauth-client-config-service.d.ts +1 -1
- package/src/oauth/oauth-client-config-service.js +14 -2
- package/src/oauth/oauth-credential-refresh-service.js +1 -1
- package/src/oauth/oauth-flow-service.d.ts +9 -1
- package/src/oauth/oauth-flow-service.js +11 -1
- package/src/providers/abuseipdb/executors.js +3 -4
- package/src/providers/action-contracts.generated.d.ts +1 -0
- package/src/providers/addressfinder/executors.js +2 -3
- package/src/providers/aeroleads/executors.js +3 -3
- package/src/providers/affinity/runtime.js +6 -7
- package/src/providers/aftership/executors.js +2 -2
- package/src/providers/agent_mail/runtime.js +2 -2
- package/src/providers/agentql/runtime.js +2 -2
- package/src/providers/agenty/runtime.js +5 -6
- package/src/providers/agiled/runtime.d.ts +0 -1
- package/src/providers/agiled/runtime.js +2 -3
- package/src/providers/agility/runtime.js +2 -3
- package/src/providers/ahrefs/runtime.js +3 -3
- package/src/providers/aifinmarket/runtime.js +6 -7
- package/src/providers/airtable/executors.js +3 -3
- package/src/providers/alchemy/runtime.js +2 -2
- package/src/providers/algolia/runtime.js +3 -3
- package/src/providers/aliyun_oss/executors.js +7 -7
- package/src/providers/allratestoday/executors.d.ts +3 -0
- package/src/providers/allratestoday/executors.js +18 -0
- package/src/providers/allratestoday/runtime.d.ts +17 -0
- package/src/providers/allratestoday/runtime.js +104 -0
- package/src/providers/alpaca/runtime.js +2 -3
- package/src/providers/alpha_vantage/runtime.js +2 -2
- package/src/providers/alt_text_ai/runtime.js +2 -2
- package/src/providers/altiria/executors.js +3 -3
- package/src/providers/amap/runtime.js +3 -3
- package/src/providers/ambee/runtime.js +2 -2
- package/src/providers/ambivo/executors.js +3 -3
- package/src/providers/amilia/runtime.js +1 -1
- package/src/providers/amplemarket/runtime.js +2 -2
- package/src/providers/amplitude/runtime.js +3 -3
- package/src/providers/anysearch/runtime.js +4 -4
- package/src/providers/apaleo/runtime.js +2 -2
- package/src/providers/api_sports/executors.js +3 -4
- package/src/providers/apiverve/executors.js +2 -3
- package/src/providers/apollo/executors.js +2 -3
- package/src/providers/appcircle/runtime.js +5 -5
- package/src/providers/appdrag/executors.js +2 -3
- package/src/providers/arcgis_online/executors.js +2 -2
- package/src/providers/auth0_management/runtime.js +2 -3
- package/src/providers/autoblogger/executors.js +3 -3
- package/src/providers/baidu_maps/runtime.js +3 -3
- package/src/providers/baidu_netdisk/runtime-mcp.js +3 -4
- package/src/providers/bark/executors.js +5 -5
- package/src/providers/bitrise/runtime.js +3 -3
- package/src/providers/bouncer/executors.js +3 -4
- package/src/providers/browse_ai/runtime.js +3 -4
- package/src/providers/browserstack/executors.js +6 -7
- package/src/providers/buildkite/runtime.js +3 -3
- package/src/providers/bunnycdn/runtime.js +3 -3
- package/src/providers/businessmap/runtime.js +6 -7
- package/src/providers/buttondown/runtime.js +2 -2
- package/src/providers/byteforms/runtime.js +2 -2
- package/src/providers/calendly/runtime.js +2 -2
- package/src/providers/captainbi/runtime.js +6 -6
- package/src/providers/castingwords/runtime.js +1 -1
- package/src/providers/chatpdf/runtime.js +4 -4
- package/src/providers/check/executors.js +3 -4
- package/src/providers/checkly/executors.js +3 -4
- package/src/providers/chengxin/runtime.js +3 -3
- package/src/providers/cincopa/executors.js +3 -4
- package/src/providers/circle/executors.js +3 -4
- package/src/providers/clearout/executors.js +1 -2
- package/src/providers/clickhelp/runtime.js +5 -5
- package/src/providers/clickhouse/runtime.js +4 -4
- package/src/providers/clinicalkey/runtime.js +3 -3
- package/src/providers/clinicaltrials_gov/runtime.js +4 -5
- package/src/providers/clockify/runtime.js +4 -4
- package/src/providers/close/runtime.js +3 -3
- package/src/providers/cloudconvert/runtime.js +8 -9
- package/src/providers/cloudflare_dns/runtime.js +2 -2
- package/src/providers/cloudflare_email_routing/runtime.js +2 -2
- package/src/providers/cloudflare_r2/runtime.js +5 -5
- package/src/providers/cloudflare_worker/runtime.js +10 -10
- package/src/providers/cloudinary/runtime.js +4 -4
- package/src/providers/cloudlayer/runtime.js +5 -5
- package/src/providers/codacy/runtime.js +2 -2
- package/src/providers/codemagic/runtime.js +2 -2
- package/src/providers/confluence/executors.js +4 -4
- package/src/providers/confluence/runtime.d.ts +0 -1
- package/src/providers/confluence/runtime.js +6 -7
- package/src/providers/contactout/runtime.js +5 -5
- package/src/providers/contentful/runtime.js +2 -2
- package/src/providers/contentstack_content_delivery/runtime.js +1 -1
- package/src/providers/cronly/runtime.js +2 -2
- package/src/providers/crossref/runtime.js +3 -3
- package/src/providers/cutt_ly/runtime.js +3 -3
- package/src/providers/cyberimpact/runtime.js +3 -3
- package/src/providers/dachser/executors.js +2 -2
- package/src/providers/dailybot/runtime.js +1 -1
- package/src/providers/databox/runtime.js +2 -2
- package/src/providers/databricks/runtime.js +2 -2
- package/src/providers/datacite/runtime.js +1 -1
- package/src/providers/datadog/executors.js +3 -4
- package/src/providers/datascope/runtime.js +2 -2
- package/src/providers/daytona/executors.js +3 -3
- package/src/providers/deepgram/runtime.js +2 -2
- package/src/providers/deepl/runtime.js +4 -4
- package/src/providers/detrack/executors.js +5 -5
- package/src/providers/deutschlandgpt/runtime.js +2 -2
- package/src/providers/dialmycalls/runtime.js +4 -4
- package/src/providers/diffbot/executors.js +4 -4
- package/src/providers/digistore24/executors.js +3 -3
- package/src/providers/dingtalk_bot/executors.js +1 -1
- package/src/providers/discourse/executors.d.ts +0 -1
- package/src/providers/discourse/executors.js +6 -7
- package/src/providers/docugenerate/runtime.js +3 -3
- package/src/providers/doppler/runtime.shared.js +3 -3
- package/src/providers/doppler_marketing_automation/runtime.js +4 -4
- package/src/providers/dovetail/runtime.js +2 -2
- package/src/providers/dropcontact/runtime.js +3 -3
- package/src/providers/dub/executors.js +6 -6
- package/src/providers/dumplingai/runtime.js +2 -2
- package/src/providers/elevenlabs/executors.js +4 -4
- package/src/providers/elevenreader/runtime.js +1 -1
- package/src/providers/emailoctopus/runtime.js +4 -4
- package/src/providers/embase/runtime.js +3 -3
- package/src/providers/emelia/executors.js +2 -2
- package/src/providers/enigma/executors.js +3 -3
- package/src/providers/eodhd_apis/executors.js +2 -2
- package/src/providers/eventzilla/runtime.js +3 -4
- package/src/providers/evervault/runtime.js +1 -1
- package/src/providers/excalidraw_mcp/runtime.js +3 -4
- package/src/providers/excel/runtime.js +6 -6
- package/src/providers/expofp/runtime.js +2 -2
- package/src/providers/faktoora/runtime.js +5 -5
- package/src/providers/fast_note_sync/runtime.js +2 -2
- package/src/providers/feathery/executors.js +2 -3
- package/src/providers/feishu_app_bot/executors.js +2 -3
- package/src/providers/feishu_custom_bot/executors.js +2 -3
- package/src/providers/ffhub/executors.js +2 -3
- package/src/providers/fidel_api/executors.js +2 -3
- package/src/providers/files_com/executors.js +2 -3
- package/src/providers/fireberry/runtime.d.ts +0 -1
- package/src/providers/fireberry/runtime.js +3 -4
- package/src/providers/firehydrant/executors.js +2 -3
- package/src/providers/float/executors.js +2 -3
- package/src/providers/flomo/executors.js +5 -6
- package/src/providers/flowiseai/executors.js +2 -3
- package/src/providers/fluxguard/executors.js +2 -3
- package/src/providers/folk/executors.js +2 -3
- package/src/providers/football_data/executors.js +2 -3
- package/src/providers/forem/executors.js +2 -3
- package/src/providers/formbricks/executors.js +2 -3
- package/src/providers/formsite/executors.js +3 -4
- package/src/providers/formspree/executors.js +2 -2
- package/src/providers/freshdesk/executors.js +3 -4
- package/src/providers/freshservice/executors.js +3 -4
- package/src/providers/freshteam/runtime.js +3 -4
- package/src/providers/full_contact/executors.js +3 -3
- package/src/providers/fusion-api/runtime.js +2 -3
- package/src/providers/gagelist/executors.js +3 -3
- package/src/providers/gainsight_nxt/executors.js +2 -2
- package/src/providers/gamma/executors.js +4 -3
- package/src/providers/gangtise/runtime.js +3 -4
- package/src/providers/gatherup/runtime.js +1 -1
- package/src/providers/geckoboard/executors.js +2 -3
- package/src/providers/gemini/runtime.d.ts +0 -1
- package/src/providers/gemini/runtime.js +5 -6
- package/src/providers/genpage/runtime.js +2 -2
- package/src/providers/geokeo/executors.js +4 -4
- package/src/providers/getnote/runtime.js +2 -3
- package/src/providers/github/runtime-shared.js +2 -2
- package/src/providers/glyphic/runtime.js +3 -4
- package/src/providers/gmail/executors.js +125 -27
- package/src/providers/gong/runtime.js +6 -7
- package/src/providers/googlecalendar/runtime-shared.js +3 -4
- package/src/providers/googledrive/runtime-request.js +2 -3
- package/src/providers/googlesheets/runtime-shared.js +3 -4
- package/src/providers/gorgias/runtime.js +4 -4
- package/src/providers/gotify/executors.js +7 -8
- package/src/providers/greenhouse/executors.js +3 -3
- package/src/providers/gumloop/executors.js +2 -3
- package/src/providers/gumroad/executors.js +2 -3
- package/src/providers/habitica/executors.js +2 -3
- package/src/providers/hackerrank_work/executors.js +2 -3
- package/src/providers/harvest/executors.js +3 -4
- package/src/providers/haveibeenpwned/executors.js +2 -3
- package/src/providers/headout/executors.js +3 -4
- package/src/providers/healthchecks_io/executors.js +2 -3
- package/src/providers/helium10/runtime.js +4 -5
- package/src/providers/helpdesk/runtime.js +4 -4
- package/src/providers/home_assistant/runtime-ws.js +9 -10
- package/src/providers/hotjar/executors.js +4 -4
- package/src/providers/httpsms/runtime.js +3 -4
- package/src/providers/hub_planner/executors.js +3 -3
- package/src/providers/hubspot/runtime.js +3 -4
- package/src/providers/humaans/runtime.js +3 -3
- package/src/providers/hunter/runtime.js +3 -3
- package/src/providers/icypeas/executors.js +3 -4
- package/src/providers/ima/runtime.js +7 -7
- package/src/providers/infolobby/runtime.js +6 -6
- package/src/providers/instabot/runtime.js +6 -6
- package/src/providers/instatus/runtime.js +4 -4
- package/src/providers/intuiface/executors.js +3 -3
- package/src/providers/iplocate/runtime.js +4 -5
- package/src/providers/ipregistry/executors.js +2 -2
- package/src/providers/jiminny/runtime.js +4 -4
- package/src/providers/jin10/executors.js +4 -5
- package/src/providers/jira/executors.js +4 -4
- package/src/providers/kaleido/runtime.js +2 -2
- package/src/providers/kandji/runtime.js +2 -2
- package/src/providers/keygen/executors.js +4 -4
- package/src/providers/keyword/runtime.js +2 -2
- package/src/providers/kie_ai/executors.js +1 -1
- package/src/providers/kintone/runtime.js +1 -1
- package/src/providers/kit/runtime.js +2 -2
- package/src/providers/klangio/runtime.js +4 -4
- package/src/providers/klaviyo/executors.js +1 -1
- package/src/providers/klazify/executors.js +3 -3
- package/src/providers/klipfolio/runtime.js +3 -3
- package/src/providers/knack/executors.js +1 -1
- package/src/providers/kommo/runtime.js +2 -2
- package/src/providers/kontent_ai/executors.js +3 -4
- package/src/providers/l2s/executors.js +3 -4
- package/src/providers/latchshot/executors.js +2 -2
- package/src/providers/leadboxer/runtime.js +4 -4
- package/src/providers/leadiq/runtime.js +4 -4
- package/src/providers/linguapop/runtime.js +1 -1
- package/src/providers/lingvanex_translation_api/runtime.js +5 -6
- package/src/providers/lingxing_mcp/runtime.js +3 -4
- package/src/providers/linkup/runtime.js +5 -6
- package/src/providers/liveagent/executors.js +6 -6
- package/src/providers/loops/executors.js +2 -2
- package/src/providers/loyjoy/runtime.js +2 -2
- package/src/providers/loyverse/executors.js +4 -4
- package/src/providers/lusha/runtime.js +3 -3
- package/src/providers/mailbluster/runtime.js +3 -4
- package/src/providers/mailcoach/runtime.js +4 -4
- package/src/providers/mailgenius/executors.js +3 -4
- package/src/providers/mailjet/runtime.js +3 -3
- package/src/providers/mails_so/runtime.js +1 -1
- package/src/providers/mailsoftly/runtime.js +5 -5
- package/src/providers/mailtrap/runtime.js +4 -5
- package/src/providers/manus/runtime.js +3 -3
- package/src/providers/mautic/runtime.js +3 -3
- package/src/providers/megaventory/runtime.js +3 -3
- package/src/providers/memberstack/runtime.js +2 -2
- package/src/providers/mendeley/executors.js +2 -3
- package/src/providers/mindbody/runtime.js +3 -3
- package/src/providers/minerstat/executors.js +3 -3
- package/src/providers/mintlify/runtime.js +3 -3
- package/src/providers/missive/executors.js +3 -5
- package/src/providers/mixpanel/executors.js +3 -3
- package/src/providers/mobile_text_alerts/runtime.js +3 -3
- package/src/providers/mocean/executors.js +3 -3
- package/src/providers/moco/executors.js +5 -5
- package/src/providers/moesif/runtime.js +4 -4
- package/src/providers/monday/runtime-common.js +3 -3
- package/src/providers/monica_crm/runtime.js +4 -4
- package/src/providers/moorcheh/runtime.js +3 -3
- package/src/providers/more_trees/runtime.d.ts +0 -1
- package/src/providers/more_trees/runtime.js +7 -8
- package/src/providers/moxie/runtime.js +2 -2
- package/src/providers/msg91/runtime.js +4 -4
- package/src/providers/mx/runtime.js +1 -1
- package/src/providers/needle/runtime.js +3 -4
- package/src/providers/netlify/runtime.js +2 -3
- package/src/providers/niftyimages/executors.js +2 -2
- package/src/providers/northbeam/runtime.js +1 -1
- package/src/providers/nozbe_teams/executors.js +4 -4
- package/src/providers/npm/runtime.js +4 -4
- package/src/providers/nusii_proposals/runtime.js +2 -2
- package/src/providers/ocr_web_service/executors.js +4 -4
- package/src/providers/octopus_deploy/executors.js +3 -3
- package/src/providers/oksign/runtime.js +3 -4
- package/src/providers/one_drive/executors.js +6 -6
- package/src/providers/one_password_events/runtime.js +1 -1
- package/src/providers/onfleet/runtime.js +3 -3
- package/src/providers/onlyoffice_docspace/runtime.js +4 -4
- package/src/providers/oomnitza/runtime.js +3 -4
- package/src/providers/otter_ai/executors.js +2 -2
- package/src/providers/oura/runtime.js +1 -1
- package/src/providers/paddle/executors.js +3 -3
- package/src/providers/pagerduty/runtime.js +2 -2
- package/src/providers/paradym/runtime.js +4 -4
- package/src/providers/parallel/runtime.js +3 -3
- package/src/providers/partner_stack_partner/runtime.js +1 -1
- package/src/providers/payrexx/runtime.js +5 -6
- package/src/providers/permit_io/runtime.js +2 -2
- package/src/providers/pinboard/executors.js +5 -6
- package/src/providers/pinpoint/runtime.js +2 -2
- package/src/providers/placid/runtime.js +3 -3
- package/src/providers/plain/runtime.js +5 -5
- package/src/providers/planetscale/runtime.js +2 -2
- package/src/providers/planhat/executors.js +6 -6
- package/src/providers/plausible_analytics/runtime.js +3 -3
- package/src/providers/posthog/runtime.js +3 -3
- package/src/providers/predis_ai/executors.js +3 -3
- package/src/providers/printavo/runtime.js +2 -2
- package/src/providers/prospeo/runtime.js +2 -3
- package/src/providers/provider-runtime.d.ts +13 -1
- package/src/providers/provider-runtime.js +25 -10
- package/src/providers/push_by_techulus/executors.js +3 -4
- package/src/providers/pushover/runtime.js +4 -5
- package/src/providers/pushsafer/runtime.js +4 -5
- package/src/providers/pylon/runtime.js +2 -2
- package/src/providers/qase/runtime.js +3 -3
- package/src/providers/qdrant/runtime.js +1 -1
- package/src/providers/qichacha/runtime.js +2 -2
- package/src/providers/qingflow/runtime.js +2 -2
- package/src/providers/quickchart/runtime.js +2 -2
- package/src/providers/quintadb/runtime.js +2 -2
- package/src/providers/quo/runtime.js +2 -2
- package/src/providers/rawg/runtime.js +4 -4
- package/src/providers/razorpay/runtime.js +4 -5
- package/src/providers/readme/runtime.js +6 -6
- package/src/providers/referralhero/runtime.js +3 -3
- package/src/providers/registry.generated.js +1 -0
- package/src/providers/render/executors.js +3 -3
- package/src/providers/respond_io/executors.js +3 -3
- package/src/providers/reversecontact/runtime.js +3 -3
- package/src/providers/ritekit/executors.js +2 -2
- package/src/providers/riveter/executors.js +2 -3
- package/src/providers/rocket_chat/executors.js +3 -4
- package/src/providers/rocket_reach/executors.js +3 -4
- package/src/providers/saucelabs/runtime.js +4 -4
- package/src/providers/scopus/runtime.js +3 -3
- package/src/providers/scrape_do/executors.js +2 -2
- package/src/providers/scraperapi/runtime.js +4 -4
- package/src/providers/scrapfly/executors.js +2 -2
- package/src/providers/scrapingant/executors.js +6 -7
- package/src/providers/scrapingbee/executors.js +3 -3
- package/src/providers/scrapingdog/executors.js +1 -1
- package/src/providers/screenshot_fyi/executors.js +3 -4
- package/src/providers/screenshotbase/runtime.js +3 -3
- package/src/providers/search_api/runtime.js +2 -2
- package/src/providers/securitytrails/executors.js +2 -2
- package/src/providers/semantic_scholar/executors.js +2 -2
- package/src/providers/sendbird/executors.js +2 -2
- package/src/providers/sendfox/executors.js +3 -3
- package/src/providers/sendgrid/executors.js +5 -5
- package/src/providers/sendmator/runtime.js +3 -4
- package/src/providers/seqera/runtime.js +3 -4
- package/src/providers/serveravatar/executors.js +3 -3
- package/src/providers/sheetdb/runtime.js +2 -2
- package/src/providers/short_menu/runtime.js +3 -3
- package/src/providers/shortcut/runtime.js +3 -3
- package/src/providers/shortpixel/runtime.js +2 -2
- package/src/providers/shotstack/runtime.js +4 -4
- package/src/providers/signpath/runtime.js +2 -2
- package/src/providers/signwell/runtime.js +5 -6
- package/src/providers/similarweb_digitalrank_api/runtime.js +3 -3
- package/src/providers/simla/runtime.js +5 -5
- package/src/providers/simplybook_me/executors.js +6 -6
- package/src/providers/sitespeakai/runtime.js +3 -3
- package/src/providers/slickdeals/runtime.js +2 -3
- package/src/providers/smartsuite/runtime.js +3 -3
- package/src/providers/sonarcloud/runtime.js +5 -5
- package/src/providers/sorftime/runtime.js +8 -8
- package/src/providers/spider/runtime.js +2 -2
- package/src/providers/splunk_http_event_collector/runtime.js +7 -8
- package/src/providers/sportsdata/runtime.js +4 -4
- package/src/providers/spyfu/runtime.js +4 -5
- package/src/providers/square/runtime.js +4 -4
- package/src/providers/stannp/runtime.js +2 -2
- package/src/providers/stripe/executors.js +2 -2
- package/src/providers/supermemory/runtime.js +3 -3
- package/src/providers/survey_monkey/runtime.js +3 -3
- package/src/providers/taiga/runtime.js +4 -4
- package/src/providers/talenox/executors.js +4 -4
- package/src/providers/tally/runtime.js +3 -3
- package/src/providers/tavily/runtime.js +3 -4
- package/src/providers/teamcamp/executors.js +2 -2
- package/src/providers/teamtailor/executors.js +2 -2
- package/src/providers/telegram/executors.js +6 -7
- package/src/providers/teltel/executors.js +2 -2
- package/src/providers/templated/executors.js +3 -3
- package/src/providers/tencent_docs/runtime.js +4 -4
- package/src/providers/tencent_maps/runtime.js +3 -3
- package/src/providers/textcortex/runtime.js +3 -3
- package/src/providers/the_cat_api/runtime.js +3 -3
- package/src/providers/the_colony/runtime.js +3 -3
- package/src/providers/the_odds_api/runtime.js +3 -4
- package/src/providers/the_official_board/runtime.js +4 -4
- package/src/providers/thehive/runtime.js +1 -1
- package/src/providers/tikhub/endpoint-catalog.js +2 -3
- package/src/providers/tiktok_business/runtime.js +2 -2
- package/src/providers/timecamp/runtime.js +2 -2
- package/src/providers/timelink/runtime.js +2 -2
- package/src/providers/totp/runtime.js +4 -5
- package/src/providers/trawlingweb/runtime.js +2 -2
- package/src/providers/trilium/runtime.js +2 -2
- package/src/providers/triple_whale/runtime.js +3 -3
- package/src/providers/truvera/runtime.js +2 -2
- package/src/providers/tuskr/runtime.js +2 -2
- package/src/providers/typebot/runtime.js +2 -2
- package/src/providers/typeform/runtime.js +2 -2
- package/src/providers/uptimerobot/executors.js +3 -4
- package/src/providers/v2ex/runtime.js +8 -9
- package/src/providers/valyu/runtime.js +3 -3
- package/src/providers/vapi/runtime.js +4 -4
- package/src/providers/vectorshift/runtime.js +3 -3
- package/src/providers/venafitlsprotectcloud/runtime.js +2 -3
- package/src/providers/venafitlsprotectdatacenter/runtime.js +2 -3
- package/src/providers/vida/runtime.js +4 -4
- package/src/providers/vonage/runtime.js +3 -3
- package/src/providers/walmart_marketplace/runtime.js +5 -5
- package/src/providers/weatherapi/executors.js +3 -4
- package/src/providers/web_of_science/runtime.js +4 -4
- package/src/providers/web_of_science_expanded/runtime.js +9 -9
- package/src/providers/webex/runtime.js +3 -3
- package/src/providers/webinarjam/runtime.js +4 -4
- package/src/providers/webscraping_ai/runtime.js +3 -3
- package/src/providers/webvizio/runtime.js +3 -4
- package/src/providers/wecom_bot/smart-runtime.js +4 -5
- package/src/providers/wecom_mcp/runtime.js +3 -4
- package/src/providers/wejam_ai/runtime.js +3 -3
- package/src/providers/wolfram_alpha_api/runtime.js +3 -3
- package/src/providers/woocommerce/runtime.js +1 -1
- package/src/providers/woodpecker_co/executors.js +3 -4
- package/src/providers/woot/runtime.js +6 -6
- package/src/providers/workable/runtime.js +3 -3
- package/src/providers/workday/runtime.js +4 -4
- package/src/providers/workiom/runtime.js +2 -2
- package/src/providers/workiz/runtime.js +2 -2
- package/src/providers/workpath/executors.js +3 -4
- package/src/providers/worksnaps/executors.js +2 -2
- package/src/providers/y_gy/runtime.js +2 -2
- package/src/providers/zenscrape/runtime.js +3 -3
- package/src/providers/zep/runtime.js +4 -4
- package/src/providers/zeplin/runtime.js +2 -2
- package/src/providers/zhihu/executors.js +6 -6
- package/src/providers/zylvie/runtime.js +4 -4
- package/src/saas/saas-cleanup-service.d.ts +2 -0
- package/src/saas/saas-cleanup-service.js +2 -1
- package/src/saas/saas-execution-service.d.ts +1 -1
- package/src/server/actions/action-runner.js +1 -1
- package/src/server/api/auth.js +3 -0
- package/src/server/api/connection-routes.js +1 -1
- package/src/server/api/console-catalog-routes.js +1 -1
- package/src/server/api/console-oauth-routes.d.ts +3 -1
- package/src/server/api/console-oauth-routes.js +22 -9
- package/src/server/api/oauth-completion-page.d.ts +57 -0
- package/src/server/api/oauth-completion-page.js +135 -10
- package/src/server/api/openapi.d.ts +5 -0
- package/src/server/api/openapi.js +62 -2
- package/src/server/api/runtime-api.d.ts +2 -1
- package/src/server/api/runtime-app-routes.js +1 -1
- package/src/server/api/runtime-execution-routes.js +2 -1
- package/src/server/connect-app.d.ts +4 -0
- package/src/server/connect-app.js +14 -1
- package/src/server/connect-server.d.ts +6 -0
- package/src/server/connect-server.js +114 -4
- package/src/server/connector-runtime.d.ts +6 -8
- package/src/server/connector-runtime.js +8 -28
- package/src/server/proxy/proxy-runner.js +1 -1
- package/src/server/slack-event-verification.d.ts +37 -0
- package/src/server/slack-event-verification.js +91 -0
- package/src/server/storage/connection-request-store.d.ts +1 -1
- package/src/server/storage/connection-store.d.ts +1 -1
- package/src/server/storage/postgres/runtime-store.d.ts +1 -1
- package/src/server/storage/runtime-database.d.ts +1 -1
- package/src/server/storage/saas-project-store.d.ts +1 -1
- package/src/triggers/maintenance.d.ts +2 -0
- package/src/triggers/maintenance.js +2 -1
- package/src/triggers/sources/slack-signature.d.ts +10 -0
- package/src/triggers/sources/slack-signature.js +13 -0
- package/src/triggers/sources/slack.js +9 -11
- 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-
|
|
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
|
|
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
|
|
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-
|
|
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 {
|
|
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
|
|
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(
|
|
186
|
-
: AbortSignal.timeout(
|
|
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(
|
|
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
|
|
173
|
+
return providerInputError(message);
|
|
174
174
|
}
|
|
175
|
-
return
|
|
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(
|
|
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
|
|
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
|
|
241
|
+
return providerInputError(message);
|
|
243
242
|
}
|
|
244
243
|
if (status >= 400 && status < 500) {
|
|
245
|
-
return
|
|
244
|
+
return providerInputError(message);
|
|
246
245
|
}
|
|
247
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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() +
|
|
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
|
|
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
|
|
317
|
+
return providerInputError(message);
|
|
319
318
|
if (includesAny(normalized, ["route_error", "unknown server_type", "未知 server_type"]))
|
|
320
|
-
return
|
|
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
|
|
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
|
|
363
|
+
return providerInputError(message);
|
|
364
364
|
}
|
|
365
365
|
if (response.status === 422) {
|
|
366
|
-
return
|
|
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
|
|
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
|
|
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
|
|
357
|
+
return providerInputError(message);
|
|
358
358
|
}
|
|
359
359
|
if (response.status === 429) {
|
|
360
360
|
return new ProviderRequestError(429, message);
|