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
@@ -1641,6 +1641,21 @@ var init_file = __esm({
1641
1641
  });
1642
1642
 
1643
1643
  // src/types/gateway.ts
1644
+ function getRequiredSecretFields(channelType, config) {
1645
+ switch (channelType) {
1646
+ case "slack": {
1647
+ const wantsInbound = config.connection_mode === "socket" || config.enable_channels === true || config.enable_groups === true || config.enable_mpim === true;
1648
+ const outboundOnly = config.outbound_enabled === true && !wantsInbound;
1649
+ return outboundOnly ? ["bot_token"] : ["bot_token", "app_token"];
1650
+ }
1651
+ case "github":
1652
+ return ["private_key"];
1653
+ case "teams":
1654
+ return ["app_password"];
1655
+ default:
1656
+ return [];
1657
+ }
1658
+ }
1644
1659
  var GATEWAY_SENSITIVE_CONFIG_FIELDS, GATEWAY_REDACTED_SENTINEL;
1645
1660
  var init_gateway = __esm({
1646
1661
  "src/types/gateway.ts"() {
@@ -5998,6 +6013,7 @@ __export(src_exports, {
5998
6013
  SudoCliExecutor: () => SudoCliExecutor,
5999
6014
  SudoDirectExecutor: () => SudoDirectExecutor,
6000
6015
  SymlinkCommands: () => SymlinkCommands,
6016
+ TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS: () => TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS,
6001
6017
  TERMINAL_TASK_STATUSES: () => TERMINAL_TASK_STATUSES,
6002
6018
  TOOL_API_KEY_NAMES: () => TOOL_API_KEY_NAMES,
6003
6019
  TaskRepository: () => TaskRepository,
@@ -6059,6 +6075,7 @@ __export(src_exports, {
6059
6075
  checkAsUser: () => checkAsUser,
6060
6076
  checkMigrationStatus: () => checkMigrationStatus,
6061
6077
  compare: () => compare,
6078
+ containsTemplate: () => containsTemplate,
6062
6079
  count: () => count,
6063
6080
  createAdminExecutor: () => createAdminExecutor,
6064
6081
  createClient: () => createClient,
@@ -6148,6 +6165,7 @@ __export(src_exports, {
6148
6165
  getRepoReferenceOptions: () => getRepoReferenceOptions,
6149
6166
  getReposDir: () => getReposDir,
6150
6167
  getReposDirAsync: () => getReposDirAsync,
6168
+ getRequiredSecretFields: () => getRequiredSecretFields,
6151
6169
  getServiceTier: () => getServiceTier,
6152
6170
  getSessionType: () => getSessionType,
6153
6171
  getUidFromUsername: () => getUidFromUsername,
@@ -6200,6 +6218,7 @@ __export(src_exports, {
6200
6218
  isThreadRoot: () => isThreadRoot,
6201
6219
  isUnixGroupRefreshNeeded: () => isUnixGroupRefreshNeeded,
6202
6220
  isUnixImpersonationEnabled: () => isUnixImpersonationEnabled,
6221
+ isUserEnvPlaceholder: () => isUserEnvPlaceholder,
6203
6222
  isUserInGroup: () => isUserInGroup,
6204
6223
  isValid: () => isValid,
6205
6224
  isValidBranchGroupName: () => isValidBranchGroupName,
@@ -11517,6 +11536,63 @@ var BranchRepository = class {
11517
11536
  }
11518
11537
  return Array.from(userIds);
11519
11538
  }
11539
+ /**
11540
+ * Find non-archived branches whose explicit filesystem access set can change
11541
+ * when membership in the given group changes.
11542
+ *
11543
+ * Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
11544
+ * both encode which group grants materialize into branch-folder access.
11545
+ * App-only grants (`fs_access = 'none'`) are intentionally excluded because
11546
+ * membership changes for those grants do not require branch-folder mutation.
11547
+ */
11548
+ async findExplicitFsAccessBranchIdsForGroup(groupId) {
11549
+ const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, eq14(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
11550
+ groups3,
11551
+ and12(eq14(groups3.group_id, branchGroupGrants3.group_id), eq14(groups3.archived, false))
11552
+ ).where(
11553
+ and12(
11554
+ eq14(branchGroupGrants3.group_id, groupId),
11555
+ eq14(branches3.archived, false),
11556
+ inArray4(
11557
+ sql9`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
11558
+ FS_ACCESS_BRANCH_PERMISSIONS
11559
+ )
11560
+ )
11561
+ ).all();
11562
+ const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
11563
+ groups3,
11564
+ and12(eq14(groups3.group_id, boardGroupGrants3.group_id), eq14(groups3.archived, false))
11565
+ ).innerJoin(
11566
+ boards3,
11567
+ and12(
11568
+ eq14(boards3.board_id, boardGroupGrants3.board_id),
11569
+ eq14(sql9`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
11570
+ )
11571
+ ).innerJoin(
11572
+ branches3,
11573
+ and12(
11574
+ eq14(branches3.board_id, boardGroupGrants3.board_id),
11575
+ eq14(branches3.permission_source, "board"),
11576
+ eq14(branches3.archived, false)
11577
+ )
11578
+ ).where(
11579
+ and12(
11580
+ eq14(boardGroupGrants3.group_id, groupId),
11581
+ inArray4(
11582
+ sql9`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
11583
+ FS_ACCESS_BRANCH_PERMISSIONS
11584
+ )
11585
+ )
11586
+ ).all();
11587
+ const branchIds = /* @__PURE__ */ new Set();
11588
+ for (const row of directRows) {
11589
+ branchIds.add(row.branch_id);
11590
+ }
11591
+ for (const row of boardRows) {
11592
+ branchIds.add(row.branch_id);
11593
+ }
11594
+ return Array.from(branchIds);
11595
+ }
11520
11596
  async findBoardAlignedBranches(boardId) {
11521
11597
  const rows = await select(this.db).from(branches3).where(
11522
11598
  and12(
@@ -12524,6 +12600,60 @@ var BoardRepository = class {
12524
12600
  );
12525
12601
  }
12526
12602
  }
12603
+ /**
12604
+ * Shallow-merge field patches into existing board objects in a single
12605
+ * read-modify-write.
12606
+ *
12607
+ * Unlike upsertBoardObject (which fully replaces the object value, dropping
12608
+ * omitted fields), this overwrites ONLY the provided keys and leaves the rest
12609
+ * of each object intact — so a narrow change (e.g. a zIndex reorder) has a
12610
+ * smaller blast radius and won't clobber a field edited via a different patch
12611
+ * call. Multiple objects in one call are merged before a single write, so a
12612
+ * forward/backward swap touches both neighbors in one update.
12613
+ *
12614
+ * Objects that no longer exist are SKIPPED, never re-created — so a swap can't
12615
+ * resurrect a neighbor deleted between the client's read and this write.
12616
+ *
12617
+ * Only an explicit allowlist of fields can be merged (currently just `zIndex`,
12618
+ * which is also clamped into the board-object band [1, 499] so it can never be
12619
+ * pushed onto the card (500) / comment (1000) layers). Any other key in a
12620
+ * patch is ignored, so this narrow action cannot reshape an object (e.g. flip
12621
+ * its `type`) the way a full upsert could.
12622
+ *
12623
+ * NOTE: this is NOT atomic against concurrent writers. Like every other board
12624
+ * writer, the findById → update sequence has a lost-update window: a write
12625
+ * that lands between the read and the update can be overwritten (last-write-
12626
+ * wins). Merging only the patched keys narrows that window's blast radius
12627
+ * versus a full-object upsert, but does not close it.
12628
+ */
12629
+ async mergeBoardObjectFields(boardId, patches) {
12630
+ const Z_MIN = 1;
12631
+ const Z_MAX = 499;
12632
+ try {
12633
+ const fullId = await this.resolveId(boardId);
12634
+ const current = await this.findById(fullId);
12635
+ if (!current) {
12636
+ throw new EntityNotFoundError("Board", boardId);
12637
+ }
12638
+ const updatedObjects = { ...current.objects || {} };
12639
+ for (const [objectId, fields] of Object.entries(patches)) {
12640
+ const existing = updatedObjects[objectId];
12641
+ if (!existing) continue;
12642
+ const { zIndex } = fields;
12643
+ if (typeof zIndex !== "number" || !Number.isFinite(zIndex)) continue;
12644
+ const safeZIndex = Math.min(Z_MAX, Math.max(Z_MIN, zIndex));
12645
+ updatedObjects[objectId] = { ...existing, zIndex: safeZIndex };
12646
+ }
12647
+ return this.update(fullId, { objects: updatedObjects });
12648
+ } catch (error) {
12649
+ if (error instanceof RepositoryError) throw error;
12650
+ if (error instanceof EntityNotFoundError) throw error;
12651
+ throw new RepositoryError(
12652
+ `Failed to merge board object fields: ${error instanceof Error ? error.message : String(error)}`,
12653
+ error
12654
+ );
12655
+ }
12656
+ }
12527
12657
  /**
12528
12658
  * DEPRECATED: Delete a zone and handle associated sessions
12529
12659
  * TODO: Reimplement using board-objects table
@@ -13258,6 +13388,28 @@ var GatewayChannelRepository = class {
13258
13388
  agentic_config: encryptedAgenticConfig
13259
13389
  };
13260
13390
  }
13391
+ /**
13392
+ * Enforce the "enabled requires secrets" invariant on every write path.
13393
+ *
13394
+ * An enabled channel can never exist without the secrets its type needs to
13395
+ * function. Runs on the post-merge, decrypted config so a patch that only
13396
+ * flips `enabled: true` on a channel with already-stored tokens passes.
13397
+ * Disabled ("draft") channels are exempt.
13398
+ */
13399
+ assertRequiredSecretsWhenEnabled(channel) {
13400
+ if (channel.enabled === false) return;
13401
+ const channelType = channel.channel_type ?? "slack";
13402
+ const config = channel.config ?? {};
13403
+ const missing = getRequiredSecretFields(channelType, config).filter((field) => {
13404
+ const value = config[field];
13405
+ return typeof value !== "string" || value.trim() === "" || value === GATEWAY_REDACTED_SENTINEL;
13406
+ });
13407
+ if (missing.length > 0) {
13408
+ throw new RepositoryError(
13409
+ `Cannot enable ${channelType} gateway channel: missing required secret(s) ${missing.join(", ")}`
13410
+ );
13411
+ }
13412
+ }
13261
13413
  /**
13262
13414
  * Resolve short ID to full ID
13263
13415
  */
@@ -13289,6 +13441,7 @@ var GatewayChannelRepository = class {
13289
13441
  id: data.id ?? generateId(),
13290
13442
  channel_key: data.channel_key ?? generateId()
13291
13443
  });
13444
+ this.assertRequiredSecretsWhenEnabled(data);
13292
13445
  await insert(this.db, gatewayChannels3).values(insertData).run();
13293
13446
  const row = await select(this.db).from(gatewayChannels3).where(eq18(gatewayChannels3.id, insertData.id)).one();
13294
13447
  if (!row) {
@@ -13355,6 +13508,7 @@ var GatewayChannelRepository = class {
13355
13508
  }
13356
13509
  merged.config = mergedConfig;
13357
13510
  }
13511
+ this.assertRequiredSecretsWhenEnabled(merged);
13358
13512
  const insertData = this.channelToInsert(merged);
13359
13513
  await update(this.db, gatewayChannels3).set({
13360
13514
  name: insertData.name,
@@ -14869,90 +15023,439 @@ import { and as and17, eq as eq21, like as like10 } from "drizzle-orm";
14869
15023
  // src/tools/mcp/auth-secrets.ts
14870
15024
  init_esm_shims();
14871
15025
 
14872
- // src/tools/mcp/http-headers.ts
15026
+ // src/mcp/template-resolver.ts
14873
15027
  init_esm_shims();
14874
- var MCP_HEADER_REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
14875
- var RESERVED_MCP_CUSTOM_HEADER_NAMES = /* @__PURE__ */ new Set([
14876
- "authorization",
14877
- // Hop-by-hop / transport-controlled headers. These are managed by fetch,
14878
- // the MCP SDK transport, or the auth configuration and should not be stored
14879
- // as custom MCP service-account headers.
14880
- "connection",
14881
- "content-length",
14882
- "cookie",
14883
- "host",
14884
- "mcp-session-id",
14885
- "te",
14886
- "trailer",
14887
- "transfer-encoding",
14888
- "upgrade"
14889
- ]);
14890
- var HEADER_NAME_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
14891
- function isValidMCPHeaderName(name) {
14892
- return HEADER_NAME_RE.test(name);
14893
- }
14894
- function isReservedMCPCustomHeaderName(name) {
14895
- return RESERVED_MCP_CUSTOM_HEADER_NAMES.has(name.toLowerCase());
15028
+
15029
+ // src/templates/handlebars-helpers.ts
15030
+ init_esm_shims();
15031
+ import Handlebars from "handlebars";
15032
+ var helpersRegistered = false;
15033
+ function registerHandlebarsHelpers() {
15034
+ Handlebars.registerHelper("add", (a, b) => {
15035
+ const numA = Number(a);
15036
+ const numB = Number(b);
15037
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15038
+ console.warn(`\u26A0\uFE0F add helper received non-numeric values: ${a}, ${b}`);
15039
+ return 0;
15040
+ }
15041
+ return numA + numB;
15042
+ });
15043
+ Handlebars.registerHelper("sub", (a, b) => {
15044
+ const numA = Number(a);
15045
+ const numB = Number(b);
15046
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15047
+ console.warn(`\u26A0\uFE0F sub helper received non-numeric values: ${a}, ${b}`);
15048
+ return 0;
15049
+ }
15050
+ return numA - numB;
15051
+ });
15052
+ Handlebars.registerHelper("mul", (a, b) => {
15053
+ const numA = Number(a);
15054
+ const numB = Number(b);
15055
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15056
+ console.warn(`\u26A0\uFE0F mul helper received non-numeric values: ${a}, ${b}`);
15057
+ return 0;
15058
+ }
15059
+ return numA * numB;
15060
+ });
15061
+ Handlebars.registerHelper("div", (a, b) => {
15062
+ const numA = Number(a);
15063
+ const numB = Number(b);
15064
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15065
+ console.warn(`\u26A0\uFE0F div helper received non-numeric values: ${a}, ${b}`);
15066
+ return 0;
15067
+ }
15068
+ if (numB === 0) {
15069
+ console.warn(`\u26A0\uFE0F div helper received zero divisor`);
15070
+ return 0;
15071
+ }
15072
+ return numA / numB;
15073
+ });
15074
+ Handlebars.registerHelper("mod", (a, b) => {
15075
+ const numA = Number(a);
15076
+ const numB = Number(b);
15077
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
15078
+ console.warn(`\u26A0\uFE0F mod helper received non-numeric values: ${a}, ${b}`);
15079
+ return 0;
15080
+ }
15081
+ if (numB === 0) {
15082
+ console.warn(`\u26A0\uFE0F mod helper received zero divisor`);
15083
+ return 0;
15084
+ }
15085
+ return numA % numB;
15086
+ });
15087
+ Handlebars.registerHelper("uppercase", (str) => {
15088
+ return String(str || "").toUpperCase();
15089
+ });
15090
+ Handlebars.registerHelper("lowercase", (str) => {
15091
+ return String(str || "").toLowerCase();
15092
+ });
15093
+ Handlebars.registerHelper("replace", (str, search, replace) => {
15094
+ return String(str || "").split(search).join(replace);
15095
+ });
15096
+ Handlebars.registerHelper("eq", (a, b) => {
15097
+ return a === b;
15098
+ });
15099
+ Handlebars.registerHelper("neq", (a, b) => {
15100
+ return a !== b;
15101
+ });
15102
+ Handlebars.registerHelper("gt", (a, b) => {
15103
+ return Number(a) > Number(b);
15104
+ });
15105
+ Handlebars.registerHelper("lt", (a, b) => {
15106
+ return Number(a) < Number(b);
15107
+ });
15108
+ Handlebars.registerHelper("gte", (a, b) => {
15109
+ return Number(a) >= Number(b);
15110
+ });
15111
+ Handlebars.registerHelper("lte", (a, b) => {
15112
+ return Number(a) <= Number(b);
15113
+ });
15114
+ Handlebars.registerHelper("default", (value, defaultValue) => {
15115
+ return value ?? defaultValue;
15116
+ });
15117
+ Handlebars.registerHelper("json", (obj) => {
15118
+ return JSON.stringify(obj, null, 2);
15119
+ });
15120
+ Handlebars.registerHelper("isDefined", (value) => value !== void 0);
15121
+ helpersRegistered = true;
14896
15122
  }
14897
- function normalizeMCPCustomHeaders(headers) {
14898
- if (!headers) return void 0;
14899
- const normalized = {};
14900
- for (const [rawName, rawValue] of Object.entries(headers)) {
14901
- const name = rawName.trim();
14902
- if (!name || !isValidMCPHeaderName(name)) continue;
14903
- if (isReservedMCPCustomHeaderName(name)) continue;
14904
- if (typeof rawValue !== "string") continue;
14905
- normalized[name] = rawValue;
15123
+ function renderTemplate(templateString, context, options = {}) {
15124
+ if (!templateString || typeof templateString !== "string") {
15125
+ return "";
14906
15126
  }
14907
- return Object.keys(normalized).length > 0 ? normalized : void 0;
14908
- }
14909
- function restoreRedactedMCPCustomHeaders(options) {
14910
- if (!options.next) return void 0;
14911
- const restored = {};
14912
- for (const [key, value] of Object.entries(options.next)) {
14913
- restored[key] = value === MCP_HEADER_REDACTED_SENTINEL && options.current?.[key] !== void 0 ? options.current[key] : value;
15127
+ if (!helpersRegistered) {
15128
+ registerHandlebarsHelpers();
14914
15129
  }
14915
- return normalizeMCPCustomHeaders(restored);
14916
- }
14917
-
14918
- // src/tools/mcp/auth-secrets.ts
14919
- var MCP_AUTH_SECRET_FIELDS = [
14920
- "token",
14921
- "api_token",
14922
- "api_secret",
14923
- "oauth_client_secret",
14924
- "oauth_access_token",
14925
- "oauth_refresh_token"
14926
- ];
14927
- function restoreRedactedMCPAuthSecrets(options) {
14928
- if (!options.next) return void 0;
14929
- const restored = { ...options.next };
14930
- const record = restored;
14931
- for (const field of MCP_AUTH_SECRET_FIELDS) {
14932
- if (restored[field] === MCP_HEADER_REDACTED_SENTINEL && options.current?.[field] !== void 0) {
14933
- record[field] = options.current[field];
15130
+ try {
15131
+ const template = Handlebars.compile(templateString);
15132
+ return template(context);
15133
+ } catch (error) {
15134
+ console.error("\u274C Handlebars template error:", error);
15135
+ console.error("Template:", templateString);
15136
+ console.error("Context keys:", Object.keys(context));
15137
+ if (options.onError === "raw") {
15138
+ return templateString;
14934
15139
  }
15140
+ return "";
14935
15141
  }
14936
- return restored;
14937
15142
  }
14938
-
14939
- // src/db/repositories/mcp-servers.ts
14940
- init_database_wrapper();
14941
- init_schema();
14942
- var MCPServerRepository = class {
14943
- constructor(db) {
14944
- this.db = db;
14945
- }
14946
- /**
14947
- * Convert database row to MCPServer type
14948
- */
14949
- rowToMCPServer(row) {
14950
- return {
14951
- mcp_server_id: row.mcp_server_id,
14952
- name: row.name,
14953
- transport: row.transport,
14954
- scope: row.scope,
14955
- enabled: Boolean(row.enabled),
15143
+ function buildBranchContext(branch) {
15144
+ const branchEntity = {
15145
+ unique_id: branch.branch_unique_id,
15146
+ name: branch.name,
15147
+ path: branch.path,
15148
+ gid: branch.unix_gid,
15149
+ base_ref: branch.base_ref || "",
15150
+ ref_type: branch.ref_type || "branch"
15151
+ };
15152
+ return {
15153
+ // Scoped entities (accessible as {{entity.property}})
15154
+ branch: branchEntity,
15155
+ // Legacy alias — preserved for existing env templates that reference
15156
+ // {{worktree.*}} keys. Points at the same object so updates stay in sync.
15157
+ worktree: branchEntity,
15158
+ repo: {
15159
+ slug: branch.repo_slug || ""
15160
+ },
15161
+ host: {
15162
+ ip_address: branch.host_ip_address || ""
15163
+ },
15164
+ // User-defined custom context (accessible as {{custom.key}})
15165
+ custom: branch.custom_context || {}
15166
+ };
15167
+ }
15168
+
15169
+ // src/mcp/template-patterns.ts
15170
+ init_esm_shims();
15171
+ function containsTemplate(value) {
15172
+ return value.includes("{{") && value.includes("}}");
15173
+ }
15174
+ var USER_ENV_PLACEHOLDER_RE = /^\{\{\s*user\.env\.[A-Za-z_][A-Za-z0-9_]*\s*\}\}$/;
15175
+ function isUserEnvPlaceholder(value) {
15176
+ return USER_ENV_PLACEHOLDER_RE.test(value.trim());
15177
+ }
15178
+
15179
+ // src/mcp/template-resolver.ts
15180
+ function buildMCPTemplateContextFromEnv(env) {
15181
+ const userEnvKeysStr = env[AGOR_USER_ENV_KEYS_VAR];
15182
+ const allowedKeys = userEnvKeysStr ? new Set(userEnvKeysStr.split(",")) : /* @__PURE__ */ new Set();
15183
+ const userEnv = {};
15184
+ for (const key of allowedKeys) {
15185
+ const value = env[key];
15186
+ if (value !== void 0) {
15187
+ userEnv[key] = value;
15188
+ }
15189
+ }
15190
+ return {
15191
+ user: {
15192
+ env: userEnv
15193
+ }
15194
+ };
15195
+ }
15196
+ function resolveStringValue(fieldName, templateValue, context) {
15197
+ if (!containsTemplate(templateValue)) {
15198
+ return templateValue;
15199
+ }
15200
+ try {
15201
+ const resolved = renderTemplate(templateValue, context);
15202
+ if (!resolved || resolved.trim() === "") {
15203
+ console.log(` \u2139\uFE0F MCP "${fieldName}" resolved to empty (user may need to set env var)`);
15204
+ return void 0;
15205
+ }
15206
+ return resolved;
15207
+ } catch (error) {
15208
+ console.warn(
15209
+ ` \u26A0\uFE0F Failed to resolve MCP template "${fieldName}":`,
15210
+ error instanceof Error ? error.message : String(error)
15211
+ );
15212
+ return void 0;
15213
+ }
15214
+ }
15215
+ function resolveMcpServerEnv(envTemplate, context) {
15216
+ if (!envTemplate || Object.keys(envTemplate).length === 0) {
15217
+ return void 0;
15218
+ }
15219
+ const result = {};
15220
+ for (const [key, templateValue] of Object.entries(envTemplate)) {
15221
+ const resolved = resolveStringValue(`env.${key}`, templateValue, context);
15222
+ if (resolved !== void 0) {
15223
+ result[key] = resolved;
15224
+ }
15225
+ }
15226
+ return Object.keys(result).length > 0 ? result : void 0;
15227
+ }
15228
+ var TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS = [
15229
+ "token",
15230
+ "api_token",
15231
+ "api_secret",
15232
+ "oauth_client_secret"
15233
+ ];
15234
+ function resolveMcpServerTemplates(server, context) {
15235
+ const resolved = { ...server };
15236
+ const unresolvedFields = [];
15237
+ const hadUrlTemplate = server.url && containsTemplate(server.url);
15238
+ if (server.url) {
15239
+ resolved.url = resolveStringValue("url", server.url, context);
15240
+ if (hadUrlTemplate && !resolved.url) {
15241
+ unresolvedFields.push("url");
15242
+ }
15243
+ }
15244
+ if (server.env) {
15245
+ const resolvedEnv = {};
15246
+ for (const [key, templateValue] of Object.entries(server.env)) {
15247
+ const hadTemplate = containsTemplate(templateValue);
15248
+ const resolvedValue = resolveStringValue(`env.${key}`, templateValue, context);
15249
+ if (resolvedValue !== void 0) {
15250
+ resolvedEnv[key] = resolvedValue;
15251
+ } else if (hadTemplate) {
15252
+ unresolvedFields.push(`env.${key}`);
15253
+ }
15254
+ }
15255
+ resolved.env = Object.keys(resolvedEnv).length > 0 ? resolvedEnv : void 0;
15256
+ }
15257
+ if (server.headers) {
15258
+ const resolvedHeaders = {};
15259
+ for (const [key, templateValue] of Object.entries(server.headers)) {
15260
+ const hadTemplate = containsTemplate(templateValue);
15261
+ const resolvedValue = resolveStringValue(`headers.${key}`, templateValue, context);
15262
+ if (resolvedValue !== void 0) {
15263
+ resolvedHeaders[key] = resolvedValue;
15264
+ } else if (hadTemplate) {
15265
+ unresolvedFields.push(`headers.${key}`);
15266
+ }
15267
+ }
15268
+ resolved.headers = Object.keys(resolvedHeaders).length > 0 ? resolvedHeaders : void 0;
15269
+ }
15270
+ if (server.auth) {
15271
+ const resolvedAuth = { ...server.auth };
15272
+ if (server.auth.token) {
15273
+ const hadTemplate = containsTemplate(server.auth.token);
15274
+ resolvedAuth.token = resolveStringValue("auth.token", server.auth.token, context);
15275
+ if (hadTemplate && !resolvedAuth.token) {
15276
+ unresolvedFields.push("auth.token");
15277
+ }
15278
+ }
15279
+ if (server.auth.api_url) {
15280
+ const hadTemplate = containsTemplate(server.auth.api_url);
15281
+ resolvedAuth.api_url = resolveStringValue("auth.api_url", server.auth.api_url, context);
15282
+ if (hadTemplate && !resolvedAuth.api_url) {
15283
+ unresolvedFields.push("auth.api_url");
15284
+ }
15285
+ }
15286
+ if (server.auth.api_token) {
15287
+ const hadTemplate = containsTemplate(server.auth.api_token);
15288
+ resolvedAuth.api_token = resolveStringValue("auth.api_token", server.auth.api_token, context);
15289
+ if (hadTemplate && !resolvedAuth.api_token) {
15290
+ unresolvedFields.push("auth.api_token");
15291
+ }
15292
+ }
15293
+ if (server.auth.api_secret) {
15294
+ const hadTemplate = containsTemplate(server.auth.api_secret);
15295
+ resolvedAuth.api_secret = resolveStringValue(
15296
+ "auth.api_secret",
15297
+ server.auth.api_secret,
15298
+ context
15299
+ );
15300
+ if (hadTemplate && !resolvedAuth.api_secret) {
15301
+ unresolvedFields.push("auth.api_secret");
15302
+ }
15303
+ }
15304
+ if (server.auth.type === "oauth") {
15305
+ if (server.auth.oauth_token_url) {
15306
+ const _hadTemplate = containsTemplate(server.auth.oauth_token_url);
15307
+ resolvedAuth.oauth_token_url = resolveStringValue(
15308
+ "auth.oauth_token_url",
15309
+ server.auth.oauth_token_url,
15310
+ context
15311
+ );
15312
+ }
15313
+ if (server.auth.oauth_client_id) {
15314
+ const _hadTemplate = containsTemplate(server.auth.oauth_client_id);
15315
+ resolvedAuth.oauth_client_id = resolveStringValue(
15316
+ "auth.oauth_client_id",
15317
+ server.auth.oauth_client_id,
15318
+ context
15319
+ );
15320
+ }
15321
+ if (server.auth.oauth_client_secret) {
15322
+ const _hadTemplate = containsTemplate(server.auth.oauth_client_secret);
15323
+ resolvedAuth.oauth_client_secret = resolveStringValue(
15324
+ "auth.oauth_client_secret",
15325
+ server.auth.oauth_client_secret,
15326
+ context
15327
+ );
15328
+ }
15329
+ if (server.auth.oauth_scope) {
15330
+ const _hadTemplate = containsTemplate(server.auth.oauth_scope);
15331
+ resolvedAuth.oauth_scope = resolveStringValue(
15332
+ "auth.oauth_scope",
15333
+ server.auth.oauth_scope,
15334
+ context
15335
+ );
15336
+ }
15337
+ resolvedAuth.oauth_grant_type = server.auth.oauth_grant_type || "client_credentials";
15338
+ }
15339
+ resolved.auth = resolvedAuth;
15340
+ }
15341
+ const isHttpTransport = server.transport === "http" || server.transport === "sse";
15342
+ const urlRequired = isHttpTransport && hadUrlTemplate;
15343
+ const urlMissing = urlRequired && !resolved.url;
15344
+ const isValid2 = !urlMissing;
15345
+ let errorMessage;
15346
+ if (!isValid2) {
15347
+ const missingVars = unresolvedFields.map((f) => {
15348
+ let originalValue;
15349
+ if (f === "url") {
15350
+ originalValue = server.url;
15351
+ } else if (f.startsWith("env.")) {
15352
+ originalValue = server.env?.[f.slice(4)];
15353
+ } else if (f.startsWith("headers.")) {
15354
+ originalValue = server.headers?.[f.slice(8)];
15355
+ } else if (f.startsWith("auth.") && server.auth) {
15356
+ const authKey = f.slice(5);
15357
+ const authValue = server.auth[authKey];
15358
+ originalValue = typeof authValue === "string" ? authValue : void 0;
15359
+ }
15360
+ return originalValue || f;
15361
+ }).join(", ");
15362
+ errorMessage = `MCP server "${server.name}" has unresolved required templates: ${missingVars}. Set the corresponding environment variables in your user settings.`;
15363
+ }
15364
+ return {
15365
+ server: resolved,
15366
+ unresolvedFields,
15367
+ isValid: isValid2,
15368
+ errorMessage
15369
+ };
15370
+ }
15371
+ function resolveMcpServersTemplates(servers, context) {
15372
+ return servers.map((server) => resolveMcpServerTemplates(server, context));
15373
+ }
15374
+
15375
+ // src/tools/mcp/http-headers.ts
15376
+ init_esm_shims();
15377
+ var MCP_HEADER_REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
15378
+ var RESERVED_MCP_CUSTOM_HEADER_NAMES = /* @__PURE__ */ new Set([
15379
+ "authorization",
15380
+ // Hop-by-hop / transport-controlled headers. These are managed by fetch,
15381
+ // the MCP SDK transport, or the auth configuration and should not be stored
15382
+ // as custom MCP service-account headers.
15383
+ "connection",
15384
+ "content-length",
15385
+ "cookie",
15386
+ "host",
15387
+ "mcp-session-id",
15388
+ "te",
15389
+ "trailer",
15390
+ "transfer-encoding",
15391
+ "upgrade"
15392
+ ]);
15393
+ var HEADER_NAME_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
15394
+ function isValidMCPHeaderName(name) {
15395
+ return HEADER_NAME_RE.test(name);
15396
+ }
15397
+ function isReservedMCPCustomHeaderName(name) {
15398
+ return RESERVED_MCP_CUSTOM_HEADER_NAMES.has(name.toLowerCase());
15399
+ }
15400
+ function normalizeMCPCustomHeaders(headers) {
15401
+ if (!headers) return void 0;
15402
+ const normalized = {};
15403
+ for (const [rawName, rawValue] of Object.entries(headers)) {
15404
+ const name = rawName.trim();
15405
+ if (!name || !isValidMCPHeaderName(name)) continue;
15406
+ if (isReservedMCPCustomHeaderName(name)) continue;
15407
+ if (typeof rawValue !== "string") continue;
15408
+ normalized[name] = rawValue;
15409
+ }
15410
+ return Object.keys(normalized).length > 0 ? normalized : void 0;
15411
+ }
15412
+ function restoreRedactedMCPCustomHeaders(options) {
15413
+ if (!options.next) return void 0;
15414
+ const restored = {};
15415
+ for (const [key, value] of Object.entries(options.next)) {
15416
+ restored[key] = value === MCP_HEADER_REDACTED_SENTINEL && options.current?.[key] !== void 0 ? options.current[key] : value;
15417
+ }
15418
+ return normalizeMCPCustomHeaders(restored);
15419
+ }
15420
+
15421
+ // src/tools/mcp/auth-secrets.ts
15422
+ var MCP_AUTH_SECRET_FIELDS = [
15423
+ "token",
15424
+ "api_token",
15425
+ "api_secret",
15426
+ "oauth_client_secret",
15427
+ "oauth_access_token",
15428
+ "oauth_refresh_token"
15429
+ ];
15430
+ function restoreRedactedMCPAuthSecrets(options) {
15431
+ if (!options.next) return void 0;
15432
+ const restored = { ...options.next };
15433
+ const record = restored;
15434
+ for (const field of MCP_AUTH_SECRET_FIELDS) {
15435
+ if (restored[field] === MCP_HEADER_REDACTED_SENTINEL && options.current?.[field] !== void 0) {
15436
+ record[field] = options.current[field];
15437
+ }
15438
+ }
15439
+ return restored;
15440
+ }
15441
+
15442
+ // src/db/repositories/mcp-servers.ts
15443
+ init_database_wrapper();
15444
+ init_schema();
15445
+ var MCPServerRepository = class {
15446
+ constructor(db) {
15447
+ this.db = db;
15448
+ }
15449
+ /**
15450
+ * Convert database row to MCPServer type
15451
+ */
15452
+ rowToMCPServer(row) {
15453
+ return {
15454
+ mcp_server_id: row.mcp_server_id,
15455
+ name: row.name,
15456
+ transport: row.transport,
15457
+ scope: row.scope,
15458
+ enabled: Boolean(row.enabled),
14956
15459
  source: row.source,
14957
15460
  created_at: new Date(row.created_at),
14958
15461
  updated_at: row.updated_at ? new Date(row.updated_at) : new Date(row.created_at),
@@ -16158,40 +16661,43 @@ var SessionRepository = class {
16158
16661
  const sessionId = row.session_id;
16159
16662
  const boardId = branchBoardId ?? null;
16160
16663
  const url = baseUrl && boardId ? getSessionUrl(sessionId, baseUrl) : null;
16161
- return {
16162
- session_id: sessionId,
16163
- status: row.status,
16164
- agentic_tool: row.agentic_tool,
16165
- created_at: new Date(row.created_at).toISOString(),
16166
- last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
16167
- created_by: row.created_by,
16168
- unix_username: row.unix_username || null,
16169
- branch_id: row.branch_id,
16170
- branch_board_id: boardId,
16171
- url,
16172
- ...row.data,
16173
- tasks: row.data.tasks.map((id) => id),
16174
- genealogy: {
16175
- parent_session_id: row.parent_session_id,
16176
- forked_from_session_id: row.forked_from_session_id,
16177
- fork_point_task_id: genealogyData.fork_point_task_id,
16178
- fork_point_message_index: genealogyData.fork_point_message_index,
16179
- spawn_point_task_id: genealogyData.spawn_point_task_id,
16180
- spawn_point_message_index: genealogyData.spawn_point_message_index,
16181
- children: genealogyData.children.map((id) => id)
16664
+ return attachHiddenTenant(
16665
+ {
16666
+ session_id: sessionId,
16667
+ status: row.status,
16668
+ agentic_tool: row.agentic_tool,
16669
+ created_at: new Date(row.created_at).toISOString(),
16670
+ last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
16671
+ created_by: row.created_by,
16672
+ unix_username: row.unix_username || null,
16673
+ branch_id: row.branch_id,
16674
+ branch_board_id: boardId,
16675
+ url,
16676
+ ...row.data,
16677
+ tasks: row.data.tasks.map((id) => id),
16678
+ genealogy: {
16679
+ parent_session_id: row.parent_session_id,
16680
+ forked_from_session_id: row.forked_from_session_id,
16681
+ fork_point_task_id: genealogyData.fork_point_task_id,
16682
+ fork_point_message_index: genealogyData.fork_point_message_index,
16683
+ spawn_point_task_id: genealogyData.spawn_point_task_id,
16684
+ spawn_point_message_index: genealogyData.spawn_point_message_index,
16685
+ children: genealogyData.children.map((id) => id)
16686
+ },
16687
+ permission_config: row.data.permission_config,
16688
+ scheduled_run_at: row.scheduled_run_at ?? void 0,
16689
+ scheduled_from_branch: row.scheduled_from_branch ?? false,
16690
+ schedule_id: row.schedule_id ?? void 0,
16691
+ ready_for_prompt: row.ready_for_prompt ?? false,
16692
+ archived: Boolean(row.archived),
16693
+ // Convert SQLite integer (0/1) to boolean
16694
+ archived_reason: row.archived_reason ?? void 0,
16695
+ current_context_usage: row.data.current_context_usage,
16696
+ context_window_limit: row.data.context_window_limit,
16697
+ last_context_update_at: row.data.last_context_update_at
16182
16698
  },
16183
- permission_config: row.data.permission_config,
16184
- scheduled_run_at: row.scheduled_run_at ?? void 0,
16185
- scheduled_from_branch: row.scheduled_from_branch ?? false,
16186
- schedule_id: row.schedule_id ?? void 0,
16187
- ready_for_prompt: row.ready_for_prompt ?? false,
16188
- archived: Boolean(row.archived),
16189
- // Convert SQLite integer (0/1) to boolean
16190
- archived_reason: row.archived_reason ?? void 0,
16191
- current_context_usage: row.data.current_context_usage,
16192
- context_window_limit: row.data.context_window_limit,
16193
- last_context_update_at: row.data.last_context_update_at
16194
- };
16699
+ row
16700
+ );
16195
16701
  }
16196
16702
  /**
16197
16703
  * Convert Session to database insert format
@@ -16338,6 +16844,26 @@ var SessionRepository = class {
16338
16844
  );
16339
16845
  }
16340
16846
  }
16847
+ /**
16848
+ * Resolve the owning user id for a session without hydrating the full row.
16849
+ * Used by realtime delivery to offer streaming events to the session
16850
+ * creator's own connections as a fallback, so their open tabs keep updating
16851
+ * even before they subscribe to the per-session stream channel.
16852
+ */
16853
+ async findCreatedByBySessionId(id) {
16854
+ try {
16855
+ const fullId = await this.resolveId(id);
16856
+ const row = await select(this.db, { created_by: sessions3.created_by }).from(sessions3).where(eq26(sessions3.session_id, fullId)).one();
16857
+ return row?.created_by ?? null;
16858
+ } catch (error) {
16859
+ if (error instanceof EntityNotFoundError) return null;
16860
+ if (error instanceof AmbiguousIdError) throw error;
16861
+ throw new RepositoryError(
16862
+ `Failed to find session owner: ${error instanceof Error ? error.message : String(error)}`,
16863
+ error
16864
+ );
16865
+ }
16866
+ }
16341
16867
  /**
16342
16868
  * Find all sessions
16343
16869
  *
@@ -16604,7 +17130,7 @@ var SessionRepository = class {
16604
17130
  throw new RepositoryError("Session update did not produce an updated_at timestamp");
16605
17131
  }
16606
17132
  merged.last_updated = insertData.updated_at.toISOString();
16607
- return merged;
17133
+ return attachHiddenTenant(merged, currentRow);
16608
17134
  });
16609
17135
  return result;
16610
17136
  } catch (error) {
@@ -18616,192 +19142,52 @@ var UsersRepository = class {
18616
19142
  */
18617
19143
  async deleteToolConfigField(userId, tool, field) {
18618
19144
  const fullId = await this.resolveId(userId);
18619
- const row = await this.getRawRow(fullId);
18620
- if (!row) {
18621
- throw new EntityNotFoundError("User", userId);
18622
- }
18623
- const stored = row.data.agentic_tools ?? {};
18624
- const toolFields = { ...stored[tool] ?? {} };
18625
- delete toolFields[field];
18626
- const next = { ...stored };
18627
- if (Object.keys(toolFields).length > 0) {
18628
- next[tool] = toolFields;
18629
- } else {
18630
- delete next[tool];
18631
- }
18632
- await update(this.db, users3).set({
18633
- data: { ...row.data, agentic_tools: next },
18634
- updated_at: /* @__PURE__ */ new Date()
18635
- }).where(eq33(users3.user_id, fullId)).run();
18636
- }
18637
- };
18638
-
18639
- // src/db/index.ts
18640
- init_schema();
18641
-
18642
- // src/db/session-guard.ts
18643
- init_esm_shims();
18644
- init_ids();
18645
- async function withSessionGuard(sessionId, sessionsRepo, operation) {
18646
- const sessionExists = await sessionsRepo?.findById(sessionId);
18647
- if (!sessionExists) {
18648
- console.warn(`\u26A0\uFE0F Session ${shortId(sessionId)} no longer exists, skipping guarded operation`);
18649
- return null;
18650
- }
18651
- return operation();
18652
- }
18653
- function isForeignKeyConstraintError(error) {
18654
- return error instanceof Error && (error.message.includes("FOREIGN KEY constraint failed") || error.message.includes("SQLITE_CONSTRAINT_FOREIGNKEY"));
18655
- }
18656
-
18657
- // src/db/index.ts
18658
- init_tenant_scope();
18659
- init_user_utils();
18660
- var compare = bcryptjs.compare;
18661
- var hash = bcryptjs.hash;
18662
-
18663
- // src/environment/render-snapshot.ts
18664
- init_esm_shims();
18665
-
18666
- // src/templates/handlebars-helpers.ts
18667
- init_esm_shims();
18668
- import Handlebars from "handlebars";
18669
- var helpersRegistered = false;
18670
- function registerHandlebarsHelpers() {
18671
- Handlebars.registerHelper("add", (a, b) => {
18672
- const numA = Number(a);
18673
- const numB = Number(b);
18674
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18675
- console.warn(`\u26A0\uFE0F add helper received non-numeric values: ${a}, ${b}`);
18676
- return 0;
18677
- }
18678
- return numA + numB;
18679
- });
18680
- Handlebars.registerHelper("sub", (a, b) => {
18681
- const numA = Number(a);
18682
- const numB = Number(b);
18683
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18684
- console.warn(`\u26A0\uFE0F sub helper received non-numeric values: ${a}, ${b}`);
18685
- return 0;
18686
- }
18687
- return numA - numB;
18688
- });
18689
- Handlebars.registerHelper("mul", (a, b) => {
18690
- const numA = Number(a);
18691
- const numB = Number(b);
18692
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18693
- console.warn(`\u26A0\uFE0F mul helper received non-numeric values: ${a}, ${b}`);
18694
- return 0;
18695
- }
18696
- return numA * numB;
18697
- });
18698
- Handlebars.registerHelper("div", (a, b) => {
18699
- const numA = Number(a);
18700
- const numB = Number(b);
18701
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18702
- console.warn(`\u26A0\uFE0F div helper received non-numeric values: ${a}, ${b}`);
18703
- return 0;
18704
- }
18705
- if (numB === 0) {
18706
- console.warn(`\u26A0\uFE0F div helper received zero divisor`);
18707
- return 0;
18708
- }
18709
- return numA / numB;
18710
- });
18711
- Handlebars.registerHelper("mod", (a, b) => {
18712
- const numA = Number(a);
18713
- const numB = Number(b);
18714
- if (Number.isNaN(numA) || Number.isNaN(numB)) {
18715
- console.warn(`\u26A0\uFE0F mod helper received non-numeric values: ${a}, ${b}`);
18716
- return 0;
18717
- }
18718
- if (numB === 0) {
18719
- console.warn(`\u26A0\uFE0F mod helper received zero divisor`);
18720
- return 0;
18721
- }
18722
- return numA % numB;
18723
- });
18724
- Handlebars.registerHelper("uppercase", (str) => {
18725
- return String(str || "").toUpperCase();
18726
- });
18727
- Handlebars.registerHelper("lowercase", (str) => {
18728
- return String(str || "").toLowerCase();
18729
- });
18730
- Handlebars.registerHelper("replace", (str, search, replace) => {
18731
- return String(str || "").split(search).join(replace);
18732
- });
18733
- Handlebars.registerHelper("eq", (a, b) => {
18734
- return a === b;
18735
- });
18736
- Handlebars.registerHelper("neq", (a, b) => {
18737
- return a !== b;
18738
- });
18739
- Handlebars.registerHelper("gt", (a, b) => {
18740
- return Number(a) > Number(b);
18741
- });
18742
- Handlebars.registerHelper("lt", (a, b) => {
18743
- return Number(a) < Number(b);
18744
- });
18745
- Handlebars.registerHelper("gte", (a, b) => {
18746
- return Number(a) >= Number(b);
18747
- });
18748
- Handlebars.registerHelper("lte", (a, b) => {
18749
- return Number(a) <= Number(b);
18750
- });
18751
- Handlebars.registerHelper("default", (value, defaultValue) => {
18752
- return value ?? defaultValue;
18753
- });
18754
- Handlebars.registerHelper("json", (obj) => {
18755
- return JSON.stringify(obj, null, 2);
18756
- });
18757
- Handlebars.registerHelper("isDefined", (value) => value !== void 0);
18758
- helpersRegistered = true;
18759
- }
18760
- function renderTemplate(templateString, context, options = {}) {
18761
- if (!templateString || typeof templateString !== "string") {
18762
- return "";
18763
- }
18764
- if (!helpersRegistered) {
18765
- registerHandlebarsHelpers();
18766
- }
18767
- try {
18768
- const template = Handlebars.compile(templateString);
18769
- return template(context);
18770
- } catch (error) {
18771
- console.error("\u274C Handlebars template error:", error);
18772
- console.error("Template:", templateString);
18773
- console.error("Context keys:", Object.keys(context));
18774
- if (options.onError === "raw") {
18775
- return templateString;
19145
+ const row = await this.getRawRow(fullId);
19146
+ if (!row) {
19147
+ throw new EntityNotFoundError("User", userId);
18776
19148
  }
18777
- return "";
19149
+ const stored = row.data.agentic_tools ?? {};
19150
+ const toolFields = { ...stored[tool] ?? {} };
19151
+ delete toolFields[field];
19152
+ const next = { ...stored };
19153
+ if (Object.keys(toolFields).length > 0) {
19154
+ next[tool] = toolFields;
19155
+ } else {
19156
+ delete next[tool];
19157
+ }
19158
+ await update(this.db, users3).set({
19159
+ data: { ...row.data, agentic_tools: next },
19160
+ updated_at: /* @__PURE__ */ new Date()
19161
+ }).where(eq33(users3.user_id, fullId)).run();
19162
+ }
19163
+ };
19164
+
19165
+ // src/db/index.ts
19166
+ init_schema();
19167
+
19168
+ // src/db/session-guard.ts
19169
+ init_esm_shims();
19170
+ init_ids();
19171
+ async function withSessionGuard(sessionId, sessionsRepo, operation) {
19172
+ const sessionExists = await sessionsRepo?.findById(sessionId);
19173
+ if (!sessionExists) {
19174
+ console.warn(`\u26A0\uFE0F Session ${shortId(sessionId)} no longer exists, skipping guarded operation`);
19175
+ return null;
18778
19176
  }
19177
+ return operation();
18779
19178
  }
18780
- function buildBranchContext(branch) {
18781
- const branchEntity = {
18782
- unique_id: branch.branch_unique_id,
18783
- name: branch.name,
18784
- path: branch.path,
18785
- gid: branch.unix_gid
18786
- };
18787
- return {
18788
- // Scoped entities (accessible as {{entity.property}})
18789
- branch: branchEntity,
18790
- // Legacy alias — preserved for existing env templates that reference
18791
- // {{worktree.*}} keys. Points at the same object so updates stay in sync.
18792
- worktree: branchEntity,
18793
- repo: {
18794
- slug: branch.repo_slug || ""
18795
- },
18796
- host: {
18797
- ip_address: branch.host_ip_address || ""
18798
- },
18799
- // User-defined custom context (accessible as {{custom.key}})
18800
- custom: branch.custom_context || {}
18801
- };
19179
+ function isForeignKeyConstraintError(error) {
19180
+ return error instanceof Error && (error.message.includes("FOREIGN KEY constraint failed") || error.message.includes("SQLITE_CONSTRAINT_FOREIGNKEY"));
18802
19181
  }
18803
19182
 
19183
+ // src/db/index.ts
19184
+ init_tenant_scope();
19185
+ init_user_utils();
19186
+ var compare = bcryptjs.compare;
19187
+ var hash = bcryptjs.hash;
19188
+
18804
19189
  // src/environment/render-snapshot.ts
19190
+ init_esm_shims();
18805
19191
  function deepMergeContext(base, overrides) {
18806
19192
  if (!overrides) return base;
18807
19193
  const out = { ...base };
@@ -18838,7 +19224,9 @@ function renderBranchSnapshot(repo, branch, variantName) {
18838
19224
  repo_slug: repo.slug,
18839
19225
  custom_context: branch.custom_context,
18840
19226
  unix_gid: branch.unix_gid,
18841
- host_ip_address: branch.host_ip_address
19227
+ host_ip_address: branch.host_ip_address,
19228
+ base_ref: branch.base_ref,
19229
+ ref_type: branch.ref_type
18842
19230
  });
18843
19231
  const { custom, ...nonCustomBase } = baseContext;
18844
19232
  const overridden = deepMergeContext(
@@ -19053,200 +19441,6 @@ async function validateDirectory(path3, context = "Directory") {
19053
19441
  // src/mcp/index.ts
19054
19442
  init_esm_shims();
19055
19443
 
19056
- // src/mcp/template-resolver.ts
19057
- init_esm_shims();
19058
- function buildMCPTemplateContextFromEnv(env) {
19059
- const userEnvKeysStr = env[AGOR_USER_ENV_KEYS_VAR];
19060
- const allowedKeys = userEnvKeysStr ? new Set(userEnvKeysStr.split(",")) : /* @__PURE__ */ new Set();
19061
- const userEnv = {};
19062
- for (const key of allowedKeys) {
19063
- const value = env[key];
19064
- if (value !== void 0) {
19065
- userEnv[key] = value;
19066
- }
19067
- }
19068
- return {
19069
- user: {
19070
- env: userEnv
19071
- }
19072
- };
19073
- }
19074
- function containsTemplate(value) {
19075
- return value.includes("{{") && value.includes("}}");
19076
- }
19077
- function resolveStringValue(fieldName, templateValue, context) {
19078
- if (!containsTemplate(templateValue)) {
19079
- return templateValue;
19080
- }
19081
- try {
19082
- const resolved = renderTemplate(templateValue, context);
19083
- if (!resolved || resolved.trim() === "") {
19084
- console.log(` \u2139\uFE0F MCP "${fieldName}" resolved to empty (user may need to set env var)`);
19085
- return void 0;
19086
- }
19087
- return resolved;
19088
- } catch (error) {
19089
- console.warn(
19090
- ` \u26A0\uFE0F Failed to resolve MCP template "${fieldName}":`,
19091
- error instanceof Error ? error.message : String(error)
19092
- );
19093
- return void 0;
19094
- }
19095
- }
19096
- function resolveMcpServerEnv(envTemplate, context) {
19097
- if (!envTemplate || Object.keys(envTemplate).length === 0) {
19098
- return void 0;
19099
- }
19100
- const result = {};
19101
- for (const [key, templateValue] of Object.entries(envTemplate)) {
19102
- const resolved = resolveStringValue(`env.${key}`, templateValue, context);
19103
- if (resolved !== void 0) {
19104
- result[key] = resolved;
19105
- }
19106
- }
19107
- return Object.keys(result).length > 0 ? result : void 0;
19108
- }
19109
- function resolveMcpServerTemplates(server, context) {
19110
- const resolved = { ...server };
19111
- const unresolvedFields = [];
19112
- const hadUrlTemplate = server.url && containsTemplate(server.url);
19113
- if (server.url) {
19114
- resolved.url = resolveStringValue("url", server.url, context);
19115
- if (hadUrlTemplate && !resolved.url) {
19116
- unresolvedFields.push("url");
19117
- }
19118
- }
19119
- if (server.env) {
19120
- const resolvedEnv = {};
19121
- for (const [key, templateValue] of Object.entries(server.env)) {
19122
- const hadTemplate = containsTemplate(templateValue);
19123
- const resolvedValue = resolveStringValue(`env.${key}`, templateValue, context);
19124
- if (resolvedValue !== void 0) {
19125
- resolvedEnv[key] = resolvedValue;
19126
- } else if (hadTemplate) {
19127
- unresolvedFields.push(`env.${key}`);
19128
- }
19129
- }
19130
- resolved.env = Object.keys(resolvedEnv).length > 0 ? resolvedEnv : void 0;
19131
- }
19132
- if (server.headers) {
19133
- const resolvedHeaders = {};
19134
- for (const [key, templateValue] of Object.entries(server.headers)) {
19135
- const hadTemplate = containsTemplate(templateValue);
19136
- const resolvedValue = resolveStringValue(`headers.${key}`, templateValue, context);
19137
- if (resolvedValue !== void 0) {
19138
- resolvedHeaders[key] = resolvedValue;
19139
- } else if (hadTemplate) {
19140
- unresolvedFields.push(`headers.${key}`);
19141
- }
19142
- }
19143
- resolved.headers = Object.keys(resolvedHeaders).length > 0 ? resolvedHeaders : void 0;
19144
- }
19145
- if (server.auth) {
19146
- const resolvedAuth = { ...server.auth };
19147
- if (server.auth.token) {
19148
- const hadTemplate = containsTemplate(server.auth.token);
19149
- resolvedAuth.token = resolveStringValue("auth.token", server.auth.token, context);
19150
- if (hadTemplate && !resolvedAuth.token) {
19151
- unresolvedFields.push("auth.token");
19152
- }
19153
- }
19154
- if (server.auth.api_url) {
19155
- const hadTemplate = containsTemplate(server.auth.api_url);
19156
- resolvedAuth.api_url = resolveStringValue("auth.api_url", server.auth.api_url, context);
19157
- if (hadTemplate && !resolvedAuth.api_url) {
19158
- unresolvedFields.push("auth.api_url");
19159
- }
19160
- }
19161
- if (server.auth.api_token) {
19162
- const hadTemplate = containsTemplate(server.auth.api_token);
19163
- resolvedAuth.api_token = resolveStringValue("auth.api_token", server.auth.api_token, context);
19164
- if (hadTemplate && !resolvedAuth.api_token) {
19165
- unresolvedFields.push("auth.api_token");
19166
- }
19167
- }
19168
- if (server.auth.api_secret) {
19169
- const hadTemplate = containsTemplate(server.auth.api_secret);
19170
- resolvedAuth.api_secret = resolveStringValue(
19171
- "auth.api_secret",
19172
- server.auth.api_secret,
19173
- context
19174
- );
19175
- if (hadTemplate && !resolvedAuth.api_secret) {
19176
- unresolvedFields.push("auth.api_secret");
19177
- }
19178
- }
19179
- if (server.auth.type === "oauth") {
19180
- if (server.auth.oauth_token_url) {
19181
- const _hadTemplate = containsTemplate(server.auth.oauth_token_url);
19182
- resolvedAuth.oauth_token_url = resolveStringValue(
19183
- "auth.oauth_token_url",
19184
- server.auth.oauth_token_url,
19185
- context
19186
- );
19187
- }
19188
- if (server.auth.oauth_client_id) {
19189
- const _hadTemplate = containsTemplate(server.auth.oauth_client_id);
19190
- resolvedAuth.oauth_client_id = resolveStringValue(
19191
- "auth.oauth_client_id",
19192
- server.auth.oauth_client_id,
19193
- context
19194
- );
19195
- }
19196
- if (server.auth.oauth_client_secret) {
19197
- const _hadTemplate = containsTemplate(server.auth.oauth_client_secret);
19198
- resolvedAuth.oauth_client_secret = resolveStringValue(
19199
- "auth.oauth_client_secret",
19200
- server.auth.oauth_client_secret,
19201
- context
19202
- );
19203
- }
19204
- if (server.auth.oauth_scope) {
19205
- const _hadTemplate = containsTemplate(server.auth.oauth_scope);
19206
- resolvedAuth.oauth_scope = resolveStringValue(
19207
- "auth.oauth_scope",
19208
- server.auth.oauth_scope,
19209
- context
19210
- );
19211
- }
19212
- resolvedAuth.oauth_grant_type = server.auth.oauth_grant_type || "client_credentials";
19213
- }
19214
- resolved.auth = resolvedAuth;
19215
- }
19216
- const isHttpTransport = server.transport === "http" || server.transport === "sse";
19217
- const urlRequired = isHttpTransport && hadUrlTemplate;
19218
- const urlMissing = urlRequired && !resolved.url;
19219
- const isValid2 = !urlMissing;
19220
- let errorMessage;
19221
- if (!isValid2) {
19222
- const missingVars = unresolvedFields.map((f) => {
19223
- let originalValue;
19224
- if (f === "url") {
19225
- originalValue = server.url;
19226
- } else if (f.startsWith("env.")) {
19227
- originalValue = server.env?.[f.slice(4)];
19228
- } else if (f.startsWith("headers.")) {
19229
- originalValue = server.headers?.[f.slice(8)];
19230
- } else if (f.startsWith("auth.") && server.auth) {
19231
- const authKey = f.slice(5);
19232
- const authValue = server.auth[authKey];
19233
- originalValue = typeof authValue === "string" ? authValue : void 0;
19234
- }
19235
- return originalValue || f;
19236
- }).join(", ");
19237
- errorMessage = `MCP server "${server.name}" has unresolved required templates: ${missingVars}. Set the corresponding environment variables in your user settings.`;
19238
- }
19239
- return {
19240
- server: resolved,
19241
- unresolvedFields,
19242
- isValid: isValid2,
19243
- errorMessage
19244
- };
19245
- }
19246
- function resolveMcpServersTemplates(servers, context) {
19247
- return servers.map((server) => resolveMcpServerTemplates(server, context));
19248
- }
19249
-
19250
19444
  // src/search/index.ts
19251
19445
  init_esm_shims();
19252
19446
 
@@ -22563,6 +22757,7 @@ export {
22563
22757
  SudoCliExecutor,
22564
22758
  SudoDirectExecutor,
22565
22759
  SymlinkCommands,
22760
+ TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS,
22566
22761
  TERMINAL_TASK_STATUSES,
22567
22762
  TOOL_API_KEY_NAMES,
22568
22763
  TaskRepository,
@@ -22624,6 +22819,7 @@ export {
22624
22819
  checkAsUser,
22625
22820
  checkMigrationStatus,
22626
22821
  compare,
22822
+ containsTemplate,
22627
22823
  count,
22628
22824
  createAdminExecutor,
22629
22825
  createClient,
@@ -22713,6 +22909,7 @@ export {
22713
22909
  getRepoReferenceOptions,
22714
22910
  getReposDir,
22715
22911
  getReposDirAsync,
22912
+ getRequiredSecretFields,
22716
22913
  getServiceTier,
22717
22914
  getSessionType,
22718
22915
  getUidFromUsername,
@@ -22765,6 +22962,7 @@ export {
22765
22962
  isThreadRoot,
22766
22963
  isUnixGroupRefreshNeeded,
22767
22964
  isUnixImpersonationEnabled,
22965
+ isUserEnvPlaceholder,
22768
22966
  isUserInGroup,
22769
22967
  isValid,
22770
22968
  isValidBranchGroupName,