@oomol-lab/open-connector 1.6.5 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) 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 +6985 -319
  4. package/assets/open-connector/catalog/apps/baizhi_mcp.json +135 -0
  5. package/assets/open-connector/catalog/apps/cal.json +24 -6
  6. package/assets/open-connector/catalog/apps/discordbot.json +2888 -248
  7. package/assets/open-connector/catalog/apps/drawio_mcp.json +192 -0
  8. package/assets/open-connector/catalog/apps/enormail.json +411 -0
  9. package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
  10. package/assets/open-connector/catalog/apps/firecrawl.json +176 -32
  11. package/assets/open-connector/catalog/apps/framejet.json +273 -0
  12. package/assets/open-connector/catalog/apps/futunn.json +2967 -0
  13. package/assets/open-connector/catalog/apps/github.json +275 -0
  14. package/assets/open-connector/catalog/apps/gitlab.json +125 -0
  15. package/assets/open-connector/catalog/apps/gmail.json +376 -0
  16. package/assets/open-connector/catalog/apps/google_analytics.json +4 -1
  17. package/assets/open-connector/catalog/apps/google_bigquery.json +4 -1
  18. package/assets/open-connector/catalog/apps/google_search_console.json +4 -1
  19. package/assets/open-connector/catalog/apps/googlecalendar.json +210 -1
  20. package/assets/open-connector/catalog/apps/googlechat.json +694 -7
  21. package/assets/open-connector/catalog/apps/googledocs.json +4 -1
  22. package/assets/open-connector/catalog/apps/googledrive.json +479 -0
  23. package/assets/open-connector/catalog/apps/googlesheets.json +148 -1
  24. package/assets/open-connector/catalog/apps/granola.json +23 -0
  25. package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
  26. package/assets/open-connector/catalog/apps/indexed.json +1115 -0
  27. package/assets/open-connector/catalog/apps/keepa.json +3534 -987
  28. package/assets/open-connector/catalog/apps/linear.json +133 -0
  29. package/assets/open-connector/catalog/apps/linear_mcp.json +510 -0
  30. package/assets/open-connector/catalog/apps/moneyforward_mcp.json +1432 -0
  31. package/assets/open-connector/catalog/apps/notion.json +588 -1
  32. package/assets/open-connector/catalog/apps/notion_mcp.json +490 -0
  33. package/assets/open-connector/catalog/apps/odoo.json +619 -0
  34. package/assets/open-connector/catalog/apps/one_drive.json +185 -0
  35. package/assets/open-connector/catalog/apps/outlook.json +212 -8
  36. package/assets/open-connector/catalog/apps/outlook_calendar.json +23 -2
  37. package/assets/open-connector/catalog/apps/postiz.json +334 -0
  38. package/assets/open-connector/catalog/apps/proworkflow.json +529 -0
  39. package/assets/open-connector/catalog/apps/sellersprite_mcp.json +2 -1
  40. package/assets/open-connector/catalog/apps/shopify.json +282 -0
  41. package/assets/open-connector/catalog/apps/slack.json +405 -0
  42. package/assets/open-connector/catalog/apps/slackbot.json +214 -0
  43. package/assets/open-connector/catalog/apps/spotify.json +46 -43
  44. package/assets/open-connector/catalog/apps/stripe.json +96 -0
  45. package/assets/open-connector/catalog/apps/telegram.json +138 -0
  46. package/assets/open-connector/catalog/apps/tencent_docs.json +3 -0
  47. package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
  48. package/assets/open-connector/catalog/apps/wisburg.json +1528 -0
  49. package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
  50. package/assets/open-connector/catalog/apps/youtube.json +4 -1
  51. package/assets/open-connector/catalog/apps/zendesk.json +152 -0
  52. package/assets/open-connector/catalog/apps/zerotier.json +3319 -0
  53. package/assets/open-connector/catalog/apps-index.json +1 -1
  54. package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
  55. package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
  56. package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
  57. package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
  58. package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
  59. package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
  60. package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
  61. package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
  62. package/package.json +2 -2
  63. package/src/connection-service.d.ts +40 -7
  64. package/src/connection-service.js +60 -18
  65. package/src/core/action-policy.d.ts +8 -1
  66. package/src/core/action-policy.js +51 -0
  67. package/src/core/cast.d.ts +13 -0
  68. package/src/core/cast.js +18 -1
  69. package/src/core/guarded-fetch.d.ts +11 -3
  70. package/src/core/guarded-fetch.js +19 -7
  71. package/src/core/provider-scenarios.js +67 -13
  72. package/src/core/remote-http.d.ts +33 -0
  73. package/src/core/remote-http.js +104 -0
  74. package/src/core/request.d.ts +1 -0
  75. package/src/core/request.js +11 -1
  76. package/src/core/types.d.ts +5 -1
  77. package/src/marketplace/marketplace-service.d.ts +0 -1
  78. package/src/marketplace/marketplace-service.js +80 -92
  79. package/src/mcp.js +26 -9
  80. package/src/oauth/oauth-client-config-service.d.ts +16 -1
  81. package/src/oauth/oauth-client-config-service.js +59 -3
  82. package/src/oauth/oauth-flow-service.d.ts +14 -1
  83. package/src/oauth/oauth-flow-service.js +14 -6
  84. package/src/providers/17track/runtime.js +1 -1
  85. package/src/providers/action-contracts.generated.d.ts +20 -6
  86. package/src/providers/aifinmarket/runtime.js +1 -1
  87. package/src/providers/airtable/executors.d.ts +3 -0
  88. package/src/providers/airtable/executors.js +2 -0
  89. package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
  90. package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
  91. package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
  92. package/src/providers/airtable/trigger-on-record-changed.js +235 -0
  93. package/src/providers/aisa/executors.js +912 -50
  94. package/src/providers/aliyun_ack/runtime.js +1 -1
  95. package/src/providers/aliyun_sls/runtime.js +1 -1
  96. package/src/providers/app_store_server/runtime-helpers.js +1 -1
  97. package/src/providers/baizhi_mcp/actions.d.ts +2 -0
  98. package/src/providers/baizhi_mcp/actions.js +40 -0
  99. package/src/providers/baizhi_mcp/executors.d.ts +3 -0
  100. package/src/providers/baizhi_mcp/executors.js +102 -0
  101. package/src/providers/bazhuayu/runtime.js +2 -2
  102. package/src/providers/bilibili/runtime.js +2 -4
  103. package/src/providers/bilibili/upload.js +9 -7
  104. package/src/providers/cal/actions.js +5 -1
  105. package/src/providers/cloudflare_browser_rendering/executors.js +1 -1
  106. package/src/providers/cloudflare_dns/executors.js +1 -1
  107. package/src/providers/{cloudflare-current-user.js → cloudflare_dns/runtime-user.js} +2 -2
  108. package/src/providers/cloudflare_dns/runtime.d.ts +1 -1
  109. package/src/providers/cloudflare_dns/runtime.js +1 -1
  110. package/src/providers/cloudflare_r2/executors.js +1 -1
  111. package/src/providers/cloudflare_r2/runtime.d.ts +1 -1
  112. package/src/providers/cloudflare_r2/runtime.js +1 -1
  113. package/src/providers/cloudflare_worker/executors.js +1 -1
  114. package/src/providers/cloudflare_worker/runtime.d.ts +1 -1
  115. package/src/providers/cloudflare_worker/runtime.js +1 -1
  116. package/src/providers/dingtalk_mcp/runtime.js +1 -1
  117. package/src/providers/discordbot/executors.d.ts +0 -9
  118. package/src/providers/discordbot/executors.js +9 -101
  119. package/src/providers/discordbot/runtime-guilds.d.ts +3 -0
  120. package/src/providers/discordbot/runtime-guilds.js +464 -0
  121. package/src/providers/discordbot/runtime.d.ts +42 -0
  122. package/src/providers/discordbot/runtime.js +124 -0
  123. package/src/providers/drawio_mcp/executors.d.ts +3 -0
  124. package/src/providers/drawio_mcp/executors.js +19 -0
  125. package/src/providers/drawio_mcp/runtime.d.ts +8 -0
  126. package/src/providers/drawio_mcp/runtime.js +175 -0
  127. package/src/providers/enormail/executors.d.ts +4 -0
  128. package/src/providers/enormail/executors.js +97 -0
  129. package/src/providers/fastmoss_mcp/executors.js +2 -2
  130. package/src/providers/feishu_app_bot/executors.d.ts +3 -0
  131. package/src/providers/feishu_app_bot/executors.js +2 -0
  132. package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
  133. package/src/providers/feishu_app_bot/trigger-config.js +10 -0
  134. package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
  135. package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
  136. package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
  137. package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
  138. package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
  139. package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
  140. package/src/providers/finchina/executors.js +1 -1
  141. package/src/providers/framejet/executors.d.ts +4 -0
  142. package/src/providers/framejet/executors.js +19 -0
  143. package/src/providers/framejet/runtime.d.ts +16 -0
  144. package/src/providers/framejet/runtime.js +148 -0
  145. package/src/providers/futunn/actions.d.ts +2 -0
  146. package/src/providers/futunn/actions.js +152 -0
  147. package/src/providers/futunn/actions.research.d.ts +2 -0
  148. package/src/providers/futunn/actions.research.js +423 -0
  149. package/src/providers/futunn/actions.trading.d.ts +2 -0
  150. package/src/providers/futunn/actions.trading.js +204 -0
  151. package/src/providers/futunn/executors.d.ts +3 -0
  152. package/src/providers/futunn/executors.js +24 -0
  153. package/src/providers/futunn/runtime-research.d.ts +3 -0
  154. package/src/providers/futunn/runtime-research.js +133 -0
  155. package/src/providers/futunn/runtime-trading.d.ts +3 -0
  156. package/src/providers/futunn/runtime-trading.js +39 -0
  157. package/src/providers/futunn/runtime.d.ts +2 -0
  158. package/src/providers/futunn/runtime.js +50 -0
  159. package/src/providers/futunn/transport.d.ts +11 -0
  160. package/src/providers/futunn/transport.js +76 -0
  161. package/src/providers/gildata/executors.js +1 -1
  162. package/src/providers/github/executors.d.ts +3 -0
  163. package/src/providers/github/executors.js +6 -0
  164. package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
  165. package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
  166. package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
  167. package/src/providers/github/trigger-on-repo-event.js +168 -0
  168. package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
  169. package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
  170. package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
  171. package/src/providers/github/trigger-watch-pull-request.js +106 -0
  172. package/src/providers/gitlab/executors.d.ts +3 -0
  173. package/src/providers/gitlab/executors.js +2 -0
  174. package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
  175. package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
  176. package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
  177. package/src/providers/gitlab/trigger-on-project-event.js +186 -0
  178. package/src/providers/gmail/executors.d.ts +3 -0
  179. package/src/providers/gmail/executors.js +5 -3
  180. package/src/providers/gmail/message.d.ts +6 -8
  181. package/src/providers/gmail/message.js +4 -0
  182. package/src/providers/gmail/scopes.d.ts +32 -0
  183. package/src/providers/gmail/scopes.js +37 -0
  184. package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
  185. package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
  186. package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
  187. package/src/providers/gmail/trigger-on-message-received.js +232 -0
  188. package/src/providers/google_analytics/executors.js +2 -2
  189. package/src/providers/google_analytics/scopes.js +6 -1
  190. package/src/providers/google_bigquery/executors.js +2 -2
  191. package/src/providers/google_bigquery/scopes.js +2 -0
  192. package/src/providers/google_search_console/executors.js +2 -2
  193. package/src/providers/google_search_console/scopes.js +2 -0
  194. package/src/providers/googleads/executors.js +1 -1
  195. package/src/providers/googleads/scopes.d.ts +1 -3
  196. package/src/providers/googleads/scopes.js +2 -4
  197. package/src/providers/googlecalendar/executors.d.ts +3 -0
  198. package/src/providers/googlecalendar/executors.js +3 -1
  199. package/src/providers/googlecalendar/runtime-shared.js +2 -2
  200. package/src/providers/googlecalendar/scopes.js +2 -0
  201. package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
  202. package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
  203. package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
  204. package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
  205. package/src/providers/googlechat/executors.d.ts +1 -3
  206. package/src/providers/googlechat/executors.js +219 -28
  207. package/src/providers/googlechat/members.d.ts +55 -0
  208. package/src/providers/googlechat/members.js +293 -0
  209. package/src/providers/googlechat/runtime.d.ts +16 -0
  210. package/src/providers/googlechat/runtime.js +25 -0
  211. package/src/providers/googlechat/scopes.d.ts +22 -3
  212. package/src/providers/googlechat/scopes.js +30 -7
  213. package/src/providers/googledocs/executors.js +1 -1
  214. package/src/providers/googledrive/executors.d.ts +3 -0
  215. package/src/providers/googledrive/executors.js +9 -2
  216. package/src/providers/{google-auth.d.ts → googledrive/runtime-auth.d.ts} +2 -2
  217. package/src/providers/{google-auth.js → googledrive/runtime-auth.js} +3 -3
  218. package/src/providers/googledrive/runtime-collaboration.js +1 -1
  219. package/src/providers/{google-runtime.d.ts → googledrive/runtime-request.d.ts} +1 -1
  220. package/src/providers/{google-runtime.js → googledrive/runtime-request.js} +2 -2
  221. package/src/providers/googledrive/trigger-changes.d.ts +12 -0
  222. package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
  223. package/src/providers/googledrive/trigger-changes.definition.js +101 -0
  224. package/src/providers/googledrive/trigger-changes.js +452 -0
  225. package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
  226. package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
  227. package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
  228. package/src/providers/googledrive/trigger-on-file-change.js +258 -0
  229. package/src/providers/googleforms/executors.js +2 -2
  230. package/src/providers/googleforms/scopes.d.ts +0 -3
  231. package/src/providers/googleforms/scopes.js +2 -6
  232. package/src/providers/googlemeet/executors.js +2 -2
  233. package/src/providers/googlemeet/scopes.d.ts +0 -3
  234. package/src/providers/googlemeet/scopes.js +2 -6
  235. package/src/providers/googlesheets/executors.d.ts +3 -0
  236. package/src/providers/googlesheets/executors.js +3 -1
  237. package/src/providers/googlesheets/scopes.js +2 -0
  238. package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
  239. package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
  240. package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
  241. package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
  242. package/src/providers/googleslides/executors.js +2 -2
  243. package/src/providers/googleslides/scopes.d.ts +0 -3
  244. package/src/providers/googleslides/scopes.js +2 -6
  245. package/src/providers/googletasks/executors.js +2 -2
  246. package/src/providers/googletasks/scopes.d.ts +0 -3
  247. package/src/providers/googletasks/scopes.js +2 -6
  248. package/src/providers/granola/actions.js +2 -0
  249. package/src/providers/granola/runtime-mcp.js +2 -0
  250. package/src/providers/granola/runtime.js +2 -2
  251. package/src/providers/hithink_finance/runtime.js +1 -1
  252. package/src/providers/indexed/executors.d.ts +4 -0
  253. package/src/providers/indexed/executors.js +16 -0
  254. package/src/providers/indexed/runtime.d.ts +26 -0
  255. package/src/providers/indexed/runtime.js +129 -0
  256. package/src/providers/indiegogo/executors.js +1 -1
  257. package/src/providers/investoday_mcp/executors.js +2 -2
  258. package/src/providers/iyunbiao/runtime.js +2 -2
  259. package/src/providers/keepa/actions.d.ts +1 -1
  260. package/src/providers/keepa/actions.js +371 -149
  261. package/src/providers/keepa/deal-attributes.d.ts +1 -0
  262. package/src/providers/keepa/deal-attributes.js +26 -0
  263. package/src/providers/keepa/runtime.js +212 -18
  264. package/src/providers/kingdee/executors.js +1 -1
  265. package/src/providers/kingdee/runtime.js +2 -2
  266. package/src/providers/kuaidi100/runtime.js +1 -1
  267. package/src/providers/linear/executors.d.ts +3 -0
  268. package/src/providers/linear/executors.js +14 -9
  269. package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
  270. package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
  271. package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
  272. package/src/providers/linear/trigger-on-issue-changed.js +215 -0
  273. package/src/providers/linear_mcp/actions.d.ts +47 -0
  274. package/src/providers/linear_mcp/actions.js +102 -0
  275. package/src/providers/linear_mcp/endpoints.d.ts +3 -0
  276. package/src/providers/linear_mcp/endpoints.js +3 -0
  277. package/src/providers/linear_mcp/executors.d.ts +3 -0
  278. package/src/providers/linear_mcp/executors.js +9 -0
  279. package/src/providers/linear_mcp/runtime-mcp.d.ts +15 -0
  280. package/src/providers/linear_mcp/runtime-mcp.js +238 -0
  281. package/src/providers/lingxing_mcp/runtime.js +1 -1
  282. package/src/providers/mcdonalds_cn_mcp/runtime.js +1 -1
  283. package/src/providers/metabase/mcp-runtime.js +1 -1
  284. package/src/providers/moneyforward_mcp/executors.d.ts +3 -0
  285. package/src/providers/moneyforward_mcp/executors.js +11 -0
  286. package/src/providers/moneyforward_mcp/manifest.d.ts +31 -0
  287. package/src/providers/moneyforward_mcp/manifest.js +204 -0
  288. package/src/providers/moneyforward_mcp/runtime.d.ts +18 -0
  289. package/src/providers/moneyforward_mcp/runtime.js +296 -0
  290. package/src/providers/notion/executors.d.ts +3 -0
  291. package/src/providers/notion/executors.js +41 -3
  292. package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
  293. package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
  294. package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
  295. package/src/providers/notion/trigger-on-database-page-event.js +293 -0
  296. package/src/providers/notion_mcp/endpoints.d.ts +3 -0
  297. package/src/providers/notion_mcp/endpoints.js +3 -0
  298. package/src/providers/notion_mcp/executors.d.ts +3 -0
  299. package/src/providers/notion_mcp/executors.js +176 -0
  300. package/src/providers/notion_mcp/mcp-response.d.ts +86 -0
  301. package/src/providers/notion_mcp/mcp-response.js +314 -0
  302. package/src/providers/odoo/executors.d.ts +3 -0
  303. package/src/providers/odoo/executors.js +32 -0
  304. package/src/providers/odoo/runtime.d.ts +16 -0
  305. package/src/providers/odoo/runtime.js +140 -0
  306. package/src/providers/one_drive/executors.d.ts +3 -0
  307. package/src/providers/one_drive/executors.js +2 -0
  308. package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
  309. package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
  310. package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
  311. package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
  312. package/src/providers/outlook/executors.d.ts +3 -0
  313. package/src/providers/outlook/executors.js +29 -6
  314. package/src/providers/outlook/microsoft-graph.js +17 -6
  315. package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
  316. package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
  317. package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
  318. package/src/providers/outlook/trigger-on-message-received.js +226 -0
  319. package/src/providers/outlook_calendar/executors.js +30 -7
  320. package/src/providers/patsnap_mcp/executors.js +2 -2
  321. package/src/providers/postiz/executors.d.ts +4 -0
  322. package/src/providers/postiz/executors.js +83 -0
  323. package/src/providers/provider-loader.d.ts +5 -0
  324. package/src/providers/provider-loader.js +4 -0
  325. package/src/providers/provider-runtime.d.ts +15 -0
  326. package/src/providers/provider-runtime.js +57 -4
  327. package/src/providers/proworkflow/executors.d.ts +4 -0
  328. package/src/providers/proworkflow/executors.js +135 -0
  329. package/src/providers/registry.generated.js +14 -0
  330. package/src/providers/scrape_creators/catalog.js +1 -1
  331. package/src/providers/scrape_creators/runtime.js +1 -1
  332. package/src/providers/sellersprite_mcp/executors.js +2 -2
  333. package/src/providers/sellersprite_mcp/official-actions.js +3 -2
  334. package/src/providers/sentry/runtime.js +6 -7
  335. package/src/providers/shopify/executors.d.ts +3 -0
  336. package/src/providers/shopify/executors.js +2 -0
  337. package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
  338. package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
  339. package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
  340. package/src/providers/shopify/trigger-on-shop-event.js +165 -0
  341. package/src/providers/slack/actions.js +52 -3
  342. package/src/providers/slack/executors.d.ts +3 -0
  343. package/src/providers/slack/executors.js +2 -0
  344. package/src/providers/slack/runtime.js +58 -21
  345. package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
  346. package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
  347. package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
  348. package/src/providers/slack/trigger-on-message-posted.js +176 -0
  349. package/src/providers/slickdeals/runtime.js +1 -1
  350. package/src/providers/sorftime_mcp/executors.js +2 -2
  351. package/src/providers/spotify/runtime.js +15 -4
  352. package/src/providers/stripe/executors.d.ts +3 -0
  353. package/src/providers/stripe/executors.js +2 -0
  354. package/src/providers/stripe/trigger-on-event.d.ts +2 -0
  355. package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
  356. package/src/providers/stripe/trigger-on-event.definition.js +43 -0
  357. package/src/providers/stripe/trigger-on-event.js +212 -0
  358. package/src/providers/telegram/executors.d.ts +3 -0
  359. package/src/providers/telegram/executors.js +2 -0
  360. package/src/providers/telegram/trigger-on-update.d.ts +2 -0
  361. package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
  362. package/src/providers/telegram/trigger-on-update.definition.js +78 -0
  363. package/src/providers/telegram/trigger-on-update.js +141 -0
  364. package/src/providers/tikhub/bounded-response.d.ts +1 -1
  365. package/src/providers/tikhub/bounded-response.js +8 -34
  366. package/src/providers/tikhub/endpoint-catalog.js +1 -1
  367. package/src/providers/tikhub/runtime.js +2 -2
  368. package/src/providers/tongdaxin/executors.js +79 -15
  369. package/src/providers/uspto/executors.js +1 -1
  370. package/src/providers/waffo/executors.js +1 -1
  371. package/src/providers/waffo/runtime.js +1 -1
  372. package/src/providers/wecom_mcp/runtime.js +1 -1
  373. package/src/providers/weixin_store/access-token.d.ts +2 -1
  374. package/src/providers/weixin_store/access-token.js +15 -4
  375. package/src/providers/weixin_store/executors.js +97 -12
  376. package/src/providers/wisburg/executors.d.ts +4 -0
  377. package/src/providers/wisburg/executors.js +13 -0
  378. package/src/providers/wisburg/runtime.d.ts +12 -0
  379. package/src/providers/wisburg/runtime.js +133 -0
  380. package/src/providers/woocommerce/executors.d.ts +3 -0
  381. package/src/providers/woocommerce/executors.js +2 -0
  382. package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
  383. package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
  384. package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
  385. package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
  386. package/src/providers/xydc_mcp/executors.js +2 -2
  387. package/src/providers/youtube/executors.js +1 -1
  388. package/src/providers/youtube/runtime.js +1 -1
  389. package/src/providers/zendesk/executors.d.ts +3 -0
  390. package/src/providers/zendesk/executors.js +2 -0
  391. package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
  392. package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
  393. package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
  394. package/src/providers/zendesk/trigger-on-event.js +188 -0
  395. package/src/providers/zerotier/executors.d.ts +9 -0
  396. package/src/providers/zerotier/executors.js +629 -0
  397. package/src/providers/zerotier/runtime.d.ts +54 -0
  398. package/src/providers/zerotier/runtime.js +207 -0
  399. package/src/saas/saas-cleanup-service.d.ts +26 -0
  400. package/src/saas/saas-cleanup-service.js +124 -0
  401. package/src/saas/saas-client.d.ts +86 -0
  402. package/src/saas/saas-client.js +369 -0
  403. package/src/saas/saas-execution-service.d.ts +15 -0
  404. package/src/saas/saas-execution-service.js +21 -0
  405. package/src/saas/saas-oauth-service.d.ts +25 -0
  406. package/src/saas/saas-oauth-service.js +197 -0
  407. package/src/saas/saas-project-service.d.ts +61 -0
  408. package/src/saas/saas-project-service.js +211 -0
  409. package/src/server/actions/action-idempotency.d.ts +1 -0
  410. package/src/server/actions/action-idempotency.js +1 -0
  411. package/src/server/actions/action-runner.d.ts +7 -0
  412. package/src/server/actions/action-runner.js +43 -7
  413. package/src/server/actions/run-log-summary.js +9 -0
  414. package/src/server/api/auth.d.ts +1 -0
  415. package/src/server/api/auth.js +13 -2
  416. package/src/server/api/cache-policy.js +4 -1
  417. package/src/server/api/connection-input.d.ts +7 -1
  418. package/src/server/api/connection-input.js +7 -1
  419. package/src/server/api/connection-routes.d.ts +3 -1
  420. package/src/server/api/connection-routes.js +21 -3
  421. package/src/server/api/http-utils.d.ts +4 -3
  422. package/src/server/api/oauth-completion-page.d.ts +124 -0
  423. package/src/server/api/oauth-completion-page.js +113 -18
  424. package/src/server/api/openapi.js +123 -15
  425. package/src/server/api/policy-input.js +6 -0
  426. package/src/server/api/runtime-api.d.ts +18 -3
  427. package/src/server/api/runtime-api.js +36 -5
  428. package/src/server/api/saas-completion-page.d.ts +2 -0
  429. package/src/server/api/saas-completion-page.js +103 -0
  430. package/src/server/connect-app.d.ts +5 -0
  431. package/src/server/connect-app.js +50 -0
  432. package/src/server/connect-server.d.ts +12 -0
  433. package/src/server/connect-server.js +157 -15
  434. package/src/server/connector-runtime.d.ts +3 -1
  435. package/src/server/connector-runtime.js +5 -2
  436. package/src/server/files/transit-files.js +16 -7
  437. package/src/server/proxy/proxy-runner.d.ts +5 -1
  438. package/src/server/proxy/proxy-runner.js +72 -26
  439. package/src/server/storage/connection-request-store.d.ts +41 -1
  440. package/src/server/storage/connection-request-store.js +245 -20
  441. package/src/server/storage/connection-store.d.ts +16 -0
  442. package/src/server/storage/connection-store.js +119 -0
  443. package/src/server/storage/node-runtime-database.js +3 -3
  444. package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
  445. package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
  446. package/src/server/storage/postgres/runtime-store.d.ts +43 -0
  447. package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
  448. package/src/server/storage/runtime-database.d.ts +4 -0
  449. package/src/server/storage/runtime-sql.d.ts +1 -1
  450. package/src/server/storage/runtime-sql.js +2 -1
  451. package/src/server/storage/runtime-store.d.ts +1 -0
  452. package/src/server/storage/runtime-token-service.d.ts +2 -0
  453. package/src/server/storage/runtime-token-service.js +3 -0
  454. package/src/server/storage/saas-project-store.d.ts +77 -0
  455. package/src/server/storage/saas-project-store.js +273 -0
  456. package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
  457. package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
  458. package/src/server/storage/trigger-store.d.ts +16 -0
  459. package/src/server/storage/trigger-store.js +96 -0
  460. package/src/triggers/common/config.d.ts +2 -0
  461. package/src/triggers/common/config.js +17 -0
  462. package/src/triggers/common/configOptions.d.ts +13 -0
  463. package/src/triggers/common/configOptions.js +1 -0
  464. package/src/triggers/common/encoding.d.ts +3 -0
  465. package/src/triggers/common/encoding.js +19 -0
  466. package/src/triggers/common/integration.d.ts +115 -0
  467. package/src/triggers/common/integration.js +31 -0
  468. package/src/triggers/common/json.d.ts +6 -0
  469. package/src/triggers/common/json.js +91 -0
  470. package/src/triggers/common/poll.d.ts +41 -0
  471. package/src/triggers/common/poll.js +15 -0
  472. package/src/triggers/common/proxy.d.ts +14 -0
  473. package/src/triggers/common/proxy.js +1 -0
  474. package/src/triggers/common/types.d.ts +42 -0
  475. package/src/triggers/common/types.js +1 -0
  476. package/src/triggers/maintenance.d.ts +40 -0
  477. package/src/triggers/maintenance.js +120 -0
  478. package/src/triggers/metadata.d.ts +8 -0
  479. package/src/triggers/metadata.js +1 -0
  480. package/src/triggers/request.d.ts +33 -0
  481. package/src/triggers/request.js +52 -0
  482. package/src/triggers/resources.d.ts +12 -0
  483. package/src/triggers/resources.js +121 -0
  484. package/src/triggers/signature.d.ts +4 -0
  485. package/src/triggers/signature.js +48 -0
  486. package/src/triggers/store.d.ts +29 -0
  487. package/src/triggers/store.js +1 -0
  488. package/src/triggers/subscriptions.d.ts +22 -0
  489. package/src/triggers/subscriptions.js +220 -0
  490. package/src/triggers/trigger-runner.d.ts +34 -0
  491. package/src/triggers/trigger-runner.js +169 -0
  492. package/src/providers/sentry/scopes.d.ts +0 -1
  493. package/src/providers/sentry/scopes.js +0 -7
  494. package/src/server/storage/postgres-runtime-store.d.ts +0 -39
  495. /package/src/providers/{cloudflare-current-user.d.ts → cloudflare_dns/runtime-user.d.ts} +0 -0
@@ -0,0 +1,4 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const snapshot: TriggerKeySnapshot & {
3
+ readonly type: "integration";
4
+ };
@@ -0,0 +1,49 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ import { snapshot as githubRepoEventSnapshot } from "./trigger-on-repo-event.definition.js";
3
+ const pullRequestSchema = s.object({
4
+ id: s.integer(),
5
+ number: s.integer(),
6
+ title: s.string(),
7
+ url: s.string(),
8
+ state: s.stringEnum(["open", "closed"]),
9
+ draft: s.boolean(),
10
+ merged: s.boolean(),
11
+ updatedAt: s.string(),
12
+ headSha: s.string(),
13
+ baseSha: s.string(),
14
+ }, {
15
+ additionalProperties: false,
16
+ required: ["id", "number", "title", "url", "state", "draft", "merged", "updatedAt", "headSha", "baseSha"],
17
+ });
18
+ export const snapshot = {
19
+ configInputs: [
20
+ {
21
+ handle: "owner",
22
+ jsonSchema: s.string({ pattern: "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$" }),
23
+ nullable: false,
24
+ },
25
+ {
26
+ handle: "repo",
27
+ jsonSchema: s.string({ pattern: "^(?!\\.{1,2}$)[a-zA-Z0-9._-]{1,100}$" }),
28
+ nullable: false,
29
+ },
30
+ {
31
+ handle: "number",
32
+ jsonSchema: s.integer({ minimum: 1 }),
33
+ nullable: false,
34
+ description: "Number of the pull request to watch.",
35
+ },
36
+ ],
37
+ definitionVersion: 2,
38
+ description: "Watches one pull request using notifications and periodic checks. Starts from its current state; reports observed changes, not every intermediate transition or review event.",
39
+ displayName: "Watch Pull Request",
40
+ endpoint: githubRepoEventSnapshot.endpoint,
41
+ key: "github.watch_pull_request",
42
+ name: "watch_pull_request",
43
+ provider: "github",
44
+ type: "integration",
45
+ outputs: [
46
+ { handle: "pullRequest", jsonSchema: pullRequestSchema, nullable: false },
47
+ { handle: "version", jsonSchema: s.string(), nullable: false },
48
+ ],
49
+ };
@@ -0,0 +1,106 @@
1
+ import { canonicalJsonBytes, digestBytes } from "../../triggers/common/encoding.js";
2
+ import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
3
+ import { isJsonObject } from "../../triggers/common/json.js";
4
+ import { githubRepoEvent } from "./trigger-on-repo-event.js";
5
+ import { snapshot } from "./trigger-watch-pull-request.definition.js";
6
+ function hookConfig(config) {
7
+ return { owner: config.owner, repo: config.repo, events: ["pull_request"], insecureSsl: false };
8
+ }
9
+ export const githubPullRequestListener = {
10
+ snapshot,
11
+ initialState: { checkpoint: null, subscription: {} },
12
+ async reconcile(context) {
13
+ if (context.state == null)
14
+ throw new PermanentIntegrationError("GitHub listener state is missing.");
15
+ if (context.active && context.state.checkpoint == null) {
16
+ const current = await readPullRequest(context);
17
+ await context.state.saveCheckpoint({ version: current.version, sequence: 0 });
18
+ }
19
+ return await githubRepoEvent.reconcile({ ...context, config: hookConfig(context.config) });
20
+ },
21
+ async receive(context) {
22
+ const received = await githubRepoEvent.receive({
23
+ ...context,
24
+ config: hookConfig(context.config),
25
+ });
26
+ if (received.outcome != "event")
27
+ return received;
28
+ if (!isJsonObject(context.payload) || context.payload.number !== context.config.number)
29
+ return { outcome: "ignored", reason: "Different pull request." };
30
+ return { outcome: "wake" };
31
+ },
32
+ listener: {
33
+ intervalMs: 300_000,
34
+ async read(context) {
35
+ const checkpoint = context.checkpoint;
36
+ if (!isJsonObject(checkpoint) ||
37
+ typeof checkpoint.version != "string" ||
38
+ !Number.isSafeInteger(checkpoint.sequence) ||
39
+ Number(checkpoint.sequence) < 0 ||
40
+ Number(checkpoint.sequence) >= Number.MAX_SAFE_INTEGER) {
41
+ throw new PermanentIntegrationError("GitHub listener checkpoint is invalid.");
42
+ }
43
+ const current = await readPullRequest(context);
44
+ if (current.version == checkpoint.version)
45
+ return { checkpoint, dedupeKey: current.version, hasMore: false, outputs: null };
46
+ const sequence = Number(checkpoint.sequence) + 1;
47
+ return {
48
+ checkpoint: { version: current.version, sequence },
49
+ dedupeKey: `${sequence}:${current.version}`,
50
+ hasMore: false,
51
+ outputs: current,
52
+ };
53
+ },
54
+ },
55
+ };
56
+ async function readPullRequest(context) {
57
+ const { owner, repo, number } = context.config;
58
+ if (typeof owner != "string" || typeof repo != "string" || !Number.isSafeInteger(number) || Number(number) < 1)
59
+ throw new PermanentIntegrationError("GitHub pull request configuration is invalid.");
60
+ const result = await context.connector.execute({
61
+ endpoint: `/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${number}`,
62
+ method: "GET",
63
+ }, context.signal);
64
+ context.signal?.throwIfAborted();
65
+ const value = result.data;
66
+ if (result.status == 429 ||
67
+ (result.status == 403 &&
68
+ isJsonObject(value) &&
69
+ typeof value.message == "string" &&
70
+ /rate limit/i.test(value.message)))
71
+ throw new TransientIntegrationError("GitHub pull request checks were rate limited.");
72
+ if (result.status == 401 || result.status == 403)
73
+ throw new IntegrationConnectionError("GitHub pull request access requires authorization.");
74
+ if (result.status == 404)
75
+ throw new PermanentIntegrationError("The pull request is unavailable; it may no longer be accessible.");
76
+ if (result.status != 200)
77
+ throw new TransientIntegrationError(`GitHub pull request check failed with status ${result.status}.`);
78
+ if (!isJsonObject(value) ||
79
+ !Number.isSafeInteger(value.id) ||
80
+ value.number !== number ||
81
+ typeof value.title != "string" ||
82
+ typeof value.html_url != "string" ||
83
+ (value.state != "open" && value.state != "closed") ||
84
+ typeof value.draft != "boolean" ||
85
+ typeof value.merged != "boolean" ||
86
+ typeof value.updated_at != "string" ||
87
+ !Number.isFinite(Date.parse(value.updated_at)) ||
88
+ !isJsonObject(value.head) ||
89
+ typeof value.head.sha != "string" ||
90
+ !isJsonObject(value.base) ||
91
+ typeof value.base.sha != "string")
92
+ throw new TransientIntegrationError("GitHub returned an invalid pull request.");
93
+ const pullRequest = {
94
+ id: Number(value.id),
95
+ number: Number(number),
96
+ title: value.title,
97
+ url: value.html_url,
98
+ state: value.state,
99
+ draft: value.draft,
100
+ merged: value.merged,
101
+ updatedAt: value.updated_at,
102
+ headSha: value.head.sha,
103
+ baseSha: value.base.sha,
104
+ };
105
+ return { pullRequest, version: await digestBytes(canonicalJsonBytes(pullRequest)) };
106
+ }
@@ -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
  type GitlabActionInput = Record<string, unknown>;
4
6
  type GitlabActionHandler = (input: GitlabActionInput, context: GitlabActionContext) => Promise<unknown>;
@@ -23,4 +25,5 @@ export declare const credentialValidators: CredentialValidators;
23
25
  * `allowPrivateNetwork` may be passed explicitly (used by tests).
24
26
  */
25
27
  export declare function normalizeGitlabApiBaseUrl(value: unknown, allowPrivateNetwork?: boolean): string;
28
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
26
29
  export {};
@@ -1,6 +1,7 @@
1
1
  import { compactObject, optionalBoolean, optionalIntegerLike, optionalRecord, optionalString as asOptionalString, recordOrEmpty, } from "../../core/cast.js";
2
2
  import { assertPublicHttpUrl, isPrivateNetworkAccessAllowed } from "../../core/request.js";
3
3
  import { createProviderFetch, defineProviderExecutors, defineProviderProxy, providerInputError, ProviderRequestError, providerUserAgent, } from "../provider-runtime.js";
4
+ import { gitlabProjectEvent } from "./trigger-on-project-event.js";
4
5
  const defaultGitlabApiBaseUrl = "https://gitlab.com/api/v4";
5
6
  const service = "gitlab";
6
7
  export const gitlabActionHandlers = {
@@ -515,3 +516,4 @@ function asOptionalPositiveInteger(value, fieldName) {
515
516
  }
516
517
  return parsed;
517
518
  }
519
+ export const triggers = [gitlabProjectEvent];
@@ -0,0 +1,2 @@
1
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
2
+ export declare const gitlabProjectEvent: IntegrationDefinition;
@@ -0,0 +1,5 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const events: readonly string[];
3
+ export declare const snapshot: TriggerKeySnapshot & {
4
+ readonly type: "integration";
5
+ };
@@ -0,0 +1,63 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ export const events = [
3
+ "push",
4
+ "tag_push",
5
+ "issues",
6
+ "confidential_issues",
7
+ "note",
8
+ "confidential_note",
9
+ "merge_requests",
10
+ "job",
11
+ "pipeline",
12
+ "wiki_page",
13
+ "deployment",
14
+ "feature_flag",
15
+ "releases",
16
+ "milestone",
17
+ "emoji",
18
+ "resource_access_token",
19
+ "resource_deploy_token",
20
+ ];
21
+ export const snapshot = {
22
+ configInputs: [
23
+ {
24
+ handle: "events",
25
+ jsonSchema: s.array(s.stringEnum(events), { minItems: 1, uniqueItems: true }),
26
+ nullable: false,
27
+ },
28
+ { handle: "insecureSsl", jsonSchema: s.boolean(), nullable: false, value: false },
29
+ {
30
+ handle: "project",
31
+ jsonSchema: s.string({
32
+ maxLength: 255,
33
+ minLength: 1,
34
+ pattern: "^(?:[0-9]+|(?!\\.{1,2}(?:/|$))[A-Za-z0-9_.][A-Za-z0-9_.-]*(?:/(?!\\.{1,2}(?:/|$))[A-Za-z0-9_.][A-Za-z0-9_.-]*)*)$",
35
+ }),
36
+ nullable: false,
37
+ },
38
+ {
39
+ handle: "pushBranchFilter",
40
+ jsonSchema: s.string({ maxLength: 255 }),
41
+ nullable: false,
42
+ value: "",
43
+ },
44
+ ],
45
+ definitionVersion: 2,
46
+ description: "Triggers when selected GitLab webhook events occur in a project.",
47
+ displayName: "Project Event",
48
+ endpoint: {
49
+ body: { allowArray: false, allowEmpty: false, formats: ["json"] },
50
+ methods: ["POST"],
51
+ successStatus: 202,
52
+ },
53
+ key: "gitlab.on_project_event",
54
+ name: "on_project_event",
55
+ outputs: [
56
+ { handle: "body", jsonSchema: { type: "object" }, nullable: false },
57
+ { handle: "deliveryId", jsonSchema: s.string(), nullable: false },
58
+ { handle: "event", jsonSchema: s.string(), nullable: false },
59
+ { handle: "gitlabEvent", jsonSchema: s.string(), nullable: false },
60
+ ],
61
+ provider: "gitlab",
62
+ type: "integration",
63
+ };
@@ -0,0 +1,186 @@
1
+ import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
2
+ import { sameSecret } from "../../triggers/signature.js";
3
+ import { snapshot, events } from "./trigger-on-project-event.definition.js";
4
+ const eventNames = new Map([
5
+ ["Push Hook", "push"],
6
+ ["Tag Push Hook", "tag_push"],
7
+ ["Issue Hook", "issues"],
8
+ ["Confidential Issue Hook", "confidential_issues"],
9
+ ["Note Hook", "note"],
10
+ ["Confidential Note Hook", "confidential_note"],
11
+ ["Merge Request Hook", "merge_requests"],
12
+ ["Job Hook", "job"],
13
+ ["Pipeline Hook", "pipeline"],
14
+ ["Wiki Page Hook", "wiki_page"],
15
+ ["Deployment Hook", "deployment"],
16
+ ["Feature Flag Hook", "feature_flag"],
17
+ ["Release Hook", "releases"],
18
+ ["Milestone Hook", "milestone"],
19
+ ["Emoji Hook", "emoji"],
20
+ ["Resource Access Token Hook", "resource_access_token"],
21
+ ["Resource Deploy Token Hook", "resource_deploy_token"],
22
+ ]);
23
+ export const gitlabProjectEvent = {
24
+ initialState: { checkpoint: null, subscription: {} },
25
+ snapshot,
26
+ receive(context) {
27
+ if (!sameSecret(context.header("x-gitlab-token"), context.callbackSecret)) {
28
+ return { body: "", contentType: "text/plain", outcome: "respond", status: 404 };
29
+ }
30
+ const gitlabEvent = context.header("x-gitlab-event")?.trim();
31
+ if (!gitlabEvent)
32
+ return { outcome: "ignored", reason: "GitLab event header is missing." };
33
+ const event = eventNames.get(gitlabEvent);
34
+ if (event == null)
35
+ return { outcome: "ignored", reason: "GitLab event header is unknown." };
36
+ if (!resolveConfig(context.config).events.includes(event))
37
+ return { outcome: "ignored", reason: "GitLab event is not subscribed." };
38
+ const deliveryId = context.header("idempotency-key") ?? "";
39
+ return {
40
+ dedupeKey: deliveryId.length == 0 ? undefined : deliveryId,
41
+ outcome: "event",
42
+ outputs: {
43
+ body: context.payload,
44
+ deliveryId,
45
+ event,
46
+ gitlabEvent,
47
+ },
48
+ };
49
+ },
50
+ async reconcile(context) {
51
+ const state = requireState(context.state);
52
+ const config = resolveConfig(context.config);
53
+ const known = subscriptionId(state);
54
+ if (!context.active) {
55
+ const ids = known == null ? await findByUrl(context, config) : [known];
56
+ for (const id of ids ?? [])
57
+ await remove(context, config, id);
58
+ await state.saveSubscription({}, later(context.now));
59
+ return { outcome: "ready" };
60
+ }
61
+ const matches = await findByUrl(context, config);
62
+ if (matches == null)
63
+ throw new PermanentIntegrationError("The GitLab project does not exist or is not visible.");
64
+ let hookId = known ?? matches[0];
65
+ if (hookId == null) {
66
+ const created = await request(context, "hook create", {
67
+ body: desired(context.endpointUrl, context.callbackSecret, config),
68
+ endpoint: endpoint(config),
69
+ method: "POST",
70
+ });
71
+ success(created, "hook create");
72
+ hookId = readId(created.data);
73
+ }
74
+ else {
75
+ const aligned = await request(context, "hook update", {
76
+ body: desired(context.endpointUrl, context.callbackSecret, config),
77
+ endpoint: `${endpoint(config)}/${hookId}`,
78
+ method: "PUT",
79
+ });
80
+ if (aligned.status == 404) {
81
+ await state.saveSubscription({}, context.now);
82
+ return { outcome: "pending" };
83
+ }
84
+ success(aligned, "hook update");
85
+ }
86
+ for (const duplicate of matches.filter((value) => value != hookId))
87
+ await remove(context, config, duplicate);
88
+ await state.saveSubscription({ hookId }, later(context.now));
89
+ return { outcome: "ready" };
90
+ },
91
+ };
92
+ function resolveConfig(value) {
93
+ return {
94
+ events: value.events,
95
+ insecureSsl: value.insecureSsl,
96
+ project: value.project,
97
+ pushBranchFilter: value.pushBranchFilter,
98
+ };
99
+ }
100
+ function endpoint(config) {
101
+ return `/projects/${encodeURIComponent(config.project)}/hooks`;
102
+ }
103
+ function desired(url, token, config) {
104
+ return {
105
+ branch_filter_strategy: "wildcard",
106
+ description: "Managed by Open Flow.",
107
+ enable_ssl_verification: !config.insecureSsl,
108
+ name: `Open Flow ${url.slice(url.lastIndexOf("/") + 1)}`,
109
+ push_events_branch_filter: config.pushBranchFilter,
110
+ url,
111
+ token,
112
+ ...Object.fromEntries(events.map((event) => [`${event}_events`, config.events.includes(event)])),
113
+ };
114
+ }
115
+ async function findByUrl(context, config) {
116
+ const matches = [];
117
+ for (let page = 1; page <= 10; page += 1) {
118
+ const result = await request(context, "hook list", {
119
+ endpoint: endpoint(config),
120
+ method: "GET",
121
+ query: { page, per_page: 100 },
122
+ });
123
+ if (result.status == 404)
124
+ return null;
125
+ success(result, "hook list");
126
+ const hooks = Array.isArray(result.data) ? result.data : [];
127
+ for (const hook of hooks) {
128
+ const value = record(hook);
129
+ if (value?.url === context.endpointUrl && (typeof value.id == "number" || typeof value.id == "string"))
130
+ matches.push(String(value.id));
131
+ }
132
+ if (hooks.length < 100)
133
+ break;
134
+ }
135
+ return matches;
136
+ }
137
+ async function remove(context, config, hookId) {
138
+ const result = await request(context, "hook delete", {
139
+ endpoint: `${endpoint(config)}/${hookId}`,
140
+ method: "DELETE",
141
+ });
142
+ if (result.status != 404)
143
+ success(result, "hook delete");
144
+ }
145
+ async function request(context, operation, value) {
146
+ try {
147
+ return await context.connector.execute(value, context.signal);
148
+ }
149
+ catch (cause) {
150
+ if (cause instanceof IntegrationConnectionError)
151
+ throw cause;
152
+ throw new TransientIntegrationError(`GitLab ${operation} request failed.`, { cause });
153
+ }
154
+ }
155
+ function success(result, operation) {
156
+ if (result.status >= 200 && result.status < 300)
157
+ return;
158
+ if (result.status == 401 || result.status == 403)
159
+ throw new IntegrationConnectionError(`GitLab ${operation} rejected the Connection.`);
160
+ if ([400, 404, 422].includes(result.status))
161
+ throw new PermanentIntegrationError(`GitLab ${operation} rejected the subscription.`);
162
+ throw new TransientIntegrationError(`GitLab ${operation} failed with status ${result.status}.`);
163
+ }
164
+ function readId(data) {
165
+ const value = record(data)?.id;
166
+ if (typeof value != "number" && typeof value != "string")
167
+ throw new TransientIntegrationError("GitLab hook response is missing its ID.");
168
+ return String(value);
169
+ }
170
+ function requireState(value) {
171
+ if (value == null)
172
+ throw new PermanentIntegrationError("GitLab Integration state is missing.");
173
+ return value;
174
+ }
175
+ function subscriptionId(state) {
176
+ const value = state.subscription.hookId;
177
+ return typeof value == "string" && value.length > 0 ? value : null;
178
+ }
179
+ function later(now) {
180
+ return new Date(now.getTime() + 30 * 24 * 60 * 60 * 1_000);
181
+ }
182
+ function record(value) {
183
+ return value != null && typeof value == "object" && !Array.isArray(value)
184
+ ? value
185
+ : undefined;
186
+ }
@@ -1,4 +1,6 @@
1
1
  import type { CredentialValidators, ExecutionContext, 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
  declare const service = "gmail";
4
6
  interface ActionContext {
@@ -13,4 +15,5 @@ export declare const gmailActionHandlers: ProviderActionHandlers<typeof service,
13
15
  export declare const executors: ProviderExecutors;
14
16
  export declare const proxy: ProviderProxyExecutor;
15
17
  export declare const credentialValidators: CredentialValidators;
18
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
16
19
  export {};
@@ -1,10 +1,11 @@
1
1
  import { looseArray, optionalRecord, optionalString } from "../../core/cast.js";
2
2
  import { encodePathSegment } from "../../core/request.js";
3
- import { googleBearerProxyAuth, googleServiceAccountValidator, resolveGoogleAccessToken } from "../google-auth.js";
4
- import { defineProviderExecutors, defineProviderProxy, ProviderRequestError, readProviderErrorTextBody, readProviderJsonBody, requiredInputString, runProviderRequest, } from "../provider-runtime.js";
3
+ import { googleBearerProxyAuth, googleServiceAccountValidator, resolveGoogleAccessToken, } from "../googledrive/runtime-auth.js";
4
+ import { defineProviderExecutors, defineProviderProxy, ProviderRequestError, readProviderErrorTextBody, readProviderJsonBody, requiredInputString, runProviderRequest, withRetryAfterSeconds, } from "../provider-runtime.js";
5
5
  import { decodeGmailAttachment } from "./attachment-stream.js";
6
6
  import { buildRecipients, encodeMimeMessage, extractBodyContent, firstAddress, normalizeGmailMessage, normalizeMessageId, normalizeThreadId, parseAddressList, readHeader, resolveReplyHeaders, summarizeGmailMessage, } from "./message.js";
7
7
  import { gmailOAuthScopes } from "./scopes.js";
8
+ import { gmailMessageReceived } from "./trigger-on-message-received.js";
8
9
  const service = "gmail";
9
10
  const gmailApiBaseUrl = "https://gmail.googleapis.com/gmail/v1";
10
11
  const detailHydrationBatchSize = 10;
@@ -787,5 +788,6 @@ async function readGmailError(response) {
787
788
  }
788
789
  const rateLimited = response.status === 403 &&
789
790
  looseArray(error?.errors).some((entry) => gmailQuotaReasons.has(optionalString(optionalRecord(entry)?.reason) ?? ""));
790
- return new ProviderRequestError(response.status, optionalString(error?.message) ?? `gmail request failed with ${response.status}`, undefined, rateLimited ? "rate_limited" : undefined);
791
+ return new ProviderRequestError(response.status, optionalString(error?.message) ?? `gmail request failed with ${response.status}`, withRetryAfterSeconds(response), rateLimited ? "rate_limited" : undefined);
791
792
  }
793
+ export const triggers = [gmailMessageReceived];
@@ -20,6 +20,7 @@ export interface GmailMessageResource {
20
20
  internalDate?: string;
21
21
  labelIds?: string[];
22
22
  snippet?: string;
23
+ sizeEstimate?: number;
23
24
  raw?: string;
24
25
  payload?: GmailMessagePart;
25
26
  }
@@ -39,13 +40,7 @@ export interface GmailAttachmentSummary {
39
40
  mimeType: string;
40
41
  size: number;
41
42
  }
42
- export interface NormalizedGmailMessage {
43
- messageId: string;
44
- threadId: string;
45
- labelIds: string[];
46
- subject: string;
47
- sender: string;
48
- to: string;
43
+ export interface NormalizedGmailMessage extends GmailMessageSummary {
49
44
  preview: {
50
45
  subject: string;
51
46
  body: string;
@@ -53,7 +48,6 @@ export interface NormalizedGmailMessage {
53
48
  payload: GmailMessagePart | null;
54
49
  messageText: string;
55
50
  attachmentList: GmailAttachmentSummary[];
56
- messageTimestamp: string;
57
51
  raw?: string;
58
52
  }
59
53
  export interface GmailMessageSummary {
@@ -64,6 +58,10 @@ export interface GmailMessageSummary {
64
58
  sender: string;
65
59
  to: string;
66
60
  messageTimestamp: string;
61
+ historyId?: string;
62
+ internalDate?: string;
63
+ sizeEstimate?: number;
64
+ snippet?: string;
67
65
  }
68
66
  export interface MimeMessageInput {
69
67
  to: string[];
@@ -8,6 +8,10 @@ export function summarizeGmailMessage(resource) {
8
8
  sender: readHeader(headers, "From"),
9
9
  to: readHeader(headers, "To"),
10
10
  messageTimestamp: toMessageTimestamp(resource.internalDate, readHeader(headers, "Date")),
11
+ historyId: resource.historyId,
12
+ internalDate: resource.internalDate,
13
+ sizeEstimate: resource.sizeEstimate,
14
+ snippet: resource.snippet,
11
15
  };
12
16
  }
13
17
  export function normalizeGmailMessage(resource) {
@@ -10,4 +10,36 @@ export declare const gmailComposeScopes: string[];
10
10
  export declare const gmailSendScopes: string[];
11
11
  export declare const gmailLabelScopes: string[];
12
12
  export declare const gmailSettingsBasicScopes: string[];
13
+ /**
14
+ * The scopes a SERVICE ACCOUNT token is minted for, and the ones the proxy
15
+ * resolves with. Unchanged: a domain-wide-delegation grant lists these exact
16
+ * scopes in the Workspace admin console, and a token request naming a scope the
17
+ * admin has not authorized fails outright — so this list cannot grow without
18
+ * breaking every existing service-account connection.
19
+ */
13
20
  export declare const gmailOAuthScopes: string[];
21
+ /**
22
+ * The scopes a user OAuth authorization may request — the menu, not a minimum.
23
+ *
24
+ * `gmail.readonly` is here and not in {@link gmailOAuthScopes} because the two
25
+ * lists answer different questions. That one asks "what does a service account
26
+ * token need to cover every action"; `modify` subsumes `readonly` there, so
27
+ * adding it would be redundant at best and, through domain-wide delegation,
28
+ * breaking at worst.
29
+ *
30
+ * This one is what `filterDeclaredScopes` intersects a caller's
31
+ * `requestedScopes` against, so a scope absent here cannot be requested AT ALL.
32
+ * Leaving `readonly` out therefore forced every read-only integration to
33
+ * authorize `gmail.modify` — write, label and trash on the user's mailbox — in
34
+ * order to call actions that declare `gmailReadScopes`. That is the opposite of
35
+ * least privilege, and it is invisible: consent succeeds, so nothing reports
36
+ * that more was granted than the integration can use.
37
+ *
38
+ * Note for anyone storing a client config WITHOUT `requestedScopes`:
39
+ * `getEffectiveScopes` falls back to this whole list, so such a config now asks
40
+ * for four scopes rather than three. `readonly` is subsumed by `modify`, so no
41
+ * new capability is granted — but the consent screen gains a line, and a
42
+ * deployment that wants the narrow set should say so explicitly with
43
+ * `requestedScopes`, which is the correct posture regardless.
44
+ */
45
+ export declare const gmailAuthorizableScopes: string[];
@@ -10,4 +10,41 @@ export const gmailComposeScopes = [gmailComposeScope];
10
10
  export const gmailSendScopes = [gmailSendScope];
11
11
  export const gmailLabelScopes = [gmailLabelsScope];
12
12
  export const gmailSettingsBasicScopes = [gmailSettingsBasicScope];
13
+ /**
14
+ * The scopes a SERVICE ACCOUNT token is minted for, and the ones the proxy
15
+ * resolves with. Unchanged: a domain-wide-delegation grant lists these exact
16
+ * scopes in the Workspace admin console, and a token request naming a scope the
17
+ * admin has not authorized fails outright — so this list cannot grow without
18
+ * breaking every existing service-account connection.
19
+ */
13
20
  export const gmailOAuthScopes = [gmailModifyScope, gmailLabelsScope, gmailSettingsBasicScope];
21
+ /**
22
+ * The scopes a user OAuth authorization may request — the menu, not a minimum.
23
+ *
24
+ * `gmail.readonly` is here and not in {@link gmailOAuthScopes} because the two
25
+ * lists answer different questions. That one asks "what does a service account
26
+ * token need to cover every action"; `modify` subsumes `readonly` there, so
27
+ * adding it would be redundant at best and, through domain-wide delegation,
28
+ * breaking at worst.
29
+ *
30
+ * This one is what `filterDeclaredScopes` intersects a caller's
31
+ * `requestedScopes` against, so a scope absent here cannot be requested AT ALL.
32
+ * Leaving `readonly` out therefore forced every read-only integration to
33
+ * authorize `gmail.modify` — write, label and trash on the user's mailbox — in
34
+ * order to call actions that declare `gmailReadScopes`. That is the opposite of
35
+ * least privilege, and it is invisible: consent succeeds, so nothing reports
36
+ * that more was granted than the integration can use.
37
+ *
38
+ * Note for anyone storing a client config WITHOUT `requestedScopes`:
39
+ * `getEffectiveScopes` falls back to this whole list, so such a config now asks
40
+ * for four scopes rather than three. `readonly` is subsumed by `modify`, so no
41
+ * new capability is granted — but the consent screen gains a line, and a
42
+ * deployment that wants the narrow set should say so explicitly with
43
+ * `requestedScopes`, which is the correct posture regardless.
44
+ */
45
+ export const gmailAuthorizableScopes = [
46
+ gmailReadonlyScope,
47
+ gmailModifyScope,
48
+ gmailLabelsScope,
49
+ gmailSettingsBasicScope,
50
+ ];
@@ -0,0 +1,2 @@
1
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
+ export declare const gmailMessageReceived: 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
+ };