@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,55 @@
1
+ create table instance_identity (
2
+ id integer primary key check (id = 1),
3
+ instance_id text not null unique
4
+ );
5
+ create table managed_project (
6
+ id integer primary key check (id = 1),
7
+ managed_project_id text not null unique,
8
+ project_id text not null,
9
+ base_url text not null,
10
+ value text not null
11
+ );
12
+ create table oauth_sources (
13
+ service text primary key,
14
+ managed_project_id text not null,
15
+ provider_config_id text not null
16
+ );
17
+ alter table connections add column source text not null default 'local' check (source in ('local', 'saas'));
18
+ alter table connections add column managed_project_id text;
19
+ alter table connections add column provider_config_id text;
20
+ alter table connections add column external_user_id text;
21
+ alter table connections add column remote_account_id text;
22
+ alter table connections add column local_request_id text;
23
+ alter table connection_requests add column kind text not null default 'local' check (kind in ('local', 'saas'));
24
+ alter table connection_requests add column managed_project_id text check (kind = 'local' or managed_project_id is not null);
25
+ alter table connection_requests add column provider_config_id text;
26
+ alter table connection_requests add column external_user_id text;
27
+ alter table connection_requests add column remote_request_id text;
28
+ alter table connection_requests add column remote_account_id text;
29
+ alter table connection_requests add column lease_id text;
30
+ alter table connection_requests add column lease_until bigint;
31
+ alter table connection_requests add column next_poll_at bigint not null default 0;
32
+ create table saas_cleanup (
33
+ id text primary key,
34
+ managed_project_id text not null,
35
+ provider_config_id text not null,
36
+ external_user_id text not null,
37
+ remote_request_id text,
38
+ remote_account_id text,
39
+ status text not null default 'pending' check (status in ('pending', 'manual')),
40
+ attempts integer not null default 0,
41
+ next_attempt_at bigint not null default 0,
42
+ lease_id text,
43
+ lease_until bigint,
44
+ created_at bigint not null,
45
+ error_code text
46
+ );
47
+ create index saas_cleanup_due on saas_cleanup (status, next_attempt_at, lease_until);
48
+ create index connections_managed_project on connections (managed_project_id);
49
+ create index connection_requests_managed_project on connection_requests (managed_project_id);
50
+
51
+ alter table connection_requests add column saas_phase text check (saas_phase in ('creating', 'pending', 'candidate'));
52
+ alter table connection_requests add column candidate_value text;
53
+
54
+ alter table connection_requests add column return_uri text;
55
+ alter table connection_requests add column poll_attempts integer not null default 0;
@@ -0,0 +1,8 @@
1
+ alter table managed_project add column cleanup_paused integer not null default 0;
2
+ alter table saas_cleanup add column service text;
3
+ alter table saas_cleanup add column request_expires_at text;
4
+
5
+ update saas_cleanup set
6
+ service = (select service from connection_requests where 'request:' || id = saas_cleanup.id),
7
+ request_expires_at = (select expires_at from connection_requests where 'request:' || id = saas_cleanup.id)
8
+ where remote_request_id is not null;
@@ -0,0 +1 @@
1
+ alter table runtime_tokens add column allowed_triggers text not null default '[]';
@@ -0,0 +1,17 @@
1
+ create table trigger_subscriptions (
2
+ id text primary key,
3
+ mode text not null,
4
+ token_id text not null,
5
+ connection_id text not null,
6
+ trigger_id text not null,
7
+ status text not null,
8
+ reconcile_at bigint not null,
9
+ maintenance_at bigint not null default 0,
10
+ lease_owner text,
11
+ lease_until bigint,
12
+ value text not null
13
+ );
14
+ create index trigger_subscriptions_connection on trigger_subscriptions (connection_id, status);
15
+ create index trigger_subscriptions_maintenance on trigger_subscriptions (status, maintenance_at);
16
+
17
+ alter table connections add column provider_account_id text;
@@ -0,0 +1,55 @@
1
+ create table instance_identity (
2
+ id integer primary key check (id = 1),
3
+ instance_id text not null unique
4
+ );
5
+ create table managed_project (
6
+ id integer primary key check (id = 1),
7
+ managed_project_id text not null unique,
8
+ project_id text not null,
9
+ base_url text not null,
10
+ value text not null
11
+ );
12
+ create table oauth_sources (
13
+ service text primary key,
14
+ managed_project_id text not null,
15
+ provider_config_id text not null
16
+ );
17
+ alter table connections add column source text not null default 'local' check (source in ('local', 'saas'));
18
+ alter table connections add column managed_project_id text;
19
+ alter table connections add column provider_config_id text;
20
+ alter table connections add column external_user_id text;
21
+ alter table connections add column remote_account_id text;
22
+ alter table connections add column local_request_id text;
23
+ alter table connection_requests add column kind text not null default 'local' check (kind in ('local', 'saas'));
24
+ alter table connection_requests add column managed_project_id text check (kind = 'local' or managed_project_id is not null);
25
+ alter table connection_requests add column provider_config_id text;
26
+ alter table connection_requests add column external_user_id text;
27
+ alter table connection_requests add column remote_request_id text;
28
+ alter table connection_requests add column remote_account_id text;
29
+ alter table connection_requests add column lease_id text;
30
+ alter table connection_requests add column lease_until bigint;
31
+ alter table connection_requests add column next_poll_at bigint not null default 0;
32
+ create table saas_cleanup (
33
+ id text primary key,
34
+ managed_project_id text not null,
35
+ provider_config_id text not null,
36
+ external_user_id text not null,
37
+ remote_request_id text,
38
+ remote_account_id text,
39
+ status text not null default 'pending' check (status in ('pending', 'manual')),
40
+ attempts integer not null default 0,
41
+ next_attempt_at bigint not null default 0,
42
+ lease_id text,
43
+ lease_until bigint,
44
+ created_at bigint not null,
45
+ error_code text
46
+ );
47
+ create index saas_cleanup_due on saas_cleanup (status, next_attempt_at, lease_until);
48
+ create index connections_managed_project on connections (managed_project_id);
49
+ create index connection_requests_managed_project on connection_requests (managed_project_id);
50
+
51
+ alter table connection_requests add column saas_phase text check (saas_phase in ('creating', 'pending', 'candidate'));
52
+ alter table connection_requests add column candidate_value text;
53
+
54
+ alter table connection_requests add column return_uri text;
55
+ alter table connection_requests add column poll_attempts integer not null default 0;
@@ -0,0 +1,8 @@
1
+ alter table managed_project add column cleanup_paused integer not null default 0;
2
+ alter table saas_cleanup add column service text;
3
+ alter table saas_cleanup add column request_expires_at text;
4
+
5
+ update saas_cleanup set
6
+ service = (select service from connection_requests where 'request:' || id = saas_cleanup.id),
7
+ request_expires_at = (select expires_at from connection_requests where 'request:' || id = saas_cleanup.id)
8
+ where remote_request_id is not null;
@@ -0,0 +1 @@
1
+ alter table runtime_tokens add column allowed_triggers text not null default '[]';
@@ -0,0 +1,17 @@
1
+ create table trigger_subscriptions (
2
+ id text primary key,
3
+ mode text not null,
4
+ token_id text not null,
5
+ connection_id text not null,
6
+ trigger_id text not null,
7
+ status text not null,
8
+ reconcile_at bigint not null,
9
+ maintenance_at bigint not null default 0,
10
+ lease_owner text,
11
+ lease_until bigint,
12
+ value text not null
13
+ );
14
+ create index trigger_subscriptions_connection on trigger_subscriptions (connection_id, status);
15
+ create index trigger_subscriptions_maintenance on trigger_subscriptions (status, maintenance_at);
16
+
17
+ alter table connections add column provider_account_id text;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oomol-lab/open-connector",
3
- "version": "1.6.5",
3
+ "version": "1.8.0",
4
4
  "description": "Embeddable Open Connector runtime for Node.js and Bun.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -41,7 +41,7 @@
41
41
  "pino": "^10.3.1",
42
42
  "rss-parser": "^3.13.0",
43
43
  "yaml": "^2.9.0",
44
- "zod": "^4.4.3"
44
+ "zod": "^4.6.5"
45
45
  },
46
46
  "engines": {
47
47
  "node": ">=22.18.0"
@@ -22,6 +22,7 @@ export interface ConnectionSummary {
22
22
  id: string;
23
23
  pricing: MarketplacePricing;
24
24
  };
25
+ saas?: StoredSaasConnection["reference"];
25
26
  }
26
27
  export interface ManagedConnectionSummary extends ConnectionSummary {
27
28
  status: "active" | "reauth_required";
@@ -46,7 +47,28 @@ export interface ConnectionServiceOptions {
46
47
  logger?: RuntimeLogger;
47
48
  marketplace?: MarketplaceService;
48
49
  }
49
- export interface StoredConnection {
50
+ export interface SaasConnectionReference {
51
+ managedProjectId: string;
52
+ providerConfigId: string;
53
+ externalUserId: string;
54
+ connectedAccountId: string;
55
+ localRequestId: string;
56
+ }
57
+ export interface StoredSaasConnection {
58
+ source: "saas";
59
+ credential?: never;
60
+ id: string;
61
+ revision: string;
62
+ service: string;
63
+ connectionName: string;
64
+ reference: SaasConnectionReference;
65
+ profile: CredentialProfile;
66
+ status: "active" | "reauth_required";
67
+ comment: string | null;
68
+ }
69
+ export type StoredConnection = StoredLocalConnection | StoredSaasConnection;
70
+ export interface StoredLocalConnection {
71
+ source?: "local";
50
72
  id: string;
51
73
  revision: string;
52
74
  service: string;
@@ -58,18 +80,28 @@ export interface DisconnectedConnectionSummary {
58
80
  connectionName: string;
59
81
  configured: false;
60
82
  }
61
- export interface ExecutionConnection {
83
+ export type ExecutionConnection = LocalExecutionConnection | MarketplaceExecutionConnection | SaasExecutionConnection;
84
+ interface LocalExecutionConnection {
85
+ kind: "local";
62
86
  summary?: ConnectionSummary;
63
- marketplace?: boolean;
64
87
  getCredential(service: string): Promise<ResolvedCredential | undefined>;
65
88
  }
89
+ interface MarketplaceExecutionConnection {
90
+ kind: "marketplace";
91
+ summary: ConnectionSummary;
92
+ }
93
+ interface SaasExecutionConnection {
94
+ kind: "saas";
95
+ summary: ManagedConnectionSummary;
96
+ reference: SaasConnectionReference;
97
+ }
66
98
  /**
67
99
  * Storage contract for local provider connections.
68
100
  */
69
101
  export interface IConnectionStore {
70
102
  get(service: string, connectionName: string): Promise<StoredConnection | undefined>;
71
- set(service: string, connectionName: string, credential: ResolvedCredential): Promise<StoredConnection>;
72
- updateCredential(input: StoredConnection): Promise<boolean>;
103
+ set(service: string, connectionName: string, credential: ResolvedCredential): Promise<StoredLocalConnection>;
104
+ updateCredential(input: StoredLocalConnection, refresh?: boolean): Promise<boolean>;
73
105
  delete(service: string, connectionName: string): Promise<void>;
74
106
  list(): Promise<StoredConnection[]>;
75
107
  }
@@ -102,8 +134,8 @@ export declare class ConnectionService {
102
134
  /** Read which providers the operator enabled in the Marketplace, keyed by service id. */
103
135
  private loadProviderPreferences;
104
136
  listAuthenticatedServices(services: string[]): Promise<string[]>;
105
- getConnectionSummary(service: string, connectionName?: string): Promise<ConnectionSummary | undefined>;
106
- resolveForExecution(service: string, connectionName?: string): Promise<ExecutionConnection>;
137
+ getConnectionSummary(service: string, connectionName?: string, connectionId?: string): Promise<ConnectionSummary | undefined>;
138
+ resolveForExecution(service: string, connectionName?: string, connectionId?: string): Promise<ExecutionConnection>;
107
139
  getCredential(service: string, connectionName?: string): Promise<ResolvedCredential | undefined>;
108
140
  /**
109
141
  * Return a per-request credential scope for one connection name.
@@ -122,6 +154,7 @@ export declare class ConnectionService {
122
154
  authType: "oauth2";
123
155
  }>, connectionNameInput?: string, signal?: AbortSignal): Promise<ConnectionSummary>;
124
156
  prepareOAuthCredential(service: string, credential: OAuthCredential, signal?: AbortSignal): Promise<OAuthCredential>;
157
+ private selectStoredConnection;
125
158
  getStoredConnection(id: string): Promise<StoredConnection>;
126
159
  listManagedConnections(): Promise<ManagedConnectionSummary[]>;
127
160
  getManagedConnection(id: string): Promise<ManagedConnectionSummary>;
@@ -30,11 +30,7 @@ export class ConnectionService {
30
30
  const configuredByService = new Map();
31
31
  for (const connection of configured) {
32
32
  const serviceConnections = configuredByService.get(connection.service) ?? [];
33
- serviceConnections.push({
34
- id: connection.id,
35
- connectionName: connection.connectionName,
36
- credential: connection.credential,
37
- });
33
+ serviceConnections.push(connection);
38
34
  configuredByService.set(connection.service, serviceConnections);
39
35
  }
40
36
  const preferences = await this.loadProviderPreferences();
@@ -52,7 +48,9 @@ export class ConnectionService {
52
48
  */
53
49
  summarizeProviderConnections(provider, connections, preferences) {
54
50
  if (connections.length > 0) {
55
- const stored = connections.map((connection) => this.createConfiguredConnectionSummary(provider, connection.id, connection.connectionName, connection.credential));
51
+ const stored = connections.map((connection) => connection.source === "saas"
52
+ ? this.createManagedConnectionSummary(connection)
53
+ : this.createConfiguredConnectionSummary(provider, connection.id, connection.connectionName, connection.credential));
56
54
  const marketplace = this.createMarketplaceConnectionSummary(provider, preferences);
57
55
  return marketplace ? [...stored, marketplace] : stored;
58
56
  }
@@ -71,7 +69,7 @@ export class ConnectionService {
71
69
  async listAuthenticatedServices(services) {
72
70
  const configured = await this.store.list();
73
71
  const authenticated = new Set(configured
74
- .filter((connection) => connection.credential.authType !== "no_auth")
72
+ .filter((connection) => connection.source === "saas" || connection.credential.authType !== "no_auth")
75
73
  .map((connection) => connection.service));
76
74
  const preferences = await this.loadProviderPreferences();
77
75
  for (const service of this.marketplace?.getSnapshot()?.actionsByService.keys() ?? []) {
@@ -80,32 +78,40 @@ export class ConnectionService {
80
78
  }
81
79
  return services.filter((service) => authenticated.has(service));
82
80
  }
83
- async getConnectionSummary(service, connectionName) {
81
+ async getConnectionSummary(service, connectionName, connectionId) {
84
82
  const provider = this.getProvider(service);
85
- const name = normalizeConnectionName(connectionName);
86
- const stored = await this.store.get(service, name);
87
- const marketplace = await this.resolveMarketplaceSummary(provider, connectionName, Boolean(stored));
83
+ const stored = await this.selectStoredConnection(service, connectionName, connectionId);
84
+ const name = stored?.connectionName ?? normalizeConnectionName(connectionName);
85
+ const marketplace = connectionId
86
+ ? undefined
87
+ : await this.resolveMarketplaceSummary(provider, connectionName, Boolean(stored));
88
88
  if (marketplace)
89
89
  return marketplace;
90
90
  if (!stored && connectionName && !this.supportsAuth(provider, "no_auth")) {
91
91
  throw new ConnectionError("connection_not_found", `${service} connection not found: ${name}.`);
92
92
  }
93
+ if (stored?.source === "saas")
94
+ return this.createManagedConnectionSummary(stored);
93
95
  return stored
94
96
  ? this.createConfiguredConnectionSummary(provider, stored.id, name, stored.credential)
95
97
  : this.supportsAuth(provider, "no_auth")
96
98
  ? this.createNoAuthConnectionSummary(provider, name)
97
99
  : undefined;
98
100
  }
99
- async resolveForExecution(service, connectionName) {
101
+ async resolveForExecution(service, connectionName, connectionId) {
100
102
  const provider = this.getProvider(service);
101
- const name = normalizeConnectionName(connectionName);
102
- const stored = await this.store.get(service, name);
103
- const marketplace = await this.resolveMarketplaceSummary(provider, connectionName, Boolean(stored));
103
+ const stored = await this.selectStoredConnection(service, connectionName, connectionId);
104
+ const name = stored?.connectionName ?? normalizeConnectionName(connectionName);
105
+ const marketplace = connectionId
106
+ ? undefined
107
+ : await this.resolveMarketplaceSummary(provider, connectionName, Boolean(stored));
104
108
  if (marketplace)
105
- return { summary: marketplace, marketplace: true, getCredential: async () => undefined };
109
+ return { kind: "marketplace", summary: marketplace };
106
110
  if (!stored && connectionName && !this.supportsAuth(provider, "no_auth")) {
107
111
  throw new ConnectionError("connection_not_found", `${service} connection not found: ${name}.`);
108
112
  }
113
+ if (stored?.source === "saas")
114
+ return { kind: "saas", summary: this.createManagedConnectionSummary(stored), reference: stored.reference };
109
115
  let credential = stored?.credential;
110
116
  if (stored?.credential.authType === "oauth2") {
111
117
  credential = await this.resolveOAuthCredential(stored, stored.credential);
@@ -117,6 +123,7 @@ export class ConnectionService {
117
123
  ? this.createNoAuthConnectionSummary(provider, name)
118
124
  : undefined;
119
125
  return {
126
+ kind: "local",
120
127
  summary,
121
128
  getCredential: async (requestedService) => (requestedService === service ? credential : undefined),
122
129
  };
@@ -125,6 +132,8 @@ export class ConnectionService {
125
132
  const provider = this.getProvider(service);
126
133
  const name = normalizeConnectionName(connectionName);
127
134
  const stored = await this.store.get(service, name);
135
+ if (stored?.source === "saas")
136
+ throw new ConnectionError("unsupported_auth_type", "SaaS credentials are not available locally.");
128
137
  if (stored) {
129
138
  return stored.credential.authType === "oauth2"
130
139
  ? await this.resolveOAuthCredential(stored, stored.credential)
@@ -220,6 +229,15 @@ export class ConnectionService {
220
229
  ...this.mergeCredentialRuntimeData(provider, "oauth2", credential, validation),
221
230
  };
222
231
  }
232
+ async selectStoredConnection(service, name, id) {
233
+ if (!id)
234
+ return this.store.get(service, normalizeConnectionName(name));
235
+ const connection = await this.getStoredConnection(id);
236
+ if (connection.service !== service ||
237
+ (name !== undefined && connection.connectionName !== normalizeConnectionName(name)))
238
+ throw new ConnectionError("connection_not_found", "The selected connection does not match this provider or alias.");
239
+ return connection;
240
+ }
223
241
  async getStoredConnection(id) {
224
242
  const connection = (await this.store.list()).find((item) => item.id === id);
225
243
  if (!connection)
@@ -233,6 +251,20 @@ export class ConnectionService {
233
251
  return this.createManagedConnectionSummary(await this.getStoredConnection(id));
234
252
  }
235
253
  createManagedConnectionSummary(stored) {
254
+ if (stored.source === "saas")
255
+ return {
256
+ id: stored.id,
257
+ service: stored.service,
258
+ connectionName: stored.connectionName,
259
+ authType: "oauth2",
260
+ configured: true,
261
+ virtual: false,
262
+ default: stored.connectionName === defaultConnectionName,
263
+ profile: stored.profile,
264
+ status: stored.status,
265
+ comment: stored.comment,
266
+ saas: stored.reference,
267
+ };
236
268
  const credential = stored.credential;
237
269
  return {
238
270
  status: credential.authType === "oauth2" && !credential.refreshToken && isOAuthCredentialExpired(credential)
@@ -246,6 +278,8 @@ export class ConnectionService {
246
278
  }
247
279
  async saveCredential(provider, credential, input) {
248
280
  const expected = input.expectedConnection;
281
+ if (expected?.source === "saas")
282
+ throw new ConnectionError("unsupported_auth_type", "Use the original source when reconnecting a SaaS connection.");
249
283
  const previousComment = expected?.credential.authType !== "no_auth" ? expected?.credential.metadata.connectionComment : undefined;
250
284
  if (input.comment !== undefined || previousComment !== undefined) {
251
285
  credential.metadata.connectionComment = input.comment === undefined ? previousComment : input.comment;
@@ -432,7 +466,7 @@ export class ConnectionService {
432
466
  service,
433
467
  connectionName,
434
468
  credential: nextCredential,
435
- });
469
+ }, true);
436
470
  if (!updated) {
437
471
  throw new ConnectionError("connection_not_found", `${service} connection changed while its OAuth credential was refreshing. Retry the action.`);
438
472
  }
@@ -460,7 +494,12 @@ export class ConnectionService {
460
494
  buildCredentialRuntimeData(provider, authType, credentialFields, credentialValues, validation) {
461
495
  return {
462
496
  profile: this.createCredentialProfile(provider, authType, credentialFields, credentialValues, validation),
463
- metadata: validation.metadata ?? {},
497
+ metadata: {
498
+ ...validation.metadata,
499
+ providerAccountVerified: Boolean(validation.profile?.accountId ??
500
+ readLegacyString(validation.metadata, "providerAccountId") ??
501
+ readLegacyString(validation.metadata, "accountId")),
502
+ },
464
503
  };
465
504
  }
466
505
  mergeCredentialRuntimeData(provider, authType, credential, validation) {
@@ -474,6 +513,9 @@ export class ConnectionService {
474
513
  ...(validation.metadata ?? {}),
475
514
  // Provider validation cannot replace or invent completed consent provenance.
476
515
  oauthAuthorizationId: credential.metadata.oauthAuthorizationId,
516
+ providerAccountVerified: Boolean(validation.profile?.accountId ??
517
+ readLegacyString(validation.metadata, "providerAccountId") ??
518
+ readLegacyString(validation.metadata, "accountId")) || credential.metadata.providerAccountVerified === true,
477
519
  },
478
520
  };
479
521
  }
@@ -1,6 +1,6 @@
1
1
  import type { ActionDefinition } from "./types.ts";
2
2
  export type PolicySource = "deployment" | "runtime" | "token";
3
- export type PolicyErrorCode = "action_not_allowed" | "action_blocked" | "proxy_not_allowed" | "proxy_blocked" | "connection_not_allowed";
3
+ export type PolicyErrorCode = "action_not_allowed" | "action_blocked" | "proxy_not_allowed" | "proxy_blocked" | "connection_not_allowed" | "trigger_not_allowed" | "trigger_blocked";
4
4
  export interface PolicyCheck {
5
5
  source: PolicySource;
6
6
  outcome: "allow_match" | "block_match" | "allow_miss";
@@ -20,12 +20,15 @@ export interface PolicyRules {
20
20
  blockedActions: string[];
21
21
  allowedProxies: string[];
22
22
  blockedProxies: string[];
23
+ allowedTriggers?: string[];
24
+ blockedTriggers?: string[];
23
25
  }
24
26
  export interface TokenPolicy {
25
27
  allowedActions: string[];
26
28
  blockedActions: string[];
27
29
  allowedProxies: string[];
28
30
  allowedConnections?: string[];
31
+ allowedTriggers?: string[];
29
32
  }
30
33
  export interface RuntimePolicyState {
31
34
  deployment: PolicyRules;
@@ -37,6 +40,8 @@ export interface ActionPolicyConfig {
37
40
  blockedActions?: string[];
38
41
  allowedProxies?: string[];
39
42
  blockedProxies?: string[];
43
+ allowedTriggers?: string[];
44
+ blockedTriggers?: string[];
40
45
  }
41
46
  /**
42
47
  * Immutable policy view shared by every policy consumer in one request.
@@ -46,10 +51,12 @@ export declare class ActionPolicySnapshot {
46
51
  private readonly layers;
47
52
  private readonly proxyLayers;
48
53
  private readonly tokenProxyRules?;
54
+ private readonly tokenTriggerRules?;
49
55
  private readonly allowedConnections;
50
56
  constructor(deployment: PolicyRules, runtime: PolicyRules, token?: TokenPolicy, updatedAt?: string);
51
57
  evaluate(action: ActionDefinition): ActionPolicyDecision;
52
58
  evaluateProxy(service: string): ActionPolicyDecision;
59
+ evaluateTrigger(id: string): ActionPolicyDecision;
53
60
  evaluateConnection(connectionId?: string): ActionPolicyDecision;
54
61
  }
55
62
  /**
@@ -6,6 +6,7 @@ export class ActionPolicySnapshot {
6
6
  layers;
7
7
  proxyLayers;
8
8
  tokenProxyRules;
9
+ tokenTriggerRules;
9
10
  allowedConnections;
10
11
  constructor(deployment, runtime, token, updatedAt) {
11
12
  const deploymentRules = immutablePolicyRules(deployment);
@@ -24,6 +25,7 @@ export class ActionPolicySnapshot {
24
25
  const tokenLayer = compileLayer("token", tokenRules);
25
26
  this.layers.push(tokenLayer);
26
27
  this.tokenProxyRules = tokenLayer.allowedProxies;
28
+ this.tokenTriggerRules = (token.allowedTriggers ?? []).map(compileActionRule);
27
29
  }
28
30
  }
29
31
  evaluate(action) {
@@ -98,6 +100,45 @@ export class ActionPolicySnapshot {
98
100
  }
99
101
  return { allowed: true, checks };
100
102
  }
103
+ evaluateTrigger(id) {
104
+ const checks = [];
105
+ for (const layer of this.proxyLayers) {
106
+ const blocked = layer.blockedTriggers.find((rule) => rule.matches(id));
107
+ if (blocked)
108
+ return {
109
+ allowed: false,
110
+ code: "trigger_blocked",
111
+ message: `${id} is blocked by the Trigger policy.`,
112
+ checks: [{ source: layer.source, outcome: "block_match", rule: blocked.pattern }],
113
+ };
114
+ }
115
+ for (const layer of this.proxyLayers) {
116
+ const allowed = layer.allowedTriggers;
117
+ if (allowed.length === 0)
118
+ continue;
119
+ const match = allowed.find((rule) => rule.matches(id));
120
+ if (!match)
121
+ return {
122
+ allowed: false,
123
+ code: "trigger_not_allowed",
124
+ message: `${id} is not included in the Trigger allowlist.`,
125
+ checks: [...checks, { source: layer.source, outcome: "allow_miss" }],
126
+ };
127
+ checks.push({ source: layer.source, outcome: "allow_match", rule: match.pattern });
128
+ }
129
+ if (this.tokenTriggerRules) {
130
+ const match = this.tokenTriggerRules.find((rule) => rule.matches(id));
131
+ if (!match)
132
+ return {
133
+ allowed: false,
134
+ code: "trigger_not_allowed",
135
+ message: `${id} is not granted to this runtime token.`,
136
+ checks: [...checks, { source: "token", outcome: "allow_miss" }],
137
+ };
138
+ checks.push({ source: "token", outcome: "allow_match", rule: match.pattern });
139
+ }
140
+ return { allowed: true, checks };
141
+ }
101
142
  evaluateConnection(connectionId) {
102
143
  if (this.allowedConnections.length === 0) {
103
144
  return { allowed: true, checks: [] };
@@ -136,6 +177,8 @@ export function emptyPolicyRules() {
136
177
  blockedActions: [],
137
178
  allowedProxies: [],
138
179
  blockedProxies: [],
180
+ allowedTriggers: [],
181
+ blockedTriggers: [],
139
182
  };
140
183
  }
141
184
  export function parseActionPolicyList(value) {
@@ -150,6 +193,8 @@ function policyRules(config) {
150
193
  blockedActions: config.blockedActions ?? [],
151
194
  allowedProxies: config.allowedProxies ?? [],
152
195
  blockedProxies: config.blockedProxies ?? [],
196
+ allowedTriggers: config.allowedTriggers ?? [],
197
+ blockedTriggers: config.blockedTriggers ?? [],
153
198
  });
154
199
  }
155
200
  function immutablePolicyRules(rules) {
@@ -158,11 +203,15 @@ function immutablePolicyRules(rules) {
158
203
  blockedActions: [...rules.blockedActions],
159
204
  allowedProxies: [...rules.allowedProxies],
160
205
  blockedProxies: [...rules.blockedProxies],
206
+ allowedTriggers: [...(rules.allowedTriggers ?? [])],
207
+ blockedTriggers: [...(rules.blockedTriggers ?? [])],
161
208
  };
162
209
  Object.freeze(immutable.allowedActions);
163
210
  Object.freeze(immutable.blockedActions);
164
211
  Object.freeze(immutable.allowedProxies);
165
212
  Object.freeze(immutable.blockedProxies);
213
+ Object.freeze(immutable.allowedTriggers);
214
+ Object.freeze(immutable.blockedTriggers);
166
215
  return Object.freeze(immutable);
167
216
  }
168
217
  function compileLayer(source, rules) {
@@ -172,6 +221,8 @@ function compileLayer(source, rules) {
172
221
  blockedActions: rules.blockedActions.map(compileActionRule),
173
222
  allowedProxies: rules.allowedProxies.map(compileProxyRule),
174
223
  blockedProxies: rules.blockedProxies.map(compileProxyRule),
224
+ allowedTriggers: (rules.allowedTriggers ?? []).map(compileActionRule),
225
+ blockedTriggers: (rules.blockedTriggers ?? []).map(compileActionRule),
175
226
  };
176
227
  }
177
228
  function compileActionRule(pattern) {
@@ -100,6 +100,9 @@ export declare function optionalNumber(value: unknown): number | undefined;
100
100
  /**
101
101
  * Return a finite number from a number or numeric string when present. Examples:
102
102
  * `optionalNumberLike("1.5") => 1.5`, `optionalNumberLike("x") => undefined`.
103
+ *
104
+ * A blank or whitespace-only string is reported as missing rather than parsed, because
105
+ * `Number(" ")` is `0` and a blank field would otherwise surface as a real zero.
103
106
  */
104
107
  export declare function optionalNumberLike(value: unknown): number | undefined;
105
108
  /**
@@ -151,6 +154,16 @@ export declare function pickOptionalInteger(input: Record<string, unknown>, ...k
151
154
  * `nullableString(1) => undefined`.
152
155
  */
153
156
  export declare function nullableString(value: unknown): string | null | undefined;
157
+ /**
158
+ * Return a string exactly as provided, null, or undefined when the value is not a string. Examples:
159
+ * `nullableRawString(null) => null`, `nullableRawString("") => ""`, `nullableRawString(1) => undefined`.
160
+ */
161
+ export declare function nullableRawString(value: unknown): string | null | undefined;
162
+ /**
163
+ * Return a boolean, null, or undefined when the value is not a boolean. Examples:
164
+ * `nullableBoolean(null) => null`, `nullableBoolean(false) => false`, `nullableBoolean("true") => undefined`.
165
+ */
166
+ export declare function nullableBoolean(value: unknown): boolean | null | undefined;
154
167
  /**
155
168
  * Return a string or null when the value is not a string.
156
169
  */