@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
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { compactObject, looseArray, optionalRawString, rawStringOrNull } from "../../core/cast.js";
|
|
1
|
+
import { compactObject, looseArray, optionalRawString, optionalStringArray, rawStringOrNull } from "../../core/cast.js";
|
|
2
2
|
import { ProviderRequestError } from "../provider-runtime.js";
|
|
3
|
-
import { sentryProviderScopes } from "./scopes.js";
|
|
4
3
|
export const sentryApiBaseUrl = "https://sentry.io/api/0/";
|
|
5
|
-
const sentryCurrentUserUrl = `${sentryApiBaseUrl}users/me/`;
|
|
6
4
|
export const sentryActionHandlers = {
|
|
7
5
|
list_organization_integrations(input, context) {
|
|
8
6
|
return sentryListOrganizationIntegrations(input, context.accessToken, context.fetcher);
|
|
@@ -63,8 +61,9 @@ export const sentryActionHandlers = {
|
|
|
63
61
|
},
|
|
64
62
|
};
|
|
65
63
|
export async function validateSentryCredential(accessToken, fetcher) {
|
|
66
|
-
const { payload } = await requestSentryJson(accessToken,
|
|
67
|
-
const
|
|
64
|
+
const { payload } = await requestSentryJson(accessToken, sentryApiBaseUrl, fetcher, {}, "validate");
|
|
65
|
+
const payloadRecord = asRecord(payload);
|
|
66
|
+
const user = asRecord(payloadRecord?.user);
|
|
68
67
|
if (!user) {
|
|
69
68
|
throw new ProviderRequestError(502, "sentry current user payload is invalid");
|
|
70
69
|
}
|
|
@@ -78,9 +77,9 @@ export async function validateSentryCredential(accessToken, fetcher) {
|
|
|
78
77
|
accountId: userId,
|
|
79
78
|
displayName,
|
|
80
79
|
},
|
|
81
|
-
grantedScopes:
|
|
80
|
+
grantedScopes: optionalStringArray(asRecord(payloadRecord?.auth)?.scopes) ?? [],
|
|
82
81
|
metadata: compactObject({
|
|
83
|
-
validationEndpoint: "/
|
|
82
|
+
validationEndpoint: "/",
|
|
84
83
|
userId,
|
|
85
84
|
username: optionalRawString(user.username),
|
|
86
85
|
email: optionalRawString(user.email),
|
|
@@ -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)[];
|
|
@@ -2,6 +2,7 @@ import { optionalRecord, optionalString } from "../../core/cast.js";
|
|
|
2
2
|
import { defineProviderExecutors, defineProviderProxy, ProviderRequestError } from "../provider-runtime.js";
|
|
3
3
|
import { buildShopifyRestApiBaseUrl, normalizeShopDomain, shopifyActionHandlers, validateShopifyCredential, } from "./runtime.js";
|
|
4
4
|
import { shopifyReadContentScope } from "./scopes.js";
|
|
5
|
+
import { shopifyShopEvent } from "./trigger-on-shop-event.js";
|
|
5
6
|
const service = "shopify";
|
|
6
7
|
export const executors = defineProviderExecutors({
|
|
7
8
|
service,
|
|
@@ -62,3 +63,4 @@ function parseShopifyScopes(value) {
|
|
|
62
63
|
.map((scope) => scope.trim())
|
|
63
64
|
.filter(Boolean);
|
|
64
65
|
}
|
|
66
|
+
export const triggers = [shopifyShopEvent];
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { jsonSchema as s } from "../../core/json-schema.js";
|
|
2
|
+
const topics = [
|
|
3
|
+
"app/scopes_update",
|
|
4
|
+
"app/uninstalled",
|
|
5
|
+
"app_purchases_one_time/update",
|
|
6
|
+
"app_subscriptions/approaching_capped_amount",
|
|
7
|
+
"app_subscriptions/update",
|
|
8
|
+
"bulk_operations/finish",
|
|
9
|
+
"carts/create",
|
|
10
|
+
"carts/update",
|
|
11
|
+
"channels/delete",
|
|
12
|
+
"checkout_and_accounts_configurations/update",
|
|
13
|
+
"checkouts/create",
|
|
14
|
+
"checkouts/delete",
|
|
15
|
+
"checkouts/update",
|
|
16
|
+
"collection_listings/add",
|
|
17
|
+
"collection_listings/remove",
|
|
18
|
+
"collection_listings/update",
|
|
19
|
+
"collection_publications/create",
|
|
20
|
+
"collection_publications/delete",
|
|
21
|
+
"collection_publications/update",
|
|
22
|
+
"collections/create",
|
|
23
|
+
"collections/delete",
|
|
24
|
+
"collections/update",
|
|
25
|
+
"companies/create",
|
|
26
|
+
"companies/delete",
|
|
27
|
+
"companies/update",
|
|
28
|
+
"company_contact_roles/assign",
|
|
29
|
+
"company_contact_roles/revoke",
|
|
30
|
+
"company_contacts/create",
|
|
31
|
+
"company_contacts/delete",
|
|
32
|
+
"company_contacts/update",
|
|
33
|
+
"company_locations/create",
|
|
34
|
+
"company_locations/delete",
|
|
35
|
+
"company_locations/update",
|
|
36
|
+
"customer.joined_segment",
|
|
37
|
+
"customer.left_segment",
|
|
38
|
+
"customer.tags_added",
|
|
39
|
+
"customer.tags_removed",
|
|
40
|
+
"customer_account_settings/update",
|
|
41
|
+
"customer_groups/create",
|
|
42
|
+
"customer_groups/delete",
|
|
43
|
+
"customer_groups/update",
|
|
44
|
+
"customers/create",
|
|
45
|
+
"customers/delete",
|
|
46
|
+
"customers/disable",
|
|
47
|
+
"customers/enable",
|
|
48
|
+
"customers/purchasing_summary",
|
|
49
|
+
"customers/update",
|
|
50
|
+
"customers_email_marketing_consent/update",
|
|
51
|
+
"customers_marketing_consent/update",
|
|
52
|
+
"delivery_promise_settings/update",
|
|
53
|
+
"disputes/create",
|
|
54
|
+
"disputes/update",
|
|
55
|
+
"domains/create",
|
|
56
|
+
"domains/destroy",
|
|
57
|
+
"domains/update",
|
|
58
|
+
"draft_orders/create",
|
|
59
|
+
"draft_orders/delete",
|
|
60
|
+
"draft_orders/update",
|
|
61
|
+
"fulfillment_events/create",
|
|
62
|
+
"fulfillment_events/delete",
|
|
63
|
+
"fulfillment_holds/added",
|
|
64
|
+
"fulfillment_holds/released",
|
|
65
|
+
"fulfillment_orders/cancellation_request_accepted",
|
|
66
|
+
"fulfillment_orders/cancellation_request_rejected",
|
|
67
|
+
"fulfillment_orders/cancellation_request_submitted",
|
|
68
|
+
"fulfillment_orders/cancelled",
|
|
69
|
+
"fulfillment_orders/fulfillment_request_accepted",
|
|
70
|
+
"fulfillment_orders/fulfillment_request_rejected",
|
|
71
|
+
"fulfillment_orders/fulfillment_request_submitted",
|
|
72
|
+
"fulfillment_orders/fulfillment_service_failed_to_complete",
|
|
73
|
+
"fulfillment_orders/hold_released",
|
|
74
|
+
"fulfillment_orders/line_items_prepared_for_local_delivery",
|
|
75
|
+
"fulfillment_orders/line_items_prepared_for_pickup",
|
|
76
|
+
"fulfillment_orders/manually_reported_progress_stopped",
|
|
77
|
+
"fulfillment_orders/merged",
|
|
78
|
+
"fulfillment_orders/moved",
|
|
79
|
+
"fulfillment_orders/order_routing_complete",
|
|
80
|
+
"fulfillment_orders/placed_on_hold",
|
|
81
|
+
"fulfillment_orders/progress_reported",
|
|
82
|
+
"fulfillment_orders/rescheduled",
|
|
83
|
+
"fulfillment_orders/scheduled_fulfillment_order_ready",
|
|
84
|
+
"fulfillment_orders/split",
|
|
85
|
+
"fulfillments/create",
|
|
86
|
+
"fulfillments/update",
|
|
87
|
+
"inventory_items/create",
|
|
88
|
+
"inventory_items/delete",
|
|
89
|
+
"inventory_items/update",
|
|
90
|
+
"inventory_levels/connect",
|
|
91
|
+
"inventory_levels/disconnect",
|
|
92
|
+
"inventory_levels/update",
|
|
93
|
+
"locales/create",
|
|
94
|
+
"locales/destroy",
|
|
95
|
+
"locales/update",
|
|
96
|
+
"locations/activate",
|
|
97
|
+
"locations/create",
|
|
98
|
+
"locations/deactivate",
|
|
99
|
+
"locations/delete",
|
|
100
|
+
"locations/update",
|
|
101
|
+
"machine_translation_batch/completed",
|
|
102
|
+
"metafield_definitions/create",
|
|
103
|
+
"metafield_definitions/delete",
|
|
104
|
+
"metafield_definitions/update",
|
|
105
|
+
"order_transactions/create",
|
|
106
|
+
"orders/cancelled",
|
|
107
|
+
"orders/create",
|
|
108
|
+
"orders/delete",
|
|
109
|
+
"orders/edited",
|
|
110
|
+
"orders/fulfilled",
|
|
111
|
+
"orders/link_requested",
|
|
112
|
+
"orders/paid",
|
|
113
|
+
"orders/partially_fulfilled",
|
|
114
|
+
"orders/risk_assessment_changed",
|
|
115
|
+
"orders/shopify_protect_eligibility_changed",
|
|
116
|
+
"orders/updated",
|
|
117
|
+
"payment_schedules/due",
|
|
118
|
+
"payment_terms/create",
|
|
119
|
+
"payment_terms/delete",
|
|
120
|
+
"payment_terms/update",
|
|
121
|
+
"product_feeds/create",
|
|
122
|
+
"product_feeds/full_sync",
|
|
123
|
+
"product_feeds/full_sync_finish",
|
|
124
|
+
"product_feeds/incremental_sync",
|
|
125
|
+
"product_feeds/update",
|
|
126
|
+
"product_listings/add",
|
|
127
|
+
"product_listings/remove",
|
|
128
|
+
"product_listings/update",
|
|
129
|
+
"product_publications/create",
|
|
130
|
+
"product_publications/delete",
|
|
131
|
+
"product_publications/update",
|
|
132
|
+
"products/create",
|
|
133
|
+
"products/delete",
|
|
134
|
+
"products/update",
|
|
135
|
+
"profiles/create",
|
|
136
|
+
"profiles/delete",
|
|
137
|
+
"profiles/update",
|
|
138
|
+
"publications/delete",
|
|
139
|
+
"refunds/create",
|
|
140
|
+
"returns/approve",
|
|
141
|
+
"returns/cancel",
|
|
142
|
+
"returns/close",
|
|
143
|
+
"returns/decline",
|
|
144
|
+
"returns/process",
|
|
145
|
+
"returns/reopen",
|
|
146
|
+
"returns/request",
|
|
147
|
+
"returns/update",
|
|
148
|
+
"reverse_deliveries/attach_deliverable",
|
|
149
|
+
"reverse_fulfillment_orders/dispose",
|
|
150
|
+
"scheduled_product_listings/add",
|
|
151
|
+
"scheduled_product_listings/remove",
|
|
152
|
+
"scheduled_product_listings/update",
|
|
153
|
+
"segments/create",
|
|
154
|
+
"segments/delete",
|
|
155
|
+
"segments/update",
|
|
156
|
+
"selling_plan_groups/create",
|
|
157
|
+
"selling_plan_groups/delete",
|
|
158
|
+
"selling_plan_groups/update",
|
|
159
|
+
"shop/update",
|
|
160
|
+
"subscription_billing_attempts/challenged",
|
|
161
|
+
"subscription_billing_attempts/failure",
|
|
162
|
+
"subscription_billing_attempts/success",
|
|
163
|
+
"subscription_billing_cycle_edits/create",
|
|
164
|
+
"subscription_billing_cycle_edits/delete",
|
|
165
|
+
"subscription_billing_cycle_edits/update",
|
|
166
|
+
"subscription_billing_cycles/skip",
|
|
167
|
+
"subscription_billing_cycles/unskip",
|
|
168
|
+
"subscription_contracts/activate",
|
|
169
|
+
"subscription_contracts/cancel",
|
|
170
|
+
"subscription_contracts/create",
|
|
171
|
+
"subscription_contracts/expire",
|
|
172
|
+
"subscription_contracts/fail",
|
|
173
|
+
"subscription_contracts/pause",
|
|
174
|
+
"subscription_contracts/update",
|
|
175
|
+
"tax_partners/update",
|
|
176
|
+
"tax_summaries/create",
|
|
177
|
+
"tender_transactions/create",
|
|
178
|
+
"themes/create",
|
|
179
|
+
"themes/delete",
|
|
180
|
+
"themes/publish",
|
|
181
|
+
"themes/update",
|
|
182
|
+
"variants/in_stock",
|
|
183
|
+
"variants/out_of_stock",
|
|
184
|
+
];
|
|
185
|
+
export const snapshot = {
|
|
186
|
+
configInputs: [
|
|
187
|
+
{
|
|
188
|
+
handle: "topics",
|
|
189
|
+
jsonSchema: s.array(s.stringEnum(topics), { maxItems: 20, minItems: 1, uniqueItems: true }),
|
|
190
|
+
nullable: false,
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
definitionVersion: 2,
|
|
194
|
+
description: "Triggers when selected Shopify webhook topics occur in the connected store.",
|
|
195
|
+
displayName: "Store Event",
|
|
196
|
+
endpoint: {
|
|
197
|
+
body: { allowArray: false, allowEmpty: false, formats: ["json"] },
|
|
198
|
+
methods: ["POST"],
|
|
199
|
+
successStatus: 202,
|
|
200
|
+
},
|
|
201
|
+
key: "shopify.on_shop_event",
|
|
202
|
+
name: "on_shop_event",
|
|
203
|
+
outputs: [
|
|
204
|
+
{ handle: "apiVersion", jsonSchema: s.string(), nullable: false },
|
|
205
|
+
{ handle: "body", jsonSchema: { type: "object" }, nullable: false },
|
|
206
|
+
{ handle: "eventId", jsonSchema: s.string(), nullable: false },
|
|
207
|
+
{ handle: "shopDomain", jsonSchema: s.string(), nullable: false },
|
|
208
|
+
{ handle: "topic", jsonSchema: s.string(), nullable: false },
|
|
209
|
+
{ handle: "triggeredAt", jsonSchema: s.string(), nullable: false },
|
|
210
|
+
{ handle: "webhookId", jsonSchema: s.string(), nullable: false },
|
|
211
|
+
],
|
|
212
|
+
provider: "shopify",
|
|
213
|
+
type: "integration",
|
|
214
|
+
};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
|
|
2
|
+
import { sameSecret } from "../../triggers/signature.js";
|
|
3
|
+
import { snapshot } from "./trigger-on-shop-event.definition.js";
|
|
4
|
+
export const shopifyShopEvent = {
|
|
5
|
+
initialState: { checkpoint: null, subscription: {} },
|
|
6
|
+
snapshot,
|
|
7
|
+
receive(context) {
|
|
8
|
+
if (!sameSecret(context.query("open_flow_callback"), context.callbackSecret)) {
|
|
9
|
+
return { body: "", contentType: "text/plain", outcome: "respond", status: 404 };
|
|
10
|
+
}
|
|
11
|
+
const topic = context.header("x-shopify-topic")?.trim();
|
|
12
|
+
if (!topic)
|
|
13
|
+
return { outcome: "ignored", reason: "Shopify topic header is missing." };
|
|
14
|
+
if (!configuredTopics(context.config).includes(topic))
|
|
15
|
+
return { outcome: "ignored", reason: "Shopify topic is not subscribed." };
|
|
16
|
+
const webhookId = context.header("x-shopify-webhook-id") ?? "";
|
|
17
|
+
return {
|
|
18
|
+
dedupeKey: webhookId.length == 0 ? undefined : webhookId,
|
|
19
|
+
outcome: "event",
|
|
20
|
+
outputs: {
|
|
21
|
+
apiVersion: context.header("x-shopify-api-version") ?? "",
|
|
22
|
+
body: context.payload,
|
|
23
|
+
eventId: context.header("x-shopify-event-id") ?? "",
|
|
24
|
+
shopDomain: context.header("x-shopify-shop-domain") ?? "",
|
|
25
|
+
topic,
|
|
26
|
+
triggeredAt: context.header("x-shopify-triggered-at") ?? "",
|
|
27
|
+
webhookId,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
async reconcile(context) {
|
|
32
|
+
const state = requireState(context.state);
|
|
33
|
+
const subscriptions = await list(context);
|
|
34
|
+
if (subscriptions == null) {
|
|
35
|
+
if (!context.active)
|
|
36
|
+
return { outcome: "ready" };
|
|
37
|
+
throw new PermanentIntegrationError("The Shopify store or webhook resource is unavailable.");
|
|
38
|
+
}
|
|
39
|
+
if (!context.active) {
|
|
40
|
+
for (const id of subscriptions.values())
|
|
41
|
+
await remove(context, id);
|
|
42
|
+
await state.saveSubscription({}, later(context.now));
|
|
43
|
+
return { outcome: "ready" };
|
|
44
|
+
}
|
|
45
|
+
const wanted = configuredTopics(context.config);
|
|
46
|
+
const ids = [];
|
|
47
|
+
const created = [];
|
|
48
|
+
try {
|
|
49
|
+
for (const topic of wanted) {
|
|
50
|
+
const existing = subscriptions.get(topic);
|
|
51
|
+
if (existing != null)
|
|
52
|
+
ids.push(existing);
|
|
53
|
+
else {
|
|
54
|
+
const subscription = await create(context, topic);
|
|
55
|
+
ids.push(subscription.id);
|
|
56
|
+
if (subscription.created)
|
|
57
|
+
created.push(subscription.id);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (cause) {
|
|
62
|
+
await Promise.allSettled(created.map((id) => remove(context, id)));
|
|
63
|
+
throw cause;
|
|
64
|
+
}
|
|
65
|
+
for (const [topic, id] of subscriptions)
|
|
66
|
+
if (!wanted.includes(topic))
|
|
67
|
+
await remove(context, id);
|
|
68
|
+
await state.saveSubscription({ webhookIds: ids }, later(context.now));
|
|
69
|
+
return { outcome: "ready" };
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
function configuredTopics(value) {
|
|
73
|
+
return [...new Set(value.topics)];
|
|
74
|
+
}
|
|
75
|
+
async function create(context, topic) {
|
|
76
|
+
const address = callbackUrl(context);
|
|
77
|
+
const result = await request(context, "subscription create", {
|
|
78
|
+
body: { webhook: { address, format: "json", topic } },
|
|
79
|
+
endpoint: "/webhooks.json",
|
|
80
|
+
method: "POST",
|
|
81
|
+
});
|
|
82
|
+
if (result.status == 422) {
|
|
83
|
+
const subscriptions = await list(context);
|
|
84
|
+
const winner = subscriptions?.get(topic);
|
|
85
|
+
if (winner != null)
|
|
86
|
+
return { created: false, id: winner };
|
|
87
|
+
}
|
|
88
|
+
success(result, "subscription create");
|
|
89
|
+
const id = normalizeId(record(record(result.data)?.webhook)?.id);
|
|
90
|
+
if (id == null)
|
|
91
|
+
throw new TransientIntegrationError("Shopify subscription response is missing its ID.");
|
|
92
|
+
return { created: true, id };
|
|
93
|
+
}
|
|
94
|
+
async function list(context) {
|
|
95
|
+
const address = callbackUrl(context);
|
|
96
|
+
const result = await request(context, "subscription list", {
|
|
97
|
+
endpoint: "/webhooks.json",
|
|
98
|
+
method: "GET",
|
|
99
|
+
query: { address, limit: 250 },
|
|
100
|
+
});
|
|
101
|
+
if (result.status == 404)
|
|
102
|
+
return null;
|
|
103
|
+
success(result, "subscription list");
|
|
104
|
+
const raw = record(result.data)?.webhooks;
|
|
105
|
+
const subscriptions = new Map();
|
|
106
|
+
if (!Array.isArray(raw))
|
|
107
|
+
return subscriptions;
|
|
108
|
+
for (const item of raw) {
|
|
109
|
+
const value = record(item);
|
|
110
|
+
const id = normalizeId(value?.id);
|
|
111
|
+
if (value?.address === address && typeof value.topic == "string" && id != null)
|
|
112
|
+
subscriptions.set(value.topic, id);
|
|
113
|
+
}
|
|
114
|
+
return subscriptions;
|
|
115
|
+
}
|
|
116
|
+
function callbackUrl(context) {
|
|
117
|
+
const url = new URL(context.endpointUrl);
|
|
118
|
+
url.searchParams.set("open_flow_callback", context.callbackSecret);
|
|
119
|
+
return url.href;
|
|
120
|
+
}
|
|
121
|
+
async function remove(context, id) {
|
|
122
|
+
const result = await request(context, "subscription delete", {
|
|
123
|
+
endpoint: `/webhooks/${encodeURIComponent(id)}.json`,
|
|
124
|
+
method: "DELETE",
|
|
125
|
+
});
|
|
126
|
+
if (result.status != 404)
|
|
127
|
+
success(result, "subscription delete");
|
|
128
|
+
}
|
|
129
|
+
async function request(context, operation, value) {
|
|
130
|
+
try {
|
|
131
|
+
return await context.connector.execute(value, context.signal);
|
|
132
|
+
}
|
|
133
|
+
catch (cause) {
|
|
134
|
+
if (cause instanceof IntegrationConnectionError)
|
|
135
|
+
throw cause;
|
|
136
|
+
throw new TransientIntegrationError(`Shopify ${operation} request failed.`, { cause });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function success(result, operation) {
|
|
140
|
+
if (result.status >= 200 && result.status < 300)
|
|
141
|
+
return;
|
|
142
|
+
if (result.status == 401 || result.status == 403)
|
|
143
|
+
throw new IntegrationConnectionError(`Shopify ${operation} rejected the Connection.`);
|
|
144
|
+
if ([402, 404, 422, 423, 501].includes(result.status))
|
|
145
|
+
throw new PermanentIntegrationError(`Shopify ${operation} rejected the subscription.`);
|
|
146
|
+
throw new TransientIntegrationError(`Shopify ${operation} failed with status ${result.status}.`);
|
|
147
|
+
}
|
|
148
|
+
function normalizeId(value) {
|
|
149
|
+
if (typeof value == "string")
|
|
150
|
+
return value.trim().length == 0 ? null : value;
|
|
151
|
+
return typeof value == "number" && Number.isFinite(value) ? String(value) : null;
|
|
152
|
+
}
|
|
153
|
+
function requireState(value) {
|
|
154
|
+
if (value == null)
|
|
155
|
+
throw new PermanentIntegrationError("Shopify Integration state is missing.");
|
|
156
|
+
return value;
|
|
157
|
+
}
|
|
158
|
+
function later(now) {
|
|
159
|
+
return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1_000);
|
|
160
|
+
}
|
|
161
|
+
function record(value) {
|
|
162
|
+
return value != null && typeof value == "object" && !Array.isArray(value)
|
|
163
|
+
? value
|
|
164
|
+
: undefined;
|
|
165
|
+
}
|
|
@@ -50,6 +50,16 @@ const messageContentProperties = {
|
|
|
50
50
|
unfurlMedia: s.boolean({ description: "Whether Slack should unfurl media in the message." }),
|
|
51
51
|
metadata: s.unknownObject("Slack message metadata to attach to the message."),
|
|
52
52
|
};
|
|
53
|
+
// Shared by `conversations.history` and `conversations.replies`: opt in to
|
|
54
|
+
// the untouched vendor record. Off by default so the row read in bulk stays
|
|
55
|
+
// lean. Opting in also asks Slack for message metadata, which it leaves out
|
|
56
|
+
// unless the request sets `include_all_metadata`.
|
|
57
|
+
const includeRawProperties = {
|
|
58
|
+
includeRaw: s.boolean({
|
|
59
|
+
description: "When true, each returned message also carries the untouched Slack record under raw, including its blocks, attachments, files and message metadata. Defaults to false.",
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
62
|
+
const rawMessageSchema = s.unknownObject("The untouched Slack record, exactly as the Slack API returned it. Present only when includeRaw is true.");
|
|
53
63
|
const slackReactionSchema = s.looseObject({
|
|
54
64
|
name: s.string({ description: "The emoji name of the reaction." }),
|
|
55
65
|
count: s.integer({ description: "How many users added this reaction." }),
|
|
@@ -60,9 +70,10 @@ const slackReactionSchema = s.looseObject({
|
|
|
60
70
|
// Only fields the executor actually normalizes are declared. The object is
|
|
61
71
|
// loose, but that permits extras it does NOT make them appear: the executor
|
|
62
72
|
// builds each row explicitly, so an undeclared Slack field is simply not
|
|
63
|
-
// emitted. Deliberately absent: `blocks`, `attachments
|
|
64
|
-
// are unbounded nested payloads on a row shape that ETL
|
|
65
|
-
//
|
|
73
|
+
// emitted. Deliberately absent: `blocks`, `attachments`, `files` and
|
|
74
|
+
// `metadata`. Those are unbounded nested payloads on a row shape that ETL
|
|
75
|
+
// reads in bulk, so they stay out of the default row; a caller that needs
|
|
76
|
+
// them passes includeRaw and reads them from `raw`, the untouched record.
|
|
66
77
|
const slackMessageSchema = s.looseObject({
|
|
67
78
|
ts: s.string({ description: "The message timestamp identifier." }),
|
|
68
79
|
type: s.string({ description: "The Slack message type, normally 'message'." }),
|
|
@@ -77,15 +88,20 @@ const slackMessageSchema = s.looseObject({
|
|
|
77
88
|
clientMsgId: s.string({ description: "The client-generated message identifier when Slack returns one." }),
|
|
78
89
|
text: s.string({ description: "The text content of the message." }),
|
|
79
90
|
editedTs: s.string({ description: "The timestamp of the most recent edit, when the message was edited." }),
|
|
91
|
+
editedUserId: s.string({ description: "The user ID of the most recent editor, when the message was edited." }),
|
|
80
92
|
threadTs: s.string({
|
|
81
93
|
description: "The timestamp of the thread parent. Equal to ts on a thread parent, and absent on a message that is not in a thread.",
|
|
82
94
|
}),
|
|
83
95
|
parentUserId: s.string({ description: "The author of the thread parent, on a threaded reply." }),
|
|
84
96
|
replyCount: s.integer({ description: "The number of replies to this thread parent." }),
|
|
85
97
|
replyUsersCount: s.integer({ description: "The number of distinct users who replied to this thread parent." }),
|
|
98
|
+
replyUserIds: s.array(s.string({ description: "A Slack user ID." }), {
|
|
99
|
+
description: "Up to five user IDs of people who replied to this thread parent. Slack caps this list; use replyUsersCount for the total.",
|
|
100
|
+
}),
|
|
86
101
|
latestReply: s.string({ description: "The timestamp of the most recent reply to this thread parent." }),
|
|
87
102
|
isLocked: s.boolean({ description: "Whether the thread is locked." }),
|
|
88
103
|
reactions: s.array(slackReactionSchema, { description: "Reaction summaries attached to the message." }),
|
|
104
|
+
raw: rawMessageSchema,
|
|
89
105
|
}, { description: "A Slack message record." });
|
|
90
106
|
const searchMessageMatchSchema = s.looseObject({
|
|
91
107
|
matchId: s.string({ description: "Slack's search result item identifier." }),
|
|
@@ -98,6 +114,7 @@ const searchMessageMatchSchema = s.looseObject({
|
|
|
98
114
|
permalink: s.string({ description: "A Slack permalink for the matching message." }),
|
|
99
115
|
teamId: s.string({ description: "The Slack team ID returned for the match." }),
|
|
100
116
|
type: s.string({ description: "The Slack result type." }),
|
|
117
|
+
raw: rawMessageSchema,
|
|
101
118
|
}, { description: "A normalized Slack message search match." });
|
|
102
119
|
const conversationSchema = s.object({
|
|
103
120
|
channelId: s.string({ description: "The unique identifier of the conversation." }),
|
|
@@ -113,6 +130,21 @@ const conversationSchema = s.object({
|
|
|
113
130
|
purpose: s.nullable(s.string({ description: "The conversation purpose." })),
|
|
114
131
|
userId: s.string({ description: "The linked user identifier for IM conversations." }),
|
|
115
132
|
locale: s.string({ description: "The locale returned by Slack when requested." }),
|
|
133
|
+
created: s.integer({ description: "Creation time as a Unix timestamp in seconds when Slack provides it." }),
|
|
134
|
+
updated: s.integer({
|
|
135
|
+
description: "Last settings update time, passed through as Slack returns it. Slack documents epoch milliseconds for channels (unlike created) and a Unix timestamp for legacy IM and MPIM objects.",
|
|
136
|
+
}),
|
|
137
|
+
creatorId: s.string({ description: "The user who created the conversation when Slack provides it." }),
|
|
138
|
+
isShared: s.boolean({ description: "Whether the conversation is shared with another workspace." }),
|
|
139
|
+
isExtShared: s.boolean({ description: "Whether the conversation is shared with an external organization." }),
|
|
140
|
+
isOrgShared: s.boolean({
|
|
141
|
+
description: "Whether the conversation is shared between workspaces of the same Enterprise organization.",
|
|
142
|
+
}),
|
|
143
|
+
contextTeamId: s.string({
|
|
144
|
+
description: "The ID of the workspace the conversation is within when Slack provides it.",
|
|
145
|
+
}),
|
|
146
|
+
lastRead: s.string({ description: "The last-read message timestamp when Slack provides it." }),
|
|
147
|
+
unreadCount: s.integer({ description: "The unread message count when Slack provides it." }),
|
|
116
148
|
}, {
|
|
117
149
|
required: ["channelId", "name", "type", "isArchived", "isPrivate", "isMember", "topic", "purpose"],
|
|
118
150
|
description: "A normalized Slack conversation record.",
|
|
@@ -127,6 +159,18 @@ const userSchema = s.object({
|
|
|
127
159
|
isAdmin: s.nullable(s.boolean({ description: "Whether the user is an admin." })),
|
|
128
160
|
isOwner: s.nullable(s.boolean({ description: "Whether the user is an owner." })),
|
|
129
161
|
locale: s.string({ description: "The locale returned by Slack when requested." }),
|
|
162
|
+
email: s.string({
|
|
163
|
+
description: "The profile email. Slack returns it only when the token holds the users:read.email scope.",
|
|
164
|
+
}),
|
|
165
|
+
tz: s.string({ description: "The user's time zone identifier when Slack provides it." }),
|
|
166
|
+
tzOffset: s.integer({ description: "The user's UTC offset in seconds when Slack provides it." }),
|
|
167
|
+
updated: s.integer({ description: "When the user object was last updated, as a Unix timestamp in seconds." }),
|
|
168
|
+
teamId: s.string({ description: "The user's team ID when Slack provides it." }),
|
|
169
|
+
isRestricted: s.boolean({
|
|
170
|
+
description: "Whether the user is a guest. Single-channel guests also set isUltraRestricted.",
|
|
171
|
+
}),
|
|
172
|
+
isUltraRestricted: s.boolean({ description: "Whether the user is a single-channel guest." }),
|
|
173
|
+
isAppUser: s.boolean({ description: "Whether the user is an authorized user of the calling app." }),
|
|
130
174
|
}, {
|
|
131
175
|
required: ["userId", "username", "realName", "displayName", "isBot", "isDeleted", "isAdmin", "isOwner"],
|
|
132
176
|
description: "A normalized Slack user record.",
|
|
@@ -188,6 +232,7 @@ export const slackActions = [
|
|
|
188
232
|
description: "The Slack pagination cursor from a previous page. Omit for the first page.",
|
|
189
233
|
}),
|
|
190
234
|
...historyWindowProperties,
|
|
235
|
+
...includeRawProperties,
|
|
191
236
|
}, { required: ["channelId"], description: "Input parameters for reading Slack conversation history." }),
|
|
192
237
|
outputSchema: s.object({
|
|
193
238
|
messages: s.array(slackMessageSchema, { description: "The list of messages in the conversation." }),
|
|
@@ -242,6 +287,9 @@ export const slackActions = [
|
|
|
242
287
|
sort: searchSortSchema,
|
|
243
288
|
sortDir: sortDirectionSchema,
|
|
244
289
|
teamId: s.string({ description: "The encoded team ID to search when using an org-level token." }),
|
|
290
|
+
includeRaw: s.boolean({
|
|
291
|
+
description: "When true, each returned match also carries the untouched Slack search match under raw, including any blocks, attachments and files. Defaults to false.",
|
|
292
|
+
}),
|
|
245
293
|
}, { required: ["query"], description: "Input parameters for searching Slack messages." }),
|
|
246
294
|
outputSchema: s.object({
|
|
247
295
|
query: s.string({ description: "The search query Slack executed." }),
|
|
@@ -323,6 +371,7 @@ export const slackActions = [
|
|
|
323
371
|
description: "The Slack pagination cursor from a previous page. Omit for the first page.",
|
|
324
372
|
}),
|
|
325
373
|
...historyWindowProperties,
|
|
374
|
+
...includeRawProperties,
|
|
326
375
|
}, { required: ["channelId", "threadTs"], description: "Input parameters for reading a Slack thread." }),
|
|
327
376
|
outputSchema: s.object({
|
|
328
377
|
messages: s.array(slackMessageSchema, { description: "The list of messages in the thread." }),
|
|
@@ -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)[];
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { defineProviderProxy } from "../provider-runtime.js";
|
|
2
2
|
import { defineSlackProviderExecutors, slackActionHandlers, slackApiBaseUrl, slackCredentialValidators, } from "./runtime.js";
|
|
3
|
+
import { slackMessagePosted } from "./trigger-on-message-posted.js";
|
|
3
4
|
const service = "slack";
|
|
4
5
|
export const executors = defineSlackProviderExecutors(service, "user", slackActionHandlers);
|
|
5
6
|
export const proxy = defineProviderProxy({
|
|
@@ -9,3 +10,4 @@ export const proxy = defineProviderProxy({
|
|
|
9
10
|
skipDnsValidation: true,
|
|
10
11
|
});
|
|
11
12
|
export const credentialValidators = slackCredentialValidators;
|
|
13
|
+
export const triggers = [slackMessagePosted];
|