@oomol-lab/open-connector 1.6.5 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/assets/open-connector/catalog/apps/airtable.json +134 -0
- package/assets/open-connector/catalog/apps/aisa.json +6985 -319
- package/assets/open-connector/catalog/apps/baizhi_mcp.json +135 -0
- package/assets/open-connector/catalog/apps/cal.json +24 -6
- package/assets/open-connector/catalog/apps/discordbot.json +2888 -248
- package/assets/open-connector/catalog/apps/drawio_mcp.json +192 -0
- package/assets/open-connector/catalog/apps/enormail.json +411 -0
- package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
- package/assets/open-connector/catalog/apps/firecrawl.json +176 -32
- package/assets/open-connector/catalog/apps/framejet.json +273 -0
- package/assets/open-connector/catalog/apps/futunn.json +2967 -0
- package/assets/open-connector/catalog/apps/github.json +275 -0
- package/assets/open-connector/catalog/apps/gitlab.json +125 -0
- package/assets/open-connector/catalog/apps/gmail.json +376 -0
- package/assets/open-connector/catalog/apps/google_analytics.json +4 -1
- package/assets/open-connector/catalog/apps/google_bigquery.json +4 -1
- package/assets/open-connector/catalog/apps/google_search_console.json +4 -1
- package/assets/open-connector/catalog/apps/googlecalendar.json +210 -1
- package/assets/open-connector/catalog/apps/googlechat.json +694 -7
- package/assets/open-connector/catalog/apps/googledocs.json +4 -1
- package/assets/open-connector/catalog/apps/googledrive.json +479 -0
- package/assets/open-connector/catalog/apps/googlesheets.json +148 -1
- package/assets/open-connector/catalog/apps/granola.json +23 -0
- package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
- package/assets/open-connector/catalog/apps/indexed.json +1115 -0
- package/assets/open-connector/catalog/apps/keepa.json +3534 -987
- package/assets/open-connector/catalog/apps/linear.json +133 -0
- package/assets/open-connector/catalog/apps/linear_mcp.json +510 -0
- package/assets/open-connector/catalog/apps/moneyforward_mcp.json +1432 -0
- package/assets/open-connector/catalog/apps/notion.json +588 -1
- package/assets/open-connector/catalog/apps/notion_mcp.json +490 -0
- package/assets/open-connector/catalog/apps/odoo.json +619 -0
- package/assets/open-connector/catalog/apps/one_drive.json +185 -0
- package/assets/open-connector/catalog/apps/outlook.json +212 -8
- package/assets/open-connector/catalog/apps/outlook_calendar.json +23 -2
- package/assets/open-connector/catalog/apps/postiz.json +334 -0
- package/assets/open-connector/catalog/apps/proworkflow.json +529 -0
- package/assets/open-connector/catalog/apps/sellersprite_mcp.json +2 -1
- package/assets/open-connector/catalog/apps/shopify.json +282 -0
- package/assets/open-connector/catalog/apps/slack.json +405 -0
- package/assets/open-connector/catalog/apps/slackbot.json +214 -0
- package/assets/open-connector/catalog/apps/spotify.json +46 -43
- package/assets/open-connector/catalog/apps/stripe.json +96 -0
- package/assets/open-connector/catalog/apps/telegram.json +138 -0
- package/assets/open-connector/catalog/apps/tencent_docs.json +3 -0
- package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
- package/assets/open-connector/catalog/apps/wisburg.json +1528 -0
- package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
- package/assets/open-connector/catalog/apps/youtube.json +4 -1
- package/assets/open-connector/catalog/apps/zendesk.json +152 -0
- package/assets/open-connector/catalog/apps/zerotier.json +3319 -0
- package/assets/open-connector/catalog/apps-index.json +1 -1
- package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
- package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
- package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
- package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
- package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
- package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
- package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
- package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
- package/package.json +2 -2
- package/src/connection-service.d.ts +40 -7
- package/src/connection-service.js +60 -18
- package/src/core/action-policy.d.ts +8 -1
- package/src/core/action-policy.js +51 -0
- package/src/core/cast.d.ts +13 -0
- package/src/core/cast.js +18 -1
- package/src/core/guarded-fetch.d.ts +11 -3
- package/src/core/guarded-fetch.js +19 -7
- package/src/core/provider-scenarios.js +67 -13
- package/src/core/remote-http.d.ts +33 -0
- package/src/core/remote-http.js +104 -0
- package/src/core/request.d.ts +1 -0
- package/src/core/request.js +11 -1
- package/src/core/types.d.ts +5 -1
- package/src/marketplace/marketplace-service.d.ts +0 -1
- package/src/marketplace/marketplace-service.js +80 -92
- package/src/mcp.js +26 -9
- package/src/oauth/oauth-client-config-service.d.ts +16 -1
- package/src/oauth/oauth-client-config-service.js +59 -3
- package/src/oauth/oauth-flow-service.d.ts +14 -1
- package/src/oauth/oauth-flow-service.js +14 -6
- package/src/providers/17track/runtime.js +1 -1
- package/src/providers/action-contracts.generated.d.ts +20 -6
- package/src/providers/aifinmarket/runtime.js +1 -1
- package/src/providers/airtable/executors.d.ts +3 -0
- package/src/providers/airtable/executors.js +2 -0
- package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
- package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
- package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
- package/src/providers/airtable/trigger-on-record-changed.js +235 -0
- package/src/providers/aisa/executors.js +912 -50
- package/src/providers/aliyun_ack/runtime.js +1 -1
- package/src/providers/aliyun_sls/runtime.js +1 -1
- package/src/providers/app_store_server/runtime-helpers.js +1 -1
- package/src/providers/baizhi_mcp/actions.d.ts +2 -0
- package/src/providers/baizhi_mcp/actions.js +40 -0
- package/src/providers/baizhi_mcp/executors.d.ts +3 -0
- package/src/providers/baizhi_mcp/executors.js +102 -0
- package/src/providers/bazhuayu/runtime.js +2 -2
- package/src/providers/bilibili/runtime.js +2 -4
- package/src/providers/bilibili/upload.js +9 -7
- package/src/providers/cal/actions.js +5 -1
- package/src/providers/cloudflare_browser_rendering/executors.js +1 -1
- package/src/providers/cloudflare_dns/executors.js +1 -1
- package/src/providers/{cloudflare-current-user.js → cloudflare_dns/runtime-user.js} +2 -2
- package/src/providers/cloudflare_dns/runtime.d.ts +1 -1
- package/src/providers/cloudflare_dns/runtime.js +1 -1
- package/src/providers/cloudflare_r2/executors.js +1 -1
- package/src/providers/cloudflare_r2/runtime.d.ts +1 -1
- package/src/providers/cloudflare_r2/runtime.js +1 -1
- package/src/providers/cloudflare_worker/executors.js +1 -1
- package/src/providers/cloudflare_worker/runtime.d.ts +1 -1
- package/src/providers/cloudflare_worker/runtime.js +1 -1
- package/src/providers/dingtalk_mcp/runtime.js +1 -1
- package/src/providers/discordbot/executors.d.ts +0 -9
- package/src/providers/discordbot/executors.js +9 -101
- package/src/providers/discordbot/runtime-guilds.d.ts +3 -0
- package/src/providers/discordbot/runtime-guilds.js +464 -0
- package/src/providers/discordbot/runtime.d.ts +42 -0
- package/src/providers/discordbot/runtime.js +124 -0
- package/src/providers/drawio_mcp/executors.d.ts +3 -0
- package/src/providers/drawio_mcp/executors.js +19 -0
- package/src/providers/drawio_mcp/runtime.d.ts +8 -0
- package/src/providers/drawio_mcp/runtime.js +175 -0
- package/src/providers/enormail/executors.d.ts +4 -0
- package/src/providers/enormail/executors.js +97 -0
- package/src/providers/fastmoss_mcp/executors.js +2 -2
- package/src/providers/feishu_app_bot/executors.d.ts +3 -0
- package/src/providers/feishu_app_bot/executors.js +2 -0
- package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
- package/src/providers/feishu_app_bot/trigger-config.js +10 -0
- package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
- package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
- package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
- package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
- package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
- package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
- package/src/providers/finchina/executors.js +1 -1
- package/src/providers/framejet/executors.d.ts +4 -0
- package/src/providers/framejet/executors.js +19 -0
- package/src/providers/framejet/runtime.d.ts +16 -0
- package/src/providers/framejet/runtime.js +148 -0
- package/src/providers/futunn/actions.d.ts +2 -0
- package/src/providers/futunn/actions.js +152 -0
- package/src/providers/futunn/actions.research.d.ts +2 -0
- package/src/providers/futunn/actions.research.js +423 -0
- package/src/providers/futunn/actions.trading.d.ts +2 -0
- package/src/providers/futunn/actions.trading.js +204 -0
- package/src/providers/futunn/executors.d.ts +3 -0
- package/src/providers/futunn/executors.js +24 -0
- package/src/providers/futunn/runtime-research.d.ts +3 -0
- package/src/providers/futunn/runtime-research.js +133 -0
- package/src/providers/futunn/runtime-trading.d.ts +3 -0
- package/src/providers/futunn/runtime-trading.js +39 -0
- package/src/providers/futunn/runtime.d.ts +2 -0
- package/src/providers/futunn/runtime.js +50 -0
- package/src/providers/futunn/transport.d.ts +11 -0
- package/src/providers/futunn/transport.js +76 -0
- package/src/providers/gildata/executors.js +1 -1
- package/src/providers/github/executors.d.ts +3 -0
- package/src/providers/github/executors.js +6 -0
- package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
- package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
- package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
- package/src/providers/github/trigger-on-repo-event.js +168 -0
- package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
- package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
- package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
- package/src/providers/github/trigger-watch-pull-request.js +106 -0
- package/src/providers/gitlab/executors.d.ts +3 -0
- package/src/providers/gitlab/executors.js +2 -0
- package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
- package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
- package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
- package/src/providers/gitlab/trigger-on-project-event.js +186 -0
- package/src/providers/gmail/executors.d.ts +3 -0
- package/src/providers/gmail/executors.js +5 -3
- package/src/providers/gmail/message.d.ts +6 -8
- package/src/providers/gmail/message.js +4 -0
- package/src/providers/gmail/scopes.d.ts +32 -0
- package/src/providers/gmail/scopes.js +37 -0
- package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
- package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
- package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
- package/src/providers/gmail/trigger-on-message-received.js +232 -0
- package/src/providers/google_analytics/executors.js +2 -2
- package/src/providers/google_analytics/scopes.js +6 -1
- package/src/providers/google_bigquery/executors.js +2 -2
- package/src/providers/google_bigquery/scopes.js +2 -0
- package/src/providers/google_search_console/executors.js +2 -2
- package/src/providers/google_search_console/scopes.js +2 -0
- package/src/providers/googleads/executors.js +1 -1
- package/src/providers/googleads/scopes.d.ts +1 -3
- package/src/providers/googleads/scopes.js +2 -4
- package/src/providers/googlecalendar/executors.d.ts +3 -0
- package/src/providers/googlecalendar/executors.js +3 -1
- package/src/providers/googlecalendar/runtime-shared.js +2 -2
- package/src/providers/googlecalendar/scopes.js +2 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
- package/src/providers/googlechat/executors.d.ts +1 -3
- package/src/providers/googlechat/executors.js +219 -28
- package/src/providers/googlechat/members.d.ts +55 -0
- package/src/providers/googlechat/members.js +293 -0
- package/src/providers/googlechat/runtime.d.ts +16 -0
- package/src/providers/googlechat/runtime.js +25 -0
- package/src/providers/googlechat/scopes.d.ts +22 -3
- package/src/providers/googlechat/scopes.js +30 -7
- package/src/providers/googledocs/executors.js +1 -1
- package/src/providers/googledrive/executors.d.ts +3 -0
- package/src/providers/googledrive/executors.js +9 -2
- package/src/providers/{google-auth.d.ts → googledrive/runtime-auth.d.ts} +2 -2
- package/src/providers/{google-auth.js → googledrive/runtime-auth.js} +3 -3
- package/src/providers/googledrive/runtime-collaboration.js +1 -1
- package/src/providers/{google-runtime.d.ts → googledrive/runtime-request.d.ts} +1 -1
- package/src/providers/{google-runtime.js → googledrive/runtime-request.js} +2 -2
- package/src/providers/googledrive/trigger-changes.d.ts +12 -0
- package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
- package/src/providers/googledrive/trigger-changes.definition.js +101 -0
- package/src/providers/googledrive/trigger-changes.js +452 -0
- package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
- package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
- package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
- package/src/providers/googledrive/trigger-on-file-change.js +258 -0
- package/src/providers/googleforms/executors.js +2 -2
- package/src/providers/googleforms/scopes.d.ts +0 -3
- package/src/providers/googleforms/scopes.js +2 -6
- package/src/providers/googlemeet/executors.js +2 -2
- package/src/providers/googlemeet/scopes.d.ts +0 -3
- package/src/providers/googlemeet/scopes.js +2 -6
- package/src/providers/googlesheets/executors.d.ts +3 -0
- package/src/providers/googlesheets/executors.js +3 -1
- package/src/providers/googlesheets/scopes.js +2 -0
- package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
- package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
- package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
- package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
- package/src/providers/googleslides/executors.js +2 -2
- package/src/providers/googleslides/scopes.d.ts +0 -3
- package/src/providers/googleslides/scopes.js +2 -6
- package/src/providers/googletasks/executors.js +2 -2
- package/src/providers/googletasks/scopes.d.ts +0 -3
- package/src/providers/googletasks/scopes.js +2 -6
- package/src/providers/granola/actions.js +2 -0
- package/src/providers/granola/runtime-mcp.js +2 -0
- package/src/providers/granola/runtime.js +2 -2
- package/src/providers/hithink_finance/runtime.js +1 -1
- package/src/providers/indexed/executors.d.ts +4 -0
- package/src/providers/indexed/executors.js +16 -0
- package/src/providers/indexed/runtime.d.ts +26 -0
- package/src/providers/indexed/runtime.js +129 -0
- package/src/providers/indiegogo/executors.js +1 -1
- package/src/providers/investoday_mcp/executors.js +2 -2
- package/src/providers/iyunbiao/runtime.js +2 -2
- package/src/providers/keepa/actions.d.ts +1 -1
- package/src/providers/keepa/actions.js +371 -149
- package/src/providers/keepa/deal-attributes.d.ts +1 -0
- package/src/providers/keepa/deal-attributes.js +26 -0
- package/src/providers/keepa/runtime.js +212 -18
- package/src/providers/kingdee/executors.js +1 -1
- package/src/providers/kingdee/runtime.js +2 -2
- package/src/providers/kuaidi100/runtime.js +1 -1
- package/src/providers/linear/executors.d.ts +3 -0
- package/src/providers/linear/executors.js +14 -9
- package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
- package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
- package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
- package/src/providers/linear/trigger-on-issue-changed.js +215 -0
- package/src/providers/linear_mcp/actions.d.ts +47 -0
- package/src/providers/linear_mcp/actions.js +102 -0
- package/src/providers/linear_mcp/endpoints.d.ts +3 -0
- package/src/providers/linear_mcp/endpoints.js +3 -0
- package/src/providers/linear_mcp/executors.d.ts +3 -0
- package/src/providers/linear_mcp/executors.js +9 -0
- package/src/providers/linear_mcp/runtime-mcp.d.ts +15 -0
- package/src/providers/linear_mcp/runtime-mcp.js +238 -0
- package/src/providers/lingxing_mcp/runtime.js +1 -1
- package/src/providers/mcdonalds_cn_mcp/runtime.js +1 -1
- package/src/providers/metabase/mcp-runtime.js +1 -1
- package/src/providers/moneyforward_mcp/executors.d.ts +3 -0
- package/src/providers/moneyforward_mcp/executors.js +11 -0
- package/src/providers/moneyforward_mcp/manifest.d.ts +31 -0
- package/src/providers/moneyforward_mcp/manifest.js +204 -0
- package/src/providers/moneyforward_mcp/runtime.d.ts +18 -0
- package/src/providers/moneyforward_mcp/runtime.js +296 -0
- package/src/providers/notion/executors.d.ts +3 -0
- package/src/providers/notion/executors.js +41 -3
- package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
- package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
- package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
- package/src/providers/notion/trigger-on-database-page-event.js +293 -0
- package/src/providers/notion_mcp/endpoints.d.ts +3 -0
- package/src/providers/notion_mcp/endpoints.js +3 -0
- package/src/providers/notion_mcp/executors.d.ts +3 -0
- package/src/providers/notion_mcp/executors.js +176 -0
- package/src/providers/notion_mcp/mcp-response.d.ts +86 -0
- package/src/providers/notion_mcp/mcp-response.js +314 -0
- package/src/providers/odoo/executors.d.ts +3 -0
- package/src/providers/odoo/executors.js +32 -0
- package/src/providers/odoo/runtime.d.ts +16 -0
- package/src/providers/odoo/runtime.js +140 -0
- package/src/providers/one_drive/executors.d.ts +3 -0
- package/src/providers/one_drive/executors.js +2 -0
- package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
- package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
- package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
- package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
- package/src/providers/outlook/executors.d.ts +3 -0
- package/src/providers/outlook/executors.js +29 -6
- package/src/providers/outlook/microsoft-graph.js +17 -6
- package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
- package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
- package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
- package/src/providers/outlook/trigger-on-message-received.js +226 -0
- package/src/providers/outlook_calendar/executors.js +30 -7
- package/src/providers/patsnap_mcp/executors.js +2 -2
- package/src/providers/postiz/executors.d.ts +4 -0
- package/src/providers/postiz/executors.js +83 -0
- package/src/providers/provider-loader.d.ts +5 -0
- package/src/providers/provider-loader.js +4 -0
- package/src/providers/provider-runtime.d.ts +15 -0
- package/src/providers/provider-runtime.js +57 -4
- package/src/providers/proworkflow/executors.d.ts +4 -0
- package/src/providers/proworkflow/executors.js +135 -0
- package/src/providers/registry.generated.js +14 -0
- package/src/providers/scrape_creators/catalog.js +1 -1
- package/src/providers/scrape_creators/runtime.js +1 -1
- package/src/providers/sellersprite_mcp/executors.js +2 -2
- package/src/providers/sellersprite_mcp/official-actions.js +3 -2
- package/src/providers/sentry/runtime.js +6 -7
- package/src/providers/shopify/executors.d.ts +3 -0
- package/src/providers/shopify/executors.js +2 -0
- package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
- package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
- package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
- package/src/providers/shopify/trigger-on-shop-event.js +165 -0
- package/src/providers/slack/actions.js +52 -3
- package/src/providers/slack/executors.d.ts +3 -0
- package/src/providers/slack/executors.js +2 -0
- package/src/providers/slack/runtime.js +58 -21
- package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
- package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
- package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
- package/src/providers/slack/trigger-on-message-posted.js +176 -0
- package/src/providers/slickdeals/runtime.js +1 -1
- package/src/providers/sorftime_mcp/executors.js +2 -2
- package/src/providers/spotify/runtime.js +15 -4
- package/src/providers/stripe/executors.d.ts +3 -0
- package/src/providers/stripe/executors.js +2 -0
- package/src/providers/stripe/trigger-on-event.d.ts +2 -0
- package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
- package/src/providers/stripe/trigger-on-event.definition.js +43 -0
- package/src/providers/stripe/trigger-on-event.js +212 -0
- package/src/providers/telegram/executors.d.ts +3 -0
- package/src/providers/telegram/executors.js +2 -0
- package/src/providers/telegram/trigger-on-update.d.ts +2 -0
- package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
- package/src/providers/telegram/trigger-on-update.definition.js +78 -0
- package/src/providers/telegram/trigger-on-update.js +141 -0
- package/src/providers/tikhub/bounded-response.d.ts +1 -1
- package/src/providers/tikhub/bounded-response.js +8 -34
- package/src/providers/tikhub/endpoint-catalog.js +1 -1
- package/src/providers/tikhub/runtime.js +2 -2
- package/src/providers/tongdaxin/executors.js +79 -15
- package/src/providers/uspto/executors.js +1 -1
- package/src/providers/waffo/executors.js +1 -1
- package/src/providers/waffo/runtime.js +1 -1
- package/src/providers/wecom_mcp/runtime.js +1 -1
- package/src/providers/weixin_store/access-token.d.ts +2 -1
- package/src/providers/weixin_store/access-token.js +15 -4
- package/src/providers/weixin_store/executors.js +97 -12
- package/src/providers/wisburg/executors.d.ts +4 -0
- package/src/providers/wisburg/executors.js +13 -0
- package/src/providers/wisburg/runtime.d.ts +12 -0
- package/src/providers/wisburg/runtime.js +133 -0
- package/src/providers/woocommerce/executors.d.ts +3 -0
- package/src/providers/woocommerce/executors.js +2 -0
- package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
- package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
- package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
- package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
- package/src/providers/xydc_mcp/executors.js +2 -2
- package/src/providers/youtube/executors.js +1 -1
- package/src/providers/youtube/runtime.js +1 -1
- package/src/providers/zendesk/executors.d.ts +3 -0
- package/src/providers/zendesk/executors.js +2 -0
- package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
- package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
- package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
- package/src/providers/zendesk/trigger-on-event.js +188 -0
- package/src/providers/zerotier/executors.d.ts +9 -0
- package/src/providers/zerotier/executors.js +629 -0
- package/src/providers/zerotier/runtime.d.ts +54 -0
- package/src/providers/zerotier/runtime.js +207 -0
- package/src/saas/saas-cleanup-service.d.ts +26 -0
- package/src/saas/saas-cleanup-service.js +124 -0
- package/src/saas/saas-client.d.ts +86 -0
- package/src/saas/saas-client.js +369 -0
- package/src/saas/saas-execution-service.d.ts +15 -0
- package/src/saas/saas-execution-service.js +21 -0
- package/src/saas/saas-oauth-service.d.ts +25 -0
- package/src/saas/saas-oauth-service.js +197 -0
- package/src/saas/saas-project-service.d.ts +61 -0
- package/src/saas/saas-project-service.js +211 -0
- package/src/server/actions/action-idempotency.d.ts +1 -0
- package/src/server/actions/action-idempotency.js +1 -0
- package/src/server/actions/action-runner.d.ts +7 -0
- package/src/server/actions/action-runner.js +43 -7
- package/src/server/actions/run-log-summary.js +9 -0
- package/src/server/api/auth.d.ts +1 -0
- package/src/server/api/auth.js +13 -2
- package/src/server/api/cache-policy.js +4 -1
- package/src/server/api/connection-input.d.ts +7 -1
- package/src/server/api/connection-input.js +7 -1
- package/src/server/api/connection-routes.d.ts +3 -1
- package/src/server/api/connection-routes.js +21 -3
- package/src/server/api/http-utils.d.ts +4 -3
- package/src/server/api/oauth-completion-page.d.ts +124 -0
- package/src/server/api/oauth-completion-page.js +113 -18
- package/src/server/api/openapi.js +123 -15
- package/src/server/api/policy-input.js +6 -0
- package/src/server/api/runtime-api.d.ts +18 -3
- package/src/server/api/runtime-api.js +36 -5
- package/src/server/api/saas-completion-page.d.ts +2 -0
- package/src/server/api/saas-completion-page.js +103 -0
- package/src/server/connect-app.d.ts +5 -0
- package/src/server/connect-app.js +50 -0
- package/src/server/connect-server.d.ts +12 -0
- package/src/server/connect-server.js +157 -15
- package/src/server/connector-runtime.d.ts +3 -1
- package/src/server/connector-runtime.js +5 -2
- package/src/server/files/transit-files.js +16 -7
- package/src/server/proxy/proxy-runner.d.ts +5 -1
- package/src/server/proxy/proxy-runner.js +72 -26
- package/src/server/storage/connection-request-store.d.ts +41 -1
- package/src/server/storage/connection-request-store.js +245 -20
- package/src/server/storage/connection-store.d.ts +16 -0
- package/src/server/storage/connection-store.js +119 -0
- package/src/server/storage/node-runtime-database.js +3 -3
- package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
- package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
- package/src/server/storage/postgres/runtime-store.d.ts +43 -0
- package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
- package/src/server/storage/runtime-database.d.ts +4 -0
- package/src/server/storage/runtime-sql.d.ts +1 -1
- package/src/server/storage/runtime-sql.js +2 -1
- package/src/server/storage/runtime-store.d.ts +1 -0
- package/src/server/storage/runtime-token-service.d.ts +2 -0
- package/src/server/storage/runtime-token-service.js +3 -0
- package/src/server/storage/saas-project-store.d.ts +77 -0
- package/src/server/storage/saas-project-store.js +273 -0
- package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
- package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
- package/src/server/storage/trigger-store.d.ts +16 -0
- package/src/server/storage/trigger-store.js +96 -0
- package/src/triggers/common/config.d.ts +2 -0
- package/src/triggers/common/config.js +17 -0
- package/src/triggers/common/configOptions.d.ts +13 -0
- package/src/triggers/common/configOptions.js +1 -0
- package/src/triggers/common/encoding.d.ts +3 -0
- package/src/triggers/common/encoding.js +19 -0
- package/src/triggers/common/integration.d.ts +115 -0
- package/src/triggers/common/integration.js +31 -0
- package/src/triggers/common/json.d.ts +6 -0
- package/src/triggers/common/json.js +91 -0
- package/src/triggers/common/poll.d.ts +41 -0
- package/src/triggers/common/poll.js +15 -0
- package/src/triggers/common/proxy.d.ts +14 -0
- package/src/triggers/common/proxy.js +1 -0
- package/src/triggers/common/types.d.ts +42 -0
- package/src/triggers/common/types.js +1 -0
- package/src/triggers/maintenance.d.ts +40 -0
- package/src/triggers/maintenance.js +120 -0
- package/src/triggers/metadata.d.ts +8 -0
- package/src/triggers/metadata.js +1 -0
- package/src/triggers/request.d.ts +33 -0
- package/src/triggers/request.js +52 -0
- package/src/triggers/resources.d.ts +12 -0
- package/src/triggers/resources.js +121 -0
- package/src/triggers/signature.d.ts +4 -0
- package/src/triggers/signature.js +48 -0
- package/src/triggers/store.d.ts +29 -0
- package/src/triggers/store.js +1 -0
- package/src/triggers/subscriptions.d.ts +22 -0
- package/src/triggers/subscriptions.js +220 -0
- package/src/triggers/trigger-runner.d.ts +34 -0
- package/src/triggers/trigger-runner.js +169 -0
- package/src/providers/sentry/scopes.d.ts +0 -1
- package/src/providers/sentry/scopes.js +0 -7
- package/src/server/storage/postgres-runtime-store.d.ts +0 -39
- /package/src/providers/{cloudflare-current-user.d.ts → cloudflare_dns/runtime-user.d.ts} +0 -0
package/src/core/cast.js
CHANGED
|
@@ -196,9 +196,12 @@ export function optionalNumber(value) {
|
|
|
196
196
|
/**
|
|
197
197
|
* Return a finite number from a number or numeric string when present. Examples:
|
|
198
198
|
* `optionalNumberLike("1.5") => 1.5`, `optionalNumberLike("x") => undefined`.
|
|
199
|
+
*
|
|
200
|
+
* A blank or whitespace-only string is reported as missing rather than parsed, because
|
|
201
|
+
* `Number(" ")` is `0` and a blank field would otherwise surface as a real zero.
|
|
199
202
|
*/
|
|
200
203
|
export function optionalNumberLike(value) {
|
|
201
|
-
const parsed = typeof value === "number" ? value : typeof value === "string" && value !== "" ? Number(value) : Number.NaN;
|
|
204
|
+
const parsed = typeof value === "number" ? value : typeof value === "string" && value.trim() !== "" ? Number(value) : Number.NaN;
|
|
202
205
|
return Number.isFinite(parsed) ? parsed : undefined;
|
|
203
206
|
}
|
|
204
207
|
/**
|
|
@@ -309,6 +312,20 @@ export function pickOptionalInteger(input, ...keys) {
|
|
|
309
312
|
export function nullableString(value) {
|
|
310
313
|
return value === null ? null : optionalString(value);
|
|
311
314
|
}
|
|
315
|
+
/**
|
|
316
|
+
* Return a string exactly as provided, null, or undefined when the value is not a string. Examples:
|
|
317
|
+
* `nullableRawString(null) => null`, `nullableRawString("") => ""`, `nullableRawString(1) => undefined`.
|
|
318
|
+
*/
|
|
319
|
+
export function nullableRawString(value) {
|
|
320
|
+
return value === null ? null : optionalRawString(value);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Return a boolean, null, or undefined when the value is not a boolean. Examples:
|
|
324
|
+
* `nullableBoolean(null) => null`, `nullableBoolean(false) => false`, `nullableBoolean("true") => undefined`.
|
|
325
|
+
*/
|
|
326
|
+
export function nullableBoolean(value) {
|
|
327
|
+
return value === null ? null : optionalBoolean(value);
|
|
328
|
+
}
|
|
312
329
|
/**
|
|
313
330
|
* Return a string or null when the value is not a string.
|
|
314
331
|
*/
|
|
@@ -24,8 +24,12 @@ export interface GuardedFetchOptions {
|
|
|
24
24
|
* load are honored.
|
|
25
25
|
*/
|
|
26
26
|
allowPrivateNetwork?: boolean | (() => boolean);
|
|
27
|
+
/** Whether deployment trusted hosts may bypass private DNS answers. Defaults to true. */
|
|
28
|
+
allowTrustedHosts?: boolean;
|
|
27
29
|
/** Error factory for guard violations. Defaults to TypeError. */
|
|
28
30
|
createError?: (message: string) => Error;
|
|
31
|
+
/** Error factory for DNS lookup failures. Defaults to createError. */
|
|
32
|
+
createResolutionError?: (message: string) => Error;
|
|
29
33
|
/** Maximum redirect hops followed before the request fails. */
|
|
30
34
|
maxRedirects?: number;
|
|
31
35
|
/**
|
|
@@ -132,12 +136,16 @@ export declare function unwrapGuardedFetch(fetcher: typeof fetch | undefined): t
|
|
|
132
136
|
* so this layer applies there too. Only on a runtime without `node:dns` does it
|
|
133
137
|
* degrade to a no-op, leaving the URL-literal and redirect-`Location` checks.
|
|
134
138
|
*
|
|
135
|
-
* Callers that pass `redirect: "manual"`
|
|
136
|
-
*
|
|
137
|
-
*
|
|
139
|
+
* Callers that pass `redirect: "manual"` keep native semantics: the first
|
|
140
|
+
* response, including an unfollowed 3xx, is returned after the initial URL and
|
|
141
|
+
* its resolved addresses are validated, so the caller's `!response.ok` check
|
|
142
|
+
* rejects a redirect. Use "manual" rather than `redirect: "error"` to refuse
|
|
143
|
+
* redirects: Cloudflare Workers does not implement "error" and throws
|
|
144
|
+
* `TypeError: Invalid redirect value` before sending the request.
|
|
138
145
|
*/
|
|
139
146
|
export declare function createGuardedFetch(options?: GuardedFetchOptions): typeof fetch;
|
|
140
147
|
export interface GuardedEgressUrlOptions {
|
|
148
|
+
allowTrustedHosts?: boolean;
|
|
141
149
|
/** Field name used in guard violation messages, e.g. `"request URL"`. */
|
|
142
150
|
fieldName: string;
|
|
143
151
|
/** Error factory for guard violations. */
|
|
@@ -125,9 +125,12 @@ export function unwrapGuardedFetch(fetcher) {
|
|
|
125
125
|
* so this layer applies there too. Only on a runtime without `node:dns` does it
|
|
126
126
|
* degrade to a no-op, leaving the URL-literal and redirect-`Location` checks.
|
|
127
127
|
*
|
|
128
|
-
* Callers that pass `redirect: "manual"`
|
|
129
|
-
*
|
|
130
|
-
*
|
|
128
|
+
* Callers that pass `redirect: "manual"` keep native semantics: the first
|
|
129
|
+
* response, including an unfollowed 3xx, is returned after the initial URL and
|
|
130
|
+
* its resolved addresses are validated, so the caller's `!response.ok` check
|
|
131
|
+
* rejects a redirect. Use "manual" rather than `redirect: "error"` to refuse
|
|
132
|
+
* redirects: Cloudflare Workers does not implement "error" and throws
|
|
133
|
+
* `TypeError: Invalid redirect value` before sending the request.
|
|
131
134
|
*/
|
|
132
135
|
export function createGuardedFetch(options = {}) {
|
|
133
136
|
const baseFetch = unwrapGuardedFetch(options.fetch);
|
|
@@ -151,7 +154,14 @@ export function createGuardedFetch(options = {}) {
|
|
|
151
154
|
: options.lookup === undefined
|
|
152
155
|
? await resolveDefaultLookup()
|
|
153
156
|
: options.lookup;
|
|
154
|
-
const guardHop = (value, fieldName) => assertGuardedEgressUrl(value, {
|
|
157
|
+
const guardHop = (value, fieldName) => assertGuardedEgressUrl(value, {
|
|
158
|
+
fieldName,
|
|
159
|
+
createError,
|
|
160
|
+
allowPrivateNetwork,
|
|
161
|
+
lookup,
|
|
162
|
+
allowTrustedHosts: options.allowTrustedHosts,
|
|
163
|
+
createResolutionError: options.createResolutionError,
|
|
164
|
+
});
|
|
155
165
|
const request = input instanceof Request ? input : undefined;
|
|
156
166
|
let url = await guardHop(request?.url ?? (input instanceof URL ? input.href : String(input)), "request URL");
|
|
157
167
|
const redirectMode = init?.redirect ?? request?.redirect ?? "follow";
|
|
@@ -252,6 +262,7 @@ export async function resolveGuardedEgressTarget(value, options) {
|
|
|
252
262
|
createError: options.createError,
|
|
253
263
|
createResolutionError: options.createResolutionError ?? options.createError,
|
|
254
264
|
lookup,
|
|
265
|
+
allowTrustedHosts: options.allowTrustedHosts !== false,
|
|
255
266
|
});
|
|
256
267
|
return { url, addresses };
|
|
257
268
|
}
|
|
@@ -286,7 +297,7 @@ async function assertResolvedAddressesAllowed(hostname, fieldName, policy) {
|
|
|
286
297
|
// Deployment-level trusted-host setting, resolved per request so a bootstrap that
|
|
287
298
|
// configures it after module load is honored. It may open private and
|
|
288
299
|
// VPN-mapped results, while unsafe special-use targets remain blocked.
|
|
289
|
-
const trustedHost = isEgressTrustedHost(hostname);
|
|
300
|
+
const trustedHost = policy.allowTrustedHosts && isEgressTrustedHost(hostname);
|
|
290
301
|
for (const entry of results) {
|
|
291
302
|
if (entry && typeof entry.address === "string") {
|
|
292
303
|
const addressClass = classifyIpAddress(entry.address);
|
|
@@ -308,8 +319,9 @@ async function assertResolvedAddressesAllowed(hostname, fieldName, policy) {
|
|
|
308
319
|
// would turn the guard into a DNS/internal-range probe oracle, a property
|
|
309
320
|
// src/mail/imap-smtp/host-pinning.test.ts asserts.
|
|
310
321
|
throw policy.createError(`${fieldName} must not resolve to private or reserved IP addresses ` +
|
|
311
|
-
|
|
312
|
-
|
|
322
|
+
(policy.allowTrustedHosts
|
|
323
|
+
? `(if this host is reached through a corporate VPN or split DNS, add it to OOMOL_CONNECT_EGRESS_TRUSTED_HOSTS)`
|
|
324
|
+
: `(check proxy Fake-IP and DNS settings; this request requires a public address)`));
|
|
313
325
|
}
|
|
314
326
|
}
|
|
315
327
|
return results;
|
|
@@ -16,15 +16,26 @@ const scenarioByService = new Map([
|
|
|
16
16
|
["aliyunoss", "data-storage"],
|
|
17
17
|
["amap", "productivity"],
|
|
18
18
|
["aivoov", "ai"],
|
|
19
|
+
["aifinmarket", "investment"],
|
|
20
|
+
["alpaca", "investment"],
|
|
21
|
+
["alphavantage", "investment"],
|
|
19
22
|
["anthropic", "ai"],
|
|
20
23
|
["apininjas", "developer"],
|
|
21
24
|
["awss3", "data-storage"],
|
|
22
25
|
["asindataapi", "cross-border-ecommerce"],
|
|
23
26
|
["baselinker", "cross-border-ecommerce"],
|
|
27
|
+
["beaconchain", "investment"],
|
|
28
|
+
["benzinga", "investment"],
|
|
24
29
|
["bigcommerce", "cross-border-ecommerce"],
|
|
25
30
|
["captainbi", "cross-border-ecommerce"],
|
|
26
31
|
["cin7core", "cross-border-ecommerce"],
|
|
27
32
|
["circleci", "developer"],
|
|
33
|
+
["coinbase", "investment"],
|
|
34
|
+
["coingecko", "investment"],
|
|
35
|
+
["coinmarketcal", "investment"],
|
|
36
|
+
["coinmarketcap", "investment"],
|
|
37
|
+
["coinranking", "investment"],
|
|
38
|
+
["cryptoapis", "investment"],
|
|
28
39
|
["clickup", "productivity"],
|
|
29
40
|
["cloudflaredns", "developer"],
|
|
30
41
|
["cloudflarer2", "data-storage"],
|
|
@@ -39,15 +50,22 @@ const scenarioByService = new Map([
|
|
|
39
50
|
["dockerhub", "developer"],
|
|
40
51
|
["elevenlabs", "ai"],
|
|
41
52
|
["easypost", "cross-border-ecommerce"],
|
|
53
|
+
["eodhdapis", "investment"],
|
|
42
54
|
["exa", "ai"],
|
|
43
55
|
["falai", "ai"],
|
|
44
56
|
["feishu", "communication"],
|
|
45
57
|
["feishuappbot", "communication"],
|
|
46
58
|
["feishucustombot", "communication"],
|
|
47
59
|
["figma", "productivity"],
|
|
60
|
+
["finage", "investment"],
|
|
61
|
+
["finchina", "investment"],
|
|
62
|
+
["financialmodelingprep", "investment"],
|
|
48
63
|
["firecrawl", "developer"],
|
|
64
|
+
["futunn", "investment"],
|
|
65
|
+
["gangtise", "investment"],
|
|
49
66
|
["gemini", "ai"],
|
|
50
67
|
["giphy", "marketing"],
|
|
68
|
+
["gildata", "investment"],
|
|
51
69
|
["github", "developer"],
|
|
52
70
|
["gitlab", "developer"],
|
|
53
71
|
["gmail", "communication"],
|
|
@@ -55,18 +73,29 @@ const scenarioByService = new Map([
|
|
|
55
73
|
["googlebigquery", "data-storage"],
|
|
56
74
|
["googlecalendar", "productivity"],
|
|
57
75
|
["googleforms", "productivity"],
|
|
58
|
-
["googlephotos", "
|
|
76
|
+
["googlephotos", "communication"],
|
|
59
77
|
["googlesearchconsole", "marketing"],
|
|
60
78
|
["googlesheets", "productivity"],
|
|
61
79
|
["googletasks", "productivity"],
|
|
62
80
|
["hubspot", "marketing"],
|
|
63
81
|
["helium10", "cross-border-ecommerce"],
|
|
82
|
+
["hithinkfinance", "investment"],
|
|
83
|
+
["investodaymcp", "investment"],
|
|
84
|
+
["intrinio", "investment"],
|
|
85
|
+
["jin10", "investment"],
|
|
64
86
|
["jumpseller", "cross-border-ecommerce"],
|
|
65
87
|
["linkfox", "cross-border-ecommerce"],
|
|
66
88
|
["lingxingmcp", "cross-border-ecommerce"],
|
|
89
|
+
["longbridge", "investment"],
|
|
90
|
+
["luno", "investment"],
|
|
67
91
|
["mailchimp", "marketing"],
|
|
68
92
|
["mailgun", "communication"],
|
|
93
|
+
["marketstack", "investment"],
|
|
94
|
+
["metatraderapi", "investment"],
|
|
69
95
|
["monday", "productivity"],
|
|
96
|
+
["nasdaq", "investment"],
|
|
97
|
+
["polygonio", "investment"],
|
|
98
|
+
["quantdata", "investment"],
|
|
70
99
|
["openai", "ai"],
|
|
71
100
|
["outlook", "communication"],
|
|
72
101
|
["perplexity", "ai"],
|
|
@@ -80,7 +109,11 @@ const scenarioByService = new Map([
|
|
|
80
109
|
["storecensus", "cross-border-ecommerce"],
|
|
81
110
|
["storeleads", "cross-border-ecommerce"],
|
|
82
111
|
["telegram", "communication"],
|
|
112
|
+
["tokenmetrics", "investment"],
|
|
113
|
+
["tongdaxin", "investment"],
|
|
83
114
|
["trello", "productivity"],
|
|
115
|
+
["tushare", "investment"],
|
|
116
|
+
["twelvedata", "investment"],
|
|
84
117
|
["twilio", "communication"],
|
|
85
118
|
["triplewhale", "cross-border-ecommerce"],
|
|
86
119
|
["vercel", "developer"],
|
|
@@ -93,26 +126,32 @@ const scenarioByService = new Map([
|
|
|
93
126
|
["shippo", "cross-border-ecommerce"],
|
|
94
127
|
["shipstation", "cross-border-ecommerce"],
|
|
95
128
|
["vtex", "cross-border-ecommerce"],
|
|
129
|
+
["uniswapapi", "investment"],
|
|
130
|
+
["yingmimcp", "investment"],
|
|
96
131
|
["woocommerce", "cross-border-ecommerce"],
|
|
97
|
-
["box", "
|
|
98
|
-
["confluence", "
|
|
99
|
-
["crowdin", "
|
|
100
|
-
["docparser", "
|
|
101
|
-
["dropbox", "
|
|
102
|
-
["googledocs", "
|
|
103
|
-
["googledrive", "
|
|
104
|
-
["googleslides", "
|
|
105
|
-
["notion", "
|
|
106
|
-
["onlyofficedocspace", "
|
|
132
|
+
["box", "communication"],
|
|
133
|
+
["confluence", "communication"],
|
|
134
|
+
["crowdin", "communication"],
|
|
135
|
+
["docparser", "communication"],
|
|
136
|
+
["dropbox", "communication"],
|
|
137
|
+
["googledocs", "communication"],
|
|
138
|
+
["googledrive", "communication"],
|
|
139
|
+
["googleslides", "communication"],
|
|
140
|
+
["notion", "communication"],
|
|
141
|
+
["onlyofficedocspace", "communication"],
|
|
107
142
|
]);
|
|
108
143
|
const scenarioByCategory = new Map([
|
|
109
144
|
["ai", "ai"],
|
|
110
145
|
["communication", "communication"],
|
|
146
|
+
["collaboration", "communication"],
|
|
111
147
|
["data", "data-storage"],
|
|
112
148
|
["dataanalytics", "data-storage"],
|
|
113
149
|
["developertools", "developer"],
|
|
150
|
+
["docs", "communication"],
|
|
151
|
+
["documents", "communication"],
|
|
114
152
|
["infrastructure", "developer"],
|
|
115
153
|
["marketing", "marketing"],
|
|
154
|
+
["knowledge", "communication"],
|
|
116
155
|
["productivity", "productivity"],
|
|
117
156
|
["security", "developer"],
|
|
118
157
|
["social", "marketing"],
|
|
@@ -121,8 +160,23 @@ const scenarioByCategory = new Map([
|
|
|
121
160
|
const scenarioKeywords = [
|
|
122
161
|
["ai", ["agent", "ai", "embedding", "llm", "model", "prompt", "transcrib", "vector"]],
|
|
123
162
|
["cross-border-ecommerce", ["ecommerce", "marketplace", "order fulfillment", "seller", "storefront"]],
|
|
124
|
-
["
|
|
125
|
-
[
|
|
163
|
+
["investment", ["brokerage", "crypto", "investment", "market data", "portfolio", "stock market", "trading"]],
|
|
164
|
+
[
|
|
165
|
+
"communication",
|
|
166
|
+
[
|
|
167
|
+
"chat",
|
|
168
|
+
"document",
|
|
169
|
+
"drive",
|
|
170
|
+
"email",
|
|
171
|
+
"inbox",
|
|
172
|
+
"knowledge base",
|
|
173
|
+
"messaging",
|
|
174
|
+
"notification",
|
|
175
|
+
"sms",
|
|
176
|
+
"video meeting",
|
|
177
|
+
"wiki",
|
|
178
|
+
],
|
|
179
|
+
],
|
|
126
180
|
["productivity", ["calendar", "project management", "schedule", "task management", "todo"]],
|
|
127
181
|
["marketing", ["advertising", "analytics", "crm", "lead generation", "marketing", "seo"]],
|
|
128
182
|
["data-storage", ["database", "data warehouse", "object storage", "search index"]],
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type RemoteHttpFailure = "invalid_url" | "dns" | "redirect" | "network" | "invalid_json" | "too_large";
|
|
2
|
+
export declare class RemoteHttpError extends Error {
|
|
3
|
+
readonly kind: RemoteHttpFailure;
|
|
4
|
+
constructor(kind: RemoteHttpFailure, message: string);
|
|
5
|
+
}
|
|
6
|
+
export interface RemoteHttpOptions {
|
|
7
|
+
url: string | URL;
|
|
8
|
+
label: string;
|
|
9
|
+
init?: RequestInit;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
fetcher?: typeof fetch;
|
|
12
|
+
requireHttps?: boolean;
|
|
13
|
+
allowTrustedHosts?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface RemoteJsonOptions {
|
|
16
|
+
label: string;
|
|
17
|
+
maxBytes: number;
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
}
|
|
20
|
+
/** Keep the request budget active through response consumption; never follow redirects with a service key. */
|
|
21
|
+
export declare function requestRemote<T>(options: RemoteHttpOptions, consume: (response: Response, signal: AbortSignal | undefined) => Promise<T>): Promise<T>;
|
|
22
|
+
/** Limits decoded transport bytes, including chunked and error responses, without exposing raw JSON errors. */
|
|
23
|
+
export declare function readRemoteJson(response: Response, options: RemoteJsonOptions): Promise<unknown>;
|
|
24
|
+
export declare function isSuccessEnvelope(value: unknown): value is {
|
|
25
|
+
success: true;
|
|
26
|
+
data: unknown;
|
|
27
|
+
};
|
|
28
|
+
export declare function isFailureEnvelope(value: unknown): value is {
|
|
29
|
+
success: false;
|
|
30
|
+
message: string;
|
|
31
|
+
errorCode: string;
|
|
32
|
+
data: unknown;
|
|
33
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { isAbortLikeError } from "../providers/provider-runtime.js";
|
|
2
|
+
import { optionalRecord } from "./cast.js";
|
|
3
|
+
import { createGuardedFetch } from "./guarded-fetch.js";
|
|
4
|
+
import { assertPublicHttpUrl, readBoundedResponseBytes } from "./request.js";
|
|
5
|
+
export class RemoteHttpError extends Error {
|
|
6
|
+
kind;
|
|
7
|
+
constructor(kind, message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.kind = kind;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Keep the request budget active through response consumption; never follow redirects with a service key. */
|
|
13
|
+
export async function requestRemote(options, consume) {
|
|
14
|
+
const url = assertPublicHttpUrl(String(options.url), {
|
|
15
|
+
fieldName: `${options.label} URL`,
|
|
16
|
+
createError: (message) => new RemoteHttpError("invalid_url", message),
|
|
17
|
+
});
|
|
18
|
+
if (options.requireHttps !== false && url.protocol !== "https:") {
|
|
19
|
+
throw new RemoteHttpError("invalid_url", `${options.label} requires HTTPS.`);
|
|
20
|
+
}
|
|
21
|
+
if (url.username || url.password || url.hash) {
|
|
22
|
+
throw new RemoteHttpError("invalid_url", `${options.label} does not allow URL credentials or fragments.`);
|
|
23
|
+
}
|
|
24
|
+
const signals = [
|
|
25
|
+
options.init?.signal,
|
|
26
|
+
options.timeoutMs === undefined ? undefined : AbortSignal.timeout(options.timeoutMs),
|
|
27
|
+
].filter((signal) => signal != null);
|
|
28
|
+
const signal = signals.length ? AbortSignal.any(signals) : undefined;
|
|
29
|
+
signal?.throwIfAborted();
|
|
30
|
+
const guardOptions = {
|
|
31
|
+
fetch: options.fetcher,
|
|
32
|
+
allowTrustedHosts: options.allowTrustedHosts ?? false,
|
|
33
|
+
createError: (message) => new RemoteHttpError("invalid_url", message),
|
|
34
|
+
createResolutionError: (message) => new RemoteHttpError("dns", message),
|
|
35
|
+
};
|
|
36
|
+
const run = async () => {
|
|
37
|
+
let response;
|
|
38
|
+
try {
|
|
39
|
+
response = await createGuardedFetch(guardOptions)(url, { ...options.init, redirect: "manual", signal });
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
signal?.throwIfAborted();
|
|
43
|
+
if (error instanceof RemoteHttpError || isAbortLikeError(error))
|
|
44
|
+
throw error;
|
|
45
|
+
throw new RemoteHttpError("network", `${options.label} request failed.`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
signal?.throwIfAborted();
|
|
49
|
+
if (response.status >= 300 && response.status < 400) {
|
|
50
|
+
throw new RemoteHttpError("redirect", `${options.label} redirects are not allowed.`);
|
|
51
|
+
}
|
|
52
|
+
return await consume(response, signal);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
if (!response.bodyUsed)
|
|
56
|
+
void response.body?.cancel().catch(() => undefined);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
if (!signal)
|
|
60
|
+
return run();
|
|
61
|
+
let abort = () => undefined;
|
|
62
|
+
const aborted = new Promise((_resolve, reject) => {
|
|
63
|
+
abort = () => reject(signal.reason);
|
|
64
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
65
|
+
});
|
|
66
|
+
try {
|
|
67
|
+
return await Promise.race([run(), aborted]);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
signal.removeEventListener("abort", abort);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Limits decoded transport bytes, including chunked and error responses, without exposing raw JSON errors. */
|
|
74
|
+
export async function readRemoteJson(response, options) {
|
|
75
|
+
let bytes;
|
|
76
|
+
try {
|
|
77
|
+
bytes = await readBoundedResponseBytes(response, {
|
|
78
|
+
maxBytes: options.maxBytes,
|
|
79
|
+
fieldName: options.label,
|
|
80
|
+
signal: options.signal,
|
|
81
|
+
createError: (message) => new RemoteHttpError("too_large", message),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
options.signal?.throwIfAborted();
|
|
86
|
+
if (error instanceof RemoteHttpError || isAbortLikeError(error))
|
|
87
|
+
throw error;
|
|
88
|
+
throw new RemoteHttpError("network", `${options.label} could not be read.`);
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
throw new RemoteHttpError("invalid_json", `${options.label} is not valid JSON.`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function isSuccessEnvelope(value) {
|
|
98
|
+
const record = optionalRecord(value);
|
|
99
|
+
return record?.success === true && "data" in record;
|
|
100
|
+
}
|
|
101
|
+
export function isFailureEnvelope(value) {
|
|
102
|
+
const record = optionalRecord(value);
|
|
103
|
+
return record?.success === false && typeof record.message === "string" && typeof record.errorCode === "string";
|
|
104
|
+
}
|
package/src/core/request.d.ts
CHANGED
package/src/core/request.js
CHANGED
|
@@ -58,8 +58,12 @@ export function compactJson(value) {
|
|
|
58
58
|
* Read a response body into memory while enforcing a byte limit.
|
|
59
59
|
*/
|
|
60
60
|
export async function readBoundedResponseBytes(response, options) {
|
|
61
|
+
options.signal?.throwIfAborted();
|
|
61
62
|
const contentLength = parseContentLength(response.headers.get("content-length"));
|
|
62
63
|
if (contentLength !== undefined) {
|
|
64
|
+
if (contentLength > options.maxBytes) {
|
|
65
|
+
void response.body?.cancel().catch(() => undefined);
|
|
66
|
+
}
|
|
63
67
|
assertMaxBytes(contentLength, options);
|
|
64
68
|
}
|
|
65
69
|
if (!response.body) {
|
|
@@ -68,23 +72,29 @@ export async function readBoundedResponseBytes(response, options) {
|
|
|
68
72
|
return bytes;
|
|
69
73
|
}
|
|
70
74
|
const reader = response.body.getReader();
|
|
75
|
+
const abort = () => {
|
|
76
|
+
void reader.cancel().catch(() => undefined);
|
|
77
|
+
};
|
|
78
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
71
79
|
const chunks = [];
|
|
72
80
|
let totalBytes = 0;
|
|
73
81
|
try {
|
|
74
82
|
while (true) {
|
|
75
83
|
const { done, value } = await reader.read();
|
|
84
|
+
options.signal?.throwIfAborted();
|
|
76
85
|
if (done) {
|
|
77
86
|
break;
|
|
78
87
|
}
|
|
79
88
|
totalBytes += value.byteLength;
|
|
80
89
|
if (totalBytes > options.maxBytes) {
|
|
81
|
-
|
|
90
|
+
void reader.cancel().catch(() => undefined);
|
|
82
91
|
throw options.createError(`${options.fieldName} exceeds ${options.maxBytes} bytes`);
|
|
83
92
|
}
|
|
84
93
|
chunks.push(value);
|
|
85
94
|
}
|
|
86
95
|
}
|
|
87
96
|
finally {
|
|
97
|
+
options.signal?.removeEventListener("abort", abort);
|
|
88
98
|
reader.releaseLock();
|
|
89
99
|
}
|
|
90
100
|
const bytes = new Uint8Array(totalBytes);
|
package/src/core/types.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { TriggerKeySnapshot } from "../triggers/common/types.ts";
|
|
2
|
+
import type { TriggerPermission } from "../triggers/metadata.ts";
|
|
1
3
|
/**
|
|
2
4
|
* JSON Schema object used for action input and output contracts.
|
|
3
5
|
*
|
|
@@ -17,7 +19,7 @@ export type AuthType = "no_auth" | "api_key" | "custom_credential" | "oauth2";
|
|
|
17
19
|
* Provider definitions do not need to repeat this field: the catalog builder
|
|
18
20
|
* adds it to runtime entries through the shared scenario resolver.
|
|
19
21
|
*/
|
|
20
|
-
export type ProviderScenario = "ai" | "cross-border-ecommerce" | "
|
|
22
|
+
export type ProviderScenario = "ai" | "cross-border-ecommerce" | "investment" | "communication" | "productivity" | "marketing" | "data-storage" | "developer" | "other";
|
|
21
23
|
/**
|
|
22
24
|
* A single credential field that users can configure for a provider.
|
|
23
25
|
*/
|
|
@@ -248,6 +250,8 @@ export type ProviderDefinition = {
|
|
|
248
250
|
iconUrl?: string;
|
|
249
251
|
/** Public action catalog for this provider. */
|
|
250
252
|
actions: readonly ActionDefinition[];
|
|
253
|
+
triggers?: readonly TriggerKeySnapshot[];
|
|
254
|
+
triggerPermissions?: readonly TriggerPermission[];
|
|
251
255
|
};
|
|
252
256
|
/**
|
|
253
257
|
* A credential resolved for action execution.
|