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
@@ -14770,11 +14770,15 @@ import {
14770
14770
  ThreadSessionMapRepository
14771
14771
  } from "@agor/core/db";
14772
14772
  import {
14773
- getConnector
14773
+ buildSlackManifest,
14774
+ getConnector,
14775
+ requiredBotEvents,
14776
+ requiredBotScopes
14774
14777
  } from "@agor/core/gateway";
14775
14778
  import {
14776
14779
  GATEWAY_REDACTED_SENTINEL,
14777
14780
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14781
+ getRequiredSecretFields,
14778
14782
  hasMinimumRole as hasMinimumRole2,
14779
14783
  ROLES as ROLES2
14780
14784
  } from "@agor/core/types";
@@ -14834,44 +14838,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14834
14838
  agenticConfig: agenticConfigSchema.optional()
14835
14839
  }).superRefine((value, issue2) => {
14836
14840
  const config2 = value.config ?? {};
14837
- if (value.channelType === "slack") {
14838
- if (!config2.bot_token) {
14839
- issue2.addIssue({
14840
- code: "custom",
14841
- path: ["config", "bot_token"],
14842
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14843
- });
14844
- }
14845
- if (config2.connection_mode === "socket" && !config2.app_token) {
14846
- issue2.addIssue({
14847
- code: "custom",
14848
- path: ["config", "app_token"],
14849
- message: "config.app_token is required for Slack Socket Mode."
14850
- });
14851
- }
14852
- }
14853
- if (value.channelType === "github") {
14854
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14841
+ if (value.enabled !== false) {
14842
+ const requiredSecretMessages = {
14843
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14844
+ app_token: "config.app_token is required for Slack Socket Mode.",
14845
+ private_key: "config.private_key is required for GitHub gateway channels.",
14846
+ app_password: "config.app_password is required for Teams gateway channels."
14847
+ };
14848
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14855
14849
  if (!config2[field]) {
14856
14850
  issue2.addIssue({
14857
14851
  code: "custom",
14858
14852
  path: ["config", field],
14859
- message: `config.${field} is required for GitHub gateway channels.`
14853
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14860
14854
  });
14861
14855
  }
14862
14856
  }
14863
14857
  }
14864
- if (value.channelType === "teams") {
14865
- for (const field of ["app_id", "app_password"]) {
14858
+ if (value.channelType === "github") {
14859
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14866
14860
  if (!config2[field]) {
14867
14861
  issue2.addIssue({
14868
14862
  code: "custom",
14869
14863
  path: ["config", field],
14870
- message: `config.${field} is required for Teams gateway channels.`
14864
+ message: `config.${field} is required for GitHub gateway channels.`
14871
14865
  });
14872
14866
  }
14873
14867
  }
14874
14868
  }
14869
+ if (value.channelType === "teams" && !config2.app_id) {
14870
+ issue2.addIssue({
14871
+ code: "custom",
14872
+ path: ["config", "app_id"],
14873
+ message: "config.app_id is required for Teams gateway channels."
14874
+ });
14875
+ }
14876
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14877
+ issue2.addIssue({
14878
+ code: "custom",
14879
+ path: ["agorUserId"],
14880
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14881
+ });
14882
+ }
14875
14883
  });
14876
14884
  var slackThreadHistorySchema = external_exports.strictObject({
14877
14885
  sessionId: mcpOptionalId(
@@ -14935,6 +14943,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14935
14943
  ),
14936
14944
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14937
14945
  });
14946
+ var slackManifestGenerateSchema = external_exports.strictObject({
14947
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14948
+ botDisplayName: mcpOptionalNonEmptyString(
14949
+ "botDisplayName",
14950
+ "Bot user display name. Defaults to appName."
14951
+ ),
14952
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14953
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14954
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14955
+ alignUsers: external_exports.boolean().default(true).describe(
14956
+ "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)."
14957
+ ),
14958
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14959
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14960
+ "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."
14961
+ )
14962
+ });
14938
14963
 
14939
14964
  // src/mcp/tools/knowledge.ts
14940
14965
  import { createHash, randomUUID } from "crypto";
@@ -15452,7 +15477,7 @@ var modelConfigInputSchema = external_exports.union([
15452
15477
  import { ROLES as ROLES4 } from "@agor/core/types";
15453
15478
 
15454
15479
  // src/mcp/tools/widgets.ts
15455
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15480
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15456
15481
 
15457
15482
  // src/utils/append-system-message.ts
15458
15483
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15535,6 +15560,30 @@ var envVarsSubmitSchema = external_exports.object({
15535
15560
  }
15536
15561
  });
15537
15562
 
15563
+ // src/widgets/gateway-token/index.ts
15564
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15565
+ import {
15566
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15567
+ hasMinimumRole as hasMinimumRole4,
15568
+ ROLES as ROLES5
15569
+ } from "@agor/core/types";
15570
+ var MAX_TOKEN_LENGTH = 8192;
15571
+ var gatewayTokenParamsSchema = external_exports.object({
15572
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15573
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15574
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15575
+ 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, {
15576
+ message: "Token field names must be unique"
15577
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15578
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15579
+ }).strict();
15580
+ var gatewayTokenSubmitSchema = external_exports.object({
15581
+ tokens: external_exports.partialRecord(
15582
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15583
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15584
+ ).describe("Map of sensitive field name \u2192 credential value.")
15585
+ }).strict();
15586
+
15538
15587
  // src/mcp/server.ts
15539
15588
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15540
15589
  function textResult(data) {
@@ -14832,11 +14832,15 @@ import {
14832
14832
  ThreadSessionMapRepository
14833
14833
  } from "@agor/core/db";
14834
14834
  import {
14835
- getConnector
14835
+ buildSlackManifest,
14836
+ getConnector,
14837
+ requiredBotEvents,
14838
+ requiredBotScopes
14836
14839
  } from "@agor/core/gateway";
14837
14840
  import {
14838
14841
  GATEWAY_REDACTED_SENTINEL,
14839
14842
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14843
+ getRequiredSecretFields,
14840
14844
  hasMinimumRole as hasMinimumRole2,
14841
14845
  ROLES as ROLES2
14842
14846
  } from "@agor/core/types";
@@ -14896,44 +14900,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14896
14900
  agenticConfig: agenticConfigSchema.optional()
14897
14901
  }).superRefine((value, issue2) => {
14898
14902
  const config2 = value.config ?? {};
14899
- if (value.channelType === "slack") {
14900
- if (!config2.bot_token) {
14901
- issue2.addIssue({
14902
- code: "custom",
14903
- path: ["config", "bot_token"],
14904
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14905
- });
14906
- }
14907
- if (config2.connection_mode === "socket" && !config2.app_token) {
14908
- issue2.addIssue({
14909
- code: "custom",
14910
- path: ["config", "app_token"],
14911
- message: "config.app_token is required for Slack Socket Mode."
14912
- });
14913
- }
14914
- }
14915
- if (value.channelType === "github") {
14916
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14903
+ if (value.enabled !== false) {
14904
+ const requiredSecretMessages = {
14905
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14906
+ app_token: "config.app_token is required for Slack Socket Mode.",
14907
+ private_key: "config.private_key is required for GitHub gateway channels.",
14908
+ app_password: "config.app_password is required for Teams gateway channels."
14909
+ };
14910
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14917
14911
  if (!config2[field]) {
14918
14912
  issue2.addIssue({
14919
14913
  code: "custom",
14920
14914
  path: ["config", field],
14921
- message: `config.${field} is required for GitHub gateway channels.`
14915
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14922
14916
  });
14923
14917
  }
14924
14918
  }
14925
14919
  }
14926
- if (value.channelType === "teams") {
14927
- for (const field of ["app_id", "app_password"]) {
14920
+ if (value.channelType === "github") {
14921
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14928
14922
  if (!config2[field]) {
14929
14923
  issue2.addIssue({
14930
14924
  code: "custom",
14931
14925
  path: ["config", field],
14932
- message: `config.${field} is required for Teams gateway channels.`
14926
+ message: `config.${field} is required for GitHub gateway channels.`
14933
14927
  });
14934
14928
  }
14935
14929
  }
14936
14930
  }
14931
+ if (value.channelType === "teams" && !config2.app_id) {
14932
+ issue2.addIssue({
14933
+ code: "custom",
14934
+ path: ["config", "app_id"],
14935
+ message: "config.app_id is required for Teams gateway channels."
14936
+ });
14937
+ }
14938
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14939
+ issue2.addIssue({
14940
+ code: "custom",
14941
+ path: ["agorUserId"],
14942
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14943
+ });
14944
+ }
14937
14945
  });
14938
14946
  var slackThreadHistorySchema = external_exports.strictObject({
14939
14947
  sessionId: mcpOptionalId(
@@ -14997,6 +15005,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14997
15005
  ),
14998
15006
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14999
15007
  });
15008
+ var slackManifestGenerateSchema = external_exports.strictObject({
15009
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
15010
+ botDisplayName: mcpOptionalNonEmptyString(
15011
+ "botDisplayName",
15012
+ "Bot user display name. Defaults to appName."
15013
+ ),
15014
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
15015
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
15016
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
15017
+ alignUsers: external_exports.boolean().default(true).describe(
15018
+ "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)."
15019
+ ),
15020
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
15021
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
15022
+ "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."
15023
+ )
15024
+ });
15000
15025
 
15001
15026
  // src/mcp/tools/knowledge.ts
15002
15027
  import { createHash, randomUUID } from "crypto";
@@ -15535,7 +15560,7 @@ var modelConfigInputSchema = external_exports.union([
15535
15560
  import { ROLES as ROLES4 } from "@agor/core/types";
15536
15561
 
15537
15562
  // src/mcp/tools/widgets.ts
15538
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15563
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15539
15564
 
15540
15565
  // src/utils/append-system-message.ts
15541
15566
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15618,6 +15643,30 @@ var envVarsSubmitSchema = external_exports.object({
15618
15643
  }
15619
15644
  });
15620
15645
 
15646
+ // src/widgets/gateway-token/index.ts
15647
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15648
+ import {
15649
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15650
+ hasMinimumRole as hasMinimumRole4,
15651
+ ROLES as ROLES5
15652
+ } from "@agor/core/types";
15653
+ var MAX_TOKEN_LENGTH = 8192;
15654
+ var gatewayTokenParamsSchema = external_exports.object({
15655
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15656
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15657
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15658
+ 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, {
15659
+ message: "Token field names must be unique"
15660
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15661
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15662
+ }).strict();
15663
+ var gatewayTokenSubmitSchema = external_exports.object({
15664
+ tokens: external_exports.partialRecord(
15665
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15666
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15667
+ ).describe("Map of sensitive field name \u2192 credential value.")
15668
+ }).strict();
15669
+
15621
15670
  // src/mcp/server.ts
15622
15671
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15623
15672
  function coerceJsonRecord(value) {
@@ -15276,11 +15276,15 @@ import {
15276
15276
  ThreadSessionMapRepository
15277
15277
  } from "@agor/core/db";
15278
15278
  import {
15279
- getConnector
15279
+ buildSlackManifest,
15280
+ getConnector,
15281
+ requiredBotEvents,
15282
+ requiredBotScopes
15280
15283
  } from "@agor/core/gateway";
15281
15284
  import {
15282
15285
  GATEWAY_REDACTED_SENTINEL,
15283
15286
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
15287
+ getRequiredSecretFields,
15284
15288
  hasMinimumRole as hasMinimumRole2,
15285
15289
  ROLES as ROLES2
15286
15290
  } from "@agor/core/types";
@@ -15340,44 +15344,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
15340
15344
  agenticConfig: agenticConfigSchema.optional()
15341
15345
  }).superRefine((value, issue2) => {
15342
15346
  const config2 = value.config ?? {};
15343
- if (value.channelType === "slack") {
15344
- if (!config2.bot_token) {
15345
- issue2.addIssue({
15346
- code: "custom",
15347
- path: ["config", "bot_token"],
15348
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
15349
- });
15350
- }
15351
- if (config2.connection_mode === "socket" && !config2.app_token) {
15352
- issue2.addIssue({
15353
- code: "custom",
15354
- path: ["config", "app_token"],
15355
- message: "config.app_token is required for Slack Socket Mode."
15356
- });
15357
- }
15358
- }
15359
- if (value.channelType === "github") {
15360
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
15347
+ if (value.enabled !== false) {
15348
+ const requiredSecretMessages = {
15349
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
15350
+ app_token: "config.app_token is required for Slack Socket Mode.",
15351
+ private_key: "config.private_key is required for GitHub gateway channels.",
15352
+ app_password: "config.app_password is required for Teams gateway channels."
15353
+ };
15354
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
15361
15355
  if (!config2[field]) {
15362
15356
  issue2.addIssue({
15363
15357
  code: "custom",
15364
15358
  path: ["config", field],
15365
- message: `config.${field} is required for GitHub gateway channels.`
15359
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
15366
15360
  });
15367
15361
  }
15368
15362
  }
15369
15363
  }
15370
- if (value.channelType === "teams") {
15371
- for (const field of ["app_id", "app_password"]) {
15364
+ if (value.channelType === "github") {
15365
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
15372
15366
  if (!config2[field]) {
15373
15367
  issue2.addIssue({
15374
15368
  code: "custom",
15375
15369
  path: ["config", field],
15376
- message: `config.${field} is required for Teams gateway channels.`
15370
+ message: `config.${field} is required for GitHub gateway channels.`
15377
15371
  });
15378
15372
  }
15379
15373
  }
15380
15374
  }
15375
+ if (value.channelType === "teams" && !config2.app_id) {
15376
+ issue2.addIssue({
15377
+ code: "custom",
15378
+ path: ["config", "app_id"],
15379
+ message: "config.app_id is required for Teams gateway channels."
15380
+ });
15381
+ }
15382
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
15383
+ issue2.addIssue({
15384
+ code: "custom",
15385
+ path: ["agorUserId"],
15386
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
15387
+ });
15388
+ }
15381
15389
  });
15382
15390
  var slackThreadHistorySchema = external_exports.strictObject({
15383
15391
  sessionId: mcpOptionalId(
@@ -15441,6 +15449,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
15441
15449
  ),
15442
15450
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
15443
15451
  });
15452
+ var slackManifestGenerateSchema = external_exports.strictObject({
15453
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
15454
+ botDisplayName: mcpOptionalNonEmptyString(
15455
+ "botDisplayName",
15456
+ "Bot user display name. Defaults to appName."
15457
+ ),
15458
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
15459
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
15460
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
15461
+ alignUsers: external_exports.boolean().default(true).describe(
15462
+ "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)."
15463
+ ),
15464
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
15465
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
15466
+ "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."
15467
+ )
15468
+ });
15444
15469
 
15445
15470
  // src/mcp/tools/knowledge.ts
15446
15471
  import { createHash, randomUUID } from "crypto";
@@ -15982,7 +16007,7 @@ var agenticToolConfigSchema = external_exports.object({
15982
16007
  import { ROLES as ROLES4 } from "@agor/core/types";
15983
16008
 
15984
16009
  // src/mcp/tools/widgets.ts
15985
- import { MessageRole as MessageRole2 } from "@agor/core/types";
16010
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15986
16011
 
15987
16012
  // src/utils/append-system-message.ts
15988
16013
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -16065,6 +16090,30 @@ var envVarsSubmitSchema = external_exports.object({
16065
16090
  }
16066
16091
  });
16067
16092
 
16093
+ // src/widgets/gateway-token/index.ts
16094
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
16095
+ import {
16096
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
16097
+ hasMinimumRole as hasMinimumRole4,
16098
+ ROLES as ROLES5
16099
+ } from "@agor/core/types";
16100
+ var MAX_TOKEN_LENGTH = 8192;
16101
+ var gatewayTokenParamsSchema = external_exports.object({
16102
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
16103
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
16104
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
16105
+ 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, {
16106
+ message: "Token field names must be unique"
16107
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
16108
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
16109
+ }).strict();
16110
+ var gatewayTokenSubmitSchema = external_exports.object({
16111
+ tokens: external_exports.partialRecord(
16112
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
16113
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
16114
+ ).describe("Map of sensitive field name \u2192 credential value.")
16115
+ }).strict();
16116
+
16068
16117
  // src/mcp/server.ts
16069
16118
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
16070
16119
  function textResult(data) {
@@ -14753,11 +14753,15 @@ import {
14753
14753
  ThreadSessionMapRepository
14754
14754
  } from "@agor/core/db";
14755
14755
  import {
14756
- getConnector
14756
+ buildSlackManifest,
14757
+ getConnector,
14758
+ requiredBotEvents,
14759
+ requiredBotScopes
14757
14760
  } from "@agor/core/gateway";
14758
14761
  import {
14759
14762
  GATEWAY_REDACTED_SENTINEL,
14760
14763
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14764
+ getRequiredSecretFields,
14761
14765
  hasMinimumRole as hasMinimumRole2,
14762
14766
  ROLES as ROLES2
14763
14767
  } from "@agor/core/types";
@@ -14817,44 +14821,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14817
14821
  agenticConfig: agenticConfigSchema.optional()
14818
14822
  }).superRefine((value, issue2) => {
14819
14823
  const config2 = value.config ?? {};
14820
- if (value.channelType === "slack") {
14821
- if (!config2.bot_token) {
14822
- issue2.addIssue({
14823
- code: "custom",
14824
- path: ["config", "bot_token"],
14825
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14826
- });
14827
- }
14828
- if (config2.connection_mode === "socket" && !config2.app_token) {
14829
- issue2.addIssue({
14830
- code: "custom",
14831
- path: ["config", "app_token"],
14832
- message: "config.app_token is required for Slack Socket Mode."
14833
- });
14834
- }
14835
- }
14836
- if (value.channelType === "github") {
14837
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14824
+ if (value.enabled !== false) {
14825
+ const requiredSecretMessages = {
14826
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14827
+ app_token: "config.app_token is required for Slack Socket Mode.",
14828
+ private_key: "config.private_key is required for GitHub gateway channels.",
14829
+ app_password: "config.app_password is required for Teams gateway channels."
14830
+ };
14831
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14838
14832
  if (!config2[field]) {
14839
14833
  issue2.addIssue({
14840
14834
  code: "custom",
14841
14835
  path: ["config", field],
14842
- message: `config.${field} is required for GitHub gateway channels.`
14836
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14843
14837
  });
14844
14838
  }
14845
14839
  }
14846
14840
  }
14847
- if (value.channelType === "teams") {
14848
- for (const field of ["app_id", "app_password"]) {
14841
+ if (value.channelType === "github") {
14842
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14849
14843
  if (!config2[field]) {
14850
14844
  issue2.addIssue({
14851
14845
  code: "custom",
14852
14846
  path: ["config", field],
14853
- message: `config.${field} is required for Teams gateway channels.`
14847
+ message: `config.${field} is required for GitHub gateway channels.`
14854
14848
  });
14855
14849
  }
14856
14850
  }
14857
14851
  }
14852
+ if (value.channelType === "teams" && !config2.app_id) {
14853
+ issue2.addIssue({
14854
+ code: "custom",
14855
+ path: ["config", "app_id"],
14856
+ message: "config.app_id is required for Teams gateway channels."
14857
+ });
14858
+ }
14859
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14860
+ issue2.addIssue({
14861
+ code: "custom",
14862
+ path: ["agorUserId"],
14863
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14864
+ });
14865
+ }
14858
14866
  });
14859
14867
  var slackThreadHistorySchema = external_exports.strictObject({
14860
14868
  sessionId: mcpOptionalId(
@@ -14918,6 +14926,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14918
14926
  ),
14919
14927
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14920
14928
  });
14929
+ var slackManifestGenerateSchema = external_exports.strictObject({
14930
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14931
+ botDisplayName: mcpOptionalNonEmptyString(
14932
+ "botDisplayName",
14933
+ "Bot user display name. Defaults to appName."
14934
+ ),
14935
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14936
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14937
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14938
+ alignUsers: external_exports.boolean().default(true).describe(
14939
+ "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)."
14940
+ ),
14941
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14942
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14943
+ "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."
14944
+ )
14945
+ });
14921
14946
 
14922
14947
  // src/mcp/tools/knowledge.ts
14923
14948
  import { createHash, randomUUID } from "crypto";
@@ -15456,7 +15481,7 @@ var modelConfigInputSchema = external_exports.union([
15456
15481
  import { ROLES as ROLES4 } from "@agor/core/types";
15457
15482
 
15458
15483
  // src/mcp/tools/widgets.ts
15459
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15484
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15460
15485
 
15461
15486
  // src/utils/append-system-message.ts
15462
15487
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15539,6 +15564,30 @@ var envVarsSubmitSchema = external_exports.object({
15539
15564
  }
15540
15565
  });
15541
15566
 
15567
+ // src/widgets/gateway-token/index.ts
15568
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15569
+ import {
15570
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15571
+ hasMinimumRole as hasMinimumRole4,
15572
+ ROLES as ROLES5
15573
+ } from "@agor/core/types";
15574
+ var MAX_TOKEN_LENGTH = 8192;
15575
+ var gatewayTokenParamsSchema = external_exports.object({
15576
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15577
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15578
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15579
+ 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, {
15580
+ message: "Token field names must be unique"
15581
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15582
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15583
+ }).strict();
15584
+ var gatewayTokenSubmitSchema = external_exports.object({
15585
+ tokens: external_exports.partialRecord(
15586
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15587
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15588
+ ).describe("Map of sensitive field name \u2192 credential value.")
15589
+ }).strict();
15590
+
15542
15591
  // src/mcp/server.ts
15543
15592
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15544
15593
  function textResult(data) {