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
@@ -14763,11 +14763,15 @@ import {
14763
14763
  ThreadSessionMapRepository
14764
14764
  } from "@agor/core/db";
14765
14765
  import {
14766
- getConnector
14766
+ buildSlackManifest,
14767
+ getConnector,
14768
+ requiredBotEvents,
14769
+ requiredBotScopes
14767
14770
  } from "@agor/core/gateway";
14768
14771
  import {
14769
14772
  GATEWAY_REDACTED_SENTINEL,
14770
14773
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14774
+ getRequiredSecretFields,
14771
14775
  hasMinimumRole as hasMinimumRole2,
14772
14776
  ROLES as ROLES2
14773
14777
  } from "@agor/core/types";
@@ -14827,44 +14831,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14827
14831
  agenticConfig: agenticConfigSchema.optional()
14828
14832
  }).superRefine((value, issue2) => {
14829
14833
  const config2 = value.config ?? {};
14830
- if (value.channelType === "slack") {
14831
- if (!config2.bot_token) {
14832
- issue2.addIssue({
14833
- code: "custom",
14834
- path: ["config", "bot_token"],
14835
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14836
- });
14837
- }
14838
- if (config2.connection_mode === "socket" && !config2.app_token) {
14839
- issue2.addIssue({
14840
- code: "custom",
14841
- path: ["config", "app_token"],
14842
- message: "config.app_token is required for Slack Socket Mode."
14843
- });
14844
- }
14845
- }
14846
- if (value.channelType === "github") {
14847
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14834
+ if (value.enabled !== false) {
14835
+ const requiredSecretMessages = {
14836
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14837
+ app_token: "config.app_token is required for Slack Socket Mode.",
14838
+ private_key: "config.private_key is required for GitHub gateway channels.",
14839
+ app_password: "config.app_password is required for Teams gateway channels."
14840
+ };
14841
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14848
14842
  if (!config2[field]) {
14849
14843
  issue2.addIssue({
14850
14844
  code: "custom",
14851
14845
  path: ["config", field],
14852
- message: `config.${field} is required for GitHub gateway channels.`
14846
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14853
14847
  });
14854
14848
  }
14855
14849
  }
14856
14850
  }
14857
- if (value.channelType === "teams") {
14858
- for (const field of ["app_id", "app_password"]) {
14851
+ if (value.channelType === "github") {
14852
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14859
14853
  if (!config2[field]) {
14860
14854
  issue2.addIssue({
14861
14855
  code: "custom",
14862
14856
  path: ["config", field],
14863
- message: `config.${field} is required for Teams gateway channels.`
14857
+ message: `config.${field} is required for GitHub gateway channels.`
14864
14858
  });
14865
14859
  }
14866
14860
  }
14867
14861
  }
14862
+ if (value.channelType === "teams" && !config2.app_id) {
14863
+ issue2.addIssue({
14864
+ code: "custom",
14865
+ path: ["config", "app_id"],
14866
+ message: "config.app_id is required for Teams gateway channels."
14867
+ });
14868
+ }
14869
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14870
+ issue2.addIssue({
14871
+ code: "custom",
14872
+ path: ["agorUserId"],
14873
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14874
+ });
14875
+ }
14868
14876
  });
14869
14877
  var slackThreadHistorySchema = external_exports.strictObject({
14870
14878
  sessionId: mcpOptionalId(
@@ -14928,6 +14936,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14928
14936
  ),
14929
14937
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14930
14938
  });
14939
+ var slackManifestGenerateSchema = external_exports.strictObject({
14940
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14941
+ botDisplayName: mcpOptionalNonEmptyString(
14942
+ "botDisplayName",
14943
+ "Bot user display name. Defaults to appName."
14944
+ ),
14945
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14946
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14947
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14948
+ alignUsers: external_exports.boolean().default(true).describe(
14949
+ "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)."
14950
+ ),
14951
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14952
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14953
+ "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."
14954
+ )
14955
+ });
14931
14956
 
14932
14957
  // src/mcp/tools/knowledge.ts
14933
14958
  import { createHash, randomUUID } from "crypto";
@@ -15211,7 +15236,7 @@ var modelConfigInputSchema = external_exports.union([
15211
15236
  import { ROLES as ROLES4 } from "@agor/core/types";
15212
15237
 
15213
15238
  // src/mcp/tools/widgets.ts
15214
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15239
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15215
15240
 
15216
15241
  // src/utils/append-system-message.ts
15217
15242
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15294,6 +15319,30 @@ var envVarsSubmitSchema = external_exports.object({
15294
15319
  }
15295
15320
  });
15296
15321
 
15322
+ // src/widgets/gateway-token/index.ts
15323
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15324
+ import {
15325
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15326
+ hasMinimumRole as hasMinimumRole4,
15327
+ ROLES as ROLES5
15328
+ } from "@agor/core/types";
15329
+ var MAX_TOKEN_LENGTH = 8192;
15330
+ var gatewayTokenParamsSchema = external_exports.object({
15331
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15332
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15333
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15334
+ 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, {
15335
+ message: "Token field names must be unique"
15336
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15337
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15338
+ }).strict();
15339
+ var gatewayTokenSubmitSchema = external_exports.object({
15340
+ tokens: external_exports.partialRecord(
15341
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15342
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15343
+ ).describe("Map of sensitive field name \u2192 credential value.")
15344
+ }).strict();
15345
+
15297
15346
  // src/mcp/server.ts
15298
15347
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15299
15348
  function textResult(data) {
@@ -14786,11 +14786,15 @@ import {
14786
14786
  ThreadSessionMapRepository
14787
14787
  } from "@agor/core/db";
14788
14788
  import {
14789
- getConnector
14789
+ buildSlackManifest,
14790
+ getConnector,
14791
+ requiredBotEvents,
14792
+ requiredBotScopes
14790
14793
  } from "@agor/core/gateway";
14791
14794
  import {
14792
14795
  GATEWAY_REDACTED_SENTINEL,
14793
14796
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14797
+ getRequiredSecretFields,
14794
14798
  hasMinimumRole as hasMinimumRole2,
14795
14799
  ROLES as ROLES2
14796
14800
  } from "@agor/core/types";
@@ -14850,44 +14854,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14850
14854
  agenticConfig: agenticConfigSchema.optional()
14851
14855
  }).superRefine((value, issue2) => {
14852
14856
  const config2 = value.config ?? {};
14853
- if (value.channelType === "slack") {
14854
- if (!config2.bot_token) {
14855
- issue2.addIssue({
14856
- code: "custom",
14857
- path: ["config", "bot_token"],
14858
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14859
- });
14860
- }
14861
- if (config2.connection_mode === "socket" && !config2.app_token) {
14862
- issue2.addIssue({
14863
- code: "custom",
14864
- path: ["config", "app_token"],
14865
- message: "config.app_token is required for Slack Socket Mode."
14866
- });
14867
- }
14868
- }
14869
- if (value.channelType === "github") {
14870
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14857
+ if (value.enabled !== false) {
14858
+ const requiredSecretMessages = {
14859
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14860
+ app_token: "config.app_token is required for Slack Socket Mode.",
14861
+ private_key: "config.private_key is required for GitHub gateway channels.",
14862
+ app_password: "config.app_password is required for Teams gateway channels."
14863
+ };
14864
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14871
14865
  if (!config2[field]) {
14872
14866
  issue2.addIssue({
14873
14867
  code: "custom",
14874
14868
  path: ["config", field],
14875
- message: `config.${field} is required for GitHub gateway channels.`
14869
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14876
14870
  });
14877
14871
  }
14878
14872
  }
14879
14873
  }
14880
- if (value.channelType === "teams") {
14881
- for (const field of ["app_id", "app_password"]) {
14874
+ if (value.channelType === "github") {
14875
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14882
14876
  if (!config2[field]) {
14883
14877
  issue2.addIssue({
14884
14878
  code: "custom",
14885
14879
  path: ["config", field],
14886
- message: `config.${field} is required for Teams gateway channels.`
14880
+ message: `config.${field} is required for GitHub gateway channels.`
14887
14881
  });
14888
14882
  }
14889
14883
  }
14890
14884
  }
14885
+ if (value.channelType === "teams" && !config2.app_id) {
14886
+ issue2.addIssue({
14887
+ code: "custom",
14888
+ path: ["config", "app_id"],
14889
+ message: "config.app_id is required for Teams gateway channels."
14890
+ });
14891
+ }
14892
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14893
+ issue2.addIssue({
14894
+ code: "custom",
14895
+ path: ["agorUserId"],
14896
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14897
+ });
14898
+ }
14891
14899
  });
14892
14900
  var slackThreadHistorySchema = external_exports.strictObject({
14893
14901
  sessionId: mcpOptionalId(
@@ -14951,6 +14959,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14951
14959
  ),
14952
14960
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14953
14961
  });
14962
+ var slackManifestGenerateSchema = external_exports.strictObject({
14963
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14964
+ botDisplayName: mcpOptionalNonEmptyString(
14965
+ "botDisplayName",
14966
+ "Bot user display name. Defaults to appName."
14967
+ ),
14968
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14969
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14970
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14971
+ alignUsers: external_exports.boolean().default(true).describe(
14972
+ "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)."
14973
+ ),
14974
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14975
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14976
+ "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."
14977
+ )
14978
+ });
14954
14979
 
14955
14980
  // src/mcp/tools/knowledge.ts
14956
14981
  import { createHash, randomUUID } from "crypto";
@@ -15472,7 +15497,7 @@ var modelConfigInputSchema = external_exports.union([
15472
15497
  import { ROLES as ROLES4 } from "@agor/core/types";
15473
15498
 
15474
15499
  // src/mcp/tools/widgets.ts
15475
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15500
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15476
15501
 
15477
15502
  // src/utils/append-system-message.ts
15478
15503
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15555,6 +15580,30 @@ var envVarsSubmitSchema = external_exports.object({
15555
15580
  }
15556
15581
  });
15557
15582
 
15583
+ // src/widgets/gateway-token/index.ts
15584
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15585
+ import {
15586
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15587
+ hasMinimumRole as hasMinimumRole4,
15588
+ ROLES as ROLES5
15589
+ } from "@agor/core/types";
15590
+ var MAX_TOKEN_LENGTH = 8192;
15591
+ var gatewayTokenParamsSchema = external_exports.object({
15592
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15593
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15594
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15595
+ 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, {
15596
+ message: "Token field names must be unique"
15597
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15598
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15599
+ }).strict();
15600
+ var gatewayTokenSubmitSchema = external_exports.object({
15601
+ tokens: external_exports.partialRecord(
15602
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15603
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15604
+ ).describe("Map of sensitive field name \u2192 credential value.")
15605
+ }).strict();
15606
+
15558
15607
  // src/mcp/server.ts
15559
15608
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15560
15609
  function coerceString(value) {
@@ -14750,11 +14750,15 @@ import {
14750
14750
  ThreadSessionMapRepository
14751
14751
  } from "@agor/core/db";
14752
14752
  import {
14753
- getConnector
14753
+ buildSlackManifest,
14754
+ getConnector,
14755
+ requiredBotEvents,
14756
+ requiredBotScopes
14754
14757
  } from "@agor/core/gateway";
14755
14758
  import {
14756
14759
  GATEWAY_REDACTED_SENTINEL,
14757
14760
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14761
+ getRequiredSecretFields,
14758
14762
  hasMinimumRole as hasMinimumRole2,
14759
14763
  ROLES as ROLES2
14760
14764
  } from "@agor/core/types";
@@ -14814,44 +14818,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14814
14818
  agenticConfig: agenticConfigSchema.optional()
14815
14819
  }).superRefine((value, issue2) => {
14816
14820
  const config2 = value.config ?? {};
14817
- if (value.channelType === "slack") {
14818
- if (!config2.bot_token) {
14819
- issue2.addIssue({
14820
- code: "custom",
14821
- path: ["config", "bot_token"],
14822
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14823
- });
14824
- }
14825
- if (config2.connection_mode === "socket" && !config2.app_token) {
14826
- issue2.addIssue({
14827
- code: "custom",
14828
- path: ["config", "app_token"],
14829
- message: "config.app_token is required for Slack Socket Mode."
14830
- });
14831
- }
14832
- }
14833
- if (value.channelType === "github") {
14834
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14821
+ if (value.enabled !== false) {
14822
+ const requiredSecretMessages = {
14823
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14824
+ app_token: "config.app_token is required for Slack Socket Mode.",
14825
+ private_key: "config.private_key is required for GitHub gateway channels.",
14826
+ app_password: "config.app_password is required for Teams gateway channels."
14827
+ };
14828
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14835
14829
  if (!config2[field]) {
14836
14830
  issue2.addIssue({
14837
14831
  code: "custom",
14838
14832
  path: ["config", field],
14839
- message: `config.${field} is required for GitHub gateway channels.`
14833
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14840
14834
  });
14841
14835
  }
14842
14836
  }
14843
14837
  }
14844
- if (value.channelType === "teams") {
14845
- for (const field of ["app_id", "app_password"]) {
14838
+ if (value.channelType === "github") {
14839
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14846
14840
  if (!config2[field]) {
14847
14841
  issue2.addIssue({
14848
14842
  code: "custom",
14849
14843
  path: ["config", field],
14850
- message: `config.${field} is required for Teams gateway channels.`
14844
+ message: `config.${field} is required for GitHub gateway channels.`
14851
14845
  });
14852
14846
  }
14853
14847
  }
14854
14848
  }
14849
+ if (value.channelType === "teams" && !config2.app_id) {
14850
+ issue2.addIssue({
14851
+ code: "custom",
14852
+ path: ["config", "app_id"],
14853
+ message: "config.app_id is required for Teams gateway channels."
14854
+ });
14855
+ }
14856
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14857
+ issue2.addIssue({
14858
+ code: "custom",
14859
+ path: ["agorUserId"],
14860
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14861
+ });
14862
+ }
14855
14863
  });
14856
14864
  var slackThreadHistorySchema = external_exports.strictObject({
14857
14865
  sessionId: mcpOptionalId(
@@ -14915,6 +14923,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14915
14923
  ),
14916
14924
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14917
14925
  });
14926
+ var slackManifestGenerateSchema = external_exports.strictObject({
14927
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14928
+ botDisplayName: mcpOptionalNonEmptyString(
14929
+ "botDisplayName",
14930
+ "Bot user display name. Defaults to appName."
14931
+ ),
14932
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14933
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14934
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14935
+ alignUsers: external_exports.boolean().default(true).describe(
14936
+ "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)."
14937
+ ),
14938
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14939
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14940
+ "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."
14941
+ )
14942
+ });
14918
14943
 
14919
14944
  // src/mcp/tools/knowledge.ts
14920
14945
  import { createHash, randomUUID } from "crypto";
@@ -15450,7 +15475,7 @@ var modelConfigInputSchema = external_exports.union([
15450
15475
  import { ROLES as ROLES4 } from "@agor/core/types";
15451
15476
 
15452
15477
  // src/mcp/tools/widgets.ts
15453
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15478
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15454
15479
 
15455
15480
  // src/utils/append-system-message.ts
15456
15481
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15533,6 +15558,30 @@ var envVarsSubmitSchema = external_exports.object({
15533
15558
  }
15534
15559
  });
15535
15560
 
15561
+ // src/widgets/gateway-token/index.ts
15562
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15563
+ import {
15564
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15565
+ hasMinimumRole as hasMinimumRole4,
15566
+ ROLES as ROLES5
15567
+ } from "@agor/core/types";
15568
+ var MAX_TOKEN_LENGTH = 8192;
15569
+ var gatewayTokenParamsSchema = external_exports.object({
15570
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15571
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15572
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15573
+ 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, {
15574
+ message: "Token field names must be unique"
15575
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15576
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15577
+ }).strict();
15578
+ var gatewayTokenSubmitSchema = external_exports.object({
15579
+ tokens: external_exports.partialRecord(
15580
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15581
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15582
+ ).describe("Map of sensitive field name \u2192 credential value.")
15583
+ }).strict();
15584
+
15536
15585
  // src/mcp/server.ts
15537
15586
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15538
15587
  function coerceString(value) {
@@ -14750,11 +14750,15 @@ import {
14750
14750
  ThreadSessionMapRepository
14751
14751
  } from "@agor/core/db";
14752
14752
  import {
14753
- getConnector
14753
+ buildSlackManifest,
14754
+ getConnector,
14755
+ requiredBotEvents,
14756
+ requiredBotScopes
14754
14757
  } from "@agor/core/gateway";
14755
14758
  import {
14756
14759
  GATEWAY_REDACTED_SENTINEL,
14757
14760
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14761
+ getRequiredSecretFields,
14758
14762
  hasMinimumRole as hasMinimumRole2,
14759
14763
  ROLES as ROLES2
14760
14764
  } from "@agor/core/types";
@@ -14814,44 +14818,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14814
14818
  agenticConfig: agenticConfigSchema.optional()
14815
14819
  }).superRefine((value, issue2) => {
14816
14820
  const config2 = value.config ?? {};
14817
- if (value.channelType === "slack") {
14818
- if (!config2.bot_token) {
14819
- issue2.addIssue({
14820
- code: "custom",
14821
- path: ["config", "bot_token"],
14822
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14823
- });
14824
- }
14825
- if (config2.connection_mode === "socket" && !config2.app_token) {
14826
- issue2.addIssue({
14827
- code: "custom",
14828
- path: ["config", "app_token"],
14829
- message: "config.app_token is required for Slack Socket Mode."
14830
- });
14831
- }
14832
- }
14833
- if (value.channelType === "github") {
14834
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14821
+ if (value.enabled !== false) {
14822
+ const requiredSecretMessages = {
14823
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14824
+ app_token: "config.app_token is required for Slack Socket Mode.",
14825
+ private_key: "config.private_key is required for GitHub gateway channels.",
14826
+ app_password: "config.app_password is required for Teams gateway channels."
14827
+ };
14828
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14835
14829
  if (!config2[field]) {
14836
14830
  issue2.addIssue({
14837
14831
  code: "custom",
14838
14832
  path: ["config", field],
14839
- message: `config.${field} is required for GitHub gateway channels.`
14833
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14840
14834
  });
14841
14835
  }
14842
14836
  }
14843
14837
  }
14844
- if (value.channelType === "teams") {
14845
- for (const field of ["app_id", "app_password"]) {
14838
+ if (value.channelType === "github") {
14839
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14846
14840
  if (!config2[field]) {
14847
14841
  issue2.addIssue({
14848
14842
  code: "custom",
14849
14843
  path: ["config", field],
14850
- message: `config.${field} is required for Teams gateway channels.`
14844
+ message: `config.${field} is required for GitHub gateway channels.`
14851
14845
  });
14852
14846
  }
14853
14847
  }
14854
14848
  }
14849
+ if (value.channelType === "teams" && !config2.app_id) {
14850
+ issue2.addIssue({
14851
+ code: "custom",
14852
+ path: ["config", "app_id"],
14853
+ message: "config.app_id is required for Teams gateway channels."
14854
+ });
14855
+ }
14856
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14857
+ issue2.addIssue({
14858
+ code: "custom",
14859
+ path: ["agorUserId"],
14860
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14861
+ });
14862
+ }
14855
14863
  });
14856
14864
  var slackThreadHistorySchema = external_exports.strictObject({
14857
14865
  sessionId: mcpOptionalId(
@@ -14915,6 +14923,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14915
14923
  ),
14916
14924
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14917
14925
  });
14926
+ var slackManifestGenerateSchema = external_exports.strictObject({
14927
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14928
+ botDisplayName: mcpOptionalNonEmptyString(
14929
+ "botDisplayName",
14930
+ "Bot user display name. Defaults to appName."
14931
+ ),
14932
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14933
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14934
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14935
+ alignUsers: external_exports.boolean().default(true).describe(
14936
+ "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)."
14937
+ ),
14938
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14939
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14940
+ "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."
14941
+ )
14942
+ });
14918
14943
 
14919
14944
  // src/mcp/tools/knowledge.ts
14920
14945
  import { createHash, randomUUID } from "crypto";
@@ -15450,7 +15475,7 @@ var modelConfigInputSchema = external_exports.union([
15450
15475
  import { ROLES as ROLES4 } from "@agor/core/types";
15451
15476
 
15452
15477
  // src/mcp/tools/widgets.ts
15453
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15478
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15454
15479
 
15455
15480
  // src/utils/append-system-message.ts
15456
15481
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15533,6 +15558,30 @@ var envVarsSubmitSchema = external_exports.object({
15533
15558
  }
15534
15559
  });
15535
15560
 
15561
+ // src/widgets/gateway-token/index.ts
15562
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15563
+ import {
15564
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15565
+ hasMinimumRole as hasMinimumRole4,
15566
+ ROLES as ROLES5
15567
+ } from "@agor/core/types";
15568
+ var MAX_TOKEN_LENGTH = 8192;
15569
+ var gatewayTokenParamsSchema = external_exports.object({
15570
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15571
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15572
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15573
+ 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, {
15574
+ message: "Token field names must be unique"
15575
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15576
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15577
+ }).strict();
15578
+ var gatewayTokenSubmitSchema = external_exports.object({
15579
+ tokens: external_exports.partialRecord(
15580
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15581
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15582
+ ).describe("Map of sensitive field name \u2192 credential value.")
15583
+ }).strict();
15584
+
15536
15585
  // src/mcp/server.ts
15537
15586
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15538
15587
  function coerceString(value) {