@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,452 @@
1
+ import { resolveTriggerConfig } from "../../triggers/common/config.js";
2
+ import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
3
+ import { snapshot, additionalSnapshot0 } from "./trigger-changes.definition.js";
4
+ const channelLifetimeMs = 7 * 24 * 60 * 60 * 1000 - 60 * 60 * 1000;
5
+ const channelRenewalLeadMs = 60 * 60 * 1000;
6
+ const creatingGraceMs = 60 * 1000;
7
+ const retryMs = 60 * 1000;
8
+ const maximumUnresolvedChannels = 2;
9
+ const encoder = new TextEncoder();
10
+ const changeFields = "nextPageToken,newStartPageToken,changes(fileId,kind,changeType,removed,time,driveId,file(id,name,mimeType,webViewLink,createdTime,modifiedTime,size,driveId,parents,shared,starred,trashed))";
11
+ export const googleDriveChanges = {
12
+ initialState: { checkpoint: null, subscription: { channels: [] } },
13
+ snapshot,
14
+ async receive(context) {
15
+ const verified = await receiveNotification(context);
16
+ if (verified.outcome != "wake")
17
+ return verified;
18
+ const state = requireState(context.state);
19
+ const resourceState = context.header("x-goog-resource-state");
20
+ if (!context.admit) {
21
+ return context.current
22
+ ? { body: "", contentType: "text/plain", outcome: "respond", status: 503 }
23
+ : { outcome: "ignored", reason: "Google Drive channel belongs to a retiring runtime." };
24
+ }
25
+ if (context.allow != null && !(await context.allow()))
26
+ return { outcome: "ignored", reason: "The Team cannot admit Trigger events." };
27
+ const page = await readGoogleDriveChanges(context, state.checkpoint);
28
+ const notification = {
29
+ changedTypes: (context.header("x-goog-changed") ?? "")
30
+ .split(",")
31
+ .map((value) => value.trim())
32
+ .filter((value) => value.length > 0),
33
+ messageNumber: context.header("x-goog-message-number") ?? null,
34
+ resourceState,
35
+ resourceUri: context.header("x-goog-resource-uri") ?? null,
36
+ };
37
+ const events = page.changes.map((change) => normalizeChange(change, notification));
38
+ const delivery = {
39
+ checkpoint: page.checkpoint,
40
+ continue: page.hasMore,
41
+ dedupeKey: page.dedupeKey,
42
+ };
43
+ return events.length == 0
44
+ ? { ...delivery, outcome: "ignored", reason: "Google Drive change page is empty." }
45
+ : { ...delivery, outcome: "event", outputs: { events } };
46
+ },
47
+ async reconcile(context) {
48
+ const state = requireState(context.state);
49
+ let channels = readChannels(state);
50
+ const currentTime = context.now.getTime();
51
+ const current = channels.filter((channel) => Date.parse(channel.expiration) > currentTime);
52
+ if (current.length != channels.length) {
53
+ channels = current;
54
+ await saveChannels(state, channels, context.now);
55
+ }
56
+ if (!context.active)
57
+ return await retire(context, channels);
58
+ const adopted = channels
59
+ .filter((channel) => channel.state == "creating" && channel.resourceId != null)
60
+ .toSorted((left, right) => Date.parse(right.createdAt) - Date.parse(left.createdAt))[0];
61
+ if (adopted != null) {
62
+ channels = channels.map((channel) => ({
63
+ ...channel,
64
+ state: channel.id == adopted.id ? "active" : "retiring",
65
+ }));
66
+ await saveChannels(state, channels, context.now);
67
+ }
68
+ let active = channels.find((channel) => channel.state == "active");
69
+ const creating = channels.filter((channel) => channel.state == "creating");
70
+ const staleCreating = creating.filter((channel) => Date.parse(channel.createdAt) + creatingGraceMs <= currentTime);
71
+ if (staleCreating.length > 0) {
72
+ const staleIds = new Set(staleCreating.map((channel) => channel.id));
73
+ channels = channels.map((channel) => (staleIds.has(channel.id) ? { ...channel, state: "retiring" } : channel));
74
+ await saveChannels(state, channels, context.now);
75
+ }
76
+ active = channels.find((channel) => channel.state == "active");
77
+ if (active != null) {
78
+ try {
79
+ channels = await stopRetiring(context, channels);
80
+ }
81
+ catch {
82
+ return { outcome: "ready" };
83
+ }
84
+ active = channels.find((channel) => channel.state == "active");
85
+ if (active != null && Date.parse(active.expiration) - channelRenewalLeadMs > currentTime) {
86
+ await saveChannels(state, channels, nextReconcileAt(channels, context.now));
87
+ return { outcome: "ready" };
88
+ }
89
+ }
90
+ if (channels.some((channel) => channel.state == "creating")) {
91
+ await saveChannels(state, channels, nextReconcileAt(channels, context.now));
92
+ return { outcome: active == null ? "pending" : "ready" };
93
+ }
94
+ const unresolved = channels.filter((channel) => channel.resourceId == null);
95
+ if (unresolved.length >= maximumUnresolvedChannels) {
96
+ await saveChannels(state, channels, nextReconcileAt(channels, context.now));
97
+ return { outcome: active == null ? "pending" : "ready" };
98
+ }
99
+ return await watch(context, channels);
100
+ },
101
+ };
102
+ function requireState(state) {
103
+ if (state == null)
104
+ throw new PermanentIntegrationError("Google Drive Integration state is missing.");
105
+ return state;
106
+ }
107
+ function resolveConfig(config) {
108
+ const value = resolveTriggerConfig(snapshot.configInputs, config);
109
+ return {
110
+ ...(typeof value.driveId == "string" ? { driveId: value.driveId } : {}),
111
+ includeCorpusRemovals: value.includeCorpusRemovals,
112
+ includeItemsFromAllDrives: value.includeItemsFromAllDrives,
113
+ includeRemoved: value.includeRemoved,
114
+ pageSize: value.pageSize,
115
+ restrictToMyDrive: value.restrictToMyDrive,
116
+ };
117
+ }
118
+ function checkpoint(value) {
119
+ const pageToken = isRecord(value) ? optionalString(value.pageToken) : undefined;
120
+ if (pageToken == null)
121
+ throw new PermanentIntegrationError("Google Drive checkpoint pageToken is missing.");
122
+ return pageToken;
123
+ }
124
+ function readChannels(state) {
125
+ const value = state.subscription.channels;
126
+ if (!Array.isArray(value))
127
+ throw new PermanentIntegrationError("Google Drive channel state is invalid.");
128
+ const channels = value.map((item) => {
129
+ if (item == null || typeof item != "object" || Array.isArray(item))
130
+ throw new PermanentIntegrationError("Google Drive channel is invalid.");
131
+ const channel = item;
132
+ if (typeof channel.createdAt != "string" ||
133
+ !Number.isFinite(Date.parse(channel.createdAt)) ||
134
+ typeof channel.expiration != "string" ||
135
+ !Number.isFinite(Date.parse(channel.expiration)) ||
136
+ typeof channel.id != "string" ||
137
+ !["active", "creating", "retiring", "stopping"].includes(String(channel.state)) ||
138
+ (channel.resourceId != null && typeof channel.resourceId != "string")) {
139
+ throw new PermanentIntegrationError("Google Drive channel fields are invalid.");
140
+ }
141
+ const parsed = {
142
+ createdAt: channel.createdAt,
143
+ expiration: channel.expiration,
144
+ id: channel.id,
145
+ state: channel.state,
146
+ };
147
+ return typeof channel.resourceId == "string" ? Object.assign(parsed, { resourceId: channel.resourceId }) : parsed;
148
+ });
149
+ if (new Set(channels.map((channel) => channel.id)).size != channels.length) {
150
+ throw new PermanentIntegrationError("Google Drive channel IDs are duplicated.");
151
+ }
152
+ return channels;
153
+ }
154
+ async function watch(context, channels) {
155
+ const state = requireState(context.state);
156
+ const config = resolveConfig(context.config);
157
+ let pageToken;
158
+ if (state.checkpoint === null) {
159
+ pageToken = await googleDriveStartPageToken(context);
160
+ await state.saveCheckpoint({ pageToken });
161
+ }
162
+ else {
163
+ pageToken = checkpoint(state.checkpoint);
164
+ }
165
+ const channel = {
166
+ createdAt: context.now.toISOString(),
167
+ expiration: new Date(context.now.getTime() + channelLifetimeMs).toISOString(),
168
+ id: crypto.randomUUID(),
169
+ state: "creating",
170
+ };
171
+ channels = [...channels, channel];
172
+ await saveChannels(state, channels, new Date(context.now.getTime() + creatingGraceMs));
173
+ let response;
174
+ try {
175
+ response = await execute(context, {
176
+ body: {
177
+ address: context.endpointUrl,
178
+ expiration: String(Date.parse(channel.expiration)),
179
+ id: channel.id,
180
+ token: await channelToken(context.callbackSecret, channel.id),
181
+ type: "web_hook",
182
+ },
183
+ endpoint: "/drive/v3/changes/watch",
184
+ method: "POST",
185
+ query: {
186
+ ...(config.driveId == null ? {} : { driveId: config.driveId }),
187
+ includeItemsFromAllDrives: config.driveId == null ? config.includeItemsFromAllDrives : true,
188
+ pageToken,
189
+ restrictToMyDrive: config.restrictToMyDrive,
190
+ supportsAllDrives: true,
191
+ },
192
+ });
193
+ }
194
+ catch (error) {
195
+ if (error instanceof IntegrationConnectionError || error instanceof PermanentIntegrationError) {
196
+ await saveChannels(state, channels.filter((candidate) => candidate.id != channel.id), context.now);
197
+ }
198
+ throw error;
199
+ }
200
+ if (!(response.status >= 200 && response.status < 300 && isRecord(response.data))) {
201
+ if (response.status >= 400 && response.status < 500 && response.status !== 408)
202
+ await saveChannels(state, channels.filter((candidate) => candidate.id !== channel.id), context.now);
203
+ failure(response, "changes.watch");
204
+ }
205
+ const result = response.data;
206
+ const resourceId = optionalString(result.resourceId);
207
+ if (resourceId == null)
208
+ throw new TransientIntegrationError("Google Drive changes.watch response is missing resourceId.");
209
+ const expiration = epoch(result.expiration) ?? channel.expiration;
210
+ channels = channels.map((candidate) => {
211
+ if (candidate.id == channel.id)
212
+ return { ...candidate, expiration, resourceId, state: "active" };
213
+ return candidate.state == "active" ? { ...candidate, state: "retiring" } : candidate;
214
+ });
215
+ await saveChannels(state, channels, nextReconcileAt(channels, context.now));
216
+ try {
217
+ channels = await stopRetiring(context, channels);
218
+ }
219
+ catch {
220
+ return { outcome: "ready" };
221
+ }
222
+ await saveChannels(state, channels, nextReconcileAt(channels, context.now));
223
+ return { outcome: "ready" };
224
+ }
225
+ async function retire(context, channels) {
226
+ const state = requireState(context.state);
227
+ if (channels.some((channel) => channel.state == "active" || channel.state == "creating")) {
228
+ channels = channels.map((channel) => ({ ...channel, state: "retiring" }));
229
+ await saveChannels(state, channels, context.now);
230
+ }
231
+ channels = await stopRetiring(context, channels);
232
+ if (channels.length == 0)
233
+ return { outcome: "ready" };
234
+ await saveChannels(state, channels, nextReconcileAt(channels, context.now));
235
+ return { outcome: "pending" };
236
+ }
237
+ async function stopRetiring(context, channels) {
238
+ const state = requireState(context.state);
239
+ for (const channel of channels) {
240
+ if ((channel.state != "retiring" && channel.state != "stopping") || channel.resourceId == null)
241
+ continue;
242
+ const stopping = channels.map((candidate) => candidate.id == channel.id ? { ...candidate, state: "stopping" } : candidate);
243
+ await saveChannels(state, stopping, new Date(context.now.getTime() + retryMs));
244
+ await stopChannel(context, channel);
245
+ channels = stopping.filter((candidate) => candidate.id != channel.id);
246
+ await saveChannels(state, channels, context.now);
247
+ }
248
+ return channels;
249
+ }
250
+ export async function googleDriveStartPageToken(context) {
251
+ const config = resolveConfig(context.config);
252
+ const result = await request(context, {
253
+ endpoint: "/drive/v3/changes/startPageToken",
254
+ method: "GET",
255
+ query: {
256
+ ...(config.driveId == null ? {} : { driveId: config.driveId }),
257
+ supportsAllDrives: true,
258
+ },
259
+ }, "changes.getStartPageToken");
260
+ const token = isRecord(result) ? optionalString(result.startPageToken) : undefined;
261
+ if (token == null)
262
+ throw new TransientIntegrationError("Google Drive startPageToken response is invalid.");
263
+ return token;
264
+ }
265
+ async function readGoogleDriveChanges(context, cursor) {
266
+ const config = resolveConfig(context.config);
267
+ const pageToken = checkpoint(cursor);
268
+ const result = await request(context, {
269
+ endpoint: "/drive/v3/changes",
270
+ method: "GET",
271
+ query: {
272
+ ...(config.driveId == null ? {} : { driveId: config.driveId }),
273
+ fields: changeFields,
274
+ includeCorpusRemovals: config.includeCorpusRemovals,
275
+ includeItemsFromAllDrives: config.driveId == null ? config.includeItemsFromAllDrives : true,
276
+ includeRemoved: config.includeCorpusRemovals || config.includeRemoved,
277
+ pageSize: config.pageSize,
278
+ pageToken,
279
+ restrictToMyDrive: config.restrictToMyDrive,
280
+ supportsAllDrives: true,
281
+ },
282
+ }, "changes.list");
283
+ for (const field of ["nextPageToken", "newStartPageToken"]) {
284
+ if (result[field] !== undefined && optionalString(result[field]) == null) {
285
+ throw new TransientIntegrationError(`Google Drive changes response contains an invalid ${field}.`);
286
+ }
287
+ }
288
+ const nextPageToken = optionalString(result.nextPageToken);
289
+ const nextCheckpoint = nextPageToken ?? optionalString(result.newStartPageToken);
290
+ if (nextCheckpoint == null)
291
+ throw new TransientIntegrationError("Google Drive changes response is missing its next checkpoint.");
292
+ if (result.changes != null && (!Array.isArray(result.changes) || !result.changes.every(isRecord))) {
293
+ throw new TransientIntegrationError("Google Drive changes response contains invalid changes.");
294
+ }
295
+ if (nextPageToken === pageToken)
296
+ throw new TransientIntegrationError("Google Drive changes continuation did not advance.");
297
+ return {
298
+ changes: (result.changes ?? []),
299
+ checkpoint: { pageToken: nextCheckpoint },
300
+ dedupeKey: `${config.driveId ?? "my-drive"}:${pageToken}`,
301
+ hasMore: nextPageToken != null,
302
+ };
303
+ }
304
+ async function stopChannel(context, channel) {
305
+ const result = await execute(context, {
306
+ body: { id: channel.id, resourceId: channel.resourceId },
307
+ endpoint: "/drive/v3/channels/stop",
308
+ method: "POST",
309
+ });
310
+ if ((result.status >= 200 && result.status < 300) || result.status == 404)
311
+ return;
312
+ failure(result, "channels.stop");
313
+ }
314
+ async function request(context, input, operation) {
315
+ const result = await execute(context, input);
316
+ if (result.status >= 200 && result.status < 300 && isRecord(result.data))
317
+ return result.data;
318
+ failure(result, operation);
319
+ }
320
+ async function execute(context, input) {
321
+ try {
322
+ return await context.connector.execute(input, context.signal);
323
+ }
324
+ catch (cause) {
325
+ if (cause instanceof IntegrationConnectionError)
326
+ throw cause;
327
+ throw new TransientIntegrationError("Google Drive proxy request failed.", { cause });
328
+ }
329
+ }
330
+ function failure(result, operation) {
331
+ const reason = googleReason(result.data);
332
+ if (result.status == 401 || (result.status == 403 && !reason.toLowerCase().includes("ratelimit"))) {
333
+ throw new IntegrationConnectionError(`Google Drive ${operation} requires Connection reauthorization.`);
334
+ }
335
+ if (result.status == 408 || result.status == 429 || result.status >= 500) {
336
+ throw new TransientIntegrationError(`Google Drive ${operation} is temporarily unavailable.`);
337
+ }
338
+ throw new PermanentIntegrationError(`Google Drive ${operation} rejected the subscription${reason == "" ? "." : ` with ${reason}.`}`);
339
+ }
340
+ function googleReason(value) {
341
+ if (!isRecord(value) || !isRecord(value.error))
342
+ return "";
343
+ const errors = value.error.errors;
344
+ if (Array.isArray(errors) && isRecord(errors[0]) && typeof errors[0].reason == "string")
345
+ return errors[0].reason;
346
+ return typeof value.error.status == "string" ? value.error.status : "";
347
+ }
348
+ function normalizeChange(change, notification) {
349
+ const driveId = optionalString(change.driveId);
350
+ const fileId = optionalString(change.fileId);
351
+ const time = optionalString(change.time);
352
+ const changeType = optionalString(change.changeType);
353
+ const removed = change.removed === true;
354
+ return {
355
+ changeId: [
356
+ driveId ?? "my-drive",
357
+ fileId ?? "unknown-file",
358
+ time ?? "unknown-time",
359
+ changeType ?? "unknown-change",
360
+ removed ? "removed" : "present",
361
+ ].join(":"),
362
+ changeType: changeType ?? null,
363
+ driveId: driveId ?? null,
364
+ file: isRecord(change.file) ? change.file : null,
365
+ fileId: fileId ?? null,
366
+ notification,
367
+ removed,
368
+ time: time ?? null,
369
+ };
370
+ }
371
+ async function saveChannels(state, channels, reconcileAt) {
372
+ await state.saveSubscription({ channels: channels }, reconcileAt);
373
+ }
374
+ function nextReconcileAt(channels, now) {
375
+ const times = channels.map((channel) => {
376
+ if (channel.state == "active")
377
+ return Date.parse(channel.expiration) - channelRenewalLeadMs;
378
+ if (channel.state == "creating")
379
+ return Date.parse(channel.createdAt) + creatingGraceMs;
380
+ return channel.resourceId == null ? Date.parse(channel.expiration) : now.getTime() + retryMs;
381
+ });
382
+ const next = times.length == 0 ? now.getTime() + retryMs : Math.min(...times);
383
+ return new Date(Math.max(now.getTime(), next));
384
+ }
385
+ async function channelToken(secret, channelId) {
386
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { hash: "SHA-256", name: "HMAC" }, false, [
387
+ "sign",
388
+ ]);
389
+ const signature = new Uint8Array(await crypto.subtle.sign("HMAC", key, encoder.encode(`google-drive-channel/v1/${channelId}`)));
390
+ return Buffer.from(signature).toString("base64").replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
391
+ }
392
+ function sameSecret(candidate, expected) {
393
+ if (candidate.length != expected.length)
394
+ return false;
395
+ let difference = 0;
396
+ for (let index = 0; index < expected.length; index += 1)
397
+ difference |= candidate.charCodeAt(index) ^ expected.charCodeAt(index);
398
+ return difference == 0;
399
+ }
400
+ function epoch(value) {
401
+ const timestamp = typeof value == "string" || typeof value == "number" ? Number(value) : Number.NaN;
402
+ return Number.isFinite(timestamp) && timestamp > 0 ? new Date(timestamp).toISOString() : undefined;
403
+ }
404
+ function optionalString(value) {
405
+ return typeof value == "string" && value.length > 0 ? value : undefined;
406
+ }
407
+ function isRecord(value) {
408
+ return value != null && typeof value == "object" && !Array.isArray(value);
409
+ }
410
+ async function receiveNotification(context) {
411
+ const state = requireState(context.state);
412
+ const channelId = context.header("x-goog-channel-id");
413
+ const resourceId = context.header("x-goog-resource-id");
414
+ const resourceState = context.header("x-goog-resource-state");
415
+ const token = context.header("x-goog-channel-token");
416
+ if (channelId == null || resourceId == null || resourceState == null || token == null) {
417
+ return { body: "", contentType: "text/plain", outcome: "respond", status: 404 };
418
+ }
419
+ let channels = readChannels(state);
420
+ const channel = channels.find((candidate) => candidate.id == channelId && Date.parse(candidate.expiration) > context.now.getTime());
421
+ if (channel == null ||
422
+ !sameSecret(token, await channelToken(context.callbackSecret, channelId)) ||
423
+ (channel.resourceId != null && channel.resourceId != resourceId)) {
424
+ return { body: "", contentType: "text/plain", outcome: "respond", status: 404 };
425
+ }
426
+ if (channel.resourceId == null) {
427
+ channels = channels.map((candidate) => (candidate.id == channelId ? { ...candidate, resourceId } : candidate));
428
+ await saveChannels(state, channels, context.now);
429
+ }
430
+ if (resourceState != "sync" && resourceState != "change") {
431
+ return { outcome: "ignored", reason: "Google Drive notification state is not actionable." };
432
+ }
433
+ return { outcome: "wake" };
434
+ }
435
+ export const googleDriveChangeListener = {
436
+ initialState: googleDriveChanges.initialState,
437
+ reconcile: googleDriveChanges.reconcile,
438
+ receive: receiveNotification,
439
+ listener: {
440
+ intervalMs: 300_000,
441
+ async read(context) {
442
+ const page = await readGoogleDriveChanges(context, context.checkpoint);
443
+ return {
444
+ checkpoint: page.checkpoint,
445
+ dedupeKey: page.dedupeKey,
446
+ hasMore: page.hasMore,
447
+ outputs: page.changes.length == 0 ? null : { events: page.changes },
448
+ };
449
+ },
450
+ },
451
+ snapshot: additionalSnapshot0,
452
+ };
@@ -0,0 +1,2 @@
1
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
+ export declare const googleDriveFileChange: 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,77 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const eventSchema = s.object({
3
+ createdTime: { type: ["string", "null"] },
4
+ driveId: { type: ["string", "null"] },
5
+ eventType: s.stringEnum(["file_created", "file_updated", "folder_created", "folder_updated"]),
6
+ fileId: s.string(),
7
+ itemType: s.stringEnum(["file", "folder"]),
8
+ lastModifyingUser: { type: ["object", "null"] },
9
+ mimeType: s.string(),
10
+ modifiedTime: { type: ["string", "null"] },
11
+ name: s.string(),
12
+ parents: s.array(s.string()),
13
+ size: s.string(),
14
+ webViewLink: { type: ["string", "null"] },
15
+ }, {
16
+ additionalProperties: false,
17
+ required: [
18
+ "eventType",
19
+ "itemType",
20
+ "fileId",
21
+ "name",
22
+ "mimeType",
23
+ "createdTime",
24
+ "modifiedTime",
25
+ "parents",
26
+ "webViewLink",
27
+ "driveId",
28
+ "lastModifyingUser",
29
+ ],
30
+ });
31
+ export const snapshot = {
32
+ configInputs: [
33
+ {
34
+ handle: "changeType",
35
+ jsonSchema: s.stringEnum(["created", "updated"]),
36
+ nullable: false,
37
+ },
38
+ {
39
+ handle: "driveId",
40
+ jsonSchema: s.string({ pattern: "^[A-Za-z0-9_-]{0,512}$" }),
41
+ nullable: false,
42
+ value: "",
43
+ },
44
+ {
45
+ handle: "folderId",
46
+ jsonSchema: s.string({ pattern: "^[A-Za-z0-9_-]{2,512}$" }),
47
+ nullable: false,
48
+ },
49
+ {
50
+ handle: "itemTypes",
51
+ jsonSchema: s.array(s.stringEnum(["file", "folder"]), { minItems: 1, uniqueItems: true }),
52
+ nullable: false,
53
+ value: ["file"],
54
+ },
55
+ {
56
+ handle: "maxFilesPerPoll",
57
+ jsonSchema: s.integer({ maximum: 200, minimum: 1 }),
58
+ nullable: false,
59
+ value: 50,
60
+ },
61
+ {
62
+ handle: "mimeTypes",
63
+ jsonSchema: s.array(s.string({ minLength: 1 })),
64
+ nullable: false,
65
+ value: [],
66
+ },
67
+ { handle: "namePrefix", jsonSchema: s.string(), nullable: false, value: "" },
68
+ ],
69
+ definitionVersion: 2,
70
+ description: "Polls one Google Drive folder and triggers when a file or folder directly inside it is created or updated.",
71
+ displayName: "File or Folder Change in a Folder",
72
+ key: "googledrive.on_file_change",
73
+ name: "on_file_change",
74
+ outputs: [{ handle: "events", jsonSchema: s.array(eventSchema), nullable: false }],
75
+ provider: "googledrive",
76
+ type: "poll",
77
+ };