@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,293 @@
1
+ import { compactObject, looseArray, optionalRecord, optionalString, recordOrEmpty } from "../../core/cast.js";
2
+ import { ProviderRequestError, providerResponseError } from "../provider-runtime.js";
3
+ import { encodeResourceName, googleChatApiBaseUrl, googleChatJsonRequest, stripPrefix } from "./runtime.js";
4
+ const peopleApiBaseUrl = "https://people.googleapis.com/v1";
5
+ // A direct message has at most two members, so this only guards against a
6
+ // pagination token that never runs out.
7
+ const maxDirectMessageMemberPages = 20;
8
+ /** people:batchGet accepts at most this many resource names per call. */
9
+ export const maxProfilesPerLookup = 200;
10
+ // google.rpc.Code values a per-person batchGet status can carry.
11
+ const rpcNotFound = 5;
12
+ const rpcPermissionDenied = 7;
13
+ /**
14
+ * Name the other participant of a direct message. The authenticated user and the
15
+ * peer are told apart by id, because a Chat membership never says which member is
16
+ * "me". BOT and SELF are ordinary outcomes, not failures: they keep whatever name
17
+ * and email Chat reports for the membership and skip the directory.
18
+ */
19
+ export async function resolveDirectMessagePeer(spaceName, context) {
20
+ const [selfUser, members] = await Promise.all([readSelfUserName(context), listAllMembers(spaceName, context)]);
21
+ const humans = members.filter((member) => member.type === "HUMAN");
22
+ const bots = members.filter((member) => member.type === "BOT");
23
+ const others = humans.filter((member) => member.name !== selfUser);
24
+ const self = humans.find((member) => member.name === selfUser);
25
+ if (others.length === 1) {
26
+ const [peer] = others;
27
+ const profiles = await lookupProfiles(missingChatProfiles(others), context);
28
+ return { kind: "HUMAN", user: peer.name, ...mergeProfile(peer, profiles.get(peer.name)) };
29
+ }
30
+ if (others.length > 1) {
31
+ return ambiguousPeer(others);
32
+ }
33
+ if (bots.length === 1) {
34
+ const [peer] = bots;
35
+ return { kind: "BOT", user: peer.name, ...mergeProfile(peer, undefined) };
36
+ }
37
+ if (bots.length === 0 && self) {
38
+ return { kind: "SELF", user: self.name, ...mergeProfile(self, undefined) };
39
+ }
40
+ return ambiguousPeer(bots);
41
+ }
42
+ /**
43
+ * One page of a space's members. Every human Google Chat left without a name or
44
+ * email is looked up in a single batched directory call; the page size is capped
45
+ * so one call always covers the page.
46
+ */
47
+ export async function listSpaceMembersPage(spaceName, request, context) {
48
+ const [selfUser, page] = await Promise.all([readSelfUserName(context), fetchMemberPage(spaceName, request, context)]);
49
+ const humans = page.members.filter((member) => member.type === "HUMAN");
50
+ const profiles = await lookupProfiles(missingChatProfiles(humans), context);
51
+ return {
52
+ members: page.members.map((member) => ({
53
+ user: member.name,
54
+ kind: member.type,
55
+ role: member.role,
56
+ isSelf: member.name === selfUser,
57
+ ...mergeProfile(member, profiles.get(member.name)),
58
+ })),
59
+ nextPageToken: page.nextPageToken ?? null,
60
+ };
61
+ }
62
+ function ambiguousPeer(candidates) {
63
+ return {
64
+ kind: "AMBIGUOUS",
65
+ user: null,
66
+ displayName: null,
67
+ email: null,
68
+ candidates: candidates.map((member) => member.name),
69
+ };
70
+ }
71
+ /** The authenticated user's own `users/{id}`; People and Chat share the id. */
72
+ async function readSelfUserName(context) {
73
+ let payload;
74
+ try {
75
+ payload = recordOrEmpty(await googleChatJsonRequest(`${peopleApiBaseUrl}/people/me`, {
76
+ context,
77
+ query: { personFields: "metadata" },
78
+ }));
79
+ }
80
+ catch (error) {
81
+ if (context.signal?.aborted) {
82
+ throw error;
83
+ }
84
+ // Only a 403 can mean the People API is not enabled for the project.
85
+ throw explainLookupError("could not read the authenticated user's own id from the People API, so members cannot be told apart from the caller", error, "The People API must be enabled for the OAuth client's Google Cloud project.");
86
+ }
87
+ const resourceName = optionalString(payload.resourceName);
88
+ if (!resourceName?.startsWith("people/")) {
89
+ throw new ProviderRequestError(502, "the People API returned no resource name for the authenticated user");
90
+ }
91
+ return `users/${stripPrefix(resourceName, "people/")}`;
92
+ }
93
+ /**
94
+ * Say which Chat or People lookup failed. An HTTP failure keeps its status and
95
+ * details and gains forbiddenHint on a 403, the only status a console or consent
96
+ * change can fix; a 429, a 5xx, or a timeout needs a retry instead. A failure that
97
+ * is not an HTTP error, such as a response that is not JSON, becomes a 502 that
98
+ * names the lookup instead of reaching the caller as a raw internal error.
99
+ */
100
+ function explainLookupError(summary, error, forbiddenHint) {
101
+ if (!(error instanceof ProviderRequestError)) {
102
+ return providerResponseError(`${summary}: ${error instanceof Error ? error.message : String(error)}`);
103
+ }
104
+ const hint = error.status === 403 ? ` ${forbiddenHint}` : "";
105
+ // Google's messages usually end in a period already; drop it so the sentence ends once.
106
+ const detail = error.message.replace(/\.\s*$/, "");
107
+ return new ProviderRequestError(error.status, `${summary}: ${detail}.${hint}`, error.details);
108
+ }
109
+ async function listAllMembers(spaceName, context) {
110
+ let members = [];
111
+ let pageToken;
112
+ for (let page = 0; page < maxDirectMessageMemberPages; page += 1) {
113
+ let result;
114
+ try {
115
+ // Chat leaves invited members out by default. A peer who has not joined the
116
+ // conversation yet is still the peer; without it the caller would be the only
117
+ // member left and the direct message would be misreported as SELF.
118
+ result = await fetchMemberPage(spaceName, { pageSize: 100, pageToken, showInvited: true }, context);
119
+ }
120
+ catch (error) {
121
+ if (context.signal?.aborted) {
122
+ throw error;
123
+ }
124
+ // A 403 here is almost always the missing scope: the space itself was readable.
125
+ throw explainLookupError(`could not list the members of ${spaceName}, so the direct message's other participant is unknown`, error, "Listing members needs the chat.memberships.readonly scope, which service account connections never request; an OAuth connection authorized before this scope was added must be reconnected to grant it.");
126
+ }
127
+ members = [...members, ...result.members];
128
+ pageToken = result.nextPageToken;
129
+ if (!pageToken) {
130
+ return members;
131
+ }
132
+ }
133
+ throw new ProviderRequestError(502, `Google Chat kept paginating the members of ${spaceName}`);
134
+ }
135
+ async function fetchMemberPage(spaceName, request, context) {
136
+ const payload = await googleChatJsonRequest(`${googleChatApiBaseUrl}/${encodeResourceName(spaceName)}/members`, {
137
+ context,
138
+ query: compactObject({
139
+ pageSize: String(request.pageSize),
140
+ pageToken: request.pageToken,
141
+ showInvited: request.showInvited ? "true" : undefined,
142
+ }),
143
+ });
144
+ return {
145
+ members: looseArray(payload.memberships).flatMap((item) => toChatMember(item)),
146
+ nextPageToken: optionalString(payload.nextPageToken),
147
+ };
148
+ }
149
+ function toChatMember(value) {
150
+ const membership = recordOrEmpty(value);
151
+ const member = recordOrEmpty(membership.member);
152
+ const name = optionalString(member.name);
153
+ return name
154
+ ? [
155
+ {
156
+ name,
157
+ type: optionalString(member.type),
158
+ role: optionalString(membership.role),
159
+ displayName: optionalString(member.displayName),
160
+ email: optionalString(member.email),
161
+ },
162
+ ]
163
+ : [];
164
+ }
165
+ /**
166
+ * Fill in each human sender's name and email on normalized messages. Under user
167
+ * authentication Chat reports them itself only for members of the space and users
168
+ * with prior affinity to the caller, so every human sender missing either is
169
+ * looked up in the directory. Distinct senders are looked up together, so a page
170
+ * costs one extra request per 200 senders. A failed lookup leaves the message
171
+ * intact with a null name and a reason; bots and messages without a sender are
172
+ * left as they are.
173
+ */
174
+ export async function attachSenderProfiles(messages, context) {
175
+ const profiles = await lookupProfiles(missingChatProfiles(messages.flatMap((message) => humanSender(message))), context);
176
+ return messages.map((message) => {
177
+ const [sender] = humanSender(message);
178
+ return sender
179
+ ? { ...message, sender: { ...recordOrEmpty(message.sender), ...mergeProfile(sender, profiles.get(sender.name)) } }
180
+ : message;
181
+ });
182
+ }
183
+ /** The human users/{id} sender of a normalized message, if it has one. */
184
+ function humanSender(message) {
185
+ const sender = optionalRecord(message.sender);
186
+ const name = optionalString(sender?.name);
187
+ return sender?.type === "HUMAN" && name?.startsWith("users/")
188
+ ? [{ name, displayName: optionalString(sender.displayName), email: optionalString(sender.email) }]
189
+ : [];
190
+ }
191
+ /** The distinct users whose name or email Chat left out, which only the directory can fill in. */
192
+ function missingChatProfiles(users) {
193
+ const missing = users.filter((user) => user.displayName === undefined || user.email === undefined);
194
+ return [...new Set(missing.map((user) => user.name))];
195
+ }
196
+ /**
197
+ * Combine what Chat reported with the directory profile. Chat's own name and email
198
+ * win and the directory only fills in what Chat left out, so a failed lookup never
199
+ * replaces a known value with null. profileUnavailableReason explains a null
200
+ * displayName, so it is only kept while the name is still missing.
201
+ */
202
+ function mergeProfile(chat, directory) {
203
+ const displayName = chat.displayName ?? directory?.displayName ?? null;
204
+ return {
205
+ displayName,
206
+ email: chat.email ?? directory?.email ?? null,
207
+ profileUnavailableReason: displayName === null ? directory?.profileUnavailableReason : undefined,
208
+ };
209
+ }
210
+ /**
211
+ * Name `users/{id}` members through the Workspace directory, batching up to the
212
+ * People API limit per call. A member whose profile cannot be read keeps a null
213
+ * name and a reason; a failure of a whole call gives each member in it that reason.
214
+ */
215
+ async function lookupProfiles(users, context) {
216
+ const batches = Array.from({ length: Math.ceil(users.length / maxProfilesPerLookup) }, (_, index) => users.slice(index * maxProfilesPerLookup, (index + 1) * maxProfilesPerLookup));
217
+ const results = await Promise.all(batches.map((batch) => lookupProfileBatch(batch, context)));
218
+ return new Map(results.flatMap((result) => [...result]));
219
+ }
220
+ async function lookupProfileBatch(users, context) {
221
+ let payload;
222
+ try {
223
+ payload = recordOrEmpty(await googleChatJsonRequest(`${peopleApiBaseUrl}/people:batchGet`, {
224
+ context,
225
+ query: {
226
+ resourceNames: users.map((user) => `people/${stripPrefix(user, "users/")}`),
227
+ personFields: "names,emailAddresses",
228
+ sources: "READ_SOURCE_TYPE_PROFILE",
229
+ },
230
+ }));
231
+ }
232
+ catch (error) {
233
+ // Naming is best effort, so only a cancelled request stops the action. Any
234
+ // other failure, including a network error or a 200 whose body is not JSON,
235
+ // leaves the users unnamed with a reason.
236
+ if (context.signal?.aborted) {
237
+ throw error;
238
+ }
239
+ const reason = error instanceof ProviderRequestError ? httpFailureReason(error.status) : "people_request_failed";
240
+ return new Map(users.map((user) => [user, unavailableProfile(reason)]));
241
+ }
242
+ const responses = new Map(looseArray(payload.responses).map((entry) => {
243
+ const response = recordOrEmpty(entry);
244
+ return [optionalString(response.requestedResourceName), response];
245
+ }));
246
+ return new Map(users.map((user) => [user, toMemberProfile(responses.get(`people/${stripPrefix(user, "users/")}`))]));
247
+ }
248
+ function toMemberProfile(response) {
249
+ // A missing entry says nothing about the person: a genuine miss comes back as its
250
+ // own NOT_FOUND status, so an absent or unmatched entry is a malformed response.
251
+ if (!response) {
252
+ return unavailableProfile("people_request_failed");
253
+ }
254
+ const rpcCode = optionalRecord(response.status)?.code;
255
+ if (typeof rpcCode === "number" && rpcCode !== 0) {
256
+ return unavailableProfile(rpcFailureReason(rpcCode));
257
+ }
258
+ const person = recordOrEmpty(response.person);
259
+ const displayName = primaryProfileValue(person.names, "displayName");
260
+ return {
261
+ displayName: displayName ?? null,
262
+ email: primaryProfileValue(person.emailAddresses, "value") ?? null,
263
+ // A 200 without a name is what a Workspace with profile sharing turned off returns.
264
+ profileUnavailableReason: displayName ? undefined : "profile_name_missing",
265
+ };
266
+ }
267
+ function unavailableProfile(reason) {
268
+ return { displayName: null, email: null, profileUnavailableReason: reason };
269
+ }
270
+ /** Only 403 and 404 say something about the profile; anything else is a failed request, not a hidden one. */
271
+ function httpFailureReason(status) {
272
+ if (status === 403) {
273
+ return "people_forbidden";
274
+ }
275
+ if (status === 404) {
276
+ return "people_not_found";
277
+ }
278
+ return "people_request_failed";
279
+ }
280
+ function rpcFailureReason(code) {
281
+ if (code === rpcPermissionDenied) {
282
+ return "people_forbidden";
283
+ }
284
+ if (code === rpcNotFound) {
285
+ return "people_not_found";
286
+ }
287
+ return "people_request_failed";
288
+ }
289
+ function primaryProfileValue(value, field) {
290
+ const entries = looseArray(value).map((entry) => recordOrEmpty(entry));
291
+ const primary = entries.find((entry) => optionalRecord(entry.metadata)?.primary === true) ?? entries[0];
292
+ return optionalString(primary?.[field]);
293
+ }
@@ -0,0 +1,16 @@
1
+ import type { GoogleQueryValue } from "../googledrive/runtime-request.ts";
2
+ import type { OAuthProviderContext } from "../provider-runtime.ts";
3
+ export declare const googleChatApiBaseUrl = "https://chat.googleapis.com/v1";
4
+ export type GoogleChatRuntimeContext = OAuthProviderContext;
5
+ interface GoogleChatRequestInput {
6
+ context: Pick<GoogleChatRuntimeContext, "accessToken" | "fetcher" | "signal">;
7
+ method?: string;
8
+ query?: Record<string, GoogleQueryValue>;
9
+ body?: unknown;
10
+ }
11
+ /** Send an authenticated JSON request on behalf of the Google Chat connection, to Chat or another Google API. */
12
+ export declare function googleChatJsonRequest<T>(url: string, input: GoogleChatRequestInput): Promise<T>;
13
+ /** Percent-encode each segment of a resource name such as spaces/{space}, keeping the separators. */
14
+ export declare function encodeResourceName(name: string): string;
15
+ export declare function stripPrefix(value: string, prefix: string): string;
16
+ export {};
@@ -0,0 +1,25 @@
1
+ import { googleJsonRequest } from "../googledrive/runtime-request.js";
2
+ export const googleChatApiBaseUrl = "https://chat.googleapis.com/v1";
3
+ const service = "googlechat";
4
+ /** Send an authenticated JSON request on behalf of the Google Chat connection, to Chat or another Google API. */
5
+ export function googleChatJsonRequest(url, input) {
6
+ return googleJsonRequest(url, {
7
+ accessToken: input.context.accessToken,
8
+ fetcher: input.context.fetcher,
9
+ signal: input.context.signal,
10
+ method: input.method,
11
+ query: input.query,
12
+ body: input.body,
13
+ service,
14
+ });
15
+ }
16
+ /** Percent-encode each segment of a resource name such as spaces/{space}, keeping the separators. */
17
+ export function encodeResourceName(name) {
18
+ return name
19
+ .split("/")
20
+ .map((segment) => encodeURIComponent(segment))
21
+ .join("/");
22
+ }
23
+ export function stripPrefix(value, prefix) {
24
+ return value.startsWith(prefix) ? value.slice(prefix.length) : value;
25
+ }
@@ -1,6 +1,25 @@
1
1
  export declare const googleChatSpacesReadonlyScope = "https://www.googleapis.com/auth/chat.spaces.readonly";
2
2
  export declare const googleChatMessagesReadonlyScope = "https://www.googleapis.com/auth/chat.messages.readonly";
3
- export declare const googleOpenIdScope = "openid";
4
- export declare const googleEmailScope = "email";
5
- export declare const googleProfileScope = "profile";
3
+ /**
4
+ * Grants only "compose and send messages". Deliberately not `chat.messages`,
5
+ * which Google describes as "see, compose, send, update, and delete messages"
6
+ * plus reactions — far beyond what sending a message needs.
7
+ */
8
+ export declare const googleChatMessagesCreateScope = "https://www.googleapis.com/auth/chat.messages.create";
9
+ /** Lists the members of a space, which is the only way to learn a direct message's other participant. */
10
+ export declare const googleChatMembershipsReadonlyScope = "https://www.googleapis.com/auth/chat.memberships.readonly";
11
+ /**
12
+ * Reads Workspace directory profiles through the People API. Under user
13
+ * authentication Chat can report a member as just `users/{id}` with no name, and
14
+ * this is the narrowest scope that turns that id into a name. It exposes the organization directory, not
15
+ * just the peer, and Workspace admins can restrict it or disable profile sharing.
16
+ */
17
+ export declare const googleDirectoryReadonlyScope = "https://www.googleapis.com/auth/directory.readonly";
18
+ /**
19
+ * Scopes minted into service account tokens. Frozen at what existing domain-wide
20
+ * delegations already grant: a token request that asks for an undelegated scope
21
+ * fails as a whole, which would break every Chat action, not just the new ones.
22
+ * Service account connections therefore cannot send messages or name members.
23
+ */
24
+ export declare const googleChatServiceAccountScopes: string[];
6
25
  export declare const googleChatOAuthScopes: string[];
@@ -1,12 +1,35 @@
1
+ import { googleIdentityScopes } from "../googleads/scopes.js";
1
2
  export const googleChatSpacesReadonlyScope = "https://www.googleapis.com/auth/chat.spaces.readonly";
2
3
  export const googleChatMessagesReadonlyScope = "https://www.googleapis.com/auth/chat.messages.readonly";
3
- export const googleOpenIdScope = "openid";
4
- export const googleEmailScope = "email";
5
- export const googleProfileScope = "profile";
6
- export const googleChatOAuthScopes = [
4
+ /**
5
+ * Grants only "compose and send messages". Deliberately not `chat.messages`,
6
+ * which Google describes as "see, compose, send, update, and delete messages"
7
+ * plus reactions — far beyond what sending a message needs.
8
+ */
9
+ export const googleChatMessagesCreateScope = "https://www.googleapis.com/auth/chat.messages.create";
10
+ /** Lists the members of a space, which is the only way to learn a direct message's other participant. */
11
+ export const googleChatMembershipsReadonlyScope = "https://www.googleapis.com/auth/chat.memberships.readonly";
12
+ /**
13
+ * Reads Workspace directory profiles through the People API. Under user
14
+ * authentication Chat can report a member as just `users/{id}` with no name, and
15
+ * this is the narrowest scope that turns that id into a name. It exposes the organization directory, not
16
+ * just the peer, and Workspace admins can restrict it or disable profile sharing.
17
+ */
18
+ export const googleDirectoryReadonlyScope = "https://www.googleapis.com/auth/directory.readonly";
19
+ /**
20
+ * Scopes minted into service account tokens. Frozen at what existing domain-wide
21
+ * delegations already grant: a token request that asks for an undelegated scope
22
+ * fails as a whole, which would break every Chat action, not just the new ones.
23
+ * Service account connections therefore cannot send messages or name members.
24
+ */
25
+ export const googleChatServiceAccountScopes = [
7
26
  googleChatSpacesReadonlyScope,
8
27
  googleChatMessagesReadonlyScope,
9
- googleOpenIdScope,
10
- googleEmailScope,
11
- googleProfileScope,
28
+ ...googleIdentityScopes,
29
+ ];
30
+ export const googleChatOAuthScopes = [
31
+ ...googleChatServiceAccountScopes,
32
+ googleChatMessagesCreateScope,
33
+ googleChatMembershipsReadonlyScope,
34
+ googleDirectoryReadonlyScope,
12
35
  ];
@@ -1,6 +1,6 @@
1
1
  import { Buffer } from "node:buffer";
2
2
  import { integer, objectArray } from "../../core/cast.js";
3
- import { googleJsonRequest as googleJsonRequestShared, googleRequest as googleRequestShared, } from "../google-runtime.js";
3
+ import { googleJsonRequest as googleJsonRequestShared, googleRequest as googleRequestShared, } from "../googledrive/runtime-request.js";
4
4
  import { asObject, asOptionalObject, asStringArray, compactObject, optionalBoolean, } from "../googledrive/runtime-shared.js";
5
5
  import { defineProviderExecutors, defineProviderProxy, ProviderRequestError, requireOAuthCredential, } from "../provider-runtime.js";
6
6
  const docsApiBaseUrl = "https://docs.googleapis.com/v1";
@@ -1,4 +1,7 @@
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
  export declare const executors: ProviderExecutors;
3
5
  export declare const credentialValidators: CredentialValidators;
4
6
  export declare const proxy: ProviderProxyExecutor;
7
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
@@ -1,12 +1,14 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { requiredRawString, requiredString } from "../../core/cast.js";
3
3
  import { readBoundedResponseBytes } from "../../core/request.js";
4
- import { defineGoogleProviderExecutors, googleBearerProxyAuth, googleServiceAccountValidator } from "../google-auth.js";
5
- import { googleJsonRequest, googleRequest } from "../google-runtime.js";
6
4
  import { defineProviderProxy, providerProxyEndpointPrefixes, ProviderRequestError, providerResponseError, } from "../provider-runtime.js";
5
+ import { defineGoogleProviderExecutors, googleBearerProxyAuth, googleServiceAccountValidator } from "./runtime-auth.js";
7
6
  import { createComment, createPermission, createReply, deleteComment, deletePermission, deleteReply, deleteRevision, getAbout, getApp, getComment, getPermission, getReply, getRevision, listComments, listFileLabels, listPermissions, listReplies, listRevisions, modifyFileLabels, updateComment, updateFileRevisionMetadata, updatePermission, updateReply, } from "./runtime-collaboration.js";
7
+ import { googleJsonRequest, googleRequest } from "./runtime-request.js";
8
8
  import { asObject, asOptionalObject, asOptionalInteger, asStringArray, asStringRecord, compactObject, compactUnknownObject, optionalBoolean, optionalNestedString, optionalString, parseSizeBytes, pickOptionalBoolean, pickOptionalInteger, pickOptionalString, resolveFileId, resolveRequiredString, resolveSupportsAllDrives, } from "./runtime-shared.js";
9
9
  import { googledriveOAuthScopes } from "./scopes.js";
10
+ import { googleDriveChanges, googleDriveChangeListener } from "./trigger-changes.js";
11
+ import { googleDriveFileChange } from "./trigger-on-file-change.js";
10
12
  const service = "googledrive";
11
13
  const driveApiBaseUrl = "https://www.googleapis.com/drive/v3";
12
14
  const driveUploadApiBaseUrl = "https://www.googleapis.com/upload/drive/v3";
@@ -863,3 +865,8 @@ export const proxy = defineProviderProxy({
863
865
  auth: googleBearerProxyAuth(googledriveOAuthScopes),
864
866
  allowedEndpoint: providerProxyEndpointPrefixes("/drive/v3", "/upload/drive/v3"),
865
867
  });
868
+ export const triggers = [
869
+ googleDriveChanges,
870
+ googleDriveChangeListener,
871
+ googleDriveFileChange,
872
+ ];
@@ -1,5 +1,5 @@
1
- import type { CredentialValidators, ProviderExecutors, ResolvedCredential } from "../core/types.ts";
2
- import type { OAuthProviderContext, ProviderFetch, ProviderProxyAuth, ProviderRuntimeHandler } from "./provider-runtime.ts";
1
+ import type { CredentialValidators, ProviderExecutors, ResolvedCredential } from "../../core/types.ts";
2
+ import type { OAuthProviderContext, ProviderFetch, ProviderProxyAuth, ProviderRuntimeHandler } from "../provider-runtime.ts";
3
3
  /**
4
4
  * A Google service account identity read from a stored custom credential.
5
5
  */
@@ -1,7 +1,7 @@
1
1
  import { importPKCS8, SignJWT } from "jose";
2
- import { sha256Hex } from "../core/aws-sigv4.js";
3
- import { optionalNumberLike, optionalRecord, optionalString } from "../core/cast.js";
4
- import { defineProviderExecutors, providerInputError, ProviderRequestError, providerUserAgent, requiredInputString, runProviderRequest, } from "./provider-runtime.js";
2
+ import { sha256Hex } from "../../core/aws-sigv4.js";
3
+ import { optionalNumberLike, optionalRecord, optionalString } from "../../core/cast.js";
4
+ import { defineProviderExecutors, providerInputError, ProviderRequestError, providerUserAgent, requiredInputString, runProviderRequest, } from "../provider-runtime.js";
5
5
  const googleTokenUrl = "https://oauth2.googleapis.com/token";
6
6
  const jwtBearerGrantType = "urn:ietf:params:oauth:grant-type:jwt-bearer";
7
7
  /** Google issues one-hour access tokens for JWT bearer grants; assertions may ask for at most one hour. */
@@ -1,5 +1,5 @@
1
- import { googleJsonRequest, googleRequest } from "../google-runtime.js";
2
1
  import { ProviderRequestError } from "../provider-runtime.js";
2
+ import { googleJsonRequest, googleRequest } from "./runtime-request.js";
3
3
  import { asObject, asOptionalObject, asStringArray, asStringRecordOrUndefined, compactObject, compactUnknownObject, optionalBoolean, optionalString, parseSizeBytes, pickOptionalBoolean, pickOptionalInteger, pickOptionalString, resolveFileId, resolveRequiredString, resolveSupportsAllDrives, } from "./runtime-shared.js";
4
4
  const driveApiBaseUrl = "https://www.googleapis.com/drive/v3";
5
5
  const permissionFields = [
@@ -1,4 +1,4 @@
1
- import type { ProviderFetch } from "./provider-runtime.ts";
1
+ import type { ProviderFetch } from "../provider-runtime.ts";
2
2
  export type GoogleQueryValue = string | readonly string[] | undefined;
3
3
  export interface GoogleRequestOptions {
4
4
  accessToken: string;
@@ -1,5 +1,5 @@
1
- import { optionalRecord, optionalString } from "../core/cast.js";
2
- import { createProviderTimeout, isAbortLikeError, providerUserAgent, ProviderRequestError, } from "./provider-runtime.js";
1
+ import { optionalRecord, optionalString } from "../../core/cast.js";
2
+ import { createProviderTimeout, isAbortLikeError, providerUserAgent, ProviderRequestError, } from "../provider-runtime.js";
3
3
  const defaultService = "googledrive";
4
4
  const googleDefaultRequestTimeoutMs = 30_000;
5
5
  export async function googleJsonRequest(url, input) {
@@ -0,0 +1,12 @@
1
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
2
+ import type { ConnectorProxy } from "../../triggers/common/proxy.ts";
3
+ import type { JsonValue } from "../../triggers/common/types.ts";
4
+ interface ReadContext {
5
+ readonly config: Readonly<Record<string, JsonValue>>;
6
+ readonly connector: ConnectorProxy;
7
+ readonly signal?: AbortSignal;
8
+ }
9
+ export declare const googleDriveChanges: IntegrationDefinition;
10
+ export declare function googleDriveStartPageToken(context: ReadContext): Promise<string>;
11
+ export declare const googleDriveChangeListener: IntegrationDefinition;
12
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const snapshot: TriggerKeySnapshot & {
3
+ readonly type: "integration";
4
+ };
5
+ export declare const additionalSnapshot0: TriggerKeySnapshot & {
6
+ readonly type: "integration";
7
+ };
@@ -0,0 +1,101 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const defaultPageSize = 100;
3
+ export const snapshot = {
4
+ configInputs: [
5
+ {
6
+ handle: "driveId",
7
+ jsonSchema: s.string({ maxLength: 256, minLength: 1 }),
8
+ nullable: true,
9
+ description: "Optional shared drive ID. Omit it to monitor the connected account.",
10
+ },
11
+ {
12
+ handle: "includeCorpusRemovals",
13
+ jsonSchema: s.boolean(),
14
+ nullable: false,
15
+ value: false,
16
+ description: "Include the accessible file resource when an item leaves the change corpus.",
17
+ },
18
+ {
19
+ handle: "includeItemsFromAllDrives",
20
+ jsonSchema: s.boolean(),
21
+ nullable: false,
22
+ value: true,
23
+ description: "Include items from My Drive and shared drives.",
24
+ },
25
+ {
26
+ handle: "includeRemoved",
27
+ jsonSchema: s.boolean(),
28
+ nullable: false,
29
+ value: true,
30
+ description: "Include changes caused by deletion or loss of access.",
31
+ },
32
+ {
33
+ handle: "pageSize",
34
+ jsonSchema: s.integer({ maximum: 100, minimum: 1 }),
35
+ nullable: false,
36
+ value: defaultPageSize,
37
+ description: "Maximum changes included in one Flow Run.",
38
+ },
39
+ {
40
+ handle: "restrictToMyDrive",
41
+ jsonSchema: s.boolean(),
42
+ nullable: false,
43
+ value: false,
44
+ description: "Restrict changes to the My Drive hierarchy.",
45
+ },
46
+ ],
47
+ definitionVersion: 2,
48
+ description: "Uses a Google Drive changes.watch channel and triggers when Drive changes are available.",
49
+ displayName: "Changes Detected",
50
+ endpoint: {
51
+ body: { allowArray: false, allowEmpty: true, formats: ["json"] },
52
+ methods: ["POST"],
53
+ successStatus: 204,
54
+ },
55
+ key: "googledrive.changes_detected",
56
+ name: "changes_detected",
57
+ outputs: [
58
+ {
59
+ handle: "events",
60
+ jsonSchema: s.array(s.object({
61
+ changeId: s.string(),
62
+ changeType: { type: ["string", "null"] },
63
+ driveId: { type: ["string", "null"] },
64
+ file: { type: ["object", "null"] },
65
+ fileId: { type: ["string", "null"] },
66
+ notification: s.object({
67
+ changedTypes: s.array(s.string()),
68
+ messageNumber: { type: ["string", "null"] },
69
+ resourceState: s.string(),
70
+ resourceUri: { type: ["string", "null"] },
71
+ }, {
72
+ additionalProperties: false,
73
+ required: ["resourceState", "changedTypes", "messageNumber", "resourceUri"],
74
+ }),
75
+ removed: s.boolean(),
76
+ time: { type: ["string", "null"] },
77
+ }, {
78
+ additionalProperties: false,
79
+ required: ["changeId", "changeType", "removed", "time", "fileId", "driveId", "file", "notification"],
80
+ })),
81
+ nullable: false,
82
+ },
83
+ ],
84
+ provider: "googledrive",
85
+ type: "integration",
86
+ };
87
+ export const additionalSnapshot0 = {
88
+ ...snapshot,
89
+ configInputs: snapshot.configInputs,
90
+ key: "googledrive.watch_changes",
91
+ name: "watch_changes",
92
+ displayName: "Watch Changes",
93
+ description: "Monitors Drive changes using notifications and periodic scans of the same change stream.",
94
+ outputs: [
95
+ {
96
+ handle: "events",
97
+ jsonSchema: s.array({ type: "object" }),
98
+ nullable: false,
99
+ },
100
+ ],
101
+ };