agor-live 0.23.1 → 0.23.2

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 (469) hide show
  1. package/dist/core/claude/index.cjs +51 -27
  2. package/dist/core/claude/index.js +51 -27
  3. package/dist/core/claude-cli/index.cjs +13 -0
  4. package/dist/core/claude-cli/index.js +13 -0
  5. package/dist/core/claude-cli/pricing.d.ts.map +1 -1
  6. package/dist/core/client/index.cjs +17 -0
  7. package/dist/core/client/index.js +16 -0
  8. package/dist/core/db/index.cjs +618 -421
  9. package/dist/core/db/index.js +550 -353
  10. package/dist/core/db/repositories/boards.d.ts +27 -0
  11. package/dist/core/db/repositories/boards.d.ts.map +1 -1
  12. package/dist/core/db/repositories/branches.d.ts +11 -1
  13. package/dist/core/db/repositories/branches.d.ts.map +1 -1
  14. package/dist/core/db/repositories/gateway-channels.d.ts +9 -0
  15. package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
  16. package/dist/core/db/repositories/sessions.d.ts +7 -0
  17. package/dist/core/db/repositories/sessions.d.ts.map +1 -1
  18. package/dist/core/environment/render-snapshot.cjs +6 -2
  19. package/dist/core/environment/render-snapshot.d.ts +2 -0
  20. package/dist/core/environment/render-snapshot.d.ts.map +1 -1
  21. package/dist/core/environment/render-snapshot.js +6 -2
  22. package/dist/core/environment/variable-resolver.cjs +3 -1
  23. package/dist/core/environment/variable-resolver.js +3 -1
  24. package/dist/core/index.cjs +684 -486
  25. package/dist/core/index.js +684 -486
  26. package/dist/core/lib/feathers-validation.cjs +3 -0
  27. package/dist/core/lib/feathers-validation.d.ts +1 -0
  28. package/dist/core/lib/feathers-validation.d.ts.map +1 -1
  29. package/dist/core/lib/feathers-validation.js +3 -0
  30. package/dist/core/local-actions/index.cjs +123 -56
  31. package/dist/core/local-actions/index.js +121 -54
  32. package/dist/core/mcp/index.cjs +21 -3
  33. package/dist/core/mcp/index.d.ts +1 -1
  34. package/dist/core/mcp/index.d.ts.map +1 -1
  35. package/dist/core/mcp/index.js +18 -3
  36. package/dist/core/mcp/template-patterns.d.ts +15 -0
  37. package/dist/core/mcp/template-patterns.d.ts.map +1 -0
  38. package/dist/core/mcp/template-resolver.d.ts +13 -0
  39. package/dist/core/mcp/template-resolver.d.ts.map +1 -1
  40. package/dist/core/models/browser.cjs +6 -0
  41. package/dist/core/models/browser.js +6 -0
  42. package/dist/core/models/claude.d.ts.map +1 -1
  43. package/dist/core/models/index.cjs +6 -0
  44. package/dist/core/models/index.js +6 -0
  45. package/dist/core/seed/index.cjs +360 -216
  46. package/dist/core/seed/index.js +329 -185
  47. package/dist/core/templates/handlebars-helpers.cjs +3 -1
  48. package/dist/core/templates/handlebars-helpers.d.ts +5 -0
  49. package/dist/core/templates/handlebars-helpers.d.ts.map +1 -1
  50. package/dist/core/templates/handlebars-helpers.js +3 -1
  51. package/dist/core/tools/mcp/auth-secrets.cjs +3460 -3
  52. package/dist/core/tools/mcp/auth-secrets.d.ts.map +1 -1
  53. package/dist/core/tools/mcp/auth-secrets.js +3477 -3
  54. package/dist/core/tools/mcp/http-headers.cjs +17 -1
  55. package/dist/core/tools/mcp/http-headers.d.ts.map +1 -1
  56. package/dist/core/tools/mcp/http-headers.js +15 -1
  57. package/dist/core/tools/mcp/oauth-refresh.cjs +67 -43
  58. package/dist/core/tools/mcp/oauth-refresh.js +65 -41
  59. package/dist/core/types/board.d.ts +12 -0
  60. package/dist/core/types/board.d.ts.map +1 -1
  61. package/dist/core/types/gateway.d.ts +14 -0
  62. package/dist/core/types/gateway.d.ts.map +1 -1
  63. package/dist/core/types/index.cjs +17 -0
  64. package/dist/core/types/index.js +16 -0
  65. package/dist/core/unix/index.cjs +67 -0
  66. package/dist/core/unix/index.js +67 -0
  67. package/dist/daemon/auth/executor-runtime-scope.d.ts.map +1 -1
  68. package/dist/daemon/auth/executor-runtime-scope.js +19 -5
  69. package/dist/daemon/auth/executor-session-token.d.ts +15 -0
  70. package/dist/daemon/auth/executor-session-token.d.ts.map +1 -0
  71. package/dist/daemon/auth/executor-session-token.js +17 -0
  72. package/dist/daemon/auth/issue-browser-tokens-hook.d.ts +24 -0
  73. package/dist/daemon/auth/issue-browser-tokens-hook.d.ts.map +1 -0
  74. package/dist/daemon/auth/issue-browser-tokens-hook.js +95 -0
  75. package/dist/daemon/auth/service-jwt-strategy.d.ts.map +1 -1
  76. package/dist/daemon/auth/service-jwt-strategy.js +14 -2
  77. package/dist/daemon/declarations.d.ts +1 -0
  78. package/dist/daemon/declarations.d.ts.map +1 -1
  79. package/dist/daemon/index.js +1365 -418
  80. package/dist/daemon/main.js +1365 -418
  81. package/dist/daemon/mcp/server.js +294 -31
  82. package/dist/daemon/mcp/tools/analytics.js +73 -24
  83. package/dist/daemon/mcp/tools/artifacts.js +73 -24
  84. package/dist/daemon/mcp/tools/boards.js +73 -24
  85. package/dist/daemon/mcp/tools/branches.js +73 -24
  86. package/dist/daemon/mcp/tools/card-types.js +73 -24
  87. package/dist/daemon/mcp/tools/cards.js +73 -24
  88. package/dist/daemon/mcp/tools/environment.js +73 -24
  89. package/dist/daemon/mcp/tools/gateway-channels.d.ts.map +1 -1
  90. package/dist/daemon/mcp/tools/gateway-channels.js +190 -38
  91. package/dist/daemon/mcp/tools/knowledge.js +73 -24
  92. package/dist/daemon/mcp/tools/mcp-servers.js +73 -24
  93. package/dist/daemon/mcp/tools/messages.js +73 -24
  94. package/dist/daemon/mcp/tools/proxies.js +73 -24
  95. package/dist/daemon/mcp/tools/repos.js +73 -24
  96. package/dist/daemon/mcp/tools/schedules.js +73 -24
  97. package/dist/daemon/mcp/tools/search.js +73 -24
  98. package/dist/daemon/mcp/tools/sessions.js +73 -24
  99. package/dist/daemon/mcp/tools/tasks.js +73 -24
  100. package/dist/daemon/mcp/tools/users.js +76 -27
  101. package/dist/daemon/mcp/tools/widgets.d.ts.map +1 -1
  102. package/dist/daemon/mcp/tools/widgets.js +257 -99
  103. package/dist/daemon/oauth-auth-helpers.d.ts +35 -0
  104. package/dist/daemon/oauth-auth-helpers.d.ts.map +1 -0
  105. package/dist/daemon/oauth-auth-helpers.js +14 -0
  106. package/dist/daemon/register-hooks.d.ts +1 -0
  107. package/dist/daemon/register-hooks.d.ts.map +1 -1
  108. package/dist/daemon/register-hooks.js +304 -53
  109. package/dist/daemon/register-routes.d.ts.map +1 -1
  110. package/dist/daemon/register-routes.js +738 -288
  111. package/dist/daemon/register-services.d.ts.map +1 -1
  112. package/dist/daemon/register-services.js +386 -155
  113. package/dist/daemon/services/boards.d.ts +5 -0
  114. package/dist/daemon/services/boards.d.ts.map +1 -1
  115. package/dist/daemon/services/boards.js +7 -0
  116. package/dist/daemon/services/branches.d.ts.map +1 -1
  117. package/dist/daemon/services/branches.js +31 -2
  118. package/dist/daemon/services/claude-models.d.ts.map +1 -1
  119. package/dist/daemon/services/claude-models.js +4 -1
  120. package/dist/daemon/services/gateway.d.ts +15 -0
  121. package/dist/daemon/services/gateway.d.ts.map +1 -1
  122. package/dist/daemon/services/gateway.js +34 -0
  123. package/dist/daemon/services/health-monitor.d.ts.map +1 -1
  124. package/dist/daemon/services/health-monitor.js +10 -7
  125. package/dist/daemon/services/session-streams.d.ts +29 -0
  126. package/dist/daemon/services/session-streams.d.ts.map +1 -0
  127. package/dist/daemon/services/session-streams.js +84 -0
  128. package/dist/daemon/services/session-token-service.d.ts.map +1 -1
  129. package/dist/daemon/services/session-token-service.js +8 -4
  130. package/dist/daemon/setup/index.js +43 -11
  131. package/dist/daemon/setup/socketio.d.ts.map +1 -1
  132. package/dist/daemon/setup/socketio.js +43 -11
  133. package/dist/daemon/startup.d.ts.map +1 -1
  134. package/dist/daemon/startup.js +37 -16
  135. package/dist/daemon/utils/authorization.js +19 -5
  136. package/dist/daemon/utils/emit-service-event.d.ts +56 -0
  137. package/dist/daemon/utils/emit-service-event.d.ts.map +1 -0
  138. package/dist/daemon/utils/emit-service-event.js +23 -0
  139. package/dist/daemon/utils/mcp-header-secrets.d.ts +3 -5
  140. package/dist/daemon/utils/mcp-header-secrets.d.ts.map +1 -1
  141. package/dist/daemon/utils/mcp-header-secrets.js +31 -2
  142. package/dist/daemon/utils/realtime-access-cache.d.ts +9 -0
  143. package/dist/daemon/utils/realtime-access-cache.d.ts.map +1 -1
  144. package/dist/daemon/utils/realtime-access-cache.js +24 -0
  145. package/dist/daemon/utils/realtime-publish.d.ts +24 -0
  146. package/dist/daemon/utils/realtime-publish.d.ts.map +1 -1
  147. package/dist/daemon/utils/realtime-publish.js +120 -2
  148. package/dist/daemon/utils/session-queue-tenant-scope.d.ts +24 -0
  149. package/dist/daemon/utils/session-queue-tenant-scope.d.ts.map +1 -0
  150. package/dist/daemon/utils/session-queue-tenant-scope.js +133 -0
  151. package/dist/daemon/widgets/gateway-token/index.d.ts +114 -0
  152. package/dist/daemon/widgets/gateway-token/index.d.ts.map +1 -0
  153. package/dist/daemon/widgets/gateway-token/index.js +14711 -0
  154. package/dist/daemon/widgets/index.d.ts.map +1 -1
  155. package/dist/daemon/widgets/index.js +190 -16
  156. package/dist/daemon/widgets/registry.d.ts +7 -0
  157. package/dist/daemon/widgets/registry.d.ts.map +1 -1
  158. package/dist/daemon/widgets/submissions.js +12 -9
  159. package/dist/executor/commands/git.d.ts.map +1 -1
  160. package/dist/executor/commands/git.js +2 -0
  161. package/dist/executor/db/feathers-repositories.d.ts +19 -1
  162. package/dist/executor/db/feathers-repositories.d.ts.map +1 -1
  163. package/dist/executor/db/feathers-repositories.js +31 -1
  164. package/dist/executor/handlers/sdk/claude.d.ts.map +1 -1
  165. package/dist/executor/handlers/sdk/claude.js +1 -1
  166. package/dist/executor/handlers/sdk/codex.d.ts.map +1 -1
  167. package/dist/executor/handlers/sdk/codex.js +1 -1
  168. package/dist/executor/handlers/sdk/copilot.d.ts.map +1 -1
  169. package/dist/executor/handlers/sdk/copilot.js +1 -1
  170. package/dist/executor/handlers/sdk/cursor.d.ts.map +1 -1
  171. package/dist/executor/handlers/sdk/cursor.js +1 -0
  172. package/dist/executor/handlers/sdk/gemini.d.ts.map +1 -1
  173. package/dist/executor/handlers/sdk/gemini.js +1 -1
  174. package/dist/executor/handlers/sdk/opencode.d.ts.map +1 -1
  175. package/dist/executor/handlers/sdk/opencode.js +1 -1
  176. package/dist/executor/payload-types.d.ts +5 -5
  177. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts +8 -1
  178. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +1 -1
  179. package/dist/executor/sdk-handlers/base/mcp-scoping.js +58 -6
  180. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +2 -2
  181. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
  182. package/dist/executor/sdk-handlers/claude/claude-tool.js +2 -2
  183. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +13 -3
  184. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +1 -1
  185. package/dist/executor/sdk-handlers/claude/prompt-service.js +16 -3
  186. package/dist/executor/sdk-handlers/claude/query-builder.d.ts +2 -1
  187. package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
  188. package/dist/executor/sdk-handlers/claude/query-builder.js +2 -1
  189. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +2 -2
  190. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +1 -1
  191. package/dist/executor/sdk-handlers/codex/codex-tool.js +2 -2
  192. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +3 -2
  193. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
  194. package/dist/executor/sdk-handlers/codex/prompt-service.js +70 -6
  195. package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts +2 -2
  196. package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts.map +1 -1
  197. package/dist/executor/sdk-handlers/copilot/copilot-tool.js +2 -2
  198. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts +3 -2
  199. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts.map +1 -1
  200. package/dist/executor/sdk-handlers/copilot/prompt-service.js +4 -1
  201. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts +2 -2
  202. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts.map +1 -1
  203. package/dist/executor/sdk-handlers/gemini/gemini-tool.js +2 -2
  204. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +3 -2
  205. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +1 -1
  206. package/dist/executor/sdk-handlers/gemini/prompt-service.js +4 -1
  207. package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts +3 -2
  208. package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts.map +1 -1
  209. package/dist/executor/sdk-handlers/opencode/opencode-tool.js +4 -1
  210. package/dist/executor/services/feathers-client.d.ts.map +1 -1
  211. package/dist/executor/services/feathers-client.js +119 -20
  212. package/dist/ui/assets/AgorEmojiPickerInner-leeNywMc.js +1 -0
  213. package/dist/ui/assets/App-Dpl4Cc0U.js +4 -0
  214. package/dist/ui/assets/App-Dpl4Cc0U.js.gz +0 -0
  215. package/dist/ui/assets/AppNode-wN3UZlFK.js +1 -0
  216. package/dist/ui/assets/AppNode-wN3UZlFK.js.gz +0 -0
  217. package/dist/ui/assets/{ArtifactConsentModal-oMMzRn8L.js → ArtifactConsentModal-DjzXcP_L.js} +1 -1
  218. package/dist/ui/assets/ArtifactConsentModal-DjzXcP_L.js.gz +0 -0
  219. package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js +9 -0
  220. package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js.gz +0 -0
  221. package/dist/ui/assets/ArtifactNode-DISy2T-6.js +9 -0
  222. package/dist/ui/assets/ArtifactNode-DISy2T-6.js.gz +0 -0
  223. package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js +19 -0
  224. package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js.gz +0 -0
  225. package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js +34 -0
  226. package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js.gz +0 -0
  227. package/dist/ui/assets/{CodeEditor.inner-Cuj6RuLL.js → CodeEditor.inner-HmSdTLW5.js} +1 -1
  228. package/dist/ui/assets/CodeEditor.inner-HmSdTLW5.js.gz +0 -0
  229. package/dist/ui/assets/ConversationView-mWaA-B1f.js +1 -0
  230. package/dist/ui/assets/ConversationView-mWaA-B1f.js.gz +0 -0
  231. package/dist/ui/assets/{EmbeddedTerminal-Lx5I9EOJ.js → EmbeddedTerminal-NNoyPA81.js} +1 -1
  232. package/dist/ui/assets/EmbeddedTerminal-NNoyPA81.js.gz +0 -0
  233. package/dist/ui/assets/KnowledgePage-CkxVnRvz.js +24 -0
  234. package/dist/ui/assets/KnowledgePage-CkxVnRvz.js.gz +0 -0
  235. package/dist/ui/assets/{MarketingScreenshotPage-CmDPBHOl.js → MarketingScreenshotPage-B86Gs8jx.js} +2 -2
  236. package/dist/ui/assets/MarketingScreenshotPage-B86Gs8jx.js.gz +0 -0
  237. package/dist/ui/assets/MobileApp-BPs-SXvz.js +1 -0
  238. package/dist/ui/assets/MobileApp-BPs-SXvz.js.gz +0 -0
  239. package/dist/ui/assets/SessionCanvas-xVfDoEtz.js +13 -0
  240. package/dist/ui/assets/SessionCanvas-xVfDoEtz.js.gz +0 -0
  241. package/dist/ui/assets/{StreamdownDemoPage-okKKR2QH.js → StreamdownDemoPage-CvWLzVsv.js} +2 -2
  242. package/dist/ui/assets/StreamdownDemoPage-CvWLzVsv.js.gz +0 -0
  243. package/dist/ui/assets/{TerminalModal-D9jMGZXv.js → TerminalModal-ExOgsuOP.js} +2 -2
  244. package/dist/ui/assets/TerminalModal-ExOgsuOP.js.gz +0 -0
  245. package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js +1 -0
  246. package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js.gz +0 -0
  247. package/dist/ui/assets/{ThemedSyntaxHighlighter.inner-C1FdIHn0.js → ThemedSyntaxHighlighter.inner-rpCN9S6K.js} +1 -1
  248. package/dist/ui/assets/{antd-DT5ackd0.js → antd-BCqimh1J.js} +5 -5
  249. package/dist/ui/assets/{antd-DT5ackd0.js.gz → antd-BCqimh1J.js.gz} +0 -0
  250. package/dist/ui/assets/architecture-U656AL7Q-BxSQIjrE.js +1 -0
  251. package/dist/ui/assets/{architectureDiagram-VXUJARFQ-DwTJGGoj.js → architectureDiagram-VXUJARFQ-pDpGHSqT.js} +1 -1
  252. package/dist/ui/assets/architectureDiagram-VXUJARFQ-pDpGHSqT.js.gz +0 -0
  253. package/dist/ui/assets/{blockDiagram-VD42YOAC-Dh1_TVW2.js → blockDiagram-VD42YOAC-uP8JTJpK.js} +1 -1
  254. package/dist/ui/assets/blockDiagram-VD42YOAC-uP8JTJpK.js.gz +0 -0
  255. package/dist/ui/assets/{c4Diagram-YG6GDRKO-B1e96AcB.js → c4Diagram-YG6GDRKO-qQe72Mm7.js} +1 -1
  256. package/dist/ui/assets/c4Diagram-YG6GDRKO-qQe72Mm7.js.gz +0 -0
  257. package/dist/ui/assets/channel-CoUBs6Zn.js +1 -0
  258. package/dist/ui/assets/{chunk-4BX2VUAB-BODpCjJx.js → chunk-4BX2VUAB-sz-YE8Nt.js} +1 -1
  259. package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js +3 -0
  260. package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js.gz +0 -0
  261. package/dist/ui/assets/chunk-55IACEB6-BS04dgKF.js +1 -0
  262. package/dist/ui/assets/{chunk-ABZYJK2D-DCTXWSzV.js → chunk-ABZYJK2D-t3Gkphds.js} +3 -3
  263. package/dist/ui/assets/chunk-ABZYJK2D-t3Gkphds.js.gz +0 -0
  264. package/dist/ui/assets/{chunk-AGHRB4JF-CbNphBjE.js → chunk-AGHRB4JF-D_QmWxbY.js} +1 -1
  265. package/dist/ui/assets/chunk-AGHRB4JF-D_QmWxbY.js.gz +0 -0
  266. package/dist/ui/assets/{chunk-ATLVNIR6-rWg3qxof.js → chunk-ATLVNIR6-Bmg7-Ufz.js} +1 -1
  267. package/dist/ui/assets/chunk-ATLVNIR6-Bmg7-Ufz.js.gz +0 -0
  268. package/dist/ui/assets/{chunk-B4BG7PRW-CgtLCbpE.js → chunk-B4BG7PRW-dnSEE1u-.js} +1 -1
  269. package/dist/ui/assets/chunk-B4BG7PRW-dnSEE1u-.js.gz +0 -0
  270. package/dist/ui/assets/{chunk-CVBHYZKI-DTL6Zgr0.js → chunk-CVBHYZKI-BStaYnF0.js} +1 -1
  271. package/dist/ui/assets/{chunk-DI55MBZ5-Dwvx2Kva.js → chunk-DI55MBZ5-28dvx6o3.js} +1 -1
  272. package/dist/ui/assets/chunk-DI55MBZ5-28dvx6o3.js.gz +0 -0
  273. package/dist/ui/assets/chunk-EXTU4WIE-X-FURkEh.js +1 -0
  274. package/dist/ui/assets/{chunk-FMBD7UC4-BogA_9CV.js → chunk-FMBD7UC4-C_63gC9S.js} +1 -1
  275. package/dist/ui/assets/{chunk-HN2XXSSU-2blQO3Gb.js → chunk-HN2XXSSU-UFD374KI.js} +1 -1
  276. package/dist/ui/assets/chunk-HN2XXSSU-UFD374KI.js.gz +0 -0
  277. package/dist/ui/assets/{chunk-JA3XYJ7Z-Cr1rmOui.js → chunk-JA3XYJ7Z-B60hLNeR.js} +1 -1
  278. package/dist/ui/assets/chunk-JA3XYJ7Z-B60hLNeR.js.gz +0 -0
  279. package/dist/ui/assets/{chunk-JZLCHNYA-BsgZ79Fa.js → chunk-JZLCHNYA-ButC6pwN.js} +1 -1
  280. package/dist/ui/assets/chunk-JZLCHNYA-ButC6pwN.js.gz +0 -0
  281. package/dist/ui/assets/{chunk-MI3HLSF2-dwYeUy5S.js → chunk-MI3HLSF2-BivYzoSV.js} +1 -1
  282. package/dist/ui/assets/chunk-MI3HLSF2-BivYzoSV.js.gz +0 -0
  283. package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js +2 -0
  284. package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js.gz +0 -0
  285. package/dist/ui/assets/{chunk-QN33PNHL-DxdIDCAa.js → chunk-QN33PNHL-tXtHZpaG.js} +1 -1
  286. package/dist/ui/assets/{chunk-QXUST7PY-BCK2V0i-.js → chunk-QXUST7PY-DATib_Vv.js} +1 -1
  287. package/dist/ui/assets/chunk-QXUST7PY-DATib_Vv.js.gz +0 -0
  288. package/dist/ui/assets/chunk-QZHKN3VN-y6l249e5.js +1 -0
  289. package/dist/ui/assets/{chunk-S3R3BYOJ-GP3zIxrB.js → chunk-S3R3BYOJ-BEtfmflI.js} +1 -1
  290. package/dist/ui/assets/chunk-S3R3BYOJ-BEtfmflI.js.gz +0 -0
  291. package/dist/ui/assets/{chunk-TZMSLE5B-dX5RaM6g.js → chunk-TZMSLE5B-BY1ZtogK.js} +1 -1
  292. package/dist/ui/assets/chunk-TZMSLE5B-BY1ZtogK.js.gz +0 -0
  293. package/dist/ui/assets/classDiagram-2ON5EDUG-BYvq-uPY.js +1 -0
  294. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BYvq-uPY.js +1 -0
  295. package/dist/ui/assets/constants-CYzQKfD1.js +1 -0
  296. package/dist/ui/assets/{cose-bilkent-S5V4N54A-Dx0BJVDl.js → cose-bilkent-S5V4N54A-DPvYrqGG.js} +1 -1
  297. package/dist/ui/assets/cose-bilkent-S5V4N54A-DPvYrqGG.js.gz +0 -0
  298. package/dist/ui/assets/{dagre-6UL2VRFP-DiQSUxqN.js → dagre-6UL2VRFP-D800J6qb.js} +1 -1
  299. package/dist/ui/assets/dagre-6UL2VRFP-D800J6qb.js.gz +0 -0
  300. package/dist/ui/assets/{dagre-Bekd9Vdj.js → dagre-TNc4wezg.js} +1 -1
  301. package/dist/ui/assets/dagre-TNc4wezg.js.gz +0 -0
  302. package/dist/ui/assets/{diagram-PSM6KHXK-DtJnDQjc.js → diagram-PSM6KHXK-CGdP9F-X.js} +1 -1
  303. package/dist/ui/assets/diagram-PSM6KHXK-CGdP9F-X.js.gz +0 -0
  304. package/dist/ui/assets/{diagram-QEK2KX5R-CobkCRdj.js → diagram-QEK2KX5R-BD5lOCe5.js} +1 -1
  305. package/dist/ui/assets/diagram-QEK2KX5R-BD5lOCe5.js.gz +0 -0
  306. package/dist/ui/assets/{diagram-S2PKOQOG-DHEZYivc.js → diagram-S2PKOQOG-cp3l22vN.js} +1 -1
  307. package/dist/ui/assets/diagram-S2PKOQOG-cp3l22vN.js.gz +0 -0
  308. package/dist/ui/assets/editor-Cr0W5BQI.js +39 -0
  309. package/dist/ui/assets/editor-Cr0W5BQI.js.gz +0 -0
  310. package/dist/ui/assets/{emoji-B0hLmSLZ.js → emoji-Bv3m24sO.js} +1 -1
  311. package/dist/ui/assets/emoji-Bv3m24sO.js.gz +0 -0
  312. package/dist/ui/assets/{erDiagram-Q2GNP2WA-BVNeTZPQ.js → erDiagram-Q2GNP2WA-CQSXRgqr.js} +1 -1
  313. package/dist/ui/assets/erDiagram-Q2GNP2WA-CQSXRgqr.js.gz +0 -0
  314. package/dist/ui/assets/{flowDiagram-NV44I4VS-C73VFdyk.js → flowDiagram-NV44I4VS-CKcKpkph.js} +1 -1
  315. package/dist/ui/assets/flowDiagram-NV44I4VS-CKcKpkph.js.gz +0 -0
  316. package/dist/ui/assets/{ganttDiagram-LVOFAZNH-B_RosuD1.js → ganttDiagram-LVOFAZNH-DlAHzXO5.js} +1 -1
  317. package/dist/ui/assets/ganttDiagram-LVOFAZNH-DlAHzXO5.js.gz +0 -0
  318. package/dist/ui/assets/{gitGraph-F6HP7TQM-DMFIqn4h.js → gitGraph-F6HP7TQM-DeuXy4B1.js} +1 -1
  319. package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-hxbgwNA1.js → gitGraphDiagram-NY62KEGX-aB-AI4Vq.js} +1 -1
  320. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-aB-AI4Vq.js.gz +0 -0
  321. package/dist/ui/assets/index-B-qHc0o5.js +63 -0
  322. package/dist/ui/assets/index-B-qHc0o5.js.gz +0 -0
  323. package/dist/ui/assets/{info-NVLQJR56-DZ3K-w48.js → info-NVLQJR56-B9PG7xsc.js} +1 -1
  324. package/dist/ui/assets/{infoDiagram-ER5ION4S-CxnBJQu6.js → infoDiagram-ER5ION4S-C5Wpoqim.js} +1 -1
  325. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CHYNj-f8.js → journeyDiagram-XKPGCS4Q-CHLziqfS.js} +1 -1
  326. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHLziqfS.js.gz +0 -0
  327. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-DQPCCsj2.js → kanban-definition-3W4ZIXB7-Dq7GzQE_.js} +1 -1
  328. package/dist/ui/assets/kanban-definition-3W4ZIXB7-Dq7GzQE_.js.gz +0 -0
  329. package/dist/ui/assets/{line-DBRjKmfa.js → line-DHKNg83I.js} +1 -1
  330. package/dist/ui/assets/{linear-DFao5Wyp.js → linear-BvUfn0I8.js} +1 -1
  331. package/dist/ui/assets/linear-BvUfn0I8.js.gz +0 -0
  332. package/dist/ui/assets/{mermaid-parser.core-DYCfacHj.js → mermaid-parser.core-C6d9tKoo.js} +2 -2
  333. package/dist/ui/assets/mermaid-parser.core-C6d9tKoo.js.gz +0 -0
  334. package/dist/ui/assets/{mermaid.core-C6xGFSdE.js → mermaid.core-CxE5KezR.js} +3 -3
  335. package/dist/ui/assets/mermaid.core-CxE5KezR.js.gz +0 -0
  336. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-L3Pw-YM7.js → mindmap-definition-VGOIOE7T-DmPoQ48w.js} +1 -1
  337. package/dist/ui/assets/mindmap-definition-VGOIOE7T-DmPoQ48w.js.gz +0 -0
  338. package/dist/ui/assets/{packet-BFZMPI3H-CpL6iNoa.js → packet-BFZMPI3H-JZEkVZxU.js} +1 -1
  339. package/dist/ui/assets/{particles-CT8hcJOA.js → particles-CxMmUw86.js} +1 -1
  340. package/dist/ui/assets/particles-CxMmUw86.js.gz +0 -0
  341. package/dist/ui/assets/{pie-7BOR55EZ-hTqChbTo.js → pie-7BOR55EZ-_1II5pYQ.js} +1 -1
  342. package/dist/ui/assets/{pieDiagram-ADFJNKIX-Bf4Nou75.js → pieDiagram-ADFJNKIX-DrNkH33i.js} +1 -1
  343. package/dist/ui/assets/pieDiagram-ADFJNKIX-DrNkH33i.js.gz +0 -0
  344. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-DpjUTLB1.js → quadrantDiagram-AYHSOK5B-DOpC-HEF.js} +1 -1
  345. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DOpC-HEF.js.gz +0 -0
  346. package/dist/ui/assets/{radar-NHE76QYJ-myy7OENC.js → radar-NHE76QYJ-DDmqhzEZ.js} +1 -1
  347. package/dist/ui/assets/{reactflow-Cubtnk8i.js → reactflow-D98uPOMq.js} +1 -1
  348. package/dist/ui/assets/reactflow-D98uPOMq.js.gz +0 -0
  349. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-Bfrfh-0-.js → requirementDiagram-UZGBJVZJ-Bzx0iEPP.js} +1 -1
  350. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bzx0iEPP.js.gz +0 -0
  351. package/dist/ui/assets/{sandpack-C58bwfIS.js → sandpack-059Z4UWP.js} +1 -1
  352. package/dist/ui/assets/sandpack-059Z4UWP.js.gz +0 -0
  353. package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js +1 -0
  354. package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js.gz +0 -0
  355. package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-ClZAZ6va.js → sankeyDiagram-TZEHDZUN-Do9pvfDv.js} +1 -1
  356. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-Do9pvfDv.js.gz +0 -0
  357. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-CNgly63p.js → sequenceDiagram-WL72ISMW-CN8neUTA.js} +1 -1
  358. package/dist/ui/assets/sequenceDiagram-WL72ISMW-CN8neUTA.js.gz +0 -0
  359. package/dist/ui/assets/{src-DAeyG22O.js → src-DEbsv3pp.js} +2 -2
  360. package/dist/ui/assets/src-DEbsv3pp.js.gz +0 -0
  361. package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BrEAoDpE.js → stateDiagram-FKZM4ZOC-BluWJi8n.js} +1 -1
  362. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BluWJi8n.js.gz +0 -0
  363. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DeyqBMDR.js +1 -0
  364. package/dist/ui/assets/{streamdown-BdAVfkeF.js → streamdown-BT1twtFc.js} +5 -5
  365. package/dist/ui/assets/streamdown-BT1twtFc.js.gz +0 -0
  366. package/dist/ui/assets/{syntax-BOfTnQiy.js → syntax-CBu6nLfm.js} +1 -1
  367. package/dist/ui/assets/syntax-CBu6nLfm.js.gz +0 -0
  368. package/dist/ui/assets/{timeline-definition-IT6M3QCI-CaRH3k4l.js → timeline-definition-IT6M3QCI-WdUNkiRj.js} +1 -1
  369. package/dist/ui/assets/timeline-definition-IT6M3QCI-WdUNkiRj.js.gz +0 -0
  370. package/dist/ui/assets/{treemap-KMMF4GRG-CUaLOV_B.js → treemap-KMMF4GRG-CoriU4Jl.js} +1 -1
  371. package/dist/ui/assets/{useUserLocalStorage-C8sgXgXR.js → useUserLocalStorage-GidNiOPC.js} +1 -1
  372. package/dist/ui/assets/useUserLocalStorage-GidNiOPC.js.gz +0 -0
  373. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-BlhkI9T_.js → xychartDiagram-PRI3JC2R-CgBAKNt2.js} +1 -1
  374. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CgBAKNt2.js.gz +0 -0
  375. package/dist/ui/index.html +9 -8
  376. package/dist/ui/index.html.gz +0 -0
  377. package/package.json +2 -2
  378. package/dist/ui/assets/AgorEmojiPickerInner-DQjr8M3_.js +0 -1
  379. package/dist/ui/assets/App-hJtcOxHv.js +0 -5
  380. package/dist/ui/assets/App-hJtcOxHv.js.gz +0 -0
  381. package/dist/ui/assets/AppNode-BhuMpn8O.js +0 -1
  382. package/dist/ui/assets/AppNode-BhuMpn8O.js.gz +0 -0
  383. package/dist/ui/assets/ArtifactConsentModal-oMMzRn8L.js.gz +0 -0
  384. package/dist/ui/assets/ArtifactFullscreenPage-B3wT8t8f.js +0 -9
  385. package/dist/ui/assets/ArtifactFullscreenPage-B3wT8t8f.js.gz +0 -0
  386. package/dist/ui/assets/ArtifactNode-BzQcrwFS.js +0 -9
  387. package/dist/ui/assets/ArtifactNode-BzQcrwFS.js.gz +0 -0
  388. package/dist/ui/assets/AutocompleteTextarea-Dau-V_30.js +0 -19
  389. package/dist/ui/assets/AutocompleteTextarea-Dau-V_30.js.gz +0 -0
  390. package/dist/ui/assets/BoardObjectNodes-DdKWv_ZT.js +0 -34
  391. package/dist/ui/assets/BoardObjectNodes-DdKWv_ZT.js.gz +0 -0
  392. package/dist/ui/assets/CodeEditor.inner-Cuj6RuLL.js.gz +0 -0
  393. package/dist/ui/assets/ConversationView-9-3ma1u-.js +0 -1
  394. package/dist/ui/assets/ConversationView-9-3ma1u-.js.gz +0 -0
  395. package/dist/ui/assets/EmbeddedTerminal-Lx5I9EOJ.js.gz +0 -0
  396. package/dist/ui/assets/KnowledgePage-Dz8YAMYC.js +0 -24
  397. package/dist/ui/assets/KnowledgePage-Dz8YAMYC.js.gz +0 -0
  398. package/dist/ui/assets/MarketingScreenshotPage-CmDPBHOl.js.gz +0 -0
  399. package/dist/ui/assets/MobileApp-BpgSG_gz.js +0 -1
  400. package/dist/ui/assets/MobileApp-BpgSG_gz.js.gz +0 -0
  401. package/dist/ui/assets/SessionCanvas-B6_mtlxK.js +0 -13
  402. package/dist/ui/assets/SessionCanvas-B6_mtlxK.js.gz +0 -0
  403. package/dist/ui/assets/StreamdownDemoPage-okKKR2QH.js.gz +0 -0
  404. package/dist/ui/assets/TerminalModal-D9jMGZXv.js.gz +0 -0
  405. package/dist/ui/assets/ThemeSwitcher-D9HgT37l.js +0 -1
  406. package/dist/ui/assets/ThemeSwitcher-D9HgT37l.js.gz +0 -0
  407. package/dist/ui/assets/architecture-U656AL7Q-DMnxkQRZ.js +0 -1
  408. package/dist/ui/assets/architectureDiagram-VXUJARFQ-DwTJGGoj.js.gz +0 -0
  409. package/dist/ui/assets/blockDiagram-VD42YOAC-Dh1_TVW2.js.gz +0 -0
  410. package/dist/ui/assets/c4Diagram-YG6GDRKO-B1e96AcB.js.gz +0 -0
  411. package/dist/ui/assets/channel-Jv4dT4S5.js +0 -1
  412. package/dist/ui/assets/chunk-55IACEB6-lJXvUquf.js +0 -1
  413. package/dist/ui/assets/chunk-ABZYJK2D-DCTXWSzV.js.gz +0 -0
  414. package/dist/ui/assets/chunk-AGHRB4JF-CbNphBjE.js.gz +0 -0
  415. package/dist/ui/assets/chunk-ATLVNIR6-rWg3qxof.js.gz +0 -0
  416. package/dist/ui/assets/chunk-B4BG7PRW-CgtLCbpE.js.gz +0 -0
  417. package/dist/ui/assets/chunk-DI55MBZ5-Dwvx2Kva.js.gz +0 -0
  418. package/dist/ui/assets/chunk-EXTU4WIE-DHyaqTsP.js +0 -1
  419. package/dist/ui/assets/chunk-HN2XXSSU-2blQO3Gb.js.gz +0 -0
  420. package/dist/ui/assets/chunk-JA3XYJ7Z-Cr1rmOui.js.gz +0 -0
  421. package/dist/ui/assets/chunk-JZLCHNYA-BsgZ79Fa.js.gz +0 -0
  422. package/dist/ui/assets/chunk-MI3HLSF2-dwYeUy5S.js.gz +0 -0
  423. package/dist/ui/assets/chunk-N4CR4FBY-DEMgSRVe.js +0 -2
  424. package/dist/ui/assets/chunk-N4CR4FBY-DEMgSRVe.js.gz +0 -0
  425. package/dist/ui/assets/chunk-QXUST7PY-BCK2V0i-.js.gz +0 -0
  426. package/dist/ui/assets/chunk-QZHKN3VN-CALjGrEE.js +0 -1
  427. package/dist/ui/assets/chunk-S3R3BYOJ-GP3zIxrB.js.gz +0 -0
  428. package/dist/ui/assets/chunk-TZMSLE5B-dX5RaM6g.js.gz +0 -0
  429. package/dist/ui/assets/classDiagram-2ON5EDUG-C3_RVP70.js +0 -1
  430. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-C3_RVP70.js +0 -1
  431. package/dist/ui/assets/constants-GjIDNVyt.js +0 -1
  432. package/dist/ui/assets/cose-bilkent-S5V4N54A-Dx0BJVDl.js.gz +0 -0
  433. package/dist/ui/assets/dagre-6UL2VRFP-DiQSUxqN.js.gz +0 -0
  434. package/dist/ui/assets/dagre-Bekd9Vdj.js.gz +0 -0
  435. package/dist/ui/assets/diagram-PSM6KHXK-DtJnDQjc.js.gz +0 -0
  436. package/dist/ui/assets/diagram-QEK2KX5R-CobkCRdj.js.gz +0 -0
  437. package/dist/ui/assets/diagram-S2PKOQOG-DHEZYivc.js.gz +0 -0
  438. package/dist/ui/assets/editor-DQIG-JYZ.js +0 -43
  439. package/dist/ui/assets/editor-DQIG-JYZ.js.gz +0 -0
  440. package/dist/ui/assets/emoji-B0hLmSLZ.js.gz +0 -0
  441. package/dist/ui/assets/erDiagram-Q2GNP2WA-BVNeTZPQ.js.gz +0 -0
  442. package/dist/ui/assets/flowDiagram-NV44I4VS-C73VFdyk.js.gz +0 -0
  443. package/dist/ui/assets/ganttDiagram-LVOFAZNH-B_RosuD1.js.gz +0 -0
  444. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-hxbgwNA1.js.gz +0 -0
  445. package/dist/ui/assets/index-DTz1Dif6.js +0 -64
  446. package/dist/ui/assets/index-DTz1Dif6.js.gz +0 -0
  447. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHYNj-f8.js.gz +0 -0
  448. package/dist/ui/assets/kanban-definition-3W4ZIXB7-DQPCCsj2.js.gz +0 -0
  449. package/dist/ui/assets/linear-DFao5Wyp.js.gz +0 -0
  450. package/dist/ui/assets/mermaid-parser.core-DYCfacHj.js.gz +0 -0
  451. package/dist/ui/assets/mermaid.core-C6xGFSdE.js.gz +0 -0
  452. package/dist/ui/assets/mindmap-definition-VGOIOE7T-L3Pw-YM7.js.gz +0 -0
  453. package/dist/ui/assets/particles-CT8hcJOA.js.gz +0 -0
  454. package/dist/ui/assets/pieDiagram-ADFJNKIX-Bf4Nou75.js.gz +0 -0
  455. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DpjUTLB1.js.gz +0 -0
  456. package/dist/ui/assets/reactflow-Cubtnk8i.js.gz +0 -0
  457. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bfrfh-0-.js.gz +0 -0
  458. package/dist/ui/assets/sandpack-C58bwfIS.js.gz +0 -0
  459. package/dist/ui/assets/sandpackDefaults-Bkga8XAE.js +0 -1
  460. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-ClZAZ6va.js.gz +0 -0
  461. package/dist/ui/assets/sequenceDiagram-WL72ISMW-CNgly63p.js.gz +0 -0
  462. package/dist/ui/assets/src-DAeyG22O.js.gz +0 -0
  463. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BrEAoDpE.js.gz +0 -0
  464. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-BNL52_oN.js +0 -1
  465. package/dist/ui/assets/streamdown-BdAVfkeF.js.gz +0 -0
  466. package/dist/ui/assets/syntax-BOfTnQiy.js.gz +0 -0
  467. package/dist/ui/assets/timeline-definition-IT6M3QCI-CaRH3k4l.js.gz +0 -0
  468. package/dist/ui/assets/useUserLocalStorage-C8sgXgXR.js.gz +0 -0
  469. package/dist/ui/assets/xychartDiagram-PRI3JC2R-BlhkI9T_.js.gz +0 -0
@@ -72,13 +72,17 @@ import {
72
72
  ThreadSessionMapRepository
73
73
  } from "@agor/core/db";
74
74
  import {
75
- getConnector
75
+ buildSlackManifest,
76
+ getConnector,
77
+ requiredBotEvents,
78
+ requiredBotScopes
76
79
  } from "@agor/core/gateway";
77
80
  import {
78
81
  GATEWAY_REDACTED_SENTINEL,
79
- GATEWAY_SENSITIVE_CONFIG_FIELDS,
80
- hasMinimumRole as hasMinimumRole3,
81
- ROLES as ROLES4
82
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
83
+ getRequiredSecretFields as getRequiredSecretFields2,
84
+ hasMinimumRole as hasMinimumRole5,
85
+ ROLES as ROLES6
82
86
  } from "@agor/core/types";
83
87
 
84
88
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
@@ -15312,7 +15316,7 @@ var modelConfigInputSchema = external_exports.union([
15312
15316
  import { ROLES as ROLES3 } from "@agor/core/types";
15313
15317
 
15314
15318
  // src/mcp/tools/widgets.ts
15315
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15319
+ import { getRequiredSecretFields, hasMinimumRole as hasMinimumRole4, MessageRole as MessageRole2, ROLES as ROLES5 } from "@agor/core/types";
15316
15320
 
15317
15321
  // src/utils/append-system-message.ts
15318
15322
  import { generateId as generateId2, SessionRepository as SessionRepository2 } from "@agor/core/db";
@@ -15395,6 +15399,30 @@ var envVarsSubmitSchema = external_exports.object({
15395
15399
  }
15396
15400
  });
15397
15401
 
15402
+ // src/widgets/gateway-token/index.ts
15403
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15404
+ import {
15405
+ GATEWAY_SENSITIVE_CONFIG_FIELDS,
15406
+ hasMinimumRole as hasMinimumRole3,
15407
+ ROLES as ROLES4
15408
+ } from "@agor/core/types";
15409
+ var MAX_TOKEN_LENGTH = 8192;
15410
+ var gatewayTokenParamsSchema = external_exports.object({
15411
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15412
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15413
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15414
+ fields: external_exports.array(external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS)).min(1).max(GATEWAY_SENSITIVE_CONFIG_FIELDS.length).refine((fields) => new Set(fields).size === fields.length, {
15415
+ message: "Token field names must be unique"
15416
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15417
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15418
+ }).strict();
15419
+ var gatewayTokenSubmitSchema = external_exports.object({
15420
+ tokens: external_exports.partialRecord(
15421
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS),
15422
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15423
+ ).describe("Map of sensitive field name \u2192 credential value.")
15424
+ }).strict();
15425
+
15398
15426
  // src/mcp/server.ts
15399
15427
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15400
15428
  function textResult(data) {
@@ -15431,12 +15459,25 @@ Discover tools: search domains/summaries \u2192 get details for one tool \u2192
15431
15459
 
15432
15460
  // src/mcp/tools/gateway-channels.ts
15433
15461
  function requireAdmin(ctx, action) {
15434
- if (!hasMinimumRole3(ctx.authenticatedUser?.role, ROLES4.ADMIN)) {
15462
+ if (!hasMinimumRole5(ctx.authenticatedUser?.role, ROLES6.ADMIN)) {
15435
15463
  throw new Error(`Access denied: admin role required to ${action}`);
15436
15464
  }
15437
15465
  }
15466
+ async function resolveCallerSessionBranchId(ctx) {
15467
+ if (!ctx.sessionId) return null;
15468
+ const session = await new SessionRepository3(ctx.db).findById(ctx.sessionId);
15469
+ if (!session) {
15470
+ throw new Error("Gateway access denied: calling session not found");
15471
+ }
15472
+ return session.branch_id;
15473
+ }
15474
+ function sessionBranchReadDeniedError() {
15475
+ return new Error(
15476
+ "Gateway read denied: this Slack thread belongs to a gateway channel targeting a different branch than the calling session's. Sessions can read Slack thread history only through gateway channels whose target branch matches their own."
15477
+ );
15478
+ }
15438
15479
  async function canUseGatewayOutbound(ctx, branchRepo, branch) {
15439
- if (hasMinimumRole3(ctx.authenticatedUser?.role, ROLES4.ADMIN)) return true;
15480
+ if (hasMinimumRole5(ctx.authenticatedUser?.role, ROLES6.ADMIN)) return true;
15440
15481
  const userId = ctx.userId;
15441
15482
  const isOwner = await branchRepo.isOwner(branch.branch_id, userId);
15442
15483
  const effective = await branchRepo.resolveUserPermission(branch, userId);
@@ -15513,44 +15554,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
15513
15554
  agenticConfig: agenticConfigSchema.optional()
15514
15555
  }).superRefine((value, issue2) => {
15515
15556
  const config2 = value.config ?? {};
15516
- if (value.channelType === "slack") {
15517
- if (!config2.bot_token) {
15518
- issue2.addIssue({
15519
- code: "custom",
15520
- path: ["config", "bot_token"],
15521
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
15522
- });
15523
- }
15524
- if (config2.connection_mode === "socket" && !config2.app_token) {
15525
- issue2.addIssue({
15526
- code: "custom",
15527
- path: ["config", "app_token"],
15528
- message: "config.app_token is required for Slack Socket Mode."
15529
- });
15530
- }
15531
- }
15532
- if (value.channelType === "github") {
15533
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
15557
+ if (value.enabled !== false) {
15558
+ const requiredSecretMessages = {
15559
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
15560
+ app_token: "config.app_token is required for Slack Socket Mode.",
15561
+ private_key: "config.private_key is required for GitHub gateway channels.",
15562
+ app_password: "config.app_password is required for Teams gateway channels."
15563
+ };
15564
+ for (const field of getRequiredSecretFields2(value.channelType, config2)) {
15534
15565
  if (!config2[field]) {
15535
15566
  issue2.addIssue({
15536
15567
  code: "custom",
15537
15568
  path: ["config", field],
15538
- message: `config.${field} is required for GitHub gateway channels.`
15569
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
15539
15570
  });
15540
15571
  }
15541
15572
  }
15542
15573
  }
15543
- if (value.channelType === "teams") {
15544
- for (const field of ["app_id", "app_password"]) {
15574
+ if (value.channelType === "github") {
15575
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
15545
15576
  if (!config2[field]) {
15546
15577
  issue2.addIssue({
15547
15578
  code: "custom",
15548
15579
  path: ["config", field],
15549
- message: `config.${field} is required for Teams gateway channels.`
15580
+ message: `config.${field} is required for GitHub gateway channels.`
15550
15581
  });
15551
15582
  }
15552
15583
  }
15553
15584
  }
15585
+ if (value.channelType === "teams" && !config2.app_id) {
15586
+ issue2.addIssue({
15587
+ code: "custom",
15588
+ path: ["config", "app_id"],
15589
+ message: "config.app_id is required for Teams gateway channels."
15590
+ });
15591
+ }
15592
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
15593
+ issue2.addIssue({
15594
+ code: "custom",
15595
+ path: ["agorUserId"],
15596
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
15597
+ });
15598
+ }
15554
15599
  });
15555
15600
  var slackThreadHistorySchema = external_exports.strictObject({
15556
15601
  sessionId: mcpOptionalId(
@@ -15650,22 +15695,29 @@ async function requireBranchAllForGatewayHistory(ctx, branchRepo, branch) {
15650
15695
  );
15651
15696
  }
15652
15697
  function isAdmin(ctx) {
15653
- return hasMinimumRole3(ctx.authenticatedUser?.role, ROLES4.ADMIN);
15698
+ return hasMinimumRole5(ctx.authenticatedUser?.role, ROLES6.ADMIN);
15654
15699
  }
15655
15700
  async function resolveSlackThreadHistoryTarget(ctx, args) {
15656
15701
  const channelRepo = new GatewayChannelRepository(ctx.db);
15657
15702
  const threadMapRepo = new ThreadSessionMapRepository(ctx.db);
15658
15703
  const branchRepo = new BranchRepository6(ctx.db);
15704
+ const callerSessionBranchId = await resolveCallerSessionBranchId(ctx);
15659
15705
  if (args.sessionId) {
15660
15706
  const session = await ctx.app.service("sessions").get(args.sessionId, ctx.baseServiceParams);
15661
15707
  const mapping2 = await threadMapRepo.findBySession(session.session_id);
15662
15708
  if (!mapping2) {
15663
15709
  throw new Error(`No gateway thread mapping found for session ${session.session_id}.`);
15664
15710
  }
15711
+ if (callerSessionBranchId && mapping2.branch_id !== callerSessionBranchId) {
15712
+ throw sessionBranchReadDeniedError();
15713
+ }
15665
15714
  const channel2 = await channelRepo.findById(mapping2.channel_id);
15666
15715
  if (!channel2) {
15667
15716
  throw new Error(`Gateway channel not found for session mapping ${mapping2.id}.`);
15668
15717
  }
15718
+ if (callerSessionBranchId && channel2.target_branch_id !== callerSessionBranchId) {
15719
+ throw sessionBranchReadDeniedError();
15720
+ }
15669
15721
  const branch2 = await branchRepo.findById(mapping2.branch_id);
15670
15722
  return {
15671
15723
  channel: channel2,
@@ -15680,6 +15732,9 @@ async function resolveSlackThreadHistoryTarget(ctx, args) {
15680
15732
  if (!channel) {
15681
15733
  throw new Error(`Gateway channel not found: ${args.gatewayChannelId}`);
15682
15734
  }
15735
+ if (callerSessionBranchId && channel.target_branch_id !== callerSessionBranchId) {
15736
+ throw sessionBranchReadDeniedError();
15737
+ }
15683
15738
  const mapping = await threadMapRepo.findByChannelAndThread(channel.id, args.threadId);
15684
15739
  if (mapping) {
15685
15740
  const branch2 = await branchRepo.findById(mapping.branch_id);
@@ -15731,7 +15786,7 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
15731
15786
  });
15732
15787
  function redactGatewayChannel(channel) {
15733
15788
  const config2 = { ...channel.config ?? {} };
15734
- for (const field of GATEWAY_SENSITIVE_CONFIG_FIELDS) {
15789
+ for (const field of GATEWAY_SENSITIVE_CONFIG_FIELDS2) {
15735
15790
  if (config2[field]) config2[field] = GATEWAY_REDACTED_SENTINEL;
15736
15791
  }
15737
15792
  let agentic_config = channel.agentic_config;
@@ -15789,6 +15844,51 @@ function toServiceUpdateData(args) {
15789
15844
  }
15790
15845
  return updates;
15791
15846
  }
15847
+ var slackManifestGenerateSchema = external_exports.strictObject({
15848
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
15849
+ botDisplayName: mcpOptionalNonEmptyString(
15850
+ "botDisplayName",
15851
+ "Bot user display name. Defaults to appName."
15852
+ ),
15853
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
15854
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
15855
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
15856
+ alignUsers: external_exports.boolean().default(true).describe(
15857
+ "Resolve Slack user email \u2192 Agor user (adds the users:read.email scope). Defaults to true: each Slack user runs as their matched Agor account and unmatched users are rejected, so no fixed run-as user is needed. Set false to run every message as one fixed Agor user (then pass agorUserId to agor_gateway_channels_create)."
15858
+ ),
15859
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
15860
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
15861
+ "Slack channel ID whitelist. Maps to config.allowed_channel_ids when you call agor_gateway_channels_create; it does NOT change the manifest scopes or events."
15862
+ )
15863
+ });
15864
+ function toSlackWizardOptions(args) {
15865
+ return {
15866
+ appName: args.appName,
15867
+ ...args.botDisplayName ? { botDisplayName: args.botDisplayName } : {},
15868
+ publicChannels: args.publicChannels,
15869
+ privateChannels: args.privateChannels,
15870
+ groupDms: args.groupDms,
15871
+ alignUsers: args.alignUsers,
15872
+ outbound: args.outbound
15873
+ };
15874
+ }
15875
+ function toCreateChannelConfigHint(args) {
15876
+ const config2 = {
15877
+ connection_mode: "socket",
15878
+ enable_channels: args.publicChannels,
15879
+ enable_groups: args.privateChannels,
15880
+ enable_mpim: args.groupDms,
15881
+ align_slack_users: args.alignUsers,
15882
+ outbound_enabled: args.outbound
15883
+ };
15884
+ if (args.restrictToChannelIds && args.restrictToChannelIds.length > 0) {
15885
+ config2.allowed_channel_ids = args.restrictToChannelIds;
15886
+ }
15887
+ return { channelType: "slack", config: config2 };
15888
+ }
15889
+ function identityModeSetupStep(alignUsers) {
15890
+ return alignUsers ? "Identity: the channel is set to align Slack users \u2014 each Slack user runs as their matched Agor account and unmatched users are rejected, so no run-as user is needed. Tell me if you would rather every message run as one fixed Agor user (that requires picking a user and passing agorUserId)." : "Identity: the channel is set to run every message as one fixed Agor user, which requires passing agorUserId to agor_gateway_channels_create. Tell me if you would rather align Slack users so each runs as their own matched Agor account instead.";
15891
+ }
15792
15892
  function registerGatewayChannelTools(server, ctx) {
15793
15893
  server.registerTool(
15794
15894
  "agor_gateway_channels_list",
@@ -15834,7 +15934,7 @@ function registerGatewayChannelTools(server, ctx) {
15834
15934
  server.registerTool(
15835
15935
  "agor_gateway_channels_create",
15836
15936
  {
15837
- description: 'Create a gateway channel definition (admin-only) through the same gateway-channels service used by the UI. Current connectors: Slack, GitHub, Teams. Slack example config: { bot_token, app_token, connection_mode:"socket", enable_channels:true, require_mention:true, allowed_channel_ids:["C123"] }. Secrets are encrypted by the service and returned redacted; prefer environment/template references where possible because raw secrets in tool arguments may appear in the MCP transcript.',
15937
+ description: 'Create a gateway channel definition (admin-only) through the same gateway-channels service used by the UI. Current connectors: Slack, GitHub, Teams. For interactive/agent-driven setup, create the channel disabled and without secrets (enabled:false, no tokens), then collect credentials with agor_widgets_request_gateway_token so the user enters them in a secure inline form \u2014 raw secrets passed in tool arguments leak into the MCP transcript. Passing secrets directly here is for programmatic/non-interactive use only. Non-interactive Slack example config: { bot_token, app_token, connection_mode:"socket", enable_channels:true, require_mention:true, allowed_channel_ids:["C123"] }. Secrets are encrypted by the service and returned redacted.',
15838
15938
  annotations: { destructiveHint: false, idempotentHint: false },
15839
15939
  inputSchema: gatewayChannelCreateSchema
15840
15940
  },
@@ -15844,12 +15944,50 @@ function registerGatewayChannelTools(server, ctx) {
15844
15944
  return textResult({
15845
15945
  gateway_channel: redactGatewayChannel(created),
15846
15946
  next_steps: [
15947
+ "If this channel was created disabled without tokens (the recommended interactive path), collect its credentials by calling agor_widgets_request_gateway_token for this channel so the user enters the tokens in the secure form that appears at the end of this message. Do NOT ask the user to paste xoxb-/xapp- tokens into the chat, and do NOT pass tokens as agor_gateway_channels_create arguments during interactive setup.",
15948
+ ...created.channel_type === "slack" ? [
15949
+ identityModeSetupStep(
15950
+ created.config?.align_slack_users === true
15951
+ )
15952
+ ] : [],
15847
15953
  "Verify the channel in Settings > Gateway Channels or with agor_gateway_channels_list.",
15848
15954
  "Channel credentials, env vars, and inbound channel keys are intentionally redacted from MCP responses."
15849
15955
  ]
15850
15956
  });
15851
15957
  }
15852
15958
  );
15959
+ server.registerTool(
15960
+ "agor_gateway_slack_manifest_generate",
15961
+ {
15962
+ description: "Generate a ready-to-install Slack app manifest from desired gateway capabilities (admin-only). The agent-driven equivalent of the Slack setup wizard, backed by the same core generator. Returns the manifest JSON, the derived bot scopes/events, ordered setup steps, and the channel config to pass to agor_gateway_channels_create. This is pure: it creates no Slack app, no Agor channel, and validates no tokens.",
15963
+ annotations: { readOnlyHint: true },
15964
+ inputSchema: slackManifestGenerateSchema
15965
+ },
15966
+ async (args) => {
15967
+ requireAdmin(ctx, "generate Slack app manifests");
15968
+ const options = toSlackWizardOptions(args);
15969
+ return textResult({
15970
+ manifest: buildSlackManifest(options),
15971
+ bot_scopes: requiredBotScopes(options),
15972
+ bot_events: requiredBotEvents(options),
15973
+ setup_steps: [
15974
+ 'Open https://api.slack.com/apps?new_app=1 and choose "Create New App".',
15975
+ 'Select "From a manifest", pick the target workspace, paste the manifest JSON below, and click "Create".',
15976
+ 'Install the app to the workspace, then open OAuth & Permissions and copy the Bot User OAuth Token (starts with "xoxb-").',
15977
+ 'Open Basic Information \u2192 App-Level Tokens \u2192 Generate Token and Scopes, add the connections:write scope, generate it, and copy the App-Level Token (starts with "xapp-").',
15978
+ 'Once the app is installed and you hold the xoxb-/xapp- tokens, call agor_gateway_channels_create with channelType "slack", enabled:false, no tokens, and create_channel_config_hint below to create the channel as a draft.',
15979
+ "Then call agor_widgets_request_gateway_token for that channel so the user enters the xoxb-/xapp- tokens in the secure form that appears at the end of this message, which enables the channel. Do NOT ask the user to paste xoxb-/xapp- tokens into the chat, and do NOT pass tokens as agor_gateway_channels_create arguments.",
15980
+ identityModeSetupStep(args.alignUsers)
15981
+ ],
15982
+ create_channel_config_hint: toCreateChannelConfigHint(args),
15983
+ caveats: [
15984
+ "GENERATED ONLY \u2014 no Slack app created, no Agor channel created, no tokens validated, no event delivery verified.",
15985
+ "The app-level connections:write token is generated manually and is NOT part of the manifest bot scopes.",
15986
+ "restrictToChannelIds maps to config.allowed_channel_ids when you call create \u2014 it does NOT change the manifest scopes or events."
15987
+ ]
15988
+ });
15989
+ }
15990
+ );
15853
15991
  server.registerTool(
15854
15992
  "agor_gateway_channels_update",
15855
15993
  {
@@ -15873,7 +16011,7 @@ function registerGatewayChannelTools(server, ctx) {
15873
16011
  server.registerTool(
15874
16012
  "agor_gateway_outbound_targets_list",
15875
16013
  {
15876
- description: "List Slack gateway outbound targets the caller can use. Returns only outbound-enabled channels where the caller has branch all permission or admin access. Secrets and inbound channel keys are never returned.",
16014
+ description: "List Slack gateway outbound targets the caller can use. Returns only outbound-enabled channels where the caller has branch all permission or admin access; when called from a session, results are additionally scoped to channels targeting the session's branch. Secrets and inbound channel keys are never returned.",
15877
16015
  annotations: { readOnlyHint: true },
15878
16016
  inputSchema: external_exports.strictObject({
15879
16017
  branchId: mcpOptionalId("branchId", "Branch", "Filter by target branch ID."),
@@ -15888,15 +16026,24 @@ function registerGatewayChannelTools(server, ctx) {
15888
16026
  async (args) => {
15889
16027
  const channelRepo = new GatewayChannelRepository(ctx.db);
15890
16028
  const branchRepo = new BranchRepository6(ctx.db);
16029
+ const callerSessionBranchId = await resolveCallerSessionBranchId(ctx);
15891
16030
  const branchFilter = args.branchId ? await branchRepo.findById(args.branchId) : null;
15892
- const branchFilterId = branchFilter?.branch_id;
16031
+ const requestedBranchId = branchFilter?.branch_id;
16032
+ if (callerSessionBranchId && args.branchId && requestedBranchId !== callerSessionBranchId) {
16033
+ return textResult({
16034
+ channels: [],
16035
+ binding: "Results are scoped to the calling session's branch; the requested branchId targets a different branch, so this session cannot use its channels."
16036
+ });
16037
+ }
16038
+ const branchFilterId = callerSessionBranchId ?? requestedBranchId;
15893
16039
  const allChannels = args.gatewayChannelId ? [await channelRepo.findById(args.gatewayChannelId)] : await channelRepo.findAll();
15894
16040
  const channels = [];
15895
16041
  for (const channel of allChannels) {
15896
16042
  if (!channel) continue;
15897
16043
  if (args.channelType && channel.channel_type !== args.channelType) continue;
15898
16044
  if (channel.channel_type !== "slack") continue;
15899
- if (args.branchId && channel.target_branch_id !== branchFilterId) continue;
16045
+ if ((callerSessionBranchId || args.branchId) && channel.target_branch_id !== branchFilterId)
16046
+ continue;
15900
16047
  if (!channel.enabled) continue;
15901
16048
  const outbound = getOutboundConfig(channel);
15902
16049
  if (!outbound.outbound_enabled) continue;
@@ -15919,13 +16066,18 @@ function registerGatewayChannelTools(server, ctx) {
15919
16066
  ]
15920
16067
  });
15921
16068
  }
15922
- return textResult({ channels });
16069
+ return textResult({
16070
+ channels,
16071
+ ...callerSessionBranchId && channels.length === 0 ? {
16072
+ hint: "No outbound-enabled channel targets this session's branch \u2014 ask an operator to create/enable one."
16073
+ } : {}
16074
+ });
15923
16075
  }
15924
16076
  );
15925
16077
  server.registerTool(
15926
16078
  "agor_gateway_slack_thread_history_get",
15927
16079
  {
15928
- description: "Fetch Slack thread history for a gateway-mapped Slack thread without exposing Slack tokens. Prefer sessionId to resolve the gateway thread mapping from an accessible Agor session. Alternatively pass gatewayChannelId + threadId: mapped threads require admin or branch all permission on the mapped branch; unmapped arbitrary thread reads are admin-only. Slack message text is untrusted external content.",
16080
+ description: "Fetch Slack thread history for a gateway-mapped Slack thread without exposing Slack tokens. Prefer sessionId to resolve the gateway thread mapping from an accessible Agor session. Alternatively pass gatewayChannelId + threadId: mapped threads require admin or branch all permission on the mapped branch; unmapped arbitrary thread reads are admin-only. When called from a session, reads are restricted to threads whose target branch matches the calling session's branch. Slack message text is untrusted external content.",
15929
16081
  annotations: { readOnlyHint: true },
15930
16082
  inputSchema: slackThreadHistorySchema
15931
16083
  },
@@ -15993,7 +16145,7 @@ function registerGatewayChannelTools(server, ctx) {
15993
16145
  server.registerTool(
15994
16146
  "agor_gateway_emit_message",
15995
16147
  {
15996
- description: "Send a proactive Slack message through an outbound-enabled gateway channel and persist a seed/audit record. Targets may be Slack channel IDs, channel names, or user emails; v0 intentionally starts a fresh Slack thread/DM message for each emit and does not create a thread-session mapping until a human replies.",
16148
+ description: "Send a proactive Slack message through an outbound-enabled gateway channel and persist a seed/audit record. Targets may be Slack channel IDs, channel names, or user emails; v0 intentionally starts a fresh Slack thread/DM message for each emit and does not create a thread-session mapping until a human replies. When called from a session, outbound is restricted to channels whose target branch matches the calling session's branch.",
15997
16149
  annotations: { destructiveHint: false, idempotentHint: false },
15998
16150
  inputSchema: external_exports.strictObject({
15999
16151
  gatewayChannelId: mcpRequiredId(
@@ -14992,11 +14992,15 @@ import {
14992
14992
  ThreadSessionMapRepository
14993
14993
  } from "@agor/core/db";
14994
14994
  import {
14995
- getConnector
14995
+ buildSlackManifest,
14996
+ getConnector,
14997
+ requiredBotEvents,
14998
+ requiredBotScopes
14996
14999
  } from "@agor/core/gateway";
14997
15000
  import {
14998
15001
  GATEWAY_REDACTED_SENTINEL,
14999
15002
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
15003
+ getRequiredSecretFields,
15000
15004
  hasMinimumRole as hasMinimumRole3,
15001
15005
  ROLES as ROLES3
15002
15006
  } from "@agor/core/types";
@@ -15056,44 +15060,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
15056
15060
  agenticConfig: agenticConfigSchema.optional()
15057
15061
  }).superRefine((value, issue2) => {
15058
15062
  const config2 = value.config ?? {};
15059
- if (value.channelType === "slack") {
15060
- if (!config2.bot_token) {
15061
- issue2.addIssue({
15062
- code: "custom",
15063
- path: ["config", "bot_token"],
15064
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
15065
- });
15066
- }
15067
- if (config2.connection_mode === "socket" && !config2.app_token) {
15068
- issue2.addIssue({
15069
- code: "custom",
15070
- path: ["config", "app_token"],
15071
- message: "config.app_token is required for Slack Socket Mode."
15072
- });
15073
- }
15074
- }
15075
- if (value.channelType === "github") {
15076
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
15063
+ if (value.enabled !== false) {
15064
+ const requiredSecretMessages = {
15065
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
15066
+ app_token: "config.app_token is required for Slack Socket Mode.",
15067
+ private_key: "config.private_key is required for GitHub gateway channels.",
15068
+ app_password: "config.app_password is required for Teams gateway channels."
15069
+ };
15070
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
15077
15071
  if (!config2[field]) {
15078
15072
  issue2.addIssue({
15079
15073
  code: "custom",
15080
15074
  path: ["config", field],
15081
- message: `config.${field} is required for GitHub gateway channels.`
15075
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
15082
15076
  });
15083
15077
  }
15084
15078
  }
15085
15079
  }
15086
- if (value.channelType === "teams") {
15087
- for (const field of ["app_id", "app_password"]) {
15080
+ if (value.channelType === "github") {
15081
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
15088
15082
  if (!config2[field]) {
15089
15083
  issue2.addIssue({
15090
15084
  code: "custom",
15091
15085
  path: ["config", field],
15092
- message: `config.${field} is required for Teams gateway channels.`
15086
+ message: `config.${field} is required for GitHub gateway channels.`
15093
15087
  });
15094
15088
  }
15095
15089
  }
15096
15090
  }
15091
+ if (value.channelType === "teams" && !config2.app_id) {
15092
+ issue2.addIssue({
15093
+ code: "custom",
15094
+ path: ["config", "app_id"],
15095
+ message: "config.app_id is required for Teams gateway channels."
15096
+ });
15097
+ }
15098
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
15099
+ issue2.addIssue({
15100
+ code: "custom",
15101
+ path: ["agorUserId"],
15102
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
15103
+ });
15104
+ }
15097
15105
  });
15098
15106
  var slackThreadHistorySchema = external_exports.strictObject({
15099
15107
  sessionId: mcpOptionalId(
@@ -15157,6 +15165,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
15157
15165
  ),
15158
15166
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
15159
15167
  });
15168
+ var slackManifestGenerateSchema = external_exports.strictObject({
15169
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
15170
+ botDisplayName: mcpOptionalNonEmptyString(
15171
+ "botDisplayName",
15172
+ "Bot user display name. Defaults to appName."
15173
+ ),
15174
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
15175
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
15176
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
15177
+ alignUsers: external_exports.boolean().default(true).describe(
15178
+ "Resolve Slack user email \u2192 Agor user (adds the users:read.email scope). Defaults to true: each Slack user runs as their matched Agor account and unmatched users are rejected, so no fixed run-as user is needed. Set false to run every message as one fixed Agor user (then pass agorUserId to agor_gateway_channels_create)."
15179
+ ),
15180
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
15181
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
15182
+ "Slack channel ID whitelist. Maps to config.allowed_channel_ids when you call agor_gateway_channels_create; it does NOT change the manifest scopes or events."
15183
+ )
15184
+ });
15160
15185
 
15161
15186
  // src/mcp/tools/mcp-servers.ts
15162
15187
  import {
@@ -15515,7 +15540,7 @@ var modelConfigInputSchema = external_exports.union([
15515
15540
  import { ROLES as ROLES4 } from "@agor/core/types";
15516
15541
 
15517
15542
  // src/mcp/tools/widgets.ts
15518
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15543
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15519
15544
 
15520
15545
  // src/utils/append-system-message.ts
15521
15546
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15598,6 +15623,30 @@ var envVarsSubmitSchema = external_exports.object({
15598
15623
  }
15599
15624
  });
15600
15625
 
15626
+ // src/widgets/gateway-token/index.ts
15627
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15628
+ import {
15629
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15630
+ hasMinimumRole as hasMinimumRole4,
15631
+ ROLES as ROLES5
15632
+ } from "@agor/core/types";
15633
+ var MAX_TOKEN_LENGTH = 8192;
15634
+ var gatewayTokenParamsSchema = external_exports.object({
15635
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15636
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15637
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15638
+ fields: external_exports.array(external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2)).min(1).max(GATEWAY_SENSITIVE_CONFIG_FIELDS2.length).refine((fields) => new Set(fields).size === fields.length, {
15639
+ message: "Token field names must be unique"
15640
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15641
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15642
+ }).strict();
15643
+ var gatewayTokenSubmitSchema = external_exports.object({
15644
+ tokens: external_exports.partialRecord(
15645
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15646
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15647
+ ).describe("Map of sensitive field name \u2192 credential value.")
15648
+ }).strict();
15649
+
15601
15650
  // src/mcp/server.ts
15602
15651
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15603
15652
  function coerceString(value) {