@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
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { eventsPollOutputs, maximumPollEventsPerPage, PermanentPollError, PollConnectionError, TransientPollError, } from "../../triggers/common/poll.js";
|
|
2
|
+
import { snapshot } from "./trigger-on-row-added.definition.js";
|
|
3
|
+
const permissionMarkers = [
|
|
4
|
+
"permission_denied",
|
|
5
|
+
"accessnotconfigured",
|
|
6
|
+
"insufficientfilepermissions",
|
|
7
|
+
"appnotauthorizedtofile",
|
|
8
|
+
"the caller does not have permission",
|
|
9
|
+
"has not been used in project",
|
|
10
|
+
];
|
|
11
|
+
const quotaMarkers = ["ratelimitexceeded", "dailylimitexceeded"];
|
|
12
|
+
export const googleSheetsRowAdded = {
|
|
13
|
+
buildOutputs: eventsPollOutputs,
|
|
14
|
+
snapshot,
|
|
15
|
+
async poll(context) {
|
|
16
|
+
const config = resolveConfig(context.config);
|
|
17
|
+
if (context.checkpoint === null) {
|
|
18
|
+
const sheet = await resolveSheet(context, config);
|
|
19
|
+
return { checkpoint: await anchor(context, config, sheet), events: [] };
|
|
20
|
+
}
|
|
21
|
+
const checkpoint = readCheckpoint(context.checkpoint);
|
|
22
|
+
const sheet = await resolveSheet(context, config);
|
|
23
|
+
if (checkpoint.spreadsheetId !== config.spreadsheetId || checkpoint.sheetId !== sheet.sheetId) {
|
|
24
|
+
return { checkpoint: await anchor(context, config, sheet), events: [] };
|
|
25
|
+
}
|
|
26
|
+
if (checkpoint.lastRowNumber > sheet.rowCount)
|
|
27
|
+
return { checkpoint: await anchor(context, config, sheet), events: [] };
|
|
28
|
+
const headers = await header(context, config, sheet);
|
|
29
|
+
const start = Math.min(Math.max(config.firstDataRow, checkpoint.lastRowNumber + 1), sheet.rowCount);
|
|
30
|
+
const end = Math.min(start + Math.min(config.maxRowsPerPoll, maximumPollEventsPerPage) - 1, sheet.rowCount);
|
|
31
|
+
const rows = await values(context, config, sheet, start, end, "row window fetch");
|
|
32
|
+
let last = start + rows.length - 1;
|
|
33
|
+
if (rows.length < end - start + 1) {
|
|
34
|
+
// API 会省略窗口尾部的空行,确认实际表尾后才能推进游标。
|
|
35
|
+
const tail = await lastNonEmptyRow(context, config, sheet);
|
|
36
|
+
if (tail < checkpoint.lastRowNumber)
|
|
37
|
+
return { checkpoint: { ...checkpoint, lastRowNumber: tail }, events: [] };
|
|
38
|
+
last = Math.min(end, tail);
|
|
39
|
+
}
|
|
40
|
+
if (last <= checkpoint.lastRowNumber)
|
|
41
|
+
return { checkpoint, events: [] };
|
|
42
|
+
const events = [];
|
|
43
|
+
let filtered = 0;
|
|
44
|
+
for (const [index, cells] of rows.entries()) {
|
|
45
|
+
const rowNumber = start + index;
|
|
46
|
+
if (rowNumber <= checkpoint.lastRowNumber)
|
|
47
|
+
continue;
|
|
48
|
+
if (rowNumber == config.headerRow || empty(cells)) {
|
|
49
|
+
filtered += 1;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
events.push(await event(config, sheet, rowNumber, cells, headers));
|
|
53
|
+
}
|
|
54
|
+
const hasMore = last == end && end < sheet.rowCount;
|
|
55
|
+
return {
|
|
56
|
+
checkpoint: {
|
|
57
|
+
lastRowNumber: last,
|
|
58
|
+
sheetId: sheet.sheetId,
|
|
59
|
+
spreadsheetId: config.spreadsheetId,
|
|
60
|
+
},
|
|
61
|
+
events,
|
|
62
|
+
filtered,
|
|
63
|
+
...(hasMore ? { hasMore: true } : {}),
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
function resolveConfig(value) {
|
|
68
|
+
const range = value.columnRange.trim();
|
|
69
|
+
const separator = range.indexOf(":");
|
|
70
|
+
const colStart = separator < 0 ? range : range.slice(0, separator);
|
|
71
|
+
const colEnd = separator < 0 ? range : range.slice(separator + 1);
|
|
72
|
+
const spreadsheet = value.spreadsheetId.trim();
|
|
73
|
+
return {
|
|
74
|
+
colEnd,
|
|
75
|
+
colStart,
|
|
76
|
+
dateTimeRender: value.dateTimeRender,
|
|
77
|
+
firstDataRow: value.firstDataRow,
|
|
78
|
+
headerRow: value.headerRow,
|
|
79
|
+
maxRowsPerPoll: value.maxRowsPerPoll,
|
|
80
|
+
sheet: value.sheet,
|
|
81
|
+
spreadsheetId: /\/spreadsheets\/d\/([A-Za-z0-9_-]+)/.exec(spreadsheet)?.[1] ?? spreadsheet,
|
|
82
|
+
valueRender: value.valueRender,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function readCheckpoint(value) {
|
|
86
|
+
const checkpoint = record(value);
|
|
87
|
+
if (typeof checkpoint?.spreadsheetId != "string" ||
|
|
88
|
+
!Number.isInteger(checkpoint.sheetId) ||
|
|
89
|
+
!Number.isInteger(checkpoint.lastRowNumber)) {
|
|
90
|
+
throw new PermanentPollError("Google Sheets checkpoint is invalid; recreate the Trigger.");
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
lastRowNumber: checkpoint.lastRowNumber,
|
|
94
|
+
sheetId: checkpoint.sheetId,
|
|
95
|
+
spreadsheetId: checkpoint.spreadsheetId,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async function resolveSheet(context, config) {
|
|
99
|
+
const result = await get(context, `/spreadsheets/${encodeURIComponent(config.spreadsheetId)}`, {
|
|
100
|
+
fields: "sheets.properties(sheetId,title,sheetType,gridProperties)",
|
|
101
|
+
});
|
|
102
|
+
if (result.status == 404)
|
|
103
|
+
throw new PermanentPollError("The Google Sheets spreadsheet was not found.");
|
|
104
|
+
success(result, "spreadsheet metadata fetch");
|
|
105
|
+
const raw = record(result.data)?.sheets;
|
|
106
|
+
const properties = Array.isArray(raw)
|
|
107
|
+
? raw.map((value) => record(record(value)?.properties))
|
|
108
|
+
: [];
|
|
109
|
+
const candidates = properties.filter((value) => value != null);
|
|
110
|
+
const byId = /^\d+$/.test(config.sheet)
|
|
111
|
+
? candidates.find(({ sheetId }) => sheetId === Number(config.sheet))
|
|
112
|
+
: undefined;
|
|
113
|
+
const match = byId ?? candidates.find(({ title }) => title === config.sheet);
|
|
114
|
+
if (match == null)
|
|
115
|
+
throw new PermanentPollError(`Google Sheets tab "${config.sheet}" does not exist.`);
|
|
116
|
+
if (match.sheetType != null && match.sheetType !== "GRID")
|
|
117
|
+
throw new PermanentPollError("The Google Sheets tab is not a grid sheet.");
|
|
118
|
+
const rowCount = match.gridProperties?.rowCount;
|
|
119
|
+
if (match.sheetId == null || match.title == null || rowCount == null) {
|
|
120
|
+
throw new TransientPollError("Google Sheets tab metadata is incomplete.");
|
|
121
|
+
}
|
|
122
|
+
return { rowCount, sheetId: match.sheetId, title: match.title };
|
|
123
|
+
}
|
|
124
|
+
async function anchor(context, config, sheet) {
|
|
125
|
+
return {
|
|
126
|
+
lastRowNumber: await lastNonEmptyRow(context, config, sheet),
|
|
127
|
+
sheetId: sheet.sheetId,
|
|
128
|
+
spreadsheetId: config.spreadsheetId,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async function lastNonEmptyRow(context, config, sheet) {
|
|
132
|
+
if (sheet.rowCount < config.firstDataRow)
|
|
133
|
+
return config.firstDataRow - 1;
|
|
134
|
+
const rows = await values(context, config, sheet, config.firstDataRow, sheet.rowCount, "full-range scan");
|
|
135
|
+
return rows.length == 0 ? config.firstDataRow - 1 : config.firstDataRow + rows.length - 1;
|
|
136
|
+
}
|
|
137
|
+
async function header(context, config, sheet) {
|
|
138
|
+
const result = await get(context, valuesEndpoint(config, sheet, config.headerRow, config.headerRow), {
|
|
139
|
+
majorDimension: "ROWS",
|
|
140
|
+
valueRenderOption: "FORMATTED_VALUE",
|
|
141
|
+
});
|
|
142
|
+
success(result, "header row fetch");
|
|
143
|
+
return readValues(result.data)[0] ?? [];
|
|
144
|
+
}
|
|
145
|
+
async function values(context, config, sheet, start, end, operation) {
|
|
146
|
+
const result = await get(context, valuesEndpoint(config, sheet, start, end), {
|
|
147
|
+
dateTimeRenderOption: config.dateTimeRender,
|
|
148
|
+
majorDimension: "ROWS",
|
|
149
|
+
valueRenderOption: config.valueRender,
|
|
150
|
+
});
|
|
151
|
+
success(result, operation);
|
|
152
|
+
return readValues(result.data);
|
|
153
|
+
}
|
|
154
|
+
function readValues(data) {
|
|
155
|
+
const rows = record(data)?.values;
|
|
156
|
+
return Array.isArray(rows) ? rows : [];
|
|
157
|
+
}
|
|
158
|
+
function empty(cells) {
|
|
159
|
+
return cells.every((cell) => cell === "" || cell == null);
|
|
160
|
+
}
|
|
161
|
+
async function event(config, sheet, rowNumber, cells, headers) {
|
|
162
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(JSON.stringify(cells)));
|
|
163
|
+
const hash = [...new Uint8Array(digest)]
|
|
164
|
+
.slice(0, 8)
|
|
165
|
+
.map((value) => value.toString(16).padStart(2, "0"))
|
|
166
|
+
.join("");
|
|
167
|
+
const row = {};
|
|
168
|
+
const start = columnNumber(config.colStart);
|
|
169
|
+
for (const [index, cell] of cells.entries()) {
|
|
170
|
+
const heading = headers[index];
|
|
171
|
+
row[typeof heading == "string" && heading.length > 0 ? heading : columnLetters(start + index)] = cell;
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
dedupeKey: `${sheet.sheetId}:${rowNumber}:${hash}`,
|
|
175
|
+
payload: {
|
|
176
|
+
row,
|
|
177
|
+
rowNumber,
|
|
178
|
+
sheetId: sheet.sheetId,
|
|
179
|
+
sheetTitle: sheet.title,
|
|
180
|
+
spreadsheetId: config.spreadsheetId,
|
|
181
|
+
values: cells,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function valuesEndpoint(config, sheet, start, end) {
|
|
186
|
+
const title = encodeURIComponent(`'${sheet.title.replaceAll("'", "''")}'`);
|
|
187
|
+
return `/spreadsheets/${encodeURIComponent(config.spreadsheetId)}/values/${title}!${config.colStart}${start}:${config.colEnd}${end}`;
|
|
188
|
+
}
|
|
189
|
+
async function get(context, endpoint, query) {
|
|
190
|
+
try {
|
|
191
|
+
return await context.connector.execute({ endpoint, method: "GET", query }, context.signal);
|
|
192
|
+
}
|
|
193
|
+
catch (cause) {
|
|
194
|
+
throw new TransientPollError(`Google Sheets proxy request to ${endpoint} failed.`, { cause });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function success(result, operation) {
|
|
198
|
+
if (result.status >= 200 && result.status < 300)
|
|
199
|
+
return;
|
|
200
|
+
if (result.status == 401)
|
|
201
|
+
throw new PollConnectionError(`Google Sheets ${operation} rejected the Connection.`);
|
|
202
|
+
const haystack = JSON.stringify(result.data ?? null).toLowerCase();
|
|
203
|
+
if (result.status == 403) {
|
|
204
|
+
if (quotaMarkers.some((marker) => haystack.includes(marker)))
|
|
205
|
+
throw new TransientPollError(`Google Sheets ${operation} was rate limited.`);
|
|
206
|
+
if (permissionMarkers.some((marker) => haystack.includes(marker))) {
|
|
207
|
+
throw new PollConnectionError(`Google Sheets ${operation} rejected the Connection.`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (result.status == 400 && haystack.includes("unable to parse range")) {
|
|
211
|
+
throw new PermanentPollError("Google Sheets rejected the configured range.");
|
|
212
|
+
}
|
|
213
|
+
if (result.status == 413)
|
|
214
|
+
throw new PermanentPollError("Google Sheets response is too large; narrow columnRange.");
|
|
215
|
+
throw new TransientPollError(`Google Sheets ${operation} failed with status ${result.status}.`);
|
|
216
|
+
}
|
|
217
|
+
function columnNumber(letters) {
|
|
218
|
+
let value = 0;
|
|
219
|
+
for (const letter of letters.toUpperCase())
|
|
220
|
+
value = value * 26 + letter.charCodeAt(0) - 64;
|
|
221
|
+
return value;
|
|
222
|
+
}
|
|
223
|
+
function columnLetters(value) {
|
|
224
|
+
let letters = "";
|
|
225
|
+
for (let rest = value; rest > 0; rest = Math.floor((rest - 1) / 26)) {
|
|
226
|
+
letters = String.fromCharCode(65 + ((rest - 1) % 26)) + letters;
|
|
227
|
+
}
|
|
228
|
+
return letters;
|
|
229
|
+
}
|
|
230
|
+
function record(value) {
|
|
231
|
+
return value != null && typeof value == "object" && !Array.isArray(value)
|
|
232
|
+
? value
|
|
233
|
+
: undefined;
|
|
234
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { compactObject, objectArray, optionalInteger, optionalRecord, optionalString } from "../../core/cast.js";
|
|
2
|
-
import { defineGoogleProviderExecutors, googleBearerProxyAuth, googleServiceAccountValidator } from "../
|
|
3
|
-
import { googleJsonRequest } from "../
|
|
2
|
+
import { defineGoogleProviderExecutors, googleBearerProxyAuth, googleServiceAccountValidator, } from "../googledrive/runtime-auth.js";
|
|
3
|
+
import { googleJsonRequest } from "../googledrive/runtime-request.js";
|
|
4
4
|
import { defineProviderProxy, providerInputError, ProviderRequestError } from "../provider-runtime.js";
|
|
5
5
|
import { googleSlidesOAuthScopes } from "./scopes.js";
|
|
6
6
|
export const slidesApiBaseUrl = "https://slides.googleapis.com/v1";
|
|
@@ -2,9 +2,6 @@ export declare const presentationsReadonlyScope = "https://www.googleapis.com/au
|
|
|
2
2
|
export declare const presentationsScope = "https://www.googleapis.com/auth/presentations";
|
|
3
3
|
export declare const googleDriveReadonlyScope = "https://www.googleapis.com/auth/drive.readonly";
|
|
4
4
|
export declare const googleDriveFullScope = "https://www.googleapis.com/auth/drive";
|
|
5
|
-
export declare const googleOpenIdScope = "openid";
|
|
6
|
-
export declare const googleEmailScope = "email";
|
|
7
|
-
export declare const googleProfileScope = "profile";
|
|
8
5
|
export declare const googleSlidesReadScopes: string[];
|
|
9
6
|
export declare const googleSlidesWriteScopes: string[];
|
|
10
7
|
export declare const googleSlidesOAuthScopes: string[];
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
+
import { googleIdentityScopes } from "../googleads/scopes.js";
|
|
1
2
|
export const presentationsReadonlyScope = "https://www.googleapis.com/auth/presentations.readonly";
|
|
2
3
|
export const presentationsScope = "https://www.googleapis.com/auth/presentations";
|
|
3
4
|
export const googleDriveReadonlyScope = "https://www.googleapis.com/auth/drive.readonly";
|
|
4
5
|
export const googleDriveFullScope = "https://www.googleapis.com/auth/drive";
|
|
5
|
-
export const googleOpenIdScope = "openid";
|
|
6
|
-
export const googleEmailScope = "email";
|
|
7
|
-
export const googleProfileScope = "profile";
|
|
8
6
|
export const googleSlidesReadScopes = [presentationsReadonlyScope, googleDriveReadonlyScope];
|
|
9
7
|
export const googleSlidesWriteScopes = [presentationsScope, googleDriveFullScope];
|
|
10
8
|
export const googleSlidesOAuthScopes = [
|
|
@@ -12,7 +10,5 @@ export const googleSlidesOAuthScopes = [
|
|
|
12
10
|
presentationsScope,
|
|
13
11
|
googleDriveReadonlyScope,
|
|
14
12
|
googleDriveFullScope,
|
|
15
|
-
|
|
16
|
-
googleEmailScope,
|
|
17
|
-
googleProfileScope,
|
|
13
|
+
...googleIdentityScopes,
|
|
18
14
|
];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { compactObject, optionalRecord, optionalString, pickOptionalBoolean, pickOptionalInteger, pickOptionalString, } from "../../core/cast.js";
|
|
2
|
-
import { defineGoogleProviderExecutors, googleBearerProxyAuth, googleServiceAccountValidator } from "../
|
|
3
|
-
import { googleJsonRequest, googleRequest } from "../
|
|
2
|
+
import { defineGoogleProviderExecutors, googleBearerProxyAuth, googleServiceAccountValidator, } from "../googledrive/runtime-auth.js";
|
|
3
|
+
import { googleJsonRequest, googleRequest } from "../googledrive/runtime-request.js";
|
|
4
4
|
import { defineProviderProxy, ProviderRequestError } from "../provider-runtime.js";
|
|
5
5
|
import { googleTasksOAuthScopes } from "./scopes.js";
|
|
6
6
|
export const googleTasksApiBaseUrl = "https://tasks.googleapis.com/tasks/v1";
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
export declare const googleTasksReadonlyScope = "https://www.googleapis.com/auth/tasks.readonly";
|
|
2
2
|
export declare const googleTasksFullScope = "https://www.googleapis.com/auth/tasks";
|
|
3
|
-
export declare const googleOpenIdScope = "openid";
|
|
4
|
-
export declare const googleEmailScope = "email";
|
|
5
|
-
export declare const googleProfileScope = "profile";
|
|
6
3
|
export declare const googleTasksReadScopes: string[];
|
|
7
4
|
export declare const googleTasksWriteScopes: string[];
|
|
8
5
|
export declare const googleTasksOAuthScopes: string[];
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
+
import { googleIdentityScopes } from "../googleads/scopes.js";
|
|
1
2
|
export const googleTasksReadonlyScope = "https://www.googleapis.com/auth/tasks.readonly";
|
|
2
3
|
export const googleTasksFullScope = "https://www.googleapis.com/auth/tasks";
|
|
3
|
-
export const googleOpenIdScope = "openid";
|
|
4
|
-
export const googleEmailScope = "email";
|
|
5
|
-
export const googleProfileScope = "profile";
|
|
6
4
|
export const googleTasksReadScopes = [googleTasksReadonlyScope];
|
|
7
5
|
export const googleTasksWriteScopes = [googleTasksFullScope];
|
|
8
6
|
export const googleTasksOAuthScopes = [
|
|
9
7
|
googleTasksReadonlyScope,
|
|
10
8
|
googleTasksFullScope,
|
|
11
|
-
|
|
12
|
-
googleEmailScope,
|
|
13
|
-
googleProfileScope,
|
|
9
|
+
...googleIdentityScopes,
|
|
14
10
|
];
|
|
@@ -67,6 +67,8 @@ const noteSchema = s.looseObject("A Granola note object. MCP supplies ID, title,
|
|
|
67
67
|
summary_text: s.string("The plain text summary of the note."),
|
|
68
68
|
summary_markdown: s.nullable(s.string("The markdown summary of the note, when available.")),
|
|
69
69
|
transcript: s.nullable(s.array("Transcript items returned by Granola.", transcriptItemSchema)),
|
|
70
|
+
date: s.optional(s.string("MCP only: meeting date when available, not a creation or update timestamp.")),
|
|
71
|
+
participants: s.optional(s.string("MCP only: participant names and email addresses as Granola lists them.")),
|
|
70
72
|
});
|
|
71
73
|
const listNotesInputSchema = s.object("Query parameters for listing Granola notes.", {
|
|
72
74
|
created_before: dateOrDateTimeSchema,
|
|
@@ -30,6 +30,8 @@ export const granolaMcpActionHandlers = {
|
|
|
30
30
|
title: meeting.title,
|
|
31
31
|
summary_markdown: meeting.summary,
|
|
32
32
|
transcript: input.include === "transcript" ? [{ text: await getGranolaTranscript(context, id) }] : undefined,
|
|
33
|
+
date: meeting.date,
|
|
34
|
+
participants: meeting.attendees || undefined,
|
|
33
35
|
},
|
|
34
36
|
};
|
|
35
37
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { compactObject, objectArray, optionalRawString, optionalRecord, optionalString, rawStringOrNull, requiredBoolean, requiredRawString, requiredString, requiredStringArray, } from "../../core/cast.js";
|
|
2
|
-
import { providerInputError, providerResponseError, providerUserAgent, ProviderRequestError, readProviderJsonBody, requiredInputString, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
|
|
2
|
+
import { providerInputError, providerResponseError, providerUserAgent, ProviderRequestError, readProviderJsonBody, requiredInputString, requiredResponseRecord, runProviderRequest, withRetryAfterSeconds, } from "../provider-runtime.js";
|
|
3
3
|
export const granolaApiBaseUrl = "https://public-api.granola.ai";
|
|
4
4
|
export const granolaActionHandlers = {
|
|
5
5
|
async list_notes(input, context) {
|
|
@@ -190,5 +190,5 @@ async function assertGranolaResponse(response, mode) {
|
|
|
190
190
|
if (response.status === 400 || response.status === 404 || response.status === 422) {
|
|
191
191
|
throw new ProviderRequestError(400, message);
|
|
192
192
|
}
|
|
193
|
-
throw new ProviderRequestError(response.status >= 500 ? 502 : response.status || 502, message);
|
|
193
|
+
throw new ProviderRequestError(response.status >= 500 ? 502 : response.status || 502, message, withRetryAfterSeconds(response));
|
|
194
194
|
}
|
|
@@ -393,7 +393,7 @@ function getPool(get, path, input, context) {
|
|
|
393
393
|
function getFinancialStatements(path, input, context) {
|
|
394
394
|
return get(path, {
|
|
395
395
|
thscode: requiredInputString(input.thscode, "thscode"),
|
|
396
|
-
period: optionalString(input.period),
|
|
396
|
+
period: optionalString(input.period) ?? "annual",
|
|
397
397
|
limit: optionalNumber(input.limit),
|
|
398
398
|
start: optionalNumber(input.startTimeMs),
|
|
399
399
|
end: optionalNumber(input.endTimeMs),
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
|
|
2
|
+
export declare const executors: ProviderExecutors;
|
|
3
|
+
export declare const proxy: ProviderProxyExecutor;
|
|
4
|
+
export declare const credentialValidators: CredentialValidators;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineApiKeyProviderExecutors, defineProviderProxy } from "../provider-runtime.js";
|
|
2
|
+
import { indexedActionHandlers, indexedApiBaseUrl, readIndexedError, validateIndexedCredential } from "./runtime.js";
|
|
3
|
+
const service = "indexed";
|
|
4
|
+
export const executors = defineApiKeyProviderExecutors(service, indexedActionHandlers, {
|
|
5
|
+
skipDnsValidation: true,
|
|
6
|
+
});
|
|
7
|
+
export const proxy = defineProviderProxy({
|
|
8
|
+
service,
|
|
9
|
+
baseUrl: indexedApiBaseUrl,
|
|
10
|
+
auth: { type: "api_key_header", name: "X-API-Key" },
|
|
11
|
+
readError: readIndexedError,
|
|
12
|
+
skipDnsValidation: true,
|
|
13
|
+
});
|
|
14
|
+
export const credentialValidators = {
|
|
15
|
+
apiKey: validateIndexedCredential,
|
|
16
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CredentialValidationResult } from "../../core/types.ts";
|
|
2
|
+
import type { ApiKeyProviderContext, ProviderActionHandlers } from "../provider-runtime.ts";
|
|
3
|
+
import { ProviderRequestError } from "../provider-runtime.ts";
|
|
4
|
+
export declare const indexedApiBaseUrl = "https://indexed.vc/api/v1";
|
|
5
|
+
type IndexedPhase = "validate" | "execute";
|
|
6
|
+
type IndexedActionHandler = (input: Record<string, unknown>, context: ApiKeyProviderContext) => Promise<unknown>;
|
|
7
|
+
export declare const indexedActionHandlers: ProviderActionHandlers<"indexed", IndexedActionHandler>;
|
|
8
|
+
/**
|
|
9
|
+
* Validate a key with GET /usage, which the API documents as free of credit charges.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateIndexedCredential(input: {
|
|
12
|
+
apiKey: string;
|
|
13
|
+
}, options: {
|
|
14
|
+
fetcher: typeof fetch;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
}): Promise<CredentialValidationResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Read an Indexed error response and map it onto the runtime's status conventions.
|
|
19
|
+
* 402 is a billing state (credits exhausted), reported as insufficient_credit.
|
|
20
|
+
* 403 TIER_UPGRADE_REQUIRED is a plan limit rather than a credential failure, so
|
|
21
|
+
* it is reported as invalid input instead of prompting a reconnect. During key
|
|
22
|
+
* validation a 401 or 403 is a field error on the submitted key. Every other
|
|
23
|
+
* status keeps its upstream value, so a 404 stays a not-found result.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readIndexedError(response: Response, phase?: IndexedPhase): Promise<ProviderRequestError>;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { compactObject, optionalInteger, optionalRecord, optionalString } from "../../core/cast.js";
|
|
2
|
+
import { encodePathSegment, queryParams } from "../../core/request.js";
|
|
3
|
+
import { parseProviderJsonBodyText, providerUserAgent, ProviderRequestError, readProviderErrorTextBody, readProviderTextBody, requiredInputString, requiredResponseRecord, runProviderRequest, withRetryAfterSeconds, } from "../provider-runtime.js";
|
|
4
|
+
export const indexedApiBaseUrl = "https://indexed.vc/api/v1";
|
|
5
|
+
export const indexedActionHandlers = {
|
|
6
|
+
lookup_company_by_domain(input, context) {
|
|
7
|
+
return requestIndexed({
|
|
8
|
+
context,
|
|
9
|
+
path: "/companies",
|
|
10
|
+
query: { domain: requiredInputString(input.domain, "domain") },
|
|
11
|
+
});
|
|
12
|
+
},
|
|
13
|
+
lookup_companies_by_domains(input, context) {
|
|
14
|
+
return requestIndexed({ context, path: "/companies/lookup", body: { domains: input.domains } });
|
|
15
|
+
},
|
|
16
|
+
search_companies(input, context) {
|
|
17
|
+
return requestIndexed({
|
|
18
|
+
context,
|
|
19
|
+
path: "/companies",
|
|
20
|
+
query: {
|
|
21
|
+
q: optionalString(input.q),
|
|
22
|
+
industries: joinList(input.industries),
|
|
23
|
+
countries: joinList(input.countries),
|
|
24
|
+
employees: joinList(input.employees),
|
|
25
|
+
operatingStatus: joinList(input.operatingStatus),
|
|
26
|
+
minFunding: optionalInteger(input.minFunding),
|
|
27
|
+
maxFunding: optionalInteger(input.maxFunding),
|
|
28
|
+
minCompleteness: optionalInteger(input.minCompleteness),
|
|
29
|
+
updated_since: optionalString(input.updatedSince),
|
|
30
|
+
reveal_status: optionalString(input.revealStatus),
|
|
31
|
+
sort: optionalString(input.sort),
|
|
32
|
+
order: optionalString(input.order),
|
|
33
|
+
page: optionalInteger(input.page),
|
|
34
|
+
limit: optionalInteger(input.limit),
|
|
35
|
+
cursor: optionalString(input.cursor),
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
get_company(input, context) {
|
|
40
|
+
return requestIndexed({
|
|
41
|
+
context,
|
|
42
|
+
path: `/companies/${encodePathSegment(requiredInputString(input.slug, "slug"))}`,
|
|
43
|
+
query: { depth: optionalString(input.depth) },
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Validate a key with GET /usage, which the API documents as free of credit charges.
|
|
49
|
+
*/
|
|
50
|
+
export async function validateIndexedCredential(input, options) {
|
|
51
|
+
const payload = await requestIndexed({
|
|
52
|
+
context: { apiKey: input.apiKey, fetcher: options.fetcher, signal: options.signal },
|
|
53
|
+
path: "/usage",
|
|
54
|
+
phase: "validate",
|
|
55
|
+
});
|
|
56
|
+
const usage = optionalRecord(payload.data);
|
|
57
|
+
const tier = optionalString(usage?.tier);
|
|
58
|
+
return {
|
|
59
|
+
profile: {
|
|
60
|
+
accountId: "indexed",
|
|
61
|
+
displayName: tier ? `Indexed API Key (${tier} plan)` : "Indexed API Key",
|
|
62
|
+
},
|
|
63
|
+
grantedScopes: [],
|
|
64
|
+
metadata: compactObject({
|
|
65
|
+
apiBaseUrl: indexedApiBaseUrl,
|
|
66
|
+
validationEndpoint: "/usage",
|
|
67
|
+
tier,
|
|
68
|
+
creditsRemaining: optionalInteger(usage?.credits_remaining),
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function joinList(value) {
|
|
73
|
+
return Array.isArray(value) && value.length > 0 ? value.join(",") : undefined;
|
|
74
|
+
}
|
|
75
|
+
async function requestIndexed(input) {
|
|
76
|
+
const { context } = input;
|
|
77
|
+
const url = new URL(`${indexedApiBaseUrl}${input.path}`);
|
|
78
|
+
for (const [key, value] of Object.entries(queryParams(input.query ?? {}))) {
|
|
79
|
+
url.searchParams.set(key, value);
|
|
80
|
+
}
|
|
81
|
+
return runProviderRequest({ signal: context.signal, label: "Indexed" }, async (signal) => {
|
|
82
|
+
const response = await context.fetcher(url, {
|
|
83
|
+
method: input.body ? "POST" : "GET",
|
|
84
|
+
headers: compactObject({
|
|
85
|
+
accept: "application/json",
|
|
86
|
+
"user-agent": providerUserAgent,
|
|
87
|
+
"x-api-key": context.apiKey,
|
|
88
|
+
"content-type": input.body ? "application/json" : undefined,
|
|
89
|
+
}),
|
|
90
|
+
body: input.body ? JSON.stringify(input.body) : undefined,
|
|
91
|
+
signal,
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw await readIndexedError(response, input.phase ?? "execute");
|
|
95
|
+
}
|
|
96
|
+
const payload = parseProviderJsonBodyText(await readProviderTextBody(response, "Indexed response"), {
|
|
97
|
+
emptyBody: {},
|
|
98
|
+
invalidJsonMessage: "Indexed returned malformed JSON",
|
|
99
|
+
});
|
|
100
|
+
return requiredResponseRecord(payload, "Indexed response");
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Read an Indexed error response and map it onto the runtime's status conventions.
|
|
105
|
+
* 402 is a billing state (credits exhausted), reported as insufficient_credit.
|
|
106
|
+
* 403 TIER_UPGRADE_REQUIRED is a plan limit rather than a credential failure, so
|
|
107
|
+
* it is reported as invalid input instead of prompting a reconnect. During key
|
|
108
|
+
* validation a 401 or 403 is a field error on the submitted key. Every other
|
|
109
|
+
* status keeps its upstream value, so a 404 stays a not-found result.
|
|
110
|
+
*/
|
|
111
|
+
export async function readIndexedError(response, phase = "execute") {
|
|
112
|
+
const status = response.status;
|
|
113
|
+
const payload = parseProviderJsonBodyText(await readProviderErrorTextBody(response, "Indexed error response"), {
|
|
114
|
+
emptyBody: {},
|
|
115
|
+
invalidJsonMessage: "Indexed returned malformed JSON",
|
|
116
|
+
invalidJsonFallback: () => ({}),
|
|
117
|
+
});
|
|
118
|
+
const body = optionalRecord(payload);
|
|
119
|
+
const message = optionalString(body?.error) ?? `Indexed request failed with HTTP ${status}`;
|
|
120
|
+
const details = withRetryAfterSeconds(response, payload);
|
|
121
|
+
if (status === 402) {
|
|
122
|
+
return new ProviderRequestError(402, message, details, "insufficient_credit");
|
|
123
|
+
}
|
|
124
|
+
if ((status === 401 || status === 403) &&
|
|
125
|
+
(phase === "validate" || optionalString(body?.code) === "TIER_UPGRADE_REQUIRED")) {
|
|
126
|
+
return new ProviderRequestError(400, message, details);
|
|
127
|
+
}
|
|
128
|
+
return new ProviderRequestError(status, message, details);
|
|
129
|
+
}
|
|
@@ -10,7 +10,7 @@ async function execute(input, context, name, path) {
|
|
|
10
10
|
url.searchParams.set("urlName", String(input.urlName));
|
|
11
11
|
const response = await context.fetcher(url, {
|
|
12
12
|
headers: { accept: "application/json", "user-agent": providerUserAgent },
|
|
13
|
-
redirect: "
|
|
13
|
+
redirect: "manual",
|
|
14
14
|
});
|
|
15
15
|
const payload = await response.json().catch(() => null);
|
|
16
16
|
if (!response.ok)
|
|
@@ -31,7 +31,7 @@ export const proxy = defineProviderProxy({
|
|
|
31
31
|
baseUrl: endpoint,
|
|
32
32
|
auth: { type: "api_key_query", name: "apiKey" },
|
|
33
33
|
skipDnsValidation: true,
|
|
34
|
-
redirect: "
|
|
34
|
+
redirect: "manual",
|
|
35
35
|
allowedEndpoint(value) {
|
|
36
36
|
const url = new URL(value, endpoint);
|
|
37
37
|
return url.origin === "https://data-api.investoday.net" && url.pathname === "/data/mcp";
|
|
@@ -62,7 +62,7 @@ function connectionInput(key, fetcher, signal) {
|
|
|
62
62
|
service: "Investoday",
|
|
63
63
|
fetcher: createInvestodayFetch(fetcher, key),
|
|
64
64
|
signal,
|
|
65
|
-
redirect: "
|
|
65
|
+
redirect: "manual",
|
|
66
66
|
terminateSession: true,
|
|
67
67
|
};
|
|
68
68
|
}
|
|
@@ -55,7 +55,7 @@ async function jsonRequest(credentials, fetcher, path, body, token, parentSignal
|
|
|
55
55
|
headers: buildIyunbiaoHeaders(credentials, token),
|
|
56
56
|
body,
|
|
57
57
|
signal,
|
|
58
|
-
redirect: "
|
|
58
|
+
redirect: "manual",
|
|
59
59
|
});
|
|
60
60
|
return readJson(response);
|
|
61
61
|
});
|
|
@@ -185,7 +185,7 @@ export async function executeIyunbiaoAction(name, input, values, options) {
|
|
|
185
185
|
const response = await session.fetcher(`${session.credentials.baseUrl}/${template}/${name === "download_cloud_file" ? `fileBox/${cloudId}` : `file/${input.fileId}`}`, {
|
|
186
186
|
headers: buildIyunbiaoHeaders(session.credentials, session.token),
|
|
187
187
|
signal,
|
|
188
|
-
redirect: "
|
|
188
|
+
redirect: "manual",
|
|
189
189
|
});
|
|
190
190
|
if (!response.ok)
|
|
191
191
|
await readJson(response);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ActionDefinition } from "../../core/types.ts";
|
|
2
2
|
export declare const keepaMarketplaces: readonly ["US", "GB", "DE", "FR", "JP", "CA", "IT", "ES", "IN", "MX", "BR"];
|
|
3
3
|
export declare const keepaHistoryTypes: readonly ["AMAZON", "NEW", "USED", "SALES", "LISTPRICE", "COLLECTIBLE", "REFURBISHED", "NEW_FBM_SHIPPING", "LIGHTNING_DEAL", "WAREHOUSE", "NEW_FBA", "COUNT_NEW", "COUNT_USED", "COUNT_REFURBISHED", "COUNT_COLLECTIBLE", "EXTRA_INFO_UPDATES", "RATING", "COUNT_REVIEWS", "BUY_BOX_SHIPPING", "USED_NEW_SHIPPING", "USED_VERY_GOOD_SHIPPING", "USED_GOOD_SHIPPING", "USED_ACCEPTABLE_SHIPPING", "COLLECTIBLE_NEW_SHIPPING", "COLLECTIBLE_VERY_GOOD_SHIPPING", "COLLECTIBLE_GOOD_SHIPPING", "COLLECTIBLE_ACCEPTABLE_SHIPPING", "REFURBISHED_SHIPPING", "EBAY_NEW_SHIPPING", "EBAY_USED_SHIPPING", "TRADE_IN", "RENT", "BUY_BOX_USED_SHIPPING", "PRIME_EXCL", "COUNT_NEW_FBA", "COUNT_NEW_FBM"];
|
|
4
|
-
export declare const keepaDealPriceTypes: readonly ["AMAZON", "NEW", "USED", "SALES", "COLLECTIBLE", "REFURBISHED", "NEW_FBM_SHIPPING", "LIGHTNING_DEAL", "WAREHOUSE", "NEW_FBA", "USED_NEW_SHIPPING", "USED_VERY_GOOD_SHIPPING", "USED_GOOD_SHIPPING", "USED_ACCEPTABLE_SHIPPING", "
|
|
4
|
+
export declare const keepaDealPriceTypes: readonly ["AMAZON", "NEW", "USED", "SALES", "COLLECTIBLE", "REFURBISHED", "NEW_FBM_SHIPPING", "LIGHTNING_DEAL", "WAREHOUSE", "NEW_FBA", "BUY_BOX_SHIPPING", "USED_NEW_SHIPPING", "USED_VERY_GOOD_SHIPPING", "USED_GOOD_SHIPPING", "USED_ACCEPTABLE_SHIPPING", "REFURBISHED_SHIPPING", "BUY_BOX_USED_SHIPPING", "PRIME_EXCL"];
|
|
5
5
|
export declare const keepaActions: ActionDefinition[];
|