agor-live 0.12.2 → 0.12.3

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 (372) hide show
  1. package/dist/core/api/index.d.cts +4 -4
  2. package/dist/core/api/index.d.ts +4 -4
  3. package/dist/core/{board-DCNkcsyf.d.cts → board-ByCag4EG.d.cts} +8 -1
  4. package/dist/core/{board-C-PU8jok.d.ts → board-CZuyMRpr.d.ts} +8 -1
  5. package/dist/core/claude/index.cjs +46 -5
  6. package/dist/core/claude/index.js +51 -21
  7. package/dist/core/{client-CGO13BG6.d.ts → client-BoLj-jqT.d.ts} +30 -5
  8. package/dist/core/{client-DKbFqX_X.d.cts → client-gnSCmSyL.d.cts} +30 -5
  9. package/dist/core/config/browser.d.cts +1 -1
  10. package/dist/core/config/browser.d.ts +1 -1
  11. package/dist/core/config/index.cjs +60 -4
  12. package/dist/core/config/index.d.cts +6 -5
  13. package/dist/core/config/index.d.ts +6 -5
  14. package/dist/core/config/index.js +64 -20
  15. package/dist/core/{config-manager-DGBdhxtZ.d.ts → config-manager-BLDGbZHT.d.ts} +16 -2
  16. package/dist/core/{config-manager-sCgziLkz.d.cts → config-manager-CsBk-Rh2.d.cts} +16 -2
  17. package/dist/core/db/index.cjs +332 -60
  18. package/dist/core/db/index.d.cts +33 -7
  19. package/dist/core/db/index.d.ts +33 -7
  20. package/dist/core/db/index.js +338 -77
  21. package/dist/core/drizzle/postgres/meta/_journal.json +1 -1
  22. package/dist/core/drizzle/sqlite/meta/_journal.json +1 -1
  23. package/dist/core/{feathers-B0zjReEk.d.ts → feathers-CYMJeMWB.d.ts} +1 -1
  24. package/dist/core/{feathers-C1uChqXy.d.cts → feathers-Cyk1lpAM.d.cts} +1 -1
  25. package/dist/core/gateway/index.cjs +137 -12
  26. package/dist/core/gateway/index.d.cts +22 -6
  27. package/dist/core/gateway/index.d.ts +22 -6
  28. package/dist/core/gateway/index.js +137 -12
  29. package/dist/core/{gateway-Dy9fVyiS.d.ts → gateway-B4CaePYV.d.ts} +2 -2
  30. package/dist/core/{gateway-DGNtjRnd.d.cts → gateway-C2NOdrxu.d.cts} +2 -2
  31. package/dist/core/git/index.d.cts +2 -2
  32. package/dist/core/git/index.d.ts +2 -2
  33. package/dist/core/index.cjs +226 -48
  34. package/dist/core/index.d.cts +8 -8
  35. package/dist/core/index.d.ts +8 -8
  36. package/dist/core/index.js +230 -64
  37. package/dist/core/mcp/index.cjs +24 -2
  38. package/dist/core/mcp/index.js +26 -4
  39. package/dist/core/seed/index.cjs +83 -13
  40. package/dist/core/seed/index.js +88 -29
  41. package/dist/core/{session-Bt9i9089.d.cts → session-BJbTzw3y.d.cts} +17 -1
  42. package/dist/core/{session-Da9rf6n5.d.ts → session-DLVkt-jY.d.ts} +17 -1
  43. package/dist/core/templates/session-context.d.cts +1 -1
  44. package/dist/core/templates/session-context.d.ts +1 -1
  45. package/dist/core/types/index.d.cts +6 -6
  46. package/dist/core/types/index.d.ts +6 -6
  47. package/dist/core/{types-D_wAaaE3.d.cts → types-Ddri21rw.d.cts} +18 -0
  48. package/dist/core/{types-D_wAaaE3.d.ts → types-Ddri21rw.d.ts} +18 -0
  49. package/dist/core/unix/index.cjs +63 -6
  50. package/dist/core/unix/index.d.cts +4 -3
  51. package/dist/core/unix/index.d.ts +4 -3
  52. package/dist/core/unix/index.js +68 -22
  53. package/dist/core/{user-DT1Qzfep.d.ts → user-B77oCF14.d.ts} +1 -1
  54. package/dist/core/{user-C5id0Zhj.d.cts → user-LBRon9n1.d.cts} +1 -1
  55. package/dist/core/utils/permission-mode-mapper.d.cts +1 -1
  56. package/dist/core/utils/permission-mode-mapper.d.ts +1 -1
  57. package/dist/core/utils/url.cjs +22 -0
  58. package/dist/core/utils/url.d.cts +45 -1
  59. package/dist/core/utils/url.d.ts +45 -1
  60. package/dist/core/utils/url.js +18 -0
  61. package/dist/daemon/index.js +168 -38
  62. package/dist/daemon/mcp/routes.js +5 -5
  63. package/dist/daemon/services/gateway.d.ts +9 -0
  64. package/dist/daemon/services/gateway.js +73 -6
  65. package/dist/daemon/services/repos.js +1 -0
  66. package/dist/daemon/services/thread-session-map.d.ts +6 -0
  67. package/dist/daemon/services/thread-session-map.js +9 -0
  68. package/dist/executor/cli.d.ts +0 -0
  69. package/dist/executor/cli.d.ts.map +0 -0
  70. package/dist/executor/cli.js +0 -0
  71. package/dist/executor/commands/git.d.ts +0 -0
  72. package/dist/executor/commands/git.d.ts.map +1 -1
  73. package/dist/executor/commands/git.js +3 -2
  74. package/dist/executor/commands/index.d.ts +0 -0
  75. package/dist/executor/commands/index.d.ts.map +0 -0
  76. package/dist/executor/commands/index.js +0 -0
  77. package/dist/executor/commands/unix.d.ts +0 -0
  78. package/dist/executor/commands/unix.d.ts.map +0 -0
  79. package/dist/executor/commands/unix.js +0 -0
  80. package/dist/executor/commands/zellij.d.ts +0 -0
  81. package/dist/executor/commands/zellij.d.ts.map +0 -0
  82. package/dist/executor/commands/zellij.js +0 -0
  83. package/dist/executor/config.d.ts +0 -0
  84. package/dist/executor/config.d.ts.map +0 -0
  85. package/dist/executor/config.js +0 -0
  86. package/dist/executor/db/feathers-repositories.d.ts +0 -0
  87. package/dist/executor/db/feathers-repositories.d.ts.map +0 -0
  88. package/dist/executor/db/feathers-repositories.js +0 -0
  89. package/dist/executor/handlers/sdk/base-executor.d.ts +0 -0
  90. package/dist/executor/handlers/sdk/base-executor.d.ts.map +0 -0
  91. package/dist/executor/handlers/sdk/base-executor.js +0 -0
  92. package/dist/executor/handlers/sdk/claude.d.ts +0 -0
  93. package/dist/executor/handlers/sdk/claude.d.ts.map +0 -0
  94. package/dist/executor/handlers/sdk/claude.js +0 -0
  95. package/dist/executor/handlers/sdk/codex.d.ts +0 -0
  96. package/dist/executor/handlers/sdk/codex.d.ts.map +0 -0
  97. package/dist/executor/handlers/sdk/codex.js +0 -0
  98. package/dist/executor/handlers/sdk/gemini.d.ts +0 -0
  99. package/dist/executor/handlers/sdk/gemini.d.ts.map +0 -0
  100. package/dist/executor/handlers/sdk/gemini.js +0 -0
  101. package/dist/executor/handlers/sdk/opencode.d.ts +0 -0
  102. package/dist/executor/handlers/sdk/opencode.d.ts.map +0 -0
  103. package/dist/executor/handlers/sdk/opencode.js +0 -0
  104. package/dist/executor/handlers/sdk/tool-registry.d.ts +0 -0
  105. package/dist/executor/handlers/sdk/tool-registry.d.ts.map +0 -0
  106. package/dist/executor/handlers/sdk/tool-registry.js +0 -0
  107. package/dist/executor/index.d.ts +0 -0
  108. package/dist/executor/index.d.ts.map +0 -0
  109. package/dist/executor/index.js +0 -0
  110. package/dist/executor/payload-types.d.ts +8 -0
  111. package/dist/executor/payload-types.d.ts.map +1 -1
  112. package/dist/executor/payload-types.js +2 -0
  113. package/dist/executor/permissions/permission-manager.d.ts +0 -0
  114. package/dist/executor/permissions/permission-manager.d.ts.map +0 -0
  115. package/dist/executor/permissions/permission-manager.js +0 -0
  116. package/dist/executor/permissions/permission-service.d.ts +0 -0
  117. package/dist/executor/permissions/permission-service.d.ts.map +0 -0
  118. package/dist/executor/permissions/permission-service.js +0 -0
  119. package/dist/executor/sdk-handlers/base/index.d.ts +0 -0
  120. package/dist/executor/sdk-handlers/base/index.d.ts.map +0 -0
  121. package/dist/executor/sdk-handlers/base/index.js +0 -0
  122. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts +0 -0
  123. package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +0 -0
  124. package/dist/executor/sdk-handlers/base/mcp-scoping.js +0 -0
  125. package/dist/executor/sdk-handlers/base/normalizer.interface.d.ts +0 -0
  126. package/dist/executor/sdk-handlers/base/normalizer.interface.d.ts.map +0 -0
  127. package/dist/executor/sdk-handlers/base/normalizer.interface.js +0 -0
  128. package/dist/executor/sdk-handlers/base/tool.interface.d.ts +0 -0
  129. package/dist/executor/sdk-handlers/base/tool.interface.d.ts.map +0 -0
  130. package/dist/executor/sdk-handlers/base/tool.interface.js +0 -0
  131. package/dist/executor/sdk-handlers/base/types.d.ts +0 -0
  132. package/dist/executor/sdk-handlers/base/types.d.ts.map +0 -0
  133. package/dist/executor/sdk-handlers/base/types.js +0 -0
  134. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +0 -0
  135. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +0 -0
  136. package/dist/executor/sdk-handlers/claude/claude-tool.js +0 -0
  137. package/dist/executor/sdk-handlers/claude/import/load-session.d.ts +0 -0
  138. package/dist/executor/sdk-handlers/claude/import/load-session.d.ts.map +0 -0
  139. package/dist/executor/sdk-handlers/claude/import/load-session.js +0 -0
  140. package/dist/executor/sdk-handlers/claude/import/message-converter.d.ts +0 -0
  141. package/dist/executor/sdk-handlers/claude/import/message-converter.d.ts.map +0 -0
  142. package/dist/executor/sdk-handlers/claude/import/message-converter.js +0 -0
  143. package/dist/executor/sdk-handlers/claude/import/task-extractor.d.ts +0 -0
  144. package/dist/executor/sdk-handlers/claude/import/task-extractor.d.ts.map +0 -0
  145. package/dist/executor/sdk-handlers/claude/import/task-extractor.js +0 -0
  146. package/dist/executor/sdk-handlers/claude/import/transcript-parser.d.ts +0 -0
  147. package/dist/executor/sdk-handlers/claude/import/transcript-parser.d.ts.map +0 -0
  148. package/dist/executor/sdk-handlers/claude/import/transcript-parser.js +0 -0
  149. package/dist/executor/sdk-handlers/claude/index.d.ts +0 -0
  150. package/dist/executor/sdk-handlers/claude/index.d.ts.map +0 -0
  151. package/dist/executor/sdk-handlers/claude/index.js +0 -0
  152. package/dist/executor/sdk-handlers/claude/message-builder.d.ts +0 -0
  153. package/dist/executor/sdk-handlers/claude/message-builder.d.ts.map +0 -0
  154. package/dist/executor/sdk-handlers/claude/message-builder.js +0 -0
  155. package/dist/executor/sdk-handlers/claude/message-processor.d.ts +0 -0
  156. package/dist/executor/sdk-handlers/claude/message-processor.d.ts.map +0 -0
  157. package/dist/executor/sdk-handlers/claude/message-processor.js +0 -0
  158. package/dist/executor/sdk-handlers/claude/models.d.ts +0 -0
  159. package/dist/executor/sdk-handlers/claude/models.d.ts.map +0 -0
  160. package/dist/executor/sdk-handlers/claude/models.js +0 -0
  161. package/dist/executor/sdk-handlers/claude/normalizer.d.ts +0 -0
  162. package/dist/executor/sdk-handlers/claude/normalizer.d.ts.map +0 -0
  163. package/dist/executor/sdk-handlers/claude/normalizer.js +0 -0
  164. package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.d.ts +0 -0
  165. package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.d.ts.map +0 -0
  166. package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.js +0 -0
  167. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +0 -0
  168. package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +0 -0
  169. package/dist/executor/sdk-handlers/claude/prompt-service.js +0 -0
  170. package/dist/executor/sdk-handlers/claude/query-builder.d.ts +0 -0
  171. package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +0 -0
  172. package/dist/executor/sdk-handlers/claude/query-builder.js +0 -0
  173. package/dist/executor/sdk-handlers/claude/safe-message-service.d.ts +0 -0
  174. package/dist/executor/sdk-handlers/claude/safe-message-service.d.ts.map +0 -0
  175. package/dist/executor/sdk-handlers/claude/safe-message-service.js +0 -0
  176. package/dist/executor/sdk-handlers/claude/session-context.d.ts +0 -0
  177. package/dist/executor/sdk-handlers/claude/session-context.d.ts.map +0 -0
  178. package/dist/executor/sdk-handlers/claude/session-context.js +0 -0
  179. package/dist/executor/sdk-handlers/claude/thinking-detector.d.ts +0 -0
  180. package/dist/executor/sdk-handlers/claude/thinking-detector.d.ts.map +0 -0
  181. package/dist/executor/sdk-handlers/claude/thinking-detector.js +0 -0
  182. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +0 -0
  183. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +0 -0
  184. package/dist/executor/sdk-handlers/codex/codex-tool.js +0 -0
  185. package/dist/executor/sdk-handlers/codex/index.d.ts +0 -0
  186. package/dist/executor/sdk-handlers/codex/index.d.ts.map +0 -0
  187. package/dist/executor/sdk-handlers/codex/index.js +0 -0
  188. package/dist/executor/sdk-handlers/codex/models.d.ts +0 -0
  189. package/dist/executor/sdk-handlers/codex/models.d.ts.map +0 -0
  190. package/dist/executor/sdk-handlers/codex/models.js +0 -0
  191. package/dist/executor/sdk-handlers/codex/normalizer.d.ts +0 -0
  192. package/dist/executor/sdk-handlers/codex/normalizer.d.ts.map +0 -0
  193. package/dist/executor/sdk-handlers/codex/normalizer.js +0 -0
  194. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +0 -0
  195. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +0 -0
  196. package/dist/executor/sdk-handlers/codex/prompt-service.js +0 -0
  197. package/dist/executor/sdk-handlers/codex/usage.d.ts +0 -0
  198. package/dist/executor/sdk-handlers/codex/usage.d.ts.map +0 -0
  199. package/dist/executor/sdk-handlers/codex/usage.js +0 -0
  200. package/dist/executor/sdk-handlers/gemini/conversation-converter.d.ts +0 -0
  201. package/dist/executor/sdk-handlers/gemini/conversation-converter.d.ts.map +0 -0
  202. package/dist/executor/sdk-handlers/gemini/conversation-converter.js +0 -0
  203. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts +0 -0
  204. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts.map +0 -0
  205. package/dist/executor/sdk-handlers/gemini/gemini-tool.js +0 -0
  206. package/dist/executor/sdk-handlers/gemini/index.d.ts +0 -0
  207. package/dist/executor/sdk-handlers/gemini/index.d.ts.map +0 -0
  208. package/dist/executor/sdk-handlers/gemini/index.js +0 -0
  209. package/dist/executor/sdk-handlers/gemini/models.d.ts +0 -0
  210. package/dist/executor/sdk-handlers/gemini/models.d.ts.map +0 -0
  211. package/dist/executor/sdk-handlers/gemini/models.js +0 -0
  212. package/dist/executor/sdk-handlers/gemini/normalizer.d.ts +0 -0
  213. package/dist/executor/sdk-handlers/gemini/normalizer.d.ts.map +0 -0
  214. package/dist/executor/sdk-handlers/gemini/normalizer.js +0 -0
  215. package/dist/executor/sdk-handlers/gemini/permission-mapper.d.ts +0 -0
  216. package/dist/executor/sdk-handlers/gemini/permission-mapper.d.ts.map +0 -0
  217. package/dist/executor/sdk-handlers/gemini/permission-mapper.js +0 -0
  218. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +0 -0
  219. package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +0 -0
  220. package/dist/executor/sdk-handlers/gemini/prompt-service.js +0 -0
  221. package/dist/executor/sdk-handlers/gemini/usage.d.ts +0 -0
  222. package/dist/executor/sdk-handlers/gemini/usage.d.ts.map +0 -0
  223. package/dist/executor/sdk-handlers/gemini/usage.js +0 -0
  224. package/dist/executor/sdk-handlers/models.d.ts +0 -0
  225. package/dist/executor/sdk-handlers/models.d.ts.map +0 -0
  226. package/dist/executor/sdk-handlers/models.js +0 -0
  227. package/dist/executor/sdk-handlers/normalizer-factory.d.ts +0 -0
  228. package/dist/executor/sdk-handlers/normalizer-factory.d.ts.map +0 -0
  229. package/dist/executor/sdk-handlers/normalizer-factory.js +0 -0
  230. package/dist/executor/sdk-handlers/opencode/index.d.ts +0 -0
  231. package/dist/executor/sdk-handlers/opencode/index.d.ts.map +0 -0
  232. package/dist/executor/sdk-handlers/opencode/index.js +0 -0
  233. package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts +0 -0
  234. package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts.map +0 -0
  235. package/dist/executor/sdk-handlers/opencode/opencode-tool.js +0 -0
  236. package/dist/executor/services/feathers-client.d.ts +0 -0
  237. package/dist/executor/services/feathers-client.d.ts.map +0 -0
  238. package/dist/executor/services/feathers-client.js +0 -0
  239. package/dist/executor/types/sdk-response.d.ts +0 -0
  240. package/dist/executor/types/sdk-response.d.ts.map +0 -0
  241. package/dist/executor/types/sdk-response.js +0 -0
  242. package/dist/executor/types/token-usage.d.ts +0 -0
  243. package/dist/executor/types/token-usage.d.ts.map +0 -0
  244. package/dist/executor/types/token-usage.js +0 -0
  245. package/dist/executor/types.d.ts +0 -0
  246. package/dist/executor/types.d.ts.map +0 -0
  247. package/dist/executor/types.js +0 -0
  248. package/dist/ui/assets/{_basePickBy-a0JoJgXO.js → _basePickBy-DM-YlwQP.js} +1 -1
  249. package/dist/ui/assets/_basePickBy-DM-YlwQP.js.gz +0 -0
  250. package/dist/ui/assets/{_baseUniq-IFulW561.js → _baseUniq-w9wJK0j5.js} +1 -1
  251. package/dist/ui/assets/_baseUniq-w9wJK0j5.js.gz +0 -0
  252. package/dist/ui/assets/{arc-Dj6SyPh6.js → arc-CVXkw1SJ.js} +1 -1
  253. package/dist/ui/assets/arc-CVXkw1SJ.js.gz +0 -0
  254. package/dist/ui/assets/{architectureDiagram-VXUJARFQ-CjXOzrje.js → architectureDiagram-VXUJARFQ-CevjfWlW.js} +1 -1
  255. package/dist/ui/assets/{architectureDiagram-VXUJARFQ-CjXOzrje.js.gz → architectureDiagram-VXUJARFQ-CevjfWlW.js.gz} +0 -0
  256. package/dist/ui/assets/{blockDiagram-VD42YOAC-IFpdwkfg.js → blockDiagram-VD42YOAC-b9JU-Vzx.js} +1 -1
  257. package/dist/ui/assets/{blockDiagram-VD42YOAC-IFpdwkfg.js.gz → blockDiagram-VD42YOAC-b9JU-Vzx.js.gz} +0 -0
  258. package/dist/ui/assets/{c4Diagram-YG6GDRKO-qL4Ujfnz.js → c4Diagram-YG6GDRKO-j7VSccDF.js} +1 -1
  259. package/dist/ui/assets/c4Diagram-YG6GDRKO-j7VSccDF.js.gz +0 -0
  260. package/dist/ui/assets/channel-BNIBtjaQ.js +1 -0
  261. package/dist/ui/assets/{chunk-4BX2VUAB-CH6tu0mB.js → chunk-4BX2VUAB-D_codqcR.js} +1 -1
  262. package/dist/ui/assets/{chunk-55IACEB6-DDAZjWTD.js → chunk-55IACEB6-nQq1kviw.js} +1 -1
  263. package/dist/ui/assets/{chunk-B4BG7PRW-BDSu72O0.js → chunk-B4BG7PRW-DlVxaJL9.js} +1 -1
  264. package/dist/ui/assets/chunk-B4BG7PRW-DlVxaJL9.js.gz +0 -0
  265. package/dist/ui/assets/{chunk-DI55MBZ5-C7merGRo.js → chunk-DI55MBZ5-Dw95m49m.js} +1 -1
  266. package/dist/ui/assets/chunk-DI55MBZ5-Dw95m49m.js.gz +0 -0
  267. package/dist/ui/assets/{chunk-FMBD7UC4-DX20G6ZX.js → chunk-FMBD7UC4-Bnk79OV8.js} +1 -1
  268. package/dist/ui/assets/{chunk-QN33PNHL-BvT3a5aI.js → chunk-QN33PNHL-sqjI-sXo.js} +1 -1
  269. package/dist/ui/assets/{chunk-QZHKN3VN-oo-Lxdo7.js → chunk-QZHKN3VN-T7CEGHh9.js} +1 -1
  270. package/dist/ui/assets/{chunk-TZMSLE5B-BV4XHxKb.js → chunk-TZMSLE5B-ok9YQuUI.js} +1 -1
  271. package/dist/ui/assets/chunk-TZMSLE5B-ok9YQuUI.js.gz +0 -0
  272. package/dist/ui/assets/classDiagram-2ON5EDUG-DeHTLUto.js +1 -0
  273. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-DeHTLUto.js +1 -0
  274. package/dist/ui/assets/clone-BObtDhw7.js +1 -0
  275. package/dist/ui/assets/{cose-bilkent-S5V4N54A-BA6VY55u.js → cose-bilkent-S5V4N54A-BtanJFqC.js} +1 -1
  276. package/dist/ui/assets/cose-bilkent-S5V4N54A-BtanJFqC.js.gz +0 -0
  277. package/dist/ui/assets/{dagre-6UL2VRFP-DiuqdLez.js → dagre-6UL2VRFP-CIJlfoaz.js} +1 -1
  278. package/dist/ui/assets/dagre-6UL2VRFP-CIJlfoaz.js.gz +0 -0
  279. package/dist/ui/assets/{diagram-PSM6KHXK-DU4u6xZN.js → diagram-PSM6KHXK-DhKlHuZN.js} +1 -1
  280. package/dist/ui/assets/diagram-PSM6KHXK-DhKlHuZN.js.gz +0 -0
  281. package/dist/ui/assets/{diagram-QEK2KX5R-CltgMeel.js → diagram-QEK2KX5R-BbwaTbd7.js} +1 -1
  282. package/dist/ui/assets/diagram-QEK2KX5R-BbwaTbd7.js.gz +0 -0
  283. package/dist/ui/assets/{diagram-S2PKOQOG-SkvAVcTN.js → diagram-S2PKOQOG-Dx1rRlHZ.js} +1 -1
  284. package/dist/ui/assets/diagram-S2PKOQOG-Dx1rRlHZ.js.gz +0 -0
  285. package/dist/ui/assets/{erDiagram-Q2GNP2WA-DJTHxEdE.js → erDiagram-Q2GNP2WA-w60Up3Mg.js} +1 -1
  286. package/dist/ui/assets/erDiagram-Q2GNP2WA-w60Up3Mg.js.gz +0 -0
  287. package/dist/ui/assets/{flowDiagram-NV44I4VS-BwrFtsSc.js → flowDiagram-NV44I4VS-yvyTqNEi.js} +1 -1
  288. package/dist/ui/assets/flowDiagram-NV44I4VS-yvyTqNEi.js.gz +0 -0
  289. package/dist/ui/assets/{ganttDiagram-LVOFAZNH-BnGmdiBB.js → ganttDiagram-LVOFAZNH-NBBWMpCB.js} +1 -1
  290. package/dist/ui/assets/ganttDiagram-LVOFAZNH-NBBWMpCB.js.gz +0 -0
  291. package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-V6mHZ2jy.js → gitGraphDiagram-NY62KEGX-Dc0qrZJi.js} +1 -1
  292. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-Dc0qrZJi.js.gz +0 -0
  293. package/dist/ui/assets/{graph-3Ks94Pqc.js → graph-RIZM2qth.js} +1 -1
  294. package/dist/ui/assets/graph-RIZM2qth.js.gz +0 -0
  295. package/dist/ui/assets/{index-Dl_jng3-.js → index-BcHc8U_m.js} +240 -240
  296. package/dist/ui/assets/index-BcHc8U_m.js.gz +0 -0
  297. package/dist/ui/assets/index-BjxbtAmt.css +1 -0
  298. package/dist/ui/assets/index-BjxbtAmt.css.gz +0 -0
  299. package/dist/ui/assets/{infoDiagram-ER5ION4S-DUuNVOek.js → infoDiagram-ER5ION4S-Co1qQ3-G.js} +1 -1
  300. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-D-N__rLx.js → journeyDiagram-XKPGCS4Q-QaBi_wAx.js} +1 -1
  301. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-QaBi_wAx.js.gz +0 -0
  302. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-DsPDRbRp.js → kanban-definition-3W4ZIXB7-B3k5rpP3.js} +1 -1
  303. package/dist/ui/assets/kanban-definition-3W4ZIXB7-B3k5rpP3.js.gz +0 -0
  304. package/dist/ui/assets/{layout-TuyQIiWI.js → layout-YqNNovOM.js} +1 -1
  305. package/dist/ui/assets/layout-YqNNovOM.js.gz +0 -0
  306. package/dist/ui/assets/{linear-CQUCx9aD.js → linear-DpjTIW7z.js} +1 -1
  307. package/dist/ui/assets/linear-DpjTIW7z.js.gz +0 -0
  308. package/dist/ui/assets/{mermaid.core-HQwFIIbn.js → mermaid.core-D-fYaKXC.js} +5 -5
  309. package/dist/ui/assets/mermaid.core-D-fYaKXC.js.gz +0 -0
  310. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-DlR4HpYx.js → mindmap-definition-VGOIOE7T-CddQalgD.js} +1 -1
  311. package/dist/ui/assets/mindmap-definition-VGOIOE7T-CddQalgD.js.gz +0 -0
  312. package/dist/ui/assets/{pieDiagram-ADFJNKIX-OfCYTJ7S.js → pieDiagram-ADFJNKIX-BCPzhaBq.js} +1 -1
  313. package/dist/ui/assets/pieDiagram-ADFJNKIX-BCPzhaBq.js.gz +0 -0
  314. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B--irB7LvR.js → quadrantDiagram-AYHSOK5B-DrdJW-2E.js} +1 -1
  315. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DrdJW-2E.js.gz +0 -0
  316. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-iPensRLV.js → requirementDiagram-UZGBJVZJ-dV0cdx6D.js} +1 -1
  317. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-dV0cdx6D.js.gz +0 -0
  318. package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-BSidESLx.js → sankeyDiagram-TZEHDZUN-SLmqiy7a.js} +1 -1
  319. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-SLmqiy7a.js.gz +0 -0
  320. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-BUE46svP.js → sequenceDiagram-WL72ISMW-CyH5EbRm.js} +1 -1
  321. package/dist/ui/assets/sequenceDiagram-WL72ISMW-CyH5EbRm.js.gz +0 -0
  322. package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BJ2azfLs.js → stateDiagram-FKZM4ZOC-DbtBIYM6.js} +1 -1
  323. package/dist/ui/assets/stateDiagram-FKZM4ZOC-DbtBIYM6.js.gz +0 -0
  324. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DOAHUeXQ.js +1 -0
  325. package/dist/ui/assets/{timeline-definition-IT6M3QCI-YfwKc8ip.js → timeline-definition-IT6M3QCI-CzdpjKni.js} +1 -1
  326. package/dist/ui/assets/timeline-definition-IT6M3QCI-CzdpjKni.js.gz +0 -0
  327. package/dist/ui/assets/{treemap-KMMF4GRG-DMpxEEn1.js → treemap-KMMF4GRG-D_MXp3HZ.js} +1 -1
  328. package/dist/ui/assets/treemap-KMMF4GRG-D_MXp3HZ.js.gz +0 -0
  329. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-Bn_I2TeN.js → xychartDiagram-PRI3JC2R-BMwyKz4M.js} +1 -1
  330. package/dist/ui/assets/xychartDiagram-PRI3JC2R-BMwyKz4M.js.gz +0 -0
  331. package/dist/ui/index.html +2 -2
  332. package/package.json +1 -1
  333. package/dist/ui/assets/_basePickBy-a0JoJgXO.js.gz +0 -0
  334. package/dist/ui/assets/_baseUniq-IFulW561.js.gz +0 -0
  335. package/dist/ui/assets/arc-Dj6SyPh6.js.gz +0 -0
  336. package/dist/ui/assets/c4Diagram-YG6GDRKO-qL4Ujfnz.js.gz +0 -0
  337. package/dist/ui/assets/channel-4SJF66Rh.js +0 -1
  338. package/dist/ui/assets/chunk-B4BG7PRW-BDSu72O0.js.gz +0 -0
  339. package/dist/ui/assets/chunk-DI55MBZ5-C7merGRo.js.gz +0 -0
  340. package/dist/ui/assets/chunk-TZMSLE5B-BV4XHxKb.js.gz +0 -0
  341. package/dist/ui/assets/classDiagram-2ON5EDUG-BLjqJ_M9.js +0 -1
  342. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BLjqJ_M9.js +0 -1
  343. package/dist/ui/assets/clone-DjR0SEZ0.js +0 -1
  344. package/dist/ui/assets/cose-bilkent-S5V4N54A-BA6VY55u.js.gz +0 -0
  345. package/dist/ui/assets/dagre-6UL2VRFP-DiuqdLez.js.gz +0 -0
  346. package/dist/ui/assets/diagram-PSM6KHXK-DU4u6xZN.js.gz +0 -0
  347. package/dist/ui/assets/diagram-QEK2KX5R-CltgMeel.js.gz +0 -0
  348. package/dist/ui/assets/diagram-S2PKOQOG-SkvAVcTN.js.gz +0 -0
  349. package/dist/ui/assets/erDiagram-Q2GNP2WA-DJTHxEdE.js.gz +0 -0
  350. package/dist/ui/assets/flowDiagram-NV44I4VS-BwrFtsSc.js.gz +0 -0
  351. package/dist/ui/assets/ganttDiagram-LVOFAZNH-BnGmdiBB.js.gz +0 -0
  352. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-V6mHZ2jy.js.gz +0 -0
  353. package/dist/ui/assets/graph-3Ks94Pqc.js.gz +0 -0
  354. package/dist/ui/assets/index-CoHRmHKF.css +0 -1
  355. package/dist/ui/assets/index-CoHRmHKF.css.gz +0 -0
  356. package/dist/ui/assets/index-Dl_jng3-.js.gz +0 -0
  357. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-D-N__rLx.js.gz +0 -0
  358. package/dist/ui/assets/kanban-definition-3W4ZIXB7-DsPDRbRp.js.gz +0 -0
  359. package/dist/ui/assets/layout-TuyQIiWI.js.gz +0 -0
  360. package/dist/ui/assets/linear-CQUCx9aD.js.gz +0 -0
  361. package/dist/ui/assets/mermaid.core-HQwFIIbn.js.gz +0 -0
  362. package/dist/ui/assets/mindmap-definition-VGOIOE7T-DlR4HpYx.js.gz +0 -0
  363. package/dist/ui/assets/pieDiagram-ADFJNKIX-OfCYTJ7S.js.gz +0 -0
  364. package/dist/ui/assets/quadrantDiagram-AYHSOK5B--irB7LvR.js.gz +0 -0
  365. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-iPensRLV.js.gz +0 -0
  366. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-BSidESLx.js.gz +0 -0
  367. package/dist/ui/assets/sequenceDiagram-WL72ISMW-BUE46svP.js.gz +0 -0
  368. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BJ2azfLs.js.gz +0 -0
  369. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-B9Lx1w-S.js +0 -1
  370. package/dist/ui/assets/timeline-definition-IT6M3QCI-YfwKc8ip.js.gz +0 -0
  371. package/dist/ui/assets/treemap-KMMF4GRG-DMpxEEn1.js.gz +0 -0
  372. package/dist/ui/assets/xychartDiagram-PRI3JC2R-Bn_I2TeN.js.gz +0 -0
@@ -58,11 +58,13 @@ __export(schema_postgres_exports, {
58
58
  repos: () => repos,
59
59
  sessionMcpServers: () => sessionMcpServers,
60
60
  sessions: () => sessions,
61
+ sessionsRelations: () => sessionsRelations,
61
62
  tasks: () => tasks,
62
63
  threadSessionMap: () => threadSessionMap,
63
64
  users: () => users,
64
65
  worktreeOwners: () => worktreeOwners,
65
- worktrees: () => worktrees
66
+ worktrees: () => worktrees,
67
+ worktreesRelations: () => worktreesRelations
66
68
  });
67
69
  var import_drizzle_orm2 = require("drizzle-orm");
68
70
  var import_pg_core = require("drizzle-orm/pg-core");
@@ -548,6 +550,15 @@ var threadSessionMap = (0, import_pg_core.pgTable)(
548
550
  channelStatusIdx: (0, import_pg_core.index)("idx_thread_map_channel_status").on(table.channel_id, table.status)
549
551
  })
550
552
  );
553
+ var sessionsRelations = (0, import_drizzle_orm2.relations)(sessions, ({ one }) => ({
554
+ worktree: one(worktrees, {
555
+ fields: [sessions.worktree_id],
556
+ references: [worktrees.worktree_id]
557
+ })
558
+ }));
559
+ var worktreesRelations = (0, import_drizzle_orm2.relations)(worktrees, ({ many }) => ({
560
+ sessions: many(sessions)
561
+ }));
551
562
 
552
563
  // src/db/schema.sqlite.ts
553
564
  var schema_sqlite_exports = {};
@@ -561,11 +572,13 @@ __export(schema_sqlite_exports, {
561
572
  repos: () => repos2,
562
573
  sessionMcpServers: () => sessionMcpServers2,
563
574
  sessions: () => sessions2,
575
+ sessionsRelations: () => sessionsRelations2,
564
576
  tasks: () => tasks2,
565
577
  threadSessionMap: () => threadSessionMap2,
566
578
  users: () => users2,
567
579
  worktreeOwners: () => worktreeOwners2,
568
- worktrees: () => worktrees2
580
+ worktrees: () => worktrees2,
581
+ worktreesRelations: () => worktreesRelations2
569
582
  });
570
583
  var import_drizzle_orm3 = require("drizzle-orm");
571
584
  var import_sqlite_core = require("drizzle-orm/sqlite-core");
@@ -1052,6 +1065,15 @@ var threadSessionMap2 = (0, import_sqlite_core.sqliteTable)(
1052
1065
  channelStatusIdx: (0, import_sqlite_core.index)("idx_thread_map_channel_status").on(table.channel_id, table.status)
1053
1066
  })
1054
1067
  );
1068
+ var sessionsRelations2 = (0, import_drizzle_orm3.relations)(sessions2, ({ one }) => ({
1069
+ worktree: one(worktrees2, {
1070
+ fields: [sessions2.worktree_id],
1071
+ references: [worktrees2.worktree_id]
1072
+ })
1073
+ }));
1074
+ var worktreesRelations2 = (0, import_drizzle_orm3.relations)(worktrees2, ({ many }) => ({
1075
+ sessions: many(sessions2)
1076
+ }));
1055
1077
 
1056
1078
  // src/db/schema-factory.ts
1057
1079
  function detectDialectFromUrl(url) {
@@ -25,13 +25,15 @@ __export(schema_postgres_exports, {
25
25
  repos: () => repos,
26
26
  sessionMcpServers: () => sessionMcpServers,
27
27
  sessions: () => sessions,
28
+ sessionsRelations: () => sessionsRelations,
28
29
  tasks: () => tasks,
29
30
  threadSessionMap: () => threadSessionMap,
30
31
  users: () => users,
31
32
  worktreeOwners: () => worktreeOwners,
32
- worktrees: () => worktrees
33
+ worktrees: () => worktrees,
34
+ worktreesRelations: () => worktreesRelations
33
35
  });
34
- import { sql as sql2 } from "drizzle-orm";
36
+ import { relations, sql as sql2 } from "drizzle-orm";
35
37
  import {
36
38
  bigint,
37
39
  boolean,
@@ -527,6 +529,15 @@ var threadSessionMap = pgTable(
527
529
  channelStatusIdx: index("idx_thread_map_channel_status").on(table.channel_id, table.status)
528
530
  })
529
531
  );
532
+ var sessionsRelations = relations(sessions, ({ one }) => ({
533
+ worktree: one(worktrees, {
534
+ fields: [sessions.worktree_id],
535
+ references: [worktrees.worktree_id]
536
+ })
537
+ }));
538
+ var worktreesRelations = relations(worktrees, ({ many }) => ({
539
+ sessions: many(sessions)
540
+ }));
530
541
 
531
542
  // src/db/schema.sqlite.ts
532
543
  var schema_sqlite_exports = {};
@@ -540,13 +551,15 @@ __export(schema_sqlite_exports, {
540
551
  repos: () => repos2,
541
552
  sessionMcpServers: () => sessionMcpServers2,
542
553
  sessions: () => sessions2,
554
+ sessionsRelations: () => sessionsRelations2,
543
555
  tasks: () => tasks2,
544
556
  threadSessionMap: () => threadSessionMap2,
545
557
  users: () => users2,
546
558
  worktreeOwners: () => worktreeOwners2,
547
- worktrees: () => worktrees2
559
+ worktrees: () => worktrees2,
560
+ worktreesRelations: () => worktreesRelations2
548
561
  });
549
- import { sql as sql3 } from "drizzle-orm";
562
+ import { relations as relations2, sql as sql3 } from "drizzle-orm";
550
563
  import {
551
564
  index as index2,
552
565
  integer as integer2,
@@ -1038,6 +1051,15 @@ var threadSessionMap2 = sqliteTable(
1038
1051
  channelStatusIdx: index2("idx_thread_map_channel_status").on(table.channel_id, table.status)
1039
1052
  })
1040
1053
  );
1054
+ var sessionsRelations2 = relations2(sessions2, ({ one }) => ({
1055
+ worktree: one(worktrees2, {
1056
+ fields: [sessions2.worktree_id],
1057
+ references: [worktrees2.worktree_id]
1058
+ })
1059
+ }));
1060
+ var worktreesRelations2 = relations2(worktrees2, ({ many }) => ({
1061
+ sessions: many(sessions2)
1062
+ }));
1041
1063
 
1042
1064
  // src/db/schema-factory.ts
1043
1065
  function detectDialectFromUrl(url) {
@@ -62,6 +62,7 @@ __export(config_manager_exports, {
62
62
  ensureCodexHome: () => ensureCodexHome,
63
63
  expandHomePath: () => expandHomePath,
64
64
  getAgorHome: () => getAgorHome,
65
+ getBaseUrl: () => getBaseUrl,
65
66
  getConfigPath: () => getConfigPath,
66
67
  getConfigValue: () => getConfigValue,
67
68
  getCredential: () => getCredential,
@@ -279,6 +280,32 @@ async function getDaemonUrl() {
279
280
  const host = config.daemon?.host || defaults.daemon?.host || DAEMON.DEFAULT_HOST;
280
281
  return `http://${host}:${port}`;
281
282
  }
283
+ function validateBaseUrl(url) {
284
+ const trimmed = url.trim().replace(/\/$/, "");
285
+ if (!trimmed.startsWith("http://") && !trimmed.startsWith("https://")) {
286
+ throw new Error(`Invalid base URL: "${url}". Must start with http:// or https://`);
287
+ }
288
+ try {
289
+ new URL(trimmed);
290
+ } catch {
291
+ throw new Error(`Invalid base URL format: "${url}". Must be a valid HTTP(S) URL.`);
292
+ }
293
+ return trimmed;
294
+ }
295
+ async function getBaseUrl() {
296
+ if (process.env.AGOR_BASE_URL) {
297
+ return validateBaseUrl(process.env.AGOR_BASE_URL);
298
+ }
299
+ const config = await loadConfig();
300
+ if (config.daemon?.base_url) {
301
+ return validateBaseUrl(config.daemon.base_url);
302
+ }
303
+ const defaults = getDefaultConfig();
304
+ const envPort = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : void 0;
305
+ const port = envPort || config.daemon?.port || defaults.daemon?.port || DAEMON.DEFAULT_PORT;
306
+ const host = config.daemon?.host || defaults.daemon?.host || DAEMON.DEFAULT_HOST;
307
+ return `http://${host}:${port}`;
308
+ }
282
309
  function loadConfigSync() {
283
310
  const configPath = getConfigPath();
284
311
  try {
@@ -627,13 +654,15 @@ __export(schema_postgres_exports, {
627
654
  repos: () => repos,
628
655
  sessionMcpServers: () => sessionMcpServers,
629
656
  sessions: () => sessions,
657
+ sessionsRelations: () => sessionsRelations,
630
658
  tasks: () => tasks,
631
659
  threadSessionMap: () => threadSessionMap,
632
660
  users: () => users,
633
661
  worktreeOwners: () => worktreeOwners,
634
- worktrees: () => worktrees
662
+ worktrees: () => worktrees,
663
+ worktreesRelations: () => worktreesRelations
635
664
  });
636
- var import_drizzle_orm2, import_pg_core, t, sessions, tasks, messages, boards, repos, worktrees, worktreeOwners, users, mcpServers, boardObjects, sessionMcpServers, boardComments, gatewayChannels, threadSessionMap;
665
+ var import_drizzle_orm2, import_pg_core, t, sessions, tasks, messages, boards, repos, worktrees, worktreeOwners, users, mcpServers, boardObjects, sessionMcpServers, boardComments, gatewayChannels, threadSessionMap, sessionsRelations, worktreesRelations;
637
666
  var init_schema_postgres = __esm({
638
667
  "src/db/schema.postgres.ts"() {
639
668
  "use strict";
@@ -1122,6 +1151,15 @@ var init_schema_postgres = __esm({
1122
1151
  channelStatusIdx: (0, import_pg_core.index)("idx_thread_map_channel_status").on(table.channel_id, table.status)
1123
1152
  })
1124
1153
  );
1154
+ sessionsRelations = (0, import_drizzle_orm2.relations)(sessions, ({ one }) => ({
1155
+ worktree: one(worktrees, {
1156
+ fields: [sessions.worktree_id],
1157
+ references: [worktrees.worktree_id]
1158
+ })
1159
+ }));
1160
+ worktreesRelations = (0, import_drizzle_orm2.relations)(worktrees, ({ many }) => ({
1161
+ sessions: many(sessions)
1162
+ }));
1125
1163
  }
1126
1164
  });
1127
1165
 
@@ -1137,13 +1175,15 @@ __export(schema_sqlite_exports, {
1137
1175
  repos: () => repos2,
1138
1176
  sessionMcpServers: () => sessionMcpServers2,
1139
1177
  sessions: () => sessions2,
1178
+ sessionsRelations: () => sessionsRelations2,
1140
1179
  tasks: () => tasks2,
1141
1180
  threadSessionMap: () => threadSessionMap2,
1142
1181
  users: () => users2,
1143
1182
  worktreeOwners: () => worktreeOwners2,
1144
- worktrees: () => worktrees2
1183
+ worktrees: () => worktrees2,
1184
+ worktreesRelations: () => worktreesRelations2
1145
1185
  });
1146
- var import_drizzle_orm3, import_sqlite_core, t2, sessions2, tasks2, messages2, boards2, repos2, worktrees2, worktreeOwners2, users2, mcpServers2, boardObjects2, sessionMcpServers2, boardComments2, gatewayChannels2, threadSessionMap2;
1186
+ var import_drizzle_orm3, import_sqlite_core, t2, sessions2, tasks2, messages2, boards2, repos2, worktrees2, worktreeOwners2, users2, mcpServers2, boardObjects2, sessionMcpServers2, boardComments2, gatewayChannels2, threadSessionMap2, sessionsRelations2, worktreesRelations2;
1147
1187
  var init_schema_sqlite = __esm({
1148
1188
  "src/db/schema.sqlite.ts"() {
1149
1189
  "use strict";
@@ -1633,6 +1673,15 @@ var init_schema_sqlite = __esm({
1633
1673
  channelStatusIdx: (0, import_sqlite_core.index)("idx_thread_map_channel_status").on(table.channel_id, table.status)
1634
1674
  })
1635
1675
  );
1676
+ sessionsRelations2 = (0, import_drizzle_orm3.relations)(sessions2, ({ one }) => ({
1677
+ worktree: one(worktrees2, {
1678
+ fields: [sessions2.worktree_id],
1679
+ references: [worktrees2.worktree_id]
1680
+ })
1681
+ }));
1682
+ worktreesRelations2 = (0, import_drizzle_orm3.relations)(worktrees2, ({ many }) => ({
1683
+ sessions: many(sessions2)
1684
+ }));
1636
1685
  }
1637
1686
  });
1638
1687
 
@@ -2128,6 +2177,7 @@ var BoardObjectRepository = class {
2128
2177
  init_cjs_shims();
2129
2178
  var import_drizzle_orm6 = require("drizzle-orm");
2130
2179
  var yaml2 = __toESM(require("js-yaml"), 1);
2180
+ init_config_manager();
2131
2181
  init_ids();
2132
2182
 
2133
2183
  // src/lib/slugs.ts
@@ -2136,6 +2186,14 @@ function generateSlug(name) {
2136
2186
  return name.toLowerCase().trim().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 64);
2137
2187
  }
2138
2188
 
2189
+ // src/utils/url.ts
2190
+ init_cjs_shims();
2191
+ init_ids();
2192
+ function getBoardUrl(boardId, boardSlug, baseUrl) {
2193
+ const boardParam = boardSlug || shortId(boardId);
2194
+ return `${baseUrl}/b/${boardParam}`;
2195
+ }
2196
+
2139
2197
  // src/db/repositories/boards.ts
2140
2198
  init_database_wrapper();
2141
2199
  init_schema();
@@ -2145,16 +2203,23 @@ var BoardRepository = class {
2145
2203
  }
2146
2204
  /**
2147
2205
  * Convert database row to Board type
2206
+ *
2207
+ * @param row - Database row
2208
+ * @param baseUrl - Base URL for generating board URLs
2148
2209
  */
2149
- rowToBoard(row) {
2210
+ rowToBoard(row, baseUrl) {
2150
2211
  const data = row.data;
2212
+ const boardId = row.board_id;
2213
+ const slug = row.slug !== null ? row.slug : void 0;
2214
+ const url = baseUrl ? getBoardUrl(boardId, slug, baseUrl) : "";
2151
2215
  return {
2152
- board_id: row.board_id,
2216
+ board_id: boardId,
2153
2217
  name: row.name,
2154
- slug: row.slug !== null ? row.slug : void 0,
2218
+ slug,
2155
2219
  created_at: new Date(row.created_at).toISOString(),
2156
2220
  last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
2157
2221
  created_by: row.created_by,
2222
+ url,
2158
2223
  ...data
2159
2224
  };
2160
2225
  }
@@ -2234,6 +2299,7 @@ var BoardRepository = class {
2234
2299
  async create(data) {
2235
2300
  try {
2236
2301
  const boardId = data.board_id ?? generateId();
2302
+ const baseUrl = await getBaseUrl();
2237
2303
  let finalSlug;
2238
2304
  if (data.slug === null) {
2239
2305
  finalSlug = void 0;
@@ -2256,7 +2322,7 @@ var BoardRepository = class {
2256
2322
  if (!row) {
2257
2323
  throw new RepositoryError("Failed to retrieve created board");
2258
2324
  }
2259
- return this.rowToBoard(row);
2325
+ return this.rowToBoard(row, baseUrl);
2260
2326
  } catch (error) {
2261
2327
  if (error instanceof RepositoryError) throw error;
2262
2328
  throw new RepositoryError(
@@ -2271,8 +2337,9 @@ var BoardRepository = class {
2271
2337
  async findById(id) {
2272
2338
  try {
2273
2339
  const fullId = await this.resolveId(id);
2340
+ const baseUrl = await getBaseUrl();
2274
2341
  const row = await select(this.db).from(boards3).where((0, import_drizzle_orm6.eq)(boards3.board_id, fullId)).one();
2275
- return row ? this.rowToBoard(row) : null;
2342
+ return row ? this.rowToBoard(row, baseUrl) : null;
2276
2343
  } catch (error) {
2277
2344
  if (error instanceof EntityNotFoundError) return null;
2278
2345
  if (error instanceof AmbiguousIdError) throw error;
@@ -2287,8 +2354,9 @@ var BoardRepository = class {
2287
2354
  */
2288
2355
  async findBySlug(slug) {
2289
2356
  try {
2357
+ const baseUrl = await getBaseUrl();
2290
2358
  const row = await select(this.db).from(boards3).where((0, import_drizzle_orm6.eq)(boards3.slug, slug)).one();
2291
- return row ? this.rowToBoard(row) : null;
2359
+ return row ? this.rowToBoard(row, baseUrl) : null;
2292
2360
  } catch (error) {
2293
2361
  throw new RepositoryError(
2294
2362
  `Failed to find board by slug: ${error instanceof Error ? error.message : String(error)}`,
@@ -2313,8 +2381,9 @@ var BoardRepository = class {
2313
2381
  */
2314
2382
  async findAll() {
2315
2383
  try {
2384
+ const baseUrl = await getBaseUrl();
2316
2385
  const rows = await select(this.db).from(boards3).all();
2317
- return rows.map((row) => this.rowToBoard(row));
2386
+ return rows.map((row) => this.rowToBoard(row, baseUrl));
2318
2387
  } catch (error) {
2319
2388
  throw new RepositoryError(
2320
2389
  `Failed to find all boards: ${error instanceof Error ? error.message : String(error)}`,
@@ -3072,6 +3141,7 @@ init_cjs_shims();
3072
3141
 
3073
3142
  // src/db/repositories/sessions.ts
3074
3143
  var import_drizzle_orm11 = require("drizzle-orm");
3144
+ init_config_manager();
3075
3145
  init_ids();
3076
3146
  init_database_wrapper();
3077
3147
  init_schema();
@@ -3864,7 +3934,7 @@ var WorktreeRepository = class {
3864
3934
  fullText = messageData.content.filter((block) => block.type === "text" && block.text).map((block) => block.text).join("\n");
3865
3935
  }
3866
3936
  if (fullText.length > truncationLength) {
3867
- fullText = fullText.substring(0, truncationLength) + "...";
3937
+ fullText = `${fullText.substring(0, truncationLength)}...`;
3868
3938
  }
3869
3939
  lastMessageBySession.set(sessionId, fullText);
3870
3940
  }
@@ -3875,7 +3945,7 @@ var WorktreeRepository = class {
3875
3945
  const sessionId = row.session_id;
3876
3946
  let lastMessage = lastMessageBySession.get(sessionId) || "";
3877
3947
  if (lastMessage.length > truncationLength) {
3878
- lastMessage = lastMessage.substring(0, truncationLength) + "...truncated";
3948
+ lastMessage = `${lastMessage.substring(0, truncationLength)}...truncated`;
3879
3949
  }
3880
3950
  const sessionData = row.data;
3881
3951
  const messageCount = sessionData?.message_count ?? 0;
@@ -42,6 +42,7 @@ __export(config_manager_exports, {
42
42
  ensureCodexHome: () => ensureCodexHome,
43
43
  expandHomePath: () => expandHomePath,
44
44
  getAgorHome: () => getAgorHome,
45
+ getBaseUrl: () => getBaseUrl,
45
46
  getConfigPath: () => getConfigPath,
46
47
  getConfigValue: () => getConfigValue,
47
48
  getCredential: () => getCredential,
@@ -264,6 +265,32 @@ async function getDaemonUrl() {
264
265
  const host = config.daemon?.host || defaults.daemon?.host || DAEMON.DEFAULT_HOST;
265
266
  return `http://${host}:${port}`;
266
267
  }
268
+ function validateBaseUrl(url) {
269
+ const trimmed = url.trim().replace(/\/$/, "");
270
+ if (!trimmed.startsWith("http://") && !trimmed.startsWith("https://")) {
271
+ throw new Error(`Invalid base URL: "${url}". Must start with http:// or https://`);
272
+ }
273
+ try {
274
+ new URL(trimmed);
275
+ } catch {
276
+ throw new Error(`Invalid base URL format: "${url}". Must be a valid HTTP(S) URL.`);
277
+ }
278
+ return trimmed;
279
+ }
280
+ async function getBaseUrl() {
281
+ if (process.env.AGOR_BASE_URL) {
282
+ return validateBaseUrl(process.env.AGOR_BASE_URL);
283
+ }
284
+ const config = await loadConfig();
285
+ if (config.daemon?.base_url) {
286
+ return validateBaseUrl(config.daemon.base_url);
287
+ }
288
+ const defaults = getDefaultConfig();
289
+ const envPort = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : void 0;
290
+ const port = envPort || config.daemon?.port || defaults.daemon?.port || DAEMON.DEFAULT_PORT;
291
+ const host = config.daemon?.host || defaults.daemon?.host || DAEMON.DEFAULT_HOST;
292
+ return `http://${host}:${port}`;
293
+ }
267
294
  function loadConfigSync() {
268
295
  const configPath = getConfigPath();
269
296
  try {
@@ -604,13 +631,15 @@ __export(schema_postgres_exports, {
604
631
  repos: () => repos,
605
632
  sessionMcpServers: () => sessionMcpServers,
606
633
  sessions: () => sessions,
634
+ sessionsRelations: () => sessionsRelations,
607
635
  tasks: () => tasks,
608
636
  threadSessionMap: () => threadSessionMap,
609
637
  users: () => users,
610
638
  worktreeOwners: () => worktreeOwners,
611
- worktrees: () => worktrees
639
+ worktrees: () => worktrees,
640
+ worktreesRelations: () => worktreesRelations
612
641
  });
613
- import { sql as sql2 } from "drizzle-orm";
642
+ import { relations, sql as sql2 } from "drizzle-orm";
614
643
  import {
615
644
  bigint,
616
645
  boolean,
@@ -624,7 +653,7 @@ import {
624
653
  uniqueIndex,
625
654
  varchar
626
655
  } from "drizzle-orm/pg-core";
627
- var t, sessions, tasks, messages, boards, repos, worktrees, worktreeOwners, users, mcpServers, boardObjects, sessionMcpServers, boardComments, gatewayChannels, threadSessionMap;
656
+ var t, sessions, tasks, messages, boards, repos, worktrees, worktreeOwners, users, mcpServers, boardObjects, sessionMcpServers, boardComments, gatewayChannels, threadSessionMap, sessionsRelations, worktreesRelations;
628
657
  var init_schema_postgres = __esm({
629
658
  "src/db/schema.postgres.ts"() {
630
659
  "use strict";
@@ -1111,6 +1140,15 @@ var init_schema_postgres = __esm({
1111
1140
  channelStatusIdx: index("idx_thread_map_channel_status").on(table.channel_id, table.status)
1112
1141
  })
1113
1142
  );
1143
+ sessionsRelations = relations(sessions, ({ one }) => ({
1144
+ worktree: one(worktrees, {
1145
+ fields: [sessions.worktree_id],
1146
+ references: [worktrees.worktree_id]
1147
+ })
1148
+ }));
1149
+ worktreesRelations = relations(worktrees, ({ many }) => ({
1150
+ sessions: many(sessions)
1151
+ }));
1114
1152
  }
1115
1153
  });
1116
1154
 
@@ -1126,13 +1164,15 @@ __export(schema_sqlite_exports, {
1126
1164
  repos: () => repos2,
1127
1165
  sessionMcpServers: () => sessionMcpServers2,
1128
1166
  sessions: () => sessions2,
1167
+ sessionsRelations: () => sessionsRelations2,
1129
1168
  tasks: () => tasks2,
1130
1169
  threadSessionMap: () => threadSessionMap2,
1131
1170
  users: () => users2,
1132
1171
  worktreeOwners: () => worktreeOwners2,
1133
- worktrees: () => worktrees2
1172
+ worktrees: () => worktrees2,
1173
+ worktreesRelations: () => worktreesRelations2
1134
1174
  });
1135
- import { sql as sql3 } from "drizzle-orm";
1175
+ import { relations as relations2, sql as sql3 } from "drizzle-orm";
1136
1176
  import {
1137
1177
  index as index2,
1138
1178
  integer as integer2,
@@ -1141,7 +1181,7 @@ import {
1141
1181
  text as text2,
1142
1182
  uniqueIndex as uniqueIndex2
1143
1183
  } from "drizzle-orm/sqlite-core";
1144
- var t2, sessions2, tasks2, messages2, boards2, repos2, worktrees2, worktreeOwners2, users2, mcpServers2, boardObjects2, sessionMcpServers2, boardComments2, gatewayChannels2, threadSessionMap2;
1184
+ var t2, sessions2, tasks2, messages2, boards2, repos2, worktrees2, worktreeOwners2, users2, mcpServers2, boardObjects2, sessionMcpServers2, boardComments2, gatewayChannels2, threadSessionMap2, sessionsRelations2, worktreesRelations2;
1145
1185
  var init_schema_sqlite = __esm({
1146
1186
  "src/db/schema.sqlite.ts"() {
1147
1187
  "use strict";
@@ -1629,6 +1669,15 @@ var init_schema_sqlite = __esm({
1629
1669
  channelStatusIdx: index2("idx_thread_map_channel_status").on(table.channel_id, table.status)
1630
1670
  })
1631
1671
  );
1672
+ sessionsRelations2 = relations2(sessions2, ({ one }) => ({
1673
+ worktree: one(worktrees2, {
1674
+ fields: [sessions2.worktree_id],
1675
+ references: [worktrees2.worktree_id]
1676
+ })
1677
+ }));
1678
+ worktreesRelations2 = relations2(worktrees2, ({ many }) => ({
1679
+ sessions: many(sessions2)
1680
+ }));
1632
1681
  }
1633
1682
  });
1634
1683
 
@@ -2115,6 +2164,7 @@ var BoardObjectRepository = class {
2115
2164
 
2116
2165
  // src/db/repositories/boards.ts
2117
2166
  init_esm_shims();
2167
+ init_config_manager();
2118
2168
  init_ids();
2119
2169
  import { and as and2, eq as eq3, like as like2, ne } from "drizzle-orm";
2120
2170
  import * as yaml2 from "js-yaml";
@@ -2125,6 +2175,14 @@ function generateSlug(name) {
2125
2175
  return name.toLowerCase().trim().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 64);
2126
2176
  }
2127
2177
 
2178
+ // src/utils/url.ts
2179
+ init_esm_shims();
2180
+ init_ids();
2181
+ function getBoardUrl(boardId, boardSlug, baseUrl) {
2182
+ const boardParam = boardSlug || shortId(boardId);
2183
+ return `${baseUrl}/b/${boardParam}`;
2184
+ }
2185
+
2128
2186
  // src/db/repositories/boards.ts
2129
2187
  init_database_wrapper();
2130
2188
  init_schema();
@@ -2134,16 +2192,23 @@ var BoardRepository = class {
2134
2192
  }
2135
2193
  /**
2136
2194
  * Convert database row to Board type
2195
+ *
2196
+ * @param row - Database row
2197
+ * @param baseUrl - Base URL for generating board URLs
2137
2198
  */
2138
- rowToBoard(row) {
2199
+ rowToBoard(row, baseUrl) {
2139
2200
  const data = row.data;
2201
+ const boardId = row.board_id;
2202
+ const slug = row.slug !== null ? row.slug : void 0;
2203
+ const url = baseUrl ? getBoardUrl(boardId, slug, baseUrl) : "";
2140
2204
  return {
2141
- board_id: row.board_id,
2205
+ board_id: boardId,
2142
2206
  name: row.name,
2143
- slug: row.slug !== null ? row.slug : void 0,
2207
+ slug,
2144
2208
  created_at: new Date(row.created_at).toISOString(),
2145
2209
  last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
2146
2210
  created_by: row.created_by,
2211
+ url,
2147
2212
  ...data
2148
2213
  };
2149
2214
  }
@@ -2223,6 +2288,7 @@ var BoardRepository = class {
2223
2288
  async create(data) {
2224
2289
  try {
2225
2290
  const boardId = data.board_id ?? generateId();
2291
+ const baseUrl = await getBaseUrl();
2226
2292
  let finalSlug;
2227
2293
  if (data.slug === null) {
2228
2294
  finalSlug = void 0;
@@ -2245,7 +2311,7 @@ var BoardRepository = class {
2245
2311
  if (!row) {
2246
2312
  throw new RepositoryError("Failed to retrieve created board");
2247
2313
  }
2248
- return this.rowToBoard(row);
2314
+ return this.rowToBoard(row, baseUrl);
2249
2315
  } catch (error) {
2250
2316
  if (error instanceof RepositoryError) throw error;
2251
2317
  throw new RepositoryError(
@@ -2260,8 +2326,9 @@ var BoardRepository = class {
2260
2326
  async findById(id) {
2261
2327
  try {
2262
2328
  const fullId = await this.resolveId(id);
2329
+ const baseUrl = await getBaseUrl();
2263
2330
  const row = await select(this.db).from(boards3).where(eq3(boards3.board_id, fullId)).one();
2264
- return row ? this.rowToBoard(row) : null;
2331
+ return row ? this.rowToBoard(row, baseUrl) : null;
2265
2332
  } catch (error) {
2266
2333
  if (error instanceof EntityNotFoundError) return null;
2267
2334
  if (error instanceof AmbiguousIdError) throw error;
@@ -2276,8 +2343,9 @@ var BoardRepository = class {
2276
2343
  */
2277
2344
  async findBySlug(slug) {
2278
2345
  try {
2346
+ const baseUrl = await getBaseUrl();
2279
2347
  const row = await select(this.db).from(boards3).where(eq3(boards3.slug, slug)).one();
2280
- return row ? this.rowToBoard(row) : null;
2348
+ return row ? this.rowToBoard(row, baseUrl) : null;
2281
2349
  } catch (error) {
2282
2350
  throw new RepositoryError(
2283
2351
  `Failed to find board by slug: ${error instanceof Error ? error.message : String(error)}`,
@@ -2302,8 +2370,9 @@ var BoardRepository = class {
2302
2370
  */
2303
2371
  async findAll() {
2304
2372
  try {
2373
+ const baseUrl = await getBaseUrl();
2305
2374
  const rows = await select(this.db).from(boards3).all();
2306
- return rows.map((row) => this.rowToBoard(row));
2375
+ return rows.map((row) => this.rowToBoard(row, baseUrl));
2307
2376
  } catch (error) {
2308
2377
  throw new RepositoryError(
2309
2378
  `Failed to find all boards: ${error instanceof Error ? error.message : String(error)}`,
@@ -3060,21 +3129,11 @@ init_esm_shims();
3060
3129
  init_esm_shims();
3061
3130
 
3062
3131
  // src/db/repositories/sessions.ts
3132
+ init_config_manager();
3063
3133
  init_ids();
3134
+ import { and as and4, desc, eq as eq8, inArray, isNotNull, isNull as isNull2, like as like6, or, sql as sql5 } from "drizzle-orm";
3064
3135
  init_database_wrapper();
3065
3136
  init_schema();
3066
- import {
3067
- and as and4,
3068
- desc,
3069
- eq as eq8,
3070
- getTableColumns,
3071
- inArray,
3072
- isNotNull,
3073
- isNull as isNull2,
3074
- like as like6,
3075
- or,
3076
- sql as sql5
3077
- } from "drizzle-orm";
3078
3137
 
3079
3138
  // src/db/repositories/tasks.ts
3080
3139
  init_esm_shims();
@@ -3407,7 +3466,7 @@ import {
3407
3466
  and as and7,
3408
3467
  desc as desc2,
3409
3468
  eq as eq13,
3410
- getTableColumns as getTableColumns2,
3469
+ getTableColumns,
3411
3470
  inArray as inArray2,
3412
3471
  isNotNull as isNotNull2,
3413
3472
  isNull as isNull3,
@@ -3726,7 +3785,7 @@ var WorktreeRepository = class {
3726
3785
  * @returns Array of accessible worktrees
3727
3786
  */
3728
3787
  async findAccessibleWorktrees(userId) {
3729
- const rows = await select(this.db, getTableColumns2(worktrees3)).from(worktrees3).leftJoin(
3788
+ const rows = await select(this.db, getTableColumns(worktrees3)).from(worktrees3).leftJoin(
3730
3789
  worktreeOwners3,
3731
3790
  and7(
3732
3791
  eq13(worktreeOwners3.worktree_id, worktrees3.worktree_id),
@@ -3875,7 +3934,7 @@ var WorktreeRepository = class {
3875
3934
  fullText = messageData.content.filter((block) => block.type === "text" && block.text).map((block) => block.text).join("\n");
3876
3935
  }
3877
3936
  if (fullText.length > truncationLength) {
3878
- fullText = fullText.substring(0, truncationLength) + "...";
3937
+ fullText = `${fullText.substring(0, truncationLength)}...`;
3879
3938
  }
3880
3939
  lastMessageBySession.set(sessionId, fullText);
3881
3940
  }
@@ -3886,7 +3945,7 @@ var WorktreeRepository = class {
3886
3945
  const sessionId = row.session_id;
3887
3946
  let lastMessage = lastMessageBySession.get(sessionId) || "";
3888
3947
  if (lastMessage.length > truncationLength) {
3889
- lastMessage = lastMessage.substring(0, truncationLength) + "...truncated";
3948
+ lastMessage = `${lastMessage.substring(0, truncationLength)}...truncated`;
3890
3949
  }
3891
3950
  const sessionData = row.data;
3892
3951
  const messageCount = sessionData?.message_count ?? 0;
@@ -1,4 +1,4 @@
1
- import { A as AgenticToolID, a as SessionID, W as WorktreeID, T as TaskID } from './id-BwPJtWxW.cjs';
1
+ import { A as AgenticToolID, a as SessionID, W as WorktreeID, B as BoardID, T as TaskID } from './id-BwPJtWxW.cjs';
2
2
  import { C as ContextFilePath } from './context-ByxGjp5l.cjs';
3
3
 
4
4
  /**
@@ -176,6 +176,22 @@ interface Session {
176
176
  unix_username: string | null;
177
177
  /** Worktree ID - all sessions must be associated with an Agor-managed worktree */
178
178
  worktree_id: WorktreeID;
179
+ /**
180
+ * Board ID from the session's worktree (populated via LEFT JOIN)
181
+ *
182
+ * This is a computed property populated by the repository layer when fetching sessions.
183
+ * It avoids N+1 queries by joining with the worktrees table.
184
+ * Null if the worktree is not placed on any board.
185
+ */
186
+ worktree_board_id?: BoardID | null;
187
+ /**
188
+ * External/user-facing URL for viewing this session in the UI
189
+ *
190
+ * Computed property added by API hooks based on worktree_board_id.
191
+ * Format: {baseUrl}/b/{boardId}/{sessionId}/
192
+ * Null if the worktree is not on a board.
193
+ */
194
+ url: string | null;
179
195
  git_state: {
180
196
  ref: string;
181
197
  base_sha: string;