@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,207 @@
1
+ import { looseArray, optionalRecord, optionalString } from "../../core/cast.js";
2
+ import { encodePathSegment } from "../../core/request.js";
3
+ import { providerInputError, providerUserAgent, ProviderRequestError, readProviderJsonBody, runProviderRequest, } from "../provider-runtime.js";
4
+ /** Legacy Central base URL; requests authenticate with `Authorization: token <key>`. */
5
+ export const zerotierV1BaseUrl = "https://api.zerotier.com/api/v1";
6
+ /** New Central base URL; requests authenticate with `Authorization: Bearer <key>`. */
7
+ export const zerotierV2BaseUrl = "https://central.zerotier.com/api/v2";
8
+ const zerotierV2BetaBaseUrl = "https://central.zerotier.com/api/v2beta";
9
+ export function parseZerotierApiVersion(value) {
10
+ const version = optionalString(value)?.toLowerCase();
11
+ if (version === "v1" || version === "v2") {
12
+ return version;
13
+ }
14
+ throw providerInputError('zerotier apiVersion must be "v1" (Legacy Central) or "v2" (New Central).');
15
+ }
16
+ export function createZerotierContext(values, fetcher, signal) {
17
+ const apiVersion = parseZerotierApiVersion(values.apiVersion);
18
+ const apiKey = optionalString(values.apiKey);
19
+ if (!apiKey) {
20
+ throw providerInputError("zerotier apiKey is required.");
21
+ }
22
+ return {
23
+ apiVersion,
24
+ apiKey,
25
+ orgId: optionalString(values.orgId),
26
+ fetcher,
27
+ signal,
28
+ };
29
+ }
30
+ /**
31
+ * Encode one ID as a single path segment. encodeURIComponent leaves "." and
32
+ * ".." intact and new URL() collapses them, so memberId ".." would turn
33
+ * delete_member into DELETE /network/{id}; reject dot segments and separators.
34
+ */
35
+ export function zerotierPathSegment(value, field) {
36
+ if (value === "." || value === ".." || value.includes("/") || value.includes("\\")) {
37
+ throw providerInputError(`${field} must be a single path segment.`);
38
+ }
39
+ return encodePathSegment(value);
40
+ }
41
+ export function zerotierAuthorizationHeader(credential) {
42
+ return credential.apiVersion === "v2" ? `Bearer ${credential.apiKey}` : `token ${credential.apiKey}`;
43
+ }
44
+ function zerotierBaseUrl(context, beta) {
45
+ if (context.apiVersion === "v1") {
46
+ if (beta) {
47
+ throw providerInputError("ZeroTier beta endpoints are only available on the v2 (New Central) API.");
48
+ }
49
+ return zerotierV1BaseUrl;
50
+ }
51
+ return beta ? zerotierV2BetaBaseUrl : zerotierV2BaseUrl;
52
+ }
53
+ /** Run one ZeroTier Central API request and return the parsed JSON payload, or null for empty bodies. */
54
+ export async function zerotierRequest(context, options) {
55
+ return runProviderRequest({ signal: context.signal, label: "ZeroTier" }, async (signal) => {
56
+ const url = new URL(zerotierBaseUrl(context, options.beta) + options.path);
57
+ if (options.query) {
58
+ for (const [key, value] of Object.entries(options.query)) {
59
+ if (value === undefined)
60
+ continue;
61
+ if (Array.isArray(value)) {
62
+ for (const item of value) {
63
+ url.searchParams.append(key, item);
64
+ }
65
+ }
66
+ else {
67
+ url.searchParams.set(key, value);
68
+ }
69
+ }
70
+ }
71
+ const response = await context.fetcher(url, {
72
+ method: options.method ?? "GET",
73
+ headers: {
74
+ accept: "application/json",
75
+ authorization: zerotierAuthorizationHeader(context),
76
+ "content-type": "application/json",
77
+ "user-agent": providerUserAgent,
78
+ },
79
+ body: options.body === undefined ? undefined : JSON.stringify(options.body),
80
+ signal,
81
+ });
82
+ const payload = await readProviderJsonBody(response, {
83
+ emptyBody: null,
84
+ invalidJsonMessage: "ZeroTier returned invalid JSON",
85
+ // A non-JSON error body (such as a proxy's HTML page) keeps the upstream
86
+ // status instead of becoming a 502 parse failure; only its start is kept.
87
+ invalidJsonFallback: response.ok ? undefined : (text) => ({ message: text.trim().slice(0, 500) }),
88
+ });
89
+ if (!response.ok) {
90
+ const record = optionalRecord(payload);
91
+ const summary = optionalString(record?.message) ?? `ZeroTier request failed with status ${response.status}`;
92
+ // v2 validation failures list the offending fields under details[{field, message}].
93
+ const details = looseArray(record?.details).flatMap((item) => {
94
+ const detail = optionalRecord(item);
95
+ const field = optionalString(detail?.field);
96
+ const reason = optionalString(detail?.message);
97
+ return reason ? [field ? `${field}: ${reason}` : reason] : [];
98
+ });
99
+ const message = details.length > 0 ? `${summary}: ${details.join("; ")}` : summary;
100
+ throw new ProviderRequestError(response.status, message);
101
+ }
102
+ return payload;
103
+ });
104
+ }
105
+ /** Require a specific ZeroTier API version on the connection. */
106
+ export function requireZerotierApiVersion(context, version) {
107
+ if (context.apiVersion !== version) {
108
+ throw providerInputError(`This action requires a ${version} ZeroTier connection; the connection is configured for ${context.apiVersion}.`);
109
+ }
110
+ }
111
+ /**
112
+ * Wrap a ZeroTier array response into the action list envelope. v2 list
113
+ * endpoints answer `{ items, stats? }`; the aggregate `stats` requested with
114
+ * `stats=true` is kept next to the items.
115
+ */
116
+ export function zerotierList(payload) {
117
+ if (payload === null || payload === undefined) {
118
+ return { items: [] };
119
+ }
120
+ if (Array.isArray(payload)) {
121
+ return { items: payload };
122
+ }
123
+ const record = optionalRecord(payload);
124
+ if (record && Array.isArray(record.items)) {
125
+ return { items: record.items, stats: record.stats };
126
+ }
127
+ return { items: [payload] };
128
+ }
129
+ /** Wrap a ZeroTier object response into the action single-resource envelope. */
130
+ export function zerotierResult(payload) {
131
+ return { result: payload };
132
+ }
133
+ /** Wrap a mutating ZeroTier response that may have an empty body. */
134
+ export function zerotierStatus(payload) {
135
+ return { ok: true, result: payload };
136
+ }
137
+ /** Organization ID from the action input, falling back to the connection's orgId field. */
138
+ export function zerotierOrgId(context, input) {
139
+ return optionalString(input.orgId) ?? context.orgId;
140
+ }
141
+ const v1ValidationEndpoint = "/status";
142
+ const v2ValidationEndpoint = "/org";
143
+ /**
144
+ * Legacy Central reports the token's user under `user` on GET /status. The
145
+ * status document itself is not an authorization check, so a response without
146
+ * a user means the token did not authenticate.
147
+ */
148
+ function readV1Account(payload) {
149
+ const user = optionalRecord(optionalRecord(payload)?.user);
150
+ const accountId = optionalString(user?.id);
151
+ if (!accountId) {
152
+ throw new ProviderRequestError(401, "ZeroTier did not return a user for this API token.");
153
+ }
154
+ return {
155
+ accountId,
156
+ displayName: optionalString(user?.displayName) ?? optionalString(user?.email) ?? "ZeroTier Central v1",
157
+ };
158
+ }
159
+ /**
160
+ * New Central GET /org lists the organizations the service account can reach.
161
+ * A service account belongs to one organization, which identifies the account.
162
+ * A configured orgId must name an organization the key can reach, because the
163
+ * list actions and get_org keep using it; one missing from the list is looked
164
+ * up directly so the upstream 403/404 rejects a mistyped id. Without an orgId,
165
+ * a single listed organization identifies the account, otherwise the runtime
166
+ * default account id applies.
167
+ */
168
+ async function readV2Account(context, payload) {
169
+ const orgs = looseArray(optionalRecord(payload)?.items).map((item) => optionalRecord(item));
170
+ const orgId = context.orgId;
171
+ if (!orgId) {
172
+ const onlyOrg = orgs.length === 1 ? orgs[0] : undefined;
173
+ return {
174
+ accountId: optionalString(onlyOrg?.id),
175
+ displayName: optionalString(onlyOrg?.name) ?? "ZeroTier New Central v2",
176
+ };
177
+ }
178
+ const org = orgs.find((item) => optionalString(item?.id) === orgId) ??
179
+ optionalRecord(await zerotierRequest(context, { path: `/org/${zerotierPathSegment(orgId, "orgId")}` }));
180
+ return {
181
+ accountId: optionalString(org?.id) ?? orgId,
182
+ displayName: optionalString(org?.name) ?? "ZeroTier New Central v2",
183
+ };
184
+ }
185
+ /**
186
+ * Verify a ZeroTier credential against the API generation it selects: v1 calls
187
+ * GET /status on Legacy Central, v2 calls GET /org on New Central (plus
188
+ * GET /org/{orgId} when the configured orgId is not in that list).
189
+ */
190
+ export async function validateZerotierCredential(values, fetcher, signal) {
191
+ const context = createZerotierContext(values, fetcher, signal);
192
+ const path = context.apiVersion === "v1" ? v1ValidationEndpoint : v2ValidationEndpoint;
193
+ const payload = await zerotierRequest(context, { path });
194
+ const account = context.apiVersion === "v1" ? readV1Account(payload) : await readV2Account(context, payload);
195
+ return {
196
+ profile: {
197
+ accountId: account.accountId,
198
+ displayName: account.displayName,
199
+ },
200
+ grantedScopes: [],
201
+ metadata: {
202
+ apiVersion: context.apiVersion,
203
+ apiBaseUrl: context.apiVersion === "v1" ? zerotierV1BaseUrl : zerotierV2BaseUrl,
204
+ validationEndpoint: path,
205
+ },
206
+ };
207
+ }
@@ -0,0 +1,26 @@
1
+ import type { RuntimeLogger } from "../core/types.ts";
2
+ import type { ConnectionRequestStore } from "../server/storage/connection-request-store.ts";
3
+ import type { SaasProjectStore } from "../server/storage/saas-project-store.ts";
4
+ import { SaasClient } from "./saas-client.ts";
5
+ export interface SaasCleanupServiceOptions {
6
+ store: SaasProjectStore;
7
+ requests: ConnectionRequestStore;
8
+ client?: SaasClient;
9
+ logger?: RuntimeLogger;
10
+ }
11
+ /** Resumable deletion of ordinary SaaS accounts; never creates or reconnects an account. */
12
+ export declare class SaasCleanupService {
13
+ private readonly options;
14
+ private readonly client;
15
+ private readonly shutdown;
16
+ private pending?;
17
+ private timer?;
18
+ private started;
19
+ constructor(options: SaasCleanupServiceOptions);
20
+ run(): Promise<void>;
21
+ /** Node owns this timer; Workers invoke run from their scheduled entry point instead. */
22
+ start(): void;
23
+ close(): Promise<void>;
24
+ private runBatch;
25
+ private nextAttempt;
26
+ }
@@ -0,0 +1,124 @@
1
+ import { SaasClient, SaasError } from "./saas-client.js";
2
+ /** Resumable deletion of ordinary SaaS accounts; never creates or reconnects an account. */
3
+ export class SaasCleanupService {
4
+ options;
5
+ client;
6
+ shutdown = new AbortController();
7
+ pending;
8
+ timer;
9
+ started = false;
10
+ constructor(options) {
11
+ this.options = options;
12
+ this.client = options.client ?? new SaasClient();
13
+ }
14
+ run() {
15
+ if (this.shutdown.signal.aborted)
16
+ return Promise.resolve();
17
+ this.pending ??= this.runBatch()
18
+ .catch(() => {
19
+ this.options.logger?.warn({ errorCode: "saas_cleanup_failed" }, "SaaS cleanup batch failed; pending work is retained");
20
+ })
21
+ .finally(() => {
22
+ this.pending = undefined;
23
+ });
24
+ return this.pending;
25
+ }
26
+ /** Node owns this timer; Workers invoke run from their scheduled entry point instead. */
27
+ start() {
28
+ if (this.started || this.shutdown.signal.aborted)
29
+ return;
30
+ this.started = true;
31
+ const tick = () => {
32
+ void this.run().finally(() => {
33
+ if (this.shutdown.signal.aborted)
34
+ return;
35
+ this.timer = setTimeout(tick, 60_000);
36
+ this.timer.unref?.();
37
+ });
38
+ };
39
+ tick();
40
+ }
41
+ async close() {
42
+ this.shutdown.abort();
43
+ clearTimeout(this.timer);
44
+ await this.pending;
45
+ }
46
+ async runBatch() {
47
+ await this.options.requests.expireSaas();
48
+ const deadline = Date.now() + 50_000;
49
+ for (let count = 0; count < 10 && Date.now() < deadline && !this.shutdown.signal.aborted; count++) {
50
+ const project = await this.options.store.getProject();
51
+ if (!project)
52
+ return;
53
+ const task = await this.options.store.claimCleanup(Date.now());
54
+ if (!task)
55
+ return;
56
+ const signal = AbortSignal.any([
57
+ this.shutdown.signal,
58
+ AbortSignal.timeout(Math.max(1, Math.min(30_000, deadline - Date.now()))),
59
+ ]);
60
+ try {
61
+ if (project.id !== task.managedProjectId)
62
+ throw new SaasError("oauth_source_mismatch", "Cleanup project identity does not match.", 409);
63
+ let accountId = task.connectedAccountId;
64
+ if (!accountId) {
65
+ if (!task.remoteRequestId) {
66
+ await this.options.store.retryCleanup(task, Date.now(), "oauth_source_result_unknown", true);
67
+ continue;
68
+ }
69
+ const result = await this.client.getRequest(project, task.remoteRequestId, signal);
70
+ if (result.providerConfigId !== task.providerConfigId ||
71
+ result.externalUserId !== task.externalUserId ||
72
+ result.service !== task.service ||
73
+ result.alias !== `connect-${task.id.slice("request:".length)}`)
74
+ throw new SaasError("oauth_source_mismatch", "Cleanup request identity does not match.", 409);
75
+ if (result.status === "initiated") {
76
+ const expired = Date.now() >= Date.parse(task.requestExpiresAt ?? result.expiresAt) + 86_400_000;
77
+ await this.options.store.retryCleanup(task, Date.now() + 60_000, expired ? "oauth_source_result_unknown" : "authorization_pending", expired);
78
+ continue;
79
+ }
80
+ if (result.status !== "connected") {
81
+ await this.options.store.finishCleanup(task);
82
+ continue;
83
+ }
84
+ accountId = result.connectedAccountId;
85
+ if (!(await this.options.store.saveCleanupAccount(task, accountId)))
86
+ continue;
87
+ task.connectedAccountId = accountId;
88
+ }
89
+ signal.throwIfAborted();
90
+ await this.client.deleteAccount(project, {
91
+ providerConfigId: task.providerConfigId,
92
+ externalUserId: task.externalUserId,
93
+ connectedAccountId: accountId,
94
+ }, signal);
95
+ await this.options.store.finishCleanup(task);
96
+ }
97
+ catch (error) {
98
+ const code = error instanceof SaasError ? error.code : "saas_cleanup_failed";
99
+ if (code === "oauth_source_unauthorized")
100
+ await this.options.store.pauseCleanup(task, project.apiKey);
101
+ const manual = code === "oauth_source_mismatch" ||
102
+ code === "oauth_source_protocol_error" ||
103
+ (code === "oauth_source_not_found" && !task.connectedAccountId);
104
+ await this.options.store.retryCleanup(task, this.nextAttempt(task, error), code === "oauth_source_not_found" && !task.connectedAccountId ? "oauth_source_result_unknown" : code, manual);
105
+ if (!this.shutdown.signal.aborted)
106
+ this.options.logger?.warn({ taskId: task.id, errorCode: code, manual }, code === "oauth_source_unauthorized"
107
+ ? "SaaS cleanup paused; update the project key to resume"
108
+ : "SaaS cleanup deferred");
109
+ if (code === "oauth_source_unauthorized" || this.shutdown.signal.aborted)
110
+ return;
111
+ }
112
+ }
113
+ }
114
+ nextAttempt(task, error) {
115
+ let delay = Math.min(300_000, 60_000 * 2 ** Math.min(task.attempts, 3));
116
+ if (error instanceof SaasError && error.retryAfter) {
117
+ const seconds = Number(error.retryAfter);
118
+ const until = Number.isFinite(seconds) ? Date.now() + seconds * 1_000 : Date.parse(error.retryAfter);
119
+ if (Number.isFinite(until))
120
+ delay = Math.max(delay, until - Date.now());
121
+ }
122
+ return Date.now() + delay;
123
+ }
124
+ }
@@ -0,0 +1,86 @@
1
+ import type { ProxyRequestInput, ProxyResponse } from "../core/types.ts";
2
+ import type { ManagedProject } from "../server/storage/saas-project-store.ts";
3
+ export interface SaasProviderConfig {
4
+ id: string;
5
+ service: string;
6
+ displayName: string;
7
+ callbackUrl: string;
8
+ effectiveScopes: string[];
9
+ actionIds: string[];
10
+ proxyAvailable: boolean;
11
+ }
12
+ export interface SaasDiscovery {
13
+ projectId: string;
14
+ providerConfigs: SaasProviderConfig[];
15
+ }
16
+ export interface SaasAccount extends SaasAccountSelector {
17
+ projectId: string;
18
+ service: string;
19
+ alias: string | null;
20
+ status: "active" | "reauth_required" | "error" | "disconnected";
21
+ providerAccountId: string | null;
22
+ accountLabel: string | null;
23
+ scopes: string[];
24
+ }
25
+ export interface SaasConnectionRequest {
26
+ id: string;
27
+ status: "initiated" | "connected" | "failed" | "expired";
28
+ projectId: string;
29
+ providerConfigId: string;
30
+ externalUserId: string;
31
+ service: string;
32
+ alias: string | null;
33
+ authorizationUrl: string;
34
+ connectedAccountId: string | null;
35
+ errorCode: string | null;
36
+ errorMessage: string | null;
37
+ expiresAt: string;
38
+ createdAt: number;
39
+ updatedAt: number;
40
+ }
41
+ export declare class SaasError extends Error {
42
+ readonly code: string;
43
+ readonly status: 400 | 402 | 403 | 404 | 409 | 413 | 429 | 500 | 501 | 502 | 503 | 504;
44
+ readonly retryAfter?: string;
45
+ readonly reason?: string;
46
+ connectionRequestId?: string;
47
+ remoteExecutionId?: string;
48
+ constructor(code: string, message: string, status?: SaasError["status"], retryAfter?: string, reason?: string);
49
+ }
50
+ export interface SaasAccountSelector {
51
+ providerConfigId: string;
52
+ externalUserId: string;
53
+ connectedAccountId: string;
54
+ }
55
+ export interface SaasLinkInput {
56
+ providerConfigId: string;
57
+ externalUserId: string;
58
+ alias: string;
59
+ returnUri: string;
60
+ }
61
+ export interface SaasActionResult {
62
+ executionId: string;
63
+ actionId: string;
64
+ output: unknown;
65
+ }
66
+ export interface SaasProxyResult {
67
+ executionId: string;
68
+ response: ProxyResponse;
69
+ }
70
+ /** Reject values that the project proxy protocol cannot represent before any remote request. */
71
+ export declare function parseSaasProxyRequest(input: unknown): Promise<ProxyRequestInput>;
72
+ /** The project API never supplies credentials to the local provider runtime. */
73
+ export declare class SaasClient {
74
+ private readonly fetcher?;
75
+ constructor(fetcher?: typeof fetch);
76
+ discover(project: Pick<ManagedProject, "baseUrl" | "apiKey">, signal?: AbortSignal): Promise<SaasDiscovery>;
77
+ getAccount(project: ManagedProject, selector: SaasAccountSelector, service: string, signal?: AbortSignal): Promise<SaasAccount>;
78
+ getRequest(project: ManagedProject, id: string, signal?: AbortSignal): Promise<SaasConnectionRequest>;
79
+ createLink(project: ManagedProject, input: SaasLinkInput, signal?: AbortSignal): Promise<SaasConnectionRequest>;
80
+ deleteAccount(project: ManagedProject, selector: SaasAccountSelector, signal?: AbortSignal): Promise<void>;
81
+ executeAction(project: ManagedProject, selector: SaasAccountSelector, actionId: string, input: unknown, signal?: AbortSignal): Promise<SaasActionResult>;
82
+ executeProxy(project: ManagedProject, selector: SaasAccountSelector, service: string, request: ProxyRequestInput, signal?: AbortSignal): Promise<SaasProxyResult>;
83
+ private request;
84
+ private requestEnvelope;
85
+ }
86
+ export declare function normalizeSaasBaseUrl(value: string): string;