agor-live 0.21.2 → 0.22.0

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 (431) hide show
  1. package/dist/cli/commands/branch/env/restart.js +1 -1
  2. package/dist/cli/commands/branch/env/start.js +1 -1
  3. package/dist/cli/commands/branch/env/stop.js +1 -1
  4. package/dist/core/api/index.cjs +5 -1
  5. package/dist/core/api/index.d.ts +6 -1
  6. package/dist/core/api/index.d.ts.map +1 -1
  7. package/dist/core/api/index.js +5 -1
  8. package/dist/core/claude/index.cjs +162 -14
  9. package/dist/core/claude/index.js +166 -18
  10. package/dist/core/client/index.cjs +43 -3
  11. package/dist/core/client/index.js +37 -3
  12. package/dist/core/config/browser.cjs +2 -2
  13. package/dist/core/config/browser.js +2 -2
  14. package/dist/core/config/config-manager.d.ts.map +1 -1
  15. package/dist/core/config/constants.d.ts +1 -1
  16. package/dist/core/config/index.cjs +174 -20
  17. package/dist/core/config/index.js +178 -24
  18. package/dist/core/config/types.d.ts +8 -0
  19. package/dist/core/config/types.d.ts.map +1 -1
  20. package/dist/core/db/index.cjs +495 -86
  21. package/dist/core/db/index.js +482 -75
  22. package/dist/core/db/repositories/artifacts.d.ts.map +1 -1
  23. package/dist/core/db/repositories/branches.d.ts +13 -1
  24. package/dist/core/db/repositories/branches.d.ts.map +1 -1
  25. package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
  26. package/dist/core/db/repositories/index.d.ts +1 -0
  27. package/dist/core/db/repositories/index.d.ts.map +1 -1
  28. package/dist/core/db/repositories/session-relationships.d.ts +30 -0
  29. package/dist/core/db/repositories/session-relationships.d.ts.map +1 -0
  30. package/dist/core/db/repositories/users.d.ts +11 -0
  31. package/dist/core/db/repositories/users.d.ts.map +1 -1
  32. package/dist/core/db/schema.d.ts +421 -4
  33. package/dist/core/db/schema.d.ts.map +1 -1
  34. package/dist/core/db/schema.postgres.d.ts +226 -2
  35. package/dist/core/db/schema.postgres.d.ts.map +1 -1
  36. package/dist/core/db/schema.sqlite.d.ts +228 -2
  37. package/dist/core/db/schema.sqlite.d.ts.map +1 -1
  38. package/dist/core/drizzle/postgres/0050_artifact_source_session.sql +3 -0
  39. package/dist/core/drizzle/postgres/0051_session_relationships.sql +26 -0
  40. package/dist/core/drizzle/postgres/meta/_journal.json +14 -0
  41. package/dist/core/drizzle/sqlite/0059_artifact_source_session.sql +2 -0
  42. package/dist/core/drizzle/sqlite/0060_session_relationships.sql +23 -0
  43. package/dist/core/drizzle/sqlite/meta/_journal.json +14 -0
  44. package/dist/core/gateway/connector-registry.d.ts.map +1 -1
  45. package/dist/core/gateway/connector.d.ts +22 -0
  46. package/dist/core/gateway/connector.d.ts.map +1 -1
  47. package/dist/core/gateway/connectors/slack.d.ts +35 -3
  48. package/dist/core/gateway/connectors/slack.d.ts.map +1 -1
  49. package/dist/core/gateway/connectors/teams.d.ts +107 -0
  50. package/dist/core/gateway/connectors/teams.d.ts.map +1 -0
  51. package/dist/core/gateway/context.d.ts.map +1 -1
  52. package/dist/core/gateway/index.cjs +552 -52
  53. package/dist/core/gateway/index.d.ts +3 -2
  54. package/dist/core/gateway/index.d.ts.map +1 -1
  55. package/dist/core/gateway/index.js +544 -52
  56. package/dist/core/gateway/system-message.d.ts +21 -0
  57. package/dist/core/gateway/system-message.d.ts.map +1 -1
  58. package/dist/core/index.cjs +616 -127
  59. package/dist/core/index.js +597 -116
  60. package/dist/core/mcp/index.cjs +146 -9
  61. package/dist/core/mcp/index.js +146 -9
  62. package/dist/core/mcp/template-resolver.d.ts.map +1 -1
  63. package/dist/core/seed/index.cjs +375 -59
  64. package/dist/core/seed/index.js +378 -62
  65. package/dist/core/sessions/index.cjs +19 -0
  66. package/dist/core/sessions/index.js +19 -0
  67. package/dist/core/templates/agor-system-prompt.md +21 -53
  68. package/dist/core/templates/session-context.cjs +2 -73
  69. package/dist/core/templates/session-context.d.ts +9 -53
  70. package/dist/core/templates/session-context.d.ts.map +1 -1
  71. package/dist/core/templates/session-context.js +2 -72
  72. package/dist/core/tools/mcp/jwt-auth.cjs +2 -20
  73. package/dist/core/tools/mcp/jwt-auth.d.ts.map +1 -1
  74. package/dist/core/tools/mcp/jwt-auth.js +2 -20
  75. package/dist/core/tools/mcp/oauth-mcp-transport.cjs +2 -15
  76. package/dist/core/tools/mcp/oauth-mcp-transport.d.ts.map +1 -1
  77. package/dist/core/tools/mcp/oauth-mcp-transport.js +2 -15
  78. package/dist/core/tools/mcp/oauth-refresh.cjs +167 -19
  79. package/dist/core/tools/mcp/oauth-refresh.js +167 -19
  80. package/dist/core/types/artifact.d.ts +5 -1
  81. package/dist/core/types/artifact.d.ts.map +1 -1
  82. package/dist/core/types/branch.d.ts +14 -0
  83. package/dist/core/types/branch.d.ts.map +1 -1
  84. package/dist/core/types/gateway.d.ts +1 -1
  85. package/dist/core/types/gateway.d.ts.map +1 -1
  86. package/dist/core/types/id.d.ts +1 -0
  87. package/dist/core/types/id.d.ts.map +1 -1
  88. package/dist/core/types/index.cjs +36 -0
  89. package/dist/core/types/index.js +30 -0
  90. package/dist/core/types/session.d.ts +65 -1
  91. package/dist/core/types/session.d.ts.map +1 -1
  92. package/dist/core/types/task.d.ts +9 -0
  93. package/dist/core/types/task.d.ts.map +1 -1
  94. package/dist/core/unix/index.cjs +371 -55
  95. package/dist/core/unix/index.js +374 -58
  96. package/dist/core/unix/unix-integration-service.d.ts +10 -7
  97. package/dist/core/unix/unix-integration-service.d.ts.map +1 -1
  98. package/dist/core/utils/permission-mode-mapper.cjs +19 -0
  99. package/dist/core/utils/permission-mode-mapper.js +19 -0
  100. package/dist/daemon/declarations.d.ts +7 -0
  101. package/dist/daemon/declarations.d.ts.map +1 -1
  102. package/dist/daemon/hooks/gateway-route.d.ts.map +1 -1
  103. package/dist/daemon/hooks/gateway-route.js +53 -1
  104. package/dist/daemon/index.js +3760 -2107
  105. package/dist/daemon/main.js +3760 -2107
  106. package/dist/daemon/mcp/server.js +155 -17
  107. package/dist/daemon/mcp/tools/analytics.js +6 -7
  108. package/dist/daemon/mcp/tools/artifacts.d.ts.map +1 -1
  109. package/dist/daemon/mcp/tools/artifacts.js +7 -7
  110. package/dist/daemon/mcp/tools/boards.js +6 -7
  111. package/dist/daemon/mcp/tools/branches.js +6 -7
  112. package/dist/daemon/mcp/tools/card-types.js +6 -7
  113. package/dist/daemon/mcp/tools/cards.js +6 -7
  114. package/dist/daemon/mcp/tools/environment.d.ts.map +1 -1
  115. package/dist/daemon/mcp/tools/environment.js +19 -12
  116. package/dist/daemon/mcp/tools/knowledge.js +6 -7
  117. package/dist/daemon/mcp/tools/mcp-servers.js +6 -7
  118. package/dist/daemon/mcp/tools/messages.js +6 -7
  119. package/dist/daemon/mcp/tools/proxies.js +6 -7
  120. package/dist/daemon/mcp/tools/repos.js +6 -7
  121. package/dist/daemon/mcp/tools/schedules.js +6 -7
  122. package/dist/daemon/mcp/tools/search.js +6 -7
  123. package/dist/daemon/mcp/tools/sessions.d.ts.map +1 -1
  124. package/dist/daemon/mcp/tools/sessions.js +140 -11
  125. package/dist/daemon/mcp/tools/tasks.js +6 -7
  126. package/dist/daemon/mcp/tools/users.js +6 -7
  127. package/dist/daemon/mcp/tools/widgets.js +7 -8
  128. package/dist/daemon/register-hooks.d.ts +5 -1
  129. package/dist/daemon/register-hooks.d.ts.map +1 -1
  130. package/dist/daemon/register-hooks.js +404 -179
  131. package/dist/daemon/register-routes.d.ts.map +1 -1
  132. package/dist/daemon/register-routes.js +360 -162
  133. package/dist/daemon/register-services.d.ts.map +1 -1
  134. package/dist/daemon/register-services.js +1928 -671
  135. package/dist/daemon/services/artifacts.d.ts +10 -1
  136. package/dist/daemon/services/artifacts.d.ts.map +1 -1
  137. package/dist/daemon/services/artifacts.js +25 -1
  138. package/dist/daemon/services/branches.d.ts +11 -1
  139. package/dist/daemon/services/branches.d.ts.map +1 -1
  140. package/dist/daemon/services/branches.js +470 -184
  141. package/dist/daemon/services/claude-models.js +879 -339
  142. package/dist/daemon/services/gateway.d.ts +58 -2
  143. package/dist/daemon/services/gateway.d.ts.map +1 -1
  144. package/dist/daemon/services/gateway.js +590 -47
  145. package/dist/daemon/services/groups.d.ts +2 -0
  146. package/dist/daemon/services/groups.d.ts.map +1 -1
  147. package/dist/daemon/services/groups.js +56 -0
  148. package/dist/daemon/services/mcp-servers.d.ts.map +1 -1
  149. package/dist/daemon/services/mcp-servers.js +0 -6
  150. package/dist/daemon/services/scheduler.d.ts.map +1 -1
  151. package/dist/daemon/services/scheduler.js +6 -2
  152. package/dist/daemon/services/sessions.d.ts +11 -3
  153. package/dist/daemon/services/sessions.d.ts.map +1 -1
  154. package/dist/daemon/services/sessions.js +68 -7
  155. package/dist/daemon/services/tasks.d.ts +13 -2
  156. package/dist/daemon/services/tasks.d.ts.map +1 -1
  157. package/dist/daemon/services/tasks.js +42 -26
  158. package/dist/daemon/startup.js +6 -2
  159. package/dist/daemon/utils/session-stop.d.ts +43 -0
  160. package/dist/daemon/utils/session-stop.d.ts.map +1 -0
  161. package/dist/daemon/utils/session-stop.js +102 -0
  162. package/dist/daemon/utils/session-task-state.d.ts +7 -2
  163. package/dist/daemon/utils/session-task-state.d.ts.map +1 -1
  164. package/dist/daemon/utils/session-task-state.js +9 -3
  165. package/dist/daemon/utils/session-tasks.d.ts +4 -4
  166. package/dist/daemon/utils/session-tasks.d.ts.map +1 -1
  167. package/dist/daemon/utils/session-tasks.js +4 -8
  168. package/dist/executor/commands/environment.d.ts +13 -0
  169. package/dist/executor/commands/environment.d.ts.map +1 -0
  170. package/dist/executor/commands/environment.js +287 -0
  171. package/dist/executor/commands/index.d.ts.map +1 -1
  172. package/dist/executor/commands/index.js +5 -1
  173. package/dist/executor/commands/unix.d.ts +8 -1
  174. package/dist/executor/commands/unix.d.ts.map +1 -1
  175. package/dist/executor/commands/unix.js +157 -2
  176. package/dist/executor/payload-types.d.ts +201 -5
  177. package/dist/executor/payload-types.d.ts.map +1 -1
  178. package/dist/executor/payload-types.js +98 -0
  179. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +1 -1
  180. package/dist/executor/sdk-handlers/base/mcp-scoping.js +14 -0
  181. package/dist/executor/sdk-handlers/claude/message-processor.d.ts.map +1 -1
  182. package/dist/executor/sdk-handlers/claude/message-processor.js +0 -1
  183. package/dist/executor/sdk-handlers/claude/query-builder.d.ts +1 -0
  184. package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
  185. package/dist/executor/sdk-handlers/claude/query-builder.js +91 -39
  186. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +12 -5
  187. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
  188. package/dist/executor/sdk-handlers/codex/prompt-service.js +72 -30
  189. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts +2 -4
  190. package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts.map +1 -1
  191. package/dist/executor/sdk-handlers/copilot/prompt-service.js +4 -13
  192. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +2 -4
  193. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +1 -1
  194. package/dist/executor/sdk-handlers/gemini/prompt-service.js +4 -13
  195. package/dist/ui/assets/App-DcEY8Ota.js +3 -0
  196. package/dist/ui/assets/App-DcEY8Ota.js.gz +0 -0
  197. package/dist/ui/assets/{ArtifactConsentModal-ParNk5kW.js → ArtifactConsentModal-CiCbK9iv.js} +1 -1
  198. package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js.gz +0 -0
  199. package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js +9 -0
  200. package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js.gz +0 -0
  201. package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js +18 -0
  202. package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js.gz +0 -0
  203. package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js +34 -0
  204. package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js.gz +0 -0
  205. package/dist/ui/assets/{CodeEditor.inner-D51Z_CLQ.js → CodeEditor.inner-DBgsP4tn.js} +2 -2
  206. package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js.gz +0 -0
  207. package/dist/ui/assets/ConversationView-CUWR0gR6.js +1 -0
  208. package/dist/ui/assets/ConversationView-CUWR0gR6.js.gz +0 -0
  209. package/dist/ui/assets/KnowledgePage-B2bzlXfn.js +24 -0
  210. package/dist/ui/assets/KnowledgePage-B2bzlXfn.js.gz +0 -0
  211. package/dist/ui/assets/MarketingScreenshotPage-9Qd7eZsm.css +1 -0
  212. package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js +143 -0
  213. package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js.gz +0 -0
  214. package/dist/ui/assets/MobileApp-VgVnsnsN.js +1 -0
  215. package/dist/ui/assets/MobileApp-VgVnsnsN.js.gz +0 -0
  216. package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js +20 -0
  217. package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js.gz +0 -0
  218. package/dist/ui/assets/{App-BAdBsEnV.css → SessionCanvas-mEmYGZhC.css} +1 -1
  219. package/dist/ui/assets/SessionCanvas-mEmYGZhC.css.gz +0 -0
  220. package/dist/ui/assets/{StreamdownDemoPage-B9wbgp2s.js → StreamdownDemoPage-wzWaqWwr.js} +1 -1
  221. package/dist/ui/assets/StreamdownDemoPage-wzWaqWwr.js.gz +0 -0
  222. package/dist/ui/assets/{ThemeSwitcher-ubn6IOz9.js → ThemeSwitcher-Dly2y9pi.js} +1 -1
  223. package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js.gz +0 -0
  224. package/dist/ui/assets/antd-CfbbHJOz.js +401 -0
  225. package/dist/ui/assets/antd-CfbbHJOz.js.gz +0 -0
  226. package/dist/ui/assets/architecture-U656AL7Q-CykGFbQU.js +1 -0
  227. package/dist/ui/assets/{architectureDiagram-VXUJARFQ-ChmZt3zk.js → architectureDiagram-VXUJARFQ-C8HXAenz.js} +1 -1
  228. package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js.gz +0 -0
  229. package/dist/ui/assets/{blockDiagram-VD42YOAC-CzGHAHao.js → blockDiagram-VD42YOAC-BhZaEN19.js} +1 -1
  230. package/dist/ui/assets/blockDiagram-VD42YOAC-BhZaEN19.js.gz +0 -0
  231. package/dist/ui/assets/{c4Diagram-YG6GDRKO-DscJyaWN.js → c4Diagram-YG6GDRKO-Dk_UH-sY.js} +1 -1
  232. package/dist/ui/assets/c4Diagram-YG6GDRKO-Dk_UH-sY.js.gz +0 -0
  233. package/dist/ui/assets/channel-D6_nUWlW.js +1 -0
  234. package/dist/ui/assets/{chunk-4BX2VUAB-DoWpTvP8.js → chunk-4BX2VUAB-XprbG2TG.js} +1 -1
  235. package/dist/ui/assets/chunk-55IACEB6-ByzqIgSb.js +1 -0
  236. package/dist/ui/assets/{chunk-ABZYJK2D-RzDCrjE6.js → chunk-ABZYJK2D-BJcrryHK.js} +1 -1
  237. package/dist/ui/assets/chunk-ABZYJK2D-BJcrryHK.js.gz +0 -0
  238. package/dist/ui/assets/{chunk-AGHRB4JF-jidCS5Of.js → chunk-AGHRB4JF-DvxmfbM0.js} +1 -1
  239. package/dist/ui/assets/chunk-AGHRB4JF-DvxmfbM0.js.gz +0 -0
  240. package/dist/ui/assets/{chunk-ATLVNIR6-BEIIfJtC.js → chunk-ATLVNIR6-DbeJ0OrR.js} +1 -1
  241. package/dist/ui/assets/chunk-ATLVNIR6-DbeJ0OrR.js.gz +0 -0
  242. package/dist/ui/assets/{chunk-B4BG7PRW-B8b6dQQ2.js → chunk-B4BG7PRW-C53q2ggf.js} +1 -1
  243. package/dist/ui/assets/chunk-B4BG7PRW-C53q2ggf.js.gz +0 -0
  244. package/dist/ui/assets/{chunk-CVBHYZKI-D-mQAfrk.js → chunk-CVBHYZKI-B3EBSlb3.js} +1 -1
  245. package/dist/ui/assets/{chunk-DI55MBZ5-BfATX3V8.js → chunk-DI55MBZ5-vIyNEQN-.js} +1 -1
  246. package/dist/ui/assets/chunk-DI55MBZ5-vIyNEQN-.js.gz +0 -0
  247. package/dist/ui/assets/chunk-EXTU4WIE-B3ObkuOm.js +1 -0
  248. package/dist/ui/assets/{chunk-FMBD7UC4-fqXscNvc.js → chunk-FMBD7UC4-rddmfK-Z.js} +1 -1
  249. package/dist/ui/assets/{chunk-HN2XXSSU-BCHvD80g.js → chunk-HN2XXSSU-Dttqcg3b.js} +1 -1
  250. package/dist/ui/assets/chunk-HN2XXSSU-Dttqcg3b.js.gz +0 -0
  251. package/dist/ui/assets/{chunk-JA3XYJ7Z-Cp6dqHnY.js → chunk-JA3XYJ7Z-DbNDev3D.js} +1 -1
  252. package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js.gz +0 -0
  253. package/dist/ui/assets/{chunk-JZLCHNYA-cKMooY3y.js → chunk-JZLCHNYA-EUmx2y4H.js} +1 -1
  254. package/dist/ui/assets/chunk-JZLCHNYA-EUmx2y4H.js.gz +0 -0
  255. package/dist/ui/assets/{chunk-MI3HLSF2-BlzO5wOE.js → chunk-MI3HLSF2-65n9Mkyc.js} +1 -1
  256. package/dist/ui/assets/chunk-MI3HLSF2-65n9Mkyc.js.gz +0 -0
  257. package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js +2 -0
  258. package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js.gz +0 -0
  259. package/dist/ui/assets/{chunk-QN33PNHL-DIHGQ_pd.js → chunk-QN33PNHL-DsRKK6NR.js} +1 -1
  260. package/dist/ui/assets/{chunk-QXUST7PY-C9l0muI0.js → chunk-QXUST7PY-BCYnMiS3.js} +1 -1
  261. package/dist/ui/assets/chunk-QXUST7PY-BCYnMiS3.js.gz +0 -0
  262. package/dist/ui/assets/chunk-QZHKN3VN-HucAw4xW.js +1 -0
  263. package/dist/ui/assets/{chunk-S3R3BYOJ-VJiLzt2o.js → chunk-S3R3BYOJ-CWMEa9Dc.js} +1 -1
  264. package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js.gz +0 -0
  265. package/dist/ui/assets/{chunk-TZMSLE5B-DZwI0C_2.js → chunk-TZMSLE5B-BuQUQcTr.js} +1 -1
  266. package/dist/ui/assets/chunk-TZMSLE5B-BuQUQcTr.js.gz +0 -0
  267. package/dist/ui/assets/classDiagram-2ON5EDUG-CUT3rPTB.js +1 -0
  268. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-CUT3rPTB.js +1 -0
  269. package/dist/ui/assets/{cose-bilkent-S5V4N54A-Ipik-oSD.js → cose-bilkent-S5V4N54A-CnPB3ARO.js} +1 -1
  270. package/dist/ui/assets/cose-bilkent-S5V4N54A-CnPB3ARO.js.gz +0 -0
  271. package/dist/ui/assets/cursor-QEb7m-rN.png +0 -0
  272. package/dist/ui/assets/{dagre-6UL2VRFP-BDpyWQnh.js → dagre-6UL2VRFP-DhS-k_Se.js} +1 -1
  273. package/dist/ui/assets/dagre-6UL2VRFP-DhS-k_Se.js.gz +0 -0
  274. package/dist/ui/assets/{dagre-CgA4KhUX.js → dagre-KgLoHEuy.js} +1 -1
  275. package/dist/ui/assets/dagre-KgLoHEuy.js.gz +0 -0
  276. package/dist/ui/assets/{diagram-PSM6KHXK-B4GRzxLJ.js → diagram-PSM6KHXK-BZg3MJmb.js} +1 -1
  277. package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js.gz +0 -0
  278. package/dist/ui/assets/{diagram-QEK2KX5R-BWPW28XI.js → diagram-QEK2KX5R-BPCitvbo.js} +1 -1
  279. package/dist/ui/assets/diagram-QEK2KX5R-BPCitvbo.js.gz +0 -0
  280. package/dist/ui/assets/{diagram-S2PKOQOG-BIHhcGoV.js → diagram-S2PKOQOG-NW4uK6sx.js} +1 -1
  281. package/dist/ui/assets/diagram-S2PKOQOG-NW4uK6sx.js.gz +0 -0
  282. package/dist/ui/assets/{editor-C-HJ7Yw0.js → editor-CzFWIUw2.js} +1 -1
  283. package/dist/ui/assets/editor-CzFWIUw2.js.gz +0 -0
  284. package/dist/ui/assets/{emoji-D8F6B62m.js → emoji-Dkz4Zzv_.js} +1 -1
  285. package/dist/ui/assets/emoji-Dkz4Zzv_.js.gz +0 -0
  286. package/dist/ui/assets/{erDiagram-Q2GNP2WA-ubTaAFcK.js → erDiagram-Q2GNP2WA-me1fboaf.js} +1 -1
  287. package/dist/ui/assets/erDiagram-Q2GNP2WA-me1fboaf.js.gz +0 -0
  288. package/dist/ui/assets/{flowDiagram-NV44I4VS-BHLCTYjI.js → flowDiagram-NV44I4VS-DzE8dGsh.js} +1 -1
  289. package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js.gz +0 -0
  290. package/dist/ui/assets/{ganttDiagram-LVOFAZNH-ClC3pay1.js → ganttDiagram-LVOFAZNH-CFQD09Mi.js} +2 -2
  291. package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js.gz +0 -0
  292. package/dist/ui/assets/{gitGraph-F6HP7TQM-DghoobE6.js → gitGraph-F6HP7TQM-CfFE_uAC.js} +1 -1
  293. package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-Clqpiswu.js → gitGraphDiagram-NY62KEGX-CaVoxU4C.js} +1 -1
  294. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js.gz +0 -0
  295. package/dist/ui/assets/index-BN5_Qq7R.js +324 -0
  296. package/dist/ui/assets/index-BN5_Qq7R.js.gz +0 -0
  297. package/dist/ui/assets/index-DxuPq13l.css +1 -0
  298. package/dist/ui/assets/index-DxuPq13l.css.gz +0 -0
  299. package/dist/ui/assets/{info-NVLQJR56-0ZldEXPQ.js → info-NVLQJR56-i_xHYg3f.js} +1 -1
  300. package/dist/ui/assets/{infoDiagram-ER5ION4S-DMmPX-il.js → infoDiagram-ER5ION4S-2NL93b78.js} +1 -1
  301. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CrVickA2.js → journeyDiagram-XKPGCS4Q-CZF-2DHU.js} +1 -1
  302. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CZF-2DHU.js.gz +0 -0
  303. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-C_BsdHYL.js → kanban-definition-3W4ZIXB7-CfvJIOny.js} +1 -1
  304. package/dist/ui/assets/kanban-definition-3W4ZIXB7-CfvJIOny.js.gz +0 -0
  305. package/dist/ui/assets/{line-CfBP7Yic.js → line-DDv8kOJk.js} +1 -1
  306. package/dist/ui/assets/{linear-BsjageUB.js → linear-Daef-l29.js} +1 -1
  307. package/dist/ui/assets/linear-Daef-l29.js.gz +0 -0
  308. package/dist/ui/assets/{mermaid-parser.core-DZdP-NFq.js → mermaid-parser.core-CdK9QgYV.js} +2 -2
  309. package/dist/ui/assets/mermaid-parser.core-CdK9QgYV.js.gz +0 -0
  310. package/dist/ui/assets/{mermaid.core-TNrI0pHG.js → mermaid.core-D6GS9mU-.js} +3 -3
  311. package/dist/ui/assets/mermaid.core-D6GS9mU-.js.gz +0 -0
  312. package/dist/ui/assets/message-SqLqNYcv.js +36 -0
  313. package/dist/ui/assets/message-SqLqNYcv.js.gz +0 -0
  314. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-BbmaUjMY.js → mindmap-definition-VGOIOE7T-Cb3QMflX.js} +1 -1
  315. package/dist/ui/assets/mindmap-definition-VGOIOE7T-Cb3QMflX.js.gz +0 -0
  316. package/dist/ui/assets/{packet-BFZMPI3H-D_ZhkXuT.js → packet-BFZMPI3H-Bm2uwz4i.js} +1 -1
  317. package/dist/ui/assets/{particles-Dv28pjOd.js → particles-DsJFOarW.js} +1 -1
  318. package/dist/ui/assets/particles-DsJFOarW.js.gz +0 -0
  319. package/dist/ui/assets/{pie-7BOR55EZ-Dn0Q3qNx.js → pie-7BOR55EZ-5i17tVnF.js} +1 -1
  320. package/dist/ui/assets/{pieDiagram-ADFJNKIX-BbyjfYu8.js → pieDiagram-ADFJNKIX-BxIwQWvw.js} +1 -1
  321. package/dist/ui/assets/pieDiagram-ADFJNKIX-BxIwQWvw.js.gz +0 -0
  322. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-Bc3GqMKz.js → quadrantDiagram-AYHSOK5B-B5HPe4ga.js} +1 -1
  323. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-B5HPe4ga.js.gz +0 -0
  324. package/dist/ui/assets/{radar-NHE76QYJ-BHwoAy1q.js → radar-NHE76QYJ-BTn-tq0k.js} +1 -1
  325. package/dist/ui/assets/{reactflow-BVYPxNhc.js → reactflow-Bf74ngoo.js} +2 -2
  326. package/dist/ui/assets/reactflow-Bf74ngoo.js.gz +0 -0
  327. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-BQaKKL09.js → requirementDiagram-UZGBJVZJ-YfI6llkX.js} +1 -1
  328. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-YfI6llkX.js.gz +0 -0
  329. package/dist/ui/assets/{sandpack-BQW_FQ7G.js → sandpack-D7koO5op.js} +1 -1
  330. package/dist/ui/assets/sandpack-D7koO5op.js.gz +0 -0
  331. package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-DiJvDvhb.js → sankeyDiagram-TZEHDZUN-DOk_B10B.js} +1 -1
  332. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js.gz +0 -0
  333. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-Dw32824o.js → sequenceDiagram-WL72ISMW-DAe4Um17.js} +1 -1
  334. package/dist/ui/assets/sequenceDiagram-WL72ISMW-DAe4Um17.js.gz +0 -0
  335. package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BCOpNdHV.js → stateDiagram-FKZM4ZOC-CCesDu_C.js} +1 -1
  336. package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js.gz +0 -0
  337. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-CMlIrsoO.js +1 -0
  338. package/dist/ui/assets/{syntax-VJrU5BEu.js → syntax-C-M-8jOU.js} +1 -1
  339. package/dist/ui/assets/syntax-C-M-8jOU.js.gz +0 -0
  340. package/dist/ui/assets/{theme-DZtFA8b4.js → theme-BQZdiqwv.js} +1 -1
  341. package/dist/ui/assets/{timeline-definition-IT6M3QCI-Jh_WZzXv.js → timeline-definition-IT6M3QCI-D6P5txjT.js} +1 -1
  342. package/dist/ui/assets/timeline-definition-IT6M3QCI-D6P5txjT.js.gz +0 -0
  343. package/dist/ui/assets/{treemap-KMMF4GRG-CPYIgjxE.js → treemap-KMMF4GRG-Bitm3gy4.js} +1 -1
  344. package/dist/ui/assets/{knowledgeRoutes-CivaUqha.js → useUserLocalStorage-Ckb8HsIw.js} +1 -1
  345. package/dist/ui/assets/useUserLocalStorage-Ckb8HsIw.js.gz +0 -0
  346. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-CERc7Rdb.js → xychartDiagram-PRI3JC2R-CsybjUbd.js} +1 -1
  347. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CsybjUbd.js.gz +0 -0
  348. package/dist/ui/index.html +13 -11
  349. package/dist/ui/index.html.gz +0 -0
  350. package/package.json +10 -9
  351. package/dist/ui/assets/App-9s2WHM6S.js +0 -22
  352. package/dist/ui/assets/App-9s2WHM6S.js.gz +0 -0
  353. package/dist/ui/assets/App-BAdBsEnV.css.gz +0 -0
  354. package/dist/ui/assets/ArtifactConsentModal-ParNk5kW.js.gz +0 -0
  355. package/dist/ui/assets/ArtifactFullscreenPage-VQxLMCiN.js +0 -9
  356. package/dist/ui/assets/ArtifactFullscreenPage-VQxLMCiN.js.gz +0 -0
  357. package/dist/ui/assets/AutocompleteTextarea-3RchrIgk.js +0 -18
  358. package/dist/ui/assets/AutocompleteTextarea-3RchrIgk.js.gz +0 -0
  359. package/dist/ui/assets/CodeEditor.inner-D51Z_CLQ.js.gz +0 -0
  360. package/dist/ui/assets/ConversationView-Dyddw2b1.js +0 -34
  361. package/dist/ui/assets/ConversationView-Dyddw2b1.js.gz +0 -0
  362. package/dist/ui/assets/KnowledgePage-CdftslnF.js +0 -24
  363. package/dist/ui/assets/KnowledgePage-CdftslnF.js.gz +0 -0
  364. package/dist/ui/assets/MobileApp-BdBMpnJ1.js +0 -1
  365. package/dist/ui/assets/MobileApp-BdBMpnJ1.js.gz +0 -0
  366. package/dist/ui/assets/StreamdownDemoPage-B9wbgp2s.js.gz +0 -0
  367. package/dist/ui/assets/ThemeSwitcher-ubn6IOz9.js.gz +0 -0
  368. package/dist/ui/assets/antd-C-HfEC4E.js +0 -400
  369. package/dist/ui/assets/antd-C-HfEC4E.js.gz +0 -0
  370. package/dist/ui/assets/architecture-U656AL7Q-dkBewUpN.js +0 -1
  371. package/dist/ui/assets/architectureDiagram-VXUJARFQ-ChmZt3zk.js.gz +0 -0
  372. package/dist/ui/assets/blockDiagram-VD42YOAC-CzGHAHao.js.gz +0 -0
  373. package/dist/ui/assets/c4Diagram-YG6GDRKO-DscJyaWN.js.gz +0 -0
  374. package/dist/ui/assets/channel-DvRQqEqC.js +0 -1
  375. package/dist/ui/assets/chunk-55IACEB6-DojF2pZN.js +0 -1
  376. package/dist/ui/assets/chunk-ABZYJK2D-RzDCrjE6.js.gz +0 -0
  377. package/dist/ui/assets/chunk-AGHRB4JF-jidCS5Of.js.gz +0 -0
  378. package/dist/ui/assets/chunk-ATLVNIR6-BEIIfJtC.js.gz +0 -0
  379. package/dist/ui/assets/chunk-B4BG7PRW-B8b6dQQ2.js.gz +0 -0
  380. package/dist/ui/assets/chunk-DI55MBZ5-BfATX3V8.js.gz +0 -0
  381. package/dist/ui/assets/chunk-EXTU4WIE-BKt6lPJM.js +0 -1
  382. package/dist/ui/assets/chunk-HN2XXSSU-BCHvD80g.js.gz +0 -0
  383. package/dist/ui/assets/chunk-JA3XYJ7Z-Cp6dqHnY.js.gz +0 -0
  384. package/dist/ui/assets/chunk-JZLCHNYA-cKMooY3y.js.gz +0 -0
  385. package/dist/ui/assets/chunk-MI3HLSF2-BlzO5wOE.js.gz +0 -0
  386. package/dist/ui/assets/chunk-N4CR4FBY-pASDorUx.js +0 -2
  387. package/dist/ui/assets/chunk-N4CR4FBY-pASDorUx.js.gz +0 -0
  388. package/dist/ui/assets/chunk-QXUST7PY-C9l0muI0.js.gz +0 -0
  389. package/dist/ui/assets/chunk-QZHKN3VN-CZskCFCf.js +0 -1
  390. package/dist/ui/assets/chunk-S3R3BYOJ-VJiLzt2o.js.gz +0 -0
  391. package/dist/ui/assets/chunk-TZMSLE5B-DZwI0C_2.js.gz +0 -0
  392. package/dist/ui/assets/classDiagram-2ON5EDUG-BFASUbmZ.js +0 -1
  393. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BFASUbmZ.js +0 -1
  394. package/dist/ui/assets/cose-bilkent-S5V4N54A-Ipik-oSD.js.gz +0 -0
  395. package/dist/ui/assets/dagre-6UL2VRFP-BDpyWQnh.js.gz +0 -0
  396. package/dist/ui/assets/dagre-CgA4KhUX.js.gz +0 -0
  397. package/dist/ui/assets/diagram-PSM6KHXK-B4GRzxLJ.js.gz +0 -0
  398. package/dist/ui/assets/diagram-QEK2KX5R-BWPW28XI.js.gz +0 -0
  399. package/dist/ui/assets/diagram-S2PKOQOG-BIHhcGoV.js.gz +0 -0
  400. package/dist/ui/assets/editor-C-HJ7Yw0.js.gz +0 -0
  401. package/dist/ui/assets/emoji-D8F6B62m.js.gz +0 -0
  402. package/dist/ui/assets/erDiagram-Q2GNP2WA-ubTaAFcK.js.gz +0 -0
  403. package/dist/ui/assets/flowDiagram-NV44I4VS-BHLCTYjI.js.gz +0 -0
  404. package/dist/ui/assets/ganttDiagram-LVOFAZNH-ClC3pay1.js.gz +0 -0
  405. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-Clqpiswu.js.gz +0 -0
  406. package/dist/ui/assets/index-D9OElx9A.css +0 -1
  407. package/dist/ui/assets/index-D9OElx9A.css.gz +0 -0
  408. package/dist/ui/assets/index-DxPuzG7E.js +0 -350
  409. package/dist/ui/assets/index-DxPuzG7E.js.gz +0 -0
  410. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CrVickA2.js.gz +0 -0
  411. package/dist/ui/assets/kanban-definition-3W4ZIXB7-C_BsdHYL.js.gz +0 -0
  412. package/dist/ui/assets/knowledgeRoutes-CivaUqha.js.gz +0 -0
  413. package/dist/ui/assets/linear-BsjageUB.js.gz +0 -0
  414. package/dist/ui/assets/mermaid-parser.core-DZdP-NFq.js.gz +0 -0
  415. package/dist/ui/assets/mermaid.core-TNrI0pHG.js.gz +0 -0
  416. package/dist/ui/assets/message-BtWWJ9Af.js +0 -36
  417. package/dist/ui/assets/message-BtWWJ9Af.js.gz +0 -0
  418. package/dist/ui/assets/mindmap-definition-VGOIOE7T-BbmaUjMY.js.gz +0 -0
  419. package/dist/ui/assets/particles-Dv28pjOd.js.gz +0 -0
  420. package/dist/ui/assets/pieDiagram-ADFJNKIX-BbyjfYu8.js.gz +0 -0
  421. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-Bc3GqMKz.js.gz +0 -0
  422. package/dist/ui/assets/reactflow-BVYPxNhc.js.gz +0 -0
  423. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-BQaKKL09.js.gz +0 -0
  424. package/dist/ui/assets/sandpack-BQW_FQ7G.js.gz +0 -0
  425. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DiJvDvhb.js.gz +0 -0
  426. package/dist/ui/assets/sequenceDiagram-WL72ISMW-Dw32824o.js.gz +0 -0
  427. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BCOpNdHV.js.gz +0 -0
  428. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-Cuqwvgfg.js +0 -1
  429. package/dist/ui/assets/syntax-VJrU5BEu.js.gz +0 -0
  430. package/dist/ui/assets/timeline-definition-IT6M3QCI-Jh_WZzXv.js.gz +0 -0
  431. package/dist/ui/assets/xychartDiagram-PRI3JC2R-CERc7Rdb.js.gz +0 -0
@@ -543,6 +543,9 @@ async function getBaseUrl() {
543
543
  if (config.daemon?.base_url) {
544
544
  return validateBaseUrl(config.daemon.base_url);
545
545
  }
546
+ if (config.ui?.base_url) {
547
+ return validateBaseUrl(config.ui.base_url);
548
+ }
546
549
  const defaults = getDefaultConfig();
547
550
  const envPort = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : void 0;
548
551
  const port = envPort || config.daemon?.port || defaults.daemon?.port || DAEMON.DEFAULT_PORT;
@@ -857,7 +860,7 @@ var init_schedule = __esm({
857
860
  });
858
861
 
859
862
  // src/types/session.ts
860
- var SessionStatus;
863
+ var SessionStatus, EXECUTING_SESSION_STATUSES;
861
864
  var init_session = __esm({
862
865
  "src/types/session.ts"() {
863
866
  "use strict";
@@ -875,11 +878,17 @@ var init_session = __esm({
875
878
  COMPLETED: "completed",
876
879
  FAILED: "failed"
877
880
  };
881
+ EXECUTING_SESSION_STATUSES = /* @__PURE__ */ new Set([
882
+ SessionStatus.RUNNING,
883
+ SessionStatus.STOPPING,
884
+ SessionStatus.AWAITING_PERMISSION,
885
+ SessionStatus.AWAITING_INPUT
886
+ ]);
878
887
  }
879
888
  });
880
889
 
881
890
  // src/types/task.ts
882
- var TaskStatus, TERMINAL_TASK_STATUSES;
891
+ var TaskStatus, TERMINAL_TASK_STATUSES, EXECUTING_TASK_STATUSES;
883
892
  var init_task = __esm({
884
893
  "src/types/task.ts"() {
885
894
  "use strict";
@@ -907,6 +916,12 @@ var init_task = __esm({
907
916
  TaskStatus.STOPPED,
908
917
  TaskStatus.TIMED_OUT
909
918
  ]);
919
+ EXECUTING_TASK_STATUSES = /* @__PURE__ */ new Set([
920
+ TaskStatus.RUNNING,
921
+ TaskStatus.STOPPING,
922
+ TaskStatus.AWAITING_PERMISSION,
923
+ TaskStatus.AWAITING_INPUT
924
+ ]);
910
925
  }
911
926
  });
912
927
 
@@ -1070,6 +1085,8 @@ __export(schema_postgres_exports, {
1070
1085
  serializedSessions: () => serializedSessions,
1071
1086
  sessionEnvSelections: () => sessionEnvSelections,
1072
1087
  sessionMcpServers: () => sessionMcpServers,
1088
+ sessionRelationships: () => sessionRelationships,
1089
+ sessionRelationshipsRelations: () => sessionRelationshipsRelations,
1073
1090
  sessions: () => sessions,
1074
1091
  sessionsRelations: () => sessionsRelations,
1075
1092
  tasks: () => tasks,
@@ -1078,7 +1095,7 @@ __export(schema_postgres_exports, {
1078
1095
  userMcpOauthTokens: () => userMcpOauthTokens,
1079
1096
  users: () => users
1080
1097
  });
1081
- var import_drizzle_orm, import_pg_core, bytea, t, sessions, tasks, serializedSessions, messages, boards, repos, branches, branchOwners, boardOwners, schedules, users, groups, groupMemberships, branchGroupGrants, boardGroupGrants, appVariables, userApiKeys, mcpServers, cardTypes, cards, artifacts, artifactTrustGrants, boardObjects, sessionMcpServers, userMcpOauthTokens, boardComments, gatewayChannels, threadSessionMap, sessionEnvSelections, kbNamespaces, kbNamespaceAcl, kbDocuments, kbDocumentVersions, kbDocumentUnits, kbEmbeddingSpaces, kbGraphNodes, kbGraphEdges, sessionsRelations, branchesRelations, schedulesRelations;
1098
+ var import_drizzle_orm, import_pg_core, bytea, t, sessions, sessionRelationships, tasks, serializedSessions, messages, boards, repos, branches, branchOwners, boardOwners, schedules, users, groups, groupMemberships, branchGroupGrants, boardGroupGrants, appVariables, userApiKeys, mcpServers, cardTypes, cards, artifacts, artifactTrustGrants, boardObjects, sessionMcpServers, userMcpOauthTokens, boardComments, gatewayChannels, threadSessionMap, sessionEnvSelections, kbNamespaces, kbNamespaceAcl, kbDocuments, kbDocumentVersions, kbDocumentUnits, kbEmbeddingSpaces, kbGraphNodes, kbGraphEdges, sessionsRelations, sessionRelationshipsRelations, branchesRelations, schedulesRelations;
1082
1099
  var init_schema_postgres = __esm({
1083
1100
  "src/db/schema.postgres.ts"() {
1084
1101
  "use strict";
@@ -1173,6 +1190,36 @@ var init_schema_postgres = __esm({
1173
1190
  scheduleRunUnique: (0, import_pg_core.uniqueIndex)("sessions_schedule_run_unique").on(table.schedule_id, table.scheduled_run_at).where(import_drizzle_orm.sql`${table.schedule_id} IS NOT NULL AND ${table.scheduled_run_at} IS NOT NULL`)
1174
1191
  })
1175
1192
  );
1193
+ sessionRelationships = (0, import_pg_core.pgTable)(
1194
+ "session_relationships",
1195
+ {
1196
+ relationship_id: (0, import_pg_core.varchar)("relationship_id", { length: 36 }).primaryKey(),
1197
+ source_session_id: (0, import_pg_core.varchar)("source_session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1198
+ target_session_id: (0, import_pg_core.varchar)("target_session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1199
+ relationship_type: (0, import_pg_core.text)("relationship_type", { enum: ["remote_create"] }).notNull(),
1200
+ created_by: (0, import_pg_core.varchar)("created_by", { length: 36 }).notNull(),
1201
+ created_at: t.timestamp("created_at").notNull(),
1202
+ updated_at: t.timestamp("updated_at"),
1203
+ callback_enabled: t.bool("callback_enabled").notNull().default(false),
1204
+ callback_session_id: (0, import_pg_core.varchar)("callback_session_id", { length: 36 }).references(
1205
+ () => sessions.session_id,
1206
+ {
1207
+ onDelete: "set null"
1208
+ }
1209
+ ),
1210
+ data: t.json("data")
1211
+ },
1212
+ (table) => ({
1213
+ sourceIdx: (0, import_pg_core.index)("session_relationships_source_idx").on(table.source_session_id),
1214
+ targetIdx: (0, import_pg_core.index)("session_relationships_target_idx").on(table.target_session_id),
1215
+ callbackIdx: (0, import_pg_core.index)("session_relationships_callback_idx").on(table.callback_session_id),
1216
+ sourceTargetTypeUnique: (0, import_pg_core.uniqueIndex)("session_relationships_source_target_type_unique").on(
1217
+ table.source_session_id,
1218
+ table.target_session_id,
1219
+ table.relationship_type
1220
+ )
1221
+ })
1222
+ );
1176
1223
  tasks = (0, import_pg_core.pgTable)(
1177
1224
  "tasks",
1178
1225
  {
@@ -1709,6 +1756,12 @@ var init_schema_postgres = __esm({
1709
1756
  branch_id: (0, import_pg_core.varchar)("branch_id", { length: 36 }).references(() => branches.branch_id, {
1710
1757
  onDelete: "set null"
1711
1758
  }),
1759
+ source_session_id: (0, import_pg_core.varchar)("source_session_id", { length: 36 }).references(
1760
+ () => sessions.session_id,
1761
+ {
1762
+ onDelete: "set null"
1763
+ }
1764
+ ),
1712
1765
  board_id: (0, import_pg_core.varchar)("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
1713
1766
  name: (0, import_pg_core.text)("name").notNull(),
1714
1767
  description: (0, import_pg_core.text)("description"),
@@ -1735,6 +1788,7 @@ var init_schema_postgres = __esm({
1735
1788
  },
1736
1789
  (table) => ({
1737
1790
  branchIdx: (0, import_pg_core.index)("artifacts_branch_idx").on(table.branch_id),
1791
+ sourceSessionIdx: (0, import_pg_core.index)("artifacts_source_session_idx").on(table.source_session_id),
1738
1792
  boardIdx: (0, import_pg_core.index)("artifacts_board_idx").on(table.board_id),
1739
1793
  archivedIdx: (0, import_pg_core.index)("artifacts_archived_idx").on(table.archived),
1740
1794
  publicIdx: (0, import_pg_core.index)("artifacts_public_idx").on(table.public)
@@ -1891,7 +1945,7 @@ var init_schema_postgres = __esm({
1891
1945
  // Materialized for queries
1892
1946
  name: (0, import_pg_core.text)("name").notNull(),
1893
1947
  channel_type: (0, import_pg_core.text)("channel_type", {
1894
- enum: ["slack", "discord", "whatsapp", "telegram", "github"]
1948
+ enum: ["slack", "discord", "whatsapp", "telegram", "github", "teams"]
1895
1949
  }).notNull(),
1896
1950
  target_branch_id: (0, import_pg_core.varchar)("target_branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
1897
1951
  agor_user_id: (0, import_pg_core.varchar)("agor_user_id", { length: 36 }).notNull(),
@@ -2275,7 +2329,7 @@ var init_schema_postgres = __esm({
2275
2329
  archivedIdx: (0, import_pg_core.index)("kb_graph_edges_archived_idx").on(table.archived)
2276
2330
  })
2277
2331
  );
2278
- sessionsRelations = (0, import_drizzle_orm.relations)(sessions, ({ one }) => ({
2332
+ sessionsRelations = (0, import_drizzle_orm.relations)(sessions, ({ one, many }) => ({
2279
2333
  branch: one(branches, {
2280
2334
  fields: [sessions.branch_id],
2281
2335
  references: [branches.branch_id]
@@ -2283,6 +2337,24 @@ var init_schema_postgres = __esm({
2283
2337
  schedule: one(schedules, {
2284
2338
  fields: [sessions.schedule_id],
2285
2339
  references: [schedules.schedule_id]
2340
+ }),
2341
+ outboundRelationships: many(sessionRelationships, { relationName: "relationshipSource" }),
2342
+ inboundRelationships: many(sessionRelationships, { relationName: "relationshipTarget" })
2343
+ }));
2344
+ sessionRelationshipsRelations = (0, import_drizzle_orm.relations)(sessionRelationships, ({ one }) => ({
2345
+ sourceSession: one(sessions, {
2346
+ fields: [sessionRelationships.source_session_id],
2347
+ references: [sessions.session_id],
2348
+ relationName: "relationshipSource"
2349
+ }),
2350
+ targetSession: one(sessions, {
2351
+ fields: [sessionRelationships.target_session_id],
2352
+ references: [sessions.session_id],
2353
+ relationName: "relationshipTarget"
2354
+ }),
2355
+ callbackSession: one(sessions, {
2356
+ fields: [sessionRelationships.callback_session_id],
2357
+ references: [sessions.session_id]
2286
2358
  })
2287
2359
  }));
2288
2360
  branchesRelations = (0, import_drizzle_orm.relations)(branches, ({ many }) => ({
@@ -2335,6 +2407,8 @@ __export(schema_sqlite_exports, {
2335
2407
  serializedSessions: () => serializedSessions2,
2336
2408
  sessionEnvSelections: () => sessionEnvSelections2,
2337
2409
  sessionMcpServers: () => sessionMcpServers2,
2410
+ sessionRelationships: () => sessionRelationships2,
2411
+ sessionRelationshipsRelations: () => sessionRelationshipsRelations2,
2338
2412
  sessions: () => sessions2,
2339
2413
  sessionsRelations: () => sessionsRelations2,
2340
2414
  tasks: () => tasks2,
@@ -2343,7 +2417,7 @@ __export(schema_sqlite_exports, {
2343
2417
  userMcpOauthTokens: () => userMcpOauthTokens2,
2344
2418
  users: () => users2
2345
2419
  });
2346
- var import_drizzle_orm2, import_sqlite_core, t2, sessions2, tasks2, serializedSessions2, messages2, boards2, repos2, branches2, branchOwners2, boardOwners2, schedules2, users2, groups2, groupMemberships2, branchGroupGrants2, boardGroupGrants2, appVariables2, userApiKeys2, mcpServers2, cardTypes2, cards2, artifacts2, artifactTrustGrants2, boardObjects2, sessionMcpServers2, userMcpOauthTokens2, boardComments2, gatewayChannels2, threadSessionMap2, sessionEnvSelections2, kbNamespaces2, kbNamespaceAcl2, kbDocuments2, kbDocumentVersions2, kbDocumentUnits2, kbEmbeddingSpaces2, kbGraphNodes2, kbGraphEdges2, sessionsRelations2, branchesRelations2, schedulesRelations2;
2420
+ var import_drizzle_orm2, import_sqlite_core, t2, sessions2, sessionRelationships2, tasks2, serializedSessions2, messages2, boards2, repos2, branches2, branchOwners2, boardOwners2, schedules2, users2, groups2, groupMemberships2, branchGroupGrants2, boardGroupGrants2, appVariables2, userApiKeys2, mcpServers2, cardTypes2, cards2, artifacts2, artifactTrustGrants2, boardObjects2, sessionMcpServers2, userMcpOauthTokens2, boardComments2, gatewayChannels2, threadSessionMap2, sessionEnvSelections2, kbNamespaces2, kbNamespaceAcl2, kbDocuments2, kbDocumentVersions2, kbDocumentUnits2, kbEmbeddingSpaces2, kbGraphNodes2, kbGraphEdges2, sessionsRelations2, sessionRelationshipsRelations2, branchesRelations2, schedulesRelations2;
2347
2421
  var init_schema_sqlite = __esm({
2348
2422
  "src/db/schema.sqlite.ts"() {
2349
2423
  "use strict";
@@ -2435,6 +2509,36 @@ var init_schema_sqlite = __esm({
2435
2509
  scheduleRunUnique: (0, import_sqlite_core.uniqueIndex)("sessions_schedule_run_unique").on(table.schedule_id, table.scheduled_run_at).where(import_drizzle_orm2.sql`${table.schedule_id} IS NOT NULL AND ${table.scheduled_run_at} IS NOT NULL`)
2436
2510
  })
2437
2511
  );
2512
+ sessionRelationships2 = (0, import_sqlite_core.sqliteTable)(
2513
+ "session_relationships",
2514
+ {
2515
+ relationship_id: (0, import_sqlite_core.text)("relationship_id", { length: 36 }).primaryKey(),
2516
+ source_session_id: (0, import_sqlite_core.text)("source_session_id", { length: 36 }).notNull().references(() => sessions2.session_id, { onDelete: "cascade" }),
2517
+ target_session_id: (0, import_sqlite_core.text)("target_session_id", { length: 36 }).notNull().references(() => sessions2.session_id, { onDelete: "cascade" }),
2518
+ relationship_type: (0, import_sqlite_core.text)("relationship_type", { enum: ["remote_create"] }).notNull(),
2519
+ created_by: (0, import_sqlite_core.text)("created_by", { length: 36 }).notNull(),
2520
+ created_at: t2.timestamp("created_at").notNull(),
2521
+ updated_at: t2.timestamp("updated_at"),
2522
+ callback_enabled: t2.bool("callback_enabled").notNull().default(false),
2523
+ callback_session_id: (0, import_sqlite_core.text)("callback_session_id", { length: 36 }).references(
2524
+ () => sessions2.session_id,
2525
+ {
2526
+ onDelete: "set null"
2527
+ }
2528
+ ),
2529
+ data: t2.json("data")
2530
+ },
2531
+ (table) => ({
2532
+ sourceIdx: (0, import_sqlite_core.index)("session_relationships_source_idx").on(table.source_session_id),
2533
+ targetIdx: (0, import_sqlite_core.index)("session_relationships_target_idx").on(table.target_session_id),
2534
+ callbackIdx: (0, import_sqlite_core.index)("session_relationships_callback_idx").on(table.callback_session_id),
2535
+ sourceTargetTypeUnique: (0, import_sqlite_core.uniqueIndex)("session_relationships_source_target_type_unique").on(
2536
+ table.source_session_id,
2537
+ table.target_session_id,
2538
+ table.relationship_type
2539
+ )
2540
+ })
2541
+ );
2438
2542
  tasks2 = (0, import_sqlite_core.sqliteTable)(
2439
2543
  "tasks",
2440
2544
  {
@@ -2979,6 +3083,12 @@ var init_schema_sqlite = __esm({
2979
3083
  branch_id: (0, import_sqlite_core.text)("branch_id", { length: 36 }).references(() => branches2.branch_id, {
2980
3084
  onDelete: "set null"
2981
3085
  }),
3086
+ source_session_id: (0, import_sqlite_core.text)("source_session_id", { length: 36 }).references(
3087
+ () => sessions2.session_id,
3088
+ {
3089
+ onDelete: "set null"
3090
+ }
3091
+ ),
2982
3092
  board_id: (0, import_sqlite_core.text)("board_id", { length: 36 }).notNull().references(() => boards2.board_id, { onDelete: "cascade" }),
2983
3093
  name: (0, import_sqlite_core.text)("name").notNull(),
2984
3094
  description: (0, import_sqlite_core.text)("description"),
@@ -3005,6 +3115,7 @@ var init_schema_sqlite = __esm({
3005
3115
  },
3006
3116
  (table) => ({
3007
3117
  branchIdx: (0, import_sqlite_core.index)("artifacts_branch_idx").on(table.branch_id),
3118
+ sourceSessionIdx: (0, import_sqlite_core.index)("artifacts_source_session_idx").on(table.source_session_id),
3008
3119
  boardIdx: (0, import_sqlite_core.index)("artifacts_board_idx").on(table.board_id),
3009
3120
  archivedIdx: (0, import_sqlite_core.index)("artifacts_archived_idx").on(table.archived),
3010
3121
  publicIdx: (0, import_sqlite_core.index)("artifacts_public_idx").on(table.public)
@@ -3163,7 +3274,7 @@ var init_schema_sqlite = __esm({
3163
3274
  // Materialized for queries
3164
3275
  name: (0, import_sqlite_core.text)("name").notNull(),
3165
3276
  channel_type: (0, import_sqlite_core.text)("channel_type", {
3166
- enum: ["slack", "discord", "whatsapp", "telegram", "github"]
3277
+ enum: ["slack", "discord", "whatsapp", "telegram", "github", "teams"]
3167
3278
  }).notNull(),
3168
3279
  target_branch_id: (0, import_sqlite_core.text)("target_branch_id", { length: 36 }).notNull().references(() => branches2.branch_id, { onDelete: "cascade" }),
3169
3280
  agor_user_id: (0, import_sqlite_core.text)("agor_user_id", { length: 36 }).notNull(),
@@ -3546,7 +3657,7 @@ var init_schema_sqlite = __esm({
3546
3657
  archivedIdx: (0, import_sqlite_core.index)("kb_graph_edges_archived_idx").on(table.archived)
3547
3658
  })
3548
3659
  );
3549
- sessionsRelations2 = (0, import_drizzle_orm2.relations)(sessions2, ({ one }) => ({
3660
+ sessionsRelations2 = (0, import_drizzle_orm2.relations)(sessions2, ({ one, many }) => ({
3550
3661
  branch: one(branches2, {
3551
3662
  fields: [sessions2.branch_id],
3552
3663
  references: [branches2.branch_id]
@@ -3554,6 +3665,24 @@ var init_schema_sqlite = __esm({
3554
3665
  schedule: one(schedules2, {
3555
3666
  fields: [sessions2.schedule_id],
3556
3667
  references: [schedules2.schedule_id]
3668
+ }),
3669
+ outboundRelationships: many(sessionRelationships2, { relationName: "relationshipSource" }),
3670
+ inboundRelationships: many(sessionRelationships2, { relationName: "relationshipTarget" })
3671
+ }));
3672
+ sessionRelationshipsRelations2 = (0, import_drizzle_orm2.relations)(sessionRelationships2, ({ one }) => ({
3673
+ sourceSession: one(sessions2, {
3674
+ fields: [sessionRelationships2.source_session_id],
3675
+ references: [sessions2.session_id],
3676
+ relationName: "relationshipSource"
3677
+ }),
3678
+ targetSession: one(sessions2, {
3679
+ fields: [sessionRelationships2.target_session_id],
3680
+ references: [sessions2.session_id],
3681
+ relationName: "relationshipTarget"
3682
+ }),
3683
+ callbackSession: one(sessions2, {
3684
+ fields: [sessionRelationships2.callback_session_id],
3685
+ references: [sessions2.session_id]
3557
3686
  })
3558
3687
  }));
3559
3688
  branchesRelations2 = (0, import_drizzle_orm2.relations)(branches2, ({ many }) => ({
@@ -3904,6 +4033,7 @@ __export(schema_exports, {
3904
4033
  serializedSessions: () => serializedSessions3,
3905
4034
  sessionEnvSelections: () => sessionEnvSelections3,
3906
4035
  sessionMcpServers: () => sessionMcpServers3,
4036
+ sessionRelationships: () => sessionRelationships3,
3907
4037
  sessions: () => sessions3,
3908
4038
  tasks: () => tasks3,
3909
4039
  threadSessionMap: () => threadSessionMap3,
@@ -3911,7 +4041,7 @@ __export(schema_exports, {
3911
4041
  userMcpOauthTokens: () => userMcpOauthTokens3,
3912
4042
  users: () => users3
3913
4043
  });
3914
- var dialect, schema, sessions3, tasks3, messages3, boards3, repos3, branches3, branchOwners3, boardOwners3, groups3, groupMemberships3, branchGroupGrants3, boardGroupGrants3, schedules3, users3, appVariables3, mcpServers3, cardTypes3, cards3, artifacts3, artifactTrustGrants3, boardObjects3, sessionMcpServers3, sessionEnvSelections3, userMcpOauthTokens3, boardComments3, gatewayChannels3, threadSessionMap3, userApiKeys3, serializedSessions3, kbNamespaces3, kbNamespaceAcl3, kbDocuments3, kbDocumentVersions3, kbDocumentUnits3, kbEmbeddingSpaces3, kbGraphNodes3, kbGraphEdges3;
4044
+ var dialect, schema, sessions3, tasks3, messages3, boards3, repos3, branches3, branchOwners3, boardOwners3, groups3, groupMemberships3, branchGroupGrants3, boardGroupGrants3, schedules3, users3, appVariables3, mcpServers3, cardTypes3, cards3, artifacts3, artifactTrustGrants3, boardObjects3, sessionMcpServers3, sessionRelationships3, sessionEnvSelections3, userMcpOauthTokens3, boardComments3, gatewayChannels3, threadSessionMap3, userApiKeys3, serializedSessions3, kbNamespaces3, kbNamespaceAcl3, kbDocuments3, kbDocumentVersions3, kbDocumentUnits3, kbEmbeddingSpaces3, kbGraphNodes3, kbGraphEdges3;
3915
4045
  var init_schema = __esm({
3916
4046
  "src/db/schema.ts"() {
3917
4047
  "use strict";
@@ -3943,6 +4073,7 @@ var init_schema = __esm({
3943
4073
  artifactTrustGrants3 = schema.artifactTrustGrants;
3944
4074
  boardObjects3 = schema.boardObjects;
3945
4075
  sessionMcpServers3 = schema.sessionMcpServers;
4076
+ sessionRelationships3 = schema.sessionRelationships;
3946
4077
  sessionEnvSelections3 = schema.sessionEnvSelections;
3947
4078
  userMcpOauthTokens3 = schema.userMcpOauthTokens;
3948
4079
  boardComments3 = schema.boardComments;
@@ -4200,6 +4331,7 @@ __export(db_exports, {
4200
4331
  SerializedSessionRepository: () => SerializedSessionRepository,
4201
4332
  SessionEnvSelectionRepository: () => SessionEnvSelectionRepository,
4202
4333
  SessionMCPServerRepository: () => SessionMCPServerRepository,
4334
+ SessionRelationshipRepository: () => SessionRelationshipRepository,
4203
4335
  SessionRepository: () => SessionRepository,
4204
4336
  TaskRepository: () => TaskRepository,
4205
4337
  ThreadSessionMapRepository: () => ThreadSessionMapRepository,
@@ -4207,11 +4339,11 @@ __export(db_exports, {
4207
4339
  UserMCPOAuthTokenRepository: () => UserMCPOAuthTokenRepository,
4208
4340
  UsersRepository: () => UsersRepository,
4209
4341
  advisoryLockKeyForUuid: () => advisoryLockKeyForUuid,
4210
- and: () => import_drizzle_orm33.and,
4342
+ and: () => import_drizzle_orm34.and,
4211
4343
  appVariables: () => appVariables3,
4212
4344
  artifactTrustGrants: () => artifactTrustGrants3,
4213
4345
  artifacts: () => artifacts3,
4214
- asc: () => import_drizzle_orm33.asc,
4346
+ asc: () => import_drizzle_orm34.asc,
4215
4347
  assertUsableBootstrapAdminPassword: () => assertUsableBootstrapAdminPassword,
4216
4348
  boardComments: () => boardComments3,
4217
4349
  boardGroupGrants: () => boardGroupGrants3,
@@ -4234,9 +4366,9 @@ __export(db_exports, {
4234
4366
  dateTruncUtc: () => dateTruncUtc,
4235
4367
  decryptApiKey: () => decryptApiKey,
4236
4368
  deleteFrom: () => deleteFrom,
4237
- desc: () => import_drizzle_orm33.desc,
4369
+ desc: () => import_drizzle_orm34.desc,
4238
4370
  encryptApiKey: () => encryptApiKey,
4239
- eq: () => import_drizzle_orm33.eq,
4371
+ eq: () => import_drizzle_orm34.eq,
4240
4372
  executeAll: () => executeAll,
4241
4373
  executeGet: () => executeGet,
4242
4374
  executeRaw: () => executeRaw,
@@ -4252,11 +4384,11 @@ __export(db_exports, {
4252
4384
  getUserByEmail: () => getUserByEmail,
4253
4385
  groupMemberships: () => groupMemberships3,
4254
4386
  groups: () => groups3,
4255
- gt: () => import_drizzle_orm33.gt,
4256
- gte: () => import_drizzle_orm33.gte,
4387
+ gt: () => import_drizzle_orm34.gt,
4388
+ gte: () => import_drizzle_orm34.gte,
4257
4389
  hash: () => hash,
4258
4390
  identifyUrlParam: () => identifyUrlParam,
4259
- inArray: () => import_drizzle_orm33.inArray,
4391
+ inArray: () => import_drizzle_orm34.inArray,
4260
4392
  initializeDatabase: () => initializeDatabase,
4261
4393
  insert: () => insert,
4262
4394
  insertOne: () => insertOne,
@@ -4275,12 +4407,12 @@ __export(db_exports, {
4275
4407
  kbGraphNodes: () => kbGraphNodes3,
4276
4408
  kbNamespaceAcl: () => kbNamespaceAcl3,
4277
4409
  kbNamespaces: () => kbNamespaces3,
4278
- like: () => import_drizzle_orm33.like,
4410
+ like: () => import_drizzle_orm34.like,
4279
4411
  lockRowForUpdate: () => lockRowForUpdate,
4280
- lte: () => import_drizzle_orm33.lte,
4412
+ lte: () => import_drizzle_orm34.lte,
4281
4413
  mcpServers: () => mcpServers3,
4282
4414
  messages: () => messages3,
4283
- or: () => import_drizzle_orm33.or,
4415
+ or: () => import_drizzle_orm34.or,
4284
4416
  reattributeLegacyAnonymousRows: () => reattributeLegacyAnonymousRows,
4285
4417
  repos: () => repos3,
4286
4418
  resolveByShortIdPrefix: () => resolveByShortIdPrefix,
@@ -4292,9 +4424,10 @@ __export(db_exports, {
4292
4424
  serializedSessions: () => serializedSessions3,
4293
4425
  sessionEnvSelections: () => sessionEnvSelections3,
4294
4426
  sessionMcpServers: () => sessionMcpServers3,
4427
+ sessionRelationships: () => sessionRelationships3,
4295
4428
  sessions: () => sessions3,
4296
4429
  shortId: () => shortId,
4297
- sql: () => import_drizzle_orm33.sql,
4430
+ sql: () => import_drizzle_orm34.sql,
4298
4431
  tasks: () => tasks3,
4299
4432
  threadSessionMap: () => threadSessionMap3,
4300
4433
  tryAdvisoryXactLock: () => tryAdvisoryXactLock,
@@ -4309,7 +4442,7 @@ __export(db_exports, {
4309
4442
  });
4310
4443
  module.exports = __toCommonJS(db_exports);
4311
4444
  init_cjs_shims();
4312
- var import_drizzle_orm33 = require("drizzle-orm");
4445
+ var import_drizzle_orm34 = require("drizzle-orm");
4313
4446
  var import_bcryptjs3 = __toESM(require("bcryptjs"), 1);
4314
4447
  init_ids();
4315
4448
 
@@ -4437,8 +4570,8 @@ function createPostgresDatabase(config) {
4437
4570
  if (config.ssl !== void 0) {
4438
4571
  options.ssl = config.ssl;
4439
4572
  }
4440
- const sql15 = (0, import_postgres.default)(config.url, options);
4441
- return (0, import_postgres_js.drizzle)(sql15, { schema: schema_postgres_exports });
4573
+ const sql16 = (0, import_postgres.default)(config.url, options);
4574
+ return (0, import_postgres_js.drizzle)(sql16, { schema: schema_postgres_exports });
4442
4575
  } catch (error) {
4443
4576
  throw new DatabaseConnectionError(
4444
4577
  `Failed to create PostgreSQL client: ${error instanceof Error ? error.message : String(error)}`,
@@ -5129,6 +5262,7 @@ var ArtifactRepository = class {
5129
5262
  return {
5130
5263
  artifact_id: artifactId,
5131
5264
  branch_id: row.branch_id ?? null,
5265
+ source_session_id: row.source_session_id ?? null,
5132
5266
  board_id: row.board_id,
5133
5267
  name: row.name,
5134
5268
  description: row.description ?? void 0,
@@ -5167,6 +5301,7 @@ var ArtifactRepository = class {
5167
5301
  const insertData = {
5168
5302
  artifact_id: artifactId,
5169
5303
  branch_id: data.branch_id ?? null,
5304
+ source_session_id: data.source_session_id ?? null,
5170
5305
  board_id: data.board_id ?? "",
5171
5306
  name: data.name ?? "Untitled Artifact",
5172
5307
  description: data.description ?? null,
@@ -5319,6 +5454,9 @@ var ArtifactRepository = class {
5319
5454
  setData.agor_grants = updates.agor_grants ?? null;
5320
5455
  }
5321
5456
  if (updates.public !== void 0) setData.public = updates.public;
5457
+ if (updates.source_session_id !== void 0) {
5458
+ setData.source_session_id = updates.source_session_id ?? null;
5459
+ }
5322
5460
  if (updates.archived !== void 0) setData.archived = updates.archived;
5323
5461
  if (updates.archived_at !== void 0) {
5324
5462
  setData.archived_at = updates.archived_at ? new Date(updates.archived_at) : null;
@@ -6544,6 +6682,7 @@ var FS_ACCESS_RANK = {
6544
6682
  };
6545
6683
  var VIEW_OR_BETTER_BRANCH_PERMISSIONS = ["view", "session", "prompt", "all"];
6546
6684
  var BRANCH_PERMISSION_SOURCES = ["board", "override"];
6685
+ var FS_ACCESS_BRANCH_PERMISSIONS = ["read", "write"];
6547
6686
  var BranchRepository = class {
6548
6687
  constructor(db) {
6549
6688
  this.db = db;
@@ -7037,6 +7176,83 @@ var BranchRepository = class {
7037
7176
  }
7038
7177
  return Array.from(userIds);
7039
7178
  }
7179
+ /**
7180
+ * Find users whose explicit branch or aligned-board grants should materialize
7181
+ * into filesystem access for the branch.
7182
+ *
7183
+ * This intentionally excludes ambient "others" access because there is no
7184
+ * bounded user set to expand. Board owners apply whenever the branch is
7185
+ * explicitly aligned to board permissions (`permission_source = 'board'`);
7186
+ * board group grants additionally require a shared board. Override branches
7187
+ * must not inherit board grants.
7188
+ */
7189
+ async findExplicitFsAccessUserIds(branchId) {
7190
+ const branchRow = await select(this.db, {
7191
+ board_id: branches3.board_id,
7192
+ permission_source: branches3.permission_source
7193
+ }).from(branches3).where((0, import_drizzle_orm14.eq)(branches3.branch_id, branchId)).one();
7194
+ const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where((0, import_drizzle_orm14.eq)(branchOwners3.branch_id, branchId)).all();
7195
+ const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm14.eq)(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
7196
+ groups3,
7197
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm14.eq)(groups3.archived, false))
7198
+ ).where(
7199
+ (0, import_drizzle_orm14.and)(
7200
+ (0, import_drizzle_orm14.eq)(branchGroupGrants3.branch_id, branchId),
7201
+ (0, import_drizzle_orm14.inArray)(
7202
+ import_drizzle_orm14.sql`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
7203
+ FS_ACCESS_BRANCH_PERMISSIONS
7204
+ )
7205
+ )
7206
+ ).all();
7207
+ const isBoardAligned = branchRow?.permission_source === "board" && branchRow.board_id;
7208
+ const boardOwnerRows = isBoardAligned ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where((0, import_drizzle_orm14.eq)(boardOwners3.board_id, branchRow.board_id)).all() : [];
7209
+ const boardGroupRows = isBoardAligned ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, (0, import_drizzle_orm14.eq)(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
7210
+ groups3,
7211
+ (0, import_drizzle_orm14.and)((0, import_drizzle_orm14.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm14.eq)(groups3.archived, false))
7212
+ ).innerJoin(
7213
+ boards3,
7214
+ (0, import_drizzle_orm14.and)(
7215
+ (0, import_drizzle_orm14.eq)(boards3.board_id, boardGroupGrants3.board_id),
7216
+ (0, import_drizzle_orm14.eq)(
7217
+ import_drizzle_orm14.sql`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`,
7218
+ "shared"
7219
+ )
7220
+ )
7221
+ ).where(
7222
+ (0, import_drizzle_orm14.and)(
7223
+ (0, import_drizzle_orm14.eq)(boardGroupGrants3.board_id, branchRow.board_id),
7224
+ (0, import_drizzle_orm14.inArray)(
7225
+ import_drizzle_orm14.sql`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
7226
+ FS_ACCESS_BRANCH_PERMISSIONS
7227
+ )
7228
+ )
7229
+ ).all() : [];
7230
+ const userIds = /* @__PURE__ */ new Set();
7231
+ for (const row of ownerRows) {
7232
+ userIds.add(row.user_id);
7233
+ }
7234
+ for (const row of groupRows) {
7235
+ userIds.add(row.user_id);
7236
+ }
7237
+ for (const row of boardOwnerRows) {
7238
+ userIds.add(row.user_id);
7239
+ }
7240
+ for (const row of boardGroupRows) {
7241
+ userIds.add(row.user_id);
7242
+ }
7243
+ return Array.from(userIds);
7244
+ }
7245
+ async findBoardAlignedBranches(boardId) {
7246
+ const rows = await select(this.db).from(branches3).where(
7247
+ (0, import_drizzle_orm14.and)(
7248
+ (0, import_drizzle_orm14.eq)(branches3.board_id, boardId),
7249
+ (0, import_drizzle_orm14.eq)(branches3.permission_source, "board"),
7250
+ (0, import_drizzle_orm14.eq)(branches3.archived, false)
7251
+ )
7252
+ ).all();
7253
+ const baseUrl = await getBaseUrl();
7254
+ return rows.map((row) => this.rowToBranch(row, baseUrl));
7255
+ }
7040
7256
  /**
7041
7257
  * Get all owners of a branch
7042
7258
  *
@@ -8612,8 +8828,10 @@ var SENSITIVE_CONFIG_FIELDS = [
8612
8828
  "signing_secret",
8613
8829
  // Slack
8614
8830
  "private_key",
8615
- "webhook_secret"
8831
+ "webhook_secret",
8616
8832
  // GitHub
8833
+ "app_password"
8834
+ // Teams (Azure Bot App Secret)
8617
8835
  ];
8618
8836
  var REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
8619
8837
  function encryptConfig(config) {
@@ -12461,10 +12679,170 @@ var SessionMCPServerRepository = class {
12461
12679
  }
12462
12680
  };
12463
12681
 
12682
+ // src/db/repositories/session-relationships.ts
12683
+ init_cjs_shims();
12684
+ var import_drizzle_orm28 = require("drizzle-orm");
12685
+ init_ids();
12686
+ init_database_wrapper();
12687
+ init_schema();
12688
+ var SessionRelationshipRepository = class {
12689
+ constructor(db) {
12690
+ this.db = db;
12691
+ }
12692
+ rowToRelationship(row) {
12693
+ return {
12694
+ relationship_id: row.relationship_id,
12695
+ source_session_id: row.source_session_id,
12696
+ target_session_id: row.target_session_id,
12697
+ relationship_type: row.relationship_type,
12698
+ created_by: row.created_by,
12699
+ created_at: new Date(row.created_at).toISOString(),
12700
+ updated_at: row.updated_at ? new Date(row.updated_at).toISOString() : null,
12701
+ callback_enabled: Boolean(row.callback_enabled),
12702
+ callback_session_id: row.callback_session_id ?? null,
12703
+ data: row.data ?? null
12704
+ };
12705
+ }
12706
+ async create(input) {
12707
+ try {
12708
+ const now = /* @__PURE__ */ new Date();
12709
+ const row = {
12710
+ relationship_id: generateId(),
12711
+ source_session_id: input.source_session_id,
12712
+ target_session_id: input.target_session_id,
12713
+ relationship_type: input.relationship_type,
12714
+ created_by: input.created_by,
12715
+ created_at: now,
12716
+ updated_at: now,
12717
+ callback_enabled: input.callback_enabled ?? false,
12718
+ callback_session_id: input.callback_session_id ?? null,
12719
+ data: input.data ?? null
12720
+ };
12721
+ await insert(this.db, sessionRelationships3).values(row).run();
12722
+ return this.rowToRelationship(row);
12723
+ } catch (error) {
12724
+ throw new RepositoryError(
12725
+ `Failed to create session relationship: ${error instanceof Error ? error.message : String(error)}`,
12726
+ error
12727
+ );
12728
+ }
12729
+ }
12730
+ async get(relationshipId) {
12731
+ try {
12732
+ const row = await select(this.db).from(sessionRelationships3).where((0, import_drizzle_orm28.eq)(sessionRelationships3.relationship_id, relationshipId)).one();
12733
+ if (!row) throw new EntityNotFoundError("SessionRelationship", relationshipId);
12734
+ return this.rowToRelationship(row);
12735
+ } catch (error) {
12736
+ if (error instanceof EntityNotFoundError) throw error;
12737
+ throw new RepositoryError(
12738
+ `Failed to get session relationship: ${error instanceof Error ? error.message : String(error)}`,
12739
+ error
12740
+ );
12741
+ }
12742
+ }
12743
+ async findForSession(sessionId) {
12744
+ try {
12745
+ const rows = await select(this.db).from(sessionRelationships3).where(
12746
+ (0, import_drizzle_orm28.or)(
12747
+ (0, import_drizzle_orm28.eq)(sessionRelationships3.source_session_id, sessionId),
12748
+ (0, import_drizzle_orm28.eq)(sessionRelationships3.target_session_id, sessionId)
12749
+ )
12750
+ ).all();
12751
+ return rows.map((row) => this.rowToRelationship(row));
12752
+ } catch (error) {
12753
+ throw new RepositoryError(
12754
+ `Failed to list session relationships: ${error instanceof Error ? error.message : String(error)}`,
12755
+ error
12756
+ );
12757
+ }
12758
+ }
12759
+ async findForSessions(sessionIds) {
12760
+ if (sessionIds.length === 0) return [];
12761
+ try {
12762
+ const rows = await select(this.db).from(sessionRelationships3).where(
12763
+ (0, import_drizzle_orm28.or)(
12764
+ (0, import_drizzle_orm28.inArray)(sessionRelationships3.source_session_id, sessionIds),
12765
+ (0, import_drizzle_orm28.inArray)(sessionRelationships3.target_session_id, sessionIds)
12766
+ )
12767
+ ).all();
12768
+ return rows.map((row) => this.rowToRelationship(row));
12769
+ } catch (error) {
12770
+ throw new RepositoryError(
12771
+ `Failed to list session relationships: ${error instanceof Error ? error.message : String(error)}`,
12772
+ error
12773
+ );
12774
+ }
12775
+ }
12776
+ async findRemoteChildren(sourceSessionId) {
12777
+ try {
12778
+ const rows = await select(this.db).from(sessionRelationships3).where(
12779
+ (0, import_drizzle_orm28.and)(
12780
+ (0, import_drizzle_orm28.eq)(sessionRelationships3.source_session_id, sourceSessionId),
12781
+ (0, import_drizzle_orm28.eq)(sessionRelationships3.relationship_type, "remote_create")
12782
+ )
12783
+ ).all();
12784
+ return rows.map((row) => this.rowToRelationship(row));
12785
+ } catch (error) {
12786
+ throw new RepositoryError(
12787
+ `Failed to list remote child relationships: ${error instanceof Error ? error.message : String(error)}`,
12788
+ error
12789
+ );
12790
+ }
12791
+ }
12792
+ async findRemoteParents(targetSessionId) {
12793
+ try {
12794
+ const rows = await select(this.db).from(sessionRelationships3).where(
12795
+ (0, import_drizzle_orm28.and)(
12796
+ (0, import_drizzle_orm28.eq)(sessionRelationships3.target_session_id, targetSessionId),
12797
+ (0, import_drizzle_orm28.eq)(sessionRelationships3.relationship_type, "remote_create")
12798
+ )
12799
+ ).all();
12800
+ return rows.map((row) => this.rowToRelationship(row));
12801
+ } catch (error) {
12802
+ throw new RepositoryError(
12803
+ `Failed to list remote parent relationships: ${error instanceof Error ? error.message : String(error)}`,
12804
+ error
12805
+ );
12806
+ }
12807
+ }
12808
+ async setCallbackEnabled(relationshipId, callbackEnabled) {
12809
+ try {
12810
+ const result = await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where((0, import_drizzle_orm28.eq)(sessionRelationships3.relationship_id, relationshipId)).run();
12811
+ if (result.rowsAffected === 0) {
12812
+ throw new EntityNotFoundError("SessionRelationship", relationshipId);
12813
+ }
12814
+ const row = await select(this.db).from(sessionRelationships3).where((0, import_drizzle_orm28.eq)(sessionRelationships3.relationship_id, relationshipId)).one();
12815
+ if (!row) throw new EntityNotFoundError("SessionRelationship", relationshipId);
12816
+ return this.rowToRelationship(row);
12817
+ } catch (error) {
12818
+ if (error instanceof EntityNotFoundError) throw error;
12819
+ throw new RepositoryError(
12820
+ `Failed to update session relationship callback state: ${error instanceof Error ? error.message : String(error)}`,
12821
+ error
12822
+ );
12823
+ }
12824
+ }
12825
+ async setCallbackEnabledForTargetSession(targetSessionId, callbackEnabled) {
12826
+ try {
12827
+ await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(
12828
+ (0, import_drizzle_orm28.and)(
12829
+ (0, import_drizzle_orm28.eq)(sessionRelationships3.target_session_id, targetSessionId),
12830
+ (0, import_drizzle_orm28.eq)(sessionRelationships3.relationship_type, "remote_create")
12831
+ )
12832
+ ).run();
12833
+ } catch (error) {
12834
+ throw new RepositoryError(
12835
+ `Failed to update target session relationship callback state: ${error instanceof Error ? error.message : String(error)}`,
12836
+ error
12837
+ );
12838
+ }
12839
+ }
12840
+ };
12841
+
12464
12842
  // src/db/repositories/tasks.ts
12465
12843
  init_cjs_shims();
12466
12844
  init_types2();
12467
- var import_drizzle_orm28 = require("drizzle-orm");
12845
+ var import_drizzle_orm29 = require("drizzle-orm");
12468
12846
  init_ids();
12469
12847
  init_database_wrapper();
12470
12848
  init_schema();
@@ -12552,7 +12930,7 @@ var TaskRepository = class {
12552
12930
  */
12553
12931
  async resolveId(id) {
12554
12932
  return resolveByShortIdPrefix(id, "Task", async (pattern) => {
12555
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm28.like)(tasks3.task_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
12933
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm29.like)(tasks3.task_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
12556
12934
  return rows.map((r) => r.task_id);
12557
12935
  });
12558
12936
  }
@@ -12563,7 +12941,7 @@ var TaskRepository = class {
12563
12941
  try {
12564
12942
  const insertData = this.taskToInsert(data);
12565
12943
  await insert(this.db, tasks3).values(insertData).run();
12566
- const row = await select(this.db).from(tasks3).where((0, import_drizzle_orm28.eq)(tasks3.task_id, insertData.task_id)).one();
12944
+ const row = await select(this.db).from(tasks3).where((0, import_drizzle_orm29.eq)(tasks3.task_id, insertData.task_id)).one();
12567
12945
  if (!row) {
12568
12946
  throw new RepositoryError("Failed to retrieve created task");
12569
12947
  }
@@ -12587,7 +12965,7 @@ var TaskRepository = class {
12587
12965
  const inserts = taskList.map((task) => this.taskToInsert(task));
12588
12966
  await insert(this.db, tasks3).values(inserts).run();
12589
12967
  const taskIds = inserts.map((t3) => t3.task_id);
12590
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm28.inArray)(tasks3.task_id, taskIds)).all();
12968
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm29.inArray)(tasks3.task_id, taskIds)).all();
12591
12969
  const rowsById = new Map(rows.map((r) => [r.task_id, r]));
12592
12970
  return taskIds.map((id) => this.rowToTask(rowsById.get(id)));
12593
12971
  } catch (error) {
@@ -12603,7 +12981,7 @@ var TaskRepository = class {
12603
12981
  async findById(id) {
12604
12982
  try {
12605
12983
  const fullId = await this.resolveId(id);
12606
- const row = await select(this.db).from(tasks3).where((0, import_drizzle_orm28.eq)(tasks3.task_id, fullId)).one();
12984
+ const row = await select(this.db).from(tasks3).where((0, import_drizzle_orm29.eq)(tasks3.task_id, fullId)).one();
12607
12985
  return row ? this.rowToTask(row) : null;
12608
12986
  } catch (error) {
12609
12987
  if (error instanceof EntityNotFoundError) return null;
@@ -12633,7 +13011,7 @@ var TaskRepository = class {
12633
13011
  */
12634
13012
  async findBySession(sessionId) {
12635
13013
  try {
12636
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm28.eq)(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
13014
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm29.eq)(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
12637
13015
  return rows.map((row) => this.rowToTask(row));
12638
13016
  } catch (error) {
12639
13017
  throw new RepositoryError(
@@ -12647,7 +13025,7 @@ var TaskRepository = class {
12647
13025
  */
12648
13026
  async findRunning() {
12649
13027
  try {
12650
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm28.eq)(tasks3.status, TaskStatus.RUNNING)).all();
13028
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm29.eq)(tasks3.status, TaskStatus.RUNNING)).all();
12651
13029
  return rows.map((row) => this.rowToTask(row));
12652
13030
  } catch (error) {
12653
13031
  throw new RepositoryError(
@@ -12668,7 +13046,7 @@ var TaskRepository = class {
12668
13046
  async findOrphaned() {
12669
13047
  try {
12670
13048
  const rows = await select(this.db).from(tasks3).where(
12671
- import_drizzle_orm28.sql`${tasks3.status} IN ('running', 'stopping', 'awaiting_permission', 'awaiting_input')`
13049
+ import_drizzle_orm29.sql`${tasks3.status} IN ('running', 'stopping', 'awaiting_permission', 'awaiting_input')`
12672
13050
  ).all();
12673
13051
  return rows.map((row) => this.rowToTask(row));
12674
13052
  } catch (error) {
@@ -12688,7 +13066,7 @@ var TaskRepository = class {
12688
13066
  async findActiveWithExecutorHeartbeat() {
12689
13067
  try {
12690
13068
  const rows = await select(this.db).from(tasks3).where(
12691
- import_drizzle_orm28.sql`${tasks3.status} IN ('running', 'stopping', 'awaiting_permission', 'awaiting_input') AND ${tasks3.last_executor_heartbeat_at} IS NOT NULL`
13069
+ import_drizzle_orm29.sql`${tasks3.status} IN ('running', 'stopping', 'awaiting_permission', 'awaiting_input') AND ${tasks3.last_executor_heartbeat_at} IS NOT NULL`
12692
13070
  ).all();
12693
13071
  return rows.map((row) => this.rowToTask(row));
12694
13072
  } catch (error) {
@@ -12703,7 +13081,7 @@ var TaskRepository = class {
12703
13081
  */
12704
13082
  async findByStatus(status) {
12705
13083
  try {
12706
- const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm28.eq)(tasks3.status, status)).all();
13084
+ const rows = await select(this.db).from(tasks3).where((0, import_drizzle_orm29.eq)(tasks3.status, status)).all();
12707
13085
  return rows.map((row) => this.rowToTask(row));
12708
13086
  } catch (error) {
12709
13087
  throw new RepositoryError(
@@ -12725,8 +13103,8 @@ var TaskRepository = class {
12725
13103
  `\u{1F504} [TaskRepo] Updating task ${shortId(fullId)}${updates.status ? ` (status: ${updates.status})` : ""}`
12726
13104
  );
12727
13105
  const result = await this.db.transaction(async (tx) => {
12728
- await lockRowForUpdate(txAsDb(tx), this.db, tasks3, (0, import_drizzle_orm28.eq)(tasks3.task_id, fullId));
12729
- const currentRow = await select(txAsDb(tx)).from(tasks3).where((0, import_drizzle_orm28.eq)(tasks3.task_id, fullId)).one();
13106
+ await lockRowForUpdate(txAsDb(tx), this.db, tasks3, (0, import_drizzle_orm29.eq)(tasks3.task_id, fullId));
13107
+ const currentRow = await select(txAsDb(tx)).from(tasks3).where((0, import_drizzle_orm29.eq)(tasks3.task_id, fullId)).one();
12730
13108
  if (!currentRow) {
12731
13109
  throw new EntityNotFoundError("Task", id);
12732
13110
  }
@@ -12740,7 +13118,7 @@ var TaskRepository = class {
12740
13118
  last_executor_heartbeat_at: insertData.last_executor_heartbeat_at,
12741
13119
  session_md5: insertData.session_md5,
12742
13120
  data: insertData.data
12743
- }).where((0, import_drizzle_orm28.eq)(tasks3.task_id, fullId)).run();
13121
+ }).where((0, import_drizzle_orm29.eq)(tasks3.task_id, fullId)).run();
12744
13122
  return merged;
12745
13123
  });
12746
13124
  return result;
@@ -12759,7 +13137,7 @@ var TaskRepository = class {
12759
13137
  async delete(id) {
12760
13138
  try {
12761
13139
  const fullId = await this.resolveId(id);
12762
- const result = await deleteFrom(this.db, tasks3).where((0, import_drizzle_orm28.eq)(tasks3.task_id, fullId)).run();
13140
+ const result = await deleteFrom(this.db, tasks3).where((0, import_drizzle_orm29.eq)(tasks3.task_id, fullId)).run();
12763
13141
  if (result.rowsAffected === 0) {
12764
13142
  throw new EntityNotFoundError("Task", id);
12765
13143
  }
@@ -12813,15 +13191,15 @@ var TaskRepository = class {
12813
13191
  }
12814
13192
  return this.db.transaction(async (tx) => {
12815
13193
  const positionRow = await select(txAsDb(tx), {
12816
- maxPos: import_drizzle_orm28.sql`max(${tasks3.queue_position})`
12817
- }).from(tasks3).where(import_drizzle_orm28.sql`${tasks3.session_id} = ${input.session_id} AND ${tasks3.status} = 'queued'`).one();
13194
+ maxPos: import_drizzle_orm29.sql`max(${tasks3.queue_position})`
13195
+ }).from(tasks3).where(import_drizzle_orm29.sql`${tasks3.session_id} = ${input.session_id} AND ${tasks3.status} = 'queued'`).one();
12818
13196
  const nextPosition = (positionRow?.maxPos ?? 0) + 1;
12819
13197
  const insertData = this.taskToInsert({
12820
13198
  ...taskBase,
12821
13199
  queue_position: nextPosition
12822
13200
  });
12823
13201
  await insert(txAsDb(tx), tasks3).values(insertData).run();
12824
- const row = await select(txAsDb(tx)).from(tasks3).where((0, import_drizzle_orm28.eq)(tasks3.task_id, insertData.task_id)).one();
13202
+ const row = await select(txAsDb(tx)).from(tasks3).where((0, import_drizzle_orm29.eq)(tasks3.task_id, insertData.task_id)).one();
12825
13203
  if (!row) {
12826
13204
  throw new RepositoryError("Failed to retrieve created queued task");
12827
13205
  }
@@ -12833,7 +13211,7 @@ var TaskRepository = class {
12833
13211
  */
12834
13212
  async findQueued(sessionId) {
12835
13213
  try {
12836
- const rows = await select(this.db).from(tasks3).where(import_drizzle_orm28.sql`${tasks3.session_id} = ${sessionId} AND ${tasks3.status} = 'queued'`).orderBy(tasks3.queue_position).all();
13214
+ const rows = await select(this.db).from(tasks3).where(import_drizzle_orm29.sql`${tasks3.session_id} = ${sessionId} AND ${tasks3.status} = 'queued'`).orderBy(tasks3.queue_position).all();
12837
13215
  return rows.map((row) => this.rowToTask(row));
12838
13216
  } catch (error) {
12839
13217
  throw new RepositoryError(
@@ -12848,7 +13226,7 @@ var TaskRepository = class {
12848
13226
  */
12849
13227
  async getNextQueued(sessionId) {
12850
13228
  try {
12851
- const row = await select(this.db).from(tasks3).where(import_drizzle_orm28.sql`${tasks3.session_id} = ${sessionId} AND ${tasks3.status} = 'queued'`).orderBy(tasks3.queue_position).limit(1).one();
13229
+ const row = await select(this.db).from(tasks3).where(import_drizzle_orm29.sql`${tasks3.session_id} = ${sessionId} AND ${tasks3.status} = 'queued'`).orderBy(tasks3.queue_position).limit(1).one();
12852
13230
  return row ? this.rowToTask(row) : null;
12853
13231
  } catch (error) {
12854
13232
  throw new RepositoryError(
@@ -12862,7 +13240,7 @@ var TaskRepository = class {
12862
13240
  */
12863
13241
  async countBySession(sessionId) {
12864
13242
  try {
12865
- const result = await select(this.db, { count: import_drizzle_orm28.sql`count(*)` }).from(tasks3).where((0, import_drizzle_orm28.eq)(tasks3.session_id, sessionId)).one();
13243
+ const result = await select(this.db, { count: import_drizzle_orm29.sql`count(*)` }).from(tasks3).where((0, import_drizzle_orm29.eq)(tasks3.session_id, sessionId)).one();
12866
13244
  return result?.count ?? 0;
12867
13245
  } catch (error) {
12868
13246
  throw new RepositoryError(
@@ -12876,7 +13254,7 @@ var TaskRepository = class {
12876
13254
  // src/db/repositories/thread-session-map.ts
12877
13255
  init_cjs_shims();
12878
13256
  init_types2();
12879
- var import_drizzle_orm29 = require("drizzle-orm");
13257
+ var import_drizzle_orm30 = require("drizzle-orm");
12880
13258
  init_ids();
12881
13259
  init_database_wrapper();
12882
13260
  init_schema();
@@ -12926,7 +13304,7 @@ var ThreadSessionMapRepository = class {
12926
13304
  return id;
12927
13305
  }
12928
13306
  const pattern = prefixToLikePattern(id);
12929
- const results = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm29.like)(threadSessionMap3.id, pattern)).all();
13307
+ const results = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm30.like)(threadSessionMap3.id, pattern)).all();
12930
13308
  if (results.length === 0) {
12931
13309
  throw new EntityNotFoundError("ThreadSessionMap", id);
12932
13310
  }
@@ -12949,7 +13327,7 @@ var ThreadSessionMapRepository = class {
12949
13327
  id: data.id ?? generateId()
12950
13328
  });
12951
13329
  await insert(this.db, threadSessionMap3).values(insertData).run();
12952
- const row = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm29.eq)(threadSessionMap3.id, insertData.id)).one();
13330
+ const row = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm30.eq)(threadSessionMap3.id, insertData.id)).one();
12953
13331
  if (!row) {
12954
13332
  throw new RepositoryError("Failed to retrieve created thread-session mapping");
12955
13333
  }
@@ -12968,7 +13346,7 @@ var ThreadSessionMapRepository = class {
12968
13346
  async findById(id) {
12969
13347
  try {
12970
13348
  const fullId = await this.resolveId(id);
12971
- const row = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm29.eq)(threadSessionMap3.id, fullId)).one();
13349
+ const row = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm30.eq)(threadSessionMap3.id, fullId)).one();
12972
13350
  return row ? this.rowToMapping(row) : null;
12973
13351
  } catch (error) {
12974
13352
  if (error instanceof EntityNotFoundError) return null;
@@ -13009,7 +13387,7 @@ var ThreadSessionMapRepository = class {
13009
13387
  status: insertData.status,
13010
13388
  last_message_at: insertData.last_message_at,
13011
13389
  metadata: insertData.metadata
13012
- }).where((0, import_drizzle_orm29.eq)(threadSessionMap3.id, fullId)).run();
13390
+ }).where((0, import_drizzle_orm30.eq)(threadSessionMap3.id, fullId)).run();
13013
13391
  const updated = await this.findById(fullId);
13014
13392
  if (!updated) {
13015
13393
  throw new RepositoryError("Failed to retrieve updated thread-session mapping");
@@ -13030,7 +13408,7 @@ var ThreadSessionMapRepository = class {
13030
13408
  async delete(id) {
13031
13409
  try {
13032
13410
  const fullId = await this.resolveId(id);
13033
- const result = await deleteFrom(this.db, threadSessionMap3).where((0, import_drizzle_orm29.eq)(threadSessionMap3.id, fullId)).run();
13411
+ const result = await deleteFrom(this.db, threadSessionMap3).where((0, import_drizzle_orm30.eq)(threadSessionMap3.id, fullId)).run();
13034
13412
  if (result.rowsAffected === 0) {
13035
13413
  throw new EntityNotFoundError("ThreadSessionMap", id);
13036
13414
  }
@@ -13048,7 +13426,7 @@ var ThreadSessionMapRepository = class {
13048
13426
  async findByChannelAndThread(channelId, threadId) {
13049
13427
  try {
13050
13428
  const row = await select(this.db).from(threadSessionMap3).where(
13051
- (0, import_drizzle_orm29.and)((0, import_drizzle_orm29.eq)(threadSessionMap3.channel_id, channelId), (0, import_drizzle_orm29.eq)(threadSessionMap3.thread_id, threadId))
13429
+ (0, import_drizzle_orm30.and)((0, import_drizzle_orm30.eq)(threadSessionMap3.channel_id, channelId), (0, import_drizzle_orm30.eq)(threadSessionMap3.thread_id, threadId))
13052
13430
  ).one();
13053
13431
  return row ? this.rowToMapping(row) : null;
13054
13432
  } catch (error) {
@@ -13065,7 +13443,7 @@ var ThreadSessionMapRepository = class {
13065
13443
  */
13066
13444
  async findByThread(threadId) {
13067
13445
  try {
13068
- const row = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm29.eq)(threadSessionMap3.thread_id, threadId)).one();
13446
+ const row = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm30.eq)(threadSessionMap3.thread_id, threadId)).one();
13069
13447
  return row ? this.rowToMapping(row) : null;
13070
13448
  } catch (error) {
13071
13449
  throw new RepositoryError(
@@ -13079,7 +13457,7 @@ var ThreadSessionMapRepository = class {
13079
13457
  */
13080
13458
  async findBySession(sessionId) {
13081
13459
  try {
13082
- const row = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm29.eq)(threadSessionMap3.session_id, sessionId)).one();
13460
+ const row = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm30.eq)(threadSessionMap3.session_id, sessionId)).one();
13083
13461
  return row ? this.rowToMapping(row) : null;
13084
13462
  } catch (error) {
13085
13463
  throw new RepositoryError(
@@ -13093,11 +13471,11 @@ var ThreadSessionMapRepository = class {
13093
13471
  */
13094
13472
  async findByChannel(channelId, status) {
13095
13473
  try {
13096
- const conditions = [(0, import_drizzle_orm29.eq)(threadSessionMap3.channel_id, channelId)];
13474
+ const conditions = [(0, import_drizzle_orm30.eq)(threadSessionMap3.channel_id, channelId)];
13097
13475
  if (status) {
13098
- conditions.push((0, import_drizzle_orm29.eq)(threadSessionMap3.status, status));
13476
+ conditions.push((0, import_drizzle_orm30.eq)(threadSessionMap3.status, status));
13099
13477
  }
13100
- const rows = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm29.and)(...conditions)).all();
13478
+ const rows = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm30.and)(...conditions)).all();
13101
13479
  return rows.map((row) => this.rowToMapping(row));
13102
13480
  } catch (error) {
13103
13481
  throw new RepositoryError(
@@ -13113,7 +13491,7 @@ var ThreadSessionMapRepository = class {
13113
13491
  try {
13114
13492
  await update(this.db, threadSessionMap3).set({
13115
13493
  last_message_at: /* @__PURE__ */ new Date()
13116
- }).where((0, import_drizzle_orm29.eq)(threadSessionMap3.id, id)).run();
13494
+ }).where((0, import_drizzle_orm30.eq)(threadSessionMap3.id, id)).run();
13117
13495
  } catch (error) {
13118
13496
  throw new RepositoryError(
13119
13497
  `Failed to update last message timestamp: ${error instanceof Error ? error.message : String(error)}`,
@@ -13126,7 +13504,7 @@ var ThreadSessionMapRepository = class {
13126
13504
  */
13127
13505
  async updateMetadata(id, metadata) {
13128
13506
  try {
13129
- await update(this.db, threadSessionMap3).set({ metadata }).where((0, import_drizzle_orm29.eq)(threadSessionMap3.id, id)).run();
13507
+ await update(this.db, threadSessionMap3).set({ metadata }).where((0, import_drizzle_orm30.eq)(threadSessionMap3.id, id)).run();
13130
13508
  } catch (error) {
13131
13509
  throw new RepositoryError(
13132
13510
  `Failed to update metadata: ${error instanceof Error ? error.message : String(error)}`,
@@ -13141,7 +13519,7 @@ var ThreadSessionMapRepository = class {
13141
13519
  try {
13142
13520
  const cutoff = new Date(Date.now() - daysInactive * 24 * 60 * 60 * 1e3);
13143
13521
  const rows = await select(this.db).from(threadSessionMap3).where(
13144
- (0, import_drizzle_orm29.and)((0, import_drizzle_orm29.eq)(threadSessionMap3.status, "active"), (0, import_drizzle_orm29.lt)(threadSessionMap3.last_message_at, cutoff))
13522
+ (0, import_drizzle_orm30.and)((0, import_drizzle_orm30.eq)(threadSessionMap3.status, "active"), (0, import_drizzle_orm30.lt)(threadSessionMap3.last_message_at, cutoff))
13145
13523
  ).all();
13146
13524
  return rows.map((row) => this.rowToMapping(row));
13147
13525
  } catch (error) {
@@ -13156,7 +13534,7 @@ var ThreadSessionMapRepository = class {
13156
13534
  */
13157
13535
  async findByBranch(branchId) {
13158
13536
  try {
13159
- const rows = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm29.eq)(threadSessionMap3.branch_id, branchId)).all();
13537
+ const rows = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm30.eq)(threadSessionMap3.branch_id, branchId)).all();
13160
13538
  return rows.map((row) => this.rowToMapping(row));
13161
13539
  } catch (error) {
13162
13540
  throw new RepositoryError(
@@ -13171,7 +13549,7 @@ var ThreadSessionMapRepository = class {
13171
13549
  init_cjs_shims();
13172
13550
  var import_node_crypto5 = require("crypto");
13173
13551
  var import_bcryptjs2 = __toESM(require("bcryptjs"), 1);
13174
- var import_drizzle_orm30 = require("drizzle-orm");
13552
+ var import_drizzle_orm31 = require("drizzle-orm");
13175
13553
  init_ids();
13176
13554
  init_database_wrapper();
13177
13555
  init_schema();
@@ -13211,7 +13589,7 @@ var UserApiKeysRepository = class {
13211
13589
  }
13212
13590
  /** List all API keys for a user (never returns hashes) */
13213
13591
  async listByUser(userId) {
13214
- const rows = await select(this.db).from(userApiKeys3).where((0, import_drizzle_orm30.eq)(userApiKeys3.user_id, userId)).all();
13592
+ const rows = await select(this.db).from(userApiKeys3).where((0, import_drizzle_orm31.eq)(userApiKeys3.user_id, userId)).all();
13215
13593
  return rows.map((r) => ({
13216
13594
  id: r.id,
13217
13595
  name: r.name,
@@ -13222,7 +13600,7 @@ var UserApiKeysRepository = class {
13222
13600
  }
13223
13601
  /** Find a key by prefix (for auth lookup). Returns rows with hash for verification. */
13224
13602
  async findByPrefix(prefix) {
13225
- return select(this.db).from(userApiKeys3).where((0, import_drizzle_orm30.eq)(userApiKeys3.prefix, prefix)).all();
13603
+ return select(this.db).from(userApiKeys3).where((0, import_drizzle_orm31.eq)(userApiKeys3.prefix, prefix)).all();
13226
13604
  }
13227
13605
  /** Verify a raw API key against stored hashes. Returns the matching row or null. */
13228
13606
  async verifyKey(rawKey) {
@@ -13237,25 +13615,25 @@ var UserApiKeysRepository = class {
13237
13615
  }
13238
13616
  /** Update last_used_at timestamp */
13239
13617
  async updateLastUsed(id) {
13240
- await update(this.db, userApiKeys3).set({ last_used_at: /* @__PURE__ */ new Date() }).where((0, import_drizzle_orm30.eq)(userApiKeys3.id, id)).run();
13618
+ await update(this.db, userApiKeys3).set({ last_used_at: /* @__PURE__ */ new Date() }).where((0, import_drizzle_orm31.eq)(userApiKeys3.id, id)).run();
13241
13619
  }
13242
13620
  /** Update key name */
13243
13621
  async updateName(id, userId, name) {
13244
- await update(this.db, userApiKeys3).set({ name }).where((0, import_drizzle_orm30.and)((0, import_drizzle_orm30.eq)(userApiKeys3.id, id), (0, import_drizzle_orm30.eq)(userApiKeys3.user_id, userId))).run();
13622
+ await update(this.db, userApiKeys3).set({ name }).where((0, import_drizzle_orm31.and)((0, import_drizzle_orm31.eq)(userApiKeys3.id, id), (0, import_drizzle_orm31.eq)(userApiKeys3.user_id, userId))).run();
13245
13623
  }
13246
13624
  /** Delete a key */
13247
13625
  async delete(id, userId) {
13248
- await deleteFrom(this.db, userApiKeys3).where((0, import_drizzle_orm30.and)((0, import_drizzle_orm30.eq)(userApiKeys3.id, id), (0, import_drizzle_orm30.eq)(userApiKeys3.user_id, userId))).run();
13626
+ await deleteFrom(this.db, userApiKeys3).where((0, import_drizzle_orm31.and)((0, import_drizzle_orm31.eq)(userApiKeys3.id, id), (0, import_drizzle_orm31.eq)(userApiKeys3.user_id, userId))).run();
13249
13627
  }
13250
13628
  /** Delete all keys for a user */
13251
13629
  async deleteAllForUser(userId) {
13252
- await deleteFrom(this.db, userApiKeys3).where((0, import_drizzle_orm30.eq)(userApiKeys3.user_id, userId)).run();
13630
+ await deleteFrom(this.db, userApiKeys3).where((0, import_drizzle_orm31.eq)(userApiKeys3.user_id, userId)).run();
13253
13631
  }
13254
13632
  };
13255
13633
 
13256
13634
  // src/db/repositories/user-mcp-oauth-tokens.ts
13257
13635
  init_cjs_shims();
13258
- var import_drizzle_orm31 = require("drizzle-orm");
13636
+ var import_drizzle_orm32 = require("drizzle-orm");
13259
13637
  init_database_wrapper();
13260
13638
  init_schema();
13261
13639
  function rowToToken(row) {
@@ -13272,9 +13650,9 @@ function rowToToken(row) {
13272
13650
  };
13273
13651
  }
13274
13652
  function matchKey(userId, serverId) {
13275
- return (0, import_drizzle_orm31.and)(
13276
- userId === null ? (0, import_drizzle_orm31.isNull)(userMcpOauthTokens3.user_id) : (0, import_drizzle_orm31.eq)(userMcpOauthTokens3.user_id, userId),
13277
- (0, import_drizzle_orm31.eq)(userMcpOauthTokens3.mcp_server_id, serverId)
13653
+ return (0, import_drizzle_orm32.and)(
13654
+ userId === null ? (0, import_drizzle_orm32.isNull)(userMcpOauthTokens3.user_id) : (0, import_drizzle_orm32.eq)(userMcpOauthTokens3.user_id, userId),
13655
+ (0, import_drizzle_orm32.eq)(userMcpOauthTokens3.mcp_server_id, serverId)
13278
13656
  );
13279
13657
  }
13280
13658
  var UserMCPOAuthTokenRepository = class {
@@ -13391,7 +13769,7 @@ var UserMCPOAuthTokenRepository = class {
13391
13769
  }
13392
13770
  async deleteAllForUser(userId) {
13393
13771
  try {
13394
- const result = await deleteFrom(this.db, userMcpOauthTokens3).where((0, import_drizzle_orm31.eq)(userMcpOauthTokens3.user_id, userId)).run();
13772
+ const result = await deleteFrom(this.db, userMcpOauthTokens3).where((0, import_drizzle_orm32.eq)(userMcpOauthTokens3.user_id, userId)).run();
13395
13773
  return result.rowsAffected;
13396
13774
  } catch (error) {
13397
13775
  throw new RepositoryError(
@@ -13402,7 +13780,7 @@ var UserMCPOAuthTokenRepository = class {
13402
13780
  }
13403
13781
  async deleteAllForServer(serverId) {
13404
13782
  try {
13405
- const result = await deleteFrom(this.db, userMcpOauthTokens3).where((0, import_drizzle_orm31.eq)(userMcpOauthTokens3.mcp_server_id, serverId)).run();
13783
+ const result = await deleteFrom(this.db, userMcpOauthTokens3).where((0, import_drizzle_orm32.eq)(userMcpOauthTokens3.mcp_server_id, serverId)).run();
13406
13784
  return result.rowsAffected;
13407
13785
  } catch (error) {
13408
13786
  throw new RepositoryError(
@@ -13413,7 +13791,7 @@ var UserMCPOAuthTokenRepository = class {
13413
13791
  }
13414
13792
  async listForUser(userId) {
13415
13793
  try {
13416
- const rows = await select(this.db).from(userMcpOauthTokens3).where((0, import_drizzle_orm31.eq)(userMcpOauthTokens3.user_id, userId)).all();
13794
+ const rows = await select(this.db).from(userMcpOauthTokens3).where((0, import_drizzle_orm32.eq)(userMcpOauthTokens3.user_id, userId)).all();
13417
13795
  return rows.map(rowToToken);
13418
13796
  } catch (error) {
13419
13797
  throw new RepositoryError(
@@ -13431,7 +13809,7 @@ var UserMCPOAuthTokenRepository = class {
13431
13809
  // src/db/repositories/users.ts
13432
13810
  init_cjs_shims();
13433
13811
  init_types2();
13434
- var import_drizzle_orm32 = require("drizzle-orm");
13812
+ var import_drizzle_orm33 = require("drizzle-orm");
13435
13813
 
13436
13814
  // src/config/env-vars.ts
13437
13815
  init_cjs_shims();
@@ -13553,7 +13931,7 @@ var UsersRepository = class {
13553
13931
  */
13554
13932
  async resolveId(id) {
13555
13933
  return resolveByShortIdPrefix(id, "User", async (pattern) => {
13556
- const rows = await select(this.db).from(users3).where((0, import_drizzle_orm32.like)(users3.user_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
13934
+ const rows = await select(this.db).from(users3).where((0, import_drizzle_orm33.like)(users3.user_id, pattern)).limit(RESOLVE_SHORT_ID_FETCH_LIMIT).all();
13557
13935
  return rows.map((r) => r.user_id);
13558
13936
  });
13559
13937
  }
@@ -13561,7 +13939,7 @@ var UsersRepository = class {
13561
13939
  * Check if unix_username is already taken by another user
13562
13940
  */
13563
13941
  async isUnixUsernameTaken(unixUsername, excludeUserId) {
13564
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm32.eq)(users3.unix_username, unixUsername)).one();
13942
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.unix_username, unixUsername)).one();
13565
13943
  if (!result) {
13566
13944
  return false;
13567
13945
  }
@@ -13584,7 +13962,7 @@ var UsersRepository = class {
13584
13962
  }
13585
13963
  const insertData = this.userToInsert(data);
13586
13964
  await insert(this.db, users3).values(insertData).run();
13587
- const row = await select(this.db).from(users3).where((0, import_drizzle_orm32.eq)(users3.user_id, insertData.user_id)).one();
13965
+ const row = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.user_id, insertData.user_id)).one();
13588
13966
  if (!row) {
13589
13967
  throw new RepositoryError("Failed to retrieve created user");
13590
13968
  }
@@ -13596,7 +13974,7 @@ var UsersRepository = class {
13596
13974
  async findById(id) {
13597
13975
  try {
13598
13976
  const fullId = await this.resolveId(id);
13599
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm32.eq)(users3.user_id, fullId)).one();
13977
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).one();
13600
13978
  if (!result) {
13601
13979
  return null;
13602
13980
  }
@@ -13612,12 +13990,41 @@ var UsersRepository = class {
13612
13990
  * Find user by email
13613
13991
  */
13614
13992
  async findByEmail(email) {
13615
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm32.eq)(users3.email, email)).one();
13993
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.email, email)).one();
13616
13994
  if (!result) {
13617
13995
  return null;
13618
13996
  }
13619
13997
  return this.rowToUser(result);
13620
13998
  }
13999
+ /**
14000
+ * Find user by email for external identity providers.
14001
+ *
14002
+ * Agor intentionally keeps exact/case-sensitive email lookup semantics for
14003
+ * auth paths because the schema historically allowed case-distinct emails.
14004
+ * External providers such as Slack and GitHub treat email addresses as a
14005
+ * canonical identity hint, so their alignment path needs a case-insensitive
14006
+ * match. Prefer an exact match when present; otherwise return a
14007
+ * case-insensitive match only when it is unambiguous.
14008
+ */
14009
+ async findByEmailForAlignment(email) {
14010
+ const normalizedEmail = email.trim().toLowerCase();
14011
+ if (!normalizedEmail) return null;
14012
+ const exact = await this.findByEmail(normalizedEmail);
14013
+ if (exact) return exact;
14014
+ const results = await select(this.db).from(users3).where(import_drizzle_orm33.sql`LOWER(${users3.email}) = ${normalizedEmail}`).all();
14015
+ if (results.length !== 1) {
14016
+ if (results.length > 1) {
14017
+ console.warn(
14018
+ `[users] Ambiguous case-insensitive email alignment for ${normalizedEmail}: ${results.map((row) => {
14019
+ const userRow = row;
14020
+ return `${shortId(userRow.user_id)}:${userRow.email}`;
14021
+ }).join(", ")}`
14022
+ );
14023
+ }
14024
+ return null;
14025
+ }
14026
+ return this.rowToUser(results[0]);
14027
+ }
13621
14028
  /**
13622
14029
  * Find all users
13623
14030
  */
@@ -13654,8 +14061,8 @@ var UsersRepository = class {
13654
14061
  await update(this.db, users3).set({
13655
14062
  ...insertData,
13656
14063
  updated_at: /* @__PURE__ */ new Date()
13657
- }).where((0, import_drizzle_orm32.eq)(users3.user_id, fullId)).run();
13658
- const row = await select(this.db).from(users3).where((0, import_drizzle_orm32.eq)(users3.user_id, fullId)).one();
14064
+ }).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).run();
14065
+ const row = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).one();
13659
14066
  if (!row) {
13660
14067
  throw new RepositoryError("Failed to retrieve updated user");
13661
14068
  }
@@ -13666,7 +14073,7 @@ var UsersRepository = class {
13666
14073
  */
13667
14074
  async delete(id) {
13668
14075
  const fullId = await this.resolveId(id);
13669
- await deleteFrom(this.db, users3).where((0, import_drizzle_orm32.eq)(users3.user_id, fullId)).run();
14076
+ await deleteFrom(this.db, users3).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).run();
13670
14077
  }
13671
14078
  /**
13672
14079
  * Get raw database row (internal use only - includes encrypted keys)
@@ -13674,7 +14081,7 @@ var UsersRepository = class {
13674
14081
  async getRawRow(id) {
13675
14082
  try {
13676
14083
  const fullId = await this.resolveId(id);
13677
- const result = await select(this.db).from(users3).where((0, import_drizzle_orm32.eq)(users3.user_id, fullId)).one();
14084
+ const result = await select(this.db).from(users3).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).one();
13678
14085
  return result;
13679
14086
  } catch (error) {
13680
14087
  if (error instanceof EntityNotFoundError) {
@@ -13756,7 +14163,7 @@ var UsersRepository = class {
13756
14163
  await update(this.db, users3).set({
13757
14164
  data: { ...row.data, agentic_tools: next },
13758
14165
  updated_at: /* @__PURE__ */ new Date()
13759
- }).where((0, import_drizzle_orm32.eq)(users3.user_id, fullId)).run();
14166
+ }).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).run();
13760
14167
  }
13761
14168
  /**
13762
14169
  * Delete a single credential field for a tool.
@@ -13782,7 +14189,7 @@ var UsersRepository = class {
13782
14189
  await update(this.db, users3).set({
13783
14190
  data: { ...row.data, agentic_tools: next },
13784
14191
  updated_at: /* @__PURE__ */ new Date()
13785
- }).where((0, import_drizzle_orm32.eq)(users3.user_id, fullId)).run();
14192
+ }).where((0, import_drizzle_orm33.eq)(users3.user_id, fullId)).run();
13786
14193
  }
13787
14194
  };
13788
14195
 
@@ -13845,6 +14252,7 @@ var hash = import_bcryptjs3.default.hash;
13845
14252
  SerializedSessionRepository,
13846
14253
  SessionEnvSelectionRepository,
13847
14254
  SessionMCPServerRepository,
14255
+ SessionRelationshipRepository,
13848
14256
  SessionRepository,
13849
14257
  TaskRepository,
13850
14258
  ThreadSessionMapRepository,
@@ -13937,6 +14345,7 @@ var hash = import_bcryptjs3.default.hash;
13937
14345
  serializedSessions,
13938
14346
  sessionEnvSelections,
13939
14347
  sessionMcpServers,
14348
+ sessionRelationships,
13940
14349
  sessions,
13941
14350
  shortId,
13942
14351
  sql,