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
@@ -65,7 +65,7 @@ var init_executor_read_impersonation = __esm({
65
65
  });
66
66
 
67
67
  // src/mcp/tools/users.ts
68
- import { ROLES as ROLES4 } from "@agor/core/types";
68
+ import { ROLES as ROLES6 } from "@agor/core/types";
69
69
 
70
70
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
71
71
  var external_exports = {};
@@ -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
  );
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 ROLES5 } 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 ROLES4
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 textResult(data) {
@@ -15745,7 +15794,7 @@ function registerUserTools(server, ctx) {
15745
15794
  email: mcpOptionalString("email", "New email address (optional)"),
15746
15795
  name: mcpOptionalString("name", "New display name (optional)"),
15747
15796
  password: mcpOptionalString("password", "New password (optional, will be hashed)"),
15748
- role: external_exports.enum([ROLES4.SUPERADMIN, ROLES4.ADMIN, ROLES4.MEMBER, ROLES4.VIEWER]).optional().describe(
15797
+ role: external_exports.enum([ROLES6.SUPERADMIN, ROLES6.ADMIN, ROLES6.MEMBER, ROLES6.VIEWER]).optional().describe(
15749
15798
  "New user role (optional). superadmin=full system access + branch RBAC bypass, admin=manage resources, member=standard user, viewer=read-only"
15750
15799
  ),
15751
15800
  unix_username: mcpOptionalString(
@@ -15798,7 +15847,7 @@ function registerUserTools(server, ctx) {
15798
15847
  "Unix username for shell access (optional, defaults to email prefix if not specified)"
15799
15848
  ),
15800
15849
  must_change_password: external_exports.boolean().optional().describe("Force user to change password on first login (optional, defaults to false)"),
15801
- role: external_exports.enum([ROLES4.SUPERADMIN, ROLES4.ADMIN, ROLES4.MEMBER, ROLES4.VIEWER]).optional().describe(
15850
+ role: external_exports.enum([ROLES6.SUPERADMIN, ROLES6.ADMIN, ROLES6.MEMBER, ROLES6.VIEWER]).optional().describe(
15802
15851
  'User role (optional, defaults to "member"). Roles: superadmin=full system access + branch RBAC bypass, admin=manage resources, member=standard user, viewer=read-only'
15803
15852
  )
15804
15853
  })
@@ -1 +1 @@
1
- {"version":3,"file":"widgets.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/widgets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAaH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAiC/C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAqJ5E"}
1
+ {"version":3,"file":"widgets.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/widgets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAeH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAuC/C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAqR5E"}
@@ -65,75 +65,7 @@ var init_executor_read_impersonation = __esm({
65
65
  });
66
66
 
67
67
  // src/mcp/tools/widgets.ts
68
- import { MessageRole as MessageRole2 } from "@agor/core/types";
69
-
70
- // src/utils/append-system-message.ts
71
- import { generateId, SessionRepository } from "@agor/core/db";
72
- import { MessageRole } from "@agor/core/types";
73
- async function appendSystemMessage(opts) {
74
- const {
75
- app,
76
- db,
77
- sessionId,
78
- taskId,
79
- content,
80
- contentPreview,
81
- type = "system",
82
- role = MessageRole.SYSTEM,
83
- metadata,
84
- params
85
- } = opts;
86
- const index = await new SessionRepository(db).countMessages(sessionId);
87
- const preview = contentPreview ?? (typeof content === "string" ? content.substring(0, 200) : "");
88
- const message = {
89
- message_id: generateId(),
90
- session_id: sessionId,
91
- task_id: taskId,
92
- type,
93
- role,
94
- index,
95
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
96
- content_preview: preview,
97
- content,
98
- ...metadata ? { metadata } : {}
99
- };
100
- const created = await app.service("messages").create(message, params ?? {});
101
- return created;
102
- }
103
-
104
- // src/utils/session-tasks.ts
105
- import { EXECUTING_TASK_STATUSES, isTaskExecuting } from "@agor/core/types";
106
- function recencyKey(t) {
107
- return new Date(t.started_at || t.created_at).getTime();
108
- }
109
- async function findTasksForSession(app, sessionId, params) {
110
- const result = await app.service("tasks").find({
111
- ...params ?? {},
112
- // Merge defensively: spread params first, then force session_id so a
113
- // caller-supplied params.query can never silently overwrite the filter.
114
- query: {
115
- ...params?.query,
116
- session_id: sessionId,
117
- $limit: params?.query?.$limit ?? 1e3
118
- }
119
- });
120
- const tasks = Array.isArray(result) ? result : result.data;
121
- return [...tasks].sort((a, b) => recencyKey(b) - recencyKey(a));
122
- }
123
- async function findHostTaskForSession(app, sessionId, params) {
124
- const all = await findTasksForSession(app, sessionId, params);
125
- if (all.length === 0) return void 0;
126
- return all.find((t) => isTaskExecuting(t)) ?? all[0];
127
- }
128
-
129
- // src/widgets/env-vars/index.ts
130
- import {
131
- ENV_VAR_CONSTRAINTS,
132
- isEnvVarAllowed,
133
- validateEnvVar
134
- } from "@agor/core/config";
135
- import { SessionEnvSelectionRepository } from "@agor/core/db";
136
- import { BadRequest } from "@agor/core/feathers";
68
+ import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
137
69
 
138
70
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
139
71
  var external_exports = {};
@@ -14649,7 +14581,73 @@ function date4(params) {
14649
14581
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
14650
14582
  config(en_default());
14651
14583
 
14584
+ // src/utils/append-system-message.ts
14585
+ import { generateId, SessionRepository } from "@agor/core/db";
14586
+ import { MessageRole } from "@agor/core/types";
14587
+ async function appendSystemMessage(opts) {
14588
+ const {
14589
+ app,
14590
+ db,
14591
+ sessionId,
14592
+ taskId,
14593
+ content,
14594
+ contentPreview,
14595
+ type = "system",
14596
+ role = MessageRole.SYSTEM,
14597
+ metadata,
14598
+ params
14599
+ } = opts;
14600
+ const index = await new SessionRepository(db).countMessages(sessionId);
14601
+ const preview = contentPreview ?? (typeof content === "string" ? content.substring(0, 200) : "");
14602
+ const message = {
14603
+ message_id: generateId(),
14604
+ session_id: sessionId,
14605
+ task_id: taskId,
14606
+ type,
14607
+ role,
14608
+ index,
14609
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
14610
+ content_preview: preview,
14611
+ content,
14612
+ ...metadata ? { metadata } : {}
14613
+ };
14614
+ const created = await app.service("messages").create(message, params ?? {});
14615
+ return created;
14616
+ }
14617
+
14618
+ // src/utils/session-tasks.ts
14619
+ import { EXECUTING_TASK_STATUSES, isTaskExecuting } from "@agor/core/types";
14620
+ function recencyKey(t) {
14621
+ return new Date(t.started_at || t.created_at).getTime();
14622
+ }
14623
+ async function findTasksForSession(app, sessionId, params) {
14624
+ const result = await app.service("tasks").find({
14625
+ ...params ?? {},
14626
+ // Merge defensively: spread params first, then force session_id so a
14627
+ // caller-supplied params.query can never silently overwrite the filter.
14628
+ query: {
14629
+ ...params?.query,
14630
+ session_id: sessionId,
14631
+ $limit: params?.query?.$limit ?? 1e3
14632
+ }
14633
+ });
14634
+ const tasks = Array.isArray(result) ? result : result.data;
14635
+ return [...tasks].sort((a, b) => recencyKey(b) - recencyKey(a));
14636
+ }
14637
+ async function findHostTaskForSession(app, sessionId, params) {
14638
+ const all = await findTasksForSession(app, sessionId, params);
14639
+ if (all.length === 0) return void 0;
14640
+ return all.find((t) => isTaskExecuting(t)) ?? all[0];
14641
+ }
14642
+
14652
14643
  // src/widgets/env-vars/index.ts
14644
+ import {
14645
+ ENV_VAR_CONSTRAINTS,
14646
+ isEnvVarAllowed,
14647
+ validateEnvVar
14648
+ } from "@agor/core/config";
14649
+ import { SessionEnvSelectionRepository } from "@agor/core/db";
14650
+ import { BadRequest } from "@agor/core/feathers";
14653
14651
  var ENV_VAR_NAME_REGEX = ENV_VAR_CONSTRAINTS.NAME_PATTERN;
14654
14652
  function orderedEnvVarNames(names) {
14655
14653
  return [...names].sort();
@@ -14734,6 +14732,38 @@ var envVarsSubmitSchema = external_exports.object({
14734
14732
  }
14735
14733
  });
14736
14734
 
14735
+ // src/widgets/gateway-token/index.ts
14736
+ import { Forbidden } from "@agor/core/feathers";
14737
+ import {
14738
+ GATEWAY_SENSITIVE_CONFIG_FIELDS,
14739
+ hasMinimumRole,
14740
+ ROLES
14741
+ } from "@agor/core/types";
14742
+ var SUPPORTED_CHANNEL_TYPES = [
14743
+ "slack",
14744
+ "github",
14745
+ "teams"
14746
+ ];
14747
+ function isSupportedGatewayTokenChannelType(channelType) {
14748
+ return SUPPORTED_CHANNEL_TYPES.includes(channelType);
14749
+ }
14750
+ var MAX_TOKEN_LENGTH = 8192;
14751
+ var gatewayTokenParamsSchema = external_exports.object({
14752
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
14753
+ channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
14754
+ channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
14755
+ fields: external_exports.array(external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS)).min(1).max(GATEWAY_SENSITIVE_CONFIG_FIELDS.length).refine((fields) => new Set(fields).size === fields.length, {
14756
+ message: "Token field names must be unique"
14757
+ }).describe("Secret config field names to collect (subset of the sensitive fields)."),
14758
+ reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
14759
+ }).strict();
14760
+ var gatewayTokenSubmitSchema = external_exports.object({
14761
+ tokens: external_exports.partialRecord(
14762
+ external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS),
14763
+ external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
14764
+ ).describe("Map of sensitive field name \u2192 credential value.")
14765
+ }).strict();
14766
+
14737
14767
  // src/mcp/server.ts
14738
14768
  import { randomUUID as randomUUID2 } from "crypto";
14739
14769
  import { shortId as shortId6, UserApiKeysRepository } from "@agor/core/db";
@@ -14835,8 +14865,8 @@ import { NotFoundError } from "@agor/core/utils/errors";
14835
14865
 
14836
14866
  // src/utils/branch-authorization.ts
14837
14867
  import { shortId as shortId2 } from "@agor/core/db";
14838
- import { Forbidden, NotAuthenticated, NotFound } from "@agor/core/feathers";
14839
- import { BRANCH_PERMISSION_LEVELS, hasMinimumRole, ROLES } from "@agor/core/types";
14868
+ import { Forbidden as Forbidden2, NotAuthenticated, NotFound } from "@agor/core/feathers";
14869
+ import { BRANCH_PERMISSION_LEVELS, hasMinimumRole as hasMinimumRole2, ROLES as ROLES2 } from "@agor/core/types";
14840
14870
  var PERMISSION_RANK = Object.fromEntries(
14841
14871
  BRANCH_PERMISSION_LEVELS.map((level, i) => [level, i - 1])
14842
14872
  );
@@ -14903,13 +14933,17 @@ import {
14903
14933
  ThreadSessionMapRepository
14904
14934
  } from "@agor/core/db";
14905
14935
  import {
14906
- getConnector
14936
+ buildSlackManifest,
14937
+ getConnector,
14938
+ requiredBotEvents,
14939
+ requiredBotScopes
14907
14940
  } from "@agor/core/gateway";
14908
14941
  import {
14909
14942
  GATEWAY_REDACTED_SENTINEL,
14910
- GATEWAY_SENSITIVE_CONFIG_FIELDS,
14911
- hasMinimumRole as hasMinimumRole2,
14912
- ROLES as ROLES2
14943
+ GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
14944
+ getRequiredSecretFields,
14945
+ hasMinimumRole as hasMinimumRole3,
14946
+ ROLES as ROLES3
14913
14947
  } from "@agor/core/types";
14914
14948
  var configSchema = external_exports.record(external_exports.string(), external_exports.unknown()).describe(
14915
14949
  "Platform-specific gateway configuration. Secrets are stored encrypted and returned redacted. Prefer env/template references for shared credentials where the connector supports them."
@@ -14967,44 +15001,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
14967
15001
  agenticConfig: agenticConfigSchema.optional()
14968
15002
  }).superRefine((value, issue2) => {
14969
15003
  const config2 = value.config ?? {};
14970
- if (value.channelType === "slack") {
14971
- if (!config2.bot_token) {
14972
- issue2.addIssue({
14973
- code: "custom",
14974
- path: ["config", "bot_token"],
14975
- message: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible."
14976
- });
14977
- }
14978
- if (config2.connection_mode === "socket" && !config2.app_token) {
14979
- issue2.addIssue({
14980
- code: "custom",
14981
- path: ["config", "app_token"],
14982
- message: "config.app_token is required for Slack Socket Mode."
14983
- });
14984
- }
14985
- }
14986
- if (value.channelType === "github") {
14987
- for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
15004
+ if (value.enabled !== false) {
15005
+ const requiredSecretMessages = {
15006
+ bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
15007
+ app_token: "config.app_token is required for Slack Socket Mode.",
15008
+ private_key: "config.private_key is required for GitHub gateway channels.",
15009
+ app_password: "config.app_password is required for Teams gateway channels."
15010
+ };
15011
+ for (const field of getRequiredSecretFields(value.channelType, config2)) {
14988
15012
  if (!config2[field]) {
14989
15013
  issue2.addIssue({
14990
15014
  code: "custom",
14991
15015
  path: ["config", field],
14992
- message: `config.${field} is required for GitHub gateway channels.`
15016
+ message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
14993
15017
  });
14994
15018
  }
14995
15019
  }
14996
15020
  }
14997
- if (value.channelType === "teams") {
14998
- for (const field of ["app_id", "app_password"]) {
15021
+ if (value.channelType === "github") {
15022
+ for (const field of ["app_id", "installation_id", "watch_repos"]) {
14999
15023
  if (!config2[field]) {
15000
15024
  issue2.addIssue({
15001
15025
  code: "custom",
15002
15026
  path: ["config", field],
15003
- message: `config.${field} is required for Teams gateway channels.`
15027
+ message: `config.${field} is required for GitHub gateway channels.`
15004
15028
  });
15005
15029
  }
15006
15030
  }
15007
15031
  }
15032
+ if (value.channelType === "teams" && !config2.app_id) {
15033
+ issue2.addIssue({
15034
+ code: "custom",
15035
+ path: ["config", "app_id"],
15036
+ message: "config.app_id is required for Teams gateway channels."
15037
+ });
15038
+ }
15039
+ if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
15040
+ issue2.addIssue({
15041
+ code: "custom",
15042
+ path: ["agorUserId"],
15043
+ message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
15044
+ });
15045
+ }
15008
15046
  });
15009
15047
  var slackThreadHistorySchema = external_exports.strictObject({
15010
15048
  sessionId: mcpOptionalId(
@@ -15068,6 +15106,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
15068
15106
  ),
15069
15107
  agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
15070
15108
  });
15109
+ var slackManifestGenerateSchema = external_exports.strictObject({
15110
+ appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
15111
+ botDisplayName: mcpOptionalNonEmptyString(
15112
+ "botDisplayName",
15113
+ "Bot user display name. Defaults to appName."
15114
+ ),
15115
+ publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
15116
+ privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
15117
+ groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
15118
+ alignUsers: external_exports.boolean().default(true).describe(
15119
+ "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)."
15120
+ ),
15121
+ outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
15122
+ restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
15123
+ "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."
15124
+ )
15125
+ });
15071
15126
 
15072
15127
  // src/mcp/tools/knowledge.ts
15073
15128
  import { createHash, randomUUID } from "crypto";
@@ -15107,7 +15162,7 @@ import {
15107
15162
  import { getAssistantConfig as getAssistantConfig2, isAssistant as isAssistant2 } from "@agor/core/types";
15108
15163
 
15109
15164
  // src/services/knowledge-access.ts
15110
- import { hasMinimumRole as hasMinimumRole3, ROLES as ROLES3 } from "@agor/core/types";
15165
+ import { hasMinimumRole as hasMinimumRole4, ROLES as ROLES4 } from "@agor/core/types";
15111
15166
 
15112
15167
  // src/utils/branch-workspace-path.ts
15113
15168
  import fs from "fs";
@@ -15603,7 +15658,7 @@ var modelConfigInputSchema = external_exports.union([
15603
15658
  );
15604
15659
 
15605
15660
  // src/mcp/tools/users.ts
15606
- import { ROLES as ROLES4 } from "@agor/core/types";
15661
+ import { ROLES as ROLES5 } from "@agor/core/types";
15607
15662
 
15608
15663
  // src/mcp/server.ts
15609
15664
  var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
@@ -15650,6 +15705,11 @@ Continue or fork an existing session:
15650
15705
  Discover tools: search domains/summaries \u2192 get details for one tool \u2192 execute`;
15651
15706
 
15652
15707
  // src/mcp/tools/widgets.ts
15708
+ function requireAdmin(ctx, action) {
15709
+ if (!hasMinimumRole5(ctx.authenticatedUser?.role, ROLES6.ADMIN)) {
15710
+ throw new Error(`Access denied: admin role required to ${action}`);
15711
+ }
15712
+ }
15653
15713
  function widgetContentPreview(params) {
15654
15714
  const list = params.names.join(", ");
15655
15715
  return params.names.length === 1 ? `Please provide ${list}: ${params.reason}` : `Please provide ${list}: ${params.reason}`;
@@ -15768,6 +15828,104 @@ function registerWidgetTools(server, ctx) {
15768
15828
  return textResult({ widget_id: widgetId, status: "requested" });
15769
15829
  }
15770
15830
  );
15831
+ server.registerTool(
15832
+ "agor_widgets_request_gateway_token",
15833
+ {
15834
+ description: "Ask an admin to securely provide a gateway channel's platform tokens (Slack bot/app tokens, GitHub private key, Teams app password) via a compact form that appears at the end of your message, so setup finishes without anyone pasting xoxb-/xapp- tokens into chat. FIRE-AND-FORGET: the widget renders inline at the end of your turn; end your turn after calling. You will receive a user-role message when it is resolved. Token values never enter your context \u2014 only the channel identity and field NAMES do. Admin-only: a non-admin agent cannot mint this widget. Keep `reason` to ONE short sentence (\u2264200 chars).",
15835
+ annotations: { destructiveHint: false, openWorldHint: false },
15836
+ inputSchema: external_exports.object({
15837
+ gatewayChannelId: external_exports.string().min(1).describe("Gateway channel ID (UUIDv7 or short ID) whose tokens are being set."),
15838
+ reason: external_exports.string().max(200).optional().describe("One short sentence explaining why the tokens are needed.")
15839
+ })
15840
+ },
15841
+ async (args) => {
15842
+ if (!ctx.sessionId) return sessionContextRequiredResult();
15843
+ const currentSessionId = ctx.sessionId;
15844
+ requireAdmin(ctx, "set gateway channel tokens");
15845
+ const channel = await ctx.app.service("gateway-channels").get(args.gatewayChannelId, ctx.baseServiceParams);
15846
+ const channelType = channel.channel_type;
15847
+ if (!isSupportedGatewayTokenChannelType(channelType)) {
15848
+ throw new Error(
15849
+ `Gateway channel type "${channelType}" does not support token entry via this widget.`
15850
+ );
15851
+ }
15852
+ const fields = getRequiredSecretFields2(channelType, channel.config);
15853
+ if (fields.length === 0) {
15854
+ throw new Error(
15855
+ `Gateway channel "${channel.name}" has no required secret fields to collect.`
15856
+ );
15857
+ }
15858
+ const params = gatewayTokenParamsSchema.parse({
15859
+ gatewayChannelId: channel.id,
15860
+ channelType,
15861
+ channelName: channel.name,
15862
+ fields,
15863
+ reason: args.reason ?? `Provide the ${channelType} credentials to finish connecting "${channel.name}".`
15864
+ });
15865
+ const requestedAt = (/* @__PURE__ */ new Date()).toISOString();
15866
+ const baseWidgetMeta = {
15867
+ widget_type: "gateway_token",
15868
+ schema_version: 1,
15869
+ params,
15870
+ status: "pending",
15871
+ requested_at: requestedAt,
15872
+ auto_resume: true
15873
+ };
15874
+ const hostTask = await findHostTaskForSession(
15875
+ ctx.app,
15876
+ currentSessionId,
15877
+ ctx.baseServiceParams
15878
+ );
15879
+ const hostTaskId = hostTask?.task_id;
15880
+ const created = await appendSystemMessage({
15881
+ app: ctx.app,
15882
+ db: ctx.db,
15883
+ sessionId: currentSessionId,
15884
+ taskId: hostTaskId,
15885
+ content: `Please provide the ${channelType} tokens for "${channel.name}": ${params.reason}`,
15886
+ contentPreview: `Widget: gateway_token (${channel.name})`,
15887
+ type: "widget_request",
15888
+ role: MessageRole2.SYSTEM,
15889
+ metadata: {
15890
+ widget: {
15891
+ ...baseWidgetMeta,
15892
+ widget_id: "pending"
15893
+ }
15894
+ }
15895
+ });
15896
+ const widgetId = created.message_id;
15897
+ if (hostTask?.message_range) {
15898
+ try {
15899
+ await ctx.app.service("tasks").patch(
15900
+ hostTask.task_id,
15901
+ {
15902
+ message_range: {
15903
+ start_index: hostTask.message_range.start_index,
15904
+ end_index: created.index
15905
+ }
15906
+ },
15907
+ ctx.baseServiceParams
15908
+ );
15909
+ } catch (err) {
15910
+ console.warn(
15911
+ `[widgets] failed to extend task.message_range for widget ${widgetId}:`,
15912
+ err
15913
+ );
15914
+ }
15915
+ }
15916
+ await ctx.app.service("messages").patch(
15917
+ widgetId,
15918
+ {
15919
+ metadata: {
15920
+ ...created.metadata ?? {},
15921
+ widget: { ...baseWidgetMeta, widget_id: widgetId }
15922
+ }
15923
+ },
15924
+ ctx.baseServiceParams
15925
+ );
15926
+ return textResult({ widget_id: widgetId, status: "requested" });
15927
+ }
15928
+ );
15771
15929
  }
15772
15930
  export {
15773
15931
  registerWidgetTools
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Shared OAuth authorization helpers.
3
+ *
4
+ * Extracted from register-services.ts and register-hooks.ts so both the
5
+ * tenant-scope wrapping and the forUserId authorization gate can be unit-tested
6
+ * without spinning up the full daemon.
7
+ */
8
+ import type { TenantScopeAwareDatabase } from '@agor/core/db';
9
+ /**
10
+ * Runs `work` inside a tenant database scope when `tenantId` is provided.
11
+ * When `tenantId` is undefined the work is executed directly (no scope change).
12
+ *
13
+ * Used by the OAuth callback and oauth-complete handlers to ensure token
14
+ * persistence writes to the correct tenant's DB partition in multi-tenant
15
+ * deployments.
16
+ */
17
+ export declare function runInOAuthTenantScope<T>(db: TenantScopeAwareDatabase, tenantId: string | undefined, work: () => Promise<T>): Promise<T>;
18
+ /**
19
+ * Resolves the effective user ID for per-user OAuth token injection.
20
+ *
21
+ * Service-account callers (`_isServiceAccount === true`) may request another
22
+ * user's token. Executor-session token holders
23
+ * (`authPayloadType === 'executor-session'`) may only preserve an explicit
24
+ * `forUserId` that matches their authenticated token subject. Arbitrary
25
+ * cross-user lookup stays reserved for service-account callers.
26
+ * All other callers — including regular authenticated members — are silently
27
+ * redirected to their own user ID to prevent privilege escalation.
28
+ */
29
+ export declare function resolveForUserIdWithGate(opts: {
30
+ queryForUserId: string | undefined;
31
+ isServiceAccount: boolean | undefined;
32
+ authPayloadType: unknown;
33
+ callerUserId: string | undefined;
34
+ }): string | undefined;
35
+ //# sourceMappingURL=oauth-auth-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-auth-helpers.d.ts","sourceRoot":"","sources":["../src/oauth-auth-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAG9D;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,EAAE,EAAE,wBAAwB,EAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CAGZ;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,GAAG,MAAM,GAAG,SAAS,CAKrB"}