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
@@ -1655,6 +1655,21 @@ var init_file = __esm({
1655
1655
  });
1656
1656
 
1657
1657
  // src/types/gateway.ts
1658
+ function getRequiredSecretFields(channelType, config) {
1659
+ switch (channelType) {
1660
+ case "slack": {
1661
+ const wantsInbound = config.connection_mode === "socket" || config.enable_channels === true || config.enable_groups === true || config.enable_mpim === true;
1662
+ const outboundOnly = config.outbound_enabled === true && !wantsInbound;
1663
+ return outboundOnly ? ["bot_token"] : ["bot_token", "app_token"];
1664
+ }
1665
+ case "github":
1666
+ return ["private_key"];
1667
+ case "teams":
1668
+ return ["app_password"];
1669
+ default:
1670
+ return [];
1671
+ }
1672
+ }
1658
1673
  var GATEWAY_SENSITIVE_CONFIG_FIELDS, GATEWAY_REDACTED_SENTINEL;
1659
1674
  var init_gateway = __esm({
1660
1675
  "src/types/gateway.ts"() {
@@ -5991,6 +6006,7 @@ __export(src_exports, {
5991
6006
  SudoCliExecutor: () => SudoCliExecutor,
5992
6007
  SudoDirectExecutor: () => SudoDirectExecutor,
5993
6008
  SymlinkCommands: () => SymlinkCommands,
6009
+ TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS: () => TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS,
5994
6010
  TERMINAL_TASK_STATUSES: () => TERMINAL_TASK_STATUSES,
5995
6011
  TOOL_API_KEY_NAMES: () => TOOL_API_KEY_NAMES,
5996
6012
  TaskRepository: () => TaskRepository,
@@ -6052,6 +6068,7 @@ __export(src_exports, {
6052
6068
  checkAsUser: () => checkAsUser,
6053
6069
  checkMigrationStatus: () => checkMigrationStatus,
6054
6070
  compare: () => compare,
6071
+ containsTemplate: () => containsTemplate,
6055
6072
  count: () => import_drizzle_orm38.count,
6056
6073
  createAdminExecutor: () => createAdminExecutor,
6057
6074
  createClient: () => createClient,
@@ -6141,6 +6158,7 @@ __export(src_exports, {
6141
6158
  getRepoReferenceOptions: () => getRepoReferenceOptions,
6142
6159
  getReposDir: () => getReposDir,
6143
6160
  getReposDirAsync: () => getReposDirAsync,
6161
+ getRequiredSecretFields: () => getRequiredSecretFields,
6144
6162
  getServiceTier: () => getServiceTier,
6145
6163
  getSessionType: () => getSessionType,
6146
6164
  getUidFromUsername: () => getUidFromUsername,
@@ -6193,6 +6211,7 @@ __export(src_exports, {
6193
6211
  isThreadRoot: () => isThreadRoot,
6194
6212
  isUnixGroupRefreshNeeded: () => isUnixGroupRefreshNeeded,
6195
6213
  isUnixImpersonationEnabled: () => isUnixImpersonationEnabled,
6214
+ isUserEnvPlaceholder: () => isUserEnvPlaceholder,
6196
6215
  isUserInGroup: () => isUserInGroup,
6197
6216
  isValid: () => isValid,
6198
6217
  isValidBranchGroupName: () => isValidBranchGroupName,
@@ -11497,6 +11516,63 @@ var BranchRepository = class {
11497
11516
  }
11498
11517
  return Array.from(userIds);
11499
11518
  }
11519
+ /**
11520
+ * Find non-archived branches whose explicit filesystem access set can change
11521
+ * when membership in the given group changes.
11522
+ *
11523
+ * Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
11524
+ * both encode which group grants materialize into branch-folder access.
11525
+ * App-only grants (`fs_access = 'none'`) are intentionally excluded because
11526
+ * membership changes for those grants do not require branch-folder mutation.
11527
+ */
11528
+ async findExplicitFsAccessBranchIdsForGroup(groupId) {
11529
+ const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, (0, import_drizzle_orm18.eq)(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
11530
+ groups3,
11531
+ (0, import_drizzle_orm18.and)((0, import_drizzle_orm18.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm18.eq)(groups3.archived, false))
11532
+ ).where(
11533
+ (0, import_drizzle_orm18.and)(
11534
+ (0, import_drizzle_orm18.eq)(branchGroupGrants3.group_id, groupId),
11535
+ (0, import_drizzle_orm18.eq)(branches3.archived, false),
11536
+ (0, import_drizzle_orm18.inArray)(
11537
+ import_drizzle_orm18.sql`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
11538
+ FS_ACCESS_BRANCH_PERMISSIONS
11539
+ )
11540
+ )
11541
+ ).all();
11542
+ const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
11543
+ groups3,
11544
+ (0, import_drizzle_orm18.and)((0, import_drizzle_orm18.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm18.eq)(groups3.archived, false))
11545
+ ).innerJoin(
11546
+ boards3,
11547
+ (0, import_drizzle_orm18.and)(
11548
+ (0, import_drizzle_orm18.eq)(boards3.board_id, boardGroupGrants3.board_id),
11549
+ (0, import_drizzle_orm18.eq)(import_drizzle_orm18.sql`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
11550
+ )
11551
+ ).innerJoin(
11552
+ branches3,
11553
+ (0, import_drizzle_orm18.and)(
11554
+ (0, import_drizzle_orm18.eq)(branches3.board_id, boardGroupGrants3.board_id),
11555
+ (0, import_drizzle_orm18.eq)(branches3.permission_source, "board"),
11556
+ (0, import_drizzle_orm18.eq)(branches3.archived, false)
11557
+ )
11558
+ ).where(
11559
+ (0, import_drizzle_orm18.and)(
11560
+ (0, import_drizzle_orm18.eq)(boardGroupGrants3.group_id, groupId),
11561
+ (0, import_drizzle_orm18.inArray)(
11562
+ import_drizzle_orm18.sql`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
11563
+ FS_ACCESS_BRANCH_PERMISSIONS
11564
+ )
11565
+ )
11566
+ ).all();
11567
+ const branchIds = /* @__PURE__ */ new Set();
11568
+ for (const row of directRows) {
11569
+ branchIds.add(row.branch_id);
11570
+ }
11571
+ for (const row of boardRows) {
11572
+ branchIds.add(row.branch_id);
11573
+ }
11574
+ return Array.from(branchIds);
11575
+ }
11500
11576
  async findBoardAlignedBranches(boardId) {
11501
11577
  const rows = await select(this.db).from(branches3).where(
11502
11578
  (0, import_drizzle_orm18.and)(
@@ -12504,6 +12580,60 @@ var BoardRepository = class {
12504
12580
  );
12505
12581
  }
12506
12582
  }
12583
+ /**
12584
+ * Shallow-merge field patches into existing board objects in a single
12585
+ * read-modify-write.
12586
+ *
12587
+ * Unlike upsertBoardObject (which fully replaces the object value, dropping
12588
+ * omitted fields), this overwrites ONLY the provided keys and leaves the rest
12589
+ * of each object intact — so a narrow change (e.g. a zIndex reorder) has a
12590
+ * smaller blast radius and won't clobber a field edited via a different patch
12591
+ * call. Multiple objects in one call are merged before a single write, so a
12592
+ * forward/backward swap touches both neighbors in one update.
12593
+ *
12594
+ * Objects that no longer exist are SKIPPED, never re-created — so a swap can't
12595
+ * resurrect a neighbor deleted between the client's read and this write.
12596
+ *
12597
+ * Only an explicit allowlist of fields can be merged (currently just `zIndex`,
12598
+ * which is also clamped into the board-object band [1, 499] so it can never be
12599
+ * pushed onto the card (500) / comment (1000) layers). Any other key in a
12600
+ * patch is ignored, so this narrow action cannot reshape an object (e.g. flip
12601
+ * its `type`) the way a full upsert could.
12602
+ *
12603
+ * NOTE: this is NOT atomic against concurrent writers. Like every other board
12604
+ * writer, the findById → update sequence has a lost-update window: a write
12605
+ * that lands between the read and the update can be overwritten (last-write-
12606
+ * wins). Merging only the patched keys narrows that window's blast radius
12607
+ * versus a full-object upsert, but does not close it.
12608
+ */
12609
+ async mergeBoardObjectFields(boardId, patches) {
12610
+ const Z_MIN = 1;
12611
+ const Z_MAX = 499;
12612
+ try {
12613
+ const fullId = await this.resolveId(boardId);
12614
+ const current = await this.findById(fullId);
12615
+ if (!current) {
12616
+ throw new EntityNotFoundError("Board", boardId);
12617
+ }
12618
+ const updatedObjects = { ...current.objects || {} };
12619
+ for (const [objectId, fields] of Object.entries(patches)) {
12620
+ const existing = updatedObjects[objectId];
12621
+ if (!existing) continue;
12622
+ const { zIndex } = fields;
12623
+ if (typeof zIndex !== "number" || !Number.isFinite(zIndex)) continue;
12624
+ const safeZIndex = Math.min(Z_MAX, Math.max(Z_MIN, zIndex));
12625
+ updatedObjects[objectId] = { ...existing, zIndex: safeZIndex };
12626
+ }
12627
+ return this.update(fullId, { objects: updatedObjects });
12628
+ } catch (error) {
12629
+ if (error instanceof RepositoryError) throw error;
12630
+ if (error instanceof EntityNotFoundError) throw error;
12631
+ throw new RepositoryError(
12632
+ `Failed to merge board object fields: ${error instanceof Error ? error.message : String(error)}`,
12633
+ error
12634
+ );
12635
+ }
12636
+ }
12507
12637
  /**
12508
12638
  * DEPRECATED: Delete a zone and handle associated sessions
12509
12639
  * TODO: Reimplement using board-objects table
@@ -13238,6 +13368,28 @@ var GatewayChannelRepository = class {
13238
13368
  agentic_config: encryptedAgenticConfig
13239
13369
  };
13240
13370
  }
13371
+ /**
13372
+ * Enforce the "enabled requires secrets" invariant on every write path.
13373
+ *
13374
+ * An enabled channel can never exist without the secrets its type needs to
13375
+ * function. Runs on the post-merge, decrypted config so a patch that only
13376
+ * flips `enabled: true` on a channel with already-stored tokens passes.
13377
+ * Disabled ("draft") channels are exempt.
13378
+ */
13379
+ assertRequiredSecretsWhenEnabled(channel) {
13380
+ if (channel.enabled === false) return;
13381
+ const channelType = channel.channel_type ?? "slack";
13382
+ const config = channel.config ?? {};
13383
+ const missing = getRequiredSecretFields(channelType, config).filter((field) => {
13384
+ const value = config[field];
13385
+ return typeof value !== "string" || value.trim() === "" || value === GATEWAY_REDACTED_SENTINEL;
13386
+ });
13387
+ if (missing.length > 0) {
13388
+ throw new RepositoryError(
13389
+ `Cannot enable ${channelType} gateway channel: missing required secret(s) ${missing.join(", ")}`
13390
+ );
13391
+ }
13392
+ }
13241
13393
  /**
13242
13394
  * Resolve short ID to full ID
13243
13395
  */
@@ -13269,6 +13421,7 @@ var GatewayChannelRepository = class {
13269
13421
  id: data.id ?? generateId(),
13270
13422
  channel_key: data.channel_key ?? generateId()
13271
13423
  });
13424
+ this.assertRequiredSecretsWhenEnabled(data);
13272
13425
  await insert(this.db, gatewayChannels3).values(insertData).run();
13273
13426
  const row = await select(this.db).from(gatewayChannels3).where((0, import_drizzle_orm22.eq)(gatewayChannels3.id, insertData.id)).one();
13274
13427
  if (!row) {
@@ -13335,6 +13488,7 @@ var GatewayChannelRepository = class {
13335
13488
  }
13336
13489
  merged.config = mergedConfig;
13337
13490
  }
13491
+ this.assertRequiredSecretsWhenEnabled(merged);
13338
13492
  const insertData = this.channelToInsert(merged);
13339
13493
  await update(this.db, gatewayChannels3).set({
13340
13494
  name: insertData.name,
@@ -14849,90 +15003,439 @@ init_ids();
14849
15003
  // src/tools/mcp/auth-secrets.ts
14850
15004
  init_cjs_shims();
14851
15005
 
14852
- // src/tools/mcp/http-headers.ts
15006
+ // src/mcp/template-resolver.ts
14853
15007
  init_cjs_shims();
14854
- var MCP_HEADER_REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
14855
- var RESERVED_MCP_CUSTOM_HEADER_NAMES = /* @__PURE__ */ new Set([
14856
- "authorization",
14857
- // Hop-by-hop / transport-controlled headers. These are managed by fetch,
14858
- // the MCP SDK transport, or the auth configuration and should not be stored
14859
- // as custom MCP service-account headers.
14860
- "connection",
14861
- "content-length",
14862
- "cookie",
14863
- "host",
14864
- "mcp-session-id",
14865
- "te",
14866
- "trailer",
14867
- "transfer-encoding",
14868
- "upgrade"
14869
- ]);
14870
- var HEADER_NAME_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
14871
- function isValidMCPHeaderName(name) {
14872
- return HEADER_NAME_RE.test(name);
14873
- }
14874
- function isReservedMCPCustomHeaderName(name) {
14875
- return RESERVED_MCP_CUSTOM_HEADER_NAMES.has(name.toLowerCase());
15008
+
15009
+ // src/templates/handlebars-helpers.ts
15010
+ init_cjs_shims();
15011
+ var import_handlebars = __toESM(require("handlebars"), 1);
15012
+ var helpersRegistered = false;
15013
+ function registerHandlebarsHelpers() {
15014
+ import_handlebars.default.registerHelper("add", (a, b) => {
15015
+ const numA = Number(a);
15016
+ const numB = Number(b);
15017
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15018
+ console.warn(`\u26A0\uFE0F add helper received non-numeric values: ${a}, ${b}`);
15019
+ return 0;
15020
+ }
15021
+ return numA + numB;
15022
+ });
15023
+ import_handlebars.default.registerHelper("sub", (a, b) => {
15024
+ const numA = Number(a);
15025
+ const numB = Number(b);
15026
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15027
+ console.warn(`\u26A0\uFE0F sub helper received non-numeric values: ${a}, ${b}`);
15028
+ return 0;
15029
+ }
15030
+ return numA - numB;
15031
+ });
15032
+ import_handlebars.default.registerHelper("mul", (a, b) => {
15033
+ const numA = Number(a);
15034
+ const numB = Number(b);
15035
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15036
+ console.warn(`\u26A0\uFE0F mul helper received non-numeric values: ${a}, ${b}`);
15037
+ return 0;
15038
+ }
15039
+ return numA * numB;
15040
+ });
15041
+ import_handlebars.default.registerHelper("div", (a, b) => {
15042
+ const numA = Number(a);
15043
+ const numB = Number(b);
15044
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15045
+ console.warn(`\u26A0\uFE0F div helper received non-numeric values: ${a}, ${b}`);
15046
+ return 0;
15047
+ }
15048
+ if (numB === 0) {
15049
+ console.warn(`\u26A0\uFE0F div helper received zero divisor`);
15050
+ return 0;
15051
+ }
15052
+ return numA / numB;
15053
+ });
15054
+ import_handlebars.default.registerHelper("mod", (a, b) => {
15055
+ const numA = Number(a);
15056
+ const numB = Number(b);
15057
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15058
+ console.warn(`\u26A0\uFE0F mod helper received non-numeric values: ${a}, ${b}`);
15059
+ return 0;
15060
+ }
15061
+ if (numB === 0) {
15062
+ console.warn(`\u26A0\uFE0F mod helper received zero divisor`);
15063
+ return 0;
15064
+ }
15065
+ return numA % numB;
15066
+ });
15067
+ import_handlebars.default.registerHelper("uppercase", (str) => {
15068
+ return String(str || "").toUpperCase();
15069
+ });
15070
+ import_handlebars.default.registerHelper("lowercase", (str) => {
15071
+ return String(str || "").toLowerCase();
15072
+ });
15073
+ import_handlebars.default.registerHelper("replace", (str, search, replace) => {
15074
+ return String(str || "").split(search).join(replace);
15075
+ });
15076
+ import_handlebars.default.registerHelper("eq", (a, b) => {
15077
+ return a === b;
15078
+ });
15079
+ import_handlebars.default.registerHelper("neq", (a, b) => {
15080
+ return a !== b;
15081
+ });
15082
+ import_handlebars.default.registerHelper("gt", (a, b) => {
15083
+ return Number(a) > Number(b);
15084
+ });
15085
+ import_handlebars.default.registerHelper("lt", (a, b) => {
15086
+ return Number(a) < Number(b);
15087
+ });
15088
+ import_handlebars.default.registerHelper("gte", (a, b) => {
15089
+ return Number(a) >= Number(b);
15090
+ });
15091
+ import_handlebars.default.registerHelper("lte", (a, b) => {
15092
+ return Number(a) <= Number(b);
15093
+ });
15094
+ import_handlebars.default.registerHelper("default", (value, defaultValue) => {
15095
+ return value ?? defaultValue;
15096
+ });
15097
+ import_handlebars.default.registerHelper("json", (obj) => {
15098
+ return JSON.stringify(obj, null, 2);
15099
+ });
15100
+ import_handlebars.default.registerHelper("isDefined", (value) => value !== void 0);
15101
+ helpersRegistered = true;
14876
15102
  }
14877
- function normalizeMCPCustomHeaders(headers) {
14878
- if (!headers) return void 0;
14879
- const normalized = {};
14880
- for (const [rawName, rawValue] of Object.entries(headers)) {
14881
- const name = rawName.trim();
14882
- if (!name || !isValidMCPHeaderName(name)) continue;
14883
- if (isReservedMCPCustomHeaderName(name)) continue;
14884
- if (typeof rawValue !== "string") continue;
14885
- normalized[name] = rawValue;
15103
+ function renderTemplate(templateString, context, options = {}) {
15104
+ if (!templateString || typeof templateString !== "string") {
15105
+ return "";
14886
15106
  }
14887
- return Object.keys(normalized).length > 0 ? normalized : void 0;
14888
- }
14889
- function restoreRedactedMCPCustomHeaders(options) {
14890
- if (!options.next) return void 0;
14891
- const restored = {};
14892
- for (const [key, value] of Object.entries(options.next)) {
14893
- restored[key] = value === MCP_HEADER_REDACTED_SENTINEL && options.current?.[key] !== void 0 ? options.current[key] : value;
15107
+ if (!helpersRegistered) {
15108
+ registerHandlebarsHelpers();
14894
15109
  }
14895
- return normalizeMCPCustomHeaders(restored);
14896
- }
14897
-
14898
- // src/tools/mcp/auth-secrets.ts
14899
- var MCP_AUTH_SECRET_FIELDS = [
14900
- "token",
14901
- "api_token",
14902
- "api_secret",
14903
- "oauth_client_secret",
14904
- "oauth_access_token",
14905
- "oauth_refresh_token"
14906
- ];
14907
- function restoreRedactedMCPAuthSecrets(options) {
14908
- if (!options.next) return void 0;
14909
- const restored = { ...options.next };
14910
- const record = restored;
14911
- for (const field of MCP_AUTH_SECRET_FIELDS) {
14912
- if (restored[field] === MCP_HEADER_REDACTED_SENTINEL && options.current?.[field] !== void 0) {
14913
- record[field] = options.current[field];
15110
+ try {
15111
+ const template = import_handlebars.default.compile(templateString);
15112
+ return template(context);
15113
+ } catch (error) {
15114
+ console.error("\u274C Handlebars template error:", error);
15115
+ console.error("Template:", templateString);
15116
+ console.error("Context keys:", Object.keys(context));
15117
+ if (options.onError === "raw") {
15118
+ return templateString;
14914
15119
  }
15120
+ return "";
14915
15121
  }
14916
- return restored;
14917
15122
  }
14918
-
14919
- // src/db/repositories/mcp-servers.ts
14920
- init_database_wrapper();
14921
- init_schema();
14922
- var MCPServerRepository = class {
14923
- constructor(db) {
14924
- this.db = db;
14925
- }
14926
- /**
14927
- * Convert database row to MCPServer type
14928
- */
14929
- rowToMCPServer(row) {
14930
- return {
14931
- mcp_server_id: row.mcp_server_id,
14932
- name: row.name,
14933
- transport: row.transport,
14934
- scope: row.scope,
14935
- enabled: Boolean(row.enabled),
15123
+ function buildBranchContext(branch) {
15124
+ const branchEntity = {
15125
+ unique_id: branch.branch_unique_id,
15126
+ name: branch.name,
15127
+ path: branch.path,
15128
+ gid: branch.unix_gid,
15129
+ base_ref: branch.base_ref || "",
15130
+ ref_type: branch.ref_type || "branch"
15131
+ };
15132
+ return {
15133
+ // Scoped entities (accessible as {{entity.property}})
15134
+ branch: branchEntity,
15135
+ // Legacy alias — preserved for existing env templates that reference
15136
+ // {{worktree.*}} keys. Points at the same object so updates stay in sync.
15137
+ worktree: branchEntity,
15138
+ repo: {
15139
+ slug: branch.repo_slug || ""
15140
+ },
15141
+ host: {
15142
+ ip_address: branch.host_ip_address || ""
15143
+ },
15144
+ // User-defined custom context (accessible as {{custom.key}})
15145
+ custom: branch.custom_context || {}
15146
+ };
15147
+ }
15148
+
15149
+ // src/mcp/template-patterns.ts
15150
+ init_cjs_shims();
15151
+ function containsTemplate(value) {
15152
+ return value.includes("{{") && value.includes("}}");
15153
+ }
15154
+ var USER_ENV_PLACEHOLDER_RE = /^\{\{\s*user\.env\.[A-Za-z_][A-Za-z0-9_]*\s*\}\}$/;
15155
+ function isUserEnvPlaceholder(value) {
15156
+ return USER_ENV_PLACEHOLDER_RE.test(value.trim());
15157
+ }
15158
+
15159
+ // src/mcp/template-resolver.ts
15160
+ function buildMCPTemplateContextFromEnv(env) {
15161
+ const userEnvKeysStr = env[AGOR_USER_ENV_KEYS_VAR];
15162
+ const allowedKeys = userEnvKeysStr ? new Set(userEnvKeysStr.split(",")) : /* @__PURE__ */ new Set();
15163
+ const userEnv = {};
15164
+ for (const key of allowedKeys) {
15165
+ const value = env[key];
15166
+ if (value !== void 0) {
15167
+ userEnv[key] = value;
15168
+ }
15169
+ }
15170
+ return {
15171
+ user: {
15172
+ env: userEnv
15173
+ }
15174
+ };
15175
+ }
15176
+ function resolveStringValue(fieldName, templateValue, context) {
15177
+ if (!containsTemplate(templateValue)) {
15178
+ return templateValue;
15179
+ }
15180
+ try {
15181
+ const resolved = renderTemplate(templateValue, context);
15182
+ if (!resolved || resolved.trim() === "") {
15183
+ console.log(` \u2139\uFE0F MCP "${fieldName}" resolved to empty (user may need to set env var)`);
15184
+ return void 0;
15185
+ }
15186
+ return resolved;
15187
+ } catch (error) {
15188
+ console.warn(
15189
+ ` \u26A0\uFE0F Failed to resolve MCP template "${fieldName}":`,
15190
+ error instanceof Error ? error.message : String(error)
15191
+ );
15192
+ return void 0;
15193
+ }
15194
+ }
15195
+ function resolveMcpServerEnv(envTemplate, context) {
15196
+ if (!envTemplate || Object.keys(envTemplate).length === 0) {
15197
+ return void 0;
15198
+ }
15199
+ const result = {};
15200
+ for (const [key, templateValue] of Object.entries(envTemplate)) {
15201
+ const resolved = resolveStringValue(`env.${key}`, templateValue, context);
15202
+ if (resolved !== void 0) {
15203
+ result[key] = resolved;
15204
+ }
15205
+ }
15206
+ return Object.keys(result).length > 0 ? result : void 0;
15207
+ }
15208
+ var TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS = [
15209
+ "token",
15210
+ "api_token",
15211
+ "api_secret",
15212
+ "oauth_client_secret"
15213
+ ];
15214
+ function resolveMcpServerTemplates(server, context) {
15215
+ const resolved = { ...server };
15216
+ const unresolvedFields = [];
15217
+ const hadUrlTemplate = server.url && containsTemplate(server.url);
15218
+ if (server.url) {
15219
+ resolved.url = resolveStringValue("url", server.url, context);
15220
+ if (hadUrlTemplate && !resolved.url) {
15221
+ unresolvedFields.push("url");
15222
+ }
15223
+ }
15224
+ if (server.env) {
15225
+ const resolvedEnv = {};
15226
+ for (const [key, templateValue] of Object.entries(server.env)) {
15227
+ const hadTemplate = containsTemplate(templateValue);
15228
+ const resolvedValue = resolveStringValue(`env.${key}`, templateValue, context);
15229
+ if (resolvedValue !== void 0) {
15230
+ resolvedEnv[key] = resolvedValue;
15231
+ } else if (hadTemplate) {
15232
+ unresolvedFields.push(`env.${key}`);
15233
+ }
15234
+ }
15235
+ resolved.env = Object.keys(resolvedEnv).length > 0 ? resolvedEnv : void 0;
15236
+ }
15237
+ if (server.headers) {
15238
+ const resolvedHeaders = {};
15239
+ for (const [key, templateValue] of Object.entries(server.headers)) {
15240
+ const hadTemplate = containsTemplate(templateValue);
15241
+ const resolvedValue = resolveStringValue(`headers.${key}`, templateValue, context);
15242
+ if (resolvedValue !== void 0) {
15243
+ resolvedHeaders[key] = resolvedValue;
15244
+ } else if (hadTemplate) {
15245
+ unresolvedFields.push(`headers.${key}`);
15246
+ }
15247
+ }
15248
+ resolved.headers = Object.keys(resolvedHeaders).length > 0 ? resolvedHeaders : void 0;
15249
+ }
15250
+ if (server.auth) {
15251
+ const resolvedAuth = { ...server.auth };
15252
+ if (server.auth.token) {
15253
+ const hadTemplate = containsTemplate(server.auth.token);
15254
+ resolvedAuth.token = resolveStringValue("auth.token", server.auth.token, context);
15255
+ if (hadTemplate && !resolvedAuth.token) {
15256
+ unresolvedFields.push("auth.token");
15257
+ }
15258
+ }
15259
+ if (server.auth.api_url) {
15260
+ const hadTemplate = containsTemplate(server.auth.api_url);
15261
+ resolvedAuth.api_url = resolveStringValue("auth.api_url", server.auth.api_url, context);
15262
+ if (hadTemplate && !resolvedAuth.api_url) {
15263
+ unresolvedFields.push("auth.api_url");
15264
+ }
15265
+ }
15266
+ if (server.auth.api_token) {
15267
+ const hadTemplate = containsTemplate(server.auth.api_token);
15268
+ resolvedAuth.api_token = resolveStringValue("auth.api_token", server.auth.api_token, context);
15269
+ if (hadTemplate && !resolvedAuth.api_token) {
15270
+ unresolvedFields.push("auth.api_token");
15271
+ }
15272
+ }
15273
+ if (server.auth.api_secret) {
15274
+ const hadTemplate = containsTemplate(server.auth.api_secret);
15275
+ resolvedAuth.api_secret = resolveStringValue(
15276
+ "auth.api_secret",
15277
+ server.auth.api_secret,
15278
+ context
15279
+ );
15280
+ if (hadTemplate && !resolvedAuth.api_secret) {
15281
+ unresolvedFields.push("auth.api_secret");
15282
+ }
15283
+ }
15284
+ if (server.auth.type === "oauth") {
15285
+ if (server.auth.oauth_token_url) {
15286
+ const _hadTemplate = containsTemplate(server.auth.oauth_token_url);
15287
+ resolvedAuth.oauth_token_url = resolveStringValue(
15288
+ "auth.oauth_token_url",
15289
+ server.auth.oauth_token_url,
15290
+ context
15291
+ );
15292
+ }
15293
+ if (server.auth.oauth_client_id) {
15294
+ const _hadTemplate = containsTemplate(server.auth.oauth_client_id);
15295
+ resolvedAuth.oauth_client_id = resolveStringValue(
15296
+ "auth.oauth_client_id",
15297
+ server.auth.oauth_client_id,
15298
+ context
15299
+ );
15300
+ }
15301
+ if (server.auth.oauth_client_secret) {
15302
+ const _hadTemplate = containsTemplate(server.auth.oauth_client_secret);
15303
+ resolvedAuth.oauth_client_secret = resolveStringValue(
15304
+ "auth.oauth_client_secret",
15305
+ server.auth.oauth_client_secret,
15306
+ context
15307
+ );
15308
+ }
15309
+ if (server.auth.oauth_scope) {
15310
+ const _hadTemplate = containsTemplate(server.auth.oauth_scope);
15311
+ resolvedAuth.oauth_scope = resolveStringValue(
15312
+ "auth.oauth_scope",
15313
+ server.auth.oauth_scope,
15314
+ context
15315
+ );
15316
+ }
15317
+ resolvedAuth.oauth_grant_type = server.auth.oauth_grant_type || "client_credentials";
15318
+ }
15319
+ resolved.auth = resolvedAuth;
15320
+ }
15321
+ const isHttpTransport = server.transport === "http" || server.transport === "sse";
15322
+ const urlRequired = isHttpTransport && hadUrlTemplate;
15323
+ const urlMissing = urlRequired && !resolved.url;
15324
+ const isValid2 = !urlMissing;
15325
+ let errorMessage;
15326
+ if (!isValid2) {
15327
+ const missingVars = unresolvedFields.map((f) => {
15328
+ let originalValue;
15329
+ if (f === "url") {
15330
+ originalValue = server.url;
15331
+ } else if (f.startsWith("env.")) {
15332
+ originalValue = server.env?.[f.slice(4)];
15333
+ } else if (f.startsWith("headers.")) {
15334
+ originalValue = server.headers?.[f.slice(8)];
15335
+ } else if (f.startsWith("auth.") && server.auth) {
15336
+ const authKey = f.slice(5);
15337
+ const authValue = server.auth[authKey];
15338
+ originalValue = typeof authValue === "string" ? authValue : void 0;
15339
+ }
15340
+ return originalValue || f;
15341
+ }).join(", ");
15342
+ errorMessage = `MCP server "${server.name}" has unresolved required templates: ${missingVars}. Set the corresponding environment variables in your user settings.`;
15343
+ }
15344
+ return {
15345
+ server: resolved,
15346
+ unresolvedFields,
15347
+ isValid: isValid2,
15348
+ errorMessage
15349
+ };
15350
+ }
15351
+ function resolveMcpServersTemplates(servers, context) {
15352
+ return servers.map((server) => resolveMcpServerTemplates(server, context));
15353
+ }
15354
+
15355
+ // src/tools/mcp/http-headers.ts
15356
+ init_cjs_shims();
15357
+ var MCP_HEADER_REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
15358
+ var RESERVED_MCP_CUSTOM_HEADER_NAMES = /* @__PURE__ */ new Set([
15359
+ "authorization",
15360
+ // Hop-by-hop / transport-controlled headers. These are managed by fetch,
15361
+ // the MCP SDK transport, or the auth configuration and should not be stored
15362
+ // as custom MCP service-account headers.
15363
+ "connection",
15364
+ "content-length",
15365
+ "cookie",
15366
+ "host",
15367
+ "mcp-session-id",
15368
+ "te",
15369
+ "trailer",
15370
+ "transfer-encoding",
15371
+ "upgrade"
15372
+ ]);
15373
+ var HEADER_NAME_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
15374
+ function isValidMCPHeaderName(name) {
15375
+ return HEADER_NAME_RE.test(name);
15376
+ }
15377
+ function isReservedMCPCustomHeaderName(name) {
15378
+ return RESERVED_MCP_CUSTOM_HEADER_NAMES.has(name.toLowerCase());
15379
+ }
15380
+ function normalizeMCPCustomHeaders(headers) {
15381
+ if (!headers) return void 0;
15382
+ const normalized = {};
15383
+ for (const [rawName, rawValue] of Object.entries(headers)) {
15384
+ const name = rawName.trim();
15385
+ if (!name || !isValidMCPHeaderName(name)) continue;
15386
+ if (isReservedMCPCustomHeaderName(name)) continue;
15387
+ if (typeof rawValue !== "string") continue;
15388
+ normalized[name] = rawValue;
15389
+ }
15390
+ return Object.keys(normalized).length > 0 ? normalized : void 0;
15391
+ }
15392
+ function restoreRedactedMCPCustomHeaders(options) {
15393
+ if (!options.next) return void 0;
15394
+ const restored = {};
15395
+ for (const [key, value] of Object.entries(options.next)) {
15396
+ restored[key] = value === MCP_HEADER_REDACTED_SENTINEL && options.current?.[key] !== void 0 ? options.current[key] : value;
15397
+ }
15398
+ return normalizeMCPCustomHeaders(restored);
15399
+ }
15400
+
15401
+ // src/tools/mcp/auth-secrets.ts
15402
+ var MCP_AUTH_SECRET_FIELDS = [
15403
+ "token",
15404
+ "api_token",
15405
+ "api_secret",
15406
+ "oauth_client_secret",
15407
+ "oauth_access_token",
15408
+ "oauth_refresh_token"
15409
+ ];
15410
+ function restoreRedactedMCPAuthSecrets(options) {
15411
+ if (!options.next) return void 0;
15412
+ const restored = { ...options.next };
15413
+ const record = restored;
15414
+ for (const field of MCP_AUTH_SECRET_FIELDS) {
15415
+ if (restored[field] === MCP_HEADER_REDACTED_SENTINEL && options.current?.[field] !== void 0) {
15416
+ record[field] = options.current[field];
15417
+ }
15418
+ }
15419
+ return restored;
15420
+ }
15421
+
15422
+ // src/db/repositories/mcp-servers.ts
15423
+ init_database_wrapper();
15424
+ init_schema();
15425
+ var MCPServerRepository = class {
15426
+ constructor(db) {
15427
+ this.db = db;
15428
+ }
15429
+ /**
15430
+ * Convert database row to MCPServer type
15431
+ */
15432
+ rowToMCPServer(row) {
15433
+ return {
15434
+ mcp_server_id: row.mcp_server_id,
15435
+ name: row.name,
15436
+ transport: row.transport,
15437
+ scope: row.scope,
15438
+ enabled: Boolean(row.enabled),
14936
15439
  source: row.source,
14937
15440
  created_at: new Date(row.created_at),
14938
15441
  updated_at: row.updated_at ? new Date(row.updated_at) : new Date(row.created_at),
@@ -16138,40 +16641,43 @@ var SessionRepository = class {
16138
16641
  const sessionId = row.session_id;
16139
16642
  const boardId = branchBoardId ?? null;
16140
16643
  const url = baseUrl && boardId ? getSessionUrl(sessionId, baseUrl) : null;
16141
- return {
16142
- session_id: sessionId,
16143
- status: row.status,
16144
- agentic_tool: row.agentic_tool,
16145
- created_at: new Date(row.created_at).toISOString(),
16146
- last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
16147
- created_by: row.created_by,
16148
- unix_username: row.unix_username || null,
16149
- branch_id: row.branch_id,
16150
- branch_board_id: boardId,
16151
- url,
16152
- ...row.data,
16153
- tasks: row.data.tasks.map((id) => id),
16154
- genealogy: {
16155
- parent_session_id: row.parent_session_id,
16156
- forked_from_session_id: row.forked_from_session_id,
16157
- fork_point_task_id: genealogyData.fork_point_task_id,
16158
- fork_point_message_index: genealogyData.fork_point_message_index,
16159
- spawn_point_task_id: genealogyData.spawn_point_task_id,
16160
- spawn_point_message_index: genealogyData.spawn_point_message_index,
16161
- children: genealogyData.children.map((id) => id)
16644
+ return attachHiddenTenant(
16645
+ {
16646
+ session_id: sessionId,
16647
+ status: row.status,
16648
+ agentic_tool: row.agentic_tool,
16649
+ created_at: new Date(row.created_at).toISOString(),
16650
+ last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
16651
+ created_by: row.created_by,
16652
+ unix_username: row.unix_username || null,
16653
+ branch_id: row.branch_id,
16654
+ branch_board_id: boardId,
16655
+ url,
16656
+ ...row.data,
16657
+ tasks: row.data.tasks.map((id) => id),
16658
+ genealogy: {
16659
+ parent_session_id: row.parent_session_id,
16660
+ forked_from_session_id: row.forked_from_session_id,
16661
+ fork_point_task_id: genealogyData.fork_point_task_id,
16662
+ fork_point_message_index: genealogyData.fork_point_message_index,
16663
+ spawn_point_task_id: genealogyData.spawn_point_task_id,
16664
+ spawn_point_message_index: genealogyData.spawn_point_message_index,
16665
+ children: genealogyData.children.map((id) => id)
16666
+ },
16667
+ permission_config: row.data.permission_config,
16668
+ scheduled_run_at: row.scheduled_run_at ?? void 0,
16669
+ scheduled_from_branch: row.scheduled_from_branch ?? false,
16670
+ schedule_id: row.schedule_id ?? void 0,
16671
+ ready_for_prompt: row.ready_for_prompt ?? false,
16672
+ archived: Boolean(row.archived),
16673
+ // Convert SQLite integer (0/1) to boolean
16674
+ archived_reason: row.archived_reason ?? void 0,
16675
+ current_context_usage: row.data.current_context_usage,
16676
+ context_window_limit: row.data.context_window_limit,
16677
+ last_context_update_at: row.data.last_context_update_at
16162
16678
  },
16163
- permission_config: row.data.permission_config,
16164
- scheduled_run_at: row.scheduled_run_at ?? void 0,
16165
- scheduled_from_branch: row.scheduled_from_branch ?? false,
16166
- schedule_id: row.schedule_id ?? void 0,
16167
- ready_for_prompt: row.ready_for_prompt ?? false,
16168
- archived: Boolean(row.archived),
16169
- // Convert SQLite integer (0/1) to boolean
16170
- archived_reason: row.archived_reason ?? void 0,
16171
- current_context_usage: row.data.current_context_usage,
16172
- context_window_limit: row.data.context_window_limit,
16173
- last_context_update_at: row.data.last_context_update_at
16174
- };
16679
+ row
16680
+ );
16175
16681
  }
16176
16682
  /**
16177
16683
  * Convert Session to database insert format
@@ -16318,6 +16824,26 @@ var SessionRepository = class {
16318
16824
  );
16319
16825
  }
16320
16826
  }
16827
+ /**
16828
+ * Resolve the owning user id for a session without hydrating the full row.
16829
+ * Used by realtime delivery to offer streaming events to the session
16830
+ * creator's own connections as a fallback, so their open tabs keep updating
16831
+ * even before they subscribe to the per-session stream channel.
16832
+ */
16833
+ async findCreatedByBySessionId(id) {
16834
+ try {
16835
+ const fullId = await this.resolveId(id);
16836
+ const row = await select(this.db, { created_by: sessions3.created_by }).from(sessions3).where((0, import_drizzle_orm30.eq)(sessions3.session_id, fullId)).one();
16837
+ return row?.created_by ?? null;
16838
+ } catch (error) {
16839
+ if (error instanceof EntityNotFoundError) return null;
16840
+ if (error instanceof AmbiguousIdError) throw error;
16841
+ throw new RepositoryError(
16842
+ `Failed to find session owner: ${error instanceof Error ? error.message : String(error)}`,
16843
+ error
16844
+ );
16845
+ }
16846
+ }
16321
16847
  /**
16322
16848
  * Find all sessions
16323
16849
  *
@@ -16584,7 +17110,7 @@ var SessionRepository = class {
16584
17110
  throw new RepositoryError("Session update did not produce an updated_at timestamp");
16585
17111
  }
16586
17112
  merged.last_updated = insertData.updated_at.toISOString();
16587
- return merged;
17113
+ return attachHiddenTenant(merged, currentRow);
16588
17114
  });
16589
17115
  return result;
16590
17116
  } catch (error) {
@@ -18596,192 +19122,52 @@ var UsersRepository = class {
18596
19122
  */
18597
19123
  async deleteToolConfigField(userId, tool, field) {
18598
19124
  const fullId = await this.resolveId(userId);
18599
- const row = await this.getRawRow(fullId);
18600
- if (!row) {
18601
- throw new EntityNotFoundError("User", userId);
18602
- }
18603
- const stored = row.data.agentic_tools ?? {};
18604
- const toolFields = { ...stored[tool] ?? {} };
18605
- delete toolFields[field];
18606
- const next = { ...stored };
18607
- if (Object.keys(toolFields).length > 0) {
18608
- next[tool] = toolFields;
18609
- } else {
18610
- delete next[tool];
18611
- }
18612
- await update(this.db, users3).set({
18613
- data: { ...row.data, agentic_tools: next },
18614
- updated_at: /* @__PURE__ */ new Date()
18615
- }).where((0, import_drizzle_orm37.eq)(users3.user_id, fullId)).run();
18616
- }
18617
- };
18618
-
18619
- // src/db/index.ts
18620
- init_schema();
18621
-
18622
- // src/db/session-guard.ts
18623
- init_cjs_shims();
18624
- init_ids();
18625
- async function withSessionGuard(sessionId, sessionsRepo, operation) {
18626
- const sessionExists = await sessionsRepo?.findById(sessionId);
18627
- if (!sessionExists) {
18628
- console.warn(`\u26A0\uFE0F Session ${shortId(sessionId)} no longer exists, skipping guarded operation`);
18629
- return null;
18630
- }
18631
- return operation();
18632
- }
18633
- function isForeignKeyConstraintError(error) {
18634
- return error instanceof Error && (error.message.includes("FOREIGN KEY constraint failed") || error.message.includes("SQLITE_CONSTRAINT_FOREIGNKEY"));
18635
- }
18636
-
18637
- // src/db/index.ts
18638
- init_tenant_scope();
18639
- init_user_utils();
18640
- var compare = import_bcryptjs3.default.compare;
18641
- var hash = import_bcryptjs3.default.hash;
18642
-
18643
- // src/environment/render-snapshot.ts
18644
- init_cjs_shims();
18645
-
18646
- // src/templates/handlebars-helpers.ts
18647
- init_cjs_shims();
18648
- var import_handlebars = __toESM(require("handlebars"), 1);
18649
- var helpersRegistered = false;
18650
- function registerHandlebarsHelpers() {
18651
- import_handlebars.default.registerHelper("add", (a, b) => {
18652
- const numA = Number(a);
18653
- const numB = Number(b);
18654
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18655
- console.warn(`\u26A0\uFE0F add helper received non-numeric values: ${a}, ${b}`);
18656
- return 0;
18657
- }
18658
- return numA + numB;
18659
- });
18660
- import_handlebars.default.registerHelper("sub", (a, b) => {
18661
- const numA = Number(a);
18662
- const numB = Number(b);
18663
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18664
- console.warn(`\u26A0\uFE0F sub helper received non-numeric values: ${a}, ${b}`);
18665
- return 0;
18666
- }
18667
- return numA - numB;
18668
- });
18669
- import_handlebars.default.registerHelper("mul", (a, b) => {
18670
- const numA = Number(a);
18671
- const numB = Number(b);
18672
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18673
- console.warn(`\u26A0\uFE0F mul helper received non-numeric values: ${a}, ${b}`);
18674
- return 0;
18675
- }
18676
- return numA * numB;
18677
- });
18678
- import_handlebars.default.registerHelper("div", (a, b) => {
18679
- const numA = Number(a);
18680
- const numB = Number(b);
18681
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18682
- console.warn(`\u26A0\uFE0F div helper received non-numeric values: ${a}, ${b}`);
18683
- return 0;
18684
- }
18685
- if (numB === 0) {
18686
- console.warn(`\u26A0\uFE0F div helper received zero divisor`);
18687
- return 0;
18688
- }
18689
- return numA / numB;
18690
- });
18691
- import_handlebars.default.registerHelper("mod", (a, b) => {
18692
- const numA = Number(a);
18693
- const numB = Number(b);
18694
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18695
- console.warn(`\u26A0\uFE0F mod helper received non-numeric values: ${a}, ${b}`);
18696
- return 0;
18697
- }
18698
- if (numB === 0) {
18699
- console.warn(`\u26A0\uFE0F mod helper received zero divisor`);
18700
- return 0;
18701
- }
18702
- return numA % numB;
18703
- });
18704
- import_handlebars.default.registerHelper("uppercase", (str) => {
18705
- return String(str || "").toUpperCase();
18706
- });
18707
- import_handlebars.default.registerHelper("lowercase", (str) => {
18708
- return String(str || "").toLowerCase();
18709
- });
18710
- import_handlebars.default.registerHelper("replace", (str, search, replace) => {
18711
- return String(str || "").split(search).join(replace);
18712
- });
18713
- import_handlebars.default.registerHelper("eq", (a, b) => {
18714
- return a === b;
18715
- });
18716
- import_handlebars.default.registerHelper("neq", (a, b) => {
18717
- return a !== b;
18718
- });
18719
- import_handlebars.default.registerHelper("gt", (a, b) => {
18720
- return Number(a) > Number(b);
18721
- });
18722
- import_handlebars.default.registerHelper("lt", (a, b) => {
18723
- return Number(a) < Number(b);
18724
- });
18725
- import_handlebars.default.registerHelper("gte", (a, b) => {
18726
- return Number(a) >= Number(b);
18727
- });
18728
- import_handlebars.default.registerHelper("lte", (a, b) => {
18729
- return Number(a) <= Number(b);
18730
- });
18731
- import_handlebars.default.registerHelper("default", (value, defaultValue) => {
18732
- return value ?? defaultValue;
18733
- });
18734
- import_handlebars.default.registerHelper("json", (obj) => {
18735
- return JSON.stringify(obj, null, 2);
18736
- });
18737
- import_handlebars.default.registerHelper("isDefined", (value) => value !== void 0);
18738
- helpersRegistered = true;
18739
- }
18740
- function renderTemplate(templateString, context, options = {}) {
18741
- if (!templateString || typeof templateString !== "string") {
18742
- return "";
18743
- }
18744
- if (!helpersRegistered) {
18745
- registerHandlebarsHelpers();
18746
- }
18747
- try {
18748
- const template = import_handlebars.default.compile(templateString);
18749
- return template(context);
18750
- } catch (error) {
18751
- console.error("\u274C Handlebars template error:", error);
18752
- console.error("Template:", templateString);
18753
- console.error("Context keys:", Object.keys(context));
18754
- if (options.onError === "raw") {
18755
- return templateString;
19125
+ const row = await this.getRawRow(fullId);
19126
+ if (!row) {
19127
+ throw new EntityNotFoundError("User", userId);
18756
19128
  }
18757
- return "";
19129
+ const stored = row.data.agentic_tools ?? {};
19130
+ const toolFields = { ...stored[tool] ?? {} };
19131
+ delete toolFields[field];
19132
+ const next = { ...stored };
19133
+ if (Object.keys(toolFields).length > 0) {
19134
+ next[tool] = toolFields;
19135
+ } else {
19136
+ delete next[tool];
19137
+ }
19138
+ await update(this.db, users3).set({
19139
+ data: { ...row.data, agentic_tools: next },
19140
+ updated_at: /* @__PURE__ */ new Date()
19141
+ }).where((0, import_drizzle_orm37.eq)(users3.user_id, fullId)).run();
19142
+ }
19143
+ };
19144
+
19145
+ // src/db/index.ts
19146
+ init_schema();
19147
+
19148
+ // src/db/session-guard.ts
19149
+ init_cjs_shims();
19150
+ init_ids();
19151
+ async function withSessionGuard(sessionId, sessionsRepo, operation) {
19152
+ const sessionExists = await sessionsRepo?.findById(sessionId);
19153
+ if (!sessionExists) {
19154
+ console.warn(`\u26A0\uFE0F Session ${shortId(sessionId)} no longer exists, skipping guarded operation`);
19155
+ return null;
18758
19156
  }
19157
+ return operation();
18759
19158
  }
18760
- function buildBranchContext(branch) {
18761
- const branchEntity = {
18762
- unique_id: branch.branch_unique_id,
18763
- name: branch.name,
18764
- path: branch.path,
18765
- gid: branch.unix_gid
18766
- };
18767
- return {
18768
- // Scoped entities (accessible as {{entity.property}})
18769
- branch: branchEntity,
18770
- // Legacy alias — preserved for existing env templates that reference
18771
- // {{worktree.*}} keys. Points at the same object so updates stay in sync.
18772
- worktree: branchEntity,
18773
- repo: {
18774
- slug: branch.repo_slug || ""
18775
- },
18776
- host: {
18777
- ip_address: branch.host_ip_address || ""
18778
- },
18779
- // User-defined custom context (accessible as {{custom.key}})
18780
- custom: branch.custom_context || {}
18781
- };
19159
+ function isForeignKeyConstraintError(error) {
19160
+ return error instanceof Error && (error.message.includes("FOREIGN KEY constraint failed") || error.message.includes("SQLITE_CONSTRAINT_FOREIGNKEY"));
18782
19161
  }
18783
19162
 
19163
+ // src/db/index.ts
19164
+ init_tenant_scope();
19165
+ init_user_utils();
19166
+ var compare = import_bcryptjs3.default.compare;
19167
+ var hash = import_bcryptjs3.default.hash;
19168
+
18784
19169
  // src/environment/render-snapshot.ts
19170
+ init_cjs_shims();
18785
19171
  function deepMergeContext(base, overrides) {
18786
19172
  if (!overrides) return base;
18787
19173
  const out = { ...base };
@@ -18818,7 +19204,9 @@ function renderBranchSnapshot(repo, branch, variantName) {
18818
19204
  repo_slug: repo.slug,
18819
19205
  custom_context: branch.custom_context,
18820
19206
  unix_gid: branch.unix_gid,
18821
- host_ip_address: branch.host_ip_address
19207
+ host_ip_address: branch.host_ip_address,
19208
+ base_ref: branch.base_ref,
19209
+ ref_type: branch.ref_type
18822
19210
  });
18823
19211
  const { custom, ...nonCustomBase } = baseContext;
18824
19212
  const overridden = deepMergeContext(
@@ -19032,200 +19420,6 @@ async function validateDirectory(path2, context = "Directory") {
19032
19420
  // src/mcp/index.ts
19033
19421
  init_cjs_shims();
19034
19422
 
19035
- // src/mcp/template-resolver.ts
19036
- init_cjs_shims();
19037
- function buildMCPTemplateContextFromEnv(env) {
19038
- const userEnvKeysStr = env[AGOR_USER_ENV_KEYS_VAR];
19039
- const allowedKeys = userEnvKeysStr ? new Set(userEnvKeysStr.split(",")) : /* @__PURE__ */ new Set();
19040
- const userEnv = {};
19041
- for (const key of allowedKeys) {
19042
- const value = env[key];
19043
- if (value !== void 0) {
19044
- userEnv[key] = value;
19045
- }
19046
- }
19047
- return {
19048
- user: {
19049
- env: userEnv
19050
- }
19051
- };
19052
- }
19053
- function containsTemplate(value) {
19054
- return value.includes("{{") && value.includes("}}");
19055
- }
19056
- function resolveStringValue(fieldName, templateValue, context) {
19057
- if (!containsTemplate(templateValue)) {
19058
- return templateValue;
19059
- }
19060
- try {
19061
- const resolved = renderTemplate(templateValue, context);
19062
- if (!resolved || resolved.trim() === "") {
19063
- console.log(` \u2139\uFE0F MCP "${fieldName}" resolved to empty (user may need to set env var)`);
19064
- return void 0;
19065
- }
19066
- return resolved;
19067
- } catch (error) {
19068
- console.warn(
19069
- ` \u26A0\uFE0F Failed to resolve MCP template "${fieldName}":`,
19070
- error instanceof Error ? error.message : String(error)
19071
- );
19072
- return void 0;
19073
- }
19074
- }
19075
- function resolveMcpServerEnv(envTemplate, context) {
19076
- if (!envTemplate || Object.keys(envTemplate).length === 0) {
19077
- return void 0;
19078
- }
19079
- const result = {};
19080
- for (const [key, templateValue] of Object.entries(envTemplate)) {
19081
- const resolved = resolveStringValue(`env.${key}`, templateValue, context);
19082
- if (resolved !== void 0) {
19083
- result[key] = resolved;
19084
- }
19085
- }
19086
- return Object.keys(result).length > 0 ? result : void 0;
19087
- }
19088
- function resolveMcpServerTemplates(server, context) {
19089
- const resolved = { ...server };
19090
- const unresolvedFields = [];
19091
- const hadUrlTemplate = server.url && containsTemplate(server.url);
19092
- if (server.url) {
19093
- resolved.url = resolveStringValue("url", server.url, context);
19094
- if (hadUrlTemplate && !resolved.url) {
19095
- unresolvedFields.push("url");
19096
- }
19097
- }
19098
- if (server.env) {
19099
- const resolvedEnv = {};
19100
- for (const [key, templateValue] of Object.entries(server.env)) {
19101
- const hadTemplate = containsTemplate(templateValue);
19102
- const resolvedValue = resolveStringValue(`env.${key}`, templateValue, context);
19103
- if (resolvedValue !== void 0) {
19104
- resolvedEnv[key] = resolvedValue;
19105
- } else if (hadTemplate) {
19106
- unresolvedFields.push(`env.${key}`);
19107
- }
19108
- }
19109
- resolved.env = Object.keys(resolvedEnv).length > 0 ? resolvedEnv : void 0;
19110
- }
19111
- if (server.headers) {
19112
- const resolvedHeaders = {};
19113
- for (const [key, templateValue] of Object.entries(server.headers)) {
19114
- const hadTemplate = containsTemplate(templateValue);
19115
- const resolvedValue = resolveStringValue(`headers.${key}`, templateValue, context);
19116
- if (resolvedValue !== void 0) {
19117
- resolvedHeaders[key] = resolvedValue;
19118
- } else if (hadTemplate) {
19119
- unresolvedFields.push(`headers.${key}`);
19120
- }
19121
- }
19122
- resolved.headers = Object.keys(resolvedHeaders).length > 0 ? resolvedHeaders : void 0;
19123
- }
19124
- if (server.auth) {
19125
- const resolvedAuth = { ...server.auth };
19126
- if (server.auth.token) {
19127
- const hadTemplate = containsTemplate(server.auth.token);
19128
- resolvedAuth.token = resolveStringValue("auth.token", server.auth.token, context);
19129
- if (hadTemplate && !resolvedAuth.token) {
19130
- unresolvedFields.push("auth.token");
19131
- }
19132
- }
19133
- if (server.auth.api_url) {
19134
- const hadTemplate = containsTemplate(server.auth.api_url);
19135
- resolvedAuth.api_url = resolveStringValue("auth.api_url", server.auth.api_url, context);
19136
- if (hadTemplate && !resolvedAuth.api_url) {
19137
- unresolvedFields.push("auth.api_url");
19138
- }
19139
- }
19140
- if (server.auth.api_token) {
19141
- const hadTemplate = containsTemplate(server.auth.api_token);
19142
- resolvedAuth.api_token = resolveStringValue("auth.api_token", server.auth.api_token, context);
19143
- if (hadTemplate && !resolvedAuth.api_token) {
19144
- unresolvedFields.push("auth.api_token");
19145
- }
19146
- }
19147
- if (server.auth.api_secret) {
19148
- const hadTemplate = containsTemplate(server.auth.api_secret);
19149
- resolvedAuth.api_secret = resolveStringValue(
19150
- "auth.api_secret",
19151
- server.auth.api_secret,
19152
- context
19153
- );
19154
- if (hadTemplate && !resolvedAuth.api_secret) {
19155
- unresolvedFields.push("auth.api_secret");
19156
- }
19157
- }
19158
- if (server.auth.type === "oauth") {
19159
- if (server.auth.oauth_token_url) {
19160
- const _hadTemplate = containsTemplate(server.auth.oauth_token_url);
19161
- resolvedAuth.oauth_token_url = resolveStringValue(
19162
- "auth.oauth_token_url",
19163
- server.auth.oauth_token_url,
19164
- context
19165
- );
19166
- }
19167
- if (server.auth.oauth_client_id) {
19168
- const _hadTemplate = containsTemplate(server.auth.oauth_client_id);
19169
- resolvedAuth.oauth_client_id = resolveStringValue(
19170
- "auth.oauth_client_id",
19171
- server.auth.oauth_client_id,
19172
- context
19173
- );
19174
- }
19175
- if (server.auth.oauth_client_secret) {
19176
- const _hadTemplate = containsTemplate(server.auth.oauth_client_secret);
19177
- resolvedAuth.oauth_client_secret = resolveStringValue(
19178
- "auth.oauth_client_secret",
19179
- server.auth.oauth_client_secret,
19180
- context
19181
- );
19182
- }
19183
- if (server.auth.oauth_scope) {
19184
- const _hadTemplate = containsTemplate(server.auth.oauth_scope);
19185
- resolvedAuth.oauth_scope = resolveStringValue(
19186
- "auth.oauth_scope",
19187
- server.auth.oauth_scope,
19188
- context
19189
- );
19190
- }
19191
- resolvedAuth.oauth_grant_type = server.auth.oauth_grant_type || "client_credentials";
19192
- }
19193
- resolved.auth = resolvedAuth;
19194
- }
19195
- const isHttpTransport = server.transport === "http" || server.transport === "sse";
19196
- const urlRequired = isHttpTransport && hadUrlTemplate;
19197
- const urlMissing = urlRequired && !resolved.url;
19198
- const isValid2 = !urlMissing;
19199
- let errorMessage;
19200
- if (!isValid2) {
19201
- const missingVars = unresolvedFields.map((f) => {
19202
- let originalValue;
19203
- if (f === "url") {
19204
- originalValue = server.url;
19205
- } else if (f.startsWith("env.")) {
19206
- originalValue = server.env?.[f.slice(4)];
19207
- } else if (f.startsWith("headers.")) {
19208
- originalValue = server.headers?.[f.slice(8)];
19209
- } else if (f.startsWith("auth.") && server.auth) {
19210
- const authKey = f.slice(5);
19211
- const authValue = server.auth[authKey];
19212
- originalValue = typeof authValue === "string" ? authValue : void 0;
19213
- }
19214
- return originalValue || f;
19215
- }).join(", ");
19216
- errorMessage = `MCP server "${server.name}" has unresolved required templates: ${missingVars}. Set the corresponding environment variables in your user settings.`;
19217
- }
19218
- return {
19219
- server: resolved,
19220
- unresolvedFields,
19221
- isValid: isValid2,
19222
- errorMessage
19223
- };
19224
- }
19225
- function resolveMcpServersTemplates(servers, context) {
19226
- return servers.map((server) => resolveMcpServerTemplates(server, context));
19227
- }
19228
-
19229
19423
  // src/search/index.ts
19230
19424
  init_cjs_shims();
19231
19425
 
@@ -22543,6 +22737,7 @@ function unpatchConsole() {
22543
22737
  SudoCliExecutor,
22544
22738
  SudoDirectExecutor,
22545
22739
  SymlinkCommands,
22740
+ TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS,
22546
22741
  TERMINAL_TASK_STATUSES,
22547
22742
  TOOL_API_KEY_NAMES,
22548
22743
  TaskRepository,
@@ -22604,6 +22799,7 @@ function unpatchConsole() {
22604
22799
  checkAsUser,
22605
22800
  checkMigrationStatus,
22606
22801
  compare,
22802
+ containsTemplate,
22607
22803
  count,
22608
22804
  createAdminExecutor,
22609
22805
  createClient,
@@ -22693,6 +22889,7 @@ function unpatchConsole() {
22693
22889
  getRepoReferenceOptions,
22694
22890
  getReposDir,
22695
22891
  getReposDirAsync,
22892
+ getRequiredSecretFields,
22696
22893
  getServiceTier,
22697
22894
  getSessionType,
22698
22895
  getUidFromUsername,
@@ -22745,6 +22942,7 @@ function unpatchConsole() {
22745
22942
  isThreadRoot,
22746
22943
  isUnixGroupRefreshNeeded,
22747
22944
  isUnixImpersonationEnabled,
22945
+ isUserEnvPlaceholder,
22748
22946
  isUserInGroup,
22749
22947
  isValid,
22750
22948
  isValidBranchGroupName,