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
@@ -14739,11 +14739,15 @@ import {
14739
14739
  ThreadSessionMapRepository
14740
14740
  } from "@agor/core/db";
14741
14741
  import {
14742
- getConnector
14742
+ buildSlackManifest,
14743
+ getConnector,
14744
+ requiredBotEvents,
14745
+ requiredBotScopes
14743
14746
  } from "@agor/core/gateway";
14744
14747
  import {
14745
14748
  GATEWAY_REDACTED_SENTINEL,
14746
14749
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14750
+ getRequiredSecretFields,
14747
14751
  hasMinimumRole as hasMinimumRole2,
14748
14752
  ROLES as ROLES2
14749
14753
  } from "@agor/core/types";
@@ -14803,44 +14807,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14803
14807
  agenticConfig: agenticConfigSchema.optional()
14804
14808
  }).superRefine((value, issue2) => {
14805
14809
  const config2 = value.config ?? {};
14806
- if (value.channelType === "slack") {
14807
- if (!config2.bot_token) {
14808
- issue2.addIssue({
14809
- code: "custom",
14810
- path: ["config", "bot_token"],
14811
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14812
- });
14813
- }
14814
- if (config2.connection_mode === "socket" && !config2.app_token) {
14815
- issue2.addIssue({
14816
- code: "custom",
14817
- path: ["config", "app_token"],
14818
- message: "config.app_token is required for Slack Socket Mode."
14819
- });
14820
- }
14821
- }
14822
- if (value.channelType === "github") {
14823
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14810
+ if (value.enabled !== false) {
14811
+ const requiredSecretMessages = {
14812
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14813
+ app_token: "config.app_token is required for Slack Socket Mode.",
14814
+ private_key: "config.private_key is required for GitHub gateway channels.",
14815
+ app_password: "config.app_password is required for Teams gateway channels."
14816
+ };
14817
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14824
14818
  if (!config2[field]) {
14825
14819
  issue2.addIssue({
14826
14820
  code: "custom",
14827
14821
  path: ["config", field],
14828
- message: `config.${field} is required for GitHub gateway channels.`
14822
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14829
14823
  });
14830
14824
  }
14831
14825
  }
14832
14826
  }
14833
- if (value.channelType === "teams") {
14834
- for (const field of ["app_id", "app_password"]) {
14827
+ if (value.channelType === "github") {
14828
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
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 Teams gateway channels.`
14833
+ message: `config.${field} is required for GitHub gateway channels.`
14840
14834
  });
14841
14835
  }
14842
14836
  }
14843
14837
  }
14838
+ if (value.channelType === "teams" && !config2.app_id) {
14839
+ issue2.addIssue({
14840
+ code: "custom",
14841
+ path: ["config", "app_id"],
14842
+ message: "config.app_id is required for Teams gateway channels."
14843
+ });
14844
+ }
14845
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14846
+ issue2.addIssue({
14847
+ code: "custom",
14848
+ path: ["agorUserId"],
14849
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14850
+ });
14851
+ }
14844
14852
  });
14845
14853
  var slackThreadHistorySchema = external_exports.strictObject({
14846
14854
  sessionId: mcpOptionalId(
@@ -14904,6 +14912,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14904
14912
  ),
14905
14913
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14906
14914
  });
14915
+ var slackManifestGenerateSchema = external_exports.strictObject({
14916
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14917
+ botDisplayName: mcpOptionalNonEmptyString(
14918
+ "botDisplayName",
14919
+ "Bot user display name. Defaults to appName."
14920
+ ),
14921
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14922
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14923
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14924
+ alignUsers: external_exports.boolean().default(true).describe(
14925
+ "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)."
14926
+ ),
14927
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14928
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14929
+ "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."
14930
+ )
14931
+ });
14907
14932
 
14908
14933
  // src/mcp/tools/knowledge.ts
14909
14934
  import { createHash, randomUUID } from "crypto";
@@ -15442,7 +15467,7 @@ var modelConfigInputSchema = external_exports.union([
15442
15467
  import { ROLES as ROLES4 } from "@agor/core/types";
15443
15468
 
15444
15469
  // src/mcp/tools/widgets.ts
15445
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15470
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15446
15471
 
15447
15472
  // src/utils/append-system-message.ts
15448
15473
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15525,6 +15550,30 @@ var envVarsSubmitSchema = external_exports.object({
15525
15550
  }
15526
15551
  });
15527
15552
 
15553
+ // src/widgets/gateway-token/index.ts
15554
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15555
+ import {
15556
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15557
+ hasMinimumRole as hasMinimumRole4,
15558
+ ROLES as ROLES5
15559
+ } from "@agor/core/types";
15560
+ var MAX_TOKEN_LENGTH = 8192;
15561
+ var gatewayTokenParamsSchema = external_exports.object({
15562
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15563
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15564
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15565
+ 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, {
15566
+ message: "Token field names must be unique"
15567
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15568
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15569
+ }).strict();
15570
+ var gatewayTokenSubmitSchema = external_exports.object({
15571
+ tokens: external_exports.partialRecord(
15572
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15573
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15574
+ ).describe("Map of sensitive field name \u2192 credential value.")
15575
+ }).strict();
15576
+
15528
15577
  // src/mcp/server.ts
15529
15578
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15530
15579
  function coerceString(value) {
@@ -14752,11 +14752,15 @@ import {
14752
14752
  ThreadSessionMapRepository
14753
14753
  } from "@agor/core/db";
14754
14754
  import {
14755
- getConnector
14755
+ buildSlackManifest,
14756
+ getConnector,
14757
+ requiredBotEvents,
14758
+ requiredBotScopes
14756
14759
  } from "@agor/core/gateway";
14757
14760
  import {
14758
14761
  GATEWAY_REDACTED_SENTINEL,
14759
14762
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14763
+ getRequiredSecretFields,
14760
14764
  hasMinimumRole as hasMinimumRole2,
14761
14765
  ROLES as ROLES2
14762
14766
  } from "@agor/core/types";
@@ -14816,44 +14820,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14816
14820
  agenticConfig: agenticConfigSchema.optional()
14817
14821
  }).superRefine((value, issue2) => {
14818
14822
  const config2 = value.config ?? {};
14819
- if (value.channelType === "slack") {
14820
- if (!config2.bot_token) {
14821
- issue2.addIssue({
14822
- code: "custom",
14823
- path: ["config", "bot_token"],
14824
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14825
- });
14826
- }
14827
- if (config2.connection_mode === "socket" && !config2.app_token) {
14828
- issue2.addIssue({
14829
- code: "custom",
14830
- path: ["config", "app_token"],
14831
- message: "config.app_token is required for Slack Socket Mode."
14832
- });
14833
- }
14834
- }
14835
- if (value.channelType === "github") {
14836
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14823
+ if (value.enabled !== false) {
14824
+ const requiredSecretMessages = {
14825
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14826
+ app_token: "config.app_token is required for Slack Socket Mode.",
14827
+ private_key: "config.private_key is required for GitHub gateway channels.",
14828
+ app_password: "config.app_password is required for Teams gateway channels."
14829
+ };
14830
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14837
14831
  if (!config2[field]) {
14838
14832
  issue2.addIssue({
14839
14833
  code: "custom",
14840
14834
  path: ["config", field],
14841
- message: `config.${field} is required for GitHub gateway channels.`
14835
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14842
14836
  });
14843
14837
  }
14844
14838
  }
14845
14839
  }
14846
- if (value.channelType === "teams") {
14847
- for (const field of ["app_id", "app_password"]) {
14840
+ if (value.channelType === "github") {
14841
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
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 Teams gateway channels.`
14846
+ message: `config.${field} is required for GitHub gateway channels.`
14853
14847
  });
14854
14848
  }
14855
14849
  }
14856
14850
  }
14851
+ if (value.channelType === "teams" && !config2.app_id) {
14852
+ issue2.addIssue({
14853
+ code: "custom",
14854
+ path: ["config", "app_id"],
14855
+ message: "config.app_id is required for Teams gateway channels."
14856
+ });
14857
+ }
14858
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14859
+ issue2.addIssue({
14860
+ code: "custom",
14861
+ path: ["agorUserId"],
14862
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14863
+ });
14864
+ }
14857
14865
  });
14858
14866
  var slackThreadHistorySchema = external_exports.strictObject({
14859
14867
  sessionId: mcpOptionalId(
@@ -14917,6 +14925,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14917
14925
  ),
14918
14926
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14919
14927
  });
14928
+ var slackManifestGenerateSchema = external_exports.strictObject({
14929
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14930
+ botDisplayName: mcpOptionalNonEmptyString(
14931
+ "botDisplayName",
14932
+ "Bot user display name. Defaults to appName."
14933
+ ),
14934
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14935
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14936
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14937
+ alignUsers: external_exports.boolean().default(true).describe(
14938
+ "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)."
14939
+ ),
14940
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14941
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14942
+ "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."
14943
+ )
14944
+ });
14920
14945
 
14921
14946
  // src/mcp/tools/knowledge.ts
14922
14947
  import { createHash, randomUUID } from "crypto";
@@ -15455,7 +15480,7 @@ var modelConfigInputSchema = external_exports.union([
15455
15480
  import { ROLES as ROLES4 } from "@agor/core/types";
15456
15481
 
15457
15482
  // src/mcp/tools/widgets.ts
15458
- import { MessageRole as MessageRole2 } from "@agor/core/types";
15483
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
15459
15484
 
15460
15485
  // src/utils/append-system-message.ts
15461
15486
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -15538,6 +15563,30 @@ var envVarsSubmitSchema = external_exports.object({
15538
15563
  }
15539
15564
  });
15540
15565
 
15566
+ // src/widgets/gateway-token/index.ts
15567
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
15568
+ import {
15569
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
15570
+ hasMinimumRole as hasMinimumRole4,
15571
+ ROLES as ROLES5
15572
+ } from "@agor/core/types";
15573
+ var MAX_TOKEN_LENGTH = 8192;
15574
+ var gatewayTokenParamsSchema = external_exports.object({
15575
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
15576
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
15577
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
15578
+ 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, {
15579
+ message: "Token field names must be unique"
15580
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
15581
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
15582
+ }).strict();
15583
+ var gatewayTokenSubmitSchema = external_exports.object({
15584
+ tokens: external_exports.partialRecord(
15585
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
15586
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
15587
+ ).describe("Map of sensitive field name \u2192 credential value.")
15588
+ }).strict();
15589
+
15541
15590
  // src/mcp/server.ts
15542
15591
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
15543
15592
  function coerceString(value) {
@@ -15325,11 +15325,15 @@ import {
15325
15325
  ThreadSessionMapRepository
15326
15326
  } from "@agor/core/db";
15327
15327
  import {
15328
- getConnector
15328
+ buildSlackManifest,
15329
+ getConnector,
15330
+ requiredBotEvents,
15331
+ requiredBotScopes
15329
15332
  } from "@agor/core/gateway";
15330
15333
  import {
15331
15334
  GATEWAY_REDACTED_SENTINEL,
15332
15335
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
15336
+ getRequiredSecretFields,
15333
15337
  hasMinimumRole as hasMinimumRole2,
15334
15338
  ROLES as ROLES2
15335
15339
  } from "@agor/core/types";
@@ -15389,44 +15393,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
15389
15393
  agenticConfig: agenticConfigSchema.optional()
15390
15394
  }).superRefine((value, issue2) => {
15391
15395
  const config2 = value.config ?? {};
15392
- if (value.channelType === "slack") {
15393
- if (!config2.bot_token) {
15394
- issue2.addIssue({
15395
- code: "custom",
15396
- path: ["config", "bot_token"],
15397
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
15398
- });
15399
- }
15400
- if (config2.connection_mode === "socket" && !config2.app_token) {
15401
- issue2.addIssue({
15402
- code: "custom",
15403
- path: ["config", "app_token"],
15404
- message: "config.app_token is required for Slack Socket Mode."
15405
- });
15406
- }
15407
- }
15408
- if (value.channelType === "github") {
15409
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
15396
+ if (value.enabled !== false) {
15397
+ const requiredSecretMessages = {
15398
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
15399
+ app_token: "config.app_token is required for Slack Socket Mode.",
15400
+ private_key: "config.private_key is required for GitHub gateway channels.",
15401
+ app_password: "config.app_password is required for Teams gateway channels."
15402
+ };
15403
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
15410
15404
  if (!config2[field]) {
15411
15405
  issue2.addIssue({
15412
15406
  code: "custom",
15413
15407
  path: ["config", field],
15414
- message: `config.${field} is required for GitHub gateway channels.`
15408
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
15415
15409
  });
15416
15410
  }
15417
15411
  }
15418
15412
  }
15419
- if (value.channelType === "teams") {
15420
- for (const field of ["app_id", "app_password"]) {
15413
+ if (value.channelType === "github") {
15414
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
15421
15415
  if (!config2[field]) {
15422
15416
  issue2.addIssue({
15423
15417
  code: "custom",
15424
15418
  path: ["config", field],
15425
- message: `config.${field} is required for Teams gateway channels.`
15419
+ message: `config.${field} is required for GitHub gateway channels.`
15426
15420
  });
15427
15421
  }
15428
15422
  }
15429
15423
  }
15424
+ if (value.channelType === "teams" && !config2.app_id) {
15425
+ issue2.addIssue({
15426
+ code: "custom",
15427
+ path: ["config", "app_id"],
15428
+ message: "config.app_id is required for Teams gateway channels."
15429
+ });
15430
+ }
15431
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
15432
+ issue2.addIssue({
15433
+ code: "custom",
15434
+ path: ["agorUserId"],
15435
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
15436
+ });
15437
+ }
15430
15438
  });
15431
15439
  var slackThreadHistorySchema = external_exports.strictObject({
15432
15440
  sessionId: mcpOptionalId(
@@ -15490,6 +15498,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
15490
15498
  ),
15491
15499
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
15492
15500
  });
15501
+ var slackManifestGenerateSchema = external_exports.strictObject({
15502
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
15503
+ botDisplayName: mcpOptionalNonEmptyString(
15504
+ "botDisplayName",
15505
+ "Bot user display name. Defaults to appName."
15506
+ ),
15507
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
15508
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
15509
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
15510
+ alignUsers: external_exports.boolean().default(true).describe(
15511
+ "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)."
15512
+ ),
15513
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
15514
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
15515
+ "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."
15516
+ )
15517
+ });
15493
15518
 
15494
15519
  // src/mcp/tools/knowledge.ts
15495
15520
  import { createHash, randomUUID } from "crypto";
@@ -16028,7 +16053,7 @@ var modelConfigInputSchema = external_exports.union([
16028
16053
  import { ROLES as ROLES4 } from "@agor/core/types";
16029
16054
 
16030
16055
  // src/mcp/tools/widgets.ts
16031
- import { MessageRole as MessageRole2 } from "@agor/core/types";
16056
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
16032
16057
 
16033
16058
  // src/utils/append-system-message.ts
16034
16059
  import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
@@ -16111,6 +16136,30 @@ var envVarsSubmitSchema = external_exports.object({
16111
16136
  }
16112
16137
  });
16113
16138
 
16139
+ // src/widgets/gateway-token/index.ts
16140
+ import { Forbidden as Forbidden2 } from "@agor/core/feathers";
16141
+ import {
16142
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
16143
+ hasMinimumRole as hasMinimumRole4,
16144
+ ROLES as ROLES5
16145
+ } from "@agor/core/types";
16146
+ var MAX_TOKEN_LENGTH = 8192;
16147
+ var gatewayTokenParamsSchema = external_exports.object({
16148
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
16149
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
16150
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
16151
+ 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, {
16152
+ message: "Token field names must be unique"
16153
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
16154
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
16155
+ }).strict();
16156
+ var gatewayTokenSubmitSchema = external_exports.object({
16157
+ tokens: external_exports.partialRecord(
16158
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
16159
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
16160
+ ).describe("Map of sensitive field name \u2192 credential value.")
16161
+ }).strict();
16162
+
16114
16163
  // src/mcp/server.ts
16115
16164
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
16116
16165
  function coerceString(value) {
@@ -14747,11 +14747,15 @@ import {
14747
14747
  ThreadSessionMapRepository
14748
14748
  } from "@agor/core/db";
14749
14749
  import {
14750
- getConnector
14750
+ buildSlackManifest,
14751
+ getConnector,
14752
+ requiredBotEvents,
14753
+ requiredBotScopes
14751
14754
  } from "@agor/core/gateway";
14752
14755
  import {
14753
14756
  GATEWAY_REDACTED_SENTINEL,
14754
14757
  GATEWAY_SENSITIVE_CONFIG_FIELDS,
14758
+ getRequiredSecretFields,
14755
14759
  hasMinimumRole as hasMinimumRole2,
14756
14760
  ROLES as ROLES2
14757
14761
  } from "@agor/core/types";
@@ -14811,44 +14815,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14811
14815
  agenticConfig: agenticConfigSchema.optional()
14812
14816
  }).superRefine((value, issue2) => {
14813
14817
  const config2 = value.config ?? {};
14814
- if (value.channelType === "slack") {
14815
- if (!config2.bot_token) {
14816
- issue2.addIssue({
14817
- code: "custom",
14818
- path: ["config", "bot_token"],
14819
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14820
- });
14821
- }
14822
- if (config2.connection_mode === "socket" && !config2.app_token) {
14823
- issue2.addIssue({
14824
- code: "custom",
14825
- path: ["config", "app_token"],
14826
- message: "config.app_token is required for Slack Socket Mode."
14827
- });
14828
- }
14829
- }
14830
- if (value.channelType === "github") {
14831
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
14818
+ if (value.enabled !== false) {
14819
+ const requiredSecretMessages = {
14820
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
14821
+ app_token: "config.app_token is required for Slack Socket Mode.",
14822
+ private_key: "config.private_key is required for GitHub gateway channels.",
14823
+ app_password: "config.app_password is required for Teams gateway channels."
14824
+ };
14825
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14832
14826
  if (!config2[field]) {
14833
14827
  issue2.addIssue({
14834
14828
  code: "custom",
14835
14829
  path: ["config", field],
14836
- message: `config.${field} is required for GitHub gateway channels.`
14830
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14837
14831
  });
14838
14832
  }
14839
14833
  }
14840
14834
  }
14841
- if (value.channelType === "teams") {
14842
- for (const field of ["app_id", "app_password"]) {
14835
+ if (value.channelType === "github") {
14836
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14843
14837
  if (!config2[field]) {
14844
14838
  issue2.addIssue({
14845
14839
  code: "custom",
14846
14840
  path: ["config", field],
14847
- message: `config.${field} is required for Teams gateway channels.`
14841
+ message: `config.${field} is required for GitHub gateway channels.`
14848
14842
  });
14849
14843
  }
14850
14844
  }
14851
14845
  }
14846
+ if (value.channelType === "teams" && !config2.app_id) {
14847
+ issue2.addIssue({
14848
+ code: "custom",
14849
+ path: ["config", "app_id"],
14850
+ message: "config.app_id is required for Teams gateway channels."
14851
+ });
14852
+ }
14853
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
14854
+ issue2.addIssue({
14855
+ code: "custom",
14856
+ path: ["agorUserId"],
14857
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
14858
+ });
14859
+ }
14852
14860
  });
14853
14861
  var slackThreadHistorySchema = external_exports.strictObject({
14854
14862
  sessionId: mcpOptionalId(
@@ -14912,6 +14920,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
14912
14920
  ),
14913
14921
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
14914
14922
  });
14923
+ var slackManifestGenerateSchema = external_exports.strictObject({
14924
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
14925
+ botDisplayName: mcpOptionalNonEmptyString(
14926
+ "botDisplayName",
14927
+ "Bot user display name. Defaults to appName."
14928
+ ),
14929
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
14930
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
14931
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
14932
+ alignUsers: external_exports.boolean().default(true).describe(
14933
+ "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)."
14934
+ ),
14935
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
14936
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
14937
+ "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."
14938
+ )
14939
+ });
14915
14940
 
14916
14941
  // src/mcp/tools/knowledge.ts
14917
14942
  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) {