@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,464 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { booleanString, looseArray, nullableBoolean, nullableInteger, nullableRawString, nullableString, objectArray, optionalBoolean, optionalInteger, optionalRawString, optionalRecord, optionalString, optionalStringArray, recordOrEmpty, } from "../../core/cast.js";
3
+ import { jsonObject } from "../../core/request.js";
4
+ import { providerInputError, requiredInputString } from "../provider-runtime.js";
5
+ import { discordbotRequest, discordbotRequestJson, discordbotRequestJsonOrNull, discordbotRequestNoContent, requiredPath, } from "./runtime.js";
6
+ export const guildActionHandlers = {
7
+ get_guild(input, context) {
8
+ return discordbotRequestJson({
9
+ path: guildPath(input),
10
+ query: { with_counts: booleanString(input.with_counts) },
11
+ context,
12
+ });
13
+ },
14
+ get_guild_preview(input, context) {
15
+ return discordbotRequestJson({ path: `${guildPath(input)}/preview`, context });
16
+ },
17
+ modify_guild(input, context) {
18
+ return discordbotRequestJson({
19
+ method: "PATCH",
20
+ path: guildPath(input),
21
+ body: jsonObject({
22
+ name: optionalString(input.name),
23
+ verification_level: nullableInteger(input.verification_level),
24
+ default_message_notifications: nullableInteger(input.default_message_notifications),
25
+ explicit_content_filter: nullableInteger(input.explicit_content_filter),
26
+ afk_channel_id: nullableString(input.afk_channel_id),
27
+ afk_timeout: optionalInteger(input.afk_timeout),
28
+ icon: nullableString(input.icon),
29
+ splash: nullableString(input.splash),
30
+ discovery_splash: nullableString(input.discovery_splash),
31
+ banner: nullableString(input.banner),
32
+ system_channel_id: nullableString(input.system_channel_id),
33
+ system_channel_flags: optionalInteger(input.system_channel_flags),
34
+ rules_channel_id: nullableString(input.rules_channel_id),
35
+ public_updates_channel_id: nullableString(input.public_updates_channel_id),
36
+ safety_alerts_channel_id: nullableString(input.safety_alerts_channel_id),
37
+ preferred_locale: nullableString(input.preferred_locale),
38
+ features: optionalStringArray(input.features),
39
+ description: nullableRawString(input.description),
40
+ premium_progress_bar_enabled: optionalBoolean(input.premium_progress_bar_enabled),
41
+ }),
42
+ auditLogReason: input.audit_log_reason,
43
+ context,
44
+ });
45
+ },
46
+ list_guild_channels(input, context) {
47
+ return discordbotRequestJson({ path: `${guildPath(input)}/channels`, context }).then((channels) => ({ channels }));
48
+ },
49
+ create_guild_channel(input, context) {
50
+ return discordbotRequestJson({
51
+ method: "POST",
52
+ path: `${guildPath(input)}/channels`,
53
+ body: jsonObject({
54
+ name: requiredInputString(input.name, "name"),
55
+ type: optionalInteger(input.type),
56
+ topic: channelTopic(input),
57
+ bitrate: optionalInteger(input.bitrate),
58
+ user_limit: optionalInteger(input.user_limit),
59
+ rate_limit_per_user: optionalInteger(input.rate_limit_per_user),
60
+ position: optionalInteger(input.position),
61
+ permission_overwrites: Array.isArray(input.permission_overwrites) ? input.permission_overwrites : undefined,
62
+ parent_id: optionalString(input.parent_id),
63
+ nsfw: optionalBoolean(input.nsfw),
64
+ rtc_region: nullableString(input.rtc_region),
65
+ video_quality_mode: optionalInteger(input.video_quality_mode),
66
+ default_auto_archive_duration: optionalInteger(input.default_auto_archive_duration),
67
+ default_reaction_emoji: optionalRecord(input.default_reaction_emoji),
68
+ available_tags: Array.isArray(input.available_tags) ? input.available_tags : undefined,
69
+ default_sort_order: optionalInteger(input.default_sort_order),
70
+ default_forum_layout: optionalInteger(input.default_forum_layout),
71
+ default_thread_rate_limit_per_user: optionalInteger(input.default_thread_rate_limit_per_user),
72
+ flags: optionalInteger(input.flags),
73
+ }),
74
+ auditLogReason: input.audit_log_reason,
75
+ context,
76
+ }).then((channel) => ({ channel }));
77
+ },
78
+ modify_guild_channel_positions(input, context) {
79
+ return discordbotRequestNoContent({
80
+ method: "PATCH",
81
+ path: `${guildPath(input)}/channels`,
82
+ body: requiredPositions(input.positions).map((position) => jsonObject({
83
+ id: requiredInputString(position.id, "positions[].id"),
84
+ position: nullableInteger(position.position),
85
+ lock_permissions: nullableBoolean(position.lock_permissions),
86
+ parent_id: nullableString(position.parent_id),
87
+ flags: nullableInteger(position.flags),
88
+ })),
89
+ context,
90
+ });
91
+ },
92
+ list_active_guild_threads(input, context) {
93
+ return discordbotRequestJson({ path: `${guildPath(input)}/threads/active`, context }).then((value) => {
94
+ const response = recordOrEmpty(value);
95
+ return { threads: looseArray(response.threads), members: looseArray(response.members) };
96
+ });
97
+ },
98
+ get_guild_member(input, context) {
99
+ return discordbotRequestJson({ path: memberPath(input), context });
100
+ },
101
+ list_guild_members(input, context) {
102
+ return discordbotRequestJson({
103
+ path: `${guildPath(input)}/members`,
104
+ query: { limit: optionalInteger(input.limit), after: optionalString(input.after) },
105
+ context,
106
+ }).then((members) => ({ members }));
107
+ },
108
+ search_guild_members(input, context) {
109
+ return discordbotRequestJson({
110
+ path: `${guildPath(input)}/members/search`,
111
+ query: {
112
+ query: requiredInputString(input.query, "query"),
113
+ limit: optionalInteger(input.limit),
114
+ },
115
+ context,
116
+ }).then((members) => ({ members }));
117
+ },
118
+ add_guild_member(input, context) {
119
+ return addGuildMember(input, context);
120
+ },
121
+ modify_guild_member(input, context) {
122
+ return discordbotRequestJsonOrNull({
123
+ method: "PATCH",
124
+ path: memberPath(input),
125
+ body: jsonObject({
126
+ nick: nullableRawString(input.nick),
127
+ roles: input.roles === null ? null : optionalStringArray(input.roles),
128
+ mute: nullableBoolean(input.mute),
129
+ deaf: nullableBoolean(input.deaf),
130
+ channel_id: nullableString(input.channel_id),
131
+ communication_disabled_until: nullableString(input.communication_disabled_until),
132
+ flags: nullableInteger(input.flags),
133
+ }),
134
+ auditLogReason: input.audit_log_reason,
135
+ context,
136
+ }).then((member) => ({ member }));
137
+ },
138
+ modify_current_member(input, context) {
139
+ return discordbotRequestJson({
140
+ method: "PATCH",
141
+ path: `${guildPath(input)}/members/@me`,
142
+ body: jsonObject({
143
+ nick: nullableRawString(input.nick),
144
+ avatar: nullableString(input.avatar),
145
+ banner: nullableString(input.banner),
146
+ bio: nullableRawString(input.bio),
147
+ }),
148
+ auditLogReason: input.audit_log_reason,
149
+ context,
150
+ });
151
+ },
152
+ add_guild_member_role(input, context) {
153
+ return discordbotRequestNoContent({
154
+ method: "PUT",
155
+ path: `${memberPath(input)}/roles/${requiredPath(input.role_id, "role_id")}`,
156
+ auditLogReason: input.audit_log_reason,
157
+ context,
158
+ });
159
+ },
160
+ remove_guild_member_role(input, context) {
161
+ return discordbotRequestNoContent({
162
+ method: "DELETE",
163
+ path: `${memberPath(input)}/roles/${requiredPath(input.role_id, "role_id")}`,
164
+ auditLogReason: input.audit_log_reason,
165
+ context,
166
+ });
167
+ },
168
+ remove_guild_member(input, context) {
169
+ return discordbotRequestNoContent({
170
+ method: "DELETE",
171
+ path: memberPath(input),
172
+ auditLogReason: input.audit_log_reason,
173
+ context,
174
+ });
175
+ },
176
+ list_guild_bans(input, context) {
177
+ return discordbotRequestJson({
178
+ path: `${guildPath(input)}/bans`,
179
+ query: {
180
+ limit: optionalInteger(input.limit),
181
+ before: optionalString(input.before),
182
+ after: optionalString(input.after),
183
+ },
184
+ context,
185
+ }).then((bans) => ({ bans }));
186
+ },
187
+ get_guild_ban(input, context) {
188
+ return discordbotRequestJson({ path: banPath(input), context });
189
+ },
190
+ create_guild_ban(input, context) {
191
+ return discordbotRequestNoContent({
192
+ method: "PUT",
193
+ path: banPath(input),
194
+ body: jsonObject({ delete_message_seconds: optionalInteger(input.delete_message_seconds) }),
195
+ auditLogReason: input.audit_log_reason,
196
+ context,
197
+ });
198
+ },
199
+ remove_guild_ban(input, context) {
200
+ return discordbotRequestNoContent({
201
+ method: "DELETE",
202
+ path: banPath(input),
203
+ auditLogReason: input.audit_log_reason,
204
+ context,
205
+ });
206
+ },
207
+ bulk_guild_ban(input, context) {
208
+ const userIds = optionalStringArray(input.user_ids);
209
+ if (!userIds || userIds.length === 0) {
210
+ throw providerInputError("user_ids must be a non-empty array of user ids");
211
+ }
212
+ return discordbotRequestJson({
213
+ method: "POST",
214
+ path: `${guildPath(input)}/bulk-ban`,
215
+ body: jsonObject({
216
+ user_ids: userIds,
217
+ delete_message_seconds: optionalInteger(input.delete_message_seconds),
218
+ }),
219
+ auditLogReason: input.audit_log_reason,
220
+ context,
221
+ }).then((value) => {
222
+ const response = recordOrEmpty(value);
223
+ return { banned_users: looseArray(response.banned_users), failed_users: looseArray(response.failed_users) };
224
+ });
225
+ },
226
+ list_guild_roles(input, context) {
227
+ return discordbotRequestJson({ path: `${guildPath(input)}/roles`, context }).then((roles) => ({ roles }));
228
+ },
229
+ get_guild_role(input, context) {
230
+ return discordbotRequestJson({ path: rolePath(input), context });
231
+ },
232
+ get_guild_role_member_counts(input, context) {
233
+ return discordbotRequestJson({ path: `${guildPath(input)}/roles/member-counts`, context }).then((counts) => ({
234
+ member_counts: recordOrEmpty(counts),
235
+ }));
236
+ },
237
+ create_guild_role(input, context) {
238
+ return discordbotRequestJson({
239
+ method: "POST",
240
+ path: `${guildPath(input)}/roles`,
241
+ body: roleBody(input),
242
+ auditLogReason: input.audit_log_reason,
243
+ context,
244
+ });
245
+ },
246
+ modify_guild_role_positions(input, context) {
247
+ return discordbotRequestJson({
248
+ method: "PATCH",
249
+ path: `${guildPath(input)}/roles`,
250
+ body: requiredPositions(input.positions).map((position) => jsonObject({
251
+ id: requiredInputString(position.id, "positions[].id"),
252
+ position: nullableInteger(position.position),
253
+ })),
254
+ auditLogReason: input.audit_log_reason,
255
+ context,
256
+ }).then((roles) => ({ roles }));
257
+ },
258
+ modify_guild_role(input, context) {
259
+ return discordbotRequestJson({
260
+ method: "PATCH",
261
+ path: rolePath(input),
262
+ body: roleBody(input),
263
+ auditLogReason: input.audit_log_reason,
264
+ context,
265
+ });
266
+ },
267
+ delete_guild_role(input, context) {
268
+ return discordbotRequestNoContent({
269
+ method: "DELETE",
270
+ path: rolePath(input),
271
+ auditLogReason: input.audit_log_reason,
272
+ context,
273
+ });
274
+ },
275
+ get_guild_prune_count(input, context) {
276
+ return discordbotRequestJson({
277
+ path: `${guildPath(input)}/prune`,
278
+ query: {
279
+ days: optionalInteger(input.days),
280
+ include_roles: optionalStringArray(input.include_roles)?.join(","),
281
+ },
282
+ context,
283
+ });
284
+ },
285
+ begin_guild_prune(input, context) {
286
+ return discordbotRequestJson({
287
+ method: "POST",
288
+ path: `${guildPath(input)}/prune`,
289
+ body: jsonObject({
290
+ days: optionalInteger(input.days),
291
+ compute_prune_count: optionalBoolean(input.compute_prune_count),
292
+ include_roles: optionalStringArray(input.include_roles),
293
+ }),
294
+ auditLogReason: input.audit_log_reason,
295
+ context,
296
+ });
297
+ },
298
+ list_guild_voice_regions(input, context) {
299
+ return discordbotRequestJson({ path: `${guildPath(input)}/regions`, context }).then((regions) => ({ regions }));
300
+ },
301
+ list_guild_invites(input, context) {
302
+ return discordbotRequestJson({ path: `${guildPath(input)}/invites`, context }).then((invites) => ({ invites }));
303
+ },
304
+ list_guild_integrations(input, context) {
305
+ return discordbotRequestJson({ path: `${guildPath(input)}/integrations`, context }).then((integrations) => ({
306
+ integrations,
307
+ }));
308
+ },
309
+ delete_guild_integration(input, context) {
310
+ return discordbotRequestNoContent({
311
+ method: "DELETE",
312
+ path: `${guildPath(input)}/integrations/${requiredPath(input.integration_id, "integration_id")}`,
313
+ auditLogReason: input.audit_log_reason,
314
+ context,
315
+ });
316
+ },
317
+ get_guild_widget_settings(input, context) {
318
+ return discordbotRequestJson({ path: `${guildPath(input)}/widget`, context });
319
+ },
320
+ modify_guild_widget(input, context) {
321
+ return discordbotRequestJson({
322
+ method: "PATCH",
323
+ path: `${guildPath(input)}/widget`,
324
+ body: jsonObject({
325
+ enabled: optionalBoolean(input.enabled),
326
+ channel_id: nullableString(input.channel_id),
327
+ }),
328
+ auditLogReason: input.audit_log_reason,
329
+ context,
330
+ });
331
+ },
332
+ get_guild_widget(input, context) {
333
+ return discordbotRequestJson({ path: `${guildPath(input)}/widget.json`, context });
334
+ },
335
+ get_guild_vanity_url(input, context) {
336
+ return discordbotRequestJson({ path: `${guildPath(input)}/vanity-url`, context });
337
+ },
338
+ get_guild_widget_png(input, context) {
339
+ return getGuildWidgetPng(input, context);
340
+ },
341
+ get_guild_welcome_screen(input, context) {
342
+ return discordbotRequestJson({ path: `${guildPath(input)}/welcome-screen`, context });
343
+ },
344
+ modify_guild_welcome_screen(input, context) {
345
+ return discordbotRequestJson({
346
+ method: "PATCH",
347
+ path: `${guildPath(input)}/welcome-screen`,
348
+ body: jsonObject({
349
+ enabled: nullableBoolean(input.enabled),
350
+ welcome_channels: input.welcome_channels === null
351
+ ? null
352
+ : Array.isArray(input.welcome_channels)
353
+ ? input.welcome_channels
354
+ : undefined,
355
+ description: nullableRawString(input.description),
356
+ }),
357
+ auditLogReason: input.audit_log_reason,
358
+ context,
359
+ });
360
+ },
361
+ get_guild_onboarding(input, context) {
362
+ return discordbotRequestJson({ path: `${guildPath(input)}/onboarding`, context });
363
+ },
364
+ modify_guild_onboarding(input, context) {
365
+ return discordbotRequestJson({
366
+ method: "PUT",
367
+ path: `${guildPath(input)}/onboarding`,
368
+ body: jsonObject({
369
+ prompts: Array.isArray(input.prompts) ? input.prompts : undefined,
370
+ default_channel_ids: optionalStringArray(input.default_channel_ids),
371
+ enabled: optionalBoolean(input.enabled),
372
+ mode: optionalInteger(input.mode),
373
+ }),
374
+ auditLogReason: input.audit_log_reason,
375
+ context,
376
+ });
377
+ },
378
+ modify_guild_incident_actions(input, context) {
379
+ return discordbotRequestJson({
380
+ method: "PUT",
381
+ path: `${guildPath(input)}/incident-actions`,
382
+ body: jsonObject({
383
+ invites_disabled_until: nullableString(input.invites_disabled_until),
384
+ dms_disabled_until: nullableString(input.dms_disabled_until),
385
+ }),
386
+ context,
387
+ });
388
+ },
389
+ };
390
+ async function addGuildMember(input, context) {
391
+ // Discord answers 204 with no body when the user is already in the guild.
392
+ const member = await discordbotRequestJsonOrNull({
393
+ method: "PUT",
394
+ path: memberPath(input),
395
+ body: jsonObject({
396
+ access_token: requiredInputString(input.access_token, "access_token"),
397
+ nick: optionalRawString(input.nick),
398
+ roles: optionalStringArray(input.roles),
399
+ mute: optionalBoolean(input.mute),
400
+ deaf: optionalBoolean(input.deaf),
401
+ }),
402
+ context,
403
+ });
404
+ return { already_member: member === null, member };
405
+ }
406
+ async function getGuildWidgetPng(input, context) {
407
+ const guildId = requiredInputString(input.guild_id, "guild_id");
408
+ const response = await discordbotRequest({
409
+ path: `${guildPath(input)}/widget.png`,
410
+ query: { style: optionalString(input.style) },
411
+ context,
412
+ authenticated: false,
413
+ });
414
+ const buffer = Buffer.from(await response.arrayBuffer());
415
+ return {
416
+ filename: `discord-guild-${guildId}-widget-${optionalString(input.style) ?? "shield"}.png`,
417
+ mimeType: response.headers.get("content-type") ?? "image/png",
418
+ sizeBytes: buffer.byteLength,
419
+ dataBase64: buffer.toString("base64"),
420
+ };
421
+ }
422
+ /**
423
+ * Discord allows 4096 characters in the topic of a forum (15) or media (16) channel
424
+ * and 1024 in every other channel type, including the default text channel.
425
+ */
426
+ function channelTopic(input) {
427
+ const topic = optionalRawString(input.topic);
428
+ const type = optionalInteger(input.type);
429
+ if (topic !== undefined && type !== 15 && type !== 16 && [...topic].length > 1024) {
430
+ throw providerInputError("topic must be at most 1024 characters unless type is 15 (forum) or 16 (media)");
431
+ }
432
+ return topic;
433
+ }
434
+ function roleBody(input) {
435
+ return jsonObject({
436
+ name: optionalRawString(input.name),
437
+ permissions: optionalString(input.permissions),
438
+ color: optionalInteger(input.color),
439
+ colors: optionalRecord(input.colors),
440
+ hoist: optionalBoolean(input.hoist),
441
+ icon: nullableString(input.icon),
442
+ unicode_emoji: nullableString(input.unicode_emoji),
443
+ mentionable: optionalBoolean(input.mentionable),
444
+ });
445
+ }
446
+ function requiredPositions(value) {
447
+ const positions = objectArray(value, "positions", providerInputError);
448
+ if (positions.length === 0) {
449
+ throw providerInputError("positions must not be empty");
450
+ }
451
+ return positions;
452
+ }
453
+ function guildPath(input) {
454
+ return `/guilds/${requiredPath(input.guild_id, "guild_id")}`;
455
+ }
456
+ function memberPath(input) {
457
+ return `${guildPath(input)}/members/${requiredPath(input.user_id, "user_id")}`;
458
+ }
459
+ function banPath(input) {
460
+ return `${guildPath(input)}/bans/${requiredPath(input.user_id, "user_id")}`;
461
+ }
462
+ function rolePath(input) {
463
+ return `${guildPath(input)}/roles/${requiredPath(input.role_id, "role_id")}`;
464
+ }
@@ -0,0 +1,42 @@
1
+ export declare const discordProxyBaseUrl = "https://discord.com/api";
2
+ export interface DiscordbotContext {
3
+ apiKey: string;
4
+ fetcher: typeof fetch;
5
+ signal?: AbortSignal;
6
+ }
7
+ export type DiscordbotActionHandler = (input: Record<string, unknown>, context: DiscordbotContext) => Promise<unknown>;
8
+ interface DiscordbotRequestOptions {
9
+ method?: string;
10
+ path: string;
11
+ query?: Record<string, unknown>;
12
+ /** JSON body. Discord's position endpoints take a top-level array. */
13
+ body?: Record<string, unknown> | unknown[];
14
+ context: DiscordbotContext;
15
+ authenticated?: boolean;
16
+ skipError?: boolean;
17
+ /** Sent as `X-Audit-Log-Reason` on endpoints that record one. */
18
+ auditLogReason?: unknown;
19
+ }
20
+ /** Send a Discord request and parse the JSON response body. */
21
+ export declare function discordbotRequestJson(input: DiscordbotRequestOptions): Promise<unknown>;
22
+ /**
23
+ * Send a Discord request whose success may be 200 with a JSON body or 204 with none,
24
+ * returning null for the 204.
25
+ */
26
+ export declare function discordbotRequestJsonOrNull(input: DiscordbotRequestOptions): Promise<unknown>;
27
+ /** Send a Discord request that answers with 204 No Content. */
28
+ export declare function discordbotRequestNoContent(input: DiscordbotRequestOptions): Promise<{
29
+ success: true;
30
+ }>;
31
+ /** Send a Discord request, mapping non-2xx responses to provider errors unless `skipError` is set. */
32
+ export declare function discordbotRequest(input: DiscordbotRequestOptions): Promise<Response>;
33
+ /**
34
+ * Read a required snowflake input for use as one URL path segment. Only digits are
35
+ * accepted, because percent-encoding cannot keep an arbitrary id inside one segment:
36
+ * URL parsing resolves `.` and `..` as dot segments, and Discord decodes `%2F` into a
37
+ * path separator before routing. Either would send the request, with the same method
38
+ * and bot token, to another endpoint: `role_id: ".."` turns a role DELETE into one on
39
+ * the guild itself, and `user_id: "U/roles/R"` on Add Guild Member grants role R.
40
+ */
41
+ export declare function requiredPath(value: unknown, field: string): string;
42
+ export {};
@@ -0,0 +1,124 @@
1
+ import { looseArray, optionalRecord, optionalString, recordOrEmpty } from "../../core/cast.js";
2
+ import { jsonObject } from "../../core/request.js";
3
+ import { providerInputError, ProviderRequestError, requiredInputString } from "../provider-runtime.js";
4
+ // Pin actions to v10. An unversioned route goes to Discord's default version, which is
5
+ // still the deprecated v6: 31-bit numeric permissions, no threads, and a 204 without the
6
+ // member from Modify Guild Member.
7
+ const discordRestBaseUrl = "https://discord.com/api/v10";
8
+ // The proxy stays unversioned so existing proxy paths, including ones that already
9
+ // start with a version such as /v10, keep resolving as before.
10
+ export const discordProxyBaseUrl = "https://discord.com/api";
11
+ /** Send a Discord request and parse the JSON response body. */
12
+ export async function discordbotRequestJson(input) {
13
+ return readDiscordbotJson(await discordbotRequest(input));
14
+ }
15
+ /**
16
+ * Send a Discord request whose success may be 200 with a JSON body or 204 with none,
17
+ * returning null for the 204.
18
+ */
19
+ export async function discordbotRequestJsonOrNull(input) {
20
+ const response = await discordbotRequest(input);
21
+ return response.status === 204 ? null : readDiscordbotJson(response);
22
+ }
23
+ /** Send a Discord request that answers with 204 No Content. */
24
+ export async function discordbotRequestNoContent(input) {
25
+ await discordbotRequest(input);
26
+ return { success: true };
27
+ }
28
+ /** Send a Discord request, mapping non-2xx responses to provider errors unless `skipError` is set. */
29
+ export async function discordbotRequest(input) {
30
+ const url = new URL(`${discordRestBaseUrl}${input.path}`);
31
+ for (const [key, value] of Object.entries(input.query ?? {})) {
32
+ if (value !== undefined) {
33
+ url.searchParams.set(key, String(value));
34
+ }
35
+ }
36
+ const headers = new Headers();
37
+ if (input.authenticated !== false) {
38
+ headers.set("authorization", `Bot ${input.context.apiKey}`);
39
+ }
40
+ if (input.body !== undefined) {
41
+ headers.set("content-type", "application/json");
42
+ }
43
+ const auditLogReason = optionalString(input.auditLogReason);
44
+ if (auditLogReason) {
45
+ // Discord reads the header as URL-encoded UTF-8.
46
+ headers.set("x-audit-log-reason", encodeURIComponent(auditLogReason));
47
+ }
48
+ const response = await input.context.fetcher(url, {
49
+ method: input.method,
50
+ headers,
51
+ body: input.body === undefined ? undefined : JSON.stringify(input.body),
52
+ signal: input.context.signal,
53
+ });
54
+ if (!input.skipError && !response.ok) {
55
+ throw await toDiscordbotError(response);
56
+ }
57
+ return response;
58
+ }
59
+ /**
60
+ * Read a required snowflake input for use as one URL path segment. Only digits are
61
+ * accepted, because percent-encoding cannot keep an arbitrary id inside one segment:
62
+ * URL parsing resolves `.` and `..` as dot segments, and Discord decodes `%2F` into a
63
+ * path separator before routing. Either would send the request, with the same method
64
+ * and bot token, to another endpoint: `role_id: ".."` turns a role DELETE into one on
65
+ * the guild itself, and `user_id: "U/roles/R"` on Add Guild Member grants role R.
66
+ */
67
+ export function requiredPath(value, field) {
68
+ const segment = requiredInputString(value, field);
69
+ if (!/^\d+$/.test(segment)) {
70
+ throw providerInputError(`${field} must be a numeric Discord snowflake id`);
71
+ }
72
+ return segment;
73
+ }
74
+ async function readDiscordbotJson(response) {
75
+ try {
76
+ return (await response.json());
77
+ }
78
+ catch {
79
+ throw new ProviderRequestError(502, "Discord returned invalid JSON");
80
+ }
81
+ }
82
+ async function toDiscordbotError(response) {
83
+ const text = await response.text().catch(() => "");
84
+ let payload;
85
+ try {
86
+ payload = optionalRecord(JSON.parse(text));
87
+ }
88
+ catch { }
89
+ const message = optionalString(payload?.message) ??
90
+ optionalString(payload?.error_description) ??
91
+ optionalString(payload?.error) ??
92
+ text;
93
+ // A form error's message is only "Invalid Form Body"; the failing fields are in `errors`.
94
+ const formErrors = collectDiscordbotFormErrors(payload?.errors, "");
95
+ const resolvedMessage = formErrors.length > 0
96
+ ? `${message}: ${formErrors.join("; ")}`
97
+ : message || `Discord request failed with ${response.status}`;
98
+ const details = payload
99
+ ? jsonObject({ code: payload.code, errors: payload.errors, retry_after: payload.retry_after })
100
+ : undefined;
101
+ // Discord answers 403 when the bot lacks a guild or channel permission, such as
102
+ // "Missing Permissions" or "Missing Access". The token still works, so this must
103
+ // not read as authorization_failed, which clients treat as "reconnect".
104
+ if (response.status === 403) {
105
+ return new ProviderRequestError(403, resolvedMessage, details, "invalid_input");
106
+ }
107
+ return new ProviderRequestError(response.status, resolvedMessage, details);
108
+ }
109
+ /**
110
+ * Flatten Discord's form errors into `path: message` entries. Each failing JSON key,
111
+ * or array index, nests down to an `_errors` list of `{ code, message }`; an `_errors`
112
+ * list at the top level describes the request as a whole and has no path.
113
+ */
114
+ function collectDiscordbotFormErrors(errors, path) {
115
+ return Object.entries(recordOrEmpty(errors)).flatMap(([key, value]) => {
116
+ if (key !== "_errors") {
117
+ return collectDiscordbotFormErrors(value, path ? `${path}.${key}` : key);
118
+ }
119
+ return looseArray(value).flatMap((item) => {
120
+ const message = optionalString(optionalRecord(item)?.message);
121
+ return message ? [path ? `${path}: ${message}` : message] : [];
122
+ });
123
+ });
124
+ }
@@ -0,0 +1,3 @@
1
+ import type { CredentialValidators, ProviderExecutors } from "../../core/types.ts";
2
+ export declare const executors: ProviderExecutors;
3
+ export declare const credentialValidators: CredentialValidators;
@@ -0,0 +1,19 @@
1
+ import { isPrivateNetworkAccessAllowed } from "../../core/request.js";
2
+ import { createProviderFetch, defineProviderExecutors, requireCustomCredential } from "../provider-runtime.js";
3
+ import { createDrawioMcpContext, drawioMcpActionHandlers, validateDrawioMcpCredential } from "./runtime.js";
4
+ const service = "drawio_mcp";
5
+ export const executors = defineProviderExecutors({
6
+ service,
7
+ handlers: drawioMcpActionHandlers,
8
+ async createContext(context, fetcher) {
9
+ const credential = await requireCustomCredential(context, service);
10
+ return createDrawioMcpContext(credential.values, fetcher, context.signal);
11
+ },
12
+ allowPrivateNetwork: isPrivateNetworkAccessAllowed,
13
+ });
14
+ export const credentialValidators = {
15
+ customCredential(input, { fetcher, signal }) {
16
+ const guardedFetcher = createProviderFetch({ fetch: fetcher, allowPrivateNetwork: isPrivateNetworkAccessAllowed });
17
+ return validateDrawioMcpCredential(input.values, guardedFetcher, signal);
18
+ },
19
+ };
@@ -0,0 +1,8 @@
1
+ import type { CredentialValidationResult } from "../../core/types.ts";
2
+ import type { McpToolOptions } from "../mcp-tools.ts";
3
+ import type { ProviderActionHandlers, ProviderFetch, ProviderRuntimeHandler } from "../provider-runtime.ts";
4
+ export declare const drawioMcpActionHandlers: ProviderActionHandlers<"drawio_mcp", ProviderRuntimeHandler<McpToolOptions>>;
5
+ /** Resolve the MCP server a connection points at; a blank endpoint selects the hosted draw.io server. */
6
+ export declare function createDrawioMcpContext(values: Record<string, string>, fetcher: ProviderFetch, signal?: AbortSignal): McpToolOptions;
7
+ /** Confirm the endpoint serves the draw.io tools and derive a stable identity from the endpoint. */
8
+ export declare function validateDrawioMcpCredential(values: Record<string, string>, fetcher: ProviderFetch, signal?: AbortSignal): Promise<CredentialValidationResult>;