@oomol-lab/open-connector 1.7.0 → 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.
Files changed (288) hide show
  1. package/README.md +4 -0
  2. package/assets/open-connector/catalog/apps/airtable.json +134 -0
  3. package/assets/open-connector/catalog/apps/aisa.json +916 -76
  4. package/assets/open-connector/catalog/apps/cal.json +24 -6
  5. package/assets/open-connector/catalog/apps/discordbot.json +2 -2
  6. package/assets/open-connector/catalog/apps/enormail.json +411 -0
  7. package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
  8. package/assets/open-connector/catalog/apps/github.json +275 -0
  9. package/assets/open-connector/catalog/apps/gitlab.json +125 -0
  10. package/assets/open-connector/catalog/apps/gmail.json +151 -0
  11. package/assets/open-connector/catalog/apps/googlecalendar.json +206 -0
  12. package/assets/open-connector/catalog/apps/googledrive.json +479 -0
  13. package/assets/open-connector/catalog/apps/googlesheets.json +144 -0
  14. package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
  15. package/assets/open-connector/catalog/apps/indexed.json +1115 -0
  16. package/assets/open-connector/catalog/apps/linear.json +116 -0
  17. package/assets/open-connector/catalog/apps/notion.json +142 -0
  18. package/assets/open-connector/catalog/apps/one_drive.json +185 -0
  19. package/assets/open-connector/catalog/apps/outlook.json +182 -0
  20. package/assets/open-connector/catalog/apps/shopify.json +282 -0
  21. package/assets/open-connector/catalog/apps/slack.json +182 -0
  22. package/assets/open-connector/catalog/apps/spotify.json +46 -43
  23. package/assets/open-connector/catalog/apps/stripe.json +96 -0
  24. package/assets/open-connector/catalog/apps/telegram.json +138 -0
  25. package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
  26. package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
  27. package/assets/open-connector/catalog/apps/zendesk.json +152 -0
  28. package/assets/open-connector/catalog/apps/zerotier.json +9 -9
  29. package/assets/open-connector/catalog/apps-index.json +1 -1
  30. package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
  31. package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
  32. package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
  33. package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
  34. package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
  35. package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
  36. package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
  37. package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
  38. package/package.json +2 -2
  39. package/src/connection-service.d.ts +40 -7
  40. package/src/connection-service.js +60 -18
  41. package/src/core/action-policy.d.ts +8 -1
  42. package/src/core/action-policy.js +51 -0
  43. package/src/core/cast.d.ts +3 -0
  44. package/src/core/cast.js +4 -1
  45. package/src/core/guarded-fetch.d.ts +5 -0
  46. package/src/core/guarded-fetch.js +13 -4
  47. package/src/core/remote-http.d.ts +33 -0
  48. package/src/core/remote-http.js +104 -0
  49. package/src/core/request.d.ts +1 -0
  50. package/src/core/request.js +7 -0
  51. package/src/core/types.d.ts +4 -0
  52. package/src/marketplace/marketplace-service.d.ts +0 -1
  53. package/src/marketplace/marketplace-service.js +80 -92
  54. package/src/mcp.js +19 -5
  55. package/src/oauth/oauth-flow-service.d.ts +8 -1
  56. package/src/oauth/oauth-flow-service.js +10 -4
  57. package/src/providers/action-contracts.generated.d.ts +4 -2
  58. package/src/providers/airtable/executors.d.ts +3 -0
  59. package/src/providers/airtable/executors.js +2 -0
  60. package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
  61. package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
  62. package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
  63. package/src/providers/airtable/trigger-on-record-changed.js +235 -0
  64. package/src/providers/aisa/executors.js +196 -22
  65. package/src/providers/cal/actions.js +5 -1
  66. package/src/providers/enormail/executors.d.ts +4 -0
  67. package/src/providers/enormail/executors.js +97 -0
  68. package/src/providers/feishu_app_bot/executors.d.ts +3 -0
  69. package/src/providers/feishu_app_bot/executors.js +2 -0
  70. package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
  71. package/src/providers/feishu_app_bot/trigger-config.js +10 -0
  72. package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
  73. package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
  74. package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
  75. package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
  76. package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
  77. package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
  78. package/src/providers/github/executors.d.ts +3 -0
  79. package/src/providers/github/executors.js +6 -0
  80. package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
  81. package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
  82. package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
  83. package/src/providers/github/trigger-on-repo-event.js +168 -0
  84. package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
  85. package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
  86. package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
  87. package/src/providers/github/trigger-watch-pull-request.js +106 -0
  88. package/src/providers/gitlab/executors.d.ts +3 -0
  89. package/src/providers/gitlab/executors.js +2 -0
  90. package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
  91. package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
  92. package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
  93. package/src/providers/gitlab/trigger-on-project-event.js +186 -0
  94. package/src/providers/gmail/executors.d.ts +3 -0
  95. package/src/providers/gmail/executors.js +2 -0
  96. package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
  97. package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
  98. package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
  99. package/src/providers/gmail/trigger-on-message-received.js +232 -0
  100. package/src/providers/googlecalendar/executors.d.ts +3 -0
  101. package/src/providers/googlecalendar/executors.js +2 -0
  102. package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
  103. package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
  104. package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
  105. package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
  106. package/src/providers/googledrive/executors.d.ts +3 -0
  107. package/src/providers/googledrive/executors.js +7 -0
  108. package/src/providers/googledrive/trigger-changes.d.ts +12 -0
  109. package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
  110. package/src/providers/googledrive/trigger-changes.definition.js +101 -0
  111. package/src/providers/googledrive/trigger-changes.js +452 -0
  112. package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
  113. package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
  114. package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
  115. package/src/providers/googledrive/trigger-on-file-change.js +258 -0
  116. package/src/providers/googlesheets/executors.d.ts +3 -0
  117. package/src/providers/googlesheets/executors.js +2 -0
  118. package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
  119. package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
  120. package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
  121. package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
  122. package/src/providers/hithink_finance/runtime.js +1 -1
  123. package/src/providers/indexed/executors.d.ts +4 -0
  124. package/src/providers/indexed/executors.js +16 -0
  125. package/src/providers/indexed/runtime.d.ts +26 -0
  126. package/src/providers/indexed/runtime.js +129 -0
  127. package/src/providers/linear/executors.d.ts +3 -0
  128. package/src/providers/linear/executors.js +2 -0
  129. package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
  130. package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
  131. package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
  132. package/src/providers/linear/trigger-on-issue-changed.js +215 -0
  133. package/src/providers/notion/executors.d.ts +3 -0
  134. package/src/providers/notion/executors.js +2 -0
  135. package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
  136. package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
  137. package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
  138. package/src/providers/notion/trigger-on-database-page-event.js +293 -0
  139. package/src/providers/one_drive/executors.d.ts +3 -0
  140. package/src/providers/one_drive/executors.js +2 -0
  141. package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
  142. package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
  143. package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
  144. package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
  145. package/src/providers/outlook/executors.d.ts +3 -0
  146. package/src/providers/outlook/executors.js +2 -0
  147. package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
  148. package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
  149. package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
  150. package/src/providers/outlook/trigger-on-message-received.js +226 -0
  151. package/src/providers/outlook_calendar/executors.js +6 -0
  152. package/src/providers/provider-loader.d.ts +5 -0
  153. package/src/providers/provider-loader.js +4 -0
  154. package/src/providers/registry.generated.js +2 -0
  155. package/src/providers/shopify/executors.d.ts +3 -0
  156. package/src/providers/shopify/executors.js +2 -0
  157. package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
  158. package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
  159. package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
  160. package/src/providers/shopify/trigger-on-shop-event.js +165 -0
  161. package/src/providers/slack/executors.d.ts +3 -0
  162. package/src/providers/slack/executors.js +2 -0
  163. package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
  164. package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
  165. package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
  166. package/src/providers/slack/trigger-on-message-posted.js +176 -0
  167. package/src/providers/spotify/runtime.js +15 -4
  168. package/src/providers/stripe/executors.d.ts +3 -0
  169. package/src/providers/stripe/executors.js +2 -0
  170. package/src/providers/stripe/trigger-on-event.d.ts +2 -0
  171. package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
  172. package/src/providers/stripe/trigger-on-event.definition.js +43 -0
  173. package/src/providers/stripe/trigger-on-event.js +212 -0
  174. package/src/providers/telegram/executors.d.ts +3 -0
  175. package/src/providers/telegram/executors.js +2 -0
  176. package/src/providers/telegram/trigger-on-update.d.ts +2 -0
  177. package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
  178. package/src/providers/telegram/trigger-on-update.definition.js +78 -0
  179. package/src/providers/telegram/trigger-on-update.js +141 -0
  180. package/src/providers/weixin_store/access-token.d.ts +2 -1
  181. package/src/providers/weixin_store/access-token.js +15 -4
  182. package/src/providers/weixin_store/executors.js +97 -12
  183. package/src/providers/woocommerce/executors.d.ts +3 -0
  184. package/src/providers/woocommerce/executors.js +2 -0
  185. package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
  186. package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
  187. package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
  188. package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
  189. package/src/providers/zendesk/executors.d.ts +3 -0
  190. package/src/providers/zendesk/executors.js +2 -0
  191. package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
  192. package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
  193. package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
  194. package/src/providers/zendesk/trigger-on-event.js +188 -0
  195. package/src/saas/saas-cleanup-service.d.ts +26 -0
  196. package/src/saas/saas-cleanup-service.js +124 -0
  197. package/src/saas/saas-client.d.ts +86 -0
  198. package/src/saas/saas-client.js +369 -0
  199. package/src/saas/saas-execution-service.d.ts +15 -0
  200. package/src/saas/saas-execution-service.js +21 -0
  201. package/src/saas/saas-oauth-service.d.ts +25 -0
  202. package/src/saas/saas-oauth-service.js +197 -0
  203. package/src/saas/saas-project-service.d.ts +61 -0
  204. package/src/saas/saas-project-service.js +211 -0
  205. package/src/server/actions/action-idempotency.d.ts +1 -0
  206. package/src/server/actions/action-idempotency.js +1 -0
  207. package/src/server/actions/action-runner.d.ts +7 -0
  208. package/src/server/actions/action-runner.js +43 -7
  209. package/src/server/actions/run-log-summary.js +9 -0
  210. package/src/server/api/auth.d.ts +1 -0
  211. package/src/server/api/auth.js +13 -2
  212. package/src/server/api/cache-policy.js +4 -1
  213. package/src/server/api/connection-input.d.ts +7 -1
  214. package/src/server/api/connection-input.js +7 -1
  215. package/src/server/api/connection-routes.d.ts +3 -1
  216. package/src/server/api/connection-routes.js +21 -3
  217. package/src/server/api/http-utils.d.ts +4 -3
  218. package/src/server/api/oauth-completion-page.d.ts +124 -0
  219. package/src/server/api/oauth-completion-page.js +113 -18
  220. package/src/server/api/openapi.js +112 -14
  221. package/src/server/api/policy-input.js +6 -0
  222. package/src/server/api/runtime-api.d.ts +10 -2
  223. package/src/server/api/runtime-api.js +17 -4
  224. package/src/server/api/saas-completion-page.d.ts +2 -0
  225. package/src/server/api/saas-completion-page.js +103 -0
  226. package/src/server/connect-app.d.ts +5 -0
  227. package/src/server/connect-app.js +50 -0
  228. package/src/server/connect-server.d.ts +12 -0
  229. package/src/server/connect-server.js +147 -13
  230. package/src/server/connector-runtime.d.ts +3 -1
  231. package/src/server/connector-runtime.js +5 -2
  232. package/src/server/files/transit-files.js +16 -7
  233. package/src/server/proxy/proxy-runner.d.ts +5 -1
  234. package/src/server/proxy/proxy-runner.js +72 -26
  235. package/src/server/storage/connection-request-store.d.ts +41 -1
  236. package/src/server/storage/connection-request-store.js +245 -20
  237. package/src/server/storage/connection-store.d.ts +16 -0
  238. package/src/server/storage/connection-store.js +119 -0
  239. package/src/server/storage/node-runtime-database.js +3 -3
  240. package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
  241. package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
  242. package/src/server/storage/postgres/runtime-store.d.ts +43 -0
  243. package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
  244. package/src/server/storage/runtime-database.d.ts +4 -0
  245. package/src/server/storage/runtime-sql.d.ts +1 -1
  246. package/src/server/storage/runtime-sql.js +2 -1
  247. package/src/server/storage/runtime-store.d.ts +1 -0
  248. package/src/server/storage/runtime-token-service.d.ts +2 -0
  249. package/src/server/storage/runtime-token-service.js +3 -0
  250. package/src/server/storage/saas-project-store.d.ts +77 -0
  251. package/src/server/storage/saas-project-store.js +273 -0
  252. package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
  253. package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
  254. package/src/server/storage/trigger-store.d.ts +16 -0
  255. package/src/server/storage/trigger-store.js +96 -0
  256. package/src/triggers/common/config.d.ts +2 -0
  257. package/src/triggers/common/config.js +17 -0
  258. package/src/triggers/common/configOptions.d.ts +13 -0
  259. package/src/triggers/common/configOptions.js +1 -0
  260. package/src/triggers/common/encoding.d.ts +3 -0
  261. package/src/triggers/common/encoding.js +19 -0
  262. package/src/triggers/common/integration.d.ts +115 -0
  263. package/src/triggers/common/integration.js +31 -0
  264. package/src/triggers/common/json.d.ts +6 -0
  265. package/src/triggers/common/json.js +91 -0
  266. package/src/triggers/common/poll.d.ts +41 -0
  267. package/src/triggers/common/poll.js +15 -0
  268. package/src/triggers/common/proxy.d.ts +14 -0
  269. package/src/triggers/common/proxy.js +1 -0
  270. package/src/triggers/common/types.d.ts +42 -0
  271. package/src/triggers/common/types.js +1 -0
  272. package/src/triggers/maintenance.d.ts +40 -0
  273. package/src/triggers/maintenance.js +120 -0
  274. package/src/triggers/metadata.d.ts +8 -0
  275. package/src/triggers/metadata.js +1 -0
  276. package/src/triggers/request.d.ts +33 -0
  277. package/src/triggers/request.js +52 -0
  278. package/src/triggers/resources.d.ts +12 -0
  279. package/src/triggers/resources.js +121 -0
  280. package/src/triggers/signature.d.ts +4 -0
  281. package/src/triggers/signature.js +48 -0
  282. package/src/triggers/store.d.ts +29 -0
  283. package/src/triggers/store.js +1 -0
  284. package/src/triggers/subscriptions.d.ts +22 -0
  285. package/src/triggers/subscriptions.js +220 -0
  286. package/src/triggers/trigger-runner.d.ts +34 -0
  287. package/src/triggers/trigger-runner.js +169 -0
  288. package/src/server/storage/postgres-runtime-store.d.ts +0 -39
@@ -40,7 +40,7 @@ export interface ProviderActionNames {
40
40
  airfocus: "get_profile" | "search_workspaces" | "get_workspace" | "search_items" | "get_item" | "create_item" | "update_item" | "delete_item";
41
41
  airmeet: "list_airmeets" | "list_sessions" | "list_booths" | "list_tracks" | "list_custom_registration_fields";
42
42
  airtable: "list_bases" | "get_base_collaborators" | "get_base_schema" | "create_base" | "delete_base" | "create_table" | "update_table" | "create_field" | "update_field" | "list_records" | "get_record" | "create_records" | "update_records" | "delete_records";
43
- aisa: "get_credits_balance" | "get_usage" | "get_kalshi_markets" | "get_kalshi_trades" | "get_polymarket_markets" | "get_polymarket_events" | "get_polymarket_activity" | "get_similarweb_traffic_engagement" | "get_similarweb_ranking" | "get_similarweb_ppc_spend" | "get_similarweb_top_sites" | "get_similarweb_marketing_channels" | "get_similarweb_referrals" | "get_similarweb_ad_networks" | "get_similarweb_similar_sites" | "get_similarweb_demographics" | "get_similarweb_deduplicated_audience" | "get_similarweb_audience_interests" | "get_similarweb_audience_overlap" | "get_similarweb_technologies" | "get_similarweb_popular_pages" | "get_similarweb_subdomains" | "get_similarweb_keyword_competitors" | "get_similarweb_website_keywords" | "get_similarweb_serp_players_timeseries" | "get_similarweb_serp_players_aggregated" | "get_similarweb_landing_pages" | "get_similarweb_traffic_snapshot" | "get_similarweb_traffic_trend" | "get_similarweb_top_geographies" | "search_foreplay_ads" | "get_foreplay_brand_ads" | "find_foreplay_brands" | "get_foreplay_brand_analytics" | "find_similar_creators" | "search_creators" | "lookup_creator_email" | "get_semrush_keyword_overview" | "get_semrush_keyword_difficulty" | "get_semrush_broad_match_keywords" | "get_semrush_question_keywords" | "get_semrush_domain_rank_history" | "compare_semrush_domains" | "get_semrush_backlinks_overview" | "get_semrush_backlinks" | "get_semrush_referring_domains" | "get_semrush_backlink_competitors" | "get_stock_price_snapshot" | "get_stock_prices" | "get_company_facts" | "get_income_statements" | "get_balance_sheets" | "get_cash_flow_statements" | "get_financial_metrics" | "get_financial_metrics_snapshot" | "get_stock_earnings" | "get_analyst_estimates" | "get_insider_trades" | "get_company_news" | "list_company_filings" | "get_filing_items" | "query_dataforseo_chatgpt" | "query_dataforseo_claude" | "query_dataforseo_gemini" | "query_dataforseo_perplexity" | "get_dataforseo_ai_keyword_volume" | "get_dataforseo_llm_mention_metrics" | "search_dataforseo_llm_mentions" | "get_dataforseo_llm_mention_top_domains" | "get_crypto_prices" | "list_crypto_markets" | "get_crypto_coin" | "get_crypto_market_chart" | "get_crypto_ohlc" | "get_token_prices" | "get_token_data" | "list_crypto_exchanges" | "list_crypto_categories" | "get_crypto_news" | "get_trending_crypto" | "get_twitter_user" | "get_twitter_users" | "search_twitter_posts" | "get_twitter_posts" | "get_twitter_user_timeline" | "get_twitter_user_recent_posts" | "get_twitter_mentions" | "get_twitter_post_replies" | "get_twitter_thread" | "get_twitter_trends" | "enrich_apollo_person" | "enrich_apollo_people" | "enrich_apollo_organization" | "enrich_apollo_organizations" | "search_apollo_people" | "search_apollo_organizations" | "get_apollo_organization" | "get_apollo_job_postings" | "search_apollo_company_news";
43
+ aisa: "get_credits_balance" | "get_usage" | "get_kalshi_markets" | "get_kalshi_trades" | "get_polymarket_markets" | "get_polymarket_events" | "get_polymarket_activity" | "get_similarweb_traffic_engagement" | "get_similarweb_ranking" | "get_similarweb_ppc_spend" | "get_similarweb_top_sites" | "get_similarweb_marketing_channels" | "get_similarweb_referrals" | "get_similarweb_ad_networks" | "get_similarweb_similar_sites" | "get_similarweb_demographics" | "get_similarweb_deduplicated_audience" | "get_similarweb_audience_interests" | "get_similarweb_audience_overlap" | "get_similarweb_technologies" | "get_similarweb_popular_pages" | "get_similarweb_subdomains" | "get_similarweb_keyword_competitors" | "get_similarweb_website_keywords" | "get_similarweb_serp_players_timeseries" | "get_similarweb_serp_players_aggregated" | "get_similarweb_landing_pages" | "get_similarweb_traffic_snapshot" | "get_similarweb_traffic_trend" | "get_similarweb_top_geographies" | "search_foreplay_ads" | "get_foreplay_brand_ads" | "find_foreplay_brands" | "get_foreplay_brand_analytics" | "find_similar_creators" | "search_creators" | "lookup_creator_email" | "get_semrush_domain_overview" | "get_semrush_organic_results" | "get_semrush_domain_organic_keywords" | "get_semrush_organic_competitors" | "get_semrush_url_organic_keywords" | "get_semrush_backlink_anchors" | "get_semrush_indexed_pages" | "get_semrush_keyword_overview" | "get_semrush_keyword_difficulty" | "get_semrush_broad_match_keywords" | "get_semrush_question_keywords" | "get_semrush_domain_rank_history" | "compare_semrush_domains" | "get_semrush_backlinks_overview" | "get_semrush_backlinks" | "get_semrush_referring_domains" | "get_semrush_backlink_competitors" | "get_stock_price_snapshot" | "get_stock_prices" | "get_company_facts" | "get_income_statements" | "get_balance_sheets" | "get_cash_flow_statements" | "get_financial_metrics" | "get_financial_metrics_snapshot" | "get_stock_earnings" | "get_analyst_estimates" | "get_insider_trades" | "get_company_news" | "list_company_filings" | "get_filing_items" | "query_dataforseo_chatgpt" | "query_dataforseo_claude" | "query_dataforseo_gemini" | "query_dataforseo_perplexity" | "get_dataforseo_ai_keyword_volume" | "get_dataforseo_llm_mention_metrics" | "search_dataforseo_llm_mentions" | "get_dataforseo_llm_mention_top_domains" | "get_crypto_prices" | "list_crypto_markets" | "get_crypto_coin" | "get_crypto_market_chart" | "get_crypto_ohlc" | "get_token_prices" | "get_token_data" | "list_crypto_exchanges" | "list_crypto_categories" | "get_crypto_news" | "get_trending_crypto" | "get_twitter_user" | "get_twitter_users" | "search_twitter_posts" | "get_twitter_posts" | "get_twitter_user_timeline" | "get_twitter_user_recent_posts" | "get_twitter_mentions" | "get_twitter_post_replies" | "get_twitter_thread" | "get_twitter_trends" | "enrich_apollo_person" | "enrich_apollo_people" | "enrich_apollo_organization" | "enrich_apollo_organizations" | "search_apollo_people" | "search_apollo_organizations" | "get_apollo_organization" | "get_apollo_job_postings" | "search_apollo_company_news";
44
44
  aitable_ai: "list_spaces" | "list_nodes" | "list_fields" | "list_views" | "list_records" | "create_records" | "update_records" | "delete_records";
45
45
  aivoov: "list_voices" | "create_audio";
46
46
  alchemy: "get_token_balances" | "get_token_metadata" | "get_asset_transfers" | "get_nfts_for_owner" | "get_nft_metadata";
@@ -439,6 +439,7 @@ export interface ProviderActionNames {
439
439
  encodian: "compress_pdf" | "extract_pdf_pages" | "get_pdf_text_layer" | "secure_pdf_document" | "unlock_pdf_document";
440
440
  energy_performance_certificates: "search_domestic_certificates" | "get_certificate" | "search_non_domestic_certificates" | "search_display_certificates";
441
441
  enigma: "get_account" | "search_graphql" | "get_business" | "get_aggregate_counts" | "search_lists" | "create_list" | "delete_list" | "get_background_task" | "get_list_materialization" | "get_graphql_schema_extended" | "create_suggestion" | "verify_business_v2";
442
+ enormail: "get_account" | "list_senders" | "list_lists" | "get_list" | "list_contacts" | "get_contact" | "list_mailings" | "get_mailing_stats";
442
443
  envoy: "list_locations" | "get_location" | "list_employees" | "get_employee" | "list_flows" | "get_flow" | "list_invites" | "get_invite";
443
444
  eodhd_apis: "search_instruments" | "list_exchanges" | "get_real_time_quote" | "get_eod" | "get_id_mapping" | "get_macro_indicators" | "get_ust_yield_rates" | "get_user_info";
444
445
  eraser: "generate_diagram_from_prompt" | "generate_diagram_from_dsl" | "list_files" | "create_file" | "get_file" | "update_file" | "archive_file" | "list_diagrams" | "create_diagram" | "get_diagram" | "update_diagram" | "delete_diagram";
@@ -661,6 +662,7 @@ export interface ProviderActionNames {
661
662
  imgix: "list_sources" | "get_source" | "update_source" | "purge_asset";
662
663
  incident_io: "list_incidents" | "get_incident" | "list_actions" | "get_action" | "list_severities" | "list_incident_statuses";
663
664
  indeed: "get_current_user" | "find_employer_jobs" | "get_job" | "get_jobs" | "update_sourced_job_postings" | "clear_sourced_job_posting_updates";
665
+ indexed: "lookup_company_by_domain" | "lookup_companies_by_domains" | "search_companies" | "get_company";
664
666
  indiegogo: "get_creator" | "list_active_crowdfunding_projects" | "get_crowdfunding_project";
665
667
  influxdb_cloud: "list_buckets" | "get_bucket" | "query_influxql" | "write_line_protocol";
666
668
  infolobby: "list_spaces" | "get_space" | "list_tables" | "get_table" | "create_record" | "get_record" | "update_record" | "delete_record" | "query_records" | "count_records";
@@ -1494,7 +1496,7 @@ export interface ProviderActionNames {
1494
1496
  wecom_mcp: "list_tools" | "call_tool";
1495
1497
  weixin_bot: "get_updates" | "send_message" | "send_media" | "download_media" | "send_typing";
1496
1498
  weixin_official_account: "get_api_domain_ip" | "get_callback_ip" | "callback_check" | "clear_quota" | "upload_temp_media" | "get_temp_media" | "upload_article_image" | "add_material" | "get_material" | "delete_material" | "get_material_count" | "batch_get_material" | "add_draft" | "get_draft" | "delete_draft" | "update_draft" | "get_draft_count" | "batch_get_draft" | "publish_draft" | "get_publish_status" | "delete_publish" | "get_published_article" | "batch_get_published" | "send_custom_message" | "set_typing_status" | "send_mass_message" | "send_mass_message_by_tag" | "preview_mass_message" | "get_mass_message_status" | "delete_mass_message" | "send_template_message" | "add_template" | "get_all_templates" | "delete_template" | "set_template_industry" | "get_template_industry" | "get_user_summary" | "get_user_cumulate" | "get_article_read" | "get_article_share" | "get_biz_summary" | "get_article_total_detail";
1497
- weixin_store: "upload_image" | "get_shop_info" | "list_categories" | "get_category" | "list_valid_brands" | "add_product" | "update_product" | "get_product" | "list_products" | "listing_product" | "delisting_product" | "delete_product" | "update_product_stock" | "list_orders" | "get_order" | "update_order_merchant_notes" | "send_delivery" | "list_delivery_companies" | "list_freight_templates" | "get_freight_template" | "list_addresses" | "get_address" | "list_aftersale_orders" | "get_aftersale_order" | "accept_aftersale" | "reject_aftersale";
1499
+ weixin_store: "upload_qualification_image" | "upload_image" | "get_shop_info" | "list_categories" | "get_category" | "apply_category" | "get_category_application" | "list_category_permissions" | "precheck_product_category" | "get_category_product_rule" | "list_valid_brands" | "add_product" | "update_product" | "get_product" | "list_products" | "listing_product" | "delisting_product" | "delete_product" | "update_product_stock" | "list_orders" | "get_order" | "update_order_merchant_notes" | "send_delivery" | "list_delivery_companies" | "list_freight_templates" | "get_freight_template" | "list_addresses" | "get_address" | "list_aftersale_orders" | "get_aftersale_order" | "accept_aftersale" | "reject_aftersale";
1498
1500
  wejam_ai: "export_data";
1499
1501
  what3words: "convert_to_coordinates" | "convert_to_3wa" | "autosuggest" | "grid_section" | "available_languages";
1500
1502
  whatsable: "send_message";
@@ -1,4 +1,6 @@
1
1
  import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
3
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
4
  import type { ProviderActionHandlers } from "../provider-runtime.ts";
3
5
  import type { BearerProviderContext, ProviderRuntimeHandler } from "../provider-runtime.ts";
4
6
  type AirtableActionHandler = ProviderRuntimeHandler<BearerProviderContext>;
@@ -7,4 +9,5 @@ export declare const airtableActionHandlers: ProviderActionHandlers<"airtable",
7
9
  export declare const executors: ProviderExecutors;
8
10
  export declare const proxy: ProviderProxyExecutor;
9
11
  export declare const credentialValidators: CredentialValidators;
12
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
10
13
  export {};
@@ -1,5 +1,6 @@
1
1
  import { compactObject, objectArray, optionalBoolean, optionalInteger, optionalRecord, optionalString, optionalStringArray, } from "../../core/cast.js";
2
2
  import { defineBearerProviderExecutors, defineProviderProxy, ProviderRequestError, providerResponseError, providerUserAgent, requiredResponseRecord, } from "../provider-runtime.js";
3
+ import { airtableRecordChanged } from "./trigger-on-record-changed.js";
3
4
  export const airtableApiBaseUrl = "https://api.airtable.com";
4
5
  const service = "airtable";
5
6
  const airtableValidationPath = "/v0/meta/whoami";
@@ -608,3 +609,4 @@ function requireString(value, fieldName) {
608
609
  }
609
610
  return text;
610
611
  }
612
+ export const triggers = [airtableRecordChanged];
@@ -0,0 +1,2 @@
1
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
+ export declare const airtableRecordChanged: PollDefinition;
@@ -0,0 +1,4 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const snapshot: TriggerKeySnapshot & {
3
+ readonly type: "poll";
4
+ };
@@ -0,0 +1,54 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const eventSchema = s.object({
3
+ baseId: s.string(),
4
+ createdTime: s.string(),
5
+ fields: { type: "object" },
6
+ recordId: s.string(),
7
+ tableIdOrName: s.string(),
8
+ triggerField: s.string(),
9
+ triggerFieldValue: s.string(),
10
+ }, {
11
+ additionalProperties: false,
12
+ required: ["baseId", "tableIdOrName", "recordId", "createdTime", "triggerField", "triggerFieldValue", "fields"],
13
+ });
14
+ export const snapshot = {
15
+ configInputs: [
16
+ {
17
+ handle: "baseId",
18
+ jsonSchema: s.string({ pattern: "^app[A-Za-z0-9]{14}$" }),
19
+ nullable: false,
20
+ },
21
+ {
22
+ handle: "fields",
23
+ jsonSchema: s.array(s.string({ minLength: 1 })),
24
+ nullable: false,
25
+ value: [],
26
+ },
27
+ { handle: "formula", jsonSchema: s.string(), nullable: false, value: "" },
28
+ {
29
+ handle: "maxRecordsPerPoll",
30
+ jsonSchema: s.integer({ maximum: 1_000, minimum: 1 }),
31
+ nullable: false,
32
+ value: 200,
33
+ },
34
+ {
35
+ handle: "tableIdOrName",
36
+ jsonSchema: s.string({ maxLength: 255, minLength: 1 }),
37
+ nullable: false,
38
+ },
39
+ {
40
+ handle: "triggerField",
41
+ jsonSchema: s.string({ maxLength: 255, minLength: 1, pattern: "^[^}]*$" }),
42
+ nullable: false,
43
+ },
44
+ { handle: "view", jsonSchema: s.string(), nullable: false, value: "" },
45
+ ],
46
+ definitionVersion: 2,
47
+ description: "Polls an Airtable table and triggers when a record is created or updated, ordered by a time field.",
48
+ displayName: "Record Created or Updated",
49
+ key: "airtable.on_record_changed",
50
+ name: "on_record_changed",
51
+ outputs: [{ handle: "events", jsonSchema: s.array(eventSchema), nullable: false }],
52
+ provider: "airtable",
53
+ type: "poll",
54
+ };
@@ -0,0 +1,235 @@
1
+ import { eventsPollOutputs, maximumPollEventsPerPage, PermanentPollError, PollConnectionError, TransientPollError, } from "../../triggers/common/poll.js";
2
+ import { snapshot } from "./trigger-on-record-changed.definition.js";
3
+ const staleIterator = "LIST_RECORDS_ITERATOR_NOT_AVAILABLE";
4
+ export const airtableRecordChanged = {
5
+ buildOutputs: eventsPollOutputs,
6
+ snapshot,
7
+ async poll(context) {
8
+ const config = resolveConfig(context.config);
9
+ if (context.checkpoint === null)
10
+ return { checkpoint: (await seed(context, config)), events: [] };
11
+ const checkpoint = readCheckpoint(context.checkpoint);
12
+ const run = await changed(context, config, checkpoint);
13
+ const parsed = [];
14
+ let filtered = 0;
15
+ for (const item of run.records) {
16
+ const value = instant(item.fields?.[config.triggerField]);
17
+ if (value == null)
18
+ filtered += 1;
19
+ else
20
+ parsed.push({ record: item, value });
21
+ }
22
+ const events = parsed.flatMap(({ record: item, value }) => value == checkpoint.cursor && checkpoint.boundaryIds.includes(item.id) ? [] : [event(config, item, value)]);
23
+ const next = nextCheckpoint(checkpoint, run, parsed);
24
+ return {
25
+ checkpoint: next.checkpoint,
26
+ events,
27
+ filtered,
28
+ ...(next.hasMore ? { hasMore: true } : {}),
29
+ };
30
+ },
31
+ };
32
+ function resolveConfig(value) {
33
+ return {
34
+ baseId: value.baseId,
35
+ fields: value.fields,
36
+ formula: value.formula.trim(),
37
+ maxRecordsPerPoll: value.maxRecordsPerPoll,
38
+ tableIdOrName: value.tableIdOrName,
39
+ triggerField: value.triggerField,
40
+ view: value.view.trim(),
41
+ };
42
+ }
43
+ function readCheckpoint(value) {
44
+ const checkpoint = asRecord(value);
45
+ const cursor = instant(checkpoint?.cursor);
46
+ const boundary = checkpoint?.boundaryIds;
47
+ if (cursor == null || !Array.isArray(boundary) || boundary.some((id) => typeof id != "string")) {
48
+ throw new PermanentPollError("Airtable checkpoint is invalid; recreate the Trigger.");
49
+ }
50
+ const pending = position(checkpoint?.pending);
51
+ return {
52
+ boundaryIds: boundary,
53
+ cursor,
54
+ ...(checkpoint?.cursorExclusive === true ? { cursorExclusive: true } : {}),
55
+ ...(typeof checkpoint?.offset == "string" ? { offset: checkpoint.offset } : {}),
56
+ ...(pending == null ? {} : { pending }),
57
+ };
58
+ }
59
+ function position(value) {
60
+ const input = asRecord(value);
61
+ const cursor = instant(input?.cursor);
62
+ const boundary = input?.boundaryIds;
63
+ if (cursor == null || !Array.isArray(boundary) || boundary.some((id) => typeof id != "string"))
64
+ return null;
65
+ return {
66
+ boundaryIds: boundary,
67
+ cursor,
68
+ ...(input?.cursorExclusive === true ? { cursorExclusive: true } : {}),
69
+ };
70
+ }
71
+ async function seed(context, config) {
72
+ const result = await list(context, config, seedBody(config));
73
+ success(result, "seed list");
74
+ const page = listPage(result.data);
75
+ if (page.records.length == 0)
76
+ return { boundaryIds: [], cursor: context.now.toISOString() };
77
+ const cursor = instant(page.records[0]?.fields?.[config.triggerField]);
78
+ if (cursor == null)
79
+ throw new PermanentPollError("The Airtable trigger field is not a time field.");
80
+ const boundaryIds = page.records
81
+ .filter((item) => instant(item.fields?.[config.triggerField]) === cursor)
82
+ .map(({ id }) => id);
83
+ return boundaryIds.length == page.records.length && page.offset
84
+ ? { boundaryIds: [], cursor, cursorExclusive: true }
85
+ : { boundaryIds, cursor };
86
+ }
87
+ async function changed(context, config, checkpoint) {
88
+ const result = await list(context, config, pollBody(config, checkpoint, checkpoint.offset));
89
+ if (checkpoint.offset != null && result.status == 422 && errorType(result.data) == staleIterator) {
90
+ return { offsetWentStale: true, records: [] };
91
+ }
92
+ success(result, "record list");
93
+ const parsed = listPage(result.data);
94
+ return { offset: parsed.offset, offsetWentStale: false, records: parsed.records };
95
+ }
96
+ function nextCheckpoint(checkpoint, run, parsed) {
97
+ const start = {
98
+ boundaryIds: checkpoint.boundaryIds,
99
+ cursor: checkpoint.cursor,
100
+ ...(checkpoint.cursorExclusive === true ? { cursorExclusive: true } : {}),
101
+ };
102
+ if (run.offsetWentStale)
103
+ return { checkpoint: start, hasMore: false };
104
+ const reached = merge(checkpoint.pending, tick(parsed));
105
+ if (run.offset != null) {
106
+ return {
107
+ checkpoint: {
108
+ ...start,
109
+ offset: run.offset,
110
+ ...(reached == null ? {} : { pending: reached }),
111
+ },
112
+ hasMore: true,
113
+ };
114
+ }
115
+ return { checkpoint: reached == null ? start : mergePosition(start, reached), hasMore: false };
116
+ }
117
+ function tick(parsed) {
118
+ if (parsed.length == 0)
119
+ return undefined;
120
+ const cursor = parsed.reduce((latest, entry) => (entry.value > latest ? entry.value : latest), parsed[0].value);
121
+ return cap(cursor, parsed.filter(({ value }) => value == cursor).map(({ record: item }) => item.id));
122
+ }
123
+ function merge(left, right) {
124
+ if (left == null)
125
+ return right;
126
+ if (right == null)
127
+ return left;
128
+ return mergePosition(left, right);
129
+ }
130
+ function mergePosition(left, right) {
131
+ if (right.cursor > left.cursor)
132
+ return right;
133
+ if (left.cursor > right.cursor)
134
+ return left;
135
+ if (left.cursorExclusive === true || right.cursorExclusive === true)
136
+ return { boundaryIds: [], cursor: left.cursor, cursorExclusive: true };
137
+ return cap(left.cursor, [...new Set([...left.boundaryIds, ...right.boundaryIds])]);
138
+ }
139
+ function cap(cursor, ids) {
140
+ return ids.length > 200 ? { boundaryIds: [], cursor, cursorExclusive: true } : { boundaryIds: ids, cursor };
141
+ }
142
+ function event(config, value, timestamp) {
143
+ return {
144
+ dedupeKey: `${value.id}:${timestamp}`,
145
+ payload: {
146
+ baseId: config.baseId,
147
+ createdTime: value.createdTime ?? "",
148
+ fields: value.fields ?? {},
149
+ recordId: value.id,
150
+ tableIdOrName: config.tableIdOrName,
151
+ triggerField: config.triggerField,
152
+ triggerFieldValue: timestamp,
153
+ },
154
+ };
155
+ }
156
+ function seedBody(config) {
157
+ return {
158
+ fields: [config.triggerField],
159
+ filterByFormula: formula([blank(config.triggerField), ...(config.formula.length == 0 ? [] : [config.formula])]),
160
+ pageSize: 100,
161
+ sort: [{ direction: "desc", field: config.triggerField }],
162
+ ...(config.view.length == 0 ? {} : { view: config.view }),
163
+ };
164
+ }
165
+ function pollBody(config, checkpoint, offset) {
166
+ const parsed = `DATETIME_PARSE("${checkpoint.cursor}", "YYYY-MM-DDTHH:mm:ss.SSSZ")`;
167
+ const cursor = checkpoint.cursorExclusive === true
168
+ ? `IS_AFTER({${config.triggerField}}, ${parsed})`
169
+ : `NOT(IS_BEFORE({${config.triggerField}}, ${parsed}))`;
170
+ const fields = config.fields.includes(config.triggerField) ? config.fields : [...config.fields, config.triggerField];
171
+ return {
172
+ filterByFormula: formula([
173
+ blank(config.triggerField),
174
+ cursor,
175
+ ...(config.formula.length == 0 ? [] : [config.formula]),
176
+ ]),
177
+ pageSize: Math.min(config.maxRecordsPerPoll, maximumPollEventsPerPage),
178
+ sort: [{ direction: "asc", field: config.triggerField }],
179
+ ...(config.fields.length == 0 ? {} : { fields }),
180
+ ...(config.view.length == 0 ? {} : { view: config.view }),
181
+ ...(offset == null ? {} : { offset }),
182
+ };
183
+ }
184
+ function blank(field) {
185
+ return `NOT({${field}} = BLANK())`;
186
+ }
187
+ function formula(conditions) {
188
+ return `AND(${conditions.join(", ")})`;
189
+ }
190
+ async function list(context, config, body) {
191
+ const endpoint = `/v0/${config.baseId}/${encodeURIComponent(config.tableIdOrName)}/listRecords`;
192
+ try {
193
+ return await context.connector.execute({ body, endpoint, method: "POST" }, context.signal);
194
+ }
195
+ catch (cause) {
196
+ throw new TransientPollError(`Airtable proxy request to ${endpoint} failed.`, { cause });
197
+ }
198
+ }
199
+ function success(result, operation) {
200
+ if (result.status >= 200 && result.status < 300)
201
+ return;
202
+ if (result.status == 401 || result.status == 403)
203
+ throw new PollConnectionError(`Airtable ${operation} rejected the Connection.`);
204
+ if (result.status == 404)
205
+ throw new PermanentPollError("The Airtable base or table was not found.");
206
+ if (result.status == 422 && errorType(result.data) !== staleIterator) {
207
+ throw new PermanentPollError("Airtable rejected the trigger field, formula, or view.");
208
+ }
209
+ throw new TransientPollError(`Airtable ${operation} failed with status ${result.status}.`);
210
+ }
211
+ function listPage(data) {
212
+ const value = asRecord(data);
213
+ return {
214
+ records: Array.isArray(value?.records) ? value.records : [],
215
+ ...(typeof value?.offset == "string" ? { offset: value.offset } : {}),
216
+ };
217
+ }
218
+ function errorType(data) {
219
+ const error = asRecord(data)?.error;
220
+ if (typeof error == "string")
221
+ return error;
222
+ const type = asRecord(error)?.type;
223
+ return typeof type == "string" ? type : "";
224
+ }
225
+ function instant(value) {
226
+ if (typeof value != "string" || value.length == 0)
227
+ return null;
228
+ const date = new Date(value);
229
+ return Number.isNaN(date.getTime()) ? null : date.toISOString();
230
+ }
231
+ function asRecord(value) {
232
+ return value != null && typeof value == "object" && !Array.isArray(value)
233
+ ? value
234
+ : undefined;
235
+ }