@oomol-lab/open-connector 1.9.1 → 1.9.2
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/assets/open-connector/catalog/apps/aisa.json +1946 -56
- package/assets/open-connector/catalog/apps/akta.json +1181 -0
- package/assets/open-connector/catalog/apps/asana.json +110 -0
- package/assets/open-connector/catalog/apps/calendly.json +103 -0
- package/assets/open-connector/catalog/apps/clickup.json +104 -0
- package/assets/open-connector/catalog/apps/cloro.json +9289 -0
- package/assets/open-connector/catalog/apps/contextdev.json +20670 -0
- package/assets/open-connector/catalog/apps/deepseek.json +177 -0
- package/assets/open-connector/catalog/apps/defillama.json +23747 -0
- package/assets/open-connector/catalog/apps/fireflies.json +103 -0
- package/assets/open-connector/catalog/apps/fundable.json +7926 -0
- package/assets/open-connector/catalog/apps/intercom.json +110 -0
- package/assets/open-connector/catalog/apps/jira.json +110 -0
- package/assets/open-connector/catalog/apps/keenable.json +235 -0
- package/assets/open-connector/catalog/apps/kolsprite_mcp.json +1227 -0
- package/assets/open-connector/catalog/apps/litescrape.json +52514 -0
- package/assets/open-connector/catalog/apps/magichour.json +5926 -0
- package/assets/open-connector/catalog/apps/minimax.json +24 -14
- package/assets/open-connector/catalog/apps/notion.json +731 -76
- package/assets/open-connector/catalog/apps/octen.json +5248 -0
- package/assets/open-connector/catalog/apps/openrouter.json +10 -0
- package/assets/open-connector/catalog/apps/orbit.json +3574 -0
- package/assets/open-connector/catalog/apps/pandadoc.json +68 -0
- package/assets/open-connector/catalog/apps/pipedrive.json +86 -0
- package/assets/open-connector/catalog/apps/ploid.json +9802 -0
- package/assets/open-connector/catalog/apps/resend.json +100 -0
- package/assets/open-connector/catalog/apps/salesforce.json +2487 -119
- package/assets/open-connector/catalog/apps/saperly.json +7056 -0
- package/assets/open-connector/catalog/apps/search1api.json +2382 -0
- package/assets/open-connector/catalog/apps/sentry.json +129 -0
- package/assets/open-connector/catalog/apps/slackbot.json +230 -1
- package/assets/open-connector/catalog/apps/surf.json +11378 -0
- package/assets/open-connector/catalog/apps/tally.json +113 -0
- package/assets/open-connector/catalog/apps/tinyfish.json +6154 -0
- package/assets/open-connector/catalog/apps/typeform.json +90 -1
- package/assets/open-connector/catalog/apps/vaquill.json +5944 -0
- package/assets/open-connector/catalog/apps/vercel.json +110 -0
- package/assets/open-connector/catalog/apps/weixin_store.json +1256 -7
- package/assets/open-connector/catalog/apps/zoom.json +112 -0
- package/assets/open-connector/catalog/apps-index.json +1 -1
- package/package.json +1 -1
- package/src/core/json-schema.d.ts +11 -3
- package/src/core/json-schema.js +13 -3
- package/src/providers/action-contracts.generated.d.ts +23 -6
- package/src/providers/aisa/executors.js +238 -6
- package/src/providers/aisa/firecrawl-actions.d.ts +9 -0
- package/src/providers/aisa/firecrawl-actions.js +115 -0
- package/src/providers/akta/actions.d.ts +9 -0
- package/src/providers/akta/actions.js +420 -0
- package/src/providers/akta/executors.d.ts +4 -0
- package/src/providers/akta/executors.js +103 -0
- package/src/providers/asana/executors.d.ts +2 -0
- package/src/providers/asana/executors.js +2 -0
- package/src/providers/asana/trigger-on-task-event.d.ts +2 -0
- package/src/providers/asana/trigger-on-task-event.definition.d.ts +4 -0
- package/src/providers/asana/trigger-on-task-event.definition.js +42 -0
- package/src/providers/asana/trigger-on-task-event.js +160 -0
- package/src/providers/calendly/executors.d.ts +2 -0
- package/src/providers/calendly/executors.js +2 -0
- package/src/providers/calendly/trigger-on-booking-event.d.ts +2 -0
- package/src/providers/calendly/trigger-on-booking-event.definition.d.ts +5 -0
- package/src/providers/calendly/trigger-on-booking-event.definition.js +42 -0
- package/src/providers/calendly/trigger-on-booking-event.js +144 -0
- package/src/providers/clickup/executors.d.ts +2 -0
- package/src/providers/clickup/executors.js +2 -0
- package/src/providers/clickup/trigger-on-task-event.d.ts +2 -0
- package/src/providers/clickup/trigger-on-task-event.definition.d.ts +4 -0
- package/src/providers/clickup/trigger-on-task-event.definition.js +41 -0
- package/src/providers/clickup/trigger-on-task-event.js +94 -0
- package/src/providers/cloro/actions.d.ts +12 -0
- package/src/providers/cloro/actions.js +155 -0
- package/src/providers/cloro/executors.d.ts +4 -0
- package/src/providers/cloro/executors.js +67 -0
- package/src/providers/cloro/inputs.d.ts +10 -0
- package/src/providers/cloro/inputs.js +680 -0
- package/src/providers/contextdev/actions.d.ts +14 -0
- package/src/providers/contextdev/actions.js +647 -0
- package/src/providers/contextdev/executors.d.ts +4 -0
- package/src/providers/contextdev/executors.js +109 -0
- package/src/providers/contextdev/files.d.ts +3 -0
- package/src/providers/contextdev/files.js +49 -0
- package/src/providers/contextdev/input-schemas.d.ts +49 -0
- package/src/providers/contextdev/input-schemas.js +3082 -0
- package/src/providers/contextdev/output-schemas.d.ts +49 -0
- package/src/providers/contextdev/output-schemas.js +1599 -0
- package/src/providers/deepseek/executors.d.ts +0 -5
- package/src/providers/deepseek/executors.js +38 -25
- package/src/providers/defillama/actions.d.ts +24 -0
- package/src/providers/defillama/actions.js +24 -0
- package/src/providers/defillama/dimensions-definitions.d.ts +2 -0
- package/src/providers/defillama/dimensions-definitions.js +1387 -0
- package/src/providers/defillama/ecosystem-definitions.d.ts +2 -0
- package/src/providers/defillama/ecosystem-definitions.js +758 -0
- package/src/providers/defillama/equities-definitions.d.ts +2 -0
- package/src/providers/defillama/equities-definitions.js +733 -0
- package/src/providers/defillama/executors.d.ts +4 -0
- package/src/providers/defillama/executors.js +196 -0
- package/src/providers/defillama/markets-definitions.d.ts +2 -0
- package/src/providers/defillama/markets-definitions.js +624 -0
- package/src/providers/defillama/shared-schemas.d.ts +71 -0
- package/src/providers/defillama/shared-schemas.js +157 -0
- package/src/providers/defillama/tvl-definitions.d.ts +2 -0
- package/src/providers/defillama/tvl-definitions.js +546 -0
- package/src/providers/defillama/yields-definitions.d.ts +2 -0
- package/src/providers/defillama/yields-definitions.js +766 -0
- package/src/providers/feishu_app_bot/trigger-on-event.js +2 -0
- package/src/providers/fireflies/executors.d.ts +2 -0
- package/src/providers/fireflies/executors.js +2 -0
- package/src/providers/fireflies/trigger-on-meeting-ready.d.ts +2 -0
- package/src/providers/fireflies/trigger-on-meeting-ready.definition.d.ts +4 -0
- package/src/providers/fireflies/trigger-on-meeting-ready.definition.js +44 -0
- package/src/providers/fireflies/trigger-on-meeting-ready.js +60 -0
- package/src/providers/fundable/actions.d.ts +8 -0
- package/src/providers/fundable/actions.js +1515 -0
- package/src/providers/fundable/executors.d.ts +4 -0
- package/src/providers/fundable/executors.js +74 -0
- package/src/providers/gmail/message.d.ts +1 -6
- package/src/providers/gmail/message.js +1 -1
- package/src/providers/intercom/executors.d.ts +2 -0
- package/src/providers/intercom/executors.js +2 -0
- package/src/providers/intercom/trigger-on-conversation-event.d.ts +2 -0
- package/src/providers/intercom/trigger-on-conversation-event.definition.d.ts +4 -0
- package/src/providers/intercom/trigger-on-conversation-event.definition.js +42 -0
- package/src/providers/intercom/trigger-on-conversation-event.js +23 -0
- package/src/providers/jira/executors.d.ts +2 -0
- package/src/providers/jira/executors.js +2 -0
- package/src/providers/jira/trigger-on-issue-event.d.ts +2 -0
- package/src/providers/jira/trigger-on-issue-event.definition.d.ts +4 -0
- package/src/providers/jira/trigger-on-issue-event.definition.js +44 -0
- package/src/providers/jira/trigger-on-issue-event.js +116 -0
- package/src/providers/jira/trigger-resource.d.ts +4 -0
- package/src/providers/jira/trigger-resource.js +141 -0
- package/src/providers/keenable/executors.d.ts +4 -0
- package/src/providers/keenable/executors.js +20 -0
- package/src/providers/keenable/runtime.d.ts +26 -0
- package/src/providers/keenable/runtime.js +89 -0
- package/src/providers/kolsprite_mcp/actions.d.ts +2 -0
- package/src/providers/kolsprite_mcp/actions.js +519 -0
- package/src/providers/kolsprite_mcp/executors.d.ts +4 -0
- package/src/providers/kolsprite_mcp/executors.js +89 -0
- package/src/providers/litescrape/actions.d.ts +12 -0
- package/src/providers/litescrape/actions.js +124 -0
- package/src/providers/litescrape/airbnb-schemas.d.ts +2 -0
- package/src/providers/litescrape/airbnb-schemas.js +72 -0
- package/src/providers/litescrape/aliexpress-schemas.d.ts +2 -0
- package/src/providers/litescrape/aliexpress-schemas.js +52 -0
- package/src/providers/litescrape/amazon-schemas.d.ts +2 -0
- package/src/providers/litescrape/amazon-schemas.js +358 -0
- package/src/providers/litescrape/apartments-schemas.d.ts +2 -0
- package/src/providers/litescrape/apartments-schemas.js +45 -0
- package/src/providers/litescrape/apple-schemas.d.ts +2 -0
- package/src/providers/litescrape/apple-schemas.js +215 -0
- package/src/providers/litescrape/ashby-schemas.d.ts +2 -0
- package/src/providers/litescrape/ashby-schemas.js +82 -0
- package/src/providers/litescrape/baidu-schemas.d.ts +2 -0
- package/src/providers/litescrape/baidu-schemas.js +31 -0
- package/src/providers/litescrape/bestbuy-schemas.d.ts +2 -0
- package/src/providers/litescrape/bestbuy-schemas.js +56 -0
- package/src/providers/litescrape/bing-schemas.d.ts +2 -0
- package/src/providers/litescrape/bing-schemas.js +315 -0
- package/src/providers/litescrape/brave-schemas.d.ts +2 -0
- package/src/providers/litescrape/brave-schemas.js +101 -0
- package/src/providers/litescrape/copilot-schemas.d.ts +2 -0
- package/src/providers/litescrape/copilot-schemas.js +590 -0
- package/src/providers/litescrape/duckduckgo-schemas.d.ts +2 -0
- package/src/providers/litescrape/duckduckgo-schemas.js +64 -0
- package/src/providers/litescrape/ebay-schemas.d.ts +2 -0
- package/src/providers/litescrape/ebay-schemas.js +300 -0
- package/src/providers/litescrape/etsy-schemas.d.ts +2 -0
- package/src/providers/litescrape/etsy-schemas.js +52 -0
- package/src/providers/litescrape/eventbrite-schemas.d.ts +2 -0
- package/src/providers/litescrape/eventbrite-schemas.js +43 -0
- package/src/providers/litescrape/executors.d.ts +4 -0
- package/src/providers/litescrape/executors.js +138 -0
- package/src/providers/litescrape/facebook-schemas.d.ts +2 -0
- package/src/providers/litescrape/facebook-schemas.js +283 -0
- package/src/providers/litescrape/glassdoor-schemas.d.ts +2 -0
- package/src/providers/litescrape/glassdoor-schemas.js +147 -0
- package/src/providers/litescrape/google-schemas.d.ts +2 -0
- package/src/providers/litescrape/google-schemas.js +1686 -0
- package/src/providers/litescrape/homedepot-schemas.d.ts +2 -0
- package/src/providers/litescrape/homedepot-schemas.js +58 -0
- package/src/providers/litescrape/homes-schemas.d.ts +2 -0
- package/src/providers/litescrape/homes-schemas.js +45 -0
- package/src/providers/litescrape/ikea-schemas.d.ts +2 -0
- package/src/providers/litescrape/ikea-schemas.js +56 -0
- package/src/providers/litescrape/indeed-schemas.d.ts +2 -0
- package/src/providers/litescrape/indeed-schemas.js +141 -0
- package/src/providers/litescrape/instagram-schemas.d.ts +2 -0
- package/src/providers/litescrape/instagram-schemas.js +234 -0
- package/src/providers/litescrape/kroger-schemas.d.ts +2 -0
- package/src/providers/litescrape/kroger-schemas.js +62 -0
- package/src/providers/litescrape/levels-schemas.d.ts +2 -0
- package/src/providers/litescrape/levels-schemas.js +153 -0
- package/src/providers/litescrape/naver-schemas.d.ts +2 -0
- package/src/providers/litescrape/naver-schemas.js +107 -0
- package/src/providers/litescrape/realtor-schemas.d.ts +2 -0
- package/src/providers/litescrape/realtor-schemas.js +47 -0
- package/src/providers/litescrape/redfin-schemas.d.ts +2 -0
- package/src/providers/litescrape/redfin-schemas.js +112 -0
- package/src/providers/litescrape/shared.d.ts +9 -0
- package/src/providers/litescrape/shared.js +1 -0
- package/src/providers/litescrape/sprouts-schemas.d.ts +2 -0
- package/src/providers/litescrape/sprouts-schemas.js +72 -0
- package/src/providers/litescrape/target-schemas.d.ts +2 -0
- package/src/providers/litescrape/target-schemas.js +56 -0
- package/src/providers/litescrape/tiktok-schemas.d.ts +2 -0
- package/src/providers/litescrape/tiktok-schemas.js +625 -0
- package/src/providers/litescrape/tools.d.ts +2 -0
- package/src/providers/litescrape/tools.js +88 -0
- package/src/providers/litescrape/tripadvisor-schemas.d.ts +2 -0
- package/src/providers/litescrape/tripadvisor-schemas.js +119 -0
- package/src/providers/litescrape/walmart-schemas.d.ts +2 -0
- package/src/providers/litescrape/walmart-schemas.js +52 -0
- package/src/providers/litescrape/wayfair-schemas.d.ts +2 -0
- package/src/providers/litescrape/wayfair-schemas.js +52 -0
- package/src/providers/litescrape/web-schemas.d.ts +2 -0
- package/src/providers/litescrape/web-schemas.js +463 -0
- package/src/providers/litescrape/wholefoods-schemas.d.ts +2 -0
- package/src/providers/litescrape/wholefoods-schemas.js +56 -0
- package/src/providers/litescrape/x-schemas.d.ts +2 -0
- package/src/providers/litescrape/x-schemas.js +128 -0
- package/src/providers/litescrape/yahoo-schemas.d.ts +2 -0
- package/src/providers/litescrape/yahoo-schemas.js +234 -0
- package/src/providers/litescrape/yandex-schemas.d.ts +2 -0
- package/src/providers/litescrape/yandex-schemas.js +179 -0
- package/src/providers/litescrape/yelp-schemas.d.ts +2 -0
- package/src/providers/litescrape/yelp-schemas.js +130 -0
- package/src/providers/litescrape/youtube-schemas.d.ts +2 -0
- package/src/providers/litescrape/youtube-schemas.js +128 -0
- package/src/providers/litescrape/zillow-schemas.d.ts +2 -0
- package/src/providers/litescrape/zillow-schemas.js +128 -0
- package/src/providers/litescrape/ziprecruiter-schemas.d.ts +2 -0
- package/src/providers/litescrape/ziprecruiter-schemas.js +96 -0
- package/src/providers/magichour/actions.d.ts +22 -0
- package/src/providers/magichour/actions.js +308 -0
- package/src/providers/magichour/audio-schemas.d.ts +2 -0
- package/src/providers/magichour/audio-schemas.js +54 -0
- package/src/providers/magichour/executors.d.ts +4 -0
- package/src/providers/magichour/executors.js +115 -0
- package/src/providers/magichour/image-schemas.d.ts +2 -0
- package/src/providers/magichour/image-schemas.js +443 -0
- package/src/providers/magichour/project-schemas.d.ts +8 -0
- package/src/providers/magichour/project-schemas.js +65 -0
- package/src/providers/magichour/shared-schemas.d.ts +8 -0
- package/src/providers/magichour/shared-schemas.js +18 -0
- package/src/providers/magichour/utility-schemas.d.ts +11 -0
- package/src/providers/magichour/utility-schemas.js +150 -0
- package/src/providers/magichour/video-schemas.d.ts +2 -0
- package/src/providers/magichour/video-schemas.js +629 -0
- package/src/providers/magichour/voices.d.ts +1 -0
- package/src/providers/magichour/voices.js +1268 -0
- package/src/providers/minimax/executors.js +19 -4
- package/src/providers/minimax/text-models.d.ts +2 -0
- package/src/providers/minimax/text-models.js +34 -0
- package/src/providers/moneyforward_mcp/manifest.d.ts +0 -2
- package/src/providers/moneyforward_mcp/manifest.js +1 -1
- package/src/providers/notion/executors.js +36 -3
- package/src/providers/octen/actions.d.ts +6 -0
- package/src/providers/octen/actions.js +919 -0
- package/src/providers/octen/executors.d.ts +4 -0
- package/src/providers/octen/executors.js +125 -0
- package/src/providers/octen/inputs.d.ts +2 -0
- package/src/providers/octen/inputs.js +2434 -0
- package/src/providers/octen/research.d.ts +1 -0
- package/src/providers/octen/research.js +86 -0
- package/src/providers/openrouter/executors.js +7 -4
- package/src/providers/orbit/actions.d.ts +2 -0
- package/src/providers/orbit/actions.js +3030 -0
- package/src/providers/orbit/executors.d.ts +4 -0
- package/src/providers/orbit/executors.js +106 -0
- package/src/providers/orbit/routes.d.ts +9 -0
- package/src/providers/orbit/routes.js +170 -0
- package/src/providers/pandadoc/executors.d.ts +2 -0
- package/src/providers/pandadoc/executors.js +2 -0
- package/src/providers/pandadoc/trigger-on-document-event.d.ts +2 -0
- package/src/providers/pandadoc/trigger-on-document-event.definition.d.ts +4 -0
- package/src/providers/pandadoc/trigger-on-document-event.definition.js +33 -0
- package/src/providers/pandadoc/trigger-on-document-event.js +96 -0
- package/src/providers/pipedrive/executors.d.ts +2 -0
- package/src/providers/pipedrive/executors.js +2 -0
- package/src/providers/pipedrive/trigger-on-crm-event.d.ts +2 -0
- package/src/providers/pipedrive/trigger-on-crm-event.definition.d.ts +4 -0
- package/src/providers/pipedrive/trigger-on-crm-event.definition.js +30 -0
- package/src/providers/pipedrive/trigger-on-crm-event.js +101 -0
- package/src/providers/ploid/actions.d.ts +16 -0
- package/src/providers/ploid/actions.js +23 -0
- package/src/providers/ploid/endpoints.json +8440 -0
- package/src/providers/ploid/executors.d.ts +4 -0
- package/src/providers/ploid/executors.js +119 -0
- package/src/providers/provider-runtime.d.ts +13 -0
- package/src/providers/provider-runtime.js +37 -4
- package/src/providers/registry.generated.js +17 -0
- package/src/providers/resend/executors.d.ts +2 -0
- package/src/providers/resend/executors.js +2 -0
- package/src/providers/resend/trigger-on-email-event.d.ts +2 -0
- package/src/providers/resend/trigger-on-email-event.definition.d.ts +4 -0
- package/src/providers/resend/trigger-on-email-event.definition.js +37 -0
- package/src/providers/resend/trigger-on-email-event.js +125 -0
- package/src/providers/salesforce/chatter-routes.d.ts +107 -0
- package/src/providers/salesforce/chatter-routes.js +140 -0
- package/src/providers/salesforce/context.d.ts +2 -2
- package/src/providers/salesforce/context.js +7 -4
- package/src/providers/salesforce/executors.js +10 -0
- package/src/providers/salesforce/runtime-approvals.d.ts +2 -0
- package/src/providers/salesforce/runtime-approvals.js +52 -0
- package/src/providers/salesforce/runtime-base.js +14 -3
- package/src/providers/salesforce/runtime-chatter.d.ts +2 -0
- package/src/providers/salesforce/runtime-chatter.js +78 -0
- package/src/providers/salesforce/runtime-knowledge.d.ts +2 -0
- package/src/providers/salesforce/runtime-knowledge.js +34 -0
- package/src/providers/salesforce/runtime-leads.d.ts +2 -0
- package/src/providers/salesforce/runtime-leads.js +117 -0
- package/src/providers/salesforce/runtime-platform.d.ts +2 -0
- package/src/providers/salesforce/runtime-platform.js +67 -0
- package/src/providers/saperly/actions.d.ts +17 -0
- package/src/providers/saperly/actions.js +869 -0
- package/src/providers/saperly/executors.d.ts +4 -0
- package/src/providers/saperly/executors.js +113 -0
- package/src/providers/saperly/schemas.d.ts +33 -0
- package/src/providers/saperly/schemas.js +601 -0
- package/src/providers/search1api/actions.d.ts +2 -0
- package/src/providers/search1api/actions.js +39 -0
- package/src/providers/search1api/executors.d.ts +4 -0
- package/src/providers/search1api/executors.js +72 -0
- package/src/providers/search1api/runtime.d.ts +3 -0
- package/src/providers/search1api/runtime.js +44 -0
- package/src/providers/search1api/schemas.d.ts +3 -0
- package/src/providers/search1api/schemas.js +1834 -0
- package/src/providers/sentry/executors.d.ts +2 -0
- package/src/providers/sentry/executors.js +2 -0
- package/src/providers/sentry/trigger-on-issue-alert.d.ts +2 -0
- package/src/providers/sentry/trigger-on-issue-alert.definition.d.ts +4 -0
- package/src/providers/sentry/trigger-on-issue-alert.definition.js +64 -0
- package/src/providers/sentry/trigger-on-issue-alert.js +80 -0
- package/src/providers/sf_express/runtime.d.ts +0 -16
- package/src/providers/sf_express/runtime.js +2 -2
- package/src/providers/slack/runtime.d.ts +6 -1
- package/src/providers/slack/runtime.js +21 -0
- package/src/providers/slackbot/actions.js +17 -1
- package/src/providers/slackbot/executors.d.ts +2 -0
- package/src/providers/slackbot/executors.js +5 -1
- package/src/providers/slackbot/trigger-on-event.d.ts +2 -0
- package/src/providers/slackbot/trigger-on-event.definition.d.ts +4 -0
- package/src/providers/slackbot/trigger-on-event.definition.js +57 -0
- package/src/providers/slackbot/trigger-on-event.js +23 -0
- package/src/providers/surf/actions.d.ts +21 -0
- package/src/providers/surf/actions.js +26 -0
- package/src/providers/surf/discovery-definitions.d.ts +2 -0
- package/src/providers/surf/discovery-definitions.js +871 -0
- package/src/providers/surf/equity-definitions.d.ts +2 -0
- package/src/providers/surf/equity-definitions.js +322 -0
- package/src/providers/surf/executors.d.ts +4 -0
- package/src/providers/surf/executors.js +131 -0
- package/src/providers/surf/market-definitions.d.ts +2 -0
- package/src/providers/surf/market-definitions.js +885 -0
- package/src/providers/surf/onchain-definitions.d.ts +2 -0
- package/src/providers/surf/onchain-definitions.js +901 -0
- package/src/providers/surf/prediction-definitions.d.ts +2 -0
- package/src/providers/surf/prediction-definitions.js +683 -0
- package/src/providers/surf/shared-schemas.d.ts +18 -0
- package/src/providers/surf/shared-schemas.js +37 -0
- package/src/providers/tally/executors.d.ts +2 -0
- package/src/providers/tally/executors.js +2 -0
- package/src/providers/tally/trigger-on-form-response.d.ts +2 -0
- package/src/providers/tally/trigger-on-form-response.definition.d.ts +4 -0
- package/src/providers/tally/trigger-on-form-response.definition.js +54 -0
- package/src/providers/tally/trigger-on-form-response.js +166 -0
- package/src/providers/tinyfish/actions.d.ts +6 -0
- package/src/providers/tinyfish/actions.js +19 -0
- package/src/providers/tinyfish/agent-actions.d.ts +2 -0
- package/src/providers/tinyfish/agent-actions.js +268 -0
- package/src/providers/tinyfish/data-actions.d.ts +2 -0
- package/src/providers/tinyfish/data-actions.js +186 -0
- package/src/providers/tinyfish/data-schemas.d.ts +7 -0
- package/src/providers/tinyfish/data-schemas.js +103 -0
- package/src/providers/tinyfish/endpoints.d.ts +14 -0
- package/src/providers/tinyfish/endpoints.js +1 -0
- package/src/providers/tinyfish/executors.d.ts +4 -0
- package/src/providers/tinyfish/executors.js +133 -0
- package/src/providers/tinyfish/management-actions.d.ts +2 -0
- package/src/providers/tinyfish/management-actions.js +524 -0
- package/src/providers/tinyfish/monitor-schemas.d.ts +5 -0
- package/src/providers/tinyfish/monitor-schemas.js +65 -0
- package/src/providers/tinyfish/research-schemas.d.ts +6 -0
- package/src/providers/tinyfish/research-schemas.js +71 -0
- package/src/providers/trello/executors.js +5 -2
- package/src/providers/typeform/executors.d.ts +2 -0
- package/src/providers/typeform/executors.js +2 -0
- package/src/providers/typeform/trigger-on-form-response.d.ts +2 -0
- package/src/providers/typeform/trigger-on-form-response.definition.d.ts +4 -0
- package/src/providers/typeform/trigger-on-form-response.definition.js +40 -0
- package/src/providers/typeform/trigger-on-form-response.js +68 -0
- package/src/providers/vaquill/actions.d.ts +13 -0
- package/src/providers/vaquill/actions.js +529 -0
- package/src/providers/vaquill/executors.d.ts +4 -0
- package/src/providers/vaquill/executors.js +141 -0
- package/src/providers/vaquill/schemas.d.ts +67 -0
- package/src/providers/vaquill/schemas.js +4953 -0
- package/src/providers/vercel/executors.d.ts +2 -0
- package/src/providers/vercel/executors.js +2 -0
- package/src/providers/vercel/trigger-on-deployment-event.d.ts +2 -0
- package/src/providers/vercel/trigger-on-deployment-event.definition.d.ts +5 -0
- package/src/providers/vercel/trigger-on-deployment-event.definition.js +41 -0
- package/src/providers/vercel/trigger-on-deployment-event.js +102 -0
- package/src/providers/weixin_bot/runtime.d.ts +0 -1
- package/src/providers/weixin_bot/runtime.js +1 -1
- package/src/providers/weixin_store/access-token.d.ts +3 -3
- package/src/providers/weixin_store/access-token.js +15 -7
- package/src/providers/weixin_store/executors.js +214 -1
- package/src/providers/zoom/executors.d.ts +2 -0
- package/src/providers/zoom/executors.js +2 -0
- package/src/providers/zoom/trigger-on-recording-ready.d.ts +2 -0
- package/src/providers/zoom/trigger-on-recording-ready.definition.d.ts +4 -0
- package/src/providers/zoom/trigger-on-recording-ready.definition.js +44 -0
- package/src/providers/zoom/trigger-on-recording-ready.js +39 -0
- package/src/server/api/action-example.js +12 -1
- package/src/server/api/pattern-example.js +35 -1
- package/src/server/api/trigger-routes.js +1 -1
- package/src/server/connect-app.js +1 -0
- package/src/triggers/common/integration.d.ts +15 -3
- package/src/triggers/common/integration.js +5 -0
- package/src/triggers/common/proxy.d.ts +7 -0
- package/src/triggers/managed-webhook.d.ts +13 -0
- package/src/triggers/managed-webhook.js +48 -0
- package/src/triggers/request.d.ts +5 -1
- package/src/triggers/request.js +2 -0
- package/src/triggers/resources.d.ts +8 -2
- package/src/triggers/resources.js +31 -0
- package/src/triggers/signature.d.ts +3 -3
- package/src/triggers/signature.js +4 -6
- package/src/triggers/sources/configuration-schema.d.ts +5 -0
- package/src/triggers/sources/configuration-schema.js +118 -0
- package/src/triggers/sources/configuration.d.ts +115 -0
- package/src/triggers/sources/configuration.js +1 -0
- package/src/triggers/sources/definition.d.ts +61 -0
- package/src/triggers/sources/definition.js +3 -0
- package/src/triggers/sources/feishu-demands.d.ts +6 -0
- package/src/triggers/sources/feishu-demands.js +24 -0
- package/src/triggers/sources/feishu-events.d.ts +19 -0
- package/src/triggers/sources/feishu-events.js +108 -0
- package/src/triggers/sources/feishu.d.ts +3 -0
- package/src/triggers/sources/feishu.js +85 -0
- package/src/triggers/sources/fireflies.d.ts +3 -0
- package/src/triggers/sources/fireflies.js +100 -0
- package/src/triggers/sources/intercom.d.ts +3 -0
- package/src/triggers/sources/intercom.js +86 -0
- package/src/triggers/sources/jira.d.ts +3 -0
- package/src/triggers/sources/jira.js +120 -0
- package/src/triggers/sources/operation.d.ts +42 -0
- package/src/triggers/sources/operation.js +146 -0
- package/src/triggers/sources/sentry.d.ts +3 -0
- package/src/triggers/sources/sentry.js +125 -0
- package/src/triggers/sources/signature.d.ts +1 -0
- package/src/triggers/sources/signature.js +10 -0
- package/src/triggers/sources/slack.d.ts +3 -0
- package/src/triggers/sources/slack.js +127 -0
- package/src/triggers/sources/zoom.d.ts +3 -0
- package/src/triggers/sources/zoom.js +113 -0
- package/src/triggers/trigger-runner.d.ts +2 -0
- package/src/triggers/trigger-runner.js +52 -16
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { feishuResourceKind } from "../../providers/feishu_app_bot/trigger-config.js";
|
|
2
|
+
import { PermanentIntegrationError } from "../common/integration.js";
|
|
3
|
+
import { isJsonObject } from "../common/json.js";
|
|
4
|
+
export function feishuSubscriptions(config, provider) {
|
|
5
|
+
if (config.resource == null)
|
|
6
|
+
return [];
|
|
7
|
+
if (!isJsonObject(config.resource))
|
|
8
|
+
throw new PermanentIntegrationError("Invalid Feishu resource.");
|
|
9
|
+
const { kind, id, documentType } = config.resource;
|
|
10
|
+
if (typeof id != "string" || id.length == 0 || kind != feishuResourceKind(config.eventTypes))
|
|
11
|
+
throw new PermanentIntegrationError("Invalid resource subscription.");
|
|
12
|
+
if (kind == "document") {
|
|
13
|
+
if (typeof documentType != "string" ||
|
|
14
|
+
!["doc", "docx", "sheet", "bitable", "file", "folder", "slides"].includes(documentType))
|
|
15
|
+
throw new PermanentIntegrationError("A supported document type is required.");
|
|
16
|
+
return config.eventTypes.map((eventType) => ({
|
|
17
|
+
key: JSON.stringify(["document", documentType, id, eventType]),
|
|
18
|
+
config: { ...config, eventTypes: [eventType] },
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
if (kind == "calendar" || (kind == "approval" && provider == "feishu_app_bot"))
|
|
22
|
+
return [{ key: JSON.stringify([kind, id]), config }];
|
|
23
|
+
throw new PermanentIntegrationError("Unsupported Feishu resource subscription.");
|
|
24
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { JsonValue } from "../common/types.ts";
|
|
2
|
+
export interface FeishuEvent {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly type: string;
|
|
5
|
+
readonly appId: string;
|
|
6
|
+
readonly tenantKey: string;
|
|
7
|
+
readonly occurredAt: string | null;
|
|
8
|
+
readonly body: Readonly<Record<string, JsonValue>>;
|
|
9
|
+
}
|
|
10
|
+
export declare function receiveFeishuEvent(rawBody: Uint8Array, headers: Headers, source: {
|
|
11
|
+
readonly appId: string;
|
|
12
|
+
readonly verificationToken: string;
|
|
13
|
+
readonly encryptKey: string;
|
|
14
|
+
}, now: number): Promise<{
|
|
15
|
+
readonly challenge: string;
|
|
16
|
+
} | {
|
|
17
|
+
readonly event: FeishuEvent;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function matchesFeishuEvent(config: Readonly<Record<string, JsonValue>>, event: Pick<FeishuEvent, "type" | "body">): boolean;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { isJsonObject } from "../common/json.js";
|
|
2
|
+
const encoder = new TextEncoder();
|
|
3
|
+
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
4
|
+
export async function receiveFeishuEvent(rawBody, headers, source, now) {
|
|
5
|
+
const envelope = JSON.parse(decoder.decode(rawBody));
|
|
6
|
+
if (!isJsonObject(envelope) ||
|
|
7
|
+
typeof envelope.encrypt != "string" ||
|
|
8
|
+
!/^[A-Za-z0-9+/]+={0,2}$/.test(envelope.encrypt)) {
|
|
9
|
+
throw new TypeError("An encrypted Feishu envelope is required.");
|
|
10
|
+
}
|
|
11
|
+
const bytes = Uint8Array.from(atob(envelope.encrypt), (character) => character.charCodeAt(0));
|
|
12
|
+
if (bytes.length < 32 || bytes.length % 16 != 0)
|
|
13
|
+
throw new TypeError("Invalid encrypted Feishu envelope.");
|
|
14
|
+
const key = await crypto.subtle.importKey("raw", await crypto.subtle.digest("SHA-256", encoder.encode(source.encryptKey)), "AES-CBC", false, ["decrypt"]);
|
|
15
|
+
const value = JSON.parse(decoder.decode(await crypto.subtle.decrypt({ name: "AES-CBC", iv: bytes.slice(0, 16) }, key, bytes.slice(16))));
|
|
16
|
+
if (!isJsonObject(value))
|
|
17
|
+
throw new TypeError("Invalid Feishu event.");
|
|
18
|
+
const header = isJsonObject(value.header) ? value.header : undefined;
|
|
19
|
+
if (!sameSecret(header?.token ?? value.token, source.verificationToken))
|
|
20
|
+
throw new TypeError("Invalid Feishu verification token.");
|
|
21
|
+
if (value.type == "url_verification") {
|
|
22
|
+
if (typeof value.challenge != "string" || value.challenge.length == 0 || value.challenge.length > 1024)
|
|
23
|
+
throw new TypeError("Invalid challenge.");
|
|
24
|
+
return { challenge: value.challenge };
|
|
25
|
+
}
|
|
26
|
+
const timestamp = headers.get("x-lark-request-timestamp") ?? "";
|
|
27
|
+
const nonce = headers.get("x-lark-request-nonce") ?? "";
|
|
28
|
+
const signature = headers.get("x-lark-signature") ?? "";
|
|
29
|
+
if (!/^\d{10}$/.test(timestamp) ||
|
|
30
|
+
Math.abs(now - Number(timestamp) * 1000) > 86_400_000 ||
|
|
31
|
+
nonce.length == 0 ||
|
|
32
|
+
nonce.length > 256) {
|
|
33
|
+
throw new TypeError("Invalid Feishu request identity.");
|
|
34
|
+
}
|
|
35
|
+
const prefix = encoder.encode(timestamp + nonce + source.encryptKey);
|
|
36
|
+
const signed = new Uint8Array(prefix.length + rawBody.length);
|
|
37
|
+
signed.set(prefix);
|
|
38
|
+
signed.set(rawBody, prefix.length);
|
|
39
|
+
const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", signed));
|
|
40
|
+
const hex = Array.from(digest, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
41
|
+
if (!sameSecret(signature, hex))
|
|
42
|
+
throw new TypeError("Invalid Feishu signature.");
|
|
43
|
+
const body = value.event;
|
|
44
|
+
if (!isJsonObject(body))
|
|
45
|
+
throw new TypeError("Missing Feishu event body.");
|
|
46
|
+
if (value.schema != null && value.schema != "2.0")
|
|
47
|
+
throw new TypeError("Unsupported Feishu event schema.");
|
|
48
|
+
const type = header?.event_type ?? body.type;
|
|
49
|
+
const appId = header?.app_id ?? body.app_id ?? value.app_id;
|
|
50
|
+
const tenantKey = header?.tenant_key ?? body.tenant_key ?? value.tenant_key;
|
|
51
|
+
let id = header?.event_id ?? value.uuid;
|
|
52
|
+
if (type == "im.message.receive_v1" && isJsonObject(body.message))
|
|
53
|
+
id = body.message.message_id;
|
|
54
|
+
if (typeof id != "string" ||
|
|
55
|
+
id.length == 0 ||
|
|
56
|
+
id.length > 256 ||
|
|
57
|
+
typeof type != "string" ||
|
|
58
|
+
!/^[a-z][a-z0-9_.]{0,127}$/.test(type)) {
|
|
59
|
+
throw new TypeError("Missing Feishu event identity.");
|
|
60
|
+
}
|
|
61
|
+
if (appId != source.appId)
|
|
62
|
+
throw new TypeError("Feishu event source does not match.");
|
|
63
|
+
if (typeof tenantKey != "string" || tenantKey.length == 0 || tenantKey.length > 256)
|
|
64
|
+
throw new TypeError("Invalid Feishu event tenant.");
|
|
65
|
+
if (type == "card.action.trigger" || type == "app_ticket")
|
|
66
|
+
throw new TypeError("This callback is not an asynchronous business event.");
|
|
67
|
+
const { token: _token, ...business } = body;
|
|
68
|
+
const occurredAt = header?.create_time ?? value.ts;
|
|
69
|
+
return {
|
|
70
|
+
event: {
|
|
71
|
+
id: `${type}:${id}`,
|
|
72
|
+
type,
|
|
73
|
+
appId: source.appId,
|
|
74
|
+
tenantKey,
|
|
75
|
+
occurredAt: typeof occurredAt == "string" ? occurredAt : null,
|
|
76
|
+
body: business,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function sameSecret(value, expected) {
|
|
81
|
+
if (typeof value != "string" || value.length != expected.length)
|
|
82
|
+
return false;
|
|
83
|
+
let difference = 0;
|
|
84
|
+
for (let index = 0; index < expected.length; index += 1)
|
|
85
|
+
difference |= value.charCodeAt(index) ^ expected.charCodeAt(index);
|
|
86
|
+
return difference == 0;
|
|
87
|
+
}
|
|
88
|
+
export function matchesFeishuEvent(config, event) {
|
|
89
|
+
if (!Array.isArray(config.eventTypes) || !config.eventTypes.includes(event.type))
|
|
90
|
+
return false;
|
|
91
|
+
const chatIds = config.chatIds;
|
|
92
|
+
if (Array.isArray(chatIds) && chatIds.length > 0) {
|
|
93
|
+
const chatId = isJsonObject(event.body.message) ? event.body.message.chat_id : event.body.chat_id;
|
|
94
|
+
if (typeof chatId != "string" || !chatIds.includes(chatId))
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const resource = config.resource;
|
|
98
|
+
if (isJsonObject(resource)) {
|
|
99
|
+
const id = resource.kind == "document"
|
|
100
|
+
? event.body.file_token
|
|
101
|
+
: resource.kind == "calendar"
|
|
102
|
+
? event.body.calendar_id
|
|
103
|
+
: event.body.approval_code;
|
|
104
|
+
if (id != resource.id)
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CreateEventSource, EventSource, UpdateEventSource } from "./configuration.ts";
|
|
2
|
+
import type { EventSourceDefinition } from "./definition.ts";
|
|
3
|
+
export declare const feishuApplication: EventSourceDefinition<CreateEventSource, UpdateEventSource, Pick<EventSource, "appId" | "manageSubscriptions" | "verificationTokenConfigured" | "encryptKeyConfigured" | "verifiedAt">>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { PermanentIntegrationError } from "../common/integration.js";
|
|
2
|
+
import { SourceIdentityError } from "./definition.js";
|
|
3
|
+
import { feishuSubscriptions } from "./feishu-demands.js";
|
|
4
|
+
import { receiveFeishuEvent, matchesFeishuEvent } from "./feishu-events.js";
|
|
5
|
+
export const feishuApplication = {
|
|
6
|
+
kind: "feishu",
|
|
7
|
+
provider: "feishu_app_bot",
|
|
8
|
+
maximumBodyBytes: 64 * 1024,
|
|
9
|
+
initialize(input, accountId) {
|
|
10
|
+
if (input.kind != null && input.kind !== "feishu")
|
|
11
|
+
throw new SourceIdentityError("Expected a Feishu source.");
|
|
12
|
+
if (accountId == null || !/^cli_[a-zA-Z0-9]+$/.test(accountId))
|
|
13
|
+
throw new SourceIdentityError("Connector must provide the verified application identity.");
|
|
14
|
+
return {
|
|
15
|
+
identity: accountId,
|
|
16
|
+
eventTypes: input.eventTypes,
|
|
17
|
+
config: { manageSubscriptions: input.manageSubscriptions },
|
|
18
|
+
secrets: { verificationToken: input.verificationToken, encryptKey: input.encryptKey },
|
|
19
|
+
state: {},
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
update(source, input) {
|
|
23
|
+
const secrets = {
|
|
24
|
+
verificationToken: input.verificationToken ?? source.secrets.verificationToken,
|
|
25
|
+
encryptKey: input.encryptKey ?? source.secrets.encryptKey,
|
|
26
|
+
};
|
|
27
|
+
const changed = secrets.verificationToken != source.secrets.verificationToken || secrets.encryptKey != source.secrets.encryptKey;
|
|
28
|
+
return {
|
|
29
|
+
identity: source.identity,
|
|
30
|
+
eventTypes: input.eventTypes,
|
|
31
|
+
config: source.config,
|
|
32
|
+
secrets,
|
|
33
|
+
state: changed ? {} : source.state,
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
view(source) {
|
|
37
|
+
return {
|
|
38
|
+
appId: source.identity,
|
|
39
|
+
manageSubscriptions: source.config.manageSubscriptions === true,
|
|
40
|
+
verificationTokenConfigured: true,
|
|
41
|
+
encryptKeyConfigured: true,
|
|
42
|
+
verifiedAt: typeof source.state.verifiedAt == "number" ? new Date(source.state.verifiedAt).toISOString() : null,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
ready: (source) => typeof source.state.verifiedAt == "number",
|
|
46
|
+
async receive(source, bytes, headers, now) {
|
|
47
|
+
const received = await receiveFeishuEvent(bytes, headers, {
|
|
48
|
+
appId: source.identity,
|
|
49
|
+
verificationToken: source.secrets.verificationToken,
|
|
50
|
+
encryptKey: source.secrets.encryptKey,
|
|
51
|
+
}, now);
|
|
52
|
+
if ("challenge" in received)
|
|
53
|
+
return { response: Response.json(received), state: { ...source.state, verifiedAt: now } };
|
|
54
|
+
const event = received.event;
|
|
55
|
+
return {
|
|
56
|
+
event: {
|
|
57
|
+
id: event.id,
|
|
58
|
+
type: event.type,
|
|
59
|
+
payload: {
|
|
60
|
+
event: event.type,
|
|
61
|
+
deliveryId: event.id,
|
|
62
|
+
appId: event.appId,
|
|
63
|
+
tenantKey: event.tenantKey,
|
|
64
|
+
occurredAt: event.occurredAt,
|
|
65
|
+
body: event.body,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
matches(config, event) {
|
|
71
|
+
return matchesFeishuEvent(config, {
|
|
72
|
+
type: event.type,
|
|
73
|
+
body: event.payload.body,
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
resources: {
|
|
77
|
+
triggerId: "feishu_app_bot.on_event",
|
|
78
|
+
requests(source, provider, config) {
|
|
79
|
+
const subscriptions = feishuSubscriptions(config, provider);
|
|
80
|
+
if (subscriptions.length > 0 && source.config.manageSubscriptions !== true)
|
|
81
|
+
throw new PermanentIntegrationError("This source does not manage resource subscriptions.");
|
|
82
|
+
return subscriptions;
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CreateEventSource, EventSource, UpdateEventSource } from "./configuration.ts";
|
|
2
|
+
import type { EventSourceDefinition } from "./definition.ts";
|
|
3
|
+
export declare const firefliesAccount: EventSourceDefinition<CreateEventSource, UpdateEventSource, Pick<EventSource, "appId" | "manageSubscriptions" | "verificationTokenConfigured" | "encryptKeyConfigured" | "signingSecretConfigured" | "verifiedAt">>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { isJsonObject } from "../common/json.js";
|
|
2
|
+
import { SourceIdentityError } from "./definition.js";
|
|
3
|
+
import { verifySourceHmac } from "./signature.js";
|
|
4
|
+
const events = new Set(["meeting.transcribed", "meeting.summarized"]);
|
|
5
|
+
export const firefliesAccount = {
|
|
6
|
+
kind: "fireflies",
|
|
7
|
+
provider: "fireflies",
|
|
8
|
+
maximumBodyBytes: 64 * 1024,
|
|
9
|
+
initialize(input, accountId) {
|
|
10
|
+
if (input.kind !== "fireflies" || !accountId)
|
|
11
|
+
throw new SourceIdentityError("Connector must provide the verified Fireflies account identity.");
|
|
12
|
+
if (input.eventTypes.some((event) => !events.has(event)))
|
|
13
|
+
throw new SourceIdentityError("Unsupported Fireflies event.");
|
|
14
|
+
return {
|
|
15
|
+
identity: JSON.stringify([input.teamId, input.connectionId, accountId]),
|
|
16
|
+
eventTypes: input.eventTypes,
|
|
17
|
+
config: { appId: accountId, accountId },
|
|
18
|
+
secrets: { signingSecret: input.signingSecret },
|
|
19
|
+
state: {},
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
update(source, input) {
|
|
23
|
+
if (input.verificationToken != null || input.encryptKey != null)
|
|
24
|
+
throw new SourceIdentityError("Fireflies uses the Webhooks V2 Signing Secret.");
|
|
25
|
+
if (input.eventTypes.some((event) => !events.has(event)))
|
|
26
|
+
throw new SourceIdentityError("Unsupported Fireflies event.");
|
|
27
|
+
const signingSecret = input.signingSecret ?? source.secrets.signingSecret;
|
|
28
|
+
return {
|
|
29
|
+
...source,
|
|
30
|
+
eventTypes: input.eventTypes,
|
|
31
|
+
secrets: { signingSecret },
|
|
32
|
+
state: signingSecret === source.secrets.signingSecret ? source.state : {},
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
view(source) {
|
|
36
|
+
return {
|
|
37
|
+
appId: String(source.config.appId),
|
|
38
|
+
manageSubscriptions: false,
|
|
39
|
+
verificationTokenConfigured: false,
|
|
40
|
+
encryptKeyConfigured: false,
|
|
41
|
+
signingSecretConfigured: true,
|
|
42
|
+
verifiedAt: typeof source.state.verifiedAt === "number" ? new Date(source.state.verifiedAt).toISOString() : null,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
ready: (source) => typeof source.state.verifiedAt === "number",
|
|
46
|
+
async receive(source, bytes, headers, now, execute) {
|
|
47
|
+
const signature = headers.get("x-hub-signature") ?? "";
|
|
48
|
+
if (!signature.startsWith("sha256=") ||
|
|
49
|
+
!(await verifySourceHmac(bytes, signature.slice(7), String(source.secrets.signingSecret))))
|
|
50
|
+
throw new TypeError("Invalid Fireflies signature.");
|
|
51
|
+
const payload = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
52
|
+
if (!isJsonObject(payload) || typeof payload.event !== "string")
|
|
53
|
+
throw new TypeError("Invalid Fireflies envelope.");
|
|
54
|
+
if (!events.has(payload.event))
|
|
55
|
+
return { response: Response.json({}), state: source.state };
|
|
56
|
+
if (typeof payload.meeting_id !== "string" ||
|
|
57
|
+
!payload.meeting_id ||
|
|
58
|
+
payload.meeting_id.length > 256 ||
|
|
59
|
+
!Number.isSafeInteger(payload.timestamp) ||
|
|
60
|
+
Number(payload.timestamp) < 0 ||
|
|
61
|
+
(payload.reprocessed_at != null &&
|
|
62
|
+
(!Number.isSafeInteger(payload.reprocessed_at) || Number(payload.reprocessed_at) <= 0)))
|
|
63
|
+
throw new TypeError("Incomplete Fireflies event.");
|
|
64
|
+
if (execute == null)
|
|
65
|
+
throw new SourceIdentityError("Fireflies meeting verification is unavailable.");
|
|
66
|
+
const identity = await execute({ operation: "sourceIdentity", config: { meetingId: payload.meeting_id } });
|
|
67
|
+
if (!isJsonObject(identity) ||
|
|
68
|
+
identity.accountId !== source.config.accountId ||
|
|
69
|
+
identity.meetingId !== payload.meeting_id ||
|
|
70
|
+
typeof identity.accessible !== "boolean")
|
|
71
|
+
throw new SourceIdentityError("Fireflies returned an invalid meeting access result.");
|
|
72
|
+
if (!identity.accessible)
|
|
73
|
+
return { response: Response.json({}), state: source.state };
|
|
74
|
+
const version = Number(payload.reprocessed_at ?? 0);
|
|
75
|
+
const stream = JSON.stringify([payload.event, payload.meeting_id]);
|
|
76
|
+
const deliveryId = JSON.stringify([payload.event, payload.meeting_id, version]);
|
|
77
|
+
return {
|
|
78
|
+
state: { ...source.state, verifiedAt: now },
|
|
79
|
+
event: {
|
|
80
|
+
id: deliveryId,
|
|
81
|
+
type: payload.event,
|
|
82
|
+
ordering: { key: stream, version },
|
|
83
|
+
payload: {
|
|
84
|
+
event: payload.event,
|
|
85
|
+
deliveryId,
|
|
86
|
+
accountId: source.config.accountId,
|
|
87
|
+
meetingId: payload.meeting_id,
|
|
88
|
+
body: {
|
|
89
|
+
event: payload.event,
|
|
90
|
+
meeting_id: payload.meeting_id,
|
|
91
|
+
reprocessed_at: payload.reprocessed_at ?? null,
|
|
92
|
+
client_reference_id: typeof payload.client_reference_id === "string" ? payload.client_reference_id : null,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
matches: (config, event) => Array.isArray(config.eventTypes) && config.eventTypes.includes(event.type),
|
|
99
|
+
resources: { triggerId: "fireflies.on_meeting_ready", requests: () => [] },
|
|
100
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CreateEventSource, EventSource, UpdateEventSource } from "./configuration.ts";
|
|
2
|
+
import type { EventSourceDefinition } from "./definition.ts";
|
|
3
|
+
export declare const intercomApplication: EventSourceDefinition<CreateEventSource, UpdateEventSource, Pick<EventSource, "appId" | "workspaceId" | "manageSubscriptions" | "verificationTokenConfigured" | "encryptKeyConfigured" | "signingSecretConfigured" | "verifiedAt">>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { isJsonObject } from "../common/json.js";
|
|
2
|
+
import { SourceIdentityError } from "./definition.js";
|
|
3
|
+
import { verifySourceHmac } from "./signature.js";
|
|
4
|
+
const events = new Set(["conversation.user.created", "conversation.user.replied", "ticket.created"]);
|
|
5
|
+
export const intercomApplication = {
|
|
6
|
+
kind: "intercom",
|
|
7
|
+
provider: "intercom",
|
|
8
|
+
applicationIngress: true,
|
|
9
|
+
maximumBodyBytes: 64 * 1024,
|
|
10
|
+
initialize(input, accountId) {
|
|
11
|
+
if (input.kind !== "intercom" || accountId == null || !/^[^:]+:[^:]+$/.test(accountId))
|
|
12
|
+
throw new SourceIdentityError("Connector must provide the verified Intercom workspace and administrator identity.");
|
|
13
|
+
if (input.eventTypes.some((event) => !events.has(event)))
|
|
14
|
+
throw new SourceIdentityError("Unsupported Intercom event type.");
|
|
15
|
+
const workspaceId = accountId.split(":")[0];
|
|
16
|
+
return {
|
|
17
|
+
identity: JSON.stringify([input.teamId, input.connectionId, input.appId, accountId]),
|
|
18
|
+
eventTypes: input.eventTypes,
|
|
19
|
+
config: { appId: input.appId, workspaceId, accountId },
|
|
20
|
+
secrets: { signingSecret: input.signingSecret },
|
|
21
|
+
state: {},
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
update(source, input) {
|
|
25
|
+
if (input.verificationToken != null || input.encryptKey != null)
|
|
26
|
+
throw new SourceIdentityError("Intercom uses the application Client Secret.");
|
|
27
|
+
if (input.eventTypes.some((event) => !events.has(event)))
|
|
28
|
+
throw new SourceIdentityError("Unsupported Intercom event type.");
|
|
29
|
+
const signingSecret = input.signingSecret ?? source.secrets.signingSecret;
|
|
30
|
+
return {
|
|
31
|
+
...source,
|
|
32
|
+
eventTypes: input.eventTypes,
|
|
33
|
+
secrets: { signingSecret },
|
|
34
|
+
state: signingSecret === source.secrets.signingSecret ? source.state : {},
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
view(source) {
|
|
38
|
+
return {
|
|
39
|
+
appId: String(source.config.appId),
|
|
40
|
+
workspaceId: String(source.config.workspaceId),
|
|
41
|
+
manageSubscriptions: false,
|
|
42
|
+
verificationTokenConfigured: false,
|
|
43
|
+
encryptKeyConfigured: false,
|
|
44
|
+
signingSecretConfigured: true,
|
|
45
|
+
verifiedAt: typeof source.state.verifiedAt === "number" ? new Date(source.state.verifiedAt).toISOString() : null,
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
ready: (source) => typeof source.state.verifiedAt === "number",
|
|
49
|
+
async receive(source, bytes, headers, now) {
|
|
50
|
+
const signature = headers.get("x-hub-signature") ?? "";
|
|
51
|
+
if (!/^sha1=[0-9a-f]{40}$/.test(signature))
|
|
52
|
+
throw new TypeError("Invalid Intercom signature.");
|
|
53
|
+
if (!(await verifySourceHmac(bytes, signature.slice(5), String(source.secrets.signingSecret), "SHA-1")))
|
|
54
|
+
throw new TypeError("Invalid Intercom signature.");
|
|
55
|
+
const payload = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
56
|
+
if (!isJsonObject(payload) || payload.type !== "notification_event")
|
|
57
|
+
throw new TypeError("Invalid Intercom notification.");
|
|
58
|
+
if (payload.app_id !== source.config.workspaceId)
|
|
59
|
+
return { response: Response.json({}), state: source.state };
|
|
60
|
+
if (payload.topic === "ping")
|
|
61
|
+
return { response: Response.json({}), state: { ...source.state, verifiedAt: now } };
|
|
62
|
+
if (typeof payload.topic !== "string" || !events.has(payload.topic))
|
|
63
|
+
return { response: Response.json({}), state: source.state };
|
|
64
|
+
if (typeof payload.id !== "string" ||
|
|
65
|
+
!payload.id ||
|
|
66
|
+
!isJsonObject(payload.data) ||
|
|
67
|
+
!isJsonObject(payload.data.item) ||
|
|
68
|
+
typeof payload.data.item.id !== "string")
|
|
69
|
+
throw new TypeError("Incomplete Intercom notification.");
|
|
70
|
+
return {
|
|
71
|
+
event: {
|
|
72
|
+
id: payload.id,
|
|
73
|
+
type: payload.topic,
|
|
74
|
+
payload: {
|
|
75
|
+
event: payload.topic,
|
|
76
|
+
deliveryId: payload.id,
|
|
77
|
+
workspaceId: payload.app_id,
|
|
78
|
+
objectId: payload.data.item.id,
|
|
79
|
+
body: payload.data.item,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
matches: (config, event) => Array.isArray(config.eventTypes) && config.eventTypes.includes(event.type),
|
|
85
|
+
resources: { triggerId: "intercom.on_conversation_event", requests: () => [] },
|
|
86
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CreateEventSource, EventSource, UpdateEventSource } from "./configuration.ts";
|
|
2
|
+
import type { EventSourceDefinition } from "./definition.ts";
|
|
3
|
+
export declare const jiraProject: EventSourceDefinition<CreateEventSource, UpdateEventSource, Pick<EventSource, "appId" | "projectId" | "projectKey" | "subscriptionStatus" | "lastError" | "manageSubscriptions" | "verificationTokenConfigured" | "encryptKeyConfigured" | "verifiedAt">>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { isJsonObject } from "../common/json.js";
|
|
2
|
+
import { SourceIdentityError } from "./definition.js";
|
|
3
|
+
const events = new Set(["jira:issue_created", "jira:issue_updated", "comment_created"]);
|
|
4
|
+
export const jiraProject = {
|
|
5
|
+
kind: "jira",
|
|
6
|
+
provider: "jira",
|
|
7
|
+
maximumBodyBytes: 64 * 1024,
|
|
8
|
+
initialize(input, accountId) {
|
|
9
|
+
if (input.kind !== "jira" || !accountId?.startsWith("jira:"))
|
|
10
|
+
throw new SourceIdentityError("Choose a verified Jira Cloud OAuth connection.");
|
|
11
|
+
if (input.eventTypes.some((event) => !events.has(event)))
|
|
12
|
+
throw new SourceIdentityError("Unsupported Jira event.");
|
|
13
|
+
return {
|
|
14
|
+
identity: JSON.stringify([input.teamId, input.connectionId, accountId]),
|
|
15
|
+
eventTypes: input.eventTypes,
|
|
16
|
+
config: { accountId, project: input.project },
|
|
17
|
+
secrets: {},
|
|
18
|
+
state: {},
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
async verifyIdentity(source, read) {
|
|
22
|
+
const identity = await read(source.config);
|
|
23
|
+
if (!isJsonObject(identity) ||
|
|
24
|
+
identity.accountId !== source.config.accountId ||
|
|
25
|
+
typeof identity.cloudId !== "string" ||
|
|
26
|
+
typeof identity.userId !== "string" ||
|
|
27
|
+
typeof identity.projectId !== "string" ||
|
|
28
|
+
!/^\d+$/.test(identity.projectId) ||
|
|
29
|
+
typeof identity.projectKey !== "string" ||
|
|
30
|
+
typeof identity.siteUrl !== "string")
|
|
31
|
+
throw new SourceIdentityError("Jira did not return the selected project and site identity.");
|
|
32
|
+
if (source.config.projectId != null &&
|
|
33
|
+
(source.config.cloudId !== identity.cloudId ||
|
|
34
|
+
source.config.projectId !== identity.projectId ||
|
|
35
|
+
source.config.userId !== identity.userId))
|
|
36
|
+
throw new SourceIdentityError("The Jira project, site or user changed. Recreate the event source.");
|
|
37
|
+
return {
|
|
38
|
+
...source,
|
|
39
|
+
identity: source.config.projectId == null
|
|
40
|
+
? JSON.stringify([source.identity, identity.cloudId, identity.projectId, identity.userId])
|
|
41
|
+
: source.identity,
|
|
42
|
+
config: { ...source.config, ...identity },
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
update(source, input) {
|
|
46
|
+
if (input.verificationToken != null || input.encryptKey != null || input.signingSecret != null)
|
|
47
|
+
throw new SourceIdentityError("Jira OAuth callback verification is owned by Connector.");
|
|
48
|
+
if (input.eventTypes.some((event) => !events.has(event)))
|
|
49
|
+
throw new SourceIdentityError("Unsupported Jira event.");
|
|
50
|
+
return { ...source, eventTypes: input.eventTypes };
|
|
51
|
+
},
|
|
52
|
+
view(source, now = Date.now()) {
|
|
53
|
+
const expired = isJsonObject(source.state.resource) &&
|
|
54
|
+
typeof source.state.resource.expiresAt === "number" &&
|
|
55
|
+
source.state.resource.expiresAt <= now;
|
|
56
|
+
const status = expired ? "error" : source.state.resourceStatus;
|
|
57
|
+
return {
|
|
58
|
+
appId: String(source.config.cloudId),
|
|
59
|
+
projectId: String(source.config.projectId),
|
|
60
|
+
projectKey: String(source.config.projectKey),
|
|
61
|
+
subscriptionStatus: status === "pending" || status === "ready" || status === "error" ? status : "idle",
|
|
62
|
+
lastError: expired
|
|
63
|
+
? "The Jira webhook expired. Restore Connector access and retry publication."
|
|
64
|
+
: typeof source.state.lastError === "string"
|
|
65
|
+
? source.state.lastError
|
|
66
|
+
: undefined,
|
|
67
|
+
manageSubscriptions: true,
|
|
68
|
+
verificationTokenConfigured: false,
|
|
69
|
+
encryptKeyConfigured: false,
|
|
70
|
+
verifiedAt: typeof source.state.verifiedAt === "number" ? new Date(source.state.verifiedAt).toISOString() : null,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
expiresAt: (source) => isJsonObject(source.state.resource) && typeof source.state.resource.expiresAt === "number"
|
|
74
|
+
? source.state.resource.expiresAt
|
|
75
|
+
: undefined,
|
|
76
|
+
ready: (source, now = Date.now()) => source.state.resourceStatus === "ready" &&
|
|
77
|
+
isJsonObject(source.state.resource) &&
|
|
78
|
+
typeof source.state.resource.expiresAt === "number" &&
|
|
79
|
+
source.state.resource.expiresAt > now,
|
|
80
|
+
async receive(source, bytes, headers, _now, execute) {
|
|
81
|
+
if (!isJsonObject(source.state.resource) ||
|
|
82
|
+
typeof source.state.resource.webhookId !== "number" ||
|
|
83
|
+
source.state.resourceStatus !== "ready")
|
|
84
|
+
return { response: new Response(null, { status: 503 }), state: source.state };
|
|
85
|
+
if (execute == null)
|
|
86
|
+
throw new SourceIdentityError("Jira callback verification is unavailable.");
|
|
87
|
+
const result = await execute({
|
|
88
|
+
operation: "sourceReceive",
|
|
89
|
+
config: { ...source.config, webhookId: source.state.resource.webhookId },
|
|
90
|
+
headers: {
|
|
91
|
+
authorization: headers.get("authorization") ?? "",
|
|
92
|
+
"x-atlassian-webhook-identifier": headers.get("x-atlassian-webhook-identifier") ?? "",
|
|
93
|
+
},
|
|
94
|
+
rawBody: new TextDecoder("utf-8", { fatal: true }).decode(bytes),
|
|
95
|
+
});
|
|
96
|
+
if (!isJsonObject(result))
|
|
97
|
+
throw new SourceIdentityError("Invalid Jira verification response.");
|
|
98
|
+
if (result.outcome === "unauthorized")
|
|
99
|
+
return { response: new Response(null, { status: 401 }), state: source.state };
|
|
100
|
+
if (result.outcome === "ignored")
|
|
101
|
+
return { response: Response.json({}), state: source.state };
|
|
102
|
+
if (result.outcome !== "event" ||
|
|
103
|
+
typeof result.id !== "string" ||
|
|
104
|
+
typeof result.type !== "string" ||
|
|
105
|
+
!events.has(result.type) ||
|
|
106
|
+
!isJsonObject(result.payload))
|
|
107
|
+
throw new SourceIdentityError("Invalid Jira verified event.");
|
|
108
|
+
return { event: { id: result.id, type: result.type, payload: result.payload } };
|
|
109
|
+
},
|
|
110
|
+
matches: (config, event) => Array.isArray(config.eventTypes) && config.eventTypes.includes(event.type),
|
|
111
|
+
resources: {
|
|
112
|
+
triggerId: "jira.on_issue_event",
|
|
113
|
+
managed: true,
|
|
114
|
+
requests(source, _provider, _config, endpointUrl) {
|
|
115
|
+
if (!endpointUrl)
|
|
116
|
+
throw new SourceIdentityError("Jira requires a public callback URL.");
|
|
117
|
+
return [{ key: "project", config: { projectId: source.config.projectId, endpointUrl } }];
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { IntegrationDefinition } from "../common/integration.ts";
|
|
2
|
+
import type { ConnectorProxy } from "../common/proxy.ts";
|
|
3
|
+
import type { JsonValue } from "../common/types.ts";
|
|
4
|
+
import type { SourceConfiguration } from "./definition.ts";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export declare const sourceOperationSchema: z.ZodType<SourceOperation>;
|
|
7
|
+
export type SourceOperation = {
|
|
8
|
+
readonly action: "initialize";
|
|
9
|
+
readonly input: Readonly<Record<string, JsonValue>>;
|
|
10
|
+
} | {
|
|
11
|
+
readonly action: "update";
|
|
12
|
+
readonly source: SourceConfiguration;
|
|
13
|
+
readonly input: Readonly<Record<string, JsonValue>>;
|
|
14
|
+
} | {
|
|
15
|
+
readonly action: "inspect";
|
|
16
|
+
readonly source: SourceConfiguration;
|
|
17
|
+
} | {
|
|
18
|
+
readonly action: "prepare";
|
|
19
|
+
readonly source: SourceConfiguration;
|
|
20
|
+
readonly config: Readonly<Record<string, JsonValue>>;
|
|
21
|
+
readonly endpointUrl?: string;
|
|
22
|
+
} | {
|
|
23
|
+
readonly action: "receive";
|
|
24
|
+
readonly source: SourceConfiguration;
|
|
25
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
26
|
+
readonly rawBody: string;
|
|
27
|
+
readonly consumers: readonly {
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly config: Readonly<Record<string, JsonValue>>;
|
|
30
|
+
}[];
|
|
31
|
+
};
|
|
32
|
+
export declare function sourceMetadata(definition: IntegrationDefinition): {
|
|
33
|
+
kind: string;
|
|
34
|
+
provider: string;
|
|
35
|
+
triggerId: string;
|
|
36
|
+
maximumBodyBytes: number;
|
|
37
|
+
applicationIngress: boolean;
|
|
38
|
+
managed: boolean;
|
|
39
|
+
createSchema: Record<string, unknown>;
|
|
40
|
+
updateSchema: Record<string, unknown>;
|
|
41
|
+
} | undefined;
|
|
42
|
+
export declare function executeSourceOperation(definition: IntegrationDefinition, request: SourceOperation, connector: ConnectorProxy, signal: AbortSignal, now?: number): Promise<unknown>;
|