@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,24 @@
|
|
|
1
|
+
import { defineOAuthProviderExecutors, defineProviderProxy } from "../provider-runtime.js";
|
|
2
|
+
import { futunnActions } from "./actions.js";
|
|
3
|
+
import { executeFutunnAction } from "./runtime.js";
|
|
4
|
+
import { futunnApiBaseUrl } from "./transport.js";
|
|
5
|
+
const service = "futunn";
|
|
6
|
+
function createHandler(actionName) {
|
|
7
|
+
return (input, context) => executeFutunnAction({
|
|
8
|
+
actionName,
|
|
9
|
+
input,
|
|
10
|
+
accessToken: context.accessToken,
|
|
11
|
+
signal: context.signal,
|
|
12
|
+
}, context.fetcher);
|
|
13
|
+
}
|
|
14
|
+
const handlers = Object.fromEntries(futunnActions.map((action) => [action.name, createHandler(action.name)]));
|
|
15
|
+
export const executors = defineOAuthProviderExecutors(service, handlers);
|
|
16
|
+
export const proxy = defineProviderProxy({
|
|
17
|
+
service,
|
|
18
|
+
baseUrl: futunnApiBaseUrl,
|
|
19
|
+
auth: { type: "oauth_bearer" },
|
|
20
|
+
skipDnsValidation: true,
|
|
21
|
+
customizeRequest({ headers }) {
|
|
22
|
+
headers.set("accept", "application/json");
|
|
23
|
+
},
|
|
24
|
+
});
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { optionalNumber, optionalRecord } from "../../core/cast.js";
|
|
2
|
+
import { ProviderRequestError, requiredInputString, requiredResponseRecord } from "../provider-runtime.js";
|
|
3
|
+
import { futunnResearchActions } from "./actions.research.js";
|
|
4
|
+
import { readFutunnData, readFutunnList, requestFutunn } from "./transport.js";
|
|
5
|
+
const researchNames = new Set(futunnResearchActions.map((action) => action.name));
|
|
6
|
+
export function isFutunnResearchAction(name) {
|
|
7
|
+
return researchNames.has(name);
|
|
8
|
+
}
|
|
9
|
+
export async function executeFutunnResearchAction(input, fetcher) {
|
|
10
|
+
const v = input.input;
|
|
11
|
+
const request = (path, query, body, allowNoData = false) => requestFutunn(input, fetcher, path, query, body, allowNoData);
|
|
12
|
+
const securityPath = (suffix) => `/api/v1.0/quote/${encodeURIComponent(requiredInputString(v.symbol, "symbol"))}/${suffix}`;
|
|
13
|
+
switch (input.actionName) {
|
|
14
|
+
case "search_news":
|
|
15
|
+
case "search_community": {
|
|
16
|
+
const news = input.actionName === "search_news";
|
|
17
|
+
const envelope = await request(`/api/v1.0/quote/${news ? "find-news" : "find-community"}`, {
|
|
18
|
+
symbol: v.keyword,
|
|
19
|
+
size: v.size,
|
|
20
|
+
[news ? "news_type" : "community_type"]: v.type,
|
|
21
|
+
sort_type: v.sortType,
|
|
22
|
+
lang: v.language,
|
|
23
|
+
});
|
|
24
|
+
return { items: readFutunnList(readFutunnData(envelope), "search results") };
|
|
25
|
+
}
|
|
26
|
+
case "get_security_info": {
|
|
27
|
+
const data = requiredResponseRecord(readFutunnData(await request("/api/v1.0/quote/stock-basicinfo", {}, { code_list: v.symbols })), "Futunn security info");
|
|
28
|
+
return { securities: readFutunnList(data.basic_list, "basic_list") };
|
|
29
|
+
}
|
|
30
|
+
case "get_market_state": {
|
|
31
|
+
const data = requiredResponseRecord(readFutunnData(await request("/api/v1.0/quote/market-state", {}, {
|
|
32
|
+
code_list: v.symbols,
|
|
33
|
+
is_contain_ba: v.includePreAfterMarket,
|
|
34
|
+
is_contain_overnight: v.includeOvernight,
|
|
35
|
+
is_need_crypto_multi_broker: v.includeCryptoBrokers,
|
|
36
|
+
})), "Futunn market state");
|
|
37
|
+
return { states: readFutunnList(data.market_state_list, "market_state_list") };
|
|
38
|
+
}
|
|
39
|
+
case "screen_stocks": {
|
|
40
|
+
const envelope = await request("/api/v1.0/quote/stock-screen", {}, {
|
|
41
|
+
screen_queries: v.screenQueries,
|
|
42
|
+
retrieve_queries: v.retrieveQueries,
|
|
43
|
+
sort: v.sort,
|
|
44
|
+
sorts: v.sorts,
|
|
45
|
+
next_key: v.nextKey,
|
|
46
|
+
limit: v.limit,
|
|
47
|
+
watchlist_stock_ids: v.watchlistStockIds,
|
|
48
|
+
holding_stock_ids: v.holdingStockIds,
|
|
49
|
+
user_stock_list_mode: v.userStockListMode,
|
|
50
|
+
});
|
|
51
|
+
const data = requiredResponseRecord(readFutunnData(envelope), "Futunn screening data");
|
|
52
|
+
return {
|
|
53
|
+
items: readFutunnList(data.items, "screening items"),
|
|
54
|
+
pagination: optionalRecord(envelope.pagination) ?? null,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
case "get_financial_statements": {
|
|
58
|
+
const envelope = await request(securityPath("financials/statements"), {
|
|
59
|
+
statement_type: v.statementType,
|
|
60
|
+
financial_type: v.financialType,
|
|
61
|
+
currency_code: v.currencyCode,
|
|
62
|
+
next_key: v.nextKey,
|
|
63
|
+
limit: v.limit,
|
|
64
|
+
}, undefined, true);
|
|
65
|
+
const noData = envelope.ret_code === -10;
|
|
66
|
+
const data = noData ? null : requiredResponseRecord(readFutunnData(envelope), "Futunn financial statements");
|
|
67
|
+
return {
|
|
68
|
+
reports: data === null ? [] : readFutunnList(data.report_list, "report_list"),
|
|
69
|
+
pagination: optionalRecord(envelope.pagination) ?? null,
|
|
70
|
+
noData,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
case "get_revenue_breakdown": {
|
|
74
|
+
const envelope = await request(securityPath("financials/revenue-breakdown"), { date: v.date, financial_type: v.financialType, currency_code: v.currencyCode }, undefined, true);
|
|
75
|
+
const noData = envelope.ret_code === -10;
|
|
76
|
+
return {
|
|
77
|
+
revenue: noData ? null : requiredResponseRecord(readFutunnData(envelope), "Futunn revenue breakdown"),
|
|
78
|
+
noData,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
case "get_operational_efficiency": {
|
|
82
|
+
const envelope = await request(securityPath("company/operational-efficiency"), {
|
|
83
|
+
limit: v.limit,
|
|
84
|
+
financial_type: v.financialType,
|
|
85
|
+
currency_code: v.currencyCode,
|
|
86
|
+
next_key: v.nextKey,
|
|
87
|
+
}, undefined, true);
|
|
88
|
+
const noData = envelope.ret_code === -10;
|
|
89
|
+
return {
|
|
90
|
+
efficiency: noData ? null : requiredResponseRecord(readFutunnData(envelope), "Futunn operational efficiency"),
|
|
91
|
+
pagination: optionalRecord(envelope.pagination) ?? null,
|
|
92
|
+
noData,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
case "get_valuation":
|
|
96
|
+
return {
|
|
97
|
+
valuation: requiredResponseRecord(readFutunnData(await request(securityPath("valuation/detail"), {
|
|
98
|
+
valuation_type: v.valuationType,
|
|
99
|
+
interval_type: v.intervalType,
|
|
100
|
+
})), "Futunn valuation"),
|
|
101
|
+
};
|
|
102
|
+
case "get_capital_flow": {
|
|
103
|
+
const data = requiredResponseRecord(readFutunnData(await request(securityPath("capital-flow"), { section: v.section })), "Futunn capital flow");
|
|
104
|
+
return {
|
|
105
|
+
flows: readFutunnList(data.flow_list, "flow_list"),
|
|
106
|
+
lastValidTime: optionalNumber(data.last_valid_time) ?? null,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
case "get_capital_flow_history": {
|
|
110
|
+
const envelope = await request(securityPath("capital-flow/history"), {
|
|
111
|
+
period_type: v.periodType,
|
|
112
|
+
start: v.start,
|
|
113
|
+
end: v.end,
|
|
114
|
+
count: v.count,
|
|
115
|
+
});
|
|
116
|
+
const data = requiredResponseRecord(readFutunnData(envelope), "Futunn capital flow history");
|
|
117
|
+
return {
|
|
118
|
+
flows: readFutunnList(data.flow_list, "flow_list"),
|
|
119
|
+
pagination: optionalRecord(envelope.pagination) ?? null,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
case "get_capital_distribution": {
|
|
123
|
+
const envelope = await request(securityPath("capital-distribution"), {}, undefined, true);
|
|
124
|
+
const noData = envelope.ret_code === -10;
|
|
125
|
+
return {
|
|
126
|
+
distribution: noData ? null : requiredResponseRecord(readFutunnData(envelope), "Futunn capital distribution"),
|
|
127
|
+
noData,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
default:
|
|
131
|
+
throw new ProviderRequestError(400, `Unknown Futunn research action: ${input.actionName}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { optionalBoolean, optionalString } from "../../core/cast.js";
|
|
2
|
+
import { ProviderRequestError, requiredInputString, requiredResponseRecord } from "../provider-runtime.js";
|
|
3
|
+
import { futunnTradingActions } from "./actions.trading.js";
|
|
4
|
+
import { readFutunnData, readFutunnList, requestFutunn } from "./transport.js";
|
|
5
|
+
const tradingNames = new Set(futunnTradingActions.map((action) => action.name));
|
|
6
|
+
export function isFutunnTradingAction(name) {
|
|
7
|
+
return tradingNames.has(name);
|
|
8
|
+
}
|
|
9
|
+
const listEndpoints = {
|
|
10
|
+
list_open_orders: { path: "orders", field: "orders", history: false },
|
|
11
|
+
list_history_orders: { path: "orders_history", field: "orders", history: true },
|
|
12
|
+
list_today_deals: { path: "order_fills", field: "order_fills", history: false },
|
|
13
|
+
list_history_deals: { path: "fills_history", field: "order_fills", history: true },
|
|
14
|
+
};
|
|
15
|
+
export async function executeFutunnTradingAction(input, fetcher) {
|
|
16
|
+
const v = input.input;
|
|
17
|
+
const path = `/api/v1.0/accounts/${encodeURIComponent(requiredInputString(v.accountId, "accountId"))}`;
|
|
18
|
+
if (input.actionName === "get_order_details") {
|
|
19
|
+
const envelope = await requestFutunn(input, fetcher, `${path}/orders/detail`, {}, { exchange: v.exchange, order_ids: v.orderIds });
|
|
20
|
+
return { orders: readFutunnList(readFutunnData(envelope), "order details") };
|
|
21
|
+
}
|
|
22
|
+
const endpoint = listEndpoints[input.actionName];
|
|
23
|
+
if (!endpoint)
|
|
24
|
+
throw new ProviderRequestError(400, `Unknown Futunn trading action: ${input.actionName}`);
|
|
25
|
+
const envelope = await requestFutunn(input, fetcher, `${path}/${endpoint.path}`, {
|
|
26
|
+
trd_market: v.market,
|
|
27
|
+
page_flag: v.pageFlag ?? "",
|
|
28
|
+
page_size: v.pageSize,
|
|
29
|
+
code: endpoint.history ? v.code : undefined,
|
|
30
|
+
start: endpoint.history ? v.start : undefined,
|
|
31
|
+
end: endpoint.history ? v.end : undefined,
|
|
32
|
+
});
|
|
33
|
+
const data = requiredResponseRecord(readFutunnData(envelope), "Futunn account records");
|
|
34
|
+
return {
|
|
35
|
+
[endpoint.field === "orders" ? "orders" : "deals"]: readFutunnList(data[endpoint.field], endpoint.field),
|
|
36
|
+
pageFlag: optionalString(data.page_flag) ?? null,
|
|
37
|
+
completed: optionalBoolean(data.completed) ?? null,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { optionalNumber } from "../../core/cast.js";
|
|
2
|
+
import { requiredInputString, requiredResponseRecord } from "../provider-runtime.js";
|
|
3
|
+
import { executeFutunnResearchAction, isFutunnResearchAction } from "./runtime-research.js";
|
|
4
|
+
import { executeFutunnTradingAction, isFutunnTradingAction } from "./runtime-trading.js";
|
|
5
|
+
import { readFutunnData, readFutunnList, requestFutunn } from "./transport.js";
|
|
6
|
+
export async function executeFutunnAction(input, fetcher) {
|
|
7
|
+
const values = input.input;
|
|
8
|
+
const request = (path, query, body) => requestFutunn(input, fetcher, path, query, body).then(readFutunnData);
|
|
9
|
+
if (isFutunnResearchAction(input.actionName))
|
|
10
|
+
return executeFutunnResearchAction(input, fetcher);
|
|
11
|
+
if (isFutunnTradingAction(input.actionName))
|
|
12
|
+
return executeFutunnTradingAction(input, fetcher);
|
|
13
|
+
switch (input.actionName) {
|
|
14
|
+
case "get_market_snapshot": {
|
|
15
|
+
const data = requiredResponseRecord(await request("/api/v1.0/quote/snapshot", {}, { code_list: values.symbols }), "Futunn snapshot data");
|
|
16
|
+
return { snapshots: readFutunnList(data.snapshot_list, "snapshot_list") };
|
|
17
|
+
}
|
|
18
|
+
case "get_history_kline": {
|
|
19
|
+
const data = requiredResponseRecord(await request(`/api/v1.0/quote/${encodeURIComponent(requiredInputString(values.symbol, "symbol"))}/history-kline`, {
|
|
20
|
+
start: values.start,
|
|
21
|
+
end: values.end,
|
|
22
|
+
ktype: values.ktype,
|
|
23
|
+
autype: values.autype,
|
|
24
|
+
num: values.num,
|
|
25
|
+
extended_time: values.extendedTime,
|
|
26
|
+
}), "Futunn history data");
|
|
27
|
+
return {
|
|
28
|
+
bars: readFutunnList(data.kline_list, "kline_list"),
|
|
29
|
+
nextTime: optionalNumber(data.next_time) ?? null,
|
|
30
|
+
volumePrecision: optionalNumber(data.volume_precision) ?? null,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
case "list_trading_days": {
|
|
34
|
+
const data = requiredResponseRecord(await request("/api/v1.0/quote/trading-days", values), "Futunn calendar data");
|
|
35
|
+
return { tradingDays: readFutunnList(data.trading_days, "trading_days") };
|
|
36
|
+
}
|
|
37
|
+
case "list_accounts": {
|
|
38
|
+
const data = requiredResponseRecord(await request("/api/v1.0/accounts/authorized_trd_accs"), "Futunn account data");
|
|
39
|
+
return { accounts: readFutunnList(data.accounts, "accounts") };
|
|
40
|
+
}
|
|
41
|
+
case "get_account_funds":
|
|
42
|
+
return {
|
|
43
|
+
funds: requiredResponseRecord(await request(`/api/v1.0/accounts/${encodeURIComponent(requiredInputString(values.accountId, "accountId"))}/funds`, { currency: values.currency }), "Futunn funds"),
|
|
44
|
+
};
|
|
45
|
+
case "list_positions":
|
|
46
|
+
return {
|
|
47
|
+
positions: readFutunnList(await request(`/api/v1.0/accounts/${encodeURIComponent(requiredInputString(values.accountId, "accountId"))}/positions`, { code: values.code, pl_ratio_min: values.plRatioMin, pl_ratio_max: values.plRatioMax }), "positions"),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface FutunnActionInput {
|
|
2
|
+
actionName: string;
|
|
3
|
+
input: Record<string, unknown>;
|
|
4
|
+
accessToken: string;
|
|
5
|
+
signal?: AbortSignal;
|
|
6
|
+
}
|
|
7
|
+
export declare const futunnApiBaseUrl = "https://webapi.futunn.com";
|
|
8
|
+
export declare function readFutunnResponse(response: Response, allowNoData?: boolean): Promise<Record<string, unknown>>;
|
|
9
|
+
export declare function requestFutunn(input: FutunnActionInput, fetcher: typeof fetch, path: string, query?: Record<string, unknown>, body?: unknown, allowNoData?: boolean): Promise<Record<string, unknown>>;
|
|
10
|
+
export declare function readFutunnList(value: unknown, label: string): unknown[];
|
|
11
|
+
export declare function readFutunnData(envelope: Record<string, unknown>): unknown;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { optionalRecord, optionalString } from "../../core/cast.js";
|
|
2
|
+
import { ProviderRequestError, providerUserAgent, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
|
|
3
|
+
export const futunnApiBaseUrl = "https://webapi.futunn.com";
|
|
4
|
+
export async function readFutunnResponse(response, allowNoData = false) {
|
|
5
|
+
let payload;
|
|
6
|
+
try {
|
|
7
|
+
payload = JSON.parse(await response.text(), (key, value, context) => {
|
|
8
|
+
// Preserve the source decimal text of uint64 trading account IDs during JSON parsing.
|
|
9
|
+
if (key !== "account_id" || typeof value !== "number")
|
|
10
|
+
return value;
|
|
11
|
+
if (!Number.isInteger(value))
|
|
12
|
+
throw new Error("Invalid Futunn account ID");
|
|
13
|
+
if (Number.isSafeInteger(value))
|
|
14
|
+
return String(value);
|
|
15
|
+
if (!context?.source)
|
|
16
|
+
throw new Error("Futunn account ID source is unavailable");
|
|
17
|
+
return BigInt(context.source).toString();
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new ProviderRequestError(response.ok ? 502 : response.status, "Futunn returned invalid JSON");
|
|
22
|
+
}
|
|
23
|
+
const envelope = requiredResponseRecord(payload, "Futunn response");
|
|
24
|
+
if (response.ok && allowNoData && envelope.ret_code === -10)
|
|
25
|
+
return envelope;
|
|
26
|
+
const error = optionalRecord(envelope.error);
|
|
27
|
+
if (!response.ok ||
|
|
28
|
+
envelope.s === "error" ||
|
|
29
|
+
(envelope.ret_code !== undefined && envelope.ret_code !== 0) ||
|
|
30
|
+
envelope.error) {
|
|
31
|
+
const message = optionalString(envelope.errmsg) ??
|
|
32
|
+
optionalString(envelope.ret_msg) ??
|
|
33
|
+
optionalString(envelope.error_description) ??
|
|
34
|
+
optionalString(error?.message) ??
|
|
35
|
+
optionalString(envelope.error) ??
|
|
36
|
+
"request failed";
|
|
37
|
+
const code = envelope.errcode ?? envelope.ret_code ?? error?.code;
|
|
38
|
+
throw new ProviderRequestError(response.ok ? 502 : response.status, `Futunn${code === undefined ? "" : ` (${String(code)})`}: ${message}`);
|
|
39
|
+
}
|
|
40
|
+
return envelope;
|
|
41
|
+
}
|
|
42
|
+
export async function requestFutunn(input, fetcher, path, query = {}, body, allowNoData = false) {
|
|
43
|
+
const url = new URL(path, futunnApiBaseUrl);
|
|
44
|
+
for (const [key, value] of Object.entries(query)) {
|
|
45
|
+
if (value !== undefined)
|
|
46
|
+
url.searchParams.set(key, String(value));
|
|
47
|
+
}
|
|
48
|
+
return runProviderRequest({ label: "Futunn", signal: input.signal }, async (signal) => {
|
|
49
|
+
const response = await fetcher(url, {
|
|
50
|
+
method: body === undefined ? "GET" : "POST",
|
|
51
|
+
headers: {
|
|
52
|
+
authorization: `Bearer ${input.accessToken}`,
|
|
53
|
+
accept: "application/json",
|
|
54
|
+
"content-type": "application/json",
|
|
55
|
+
"user-agent": providerUserAgent,
|
|
56
|
+
},
|
|
57
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
58
|
+
signal,
|
|
59
|
+
redirect: "manual",
|
|
60
|
+
});
|
|
61
|
+
const envelope = await readFutunnResponse(response, allowNoData);
|
|
62
|
+
if (envelope.s === "ok" || envelope.ret_code === 0 || (allowNoData && envelope.ret_code === -10))
|
|
63
|
+
return envelope;
|
|
64
|
+
throw new ProviderRequestError(502, "Futunn response is missing its success envelope");
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function readFutunnList(value, label) {
|
|
68
|
+
if (!Array.isArray(value))
|
|
69
|
+
throw new ProviderRequestError(502, `Futunn ${label} must be an array`);
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
export function readFutunnData(envelope) {
|
|
73
|
+
if (envelope.ret_code === -10)
|
|
74
|
+
return null;
|
|
75
|
+
return envelope.s === "ok" ? envelope.d : envelope.data;
|
|
76
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
|
|
2
|
+
import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
|
|
3
|
+
import type { PollDefinition } from "../../triggers/common/poll.ts";
|
|
2
4
|
export declare const executors: ProviderExecutors;
|
|
3
5
|
export declare const proxy: ProviderProxyExecutor;
|
|
4
6
|
export declare const credentialValidators: CredentialValidators;
|
|
7
|
+
export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
|
|
@@ -6,6 +6,8 @@ import { releaseActionHandlers } from "./runtime-release.js";
|
|
|
6
6
|
import { repositoryActionHandlers } from "./runtime-repository.js";
|
|
7
7
|
import { searchActionHandlers } from "./runtime-search.js";
|
|
8
8
|
import { githubApiBaseUrl, githubApiVersion, githubDefaultAcceptHeader, githubRequestJson } from "./runtime-shared.js";
|
|
9
|
+
import { githubRepoEvent } from "./trigger-on-repo-event.js";
|
|
10
|
+
import { githubPullRequestListener } from "./trigger-watch-pull-request.js";
|
|
9
11
|
const service = "github";
|
|
10
12
|
export const executors = defineProviderExecutors({
|
|
11
13
|
service,
|
|
@@ -57,3 +59,7 @@ async function validateGitHubToken(accessToken, fetcher) {
|
|
|
57
59
|
},
|
|
58
60
|
};
|
|
59
61
|
}
|
|
62
|
+
export const triggers = [
|
|
63
|
+
githubRepoEvent,
|
|
64
|
+
githubPullRequestListener,
|
|
65
|
+
];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsonSchema as s } from "../../core/json-schema.js";
|
|
2
|
+
const events = [
|
|
3
|
+
"*",
|
|
4
|
+
"branch_protection_configuration",
|
|
5
|
+
"branch_protection_rule",
|
|
6
|
+
"check_run",
|
|
7
|
+
"check_suite",
|
|
8
|
+
"code_scanning_alert",
|
|
9
|
+
"commit_comment",
|
|
10
|
+
"create",
|
|
11
|
+
"custom_property_values",
|
|
12
|
+
"delete",
|
|
13
|
+
"dependabot_alert",
|
|
14
|
+
"deploy_key",
|
|
15
|
+
"deployment",
|
|
16
|
+
"deployment_status",
|
|
17
|
+
"discussion",
|
|
18
|
+
"discussion_comment",
|
|
19
|
+
"fork",
|
|
20
|
+
"gollum",
|
|
21
|
+
"issue_comment",
|
|
22
|
+
"issue_dependencies",
|
|
23
|
+
"issues",
|
|
24
|
+
"label",
|
|
25
|
+
"member",
|
|
26
|
+
"meta",
|
|
27
|
+
"milestone",
|
|
28
|
+
"package",
|
|
29
|
+
"page_build",
|
|
30
|
+
"project",
|
|
31
|
+
"project_card",
|
|
32
|
+
"project_column",
|
|
33
|
+
"public",
|
|
34
|
+
"pull_request",
|
|
35
|
+
"pull_request_review",
|
|
36
|
+
"pull_request_review_comment",
|
|
37
|
+
"pull_request_review_thread",
|
|
38
|
+
"push",
|
|
39
|
+
"registry_package",
|
|
40
|
+
"release",
|
|
41
|
+
"repository",
|
|
42
|
+
"repository_advisory",
|
|
43
|
+
"repository_import",
|
|
44
|
+
"repository_ruleset",
|
|
45
|
+
"repository_vulnerability_alert",
|
|
46
|
+
"secret_scanning_alert",
|
|
47
|
+
"secret_scanning_alert_location",
|
|
48
|
+
"secret_scanning_scan",
|
|
49
|
+
"security_and_analysis",
|
|
50
|
+
"star",
|
|
51
|
+
"status",
|
|
52
|
+
"sub_issues",
|
|
53
|
+
"team_add",
|
|
54
|
+
"watch",
|
|
55
|
+
"workflow_job",
|
|
56
|
+
"workflow_run",
|
|
57
|
+
];
|
|
58
|
+
export const snapshot = {
|
|
59
|
+
configInputs: [
|
|
60
|
+
{
|
|
61
|
+
handle: "events",
|
|
62
|
+
jsonSchema: s.array(s.stringEnum(events), { minItems: 1, uniqueItems: true }),
|
|
63
|
+
nullable: false,
|
|
64
|
+
},
|
|
65
|
+
{ handle: "insecureSsl", jsonSchema: s.boolean(), nullable: false, value: false },
|
|
66
|
+
{
|
|
67
|
+
handle: "owner",
|
|
68
|
+
jsonSchema: s.string({ pattern: "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$" }),
|
|
69
|
+
nullable: false,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
handle: "repo",
|
|
73
|
+
jsonSchema: s.string({ pattern: "^(?!\\.{1,2}$)[a-zA-Z0-9._-]{1,100}$" }),
|
|
74
|
+
nullable: false,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
definitionVersion: 2,
|
|
78
|
+
description: "Triggers when selected GitHub webhook events occur in a repository.",
|
|
79
|
+
displayName: "Repository Event",
|
|
80
|
+
endpoint: {
|
|
81
|
+
body: { allowArray: false, allowEmpty: false, formats: ["json"] },
|
|
82
|
+
methods: ["POST"],
|
|
83
|
+
successStatus: 202,
|
|
84
|
+
},
|
|
85
|
+
key: "github.on_repo_event",
|
|
86
|
+
name: "on_repo_event",
|
|
87
|
+
outputs: [
|
|
88
|
+
{ handle: "body", jsonSchema: { type: "object" }, nullable: false },
|
|
89
|
+
{ handle: "deliveryId", jsonSchema: s.string(), nullable: false },
|
|
90
|
+
{ handle: "event", jsonSchema: s.string(), nullable: false },
|
|
91
|
+
],
|
|
92
|
+
provider: "github",
|
|
93
|
+
type: "integration",
|
|
94
|
+
};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
|
|
2
|
+
import { verifyHexHmac } from "../../triggers/signature.js";
|
|
3
|
+
import { snapshot } from "./trigger-on-repo-event.definition.js";
|
|
4
|
+
export const githubRepoEvent = {
|
|
5
|
+
initialState: { checkpoint: null, subscription: {} },
|
|
6
|
+
snapshot,
|
|
7
|
+
async receive(context) {
|
|
8
|
+
const signature = context.header("x-hub-signature-256");
|
|
9
|
+
if (!signature?.startsWith("sha256=") ||
|
|
10
|
+
!(await verifyHexHmac(context.callbackSecret, [context.rawBody], signature.slice(7)))) {
|
|
11
|
+
return { body: "", contentType: "text/plain", outcome: "respond", status: 404 };
|
|
12
|
+
}
|
|
13
|
+
const event = context.header("x-github-event")?.trim();
|
|
14
|
+
if (!event)
|
|
15
|
+
return { outcome: "ignored", reason: "GitHub event header is missing." };
|
|
16
|
+
if (event == "ping")
|
|
17
|
+
return { outcome: "ignored", reason: "GitHub ping handshake." };
|
|
18
|
+
const config = resolveConfig(context.config);
|
|
19
|
+
if (!config.events.includes("*") && !config.events.includes(event)) {
|
|
20
|
+
return { outcome: "ignored", reason: "GitHub event is not subscribed." };
|
|
21
|
+
}
|
|
22
|
+
const deliveryId = context.header("x-github-delivery") ?? "";
|
|
23
|
+
return {
|
|
24
|
+
dedupeKey: deliveryId.length == 0 ? undefined : deliveryId,
|
|
25
|
+
outcome: "event",
|
|
26
|
+
outputs: { body: context.payload, deliveryId, event },
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
async reconcile(context) {
|
|
30
|
+
const state = requireState(context.state);
|
|
31
|
+
const config = resolveConfig(context.config);
|
|
32
|
+
let hookId = subscriptionId(state);
|
|
33
|
+
if (!context.active) {
|
|
34
|
+
if (hookId == null)
|
|
35
|
+
hookId = await findByUrl(context, config);
|
|
36
|
+
if (hookId != null) {
|
|
37
|
+
const result = await request(context, "hook delete", {
|
|
38
|
+
endpoint: `${endpoint(config)}/${hookId}`,
|
|
39
|
+
method: "DELETE",
|
|
40
|
+
});
|
|
41
|
+
if (result.status != 404)
|
|
42
|
+
success(result, "hook delete");
|
|
43
|
+
}
|
|
44
|
+
await state.saveSubscription({}, later(context.now));
|
|
45
|
+
return { outcome: "ready" };
|
|
46
|
+
}
|
|
47
|
+
const desired = body(context.endpointUrl, context.callbackSecret, config);
|
|
48
|
+
if (hookId == null) {
|
|
49
|
+
const result = await request(context, "hook create", {
|
|
50
|
+
body: desired,
|
|
51
|
+
endpoint: endpoint(config),
|
|
52
|
+
method: "POST",
|
|
53
|
+
});
|
|
54
|
+
if (result.status == 201)
|
|
55
|
+
hookId = id(result.data);
|
|
56
|
+
else if (result.status == 422) {
|
|
57
|
+
hookId = await findByUrl(context, config);
|
|
58
|
+
if (hookId == null)
|
|
59
|
+
throw new PermanentIntegrationError("GitHub rejected the webhook configuration.");
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
success(result, "hook create");
|
|
63
|
+
throw new TransientIntegrationError(`GitHub hook create returned unexpected status ${result.status}.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await state.saveSubscription({ hookId }, context.now);
|
|
67
|
+
const aligned = await request(context, "hook update", {
|
|
68
|
+
body: desired,
|
|
69
|
+
endpoint: `${endpoint(config)}/${hookId}`,
|
|
70
|
+
method: "PATCH",
|
|
71
|
+
});
|
|
72
|
+
if (aligned.status == 404) {
|
|
73
|
+
await state.saveSubscription({}, context.now);
|
|
74
|
+
return { outcome: "pending" };
|
|
75
|
+
}
|
|
76
|
+
success(aligned, "hook update");
|
|
77
|
+
await state.saveSubscription({ hookId }, later(context.now));
|
|
78
|
+
return { outcome: "ready" };
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
function resolveConfig(value) {
|
|
82
|
+
return {
|
|
83
|
+
events: [...new Set(value.events)],
|
|
84
|
+
insecureSsl: value.insecureSsl,
|
|
85
|
+
owner: value.owner,
|
|
86
|
+
repo: value.repo,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function endpoint(config) {
|
|
90
|
+
return `/repos/${encodeURIComponent(config.owner)}/${encodeURIComponent(config.repo)}/hooks`;
|
|
91
|
+
}
|
|
92
|
+
function body(url, secret, config) {
|
|
93
|
+
return {
|
|
94
|
+
active: true,
|
|
95
|
+
config: { content_type: "json", insecure_ssl: config.insecureSsl ? "1" : "0", secret, url },
|
|
96
|
+
events: config.events,
|
|
97
|
+
name: "web",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async function findByUrl(context, config) {
|
|
101
|
+
for (let page = 1; page <= 10; page += 1) {
|
|
102
|
+
const result = await request(context, "hook list", {
|
|
103
|
+
endpoint: endpoint(config),
|
|
104
|
+
method: "GET",
|
|
105
|
+
query: { page, per_page: 100 },
|
|
106
|
+
});
|
|
107
|
+
if (result.status == 404)
|
|
108
|
+
return null;
|
|
109
|
+
success(result, "hook list");
|
|
110
|
+
const hooks = Array.isArray(result.data) ? result.data : [];
|
|
111
|
+
for (const hook of hooks) {
|
|
112
|
+
const value = record(hook);
|
|
113
|
+
if (record(value?.config)?.url === context.endpointUrl &&
|
|
114
|
+
(typeof value?.id == "number" || typeof value?.id == "string")) {
|
|
115
|
+
return String(value.id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (hooks.length < 100)
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
async function request(context, operation, value) {
|
|
124
|
+
try {
|
|
125
|
+
return await context.connector.execute(value, context.signal);
|
|
126
|
+
}
|
|
127
|
+
catch (cause) {
|
|
128
|
+
if (cause instanceof IntegrationConnectionError)
|
|
129
|
+
throw cause;
|
|
130
|
+
throw new TransientIntegrationError(`GitHub ${operation} request failed.`, { cause });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function success(result, operation) {
|
|
134
|
+
if (result.status >= 200 && result.status < 300)
|
|
135
|
+
return;
|
|
136
|
+
const message = record(result.data)?.message;
|
|
137
|
+
if (result.status == 403 && typeof message == "string" && /rate limit/i.test(message)) {
|
|
138
|
+
throw new TransientIntegrationError(`GitHub ${operation} was rate limited.`);
|
|
139
|
+
}
|
|
140
|
+
if ([401, 403].includes(result.status))
|
|
141
|
+
throw new IntegrationConnectionError(`GitHub ${operation} rejected the Connection.`);
|
|
142
|
+
if ([404, 422].includes(result.status))
|
|
143
|
+
throw new PermanentIntegrationError(`GitHub ${operation} rejected the subscription.`);
|
|
144
|
+
throw new TransientIntegrationError(`GitHub ${operation} failed with status ${result.status}.`);
|
|
145
|
+
}
|
|
146
|
+
function id(data) {
|
|
147
|
+
const value = record(data)?.id;
|
|
148
|
+
if (typeof value != "number" && typeof value != "string")
|
|
149
|
+
throw new TransientIntegrationError("GitHub hook response is missing its ID.");
|
|
150
|
+
return String(value);
|
|
151
|
+
}
|
|
152
|
+
function requireState(value) {
|
|
153
|
+
if (value == null)
|
|
154
|
+
throw new PermanentIntegrationError("GitHub Integration state is missing.");
|
|
155
|
+
return value;
|
|
156
|
+
}
|
|
157
|
+
function subscriptionId(state) {
|
|
158
|
+
const value = state.subscription.hookId;
|
|
159
|
+
return typeof value == "string" && value.length > 0 ? value : null;
|
|
160
|
+
}
|
|
161
|
+
function later(now) {
|
|
162
|
+
return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1_000);
|
|
163
|
+
}
|
|
164
|
+
function record(value) {
|
|
165
|
+
return value != null && typeof value == "object" && !Array.isArray(value)
|
|
166
|
+
? value
|
|
167
|
+
: undefined;
|
|
168
|
+
}
|