@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,175 @@
1
+ import { sha256Hex } from "../../core/aws-sigv4.js";
2
+ import { looseArray, optionalInteger, optionalNumber, optionalRawString, optionalRecord, optionalString, } from "../../core/cast.js";
3
+ import { assertPublicHttpUrl, isPrivateNetworkAccessAllowed } from "../../core/request.js";
4
+ import { callMcpTool, listMcpTools } from "../mcp-tools.js";
5
+ import { parseProviderJsonBodyText, providerInputError, providerResponseError, requiredInputString, } from "../provider-runtime.js";
6
+ const hostedEndpoint = "https://mcp.draw.io/mcp";
7
+ const defaultShapeLimit = 10;
8
+ // The two create_diagram tool errors that judge the submitted source; anything else is a server failure.
9
+ const sourceVerdictPrefixes = ["Could not extract draw.io XML", "Provide exactly one of"];
10
+ const errorsHeading = "ERRORS (will cause rendering issues):\n- ";
11
+ const warningsHeading = "WARNINGS (may cause issues):\n- ";
12
+ export const drawioMcpActionHandlers = {
13
+ async create_diagram(input, options) {
14
+ const result = await callMcpTool({
15
+ ...options,
16
+ toolName: "create_diagram",
17
+ arguments: { mermaid: optionalString(input.mermaid), xml: optionalString(input.xml) },
18
+ transformToolResult: rejectDiagramSource,
19
+ });
20
+ const texts = readTextContent(result);
21
+ const editorUrl = readEditorUrl(texts);
22
+ if (editorUrl === undefined) {
23
+ throw providerResponseError("draw.io MCP create_diagram response did not include an editor link; a self-hosted server must be jgraph/drawio-mcp mcp-app-server 1.0.4 or later");
24
+ }
25
+ return { editorUrl, ...readFindings(texts) };
26
+ },
27
+ async search_shapes(input, options) {
28
+ const result = await callMcpTool({
29
+ ...options,
30
+ toolName: "search_shapes",
31
+ arguments: {
32
+ query: requiredInputString(input.query, "query"),
33
+ limit: optionalInteger(input.limit) ?? defaultShapeLimit,
34
+ },
35
+ });
36
+ return { shapes: readShapes(result) };
37
+ },
38
+ };
39
+ /** Resolve the MCP server a connection points at; a blank endpoint selects the hosted draw.io server. */
40
+ export function createDrawioMcpContext(values, fetcher, signal) {
41
+ return {
42
+ endpoint: normalizeDrawioMcpEndpoint(values.mcpEndpoint),
43
+ service: "draw.io",
44
+ fetcher,
45
+ signal,
46
+ terminateSession: true,
47
+ maxResponseBytes: 4 * 1024 * 1024,
48
+ // tools/list is about 64 KB because create_diagram embeds draw.io's drawing reference in its description.
49
+ toolListMaxBytes: 1024 * 1024,
50
+ toolListMaxPages: 5,
51
+ toolListMaxTools: 100,
52
+ };
53
+ }
54
+ /** Confirm the endpoint serves the draw.io tools and derive a stable identity from the endpoint. */
55
+ export async function validateDrawioMcpCredential(values, fetcher, signal) {
56
+ const options = createDrawioMcpContext(values, fetcher, signal);
57
+ const discovered = new Set((await listMcpTools(options)).map((tool) => tool.name));
58
+ const missing = Object.keys(drawioMcpActionHandlers).filter((toolName) => !discovered.has(toolName));
59
+ if (missing.length > 0) {
60
+ throw providerInputError(`mcpEndpoint does not serve the draw.io MCP tools: missing ${missing.join(", ")}`);
61
+ }
62
+ return {
63
+ profile: {
64
+ accountId: `drawio_mcp:mcp:${sha256Hex(options.endpoint).slice(0, 16)}`,
65
+ displayName: `draw.io MCP · ${new URL(options.endpoint).host}`,
66
+ },
67
+ grantedScopes: [],
68
+ metadata: { mcpEndpoint: options.endpoint },
69
+ };
70
+ }
71
+ function normalizeDrawioMcpEndpoint(value) {
72
+ const allowPrivateNetwork = isPrivateNetworkAccessAllowed();
73
+ const url = assertPublicHttpUrl(optionalString(value) ?? hostedEndpoint, {
74
+ fieldName: "mcpEndpoint",
75
+ createError: providerInputError,
76
+ allowPrivateNetwork,
77
+ });
78
+ if (url.username || url.password) {
79
+ throw providerInputError("mcpEndpoint must not include a username or password");
80
+ }
81
+ if (url.protocol === "http:" && !allowPrivateNetwork) {
82
+ throw providerInputError("mcpEndpoint must use https unless private-network access is enabled");
83
+ }
84
+ url.search = "";
85
+ url.hash = "";
86
+ return url.toString();
87
+ }
88
+ // Also drops structured content: the editor link and findings only ever arrive as text blocks,
89
+ // which the shared result normalizer would otherwise discard in favour of structuredContent.
90
+ function rejectDiagramSource(result) {
91
+ const message = "content" in result && result.isError ? readTextContent(result).join("\n") : "";
92
+ if (sourceVerdictPrefixes.some((prefix) => message.startsWith(prefix))) {
93
+ throw providerInputError(`draw.io rejected the diagram source: ${message.slice(0, 300)}`);
94
+ }
95
+ return { ...result, structuredContent: undefined };
96
+ }
97
+ // draw.io puts the editor link on a line of its own after the source echo, which is single-line JSON, and after
98
+ // the XML findings, which quote attribute values from the source verbatim, line breaks included. Skipping the
99
+ // findings and taking the last such line keeps a link written inside the submitted source from being returned instead.
100
+ function readEditorUrl(texts) {
101
+ return texts
102
+ .filter((text) => !isFindingsText(text))
103
+ .flatMap((text) => text.split("\n"))
104
+ .findLast((line) => line.startsWith("https://") && line.includes("#create="));
105
+ }
106
+ // draw.io reports XML problems in one text block of "ERRORS (...):\n- item" and "WARNINGS (...):\n- item" sections.
107
+ function isFindingsText(text) {
108
+ return text.startsWith("ERRORS ") || text.startsWith("WARNINGS ");
109
+ }
110
+ function readTextContent(result) {
111
+ return looseArray(optionalRecord(result)?.content).flatMap((item) => {
112
+ const content = optionalRecord(item);
113
+ const text = content?.type === "text" ? optionalRawString(content.text) : undefined;
114
+ return text === undefined ? [] : [text];
115
+ });
116
+ }
117
+ // Findings items quote attribute values verbatim, so blank lines and line starts can come from the source. Only
118
+ // draw.io's exact layout splits the block: each heading is followed by the items joined with "\n- ", and a blank
119
+ // line separates the errors section from the warnings section. The layout leaves no way to tell a quoted value from
120
+ // that structure: a value that itself contains "\n- " still reads as two items, and one that contains the whole
121
+ // "\n\nWARNINGS (may cause issues):\n- " separator can move items between errors and warnings. The editor link is
122
+ // unaffected, since readEditorUrl skips the findings block as a whole.
123
+ function readFindings(texts) {
124
+ const text = texts.find(isFindingsText) ?? "";
125
+ if (text.startsWith(warningsHeading)) {
126
+ return { errors: [], warnings: splitFindings(text.slice(warningsHeading.length)) };
127
+ }
128
+ if (!text.startsWith(errorsHeading)) {
129
+ return { errors: [], warnings: [] };
130
+ }
131
+ const body = text.slice(errorsHeading.length);
132
+ const separator = body.lastIndexOf(`\n\n${warningsHeading}`);
133
+ if (separator < 0) {
134
+ return { errors: splitFindings(body), warnings: [] };
135
+ }
136
+ return {
137
+ errors: splitFindings(body.slice(0, separator)),
138
+ warnings: splitFindings(body.slice(separator + 2 + warningsHeading.length)),
139
+ };
140
+ }
141
+ // draw.io never reports an empty finding, so an empty piece can only come from a quoted value that contains the
142
+ // separator, such as one ending in "\n- ", and is dropped.
143
+ function splitFindings(section) {
144
+ return section.split("\n- ").filter((item) => item !== "");
145
+ }
146
+ // Newer draw.io servers return structured shapes; the hosted server returns a JSON array as text.
147
+ function readShapes(result) {
148
+ const structured = optionalRecord(result)?.shapes;
149
+ const payload = structured === undefined ? parseShapeText(readTextContent(result)[0]) : structured;
150
+ if (!Array.isArray(payload)) {
151
+ throw providerResponseError("draw.io MCP search_shapes returned an unexpected payload");
152
+ }
153
+ return payload.map(readShape);
154
+ }
155
+ function parseShapeText(text) {
156
+ if (text === undefined) {
157
+ throw providerResponseError("draw.io MCP search_shapes response did not include any text");
158
+ }
159
+ if (text.startsWith("No shapes found"))
160
+ return [];
161
+ return parseProviderJsonBodyText(text, {
162
+ emptyBody: [],
163
+ invalidJsonMessage: `draw.io MCP search_shapes returned an unexpected payload: ${text.slice(0, 200)}`,
164
+ });
165
+ }
166
+ function readShape(value) {
167
+ const shape = optionalRecord(value);
168
+ const style = optionalRawString(shape?.style);
169
+ const width = optionalNumber(shape?.w);
170
+ const height = optionalNumber(shape?.h);
171
+ if (!style || width === undefined || height === undefined) {
172
+ throw providerResponseError("draw.io MCP search_shapes returned a shape without a style or size");
173
+ }
174
+ return { title: optionalRawString(shape?.title) ?? "", style, width, height };
175
+ }
@@ -0,0 +1,4 @@
1
+ import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ export declare const executors: ProviderExecutors;
3
+ export declare const credentialValidators: CredentialValidators;
4
+ export declare const proxy: ProviderProxyExecutor;
@@ -0,0 +1,97 @@
1
+ import { optionalRecord, optionalString } from "../../core/cast.js";
2
+ import { encodePathSegment } from "../../core/request.js";
3
+ import { basicAuthorizationHeader, defineApiKeyProviderExecutors, defineProviderProxy, providerResponseError, ProviderRequestError, providerUserAgent, requiredInputString, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
4
+ const baseUrl = "https://api.enormail.eu/api/1.0";
5
+ async function request(endpoint, query, context) {
6
+ const url = new URL(`${baseUrl}/${endpoint}.json`);
7
+ for (const [key, value] of Object.entries(query)) {
8
+ if (value != null)
9
+ url.searchParams.set(key, String(value));
10
+ }
11
+ return runProviderRequest({ label: "Enormail", signal: context.signal }, async (signal) => {
12
+ const response = await context.fetcher(url, {
13
+ signal,
14
+ headers: {
15
+ authorization: basicAuthorizationHeader(`${context.apiKey}:`),
16
+ accept: "application/json",
17
+ "user-agent": providerUserAgent,
18
+ },
19
+ });
20
+ const text = await response.text();
21
+ let payload;
22
+ try {
23
+ payload = JSON.parse(text);
24
+ }
25
+ catch {
26
+ throw new ProviderRequestError(response.ok ? 502 : response.status, `Enormail returned invalid JSON (HTTP ${response.status})`, undefined, response.status === 429 ? "rate_limited" : "provider_error");
27
+ }
28
+ if (!response.ok) {
29
+ const error = optionalRecord(payload);
30
+ const message = optionalString(error?.message) ?? optionalString(error?.Message) ?? optionalString(error?.error);
31
+ throw new ProviderRequestError(response.status, `Enormail HTTP ${response.status}${message ? `: ${message}` : ""}`, { providerCode: error?.code }, response.status === 429 ? "rate_limited" : "provider_error");
32
+ }
33
+ return payload;
34
+ });
35
+ }
36
+ function resourceId(value, fieldName) {
37
+ const id = requiredInputString(value, fieldName);
38
+ if (id === "." || id === "..")
39
+ throw new ProviderRequestError(400, "Invalid Enormail resource ID");
40
+ return encodePathSegment(id);
41
+ }
42
+ export const executors = defineApiKeyProviderExecutors("enormail", {
43
+ async get_account(_input, context) {
44
+ return requiredResponseRecord(await request("account", {}, context), "Enormail account");
45
+ },
46
+ async list_senders(_input, context) {
47
+ const senders = await request("account/senders", {}, context);
48
+ if (!Array.isArray(senders))
49
+ throw providerResponseError("Enormail returned an invalid collection");
50
+ return { senders };
51
+ },
52
+ async list_lists(input, context) {
53
+ const lists = await request("lists", { page: input.page }, context);
54
+ if (!Array.isArray(lists))
55
+ throw providerResponseError("Enormail returned an invalid collection");
56
+ return { lists };
57
+ },
58
+ async get_list(input, context) {
59
+ return requiredResponseRecord(await request(`lists/${resourceId(input.listid, "listid")}`, {}, context), "Enormail response");
60
+ },
61
+ async list_contacts(input, context) {
62
+ return requiredResponseRecord(await request(`contacts/${resourceId(input.listid, "listid")}/${input.state}`, { page: input.page }, context), "Enormail response");
63
+ },
64
+ async get_contact(input, context) {
65
+ return requiredResponseRecord(await request(`contacts/${resourceId(input.listid, "listid")}`, { email: input.email }, context), "Enormail response");
66
+ },
67
+ async list_mailings(input, context) {
68
+ return requiredResponseRecord(await request(`mailings/${input.state}`, { page: input.page }, context), "Enormail response");
69
+ },
70
+ async get_mailing_stats(input, context) {
71
+ return requiredResponseRecord(await request(`mailings/${resourceId(input.mailingid, "mailingid")}/stats`, {}, context), "Enormail response");
72
+ },
73
+ }, { skipDnsValidation: true });
74
+ export const credentialValidators = {
75
+ async apiKey(input, { fetcher, signal }) {
76
+ const account = requiredResponseRecord(await request("account", {}, { apiKey: input.apiKey, fetcher, signal }), "Enormail account");
77
+ const name = [optionalString(account.firstname), optionalString(account.lastname)].filter(Boolean).join(" ").trim();
78
+ return {
79
+ profile: {
80
+ accountId: optionalString(account.id),
81
+ displayName: name || optionalString(account.email) || "Enormail Account",
82
+ },
83
+ grantedScopes: [],
84
+ metadata: { accountId: optionalString(account.id), apiBaseUrl: baseUrl },
85
+ };
86
+ },
87
+ };
88
+ export const proxy = defineProviderProxy({
89
+ service: "enormail",
90
+ baseUrl,
91
+ auth: { type: "api_key_basic", suffix: ":" },
92
+ skipDnsValidation: true,
93
+ customizeRequest({ headers }) {
94
+ if (!headers.has("accept"))
95
+ headers.set("accept", "application/json");
96
+ },
97
+ });
@@ -25,7 +25,7 @@ export const proxy = defineProviderProxy({
25
25
  baseUrl: origin,
26
26
  auth: { type: "api_key_query", name: "api_key" },
27
27
  skipDnsValidation: true,
28
- redirect: "error",
28
+ redirect: "manual",
29
29
  allowedEndpoint(value) {
30
30
  const url = new URL(value, origin);
31
31
  return (url.origin === origin &&
@@ -57,7 +57,7 @@ function connectionInput(key, fetcher, signal) {
57
57
  service: "FastMoss",
58
58
  fetcher,
59
59
  signal,
60
- redirect: "error",
60
+ redirect: "manual",
61
61
  terminateSession: true,
62
62
  maxResponseBytes: 16 * 1024 * 1024,
63
63
  };
@@ -1,4 +1,6 @@
1
1
  import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor, TransitFileWriter } from "../../core/types.ts";
2
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
3
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
4
  import type { ProviderActionHandlerSubset } from "../provider-runtime.ts";
3
5
  interface FeishuAppBotCredential {
4
6
  appId: string;
@@ -16,4 +18,5 @@ export declare const feishuAppBotActionHandlers: ProviderActionHandlerSubset<"fe
16
18
  export declare const executors: ProviderExecutors;
17
19
  export declare const proxy: ProviderProxyExecutor;
18
20
  export declare const credentialValidators: CredentialValidators;
21
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
19
22
  export {};
@@ -27,6 +27,7 @@ import { createFeishuWhiteboardActionHandlers } from "../feishu/shared/whiteboar
27
27
  import { createFeishuWikiActionHandlers } from "../feishu/shared/wiki-runtime.js";
28
28
  import { createProviderProxyUrl, defineProviderExecutors, getProviderActionHandler, mapProviderActionHandlers, normalizeProviderProxyHeaders, providerFetch, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, requireCustomCredential, requiredInputString, toProviderProxyError, } from "../provider-runtime.js";
29
29
  import { feishuAppBotActions, feishuAppBotProviderScopes } from "./actions.js";
30
+ import { feishuEvents } from "./trigger-on-event.js";
30
31
  const service = "feishu_app_bot";
31
32
  const feishuOpenBaseUrl = "https://open.feishu.cn/open-apis";
32
33
  const feishuRequestTimeoutMs = 30_000;
@@ -1047,3 +1048,4 @@ function createFeishuRequestSignal(parent) {
1047
1048
  function isAbortError(error) {
1048
1049
  return error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError");
1049
1050
  }
1051
+ export const triggers = [...feishuEvents];
@@ -0,0 +1 @@
1
+ export declare function feishuResourceKind(events: readonly string[]): "document" | "calendar" | "approval" | undefined;
@@ -0,0 +1,10 @@
1
+ export function feishuResourceKind(events) {
2
+ if (events.length == 0)
3
+ return;
4
+ if (events.every((event) => event.startsWith("drive.file.")))
5
+ return "document";
6
+ if (events.every((event) => event == "calendar.calendar.event.changed_v4"))
7
+ return "calendar";
8
+ if (events.every((event) => ["approval_instance", "approval_task", "approval_cc", "approval"].includes(event)))
9
+ return "approval";
10
+ }
@@ -0,0 +1,2 @@
1
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
2
+ export declare const feishuEvents: readonly IntegrationDefinition[];
@@ -0,0 +1,4 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const additionalSnapshot0: TriggerKeySnapshot & {
3
+ readonly type: "integration";
4
+ };
@@ -0,0 +1,63 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ export const additionalSnapshot0 = {
3
+ key: "feishu_app_bot.on_event",
4
+ provider: "feishu_app_bot",
5
+ name: "on_event",
6
+ displayName: "Application Event",
7
+ description: "Receives selected Feishu application events through a shared event source.",
8
+ definitionVersion: 2,
9
+ type: "integration",
10
+ endpoint: {
11
+ methods: ["POST"],
12
+ body: { formats: ["json"], allowArray: false, allowEmpty: false },
13
+ successStatus: 200,
14
+ },
15
+ configInputs: [
16
+ {
17
+ handle: "sourceId",
18
+ jsonSchema: { ...s.string({ pattern: "^source_[0-9a-f]{32}$" }), title: "Event source" },
19
+ nullable: false,
20
+ },
21
+ {
22
+ handle: "eventTypes",
23
+ jsonSchema: {
24
+ ...s.array(s.string({ pattern: "^[a-z][a-z0-9_.]{0,127}$" }), {
25
+ minItems: 1,
26
+ maxItems: 200,
27
+ uniqueItems: true,
28
+ }),
29
+ title: "Event types",
30
+ },
31
+ nullable: false,
32
+ },
33
+ {
34
+ handle: "chatIds",
35
+ jsonSchema: {
36
+ ...s.array(s.string({ minLength: 1, maxLength: 256 }), { maxItems: 100, uniqueItems: true }),
37
+ title: "Chat IDs",
38
+ },
39
+ nullable: true,
40
+ description: "Leave empty to receive events from all chats available to the source.",
41
+ },
42
+ {
43
+ handle: "resource",
44
+ jsonSchema: {
45
+ ...s.object({
46
+ kind: s.stringEnum(["document", "calendar", "approval"]),
47
+ id: s.string({ minLength: 1, maxLength: 256 }),
48
+ documentType: s.stringEnum(["doc", "docx", "sheet", "bitable", "file", "folder"]),
49
+ }, { additionalProperties: false, required: ["kind", "id"] }),
50
+ title: "Resource subscription",
51
+ },
52
+ nullable: true,
53
+ },
54
+ ],
55
+ outputs: [
56
+ { handle: "event", jsonSchema: s.string(), nullable: false },
57
+ { handle: "deliveryId", jsonSchema: s.string(), nullable: false },
58
+ { handle: "appId", jsonSchema: s.string(), nullable: false },
59
+ { handle: "tenantKey", jsonSchema: s.string(), nullable: false },
60
+ { handle: "occurredAt", jsonSchema: s.string(), nullable: true },
61
+ { handle: "body", jsonSchema: { type: "object" }, nullable: false },
62
+ ],
63
+ };
@@ -0,0 +1,29 @@
1
+ import { PermanentIntegrationError } from "../../triggers/common/integration.js";
2
+ import { isJsonObject } from "../../triggers/common/json.js";
3
+ import { additionalSnapshot0 } from "./trigger-on-event.definition.js";
4
+ import { feishuSubscriptions, feishuResponse } from "./trigger-subscriptions.js";
5
+ export const feishuEvents = [
6
+ {
7
+ eventSource: "feishu",
8
+ resources: { subscriptions: (config) => feishuSubscriptions(config, "feishu_app_bot"), response: feishuResponse },
9
+ snapshot: additionalSnapshot0,
10
+ receive(context) {
11
+ if (context.eventSourceId !== context.config.sourceId)
12
+ return { outcome: "respond", status: 404, body: "", contentType: "text/plain" };
13
+ const payload = context.payload;
14
+ if (!isJsonObject(payload) ||
15
+ typeof payload.deliveryId !== "string" ||
16
+ payload.deliveryId.length === 0 ||
17
+ typeof payload.event !== "string" ||
18
+ typeof payload.appId !== "string" ||
19
+ typeof payload.tenantKey !== "string" ||
20
+ (payload.occurredAt != null && typeof payload.occurredAt !== "string") ||
21
+ !isJsonObject(payload.body))
22
+ throw new PermanentIntegrationError("Invalid Feishu shared event payload.");
23
+ return { outcome: "event", dedupeKey: payload.deliveryId, outputs: payload };
24
+ },
25
+ async reconcile() {
26
+ throw new PermanentIntegrationError("This deployment does not support shared Feishu event sources.");
27
+ },
28
+ },
29
+ ];
@@ -0,0 +1,5 @@
1
+ import type { ResourceSubscription } from "../../triggers/common/integration.ts";
2
+ import type { ConnectorProxyResult } from "../../triggers/common/proxy.ts";
3
+ import type { JsonValue } from "../../triggers/common/types.ts";
4
+ export declare function feishuSubscriptions(config: Readonly<Record<string, JsonValue>>, provider: string): readonly ResourceSubscription[];
5
+ export declare function feishuResponse(result: ConnectorProxyResult): Readonly<Record<string, JsonValue>>;
@@ -0,0 +1,70 @@
1
+ import { IntegrationConnectionError, PermanentIntegrationError, TransientIntegrationError, } from "../../triggers/common/integration.js";
2
+ import { isJsonObject } from "../../triggers/common/json.js";
3
+ import { feishuResourceKind } from "./trigger-config.js";
4
+ export function feishuSubscriptions(config, provider) {
5
+ if (config.resource == null)
6
+ return [];
7
+ if (!isJsonObject(config.resource))
8
+ throw new PermanentIntegrationError("Invalid Feishu resource.");
9
+ const { kind, id, documentType } = config.resource;
10
+ if (typeof id != "string" || id.length == 0)
11
+ throw new PermanentIntegrationError("A Feishu resource ID is required.");
12
+ if (kind != feishuResourceKind(config.eventTypes))
13
+ throw new PermanentIntegrationError("The selected events do not support this resource subscription.");
14
+ const resource = encodeURIComponent(id);
15
+ if (kind == "document") {
16
+ if (typeof documentType != "string" ||
17
+ !["doc", "docx", "sheet", "bitable", "file", "folder", "slides"].includes(documentType)) {
18
+ throw new PermanentIntegrationError("A supported document type is required.");
19
+ }
20
+ return config.eventTypes.map((eventType) => {
21
+ const query = { file_type: documentType, event_type: eventType };
22
+ const prefix = `/drive/v1/files/${resource}`;
23
+ return {
24
+ key: JSON.stringify(["document", documentType, id, eventType]),
25
+ subscribe: { endpoint: `${prefix}/subscribe`, method: "POST", query },
26
+ unsubscribe: { endpoint: `${prefix}/delete_subscribe`, method: "DELETE", query },
27
+ inspect: { endpoint: `${prefix}/get_subscribe`, method: "GET", query },
28
+ };
29
+ });
30
+ }
31
+ if (kind == "calendar") {
32
+ const prefix = `/calendar/v4/calendars/${resource}/events`;
33
+ return [
34
+ {
35
+ key: JSON.stringify(["calendar", id]),
36
+ subscribe: { endpoint: `${prefix}/subscription`, method: "POST" },
37
+ unsubscribe: { endpoint: `${prefix}/unsubscription`, method: "POST" },
38
+ },
39
+ ];
40
+ }
41
+ if (kind == "approval") {
42
+ if (provider != "feishu_app_bot")
43
+ throw new PermanentIntegrationError("Approval definition subscriptions require an application Connection.");
44
+ const prefix = `/approval/v4/approvals/${resource}`;
45
+ return [
46
+ {
47
+ key: JSON.stringify(["approval", id]),
48
+ subscribe: { endpoint: `${prefix}/subscribe`, method: "POST" },
49
+ unsubscribe: { endpoint: `${prefix}/unsubscribe`, method: "POST" },
50
+ },
51
+ ];
52
+ }
53
+ throw new PermanentIntegrationError("Unsupported Feishu resource subscription.");
54
+ }
55
+ export function feishuResponse(result) {
56
+ if (!isJsonObject(result.data))
57
+ throw new TransientIntegrationError("Feishu returned an invalid response.");
58
+ const code = result.data.code;
59
+ if (result.status >= 200 && result.status < 300 && code === 0)
60
+ return isJsonObject(result.data.data) ? result.data.data : {};
61
+ const details = `HTTP ${result.status}${typeof code == "number" && Number.isSafeInteger(code) ? `, Feishu code ${code}` : ""}`;
62
+ if (result.status == 401 ||
63
+ result.status == 403 ||
64
+ [99991661, 99991663, 99991668, 99991671, 99991677].includes(Number(code))) {
65
+ throw new IntegrationConnectionError(`Feishu rejected the Connection (${details}).`);
66
+ }
67
+ if (result.status == 429 || result.status >= 500 || code === 99991400)
68
+ throw new TransientIntegrationError(`Feishu is temporarily unavailable (${details}).`);
69
+ throw new PermanentIntegrationError(`Feishu rejected the request (${details}). Check the application's API permissions and request parameters.`);
70
+ }
@@ -98,7 +98,7 @@ function mcpInput(apiKey, fetcher, signal) {
98
98
  service: "FinChina",
99
99
  headers: { "x-api-key": apiKey },
100
100
  fetcher,
101
- redirect: "error",
101
+ redirect: "manual",
102
102
  terminateSession: true,
103
103
  };
104
104
  }
@@ -0,0 +1,4 @@
1
+ import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ export declare const executors: ProviderExecutors;
3
+ export declare const proxy: ProviderProxyExecutor;
4
+ export declare const credentialValidators: CredentialValidators;
@@ -0,0 +1,19 @@
1
+ import { defineApiKeyProviderExecutors, defineProviderProxy } from "../provider-runtime.js";
2
+ import { framejetActionHandlers, framejetApiBaseUrl, framejetCaptureTimeoutMs, readFramejetError, validateFramejetApiKey, } from "./runtime.js";
3
+ const service = "framejet";
4
+ export const executors = defineApiKeyProviderExecutors(service, framejetActionHandlers, {
5
+ skipDnsValidation: true,
6
+ });
7
+ export const proxy = defineProviderProxy({
8
+ service,
9
+ baseUrl: framejetApiBaseUrl,
10
+ auth: { type: "api_key_header", name: "X-Api-Key" },
11
+ readError: readFramejetError,
12
+ skipDnsValidation: true,
13
+ timeoutMs: framejetCaptureTimeoutMs,
14
+ });
15
+ export const credentialValidators = {
16
+ apiKey(input, { fetcher, signal }) {
17
+ return validateFramejetApiKey(input.apiKey, fetcher, signal);
18
+ },
19
+ };
@@ -0,0 +1,16 @@
1
+ import type { CredentialValidationResult } from "../../core/types.ts";
2
+ import type { ApiKeyProviderContext, ProviderActionHandlers, ProviderFetch } from "../provider-runtime.ts";
3
+ import { ProviderRequestError } from "../provider-runtime.ts";
4
+ export declare const framejetApiBaseUrl = "https://framejet.dev";
5
+ export declare const framejetCaptureTimeoutMs = 90000;
6
+ type FramejetActionHandler = (input: Record<string, unknown>, context: ApiKeyProviderContext) => Promise<unknown>;
7
+ export declare const framejetActionHandlers: ProviderActionHandlers<"framejet", FramejetActionHandler>;
8
+ /**
9
+ * Check a key against GET /v1/me, which does not spend a screenshot.
10
+ */
11
+ export declare function validateFramejetApiKey(apiKey: string, fetcher: ProviderFetch, signal?: AbortSignal): Promise<CredentialValidationResult>;
12
+ /**
13
+ * Map a failed Framejet response for both actions and the proxy, so a spent quota reads the same on either path.
14
+ */
15
+ export declare function readFramejetError(response: Response): Promise<ProviderRequestError>;
16
+ export {};