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.
- package/dist/core/api/index.d.cts +4 -4
- package/dist/core/api/index.d.ts +4 -4
- package/dist/core/{board-DCNkcsyf.d.cts → board-ByCag4EG.d.cts} +8 -1
- package/dist/core/{board-C-PU8jok.d.ts → board-CZuyMRpr.d.ts} +8 -1
- package/dist/core/claude/index.cjs +46 -5
- package/dist/core/claude/index.js +51 -21
- package/dist/core/{client-CGO13BG6.d.ts → client-BoLj-jqT.d.ts} +30 -5
- package/dist/core/{client-DKbFqX_X.d.cts → client-gnSCmSyL.d.cts} +30 -5
- package/dist/core/config/browser.d.cts +1 -1
- package/dist/core/config/browser.d.ts +1 -1
- package/dist/core/config/index.cjs +60 -4
- package/dist/core/config/index.d.cts +6 -5
- package/dist/core/config/index.d.ts +6 -5
- package/dist/core/config/index.js +64 -20
- package/dist/core/{config-manager-DGBdhxtZ.d.ts → config-manager-BLDGbZHT.d.ts} +16 -2
- package/dist/core/{config-manager-sCgziLkz.d.cts → config-manager-CsBk-Rh2.d.cts} +16 -2
- package/dist/core/db/index.cjs +332 -60
- package/dist/core/db/index.d.cts +33 -7
- package/dist/core/db/index.d.ts +33 -7
- package/dist/core/db/index.js +338 -77
- package/dist/core/drizzle/postgres/meta/_journal.json +1 -1
- package/dist/core/drizzle/sqlite/meta/_journal.json +1 -1
- package/dist/core/{feathers-B0zjReEk.d.ts → feathers-CYMJeMWB.d.ts} +1 -1
- package/dist/core/{feathers-C1uChqXy.d.cts → feathers-Cyk1lpAM.d.cts} +1 -1
- package/dist/core/gateway/index.cjs +137 -12
- package/dist/core/gateway/index.d.cts +22 -6
- package/dist/core/gateway/index.d.ts +22 -6
- package/dist/core/gateway/index.js +137 -12
- package/dist/core/{gateway-Dy9fVyiS.d.ts → gateway-B4CaePYV.d.ts} +2 -2
- package/dist/core/{gateway-DGNtjRnd.d.cts → gateway-C2NOdrxu.d.cts} +2 -2
- package/dist/core/git/index.d.cts +2 -2
- package/dist/core/git/index.d.ts +2 -2
- package/dist/core/index.cjs +226 -48
- package/dist/core/index.d.cts +8 -8
- package/dist/core/index.d.ts +8 -8
- package/dist/core/index.js +230 -64
- package/dist/core/mcp/index.cjs +24 -2
- package/dist/core/mcp/index.js +26 -4
- package/dist/core/seed/index.cjs +83 -13
- package/dist/core/seed/index.js +88 -29
- package/dist/core/{session-Bt9i9089.d.cts → session-BJbTzw3y.d.cts} +17 -1
- package/dist/core/{session-Da9rf6n5.d.ts → session-DLVkt-jY.d.ts} +17 -1
- package/dist/core/templates/session-context.d.cts +1 -1
- package/dist/core/templates/session-context.d.ts +1 -1
- package/dist/core/types/index.d.cts +6 -6
- package/dist/core/types/index.d.ts +6 -6
- package/dist/core/{types-D_wAaaE3.d.cts → types-Ddri21rw.d.cts} +18 -0
- package/dist/core/{types-D_wAaaE3.d.ts → types-Ddri21rw.d.ts} +18 -0
- package/dist/core/unix/index.cjs +63 -6
- package/dist/core/unix/index.d.cts +4 -3
- package/dist/core/unix/index.d.ts +4 -3
- package/dist/core/unix/index.js +68 -22
- package/dist/core/{user-DT1Qzfep.d.ts → user-B77oCF14.d.ts} +1 -1
- package/dist/core/{user-C5id0Zhj.d.cts → user-LBRon9n1.d.cts} +1 -1
- package/dist/core/utils/permission-mode-mapper.d.cts +1 -1
- package/dist/core/utils/permission-mode-mapper.d.ts +1 -1
- package/dist/core/utils/url.cjs +22 -0
- package/dist/core/utils/url.d.cts +45 -1
- package/dist/core/utils/url.d.ts +45 -1
- package/dist/core/utils/url.js +18 -0
- package/dist/daemon/index.js +168 -38
- package/dist/daemon/mcp/routes.js +5 -5
- package/dist/daemon/services/gateway.d.ts +9 -0
- package/dist/daemon/services/gateway.js +73 -6
- package/dist/daemon/services/repos.js +1 -0
- package/dist/daemon/services/thread-session-map.d.ts +6 -0
- package/dist/daemon/services/thread-session-map.js +9 -0
- package/dist/executor/cli.d.ts +0 -0
- package/dist/executor/cli.d.ts.map +0 -0
- package/dist/executor/cli.js +0 -0
- package/dist/executor/commands/git.d.ts +0 -0
- package/dist/executor/commands/git.d.ts.map +1 -1
- package/dist/executor/commands/git.js +3 -2
- package/dist/executor/commands/index.d.ts +0 -0
- package/dist/executor/commands/index.d.ts.map +0 -0
- package/dist/executor/commands/index.js +0 -0
- package/dist/executor/commands/unix.d.ts +0 -0
- package/dist/executor/commands/unix.d.ts.map +0 -0
- package/dist/executor/commands/unix.js +0 -0
- package/dist/executor/commands/zellij.d.ts +0 -0
- package/dist/executor/commands/zellij.d.ts.map +0 -0
- package/dist/executor/commands/zellij.js +0 -0
- package/dist/executor/config.d.ts +0 -0
- package/dist/executor/config.d.ts.map +0 -0
- package/dist/executor/config.js +0 -0
- package/dist/executor/db/feathers-repositories.d.ts +0 -0
- package/dist/executor/db/feathers-repositories.d.ts.map +0 -0
- package/dist/executor/db/feathers-repositories.js +0 -0
- package/dist/executor/handlers/sdk/base-executor.d.ts +0 -0
- package/dist/executor/handlers/sdk/base-executor.d.ts.map +0 -0
- package/dist/executor/handlers/sdk/base-executor.js +0 -0
- package/dist/executor/handlers/sdk/claude.d.ts +0 -0
- package/dist/executor/handlers/sdk/claude.d.ts.map +0 -0
- package/dist/executor/handlers/sdk/claude.js +0 -0
- package/dist/executor/handlers/sdk/codex.d.ts +0 -0
- package/dist/executor/handlers/sdk/codex.d.ts.map +0 -0
- package/dist/executor/handlers/sdk/codex.js +0 -0
- package/dist/executor/handlers/sdk/gemini.d.ts +0 -0
- package/dist/executor/handlers/sdk/gemini.d.ts.map +0 -0
- package/dist/executor/handlers/sdk/gemini.js +0 -0
- package/dist/executor/handlers/sdk/opencode.d.ts +0 -0
- package/dist/executor/handlers/sdk/opencode.d.ts.map +0 -0
- package/dist/executor/handlers/sdk/opencode.js +0 -0
- package/dist/executor/handlers/sdk/tool-registry.d.ts +0 -0
- package/dist/executor/handlers/sdk/tool-registry.d.ts.map +0 -0
- package/dist/executor/handlers/sdk/tool-registry.js +0 -0
- package/dist/executor/index.d.ts +0 -0
- package/dist/executor/index.d.ts.map +0 -0
- package/dist/executor/index.js +0 -0
- package/dist/executor/payload-types.d.ts +8 -0
- package/dist/executor/payload-types.d.ts.map +1 -1
- package/dist/executor/payload-types.js +2 -0
- package/dist/executor/permissions/permission-manager.d.ts +0 -0
- package/dist/executor/permissions/permission-manager.d.ts.map +0 -0
- package/dist/executor/permissions/permission-manager.js +0 -0
- package/dist/executor/permissions/permission-service.d.ts +0 -0
- package/dist/executor/permissions/permission-service.d.ts.map +0 -0
- package/dist/executor/permissions/permission-service.js +0 -0
- package/dist/executor/sdk-handlers/base/index.d.ts +0 -0
- package/dist/executor/sdk-handlers/base/index.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/base/index.js +0 -0
- package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts +0 -0
- package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/base/mcp-scoping.js +0 -0
- package/dist/executor/sdk-handlers/base/normalizer.interface.d.ts +0 -0
- package/dist/executor/sdk-handlers/base/normalizer.interface.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/base/normalizer.interface.js +0 -0
- package/dist/executor/sdk-handlers/base/tool.interface.d.ts +0 -0
- package/dist/executor/sdk-handlers/base/tool.interface.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/base/tool.interface.js +0 -0
- package/dist/executor/sdk-handlers/base/types.d.ts +0 -0
- package/dist/executor/sdk-handlers/base/types.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/base/types.js +0 -0
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/claude-tool.js +0 -0
- package/dist/executor/sdk-handlers/claude/import/load-session.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/import/load-session.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/import/load-session.js +0 -0
- package/dist/executor/sdk-handlers/claude/import/message-converter.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/import/message-converter.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/import/message-converter.js +0 -0
- package/dist/executor/sdk-handlers/claude/import/task-extractor.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/import/task-extractor.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/import/task-extractor.js +0 -0
- package/dist/executor/sdk-handlers/claude/import/transcript-parser.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/import/transcript-parser.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/import/transcript-parser.js +0 -0
- package/dist/executor/sdk-handlers/claude/index.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/index.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/index.js +0 -0
- package/dist/executor/sdk-handlers/claude/message-builder.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/message-builder.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/message-builder.js +0 -0
- package/dist/executor/sdk-handlers/claude/message-processor.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/message-processor.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/message-processor.js +0 -0
- package/dist/executor/sdk-handlers/claude/models.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/models.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/models.js +0 -0
- package/dist/executor/sdk-handlers/claude/normalizer.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/normalizer.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/normalizer.js +0 -0
- package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.js +0 -0
- package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/prompt-service.js +0 -0
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/query-builder.js +0 -0
- package/dist/executor/sdk-handlers/claude/safe-message-service.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/safe-message-service.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/safe-message-service.js +0 -0
- package/dist/executor/sdk-handlers/claude/session-context.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/session-context.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/session-context.js +0 -0
- package/dist/executor/sdk-handlers/claude/thinking-detector.d.ts +0 -0
- package/dist/executor/sdk-handlers/claude/thinking-detector.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/claude/thinking-detector.js +0 -0
- package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +0 -0
- package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/codex/codex-tool.js +0 -0
- package/dist/executor/sdk-handlers/codex/index.d.ts +0 -0
- package/dist/executor/sdk-handlers/codex/index.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/codex/index.js +0 -0
- package/dist/executor/sdk-handlers/codex/models.d.ts +0 -0
- package/dist/executor/sdk-handlers/codex/models.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/codex/models.js +0 -0
- package/dist/executor/sdk-handlers/codex/normalizer.d.ts +0 -0
- package/dist/executor/sdk-handlers/codex/normalizer.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/codex/normalizer.js +0 -0
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +0 -0
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/codex/prompt-service.js +0 -0
- package/dist/executor/sdk-handlers/codex/usage.d.ts +0 -0
- package/dist/executor/sdk-handlers/codex/usage.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/codex/usage.js +0 -0
- package/dist/executor/sdk-handlers/gemini/conversation-converter.d.ts +0 -0
- package/dist/executor/sdk-handlers/gemini/conversation-converter.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/gemini/conversation-converter.js +0 -0
- package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts +0 -0
- package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/gemini/gemini-tool.js +0 -0
- package/dist/executor/sdk-handlers/gemini/index.d.ts +0 -0
- package/dist/executor/sdk-handlers/gemini/index.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/gemini/index.js +0 -0
- package/dist/executor/sdk-handlers/gemini/models.d.ts +0 -0
- package/dist/executor/sdk-handlers/gemini/models.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/gemini/models.js +0 -0
- package/dist/executor/sdk-handlers/gemini/normalizer.d.ts +0 -0
- package/dist/executor/sdk-handlers/gemini/normalizer.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/gemini/normalizer.js +0 -0
- package/dist/executor/sdk-handlers/gemini/permission-mapper.d.ts +0 -0
- package/dist/executor/sdk-handlers/gemini/permission-mapper.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/gemini/permission-mapper.js +0 -0
- package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +0 -0
- package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/gemini/prompt-service.js +0 -0
- package/dist/executor/sdk-handlers/gemini/usage.d.ts +0 -0
- package/dist/executor/sdk-handlers/gemini/usage.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/gemini/usage.js +0 -0
- package/dist/executor/sdk-handlers/models.d.ts +0 -0
- package/dist/executor/sdk-handlers/models.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/models.js +0 -0
- package/dist/executor/sdk-handlers/normalizer-factory.d.ts +0 -0
- package/dist/executor/sdk-handlers/normalizer-factory.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/normalizer-factory.js +0 -0
- package/dist/executor/sdk-handlers/opencode/index.d.ts +0 -0
- package/dist/executor/sdk-handlers/opencode/index.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/opencode/index.js +0 -0
- package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts +0 -0
- package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts.map +0 -0
- package/dist/executor/sdk-handlers/opencode/opencode-tool.js +0 -0
- package/dist/executor/services/feathers-client.d.ts +0 -0
- package/dist/executor/services/feathers-client.d.ts.map +0 -0
- package/dist/executor/services/feathers-client.js +0 -0
- package/dist/executor/types/sdk-response.d.ts +0 -0
- package/dist/executor/types/sdk-response.d.ts.map +0 -0
- package/dist/executor/types/sdk-response.js +0 -0
- package/dist/executor/types/token-usage.d.ts +0 -0
- package/dist/executor/types/token-usage.d.ts.map +0 -0
- package/dist/executor/types/token-usage.js +0 -0
- package/dist/executor/types.d.ts +0 -0
- package/dist/executor/types.d.ts.map +0 -0
- package/dist/executor/types.js +0 -0
- package/dist/ui/assets/{_basePickBy-a0JoJgXO.js → _basePickBy-DM-YlwQP.js} +1 -1
- package/dist/ui/assets/_basePickBy-DM-YlwQP.js.gz +0 -0
- package/dist/ui/assets/{_baseUniq-IFulW561.js → _baseUniq-w9wJK0j5.js} +1 -1
- package/dist/ui/assets/_baseUniq-w9wJK0j5.js.gz +0 -0
- package/dist/ui/assets/{arc-Dj6SyPh6.js → arc-CVXkw1SJ.js} +1 -1
- package/dist/ui/assets/arc-CVXkw1SJ.js.gz +0 -0
- package/dist/ui/assets/{architectureDiagram-VXUJARFQ-CjXOzrje.js → architectureDiagram-VXUJARFQ-CevjfWlW.js} +1 -1
- package/dist/ui/assets/{architectureDiagram-VXUJARFQ-CjXOzrje.js.gz → architectureDiagram-VXUJARFQ-CevjfWlW.js.gz} +0 -0
- package/dist/ui/assets/{blockDiagram-VD42YOAC-IFpdwkfg.js → blockDiagram-VD42YOAC-b9JU-Vzx.js} +1 -1
- package/dist/ui/assets/{blockDiagram-VD42YOAC-IFpdwkfg.js.gz → blockDiagram-VD42YOAC-b9JU-Vzx.js.gz} +0 -0
- package/dist/ui/assets/{c4Diagram-YG6GDRKO-qL4Ujfnz.js → c4Diagram-YG6GDRKO-j7VSccDF.js} +1 -1
- package/dist/ui/assets/c4Diagram-YG6GDRKO-j7VSccDF.js.gz +0 -0
- package/dist/ui/assets/channel-BNIBtjaQ.js +1 -0
- package/dist/ui/assets/{chunk-4BX2VUAB-CH6tu0mB.js → chunk-4BX2VUAB-D_codqcR.js} +1 -1
- package/dist/ui/assets/{chunk-55IACEB6-DDAZjWTD.js → chunk-55IACEB6-nQq1kviw.js} +1 -1
- package/dist/ui/assets/{chunk-B4BG7PRW-BDSu72O0.js → chunk-B4BG7PRW-DlVxaJL9.js} +1 -1
- package/dist/ui/assets/chunk-B4BG7PRW-DlVxaJL9.js.gz +0 -0
- package/dist/ui/assets/{chunk-DI55MBZ5-C7merGRo.js → chunk-DI55MBZ5-Dw95m49m.js} +1 -1
- package/dist/ui/assets/chunk-DI55MBZ5-Dw95m49m.js.gz +0 -0
- package/dist/ui/assets/{chunk-FMBD7UC4-DX20G6ZX.js → chunk-FMBD7UC4-Bnk79OV8.js} +1 -1
- package/dist/ui/assets/{chunk-QN33PNHL-BvT3a5aI.js → chunk-QN33PNHL-sqjI-sXo.js} +1 -1
- package/dist/ui/assets/{chunk-QZHKN3VN-oo-Lxdo7.js → chunk-QZHKN3VN-T7CEGHh9.js} +1 -1
- package/dist/ui/assets/{chunk-TZMSLE5B-BV4XHxKb.js → chunk-TZMSLE5B-ok9YQuUI.js} +1 -1
- package/dist/ui/assets/chunk-TZMSLE5B-ok9YQuUI.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-DeHTLUto.js +1 -0
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-DeHTLUto.js +1 -0
- package/dist/ui/assets/clone-BObtDhw7.js +1 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-BA6VY55u.js → cose-bilkent-S5V4N54A-BtanJFqC.js} +1 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-BtanJFqC.js.gz +0 -0
- package/dist/ui/assets/{dagre-6UL2VRFP-DiuqdLez.js → dagre-6UL2VRFP-CIJlfoaz.js} +1 -1
- package/dist/ui/assets/dagre-6UL2VRFP-CIJlfoaz.js.gz +0 -0
- package/dist/ui/assets/{diagram-PSM6KHXK-DU4u6xZN.js → diagram-PSM6KHXK-DhKlHuZN.js} +1 -1
- package/dist/ui/assets/diagram-PSM6KHXK-DhKlHuZN.js.gz +0 -0
- package/dist/ui/assets/{diagram-QEK2KX5R-CltgMeel.js → diagram-QEK2KX5R-BbwaTbd7.js} +1 -1
- package/dist/ui/assets/diagram-QEK2KX5R-BbwaTbd7.js.gz +0 -0
- package/dist/ui/assets/{diagram-S2PKOQOG-SkvAVcTN.js → diagram-S2PKOQOG-Dx1rRlHZ.js} +1 -1
- package/dist/ui/assets/diagram-S2PKOQOG-Dx1rRlHZ.js.gz +0 -0
- package/dist/ui/assets/{erDiagram-Q2GNP2WA-DJTHxEdE.js → erDiagram-Q2GNP2WA-w60Up3Mg.js} +1 -1
- package/dist/ui/assets/erDiagram-Q2GNP2WA-w60Up3Mg.js.gz +0 -0
- package/dist/ui/assets/{flowDiagram-NV44I4VS-BwrFtsSc.js → flowDiagram-NV44I4VS-yvyTqNEi.js} +1 -1
- package/dist/ui/assets/flowDiagram-NV44I4VS-yvyTqNEi.js.gz +0 -0
- package/dist/ui/assets/{ganttDiagram-LVOFAZNH-BnGmdiBB.js → ganttDiagram-LVOFAZNH-NBBWMpCB.js} +1 -1
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-NBBWMpCB.js.gz +0 -0
- package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-V6mHZ2jy.js → gitGraphDiagram-NY62KEGX-Dc0qrZJi.js} +1 -1
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-Dc0qrZJi.js.gz +0 -0
- package/dist/ui/assets/{graph-3Ks94Pqc.js → graph-RIZM2qth.js} +1 -1
- package/dist/ui/assets/graph-RIZM2qth.js.gz +0 -0
- package/dist/ui/assets/{index-Dl_jng3-.js → index-BcHc8U_m.js} +240 -240
- package/dist/ui/assets/index-BcHc8U_m.js.gz +0 -0
- package/dist/ui/assets/index-BjxbtAmt.css +1 -0
- package/dist/ui/assets/index-BjxbtAmt.css.gz +0 -0
- package/dist/ui/assets/{infoDiagram-ER5ION4S-DUuNVOek.js → infoDiagram-ER5ION4S-Co1qQ3-G.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-D-N__rLx.js → journeyDiagram-XKPGCS4Q-QaBi_wAx.js} +1 -1
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-QaBi_wAx.js.gz +0 -0
- package/dist/ui/assets/{kanban-definition-3W4ZIXB7-DsPDRbRp.js → kanban-definition-3W4ZIXB7-B3k5rpP3.js} +1 -1
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-B3k5rpP3.js.gz +0 -0
- package/dist/ui/assets/{layout-TuyQIiWI.js → layout-YqNNovOM.js} +1 -1
- package/dist/ui/assets/layout-YqNNovOM.js.gz +0 -0
- package/dist/ui/assets/{linear-CQUCx9aD.js → linear-DpjTIW7z.js} +1 -1
- package/dist/ui/assets/linear-DpjTIW7z.js.gz +0 -0
- package/dist/ui/assets/{mermaid.core-HQwFIIbn.js → mermaid.core-D-fYaKXC.js} +5 -5
- package/dist/ui/assets/mermaid.core-D-fYaKXC.js.gz +0 -0
- package/dist/ui/assets/{mindmap-definition-VGOIOE7T-DlR4HpYx.js → mindmap-definition-VGOIOE7T-CddQalgD.js} +1 -1
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-CddQalgD.js.gz +0 -0
- package/dist/ui/assets/{pieDiagram-ADFJNKIX-OfCYTJ7S.js → pieDiagram-ADFJNKIX-BCPzhaBq.js} +1 -1
- package/dist/ui/assets/pieDiagram-ADFJNKIX-BCPzhaBq.js.gz +0 -0
- package/dist/ui/assets/{quadrantDiagram-AYHSOK5B--irB7LvR.js → quadrantDiagram-AYHSOK5B-DrdJW-2E.js} +1 -1
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DrdJW-2E.js.gz +0 -0
- package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-iPensRLV.js → requirementDiagram-UZGBJVZJ-dV0cdx6D.js} +1 -1
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-dV0cdx6D.js.gz +0 -0
- package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-BSidESLx.js → sankeyDiagram-TZEHDZUN-SLmqiy7a.js} +1 -1
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-SLmqiy7a.js.gz +0 -0
- package/dist/ui/assets/{sequenceDiagram-WL72ISMW-BUE46svP.js → sequenceDiagram-WL72ISMW-CyH5EbRm.js} +1 -1
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-CyH5EbRm.js.gz +0 -0
- package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BJ2azfLs.js → stateDiagram-FKZM4ZOC-DbtBIYM6.js} +1 -1
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-DbtBIYM6.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DOAHUeXQ.js +1 -0
- package/dist/ui/assets/{timeline-definition-IT6M3QCI-YfwKc8ip.js → timeline-definition-IT6M3QCI-CzdpjKni.js} +1 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-CzdpjKni.js.gz +0 -0
- package/dist/ui/assets/{treemap-KMMF4GRG-DMpxEEn1.js → treemap-KMMF4GRG-D_MXp3HZ.js} +1 -1
- package/dist/ui/assets/treemap-KMMF4GRG-D_MXp3HZ.js.gz +0 -0
- package/dist/ui/assets/{xychartDiagram-PRI3JC2R-Bn_I2TeN.js → xychartDiagram-PRI3JC2R-BMwyKz4M.js} +1 -1
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-BMwyKz4M.js.gz +0 -0
- package/dist/ui/index.html +2 -2
- package/package.json +1 -1
- package/dist/ui/assets/_basePickBy-a0JoJgXO.js.gz +0 -0
- package/dist/ui/assets/_baseUniq-IFulW561.js.gz +0 -0
- package/dist/ui/assets/arc-Dj6SyPh6.js.gz +0 -0
- package/dist/ui/assets/c4Diagram-YG6GDRKO-qL4Ujfnz.js.gz +0 -0
- package/dist/ui/assets/channel-4SJF66Rh.js +0 -1
- package/dist/ui/assets/chunk-B4BG7PRW-BDSu72O0.js.gz +0 -0
- package/dist/ui/assets/chunk-DI55MBZ5-C7merGRo.js.gz +0 -0
- package/dist/ui/assets/chunk-TZMSLE5B-BV4XHxKb.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-BLjqJ_M9.js +0 -1
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BLjqJ_M9.js +0 -1
- package/dist/ui/assets/clone-DjR0SEZ0.js +0 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-BA6VY55u.js.gz +0 -0
- package/dist/ui/assets/dagre-6UL2VRFP-DiuqdLez.js.gz +0 -0
- package/dist/ui/assets/diagram-PSM6KHXK-DU4u6xZN.js.gz +0 -0
- package/dist/ui/assets/diagram-QEK2KX5R-CltgMeel.js.gz +0 -0
- package/dist/ui/assets/diagram-S2PKOQOG-SkvAVcTN.js.gz +0 -0
- package/dist/ui/assets/erDiagram-Q2GNP2WA-DJTHxEdE.js.gz +0 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-BwrFtsSc.js.gz +0 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-BnGmdiBB.js.gz +0 -0
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-V6mHZ2jy.js.gz +0 -0
- package/dist/ui/assets/graph-3Ks94Pqc.js.gz +0 -0
- package/dist/ui/assets/index-CoHRmHKF.css +0 -1
- package/dist/ui/assets/index-CoHRmHKF.css.gz +0 -0
- package/dist/ui/assets/index-Dl_jng3-.js.gz +0 -0
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-D-N__rLx.js.gz +0 -0
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-DsPDRbRp.js.gz +0 -0
- package/dist/ui/assets/layout-TuyQIiWI.js.gz +0 -0
- package/dist/ui/assets/linear-CQUCx9aD.js.gz +0 -0
- package/dist/ui/assets/mermaid.core-HQwFIIbn.js.gz +0 -0
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-DlR4HpYx.js.gz +0 -0
- package/dist/ui/assets/pieDiagram-ADFJNKIX-OfCYTJ7S.js.gz +0 -0
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B--irB7LvR.js.gz +0 -0
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-iPensRLV.js.gz +0 -0
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-BSidESLx.js.gz +0 -0
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-BUE46svP.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-BJ2azfLs.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-B9Lx1w-S.js +0 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-YfwKc8ip.js.gz +0 -0
- package/dist/ui/assets/treemap-KMMF4GRG-DMpxEEn1.js.gz +0 -0
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-Bn_I2TeN.js.gz +0 -0
package/dist/core/db/index.js
CHANGED
|
@@ -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,
|
|
1282
|
-
const parts =
|
|
1303
|
+
function jsonExtract(db, column, path3) {
|
|
1304
|
+
const parts = path3.split(".");
|
|
1283
1305
|
if (isSQLiteDatabase(db)) {
|
|
1284
|
-
return sql3`json_extract(${column}, ${`$.${
|
|
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(
|
|
1547
|
-
if (
|
|
1548
|
-
return `file:${join(homedir(),
|
|
1568
|
+
function expandPath(path3) {
|
|
1569
|
+
if (path3.startsWith("file:~/")) {
|
|
1570
|
+
return `file:${join(homedir(), path3.slice(7))}`;
|
|
1549
1571
|
}
|
|
1550
|
-
if (
|
|
1551
|
-
return join(homedir(),
|
|
1572
|
+
if (path3.startsWith("~/")) {
|
|
1573
|
+
return join(homedir(), path3.slice(2));
|
|
1552
1574
|
}
|
|
1553
|
-
return
|
|
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
|
|
1816
|
-
const
|
|
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
|
|
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:
|
|
2703
|
+
board_id: boardId,
|
|
2546
2704
|
name: row.name,
|
|
2547
|
-
slug
|
|
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 +
|
|
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 =
|
|
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:
|
|
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
|
|
4253
|
-
|
|
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
|
-
|
|
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
|
|
4272
|
-
|
|
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
|
|
4288
|
-
|
|
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
|
|
4302
|
-
|
|
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
|
|
4316
|
-
|
|
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
|
|
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
|
|
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
|
|
4394
|
-
if (!
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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)
|
|
6379
|
+
lastMessage = `${lastMessage.substring(0, truncationLength)}...truncated`;
|
|
6119
6380
|
}
|
|
6120
6381
|
const sessionData = row.data;
|
|
6121
6382
|
const messageCount = sessionData?.message_count ?? 0;
|