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
@@ -525,6 +525,9 @@ async function getBaseUrl() {
525
525
  if (config.daemon?.base_url) {
526
526
  return validateBaseUrl(config.daemon.base_url);
527
527
  }
528
+ if (config.ui?.base_url) {
529
+ return validateBaseUrl(config.ui.base_url);
530
+ }
528
531
  const defaults = getDefaultConfig();
529
532
  const envPort = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : void 0;
530
533
  const port = envPort || config.daemon?.port || defaults.daemon?.port || DAEMON.DEFAULT_PORT;
@@ -834,7 +837,7 @@ var init_schedule = __esm({
834
837
  });
835
838
 
836
839
  // src/types/session.ts
837
- var SessionStatus;
840
+ var SessionStatus, EXECUTING_SESSION_STATUSES;
838
841
  var init_session = __esm({
839
842
  "src/types/session.ts"() {
840
843
  "use strict";
@@ -852,11 +855,17 @@ var init_session = __esm({
852
855
  COMPLETED: "completed",
853
856
  FAILED: "failed"
854
857
  };
858
+ EXECUTING_SESSION_STATUSES = /* @__PURE__ */ new Set([
859
+ SessionStatus.RUNNING,
860
+ SessionStatus.STOPPING,
861
+ SessionStatus.AWAITING_PERMISSION,
862
+ SessionStatus.AWAITING_INPUT
863
+ ]);
855
864
  }
856
865
  });
857
866
 
858
867
  // src/types/task.ts
859
- var TaskStatus, TERMINAL_TASK_STATUSES;
868
+ var TaskStatus, TERMINAL_TASK_STATUSES, EXECUTING_TASK_STATUSES;
860
869
  var init_task = __esm({
861
870
  "src/types/task.ts"() {
862
871
  "use strict";
@@ -884,6 +893,12 @@ var init_task = __esm({
884
893
  TaskStatus.STOPPED,
885
894
  TaskStatus.TIMED_OUT
886
895
  ]);
896
+ EXECUTING_TASK_STATUSES = /* @__PURE__ */ new Set([
897
+ TaskStatus.RUNNING,
898
+ TaskStatus.STOPPING,
899
+ TaskStatus.AWAITING_PERMISSION,
900
+ TaskStatus.AWAITING_INPUT
901
+ ]);
887
902
  }
888
903
  });
889
904
 
@@ -1047,6 +1062,8 @@ __export(schema_postgres_exports, {
1047
1062
  serializedSessions: () => serializedSessions,
1048
1063
  sessionEnvSelections: () => sessionEnvSelections,
1049
1064
  sessionMcpServers: () => sessionMcpServers,
1065
+ sessionRelationships: () => sessionRelationships,
1066
+ sessionRelationshipsRelations: () => sessionRelationshipsRelations,
1050
1067
  sessions: () => sessions,
1051
1068
  sessionsRelations: () => sessionsRelations,
1052
1069
  tasks: () => tasks,
@@ -1070,7 +1087,7 @@ import {
1070
1087
  uniqueIndex,
1071
1088
  varchar
1072
1089
  } from "drizzle-orm/pg-core";
1073
- var 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;
1090
+ var 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;
1074
1091
  var init_schema_postgres = __esm({
1075
1092
  "src/db/schema.postgres.ts"() {
1076
1093
  "use strict";
@@ -1163,6 +1180,36 @@ var init_schema_postgres = __esm({
1163
1180
  scheduleRunUnique: uniqueIndex("sessions_schedule_run_unique").on(table.schedule_id, table.scheduled_run_at).where(sql`${table.schedule_id} IS NOT NULL AND ${table.scheduled_run_at} IS NOT NULL`)
1164
1181
  })
1165
1182
  );
1183
+ sessionRelationships = pgTable(
1184
+ "session_relationships",
1185
+ {
1186
+ relationship_id: varchar("relationship_id", { length: 36 }).primaryKey(),
1187
+ source_session_id: varchar("source_session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1188
+ target_session_id: varchar("target_session_id", { length: 36 }).notNull().references(() => sessions.session_id, { onDelete: "cascade" }),
1189
+ relationship_type: text("relationship_type", { enum: ["remote_create"] }).notNull(),
1190
+ created_by: varchar("created_by", { length: 36 }).notNull(),
1191
+ created_at: t.timestamp("created_at").notNull(),
1192
+ updated_at: t.timestamp("updated_at"),
1193
+ callback_enabled: t.bool("callback_enabled").notNull().default(false),
1194
+ callback_session_id: varchar("callback_session_id", { length: 36 }).references(
1195
+ () => sessions.session_id,
1196
+ {
1197
+ onDelete: "set null"
1198
+ }
1199
+ ),
1200
+ data: t.json("data")
1201
+ },
1202
+ (table) => ({
1203
+ sourceIdx: index("session_relationships_source_idx").on(table.source_session_id),
1204
+ targetIdx: index("session_relationships_target_idx").on(table.target_session_id),
1205
+ callbackIdx: index("session_relationships_callback_idx").on(table.callback_session_id),
1206
+ sourceTargetTypeUnique: uniqueIndex("session_relationships_source_target_type_unique").on(
1207
+ table.source_session_id,
1208
+ table.target_session_id,
1209
+ table.relationship_type
1210
+ )
1211
+ })
1212
+ );
1166
1213
  tasks = pgTable(
1167
1214
  "tasks",
1168
1215
  {
@@ -1699,6 +1746,12 @@ var init_schema_postgres = __esm({
1699
1746
  branch_id: varchar("branch_id", { length: 36 }).references(() => branches.branch_id, {
1700
1747
  onDelete: "set null"
1701
1748
  }),
1749
+ source_session_id: varchar("source_session_id", { length: 36 }).references(
1750
+ () => sessions.session_id,
1751
+ {
1752
+ onDelete: "set null"
1753
+ }
1754
+ ),
1702
1755
  board_id: varchar("board_id", { length: 36 }).notNull().references(() => boards.board_id, { onDelete: "cascade" }),
1703
1756
  name: text("name").notNull(),
1704
1757
  description: text("description"),
@@ -1725,6 +1778,7 @@ var init_schema_postgres = __esm({
1725
1778
  },
1726
1779
  (table) => ({
1727
1780
  branchIdx: index("artifacts_branch_idx").on(table.branch_id),
1781
+ sourceSessionIdx: index("artifacts_source_session_idx").on(table.source_session_id),
1728
1782
  boardIdx: index("artifacts_board_idx").on(table.board_id),
1729
1783
  archivedIdx: index("artifacts_archived_idx").on(table.archived),
1730
1784
  publicIdx: index("artifacts_public_idx").on(table.public)
@@ -1881,7 +1935,7 @@ var init_schema_postgres = __esm({
1881
1935
  // Materialized for queries
1882
1936
  name: text("name").notNull(),
1883
1937
  channel_type: text("channel_type", {
1884
- enum: ["slack", "discord", "whatsapp", "telegram", "github"]
1938
+ enum: ["slack", "discord", "whatsapp", "telegram", "github", "teams"]
1885
1939
  }).notNull(),
1886
1940
  target_branch_id: varchar("target_branch_id", { length: 36 }).notNull().references(() => branches.branch_id, { onDelete: "cascade" }),
1887
1941
  agor_user_id: varchar("agor_user_id", { length: 36 }).notNull(),
@@ -2265,7 +2319,7 @@ var init_schema_postgres = __esm({
2265
2319
  archivedIdx: index("kb_graph_edges_archived_idx").on(table.archived)
2266
2320
  })
2267
2321
  );
2268
- sessionsRelations = relations(sessions, ({ one }) => ({
2322
+ sessionsRelations = relations(sessions, ({ one, many }) => ({
2269
2323
  branch: one(branches, {
2270
2324
  fields: [sessions.branch_id],
2271
2325
  references: [branches.branch_id]
@@ -2273,6 +2327,24 @@ var init_schema_postgres = __esm({
2273
2327
  schedule: one(schedules, {
2274
2328
  fields: [sessions.schedule_id],
2275
2329
  references: [schedules.schedule_id]
2330
+ }),
2331
+ outboundRelationships: many(sessionRelationships, { relationName: "relationshipSource" }),
2332
+ inboundRelationships: many(sessionRelationships, { relationName: "relationshipTarget" })
2333
+ }));
2334
+ sessionRelationshipsRelations = relations(sessionRelationships, ({ one }) => ({
2335
+ sourceSession: one(sessions, {
2336
+ fields: [sessionRelationships.source_session_id],
2337
+ references: [sessions.session_id],
2338
+ relationName: "relationshipSource"
2339
+ }),
2340
+ targetSession: one(sessions, {
2341
+ fields: [sessionRelationships.target_session_id],
2342
+ references: [sessions.session_id],
2343
+ relationName: "relationshipTarget"
2344
+ }),
2345
+ callbackSession: one(sessions, {
2346
+ fields: [sessionRelationships.callback_session_id],
2347
+ references: [sessions.session_id]
2276
2348
  })
2277
2349
  }));
2278
2350
  branchesRelations = relations(branches, ({ many }) => ({
@@ -2325,6 +2397,8 @@ __export(schema_sqlite_exports, {
2325
2397
  serializedSessions: () => serializedSessions2,
2326
2398
  sessionEnvSelections: () => sessionEnvSelections2,
2327
2399
  sessionMcpServers: () => sessionMcpServers2,
2400
+ sessionRelationships: () => sessionRelationships2,
2401
+ sessionRelationshipsRelations: () => sessionRelationshipsRelations2,
2328
2402
  sessions: () => sessions2,
2329
2403
  sessionsRelations: () => sessionsRelations2,
2330
2404
  tasks: () => tasks2,
@@ -2343,7 +2417,7 @@ import {
2343
2417
  text as text2,
2344
2418
  uniqueIndex as uniqueIndex2
2345
2419
  } from "drizzle-orm/sqlite-core";
2346
- var 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 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";
@@ -2433,6 +2507,36 @@ var init_schema_sqlite = __esm({
2433
2507
  scheduleRunUnique: uniqueIndex2("sessions_schedule_run_unique").on(table.schedule_id, table.scheduled_run_at).where(sql2`${table.schedule_id} IS NOT NULL AND ${table.scheduled_run_at} IS NOT NULL`)
2434
2508
  })
2435
2509
  );
2510
+ sessionRelationships2 = sqliteTable(
2511
+ "session_relationships",
2512
+ {
2513
+ relationship_id: text2("relationship_id", { length: 36 }).primaryKey(),
2514
+ source_session_id: text2("source_session_id", { length: 36 }).notNull().references(() => sessions2.session_id, { onDelete: "cascade" }),
2515
+ target_session_id: text2("target_session_id", { length: 36 }).notNull().references(() => sessions2.session_id, { onDelete: "cascade" }),
2516
+ relationship_type: text2("relationship_type", { enum: ["remote_create"] }).notNull(),
2517
+ created_by: text2("created_by", { length: 36 }).notNull(),
2518
+ created_at: t2.timestamp("created_at").notNull(),
2519
+ updated_at: t2.timestamp("updated_at"),
2520
+ callback_enabled: t2.bool("callback_enabled").notNull().default(false),
2521
+ callback_session_id: text2("callback_session_id", { length: 36 }).references(
2522
+ () => sessions2.session_id,
2523
+ {
2524
+ onDelete: "set null"
2525
+ }
2526
+ ),
2527
+ data: t2.json("data")
2528
+ },
2529
+ (table) => ({
2530
+ sourceIdx: index2("session_relationships_source_idx").on(table.source_session_id),
2531
+ targetIdx: index2("session_relationships_target_idx").on(table.target_session_id),
2532
+ callbackIdx: index2("session_relationships_callback_idx").on(table.callback_session_id),
2533
+ sourceTargetTypeUnique: uniqueIndex2("session_relationships_source_target_type_unique").on(
2534
+ table.source_session_id,
2535
+ table.target_session_id,
2536
+ table.relationship_type
2537
+ )
2538
+ })
2539
+ );
2436
2540
  tasks2 = sqliteTable(
2437
2541
  "tasks",
2438
2542
  {
@@ -2977,6 +3081,12 @@ var init_schema_sqlite = __esm({
2977
3081
  branch_id: text2("branch_id", { length: 36 }).references(() => branches2.branch_id, {
2978
3082
  onDelete: "set null"
2979
3083
  }),
3084
+ source_session_id: text2("source_session_id", { length: 36 }).references(
3085
+ () => sessions2.session_id,
3086
+ {
3087
+ onDelete: "set null"
3088
+ }
3089
+ ),
2980
3090
  board_id: text2("board_id", { length: 36 }).notNull().references(() => boards2.board_id, { onDelete: "cascade" }),
2981
3091
  name: text2("name").notNull(),
2982
3092
  description: text2("description"),
@@ -3003,6 +3113,7 @@ var init_schema_sqlite = __esm({
3003
3113
  },
3004
3114
  (table) => ({
3005
3115
  branchIdx: index2("artifacts_branch_idx").on(table.branch_id),
3116
+ sourceSessionIdx: index2("artifacts_source_session_idx").on(table.source_session_id),
3006
3117
  boardIdx: index2("artifacts_board_idx").on(table.board_id),
3007
3118
  archivedIdx: index2("artifacts_archived_idx").on(table.archived),
3008
3119
  publicIdx: index2("artifacts_public_idx").on(table.public)
@@ -3161,7 +3272,7 @@ var init_schema_sqlite = __esm({
3161
3272
  // Materialized for queries
3162
3273
  name: text2("name").notNull(),
3163
3274
  channel_type: text2("channel_type", {
3164
- enum: ["slack", "discord", "whatsapp", "telegram", "github"]
3275
+ enum: ["slack", "discord", "whatsapp", "telegram", "github", "teams"]
3165
3276
  }).notNull(),
3166
3277
  target_branch_id: text2("target_branch_id", { length: 36 }).notNull().references(() => branches2.branch_id, { onDelete: "cascade" }),
3167
3278
  agor_user_id: text2("agor_user_id", { length: 36 }).notNull(),
@@ -3544,7 +3655,7 @@ var init_schema_sqlite = __esm({
3544
3655
  archivedIdx: index2("kb_graph_edges_archived_idx").on(table.archived)
3545
3656
  })
3546
3657
  );
3547
- sessionsRelations2 = relations2(sessions2, ({ one }) => ({
3658
+ sessionsRelations2 = relations2(sessions2, ({ one, many }) => ({
3548
3659
  branch: one(branches2, {
3549
3660
  fields: [sessions2.branch_id],
3550
3661
  references: [branches2.branch_id]
@@ -3552,6 +3663,24 @@ var init_schema_sqlite = __esm({
3552
3663
  schedule: one(schedules2, {
3553
3664
  fields: [sessions2.schedule_id],
3554
3665
  references: [schedules2.schedule_id]
3666
+ }),
3667
+ outboundRelationships: many(sessionRelationships2, { relationName: "relationshipSource" }),
3668
+ inboundRelationships: many(sessionRelationships2, { relationName: "relationshipTarget" })
3669
+ }));
3670
+ sessionRelationshipsRelations2 = relations2(sessionRelationships2, ({ one }) => ({
3671
+ sourceSession: one(sessions2, {
3672
+ fields: [sessionRelationships2.source_session_id],
3673
+ references: [sessions2.session_id],
3674
+ relationName: "relationshipSource"
3675
+ }),
3676
+ targetSession: one(sessions2, {
3677
+ fields: [sessionRelationships2.target_session_id],
3678
+ references: [sessions2.session_id],
3679
+ relationName: "relationshipTarget"
3680
+ }),
3681
+ callbackSession: one(sessions2, {
3682
+ fields: [sessionRelationships2.callback_session_id],
3683
+ references: [sessions2.session_id]
3555
3684
  })
3556
3685
  }));
3557
3686
  branchesRelations2 = relations2(branches2, ({ many }) => ({
@@ -3901,6 +4030,7 @@ __export(schema_exports, {
3901
4030
  serializedSessions: () => serializedSessions3,
3902
4031
  sessionEnvSelections: () => sessionEnvSelections3,
3903
4032
  sessionMcpServers: () => sessionMcpServers3,
4033
+ sessionRelationships: () => sessionRelationships3,
3904
4034
  sessions: () => sessions3,
3905
4035
  tasks: () => tasks3,
3906
4036
  threadSessionMap: () => threadSessionMap3,
@@ -3908,7 +4038,7 @@ __export(schema_exports, {
3908
4038
  userMcpOauthTokens: () => userMcpOauthTokens3,
3909
4039
  users: () => users3
3910
4040
  });
3911
- 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;
4041
+ 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;
3912
4042
  var init_schema = __esm({
3913
4043
  "src/db/schema.ts"() {
3914
4044
  "use strict";
@@ -3940,6 +4070,7 @@ var init_schema = __esm({
3940
4070
  artifactTrustGrants3 = schema.artifactTrustGrants;
3941
4071
  boardObjects3 = schema.boardObjects;
3942
4072
  sessionMcpServers3 = schema.sessionMcpServers;
4073
+ sessionRelationships3 = schema.sessionRelationships;
3943
4074
  sessionEnvSelections3 = schema.sessionEnvSelections;
3944
4075
  userMcpOauthTokens3 = schema.userMcpOauthTokens;
3945
4076
  boardComments3 = schema.boardComments;
@@ -4163,17 +4294,17 @@ var init_first_run_bootstrap = __esm({
4163
4294
  init_esm_shims();
4164
4295
  init_ids();
4165
4296
  import {
4166
- and as and22,
4297
+ and as and23,
4167
4298
  asc as asc3,
4168
4299
  desc as desc6,
4169
- eq as eq30,
4300
+ eq as eq31,
4170
4301
  gt,
4171
4302
  gte,
4172
- inArray as inArray7,
4303
+ inArray as inArray8,
4173
4304
  like as like16,
4174
4305
  lte as lte2,
4175
- or as or8,
4176
- sql as sql14
4306
+ or as or9,
4307
+ sql as sql15
4177
4308
  } from "drizzle-orm";
4178
4309
  import bcryptjs from "bcryptjs";
4179
4310
 
@@ -4301,8 +4432,8 @@ function createPostgresDatabase(config) {
4301
4432
  if (config.ssl !== void 0) {
4302
4433
  options.ssl = config.ssl;
4303
4434
  }
4304
- const sql15 = postgres(config.url, options);
4305
- return drizzlePostgres(sql15, { schema: schema_postgres_exports });
4435
+ const sql16 = postgres(config.url, options);
4436
+ return drizzlePostgres(sql16, { schema: schema_postgres_exports });
4306
4437
  } catch (error) {
4307
4438
  throw new DatabaseConnectionError(
4308
4439
  `Failed to create PostgreSQL client: ${error instanceof Error ? error.message : String(error)}`,
@@ -4993,6 +5124,7 @@ var ArtifactRepository = class {
4993
5124
  return {
4994
5125
  artifact_id: artifactId,
4995
5126
  branch_id: row.branch_id ?? null,
5127
+ source_session_id: row.source_session_id ?? null,
4996
5128
  board_id: row.board_id,
4997
5129
  name: row.name,
4998
5130
  description: row.description ?? void 0,
@@ -5031,6 +5163,7 @@ var ArtifactRepository = class {
5031
5163
  const insertData = {
5032
5164
  artifact_id: artifactId,
5033
5165
  branch_id: data.branch_id ?? null,
5166
+ source_session_id: data.source_session_id ?? null,
5034
5167
  board_id: data.board_id ?? "",
5035
5168
  name: data.name ?? "Untitled Artifact",
5036
5169
  description: data.description ?? null,
@@ -5183,6 +5316,9 @@ var ArtifactRepository = class {
5183
5316
  setData.agor_grants = updates.agor_grants ?? null;
5184
5317
  }
5185
5318
  if (updates.public !== void 0) setData.public = updates.public;
5319
+ if (updates.source_session_id !== void 0) {
5320
+ setData.source_session_id = updates.source_session_id ?? null;
5321
+ }
5186
5322
  if (updates.archived !== void 0) setData.archived = updates.archived;
5187
5323
  if (updates.archived_at !== void 0) {
5188
5324
  setData.archived_at = updates.archived_at ? new Date(updates.archived_at) : null;
@@ -6408,6 +6544,7 @@ var FS_ACCESS_RANK = {
6408
6544
  };
6409
6545
  var VIEW_OR_BETTER_BRANCH_PERMISSIONS = ["view", "session", "prompt", "all"];
6410
6546
  var BRANCH_PERMISSION_SOURCES = ["board", "override"];
6547
+ var FS_ACCESS_BRANCH_PERMISSIONS = ["read", "write"];
6411
6548
  var BranchRepository = class {
6412
6549
  constructor(db) {
6413
6550
  this.db = db;
@@ -6901,6 +7038,83 @@ var BranchRepository = class {
6901
7038
  }
6902
7039
  return Array.from(userIds);
6903
7040
  }
7041
+ /**
7042
+ * Find users whose explicit branch or aligned-board grants should materialize
7043
+ * into filesystem access for the branch.
7044
+ *
7045
+ * This intentionally excludes ambient "others" access because there is no
7046
+ * bounded user set to expand. Board owners apply whenever the branch is
7047
+ * explicitly aligned to board permissions (`permission_source = 'board'`);
7048
+ * board group grants additionally require a shared board. Override branches
7049
+ * must not inherit board grants.
7050
+ */
7051
+ async findExplicitFsAccessUserIds(branchId) {
7052
+ const branchRow = await select(this.db, {
7053
+ board_id: branches3.board_id,
7054
+ permission_source: branches3.permission_source
7055
+ }).from(branches3).where(eq11(branches3.branch_id, branchId)).one();
7056
+ const ownerRows = await select(this.db, { user_id: branchOwners3.user_id }).from(branchOwners3).where(eq11(branchOwners3.branch_id, branchId)).all();
7057
+ const groupRows = await select(this.db, { user_id: groupMemberships3.user_id }).from(branchGroupGrants3).innerJoin(groupMemberships3, eq11(groupMemberships3.group_id, branchGroupGrants3.group_id)).innerJoin(
7058
+ groups3,
7059
+ and8(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
7060
+ ).where(
7061
+ and8(
7062
+ eq11(branchGroupGrants3.branch_id, branchId),
7063
+ inArray3(
7064
+ sql7`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
7065
+ FS_ACCESS_BRANCH_PERMISSIONS
7066
+ )
7067
+ )
7068
+ ).all();
7069
+ const isBoardAligned = branchRow?.permission_source === "board" && branchRow.board_id;
7070
+ const boardOwnerRows = isBoardAligned ? await select(this.db, { user_id: boardOwners3.user_id }).from(boardOwners3).where(eq11(boardOwners3.board_id, branchRow.board_id)).all() : [];
7071
+ const boardGroupRows = isBoardAligned ? await select(this.db, { user_id: groupMemberships3.user_id }).from(boardGroupGrants3).innerJoin(groupMemberships3, eq11(groupMemberships3.group_id, boardGroupGrants3.group_id)).innerJoin(
7072
+ groups3,
7073
+ and8(eq11(groups3.group_id, boardGroupGrants3.group_id), eq11(groups3.archived, false))
7074
+ ).innerJoin(
7075
+ boards3,
7076
+ and8(
7077
+ eq11(boards3.board_id, boardGroupGrants3.board_id),
7078
+ eq11(
7079
+ sql7`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`,
7080
+ "shared"
7081
+ )
7082
+ )
7083
+ ).where(
7084
+ and8(
7085
+ eq11(boardGroupGrants3.board_id, branchRow.board_id),
7086
+ inArray3(
7087
+ sql7`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
7088
+ FS_ACCESS_BRANCH_PERMISSIONS
7089
+ )
7090
+ )
7091
+ ).all() : [];
7092
+ const userIds = /* @__PURE__ */ new Set();
7093
+ for (const row of ownerRows) {
7094
+ userIds.add(row.user_id);
7095
+ }
7096
+ for (const row of groupRows) {
7097
+ userIds.add(row.user_id);
7098
+ }
7099
+ for (const row of boardOwnerRows) {
7100
+ userIds.add(row.user_id);
7101
+ }
7102
+ for (const row of boardGroupRows) {
7103
+ userIds.add(row.user_id);
7104
+ }
7105
+ return Array.from(userIds);
7106
+ }
7107
+ async findBoardAlignedBranches(boardId) {
7108
+ const rows = await select(this.db).from(branches3).where(
7109
+ and8(
7110
+ eq11(branches3.board_id, boardId),
7111
+ eq11(branches3.permission_source, "board"),
7112
+ eq11(branches3.archived, false)
7113
+ )
7114
+ ).all();
7115
+ const baseUrl = await getBaseUrl();
7116
+ return rows.map((row) => this.rowToBranch(row, baseUrl));
7117
+ }
6904
7118
  /**
6905
7119
  * Get all owners of a branch
6906
7120
  *
@@ -8476,8 +8690,10 @@ var SENSITIVE_CONFIG_FIELDS = [
8476
8690
  "signing_secret",
8477
8691
  // Slack
8478
8692
  "private_key",
8479
- "webhook_secret"
8693
+ "webhook_secret",
8480
8694
  // GitHub
8695
+ "app_password"
8696
+ // Teams (Azure Bot App Secret)
8481
8697
  ];
8482
8698
  var REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
8483
8699
  function encryptConfig(config) {
@@ -12325,13 +12541,173 @@ var SessionMCPServerRepository = class {
12325
12541
  }
12326
12542
  };
12327
12543
 
12544
+ // src/db/repositories/session-relationships.ts
12545
+ init_esm_shims();
12546
+ init_ids();
12547
+ init_database_wrapper();
12548
+ init_schema();
12549
+ import { and as and19, eq as eq25, inArray as inArray6, or as or8 } from "drizzle-orm";
12550
+ var SessionRelationshipRepository = class {
12551
+ constructor(db) {
12552
+ this.db = db;
12553
+ }
12554
+ rowToRelationship(row) {
12555
+ return {
12556
+ relationship_id: row.relationship_id,
12557
+ source_session_id: row.source_session_id,
12558
+ target_session_id: row.target_session_id,
12559
+ relationship_type: row.relationship_type,
12560
+ created_by: row.created_by,
12561
+ created_at: new Date(row.created_at).toISOString(),
12562
+ updated_at: row.updated_at ? new Date(row.updated_at).toISOString() : null,
12563
+ callback_enabled: Boolean(row.callback_enabled),
12564
+ callback_session_id: row.callback_session_id ?? null,
12565
+ data: row.data ?? null
12566
+ };
12567
+ }
12568
+ async create(input) {
12569
+ try {
12570
+ const now = /* @__PURE__ */ new Date();
12571
+ const row = {
12572
+ relationship_id: generateId(),
12573
+ source_session_id: input.source_session_id,
12574
+ target_session_id: input.target_session_id,
12575
+ relationship_type: input.relationship_type,
12576
+ created_by: input.created_by,
12577
+ created_at: now,
12578
+ updated_at: now,
12579
+ callback_enabled: input.callback_enabled ?? false,
12580
+ callback_session_id: input.callback_session_id ?? null,
12581
+ data: input.data ?? null
12582
+ };
12583
+ await insert(this.db, sessionRelationships3).values(row).run();
12584
+ return this.rowToRelationship(row);
12585
+ } catch (error) {
12586
+ throw new RepositoryError(
12587
+ `Failed to create session relationship: ${error instanceof Error ? error.message : String(error)}`,
12588
+ error
12589
+ );
12590
+ }
12591
+ }
12592
+ async get(relationshipId) {
12593
+ try {
12594
+ const row = await select(this.db).from(sessionRelationships3).where(eq25(sessionRelationships3.relationship_id, relationshipId)).one();
12595
+ if (!row) throw new EntityNotFoundError("SessionRelationship", relationshipId);
12596
+ return this.rowToRelationship(row);
12597
+ } catch (error) {
12598
+ if (error instanceof EntityNotFoundError) throw error;
12599
+ throw new RepositoryError(
12600
+ `Failed to get session relationship: ${error instanceof Error ? error.message : String(error)}`,
12601
+ error
12602
+ );
12603
+ }
12604
+ }
12605
+ async findForSession(sessionId) {
12606
+ try {
12607
+ const rows = await select(this.db).from(sessionRelationships3).where(
12608
+ or8(
12609
+ eq25(sessionRelationships3.source_session_id, sessionId),
12610
+ eq25(sessionRelationships3.target_session_id, sessionId)
12611
+ )
12612
+ ).all();
12613
+ return rows.map((row) => this.rowToRelationship(row));
12614
+ } catch (error) {
12615
+ throw new RepositoryError(
12616
+ `Failed to list session relationships: ${error instanceof Error ? error.message : String(error)}`,
12617
+ error
12618
+ );
12619
+ }
12620
+ }
12621
+ async findForSessions(sessionIds) {
12622
+ if (sessionIds.length === 0) return [];
12623
+ try {
12624
+ const rows = await select(this.db).from(sessionRelationships3).where(
12625
+ or8(
12626
+ inArray6(sessionRelationships3.source_session_id, sessionIds),
12627
+ inArray6(sessionRelationships3.target_session_id, sessionIds)
12628
+ )
12629
+ ).all();
12630
+ return rows.map((row) => this.rowToRelationship(row));
12631
+ } catch (error) {
12632
+ throw new RepositoryError(
12633
+ `Failed to list session relationships: ${error instanceof Error ? error.message : String(error)}`,
12634
+ error
12635
+ );
12636
+ }
12637
+ }
12638
+ async findRemoteChildren(sourceSessionId) {
12639
+ try {
12640
+ const rows = await select(this.db).from(sessionRelationships3).where(
12641
+ and19(
12642
+ eq25(sessionRelationships3.source_session_id, sourceSessionId),
12643
+ eq25(sessionRelationships3.relationship_type, "remote_create")
12644
+ )
12645
+ ).all();
12646
+ return rows.map((row) => this.rowToRelationship(row));
12647
+ } catch (error) {
12648
+ throw new RepositoryError(
12649
+ `Failed to list remote child relationships: ${error instanceof Error ? error.message : String(error)}`,
12650
+ error
12651
+ );
12652
+ }
12653
+ }
12654
+ async findRemoteParents(targetSessionId) {
12655
+ try {
12656
+ const rows = await select(this.db).from(sessionRelationships3).where(
12657
+ and19(
12658
+ eq25(sessionRelationships3.target_session_id, targetSessionId),
12659
+ eq25(sessionRelationships3.relationship_type, "remote_create")
12660
+ )
12661
+ ).all();
12662
+ return rows.map((row) => this.rowToRelationship(row));
12663
+ } catch (error) {
12664
+ throw new RepositoryError(
12665
+ `Failed to list remote parent relationships: ${error instanceof Error ? error.message : String(error)}`,
12666
+ error
12667
+ );
12668
+ }
12669
+ }
12670
+ async setCallbackEnabled(relationshipId, callbackEnabled) {
12671
+ try {
12672
+ const result = await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(eq25(sessionRelationships3.relationship_id, relationshipId)).run();
12673
+ if (result.rowsAffected === 0) {
12674
+ throw new EntityNotFoundError("SessionRelationship", relationshipId);
12675
+ }
12676
+ const row = await select(this.db).from(sessionRelationships3).where(eq25(sessionRelationships3.relationship_id, relationshipId)).one();
12677
+ if (!row) throw new EntityNotFoundError("SessionRelationship", relationshipId);
12678
+ return this.rowToRelationship(row);
12679
+ } catch (error) {
12680
+ if (error instanceof EntityNotFoundError) throw error;
12681
+ throw new RepositoryError(
12682
+ `Failed to update session relationship callback state: ${error instanceof Error ? error.message : String(error)}`,
12683
+ error
12684
+ );
12685
+ }
12686
+ }
12687
+ async setCallbackEnabledForTargetSession(targetSessionId, callbackEnabled) {
12688
+ try {
12689
+ await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(
12690
+ and19(
12691
+ eq25(sessionRelationships3.target_session_id, targetSessionId),
12692
+ eq25(sessionRelationships3.relationship_type, "remote_create")
12693
+ )
12694
+ ).run();
12695
+ } catch (error) {
12696
+ throw new RepositoryError(
12697
+ `Failed to update target session relationship callback state: ${error instanceof Error ? error.message : String(error)}`,
12698
+ error
12699
+ );
12700
+ }
12701
+ }
12702
+ };
12703
+
12328
12704
  // src/db/repositories/tasks.ts
12329
12705
  init_esm_shims();
12330
12706
  init_types2();
12331
12707
  init_ids();
12332
12708
  init_database_wrapper();
12333
12709
  init_schema();
12334
- import { eq as eq25, inArray as inArray6, like as like13, sql as sql13 } from "drizzle-orm";
12710
+ import { eq as eq26, inArray as inArray7, like as like13, sql as sql13 } from "drizzle-orm";
12335
12711
  var TaskRepository = class {
12336
12712
  constructor(db) {
12337
12713
  this.db = db;
@@ -12427,7 +12803,7 @@ var TaskRepository = class {
12427
12803
  try {
12428
12804
  const insertData = this.taskToInsert(data);
12429
12805
  await insert(this.db, tasks3).values(insertData).run();
12430
- const row = await select(this.db).from(tasks3).where(eq25(tasks3.task_id, insertData.task_id)).one();
12806
+ const row = await select(this.db).from(tasks3).where(eq26(tasks3.task_id, insertData.task_id)).one();
12431
12807
  if (!row) {
12432
12808
  throw new RepositoryError("Failed to retrieve created task");
12433
12809
  }
@@ -12451,7 +12827,7 @@ var TaskRepository = class {
12451
12827
  const inserts = taskList.map((task) => this.taskToInsert(task));
12452
12828
  await insert(this.db, tasks3).values(inserts).run();
12453
12829
  const taskIds = inserts.map((t3) => t3.task_id);
12454
- const rows = await select(this.db).from(tasks3).where(inArray6(tasks3.task_id, taskIds)).all();
12830
+ const rows = await select(this.db).from(tasks3).where(inArray7(tasks3.task_id, taskIds)).all();
12455
12831
  const rowsById = new Map(rows.map((r) => [r.task_id, r]));
12456
12832
  return taskIds.map((id) => this.rowToTask(rowsById.get(id)));
12457
12833
  } catch (error) {
@@ -12467,7 +12843,7 @@ var TaskRepository = class {
12467
12843
  async findById(id) {
12468
12844
  try {
12469
12845
  const fullId = await this.resolveId(id);
12470
- const row = await select(this.db).from(tasks3).where(eq25(tasks3.task_id, fullId)).one();
12846
+ const row = await select(this.db).from(tasks3).where(eq26(tasks3.task_id, fullId)).one();
12471
12847
  return row ? this.rowToTask(row) : null;
12472
12848
  } catch (error) {
12473
12849
  if (error instanceof EntityNotFoundError) return null;
@@ -12497,7 +12873,7 @@ var TaskRepository = class {
12497
12873
  */
12498
12874
  async findBySession(sessionId) {
12499
12875
  try {
12500
- const rows = await select(this.db).from(tasks3).where(eq25(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
12876
+ const rows = await select(this.db).from(tasks3).where(eq26(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
12501
12877
  return rows.map((row) => this.rowToTask(row));
12502
12878
  } catch (error) {
12503
12879
  throw new RepositoryError(
@@ -12511,7 +12887,7 @@ var TaskRepository = class {
12511
12887
  */
12512
12888
  async findRunning() {
12513
12889
  try {
12514
- const rows = await select(this.db).from(tasks3).where(eq25(tasks3.status, TaskStatus.RUNNING)).all();
12890
+ const rows = await select(this.db).from(tasks3).where(eq26(tasks3.status, TaskStatus.RUNNING)).all();
12515
12891
  return rows.map((row) => this.rowToTask(row));
12516
12892
  } catch (error) {
12517
12893
  throw new RepositoryError(
@@ -12567,7 +12943,7 @@ var TaskRepository = class {
12567
12943
  */
12568
12944
  async findByStatus(status) {
12569
12945
  try {
12570
- const rows = await select(this.db).from(tasks3).where(eq25(tasks3.status, status)).all();
12946
+ const rows = await select(this.db).from(tasks3).where(eq26(tasks3.status, status)).all();
12571
12947
  return rows.map((row) => this.rowToTask(row));
12572
12948
  } catch (error) {
12573
12949
  throw new RepositoryError(
@@ -12589,8 +12965,8 @@ var TaskRepository = class {
12589
12965
  `\u{1F504} [TaskRepo] Updating task ${shortId(fullId)}${updates.status ? ` (status: ${updates.status})` : ""}`
12590
12966
  );
12591
12967
  const result = await this.db.transaction(async (tx) => {
12592
- await lockRowForUpdate(txAsDb(tx), this.db, tasks3, eq25(tasks3.task_id, fullId));
12593
- const currentRow = await select(txAsDb(tx)).from(tasks3).where(eq25(tasks3.task_id, fullId)).one();
12968
+ await lockRowForUpdate(txAsDb(tx), this.db, tasks3, eq26(tasks3.task_id, fullId));
12969
+ const currentRow = await select(txAsDb(tx)).from(tasks3).where(eq26(tasks3.task_id, fullId)).one();
12594
12970
  if (!currentRow) {
12595
12971
  throw new EntityNotFoundError("Task", id);
12596
12972
  }
@@ -12604,7 +12980,7 @@ var TaskRepository = class {
12604
12980
  last_executor_heartbeat_at: insertData.last_executor_heartbeat_at,
12605
12981
  session_md5: insertData.session_md5,
12606
12982
  data: insertData.data
12607
- }).where(eq25(tasks3.task_id, fullId)).run();
12983
+ }).where(eq26(tasks3.task_id, fullId)).run();
12608
12984
  return merged;
12609
12985
  });
12610
12986
  return result;
@@ -12623,7 +12999,7 @@ var TaskRepository = class {
12623
12999
  async delete(id) {
12624
13000
  try {
12625
13001
  const fullId = await this.resolveId(id);
12626
- const result = await deleteFrom(this.db, tasks3).where(eq25(tasks3.task_id, fullId)).run();
13002
+ const result = await deleteFrom(this.db, tasks3).where(eq26(tasks3.task_id, fullId)).run();
12627
13003
  if (result.rowsAffected === 0) {
12628
13004
  throw new EntityNotFoundError("Task", id);
12629
13005
  }
@@ -12685,7 +13061,7 @@ var TaskRepository = class {
12685
13061
  queue_position: nextPosition
12686
13062
  });
12687
13063
  await insert(txAsDb(tx), tasks3).values(insertData).run();
12688
- const row = await select(txAsDb(tx)).from(tasks3).where(eq25(tasks3.task_id, insertData.task_id)).one();
13064
+ const row = await select(txAsDb(tx)).from(tasks3).where(eq26(tasks3.task_id, insertData.task_id)).one();
12689
13065
  if (!row) {
12690
13066
  throw new RepositoryError("Failed to retrieve created queued task");
12691
13067
  }
@@ -12726,7 +13102,7 @@ var TaskRepository = class {
12726
13102
  */
12727
13103
  async countBySession(sessionId) {
12728
13104
  try {
12729
- const result = await select(this.db, { count: sql13`count(*)` }).from(tasks3).where(eq25(tasks3.session_id, sessionId)).one();
13105
+ const result = await select(this.db, { count: sql13`count(*)` }).from(tasks3).where(eq26(tasks3.session_id, sessionId)).one();
12730
13106
  return result?.count ?? 0;
12731
13107
  } catch (error) {
12732
13108
  throw new RepositoryError(
@@ -12743,7 +13119,7 @@ init_types2();
12743
13119
  init_ids();
12744
13120
  init_database_wrapper();
12745
13121
  init_schema();
12746
- import { and as and19, eq as eq26, like as like14, lt as lt2 } from "drizzle-orm";
13122
+ import { and as and20, eq as eq27, like as like14, lt as lt2 } from "drizzle-orm";
12747
13123
  var ThreadSessionMapRepository = class {
12748
13124
  constructor(db) {
12749
13125
  this.db = db;
@@ -12813,7 +13189,7 @@ var ThreadSessionMapRepository = class {
12813
13189
  id: data.id ?? generateId()
12814
13190
  });
12815
13191
  await insert(this.db, threadSessionMap3).values(insertData).run();
12816
- const row = await select(this.db).from(threadSessionMap3).where(eq26(threadSessionMap3.id, insertData.id)).one();
13192
+ const row = await select(this.db).from(threadSessionMap3).where(eq27(threadSessionMap3.id, insertData.id)).one();
12817
13193
  if (!row) {
12818
13194
  throw new RepositoryError("Failed to retrieve created thread-session mapping");
12819
13195
  }
@@ -12832,7 +13208,7 @@ var ThreadSessionMapRepository = class {
12832
13208
  async findById(id) {
12833
13209
  try {
12834
13210
  const fullId = await this.resolveId(id);
12835
- const row = await select(this.db).from(threadSessionMap3).where(eq26(threadSessionMap3.id, fullId)).one();
13211
+ const row = await select(this.db).from(threadSessionMap3).where(eq27(threadSessionMap3.id, fullId)).one();
12836
13212
  return row ? this.rowToMapping(row) : null;
12837
13213
  } catch (error) {
12838
13214
  if (error instanceof EntityNotFoundError) return null;
@@ -12873,7 +13249,7 @@ var ThreadSessionMapRepository = class {
12873
13249
  status: insertData.status,
12874
13250
  last_message_at: insertData.last_message_at,
12875
13251
  metadata: insertData.metadata
12876
- }).where(eq26(threadSessionMap3.id, fullId)).run();
13252
+ }).where(eq27(threadSessionMap3.id, fullId)).run();
12877
13253
  const updated = await this.findById(fullId);
12878
13254
  if (!updated) {
12879
13255
  throw new RepositoryError("Failed to retrieve updated thread-session mapping");
@@ -12894,7 +13270,7 @@ var ThreadSessionMapRepository = class {
12894
13270
  async delete(id) {
12895
13271
  try {
12896
13272
  const fullId = await this.resolveId(id);
12897
- const result = await deleteFrom(this.db, threadSessionMap3).where(eq26(threadSessionMap3.id, fullId)).run();
13273
+ const result = await deleteFrom(this.db, threadSessionMap3).where(eq27(threadSessionMap3.id, fullId)).run();
12898
13274
  if (result.rowsAffected === 0) {
12899
13275
  throw new EntityNotFoundError("ThreadSessionMap", id);
12900
13276
  }
@@ -12912,7 +13288,7 @@ var ThreadSessionMapRepository = class {
12912
13288
  async findByChannelAndThread(channelId, threadId) {
12913
13289
  try {
12914
13290
  const row = await select(this.db).from(threadSessionMap3).where(
12915
- and19(eq26(threadSessionMap3.channel_id, channelId), eq26(threadSessionMap3.thread_id, threadId))
13291
+ and20(eq27(threadSessionMap3.channel_id, channelId), eq27(threadSessionMap3.thread_id, threadId))
12916
13292
  ).one();
12917
13293
  return row ? this.rowToMapping(row) : null;
12918
13294
  } catch (error) {
@@ -12929,7 +13305,7 @@ var ThreadSessionMapRepository = class {
12929
13305
  */
12930
13306
  async findByThread(threadId) {
12931
13307
  try {
12932
- const row = await select(this.db).from(threadSessionMap3).where(eq26(threadSessionMap3.thread_id, threadId)).one();
13308
+ const row = await select(this.db).from(threadSessionMap3).where(eq27(threadSessionMap3.thread_id, threadId)).one();
12933
13309
  return row ? this.rowToMapping(row) : null;
12934
13310
  } catch (error) {
12935
13311
  throw new RepositoryError(
@@ -12943,7 +13319,7 @@ var ThreadSessionMapRepository = class {
12943
13319
  */
12944
13320
  async findBySession(sessionId) {
12945
13321
  try {
12946
- const row = await select(this.db).from(threadSessionMap3).where(eq26(threadSessionMap3.session_id, sessionId)).one();
13322
+ const row = await select(this.db).from(threadSessionMap3).where(eq27(threadSessionMap3.session_id, sessionId)).one();
12947
13323
  return row ? this.rowToMapping(row) : null;
12948
13324
  } catch (error) {
12949
13325
  throw new RepositoryError(
@@ -12957,11 +13333,11 @@ var ThreadSessionMapRepository = class {
12957
13333
  */
12958
13334
  async findByChannel(channelId, status) {
12959
13335
  try {
12960
- const conditions = [eq26(threadSessionMap3.channel_id, channelId)];
13336
+ const conditions = [eq27(threadSessionMap3.channel_id, channelId)];
12961
13337
  if (status) {
12962
- conditions.push(eq26(threadSessionMap3.status, status));
13338
+ conditions.push(eq27(threadSessionMap3.status, status));
12963
13339
  }
12964
- const rows = await select(this.db).from(threadSessionMap3).where(and19(...conditions)).all();
13340
+ const rows = await select(this.db).from(threadSessionMap3).where(and20(...conditions)).all();
12965
13341
  return rows.map((row) => this.rowToMapping(row));
12966
13342
  } catch (error) {
12967
13343
  throw new RepositoryError(
@@ -12977,7 +13353,7 @@ var ThreadSessionMapRepository = class {
12977
13353
  try {
12978
13354
  await update(this.db, threadSessionMap3).set({
12979
13355
  last_message_at: /* @__PURE__ */ new Date()
12980
- }).where(eq26(threadSessionMap3.id, id)).run();
13356
+ }).where(eq27(threadSessionMap3.id, id)).run();
12981
13357
  } catch (error) {
12982
13358
  throw new RepositoryError(
12983
13359
  `Failed to update last message timestamp: ${error instanceof Error ? error.message : String(error)}`,
@@ -12990,7 +13366,7 @@ var ThreadSessionMapRepository = class {
12990
13366
  */
12991
13367
  async updateMetadata(id, metadata) {
12992
13368
  try {
12993
- await update(this.db, threadSessionMap3).set({ metadata }).where(eq26(threadSessionMap3.id, id)).run();
13369
+ await update(this.db, threadSessionMap3).set({ metadata }).where(eq27(threadSessionMap3.id, id)).run();
12994
13370
  } catch (error) {
12995
13371
  throw new RepositoryError(
12996
13372
  `Failed to update metadata: ${error instanceof Error ? error.message : String(error)}`,
@@ -13005,7 +13381,7 @@ var ThreadSessionMapRepository = class {
13005
13381
  try {
13006
13382
  const cutoff = new Date(Date.now() - daysInactive * 24 * 60 * 60 * 1e3);
13007
13383
  const rows = await select(this.db).from(threadSessionMap3).where(
13008
- and19(eq26(threadSessionMap3.status, "active"), lt2(threadSessionMap3.last_message_at, cutoff))
13384
+ and20(eq27(threadSessionMap3.status, "active"), lt2(threadSessionMap3.last_message_at, cutoff))
13009
13385
  ).all();
13010
13386
  return rows.map((row) => this.rowToMapping(row));
13011
13387
  } catch (error) {
@@ -13020,7 +13396,7 @@ var ThreadSessionMapRepository = class {
13020
13396
  */
13021
13397
  async findByBranch(branchId) {
13022
13398
  try {
13023
- const rows = await select(this.db).from(threadSessionMap3).where(eq26(threadSessionMap3.branch_id, branchId)).all();
13399
+ const rows = await select(this.db).from(threadSessionMap3).where(eq27(threadSessionMap3.branch_id, branchId)).all();
13024
13400
  return rows.map((row) => this.rowToMapping(row));
13025
13401
  } catch (error) {
13026
13402
  throw new RepositoryError(
@@ -13038,7 +13414,7 @@ init_database_wrapper();
13038
13414
  init_schema();
13039
13415
  import { randomBytes as randomBytes3 } from "crypto";
13040
13416
  import bcrypt2 from "bcryptjs";
13041
- import { and as and20, eq as eq27 } from "drizzle-orm";
13417
+ import { and as and21, eq as eq28 } from "drizzle-orm";
13042
13418
  var KEY_PREFIX = "agor_sk_";
13043
13419
  var KEY_PREFIX_LENGTH = 12;
13044
13420
  var KEY_RANDOM_BYTES = 32;
@@ -13075,7 +13451,7 @@ var UserApiKeysRepository = class {
13075
13451
  }
13076
13452
  /** List all API keys for a user (never returns hashes) */
13077
13453
  async listByUser(userId) {
13078
- const rows = await select(this.db).from(userApiKeys3).where(eq27(userApiKeys3.user_id, userId)).all();
13454
+ const rows = await select(this.db).from(userApiKeys3).where(eq28(userApiKeys3.user_id, userId)).all();
13079
13455
  return rows.map((r) => ({
13080
13456
  id: r.id,
13081
13457
  name: r.name,
@@ -13086,7 +13462,7 @@ var UserApiKeysRepository = class {
13086
13462
  }
13087
13463
  /** Find a key by prefix (for auth lookup). Returns rows with hash for verification. */
13088
13464
  async findByPrefix(prefix) {
13089
- return select(this.db).from(userApiKeys3).where(eq27(userApiKeys3.prefix, prefix)).all();
13465
+ return select(this.db).from(userApiKeys3).where(eq28(userApiKeys3.prefix, prefix)).all();
13090
13466
  }
13091
13467
  /** Verify a raw API key against stored hashes. Returns the matching row or null. */
13092
13468
  async verifyKey(rawKey) {
@@ -13101,19 +13477,19 @@ var UserApiKeysRepository = class {
13101
13477
  }
13102
13478
  /** Update last_used_at timestamp */
13103
13479
  async updateLastUsed(id) {
13104
- await update(this.db, userApiKeys3).set({ last_used_at: /* @__PURE__ */ new Date() }).where(eq27(userApiKeys3.id, id)).run();
13480
+ await update(this.db, userApiKeys3).set({ last_used_at: /* @__PURE__ */ new Date() }).where(eq28(userApiKeys3.id, id)).run();
13105
13481
  }
13106
13482
  /** Update key name */
13107
13483
  async updateName(id, userId, name) {
13108
- await update(this.db, userApiKeys3).set({ name }).where(and20(eq27(userApiKeys3.id, id), eq27(userApiKeys3.user_id, userId))).run();
13484
+ await update(this.db, userApiKeys3).set({ name }).where(and21(eq28(userApiKeys3.id, id), eq28(userApiKeys3.user_id, userId))).run();
13109
13485
  }
13110
13486
  /** Delete a key */
13111
13487
  async delete(id, userId) {
13112
- await deleteFrom(this.db, userApiKeys3).where(and20(eq27(userApiKeys3.id, id), eq27(userApiKeys3.user_id, userId))).run();
13488
+ await deleteFrom(this.db, userApiKeys3).where(and21(eq28(userApiKeys3.id, id), eq28(userApiKeys3.user_id, userId))).run();
13113
13489
  }
13114
13490
  /** Delete all keys for a user */
13115
13491
  async deleteAllForUser(userId) {
13116
- await deleteFrom(this.db, userApiKeys3).where(eq27(userApiKeys3.user_id, userId)).run();
13492
+ await deleteFrom(this.db, userApiKeys3).where(eq28(userApiKeys3.user_id, userId)).run();
13117
13493
  }
13118
13494
  };
13119
13495
 
@@ -13121,7 +13497,7 @@ var UserApiKeysRepository = class {
13121
13497
  init_esm_shims();
13122
13498
  init_database_wrapper();
13123
13499
  init_schema();
13124
- import { and as and21, eq as eq28, isNull as isNull6 } from "drizzle-orm";
13500
+ import { and as and22, eq as eq29, isNull as isNull6 } from "drizzle-orm";
13125
13501
  function rowToToken(row) {
13126
13502
  return {
13127
13503
  user_id: row.user_id ?? null,
@@ -13136,9 +13512,9 @@ function rowToToken(row) {
13136
13512
  };
13137
13513
  }
13138
13514
  function matchKey(userId, serverId) {
13139
- return and21(
13140
- userId === null ? isNull6(userMcpOauthTokens3.user_id) : eq28(userMcpOauthTokens3.user_id, userId),
13141
- eq28(userMcpOauthTokens3.mcp_server_id, serverId)
13515
+ return and22(
13516
+ userId === null ? isNull6(userMcpOauthTokens3.user_id) : eq29(userMcpOauthTokens3.user_id, userId),
13517
+ eq29(userMcpOauthTokens3.mcp_server_id, serverId)
13142
13518
  );
13143
13519
  }
13144
13520
  var UserMCPOAuthTokenRepository = class {
@@ -13255,7 +13631,7 @@ var UserMCPOAuthTokenRepository = class {
13255
13631
  }
13256
13632
  async deleteAllForUser(userId) {
13257
13633
  try {
13258
- const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq28(userMcpOauthTokens3.user_id, userId)).run();
13634
+ const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq29(userMcpOauthTokens3.user_id, userId)).run();
13259
13635
  return result.rowsAffected;
13260
13636
  } catch (error) {
13261
13637
  throw new RepositoryError(
@@ -13266,7 +13642,7 @@ var UserMCPOAuthTokenRepository = class {
13266
13642
  }
13267
13643
  async deleteAllForServer(serverId) {
13268
13644
  try {
13269
- const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq28(userMcpOauthTokens3.mcp_server_id, serverId)).run();
13645
+ const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq29(userMcpOauthTokens3.mcp_server_id, serverId)).run();
13270
13646
  return result.rowsAffected;
13271
13647
  } catch (error) {
13272
13648
  throw new RepositoryError(
@@ -13277,7 +13653,7 @@ var UserMCPOAuthTokenRepository = class {
13277
13653
  }
13278
13654
  async listForUser(userId) {
13279
13655
  try {
13280
- const rows = await select(this.db).from(userMcpOauthTokens3).where(eq28(userMcpOauthTokens3.user_id, userId)).all();
13656
+ const rows = await select(this.db).from(userMcpOauthTokens3).where(eq29(userMcpOauthTokens3.user_id, userId)).all();
13281
13657
  return rows.map(rowToToken);
13282
13658
  } catch (error) {
13283
13659
  throw new RepositoryError(
@@ -13295,7 +13671,7 @@ var UserMCPOAuthTokenRepository = class {
13295
13671
  // src/db/repositories/users.ts
13296
13672
  init_esm_shims();
13297
13673
  init_types2();
13298
- import { eq as eq29, like as like15 } from "drizzle-orm";
13674
+ import { eq as eq30, like as like15, sql as sql14 } from "drizzle-orm";
13299
13675
 
13300
13676
  // src/config/env-vars.ts
13301
13677
  init_esm_shims();
@@ -13425,7 +13801,7 @@ var UsersRepository = class {
13425
13801
  * Check if unix_username is already taken by another user
13426
13802
  */
13427
13803
  async isUnixUsernameTaken(unixUsername, excludeUserId) {
13428
- const result = await select(this.db).from(users3).where(eq29(users3.unix_username, unixUsername)).one();
13804
+ const result = await select(this.db).from(users3).where(eq30(users3.unix_username, unixUsername)).one();
13429
13805
  if (!result) {
13430
13806
  return false;
13431
13807
  }
@@ -13448,7 +13824,7 @@ var UsersRepository = class {
13448
13824
  }
13449
13825
  const insertData = this.userToInsert(data);
13450
13826
  await insert(this.db, users3).values(insertData).run();
13451
- const row = await select(this.db).from(users3).where(eq29(users3.user_id, insertData.user_id)).one();
13827
+ const row = await select(this.db).from(users3).where(eq30(users3.user_id, insertData.user_id)).one();
13452
13828
  if (!row) {
13453
13829
  throw new RepositoryError("Failed to retrieve created user");
13454
13830
  }
@@ -13460,7 +13836,7 @@ var UsersRepository = class {
13460
13836
  async findById(id) {
13461
13837
  try {
13462
13838
  const fullId = await this.resolveId(id);
13463
- const result = await select(this.db).from(users3).where(eq29(users3.user_id, fullId)).one();
13839
+ const result = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
13464
13840
  if (!result) {
13465
13841
  return null;
13466
13842
  }
@@ -13476,12 +13852,41 @@ var UsersRepository = class {
13476
13852
  * Find user by email
13477
13853
  */
13478
13854
  async findByEmail(email) {
13479
- const result = await select(this.db).from(users3).where(eq29(users3.email, email)).one();
13855
+ const result = await select(this.db).from(users3).where(eq30(users3.email, email)).one();
13480
13856
  if (!result) {
13481
13857
  return null;
13482
13858
  }
13483
13859
  return this.rowToUser(result);
13484
13860
  }
13861
+ /**
13862
+ * Find user by email for external identity providers.
13863
+ *
13864
+ * Agor intentionally keeps exact/case-sensitive email lookup semantics for
13865
+ * auth paths because the schema historically allowed case-distinct emails.
13866
+ * External providers such as Slack and GitHub treat email addresses as a
13867
+ * canonical identity hint, so their alignment path needs a case-insensitive
13868
+ * match. Prefer an exact match when present; otherwise return a
13869
+ * case-insensitive match only when it is unambiguous.
13870
+ */
13871
+ async findByEmailForAlignment(email) {
13872
+ const normalizedEmail = email.trim().toLowerCase();
13873
+ if (!normalizedEmail) return null;
13874
+ const exact = await this.findByEmail(normalizedEmail);
13875
+ if (exact) return exact;
13876
+ const results = await select(this.db).from(users3).where(sql14`LOWER(${users3.email}) = ${normalizedEmail}`).all();
13877
+ if (results.length !== 1) {
13878
+ if (results.length > 1) {
13879
+ console.warn(
13880
+ `[users] Ambiguous case-insensitive email alignment for ${normalizedEmail}: ${results.map((row) => {
13881
+ const userRow = row;
13882
+ return `${shortId(userRow.user_id)}:${userRow.email}`;
13883
+ }).join(", ")}`
13884
+ );
13885
+ }
13886
+ return null;
13887
+ }
13888
+ return this.rowToUser(results[0]);
13889
+ }
13485
13890
  /**
13486
13891
  * Find all users
13487
13892
  */
@@ -13518,8 +13923,8 @@ var UsersRepository = class {
13518
13923
  await update(this.db, users3).set({
13519
13924
  ...insertData,
13520
13925
  updated_at: /* @__PURE__ */ new Date()
13521
- }).where(eq29(users3.user_id, fullId)).run();
13522
- const row = await select(this.db).from(users3).where(eq29(users3.user_id, fullId)).one();
13926
+ }).where(eq30(users3.user_id, fullId)).run();
13927
+ const row = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
13523
13928
  if (!row) {
13524
13929
  throw new RepositoryError("Failed to retrieve updated user");
13525
13930
  }
@@ -13530,7 +13935,7 @@ var UsersRepository = class {
13530
13935
  */
13531
13936
  async delete(id) {
13532
13937
  const fullId = await this.resolveId(id);
13533
- await deleteFrom(this.db, users3).where(eq29(users3.user_id, fullId)).run();
13938
+ await deleteFrom(this.db, users3).where(eq30(users3.user_id, fullId)).run();
13534
13939
  }
13535
13940
  /**
13536
13941
  * Get raw database row (internal use only - includes encrypted keys)
@@ -13538,7 +13943,7 @@ var UsersRepository = class {
13538
13943
  async getRawRow(id) {
13539
13944
  try {
13540
13945
  const fullId = await this.resolveId(id);
13541
- const result = await select(this.db).from(users3).where(eq29(users3.user_id, fullId)).one();
13946
+ const result = await select(this.db).from(users3).where(eq30(users3.user_id, fullId)).one();
13542
13947
  return result;
13543
13948
  } catch (error) {
13544
13949
  if (error instanceof EntityNotFoundError) {
@@ -13620,7 +14025,7 @@ var UsersRepository = class {
13620
14025
  await update(this.db, users3).set({
13621
14026
  data: { ...row.data, agentic_tools: next },
13622
14027
  updated_at: /* @__PURE__ */ new Date()
13623
- }).where(eq29(users3.user_id, fullId)).run();
14028
+ }).where(eq30(users3.user_id, fullId)).run();
13624
14029
  }
13625
14030
  /**
13626
14031
  * Delete a single credential field for a tool.
@@ -13646,7 +14051,7 @@ var UsersRepository = class {
13646
14051
  await update(this.db, users3).set({
13647
14052
  data: { ...row.data, agentic_tools: next },
13648
14053
  updated_at: /* @__PURE__ */ new Date()
13649
- }).where(eq29(users3.user_id, fullId)).run();
14054
+ }).where(eq30(users3.user_id, fullId)).run();
13650
14055
  }
13651
14056
  };
13652
14057
 
@@ -13708,6 +14113,7 @@ export {
13708
14113
  SerializedSessionRepository,
13709
14114
  SessionEnvSelectionRepository,
13710
14115
  SessionMCPServerRepository,
14116
+ SessionRelationshipRepository,
13711
14117
  SessionRepository,
13712
14118
  TaskRepository,
13713
14119
  ThreadSessionMapRepository,
@@ -13715,7 +14121,7 @@ export {
13715
14121
  UserMCPOAuthTokenRepository,
13716
14122
  UsersRepository,
13717
14123
  advisoryLockKeyForUuid,
13718
- and22 as and,
14124
+ and23 as and,
13719
14125
  appVariables3 as appVariables,
13720
14126
  artifactTrustGrants3 as artifactTrustGrants,
13721
14127
  artifacts3 as artifacts,
@@ -13744,7 +14150,7 @@ export {
13744
14150
  deleteFrom,
13745
14151
  desc6 as desc,
13746
14152
  encryptApiKey,
13747
- eq30 as eq,
14153
+ eq31 as eq,
13748
14154
  executeAll,
13749
14155
  executeGet,
13750
14156
  executeRaw,
@@ -13764,7 +14170,7 @@ export {
13764
14170
  gte,
13765
14171
  hash,
13766
14172
  identifyUrlParam,
13767
- inArray7 as inArray,
14173
+ inArray8 as inArray,
13768
14174
  initializeDatabase,
13769
14175
  insert,
13770
14176
  insertOne,
@@ -13788,7 +14194,7 @@ export {
13788
14194
  lte2 as lte,
13789
14195
  mcpServers3 as mcpServers,
13790
14196
  messages3 as messages,
13791
- or8 as or,
14197
+ or9 as or,
13792
14198
  reattributeLegacyAnonymousRows,
13793
14199
  repos3 as repos,
13794
14200
  resolveByShortIdPrefix,
@@ -13800,9 +14206,10 @@ export {
13800
14206
  serializedSessions3 as serializedSessions,
13801
14207
  sessionEnvSelections3 as sessionEnvSelections,
13802
14208
  sessionMcpServers3 as sessionMcpServers,
14209
+ sessionRelationships3 as sessionRelationships,
13803
14210
  sessions3 as sessions,
13804
14211
  shortId,
13805
- sql14 as sql,
14212
+ sql15 as sql,
13806
14213
  tasks3 as tasks,
13807
14214
  threadSessionMap3 as threadSessionMap,
13808
14215
  tryAdvisoryXactLock,