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
@@ -216,13 +216,15 @@ __export(schema_postgres_exports, {
216
216
  repos: () => repos,
217
217
  sessionMcpServers: () => sessionMcpServers,
218
218
  sessions: () => sessions,
219
+ sessionsRelations: () => sessionsRelations,
219
220
  tasks: () => tasks,
220
221
  threadSessionMap: () => threadSessionMap,
221
222
  users: () => users,
222
223
  worktreeOwners: () => worktreeOwners,
223
- worktrees: () => worktrees
224
+ worktrees: () => worktrees,
225
+ worktreesRelations: () => worktreesRelations
224
226
  });
225
- var import_drizzle_orm, import_pg_core, t, sessions, tasks, messages, boards, repos, worktrees, worktreeOwners, users, mcpServers, boardObjects, sessionMcpServers, boardComments, gatewayChannels, threadSessionMap;
227
+ var import_drizzle_orm, import_pg_core, t, sessions, tasks, messages, boards, repos, worktrees, worktreeOwners, users, mcpServers, boardObjects, sessionMcpServers, boardComments, gatewayChannels, threadSessionMap, sessionsRelations, worktreesRelations;
226
228
  var init_schema_postgres = __esm({
227
229
  "src/db/schema.postgres.ts"() {
228
230
  "use strict";
@@ -711,6 +713,15 @@ var init_schema_postgres = __esm({
711
713
  channelStatusIdx: (0, import_pg_core.index)("idx_thread_map_channel_status").on(table.channel_id, table.status)
712
714
  })
713
715
  );
716
+ sessionsRelations = (0, import_drizzle_orm.relations)(sessions, ({ one }) => ({
717
+ worktree: one(worktrees, {
718
+ fields: [sessions.worktree_id],
719
+ references: [worktrees.worktree_id]
720
+ })
721
+ }));
722
+ worktreesRelations = (0, import_drizzle_orm.relations)(worktrees, ({ many }) => ({
723
+ sessions: many(sessions)
724
+ }));
714
725
  }
715
726
  });
716
727
 
@@ -726,13 +737,15 @@ __export(schema_sqlite_exports, {
726
737
  repos: () => repos2,
727
738
  sessionMcpServers: () => sessionMcpServers2,
728
739
  sessions: () => sessions2,
740
+ sessionsRelations: () => sessionsRelations2,
729
741
  tasks: () => tasks2,
730
742
  threadSessionMap: () => threadSessionMap2,
731
743
  users: () => users2,
732
744
  worktreeOwners: () => worktreeOwners2,
733
- worktrees: () => worktrees2
745
+ worktrees: () => worktrees2,
746
+ worktreesRelations: () => worktreesRelations2
734
747
  });
735
- var import_drizzle_orm2, import_sqlite_core, t2, sessions2, tasks2, messages2, boards2, repos2, worktrees2, worktreeOwners2, users2, mcpServers2, boardObjects2, sessionMcpServers2, boardComments2, gatewayChannels2, threadSessionMap2;
748
+ var import_drizzle_orm2, import_sqlite_core, t2, sessions2, tasks2, messages2, boards2, repos2, worktrees2, worktreeOwners2, users2, mcpServers2, boardObjects2, sessionMcpServers2, boardComments2, gatewayChannels2, threadSessionMap2, sessionsRelations2, worktreesRelations2;
736
749
  var init_schema_sqlite = __esm({
737
750
  "src/db/schema.sqlite.ts"() {
738
751
  "use strict";
@@ -1222,6 +1235,15 @@ var init_schema_sqlite = __esm({
1222
1235
  channelStatusIdx: (0, import_sqlite_core.index)("idx_thread_map_channel_status").on(table.channel_id, table.status)
1223
1236
  })
1224
1237
  );
1238
+ sessionsRelations2 = (0, import_drizzle_orm2.relations)(sessions2, ({ one }) => ({
1239
+ worktree: one(worktrees2, {
1240
+ fields: [sessions2.worktree_id],
1241
+ references: [worktrees2.worktree_id]
1242
+ })
1243
+ }));
1244
+ worktreesRelations2 = (0, import_drizzle_orm2.relations)(worktrees2, ({ many }) => ({
1245
+ sessions: many(sessions2)
1246
+ }));
1225
1247
  }
1226
1248
  });
1227
1249
 
@@ -1281,10 +1303,10 @@ function isSQLiteDatabase(db) {
1281
1303
  function isPostgresDatabase(db) {
1282
1304
  return !("run" in db);
1283
1305
  }
1284
- function jsonExtract(db, column, path) {
1285
- const parts = path.split(".");
1306
+ function jsonExtract(db, column, path2) {
1307
+ const parts = path2.split(".");
1286
1308
  if (isSQLiteDatabase(db)) {
1287
- return import_drizzle_orm3.sql`json_extract(${column}, ${`$.${path}`})`;
1309
+ return import_drizzle_orm3.sql`json_extract(${column}, ${`$.${path2}`})`;
1288
1310
  } else {
1289
1311
  if (parts.length === 1) {
1290
1312
  return import_drizzle_orm3.sql`${column}${import_drizzle_orm3.sql.raw(`->>'${parts[0]}'`)}`;
@@ -1634,14 +1656,14 @@ init_schema_factory();
1634
1656
  init_cjs_shims();
1635
1657
  var import_node_os = require("os");
1636
1658
  var import_node_path = require("path");
1637
- function expandPath(path) {
1638
- if (path.startsWith("file:~/")) {
1639
- return `file:${(0, import_node_path.join)((0, import_node_os.homedir)(), path.slice(7))}`;
1659
+ function expandPath(path2) {
1660
+ if (path2.startsWith("file:~/")) {
1661
+ return `file:${(0, import_node_path.join)((0, import_node_os.homedir)(), path2.slice(7))}`;
1640
1662
  }
1641
- if (path.startsWith("~/")) {
1642
- return (0, import_node_path.join)((0, import_node_os.homedir)(), path.slice(2));
1663
+ if (path2.startsWith("~/")) {
1664
+ return (0, import_node_path.join)((0, import_node_os.homedir)(), path2.slice(2));
1643
1665
  }
1644
- return path;
1666
+ return path2;
1645
1667
  }
1646
1668
 
1647
1669
  // src/db/client.ts
@@ -1903,18 +1925,8 @@ async function checkMigrationStatus(db) {
1903
1925
  );
1904
1926
  appliedHashes = result.map((row) => String(row.hash));
1905
1927
  }
1906
- const normalizedAppliedHashes = appliedHashes;
1907
- const numExpected = expectedMigrations.length;
1908
- const numApplied = normalizedAppliedHashes.length;
1909
- if (numApplied >= numExpected) {
1910
- return {
1911
- hasPending: false,
1912
- pending: [],
1913
- applied: expectedMigrations.map((m) => m.tag)
1914
- };
1915
- }
1916
- const pending = expectedMigrations.filter((m) => !normalizedAppliedHashes.includes(m.hash)).map((m) => m.tag);
1917
- const appliedTags = expectedMigrations.filter((m) => normalizedAppliedHashes.includes(m.hash)).map((m) => m.tag);
1928
+ const pending = expectedMigrations.filter((m) => !appliedHashes.includes(m.hash)).map((m) => m.tag);
1929
+ const appliedTags = expectedMigrations.filter((m) => appliedHashes.includes(m.hash)).map((m) => m.tag);
1918
1930
  return {
1919
1931
  hasPending: pending.length > 0,
1920
1932
  pending,
@@ -2619,8 +2631,148 @@ var BoardObjectRepository = class {
2619
2631
  // src/db/repositories/boards.ts
2620
2632
  init_cjs_shims();
2621
2633
  var import_drizzle_orm7 = require("drizzle-orm");
2622
- var yaml = __toESM(require("js-yaml"), 1);
2634
+ var yaml2 = __toESM(require("js-yaml"), 1);
2635
+
2636
+ // src/config/config-manager.ts
2637
+ init_cjs_shims();
2638
+ var import_node_fs = require("fs");
2639
+ var import_promises = __toESM(require("fs/promises"), 1);
2640
+ var import_node_os2 = __toESM(require("os"), 1);
2641
+ var import_node_path3 = __toESM(require("path"), 1);
2642
+ var import_js_yaml = __toESM(require("js-yaml"), 1);
2643
+
2644
+ // src/config/constants.ts
2645
+ init_cjs_shims();
2646
+ var DAEMON = {
2647
+ /**
2648
+ * Default daemon port
2649
+ */
2650
+ DEFAULT_PORT: 3030,
2651
+ /**
2652
+ * Default daemon host
2653
+ */
2654
+ DEFAULT_HOST: "localhost"
2655
+ };
2656
+
2657
+ // src/config/config-manager.ts
2658
+ function getAgorHome() {
2659
+ return import_node_path3.default.join(import_node_os2.default.homedir(), ".agor");
2660
+ }
2661
+ function getConfigPath() {
2662
+ return import_node_path3.default.join(getAgorHome(), "config.yaml");
2663
+ }
2664
+ function validateConfig(config) {
2665
+ const mode = config.execution?.unix_user_mode;
2666
+ if (mode === "opportunistic") {
2667
+ throw new Error(
2668
+ `Config error: 'opportunistic' unix_user_mode has been deprecated.
2669
+ Please update your config to use one of:
2670
+ - 'insulated': Filesystem isolation via Unix groups (recommended)
2671
+ - 'strict': Full process impersonation required
2672
+
2673
+ To update: agor config set execution.unix_user_mode insulated`
2674
+ );
2675
+ }
2676
+ }
2677
+ async function loadConfig() {
2678
+ const configPath = getConfigPath();
2679
+ try {
2680
+ const content = await import_promises.default.readFile(configPath, "utf-8");
2681
+ const config = import_js_yaml.default.load(content);
2682
+ const finalConfig = config || {};
2683
+ validateConfig(finalConfig);
2684
+ return finalConfig;
2685
+ } catch (error) {
2686
+ if (error.code === "ENOENT") {
2687
+ return getDefaultConfig();
2688
+ }
2689
+ throw new Error(
2690
+ `Failed to load config: ${error instanceof Error ? error.message : String(error)}`
2691
+ );
2692
+ }
2693
+ }
2694
+ function getDefaultConfig() {
2695
+ return {
2696
+ defaults: {
2697
+ board: "main",
2698
+ agent: "claude-code"
2699
+ },
2700
+ display: {
2701
+ tableStyle: "unicode",
2702
+ colorOutput: true,
2703
+ shortIdLength: 8
2704
+ },
2705
+ daemon: {
2706
+ port: DAEMON.DEFAULT_PORT,
2707
+ host: DAEMON.DEFAULT_HOST,
2708
+ allowAnonymous: true,
2709
+ // Default: Allow anonymous access (local mode)
2710
+ requireAuth: false,
2711
+ // Default: Do not require authentication
2712
+ mcpEnabled: true
2713
+ // Default: Enable built-in MCP server
2714
+ },
2715
+ ui: {
2716
+ port: 5173,
2717
+ host: "localhost"
2718
+ },
2719
+ codex: {
2720
+ home: "~/.agor/codex"
2721
+ },
2722
+ execution: {
2723
+ session_token_expiration_ms: 864e5,
2724
+ // 24 hours
2725
+ session_token_max_uses: 1,
2726
+ // Single-use tokens
2727
+ sync_unix_passwords: true
2728
+ // Default: sync passwords to Unix
2729
+ }
2730
+ };
2731
+ }
2732
+ function validateBaseUrl(url) {
2733
+ const trimmed = url.trim().replace(/\/$/, "");
2734
+ if (!trimmed.startsWith("http://") && !trimmed.startsWith("https://")) {
2735
+ throw new Error(`Invalid base URL: "${url}". Must start with http:// or https://`);
2736
+ }
2737
+ try {
2738
+ new URL(trimmed);
2739
+ } catch {
2740
+ throw new Error(`Invalid base URL format: "${url}". Must be a valid HTTP(S) URL.`);
2741
+ }
2742
+ return trimmed;
2743
+ }
2744
+ async function getBaseUrl() {
2745
+ if (process.env.AGOR_BASE_URL) {
2746
+ return validateBaseUrl(process.env.AGOR_BASE_URL);
2747
+ }
2748
+ const config = await loadConfig();
2749
+ if (config.daemon?.base_url) {
2750
+ return validateBaseUrl(config.daemon.base_url);
2751
+ }
2752
+ const defaults = getDefaultConfig();
2753
+ const envPort = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : void 0;
2754
+ const port = envPort || config.daemon?.port || defaults.daemon?.port || DAEMON.DEFAULT_PORT;
2755
+ const host = config.daemon?.host || defaults.daemon?.host || DAEMON.DEFAULT_HOST;
2756
+ return `http://${host}:${port}`;
2757
+ }
2758
+
2759
+ // src/db/repositories/boards.ts
2760
+ init_ids();
2761
+
2762
+ // src/utils/url.ts
2763
+ init_cjs_shims();
2623
2764
  init_ids();
2765
+ function getSessionUrl(sessionId, boardId, boardSlug, baseUrl) {
2766
+ if (!boardId) return null;
2767
+ const boardParam = boardSlug || shortId(boardId);
2768
+ return `${baseUrl}/b/${boardParam}/${shortId(sessionId)}`;
2769
+ }
2770
+ function getBoardUrl(boardId, boardSlug, baseUrl) {
2771
+ const boardParam = boardSlug || shortId(boardId);
2772
+ return `${baseUrl}/b/${boardParam}`;
2773
+ }
2774
+
2775
+ // src/db/repositories/boards.ts
2624
2776
  init_database_wrapper();
2625
2777
  init_schema();
2626
2778
  var BoardRepository = class {
@@ -2629,16 +2781,23 @@ var BoardRepository = class {
2629
2781
  }
2630
2782
  /**
2631
2783
  * Convert database row to Board type
2784
+ *
2785
+ * @param row - Database row
2786
+ * @param baseUrl - Base URL for generating board URLs
2632
2787
  */
2633
- rowToBoard(row) {
2788
+ rowToBoard(row, baseUrl) {
2634
2789
  const data = row.data;
2790
+ const boardId = row.board_id;
2791
+ const slug = row.slug !== null ? row.slug : void 0;
2792
+ const url = baseUrl ? getBoardUrl(boardId, slug, baseUrl) : "";
2635
2793
  return {
2636
- board_id: row.board_id,
2794
+ board_id: boardId,
2637
2795
  name: row.name,
2638
- slug: row.slug !== null ? row.slug : void 0,
2796
+ slug,
2639
2797
  created_at: new Date(row.created_at).toISOString(),
2640
2798
  last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
2641
2799
  created_by: row.created_by,
2800
+ url,
2642
2801
  ...data
2643
2802
  };
2644
2803
  }
@@ -2718,6 +2877,7 @@ var BoardRepository = class {
2718
2877
  async create(data) {
2719
2878
  try {
2720
2879
  const boardId = data.board_id ?? generateId();
2880
+ const baseUrl = await getBaseUrl();
2721
2881
  let finalSlug;
2722
2882
  if (data.slug === null) {
2723
2883
  finalSlug = void 0;
@@ -2740,7 +2900,7 @@ var BoardRepository = class {
2740
2900
  if (!row) {
2741
2901
  throw new RepositoryError("Failed to retrieve created board");
2742
2902
  }
2743
- return this.rowToBoard(row);
2903
+ return this.rowToBoard(row, baseUrl);
2744
2904
  } catch (error) {
2745
2905
  if (error instanceof RepositoryError) throw error;
2746
2906
  throw new RepositoryError(
@@ -2755,8 +2915,9 @@ var BoardRepository = class {
2755
2915
  async findById(id) {
2756
2916
  try {
2757
2917
  const fullId = await this.resolveId(id);
2918
+ const baseUrl = await getBaseUrl();
2758
2919
  const row = await select(this.db).from(boards3).where((0, import_drizzle_orm7.eq)(boards3.board_id, fullId)).one();
2759
- return row ? this.rowToBoard(row) : null;
2920
+ return row ? this.rowToBoard(row, baseUrl) : null;
2760
2921
  } catch (error) {
2761
2922
  if (error instanceof EntityNotFoundError) return null;
2762
2923
  if (error instanceof AmbiguousIdError) throw error;
@@ -2771,8 +2932,9 @@ var BoardRepository = class {
2771
2932
  */
2772
2933
  async findBySlug(slug) {
2773
2934
  try {
2935
+ const baseUrl = await getBaseUrl();
2774
2936
  const row = await select(this.db).from(boards3).where((0, import_drizzle_orm7.eq)(boards3.slug, slug)).one();
2775
- return row ? this.rowToBoard(row) : null;
2937
+ return row ? this.rowToBoard(row, baseUrl) : null;
2776
2938
  } catch (error) {
2777
2939
  throw new RepositoryError(
2778
2940
  `Failed to find board by slug: ${error instanceof Error ? error.message : String(error)}`,
@@ -2797,8 +2959,9 @@ var BoardRepository = class {
2797
2959
  */
2798
2960
  async findAll() {
2799
2961
  try {
2962
+ const baseUrl = await getBaseUrl();
2800
2963
  const rows = await select(this.db).from(boards3).all();
2801
- return rows.map((row) => this.rowToBoard(row));
2964
+ return rows.map((row) => this.rowToBoard(row, baseUrl));
2802
2965
  } catch (error) {
2803
2966
  throw new RepositoryError(
2804
2967
  `Failed to find all boards: ${error instanceof Error ? error.message : String(error)}`,
@@ -3044,7 +3207,7 @@ var BoardRepository = class {
3044
3207
  "# Version: 1.0",
3045
3208
  ""
3046
3209
  ].join("\n");
3047
- return header + yaml.dump(blob, { indent: 2, lineWidth: -1 });
3210
+ return header + yaml2.dump(blob, { indent: 2, lineWidth: -1 });
3048
3211
  }
3049
3212
  /**
3050
3213
  * Import board from YAML string
@@ -3060,7 +3223,7 @@ var BoardRepository = class {
3060
3223
  */
3061
3224
  parseYamlToBlob(yamlContent) {
3062
3225
  try {
3063
- const blob = yaml.load(yamlContent, { schema: yaml.JSON_SCHEMA });
3226
+ const blob = yaml2.load(yamlContent, { schema: yaml2.JSON_SCHEMA });
3064
3227
  this.validateBoardBlob(blob);
3065
3228
  return blob;
3066
3229
  } catch (error) {
@@ -3148,7 +3311,14 @@ function decryptConfig(config) {
3148
3311
  if (typeof decrypted[field] === "string" && decrypted[field]) {
3149
3312
  try {
3150
3313
  decrypted[field] = decryptApiKey(decrypted[field]);
3151
- } catch {
3314
+ } catch (error) {
3315
+ console.error(
3316
+ `[gateway-channels] Failed to decrypt ${field}:`,
3317
+ error instanceof Error ? error.message : String(error)
3318
+ );
3319
+ console.error(
3320
+ "[gateway-channels] Channel credentials may be corrupted or master secret changed"
3321
+ );
3152
3322
  }
3153
3323
  }
3154
3324
  }
@@ -3289,6 +3459,15 @@ var GatewayChannelRepository = class {
3289
3459
  throw new EntityNotFoundError("GatewayChannel", id);
3290
3460
  }
3291
3461
  const merged = { ...current, ...updates };
3462
+ if (updates.config) {
3463
+ const mergedConfig = { ...current.config, ...updates.config };
3464
+ for (const field of SENSITIVE_CONFIG_FIELDS) {
3465
+ if (!updates.config[field] && current.config[field]) {
3466
+ mergedConfig[field] = current.config[field];
3467
+ }
3468
+ }
3469
+ merged.config = mergedConfig;
3470
+ }
3292
3471
  const insertData = this.channelToInsert(merged);
3293
3472
  await update(this.db, gatewayChannels3).set({
3294
3473
  name: insertData.name,
@@ -4205,11 +4384,19 @@ var SessionRepository = class {
4205
4384
  }
4206
4385
  /**
4207
4386
  * Convert database row to Session type
4387
+ *
4388
+ * @param row - Database row
4389
+ * @param worktreeBoardId - Board ID from worktree (if JOINed)
4390
+ * @param boardSlug - Board slug from boards table (if JOINed)
4391
+ * @param baseUrl - Base URL for generating session URLs
4208
4392
  */
4209
- rowToSession(row) {
4393
+ rowToSession(row, worktreeBoardId, boardSlug, baseUrl) {
4210
4394
  const genealogyData = row.data.genealogy || { children: [] };
4395
+ const sessionId = row.session_id;
4396
+ const boardId = worktreeBoardId ?? null;
4397
+ const url = baseUrl ? getSessionUrl(sessionId, boardId, boardSlug, baseUrl) : null;
4211
4398
  return {
4212
- session_id: row.session_id,
4399
+ session_id: sessionId,
4213
4400
  status: row.status,
4214
4401
  agentic_tool: row.agentic_tool,
4215
4402
  created_at: new Date(row.created_at).toISOString(),
@@ -4217,6 +4404,8 @@ var SessionRepository = class {
4217
4404
  created_by: row.created_by,
4218
4405
  unix_username: row.unix_username || null,
4219
4406
  worktree_id: row.worktree_id,
4407
+ worktree_board_id: boardId,
4408
+ url,
4220
4409
  ...row.data,
4221
4410
  tasks: row.data.tasks.map((id) => id),
4222
4411
  genealogy: {
@@ -4329,11 +4518,15 @@ var SessionRepository = class {
4329
4518
  try {
4330
4519
  const insertData = this.sessionToInsert(data);
4331
4520
  await insert(this.db, sessions3).values(insertData).run();
4332
- const row = await select(this.db).from(sessions3).where((0, import_drizzle_orm12.eq)(sessions3.session_id, insertData.session_id)).one();
4333
- if (!row) {
4521
+ const baseUrl = await getBaseUrl();
4522
+ const result = await select(this.db).from(sessions3).leftJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, (0, import_drizzle_orm12.eq)(worktrees3.board_id, boards3.board_id)).where((0, import_drizzle_orm12.eq)(sessions3.session_id, insertData.session_id)).one();
4523
+ if (!result) {
4334
4524
  throw new RepositoryError("Failed to retrieve created session");
4335
4525
  }
4336
- return this.rowToSession(row);
4526
+ const sessionRow = result.sessions;
4527
+ const boardId = result.worktrees?.board_id ?? null;
4528
+ const boardSlug = result.boards?.slug ?? null;
4529
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4337
4530
  } catch (error) {
4338
4531
  if (error instanceof RepositoryError) throw error;
4339
4532
  throw new RepositoryError(
@@ -4344,12 +4537,22 @@ var SessionRepository = class {
4344
4537
  }
4345
4538
  /**
4346
4539
  * Find session by ID (supports short ID)
4540
+ *
4541
+ * Automatically LEFT JOINs with worktrees table to populate worktree_board_id and url.
4542
+ * This avoids N+1 queries when URL generation is needed.
4347
4543
  */
4348
4544
  async findById(id) {
4349
4545
  try {
4350
4546
  const fullId = await this.resolveId(id);
4351
- const row = await select(this.db).from(sessions3).where((0, import_drizzle_orm12.eq)(sessions3.session_id, fullId)).one();
4352
- return row ? this.rowToSession(row) : null;
4547
+ const baseUrl = await getBaseUrl();
4548
+ const result = await select(this.db).from(sessions3).leftJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, (0, import_drizzle_orm12.eq)(worktrees3.board_id, boards3.board_id)).where((0, import_drizzle_orm12.eq)(sessions3.session_id, fullId)).one();
4549
+ if (!result) {
4550
+ return null;
4551
+ }
4552
+ const sessionRow = result.sessions;
4553
+ const boardId = result.worktrees?.board_id ?? null;
4554
+ const boardSlug = result.boards?.slug ?? null;
4555
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4353
4556
  } catch (error) {
4354
4557
  if (error instanceof EntityNotFoundError) return null;
4355
4558
  if (error instanceof AmbiguousIdError) throw error;
@@ -4361,11 +4564,21 @@ var SessionRepository = class {
4361
4564
  }
4362
4565
  /**
4363
4566
  * Find all sessions
4567
+ *
4568
+ * LEFT JOINs with worktrees to populate board_id and url in a single query.
4364
4569
  */
4365
4570
  async findAll() {
4366
4571
  try {
4367
- const rows = await select(this.db).from(sessions3).all();
4368
- return rows.map((row) => this.rowToSession(row));
4572
+ const baseUrl = await getBaseUrl();
4573
+ const results = await select(this.db).from(sessions3).leftJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, (0, import_drizzle_orm12.eq)(worktrees3.board_id, boards3.board_id)).all();
4574
+ return results.map(
4575
+ (result) => {
4576
+ const sessionRow = result.sessions;
4577
+ const boardId = result.worktrees?.board_id ?? null;
4578
+ const boardSlug = result.boards?.slug ?? null;
4579
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4580
+ }
4581
+ );
4369
4582
  } catch (error) {
4370
4583
  throw new RepositoryError(
4371
4584
  `Failed to find all sessions: ${error instanceof Error ? error.message : String(error)}`,
@@ -4375,11 +4588,21 @@ var SessionRepository = class {
4375
4588
  }
4376
4589
  /**
4377
4590
  * Find sessions by status
4591
+ *
4592
+ * LEFT JOINs with worktrees to populate board_id and url.
4378
4593
  */
4379
4594
  async findByStatus(status) {
4380
4595
  try {
4381
- const rows = await select(this.db).from(sessions3).where((0, import_drizzle_orm12.eq)(sessions3.status, status)).all();
4382
- return rows.map((row) => this.rowToSession(row));
4596
+ const baseUrl = await getBaseUrl();
4597
+ const results = await select(this.db).from(sessions3).leftJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, (0, import_drizzle_orm12.eq)(worktrees3.board_id, boards3.board_id)).where((0, import_drizzle_orm12.eq)(sessions3.status, status)).all();
4598
+ return results.map(
4599
+ (result) => {
4600
+ const sessionRow = result.sessions;
4601
+ const boardId = result.worktrees?.board_id ?? null;
4602
+ const boardSlug = result.boards?.slug ?? null;
4603
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4604
+ }
4605
+ );
4383
4606
  } catch (error) {
4384
4607
  throw new RepositoryError(
4385
4608
  `Failed to find sessions by status: ${error instanceof Error ? error.message : String(error)}`,
@@ -4389,11 +4612,22 @@ var SessionRepository = class {
4389
4612
  }
4390
4613
  /**
4391
4614
  * Find sessions by board ID
4615
+ *
4616
+ * Uses materialized board_id column for O(1) indexed lookup.
4617
+ * LEFT JOINs with worktrees to populate url (board_id already known from filter).
4392
4618
  */
4393
4619
  async findByBoard(boardId) {
4394
4620
  try {
4395
- const rows = await select(this.db).from(sessions3).where((0, import_drizzle_orm12.eq)(sessions3.board_id, boardId)).all();
4396
- return rows.map((row) => this.rowToSession(row));
4621
+ const baseUrl = await getBaseUrl();
4622
+ const results = await select(this.db).from(sessions3).leftJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, (0, import_drizzle_orm12.eq)(worktrees3.board_id, boards3.board_id)).where((0, import_drizzle_orm12.eq)(sessions3.board_id, boardId)).all();
4623
+ return results.map(
4624
+ (result) => {
4625
+ const sessionRow = result.sessions;
4626
+ const board_id = result.worktrees?.board_id ?? null;
4627
+ const boardSlug = result.boards?.slug ?? null;
4628
+ return this.rowToSession(sessionRow, board_id, boardSlug, baseUrl);
4629
+ }
4630
+ );
4397
4631
  } catch (error) {
4398
4632
  throw new RepositoryError(
4399
4633
  `Failed to find sessions by board: ${error instanceof Error ? error.message : String(error)}`,
@@ -4403,18 +4637,28 @@ var SessionRepository = class {
4403
4637
  }
4404
4638
  /**
4405
4639
  * Find child sessions (forked or spawned from this session)
4640
+ *
4641
+ * LEFT JOINs with worktrees to populate board_id and url.
4406
4642
  */
4407
4643
  async findChildren(sessionId) {
4408
4644
  try {
4409
4645
  const fullId = await this.resolveId(sessionId);
4646
+ const baseUrl = await getBaseUrl();
4410
4647
  const { jsonExtract: jsonExtract2 } = await Promise.resolve().then(() => (init_database_wrapper(), database_wrapper_exports));
4411
- const rows = await select(this.db).from(sessions3).where(
4648
+ const results = await select(this.db).from(sessions3).leftJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, (0, import_drizzle_orm12.eq)(worktrees3.board_id, boards3.board_id)).where(
4412
4649
  (0, import_drizzle_orm12.or)(
4413
4650
  import_drizzle_orm12.sql`${jsonExtract2(this.db, sessions3.data, "genealogy.parent_session_id")} = ${fullId}`,
4414
4651
  import_drizzle_orm12.sql`${jsonExtract2(this.db, sessions3.data, "genealogy.forked_from_session_id")} = ${fullId}`
4415
4652
  )
4416
4653
  ).all();
4417
- return rows.map((row) => this.rowToSession(row));
4654
+ return results.map(
4655
+ (result) => {
4656
+ const sessionRow = result.sessions;
4657
+ const boardId = result.worktrees?.board_id ?? null;
4658
+ const boardSlug = result.boards?.slug ?? null;
4659
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4660
+ }
4661
+ );
4418
4662
  } catch (error) {
4419
4663
  throw new RepositoryError(
4420
4664
  `Failed to find child sessions: ${error instanceof Error ? error.message : String(error)}`,
@@ -4467,14 +4711,18 @@ var SessionRepository = class {
4467
4711
  async update(id, updates) {
4468
4712
  try {
4469
4713
  const fullId = await this.resolveId(id);
4714
+ const baseUrl = await getBaseUrl();
4470
4715
  const statusInfo = updates.status ? ` (status: ${updates.status}, ready_for_prompt: ${updates.ready_for_prompt})` : "";
4471
4716
  console.debug(`\u{1F504} [SessionRepo] Updating session ${fullId.substring(0, 8)}${statusInfo}`);
4472
4717
  const result = await this.db.transaction(async (tx) => {
4473
- const currentRow = await select(tx).from(sessions3).where((0, import_drizzle_orm12.eq)(sessions3.session_id, fullId)).one();
4474
- if (!currentRow) {
4718
+ const currentResult = await select(tx).from(sessions3).leftJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, (0, import_drizzle_orm12.eq)(worktrees3.board_id, boards3.board_id)).where((0, import_drizzle_orm12.eq)(sessions3.session_id, fullId)).one();
4719
+ if (!currentResult) {
4475
4720
  throw new EntityNotFoundError("Session", id);
4476
4721
  }
4477
- const current = this.rowToSession(currentRow);
4722
+ const currentRow = currentResult.sessions;
4723
+ const boardId = currentResult.worktrees?.board_id ?? null;
4724
+ const boardSlug = currentResult.boards?.slug ?? null;
4725
+ const current = this.rowToSession(currentRow, boardId, boardSlug, baseUrl);
4478
4726
  const merged = deepMerge(current, updates);
4479
4727
  const insertData = this.sessionToInsert(merged);
4480
4728
  await update(tx, sessions3).set({
@@ -4541,15 +4789,18 @@ var SessionRepository = class {
4541
4789
  * instead of N+1. Returns sessions where user is a worktree owner OR worktree.others_can
4542
4790
  * allows at least 'view' access.
4543
4791
  *
4792
+ * Also populates board_id and url via the worktrees JOIN.
4793
+ *
4544
4794
  * NOTE: This method should only be called when RBAC is enabled. When RBAC is disabled,
4545
4795
  * the scopeSessionQuery hook is not registered, so default Feathers query is used
4546
4796
  * (which returns all sessions without filtering).
4547
4797
  *
4548
4798
  * @param userId - User ID to check access for
4549
- * @returns Array of accessible sessions
4799
+ * @returns Array of accessible sessions with urls populated
4550
4800
  */
4551
4801
  async findAccessibleSessions(userId) {
4552
- const rows = await select(this.db, (0, import_drizzle_orm12.getTableColumns)(sessions3)).from(sessions3).innerJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(
4802
+ const baseUrl = await getBaseUrl();
4803
+ const results = await select(this.db).from(sessions3).innerJoin(worktrees3, (0, import_drizzle_orm12.eq)(sessions3.worktree_id, worktrees3.worktree_id)).leftJoin(boards3, (0, import_drizzle_orm12.eq)(worktrees3.board_id, boards3.board_id)).leftJoin(
4553
4804
  worktreeOwners3,
4554
4805
  (0, import_drizzle_orm12.and)(
4555
4806
  (0, import_drizzle_orm12.eq)(worktreeOwners3.worktree_id, worktrees3.worktree_id),
@@ -4561,7 +4812,14 @@ var SessionRepository = class {
4561
4812
  (0, import_drizzle_orm12.inArray)(worktrees3.others_can, ["view", "prompt", "all"])
4562
4813
  )
4563
4814
  ).all();
4564
- return rows.map((row) => this.rowToSession(row));
4815
+ return results.map(
4816
+ (result) => {
4817
+ const sessionRow = result.sessions;
4818
+ const boardId = result.worktrees?.board_id ?? null;
4819
+ const boardSlug = result.boards?.slug ?? null;
4820
+ return this.rowToSession(sessionRow, boardId, boardSlug, baseUrl);
4821
+ }
4822
+ );
4565
4823
  }
4566
4824
  /**
4567
4825
  * Enrich a single session with last assistant message
@@ -4610,7 +4868,7 @@ var SessionRepository = class {
4610
4868
  fullText = messageData.content.filter((block) => block.type === "text" && block.text).map((block) => block.text).join("\n");
4611
4869
  }
4612
4870
  if (fullText.length > truncationLength) {
4613
- fullText = fullText.substring(0, truncationLength) + "...";
4871
+ fullText = `${fullText.substring(0, truncationLength)}...`;
4614
4872
  }
4615
4873
  lastMessageBySession.set(sessionId, fullText);
4616
4874
  }
@@ -5397,6 +5655,20 @@ var ThreadSessionMapRepository = class {
5397
5655
  );
5398
5656
  }
5399
5657
  }
5658
+ /**
5659
+ * Find all mappings for a worktree (for UI filtering gateway sessions)
5660
+ */
5661
+ async findByWorktree(worktreeId) {
5662
+ try {
5663
+ const rows = await select(this.db).from(threadSessionMap3).where((0, import_drizzle_orm15.eq)(threadSessionMap3.worktree_id, worktreeId)).all();
5664
+ return rows.map((row) => this.rowToMapping(row));
5665
+ } catch (error) {
5666
+ throw new RepositoryError(
5667
+ `Failed to find mappings by worktree: ${error instanceof Error ? error.message : String(error)}`,
5668
+ error
5669
+ );
5670
+ }
5671
+ }
5400
5672
  };
5401
5673
 
5402
5674
  // src/db/repositories/users.ts
@@ -6173,7 +6445,7 @@ var WorktreeRepository = class {
6173
6445
  fullText = messageData.content.filter((block) => block.type === "text" && block.text).map((block) => block.text).join("\n");
6174
6446
  }
6175
6447
  if (fullText.length > truncationLength) {
6176
- fullText = fullText.substring(0, truncationLength) + "...";
6448
+ fullText = `${fullText.substring(0, truncationLength)}...`;
6177
6449
  }
6178
6450
  lastMessageBySession.set(sessionId, fullText);
6179
6451
  }
@@ -6184,7 +6456,7 @@ var WorktreeRepository = class {
6184
6456
  const sessionId = row.session_id;
6185
6457
  let lastMessage = lastMessageBySession.get(sessionId) || "";
6186
6458
  if (lastMessage.length > truncationLength) {
6187
- lastMessage = lastMessage.substring(0, truncationLength) + "...truncated";
6459
+ lastMessage = `${lastMessage.substring(0, truncationLength)}...truncated`;
6188
6460
  }
6189
6461
  const sessionData = row.data;
6190
6462
  const messageCount = sessionData?.message_count ?? 0;