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
@@ -7195,6 +7195,63 @@ var BranchRepository = class {
7195
7195
  }
7196
7196
  return Array.from(userIds);
7197
7197
  }
7198
+ /**
7199
+ * Find non-archived branches whose explicit filesystem access set can change
7200
+ * when membership in the given group changes.
7201
+ *
7202
+ * Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
7203
+ * both encode which group grants materialize into branch-folder access.
7204
+ * App-only grants (`fs_access = 'none'`) are intentionally excluded because
7205
+ * membership changes for those grants do not require branch-folder mutation.
7206
+ */
7207
+ async findExplicitFsAccessBranchIdsForGroup(groupId) {
7208
+ const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, (0, import_drizzle_orm11.eq)(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
7209
+ groups3,
7210
+ (0, import_drizzle_orm11.and)((0, import_drizzle_orm11.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm11.eq)(groups3.archived, false))
7211
+ ).where(
7212
+ (0, import_drizzle_orm11.and)(
7213
+ (0, import_drizzle_orm11.eq)(branchGroupGrants3.group_id, groupId),
7214
+ (0, import_drizzle_orm11.eq)(branches3.archived, false),
7215
+ (0, import_drizzle_orm11.inArray)(
7216
+ import_drizzle_orm11.sql`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
7217
+ FS_ACCESS_BRANCH_PERMISSIONS
7218
+ )
7219
+ )
7220
+ ).all();
7221
+ const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
7222
+ groups3,
7223
+ (0, import_drizzle_orm11.and)((0, import_drizzle_orm11.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm11.eq)(groups3.archived, false))
7224
+ ).innerJoin(
7225
+ boards3,
7226
+ (0, import_drizzle_orm11.and)(
7227
+ (0, import_drizzle_orm11.eq)(boards3.board_id, boardGroupGrants3.board_id),
7228
+ (0, import_drizzle_orm11.eq)(import_drizzle_orm11.sql`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
7229
+ )
7230
+ ).innerJoin(
7231
+ branches3,
7232
+ (0, import_drizzle_orm11.and)(
7233
+ (0, import_drizzle_orm11.eq)(branches3.board_id, boardGroupGrants3.board_id),
7234
+ (0, import_drizzle_orm11.eq)(branches3.permission_source, "board"),
7235
+ (0, import_drizzle_orm11.eq)(branches3.archived, false)
7236
+ )
7237
+ ).where(
7238
+ (0, import_drizzle_orm11.and)(
7239
+ (0, import_drizzle_orm11.eq)(boardGroupGrants3.group_id, groupId),
7240
+ (0, import_drizzle_orm11.inArray)(
7241
+ import_drizzle_orm11.sql`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
7242
+ FS_ACCESS_BRANCH_PERMISSIONS
7243
+ )
7244
+ )
7245
+ ).all();
7246
+ const branchIds = /* @__PURE__ */ new Set();
7247
+ for (const row of directRows) {
7248
+ branchIds.add(row.branch_id);
7249
+ }
7250
+ for (const row of boardRows) {
7251
+ branchIds.add(row.branch_id);
7252
+ }
7253
+ return Array.from(branchIds);
7254
+ }
7198
7255
  async findBoardAlignedBranches(boardId) {
7199
7256
  const rows = await select(this.db).from(branches3).where(
7200
7257
  (0, import_drizzle_orm11.and)(
@@ -8202,6 +8259,60 @@ var BoardRepository = class {
8202
8259
  );
8203
8260
  }
8204
8261
  }
8262
+ /**
8263
+ * Shallow-merge field patches into existing board objects in a single
8264
+ * read-modify-write.
8265
+ *
8266
+ * Unlike upsertBoardObject (which fully replaces the object value, dropping
8267
+ * omitted fields), this overwrites ONLY the provided keys and leaves the rest
8268
+ * of each object intact — so a narrow change (e.g. a zIndex reorder) has a
8269
+ * smaller blast radius and won't clobber a field edited via a different patch
8270
+ * call. Multiple objects in one call are merged before a single write, so a
8271
+ * forward/backward swap touches both neighbors in one update.
8272
+ *
8273
+ * Objects that no longer exist are SKIPPED, never re-created — so a swap can't
8274
+ * resurrect a neighbor deleted between the client's read and this write.
8275
+ *
8276
+ * Only an explicit allowlist of fields can be merged (currently just `zIndex`,
8277
+ * which is also clamped into the board-object band [1, 499] so it can never be
8278
+ * pushed onto the card (500) / comment (1000) layers). Any other key in a
8279
+ * patch is ignored, so this narrow action cannot reshape an object (e.g. flip
8280
+ * its `type`) the way a full upsert could.
8281
+ *
8282
+ * NOTE: this is NOT atomic against concurrent writers. Like every other board
8283
+ * writer, the findById → update sequence has a lost-update window: a write
8284
+ * that lands between the read and the update can be overwritten (last-write-
8285
+ * wins). Merging only the patched keys narrows that window's blast radius
8286
+ * versus a full-object upsert, but does not close it.
8287
+ */
8288
+ async mergeBoardObjectFields(boardId, patches) {
8289
+ const Z_MIN = 1;
8290
+ const Z_MAX = 499;
8291
+ try {
8292
+ const fullId = await this.resolveId(boardId);
8293
+ const current = await this.findById(fullId);
8294
+ if (!current) {
8295
+ throw new EntityNotFoundError("Board", boardId);
8296
+ }
8297
+ const updatedObjects = { ...current.objects || {} };
8298
+ for (const [objectId, fields] of Object.entries(patches)) {
8299
+ const existing = updatedObjects[objectId];
8300
+ if (!existing) continue;
8301
+ const { zIndex } = fields;
8302
+ if (typeof zIndex !== "number" || !Number.isFinite(zIndex)) continue;
8303
+ const safeZIndex = Math.min(Z_MAX, Math.max(Z_MIN, zIndex));
8304
+ updatedObjects[objectId] = { ...existing, zIndex: safeZIndex };
8305
+ }
8306
+ return this.update(fullId, { objects: updatedObjects });
8307
+ } catch (error) {
8308
+ if (error instanceof RepositoryError) throw error;
8309
+ if (error instanceof EntityNotFoundError) throw error;
8310
+ throw new RepositoryError(
8311
+ `Failed to merge board object fields: ${error instanceof Error ? error.message : String(error)}`,
8312
+ error
8313
+ );
8314
+ }
8315
+ }
8205
8316
  /**
8206
8317
  * DEPRECATED: Delete a zone and handle associated sessions
8207
8318
  * TODO: Reimplement using board-objects table
@@ -8822,12 +8933,72 @@ init_schema();
8822
8933
 
8823
8934
  // src/db/repositories/mcp-servers.ts
8824
8935
  init_cjs_shims();
8825
- var import_drizzle_orm21 = require("drizzle-orm");
8936
+ var import_drizzle_orm23 = require("drizzle-orm");
8826
8937
  init_ids();
8827
8938
 
8828
8939
  // src/tools/mcp/auth-secrets.ts
8829
8940
  init_cjs_shims();
8830
8941
 
8942
+ // src/mcp/template-resolver.ts
8943
+ init_cjs_shims();
8944
+
8945
+ // src/config/env-resolver.ts
8946
+ init_cjs_shims();
8947
+ var import_drizzle_orm22 = require("drizzle-orm");
8948
+ init_database_wrapper();
8949
+
8950
+ // src/db/repositories/session-env-selections.ts
8951
+ init_cjs_shims();
8952
+ var import_drizzle_orm21 = require("drizzle-orm");
8953
+ init_database_wrapper();
8954
+ init_schema();
8955
+
8956
+ // src/config/env-resolver.ts
8957
+ init_schema();
8958
+
8959
+ // src/config/env-blocklist.ts
8960
+ init_cjs_shims();
8961
+ var BLOCKED_ENV_PATTERNS = Object.freeze([
8962
+ /^LD_/i,
8963
+ /^DYLD_/i,
8964
+ /^PYTHON(?!_AGOR_)/i
8965
+ ]);
8966
+
8967
+ // src/config/env-vars.ts
8968
+ init_cjs_shims();
8969
+ var V05_SCOPES = ["global", "session"];
8970
+ var V05_SCOPE_SET = new Set(V05_SCOPES);
8971
+ function normalizeStoredEnvVar(raw) {
8972
+ if (typeof raw === "string") {
8973
+ return { value_encrypted: raw, scope: "global" };
8974
+ }
8975
+ return {
8976
+ value_encrypted: raw.value_encrypted,
8977
+ scope: raw.scope,
8978
+ resource_id: raw.resource_id ?? null,
8979
+ extra_config: raw.extra_config ?? null
8980
+ };
8981
+ }
8982
+ function normalizeStoredEnvMap(raw) {
8983
+ const out = {};
8984
+ if (!raw) return out;
8985
+ for (const [key, value] of Object.entries(raw)) {
8986
+ try {
8987
+ out[key] = normalizeStoredEnvVar(value);
8988
+ } catch (err) {
8989
+ console.warn(`[env-vars] Skipping malformed env var entry ${key}:`, err);
8990
+ }
8991
+ }
8992
+ return out;
8993
+ }
8994
+
8995
+ // src/templates/handlebars-helpers.ts
8996
+ init_cjs_shims();
8997
+ var import_handlebars = __toESM(require("handlebars"), 1);
8998
+
8999
+ // src/mcp/template-patterns.ts
9000
+ init_cjs_shims();
9001
+
8831
9002
  // src/tools/mcp/http-headers.ts
8832
9003
  init_cjs_shims();
8833
9004
 
@@ -8837,7 +9008,7 @@ init_schema();
8837
9008
 
8838
9009
  // src/db/repositories/messages.ts
8839
9010
  init_cjs_shims();
8840
- var import_drizzle_orm22 = require("drizzle-orm");
9011
+ var import_drizzle_orm24 = require("drizzle-orm");
8841
9012
  init_database_wrapper();
8842
9013
  init_schema();
8843
9014
  var MessagesRepository = class {
@@ -8905,7 +9076,7 @@ var MessagesRepository = class {
8905
9076
  * Get message by ID
8906
9077
  */
8907
9078
  async findById(messageId) {
8908
- const row = await select(this.db).from(messages3).where((0, import_drizzle_orm22.eq)(messages3.message_id, messageId)).one();
9079
+ const row = await select(this.db).from(messages3).where((0, import_drizzle_orm24.eq)(messages3.message_id, messageId)).one();
8909
9080
  return row ? this.rowToMessage(row) : null;
8910
9081
  }
8911
9082
  /**
@@ -8914,19 +9085,19 @@ var MessagesRepository = class {
8914
9085
  async findAll(filter) {
8915
9086
  if (filter?.sessionIds !== void 0 && filter.sessionIds.length === 0) return [];
8916
9087
  const conditions = [];
8917
- if (filter?.sessionId) conditions.push((0, import_drizzle_orm22.eq)(messages3.session_id, filter.sessionId));
9088
+ if (filter?.sessionId) conditions.push((0, import_drizzle_orm24.eq)(messages3.session_id, filter.sessionId));
8918
9089
  if (filter?.sessionIds !== void 0)
8919
- conditions.push((0, import_drizzle_orm22.inArray)(messages3.session_id, filter.sessionIds));
8920
- if (filter?.taskId) conditions.push((0, import_drizzle_orm22.eq)(messages3.task_id, filter.taskId));
8921
- if (filter?.type) conditions.push((0, import_drizzle_orm22.eq)(messages3.type, filter.type));
8922
- if (filter?.role) conditions.push((0, import_drizzle_orm22.eq)(messages3.role, filter.role));
9090
+ conditions.push((0, import_drizzle_orm24.inArray)(messages3.session_id, filter.sessionIds));
9091
+ if (filter?.taskId) conditions.push((0, import_drizzle_orm24.eq)(messages3.task_id, filter.taskId));
9092
+ if (filter?.type) conditions.push((0, import_drizzle_orm24.eq)(messages3.type, filter.type));
9093
+ if (filter?.role) conditions.push((0, import_drizzle_orm24.eq)(messages3.role, filter.role));
8923
9094
  if (filter?.visibleToUserId) {
8924
9095
  conditions.push(
8925
9096
  visibleSessionReferenceAccessExists(this.db, filter.visibleToUserId, messages3.session_id)
8926
9097
  );
8927
9098
  }
8928
9099
  let query = select(this.db).from(messages3);
8929
- if (conditions.length > 0) query = query.where((0, import_drizzle_orm22.and)(...conditions));
9100
+ if (conditions.length > 0) query = query.where((0, import_drizzle_orm24.and)(...conditions));
8930
9101
  const rows = await query.orderBy(messages3.index).all();
8931
9102
  return rows.map((r) => this.rowToMessage(r));
8932
9103
  }
@@ -8934,21 +9105,21 @@ var MessagesRepository = class {
8934
9105
  * Get all messages for a session (ordered by index)
8935
9106
  */
8936
9107
  async findBySessionId(sessionId) {
8937
- const rows = await select(this.db).from(messages3).where((0, import_drizzle_orm22.eq)(messages3.session_id, sessionId)).orderBy(messages3.index).all();
9108
+ const rows = await select(this.db).from(messages3).where((0, import_drizzle_orm24.eq)(messages3.session_id, sessionId)).orderBy(messages3.index).all();
8938
9109
  return rows.map((r) => this.rowToMessage(r));
8939
9110
  }
8940
9111
  /**
8941
9112
  * Get all messages for a session filtered by type (ordered by index)
8942
9113
  */
8943
9114
  async findBySessionIdAndType(sessionId, type) {
8944
- const rows = await select(this.db).from(messages3).where((0, import_drizzle_orm22.and)((0, import_drizzle_orm22.eq)(messages3.session_id, sessionId), (0, import_drizzle_orm22.eq)(messages3.type, type))).orderBy(messages3.index).all();
9115
+ const rows = await select(this.db).from(messages3).where((0, import_drizzle_orm24.and)((0, import_drizzle_orm24.eq)(messages3.session_id, sessionId), (0, import_drizzle_orm24.eq)(messages3.type, type))).orderBy(messages3.index).all();
8945
9116
  return rows.map((r) => this.rowToMessage(r));
8946
9117
  }
8947
9118
  /**
8948
9119
  * Get all messages for a task (ordered by index)
8949
9120
  */
8950
9121
  async findByTaskId(taskId) {
8951
- const rows = await select(this.db).from(messages3).where((0, import_drizzle_orm22.eq)(messages3.task_id, taskId)).orderBy(messages3.index).all();
9122
+ const rows = await select(this.db).from(messages3).where((0, import_drizzle_orm24.eq)(messages3.task_id, taskId)).orderBy(messages3.index).all();
8952
9123
  return rows.map((r) => this.rowToMessage(r));
8953
9124
  }
8954
9125
  /**
@@ -8956,7 +9127,7 @@ var MessagesRepository = class {
8956
9127
  * Used for task message_range queries
8957
9128
  */
8958
9129
  async findByRange(sessionId, startIndex, endIndex) {
8959
- const rows = await select(this.db).from(messages3).where((0, import_drizzle_orm22.eq)(messages3.session_id, sessionId)).orderBy(messages3.index).all();
9130
+ const rows = await select(this.db).from(messages3).where((0, import_drizzle_orm24.eq)(messages3.session_id, sessionId)).orderBy(messages3.index).all();
8960
9131
  return rows.filter((r) => r.index >= startIndex && r.index <= endIndex).map((r) => this.rowToMessage(r));
8961
9132
  }
8962
9133
  /**
@@ -8969,33 +9140,33 @@ var MessagesRepository = class {
8969
9140
  }
8970
9141
  const updated = { ...existing, ...updates };
8971
9142
  const row = this.messageToRow(updated);
8972
- const result = await update(this.db, messages3).set(row).where((0, import_drizzle_orm22.eq)(messages3.message_id, messageId)).returning().one();
9143
+ const result = await update(this.db, messages3).set(row).where((0, import_drizzle_orm24.eq)(messages3.message_id, messageId)).returning().one();
8973
9144
  return this.rowToMessage(result);
8974
9145
  }
8975
9146
  /**
8976
9147
  * Update message task assignment
8977
9148
  */
8978
9149
  async assignToTask(messageId, taskId) {
8979
- const updated = await update(this.db, messages3).set({ task_id: taskId }).where((0, import_drizzle_orm22.eq)(messages3.message_id, messageId)).returning().one();
9150
+ const updated = await update(this.db, messages3).set({ task_id: taskId }).where((0, import_drizzle_orm24.eq)(messages3.message_id, messageId)).returning().one();
8980
9151
  return this.rowToMessage(updated);
8981
9152
  }
8982
9153
  /**
8983
9154
  * Delete all messages for a session (cascades automatically via FK)
8984
9155
  */
8985
9156
  async deleteBySessionId(sessionId) {
8986
- await deleteFrom(this.db, messages3).where((0, import_drizzle_orm22.eq)(messages3.session_id, sessionId)).run();
9157
+ await deleteFrom(this.db, messages3).where((0, import_drizzle_orm24.eq)(messages3.session_id, sessionId)).run();
8987
9158
  }
8988
9159
  /**
8989
9160
  * Delete a single message
8990
9161
  */
8991
9162
  async delete(messageId) {
8992
- await deleteFrom(this.db, messages3).where((0, import_drizzle_orm22.eq)(messages3.message_id, messageId)).run();
9163
+ await deleteFrom(this.db, messages3).where((0, import_drizzle_orm24.eq)(messages3.message_id, messageId)).run();
8993
9164
  }
8994
9165
  };
8995
9166
 
8996
9167
  // src/db/repositories/repos.ts
8997
9168
  init_cjs_shims();
8998
- var import_drizzle_orm23 = require("drizzle-orm");
9169
+ var import_drizzle_orm25 = require("drizzle-orm");
8999
9170
 
9000
9171
  // src/config/variant-resolver.ts
9001
9172
  init_cjs_shims();
@@ -9145,7 +9316,7 @@ var RepoRepository = class {
9145
9316
  */
9146
9317
  async resolveId(id) {
9147
9318
  return resolveByShortIdPrefix(id, "Repo", async (pattern) => {
9148
- const rows = await select(this.db).from(repos3).where((0, import_drizzle_orm23.like)(repos3.repo_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
9319
+ const rows = await select(this.db).from(repos3).where((0, import_drizzle_orm25.like)(repos3.repo_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
9149
9320
  return rows.map((r) => r.repo_id);
9150
9321
  });
9151
9322
  }
@@ -9156,7 +9327,7 @@ var RepoRepository = class {
9156
9327
  try {
9157
9328
  const insertData = this.repoToInsert(data);
9158
9329
  await insert(this.db, repos3).values(insertData).run();
9159
- const row = await select(this.db).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, insertData.repo_id)).one();
9330
+ const row = await select(this.db).from(repos3).where((0, import_drizzle_orm25.eq)(repos3.repo_id, insertData.repo_id)).one();
9160
9331
  if (!row) {
9161
9332
  throw new RepositoryError("Failed to retrieve created repo");
9162
9333
  }
@@ -9175,7 +9346,7 @@ var RepoRepository = class {
9175
9346
  async findById(id) {
9176
9347
  try {
9177
9348
  const fullId = await this.resolveId(id);
9178
- const row = await select(this.db).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).one();
9349
+ const row = await select(this.db).from(repos3).where((0, import_drizzle_orm25.eq)(repos3.repo_id, fullId)).one();
9179
9350
  return row ? this.rowToRepo(row) : null;
9180
9351
  } catch (error) {
9181
9352
  if (error instanceof EntityNotFoundError) return null;
@@ -9191,7 +9362,7 @@ var RepoRepository = class {
9191
9362
  */
9192
9363
  async findBySlug(slug) {
9193
9364
  try {
9194
- const row = await select(this.db).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.slug, slug)).one();
9365
+ const row = await select(this.db).from(repos3).where((0, import_drizzle_orm25.eq)(repos3.slug, slug)).one();
9195
9366
  return row ? this.rowToRepo(row) : null;
9196
9367
  } catch (error) {
9197
9368
  throw new RepositoryError(
@@ -9259,8 +9430,8 @@ var RepoRepository = class {
9259
9430
  let changed = 0;
9260
9431
  for (const finding of scan.findings) {
9261
9432
  await this.db.transaction(async (tx) => {
9262
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm23.eq)(repos3.repo_id, finding.repo_id));
9263
- const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, finding.repo_id)).one();
9433
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm25.eq)(repos3.repo_id, finding.repo_id));
9434
+ const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm25.eq)(repos3.repo_id, finding.repo_id)).one();
9264
9435
  if (!currentRow) return;
9265
9436
  const data = currentRow.data;
9266
9437
  if (typeof data.remote_url !== "string" || !httpUrlHasUserinfo(data.remote_url)) {
@@ -9272,7 +9443,7 @@ var RepoRepository = class {
9272
9443
  ...data,
9273
9444
  remote_url: stripHttpUrlUserinfo(data.remote_url)
9274
9445
  }
9275
- }).where((0, import_drizzle_orm23.eq)(repos3.repo_id, finding.repo_id)).run();
9446
+ }).where((0, import_drizzle_orm25.eq)(repos3.repo_id, finding.repo_id)).run();
9276
9447
  changed += 1;
9277
9448
  });
9278
9449
  }
@@ -9294,8 +9465,8 @@ var RepoRepository = class {
9294
9465
  try {
9295
9466
  const fullId = await this.resolveId(id);
9296
9467
  return await this.db.transaction(async (tx) => {
9297
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm23.eq)(repos3.repo_id, fullId));
9298
- const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).one();
9468
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm25.eq)(repos3.repo_id, fullId));
9469
+ const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm25.eq)(repos3.repo_id, fullId)).one();
9299
9470
  if (!currentRow) {
9300
9471
  throw new EntityNotFoundError("Repo", id);
9301
9472
  }
@@ -9309,7 +9480,7 @@ var RepoRepository = class {
9309
9480
  repo_type: insertData.repo_type,
9310
9481
  unix_group: merged.unix_group ?? null,
9311
9482
  data: insertData.data
9312
- }).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).run();
9483
+ }).where((0, import_drizzle_orm25.eq)(repos3.repo_id, fullId)).run();
9313
9484
  merged.clone_error = insertData.data.clone_error;
9314
9485
  merged.remote_url = insertData.data.remote_url;
9315
9486
  merged.last_updated = newUpdatedAt.toISOString();
@@ -9343,8 +9514,8 @@ var RepoRepository = class {
9343
9514
  try {
9344
9515
  const fullId = await this.resolveId(id);
9345
9516
  return await this.db.transaction(async (tx) => {
9346
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm23.eq)(repos3.repo_id, fullId));
9347
- const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).one();
9517
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, (0, import_drizzle_orm25.eq)(repos3.repo_id, fullId));
9518
+ const currentRow = await select(txAsDb(tx)).from(repos3).where((0, import_drizzle_orm25.eq)(repos3.repo_id, fullId)).one();
9348
9519
  if (!currentRow) {
9349
9520
  throw new EntityNotFoundError("Repo", id);
9350
9521
  }
@@ -9358,7 +9529,7 @@ var RepoRepository = class {
9358
9529
  repo_type: insertData.repo_type,
9359
9530
  unix_group: next.unix_group ?? null,
9360
9531
  data: insertData.data
9361
- }).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).run();
9532
+ }).where((0, import_drizzle_orm25.eq)(repos3.repo_id, fullId)).run();
9362
9533
  next.environment = insertData.data.environment;
9363
9534
  next.environment_config = insertData.data.environment_config;
9364
9535
  next.remote_url = insertData.data.remote_url;
@@ -9398,7 +9569,7 @@ var RepoRepository = class {
9398
9569
  async delete(id) {
9399
9570
  try {
9400
9571
  const fullId = await this.resolveId(id);
9401
- const result = await deleteFrom(this.db, repos3).where((0, import_drizzle_orm23.eq)(repos3.repo_id, fullId)).run();
9572
+ const result = await deleteFrom(this.db, repos3).where((0, import_drizzle_orm25.eq)(repos3.repo_id, fullId)).run();
9402
9573
  if (result.rowsAffected === 0) {
9403
9574
  throw new EntityNotFoundError("Repo", id);
9404
9575
  }
@@ -9429,7 +9600,7 @@ var RepoRepository = class {
9429
9600
  */
9430
9601
  async count() {
9431
9602
  try {
9432
- const result = await select(this.db, { count: import_drizzle_orm23.sql`count(*)` }).from(repos3).one();
9603
+ const result = await select(this.db, { count: import_drizzle_orm25.sql`count(*)` }).from(repos3).one();
9433
9604
  return result?.count ?? 0;
9434
9605
  } catch (error) {
9435
9606
  throw new RepositoryError(
@@ -9442,34 +9613,28 @@ var RepoRepository = class {
9442
9613
 
9443
9614
  // src/db/repositories/schedules.ts
9444
9615
  init_cjs_shims();
9445
- var import_drizzle_orm24 = require("drizzle-orm");
9616
+ var import_drizzle_orm26 = require("drizzle-orm");
9446
9617
  init_ids();
9447
9618
  init_database_wrapper();
9448
9619
  init_schema();
9449
9620
 
9450
9621
  // src/db/repositories/serialized-sessions.ts
9451
9622
  init_cjs_shims();
9452
- var import_drizzle_orm25 = require("drizzle-orm");
9623
+ var import_drizzle_orm27 = require("drizzle-orm");
9453
9624
  init_ids();
9454
9625
  init_database_wrapper();
9455
9626
  init_schema();
9456
9627
 
9457
- // src/db/repositories/session-env-selections.ts
9458
- init_cjs_shims();
9459
- var import_drizzle_orm26 = require("drizzle-orm");
9460
- init_database_wrapper();
9461
- init_schema();
9462
-
9463
9628
  // src/db/repositories/session-mcp-servers.ts
9464
9629
  init_cjs_shims();
9465
- var import_drizzle_orm28 = require("drizzle-orm");
9630
+ var import_drizzle_orm29 = require("drizzle-orm");
9466
9631
  init_database_wrapper();
9467
9632
  init_schema();
9468
9633
 
9469
9634
  // src/db/repositories/sessions.ts
9470
9635
  init_cjs_shims();
9471
9636
  init_types();
9472
- var import_drizzle_orm27 = require("drizzle-orm");
9637
+ var import_drizzle_orm28 = require("drizzle-orm");
9473
9638
  init_config_manager();
9474
9639
  init_ids();
9475
9640
  init_database_wrapper();
@@ -9496,40 +9661,43 @@ var SessionRepository = class {
9496
9661
  const sessionId = row.session_id;
9497
9662
  const boardId = branchBoardId ?? null;
9498
9663
  const url = baseUrl && boardId ? getSessionUrl(sessionId, baseUrl) : null;
9499
- return {
9500
- session_id: sessionId,
9501
- status: row.status,
9502
- agentic_tool: row.agentic_tool,
9503
- created_at: new Date(row.created_at).toISOString(),
9504
- last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
9505
- created_by: row.created_by,
9506
- unix_username: row.unix_username || null,
9507
- branch_id: row.branch_id,
9508
- branch_board_id: boardId,
9509
- url,
9510
- ...row.data,
9511
- tasks: row.data.tasks.map((id) => id),
9512
- genealogy: {
9513
- parent_session_id: row.parent_session_id,
9514
- forked_from_session_id: row.forked_from_session_id,
9515
- fork_point_task_id: genealogyData.fork_point_task_id,
9516
- fork_point_message_index: genealogyData.fork_point_message_index,
9517
- spawn_point_task_id: genealogyData.spawn_point_task_id,
9518
- spawn_point_message_index: genealogyData.spawn_point_message_index,
9519
- children: genealogyData.children.map((id) => id)
9664
+ return attachHiddenTenant(
9665
+ {
9666
+ session_id: sessionId,
9667
+ status: row.status,
9668
+ agentic_tool: row.agentic_tool,
9669
+ created_at: new Date(row.created_at).toISOString(),
9670
+ last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
9671
+ created_by: row.created_by,
9672
+ unix_username: row.unix_username || null,
9673
+ branch_id: row.branch_id,
9674
+ branch_board_id: boardId,
9675
+ url,
9676
+ ...row.data,
9677
+ tasks: row.data.tasks.map((id) => id),
9678
+ genealogy: {
9679
+ parent_session_id: row.parent_session_id,
9680
+ forked_from_session_id: row.forked_from_session_id,
9681
+ fork_point_task_id: genealogyData.fork_point_task_id,
9682
+ fork_point_message_index: genealogyData.fork_point_message_index,
9683
+ spawn_point_task_id: genealogyData.spawn_point_task_id,
9684
+ spawn_point_message_index: genealogyData.spawn_point_message_index,
9685
+ children: genealogyData.children.map((id) => id)
9686
+ },
9687
+ permission_config: row.data.permission_config,
9688
+ scheduled_run_at: row.scheduled_run_at ?? void 0,
9689
+ scheduled_from_branch: row.scheduled_from_branch ?? false,
9690
+ schedule_id: row.schedule_id ?? void 0,
9691
+ ready_for_prompt: row.ready_for_prompt ?? false,
9692
+ archived: Boolean(row.archived),
9693
+ // Convert SQLite integer (0/1) to boolean
9694
+ archived_reason: row.archived_reason ?? void 0,
9695
+ current_context_usage: row.data.current_context_usage,
9696
+ context_window_limit: row.data.context_window_limit,
9697
+ last_context_update_at: row.data.last_context_update_at
9520
9698
  },
9521
- permission_config: row.data.permission_config,
9522
- scheduled_run_at: row.scheduled_run_at ?? void 0,
9523
- scheduled_from_branch: row.scheduled_from_branch ?? false,
9524
- schedule_id: row.schedule_id ?? void 0,
9525
- ready_for_prompt: row.ready_for_prompt ?? false,
9526
- archived: Boolean(row.archived),
9527
- // Convert SQLite integer (0/1) to boolean
9528
- archived_reason: row.archived_reason ?? void 0,
9529
- current_context_usage: row.data.current_context_usage,
9530
- context_window_limit: row.data.context_window_limit,
9531
- last_context_update_at: row.data.last_context_update_at
9532
- };
9699
+ row
9700
+ );
9533
9701
  }
9534
9702
  /**
9535
9703
  * Convert Session to database insert format
@@ -9605,7 +9773,7 @@ var SessionRepository = class {
9605
9773
  */
9606
9774
  async resolveId(id) {
9607
9775
  return resolveByShortIdPrefix(id, "Session", async (pattern) => {
9608
- const rows = await select(this.db).from(sessions3).where((0, import_drizzle_orm27.like)(sessions3.session_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
9776
+ const rows = await select(this.db).from(sessions3).where((0, import_drizzle_orm28.like)(sessions3.session_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
9609
9777
  return rows.map((r) => r.session_id);
9610
9778
  });
9611
9779
  }
@@ -9617,7 +9785,7 @@ var SessionRepository = class {
9617
9785
  const insertData = this.sessionToInsert(data);
9618
9786
  await insert(this.db, sessions3).values(insertData).run();
9619
9787
  const baseUrl = await getBaseUrl();
9620
- const result = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm27.eq)(sessions3.session_id, insertData.session_id)).one();
9788
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm28.eq)(sessions3.session_id, insertData.session_id)).one();
9621
9789
  if (!result) {
9622
9790
  throw new RepositoryError("Failed to retrieve created session");
9623
9791
  }
@@ -9642,7 +9810,7 @@ var SessionRepository = class {
9642
9810
  try {
9643
9811
  const fullId = await this.resolveId(id);
9644
9812
  const baseUrl = await getBaseUrl();
9645
- const result = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm27.eq)(sessions3.session_id, fullId)).one();
9813
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm28.eq)(sessions3.session_id, fullId)).one();
9646
9814
  if (!result) {
9647
9815
  return null;
9648
9816
  }
@@ -9665,7 +9833,7 @@ var SessionRepository = class {
9665
9833
  async findBranchIdBySessionId(id) {
9666
9834
  try {
9667
9835
  const fullId = await this.resolveId(id);
9668
- const row = await select(this.db, { branch_id: sessions3.branch_id }).from(sessions3).where((0, import_drizzle_orm27.eq)(sessions3.session_id, fullId)).one();
9836
+ const row = await select(this.db, { branch_id: sessions3.branch_id }).from(sessions3).where((0, import_drizzle_orm28.eq)(sessions3.session_id, fullId)).one();
9669
9837
  return row?.branch_id ?? null;
9670
9838
  } catch (error) {
9671
9839
  if (error instanceof EntityNotFoundError) return null;
@@ -9676,6 +9844,26 @@ var SessionRepository = class {
9676
9844
  );
9677
9845
  }
9678
9846
  }
9847
+ /**
9848
+ * Resolve the owning user id for a session without hydrating the full row.
9849
+ * Used by realtime delivery to offer streaming events to the session
9850
+ * creator's own connections as a fallback, so their open tabs keep updating
9851
+ * even before they subscribe to the per-session stream channel.
9852
+ */
9853
+ async findCreatedByBySessionId(id) {
9854
+ try {
9855
+ const fullId = await this.resolveId(id);
9856
+ const row = await select(this.db, { created_by: sessions3.created_by }).from(sessions3).where((0, import_drizzle_orm28.eq)(sessions3.session_id, fullId)).one();
9857
+ return row?.created_by ?? null;
9858
+ } catch (error) {
9859
+ if (error instanceof EntityNotFoundError) return null;
9860
+ if (error instanceof AmbiguousIdError) throw error;
9861
+ throw new RepositoryError(
9862
+ `Failed to find session owner: ${error instanceof Error ? error.message : String(error)}`,
9863
+ error
9864
+ );
9865
+ }
9866
+ }
9679
9867
  /**
9680
9868
  * Find all sessions
9681
9869
  *
@@ -9688,14 +9876,14 @@ var SessionRepository = class {
9688
9876
  if (filter?.visibleToUserId) {
9689
9877
  conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
9690
9878
  }
9691
- const query = filter?.visibleToUserId ? select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).leftJoin(
9879
+ const query = filter?.visibleToUserId ? select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).leftJoin(
9692
9880
  branchOwners3,
9693
- (0, import_drizzle_orm27.and)(
9694
- (0, import_drizzle_orm27.eq)(branchOwners3.branch_id, branches3.branch_id),
9695
- (0, import_drizzle_orm27.eq)(branchOwners3.user_id, filter.visibleToUserId)
9881
+ (0, import_drizzle_orm28.and)(
9882
+ (0, import_drizzle_orm28.eq)(branchOwners3.branch_id, branches3.branch_id),
9883
+ (0, import_drizzle_orm28.eq)(branchOwners3.user_id, filter.visibleToUserId)
9696
9884
  )
9697
- ) : select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id));
9698
- const results = conditions.length > 0 ? await query.where((0, import_drizzle_orm27.and)(...conditions)).all() : await query.all();
9885
+ ) : select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id));
9886
+ const results = conditions.length > 0 ? await query.where((0, import_drizzle_orm28.and)(...conditions)).all() : await query.all();
9699
9887
  return results.map(
9700
9888
  (result) => {
9701
9889
  const sessionRow = result.sessions;
@@ -9718,7 +9906,7 @@ var SessionRepository = class {
9718
9906
  async findByStatus(status) {
9719
9907
  try {
9720
9908
  const baseUrl = await getBaseUrl();
9721
- const results = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm27.eq)(sessions3.status, status)).all();
9909
+ const results = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm28.eq)(sessions3.status, status)).all();
9722
9910
  return results.map(
9723
9911
  (result) => {
9724
9912
  const sessionRow = result.sessions;
@@ -9746,18 +9934,18 @@ var SessionRepository = class {
9746
9934
  async findByBoard(boardId, filter) {
9747
9935
  try {
9748
9936
  const baseUrl = await getBaseUrl();
9749
- const conditions = [(0, import_drizzle_orm27.eq)(branches3.board_id, boardId)];
9937
+ const conditions = [(0, import_drizzle_orm28.eq)(branches3.board_id, boardId)];
9750
9938
  if (filter?.visibleToUserId) {
9751
9939
  conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
9752
9940
  }
9753
- const query = filter?.visibleToUserId ? select(this.db).from(sessions3).innerJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).leftJoin(
9941
+ const query = filter?.visibleToUserId ? select(this.db).from(sessions3).innerJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).leftJoin(
9754
9942
  branchOwners3,
9755
- (0, import_drizzle_orm27.and)(
9756
- (0, import_drizzle_orm27.eq)(branchOwners3.branch_id, branches3.branch_id),
9757
- (0, import_drizzle_orm27.eq)(branchOwners3.user_id, filter.visibleToUserId)
9943
+ (0, import_drizzle_orm28.and)(
9944
+ (0, import_drizzle_orm28.eq)(branchOwners3.branch_id, branches3.branch_id),
9945
+ (0, import_drizzle_orm28.eq)(branchOwners3.user_id, filter.visibleToUserId)
9758
9946
  )
9759
- ) : select(this.db).from(sessions3).innerJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id));
9760
- const results = await query.where((0, import_drizzle_orm27.and)(...conditions)).all();
9947
+ ) : select(this.db).from(sessions3).innerJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id));
9948
+ const results = await query.where((0, import_drizzle_orm28.and)(...conditions)).all();
9761
9949
  return results.map(
9762
9950
  (result) => {
9763
9951
  const sessionRow = result.sessions;
@@ -9793,38 +9981,38 @@ var SessionRepository = class {
9793
9981
  try {
9794
9982
  const baseUrl = await getBaseUrl();
9795
9983
  const conditions = [];
9796
- if (opts.boardId !== void 0) conditions.push((0, import_drizzle_orm27.eq)(branches3.board_id, opts.boardId));
9797
- if (opts.archived !== void 0) conditions.push((0, import_drizzle_orm27.eq)(sessions3.archived, opts.archived));
9984
+ if (opts.boardId !== void 0) conditions.push((0, import_drizzle_orm28.eq)(branches3.board_id, opts.boardId));
9985
+ if (opts.archived !== void 0) conditions.push((0, import_drizzle_orm28.eq)(sessions3.archived, opts.archived));
9798
9986
  if (opts.visibleToUserId) {
9799
9987
  conditions.push(visibleBranchAccessCondition(this.db, opts.visibleToUserId));
9800
9988
  }
9801
- const whereClause = conditions.length > 0 ? (0, import_drizzle_orm27.and)(...conditions) : void 0;
9802
- let countQuery = select(this.db, { count: import_drizzle_orm27.sql`count(*)` }).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id));
9989
+ const whereClause = conditions.length > 0 ? (0, import_drizzle_orm28.and)(...conditions) : void 0;
9990
+ let countQuery = select(this.db, { count: import_drizzle_orm28.sql`count(*)` }).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id));
9803
9991
  if (opts.visibleToUserId) {
9804
9992
  countQuery = countQuery.leftJoin(
9805
9993
  branchOwners3,
9806
- (0, import_drizzle_orm27.and)(
9807
- (0, import_drizzle_orm27.eq)(branchOwners3.branch_id, branches3.branch_id),
9808
- (0, import_drizzle_orm27.eq)(branchOwners3.user_id, opts.visibleToUserId)
9994
+ (0, import_drizzle_orm28.and)(
9995
+ (0, import_drizzle_orm28.eq)(branchOwners3.branch_id, branches3.branch_id),
9996
+ (0, import_drizzle_orm28.eq)(branchOwners3.user_id, opts.visibleToUserId)
9809
9997
  )
9810
9998
  );
9811
9999
  }
9812
10000
  const countRow = await (whereClause ? countQuery.where(whereClause) : countQuery).one();
9813
10001
  const total = Number(countRow?.count ?? 0);
9814
- let dataQuery = select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id));
10002
+ let dataQuery = select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id));
9815
10003
  if (opts.visibleToUserId) {
9816
10004
  dataQuery = dataQuery.leftJoin(
9817
10005
  branchOwners3,
9818
- (0, import_drizzle_orm27.and)(
9819
- (0, import_drizzle_orm27.eq)(branchOwners3.branch_id, branches3.branch_id),
9820
- (0, import_drizzle_orm27.eq)(branchOwners3.user_id, opts.visibleToUserId)
10006
+ (0, import_drizzle_orm28.and)(
10007
+ (0, import_drizzle_orm28.eq)(branchOwners3.branch_id, branches3.branch_id),
10008
+ (0, import_drizzle_orm28.eq)(branchOwners3.user_id, opts.visibleToUserId)
9821
10009
  )
9822
10010
  );
9823
10011
  }
9824
10012
  if (whereClause) dataQuery = dataQuery.where(whereClause);
9825
10013
  if (opts.sortUpdatedAt !== void 0) {
9826
10014
  dataQuery = dataQuery.orderBy(
9827
- opts.sortUpdatedAt === -1 ? (0, import_drizzle_orm27.desc)(sessions3.updated_at) : sessions3.updated_at
10015
+ opts.sortUpdatedAt === -1 ? (0, import_drizzle_orm28.desc)(sessions3.updated_at) : sessions3.updated_at
9828
10016
  );
9829
10017
  }
9830
10018
  if (opts.limit !== void 0) dataQuery = dataQuery.limit(opts.limit);
@@ -9854,10 +10042,10 @@ var SessionRepository = class {
9854
10042
  const fullId = await this.resolveId(sessionId);
9855
10043
  const baseUrl = await getBaseUrl();
9856
10044
  const { jsonExtract: jsonExtract2 } = await Promise.resolve().then(() => (init_database_wrapper(), database_wrapper_exports));
9857
- const results = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).where(
9858
- (0, import_drizzle_orm27.or)(
9859
- import_drizzle_orm27.sql`${jsonExtract2(this.db, sessions3.data, "genealogy.parent_session_id")} = ${fullId}`,
9860
- import_drizzle_orm27.sql`${jsonExtract2(this.db, sessions3.data, "genealogy.forked_from_session_id")} = ${fullId}`
10045
+ const results = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).where(
10046
+ (0, import_drizzle_orm28.or)(
10047
+ import_drizzle_orm28.sql`${jsonExtract2(this.db, sessions3.data, "genealogy.parent_session_id")} = ${fullId}`,
10048
+ import_drizzle_orm28.sql`${jsonExtract2(this.db, sessions3.data, "genealogy.forked_from_session_id")} = ${fullId}`
9861
10049
  )
9862
10050
  ).all();
9863
10051
  return results.map(
@@ -9923,8 +10111,8 @@ var SessionRepository = class {
9923
10111
  const statusInfo = updates.status ? ` (status: ${updates.status}, ready_for_prompt: ${updates.ready_for_prompt})` : "";
9924
10112
  console.debug(`\u{1F504} [SessionRepo] Updating session ${shortId(fullId)}${statusInfo}`);
9925
10113
  const result = await this.db.transaction(async (tx) => {
9926
- await lockRowForUpdate(txAsDb(tx), this.db, sessions3, (0, import_drizzle_orm27.eq)(sessions3.session_id, fullId));
9927
- const currentResult = await select(txAsDb(tx)).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm27.eq)(sessions3.session_id, fullId)).one();
10114
+ await lockRowForUpdate(txAsDb(tx), this.db, sessions3, (0, import_drizzle_orm28.eq)(sessions3.session_id, fullId));
10115
+ const currentResult = await select(txAsDb(tx)).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm28.eq)(sessions3.session_id, fullId)).one();
9928
10116
  if (!currentResult) {
9929
10117
  throw new EntityNotFoundError("Session", id);
9930
10118
  }
@@ -9937,12 +10125,12 @@ var SessionRepository = class {
9937
10125
  if (shouldRefreshLastUpdated) {
9938
10126
  insertData.updated_at = /* @__PURE__ */ new Date();
9939
10127
  }
9940
- await update(txAsDb(tx), sessions3).set(insertData).where((0, import_drizzle_orm27.eq)(sessions3.session_id, fullId)).run();
10128
+ await update(txAsDb(tx), sessions3).set(insertData).where((0, import_drizzle_orm28.eq)(sessions3.session_id, fullId)).run();
9941
10129
  if (!insertData.updated_at) {
9942
10130
  throw new RepositoryError("Session update did not produce an updated_at timestamp");
9943
10131
  }
9944
10132
  merged.last_updated = insertData.updated_at.toISOString();
9945
- return merged;
10133
+ return attachHiddenTenant(merged, currentRow);
9946
10134
  });
9947
10135
  return result;
9948
10136
  } catch (error) {
@@ -9960,8 +10148,8 @@ var SessionRepository = class {
9960
10148
  async countMessages(sessionId) {
9961
10149
  const fullId = await this.resolveId(sessionId);
9962
10150
  const result = await select(this.db, {
9963
- count: import_drizzle_orm27.sql`count(*)`
9964
- }).from(messages3).where((0, import_drizzle_orm27.eq)(messages3.session_id, fullId)).one();
10151
+ count: import_drizzle_orm28.sql`count(*)`
10152
+ }).from(messages3).where((0, import_drizzle_orm28.eq)(messages3.session_id, fullId)).one();
9965
10153
  return Number(result?.count ?? 0);
9966
10154
  }
9967
10155
  /**
@@ -9970,7 +10158,7 @@ var SessionRepository = class {
9970
10158
  async delete(id) {
9971
10159
  try {
9972
10160
  const fullId = await this.resolveId(id);
9973
- const result = await deleteFrom(this.db, sessions3).where((0, import_drizzle_orm27.eq)(sessions3.session_id, fullId)).run();
10161
+ const result = await deleteFrom(this.db, sessions3).where((0, import_drizzle_orm28.eq)(sessions3.session_id, fullId)).run();
9974
10162
  if (result.rowsAffected === 0) {
9975
10163
  throw new EntityNotFoundError("Session", id);
9976
10164
  }
@@ -9994,7 +10182,7 @@ var SessionRepository = class {
9994
10182
  */
9995
10183
  async count() {
9996
10184
  try {
9997
- const result = await select(this.db, { count: import_drizzle_orm27.sql`count(*)` }).from(sessions3).one();
10185
+ const result = await select(this.db, { count: import_drizzle_orm28.sql`count(*)` }).from(sessions3).one();
9998
10186
  return result?.count ?? 0;
9999
10187
  } catch (error) {
10000
10188
  throw new RepositoryError(
@@ -10017,8 +10205,8 @@ var SessionRepository = class {
10017
10205
  async findScheduleRun(scheduleId, scheduledRunAt) {
10018
10206
  try {
10019
10207
  const baseUrl = await getBaseUrl();
10020
- const result = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).where(
10021
- (0, import_drizzle_orm27.and)((0, import_drizzle_orm27.eq)(sessions3.schedule_id, scheduleId), (0, import_drizzle_orm27.eq)(sessions3.scheduled_run_at, scheduledRunAt))
10208
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).where(
10209
+ (0, import_drizzle_orm28.and)((0, import_drizzle_orm28.eq)(sessions3.schedule_id, scheduleId), (0, import_drizzle_orm28.eq)(sessions3.scheduled_run_at, scheduledRunAt))
10022
10210
  ).one();
10023
10211
  if (!result) return null;
10024
10212
  const r = result;
@@ -10041,9 +10229,9 @@ var SessionRepository = class {
10041
10229
  async findByScheduleId(scheduleId, opts = {}) {
10042
10230
  try {
10043
10231
  const baseUrl = await getBaseUrl();
10044
- let query = select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm27.eq)(sessions3.schedule_id, scheduleId));
10232
+ let query = select(this.db).from(sessions3).leftJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).where((0, import_drizzle_orm28.eq)(sessions3.schedule_id, scheduleId));
10045
10233
  if (opts.orderByScheduledRunAt === "desc") {
10046
- query = query.orderBy((0, import_drizzle_orm27.desc)(sessions3.scheduled_run_at));
10234
+ query = query.orderBy((0, import_drizzle_orm28.desc)(sessions3.scheduled_run_at));
10047
10235
  } else if (opts.orderByScheduledRunAt === "asc") {
10048
10236
  query = query.orderBy(sessions3.scheduled_run_at);
10049
10237
  }
@@ -10068,7 +10256,7 @@ var SessionRepository = class {
10068
10256
  */
10069
10257
  async countByScheduleId(scheduleId) {
10070
10258
  try {
10071
- const result = await select(this.db, { count: import_drizzle_orm27.sql`count(*)` }).from(sessions3).where((0, import_drizzle_orm27.eq)(sessions3.schedule_id, scheduleId)).one();
10259
+ const result = await select(this.db, { count: import_drizzle_orm28.sql`count(*)` }).from(sessions3).where((0, import_drizzle_orm28.eq)(sessions3.schedule_id, scheduleId)).one();
10072
10260
  return Number(result?.count ?? 0);
10073
10261
  } catch (error) {
10074
10262
  throw new RepositoryError(
@@ -10090,7 +10278,7 @@ var SessionRepository = class {
10090
10278
  async existsInBranchWithStatuses(branchId, statuses) {
10091
10279
  if (statuses.length === 0) return false;
10092
10280
  try {
10093
- const row = await select(this.db, { one: import_drizzle_orm27.sql`1` }).from(sessions3).where((0, import_drizzle_orm27.and)((0, import_drizzle_orm27.eq)(sessions3.branch_id, branchId), (0, import_drizzle_orm27.inArray)(sessions3.status, [...statuses]))).limit(1).one();
10281
+ const row = await select(this.db, { one: import_drizzle_orm28.sql`1` }).from(sessions3).where((0, import_drizzle_orm28.and)((0, import_drizzle_orm28.eq)(sessions3.branch_id, branchId), (0, import_drizzle_orm28.inArray)(sessions3.status, [...statuses]))).limit(1).one();
10094
10282
  return row != null;
10095
10283
  } catch (error) {
10096
10284
  throw new RepositoryError(
@@ -10106,7 +10294,7 @@ var SessionRepository = class {
10106
10294
  async existsInScheduleWithStatuses(scheduleId, statuses) {
10107
10295
  if (statuses.length === 0) return false;
10108
10296
  try {
10109
- const row = await select(this.db, { one: import_drizzle_orm27.sql`1` }).from(sessions3).where((0, import_drizzle_orm27.and)((0, import_drizzle_orm27.eq)(sessions3.schedule_id, scheduleId), (0, import_drizzle_orm27.inArray)(sessions3.status, [...statuses]))).limit(1).one();
10297
+ const row = await select(this.db, { one: import_drizzle_orm28.sql`1` }).from(sessions3).where((0, import_drizzle_orm28.and)((0, import_drizzle_orm28.eq)(sessions3.schedule_id, scheduleId), (0, import_drizzle_orm28.inArray)(sessions3.status, [...statuses]))).limit(1).one();
10110
10298
  return row != null;
10111
10299
  } catch (error) {
10112
10300
  throw new RepositoryError(
@@ -10137,10 +10325,10 @@ var SessionRepository = class {
10137
10325
  async findAccessibleSessions(userId, boardId) {
10138
10326
  const baseUrl = await getBaseUrl();
10139
10327
  const accessCondition = visibleBranchAccessCondition(this.db, userId);
10140
- const whereCondition = boardId ? (0, import_drizzle_orm27.and)(accessCondition, (0, import_drizzle_orm27.eq)(branches3.board_id, boardId)) : accessCondition;
10141
- const results = await select(this.db).from(sessions3).innerJoin(branches3, (0, import_drizzle_orm27.eq)(sessions3.branch_id, branches3.branch_id)).leftJoin(
10328
+ const whereCondition = boardId ? (0, import_drizzle_orm28.and)(accessCondition, (0, import_drizzle_orm28.eq)(branches3.board_id, boardId)) : accessCondition;
10329
+ const results = await select(this.db).from(sessions3).innerJoin(branches3, (0, import_drizzle_orm28.eq)(sessions3.branch_id, branches3.branch_id)).leftJoin(
10142
10330
  branchOwners3,
10143
- (0, import_drizzle_orm27.and)((0, import_drizzle_orm27.eq)(branchOwners3.branch_id, branches3.branch_id), (0, import_drizzle_orm27.eq)(branchOwners3.user_id, userId))
10331
+ (0, import_drizzle_orm28.and)((0, import_drizzle_orm28.eq)(branchOwners3.branch_id, branches3.branch_id), (0, import_drizzle_orm28.eq)(branchOwners3.user_id, userId))
10144
10332
  ).where(whereCondition).all();
10145
10333
  const seen = /* @__PURE__ */ new Set();
10146
10334
  const sessionsOut = [];
@@ -10183,8 +10371,8 @@ var SessionRepository = class {
10183
10371
  for (const sessionId of sessionIds) {
10184
10372
  const query = select(this.db, {
10185
10373
  data: messagesTable.data
10186
- }).from(messagesTable).where((0, import_drizzle_orm27.and)((0, import_drizzle_orm27.eq)(messagesTable.session_id, sessionId), (0, import_drizzle_orm27.eq)(messagesTable.role, "assistant")));
10187
- const lastMessage = await query.orderBy((0, import_drizzle_orm27.desc)(messagesTable.index)).limit(1).one();
10374
+ }).from(messagesTable).where((0, import_drizzle_orm28.and)((0, import_drizzle_orm28.eq)(messagesTable.session_id, sessionId), (0, import_drizzle_orm28.eq)(messagesTable.role, "assistant")));
10375
+ const lastMessage = await query.orderBy((0, import_drizzle_orm28.desc)(messagesTable.index)).limit(1).one();
10188
10376
  if (lastMessage) {
10189
10377
  const messageData = lastMessage.data;
10190
10378
  let fullText = "";
@@ -10218,7 +10406,7 @@ var SessionRepository = class {
10218
10406
  */
10219
10407
  async exists(sessionId) {
10220
10408
  try {
10221
- const row = await select(this.db).from(sessions3).where((0, import_drizzle_orm27.eq)(sessions3.session_id, sessionId)).one();
10409
+ const row = await select(this.db).from(sessions3).where((0, import_drizzle_orm28.eq)(sessions3.session_id, sessionId)).one();
10222
10410
  return row != null;
10223
10411
  } catch (error) {
10224
10412
  throw new RepositoryError(
@@ -10231,7 +10419,7 @@ var SessionRepository = class {
10231
10419
 
10232
10420
  // src/db/repositories/session-relationships.ts
10233
10421
  init_cjs_shims();
10234
- var import_drizzle_orm29 = require("drizzle-orm");
10422
+ var import_drizzle_orm30 = require("drizzle-orm");
10235
10423
  init_ids();
10236
10424
  init_database_wrapper();
10237
10425
  init_schema();
@@ -10239,7 +10427,7 @@ init_schema();
10239
10427
  // src/db/repositories/tasks.ts
10240
10428
  init_cjs_shims();
10241
10429
  init_types();
10242
- var import_drizzle_orm30 = require("drizzle-orm");
10430
+ var import_drizzle_orm31 = require("drizzle-orm");
10243
10431
  init_ids();
10244
10432
  init_database_wrapper();
10245
10433
  init_schema();
@@ -10327,7 +10515,7 @@ var TaskRepository = class {
10327
10515
  */
10328
10516
  async resolveId(id) {
10329
10517
  return resolveByShortIdPrefix(id, "Task", async (pattern) => {
10330
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm30.like)(tasks3.task_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
10518
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm31.like)(tasks3.task_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
10331
10519
  return rows.map((r) => r.task_id);
10332
10520
  });
10333
10521
  }
@@ -10338,7 +10526,7 @@ var TaskRepository = class {
10338
10526
  try {
10339
10527
  const insertData = this.taskToInsert(data);
10340
10528
  await insert(this.db, tasks3).values(insertData).run();
10341
- const row = await select(this.db).from(tasks3).where((0, import_drizzle_orm30.eq)(tasks3.task_id, insertData.task_id)).one();
10529
+ const row = await select(this.db).from(tasks3).where((0, import_drizzle_orm31.eq)(tasks3.task_id, insertData.task_id)).one();
10342
10530
  if (!row) {
10343
10531
  throw new RepositoryError("Failed to retrieve created task");
10344
10532
  }
@@ -10362,7 +10550,7 @@ var TaskRepository = class {
10362
10550
  const inserts = taskList.map((task) => this.taskToInsert(task));
10363
10551
  await insert(this.db, tasks3).values(inserts).run();
10364
10552
  const taskIds = inserts.map((t3) => t3.task_id);
10365
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm30.inArray)(tasks3.task_id, taskIds)).all();
10553
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm31.inArray)(tasks3.task_id, taskIds)).all();
10366
10554
  const rowsById = new Map(rows.map((r) => [r.task_id, r]));
10367
10555
  return taskIds.map((id) => this.rowToTask(rowsById.get(id)));
10368
10556
  } catch (error) {
@@ -10378,7 +10566,7 @@ var TaskRepository = class {
10378
10566
  async findById(id) {
10379
10567
  try {
10380
10568
  const fullId = await this.resolveId(id);
10381
- const row = await select(this.db).from(tasks3).where((0, import_drizzle_orm30.eq)(tasks3.task_id, fullId)).one();
10569
+ const row = await select(this.db).from(tasks3).where((0, import_drizzle_orm31.eq)(tasks3.task_id, fullId)).one();
10382
10570
  return row ? this.rowToTask(row) : null;
10383
10571
  } catch (error) {
10384
10572
  if (error instanceof EntityNotFoundError) return null;
@@ -10396,17 +10584,17 @@ var TaskRepository = class {
10396
10584
  try {
10397
10585
  if (filter?.sessionIds !== void 0 && filter.sessionIds.length === 0) return [];
10398
10586
  const conditions = [];
10399
- if (filter?.sessionId) conditions.push((0, import_drizzle_orm30.eq)(tasks3.session_id, filter.sessionId));
10587
+ if (filter?.sessionId) conditions.push((0, import_drizzle_orm31.eq)(tasks3.session_id, filter.sessionId));
10400
10588
  if (filter?.sessionIds !== void 0)
10401
- conditions.push((0, import_drizzle_orm30.inArray)(tasks3.session_id, filter.sessionIds));
10402
- if (filter?.status) conditions.push((0, import_drizzle_orm30.eq)(tasks3.status, filter.status));
10589
+ conditions.push((0, import_drizzle_orm31.inArray)(tasks3.session_id, filter.sessionIds));
10590
+ if (filter?.status) conditions.push((0, import_drizzle_orm31.eq)(tasks3.status, filter.status));
10403
10591
  if (filter?.visibleToUserId) {
10404
10592
  conditions.push(
10405
10593
  visibleSessionReferenceAccessExists(this.db, filter.visibleToUserId, tasks3.session_id)
10406
10594
  );
10407
10595
  }
10408
10596
  const query = select(this.db).from(tasks3);
10409
- const rows = conditions.length > 0 ? await query.where((0, import_drizzle_orm30.and)(...conditions)).all() : await query.all();
10597
+ const rows = conditions.length > 0 ? await query.where((0, import_drizzle_orm31.and)(...conditions)).all() : await query.all();
10410
10598
  return rows.map((row) => this.rowToTask(row));
10411
10599
  } catch (error) {
10412
10600
  throw new RepositoryError(
@@ -10420,7 +10608,7 @@ var TaskRepository = class {
10420
10608
  */
10421
10609
  async findBySession(sessionId) {
10422
10610
  try {
10423
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm30.eq)(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
10611
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm31.eq)(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
10424
10612
  return rows.map((row) => this.rowToTask(row));
10425
10613
  } catch (error) {
10426
10614
  throw new RepositoryError(
@@ -10434,7 +10622,7 @@ var TaskRepository = class {
10434
10622
  */
10435
10623
  async findRunning() {
10436
10624
  try {
10437
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm30.eq)(tasks3.status, TaskStatus.RUNNING)).all();
10625
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm31.eq)(tasks3.status, TaskStatus.RUNNING)).all();
10438
10626
  return rows.map((row) => this.rowToTask(row));
10439
10627
  } catch (error) {
10440
10628
  throw new RepositoryError(
@@ -10455,7 +10643,7 @@ var TaskRepository = class {
10455
10643
  async findOrphaned() {
10456
10644
  try {
10457
10645
  const rows = await select(this.db).from(tasks3).where(
10458
- import_drizzle_orm30.sql`${tasks3.status} IN ('running', 'stopping', 'awaiting_permission', 'awaiting_input')`
10646
+ import_drizzle_orm31.sql`${tasks3.status} IN ('running', 'stopping', 'awaiting_permission', 'awaiting_input')`
10459
10647
  ).all();
10460
10648
  return rows.map((row) => this.rowToTask(row));
10461
10649
  } catch (error) {
@@ -10475,7 +10663,7 @@ var TaskRepository = class {
10475
10663
  async findActiveWithExecutorHeartbeat() {
10476
10664
  try {
10477
10665
  const rows = await select(this.db).from(tasks3).where(
10478
- import_drizzle_orm30.sql`${tasks3.status} IN ('running', 'stopping', 'awaiting_permission', 'awaiting_input') AND ${tasks3.last_executor_heartbeat_at} IS NOT NULL`
10666
+ import_drizzle_orm31.sql`${tasks3.status} IN ('running', 'stopping', 'awaiting_permission', 'awaiting_input') AND ${tasks3.last_executor_heartbeat_at} IS NOT NULL`
10479
10667
  ).all();
10480
10668
  return rows.map((row) => this.rowToTask(row));
10481
10669
  } catch (error) {
@@ -10490,7 +10678,7 @@ var TaskRepository = class {
10490
10678
  */
10491
10679
  async findByStatus(status) {
10492
10680
  try {
10493
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm30.eq)(tasks3.status, status)).all();
10681
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm31.eq)(tasks3.status, status)).all();
10494
10682
  return rows.map((row) => this.rowToTask(row));
10495
10683
  } catch (error) {
10496
10684
  throw new RepositoryError(
@@ -10512,8 +10700,8 @@ var TaskRepository = class {
10512
10700
  `\u{1F504} [TaskRepo] Updating task ${shortId(fullId)}${updates.status ? ` (status: ${updates.status})` : ""}`
10513
10701
  );
10514
10702
  const result = await this.db.transaction(async (tx) => {
10515
- await lockRowForUpdate(txAsDb(tx), this.db, tasks3, (0, import_drizzle_orm30.eq)(tasks3.task_id, fullId));
10516
- const currentRow = await select(txAsDb(tx)).from(tasks3).where((0, import_drizzle_orm30.eq)(tasks3.task_id, fullId)).one();
10703
+ await lockRowForUpdate(txAsDb(tx), this.db, tasks3, (0, import_drizzle_orm31.eq)(tasks3.task_id, fullId));
10704
+ const currentRow = await select(txAsDb(tx)).from(tasks3).where((0, import_drizzle_orm31.eq)(tasks3.task_id, fullId)).one();
10517
10705
  if (!currentRow) {
10518
10706
  throw new EntityNotFoundError("Task", id);
10519
10707
  }
@@ -10527,7 +10715,7 @@ var TaskRepository = class {
10527
10715
  last_executor_heartbeat_at: insertData.last_executor_heartbeat_at,
10528
10716
  session_md5: insertData.session_md5,
10529
10717
  data: insertData.data
10530
- }).where((0, import_drizzle_orm30.eq)(tasks3.task_id, fullId)).run();
10718
+ }).where((0, import_drizzle_orm31.eq)(tasks3.task_id, fullId)).run();
10531
10719
  return merged;
10532
10720
  });
10533
10721
  return result;
@@ -10546,7 +10734,7 @@ var TaskRepository = class {
10546
10734
  async delete(id) {
10547
10735
  try {
10548
10736
  const fullId = await this.resolveId(id);
10549
- const result = await deleteFrom(this.db, tasks3).where((0, import_drizzle_orm30.eq)(tasks3.task_id, fullId)).run();
10737
+ const result = await deleteFrom(this.db, tasks3).where((0, import_drizzle_orm31.eq)(tasks3.task_id, fullId)).run();
10550
10738
  if (result.rowsAffected === 0) {
10551
10739
  throw new EntityNotFoundError("Task", id);
10552
10740
  }
@@ -10600,15 +10788,15 @@ var TaskRepository = class {
10600
10788
  }
10601
10789
  return this.db.transaction(async (tx) => {
10602
10790
  const positionRow = await select(txAsDb(tx), {
10603
- maxPos: import_drizzle_orm30.sql`max(${tasks3.queue_position})`
10604
- }).from(tasks3).where(import_drizzle_orm30.sql`${tasks3.session_id} = ${input.session_id} AND ${tasks3.status} = 'queued'`).one();
10791
+ maxPos: import_drizzle_orm31.sql`max(${tasks3.queue_position})`
10792
+ }).from(tasks3).where(import_drizzle_orm31.sql`${tasks3.session_id} = ${input.session_id} AND ${tasks3.status} = 'queued'`).one();
10605
10793
  const nextPosition = (positionRow?.maxPos ?? 0) + 1;
10606
10794
  const insertData = this.taskToInsert({
10607
10795
  ...taskBase,
10608
10796
  queue_position: nextPosition
10609
10797
  });
10610
10798
  await insert(txAsDb(tx), tasks3).values(insertData).run();
10611
- const row = await select(txAsDb(tx)).from(tasks3).where((0, import_drizzle_orm30.eq)(tasks3.task_id, insertData.task_id)).one();
10799
+ const row = await select(txAsDb(tx)).from(tasks3).where((0, import_drizzle_orm31.eq)(tasks3.task_id, insertData.task_id)).one();
10612
10800
  if (!row) {
10613
10801
  throw new RepositoryError("Failed to retrieve created queued task");
10614
10802
  }
@@ -10620,7 +10808,7 @@ var TaskRepository = class {
10620
10808
  */
10621
10809
  async findQueued(sessionId) {
10622
10810
  try {
10623
- const rows = await select(this.db).from(tasks3).where(import_drizzle_orm30.sql`${tasks3.session_id} = ${sessionId} AND ${tasks3.status} = 'queued'`).orderBy(tasks3.queue_position).all();
10811
+ const rows = await select(this.db).from(tasks3).where(import_drizzle_orm31.sql`${tasks3.session_id} = ${sessionId} AND ${tasks3.status} = 'queued'`).orderBy(tasks3.queue_position).all();
10624
10812
  return rows.map((row) => this.rowToTask(row));
10625
10813
  } catch (error) {
10626
10814
  throw new RepositoryError(
@@ -10635,7 +10823,7 @@ var TaskRepository = class {
10635
10823
  */
10636
10824
  async getNextQueued(sessionId) {
10637
10825
  try {
10638
- const row = await select(this.db).from(tasks3).where(import_drizzle_orm30.sql`${tasks3.session_id} = ${sessionId} AND ${tasks3.status} = 'queued'`).orderBy(tasks3.queue_position).limit(1).one();
10826
+ const row = await select(this.db).from(tasks3).where(import_drizzle_orm31.sql`${tasks3.session_id} = ${sessionId} AND ${tasks3.status} = 'queued'`).orderBy(tasks3.queue_position).limit(1).one();
10639
10827
  return row ? this.rowToTask(row) : null;
10640
10828
  } catch (error) {
10641
10829
  throw new RepositoryError(
@@ -10649,7 +10837,7 @@ var TaskRepository = class {
10649
10837
  */
10650
10838
  async countBySession(sessionId) {
10651
10839
  try {
10652
- const result = await select(this.db, { count: import_drizzle_orm30.sql`count(*)` }).from(tasks3).where((0, import_drizzle_orm30.eq)(tasks3.session_id, sessionId)).one();
10840
+ const result = await select(this.db, { count: import_drizzle_orm31.sql`count(*)` }).from(tasks3).where((0, import_drizzle_orm31.eq)(tasks3.session_id, sessionId)).one();
10653
10841
  return result?.count ?? 0;
10654
10842
  } catch (error) {
10655
10843
  throw new RepositoryError(
@@ -10663,7 +10851,7 @@ var TaskRepository = class {
10663
10851
  // src/db/repositories/thread-session-map.ts
10664
10852
  init_cjs_shims();
10665
10853
  init_types();
10666
- var import_drizzle_orm31 = require("drizzle-orm");
10854
+ var import_drizzle_orm32 = require("drizzle-orm");
10667
10855
  init_ids();
10668
10856
  init_database_wrapper();
10669
10857
  init_schema();
@@ -10672,7 +10860,7 @@ init_schema();
10672
10860
  init_cjs_shims();
10673
10861
  var import_node_crypto5 = require("crypto");
10674
10862
  var import_bcryptjs2 = __toESM(require("bcryptjs"), 1);
10675
- var import_drizzle_orm32 = require("drizzle-orm");
10863
+ var import_drizzle_orm33 = require("drizzle-orm");
10676
10864
  init_ids();
10677
10865
  init_database_wrapper();
10678
10866
  init_schema();
@@ -10680,44 +10868,14 @@ init_tenant_context();
10680
10868
 
10681
10869
  // src/db/repositories/user-mcp-oauth-tokens.ts
10682
10870
  init_cjs_shims();
10683
- var import_drizzle_orm33 = require("drizzle-orm");
10871
+ var import_drizzle_orm34 = require("drizzle-orm");
10684
10872
  init_database_wrapper();
10685
10873
  init_schema();
10686
10874
 
10687
10875
  // src/db/repositories/users.ts
10688
10876
  init_cjs_shims();
10689
10877
  init_types();
10690
- var import_drizzle_orm34 = require("drizzle-orm");
10691
-
10692
- // src/config/env-vars.ts
10693
- init_cjs_shims();
10694
- var V05_SCOPES = ["global", "session"];
10695
- var V05_SCOPE_SET = new Set(V05_SCOPES);
10696
- function normalizeStoredEnvVar(raw) {
10697
- if (typeof raw === "string") {
10698
- return { value_encrypted: raw, scope: "global" };
10699
- }
10700
- return {
10701
- value_encrypted: raw.value_encrypted,
10702
- scope: raw.scope,
10703
- resource_id: raw.resource_id ?? null,
10704
- extra_config: raw.extra_config ?? null
10705
- };
10706
- }
10707
- function normalizeStoredEnvMap(raw) {
10708
- const out = {};
10709
- if (!raw) return out;
10710
- for (const [key, value] of Object.entries(raw)) {
10711
- try {
10712
- out[key] = normalizeStoredEnvVar(value);
10713
- } catch (err) {
10714
- console.warn(`[env-vars] Skipping malformed env var entry ${key}:`, err);
10715
- }
10716
- }
10717
- return out;
10718
- }
10719
-
10720
- // src/db/repositories/users.ts
10878
+ var import_drizzle_orm35 = require("drizzle-orm");
10721
10879
  init_ids();
10722
10880
  init_database_wrapper();
10723
10881
  init_schema();
@@ -10820,7 +10978,7 @@ var UsersRepository = class {
10820
10978
  */
10821
10979
  async resolveId(id) {
10822
10980
  return resolveByShortIdPrefix(id, "User", async (pattern) => {
10823
- const rows = await select(this.db).from(users3).where((0, import_drizzle_orm34.like)(users3.user_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
10981
+ const rows = await select(this.db).from(users3).where((0, import_drizzle_orm35.like)(users3.user_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
10824
10982
  return rows.map((r) => r.user_id);
10825
10983
  });
10826
10984
  }
@@ -10828,7 +10986,7 @@ var UsersRepository = class {
10828
10986
  * Check if unix_username is already taken by another user
10829
10987
  */
10830
10988
  async isUnixUsernameTaken(unixUsername, excludeUserId) {
10831
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.unix_username, unixUsername)).one();
10989
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm35.eq)(users3.unix_username, unixUsername)).one();
10832
10990
  if (!result) {
10833
10991
  return false;
10834
10992
  }
@@ -10851,7 +11009,7 @@ var UsersRepository = class {
10851
11009
  }
10852
11010
  const insertData = this.userToInsert(data);
10853
11011
  await insert(this.db, users3).values(insertData).run();
10854
- const row = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.user_id, insertData.user_id)).one();
11012
+ const row = await select(this.db).from(users3).where((0, import_drizzle_orm35.eq)(users3.user_id, insertData.user_id)).one();
10855
11013
  if (!row) {
10856
11014
  throw new RepositoryError("Failed to retrieve created user");
10857
11015
  }
@@ -10863,7 +11021,7 @@ var UsersRepository = class {
10863
11021
  async findById(id) {
10864
11022
  try {
10865
11023
  const fullId = await this.resolveId(id);
10866
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).one();
11024
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm35.eq)(users3.user_id, fullId)).one();
10867
11025
  if (!result) {
10868
11026
  return null;
10869
11027
  }
@@ -10879,7 +11037,7 @@ var UsersRepository = class {
10879
11037
  * Find user by email
10880
11038
  */
10881
11039
  async findByEmail(email) {
10882
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.email, email)).one();
11040
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm35.eq)(users3.email, email)).one();
10883
11041
  if (!result) {
10884
11042
  return null;
10885
11043
  }
@@ -10900,7 +11058,7 @@ var UsersRepository = class {
10900
11058
  if (!normalizedEmail) return null;
10901
11059
  const exact = await this.findByEmail(normalizedEmail);
10902
11060
  if (exact) return exact;
10903
- const results = await select(this.db).from(users3).where(import_drizzle_orm34.sql`LOWER(${users3.email}) = ${normalizedEmail}`).all();
11061
+ const results = await select(this.db).from(users3).where(import_drizzle_orm35.sql`LOWER(${users3.email}) = ${normalizedEmail}`).all();
10904
11062
  if (results.length !== 1) {
10905
11063
  if (results.length > 1) {
10906
11064
  console.warn(
@@ -10950,8 +11108,8 @@ var UsersRepository = class {
10950
11108
  await update(this.db, users3).set({
10951
11109
  ...insertData,
10952
11110
  updated_at: /* @__PURE__ */ new Date()
10953
- }).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).run();
10954
- const row = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).one();
11111
+ }).where((0, import_drizzle_orm35.eq)(users3.user_id, fullId)).run();
11112
+ const row = await select(this.db).from(users3).where((0, import_drizzle_orm35.eq)(users3.user_id, fullId)).one();
10955
11113
  if (!row) {
10956
11114
  throw new RepositoryError("Failed to retrieve updated user");
10957
11115
  }
@@ -10962,7 +11120,7 @@ var UsersRepository = class {
10962
11120
  */
10963
11121
  async delete(id) {
10964
11122
  const fullId = await this.resolveId(id);
10965
- await deleteFrom(this.db, users3).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).run();
11123
+ await deleteFrom(this.db, users3).where((0, import_drizzle_orm35.eq)(users3.user_id, fullId)).run();
10966
11124
  }
10967
11125
  /**
10968
11126
  * Get raw database row (internal use only - includes encrypted keys)
@@ -10970,7 +11128,7 @@ var UsersRepository = class {
10970
11128
  async getRawRow(id) {
10971
11129
  try {
10972
11130
  const fullId = await this.resolveId(id);
10973
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).one();
11131
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm35.eq)(users3.user_id, fullId)).one();
10974
11132
  return result;
10975
11133
  } catch (error) {
10976
11134
  if (error instanceof EntityNotFoundError) {
@@ -11052,7 +11210,7 @@ var UsersRepository = class {
11052
11210
  await update(this.db, users3).set({
11053
11211
  data: { ...row.data, agentic_tools: next },
11054
11212
  updated_at: /* @__PURE__ */ new Date()
11055
- }).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).run();
11213
+ }).where((0, import_drizzle_orm35.eq)(users3.user_id, fullId)).run();
11056
11214
  }
11057
11215
  /**
11058
11216
  * Delete a single credential field for a tool.
@@ -11078,7 +11236,7 @@ var UsersRepository = class {
11078
11236
  await update(this.db, users3).set({
11079
11237
  data: { ...row.data, agentic_tools: next },
11080
11238
  updated_at: /* @__PURE__ */ new Date()
11081
- }).where((0, import_drizzle_orm34.eq)(users3.user_id, fullId)).run();
11239
+ }).where((0, import_drizzle_orm35.eq)(users3.user_id, fullId)).run();
11082
11240
  }
11083
11241
  };
11084
11242
 
@@ -11794,23 +11952,9 @@ var import_node_fs2 = __toESM(require("fs"), 1);
11794
11952
  init_config_manager();
11795
11953
  init_constants();
11796
11954
 
11797
- // src/config/env-blocklist.ts
11798
- init_cjs_shims();
11799
- var BLOCKED_ENV_PATTERNS = Object.freeze([
11800
- /^LD_/i,
11801
- /^DYLD_/i,
11802
- /^PYTHON(?!_AGOR_)/i
11803
- ]);
11804
-
11805
11955
  // src/config/env-locking.ts
11806
11956
  init_cjs_shims();
11807
11957
 
11808
- // src/config/env-resolver.ts
11809
- init_cjs_shims();
11810
- var import_drizzle_orm35 = require("drizzle-orm");
11811
- init_database_wrapper();
11812
- init_schema();
11813
-
11814
11958
  // src/config/env-validation.ts
11815
11959
  init_cjs_shims();
11816
11960
  var ENV_VAR_CONSTRAINTS = {