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
@@ -7191,6 +7191,63 @@ var BranchRepository = class {
7191
7191
  }
7192
7192
  return Array.from(userIds);
7193
7193
  }
7194
+ /**
7195
+ * Find non-archived branches whose explicit filesystem access set can change
7196
+ * when membership in the given group changes.
7197
+ *
7198
+ * Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
7199
+ * both encode which group grants materialize into branch-folder access.
7200
+ * App-only grants (`fs_access = 'none'`) are intentionally excluded because
7201
+ * membership changes for those grants do not require branch-folder mutation.
7202
+ */
7203
+ async findExplicitFsAccessBranchIdsForGroup(groupId) {
7204
+ const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, eq8(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
7205
+ groups3,
7206
+ and8(eq8(groups3.group_id, branchGroupGrants3.group_id), eq8(groups3.archived, false))
7207
+ ).where(
7208
+ and8(
7209
+ eq8(branchGroupGrants3.group_id, groupId),
7210
+ eq8(branches3.archived, false),
7211
+ inArray3(
7212
+ sql7`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
7213
+ FS_ACCESS_BRANCH_PERMISSIONS
7214
+ )
7215
+ )
7216
+ ).all();
7217
+ const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
7218
+ groups3,
7219
+ and8(eq8(groups3.group_id, boardGroupGrants3.group_id), eq8(groups3.archived, false))
7220
+ ).innerJoin(
7221
+ boards3,
7222
+ and8(
7223
+ eq8(boards3.board_id, boardGroupGrants3.board_id),
7224
+ eq8(sql7`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
7225
+ )
7226
+ ).innerJoin(
7227
+ branches3,
7228
+ and8(
7229
+ eq8(branches3.board_id, boardGroupGrants3.board_id),
7230
+ eq8(branches3.permission_source, "board"),
7231
+ eq8(branches3.archived, false)
7232
+ )
7233
+ ).where(
7234
+ and8(
7235
+ eq8(boardGroupGrants3.group_id, groupId),
7236
+ inArray3(
7237
+ sql7`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
7238
+ FS_ACCESS_BRANCH_PERMISSIONS
7239
+ )
7240
+ )
7241
+ ).all();
7242
+ const branchIds = /* @__PURE__ */ new Set();
7243
+ for (const row of directRows) {
7244
+ branchIds.add(row.branch_id);
7245
+ }
7246
+ for (const row of boardRows) {
7247
+ branchIds.add(row.branch_id);
7248
+ }
7249
+ return Array.from(branchIds);
7250
+ }
7194
7251
  async findBoardAlignedBranches(boardId) {
7195
7252
  const rows = await select(this.db).from(branches3).where(
7196
7253
  and8(
@@ -8198,6 +8255,60 @@ var BoardRepository = class {
8198
8255
  );
8199
8256
  }
8200
8257
  }
8258
+ /**
8259
+ * Shallow-merge field patches into existing board objects in a single
8260
+ * read-modify-write.
8261
+ *
8262
+ * Unlike upsertBoardObject (which fully replaces the object value, dropping
8263
+ * omitted fields), this overwrites ONLY the provided keys and leaves the rest
8264
+ * of each object intact — so a narrow change (e.g. a zIndex reorder) has a
8265
+ * smaller blast radius and won't clobber a field edited via a different patch
8266
+ * call. Multiple objects in one call are merged before a single write, so a
8267
+ * forward/backward swap touches both neighbors in one update.
8268
+ *
8269
+ * Objects that no longer exist are SKIPPED, never re-created — so a swap can't
8270
+ * resurrect a neighbor deleted between the client's read and this write.
8271
+ *
8272
+ * Only an explicit allowlist of fields can be merged (currently just `zIndex`,
8273
+ * which is also clamped into the board-object band [1, 499] so it can never be
8274
+ * pushed onto the card (500) / comment (1000) layers). Any other key in a
8275
+ * patch is ignored, so this narrow action cannot reshape an object (e.g. flip
8276
+ * its `type`) the way a full upsert could.
8277
+ *
8278
+ * NOTE: this is NOT atomic against concurrent writers. Like every other board
8279
+ * writer, the findById → update sequence has a lost-update window: a write
8280
+ * that lands between the read and the update can be overwritten (last-write-
8281
+ * wins). Merging only the patched keys narrows that window's blast radius
8282
+ * versus a full-object upsert, but does not close it.
8283
+ */
8284
+ async mergeBoardObjectFields(boardId, patches) {
8285
+ const Z_MIN = 1;
8286
+ const Z_MAX = 499;
8287
+ try {
8288
+ const fullId = await this.resolveId(boardId);
8289
+ const current = await this.findById(fullId);
8290
+ if (!current) {
8291
+ throw new EntityNotFoundError("Board", boardId);
8292
+ }
8293
+ const updatedObjects = { ...current.objects || {} };
8294
+ for (const [objectId, fields] of Object.entries(patches)) {
8295
+ const existing = updatedObjects[objectId];
8296
+ if (!existing) continue;
8297
+ const { zIndex } = fields;
8298
+ if (typeof zIndex !== "number" || !Number.isFinite(zIndex)) continue;
8299
+ const safeZIndex = Math.min(Z_MAX, Math.max(Z_MIN, zIndex));
8300
+ updatedObjects[objectId] = { ...existing, zIndex: safeZIndex };
8301
+ }
8302
+ return this.update(fullId, { objects: updatedObjects });
8303
+ } catch (error) {
8304
+ if (error instanceof RepositoryError) throw error;
8305
+ if (error instanceof EntityNotFoundError) throw error;
8306
+ throw new RepositoryError(
8307
+ `Failed to merge board object fields: ${error instanceof Error ? error.message : String(error)}`,
8308
+ error
8309
+ );
8310
+ }
8311
+ }
8201
8312
  /**
8202
8313
  * DEPRECATED: Delete a zone and handle associated sessions
8203
8314
  * TODO: Reimplement using board-objects table
@@ -8819,11 +8930,71 @@ init_schema();
8819
8930
  // src/db/repositories/mcp-servers.ts
8820
8931
  init_esm_shims();
8821
8932
  init_ids();
8822
- import { and as and15, eq as eq17, like as like10 } from "drizzle-orm";
8933
+ import { and as and16, eq as eq19, like as like10 } from "drizzle-orm";
8823
8934
 
8824
8935
  // src/tools/mcp/auth-secrets.ts
8825
8936
  init_esm_shims();
8826
8937
 
8938
+ // src/mcp/template-resolver.ts
8939
+ init_esm_shims();
8940
+
8941
+ // src/config/env-resolver.ts
8942
+ init_esm_shims();
8943
+ init_database_wrapper();
8944
+ import { eq as eq18 } from "drizzle-orm";
8945
+
8946
+ // src/db/repositories/session-env-selections.ts
8947
+ init_esm_shims();
8948
+ init_database_wrapper();
8949
+ init_schema();
8950
+ import { and as and15, eq as eq17 } from "drizzle-orm";
8951
+
8952
+ // src/config/env-resolver.ts
8953
+ init_schema();
8954
+
8955
+ // src/config/env-blocklist.ts
8956
+ init_esm_shims();
8957
+ var BLOCKED_ENV_PATTERNS = Object.freeze([
8958
+ /^LD_/i,
8959
+ /^DYLD_/i,
8960
+ /^PYTHON(?!_AGOR_)/i
8961
+ ]);
8962
+
8963
+ // src/config/env-vars.ts
8964
+ init_esm_shims();
8965
+ var V05_SCOPES = ["global", "session"];
8966
+ var V05_SCOPE_SET = new Set(V05_SCOPES);
8967
+ function normalizeStoredEnvVar(raw) {
8968
+ if (typeof raw === "string") {
8969
+ return { value_encrypted: raw, scope: "global" };
8970
+ }
8971
+ return {
8972
+ value_encrypted: raw.value_encrypted,
8973
+ scope: raw.scope,
8974
+ resource_id: raw.resource_id ?? null,
8975
+ extra_config: raw.extra_config ?? null
8976
+ };
8977
+ }
8978
+ function normalizeStoredEnvMap(raw) {
8979
+ const out = {};
8980
+ if (!raw) return out;
8981
+ for (const [key, value] of Object.entries(raw)) {
8982
+ try {
8983
+ out[key] = normalizeStoredEnvVar(value);
8984
+ } catch (err) {
8985
+ console.warn(`[env-vars] Skipping malformed env var entry ${key}:`, err);
8986
+ }
8987
+ }
8988
+ return out;
8989
+ }
8990
+
8991
+ // src/templates/handlebars-helpers.ts
8992
+ init_esm_shims();
8993
+ import Handlebars from "handlebars";
8994
+
8995
+ // src/mcp/template-patterns.ts
8996
+ init_esm_shims();
8997
+
8827
8998
  // src/tools/mcp/http-headers.ts
8828
8999
  init_esm_shims();
8829
9000
 
@@ -8835,7 +9006,7 @@ init_schema();
8835
9006
  init_esm_shims();
8836
9007
  init_database_wrapper();
8837
9008
  init_schema();
8838
- import { and as and16, eq as eq18, inArray as inArray7 } from "drizzle-orm";
9009
+ import { and as and17, eq as eq20, inArray as inArray7 } from "drizzle-orm";
8839
9010
  var MessagesRepository = class {
8840
9011
  constructor(db) {
8841
9012
  this.db = db;
@@ -8901,7 +9072,7 @@ var MessagesRepository = class {
8901
9072
  * Get message by ID
8902
9073
  */
8903
9074
  async findById(messageId) {
8904
- const row = await select(this.db).from(messages3).where(eq18(messages3.message_id, messageId)).one();
9075
+ const row = await select(this.db).from(messages3).where(eq20(messages3.message_id, messageId)).one();
8905
9076
  return row ? this.rowToMessage(row) : null;
8906
9077
  }
8907
9078
  /**
@@ -8910,19 +9081,19 @@ var MessagesRepository = class {
8910
9081
  async findAll(filter) {
8911
9082
  if (filter?.sessionIds !== void 0 && filter.sessionIds.length === 0) return [];
8912
9083
  const conditions = [];
8913
- if (filter?.sessionId) conditions.push(eq18(messages3.session_id, filter.sessionId));
9084
+ if (filter?.sessionId) conditions.push(eq20(messages3.session_id, filter.sessionId));
8914
9085
  if (filter?.sessionIds !== void 0)
8915
9086
  conditions.push(inArray7(messages3.session_id, filter.sessionIds));
8916
- if (filter?.taskId) conditions.push(eq18(messages3.task_id, filter.taskId));
8917
- if (filter?.type) conditions.push(eq18(messages3.type, filter.type));
8918
- if (filter?.role) conditions.push(eq18(messages3.role, filter.role));
9087
+ if (filter?.taskId) conditions.push(eq20(messages3.task_id, filter.taskId));
9088
+ if (filter?.type) conditions.push(eq20(messages3.type, filter.type));
9089
+ if (filter?.role) conditions.push(eq20(messages3.role, filter.role));
8919
9090
  if (filter?.visibleToUserId) {
8920
9091
  conditions.push(
8921
9092
  visibleSessionReferenceAccessExists(this.db, filter.visibleToUserId, messages3.session_id)
8922
9093
  );
8923
9094
  }
8924
9095
  let query = select(this.db).from(messages3);
8925
- if (conditions.length > 0) query = query.where(and16(...conditions));
9096
+ if (conditions.length > 0) query = query.where(and17(...conditions));
8926
9097
  const rows = await query.orderBy(messages3.index).all();
8927
9098
  return rows.map((r) => this.rowToMessage(r));
8928
9099
  }
@@ -8930,21 +9101,21 @@ var MessagesRepository = class {
8930
9101
  * Get all messages for a session (ordered by index)
8931
9102
  */
8932
9103
  async findBySessionId(sessionId) {
8933
- const rows = await select(this.db).from(messages3).where(eq18(messages3.session_id, sessionId)).orderBy(messages3.index).all();
9104
+ const rows = await select(this.db).from(messages3).where(eq20(messages3.session_id, sessionId)).orderBy(messages3.index).all();
8934
9105
  return rows.map((r) => this.rowToMessage(r));
8935
9106
  }
8936
9107
  /**
8937
9108
  * Get all messages for a session filtered by type (ordered by index)
8938
9109
  */
8939
9110
  async findBySessionIdAndType(sessionId, type) {
8940
- const rows = await select(this.db).from(messages3).where(and16(eq18(messages3.session_id, sessionId), eq18(messages3.type, type))).orderBy(messages3.index).all();
9111
+ const rows = await select(this.db).from(messages3).where(and17(eq20(messages3.session_id, sessionId), eq20(messages3.type, type))).orderBy(messages3.index).all();
8941
9112
  return rows.map((r) => this.rowToMessage(r));
8942
9113
  }
8943
9114
  /**
8944
9115
  * Get all messages for a task (ordered by index)
8945
9116
  */
8946
9117
  async findByTaskId(taskId) {
8947
- const rows = await select(this.db).from(messages3).where(eq18(messages3.task_id, taskId)).orderBy(messages3.index).all();
9118
+ const rows = await select(this.db).from(messages3).where(eq20(messages3.task_id, taskId)).orderBy(messages3.index).all();
8948
9119
  return rows.map((r) => this.rowToMessage(r));
8949
9120
  }
8950
9121
  /**
@@ -8952,7 +9123,7 @@ var MessagesRepository = class {
8952
9123
  * Used for task message_range queries
8953
9124
  */
8954
9125
  async findByRange(sessionId, startIndex, endIndex) {
8955
- const rows = await select(this.db).from(messages3).where(eq18(messages3.session_id, sessionId)).orderBy(messages3.index).all();
9126
+ const rows = await select(this.db).from(messages3).where(eq20(messages3.session_id, sessionId)).orderBy(messages3.index).all();
8956
9127
  return rows.filter((r) => r.index >= startIndex && r.index <= endIndex).map((r) => this.rowToMessage(r));
8957
9128
  }
8958
9129
  /**
@@ -8965,33 +9136,33 @@ var MessagesRepository = class {
8965
9136
  }
8966
9137
  const updated = { ...existing, ...updates };
8967
9138
  const row = this.messageToRow(updated);
8968
- const result = await update(this.db, messages3).set(row).where(eq18(messages3.message_id, messageId)).returning().one();
9139
+ const result = await update(this.db, messages3).set(row).where(eq20(messages3.message_id, messageId)).returning().one();
8969
9140
  return this.rowToMessage(result);
8970
9141
  }
8971
9142
  /**
8972
9143
  * Update message task assignment
8973
9144
  */
8974
9145
  async assignToTask(messageId, taskId) {
8975
- const updated = await update(this.db, messages3).set({ task_id: taskId }).where(eq18(messages3.message_id, messageId)).returning().one();
9146
+ const updated = await update(this.db, messages3).set({ task_id: taskId }).where(eq20(messages3.message_id, messageId)).returning().one();
8976
9147
  return this.rowToMessage(updated);
8977
9148
  }
8978
9149
  /**
8979
9150
  * Delete all messages for a session (cascades automatically via FK)
8980
9151
  */
8981
9152
  async deleteBySessionId(sessionId) {
8982
- await deleteFrom(this.db, messages3).where(eq18(messages3.session_id, sessionId)).run();
9153
+ await deleteFrom(this.db, messages3).where(eq20(messages3.session_id, sessionId)).run();
8983
9154
  }
8984
9155
  /**
8985
9156
  * Delete a single message
8986
9157
  */
8987
9158
  async delete(messageId) {
8988
- await deleteFrom(this.db, messages3).where(eq18(messages3.message_id, messageId)).run();
9159
+ await deleteFrom(this.db, messages3).where(eq20(messages3.message_id, messageId)).run();
8989
9160
  }
8990
9161
  };
8991
9162
 
8992
9163
  // src/db/repositories/repos.ts
8993
9164
  init_esm_shims();
8994
- import { eq as eq19, like as like11, sql as sql10 } from "drizzle-orm";
9165
+ import { eq as eq21, like as like11, sql as sql10 } from "drizzle-orm";
8995
9166
 
8996
9167
  // src/config/variant-resolver.ts
8997
9168
  init_esm_shims();
@@ -9152,7 +9323,7 @@ var RepoRepository = class {
9152
9323
  try {
9153
9324
  const insertData = this.repoToInsert(data);
9154
9325
  await insert(this.db, repos3).values(insertData).run();
9155
- const row = await select(this.db).from(repos3).where(eq19(repos3.repo_id, insertData.repo_id)).one();
9326
+ const row = await select(this.db).from(repos3).where(eq21(repos3.repo_id, insertData.repo_id)).one();
9156
9327
  if (!row) {
9157
9328
  throw new RepositoryError("Failed to retrieve created repo");
9158
9329
  }
@@ -9171,7 +9342,7 @@ var RepoRepository = class {
9171
9342
  async findById(id) {
9172
9343
  try {
9173
9344
  const fullId = await this.resolveId(id);
9174
- const row = await select(this.db).from(repos3).where(eq19(repos3.repo_id, fullId)).one();
9345
+ const row = await select(this.db).from(repos3).where(eq21(repos3.repo_id, fullId)).one();
9175
9346
  return row ? this.rowToRepo(row) : null;
9176
9347
  } catch (error) {
9177
9348
  if (error instanceof EntityNotFoundError) return null;
@@ -9187,7 +9358,7 @@ var RepoRepository = class {
9187
9358
  */
9188
9359
  async findBySlug(slug) {
9189
9360
  try {
9190
- const row = await select(this.db).from(repos3).where(eq19(repos3.slug, slug)).one();
9361
+ const row = await select(this.db).from(repos3).where(eq21(repos3.slug, slug)).one();
9191
9362
  return row ? this.rowToRepo(row) : null;
9192
9363
  } catch (error) {
9193
9364
  throw new RepositoryError(
@@ -9255,8 +9426,8 @@ var RepoRepository = class {
9255
9426
  let changed = 0;
9256
9427
  for (const finding of scan.findings) {
9257
9428
  await this.db.transaction(async (tx) => {
9258
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq19(repos3.repo_id, finding.repo_id));
9259
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq19(repos3.repo_id, finding.repo_id)).one();
9429
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq21(repos3.repo_id, finding.repo_id));
9430
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq21(repos3.repo_id, finding.repo_id)).one();
9260
9431
  if (!currentRow) return;
9261
9432
  const data = currentRow.data;
9262
9433
  if (typeof data.remote_url !== "string" || !httpUrlHasUserinfo(data.remote_url)) {
@@ -9268,7 +9439,7 @@ var RepoRepository = class {
9268
9439
  ...data,
9269
9440
  remote_url: stripHttpUrlUserinfo(data.remote_url)
9270
9441
  }
9271
- }).where(eq19(repos3.repo_id, finding.repo_id)).run();
9442
+ }).where(eq21(repos3.repo_id, finding.repo_id)).run();
9272
9443
  changed += 1;
9273
9444
  });
9274
9445
  }
@@ -9290,8 +9461,8 @@ var RepoRepository = class {
9290
9461
  try {
9291
9462
  const fullId = await this.resolveId(id);
9292
9463
  return await this.db.transaction(async (tx) => {
9293
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq19(repos3.repo_id, fullId));
9294
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq19(repos3.repo_id, fullId)).one();
9464
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq21(repos3.repo_id, fullId));
9465
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq21(repos3.repo_id, fullId)).one();
9295
9466
  if (!currentRow) {
9296
9467
  throw new EntityNotFoundError("Repo", id);
9297
9468
  }
@@ -9305,7 +9476,7 @@ var RepoRepository = class {
9305
9476
  repo_type: insertData.repo_type,
9306
9477
  unix_group: merged.unix_group ?? null,
9307
9478
  data: insertData.data
9308
- }).where(eq19(repos3.repo_id, fullId)).run();
9479
+ }).where(eq21(repos3.repo_id, fullId)).run();
9309
9480
  merged.clone_error = insertData.data.clone_error;
9310
9481
  merged.remote_url = insertData.data.remote_url;
9311
9482
  merged.last_updated = newUpdatedAt.toISOString();
@@ -9339,8 +9510,8 @@ var RepoRepository = class {
9339
9510
  try {
9340
9511
  const fullId = await this.resolveId(id);
9341
9512
  return await this.db.transaction(async (tx) => {
9342
- await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq19(repos3.repo_id, fullId));
9343
- const currentRow = await select(txAsDb(tx)).from(repos3).where(eq19(repos3.repo_id, fullId)).one();
9513
+ await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq21(repos3.repo_id, fullId));
9514
+ const currentRow = await select(txAsDb(tx)).from(repos3).where(eq21(repos3.repo_id, fullId)).one();
9344
9515
  if (!currentRow) {
9345
9516
  throw new EntityNotFoundError("Repo", id);
9346
9517
  }
@@ -9354,7 +9525,7 @@ var RepoRepository = class {
9354
9525
  repo_type: insertData.repo_type,
9355
9526
  unix_group: next.unix_group ?? null,
9356
9527
  data: insertData.data
9357
- }).where(eq19(repos3.repo_id, fullId)).run();
9528
+ }).where(eq21(repos3.repo_id, fullId)).run();
9358
9529
  next.environment = insertData.data.environment;
9359
9530
  next.environment_config = insertData.data.environment_config;
9360
9531
  next.remote_url = insertData.data.remote_url;
@@ -9394,7 +9565,7 @@ var RepoRepository = class {
9394
9565
  async delete(id) {
9395
9566
  try {
9396
9567
  const fullId = await this.resolveId(id);
9397
- const result = await deleteFrom(this.db, repos3).where(eq19(repos3.repo_id, fullId)).run();
9568
+ const result = await deleteFrom(this.db, repos3).where(eq21(repos3.repo_id, fullId)).run();
9398
9569
  if (result.rowsAffected === 0) {
9399
9570
  throw new EntityNotFoundError("Repo", id);
9400
9571
  }
@@ -9441,33 +9612,27 @@ init_esm_shims();
9441
9612
  init_ids();
9442
9613
  init_database_wrapper();
9443
9614
  init_schema();
9444
- import { and as and17, asc as asc2, desc as desc3, eq as eq20, isNull as isNull6, like as like12, lte, or as or7, sql as sql11 } from "drizzle-orm";
9615
+ import { and as and18, asc as asc2, desc as desc3, eq as eq22, isNull as isNull6, like as like12, lte, or as or7, sql as sql11 } from "drizzle-orm";
9445
9616
 
9446
9617
  // src/db/repositories/serialized-sessions.ts
9447
9618
  init_esm_shims();
9448
9619
  init_ids();
9449
9620
  init_database_wrapper();
9450
9621
  init_schema();
9451
- import { and as and18, desc as desc4, eq as eq21, lt } from "drizzle-orm";
9452
-
9453
- // src/db/repositories/session-env-selections.ts
9454
- init_esm_shims();
9455
- init_database_wrapper();
9456
- init_schema();
9457
- import { and as and19, eq as eq22 } from "drizzle-orm";
9622
+ import { and as and19, desc as desc4, eq as eq23, lt } from "drizzle-orm";
9458
9623
 
9459
9624
  // src/db/repositories/session-mcp-servers.ts
9460
9625
  init_esm_shims();
9461
9626
  init_database_wrapper();
9462
9627
  init_schema();
9463
- import { and as and21, eq as eq24 } from "drizzle-orm";
9628
+ import { and as and21, eq as eq25 } from "drizzle-orm";
9464
9629
 
9465
9630
  // src/db/repositories/sessions.ts
9466
9631
  init_esm_shims();
9467
9632
  init_types();
9468
9633
  init_config_manager();
9469
9634
  init_ids();
9470
- import { and as and20, desc as desc5, eq as eq23, inArray as inArray8, like as like13, or as or8, sql as sql12 } from "drizzle-orm";
9635
+ import { and as and20, desc as desc5, eq as eq24, inArray as inArray8, like as like13, or as or8, sql as sql12 } from "drizzle-orm";
9471
9636
  init_database_wrapper();
9472
9637
  init_schema();
9473
9638
  function isSessionTimestampNeutralPatch(updates) {
@@ -9492,40 +9657,43 @@ var SessionRepository = class {
9492
9657
  const sessionId = row.session_id;
9493
9658
  const boardId = branchBoardId ?? null;
9494
9659
  const url = baseUrl && boardId ? getSessionUrl(sessionId, baseUrl) : null;
9495
- return {
9496
- session_id: sessionId,
9497
- status: row.status,
9498
- agentic_tool: row.agentic_tool,
9499
- created_at: new Date(row.created_at).toISOString(),
9500
- last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
9501
- created_by: row.created_by,
9502
- unix_username: row.unix_username || null,
9503
- branch_id: row.branch_id,
9504
- branch_board_id: boardId,
9505
- url,
9506
- ...row.data,
9507
- tasks: row.data.tasks.map((id) => id),
9508
- genealogy: {
9509
- parent_session_id: row.parent_session_id,
9510
- forked_from_session_id: row.forked_from_session_id,
9511
- fork_point_task_id: genealogyData.fork_point_task_id,
9512
- fork_point_message_index: genealogyData.fork_point_message_index,
9513
- spawn_point_task_id: genealogyData.spawn_point_task_id,
9514
- spawn_point_message_index: genealogyData.spawn_point_message_index,
9515
- children: genealogyData.children.map((id) => id)
9660
+ return attachHiddenTenant(
9661
+ {
9662
+ session_id: sessionId,
9663
+ status: row.status,
9664
+ agentic_tool: row.agentic_tool,
9665
+ created_at: new Date(row.created_at).toISOString(),
9666
+ last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
9667
+ created_by: row.created_by,
9668
+ unix_username: row.unix_username || null,
9669
+ branch_id: row.branch_id,
9670
+ branch_board_id: boardId,
9671
+ url,
9672
+ ...row.data,
9673
+ tasks: row.data.tasks.map((id) => id),
9674
+ genealogy: {
9675
+ parent_session_id: row.parent_session_id,
9676
+ forked_from_session_id: row.forked_from_session_id,
9677
+ fork_point_task_id: genealogyData.fork_point_task_id,
9678
+ fork_point_message_index: genealogyData.fork_point_message_index,
9679
+ spawn_point_task_id: genealogyData.spawn_point_task_id,
9680
+ spawn_point_message_index: genealogyData.spawn_point_message_index,
9681
+ children: genealogyData.children.map((id) => id)
9682
+ },
9683
+ permission_config: row.data.permission_config,
9684
+ scheduled_run_at: row.scheduled_run_at ?? void 0,
9685
+ scheduled_from_branch: row.scheduled_from_branch ?? false,
9686
+ schedule_id: row.schedule_id ?? void 0,
9687
+ ready_for_prompt: row.ready_for_prompt ?? false,
9688
+ archived: Boolean(row.archived),
9689
+ // Convert SQLite integer (0/1) to boolean
9690
+ archived_reason: row.archived_reason ?? void 0,
9691
+ current_context_usage: row.data.current_context_usage,
9692
+ context_window_limit: row.data.context_window_limit,
9693
+ last_context_update_at: row.data.last_context_update_at
9516
9694
  },
9517
- permission_config: row.data.permission_config,
9518
- scheduled_run_at: row.scheduled_run_at ?? void 0,
9519
- scheduled_from_branch: row.scheduled_from_branch ?? false,
9520
- schedule_id: row.schedule_id ?? void 0,
9521
- ready_for_prompt: row.ready_for_prompt ?? false,
9522
- archived: Boolean(row.archived),
9523
- // Convert SQLite integer (0/1) to boolean
9524
- archived_reason: row.archived_reason ?? void 0,
9525
- current_context_usage: row.data.current_context_usage,
9526
- context_window_limit: row.data.context_window_limit,
9527
- last_context_update_at: row.data.last_context_update_at
9528
- };
9695
+ row
9696
+ );
9529
9697
  }
9530
9698
  /**
9531
9699
  * Convert Session to database insert format
@@ -9613,7 +9781,7 @@ var SessionRepository = class {
9613
9781
  const insertData = this.sessionToInsert(data);
9614
9782
  await insert(this.db, sessions3).values(insertData).run();
9615
9783
  const baseUrl = await getBaseUrl();
9616
- const result = await select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).where(eq23(sessions3.session_id, insertData.session_id)).one();
9784
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.session_id, insertData.session_id)).one();
9617
9785
  if (!result) {
9618
9786
  throw new RepositoryError("Failed to retrieve created session");
9619
9787
  }
@@ -9638,7 +9806,7 @@ var SessionRepository = class {
9638
9806
  try {
9639
9807
  const fullId = await this.resolveId(id);
9640
9808
  const baseUrl = await getBaseUrl();
9641
- const result = await select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).where(eq23(sessions3.session_id, fullId)).one();
9809
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.session_id, fullId)).one();
9642
9810
  if (!result) {
9643
9811
  return null;
9644
9812
  }
@@ -9661,7 +9829,7 @@ var SessionRepository = class {
9661
9829
  async findBranchIdBySessionId(id) {
9662
9830
  try {
9663
9831
  const fullId = await this.resolveId(id);
9664
- const row = await select(this.db, { branch_id: sessions3.branch_id }).from(sessions3).where(eq23(sessions3.session_id, fullId)).one();
9832
+ const row = await select(this.db, { branch_id: sessions3.branch_id }).from(sessions3).where(eq24(sessions3.session_id, fullId)).one();
9665
9833
  return row?.branch_id ?? null;
9666
9834
  } catch (error) {
9667
9835
  if (error instanceof EntityNotFoundError) return null;
@@ -9672,6 +9840,26 @@ var SessionRepository = class {
9672
9840
  );
9673
9841
  }
9674
9842
  }
9843
+ /**
9844
+ * Resolve the owning user id for a session without hydrating the full row.
9845
+ * Used by realtime delivery to offer streaming events to the session
9846
+ * creator's own connections as a fallback, so their open tabs keep updating
9847
+ * even before they subscribe to the per-session stream channel.
9848
+ */
9849
+ async findCreatedByBySessionId(id) {
9850
+ try {
9851
+ const fullId = await this.resolveId(id);
9852
+ const row = await select(this.db, { created_by: sessions3.created_by }).from(sessions3).where(eq24(sessions3.session_id, fullId)).one();
9853
+ return row?.created_by ?? null;
9854
+ } catch (error) {
9855
+ if (error instanceof EntityNotFoundError) return null;
9856
+ if (error instanceof AmbiguousIdError) throw error;
9857
+ throw new RepositoryError(
9858
+ `Failed to find session owner: ${error instanceof Error ? error.message : String(error)}`,
9859
+ error
9860
+ );
9861
+ }
9862
+ }
9675
9863
  /**
9676
9864
  * Find all sessions
9677
9865
  *
@@ -9684,13 +9872,13 @@ var SessionRepository = class {
9684
9872
  if (filter?.visibleToUserId) {
9685
9873
  conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
9686
9874
  }
9687
- const query = filter?.visibleToUserId ? select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).leftJoin(
9875
+ const query = filter?.visibleToUserId ? select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).leftJoin(
9688
9876
  branchOwners3,
9689
9877
  and20(
9690
- eq23(branchOwners3.branch_id, branches3.branch_id),
9691
- eq23(branchOwners3.user_id, filter.visibleToUserId)
9878
+ eq24(branchOwners3.branch_id, branches3.branch_id),
9879
+ eq24(branchOwners3.user_id, filter.visibleToUserId)
9692
9880
  )
9693
- ) : select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id));
9881
+ ) : select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id));
9694
9882
  const results = conditions.length > 0 ? await query.where(and20(...conditions)).all() : await query.all();
9695
9883
  return results.map(
9696
9884
  (result) => {
@@ -9714,7 +9902,7 @@ var SessionRepository = class {
9714
9902
  async findByStatus(status) {
9715
9903
  try {
9716
9904
  const baseUrl = await getBaseUrl();
9717
- const results = await select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).where(eq23(sessions3.status, status)).all();
9905
+ const results = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.status, status)).all();
9718
9906
  return results.map(
9719
9907
  (result) => {
9720
9908
  const sessionRow = result.sessions;
@@ -9742,17 +9930,17 @@ var SessionRepository = class {
9742
9930
  async findByBoard(boardId, filter) {
9743
9931
  try {
9744
9932
  const baseUrl = await getBaseUrl();
9745
- const conditions = [eq23(branches3.board_id, boardId)];
9933
+ const conditions = [eq24(branches3.board_id, boardId)];
9746
9934
  if (filter?.visibleToUserId) {
9747
9935
  conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
9748
9936
  }
9749
- const query = filter?.visibleToUserId ? select(this.db).from(sessions3).innerJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).leftJoin(
9937
+ const query = filter?.visibleToUserId ? select(this.db).from(sessions3).innerJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).leftJoin(
9750
9938
  branchOwners3,
9751
9939
  and20(
9752
- eq23(branchOwners3.branch_id, branches3.branch_id),
9753
- eq23(branchOwners3.user_id, filter.visibleToUserId)
9940
+ eq24(branchOwners3.branch_id, branches3.branch_id),
9941
+ eq24(branchOwners3.user_id, filter.visibleToUserId)
9754
9942
  )
9755
- ) : select(this.db).from(sessions3).innerJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id));
9943
+ ) : select(this.db).from(sessions3).innerJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id));
9756
9944
  const results = await query.where(and20(...conditions)).all();
9757
9945
  return results.map(
9758
9946
  (result) => {
@@ -9789,31 +9977,31 @@ var SessionRepository = class {
9789
9977
  try {
9790
9978
  const baseUrl = await getBaseUrl();
9791
9979
  const conditions = [];
9792
- if (opts.boardId !== void 0) conditions.push(eq23(branches3.board_id, opts.boardId));
9793
- if (opts.archived !== void 0) conditions.push(eq23(sessions3.archived, opts.archived));
9980
+ if (opts.boardId !== void 0) conditions.push(eq24(branches3.board_id, opts.boardId));
9981
+ if (opts.archived !== void 0) conditions.push(eq24(sessions3.archived, opts.archived));
9794
9982
  if (opts.visibleToUserId) {
9795
9983
  conditions.push(visibleBranchAccessCondition(this.db, opts.visibleToUserId));
9796
9984
  }
9797
9985
  const whereClause = conditions.length > 0 ? and20(...conditions) : void 0;
9798
- let countQuery = select(this.db, { count: sql12`count(*)` }).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id));
9986
+ let countQuery = select(this.db, { count: sql12`count(*)` }).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id));
9799
9987
  if (opts.visibleToUserId) {
9800
9988
  countQuery = countQuery.leftJoin(
9801
9989
  branchOwners3,
9802
9990
  and20(
9803
- eq23(branchOwners3.branch_id, branches3.branch_id),
9804
- eq23(branchOwners3.user_id, opts.visibleToUserId)
9991
+ eq24(branchOwners3.branch_id, branches3.branch_id),
9992
+ eq24(branchOwners3.user_id, opts.visibleToUserId)
9805
9993
  )
9806
9994
  );
9807
9995
  }
9808
9996
  const countRow = await (whereClause ? countQuery.where(whereClause) : countQuery).one();
9809
9997
  const total = Number(countRow?.count ?? 0);
9810
- let dataQuery = select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id));
9998
+ let dataQuery = select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id));
9811
9999
  if (opts.visibleToUserId) {
9812
10000
  dataQuery = dataQuery.leftJoin(
9813
10001
  branchOwners3,
9814
10002
  and20(
9815
- eq23(branchOwners3.branch_id, branches3.branch_id),
9816
- eq23(branchOwners3.user_id, opts.visibleToUserId)
10003
+ eq24(branchOwners3.branch_id, branches3.branch_id),
10004
+ eq24(branchOwners3.user_id, opts.visibleToUserId)
9817
10005
  )
9818
10006
  );
9819
10007
  }
@@ -9850,7 +10038,7 @@ var SessionRepository = class {
9850
10038
  const fullId = await this.resolveId(sessionId);
9851
10039
  const baseUrl = await getBaseUrl();
9852
10040
  const { jsonExtract: jsonExtract2 } = await Promise.resolve().then(() => (init_database_wrapper(), database_wrapper_exports));
9853
- const results = await select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).where(
10041
+ const results = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(
9854
10042
  or8(
9855
10043
  sql12`${jsonExtract2(this.db, sessions3.data, "genealogy.parent_session_id")} = ${fullId}`,
9856
10044
  sql12`${jsonExtract2(this.db, sessions3.data, "genealogy.forked_from_session_id")} = ${fullId}`
@@ -9919,8 +10107,8 @@ var SessionRepository = class {
9919
10107
  const statusInfo = updates.status ? ` (status: ${updates.status}, ready_for_prompt: ${updates.ready_for_prompt})` : "";
9920
10108
  console.debug(`\u{1F504} [SessionRepo] Updating session ${shortId(fullId)}${statusInfo}`);
9921
10109
  const result = await this.db.transaction(async (tx) => {
9922
- await lockRowForUpdate(txAsDb(tx), this.db, sessions3, eq23(sessions3.session_id, fullId));
9923
- const currentResult = await select(txAsDb(tx)).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).where(eq23(sessions3.session_id, fullId)).one();
10110
+ await lockRowForUpdate(txAsDb(tx), this.db, sessions3, eq24(sessions3.session_id, fullId));
10111
+ const currentResult = await select(txAsDb(tx)).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.session_id, fullId)).one();
9924
10112
  if (!currentResult) {
9925
10113
  throw new EntityNotFoundError("Session", id);
9926
10114
  }
@@ -9933,12 +10121,12 @@ var SessionRepository = class {
9933
10121
  if (shouldRefreshLastUpdated) {
9934
10122
  insertData.updated_at = /* @__PURE__ */ new Date();
9935
10123
  }
9936
- await update(txAsDb(tx), sessions3).set(insertData).where(eq23(sessions3.session_id, fullId)).run();
10124
+ await update(txAsDb(tx), sessions3).set(insertData).where(eq24(sessions3.session_id, fullId)).run();
9937
10125
  if (!insertData.updated_at) {
9938
10126
  throw new RepositoryError("Session update did not produce an updated_at timestamp");
9939
10127
  }
9940
10128
  merged.last_updated = insertData.updated_at.toISOString();
9941
- return merged;
10129
+ return attachHiddenTenant(merged, currentRow);
9942
10130
  });
9943
10131
  return result;
9944
10132
  } catch (error) {
@@ -9957,7 +10145,7 @@ var SessionRepository = class {
9957
10145
  const fullId = await this.resolveId(sessionId);
9958
10146
  const result = await select(this.db, {
9959
10147
  count: sql12`count(*)`
9960
- }).from(messages3).where(eq23(messages3.session_id, fullId)).one();
10148
+ }).from(messages3).where(eq24(messages3.session_id, fullId)).one();
9961
10149
  return Number(result?.count ?? 0);
9962
10150
  }
9963
10151
  /**
@@ -9966,7 +10154,7 @@ var SessionRepository = class {
9966
10154
  async delete(id) {
9967
10155
  try {
9968
10156
  const fullId = await this.resolveId(id);
9969
- const result = await deleteFrom(this.db, sessions3).where(eq23(sessions3.session_id, fullId)).run();
10157
+ const result = await deleteFrom(this.db, sessions3).where(eq24(sessions3.session_id, fullId)).run();
9970
10158
  if (result.rowsAffected === 0) {
9971
10159
  throw new EntityNotFoundError("Session", id);
9972
10160
  }
@@ -10013,8 +10201,8 @@ var SessionRepository = class {
10013
10201
  async findScheduleRun(scheduleId, scheduledRunAt) {
10014
10202
  try {
10015
10203
  const baseUrl = await getBaseUrl();
10016
- const result = await select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).where(
10017
- and20(eq23(sessions3.schedule_id, scheduleId), eq23(sessions3.scheduled_run_at, scheduledRunAt))
10204
+ const result = await select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(
10205
+ and20(eq24(sessions3.schedule_id, scheduleId), eq24(sessions3.scheduled_run_at, scheduledRunAt))
10018
10206
  ).one();
10019
10207
  if (!result) return null;
10020
10208
  const r = result;
@@ -10037,7 +10225,7 @@ var SessionRepository = class {
10037
10225
  async findByScheduleId(scheduleId, opts = {}) {
10038
10226
  try {
10039
10227
  const baseUrl = await getBaseUrl();
10040
- let query = select(this.db).from(sessions3).leftJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).where(eq23(sessions3.schedule_id, scheduleId));
10228
+ let query = select(this.db).from(sessions3).leftJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).where(eq24(sessions3.schedule_id, scheduleId));
10041
10229
  if (opts.orderByScheduledRunAt === "desc") {
10042
10230
  query = query.orderBy(desc5(sessions3.scheduled_run_at));
10043
10231
  } else if (opts.orderByScheduledRunAt === "asc") {
@@ -10064,7 +10252,7 @@ var SessionRepository = class {
10064
10252
  */
10065
10253
  async countByScheduleId(scheduleId) {
10066
10254
  try {
10067
- const result = await select(this.db, { count: sql12`count(*)` }).from(sessions3).where(eq23(sessions3.schedule_id, scheduleId)).one();
10255
+ const result = await select(this.db, { count: sql12`count(*)` }).from(sessions3).where(eq24(sessions3.schedule_id, scheduleId)).one();
10068
10256
  return Number(result?.count ?? 0);
10069
10257
  } catch (error) {
10070
10258
  throw new RepositoryError(
@@ -10086,7 +10274,7 @@ var SessionRepository = class {
10086
10274
  async existsInBranchWithStatuses(branchId, statuses) {
10087
10275
  if (statuses.length === 0) return false;
10088
10276
  try {
10089
- const row = await select(this.db, { one: sql12`1` }).from(sessions3).where(and20(eq23(sessions3.branch_id, branchId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
10277
+ const row = await select(this.db, { one: sql12`1` }).from(sessions3).where(and20(eq24(sessions3.branch_id, branchId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
10090
10278
  return row != null;
10091
10279
  } catch (error) {
10092
10280
  throw new RepositoryError(
@@ -10102,7 +10290,7 @@ var SessionRepository = class {
10102
10290
  async existsInScheduleWithStatuses(scheduleId, statuses) {
10103
10291
  if (statuses.length === 0) return false;
10104
10292
  try {
10105
- const row = await select(this.db, { one: sql12`1` }).from(sessions3).where(and20(eq23(sessions3.schedule_id, scheduleId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
10293
+ const row = await select(this.db, { one: sql12`1` }).from(sessions3).where(and20(eq24(sessions3.schedule_id, scheduleId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
10106
10294
  return row != null;
10107
10295
  } catch (error) {
10108
10296
  throw new RepositoryError(
@@ -10133,10 +10321,10 @@ var SessionRepository = class {
10133
10321
  async findAccessibleSessions(userId, boardId) {
10134
10322
  const baseUrl = await getBaseUrl();
10135
10323
  const accessCondition = visibleBranchAccessCondition(this.db, userId);
10136
- const whereCondition = boardId ? and20(accessCondition, eq23(branches3.board_id, boardId)) : accessCondition;
10137
- const results = await select(this.db).from(sessions3).innerJoin(branches3, eq23(sessions3.branch_id, branches3.branch_id)).leftJoin(
10324
+ const whereCondition = boardId ? and20(accessCondition, eq24(branches3.board_id, boardId)) : accessCondition;
10325
+ const results = await select(this.db).from(sessions3).innerJoin(branches3, eq24(sessions3.branch_id, branches3.branch_id)).leftJoin(
10138
10326
  branchOwners3,
10139
- and20(eq23(branchOwners3.branch_id, branches3.branch_id), eq23(branchOwners3.user_id, userId))
10327
+ and20(eq24(branchOwners3.branch_id, branches3.branch_id), eq24(branchOwners3.user_id, userId))
10140
10328
  ).where(whereCondition).all();
10141
10329
  const seen = /* @__PURE__ */ new Set();
10142
10330
  const sessionsOut = [];
@@ -10179,7 +10367,7 @@ var SessionRepository = class {
10179
10367
  for (const sessionId of sessionIds) {
10180
10368
  const query = select(this.db, {
10181
10369
  data: messagesTable.data
10182
- }).from(messagesTable).where(and20(eq23(messagesTable.session_id, sessionId), eq23(messagesTable.role, "assistant")));
10370
+ }).from(messagesTable).where(and20(eq24(messagesTable.session_id, sessionId), eq24(messagesTable.role, "assistant")));
10183
10371
  const lastMessage = await query.orderBy(desc5(messagesTable.index)).limit(1).one();
10184
10372
  if (lastMessage) {
10185
10373
  const messageData = lastMessage.data;
@@ -10214,7 +10402,7 @@ var SessionRepository = class {
10214
10402
  */
10215
10403
  async exists(sessionId) {
10216
10404
  try {
10217
- const row = await select(this.db).from(sessions3).where(eq23(sessions3.session_id, sessionId)).one();
10405
+ const row = await select(this.db).from(sessions3).where(eq24(sessions3.session_id, sessionId)).one();
10218
10406
  return row != null;
10219
10407
  } catch (error) {
10220
10408
  throw new RepositoryError(
@@ -10230,7 +10418,7 @@ init_esm_shims();
10230
10418
  init_ids();
10231
10419
  init_database_wrapper();
10232
10420
  init_schema();
10233
- import { and as and22, eq as eq25, inArray as inArray9, or as or9 } from "drizzle-orm";
10421
+ import { and as and22, eq as eq26, inArray as inArray9, or as or9 } from "drizzle-orm";
10234
10422
 
10235
10423
  // src/db/repositories/tasks.ts
10236
10424
  init_esm_shims();
@@ -10238,7 +10426,7 @@ init_types();
10238
10426
  init_ids();
10239
10427
  init_database_wrapper();
10240
10428
  init_schema();
10241
- import { and as and23, eq as eq26, inArray as inArray10, like as like14, sql as sql13 } from "drizzle-orm";
10429
+ import { and as and23, eq as eq27, inArray as inArray10, like as like14, sql as sql13 } from "drizzle-orm";
10242
10430
  var TaskRepository = class {
10243
10431
  constructor(db) {
10244
10432
  this.db = db;
@@ -10334,7 +10522,7 @@ var TaskRepository = class {
10334
10522
  try {
10335
10523
  const insertData = this.taskToInsert(data);
10336
10524
  await insert(this.db, tasks3).values(insertData).run();
10337
- const row = await select(this.db).from(tasks3).where(eq26(tasks3.task_id, insertData.task_id)).one();
10525
+ const row = await select(this.db).from(tasks3).where(eq27(tasks3.task_id, insertData.task_id)).one();
10338
10526
  if (!row) {
10339
10527
  throw new RepositoryError("Failed to retrieve created task");
10340
10528
  }
@@ -10374,7 +10562,7 @@ var TaskRepository = class {
10374
10562
  async findById(id) {
10375
10563
  try {
10376
10564
  const fullId = await this.resolveId(id);
10377
- const row = await select(this.db).from(tasks3).where(eq26(tasks3.task_id, fullId)).one();
10565
+ const row = await select(this.db).from(tasks3).where(eq27(tasks3.task_id, fullId)).one();
10378
10566
  return row ? this.rowToTask(row) : null;
10379
10567
  } catch (error) {
10380
10568
  if (error instanceof EntityNotFoundError) return null;
@@ -10392,10 +10580,10 @@ var TaskRepository = class {
10392
10580
  try {
10393
10581
  if (filter?.sessionIds !== void 0 && filter.sessionIds.length === 0) return [];
10394
10582
  const conditions = [];
10395
- if (filter?.sessionId) conditions.push(eq26(tasks3.session_id, filter.sessionId));
10583
+ if (filter?.sessionId) conditions.push(eq27(tasks3.session_id, filter.sessionId));
10396
10584
  if (filter?.sessionIds !== void 0)
10397
10585
  conditions.push(inArray10(tasks3.session_id, filter.sessionIds));
10398
- if (filter?.status) conditions.push(eq26(tasks3.status, filter.status));
10586
+ if (filter?.status) conditions.push(eq27(tasks3.status, filter.status));
10399
10587
  if (filter?.visibleToUserId) {
10400
10588
  conditions.push(
10401
10589
  visibleSessionReferenceAccessExists(this.db, filter.visibleToUserId, tasks3.session_id)
@@ -10416,7 +10604,7 @@ var TaskRepository = class {
10416
10604
  */
10417
10605
  async findBySession(sessionId) {
10418
10606
  try {
10419
- const rows = await select(this.db).from(tasks3).where(eq26(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
10607
+ const rows = await select(this.db).from(tasks3).where(eq27(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
10420
10608
  return rows.map((row) => this.rowToTask(row));
10421
10609
  } catch (error) {
10422
10610
  throw new RepositoryError(
@@ -10430,7 +10618,7 @@ var TaskRepository = class {
10430
10618
  */
10431
10619
  async findRunning() {
10432
10620
  try {
10433
- const rows = await select(this.db).from(tasks3).where(eq26(tasks3.status, TaskStatus.RUNNING)).all();
10621
+ const rows = await select(this.db).from(tasks3).where(eq27(tasks3.status, TaskStatus.RUNNING)).all();
10434
10622
  return rows.map((row) => this.rowToTask(row));
10435
10623
  } catch (error) {
10436
10624
  throw new RepositoryError(
@@ -10486,7 +10674,7 @@ var TaskRepository = class {
10486
10674
  */
10487
10675
  async findByStatus(status) {
10488
10676
  try {
10489
- const rows = await select(this.db).from(tasks3).where(eq26(tasks3.status, status)).all();
10677
+ const rows = await select(this.db).from(tasks3).where(eq27(tasks3.status, status)).all();
10490
10678
  return rows.map((row) => this.rowToTask(row));
10491
10679
  } catch (error) {
10492
10680
  throw new RepositoryError(
@@ -10508,8 +10696,8 @@ var TaskRepository = class {
10508
10696
  `\u{1F504} [TaskRepo] Updating task ${shortId(fullId)}${updates.status ? ` (status: ${updates.status})` : ""}`
10509
10697
  );
10510
10698
  const result = await this.db.transaction(async (tx) => {
10511
- await lockRowForUpdate(txAsDb(tx), this.db, tasks3, eq26(tasks3.task_id, fullId));
10512
- const currentRow = await select(txAsDb(tx)).from(tasks3).where(eq26(tasks3.task_id, fullId)).one();
10699
+ await lockRowForUpdate(txAsDb(tx), this.db, tasks3, eq27(tasks3.task_id, fullId));
10700
+ const currentRow = await select(txAsDb(tx)).from(tasks3).where(eq27(tasks3.task_id, fullId)).one();
10513
10701
  if (!currentRow) {
10514
10702
  throw new EntityNotFoundError("Task", id);
10515
10703
  }
@@ -10523,7 +10711,7 @@ var TaskRepository = class {
10523
10711
  last_executor_heartbeat_at: insertData.last_executor_heartbeat_at,
10524
10712
  session_md5: insertData.session_md5,
10525
10713
  data: insertData.data
10526
- }).where(eq26(tasks3.task_id, fullId)).run();
10714
+ }).where(eq27(tasks3.task_id, fullId)).run();
10527
10715
  return merged;
10528
10716
  });
10529
10717
  return result;
@@ -10542,7 +10730,7 @@ var TaskRepository = class {
10542
10730
  async delete(id) {
10543
10731
  try {
10544
10732
  const fullId = await this.resolveId(id);
10545
- const result = await deleteFrom(this.db, tasks3).where(eq26(tasks3.task_id, fullId)).run();
10733
+ const result = await deleteFrom(this.db, tasks3).where(eq27(tasks3.task_id, fullId)).run();
10546
10734
  if (result.rowsAffected === 0) {
10547
10735
  throw new EntityNotFoundError("Task", id);
10548
10736
  }
@@ -10604,7 +10792,7 @@ var TaskRepository = class {
10604
10792
  queue_position: nextPosition
10605
10793
  });
10606
10794
  await insert(txAsDb(tx), tasks3).values(insertData).run();
10607
- const row = await select(txAsDb(tx)).from(tasks3).where(eq26(tasks3.task_id, insertData.task_id)).one();
10795
+ const row = await select(txAsDb(tx)).from(tasks3).where(eq27(tasks3.task_id, insertData.task_id)).one();
10608
10796
  if (!row) {
10609
10797
  throw new RepositoryError("Failed to retrieve created queued task");
10610
10798
  }
@@ -10645,7 +10833,7 @@ var TaskRepository = class {
10645
10833
  */
10646
10834
  async countBySession(sessionId) {
10647
10835
  try {
10648
- const result = await select(this.db, { count: sql13`count(*)` }).from(tasks3).where(eq26(tasks3.session_id, sessionId)).one();
10836
+ const result = await select(this.db, { count: sql13`count(*)` }).from(tasks3).where(eq27(tasks3.session_id, sessionId)).one();
10649
10837
  return result?.count ?? 0;
10650
10838
  } catch (error) {
10651
10839
  throw new RepositoryError(
@@ -10662,7 +10850,7 @@ init_types();
10662
10850
  init_ids();
10663
10851
  init_database_wrapper();
10664
10852
  init_schema();
10665
- import { and as and24, eq as eq27, like as like15, lt as lt2 } from "drizzle-orm";
10853
+ import { and as and24, eq as eq28, like as like15, lt as lt2 } from "drizzle-orm";
10666
10854
 
10667
10855
  // src/db/repositories/user-api-keys.ts
10668
10856
  init_esm_shims();
@@ -10672,48 +10860,18 @@ init_schema();
10672
10860
  init_tenant_context();
10673
10861
  import { randomBytes as randomBytes3 } from "crypto";
10674
10862
  import bcrypt2 from "bcryptjs";
10675
- import { and as and25, eq as eq28 } from "drizzle-orm";
10863
+ import { and as and25, eq as eq29 } from "drizzle-orm";
10676
10864
 
10677
10865
  // src/db/repositories/user-mcp-oauth-tokens.ts
10678
10866
  init_esm_shims();
10679
10867
  init_database_wrapper();
10680
10868
  init_schema();
10681
- import { and as and26, eq as eq29, isNull as isNull7 } from "drizzle-orm";
10869
+ import { and as and26, eq as eq30, isNull as isNull7 } from "drizzle-orm";
10682
10870
 
10683
10871
  // src/db/repositories/users.ts
10684
10872
  init_esm_shims();
10685
10873
  init_types();
10686
- import { eq as eq30, like as like16, sql as sql14 } from "drizzle-orm";
10687
-
10688
- // src/config/env-vars.ts
10689
- init_esm_shims();
10690
- var V05_SCOPES = ["global", "session"];
10691
- var V05_SCOPE_SET = new Set(V05_SCOPES);
10692
- function normalizeStoredEnvVar(raw) {
10693
- if (typeof raw === "string") {
10694
- return { value_encrypted: raw, scope: "global" };
10695
- }
10696
- return {
10697
- value_encrypted: raw.value_encrypted,
10698
- scope: raw.scope,
10699
- resource_id: raw.resource_id ?? null,
10700
- extra_config: raw.extra_config ?? null
10701
- };
10702
- }
10703
- function normalizeStoredEnvMap(raw) {
10704
- const out = {};
10705
- if (!raw) return out;
10706
- for (const [key, value] of Object.entries(raw)) {
10707
- try {
10708
- out[key] = normalizeStoredEnvVar(value);
10709
- } catch (err) {
10710
- console.warn(`[env-vars] Skipping malformed env var entry ${key}:`, err);
10711
- }
10712
- }
10713
- return out;
10714
- }
10715
-
10716
- // src/db/repositories/users.ts
10874
+ import { eq as eq31, like as like16, sql as sql14 } from "drizzle-orm";
10717
10875
  init_ids();
10718
10876
  init_database_wrapper();
10719
10877
  init_schema();
@@ -10824,7 +10982,7 @@ var UsersRepository = class {
10824
10982
  * Check if unix_username is already taken by another user
10825
10983
  */
10826
10984
  async isUnixUsernameTaken(unixUsername, excludeUserId) {
10827
- const result = await select(this.db).from(users3).where(eq30(users3.unix_username, unixUsername)).one();
10985
+ const result = await select(this.db).from(users3).where(eq31(users3.unix_username, unixUsername)).one();
10828
10986
  if (!result) {
10829
10987
  return false;
10830
10988
  }
@@ -10847,7 +11005,7 @@ var UsersRepository = class {
10847
11005
  }
10848
11006
  const insertData = this.userToInsert(data);
10849
11007
  await insert(this.db, users3).values(insertData).run();
10850
- const row = await select(this.db).from(users3).where(eq30(users3.user_id, insertData.user_id)).one();
11008
+ const row = await select(this.db).from(users3).where(eq31(users3.user_id, insertData.user_id)).one();
10851
11009
  if (!row) {
10852
11010
  throw new RepositoryError("Failed to retrieve created user");
10853
11011
  }
@@ -10859,7 +11017,7 @@ var UsersRepository = class {
10859
11017
  async findById(id) {
10860
11018
  try {
10861
11019
  const fullId = await this.resolveId(id);
10862
- const result = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
11020
+ const result = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
10863
11021
  if (!result) {
10864
11022
  return null;
10865
11023
  }
@@ -10875,7 +11033,7 @@ var UsersRepository = class {
10875
11033
  * Find user by email
10876
11034
  */
10877
11035
  async findByEmail(email) {
10878
- const result = await select(this.db).from(users3).where(eq30(users3.email, email)).one();
11036
+ const result = await select(this.db).from(users3).where(eq31(users3.email, email)).one();
10879
11037
  if (!result) {
10880
11038
  return null;
10881
11039
  }
@@ -10946,8 +11104,8 @@ var UsersRepository = class {
10946
11104
  await update(this.db, users3).set({
10947
11105
  ...insertData,
10948
11106
  updated_at: /* @__PURE__ */ new Date()
10949
- }).where(eq30(users3.user_id, fullId)).run();
10950
- const row = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
11107
+ }).where(eq31(users3.user_id, fullId)).run();
11108
+ const row = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
10951
11109
  if (!row) {
10952
11110
  throw new RepositoryError("Failed to retrieve updated user");
10953
11111
  }
@@ -10958,7 +11116,7 @@ var UsersRepository = class {
10958
11116
  */
10959
11117
  async delete(id) {
10960
11118
  const fullId = await this.resolveId(id);
10961
- await deleteFrom(this.db, users3).where(eq30(users3.user_id, fullId)).run();
11119
+ await deleteFrom(this.db, users3).where(eq31(users3.user_id, fullId)).run();
10962
11120
  }
10963
11121
  /**
10964
11122
  * Get raw database row (internal use only - includes encrypted keys)
@@ -10966,7 +11124,7 @@ var UsersRepository = class {
10966
11124
  async getRawRow(id) {
10967
11125
  try {
10968
11126
  const fullId = await this.resolveId(id);
10969
- const result = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
11127
+ const result = await select(this.db).from(users3).where(eq31(users3.user_id, fullId)).one();
10970
11128
  return result;
10971
11129
  } catch (error) {
10972
11130
  if (error instanceof EntityNotFoundError) {
@@ -11048,7 +11206,7 @@ var UsersRepository = class {
11048
11206
  await update(this.db, users3).set({
11049
11207
  data: { ...row.data, agentic_tools: next },
11050
11208
  updated_at: /* @__PURE__ */ new Date()
11051
- }).where(eq30(users3.user_id, fullId)).run();
11209
+ }).where(eq31(users3.user_id, fullId)).run();
11052
11210
  }
11053
11211
  /**
11054
11212
  * Delete a single credential field for a tool.
@@ -11074,7 +11232,7 @@ var UsersRepository = class {
11074
11232
  await update(this.db, users3).set({
11075
11233
  data: { ...row.data, agentic_tools: next },
11076
11234
  updated_at: /* @__PURE__ */ new Date()
11077
- }).where(eq30(users3.user_id, fullId)).run();
11235
+ }).where(eq31(users3.user_id, fullId)).run();
11078
11236
  }
11079
11237
  };
11080
11238
 
@@ -11791,23 +11949,9 @@ import fs2 from "fs";
11791
11949
  init_config_manager();
11792
11950
  init_constants();
11793
11951
 
11794
- // src/config/env-blocklist.ts
11795
- init_esm_shims();
11796
- var BLOCKED_ENV_PATTERNS = Object.freeze([
11797
- /^LD_/i,
11798
- /^DYLD_/i,
11799
- /^PYTHON(?!_AGOR_)/i
11800
- ]);
11801
-
11802
11952
  // src/config/env-locking.ts
11803
11953
  init_esm_shims();
11804
11954
 
11805
- // src/config/env-resolver.ts
11806
- init_esm_shims();
11807
- init_database_wrapper();
11808
- import { eq as eq31 } from "drizzle-orm";
11809
- init_schema();
11810
-
11811
11955
  // src/config/env-validation.ts
11812
11956
  init_esm_shims();
11813
11957
  var ENV_VAR_CONSTRAINTS = {