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
@@ -193,13 +193,15 @@ __export(schema_postgres_exports, {
193
193
  repos: () => repos,
194
194
  sessionMcpServers: () => sessionMcpServers,
195
195
  sessions: () => sessions,
196
+ sessionsRelations: () => sessionsRelations,
196
197
  tasks: () => tasks,
197
198
  threadSessionMap: () => threadSessionMap,
198
199
  users: () => users,
199
200
  worktreeOwners: () => worktreeOwners,
200
- worktrees: () => worktrees
201
+ worktrees: () => worktrees,
202
+ worktreesRelations: () => worktreesRelations
201
203
  });
202
- import { sql } from "drizzle-orm";
204
+ import { relations, sql } from "drizzle-orm";
203
205
  import {
204
206
  bigint,
205
207
  boolean,
@@ -213,7 +215,7 @@ import {
213
215
  uniqueIndex,
214
216
  varchar
215
217
  } from "drizzle-orm/pg-core";
216
- var t, sessions, tasks, messages, boards, repos, worktrees, worktreeOwners, users, mcpServers, boardObjects, sessionMcpServers, boardComments, gatewayChannels, threadSessionMap;
218
+ var t, sessions, tasks, messages, boards, repos, worktrees, worktreeOwners, users, mcpServers, boardObjects, sessionMcpServers, boardComments, gatewayChannels, threadSessionMap, sessionsRelations, worktreesRelations;
217
219
  var init_schema_postgres = __esm({
218
220
  "src/db/schema.postgres.ts"() {
219
221
  "use strict";
@@ -700,6 +702,15 @@ var init_schema_postgres = __esm({
700
702
  channelStatusIdx: index("idx_thread_map_channel_status").on(table.channel_id, table.status)
701
703
  })
702
704
  );
705
+ sessionsRelations = relations(sessions, ({ one }) => ({
706
+ worktree: one(worktrees, {
707
+ fields: [sessions.worktree_id],
708
+ references: [worktrees.worktree_id]
709
+ })
710
+ }));
711
+ worktreesRelations = relations(worktrees, ({ many }) => ({
712
+ sessions: many(sessions)
713
+ }));
703
714
  }
704
715
  });
705
716
 
@@ -715,13 +726,15 @@ __export(schema_sqlite_exports, {
715
726
  repos: () => repos2,
716
727
  sessionMcpServers: () => sessionMcpServers2,
717
728
  sessions: () => sessions2,
729
+ sessionsRelations: () => sessionsRelations2,
718
730
  tasks: () => tasks2,
719
731
  threadSessionMap: () => threadSessionMap2,
720
732
  users: () => users2,
721
733
  worktreeOwners: () => worktreeOwners2,
722
- worktrees: () => worktrees2
734
+ worktrees: () => worktrees2,
735
+ worktreesRelations: () => worktreesRelations2
723
736
  });
724
- import { sql as sql2 } from "drizzle-orm";
737
+ import { relations as relations2, sql as sql2 } from "drizzle-orm";
725
738
  import {
726
739
  index as index2,
727
740
  integer as integer2,
@@ -730,7 +743,7 @@ import {
730
743
  text as text2,
731
744
  uniqueIndex as uniqueIndex2
732
745
  } from "drizzle-orm/sqlite-core";
733
- var t2, sessions2, tasks2, messages2, boards2, repos2, worktrees2, worktreeOwners2, users2, mcpServers2, boardObjects2, sessionMcpServers2, boardComments2, gatewayChannels2, threadSessionMap2;
746
+ var t2, sessions2, tasks2, messages2, boards2, repos2, worktrees2, worktreeOwners2, users2, mcpServers2, boardObjects2, sessionMcpServers2, boardComments2, gatewayChannels2, threadSessionMap2, sessionsRelations2, worktreesRelations2;
734
747
  var init_schema_sqlite = __esm({
735
748
  "src/db/schema.sqlite.ts"() {
736
749
  "use strict";
@@ -1218,6 +1231,15 @@ var init_schema_sqlite = __esm({
1218
1231
  channelStatusIdx: index2("idx_thread_map_channel_status").on(table.channel_id, table.status)
1219
1232
  })
1220
1233
  );
1234
+ sessionsRelations2 = relations2(sessions2, ({ one }) => ({
1235
+ worktree: one(worktrees2, {
1236
+ fields: [sessions2.worktree_id],
1237
+ references: [worktrees2.worktree_id]
1238
+ })
1239
+ }));
1240
+ worktreesRelations2 = relations2(worktrees2, ({ many }) => ({
1241
+ sessions: many(sessions2)
1242
+ }));
1221
1243
  }
1222
1244
  });
1223
1245
 
@@ -1278,10 +1300,10 @@ function isSQLiteDatabase(db) {
1278
1300
  function isPostgresDatabase(db) {
1279
1301
  return !("run" in db);
1280
1302
  }
1281
- function jsonExtract(db, column, path2) {
1282
- const parts = path2.split(".");
1303
+ function jsonExtract(db, column, path3) {
1304
+ const parts = path3.split(".");
1283
1305
  if (isSQLiteDatabase(db)) {
1284
- return sql3`json_extract(${column}, ${`$.${path2}`})`;
1306
+ return sql3`json_extract(${column}, ${`$.${path3}`})`;
1285
1307
  } else {
1286
1308
  if (parts.length === 1) {
1287
1309
  return sql3`${column}${sql3.raw(`->>'${parts[0]}'`)}`;
@@ -1543,14 +1565,14 @@ import postgres from "postgres";
1543
1565
  init_esm_shims();
1544
1566
  import { homedir } from "os";
1545
1567
  import { join } from "path";
1546
- function expandPath(path2) {
1547
- if (path2.startsWith("file:~/")) {
1548
- return `file:${join(homedir(), path2.slice(7))}`;
1568
+ function expandPath(path3) {
1569
+ if (path3.startsWith("file:~/")) {
1570
+ return `file:${join(homedir(), path3.slice(7))}`;
1549
1571
  }
1550
- if (path2.startsWith("~/")) {
1551
- return join(homedir(), path2.slice(2));
1572
+ if (path3.startsWith("~/")) {
1573
+ return join(homedir(), path3.slice(2));
1552
1574
  }
1553
- return path2;
1575
+ return path3;
1554
1576
  }
1555
1577
 
1556
1578
  // src/db/client.ts
@@ -1812,18 +1834,8 @@ async function checkMigrationStatus(db) {
1812
1834
  );
1813
1835
  appliedHashes = result.map((row) => String(row.hash));
1814
1836
  }
1815
- const normalizedAppliedHashes = appliedHashes;
1816
- const numExpected = expectedMigrations.length;
1817
- const numApplied = normalizedAppliedHashes.length;
1818
- if (numApplied >= numExpected) {
1819
- return {
1820
- hasPending: false,
1821
- pending: [],
1822
- applied: expectedMigrations.map((m) => m.tag)
1823
- };
1824
- }
1825
- const pending = expectedMigrations.filter((m) => !normalizedAppliedHashes.includes(m.hash)).map((m) => m.tag);
1826
- const appliedTags = expectedMigrations.filter((m) => normalizedAppliedHashes.includes(m.hash)).map((m) => m.tag);
1837
+ const pending = expectedMigrations.filter((m) => !appliedHashes.includes(m.hash)).map((m) => m.tag);
1838
+ const appliedTags = expectedMigrations.filter((m) => appliedHashes.includes(m.hash)).map((m) => m.tag);
1827
1839
  return {
1828
1840
  hasPending: pending.length > 0,
1829
1841
  pending,
@@ -2527,9 +2539,149 @@ var BoardObjectRepository = class {
2527
2539
 
2528
2540
  // src/db/repositories/boards.ts
2529
2541
  init_esm_shims();
2530
- init_ids();
2531
2542
  import { and as and2, eq as eq4, like as like2, ne } from "drizzle-orm";
2532
- import * as yaml from "js-yaml";
2543
+ import * as yaml2 from "js-yaml";
2544
+
2545
+ // src/config/config-manager.ts
2546
+ init_esm_shims();
2547
+ import { readFileSync } from "fs";
2548
+ import fs from "fs/promises";
2549
+ import os from "os";
2550
+ import path2 from "path";
2551
+ import yaml from "js-yaml";
2552
+
2553
+ // src/config/constants.ts
2554
+ init_esm_shims();
2555
+ var DAEMON = {
2556
+ /**
2557
+ * Default daemon port
2558
+ */
2559
+ DEFAULT_PORT: 3030,
2560
+ /**
2561
+ * Default daemon host
2562
+ */
2563
+ DEFAULT_HOST: "localhost"
2564
+ };
2565
+
2566
+ // src/config/config-manager.ts
2567
+ function getAgorHome() {
2568
+ return path2.join(os.homedir(), ".agor");
2569
+ }
2570
+ function getConfigPath() {
2571
+ return path2.join(getAgorHome(), "config.yaml");
2572
+ }
2573
+ function validateConfig(config) {
2574
+ const mode = config.execution?.unix_user_mode;
2575
+ if (mode === "opportunistic") {
2576
+ throw new Error(
2577
+ `Config error: 'opportunistic' unix_user_mode has been deprecated.
2578
+ Please update your config to use one of:
2579
+ - 'insulated': Filesystem isolation via Unix groups (recommended)
2580
+ - 'strict': Full process impersonation required
2581
+
2582
+ To update: agor config set execution.unix_user_mode insulated`
2583
+ );
2584
+ }
2585
+ }
2586
+ async function loadConfig() {
2587
+ const configPath = getConfigPath();
2588
+ try {
2589
+ const content = await fs.readFile(configPath, "utf-8");
2590
+ const config = yaml.load(content);
2591
+ const finalConfig = config || {};
2592
+ validateConfig(finalConfig);
2593
+ return finalConfig;
2594
+ } catch (error) {
2595
+ if (error.code === "ENOENT") {
2596
+ return getDefaultConfig();
2597
+ }
2598
+ throw new Error(
2599
+ `Failed to load config: ${error instanceof Error ? error.message : String(error)}`
2600
+ );
2601
+ }
2602
+ }
2603
+ function getDefaultConfig() {
2604
+ return {
2605
+ defaults: {
2606
+ board: "main",
2607
+ agent: "claude-code"
2608
+ },
2609
+ display: {
2610
+ tableStyle: "unicode",
2611
+ colorOutput: true,
2612
+ shortIdLength: 8
2613
+ },
2614
+ daemon: {
2615
+ port: DAEMON.DEFAULT_PORT,
2616
+ host: DAEMON.DEFAULT_HOST,
2617
+ allowAnonymous: true,
2618
+ // Default: Allow anonymous access (local mode)
2619
+ requireAuth: false,
2620
+ // Default: Do not require authentication
2621
+ mcpEnabled: true
2622
+ // Default: Enable built-in MCP server
2623
+ },
2624
+ ui: {
2625
+ port: 5173,
2626
+ host: "localhost"
2627
+ },
2628
+ codex: {
2629
+ home: "~/.agor/codex"
2630
+ },
2631
+ execution: {
2632
+ session_token_expiration_ms: 864e5,
2633
+ // 24 hours
2634
+ session_token_max_uses: 1,
2635
+ // Single-use tokens
2636
+ sync_unix_passwords: true
2637
+ // Default: sync passwords to Unix
2638
+ }
2639
+ };
2640
+ }
2641
+ function validateBaseUrl(url) {
2642
+ const trimmed = url.trim().replace(/\/$/, "");
2643
+ if (!trimmed.startsWith("http://") && !trimmed.startsWith("https://")) {
2644
+ throw new Error(`Invalid base URL: "${url}". Must start with http:// or https://`);
2645
+ }
2646
+ try {
2647
+ new URL(trimmed);
2648
+ } catch {
2649
+ throw new Error(`Invalid base URL format: "${url}". Must be a valid HTTP(S) URL.`);
2650
+ }
2651
+ return trimmed;
2652
+ }
2653
+ async function getBaseUrl() {
2654
+ if (process.env.AGOR_BASE_URL) {
2655
+ return validateBaseUrl(process.env.AGOR_BASE_URL);
2656
+ }
2657
+ const config = await loadConfig();
2658
+ if (config.daemon?.base_url) {
2659
+ return validateBaseUrl(config.daemon.base_url);
2660
+ }
2661
+ const defaults = getDefaultConfig();
2662
+ const envPort = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : void 0;
2663
+ const port = envPort || config.daemon?.port || defaults.daemon?.port || DAEMON.DEFAULT_PORT;
2664
+ const host = config.daemon?.host || defaults.daemon?.host || DAEMON.DEFAULT_HOST;
2665
+ return `http://${host}:${port}`;
2666
+ }
2667
+
2668
+ // src/db/repositories/boards.ts
2669
+ init_ids();
2670
+
2671
+ // src/utils/url.ts
2672
+ init_esm_shims();
2673
+ init_ids();
2674
+ function getSessionUrl(sessionId, boardId, boardSlug, baseUrl) {
2675
+ if (!boardId) return null;
2676
+ const boardParam = boardSlug || shortId(boardId);
2677
+ return `${baseUrl}/b/${boardParam}/${shortId(sessionId)}`;
2678
+ }
2679
+ function getBoardUrl(boardId, boardSlug, baseUrl) {
2680
+ const boardParam = boardSlug || shortId(boardId);
2681
+ return `${baseUrl}/b/${boardParam}`;
2682
+ }
2683
+
2684
+ // src/db/repositories/boards.ts
2533
2685
  init_database_wrapper();
2534
2686
  init_schema();
2535
2687
  var BoardRepository = class {
@@ -2538,16 +2690,23 @@ var BoardRepository = class {
2538
2690
  }
2539
2691
  /**
2540
2692
  * Convert database row to Board type
2693
+ *
2694
+ * @param row - Database row
2695
+ * @param baseUrl - Base URL for generating board URLs
2541
2696
  */
2542
- rowToBoard(row) {
2697
+ rowToBoard(row, baseUrl) {
2543
2698
  const data = row.data;
2699
+ const boardId = row.board_id;
2700
+ const slug = row.slug !== null ? row.slug : void 0;
2701
+ const url = baseUrl ? getBoardUrl(boardId, slug, baseUrl) : "";
2544
2702
  return {
2545
- board_id: row.board_id,
2703
+ board_id: boardId,
2546
2704
  name: row.name,
2547
- slug: row.slug !== null ? row.slug : void 0,
2705
+ slug,
2548
2706
  created_at: new Date(row.created_at).toISOString(),
2549
2707
  last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
2550
2708
  created_by: row.created_by,
2709
+ url,
2551
2710
  ...data
2552
2711
  };
2553
2712
  }
@@ -2627,6 +2786,7 @@ var BoardRepository = class {
2627
2786
  async create(data) {
2628
2787
  try {
2629
2788
  const boardId = data.board_id ?? generateId();
2789
+ const baseUrl = await getBaseUrl();
2630
2790
  let finalSlug;
2631
2791
  if (data.slug === null) {
2632
2792
  finalSlug = void 0;
@@ -2649,7 +2809,7 @@ var BoardRepository = class {
2649
2809
  if (!row) {
2650
2810
  throw new RepositoryError("Failed to retrieve created board");
2651
2811
  }
2652
- return this.rowToBoard(row);
2812
+ return this.rowToBoard(row, baseUrl);
2653
2813
  } catch (error) {
2654
2814
  if (error instanceof RepositoryError) throw error;
2655
2815
  throw new RepositoryError(
@@ -2664,8 +2824,9 @@ var BoardRepository = class {
2664
2824
  async findById(id) {
2665
2825
  try {
2666
2826
  const fullId = await this.resolveId(id);
2827
+ const baseUrl = await getBaseUrl();
2667
2828
  const row = await select(this.db).from(boards3).where(eq4(boards3.board_id, fullId)).one();
2668
- return row ? this.rowToBoard(row) : null;
2829
+ return row ? this.rowToBoard(row, baseUrl) : null;
2669
2830
  } catch (error) {
2670
2831
  if (error instanceof EntityNotFoundError) return null;
2671
2832
  if (error instanceof AmbiguousIdError) throw error;
@@ -2680,8 +2841,9 @@ var BoardRepository = class {
2680
2841
  */
2681
2842
  async findBySlug(slug) {
2682
2843
  try {
2844
+ const baseUrl = await getBaseUrl();
2683
2845
  const row = await select(this.db).from(boards3).where(eq4(boards3.slug, slug)).one();
2684
- return row ? this.rowToBoard(row) : null;
2846
+ return row ? this.rowToBoard(row, baseUrl) : null;
2685
2847
  } catch (error) {
2686
2848
  throw new RepositoryError(
2687
2849
  `Failed to find board by slug: ${error instanceof Error ? error.message : String(error)}`,
@@ -2706,8 +2868,9 @@ var BoardRepository = class {
2706
2868
  */
2707
2869
  async findAll() {
2708
2870
  try {
2871
+ const baseUrl = await getBaseUrl();
2709
2872
  const rows = await select(this.db).from(boards3).all();
2710
- return rows.map((row) => this.rowToBoard(row));
2873
+ return rows.map((row) => this.rowToBoard(row, baseUrl));
2711
2874
  } catch (error) {
2712
2875
  throw new RepositoryError(
2713
2876
  `Failed to find all boards: ${error instanceof Error ? error.message : String(error)}`,
@@ -2953,7 +3116,7 @@ var BoardRepository = class {
2953
3116
  "# Version: 1.0",
2954
3117
  ""
2955
3118
  ].join("\n");
2956
- return header + yaml.dump(blob, { indent: 2, lineWidth: -1 });
3119
+ return header + yaml2.dump(blob, { indent: 2, lineWidth: -1 });
2957
3120
  }
2958
3121
  /**
2959
3122
  * Import board from YAML string
@@ -2969,7 +3132,7 @@ var BoardRepository = class {
2969
3132
  */
2970
3133
  parseYamlToBlob(yamlContent) {
2971
3134
  try {
2972
- const blob = yaml.load(yamlContent, { schema: yaml.JSON_SCHEMA });
3135
+ const blob = yaml2.load(yamlContent, { schema: yaml2.JSON_SCHEMA });
2973
3136
  this.validateBoardBlob(blob);
2974
3137
  return blob;
2975
3138
  } catch (error) {
@@ -3057,7 +3220,14 @@ function decryptConfig(config) {
3057
3220
  if (typeof decrypted[field] === "string" && decrypted[field]) {
3058
3221
  try {
3059
3222
  decrypted[field] = decryptApiKey(decrypted[field]);
3060
- } catch {
3223
+ } catch (error) {
3224
+ console.error(
3225
+ `[gateway-channels] Failed to decrypt ${field}:`,
3226
+ error instanceof Error ? error.message : String(error)
3227
+ );
3228
+ console.error(
3229
+ "[gateway-channels] Channel credentials may be corrupted or master secret changed"
3230
+ );
3061
3231
  }
3062
3232
  }
3063
3233
  }
@@ -3198,6 +3368,15 @@ var GatewayChannelRepository = class {
3198
3368
  throw new EntityNotFoundError("GatewayChannel", id);
3199
3369
  }
3200
3370
  const merged = { ...current, ...updates };
3371
+ if (updates.config) {
3372
+ const mergedConfig = { ...current.config, ...updates.config };
3373
+ for (const field of SENSITIVE_CONFIG_FIELDS) {
3374
+ if (!updates.config[field] && current.config[field]) {
3375
+ mergedConfig[field] = current.config[field];
3376
+ }
3377
+ }
3378
+ merged.config = mergedConfig;
3379
+ }
3201
3380
  const insertData = this.channelToInsert(merged);
3202
3381
  await update(this.db, gatewayChannels3).set({
3203
3382
  name: insertData.name,
@@ -4104,32 +4283,29 @@ init_esm_shims();
4104
4283
  init_esm_shims();
4105
4284
 
4106
4285
  // src/db/repositories/sessions.ts
4286
+ import { and as and4, desc, eq as eq9, inArray, isNotNull, isNull as isNull2, like as like6, or, sql as sql6 } from "drizzle-orm";
4107
4287
  init_ids();
4108
4288
  init_database_wrapper();
4109
4289
  init_schema();
4110
- import {
4111
- and as and4,
4112
- desc,
4113
- eq as eq9,
4114
- getTableColumns,
4115
- inArray,
4116
- isNotNull,
4117
- isNull as isNull2,
4118
- like as like6,
4119
- or,
4120
- sql as sql6
4121
- } from "drizzle-orm";
4122
4290
  var SessionRepository = class {
4123
4291
  constructor(db) {
4124
4292
  this.db = db;
4125
4293
  }
4126
4294
  /**
4127
4295
  * Convert database row to Session type
4296
+ *
4297
+ * @param row - Database row
4298
+ * @param worktreeBoardId - Board ID from worktree (if JOINed)
4299
+ * @param boardSlug - Board slug from boards table (if JOINed)
4300
+ * @param baseUrl - Base URL for generating session URLs
4128
4301
  */
4129
- rowToSession(row) {
4302
+ rowToSession(row, worktreeBoardId, boardSlug, baseUrl) {
4130
4303
  const genealogyData = row.data.genealogy || { children: [] };
4304
+ const sessionId = row.session_id;
4305
+ const boardId = worktreeBoardId ?? null;
4306
+ const url = baseUrl ? getSessionUrl(sessionId, boardId, boardSlug, baseUrl) : null;
4131
4307
  return {
4132
- session_id: row.session_id,
4308
+ session_id: sessionId,
4133
4309
  status: row.status,
4134
4310
  agentic_tool: row.agentic_tool,
4135
4311
  created_at: new Date(row.created_at).toISOString(),
@@ -4137,6 +4313,8 @@ var SessionRepository = class {
4137
4313
  created_by: row.created_by,
4138
4314
  unix_username: row.unix_username || null,
4139
4315
  worktree_id: row.worktree_id,
4316
+ worktree_board_id: boardId,
4317
+ url,
4140
4318
  ...row.data,
4141
4319
  tasks: row.data.tasks.map((id) => id),
4142
4320
  genealogy: {
@@ -4249,11 +4427,15 @@ var SessionRepository = class {
4249
4427
  try {
4250
4428
  const insertData = this.sessionToInsert(data);
4251
4429
  await insert(this.db, sessions3).values(insertData).run();
4252
- const row = await select(this.db).from(sessions3).where(eq9(sessions3.session_id, insertData.session_id)).one();
4253
- if (!row) {
4430
+ const baseUrl = await getBaseUrl();
4431
+ const result = await select(this.db).from(sessions3).leftJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, eq9(worktrees3.board_id, boards3.board_id)).where(eq9(sessions3.session_id, insertData.session_id)).one();
4432
+ if (!result) {
4254
4433
  throw new RepositoryError("Failed to retrieve created session");
4255
4434
  }
4256
- return this.rowToSession(row);
4435
+ const sessionRow = result.sessions;
4436
+ const boardId = result.worktrees?.board_id ?? null;
4437
+ const boardSlug = result.boards?.slug ?? null;
4438
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4257
4439
  } catch (error) {
4258
4440
  if (error instanceof RepositoryError) throw error;
4259
4441
  throw new RepositoryError(
@@ -4264,12 +4446,22 @@ var SessionRepository = class {
4264
4446
  }
4265
4447
  /**
4266
4448
  * Find session by ID (supports short ID)
4449
+ *
4450
+ * Automatically LEFT JOINs with worktrees table to populate worktree_board_id and url.
4451
+ * This avoids N+1 queries when URL generation is needed.
4267
4452
  */
4268
4453
  async findById(id) {
4269
4454
  try {
4270
4455
  const fullId = await this.resolveId(id);
4271
- const row = await select(this.db).from(sessions3).where(eq9(sessions3.session_id, fullId)).one();
4272
- return row ? this.rowToSession(row) : null;
4456
+ const baseUrl = await getBaseUrl();
4457
+ const result = await select(this.db).from(sessions3).leftJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, eq9(worktrees3.board_id, boards3.board_id)).where(eq9(sessions3.session_id, fullId)).one();
4458
+ if (!result) {
4459
+ return null;
4460
+ }
4461
+ const sessionRow = result.sessions;
4462
+ const boardId = result.worktrees?.board_id ?? null;
4463
+ const boardSlug = result.boards?.slug ?? null;
4464
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4273
4465
  } catch (error) {
4274
4466
  if (error instanceof EntityNotFoundError) return null;
4275
4467
  if (error instanceof AmbiguousIdError) throw error;
@@ -4281,11 +4473,21 @@ var SessionRepository = class {
4281
4473
  }
4282
4474
  /**
4283
4475
  * Find all sessions
4476
+ *
4477
+ * LEFT JOINs with worktrees to populate board_id and url in a single query.
4284
4478
  */
4285
4479
  async findAll() {
4286
4480
  try {
4287
- const rows = await select(this.db).from(sessions3).all();
4288
- return rows.map((row) => this.rowToSession(row));
4481
+ const baseUrl = await getBaseUrl();
4482
+ const results = await select(this.db).from(sessions3).leftJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, eq9(worktrees3.board_id, boards3.board_id)).all();
4483
+ return results.map(
4484
+ (result) => {
4485
+ const sessionRow = result.sessions;
4486
+ const boardId = result.worktrees?.board_id ?? null;
4487
+ const boardSlug = result.boards?.slug ?? null;
4488
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4489
+ }
4490
+ );
4289
4491
  } catch (error) {
4290
4492
  throw new RepositoryError(
4291
4493
  `Failed to find all sessions: ${error instanceof Error ? error.message : String(error)}`,
@@ -4295,11 +4497,21 @@ var SessionRepository = class {
4295
4497
  }
4296
4498
  /**
4297
4499
  * Find sessions by status
4500
+ *
4501
+ * LEFT JOINs with worktrees to populate board_id and url.
4298
4502
  */
4299
4503
  async findByStatus(status) {
4300
4504
  try {
4301
- const rows = await select(this.db).from(sessions3).where(eq9(sessions3.status, status)).all();
4302
- return rows.map((row) => this.rowToSession(row));
4505
+ const baseUrl = await getBaseUrl();
4506
+ const results = await select(this.db).from(sessions3).leftJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, eq9(worktrees3.board_id, boards3.board_id)).where(eq9(sessions3.status, status)).all();
4507
+ return results.map(
4508
+ (result) => {
4509
+ const sessionRow = result.sessions;
4510
+ const boardId = result.worktrees?.board_id ?? null;
4511
+ const boardSlug = result.boards?.slug ?? null;
4512
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4513
+ }
4514
+ );
4303
4515
  } catch (error) {
4304
4516
  throw new RepositoryError(
4305
4517
  `Failed to find sessions by status: ${error instanceof Error ? error.message : String(error)}`,
@@ -4309,11 +4521,22 @@ var SessionRepository = class {
4309
4521
  }
4310
4522
  /**
4311
4523
  * Find sessions by board ID
4524
+ *
4525
+ * Uses materialized board_id column for O(1) indexed lookup.
4526
+ * LEFT JOINs with worktrees to populate url (board_id already known from filter).
4312
4527
  */
4313
4528
  async findByBoard(boardId) {
4314
4529
  try {
4315
- const rows = await select(this.db).from(sessions3).where(eq9(sessions3.board_id, boardId)).all();
4316
- return rows.map((row) => this.rowToSession(row));
4530
+ const baseUrl = await getBaseUrl();
4531
+ const results = await select(this.db).from(sessions3).leftJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, eq9(worktrees3.board_id, boards3.board_id)).where(eq9(sessions3.board_id, boardId)).all();
4532
+ return results.map(
4533
+ (result) => {
4534
+ const sessionRow = result.sessions;
4535
+ const board_id = result.worktrees?.board_id ?? null;
4536
+ const boardSlug = result.boards?.slug ?? null;
4537
+ return this.rowToSession(sessionRow, board_id, boardSlug, baseUrl);
4538
+ }
4539
+ );
4317
4540
  } catch (error) {
4318
4541
  throw new RepositoryError(
4319
4542
  `Failed to find sessions by board: ${error instanceof Error ? error.message : String(error)}`,
@@ -4323,18 +4546,28 @@ var SessionRepository = class {
4323
4546
  }
4324
4547
  /**
4325
4548
  * Find child sessions (forked or spawned from this session)
4549
+ *
4550
+ * LEFT JOINs with worktrees to populate board_id and url.
4326
4551
  */
4327
4552
  async findChildren(sessionId) {
4328
4553
  try {
4329
4554
  const fullId = await this.resolveId(sessionId);
4555
+ const baseUrl = await getBaseUrl();
4330
4556
  const { jsonExtract: jsonExtract2 } = await Promise.resolve().then(() => (init_database_wrapper(), database_wrapper_exports));
4331
- const rows = await select(this.db).from(sessions3).where(
4557
+ const results = await select(this.db).from(sessions3).leftJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, eq9(worktrees3.board_id, boards3.board_id)).where(
4332
4558
  or(
4333
4559
  sql6`${jsonExtract2(this.db, sessions3.data, "genealogy.parent_session_id")} = ${fullId}`,
4334
4560
  sql6`${jsonExtract2(this.db, sessions3.data, "genealogy.forked_from_session_id")} = ${fullId}`
4335
4561
  )
4336
4562
  ).all();
4337
- return rows.map((row) => this.rowToSession(row));
4563
+ return results.map(
4564
+ (result) => {
4565
+ const sessionRow = result.sessions;
4566
+ const boardId = result.worktrees?.board_id ?? null;
4567
+ const boardSlug = result.boards?.slug ?? null;
4568
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4569
+ }
4570
+ );
4338
4571
  } catch (error) {
4339
4572
  throw new RepositoryError(
4340
4573
  `Failed to find child sessions: ${error instanceof Error ? error.message : String(error)}`,
@@ -4387,14 +4620,18 @@ var SessionRepository = class {
4387
4620
  async update(id, updates) {
4388
4621
  try {
4389
4622
  const fullId = await this.resolveId(id);
4623
+ const baseUrl = await getBaseUrl();
4390
4624
  const statusInfo = updates.status ? ` (status: ${updates.status}, ready_for_prompt: ${updates.ready_for_prompt})` : "";
4391
4625
  console.debug(`\u{1F504} [SessionRepo] Updating session ${fullId.substring(0, 8)}${statusInfo}`);
4392
4626
  const result = await this.db.transaction(async (tx) => {
4393
- const currentRow = await select(tx).from(sessions3).where(eq9(sessions3.session_id, fullId)).one();
4394
- if (!currentRow) {
4627
+ const currentResult = await select(tx).from(sessions3).leftJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, eq9(worktrees3.board_id, boards3.board_id)).where(eq9(sessions3.session_id, fullId)).one();
4628
+ if (!currentResult) {
4395
4629
  throw new EntityNotFoundError("Session", id);
4396
4630
  }
4397
- const current = this.rowToSession(currentRow);
4631
+ const currentRow = currentResult.sessions;
4632
+ const boardId = currentResult.worktrees?.board_id ?? null;
4633
+ const boardSlug = currentResult.boards?.slug ?? null;
4634
+ const current = this.rowToSession(currentRow, boardId, boardSlug, baseUrl);
4398
4635
  const merged = deepMerge(current, updates);
4399
4636
  const insertData = this.sessionToInsert(merged);
4400
4637
  await update(tx, sessions3).set({
@@ -4461,15 +4698,18 @@ var SessionRepository = class {
4461
4698
  * instead of N+1. Returns sessions where user is a worktree owner OR worktree.others_can
4462
4699
  * allows at least 'view' access.
4463
4700
  *
4701
+ * Also populates board_id and url via the worktrees JOIN.
4702
+ *
4464
4703
  * NOTE: This method should only be called when RBAC is enabled. When RBAC is disabled,
4465
4704
  * the scopeSessionQuery hook is not registered, so default Feathers query is used
4466
4705
  * (which returns all sessions without filtering).
4467
4706
  *
4468
4707
  * @param userId - User ID to check access for
4469
- * @returns Array of accessible sessions
4708
+ * @returns Array of accessible sessions with urls populated
4470
4709
  */
4471
4710
  async findAccessibleSessions(userId) {
4472
- const rows = await select(this.db, getTableColumns(sessions3)).from(sessions3).innerJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(
4711
+ const baseUrl = await getBaseUrl();
4712
+ const results = await select(this.db).from(sessions3).innerJoin(worktrees3, eq9(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, eq9(worktrees3.board_id, boards3.board_id)).leftJoin(
4473
4713
  worktreeOwners3,
4474
4714
  and4(
4475
4715
  eq9(worktreeOwners3.worktree_id, worktrees3.worktree_id),
@@ -4481,7 +4721,14 @@ var SessionRepository = class {
4481
4721
  inArray(worktrees3.others_can, ["view", "prompt", "all"])
4482
4722
  )
4483
4723
  ).all();
4484
- return rows.map((row) => this.rowToSession(row));
4724
+ return results.map(
4725
+ (result) => {
4726
+ const sessionRow = result.sessions;
4727
+ const boardId = result.worktrees?.board_id ?? null;
4728
+ const boardSlug = result.boards?.slug ?? null;
4729
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4730
+ }
4731
+ );
4485
4732
  }
4486
4733
  /**
4487
4734
  * Enrich a single session with last assistant message
@@ -4530,7 +4777,7 @@ var SessionRepository = class {
4530
4777
  fullText = messageData.content.filter((block) => block.type === "text" && block.text).map((block) => block.text).join("\n");
4531
4778
  }
4532
4779
  if (fullText.length > truncationLength) {
4533
- fullText = fullText.substring(0, truncationLength) + "...";
4780
+ fullText = `${fullText.substring(0, truncationLength)}...`;
4534
4781
  }
4535
4782
  lastMessageBySession.set(sessionId, fullText);
4536
4783
  }
@@ -5317,6 +5564,20 @@ var ThreadSessionMapRepository = class {
5317
5564
  );
5318
5565
  }
5319
5566
  }
5567
+ /**
5568
+ * Find all mappings for a worktree (for UI filtering gateway sessions)
5569
+ */
5570
+ async findByWorktree(worktreeId) {
5571
+ try {
5572
+ const rows = await select(this.db).from(threadSessionMap3).where(eq12(threadSessionMap3.worktree_id, worktreeId)).all();
5573
+ return rows.map((row) => this.rowToMapping(row));
5574
+ } catch (error) {
5575
+ throw new RepositoryError(
5576
+ `Failed to find mappings by worktree: ${error instanceof Error ? error.message : String(error)}`,
5577
+ error
5578
+ );
5579
+ }
5580
+ }
5320
5581
  };
5321
5582
 
5322
5583
  // src/db/repositories/users.ts
@@ -5636,7 +5897,7 @@ import {
5636
5897
  and as and7,
5637
5898
  desc as desc2,
5638
5899
  eq as eq14,
5639
- getTableColumns as getTableColumns2,
5900
+ getTableColumns,
5640
5901
  inArray as inArray2,
5641
5902
  isNotNull as isNotNull2,
5642
5903
  isNull as isNull3,
@@ -5955,7 +6216,7 @@ var WorktreeRepository = class {
5955
6216
  * @returns Array of accessible worktrees
5956
6217
  */
5957
6218
  async findAccessibleWorktrees(userId) {
5958
- const rows = await select(this.db, getTableColumns2(worktrees3)).from(worktrees3).leftJoin(
6219
+ const rows = await select(this.db, getTableColumns(worktrees3)).from(worktrees3).leftJoin(
5959
6220
  worktreeOwners3,
5960
6221
  and7(
5961
6222
  eq14(worktreeOwners3.worktree_id, worktrees3.worktree_id),
@@ -6104,7 +6365,7 @@ var WorktreeRepository = class {
6104
6365
  fullText = messageData.content.filter((block) => block.type === "text" && block.text).map((block) => block.text).join("\n");
6105
6366
  }
6106
6367
  if (fullText.length > truncationLength) {
6107
- fullText = fullText.substring(0, truncationLength) + "...";
6368
+ fullText = `${fullText.substring(0, truncationLength)}...`;
6108
6369
  }
6109
6370
  lastMessageBySession.set(sessionId, fullText);
6110
6371
  }
@@ -6115,7 +6376,7 @@ var WorktreeRepository = class {
6115
6376
  const sessionId = row.session_id;
6116
6377
  let lastMessage = lastMessageBySession.get(sessionId) || "";
6117
6378
  if (lastMessage.length > truncationLength) {
6118
- lastMessage = lastMessage.substring(0, truncationLength) + "...truncated";
6379
+ lastMessage = `${lastMessage.substring(0, truncationLength)}...truncated`;
6119
6380
  }
6120
6381
  const sessionData = row.data;
6121
6382
  const messageCount = sessionData?.message_count ?? 0;