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
@@ -768,6 +768,21 @@ var init_file = __esm({
768
768
  });
769
769
 
770
770
  // src/types/gateway.ts
771
+ function getRequiredSecretFields(channelType, config) {
772
+ switch (channelType) {
773
+ case "slack": {
774
+ const wantsInbound = config.connection_mode === "socket" || config.enable_channels === true || config.enable_groups === true || config.enable_mpim === true;
775
+ const outboundOnly = config.outbound_enabled === true && !wantsInbound;
776
+ return outboundOnly ? ["bot_token"] : ["bot_token", "app_token"];
777
+ }
778
+ case "github":
779
+ return ["private_key"];
780
+ case "teams":
781
+ return ["app_password"];
782
+ default:
783
+ return [];
784
+ }
785
+ }
771
786
  var GATEWAY_SENSITIVE_CONFIG_FIELDS, GATEWAY_REDACTED_SENTINEL;
772
787
  var init_gateway = __esm({
773
788
  "src/types/gateway.ts"() {
@@ -4879,7 +4894,7 @@ import {
4879
4894
  asc as asc3,
4880
4895
  count,
4881
4896
  desc as desc6,
4882
- eq as eq32,
4897
+ eq as eq33,
4883
4898
  gt,
4884
4899
  gte,
4885
4900
  inArray as inArray11,
@@ -8038,6 +8053,63 @@ var BranchRepository = class {
8038
8053
  }
8039
8054
  return Array.from(userIds);
8040
8055
  }
8056
+ /**
8057
+ * Find non-archived branches whose explicit filesystem access set can change
8058
+ * when membership in the given group changes.
8059
+ *
8060
+ * Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
8061
+ * both encode which group grants materialize into branch-folder access.
8062
+ * App-only grants (`fs_access = 'none'`) are intentionally excluded because
8063
+ * membership changes for those grants do not require branch-folder mutation.
8064
+ */
8065
+ async findExplicitFsAccessBranchIdsForGroup(groupId) {
8066
+ const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, eq11(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
8067
+ groups3,
8068
+ and11(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
8069
+ ).where(
8070
+ and11(
8071
+ eq11(branchGroupGrants3.group_id, groupId),
8072
+ eq11(branches3.archived, false),
8073
+ inArray4(
8074
+ sql9`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
8075
+ FS_ACCESS_BRANCH_PERMISSIONS
8076
+ )
8077
+ )
8078
+ ).all();
8079
+ const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
8080
+ groups3,
8081
+ and11(eq11(groups3.group_id, boardGroupGrants3.group_id), eq11(groups3.archived, false))
8082
+ ).innerJoin(
8083
+ boards3,
8084
+ and11(
8085
+ eq11(boards3.board_id, boardGroupGrants3.board_id),
8086
+ eq11(sql9`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
8087
+ )
8088
+ ).innerJoin(
8089
+ branches3,
8090
+ and11(
8091
+ eq11(branches3.board_id, boardGroupGrants3.board_id),
8092
+ eq11(branches3.permission_source, "board"),
8093
+ eq11(branches3.archived, false)
8094
+ )
8095
+ ).where(
8096
+ and11(
8097
+ eq11(boardGroupGrants3.group_id, groupId),
8098
+ inArray4(
8099
+ sql9`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
8100
+ FS_ACCESS_BRANCH_PERMISSIONS
8101
+ )
8102
+ )
8103
+ ).all();
8104
+ const branchIds = /* @__PURE__ */ new Set();
8105
+ for (const row of directRows) {
8106
+ branchIds.add(row.branch_id);
8107
+ }
8108
+ for (const row of boardRows) {
8109
+ branchIds.add(row.branch_id);
8110
+ }
8111
+ return Array.from(branchIds);
8112
+ }
8041
8113
  async findBoardAlignedBranches(boardId) {
8042
8114
  const rows = await select(this.db).from(branches3).where(
8043
8115
  and11(
@@ -9045,6 +9117,60 @@ var BoardRepository = class {
9045
9117
  );
9046
9118
  }
9047
9119
  }
9120
+ /**
9121
+ * Shallow-merge field patches into existing board objects in a single
9122
+ * read-modify-write.
9123
+ *
9124
+ * Unlike upsertBoardObject (which fully replaces the object value, dropping
9125
+ * omitted fields), this overwrites ONLY the provided keys and leaves the rest
9126
+ * of each object intact — so a narrow change (e.g. a zIndex reorder) has a
9127
+ * smaller blast radius and won't clobber a field edited via a different patch
9128
+ * call. Multiple objects in one call are merged before a single write, so a
9129
+ * forward/backward swap touches both neighbors in one update.
9130
+ *
9131
+ * Objects that no longer exist are SKIPPED, never re-created — so a swap can't
9132
+ * resurrect a neighbor deleted between the client's read and this write.
9133
+ *
9134
+ * Only an explicit allowlist of fields can be merged (currently just `zIndex`,
9135
+ * which is also clamped into the board-object band [1, 499] so it can never be
9136
+ * pushed onto the card (500) / comment (1000) layers). Any other key in a
9137
+ * patch is ignored, so this narrow action cannot reshape an object (e.g. flip
9138
+ * its `type`) the way a full upsert could.
9139
+ *
9140
+ * NOTE: this is NOT atomic against concurrent writers. Like every other board
9141
+ * writer, the findById → update sequence has a lost-update window: a write
9142
+ * that lands between the read and the update can be overwritten (last-write-
9143
+ * wins). Merging only the patched keys narrows that window's blast radius
9144
+ * versus a full-object upsert, but does not close it.
9145
+ */
9146
+ async mergeBoardObjectFields(boardId, patches) {
9147
+ const Z_MIN = 1;
9148
+ const Z_MAX = 499;
9149
+ try {
9150
+ const fullId = await this.resolveId(boardId);
9151
+ const current = await this.findById(fullId);
9152
+ if (!current) {
9153
+ throw new EntityNotFoundError("Board", boardId);
9154
+ }
9155
+ const updatedObjects = { ...current.objects || {} };
9156
+ for (const [objectId, fields] of Object.entries(patches)) {
9157
+ const existing = updatedObjects[objectId];
9158
+ if (!existing) continue;
9159
+ const { zIndex } = fields;
9160
+ if (typeof zIndex !== "number" || !Number.isFinite(zIndex)) continue;
9161
+ const safeZIndex = Math.min(Z_MAX, Math.max(Z_MIN, zIndex));
9162
+ updatedObjects[objectId] = { ...existing, zIndex: safeZIndex };
9163
+ }
9164
+ return this.update(fullId, { objects: updatedObjects });
9165
+ } catch (error) {
9166
+ if (error instanceof RepositoryError) throw error;
9167
+ if (error instanceof EntityNotFoundError) throw error;
9168
+ throw new RepositoryError(
9169
+ `Failed to merge board object fields: ${error instanceof Error ? error.message : String(error)}`,
9170
+ error
9171
+ );
9172
+ }
9173
+ }
9048
9174
  /**
9049
9175
  * DEPRECATED: Delete a zone and handle associated sessions
9050
9176
  * TODO: Reimplement using board-objects table
@@ -9779,6 +9905,28 @@ var GatewayChannelRepository = class {
9779
9905
  agentic_config: encryptedAgenticConfig
9780
9906
  };
9781
9907
  }
9908
+ /**
9909
+ * Enforce the "enabled requires secrets" invariant on every write path.
9910
+ *
9911
+ * An enabled channel can never exist without the secrets its type needs to
9912
+ * function. Runs on the post-merge, decrypted config so a patch that only
9913
+ * flips `enabled: true` on a channel with already-stored tokens passes.
9914
+ * Disabled ("draft") channels are exempt.
9915
+ */
9916
+ assertRequiredSecretsWhenEnabled(channel) {
9917
+ if (channel.enabled === false) return;
9918
+ const channelType = channel.channel_type ?? "slack";
9919
+ const config = channel.config ?? {};
9920
+ const missing = getRequiredSecretFields(channelType, config).filter((field) => {
9921
+ const value = config[field];
9922
+ return typeof value !== "string" || value.trim() === "" || value === GATEWAY_REDACTED_SENTINEL;
9923
+ });
9924
+ if (missing.length > 0) {
9925
+ throw new RepositoryError(
9926
+ `Cannot enable ${channelType} gateway channel: missing required secret(s) ${missing.join(", ")}`
9927
+ );
9928
+ }
9929
+ }
9782
9930
  /**
9783
9931
  * Resolve short ID to full ID
9784
9932
  */
@@ -9810,6 +9958,7 @@ var GatewayChannelRepository = class {
9810
9958
  id: data.id ?? generateId(),
9811
9959
  channel_key: data.channel_key ?? generateId()
9812
9960
  });
9961
+ this.assertRequiredSecretsWhenEnabled(data);
9813
9962
  await insert(this.db, gatewayChannels3).values(insertData).run();
9814
9963
  const row = await select(this.db).from(gatewayChannels3).where(eq15(gatewayChannels3.id, insertData.id)).one();
9815
9964
  if (!row) {
@@ -9876,6 +10025,7 @@ var GatewayChannelRepository = class {
9876
10025
  }
9877
10026
  merged.config = mergedConfig;
9878
10027
  }
10028
+ this.assertRequiredSecretsWhenEnabled(merged);
9879
10029
  const insertData = this.channelToInsert(merged);
9880
10030
  await update(this.db, gatewayChannels3).set({
9881
10031
  name: insertData.name,
@@ -11385,11 +11535,164 @@ var KnowledgeGraphRepository = class {
11385
11535
  // src/db/repositories/mcp-servers.ts
11386
11536
  init_esm_shims();
11387
11537
  init_ids();
11388
- import { and as and16, eq as eq18, like as like10 } from "drizzle-orm";
11538
+ import { and as and17, eq as eq20, like as like10 } from "drizzle-orm";
11389
11539
 
11390
11540
  // src/tools/mcp/auth-secrets.ts
11391
11541
  init_esm_shims();
11392
11542
 
11543
+ // src/mcp/template-resolver.ts
11544
+ init_esm_shims();
11545
+
11546
+ // src/config/env-resolver.ts
11547
+ init_esm_shims();
11548
+ init_database_wrapper();
11549
+ import { eq as eq19 } from "drizzle-orm";
11550
+
11551
+ // src/db/repositories/session-env-selections.ts
11552
+ init_esm_shims();
11553
+ init_database_wrapper();
11554
+ init_schema();
11555
+ import { and as and16, eq as eq18 } from "drizzle-orm";
11556
+ var SessionEnvSelectionRepository = class {
11557
+ constructor(db) {
11558
+ this.db = db;
11559
+ }
11560
+ /** Shared SELECT for a session's rows — single source of truth for reads. */
11561
+ async fetchRows(sessionId) {
11562
+ try {
11563
+ return await select(this.db).from(sessionEnvSelections3).where(eq18(sessionEnvSelections3.session_id, sessionId)).all();
11564
+ } catch (error) {
11565
+ throw new RepositoryError(
11566
+ `Failed to list session env selections: ${error instanceof Error ? error.message : String(error)}`,
11567
+ error
11568
+ );
11569
+ }
11570
+ }
11571
+ /** List selected env var names for a session (not hydrated). */
11572
+ async listNames(sessionId) {
11573
+ const rows = await this.fetchRows(sessionId);
11574
+ return rows.map((r) => r.env_var_name);
11575
+ }
11576
+ /** Return a Set for fast membership checks in the env resolver. */
11577
+ async asSet(sessionId) {
11578
+ const names = await this.listNames(sessionId);
11579
+ return new Set(names);
11580
+ }
11581
+ /** Full rows with timestamps — for the REST API response. */
11582
+ async list(sessionId) {
11583
+ const rows = await this.fetchRows(sessionId);
11584
+ return rows.map((r) => ({
11585
+ session_id: r.session_id,
11586
+ env_var_name: r.env_var_name,
11587
+ created_at: new Date(r.created_at)
11588
+ }));
11589
+ }
11590
+ /** Add a selection. No-op if it already exists. */
11591
+ async add(sessionId, envVarName) {
11592
+ try {
11593
+ const existing = await select(this.db).from(sessionEnvSelections3).where(
11594
+ and16(
11595
+ eq18(sessionEnvSelections3.session_id, sessionId),
11596
+ eq18(sessionEnvSelections3.env_var_name, envVarName)
11597
+ )
11598
+ ).one();
11599
+ if (existing) return;
11600
+ await insert(this.db, sessionEnvSelections3).values({
11601
+ session_id: sessionId,
11602
+ env_var_name: envVarName,
11603
+ created_at: /* @__PURE__ */ new Date()
11604
+ }).run();
11605
+ } catch (error) {
11606
+ throw new RepositoryError(
11607
+ `Failed to add session env selection: ${error instanceof Error ? error.message : String(error)}`,
11608
+ error
11609
+ );
11610
+ }
11611
+ }
11612
+ /** Remove a selection. No-op if it doesn't exist. */
11613
+ async remove(sessionId, envVarName) {
11614
+ try {
11615
+ await deleteFrom(this.db, sessionEnvSelections3).where(
11616
+ and16(
11617
+ eq18(sessionEnvSelections3.session_id, sessionId),
11618
+ eq18(sessionEnvSelections3.env_var_name, envVarName)
11619
+ )
11620
+ ).run();
11621
+ } catch (error) {
11622
+ throw new RepositoryError(
11623
+ `Failed to remove session env selection: ${error instanceof Error ? error.message : String(error)}`,
11624
+ error
11625
+ );
11626
+ }
11627
+ }
11628
+ /** Bulk replace — deletes all existing rows, inserts the new set. */
11629
+ async setAll(sessionId, envVarNames) {
11630
+ try {
11631
+ await deleteFrom(this.db, sessionEnvSelections3).where(eq18(sessionEnvSelections3.session_id, sessionId)).run();
11632
+ if (envVarNames.length === 0) return;
11633
+ const now = /* @__PURE__ */ new Date();
11634
+ await insert(this.db, sessionEnvSelections3).values(
11635
+ envVarNames.map((name) => ({
11636
+ session_id: sessionId,
11637
+ env_var_name: name,
11638
+ created_at: now
11639
+ }))
11640
+ ).run();
11641
+ } catch (error) {
11642
+ throw new RepositoryError(
11643
+ `Failed to set session env selections: ${error instanceof Error ? error.message : String(error)}`,
11644
+ error
11645
+ );
11646
+ }
11647
+ }
11648
+ };
11649
+
11650
+ // src/config/env-resolver.ts
11651
+ init_schema();
11652
+
11653
+ // src/config/env-blocklist.ts
11654
+ init_esm_shims();
11655
+ var BLOCKED_ENV_PATTERNS = Object.freeze([
11656
+ /^LD_/i,
11657
+ /^DYLD_/i,
11658
+ /^PYTHON(?!_AGOR_)/i
11659
+ ]);
11660
+
11661
+ // src/config/env-vars.ts
11662
+ init_esm_shims();
11663
+ var V05_SCOPES = ["global", "session"];
11664
+ var V05_SCOPE_SET = new Set(V05_SCOPES);
11665
+ function normalizeStoredEnvVar(raw) {
11666
+ if (typeof raw === "string") {
11667
+ return { value_encrypted: raw, scope: "global" };
11668
+ }
11669
+ return {
11670
+ value_encrypted: raw.value_encrypted,
11671
+ scope: raw.scope,
11672
+ resource_id: raw.resource_id ?? null,
11673
+ extra_config: raw.extra_config ?? null
11674
+ };
11675
+ }
11676
+ function normalizeStoredEnvMap(raw) {
11677
+ const out = {};
11678
+ if (!raw) return out;
11679
+ for (const [key, value] of Object.entries(raw)) {
11680
+ try {
11681
+ out[key] = normalizeStoredEnvVar(value);
11682
+ } catch (err) {
11683
+ console.warn(`[env-vars] Skipping malformed env var entry ${key}:`, err);
11684
+ }
11685
+ }
11686
+ return out;
11687
+ }
11688
+
11689
+ // src/templates/handlebars-helpers.ts
11690
+ init_esm_shims();
11691
+ import Handlebars from "handlebars";
11692
+
11693
+ // src/mcp/template-patterns.ts
11694
+ init_esm_shims();
11695
+
11393
11696
  // src/tools/mcp/http-headers.ts
11394
11697
  init_esm_shims();
11395
11698
  var MCP_HEADER_REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
@@ -11551,7 +11854,7 @@ var MCPServerRepository = class {
11551
11854
  try {
11552
11855
  const insertData = this.mcpServerToInsert(data);
11553
11856
  await insert(this.db, mcpServers3).values(insertData).run();
11554
- const row = await select(this.db).from(mcpServers3).where(eq18(mcpServers3.mcp_server_id, insertData.mcp_server_id)).one();
11857
+ const row = await select(this.db).from(mcpServers3).where(eq20(mcpServers3.mcp_server_id, insertData.mcp_server_id)).one();
11555
11858
  if (!row) {
11556
11859
  throw new RepositoryError("Failed to retrieve created MCP server");
11557
11860
  }
@@ -11570,7 +11873,7 @@ var MCPServerRepository = class {
11570
11873
  async findById(id) {
11571
11874
  try {
11572
11875
  const fullId = await this.resolveId(id);
11573
- const row = await select(this.db).from(mcpServers3).where(eq18(mcpServers3.mcp_server_id, fullId)).one();
11876
+ const row = await select(this.db).from(mcpServers3).where(eq20(mcpServers3.mcp_server_id, fullId)).one();
11574
11877
  return row ? this.rowToMCPServer(row) : null;
11575
11878
  } catch (error) {
11576
11879
  if (error instanceof EntityNotFoundError) return null;
@@ -11589,24 +11892,24 @@ var MCPServerRepository = class {
11589
11892
  let query = select(this.db).from(mcpServers3);
11590
11893
  const conditions = [];
11591
11894
  if (filters?.scope) {
11592
- conditions.push(eq18(mcpServers3.scope, filters.scope));
11895
+ conditions.push(eq20(mcpServers3.scope, filters.scope));
11593
11896
  }
11594
11897
  if (filters?.scopeId) {
11595
11898
  if (filters.scope === "global") {
11596
- conditions.push(eq18(mcpServers3.owner_user_id, filters.scopeId));
11899
+ conditions.push(eq20(mcpServers3.owner_user_id, filters.scopeId));
11597
11900
  }
11598
11901
  }
11599
11902
  if (filters?.transport) {
11600
- conditions.push(eq18(mcpServers3.transport, filters.transport));
11903
+ conditions.push(eq20(mcpServers3.transport, filters.transport));
11601
11904
  }
11602
11905
  if (filters?.enabled !== void 0) {
11603
- conditions.push(eq18(mcpServers3.enabled, filters.enabled));
11906
+ conditions.push(eq20(mcpServers3.enabled, filters.enabled));
11604
11907
  }
11605
11908
  if (filters?.source) {
11606
- conditions.push(eq18(mcpServers3.source, filters.source));
11909
+ conditions.push(eq20(mcpServers3.source, filters.source));
11607
11910
  }
11608
11911
  if (conditions.length > 0) {
11609
- query = query.where(and16(...conditions));
11912
+ query = query.where(and17(...conditions));
11610
11913
  }
11611
11914
  const rows = await query.all();
11612
11915
  return rows.map((row) => this.rowToMCPServer(row));
@@ -11653,7 +11956,7 @@ var MCPServerRepository = class {
11653
11956
  transport: insertData.transport,
11654
11957
  updated_at: /* @__PURE__ */ new Date(),
11655
11958
  data: insertData.data
11656
- }).where(eq18(mcpServers3.mcp_server_id, fullId)).run();
11959
+ }).where(eq20(mcpServers3.mcp_server_id, fullId)).run();
11657
11960
  const updated = await this.findById(fullId);
11658
11961
  if (!updated) {
11659
11962
  throw new RepositoryError("Failed to retrieve updated MCP server");
@@ -11674,7 +11977,7 @@ var MCPServerRepository = class {
11674
11977
  async delete(id) {
11675
11978
  try {
11676
11979
  const fullId = await this.resolveId(id);
11677
- const result = await deleteFrom(this.db, mcpServers3).where(eq18(mcpServers3.mcp_server_id, fullId)).run();
11980
+ const result = await deleteFrom(this.db, mcpServers3).where(eq20(mcpServers3.mcp_server_id, fullId)).run();
11678
11981
  if (result.rowsAffected === 0) {
11679
11982
  throw new EntityNotFoundError("MCPServer", id);
11680
11983
  }
@@ -11706,7 +12009,7 @@ var MCPServerRepository = class {
11706
12009
  init_esm_shims();
11707
12010
  init_database_wrapper();
11708
12011
  init_schema();
11709
- import { and as and17, eq as eq19, inArray as inArray7 } from "drizzle-orm";
12012
+ import { and as and18, eq as eq21, inArray as inArray7 } from "drizzle-orm";
11710
12013
  var MessagesRepository = class {
11711
12014
  constructor(db) {
11712
12015
  this.db = db;
@@ -11772,7 +12075,7 @@ var MessagesRepository = class {
11772
12075
  * Get message by ID
11773
12076
  */
11774
12077
  async findById(messageId) {
11775
- const row = await select(this.db).from(messages3).where(eq19(messages3.message_id, messageId)).one();
12078
+ const row = await select(this.db).from(messages3).where(eq21(messages3.message_id, messageId)).one();
11776
12079
  return row ? this.rowToMessage(row) : null;
11777
12080
  }
11778
12081
  /**
@@ -11781,19 +12084,19 @@ var MessagesRepository = class {
11781
12084
  async findAll(filter) {
11782
12085
  if (filter?.sessionIds !== void 0 && filter.sessionIds.length === 0) return [];
11783
12086
  const conditions = [];
11784
- if (filter?.sessionId) conditions.push(eq19(messages3.session_id, filter.sessionId));
12087
+ if (filter?.sessionId) conditions.push(eq21(messages3.session_id, filter.sessionId));
11785
12088
  if (filter?.sessionIds !== void 0)
11786
12089
  conditions.push(inArray7(messages3.session_id, filter.sessionIds));
11787
- if (filter?.taskId) conditions.push(eq19(messages3.task_id, filter.taskId));
11788
- if (filter?.type) conditions.push(eq19(messages3.type, filter.type));
11789
- if (filter?.role) conditions.push(eq19(messages3.role, filter.role));
12090
+ if (filter?.taskId) conditions.push(eq21(messages3.task_id, filter.taskId));
12091
+ if (filter?.type) conditions.push(eq21(messages3.type, filter.type));
12092
+ if (filter?.role) conditions.push(eq21(messages3.role, filter.role));
11790
12093
  if (filter?.visibleToUserId) {
11791
12094
  conditions.push(
11792
12095
  visibleSessionReferenceAccessExists(this.db, filter.visibleToUserId, messages3.session_id)
11793
12096
  );
11794
12097
  }
11795
12098
  let query = select(this.db).from(messages3);
11796
- if (conditions.length > 0) query = query.where(and17(...conditions));
12099
+ if (conditions.length > 0) query = query.where(and18(...conditions));
11797
12100
  const rows = await query.orderBy(messages3.index).all();
11798
12101
  return rows.map((r) => this.rowToMessage(r));
11799
12102
  }
@@ -11801,21 +12104,21 @@ var MessagesRepository = class {
11801
12104
  * Get all messages for a session (ordered by index)
11802
12105
  */
11803
12106
  async findBySessionId(sessionId) {
11804
- const rows = await select(this.db).from(messages3).where(eq19(messages3.session_id, sessionId)).orderBy(messages3.index).all();
12107
+ const rows = await select(this.db).from(messages3).where(eq21(messages3.session_id, sessionId)).orderBy(messages3.index).all();
11805
12108
  return rows.map((r) => this.rowToMessage(r));
11806
12109
  }
11807
12110
  /**
11808
12111
  * Get all messages for a session filtered by type (ordered by index)
11809
12112
  */
11810
12113
  async findBySessionIdAndType(sessionId, type) {
11811
- const rows = await select(this.db).from(messages3).where(and17(eq19(messages3.session_id, sessionId), eq19(messages3.type, type))).orderBy(messages3.index).all();
12114
+ const rows = await select(this.db).from(messages3).where(and18(eq21(messages3.session_id, sessionId), eq21(messages3.type, type))).orderBy(messages3.index).all();
11812
12115
  return rows.map((r) => this.rowToMessage(r));
11813
12116
  }
11814
12117
  /**
11815
12118
  * Get all messages for a task (ordered by index)
11816
12119
  */
11817
12120
  async findByTaskId(taskId) {
11818
- const rows = await select(this.db).from(messages3).where(eq19(messages3.task_id, taskId)).orderBy(messages3.index).all();
12121
+ const rows = await select(this.db).from(messages3).where(eq21(messages3.task_id, taskId)).orderBy(messages3.index).all();
11819
12122
  return rows.map((r) => this.rowToMessage(r));
11820
12123
  }
11821
12124
  /**
@@ -11823,7 +12126,7 @@ var MessagesRepository = class {
11823
12126
  * Used for task message_range queries
11824
12127
  */
11825
12128
  async findByRange(sessionId, startIndex, endIndex) {
11826
- const rows = await select(this.db).from(messages3).where(eq19(messages3.session_id, sessionId)).orderBy(messages3.index).all();
12129
+ const rows = await select(this.db).from(messages3).where(eq21(messages3.session_id, sessionId)).orderBy(messages3.index).all();
11827
12130
  return rows.filter((r) => r.index >= startIndex && r.index <= endIndex).map((r) => this.rowToMessage(r));
11828
12131
  }
11829
12132
  /**
@@ -11836,33 +12139,33 @@ var MessagesRepository = class {
11836
12139
  }
11837
12140
  const updated = { ...existing, ...updates };
11838
12141
  const row = this.messageToRow(updated);
11839
- const result = await update(this.db, messages3).set(row).where(eq19(messages3.message_id, messageId)).returning().one();
12142
+ const result = await update(this.db, messages3).set(row).where(eq21(messages3.message_id, messageId)).returning().one();
11840
12143
  return this.rowToMessage(result);
11841
12144
  }
11842
12145
  /**
11843
12146
  * Update message task assignment
11844
12147
  */
11845
12148
  async assignToTask(messageId, taskId) {
11846
- const updated = await update(this.db, messages3).set({ task_id: taskId }).where(eq19(messages3.message_id, messageId)).returning().one();
12149
+ const updated = await update(this.db, messages3).set({ task_id: taskId }).where(eq21(messages3.message_id, messageId)).returning().one();
11847
12150
  return this.rowToMessage(updated);
11848
12151
  }
11849
12152
  /**
11850
12153
  * Delete all messages for a session (cascades automatically via FK)
11851
12154
  */
11852
12155
  async deleteBySessionId(sessionId) {
11853
- await deleteFrom(this.db, messages3).where(eq19(messages3.session_id, sessionId)).run();
12156
+ await deleteFrom(this.db, messages3).where(eq21(messages3.session_id, sessionId)).run();
11854
12157
  }
11855
12158
  /**
11856
12159
  * Delete a single message
11857
12160
  */
11858
12161
  async delete(messageId) {
11859
- await deleteFrom(this.db, messages3).where(eq19(messages3.message_id, messageId)).run();
12162
+ await deleteFrom(this.db, messages3).where(eq21(messages3.message_id, messageId)).run();
11860
12163
  }
11861
12164
  };
11862
12165
 
11863
12166
  // src/db/repositories/repos.ts
11864
12167
  init_esm_shims();
11865
- import { eq as eq20, like as like11, sql as sql11 } from "drizzle-orm";
12168
+ import { eq as eq22, like as like11, sql as sql11 } from "drizzle-orm";
11866
12169
 
11867
12170
  // src/config/variant-resolver.ts
11868
12171
  init_esm_shims();
@@ -12023,7 +12326,7 @@ var RepoRepository = class {
12023
12326
  try {
12024
12327
  const insertData = this.repoToInsert(data);
12025
12328
  await insert(this.db, repos3).values(insertData).run();
12026
- const row = await select(this.db).from(repos3).where(eq20(repos3.repo_id, insertData.repo_id)).one();
12329
+ const row = await select(this.db).from(repos3).where(eq22(repos3.repo_id, insertData.repo_id)).one();
12027
12330
  if (!row) {
12028
12331
  throw new RepositoryError("Failed to retrieve created repo");
12029
12332
  }
@@ -12042,7 +12345,7 @@ var RepoRepository = class {
12042
12345
  async findById(id) {
12043
12346
  try {
12044
12347
  const fullId = await this.resolveId(id);
12045
- const row = await select(this.db).from(repos3).where(eq20(repos3.repo_id, fullId)).one();
12348
+ const row = await select(this.db).from(repos3).where(eq22(repos3.repo_id, fullId)).one();
12046
12349
  return row ? this.rowToRepo(row) : null;
12047
12350
  } catch (error) {
12048
12351
  if (error instanceof EntityNotFoundError) return null;
@@ -12058,7 +12361,7 @@ var RepoRepository = class {
12058
12361
  */
12059
12362
  async findBySlug(slug) {
12060
12363
  try {
12061
- const row = await select(this.db).from(repos3).where(eq20(repos3.slug, slug)).one();
12364
+ const row = await select(this.db).from(repos3).where(eq22(repos3.slug, slug)).one();
12062
12365
  return row ? this.rowToRepo(row) : null;
12063
12366
  } catch (error) {
12064
12367
  throw new RepositoryError(
@@ -12126,8 +12429,8 @@ var RepoRepository = class {
12126
12429
  let changed = 0;
12127
12430
  for (const finding of scan.findings) {
12128
12431
  await this.db.transaction(async (tx) => {
12129
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq20(repos3.repo_id, finding.repo_id));
12130
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq20(repos3.repo_id, finding.repo_id)).one();
12432
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq22(repos3.repo_id, finding.repo_id));
12433
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq22(repos3.repo_id, finding.repo_id)).one();
12131
12434
  if (!currentRow) return;
12132
12435
  const data = currentRow.data;
12133
12436
  if (typeof data.remote_url !== "string" || !httpUrlHasUserinfo(data.remote_url)) {
@@ -12139,7 +12442,7 @@ var RepoRepository = class {
12139
12442
  ...data,
12140
12443
  remote_url: stripHttpUrlUserinfo(data.remote_url)
12141
12444
  }
12142
- }).where(eq20(repos3.repo_id, finding.repo_id)).run();
12445
+ }).where(eq22(repos3.repo_id, finding.repo_id)).run();
12143
12446
  changed += 1;
12144
12447
  });
12145
12448
  }
@@ -12161,8 +12464,8 @@ var RepoRepository = class {
12161
12464
  try {
12162
12465
  const fullId = await this.resolveId(id);
12163
12466
  return await this.db.transaction(async (tx) => {
12164
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq20(repos3.repo_id, fullId));
12165
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq20(repos3.repo_id, fullId)).one();
12467
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq22(repos3.repo_id, fullId));
12468
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq22(repos3.repo_id, fullId)).one();
12166
12469
  if (!currentRow) {
12167
12470
  throw new EntityNotFoundError("Repo", id);
12168
12471
  }
@@ -12176,7 +12479,7 @@ var RepoRepository = class {
12176
12479
  repo_type: insertData.repo_type,
12177
12480
  unix_group: merged.unix_group ?? null,
12178
12481
  data: insertData.data
12179
- }).where(eq20(repos3.repo_id, fullId)).run();
12482
+ }).where(eq22(repos3.repo_id, fullId)).run();
12180
12483
  merged.clone_error = insertData.data.clone_error;
12181
12484
  merged.remote_url = insertData.data.remote_url;
12182
12485
  merged.last_updated = newUpdatedAt.toISOString();
@@ -12210,8 +12513,8 @@ var RepoRepository = class {
12210
12513
  try {
12211
12514
  const fullId = await this.resolveId(id);
12212
12515
  return await this.db.transaction(async (tx) => {
12213
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq20(repos3.repo_id, fullId));
12214
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq20(repos3.repo_id, fullId)).one();
12516
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq22(repos3.repo_id, fullId));
12517
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq22(repos3.repo_id, fullId)).one();
12215
12518
  if (!currentRow) {
12216
12519
  throw new EntityNotFoundError("Repo", id);
12217
12520
  }
@@ -12225,7 +12528,7 @@ var RepoRepository = class {
12225
12528
  repo_type: insertData.repo_type,
12226
12529
  unix_group: next.unix_group ?? null,
12227
12530
  data: insertData.data
12228
- }).where(eq20(repos3.repo_id, fullId)).run();
12531
+ }).where(eq22(repos3.repo_id, fullId)).run();
12229
12532
  next.environment = insertData.data.environment;
12230
12533
  next.environment_config = insertData.data.environment_config;
12231
12534
  next.remote_url = insertData.data.remote_url;
@@ -12265,7 +12568,7 @@ var RepoRepository = class {
12265
12568
  async delete(id) {
12266
12569
  try {
12267
12570
  const fullId = await this.resolveId(id);
12268
- const result = await deleteFrom(this.db, repos3).where(eq20(repos3.repo_id, fullId)).run();
12571
+ const result = await deleteFrom(this.db, repos3).where(eq22(repos3.repo_id, fullId)).run();
12269
12572
  if (result.rowsAffected === 0) {
12270
12573
  throw new EntityNotFoundError("Repo", id);
12271
12574
  }
@@ -12312,7 +12615,7 @@ init_esm_shims();
12312
12615
  init_ids();
12313
12616
  init_database_wrapper();
12314
12617
  init_schema();
12315
- import { and as and18, asc as asc2, desc as desc3, eq as eq21, isNull as isNull6, like as like12, lte, or as or7, sql as sql12 } from "drizzle-orm";
12618
+ import { and as and19, asc as asc2, desc as desc3, eq as eq23, isNull as isNull6, like as like12, lte, or as or7, sql as sql12 } from "drizzle-orm";
12316
12619
  var ScheduleRepository = class {
12317
12620
  constructor(db) {
12318
12621
  this.db = db;
@@ -12411,7 +12714,7 @@ var ScheduleRepository = class {
12411
12714
  async findById(id) {
12412
12715
  try {
12413
12716
  const fullId = await this.resolveId(id);
12414
- const row = await select(this.db).from(schedules3).where(eq21(schedules3.schedule_id, fullId)).one();
12717
+ const row = await select(this.db).from(schedules3).where(eq23(schedules3.schedule_id, fullId)).one();
12415
12718
  if (!row) return null;
12416
12719
  return this.rowToSchedule(row);
12417
12720
  } catch (error) {
@@ -12428,18 +12731,18 @@ var ScheduleRepository = class {
12428
12731
  */
12429
12732
  async findAll(filter) {
12430
12733
  const conditions = [];
12431
- if (filter?.branch_id) conditions.push(eq21(schedules3.branch_id, filter.branch_id));
12432
- if (filter?.enabled !== void 0) conditions.push(eq21(schedules3.enabled, filter.enabled));
12433
- if (filter?.created_by) conditions.push(eq21(schedules3.created_by, filter.created_by));
12734
+ if (filter?.branch_id) conditions.push(eq23(schedules3.branch_id, filter.branch_id));
12735
+ if (filter?.enabled !== void 0) conditions.push(eq23(schedules3.enabled, filter.enabled));
12736
+ if (filter?.created_by) conditions.push(eq23(schedules3.created_by, filter.created_by));
12434
12737
  const query = select(this.db).from(schedules3);
12435
- const rows = conditions.length > 0 ? await query.where(and18(...conditions)).all() : await query.all();
12738
+ const rows = conditions.length > 0 ? await query.where(and19(...conditions)).all() : await query.all();
12436
12739
  return rows.map((row) => this.rowToSchedule(row));
12437
12740
  }
12438
12741
  /**
12439
12742
  * All schedules on a branch (newest first by created_at).
12440
12743
  */
12441
12744
  async findByBranchId(branchId) {
12442
- const rows = await select(this.db).from(schedules3).where(eq21(schedules3.branch_id, branchId)).orderBy(desc3(schedules3.created_at)).all();
12745
+ const rows = await select(this.db).from(schedules3).where(eq23(schedules3.branch_id, branchId)).orderBy(desc3(schedules3.created_at)).all();
12443
12746
  return rows.map((row) => this.rowToSchedule(row));
12444
12747
  }
12445
12748
  /**
@@ -12455,8 +12758,8 @@ var ScheduleRepository = class {
12455
12758
  * Uses the `schedules_enabled_next_run_idx` covering index.
12456
12759
  */
12457
12760
  dueCondition(now) {
12458
- return and18(
12459
- eq21(schedules3.enabled, true),
12761
+ return and19(
12762
+ eq23(schedules3.enabled, true),
12460
12763
  or7(isNull6(schedules3.next_run_at), lte(schedules3.next_run_at, now))
12461
12764
  );
12462
12765
  }
@@ -12490,13 +12793,13 @@ var ScheduleRepository = class {
12490
12793
  */
12491
12794
  async findAccessibleSchedules(userId, filter) {
12492
12795
  const conditions = [visibleBranchAccessCondition(this.db, userId)];
12493
- if (filter?.branch_id) conditions.push(eq21(schedules3.branch_id, filter.branch_id));
12494
- if (filter?.enabled !== void 0) conditions.push(eq21(schedules3.enabled, filter.enabled));
12495
- if (filter?.created_by) conditions.push(eq21(schedules3.created_by, filter.created_by));
12496
- const results = await select(this.db).from(schedules3).innerJoin(branches3, eq21(schedules3.branch_id, branches3.branch_id)).leftJoin(
12796
+ if (filter?.branch_id) conditions.push(eq23(schedules3.branch_id, filter.branch_id));
12797
+ if (filter?.enabled !== void 0) conditions.push(eq23(schedules3.enabled, filter.enabled));
12798
+ if (filter?.created_by) conditions.push(eq23(schedules3.created_by, filter.created_by));
12799
+ const results = await select(this.db).from(schedules3).innerJoin(branches3, eq23(schedules3.branch_id, branches3.branch_id)).leftJoin(
12497
12800
  branchOwners3,
12498
- and18(eq21(branchOwners3.branch_id, branches3.branch_id), eq21(branchOwners3.user_id, userId))
12499
- ).where(and18(...conditions)).all();
12801
+ and19(eq23(branchOwners3.branch_id, branches3.branch_id), eq23(branchOwners3.user_id, userId))
12802
+ ).where(and19(...conditions)).all();
12500
12803
  const seen = /* @__PURE__ */ new Set();
12501
12804
  const out = [];
12502
12805
  for (const r of results) {
@@ -12517,8 +12820,8 @@ var ScheduleRepository = class {
12517
12820
  async update(id, updates) {
12518
12821
  const fullId = await this.resolveId(id);
12519
12822
  return await this.db.transaction(async (tx) => {
12520
- await lockRowForUpdate(txAsDb(tx), this.db, schedules3, eq21(schedules3.schedule_id, fullId));
12521
- const currentRow = await select(txAsDb(tx)).from(schedules3).where(eq21(schedules3.schedule_id, fullId)).one();
12823
+ await lockRowForUpdate(txAsDb(tx), this.db, schedules3, eq23(schedules3.schedule_id, fullId));
12824
+ const currentRow = await select(txAsDb(tx)).from(schedules3).where(eq23(schedules3.schedule_id, fullId)).one();
12522
12825
  if (!currentRow) throw new EntityNotFoundError("Schedule", id);
12523
12826
  const current = this.rowToSchedule(currentRow);
12524
12827
  const merged = deepMerge(current, {
@@ -12532,13 +12835,13 @@ var ScheduleRepository = class {
12532
12835
  });
12533
12836
  const insertData = this.scheduleToInsert(merged);
12534
12837
  insertData.updated_at = /* @__PURE__ */ new Date();
12535
- const row = await update(txAsDb(tx), schedules3).set(insertData).where(eq21(schedules3.schedule_id, fullId)).returning().one();
12838
+ const row = await update(txAsDb(tx), schedules3).set(insertData).where(eq23(schedules3.schedule_id, fullId)).returning().one();
12536
12839
  return this.rowToSchedule(row);
12537
12840
  });
12538
12841
  }
12539
12842
  async delete(id) {
12540
12843
  const fullId = await this.resolveId(id);
12541
- const result = await deleteFrom(this.db, schedules3).where(eq21(schedules3.schedule_id, fullId)).run();
12844
+ const result = await deleteFrom(this.db, schedules3).where(eq23(schedules3.schedule_id, fullId)).run();
12542
12845
  if (result.rowsAffected === 0) throw new EntityNotFoundError("Schedule", id);
12543
12846
  }
12544
12847
  /**
@@ -12546,10 +12849,10 @@ var ScheduleRepository = class {
12546
12849
  */
12547
12850
  async count(filter) {
12548
12851
  const conditions = [];
12549
- if (filter?.branch_id) conditions.push(eq21(schedules3.branch_id, filter.branch_id));
12550
- if (filter?.enabled !== void 0) conditions.push(eq21(schedules3.enabled, filter.enabled));
12852
+ if (filter?.branch_id) conditions.push(eq23(schedules3.branch_id, filter.branch_id));
12853
+ if (filter?.enabled !== void 0) conditions.push(eq23(schedules3.enabled, filter.enabled));
12551
12854
  const query = select(this.db, { count: sql12`count(*)` }).from(schedules3);
12552
- const row = conditions.length > 0 ? await query.where(and18(...conditions)).one() : await query.one();
12855
+ const row = conditions.length > 0 ? await query.where(and19(...conditions)).one() : await query.one();
12553
12856
  return Number(row?.count ?? 0);
12554
12857
  }
12555
12858
  };
@@ -12559,7 +12862,7 @@ init_esm_shims();
12559
12862
  init_ids();
12560
12863
  init_database_wrapper();
12561
12864
  init_schema();
12562
- import { and as and19, desc as desc4, eq as eq22, lt } from "drizzle-orm";
12865
+ import { and as and20, desc as desc4, eq as eq24, lt } from "drizzle-orm";
12563
12866
  function rowToSerializedSession(row) {
12564
12867
  return {
12565
12868
  id: row.id,
@@ -12583,7 +12886,7 @@ var SerializedSessionRepository = class {
12583
12886
  async findLatestDone(sessionId) {
12584
12887
  try {
12585
12888
  const row = await select(this.db).from(serializedSessions3).where(
12586
- and19(eq22(serializedSessions3.session_id, sessionId), eq22(serializedSessions3.status, "done"))
12889
+ and20(eq24(serializedSessions3.session_id, sessionId), eq24(serializedSessions3.status, "done"))
12587
12890
  ).orderBy(desc4(serializedSessions3.turn_index), desc4(serializedSessions3.created_at)).limit(1).one();
12588
12891
  return row ? rowToSerializedSession(row) : null;
12589
12892
  } catch (error) {
@@ -12598,7 +12901,7 @@ var SerializedSessionRepository = class {
12598
12901
  */
12599
12902
  async findLatest(sessionId) {
12600
12903
  try {
12601
- const row = await select(this.db).from(serializedSessions3).where(eq22(serializedSessions3.session_id, sessionId)).orderBy(desc4(serializedSessions3.turn_index), desc4(serializedSessions3.created_at)).limit(1).one();
12904
+ const row = await select(this.db).from(serializedSessions3).where(eq24(serializedSessions3.session_id, sessionId)).orderBy(desc4(serializedSessions3.turn_index), desc4(serializedSessions3.created_at)).limit(1).one();
12602
12905
  return row ? rowToSerializedSession(row) : null;
12603
12906
  } catch (error) {
12604
12907
  throw new RepositoryError(
@@ -12649,7 +12952,7 @@ var SerializedSessionRepository = class {
12649
12952
  */
12650
12953
  async markDone(id, payload) {
12651
12954
  try {
12652
- await update(this.db, serializedSessions3).set({ status: "done", payload }).where(eq22(serializedSessions3.id, id)).run();
12955
+ await update(this.db, serializedSessions3).set({ status: "done", payload }).where(eq24(serializedSessions3.id, id)).run();
12653
12956
  } catch (error) {
12654
12957
  throw new RepositoryError(
12655
12958
  `Failed to mark serialized session as done: ${error instanceof Error ? error.message : String(error)}`,
@@ -12662,7 +12965,7 @@ var SerializedSessionRepository = class {
12662
12965
  */
12663
12966
  async deleteById(id) {
12664
12967
  try {
12665
- await deleteFrom(this.db, serializedSessions3).where(eq22(serializedSessions3.id, id)).run();
12968
+ await deleteFrom(this.db, serializedSessions3).where(eq24(serializedSessions3.id, id)).run();
12666
12969
  } catch (error) {
12667
12970
  throw new RepositoryError(
12668
12971
  `Failed to delete serialized session: ${error instanceof Error ? error.message : String(error)}`,
@@ -12677,8 +12980,8 @@ var SerializedSessionRepository = class {
12677
12980
  async deletePreviousTurns(sessionId, beforeTurnIndex) {
12678
12981
  try {
12679
12982
  await deleteFrom(this.db, serializedSessions3).where(
12680
- and19(
12681
- eq22(serializedSessions3.session_id, sessionId),
12983
+ and20(
12984
+ eq24(serializedSessions3.session_id, sessionId),
12682
12985
  lt(serializedSessions3.turn_index, beforeTurnIndex)
12683
12986
  )
12684
12987
  ).run();
@@ -12691,117 +12994,18 @@ var SerializedSessionRepository = class {
12691
12994
  }
12692
12995
  };
12693
12996
 
12694
- // src/db/repositories/session-env-selections.ts
12695
- init_esm_shims();
12696
- init_database_wrapper();
12697
- init_schema();
12698
- import { and as and20, eq as eq23 } from "drizzle-orm";
12699
- var SessionEnvSelectionRepository = class {
12700
- constructor(db) {
12701
- this.db = db;
12702
- }
12703
- /** Shared SELECT for a session's rows — single source of truth for reads. */
12704
- async fetchRows(sessionId) {
12705
- try {
12706
- return await select(this.db).from(sessionEnvSelections3).where(eq23(sessionEnvSelections3.session_id, sessionId)).all();
12707
- } catch (error) {
12708
- throw new RepositoryError(
12709
- `Failed to list session env selections: ${error instanceof Error ? error.message : String(error)}`,
12710
- error
12711
- );
12712
- }
12713
- }
12714
- /** List selected env var names for a session (not hydrated). */
12715
- async listNames(sessionId) {
12716
- const rows = await this.fetchRows(sessionId);
12717
- return rows.map((r) => r.env_var_name);
12718
- }
12719
- /** Return a Set for fast membership checks in the env resolver. */
12720
- async asSet(sessionId) {
12721
- const names = await this.listNames(sessionId);
12722
- return new Set(names);
12723
- }
12724
- /** Full rows with timestamps — for the REST API response. */
12725
- async list(sessionId) {
12726
- const rows = await this.fetchRows(sessionId);
12727
- return rows.map((r) => ({
12728
- session_id: r.session_id,
12729
- env_var_name: r.env_var_name,
12730
- created_at: new Date(r.created_at)
12731
- }));
12732
- }
12733
- /** Add a selection. No-op if it already exists. */
12734
- async add(sessionId, envVarName) {
12735
- try {
12736
- const existing = await select(this.db).from(sessionEnvSelections3).where(
12737
- and20(
12738
- eq23(sessionEnvSelections3.session_id, sessionId),
12739
- eq23(sessionEnvSelections3.env_var_name, envVarName)
12740
- )
12741
- ).one();
12742
- if (existing) return;
12743
- await insert(this.db, sessionEnvSelections3).values({
12744
- session_id: sessionId,
12745
- env_var_name: envVarName,
12746
- created_at: /* @__PURE__ */ new Date()
12747
- }).run();
12748
- } catch (error) {
12749
- throw new RepositoryError(
12750
- `Failed to add session env selection: ${error instanceof Error ? error.message : String(error)}`,
12751
- error
12752
- );
12753
- }
12754
- }
12755
- /** Remove a selection. No-op if it doesn't exist. */
12756
- async remove(sessionId, envVarName) {
12757
- try {
12758
- await deleteFrom(this.db, sessionEnvSelections3).where(
12759
- and20(
12760
- eq23(sessionEnvSelections3.session_id, sessionId),
12761
- eq23(sessionEnvSelections3.env_var_name, envVarName)
12762
- )
12763
- ).run();
12764
- } catch (error) {
12765
- throw new RepositoryError(
12766
- `Failed to remove session env selection: ${error instanceof Error ? error.message : String(error)}`,
12767
- error
12768
- );
12769
- }
12770
- }
12771
- /** Bulk replace — deletes all existing rows, inserts the new set. */
12772
- async setAll(sessionId, envVarNames) {
12773
- try {
12774
- await deleteFrom(this.db, sessionEnvSelections3).where(eq23(sessionEnvSelections3.session_id, sessionId)).run();
12775
- if (envVarNames.length === 0) return;
12776
- const now = /* @__PURE__ */ new Date();
12777
- await insert(this.db, sessionEnvSelections3).values(
12778
- envVarNames.map((name) => ({
12779
- session_id: sessionId,
12780
- env_var_name: name,
12781
- created_at: now
12782
- }))
12783
- ).run();
12784
- } catch (error) {
12785
- throw new RepositoryError(
12786
- `Failed to set session env selections: ${error instanceof Error ? error.message : String(error)}`,
12787
- error
12788
- );
12789
- }
12790
- }
12791
- };
12792
-
12793
12997
  // src/db/repositories/session-mcp-servers.ts
12794
12998
  init_esm_shims();
12795
12999
  init_database_wrapper();
12796
13000
  init_schema();
12797
- import { and as and22, eq as eq25 } from "drizzle-orm";
13001
+ import { and as and22, eq as eq26 } from "drizzle-orm";
12798
13002
 
12799
13003
  // src/db/repositories/sessions.ts
12800
13004
  init_esm_shims();
12801
13005
  init_types2();
12802
13006
  init_config_manager();
12803
13007
  init_ids();
12804
- import { and as and21, desc as desc5, eq as eq24, inArray as inArray8, like as like13, or as or8, sql as sql13 } from "drizzle-orm";
13008
+ import { and as and21, desc as desc5, eq as eq25, inArray as inArray8, like as like13, or as or8, sql as sql13 } from "drizzle-orm";
12805
13009
  init_database_wrapper();
12806
13010
  init_schema();
12807
13011
  function isSessionTimestampNeutralPatch(updates) {
@@ -12826,40 +13030,43 @@ var SessionRepository = class {
12826
13030
  const sessionId = row.session_id;
12827
13031
  const boardId = branchBoardId ?? null;
12828
13032
  const url = baseUrl && boardId ? getSessionUrl(sessionId, baseUrl) : null;
12829
- return {
12830
- session_id: sessionId,
12831
- status: row.status,
12832
- agentic_tool: row.agentic_tool,
12833
- created_at: new Date(row.created_at).toISOString(),
12834
- last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
12835
- created_by: row.created_by,
12836
- unix_username: row.unix_username || null,
12837
- branch_id: row.branch_id,
12838
- branch_board_id: boardId,
12839
- url,
12840
- ...row.data,
12841
- tasks: row.data.tasks.map((id) => id),
12842
- genealogy: {
12843
- parent_session_id: row.parent_session_id,
12844
- forked_from_session_id: row.forked_from_session_id,
12845
- fork_point_task_id: genealogyData.fork_point_task_id,
12846
- fork_point_message_index: genealogyData.fork_point_message_index,
12847
- spawn_point_task_id: genealogyData.spawn_point_task_id,
12848
- spawn_point_message_index: genealogyData.spawn_point_message_index,
12849
- children: genealogyData.children.map((id) => id)
13033
+ return attachHiddenTenant(
13034
+ {
13035
+ session_id: sessionId,
13036
+ status: row.status,
13037
+ agentic_tool: row.agentic_tool,
13038
+ created_at: new Date(row.created_at).toISOString(),
13039
+ last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
13040
+ created_by: row.created_by,
13041
+ unix_username: row.unix_username || null,
13042
+ branch_id: row.branch_id,
13043
+ branch_board_id: boardId,
13044
+ url,
13045
+ ...row.data,
13046
+ tasks: row.data.tasks.map((id) => id),
13047
+ genealogy: {
13048
+ parent_session_id: row.parent_session_id,
13049
+ forked_from_session_id: row.forked_from_session_id,
13050
+ fork_point_task_id: genealogyData.fork_point_task_id,
13051
+ fork_point_message_index: genealogyData.fork_point_message_index,
13052
+ spawn_point_task_id: genealogyData.spawn_point_task_id,
13053
+ spawn_point_message_index: genealogyData.spawn_point_message_index,
13054
+ children: genealogyData.children.map((id) => id)
13055
+ },
13056
+ permission_config: row.data.permission_config,
13057
+ scheduled_run_at: row.scheduled_run_at ?? void 0,
13058
+ scheduled_from_branch: row.scheduled_from_branch ?? false,
13059
+ schedule_id: row.schedule_id ?? void 0,
13060
+ ready_for_prompt: row.ready_for_prompt ?? false,
13061
+ archived: Boolean(row.archived),
13062
+ // Convert SQLite integer (0/1) to boolean
13063
+ archived_reason: row.archived_reason ?? void 0,
13064
+ current_context_usage: row.data.current_context_usage,
13065
+ context_window_limit: row.data.context_window_limit,
13066
+ last_context_update_at: row.data.last_context_update_at
12850
13067
  },
12851
- permission_config: row.data.permission_config,
12852
- scheduled_run_at: row.scheduled_run_at ?? void 0,
12853
- scheduled_from_branch: row.scheduled_from_branch ?? false,
12854
- schedule_id: row.schedule_id ?? void 0,
12855
- ready_for_prompt: row.ready_for_prompt ?? false,
12856
- archived: Boolean(row.archived),
12857
- // Convert SQLite integer (0/1) to boolean
12858
- archived_reason: row.archived_reason ?? void 0,
12859
- current_context_usage: row.data.current_context_usage,
12860
- context_window_limit: row.data.context_window_limit,
12861
- last_context_update_at: row.data.last_context_update_at
12862
- };
13068
+ row
13069
+ );
12863
13070
  }
12864
13071
  /**
12865
13072
  * Convert Session to database insert format
@@ -12947,7 +13154,7 @@ var SessionRepository = class {
12947
13154
  const insertData = this.sessionToInsert(data);
12948
13155
  await insert(this.db, sessions3).values(insertData).run();
12949
13156
  const baseUrl = await getBaseUrl();
12950
- const result = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.session_id, insertData.session_id)).one();
13157
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.session_id, insertData.session_id)).one();
12951
13158
  if (!result) {
12952
13159
  throw new RepositoryError("Failed to retrieve created session");
12953
13160
  }
@@ -12972,7 +13179,7 @@ var SessionRepository = class {
12972
13179
  try {
12973
13180
  const fullId = await this.resolveId(id);
12974
13181
  const baseUrl = await getBaseUrl();
12975
- const result = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.session_id, fullId)).one();
13182
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.session_id, fullId)).one();
12976
13183
  if (!result) {
12977
13184
  return null;
12978
13185
  }
@@ -12995,7 +13202,7 @@ var SessionRepository = class {
12995
13202
  async findBranchIdBySessionId(id) {
12996
13203
  try {
12997
13204
  const fullId = await this.resolveId(id);
12998
- const row = await select(this.db, { branch_id: sessions3.branch_id }).from(sessions3).where(eq24(sessions3.session_id, fullId)).one();
13205
+ const row = await select(this.db, { branch_id: sessions3.branch_id }).from(sessions3).where(eq25(sessions3.session_id, fullId)).one();
12999
13206
  return row?.branch_id ?? null;
13000
13207
  } catch (error) {
13001
13208
  if (error instanceof EntityNotFoundError) return null;
@@ -13006,6 +13213,26 @@ var SessionRepository = class {
13006
13213
  );
13007
13214
  }
13008
13215
  }
13216
+ /**
13217
+ * Resolve the owning user id for a session without hydrating the full row.
13218
+ * Used by realtime delivery to offer streaming events to the session
13219
+ * creator's own connections as a fallback, so their open tabs keep updating
13220
+ * even before they subscribe to the per-session stream channel.
13221
+ */
13222
+ async findCreatedByBySessionId(id) {
13223
+ try {
13224
+ const fullId = await this.resolveId(id);
13225
+ const row = await select(this.db, { created_by: sessions3.created_by }).from(sessions3).where(eq25(sessions3.session_id, fullId)).one();
13226
+ return row?.created_by ?? null;
13227
+ } catch (error) {
13228
+ if (error instanceof EntityNotFoundError) return null;
13229
+ if (error instanceof AmbiguousIdError) throw error;
13230
+ throw new RepositoryError(
13231
+ `Failed to find session owner: ${error instanceof Error ? error.message : String(error)}`,
13232
+ error
13233
+ );
13234
+ }
13235
+ }
13009
13236
  /**
13010
13237
  * Find all sessions
13011
13238
  *
@@ -13018,13 +13245,13 @@ var SessionRepository = class {
13018
13245
  if (filter?.visibleToUserId) {
13019
13246
  conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
13020
13247
  }
13021
- const query = filter?.visibleToUserId ? select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).leftJoin(
13248
+ const query = filter?.visibleToUserId ? select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).leftJoin(
13022
13249
  branchOwners3,
13023
13250
  and21(
13024
- eq24(branchOwners3.branch_id, branches3.branch_id),
13025
- eq24(branchOwners3.user_id, filter.visibleToUserId)
13251
+ eq25(branchOwners3.branch_id, branches3.branch_id),
13252
+ eq25(branchOwners3.user_id, filter.visibleToUserId)
13026
13253
  )
13027
- ) : select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id));
13254
+ ) : select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id));
13028
13255
  const results = conditions.length > 0 ? await query.where(and21(...conditions)).all() : await query.all();
13029
13256
  return results.map(
13030
13257
  (result) => {
@@ -13048,7 +13275,7 @@ var SessionRepository = class {
13048
13275
  async findByStatus(status) {
13049
13276
  try {
13050
13277
  const baseUrl = await getBaseUrl();
13051
- const results = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.status, status)).all();
13278
+ const results = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.status, status)).all();
13052
13279
  return results.map(
13053
13280
  (result) => {
13054
13281
  const sessionRow = result.sessions;
@@ -13076,17 +13303,17 @@ var SessionRepository = class {
13076
13303
  async findByBoard(boardId, filter) {
13077
13304
  try {
13078
13305
  const baseUrl = await getBaseUrl();
13079
- const conditions = [eq24(branches3.board_id, boardId)];
13306
+ const conditions = [eq25(branches3.board_id, boardId)];
13080
13307
  if (filter?.visibleToUserId) {
13081
13308
  conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
13082
13309
  }
13083
- const query = filter?.visibleToUserId ? select(this.db).from(sessions3).innerJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).leftJoin(
13310
+ const query = filter?.visibleToUserId ? select(this.db).from(sessions3).innerJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).leftJoin(
13084
13311
  branchOwners3,
13085
13312
  and21(
13086
- eq24(branchOwners3.branch_id, branches3.branch_id),
13087
- eq24(branchOwners3.user_id, filter.visibleToUserId)
13313
+ eq25(branchOwners3.branch_id, branches3.branch_id),
13314
+ eq25(branchOwners3.user_id, filter.visibleToUserId)
13088
13315
  )
13089
- ) : select(this.db).from(sessions3).innerJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id));
13316
+ ) : select(this.db).from(sessions3).innerJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id));
13090
13317
  const results = await query.where(and21(...conditions)).all();
13091
13318
  return results.map(
13092
13319
  (result) => {
@@ -13123,31 +13350,31 @@ var SessionRepository = class {
13123
13350
  try {
13124
13351
  const baseUrl = await getBaseUrl();
13125
13352
  const conditions = [];
13126
- if (opts.boardId !== void 0) conditions.push(eq24(branches3.board_id, opts.boardId));
13127
- if (opts.archived !== void 0) conditions.push(eq24(sessions3.archived, opts.archived));
13353
+ if (opts.boardId !== void 0) conditions.push(eq25(branches3.board_id, opts.boardId));
13354
+ if (opts.archived !== void 0) conditions.push(eq25(sessions3.archived, opts.archived));
13128
13355
  if (opts.visibleToUserId) {
13129
13356
  conditions.push(visibleBranchAccessCondition(this.db, opts.visibleToUserId));
13130
13357
  }
13131
13358
  const whereClause = conditions.length > 0 ? and21(...conditions) : void 0;
13132
- let countQuery = select(this.db, { count: sql13`count(*)` }).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id));
13359
+ let countQuery = select(this.db, { count: sql13`count(*)` }).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id));
13133
13360
  if (opts.visibleToUserId) {
13134
13361
  countQuery = countQuery.leftJoin(
13135
13362
  branchOwners3,
13136
13363
  and21(
13137
- eq24(branchOwners3.branch_id, branches3.branch_id),
13138
- eq24(branchOwners3.user_id, opts.visibleToUserId)
13364
+ eq25(branchOwners3.branch_id, branches3.branch_id),
13365
+ eq25(branchOwners3.user_id, opts.visibleToUserId)
13139
13366
  )
13140
13367
  );
13141
13368
  }
13142
13369
  const countRow = await (whereClause ? countQuery.where(whereClause) : countQuery).one();
13143
13370
  const total = Number(countRow?.count ?? 0);
13144
- let dataQuery = select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id));
13371
+ let dataQuery = select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id));
13145
13372
  if (opts.visibleToUserId) {
13146
13373
  dataQuery = dataQuery.leftJoin(
13147
13374
  branchOwners3,
13148
13375
  and21(
13149
- eq24(branchOwners3.branch_id, branches3.branch_id),
13150
- eq24(branchOwners3.user_id, opts.visibleToUserId)
13376
+ eq25(branchOwners3.branch_id, branches3.branch_id),
13377
+ eq25(branchOwners3.user_id, opts.visibleToUserId)
13151
13378
  )
13152
13379
  );
13153
13380
  }
@@ -13184,7 +13411,7 @@ var SessionRepository = class {
13184
13411
  const fullId = await this.resolveId(sessionId);
13185
13412
  const baseUrl = await getBaseUrl();
13186
13413
  const { jsonExtract: jsonExtract2 } = await Promise.resolve().then(() => (init_database_wrapper(), database_wrapper_exports));
13187
- const results = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(
13414
+ const results = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(
13188
13415
  or8(
13189
13416
  sql13`${jsonExtract2(this.db, sessions3.data, "genealogy.parent_session_id")} = ${fullId}`,
13190
13417
  sql13`${jsonExtract2(this.db, sessions3.data, "genealogy.forked_from_session_id")} = ${fullId}`
@@ -13253,8 +13480,8 @@ var SessionRepository = class {
13253
13480
  const statusInfo = updates.status ? ` (status: ${updates.status}, ready_for_prompt: ${updates.ready_for_prompt})` : "";
13254
13481
  console.debug(`\u{1F504} [SessionRepo] Updating session ${shortId(fullId)}${statusInfo}`);
13255
13482
  const result = await this.db.transaction(async (tx) => {
13256
- await lockRowForUpdate(txAsDb(tx), this.db, sessions3, eq24(sessions3.session_id, fullId));
13257
- const currentResult = await select(txAsDb(tx)).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.session_id, fullId)).one();
13483
+ await lockRowForUpdate(txAsDb(tx), this.db, sessions3, eq25(sessions3.session_id, fullId));
13484
+ const currentResult = await select(txAsDb(tx)).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.session_id, fullId)).one();
13258
13485
  if (!currentResult) {
13259
13486
  throw new EntityNotFoundError("Session", id);
13260
13487
  }
@@ -13267,12 +13494,12 @@ var SessionRepository = class {
13267
13494
  if (shouldRefreshLastUpdated) {
13268
13495
  insertData.updated_at = /* @__PURE__ */ new Date();
13269
13496
  }
13270
- await update(txAsDb(tx), sessions3).set(insertData).where(eq24(sessions3.session_id, fullId)).run();
13497
+ await update(txAsDb(tx), sessions3).set(insertData).where(eq25(sessions3.session_id, fullId)).run();
13271
13498
  if (!insertData.updated_at) {
13272
13499
  throw new RepositoryError("Session update did not produce an updated_at timestamp");
13273
13500
  }
13274
13501
  merged.last_updated = insertData.updated_at.toISOString();
13275
- return merged;
13502
+ return attachHiddenTenant(merged, currentRow);
13276
13503
  });
13277
13504
  return result;
13278
13505
  } catch (error) {
@@ -13291,7 +13518,7 @@ var SessionRepository = class {
13291
13518
  const fullId = await this.resolveId(sessionId);
13292
13519
  const result = await select(this.db, {
13293
13520
  count: sql13`count(*)`
13294
- }).from(messages3).where(eq24(messages3.session_id, fullId)).one();
13521
+ }).from(messages3).where(eq25(messages3.session_id, fullId)).one();
13295
13522
  return Number(result?.count ?? 0);
13296
13523
  }
13297
13524
  /**
@@ -13300,7 +13527,7 @@ var SessionRepository = class {
13300
13527
  async delete(id) {
13301
13528
  try {
13302
13529
  const fullId = await this.resolveId(id);
13303
- const result = await deleteFrom(this.db, sessions3).where(eq24(sessions3.session_id, fullId)).run();
13530
+ const result = await deleteFrom(this.db, sessions3).where(eq25(sessions3.session_id, fullId)).run();
13304
13531
  if (result.rowsAffected === 0) {
13305
13532
  throw new EntityNotFoundError("Session", id);
13306
13533
  }
@@ -13347,8 +13574,8 @@ var SessionRepository = class {
13347
13574
  async findScheduleRun(scheduleId, scheduledRunAt) {
13348
13575
  try {
13349
13576
  const baseUrl = await getBaseUrl();
13350
- const result = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(
13351
- and21(eq24(sessions3.schedule_id, scheduleId), eq24(sessions3.scheduled_run_at, scheduledRunAt))
13577
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(
13578
+ and21(eq25(sessions3.schedule_id, scheduleId), eq25(sessions3.scheduled_run_at, scheduledRunAt))
13352
13579
  ).one();
13353
13580
  if (!result) return null;
13354
13581
  const r = result;
@@ -13371,7 +13598,7 @@ var SessionRepository = class {
13371
13598
  async findByScheduleId(scheduleId, opts = {}) {
13372
13599
  try {
13373
13600
  const baseUrl = await getBaseUrl();
13374
- let query = select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.schedule_id, scheduleId));
13601
+ let query = select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.schedule_id, scheduleId));
13375
13602
  if (opts.orderByScheduledRunAt === "desc") {
13376
13603
  query = query.orderBy(desc5(sessions3.scheduled_run_at));
13377
13604
  } else if (opts.orderByScheduledRunAt === "asc") {
@@ -13398,7 +13625,7 @@ var SessionRepository = class {
13398
13625
  */
13399
13626
  async countByScheduleId(scheduleId) {
13400
13627
  try {
13401
- const result = await select(this.db, { count: sql13`count(*)` }).from(sessions3).where(eq24(sessions3.schedule_id, scheduleId)).one();
13628
+ const result = await select(this.db, { count: sql13`count(*)` }).from(sessions3).where(eq25(sessions3.schedule_id, scheduleId)).one();
13402
13629
  return Number(result?.count ?? 0);
13403
13630
  } catch (error) {
13404
13631
  throw new RepositoryError(
@@ -13420,7 +13647,7 @@ var SessionRepository = class {
13420
13647
  async existsInBranchWithStatuses(branchId, statuses) {
13421
13648
  if (statuses.length === 0) return false;
13422
13649
  try {
13423
- const row = await select(this.db, { one: sql13`1` }).from(sessions3).where(and21(eq24(sessions3.branch_id, branchId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
13650
+ const row = await select(this.db, { one: sql13`1` }).from(sessions3).where(and21(eq25(sessions3.branch_id, branchId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
13424
13651
  return row != null;
13425
13652
  } catch (error) {
13426
13653
  throw new RepositoryError(
@@ -13436,7 +13663,7 @@ var SessionRepository = class {
13436
13663
  async existsInScheduleWithStatuses(scheduleId, statuses) {
13437
13664
  if (statuses.length === 0) return false;
13438
13665
  try {
13439
- const row = await select(this.db, { one: sql13`1` }).from(sessions3).where(and21(eq24(sessions3.schedule_id, scheduleId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
13666
+ const row = await select(this.db, { one: sql13`1` }).from(sessions3).where(and21(eq25(sessions3.schedule_id, scheduleId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
13440
13667
  return row != null;
13441
13668
  } catch (error) {
13442
13669
  throw new RepositoryError(
@@ -13467,10 +13694,10 @@ var SessionRepository = class {
13467
13694
  async findAccessibleSessions(userId, boardId) {
13468
13695
  const baseUrl = await getBaseUrl();
13469
13696
  const accessCondition = visibleBranchAccessCondition(this.db, userId);
13470
- const whereCondition = boardId ? and21(accessCondition, eq24(branches3.board_id, boardId)) : accessCondition;
13471
- const results = await select(this.db).from(sessions3).innerJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).leftJoin(
13697
+ const whereCondition = boardId ? and21(accessCondition, eq25(branches3.board_id, boardId)) : accessCondition;
13698
+ const results = await select(this.db).from(sessions3).innerJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).leftJoin(
13472
13699
  branchOwners3,
13473
- and21(eq24(branchOwners3.branch_id, branches3.branch_id), eq24(branchOwners3.user_id, userId))
13700
+ and21(eq25(branchOwners3.branch_id, branches3.branch_id), eq25(branchOwners3.user_id, userId))
13474
13701
  ).where(whereCondition).all();
13475
13702
  const seen = /* @__PURE__ */ new Set();
13476
13703
  const sessionsOut = [];
@@ -13513,7 +13740,7 @@ var SessionRepository = class {
13513
13740
  for (const sessionId of sessionIds) {
13514
13741
  const query = select(this.db, {
13515
13742
  data: messagesTable.data
13516
- }).from(messagesTable).where(and21(eq24(messagesTable.session_id, sessionId), eq24(messagesTable.role, "assistant")));
13743
+ }).from(messagesTable).where(and21(eq25(messagesTable.session_id, sessionId), eq25(messagesTable.role, "assistant")));
13517
13744
  const lastMessage = await query.orderBy(desc5(messagesTable.index)).limit(1).one();
13518
13745
  if (lastMessage) {
13519
13746
  const messageData = lastMessage.data;
@@ -13548,7 +13775,7 @@ var SessionRepository = class {
13548
13775
  */
13549
13776
  async exists(sessionId) {
13550
13777
  try {
13551
- const row = await select(this.db).from(sessions3).where(eq24(sessions3.session_id, sessionId)).one();
13778
+ const row = await select(this.db).from(sessions3).where(eq25(sessions3.session_id, sessionId)).one();
13552
13779
  return row != null;
13553
13780
  } catch (error) {
13554
13781
  throw new RepositoryError(
@@ -13583,15 +13810,15 @@ var SessionMCPServerRepository = class {
13583
13810
  }
13584
13811
  const existing = await select(this.db).from(sessionMcpServers3).where(
13585
13812
  and22(
13586
- eq25(sessionMcpServers3.session_id, sessionId),
13587
- eq25(sessionMcpServers3.mcp_server_id, serverId)
13813
+ eq26(sessionMcpServers3.session_id, sessionId),
13814
+ eq26(sessionMcpServers3.mcp_server_id, serverId)
13588
13815
  )
13589
13816
  ).one();
13590
13817
  if (existing) {
13591
13818
  await update(this.db, sessionMcpServers3).set({ enabled: true }).where(
13592
13819
  and22(
13593
- eq25(sessionMcpServers3.session_id, sessionId),
13594
- eq25(sessionMcpServers3.mcp_server_id, serverId)
13820
+ eq26(sessionMcpServers3.session_id, sessionId),
13821
+ eq26(sessionMcpServers3.mcp_server_id, serverId)
13595
13822
  )
13596
13823
  ).run();
13597
13824
  return;
@@ -13618,8 +13845,8 @@ var SessionMCPServerRepository = class {
13618
13845
  try {
13619
13846
  const result = await deleteFrom(this.db, sessionMcpServers3).where(
13620
13847
  and22(
13621
- eq25(sessionMcpServers3.session_id, sessionId),
13622
- eq25(sessionMcpServers3.mcp_server_id, serverId)
13848
+ eq26(sessionMcpServers3.session_id, sessionId),
13849
+ eq26(sessionMcpServers3.mcp_server_id, serverId)
13623
13850
  )
13624
13851
  ).run();
13625
13852
  if (result.rowsAffected === 0) {
@@ -13640,8 +13867,8 @@ var SessionMCPServerRepository = class {
13640
13867
  try {
13641
13868
  const result = await update(this.db, sessionMcpServers3).set({ enabled }).where(
13642
13869
  and22(
13643
- eq25(sessionMcpServers3.session_id, sessionId),
13644
- eq25(sessionMcpServers3.mcp_server_id, serverId)
13870
+ eq26(sessionMcpServers3.session_id, sessionId),
13871
+ eq26(sessionMcpServers3.mcp_server_id, serverId)
13645
13872
  )
13646
13873
  ).run();
13647
13874
  if (result.rowsAffected === 0) {
@@ -13660,9 +13887,9 @@ var SessionMCPServerRepository = class {
13660
13887
  */
13661
13888
  async listServers(sessionId, enabledOnly = false) {
13662
13889
  try {
13663
- const conditions = [eq25(sessionMcpServers3.session_id, sessionId)];
13890
+ const conditions = [eq26(sessionMcpServers3.session_id, sessionId)];
13664
13891
  if (enabledOnly) {
13665
- conditions.push(eq25(sessionMcpServers3.enabled, true));
13892
+ conditions.push(eq26(sessionMcpServers3.enabled, true));
13666
13893
  }
13667
13894
  const relationships = await select(this.db).from(sessionMcpServers3).where(and22(...conditions)).all();
13668
13895
  const servers = [];
@@ -13686,9 +13913,9 @@ var SessionMCPServerRepository = class {
13686
13913
  */
13687
13914
  async listServersWithMetadata(sessionId, enabledOnly = false) {
13688
13915
  try {
13689
- const conditions = [eq25(sessionMcpServers3.session_id, sessionId)];
13916
+ const conditions = [eq26(sessionMcpServers3.session_id, sessionId)];
13690
13917
  if (enabledOnly) {
13691
- conditions.push(eq25(sessionMcpServers3.enabled, true));
13918
+ conditions.push(eq26(sessionMcpServers3.enabled, true));
13692
13919
  }
13693
13920
  const relationships = await select(this.db).from(sessionMcpServers3).where(and22(...conditions)).all();
13694
13921
  const results = [];
@@ -13721,7 +13948,7 @@ var SessionMCPServerRepository = class {
13721
13948
  if (!session) {
13722
13949
  throw new EntityNotFoundError("Session", sessionId);
13723
13950
  }
13724
- await deleteFrom(this.db, sessionMcpServers3).where(eq25(sessionMcpServers3.session_id, sessionId)).run();
13951
+ await deleteFrom(this.db, sessionMcpServers3).where(eq26(sessionMcpServers3.session_id, sessionId)).run();
13725
13952
  if (serverIds.length > 0) {
13726
13953
  const inserts = serverIds.map((serverId) => ({
13727
13954
  session_id: sessionId,
@@ -13746,8 +13973,8 @@ var SessionMCPServerRepository = class {
13746
13973
  try {
13747
13974
  const row = await select(this.db).from(sessionMcpServers3).where(
13748
13975
  and22(
13749
- eq25(sessionMcpServers3.session_id, sessionId),
13750
- eq25(sessionMcpServers3.mcp_server_id, serverId)
13976
+ eq26(sessionMcpServers3.session_id, sessionId),
13977
+ eq26(sessionMcpServers3.mcp_server_id, serverId)
13751
13978
  )
13752
13979
  ).one();
13753
13980
  if (!row) {
@@ -13787,7 +14014,7 @@ init_esm_shims();
13787
14014
  init_ids();
13788
14015
  init_database_wrapper();
13789
14016
  init_schema();
13790
- import { and as and23, eq as eq26, inArray as inArray9, or as or9 } from "drizzle-orm";
14017
+ import { and as and23, eq as eq27, inArray as inArray9, or as or9 } from "drizzle-orm";
13791
14018
  var SessionRelationshipRepository = class {
13792
14019
  constructor(db) {
13793
14020
  this.db = db;
@@ -13832,7 +14059,7 @@ var SessionRelationshipRepository = class {
13832
14059
  }
13833
14060
  async get(relationshipId) {
13834
14061
  try {
13835
- const row = await select(this.db).from(sessionRelationships3).where(eq26(sessionRelationships3.relationship_id, relationshipId)).one();
14062
+ const row = await select(this.db).from(sessionRelationships3).where(eq27(sessionRelationships3.relationship_id, relationshipId)).one();
13836
14063
  if (!row) throw new EntityNotFoundError("SessionRelationship", relationshipId);
13837
14064
  return this.rowToRelationship(row);
13838
14065
  } catch (error) {
@@ -13847,8 +14074,8 @@ var SessionRelationshipRepository = class {
13847
14074
  try {
13848
14075
  const rows = await select(this.db).from(sessionRelationships3).where(
13849
14076
  or9(
13850
- eq26(sessionRelationships3.source_session_id, sessionId),
13851
- eq26(sessionRelationships3.target_session_id, sessionId)
14077
+ eq27(sessionRelationships3.source_session_id, sessionId),
14078
+ eq27(sessionRelationships3.target_session_id, sessionId)
13852
14079
  )
13853
14080
  ).all();
13854
14081
  return rows.map((row) => this.rowToRelationship(row));
@@ -13880,8 +14107,8 @@ var SessionRelationshipRepository = class {
13880
14107
  try {
13881
14108
  const rows = await select(this.db).from(sessionRelationships3).where(
13882
14109
  and23(
13883
- eq26(sessionRelationships3.source_session_id, sourceSessionId),
13884
- eq26(sessionRelationships3.relationship_type, "remote_create")
14110
+ eq27(sessionRelationships3.source_session_id, sourceSessionId),
14111
+ eq27(sessionRelationships3.relationship_type, "remote_create")
13885
14112
  )
13886
14113
  ).all();
13887
14114
  return rows.map((row) => this.rowToRelationship(row));
@@ -13896,8 +14123,8 @@ var SessionRelationshipRepository = class {
13896
14123
  try {
13897
14124
  const rows = await select(this.db).from(sessionRelationships3).where(
13898
14125
  and23(
13899
- eq26(sessionRelationships3.target_session_id, targetSessionId),
13900
- eq26(sessionRelationships3.relationship_type, "remote_create")
14126
+ eq27(sessionRelationships3.target_session_id, targetSessionId),
14127
+ eq27(sessionRelationships3.relationship_type, "remote_create")
13901
14128
  )
13902
14129
  ).all();
13903
14130
  return rows.map((row) => this.rowToRelationship(row));
@@ -13910,11 +14137,11 @@ var SessionRelationshipRepository = class {
13910
14137
  }
13911
14138
  async setCallbackEnabled(relationshipId, callbackEnabled) {
13912
14139
  try {
13913
- const result = await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(eq26(sessionRelationships3.relationship_id, relationshipId)).run();
14140
+ const result = await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(eq27(sessionRelationships3.relationship_id, relationshipId)).run();
13914
14141
  if (result.rowsAffected === 0) {
13915
14142
  throw new EntityNotFoundError("SessionRelationship", relationshipId);
13916
14143
  }
13917
- const row = await select(this.db).from(sessionRelationships3).where(eq26(sessionRelationships3.relationship_id, relationshipId)).one();
14144
+ const row = await select(this.db).from(sessionRelationships3).where(eq27(sessionRelationships3.relationship_id, relationshipId)).one();
13918
14145
  if (!row) throw new EntityNotFoundError("SessionRelationship", relationshipId);
13919
14146
  return this.rowToRelationship(row);
13920
14147
  } catch (error) {
@@ -13929,8 +14156,8 @@ var SessionRelationshipRepository = class {
13929
14156
  try {
13930
14157
  await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(
13931
14158
  and23(
13932
- eq26(sessionRelationships3.target_session_id, targetSessionId),
13933
- eq26(sessionRelationships3.relationship_type, "remote_create")
14159
+ eq27(sessionRelationships3.target_session_id, targetSessionId),
14160
+ eq27(sessionRelationships3.relationship_type, "remote_create")
13934
14161
  )
13935
14162
  ).run();
13936
14163
  } catch (error) {
@@ -13948,7 +14175,7 @@ init_types2();
13948
14175
  init_ids();
13949
14176
  init_database_wrapper();
13950
14177
  init_schema();
13951
- import { and as and24, eq as eq27, inArray as inArray10, like as like14, sql as sql14 } from "drizzle-orm";
14178
+ import { and as and24, eq as eq28, inArray as inArray10, like as like14, sql as sql14 } from "drizzle-orm";
13952
14179
  var TaskRepository = class {
13953
14180
  constructor(db) {
13954
14181
  this.db = db;
@@ -14044,7 +14271,7 @@ var TaskRepository = class {
14044
14271
  try {
14045
14272
  const insertData = this.taskToInsert(data);
14046
14273
  await insert(this.db, tasks3).values(insertData).run();
14047
- const row = await select(this.db).from(tasks3).where(eq27(tasks3.task_id, insertData.task_id)).one();
14274
+ const row = await select(this.db).from(tasks3).where(eq28(tasks3.task_id, insertData.task_id)).one();
14048
14275
  if (!row) {
14049
14276
  throw new RepositoryError("Failed to retrieve created task");
14050
14277
  }
@@ -14084,7 +14311,7 @@ var TaskRepository = class {
14084
14311
  async findById(id) {
14085
14312
  try {
14086
14313
  const fullId = await this.resolveId(id);
14087
- const row = await select(this.db).from(tasks3).where(eq27(tasks3.task_id, fullId)).one();
14314
+ const row = await select(this.db).from(tasks3).where(eq28(tasks3.task_id, fullId)).one();
14088
14315
  return row ? this.rowToTask(row) : null;
14089
14316
  } catch (error) {
14090
14317
  if (error instanceof EntityNotFoundError) return null;
@@ -14102,10 +14329,10 @@ var TaskRepository = class {
14102
14329
  try {
14103
14330
  if (filter?.sessionIds !== void 0 && filter.sessionIds.length === 0) return [];
14104
14331
  const conditions = [];
14105
- if (filter?.sessionId) conditions.push(eq27(tasks3.session_id, filter.sessionId));
14332
+ if (filter?.sessionId) conditions.push(eq28(tasks3.session_id, filter.sessionId));
14106
14333
  if (filter?.sessionIds !== void 0)
14107
14334
  conditions.push(inArray10(tasks3.session_id, filter.sessionIds));
14108
- if (filter?.status) conditions.push(eq27(tasks3.status, filter.status));
14335
+ if (filter?.status) conditions.push(eq28(tasks3.status, filter.status));
14109
14336
  if (filter?.visibleToUserId) {
14110
14337
  conditions.push(
14111
14338
  visibleSessionReferenceAccessExists(this.db, filter.visibleToUserId, tasks3.session_id)
@@ -14126,7 +14353,7 @@ var TaskRepository = class {
14126
14353
  */
14127
14354
  async findBySession(sessionId) {
14128
14355
  try {
14129
- const rows = await select(this.db).from(tasks3).where(eq27(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
14356
+ const rows = await select(this.db).from(tasks3).where(eq28(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
14130
14357
  return rows.map((row) => this.rowToTask(row));
14131
14358
  } catch (error) {
14132
14359
  throw new RepositoryError(
@@ -14140,7 +14367,7 @@ var TaskRepository = class {
14140
14367
  */
14141
14368
  async findRunning() {
14142
14369
  try {
14143
- const rows = await select(this.db).from(tasks3).where(eq27(tasks3.status, TaskStatus.RUNNING)).all();
14370
+ const rows = await select(this.db).from(tasks3).where(eq28(tasks3.status, TaskStatus.RUNNING)).all();
14144
14371
  return rows.map((row) => this.rowToTask(row));
14145
14372
  } catch (error) {
14146
14373
  throw new RepositoryError(
@@ -14196,7 +14423,7 @@ var TaskRepository = class {
14196
14423
  */
14197
14424
  async findByStatus(status) {
14198
14425
  try {
14199
- const rows = await select(this.db).from(tasks3).where(eq27(tasks3.status, status)).all();
14426
+ const rows = await select(this.db).from(tasks3).where(eq28(tasks3.status, status)).all();
14200
14427
  return rows.map((row) => this.rowToTask(row));
14201
14428
  } catch (error) {
14202
14429
  throw new RepositoryError(
@@ -14218,8 +14445,8 @@ var TaskRepository = class {
14218
14445
  `\u{1F504} [TaskRepo] Updating task ${shortId(fullId)}${updates.status ? ` (status: ${updates.status})` : ""}`
14219
14446
  );
14220
14447
  const result = await this.db.transaction(async (tx) => {
14221
- await lockRowForUpdate(txAsDb(tx), this.db, tasks3, eq27(tasks3.task_id, fullId));
14222
- const currentRow = await select(txAsDb(tx)).from(tasks3).where(eq27(tasks3.task_id, fullId)).one();
14448
+ await lockRowForUpdate(txAsDb(tx), this.db, tasks3, eq28(tasks3.task_id, fullId));
14449
+ const currentRow = await select(txAsDb(tx)).from(tasks3).where(eq28(tasks3.task_id, fullId)).one();
14223
14450
  if (!currentRow) {
14224
14451
  throw new EntityNotFoundError("Task", id);
14225
14452
  }
@@ -14233,7 +14460,7 @@ var TaskRepository = class {
14233
14460
  last_executor_heartbeat_at: insertData.last_executor_heartbeat_at,
14234
14461
  session_md5: insertData.session_md5,
14235
14462
  data: insertData.data
14236
- }).where(eq27(tasks3.task_id, fullId)).run();
14463
+ }).where(eq28(tasks3.task_id, fullId)).run();
14237
14464
  return merged;
14238
14465
  });
14239
14466
  return result;
@@ -14252,7 +14479,7 @@ var TaskRepository = class {
14252
14479
  async delete(id) {
14253
14480
  try {
14254
14481
  const fullId = await this.resolveId(id);
14255
- const result = await deleteFrom(this.db, tasks3).where(eq27(tasks3.task_id, fullId)).run();
14482
+ const result = await deleteFrom(this.db, tasks3).where(eq28(tasks3.task_id, fullId)).run();
14256
14483
  if (result.rowsAffected === 0) {
14257
14484
  throw new EntityNotFoundError("Task", id);
14258
14485
  }
@@ -14314,7 +14541,7 @@ var TaskRepository = class {
14314
14541
  queue_position: nextPosition
14315
14542
  });
14316
14543
  await insert(txAsDb(tx), tasks3).values(insertData).run();
14317
- const row = await select(txAsDb(tx)).from(tasks3).where(eq27(tasks3.task_id, insertData.task_id)).one();
14544
+ const row = await select(txAsDb(tx)).from(tasks3).where(eq28(tasks3.task_id, insertData.task_id)).one();
14318
14545
  if (!row) {
14319
14546
  throw new RepositoryError("Failed to retrieve created queued task");
14320
14547
  }
@@ -14355,7 +14582,7 @@ var TaskRepository = class {
14355
14582
  */
14356
14583
  async countBySession(sessionId) {
14357
14584
  try {
14358
- const result = await select(this.db, { count: sql14`count(*)` }).from(tasks3).where(eq27(tasks3.session_id, sessionId)).one();
14585
+ const result = await select(this.db, { count: sql14`count(*)` }).from(tasks3).where(eq28(tasks3.session_id, sessionId)).one();
14359
14586
  return result?.count ?? 0;
14360
14587
  } catch (error) {
14361
14588
  throw new RepositoryError(
@@ -14372,7 +14599,7 @@ init_types2();
14372
14599
  init_ids();
14373
14600
  init_database_wrapper();
14374
14601
  init_schema();
14375
- import { and as and25, eq as eq28, like as like15, lt as lt2 } from "drizzle-orm";
14602
+ import { and as and25, eq as eq29, like as like15, lt as lt2 } from "drizzle-orm";
14376
14603
  var ThreadSessionMapRepository = class {
14377
14604
  constructor(db) {
14378
14605
  this.db = db;
@@ -14442,7 +14669,7 @@ var ThreadSessionMapRepository = class {
14442
14669
  id: data.id ?? generateId()
14443
14670
  });
14444
14671
  await insert(this.db, threadSessionMap3).values(insertData).run();
14445
- const row = await select(this.db).from(threadSessionMap3).where(eq28(threadSessionMap3.id, insertData.id)).one();
14672
+ const row = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.id, insertData.id)).one();
14446
14673
  if (!row) {
14447
14674
  throw new RepositoryError("Failed to retrieve created thread-session mapping");
14448
14675
  }
@@ -14461,7 +14688,7 @@ var ThreadSessionMapRepository = class {
14461
14688
  async findById(id) {
14462
14689
  try {
14463
14690
  const fullId = await this.resolveId(id);
14464
- const row = await select(this.db).from(threadSessionMap3).where(eq28(threadSessionMap3.id, fullId)).one();
14691
+ const row = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.id, fullId)).one();
14465
14692
  return row ? this.rowToMapping(row) : null;
14466
14693
  } catch (error) {
14467
14694
  if (error instanceof EntityNotFoundError) return null;
@@ -14502,7 +14729,7 @@ var ThreadSessionMapRepository = class {
14502
14729
  status: insertData.status,
14503
14730
  last_message_at: insertData.last_message_at,
14504
14731
  metadata: insertData.metadata
14505
- }).where(eq28(threadSessionMap3.id, fullId)).run();
14732
+ }).where(eq29(threadSessionMap3.id, fullId)).run();
14506
14733
  const updated = await this.findById(fullId);
14507
14734
  if (!updated) {
14508
14735
  throw new RepositoryError("Failed to retrieve updated thread-session mapping");
@@ -14523,7 +14750,7 @@ var ThreadSessionMapRepository = class {
14523
14750
  async delete(id) {
14524
14751
  try {
14525
14752
  const fullId = await this.resolveId(id);
14526
- const result = await deleteFrom(this.db, threadSessionMap3).where(eq28(threadSessionMap3.id, fullId)).run();
14753
+ const result = await deleteFrom(this.db, threadSessionMap3).where(eq29(threadSessionMap3.id, fullId)).run();
14527
14754
  if (result.rowsAffected === 0) {
14528
14755
  throw new EntityNotFoundError("ThreadSessionMap", id);
14529
14756
  }
@@ -14541,7 +14768,7 @@ var ThreadSessionMapRepository = class {
14541
14768
  async findByChannelAndThread(channelId, threadId) {
14542
14769
  try {
14543
14770
  const row = await select(this.db).from(threadSessionMap3).where(
14544
- and25(eq28(threadSessionMap3.channel_id, channelId), eq28(threadSessionMap3.thread_id, threadId))
14771
+ and25(eq29(threadSessionMap3.channel_id, channelId), eq29(threadSessionMap3.thread_id, threadId))
14545
14772
  ).one();
14546
14773
  return row ? this.rowToMapping(row) : null;
14547
14774
  } catch (error) {
@@ -14558,7 +14785,7 @@ var ThreadSessionMapRepository = class {
14558
14785
  */
14559
14786
  async findByThread(threadId) {
14560
14787
  try {
14561
- const row = await select(this.db).from(threadSessionMap3).where(eq28(threadSessionMap3.thread_id, threadId)).one();
14788
+ const row = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.thread_id, threadId)).one();
14562
14789
  return row ? this.rowToMapping(row) : null;
14563
14790
  } catch (error) {
14564
14791
  throw new RepositoryError(
@@ -14572,7 +14799,7 @@ var ThreadSessionMapRepository = class {
14572
14799
  */
14573
14800
  async findBySession(sessionId) {
14574
14801
  try {
14575
- const row = await select(this.db).from(threadSessionMap3).where(eq28(threadSessionMap3.session_id, sessionId)).one();
14802
+ const row = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.session_id, sessionId)).one();
14576
14803
  return row ? this.rowToMapping(row) : null;
14577
14804
  } catch (error) {
14578
14805
  throw new RepositoryError(
@@ -14586,9 +14813,9 @@ var ThreadSessionMapRepository = class {
14586
14813
  */
14587
14814
  async findByChannel(channelId, status) {
14588
14815
  try {
14589
- const conditions = [eq28(threadSessionMap3.channel_id, channelId)];
14816
+ const conditions = [eq29(threadSessionMap3.channel_id, channelId)];
14590
14817
  if (status) {
14591
- conditions.push(eq28(threadSessionMap3.status, status));
14818
+ conditions.push(eq29(threadSessionMap3.status, status));
14592
14819
  }
14593
14820
  const rows = await select(this.db).from(threadSessionMap3).where(and25(...conditions)).all();
14594
14821
  return rows.map((row) => this.rowToMapping(row));
@@ -14606,7 +14833,7 @@ var ThreadSessionMapRepository = class {
14606
14833
  try {
14607
14834
  await update(this.db, threadSessionMap3).set({
14608
14835
  last_message_at: /* @__PURE__ */ new Date()
14609
- }).where(eq28(threadSessionMap3.id, id)).run();
14836
+ }).where(eq29(threadSessionMap3.id, id)).run();
14610
14837
  } catch (error) {
14611
14838
  throw new RepositoryError(
14612
14839
  `Failed to update last message timestamp: ${error instanceof Error ? error.message : String(error)}`,
@@ -14619,7 +14846,7 @@ var ThreadSessionMapRepository = class {
14619
14846
  */
14620
14847
  async updateMetadata(id, metadata) {
14621
14848
  try {
14622
- await update(this.db, threadSessionMap3).set({ metadata }).where(eq28(threadSessionMap3.id, id)).run();
14849
+ await update(this.db, threadSessionMap3).set({ metadata }).where(eq29(threadSessionMap3.id, id)).run();
14623
14850
  } catch (error) {
14624
14851
  throw new RepositoryError(
14625
14852
  `Failed to update metadata: ${error instanceof Error ? error.message : String(error)}`,
@@ -14634,7 +14861,7 @@ var ThreadSessionMapRepository = class {
14634
14861
  try {
14635
14862
  const cutoff = new Date(Date.now() - daysInactive * 24 * 60 * 60 * 1e3);
14636
14863
  const rows = await select(this.db).from(threadSessionMap3).where(
14637
- and25(eq28(threadSessionMap3.status, "active"), lt2(threadSessionMap3.last_message_at, cutoff))
14864
+ and25(eq29(threadSessionMap3.status, "active"), lt2(threadSessionMap3.last_message_at, cutoff))
14638
14865
  ).all();
14639
14866
  return rows.map((row) => this.rowToMapping(row));
14640
14867
  } catch (error) {
@@ -14649,7 +14876,7 @@ var ThreadSessionMapRepository = class {
14649
14876
  */
14650
14877
  async findByBranch(branchId) {
14651
14878
  try {
14652
- const rows = await select(this.db).from(threadSessionMap3).where(eq28(threadSessionMap3.branch_id, branchId)).all();
14879
+ const rows = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.branch_id, branchId)).all();
14653
14880
  return rows.map((row) => this.rowToMapping(row));
14654
14881
  } catch (error) {
14655
14882
  throw new RepositoryError(
@@ -14668,7 +14895,7 @@ init_schema();
14668
14895
  init_tenant_context();
14669
14896
  import { randomBytes as randomBytes3 } from "crypto";
14670
14897
  import bcrypt2 from "bcryptjs";
14671
- import { and as and26, eq as eq29 } from "drizzle-orm";
14898
+ import { and as and26, eq as eq30 } from "drizzle-orm";
14672
14899
  var KEY_PREFIX = "agor_sk_";
14673
14900
  var KEY_PREFIX_LENGTH = 12;
14674
14901
  var KEY_RANDOM_BYTES = 32;
@@ -14705,7 +14932,7 @@ var UserApiKeysRepository = class {
14705
14932
  }
14706
14933
  /** List all API keys for a user (never returns hashes) */
14707
14934
  async listByUser(userId) {
14708
- const rows = await select(this.db).from(userApiKeys3).where(eq29(userApiKeys3.user_id, userId)).all();
14935
+ const rows = await select(this.db).from(userApiKeys3).where(eq30(userApiKeys3.user_id, userId)).all();
14709
14936
  return rows.map((r) => ({
14710
14937
  id: r.id,
14711
14938
  name: r.name,
@@ -14716,7 +14943,7 @@ var UserApiKeysRepository = class {
14716
14943
  }
14717
14944
  /** Find a key by prefix (for auth lookup). Returns rows with hash for verification. */
14718
14945
  async findByPrefix(prefix) {
14719
- return select(this.db).from(userApiKeys3).where(eq29(userApiKeys3.prefix, prefix)).all();
14946
+ return select(this.db).from(userApiKeys3).where(eq30(userApiKeys3.prefix, prefix)).all();
14720
14947
  }
14721
14948
  /** Verify a raw API key against stored hashes. Returns the matching row or null. */
14722
14949
  async verifyKey(rawKey) {
@@ -14745,19 +14972,19 @@ var UserApiKeysRepository = class {
14745
14972
  await this.updateLastUsedNow(id);
14746
14973
  }
14747
14974
  async updateLastUsedNow(id) {
14748
- await update(this.db, userApiKeys3).set({ last_used_at: /* @__PURE__ */ new Date() }).where(eq29(userApiKeys3.id, id)).run();
14975
+ await update(this.db, userApiKeys3).set({ last_used_at: /* @__PURE__ */ new Date() }).where(eq30(userApiKeys3.id, id)).run();
14749
14976
  }
14750
14977
  /** Update key name */
14751
14978
  async updateName(id, userId, name) {
14752
- await update(this.db, userApiKeys3).set({ name }).where(and26(eq29(userApiKeys3.id, id), eq29(userApiKeys3.user_id, userId))).run();
14979
+ await update(this.db, userApiKeys3).set({ name }).where(and26(eq30(userApiKeys3.id, id), eq30(userApiKeys3.user_id, userId))).run();
14753
14980
  }
14754
14981
  /** Delete a key */
14755
14982
  async delete(id, userId) {
14756
- await deleteFrom(this.db, userApiKeys3).where(and26(eq29(userApiKeys3.id, id), eq29(userApiKeys3.user_id, userId))).run();
14983
+ await deleteFrom(this.db, userApiKeys3).where(and26(eq30(userApiKeys3.id, id), eq30(userApiKeys3.user_id, userId))).run();
14757
14984
  }
14758
14985
  /** Delete all keys for a user */
14759
14986
  async deleteAllForUser(userId) {
14760
- await deleteFrom(this.db, userApiKeys3).where(eq29(userApiKeys3.user_id, userId)).run();
14987
+ await deleteFrom(this.db, userApiKeys3).where(eq30(userApiKeys3.user_id, userId)).run();
14761
14988
  }
14762
14989
  };
14763
14990
 
@@ -14765,7 +14992,7 @@ var UserApiKeysRepository = class {
14765
14992
  init_esm_shims();
14766
14993
  init_database_wrapper();
14767
14994
  init_schema();
14768
- import { and as and27, eq as eq30, isNull as isNull7 } from "drizzle-orm";
14995
+ import { and as and27, eq as eq31, isNull as isNull7 } from "drizzle-orm";
14769
14996
  function rowToToken(row) {
14770
14997
  return {
14771
14998
  user_id: row.user_id ?? null,
@@ -14781,8 +15008,8 @@ function rowToToken(row) {
14781
15008
  }
14782
15009
  function matchKey(userId, serverId) {
14783
15010
  return and27(
14784
- userId === null ? isNull7(userMcpOauthTokens3.user_id) : eq30(userMcpOauthTokens3.user_id, userId),
14785
- eq30(userMcpOauthTokens3.mcp_server_id, serverId)
15011
+ userId === null ? isNull7(userMcpOauthTokens3.user_id) : eq31(userMcpOauthTokens3.user_id, userId),
15012
+ eq31(userMcpOauthTokens3.mcp_server_id, serverId)
14786
15013
  );
14787
15014
  }
14788
15015
  var UserMCPOAuthTokenRepository = class {
@@ -14899,7 +15126,7 @@ var UserMCPOAuthTokenRepository = class {
14899
15126
  }
14900
15127
  async deleteAllForUser(userId) {
14901
15128
  try {
14902
- const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq30(userMcpOauthTokens3.user_id, userId)).run();
15129
+ const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq31(userMcpOauthTokens3.user_id, userId)).run();
14903
15130
  return result.rowsAffected;
14904
15131
  } catch (error) {
14905
15132
  throw new RepositoryError(
@@ -14910,7 +15137,7 @@ var UserMCPOAuthTokenRepository = class {
14910
15137
  }
14911
15138
  async deleteAllForServer(serverId) {
14912
15139
  try {
14913
- const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq30(userMcpOauthTokens3.mcp_server_id, serverId)).run();
15140
+ const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq31(userMcpOauthTokens3.mcp_server_id, serverId)).run();
14914
15141
  return result.rowsAffected;
14915
15142
  } catch (error) {
14916
15143
  throw new RepositoryError(
@@ -14921,7 +15148,7 @@ var UserMCPOAuthTokenRepository = class {
14921
15148
  }
14922
15149
  async listForUser(userId) {
14923
15150
  try {
14924
- const rows = await select(this.db).from(userMcpOauthTokens3).where(eq30(userMcpOauthTokens3.user_id, userId)).all();
15151
+ const rows = await select(this.db).from(userMcpOauthTokens3).where(eq31(userMcpOauthTokens3.user_id, userId)).all();
14925
15152
  return rows.map(rowToToken);
14926
15153
  } catch (error) {
14927
15154
  throw new RepositoryError(
@@ -14939,37 +15166,7 @@ var UserMCPOAuthTokenRepository = class {
14939
15166
  // src/db/repositories/users.ts
14940
15167
  init_esm_shims();
14941
15168
  init_types2();
14942
- import { eq as eq31, like as like16, sql as sql15 } from "drizzle-orm";
14943
-
14944
- // src/config/env-vars.ts
14945
- init_esm_shims();
14946
- var V05_SCOPES = ["global", "session"];
14947
- var V05_SCOPE_SET = new Set(V05_SCOPES);
14948
- function normalizeStoredEnvVar(raw) {
14949
- if (typeof raw === "string") {
14950
- return { value_encrypted: raw, scope: "global" };
14951
- }
14952
- return {
14953
- value_encrypted: raw.value_encrypted,
14954
- scope: raw.scope,
14955
- resource_id: raw.resource_id ?? null,
14956
- extra_config: raw.extra_config ?? null
14957
- };
14958
- }
14959
- function normalizeStoredEnvMap(raw) {
14960
- const out = {};
14961
- if (!raw) return out;
14962
- for (const [key, value] of Object.entries(raw)) {
14963
- try {
14964
- out[key] = normalizeStoredEnvVar(value);
14965
- } catch (err) {
14966
- console.warn(`[env-vars] Skipping malformed env var entry ${key}:`, err);
14967
- }
14968
- }
14969
- return out;
14970
- }
14971
-
14972
- // src/db/repositories/users.ts
15169
+ import { eq as eq32, like as like16, sql as sql15 } from "drizzle-orm";
14973
15170
  init_ids();
14974
15171
  init_database_wrapper();
14975
15172
  init_schema();
@@ -15080,7 +15277,7 @@ var UsersRepository = class {
15080
15277
  * Check if unix_username is already taken by another user
15081
15278
  */
15082
15279
  async isUnixUsernameTaken(unixUsername, excludeUserId) {
15083
- const result = await select(this.db).from(users3).where(eq31(users3.unix_username, unixUsername)).one();
15280
+ const result = await select(this.db).from(users3).where(eq32(users3.unix_username, unixUsername)).one();
15084
15281
  if (!result) {
15085
15282
  return false;
15086
15283
  }
@@ -15103,7 +15300,7 @@ var UsersRepository = class {
15103
15300
  }
15104
15301
  const insertData = this.userToInsert(data);
15105
15302
  await insert(this.db, users3).values(insertData).run();
15106
- const row = await select(this.db).from(users3).where(eq31(users3.user_id, insertData.user_id)).one();
15303
+ const row = await select(this.db).from(users3).where(eq32(users3.user_id, insertData.user_id)).one();
15107
15304
  if (!row) {
15108
15305
  throw new RepositoryError("Failed to retrieve created user");
15109
15306
  }
@@ -15115,7 +15312,7 @@ var UsersRepository = class {
15115
15312
  async findById(id) {
15116
15313
  try {
15117
15314
  const fullId = await this.resolveId(id);
15118
- const result = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
15315
+ const result = await select(this.db).from(users3).where(eq32(users3.user_id, fullId)).one();
15119
15316
  if (!result) {
15120
15317
  return null;
15121
15318
  }
@@ -15131,7 +15328,7 @@ var UsersRepository = class {
15131
15328
  * Find user by email
15132
15329
  */
15133
15330
  async findByEmail(email) {
15134
- const result = await select(this.db).from(users3).where(eq31(users3.email, email)).one();
15331
+ const result = await select(this.db).from(users3).where(eq32(users3.email, email)).one();
15135
15332
  if (!result) {
15136
15333
  return null;
15137
15334
  }
@@ -15202,8 +15399,8 @@ var UsersRepository = class {
15202
15399
  await update(this.db, users3).set({
15203
15400
  ...insertData,
15204
15401
  updated_at: /* @__PURE__ */ new Date()
15205
- }).where(eq31(users3.user_id, fullId)).run();
15206
- const row = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
15402
+ }).where(eq32(users3.user_id, fullId)).run();
15403
+ const row = await select(this.db).from(users3).where(eq32(users3.user_id, fullId)).one();
15207
15404
  if (!row) {
15208
15405
  throw new RepositoryError("Failed to retrieve updated user");
15209
15406
  }
@@ -15214,7 +15411,7 @@ var UsersRepository = class {
15214
15411
  */
15215
15412
  async delete(id) {
15216
15413
  const fullId = await this.resolveId(id);
15217
- await deleteFrom(this.db, users3).where(eq31(users3.user_id, fullId)).run();
15414
+ await deleteFrom(this.db, users3).where(eq32(users3.user_id, fullId)).run();
15218
15415
  }
15219
15416
  /**
15220
15417
  * Get raw database row (internal use only - includes encrypted keys)
@@ -15222,7 +15419,7 @@ var UsersRepository = class {
15222
15419
  async getRawRow(id) {
15223
15420
  try {
15224
15421
  const fullId = await this.resolveId(id);
15225
- const result = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
15422
+ const result = await select(this.db).from(users3).where(eq32(users3.user_id, fullId)).one();
15226
15423
  return result;
15227
15424
  } catch (error) {
15228
15425
  if (error instanceof EntityNotFoundError) {
@@ -15304,7 +15501,7 @@ var UsersRepository = class {
15304
15501
  await update(this.db, users3).set({
15305
15502
  data: { ...row.data, agentic_tools: next },
15306
15503
  updated_at: /* @__PURE__ */ new Date()
15307
- }).where(eq31(users3.user_id, fullId)).run();
15504
+ }).where(eq32(users3.user_id, fullId)).run();
15308
15505
  }
15309
15506
  /**
15310
15507
  * Delete a single credential field for a tool.
@@ -15330,7 +15527,7 @@ var UsersRepository = class {
15330
15527
  await update(this.db, users3).set({
15331
15528
  data: { ...row.data, agentic_tools: next },
15332
15529
  updated_at: /* @__PURE__ */ new Date()
15333
- }).where(eq31(users3.user_id, fullId)).run();
15530
+ }).where(eq32(users3.user_id, fullId)).run();
15334
15531
  }
15335
15532
  };
15336
15533
 
@@ -15442,7 +15639,7 @@ export {
15442
15639
  desc6 as desc,
15443
15640
  encryptApiKey,
15444
15641
  enqueueTenantDatabasePostCommitCallback,
15445
- eq32 as eq,
15642
+ eq33 as eq,
15446
15643
  executeAll,
15447
15644
  executeGet,
15448
15645
  executeRaw,