@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,18 +1,20 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
8
|
-
import type {
|
|
9
|
-
import type {
|
|
10
|
-
import type {
|
|
11
|
-
import type {
|
|
12
|
-
import type {
|
|
13
|
-
import type { IRuntimeTokenStore, RuntimeTokenRecord } from "./runtime-token-service.ts";
|
|
1
|
+
import type { TokenPolicy } from "../../../core/action-policy.ts";
|
|
2
|
+
import type { RuntimeLogger } from "../../../core/types.ts";
|
|
3
|
+
import type { IMarketplaceStore, ProviderPreference, StoredMarketplaceConfig } from "../../../marketplace/marketplace-service.ts";
|
|
4
|
+
import type { IOAuthClientConfigStore, OAuthClientConfig } from "../../../oauth/oauth-client-config-service.ts";
|
|
5
|
+
import type { IOAuthStateStore, OAuthAuthorizationState } from "../../../oauth/oauth-flow-service.ts";
|
|
6
|
+
import type { ISecretCodec } from "../../secrets/secret-codec-core.ts";
|
|
7
|
+
import type { CompleteIdempotencyInput, IdempotencyClaimInput, IdempotencyClaimResult, IIdempotencyStore } from "../idempotency-store.ts";
|
|
8
|
+
import type { MigrationSource } from "../migration-source.ts";
|
|
9
|
+
import type { RuntimeDatabase } from "../runtime-database.ts";
|
|
10
|
+
import type { IRuntimePolicyStore, RuntimePolicyRecord } from "../runtime-policy-store.ts";
|
|
11
|
+
import type { IRunLogStore, RunLog, RunLogListInput, RunLogPage, RunLogWriteResult } from "../runtime-store.ts";
|
|
12
|
+
import type { IRuntimeTokenStore, RuntimeTokenRecord } from "../runtime-token-service.ts";
|
|
14
13
|
import { DatabaseSync } from "node:sqlite";
|
|
15
|
-
import { ConnectionRequestStore } from "
|
|
14
|
+
import { ConnectionRequestStore } from "../connection-request-store.ts";
|
|
15
|
+
import { SqlConnectionStore } from "../connection-store.ts";
|
|
16
|
+
import { SaasProjectStore } from "../saas-project-store.ts";
|
|
17
|
+
import { SqlTriggerStore } from "../trigger-store.ts";
|
|
16
18
|
export interface SqliteRuntimeDatabaseOptions {
|
|
17
19
|
logger?: RuntimeLogger;
|
|
18
20
|
runLimit?: number;
|
|
@@ -23,8 +25,10 @@ export interface SqliteRuntimeDatabaseOptions {
|
|
|
23
25
|
* Shared SQLite connection for local runtime state.
|
|
24
26
|
*/
|
|
25
27
|
export declare class SqliteRuntimeDatabase implements RuntimeDatabase {
|
|
28
|
+
readonly saasProjectStore: SaasProjectStore;
|
|
26
29
|
readonly connectionRequestStore: ConnectionRequestStore;
|
|
27
|
-
readonly connectionStore:
|
|
30
|
+
readonly connectionStore: SqlConnectionStore;
|
|
31
|
+
readonly triggerStore: SqlTriggerStore;
|
|
28
32
|
readonly oauthClientConfigStore: SqliteOAuthClientConfigStore;
|
|
29
33
|
readonly oauthStateStore: SqliteOAuthStateStore;
|
|
30
34
|
readonly runtimeTokenStore: SqliteRuntimeTokenStore;
|
|
@@ -49,16 +53,6 @@ export declare class SqliteMarketplaceStore implements IMarketplaceStore {
|
|
|
49
53
|
listProviderPreferences(): Promise<ProviderPreference[]>;
|
|
50
54
|
setProviderPreference(preference: ProviderPreference): Promise<void>;
|
|
51
55
|
}
|
|
52
|
-
export declare class SqliteConnectionStore implements IConnectionStore {
|
|
53
|
-
private readonly database;
|
|
54
|
-
private readonly secretCodec;
|
|
55
|
-
constructor(database: DatabaseSync, secretCodec: ISecretCodec);
|
|
56
|
-
get(service: string, connectionName: string): Promise<StoredConnection | undefined>;
|
|
57
|
-
set(service: string, connectionName: string, credential: ResolvedCredential): Promise<StoredConnection>;
|
|
58
|
-
updateCredential(input: StoredConnection): Promise<boolean>;
|
|
59
|
-
delete(service: string, connectionName: string): Promise<void>;
|
|
60
|
-
list(): Promise<StoredConnection[]>;
|
|
61
|
-
}
|
|
62
56
|
export declare class SqliteOAuthClientConfigStore implements IOAuthClientConfigStore {
|
|
63
57
|
private readonly database;
|
|
64
58
|
private readonly secretCodec;
|
|
@@ -78,6 +72,8 @@ export declare class SqliteOAuthStateStore implements IOAuthStateStore {
|
|
|
78
72
|
}
|
|
79
73
|
export declare class SqliteRuntimeTokenStore implements IRuntimeTokenStore {
|
|
80
74
|
private readonly database;
|
|
75
|
+
private findByHashStatement?;
|
|
76
|
+
private markUsedStatement?;
|
|
81
77
|
constructor(database: DatabaseSync);
|
|
82
78
|
add(record: RuntimeTokenRecord): Promise<void>;
|
|
83
79
|
list(): Promise<RuntimeTokenRecord[]>;
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { DatabaseSync } from "node:sqlite";
|
|
2
|
-
import { parseRuntimeActionHttpResult } from "
|
|
3
|
-
import { PlainTextSecretCodec } from "
|
|
4
|
-
import { ConnectionRequestStore } from "
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
import { parseRuntimeActionHttpResult } from "../../api/runtime-api.js";
|
|
3
|
+
import { PlainTextSecretCodec } from "../../secrets/secret-codec-core.js";
|
|
4
|
+
import { ConnectionRequestStore } from "../connection-request-store.js";
|
|
5
|
+
import { SqlConnectionStore } from "../connection-store.js";
|
|
6
|
+
import { defaultMigrationSource } from "../migration-source.js";
|
|
7
|
+
import { listRunLogs, parseJson, readRunLogRow, readRuntimePolicyRow, readRuntimeTokenRow, readString, runtimeTokenColumns, } from "../runtime-sql.js";
|
|
8
|
+
import { DEFAULT_RUN_LIMIT } from "../runtime-store.js";
|
|
9
|
+
import { SaasProjectStore } from "../saas-project-store.js";
|
|
10
|
+
import { SqlTriggerStore } from "../trigger-store.js";
|
|
8
11
|
/**
|
|
9
12
|
* Shared SQLite connection for local runtime state.
|
|
10
13
|
*/
|
|
11
14
|
export class SqliteRuntimeDatabase {
|
|
15
|
+
saasProjectStore;
|
|
12
16
|
connectionRequestStore;
|
|
13
17
|
connectionStore;
|
|
18
|
+
triggerStore;
|
|
14
19
|
oauthClientConfigStore;
|
|
15
20
|
oauthStateStore;
|
|
16
21
|
runtimeTokenStore;
|
|
@@ -24,8 +29,11 @@ export class SqliteRuntimeDatabase {
|
|
|
24
29
|
this.database = new DatabaseSync(filename);
|
|
25
30
|
this.secretCodec = options.secretCodec ?? new PlainTextSecretCodec();
|
|
26
31
|
this.initialize(options.migrations ?? defaultMigrationSource, options.logger);
|
|
27
|
-
|
|
28
|
-
this.
|
|
32
|
+
const transaction = async (statements) => runInTransaction(this.database, () => statements.map(({ sql, values }) => this.database.prepare(sql).all(...values)));
|
|
33
|
+
this.connectionRequestStore = new ConnectionRequestStore(transaction, this.secretCodec);
|
|
34
|
+
this.connectionStore = new SqlConnectionStore(transaction, this.secretCodec);
|
|
35
|
+
this.triggerStore = new SqlTriggerStore(transaction, this.secretCodec);
|
|
36
|
+
this.saasProjectStore = new SaasProjectStore(transaction, this.secretCodec);
|
|
29
37
|
this.oauthClientConfigStore = new SqliteOAuthClientConfigStore(this.database, this.secretCodec);
|
|
30
38
|
this.oauthStateStore = new SqliteOAuthStateStore(this.database, this.secretCodec);
|
|
31
39
|
this.runtimeTokenStore = new SqliteRuntimeTokenStore(this.database);
|
|
@@ -38,25 +46,63 @@ export class SqliteRuntimeDatabase {
|
|
|
38
46
|
this.database.close();
|
|
39
47
|
}
|
|
40
48
|
async rotateSecretCodec(nextSecretCodec) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
49
|
+
this.database.exec("begin immediate");
|
|
50
|
+
try {
|
|
51
|
+
const project = this.database.prepare("select value from managed_project where id = 1").get();
|
|
52
|
+
if (project && !nextSecretCodec.encrypted)
|
|
53
|
+
throw new Error("SaaS project configuration requires encrypted storage.");
|
|
54
|
+
const projectValue = project
|
|
55
|
+
? await nextSecretCodec.encode(await this.secretCodec.decode(readString(project, "value")))
|
|
56
|
+
: undefined;
|
|
57
|
+
const candidates = await Promise.all(this.database
|
|
58
|
+
.prepare("select id, candidate_value from connection_requests where candidate_value is not null")
|
|
59
|
+
.all()
|
|
60
|
+
.map(async (row) => ({
|
|
61
|
+
id: readString(row, "id"),
|
|
62
|
+
value: await nextSecretCodec.encode(await this.secretCodec.decode(readString(row, "candidate_value"))),
|
|
63
|
+
})));
|
|
64
|
+
const returnUris = await Promise.all(this.database
|
|
65
|
+
.prepare("select id, return_uri from connection_requests where return_uri is not null")
|
|
66
|
+
.all()
|
|
67
|
+
.map(async (row) => ({
|
|
68
|
+
id: readString(row, "id"),
|
|
69
|
+
value: await nextSecretCodec.encode(await this.secretCodec.decode(readString(row, "return_uri"))),
|
|
70
|
+
})));
|
|
71
|
+
const triggerSecrets = await Promise.all(this.database
|
|
72
|
+
.prepare("select id, value from trigger_subscriptions")
|
|
73
|
+
.all()
|
|
74
|
+
.map(async (row) => ({
|
|
75
|
+
id: readString(row, "id"),
|
|
76
|
+
value: await nextSecretCodec.encode(await this.secretCodec.decode(readString(row, "value"))),
|
|
77
|
+
})));
|
|
78
|
+
const connections = await readRotatedConnectionSecrets(this.database, this.secretCodec, nextSecretCodec);
|
|
79
|
+
const oauthConfigs = await readRotatedServiceSecrets(this.database, this.secretCodec, nextSecretCodec, "oauth_client_configs");
|
|
80
|
+
const requestSecrets = await Promise.all(this.database
|
|
81
|
+
.prepare("select id, value from connection_requests where value is not null")
|
|
82
|
+
.all()
|
|
83
|
+
.map(async (row) => ({
|
|
84
|
+
id: readString(row, "id"),
|
|
85
|
+
value: await nextSecretCodec.encode(await this.secretCodec.decode(readString(row, "value"))),
|
|
86
|
+
})));
|
|
87
|
+
const oauthStates = await readRotatedStateSecrets(this.database, this.secretCodec, nextSecretCodec);
|
|
88
|
+
const idempotencyResponses = await readRotatedIdempotencySecrets(this.database, this.secretCodec, nextSecretCodec);
|
|
89
|
+
const marketplaceConfig = await this.marketplaceStore.getConfig();
|
|
90
|
+
const rotatedMarketplaceConfig = marketplaceConfig
|
|
91
|
+
? {
|
|
92
|
+
...marketplaceConfig,
|
|
93
|
+
apiKeyEncrypted: await nextSecretCodec.encode(await this.secretCodec.decode(marketplaceConfig.apiKeyEncrypted)),
|
|
94
|
+
}
|
|
95
|
+
: undefined;
|
|
96
|
+
if (projectValue)
|
|
97
|
+
this.database.prepare("update managed_project set value = ? where id = 1").run(projectValue);
|
|
98
|
+
for (const candidate of candidates)
|
|
99
|
+
this.database
|
|
100
|
+
.prepare("update connection_requests set candidate_value = ? where id = ?")
|
|
101
|
+
.run(candidate.value, candidate.id);
|
|
102
|
+
for (const uri of returnUris)
|
|
103
|
+
this.database.prepare("update connection_requests set return_uri = ? where id = ?").run(uri.value, uri.id);
|
|
104
|
+
for (const record of triggerSecrets)
|
|
105
|
+
this.database.prepare("update trigger_subscriptions set value = ? where id = ?").run(record.value, record.id);
|
|
60
106
|
writeRotatedConnectionSecrets(this.database, connections);
|
|
61
107
|
writeRotatedServiceSecrets(this.database, "oauth_client_configs", oauthConfigs);
|
|
62
108
|
writeRotatedStateSecrets(this.database, oauthStates);
|
|
@@ -70,10 +116,19 @@ export class SqliteRuntimeDatabase {
|
|
|
70
116
|
.prepare("update marketplace_config set value = ? where id = 1")
|
|
71
117
|
.run(JSON.stringify(rotatedMarketplaceConfig));
|
|
72
118
|
}
|
|
73
|
-
|
|
119
|
+
this.database.exec("commit");
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
this.database.exec("rollback");
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
74
125
|
}
|
|
75
126
|
resetRuntimeData() {
|
|
76
|
-
this.database.exec(`
|
|
127
|
+
runInTransaction(this.database, () => this.database.exec(`
|
|
128
|
+
delete from oauth_sources;
|
|
129
|
+
delete from saas_cleanup;
|
|
130
|
+
delete from managed_project;
|
|
131
|
+
delete from trigger_subscriptions;
|
|
77
132
|
delete from connections;
|
|
78
133
|
delete from oauth_client_configs;
|
|
79
134
|
delete from oauth_states;
|
|
@@ -84,7 +139,7 @@ export class SqliteRuntimeDatabase {
|
|
|
84
139
|
delete from idempotency_records;
|
|
85
140
|
delete from marketplace_config;
|
|
86
141
|
delete from provider_preferences;
|
|
87
|
-
`);
|
|
142
|
+
`));
|
|
88
143
|
}
|
|
89
144
|
initialize(migrations, logger) {
|
|
90
145
|
this.database.exec("pragma journal_mode = wal;");
|
|
@@ -125,79 +180,6 @@ export class SqliteMarketplaceStore {
|
|
|
125
180
|
.run(preference.service, preference.enabled ? 1 : 0, preference.createdAt, preference.updatedAt);
|
|
126
181
|
}
|
|
127
182
|
}
|
|
128
|
-
export class SqliteConnectionStore {
|
|
129
|
-
database;
|
|
130
|
-
secretCodec;
|
|
131
|
-
constructor(database, secretCodec) {
|
|
132
|
-
this.database = database;
|
|
133
|
-
this.secretCodec = secretCodec;
|
|
134
|
-
}
|
|
135
|
-
async get(service, connectionName) {
|
|
136
|
-
const row = this.database
|
|
137
|
-
.prepare("select id, revision, value from connections where service = ? and connection_name = ?")
|
|
138
|
-
.get(service, connectionName);
|
|
139
|
-
return row
|
|
140
|
-
? {
|
|
141
|
-
id: readString(row, "id"),
|
|
142
|
-
revision: readString(row, "revision"),
|
|
143
|
-
service,
|
|
144
|
-
connectionName,
|
|
145
|
-
credential: parseJson(await this.secretCodec.decode(readString(row, "value"))),
|
|
146
|
-
}
|
|
147
|
-
: undefined;
|
|
148
|
-
}
|
|
149
|
-
async set(service, connectionName, credential) {
|
|
150
|
-
const row = this.database
|
|
151
|
-
.prepare(`
|
|
152
|
-
insert into connections (id, revision, service, connection_name, value, updated_at)
|
|
153
|
-
values (?, ?, ?, ?, ?, ?)
|
|
154
|
-
on conflict(service, connection_name) do update set
|
|
155
|
-
revision = excluded.revision,
|
|
156
|
-
value = excluded.value,
|
|
157
|
-
updated_at = excluded.updated_at
|
|
158
|
-
returning id, revision
|
|
159
|
-
`)
|
|
160
|
-
.get(crypto.randomUUID(), crypto.randomUUID(), service, connectionName, await this.secretCodec.encode(JSON.stringify(credential)), new Date().toISOString());
|
|
161
|
-
if (!row) {
|
|
162
|
-
throw new Error("Connection upsert did not return the stored row.");
|
|
163
|
-
}
|
|
164
|
-
return {
|
|
165
|
-
id: readString(row, "id"),
|
|
166
|
-
revision: readString(row, "revision"),
|
|
167
|
-
service,
|
|
168
|
-
connectionName,
|
|
169
|
-
credential,
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
async updateCredential(input) {
|
|
173
|
-
const row = this.database
|
|
174
|
-
.prepare(`
|
|
175
|
-
update connections
|
|
176
|
-
set revision = ?, value = ?, updated_at = ?
|
|
177
|
-
where service = ? and connection_name = ? and id = ? and revision = ?
|
|
178
|
-
returning id
|
|
179
|
-
`)
|
|
180
|
-
.get(crypto.randomUUID(), await this.secretCodec.encode(JSON.stringify(input.credential)), new Date().toISOString(), input.service, input.connectionName, input.id, input.revision);
|
|
181
|
-
return row !== undefined;
|
|
182
|
-
}
|
|
183
|
-
async delete(service, connectionName) {
|
|
184
|
-
this.database
|
|
185
|
-
.prepare("delete from connections where service = ? and connection_name = ?")
|
|
186
|
-
.run(service, connectionName);
|
|
187
|
-
}
|
|
188
|
-
async list() {
|
|
189
|
-
const rows = this.database
|
|
190
|
-
.prepare("select id, revision, service, connection_name, value from connections order by service, connection_name")
|
|
191
|
-
.all();
|
|
192
|
-
return await Promise.all(rows.map(async (row) => ({
|
|
193
|
-
id: readString(row, "id"),
|
|
194
|
-
revision: readString(row, "revision"),
|
|
195
|
-
service: readString(row, "service"),
|
|
196
|
-
connectionName: readString(row, "connection_name"),
|
|
197
|
-
credential: parseJson(await this.secretCodec.decode(readString(row, "value"))),
|
|
198
|
-
})));
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
183
|
export class SqliteOAuthClientConfigStore {
|
|
202
184
|
database;
|
|
203
185
|
secretCodec;
|
|
@@ -259,6 +241,8 @@ export class SqliteOAuthStateStore {
|
|
|
259
241
|
}
|
|
260
242
|
export class SqliteRuntimeTokenStore {
|
|
261
243
|
database;
|
|
244
|
+
findByHashStatement;
|
|
245
|
+
markUsedStatement;
|
|
262
246
|
constructor(database) {
|
|
263
247
|
this.database = database;
|
|
264
248
|
}
|
|
@@ -268,9 +252,9 @@ export class SqliteRuntimeTokenStore {
|
|
|
268
252
|
insert into runtime_tokens (
|
|
269
253
|
${runtimeTokenColumns}
|
|
270
254
|
)
|
|
271
|
-
values (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
255
|
+
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
272
256
|
`)
|
|
273
|
-
.run(record.id, record.name, record.tokenHash, JSON.stringify(record.allowedActions), JSON.stringify(record.blockedActions), JSON.stringify(record.allowedProxies), JSON.stringify(record.allowedConnections ?? []), record.createdAt, record.lastUsedAt ?? null);
|
|
257
|
+
.run(record.id, record.name, record.tokenHash, JSON.stringify(record.allowedActions), JSON.stringify(record.blockedActions), JSON.stringify(record.allowedProxies), JSON.stringify(record.allowedConnections ?? []), JSON.stringify(record.allowedTriggers ?? []), record.createdAt, record.lastUsedAt ?? null);
|
|
274
258
|
}
|
|
275
259
|
async list() {
|
|
276
260
|
return this.database
|
|
@@ -283,24 +267,24 @@ export class SqliteRuntimeTokenStore {
|
|
|
283
267
|
.map(readRuntimeTokenRow);
|
|
284
268
|
}
|
|
285
269
|
async findByHash(tokenHash) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
270
|
+
// Custom migration sources may omit this table until the store is actually used.
|
|
271
|
+
this.findByHashStatement ??= this.database.prepare(`
|
|
272
|
+
select ${runtimeTokenColumns}
|
|
273
|
+
from runtime_tokens
|
|
274
|
+
where token_hash = ?
|
|
275
|
+
`);
|
|
276
|
+
const row = this.findByHashStatement.get(tokenHash);
|
|
293
277
|
return row ? readRuntimeTokenRow(row) : undefined;
|
|
294
278
|
}
|
|
295
279
|
async updatePolicy(id, policy) {
|
|
296
280
|
const row = this.database
|
|
297
281
|
.prepare(`
|
|
298
282
|
update runtime_tokens
|
|
299
|
-
set allowed_actions = ?, blocked_actions = ?, allowed_proxies = ?, allowed_connections = ?
|
|
283
|
+
set allowed_actions = ?, blocked_actions = ?, allowed_proxies = ?, allowed_connections = ?, allowed_triggers = ?
|
|
300
284
|
where id = ?
|
|
301
285
|
returning ${runtimeTokenColumns}
|
|
302
286
|
`)
|
|
303
|
-
.get(JSON.stringify(policy.allowedActions), JSON.stringify(policy.blockedActions), JSON.stringify(policy.allowedProxies), JSON.stringify(policy.allowedConnections ?? []), id);
|
|
287
|
+
.get(JSON.stringify(policy.allowedActions), JSON.stringify(policy.blockedActions), JSON.stringify(policy.allowedProxies), JSON.stringify(policy.allowedConnections ?? []), JSON.stringify(policy.allowedTriggers ?? []), id);
|
|
304
288
|
return row ? readRuntimeTokenRow(row) : undefined;
|
|
305
289
|
}
|
|
306
290
|
async revoke(id) {
|
|
@@ -308,7 +292,8 @@ export class SqliteRuntimeTokenStore {
|
|
|
308
292
|
return result.changes > 0;
|
|
309
293
|
}
|
|
310
294
|
async markUsed(id, usedAt) {
|
|
311
|
-
this.database.prepare("update runtime_tokens set last_used_at = ? where id = ?")
|
|
295
|
+
this.markUsedStatement ??= this.database.prepare("update runtime_tokens set last_used_at = ? where id = ?");
|
|
296
|
+
this.markUsedStatement.run(usedAt, id);
|
|
312
297
|
}
|
|
313
298
|
}
|
|
314
299
|
export class SqliteRuntimePolicyStore {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TriggerSubscription, TriggerStore } from "../../triggers/store.ts";
|
|
2
|
+
import type { ISecretCodec } from "../secrets/secret-codec-core.ts";
|
|
3
|
+
import type { RequestTransaction } from "./connection-request-store.ts";
|
|
4
|
+
export declare class SqlTriggerStore implements TriggerStore {
|
|
5
|
+
private readonly transaction;
|
|
6
|
+
private readonly codec;
|
|
7
|
+
constructor(transaction: RequestTransaction, codec: ISecretCodec);
|
|
8
|
+
private read;
|
|
9
|
+
list(): Promise<TriggerSubscription[]>;
|
|
10
|
+
listFlowTriggersForMaintenance(now: number, limit: number): Promise<TriggerSubscription[]>;
|
|
11
|
+
getFlowTrigger(id: string): Promise<TriggerSubscription | null>;
|
|
12
|
+
insertFlowTrigger(record: TriggerSubscription): Promise<TriggerSubscription>;
|
|
13
|
+
claimFlowTrigger(id: string, owner: string, now: number, until: number): Promise<boolean>;
|
|
14
|
+
saveFlowTrigger(record: TriggerSubscription, owner: string, now: number): Promise<boolean>;
|
|
15
|
+
releaseFlowTrigger(id: string, owner: string): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { HttpRequestError } from "../api/http-utils.js";
|
|
2
|
+
export class SqlTriggerStore {
|
|
3
|
+
transaction;
|
|
4
|
+
codec;
|
|
5
|
+
constructor(transaction, codec) {
|
|
6
|
+
this.transaction = transaction;
|
|
7
|
+
this.codec = codec;
|
|
8
|
+
}
|
|
9
|
+
async read(row) {
|
|
10
|
+
return JSON.parse(await this.codec.decode(row.value));
|
|
11
|
+
}
|
|
12
|
+
async list() {
|
|
13
|
+
const [rows] = await this.transaction([{ sql: "select value from trigger_subscriptions order by id", values: [] }]);
|
|
14
|
+
return Promise.all(rows.map((row) => this.read(row)));
|
|
15
|
+
}
|
|
16
|
+
async listFlowTriggersForMaintenance(now, limit) {
|
|
17
|
+
const [rows] = await this.transaction([
|
|
18
|
+
{
|
|
19
|
+
sql: `select value from trigger_subscriptions where mode <> 'resource-set'
|
|
20
|
+
and status in ('active', 'deleting') and maintenance_at <= ? and (lease_until is null or lease_until <= ?)
|
|
21
|
+
order by maintenance_at, id limit ?`,
|
|
22
|
+
values: [now, now, limit],
|
|
23
|
+
},
|
|
24
|
+
]);
|
|
25
|
+
return Promise.all(rows.map((row) => this.read(row)));
|
|
26
|
+
}
|
|
27
|
+
async getFlowTrigger(id) {
|
|
28
|
+
const [[row]] = await this.transaction([
|
|
29
|
+
{ sql: "select value from trigger_subscriptions where id = ?", values: [id] },
|
|
30
|
+
]);
|
|
31
|
+
return row ? this.read(row) : null;
|
|
32
|
+
}
|
|
33
|
+
async insertFlowTrigger(record) {
|
|
34
|
+
const value = await this.codec.encode(JSON.stringify(record));
|
|
35
|
+
const [, , [row]] = await this.transaction([
|
|
36
|
+
{
|
|
37
|
+
sql: "update connections set revision = revision where id = ? and revision = ? and source = 'local' returning id",
|
|
38
|
+
values: [record.connectionId, record.connectionRevision],
|
|
39
|
+
},
|
|
40
|
+
{ sql: "update runtime_tokens set name = name where id = ? returning id", values: [record.tokenId] },
|
|
41
|
+
{
|
|
42
|
+
sql: `insert into trigger_subscriptions (id, mode, token_id, connection_id, trigger_id, status, reconcile_at, value)
|
|
43
|
+
select ?, ?, ?, ?, ?, ?, ?, ? where exists (select 1 from connections where id = ? and revision = ? and source = 'local')
|
|
44
|
+
and (? = 'resource-set' or exists (select 1 from runtime_tokens where id = ?))
|
|
45
|
+
on conflict (id) do nothing returning value`,
|
|
46
|
+
values: [
|
|
47
|
+
record.id,
|
|
48
|
+
record.mode,
|
|
49
|
+
record.tokenId,
|
|
50
|
+
record.connectionId,
|
|
51
|
+
record.triggerId,
|
|
52
|
+
record.status,
|
|
53
|
+
record.reconcileAt,
|
|
54
|
+
value,
|
|
55
|
+
record.connectionId,
|
|
56
|
+
record.connectionRevision,
|
|
57
|
+
record.mode,
|
|
58
|
+
record.tokenId,
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
]);
|
|
62
|
+
const existing = row ? await this.read(row) : await this.getFlowTrigger(record.id);
|
|
63
|
+
if (!existing)
|
|
64
|
+
throw new HttpRequestError("trigger_connection_error", "The connection or runtime token changed while creating the subscription.", 409);
|
|
65
|
+
return existing;
|
|
66
|
+
}
|
|
67
|
+
async claimFlowTrigger(id, owner, now, until) {
|
|
68
|
+
const [[row]] = await this.transaction([
|
|
69
|
+
{
|
|
70
|
+
sql: `update trigger_subscriptions set lease_owner = ?, lease_until = ?
|
|
71
|
+
where id = ? and (lease_until is null or lease_until <= ?) returning id`,
|
|
72
|
+
values: [owner, until, id, now],
|
|
73
|
+
},
|
|
74
|
+
]);
|
|
75
|
+
return !!row;
|
|
76
|
+
}
|
|
77
|
+
async saveFlowTrigger(record, owner, now) {
|
|
78
|
+
const value = await this.codec.encode(JSON.stringify(record));
|
|
79
|
+
const [[row]] = await this.transaction([
|
|
80
|
+
{
|
|
81
|
+
sql: `update trigger_subscriptions set status = ?, reconcile_at = ?, maintenance_at = ?, value = ?
|
|
82
|
+
where id = ? and lease_owner = ? and lease_until > ? returning id`,
|
|
83
|
+
values: [record.status, record.reconcileAt, now + 60_000, value, record.id, owner, now],
|
|
84
|
+
},
|
|
85
|
+
]);
|
|
86
|
+
return !!row;
|
|
87
|
+
}
|
|
88
|
+
async releaseFlowTrigger(id, owner) {
|
|
89
|
+
await this.transaction([
|
|
90
|
+
{
|
|
91
|
+
sql: "update trigger_subscriptions set lease_owner = null, lease_until = null where id = ? and lease_owner = ?",
|
|
92
|
+
values: [id, owner],
|
|
93
|
+
},
|
|
94
|
+
]);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Validator } from "@cfworker/json-schema";
|
|
2
|
+
import { HttpRequestError } from "../../server/api/http-utils.js";
|
|
3
|
+
export function resolveTriggerConfig(inputs, config, partial = false) {
|
|
4
|
+
const fields = inputs.filter((input) => "handle" in input);
|
|
5
|
+
const known = new Set(fields.map((field) => field.handle));
|
|
6
|
+
if (Object.keys(config).some((key) => !known.has(key)))
|
|
7
|
+
throw new HttpRequestError("invalid_input", "Unknown Trigger configuration field.", 400);
|
|
8
|
+
return Object.fromEntries(fields
|
|
9
|
+
.filter((field) => !partial || config[field.handle] !== undefined || field.value !== undefined)
|
|
10
|
+
.map((field) => {
|
|
11
|
+
const value = config[field.handle] !== undefined ? config[field.handle] : (field.value ?? null);
|
|
12
|
+
if (!(value === null && field.nullable) &&
|
|
13
|
+
!new Validator(field.jsonSchema, "2020-12").validate(value).valid)
|
|
14
|
+
throw new HttpRequestError("invalid_input", `Invalid Trigger configuration: ${field.handle}`, 400);
|
|
15
|
+
return [field.handle, value];
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ConnectorProxy } from "./proxy.ts";
|
|
2
|
+
import type { JsonValue } from "./types.ts";
|
|
3
|
+
export interface TriggerConfigOption {
|
|
4
|
+
readonly value: string;
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly color?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface TriggerConfigOptionsContext {
|
|
9
|
+
readonly field: string;
|
|
10
|
+
readonly config: Readonly<Record<string, JsonValue>>;
|
|
11
|
+
readonly connector: ConnectorProxy;
|
|
12
|
+
readonly signal?: AbortSignal;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { sha256Hex } from "../../core/aws-sigv4.js";
|
|
2
|
+
const encoder = new TextEncoder();
|
|
3
|
+
function canonicalText(value) {
|
|
4
|
+
if (value == null || typeof value == "boolean" || typeof value == "string" || typeof value == "number")
|
|
5
|
+
return JSON.stringify(value);
|
|
6
|
+
if (Array.isArray(value))
|
|
7
|
+
return `[${value.map(canonicalText).join(",")}]`;
|
|
8
|
+
const object = value;
|
|
9
|
+
return `{${Object.keys(object)
|
|
10
|
+
.toSorted()
|
|
11
|
+
.map((key) => `${JSON.stringify(key)}:${canonicalText(object[key])}`)
|
|
12
|
+
.join(",")}}`;
|
|
13
|
+
}
|
|
14
|
+
export function canonicalJsonBytes(value) {
|
|
15
|
+
return encoder.encode(canonicalText(value));
|
|
16
|
+
}
|
|
17
|
+
export async function digestBytes(bytes) {
|
|
18
|
+
return `sha256:${sha256Hex(bytes)}`;
|
|
19
|
+
}
|