@cloudcli-ai/cloudcli 1.37.2 → 1.37.4
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/README.md +269 -0
- package/dist/assets/{abnfDiagram-N423BO3Z-C4UAoHJb.js → abnfDiagram-N423BO3Z-Dmkwx38H.js} +1 -1
- package/dist/assets/{arc-B8jF-ja9.js → arc-DLe9AYuO.js} +1 -1
- package/dist/assets/{architectureDiagram-T3A2C74G-C_Wur_CU.js → architectureDiagram-T3A2C74G-CBbbbNUW.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-Cq4P1i8t.js → blockDiagram-VBNYF7ZC-CaMEaWu4.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-C1wG4eUj.js → c4Diagram-5PPSVZJV-DhjMgNnR.js} +1 -1
- package/dist/assets/channel-CWrmwsir.js +1 -0
- package/dist/assets/{chunk-2GRJ4B5K-B8fnBG6E.js → chunk-2GRJ4B5K-yjl3-F-i.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-WdfPooPJ.js → chunk-2Q5K7J3B-DsAYaWEP.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-DhZJuG2E.js → chunk-5RXB4S5H-Bt5qmqOX.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-B0rjslal.js → chunk-5VM5RSS4-yWrWVvUt.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-CG2Oj4jL.js → chunk-6Q2QTUOP-Dt66K5xb.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-rrl2lRxY.js → chunk-GF5L2VYU-DA0vzaj4.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CjVbrVMA.js → chunk-JWPE2WC7-CUkbx96V.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-CRzKgU8S.js → chunk-KBJHAD2P-DWKxx1WH.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DBz4GTZF.js → chunk-RYQCIY6F-BqluplN0.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-wHxalsXk.js → chunk-XXDRQBXY-DelKg3Xf.js} +1 -1
- package/dist/assets/classDiagram-JCYQIIEL-COAGCC6w.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-COAGCC6w.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-s1hygY8e.js → cose-bilkent-JH36ORCC-DHV93-Em.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-C4LGV15i.js → cynefin-VYW2F7L2-B9HZgoGX.js} +1 -1
- package/dist/assets/{cynefinDiagram-MW4NZA55-C5uhu7B3.js → cynefinDiagram-MW4NZA55-hFjjEQg8.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-B-OBTewm.js → dagre-VZM6K2ZE-CpeVOC7V.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-BjGKQxih.js → diagram-7IWD3JNH-D0H1UoRA.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-BMKz1X2L.js → diagram-B4RE2ZJO-6Y7BQUup.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-DNh-GhKC.js → diagram-LBJQPF4R-C0nNOwht.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-BaTG9jPT.js → diagram-Q27KOJAE-En6QlOVX.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-BUwo2OvJ.js → diagram-UB23O5K3-CmPiNeGD.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-DAZgfzX2.js → ebnfDiagram-BXEA7PRR-Bygzp1Qt.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-1w1CcGEb.js → erDiagram-JOGREHBK-CwScRfzl.js} +1 -1
- package/dist/assets/{flowDiagram-UKHOOZJN-D4EII8Jj.js → flowDiagram-UKHOOZJN-bKX-0xP6.js} +1 -1
- package/dist/assets/{ganttDiagram-PKOTCBZU-ChvJZAgB.js → ganttDiagram-PKOTCBZU-DtZPKXGd.js} +1 -1
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-DtOn41S8.js → gitGraphDiagram-DS77QQ5N-CUOtdL1o.js} +1 -1
- package/dist/assets/index-CdjIFxM2.js +5004 -0
- package/dist/assets/index-DgafhGTF.css +32 -0
- package/dist/assets/{infoDiagram-6WML65LV-DN_PVEJZ.js → infoDiagram-6WML65LV-ciRQTS0h.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-DbkF1kXb.js → ishikawaDiagram-WSZJBQD7-CgjhQZ84.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-pJwmhddE.js → journeyDiagram-NVQOT4AX-BsbQSeIW.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-PPAPgNp5.js → kanban-definition-27J2QSJJ-CrwzY9Jw.js} +1 -1
- package/dist/assets/{linear-iPR-J9f7.js → linear-BUaCDr6l.js} +1 -1
- package/dist/assets/{mermaid.core-BEUL86Z6.js → mermaid.core-ClgdUU0j.js} +5 -5
- package/dist/assets/{mindmap-definition-FAOFIHXS-BvZoBib7.js → mindmap-definition-FAOFIHXS-BictljY1.js} +1 -1
- package/dist/assets/{pegDiagram-VL7TDLO6-DhYreaUd.js → pegDiagram-VL7TDLO6-BXdByy_U.js} +1 -1
- package/dist/assets/{pieDiagram-7S7Q4E2Y-CrOHlyD0.js → pieDiagram-7S7Q4E2Y-uZsMfkRX.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-D4g5yH3t.js → quadrantDiagram-CIZ2JOQS-7lCv4QIj.js} +1 -1
- package/dist/assets/{railroadDiagram-AXF67PYL-Dj39lHlf.js → railroadDiagram-AXF67PYL-07dxIWbi.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-1AS4Zgm_.js → requirementDiagram-LRYGKXZP-Cb31Yv1_.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-CKlMn19P.js → sankeyDiagram-W5VNT64P-X0YPSyF9.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-B_j3qyvo.js → sequenceDiagram-SI44F4Z6-BdBxSIlP.js} +1 -1
- package/dist/assets/server.browser-CtX3Hdl5.js +27 -0
- package/dist/assets/{sizeCapture-X5ZJPWSS-Bp2Op16v.js → sizeCapture-X5ZJPWSS-DQM5xAyD.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-C0cN6DoY.js → stateDiagram-OKZ733FA-DJ3xkLUF.js} +1 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-vAaE4zNo.js +1 -0
- package/dist/assets/{swimlanes-SLNWSIFB-BEvXOV9b.js → swimlanes-SLNWSIFB-rjfYdW0w.js} +2 -2
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-TV2IF4Nq.js +8 -0
- package/dist/assets/{timeline-definition-Z64GVDOM-zdJQinvZ.js → timeline-definition-Z64GVDOM-DZMra5do.js} +1 -1
- package/dist/assets/{vendor-codemirror-OwyKSvPE.js → vendor-codemirror-CYrSt7-U.js} +18 -18
- package/dist/assets/{vennDiagram-T6HMQDX7-DuF1uZMY.js → vennDiagram-T6HMQDX7-BevD8uu0.js} +1 -1
- package/dist/assets/{wardleyDiagram-T6FBY63Y-B9AlLQup.js → wardleyDiagram-T6FBY63Y-DsIyXB7z.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M-DTJX48Qg.js → xychartDiagram-ELKLHX3M-G3PlF3ko.js} +1 -1
- package/dist/index.html +3 -3
- package/dist-server/server/index.js +11 -4
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/agent/agent.module.js +9 -2
- package/dist-server/server/modules/agent/agent.module.js.map +1 -1
- package/dist-server/server/modules/agent/agent.routes.js +177 -130
- package/dist-server/server/modules/agent/agent.routes.js.map +1 -1
- package/dist-server/server/modules/agent/tests/agent-run-registration.test.js +306 -0
- package/dist-server/server/modules/agent/tests/agent-run-registration.test.js.map +1 -0
- package/dist-server/server/modules/agent/tests/agent.routes.test.js +48 -2
- package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -1
- package/dist-server/server/modules/browser-use/browser-use.routes.js +39 -33
- package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -1
- package/dist-server/server/modules/database/connection.js +1 -1
- package/dist-server/server/modules/database/connection.js.map +1 -1
- package/dist-server/server/modules/database/index.js +5 -0
- package/dist-server/server/modules/database/index.js.map +1 -1
- package/dist-server/server/modules/database/migrations.js +45 -1
- package/dist-server/server/modules/database/migrations.js.map +1 -1
- package/dist-server/server/modules/database/repositories/provider-models.js +60 -6
- package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -1
- package/dist-server/server/modules/database/repositories/scheduled-messages.db.js +71 -0
- package/dist-server/server/modules/database/repositories/scheduled-messages.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/session-drafts.db.js +105 -0
- package/dist-server/server/modules/database/repositories/session-drafts.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js +144 -5
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
- package/dist-server/server/modules/database/repositories/user-preferences.db.js +65 -0
- package/dist-server/server/modules/database/repositories/user-preferences.db.js.map +1 -0
- package/dist-server/server/modules/database/schema.js +99 -0
- package/dist-server/server/modules/database/schema.js.map +1 -1
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +99 -0
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +39 -0
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js +105 -0
- package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.module.js +2 -1
- package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -1
- package/dist-server/server/modules/file-tree/file-tree.service.js +44 -7
- package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -1
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +126 -1
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -1
- package/dist-server/server/modules/git/git-branch-diff.service.js +142 -0
- package/dist-server/server/modules/git/git-branch-diff.service.js.map +1 -0
- package/dist-server/server/modules/git/git-branch.service.js.map +1 -1
- package/dist-server/server/modules/git/git.routes.js +92 -5
- package/dist-server/server/modules/git/git.routes.js.map +1 -1
- package/dist-server/server/modules/git/tests/git-branch-diff.service.test.js +160 -0
- package/dist-server/server/modules/git/tests/git-branch-diff.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/project-clone.routes.js +108 -0
- package/dist-server/server/modules/projects/project-clone.routes.js.map +1 -0
- package/dist-server/server/modules/projects/projects.routes.js +13 -66
- package/dist-server/server/modules/projects/projects.routes.js.map +1 -1
- package/dist-server/server/modules/projects/services/project-clone-request.service.js +36 -0
- package/dist-server/server/modules/projects/services/project-clone-request.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-clone.service.js +86 -32
- package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -1
- package/dist-server/server/modules/projects/services/project-delete.service.js +12 -1
- package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -1
- package/dist-server/server/modules/projects/services/project-star.service.js +2 -2
- package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -1
- package/dist-server/server/modules/projects/tests/project-clone.routes.test.js +191 -0
- package/dist-server/server/modules/projects/tests/project-clone.routes.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-clone.service.test.js +275 -0
- package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/index.js +3 -0
- package/dist-server/server/modules/providers/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +62 -9
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js +46 -0
- package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +31 -12
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +472 -53
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +38 -11
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +1007 -60
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +4 -1
- package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude.provider.js +2 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +204 -0
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js +32 -0
- package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +47 -0
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +71 -53
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +8 -0
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +1621 -431
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex.provider.js +2 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +9 -2
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +16 -8
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +274 -9
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +5 -2
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +19 -2
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +134 -2
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/modules/providers/services/claude-cli-liveness.service.js +100 -0
- package/dist-server/server/modules/providers/services/claude-cli-liveness.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/claude-settings-permissions.service.js +97 -0
- package/dist-server/server/modules/providers/services/claude-settings-permissions.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js +23 -1
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-models.service.js +59 -5
- package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-runtime.service.js +8 -0
- package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js +139 -35
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js +2 -4
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/session-history-cache.service.js +91 -0
- package/dist-server/server/modules/providers/services/session-history-cache.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js +105 -32
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js +3 -60
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/sessions.service.js +252 -12
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-auth.test.js +183 -0
- package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-background-work.test.js +172 -0
- package/dist-server/server/modules/providers/tests/claude-background-work.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-compaction.test.js +84 -0
- package/dist-server/server/modules/providers/tests/claude-compaction.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-message-model.test.js +123 -0
- package/dist-server/server/modules/providers/tests/claude-message-model.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-models.test.js +39 -0
- package/dist-server/server/modules/providers/tests/claude-models.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-runtime-hold.test.js +265 -0
- package/dist-server/server/modules/providers/tests/claude-runtime-hold.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js +1815 -33
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-settings-permissions.test.js +228 -0
- package/dist-server/server/modules/providers/tests/claude-settings-permissions.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js +16 -0
- package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-token-budget.test.js +85 -0
- package/dist-server/server/modules/providers/tests/claude-token-budget.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-message-editing.test.js +338 -0
- package/dist-server/server/modules/providers/tests/codex-message-editing.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-models.test.js +25 -0
- package/dist-server/server/modules/providers/tests/codex-models.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-runtime.test.js +83 -0
- package/dist-server/server/modules/providers/tests/codex-runtime.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-session-fork.test.js +54 -0
- package/dist-server/server/modules/providers/tests/codex-session-fork.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +354 -15
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/cursor-auth.test.js +167 -0
- package/dist-server/server/modules/providers/tests/cursor-auth.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/opencode-models.test.js +196 -4
- package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +19 -1
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider-capabilities.service.test.js +30 -0
- package/dist-server/server/modules/providers/tests/provider-capabilities.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js +79 -1
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +164 -1
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider.routes.test.js +190 -1
- package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/session-fork.test.js +113 -0
- package/dist-server/server/modules/providers/tests/session-fork.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js +139 -0
- package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js +90 -0
- package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js +122 -0
- package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/sessions.service.test.js +219 -1
- package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/skills.test.js +15 -3
- package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -1
- package/dist-server/server/modules/scheduled-messages/index.js +5 -0
- package/dist-server/server/modules/scheduled-messages/index.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js +47 -0
- package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js +175 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js +95 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js +290 -0
- package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js +23 -23
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -1
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +48 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -1
- package/dist-server/server/modules/user/tests/user.service.test.js +70 -0
- package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -1
- package/dist-server/server/modules/user/user.module.js +10 -1
- package/dist-server/server/modules/user/user.module.js.map +1 -1
- package/dist-server/server/modules/user/user.routes.js +44 -0
- package/dist-server/server/modules/user/user.routes.js.map +1 -1
- package/dist-server/server/modules/user/user.service.js +75 -0
- package/dist-server/server/modules/user/user.service.js.map +1 -1
- package/dist-server/server/modules/voice/tests/voice.service.test.js +3 -2
- package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -1
- package/dist-server/server/modules/websocket/index.js +7 -0
- package/dist-server/server/modules/websocket/index.js.map +1 -1
- package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +37 -49
- package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +35 -5
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +204 -10
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js +94 -0
- package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js +236 -20
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/chat-background-subscribe.test.js +137 -0
- package/dist-server/server/modules/websocket/tests/chat-background-subscribe.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js +263 -0
- package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +29 -3
- package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js +96 -0
- package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js +106 -0
- package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +500 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -1
- package/dist-server/server/shared/claude-cli-path.js +22 -5
- package/dist-server/server/shared/claude-cli-path.js.map +1 -1
- package/dist-server/server/shared/index.js +3 -0
- package/dist-server/server/shared/index.js.map +1 -0
- package/dist-server/server/shared/message-unification.js +376 -0
- package/dist-server/server/shared/message-unification.js.map +1 -0
- package/dist-server/server/shared/tests/claude-cli-path.test.js +45 -1
- package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -1
- package/dist-server/server/shared/tests/message-unification.test.js +174 -0
- package/dist-server/server/shared/tests/message-unification.test.js.map +1 -0
- package/dist-server/server/shared/tests/read-only-roots.test.js +124 -0
- package/dist-server/server/shared/tests/read-only-roots.test.js.map +1 -0
- package/dist-server/server/shared/tests/strip-ansi-sequences.test.js +31 -0
- package/dist-server/server/shared/tests/strip-ansi-sequences.test.js.map +1 -0
- package/dist-server/server/shared/utils.js +160 -0
- package/dist-server/server/shared/utils.js.map +1 -1
- package/electron/desktopWindow.js +6 -0
- package/electron/viewHost.js +25 -2
- package/package.json +20 -17
- package/server/index.ts +16 -5
- package/server/modules/agent/agent.module.ts +11 -1
- package/server/modules/agent/agent.routes.ts +200 -142
- package/server/modules/agent/tests/agent-run-registration.test.ts +348 -0
- package/server/modules/agent/tests/agent.routes.test.ts +51 -2
- package/server/modules/browser-use/browser-use.routes.ts +96 -33
- package/server/modules/database/connection.ts +2 -1
- package/server/modules/database/index.ts +10 -0
- package/server/modules/database/migrations.ts +51 -0
- package/server/modules/database/repositories/provider-models.ts +79 -6
- package/server/modules/database/repositories/scheduled-messages.db.ts +127 -0
- package/server/modules/database/repositories/session-drafts.db.ts +171 -0
- package/server/modules/database/repositories/sessions.db.ts +204 -3
- package/server/modules/database/repositories/user-preferences.db.ts +80 -0
- package/server/modules/database/schema.ts +103 -0
- package/server/modules/database/tests/provider-models.db.integration.test.ts +113 -0
- package/server/modules/database/tests/sessions.db.integration.test.ts +52 -0
- package/server/modules/database/tests/user-preferences.db.integration.test.ts +135 -0
- package/server/modules/file-tree/file-tree.module.ts +2 -1
- package/server/modules/file-tree/file-tree.service.ts +49 -7
- package/server/modules/file-tree/tests/file-tree.service.test.ts +163 -1
- package/server/modules/git/git-branch-diff.service.ts +204 -0
- package/server/modules/git/git-branch.service.ts +2 -12
- package/server/modules/git/git.routes.ts +100 -6
- package/server/modules/git/tests/git-branch-diff.service.test.ts +210 -0
- package/server/modules/projects/project-clone.routes.ts +142 -0
- package/server/modules/projects/projects.routes.ts +16 -81
- package/server/modules/projects/services/project-clone-request.service.ts +56 -0
- package/server/modules/projects/services/project-clone.service.ts +102 -34
- package/server/modules/projects/services/project-delete.service.ts +13 -1
- package/server/modules/projects/services/project-star.service.ts +2 -2
- package/server/modules/projects/tests/project-clone.routes.test.ts +246 -0
- package/server/modules/projects/tests/project-clone.service.test.ts +376 -0
- package/server/modules/providers/index.ts +4 -0
- package/server/modules/providers/list/claude/claude-auth.provider.ts +81 -11
- package/server/modules/providers/list/claude/claude-fork.provider.ts +57 -0
- package/server/modules/providers/list/claude/claude-models.provider.ts +37 -17
- package/server/modules/providers/list/claude/claude-runtime.provider.js +510 -54
- package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +40 -14
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +1195 -63
- package/server/modules/providers/list/claude/claude-skills.provider.ts +4 -1
- package/server/modules/providers/list/claude/claude.provider.ts +3 -0
- package/server/modules/providers/list/codex/codex-app-server.client.ts +243 -0
- package/server/modules/providers/list/codex/codex-fork.provider.ts +40 -0
- package/server/modules/providers/list/codex/codex-models.provider.ts +47 -0
- package/server/modules/providers/list/codex/{codex-runtime.provider.js → codex-runtime.provider.ts} +105 -70
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +9 -0
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +1847 -455
- package/server/modules/providers/list/codex/codex.provider.ts +3 -0
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +10 -2
- package/server/modules/providers/list/cursor/cursor-runtime.provider.js +17 -8
- package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +0 -1
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +297 -9
- package/server/modules/providers/list/opencode/opencode-runtime.provider.js +5 -2
- package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +30 -2
- package/server/modules/providers/provider.routes.ts +162 -2
- package/server/modules/providers/services/claude-cli-liveness.service.ts +121 -0
- package/server/modules/providers/services/claude-settings-permissions.service.ts +127 -0
- package/server/modules/providers/services/provider-capabilities.service.ts +40 -1
- package/server/modules/providers/services/provider-models.service.ts +71 -4
- package/server/modules/providers/services/provider-runtime.service.ts +11 -0
- package/server/modules/providers/services/provider-token-usage.service.ts +166 -39
- package/server/modules/providers/services/session-conversations-search.service.ts +2 -5
- package/server/modules/providers/services/session-history-cache.service.ts +150 -0
- package/server/modules/providers/services/session-synchronizer.service.ts +125 -38
- package/server/modules/providers/services/sessions-watcher.service.ts +3 -64
- package/server/modules/providers/services/sessions.service.ts +309 -17
- package/server/modules/providers/tests/claude-auth.test.ts +208 -0
- package/server/modules/providers/tests/claude-background-work.test.ts +213 -0
- package/server/modules/providers/tests/claude-compaction.test.ts +101 -0
- package/server/modules/providers/tests/claude-message-model.test.ts +160 -0
- package/server/modules/providers/tests/claude-models.test.ts +87 -0
- package/server/modules/providers/tests/claude-runtime-hold.test.ts +309 -0
- package/server/modules/providers/tests/claude-sessions.test.ts +2167 -37
- package/server/modules/providers/tests/claude-settings-permissions.test.ts +271 -0
- package/server/modules/providers/tests/claude-subagent-echo.test.ts +25 -0
- package/server/modules/providers/tests/claude-token-budget.test.ts +104 -0
- package/server/modules/providers/tests/codex-message-editing.test.ts +419 -0
- package/server/modules/providers/tests/codex-models.test.ts +37 -0
- package/server/modules/providers/tests/codex-runtime.test.ts +94 -0
- package/server/modules/providers/tests/codex-session-fork.test.ts +59 -0
- package/server/modules/providers/tests/codex-sessions.test.ts +396 -15
- package/server/modules/providers/tests/cursor-auth.test.ts +187 -0
- package/server/modules/providers/tests/opencode-models.test.ts +266 -8
- package/server/modules/providers/tests/opencode-sessions.test.ts +40 -1
- package/server/modules/providers/tests/provider-capabilities.service.test.ts +37 -0
- package/server/modules/providers/tests/provider-models.service.test.ts +99 -1
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +188 -1
- package/server/modules/providers/tests/provider.routes.test.ts +230 -1
- package/server/modules/providers/tests/session-fork.test.ts +173 -0
- package/server/modules/providers/tests/session-history-cache.service.test.ts +165 -0
- package/server/modules/providers/tests/session-orphan-prune.test.ts +107 -0
- package/server/modules/providers/tests/session-synchronizer-coalescing.test.ts +136 -0
- package/server/modules/providers/tests/sessions.service.test.ts +303 -1
- package/server/modules/providers/tests/skills.test.ts +21 -5
- package/server/modules/scheduled-messages/index.ts +8 -0
- package/server/modules/scheduled-messages/scheduled-messages.routes.ts +68 -0
- package/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.ts +216 -0
- package/server/modules/scheduled-messages/services/scheduled-messages.service.ts +121 -0
- package/server/modules/scheduled-messages/tests/scheduled-messages.test.ts +354 -0
- package/server/modules/taskmaster/taskmaster.routes.ts +23 -33
- package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +57 -0
- package/server/modules/user/tests/user.service.test.ts +90 -0
- package/server/modules/user/user.module.ts +10 -1
- package/server/modules/user/user.routes.ts +44 -0
- package/server/modules/user/user.service.ts +105 -0
- package/server/modules/voice/tests/voice.service.test.ts +3 -2
- package/server/modules/websocket/README.md +4 -2
- package/server/modules/websocket/index.ts +8 -0
- package/server/modules/websocket/services/chat-run-registry.service.ts +45 -54
- package/server/modules/websocket/services/chat-session-writer.service.ts +36 -6
- package/server/modules/websocket/services/chat-websocket.service.ts +302 -16
- package/server/modules/websocket/services/session-upsert-broadcast.service.ts +108 -0
- package/server/modules/websocket/services/shell-websocket.service.ts +276 -22
- package/server/modules/websocket/tests/chat-background-subscribe.test.ts +167 -0
- package/server/modules/websocket/tests/chat-edit-send.test.ts +309 -0
- package/server/modules/websocket/tests/chat-run-registry.test.ts +34 -3
- package/server/modules/websocket/tests/chat-stop-task.test.ts +127 -0
- package/server/modules/websocket/tests/session-upsert-broadcast.test.ts +138 -0
- package/server/modules/websocket/tests/shell-websocket.service.test.ts +629 -0
- package/server/shared/claude-cli-path.ts +24 -6
- package/server/shared/index.ts +3 -0
- package/server/shared/interfaces.ts +91 -0
- package/server/shared/message-unification.ts +449 -0
- package/server/shared/tests/claude-cli-path.test.ts +58 -1
- package/server/shared/tests/message-unification.test.ts +218 -0
- package/server/shared/tests/read-only-roots.test.ts +139 -0
- package/server/shared/tests/strip-ansi-sequences.test.ts +42 -0
- package/server/shared/types.ts +382 -7
- package/server/shared/utils.ts +176 -0
- package/dist/assets/channel-_falYbU1.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-Dn-3CfpR.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-Dn-3CfpR.js +0 -1
- package/dist/assets/index-CzPLBvXT.css +0 -32
- package/dist/assets/index-DFkBBuSA.js +0 -1549
- package/dist/assets/stateDiagram-v2-UEYNNEHI-BvBxUUrZ.js +0 -1
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-CsE-x4YK.js +0 -8
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { getConnection } from '../../../modules/database/connection.js';
|
|
2
|
+
/** A queued message that no longer parses is treated as absent, not fatal. */
|
|
3
|
+
function parseQueuedMessage(raw) {
|
|
4
|
+
if (!raw) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(raw);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function toRecord(row) {
|
|
15
|
+
return {
|
|
16
|
+
scope: row.draft_scope,
|
|
17
|
+
text: row.draft_text,
|
|
18
|
+
queuedMessage: parseQueuedMessage(row.queued_message),
|
|
19
|
+
updatedAt: row.updated_at,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export const sessionDraftsDb = {
|
|
23
|
+
/**
|
|
24
|
+
* Returns every draft the user has, newest first.
|
|
25
|
+
*
|
|
26
|
+
* The client pulls the whole set once per load: drafts are short strings, and
|
|
27
|
+
* having them all up front means switching sessions restores a draft written
|
|
28
|
+
* on another device without a round trip.
|
|
29
|
+
*/
|
|
30
|
+
getDrafts(userId) {
|
|
31
|
+
const db = getConnection();
|
|
32
|
+
const rows = db
|
|
33
|
+
.prepare(`SELECT draft_scope, draft_text, queued_message, updated_at
|
|
34
|
+
FROM session_drafts
|
|
35
|
+
WHERE user_id = ?
|
|
36
|
+
ORDER BY datetime(updated_at) DESC`)
|
|
37
|
+
.all(userId);
|
|
38
|
+
return rows.map(toRecord);
|
|
39
|
+
},
|
|
40
|
+
/** Lists persisted queued turns whose scopes are real chat sessions. */
|
|
41
|
+
listQueuedMessages() {
|
|
42
|
+
const rows = getConnection()
|
|
43
|
+
.prepare(`SELECT drafts.user_id, drafts.draft_scope, drafts.queued_message
|
|
44
|
+
FROM session_drafts AS drafts
|
|
45
|
+
INNER JOIN sessions ON sessions.session_id = drafts.draft_scope
|
|
46
|
+
WHERE drafts.queued_message IS NOT NULL`)
|
|
47
|
+
.all();
|
|
48
|
+
return rows.map((row) => ({
|
|
49
|
+
userId: row.user_id,
|
|
50
|
+
sessionId: row.draft_scope,
|
|
51
|
+
queuedMessage: parseQueuedMessage(row.queued_message),
|
|
52
|
+
claimToken: row.queued_message,
|
|
53
|
+
}));
|
|
54
|
+
},
|
|
55
|
+
/** Atomically removes a queued turn only if it has not been edited since listing. */
|
|
56
|
+
claimQueuedMessage(candidate) {
|
|
57
|
+
const result = getConnection()
|
|
58
|
+
.prepare(`UPDATE session_drafts
|
|
59
|
+
SET queued_message = NULL, updated_at = CURRENT_TIMESTAMP
|
|
60
|
+
WHERE user_id = ? AND draft_scope = ? AND queued_message = ?`)
|
|
61
|
+
.run(candidate.userId, candidate.sessionId, candidate.claimToken);
|
|
62
|
+
return result.changes > 0;
|
|
63
|
+
},
|
|
64
|
+
/** Restores a claim lost to the narrow race where another run starts first. */
|
|
65
|
+
restoreQueuedMessage(candidate) {
|
|
66
|
+
getConnection()
|
|
67
|
+
.prepare(`UPDATE session_drafts
|
|
68
|
+
SET queued_message = ?, updated_at = CURRENT_TIMESTAMP
|
|
69
|
+
WHERE user_id = ? AND draft_scope = ? AND queued_message IS NULL`)
|
|
70
|
+
.run(candidate.claimToken, candidate.userId, candidate.sessionId);
|
|
71
|
+
},
|
|
72
|
+
/** Removes the placeholder row left after its last queued turn is claimed. */
|
|
73
|
+
deleteEmptyDraft(userId, scope) {
|
|
74
|
+
getConnection()
|
|
75
|
+
.prepare(`DELETE FROM session_drafts
|
|
76
|
+
WHERE user_id = ? AND draft_scope = ? AND draft_text = '' AND queued_message IS NULL`)
|
|
77
|
+
.run(userId, scope);
|
|
78
|
+
},
|
|
79
|
+
/**
|
|
80
|
+
* Writes one scope's draft, or deletes the row when nothing is left to keep.
|
|
81
|
+
*
|
|
82
|
+
* Deleting on empty is what stops the table growing a permanent row for every
|
|
83
|
+
* session the user ever opened and typed a character into.
|
|
84
|
+
*/
|
|
85
|
+
saveDraft(userId, scope, draft) {
|
|
86
|
+
const db = getConnection();
|
|
87
|
+
if (!draft.text && draft.queuedMessage === null) {
|
|
88
|
+
db.prepare('DELETE FROM session_drafts WHERE user_id = ? AND draft_scope = ?')
|
|
89
|
+
.run(userId, scope);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
db.prepare(`INSERT INTO session_drafts (user_id, draft_scope, draft_text, queued_message, updated_at)
|
|
93
|
+
VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
|
|
94
|
+
ON CONFLICT(user_id, draft_scope) DO UPDATE SET
|
|
95
|
+
draft_text = excluded.draft_text,
|
|
96
|
+
queued_message = excluded.queued_message,
|
|
97
|
+
updated_at = CURRENT_TIMESTAMP`).run(userId, scope, draft.text, draft.queuedMessage === null ? null : JSON.stringify(draft.queuedMessage));
|
|
98
|
+
},
|
|
99
|
+
deleteDraft(userId, scope) {
|
|
100
|
+
const db = getConnection();
|
|
101
|
+
db.prepare('DELETE FROM session_drafts WHERE user_id = ? AND draft_scope = ?')
|
|
102
|
+
.run(userId, scope);
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=session-drafts.db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-drafts.db.js","sourceRoot":"","sources":["../../../../../server/modules/database/repositories/session-drafts.db.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getConnection } from '../../../modules/database/connection.js';
|
|
2
2
|
import { projectsDb } from '../../../modules/database/repositories/projects.db.js';
|
|
3
3
|
import { normalizeProjectPath } from '../../../shared/utils.js';
|
|
4
|
-
const SESSION_ROW_COLUMNS = 'session_id, provider, provider_session_id, project_path, jsonl_path, custom_name, model, effort, isArchived, created_at, updated_at';
|
|
4
|
+
const SESSION_ROW_COLUMNS = 'session_id, provider, provider_session_id, project_path, jsonl_path, custom_name, model, effort, forked_from_session_id, isArchived, created_at, updated_at';
|
|
5
5
|
const SQLITE_UTC_TIMESTAMP_REGEX = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
|
|
6
6
|
function normalizeTimestamp(value) {
|
|
7
7
|
if (!value)
|
|
@@ -65,12 +65,12 @@ export const sessionsDb = {
|
|
|
65
65
|
updated_at = COALESCE(?, CURRENT_TIMESTAMP),
|
|
66
66
|
project_path = ?,
|
|
67
67
|
jsonl_path = ?,
|
|
68
|
-
isArchived = 0,
|
|
68
|
+
isArchived = CASE WHEN ? IS NULL OR julianday(?) > julianday(updated_at) THEN 0 ELSE isArchived END,
|
|
69
69
|
custom_name = CASE
|
|
70
70
|
WHEN session_id <> provider_session_id AND custom_name IS NOT NULL THEN custom_name
|
|
71
71
|
ELSE COALESCE(?, custom_name)
|
|
72
72
|
END
|
|
73
|
-
WHERE session_id = ?`).run(provider, updatedAtValue, normalizedProjectPath, jsonlPath ?? null, customName ?? null, existing.session_id);
|
|
73
|
+
WHERE session_id = ?`).run(provider, updatedAtValue, normalizedProjectPath, jsonlPath ?? null, updatedAtValue, updatedAtValue, customName ?? null, existing.session_id);
|
|
74
74
|
return existing.session_id;
|
|
75
75
|
}
|
|
76
76
|
// Sessions created outside the app (directly via the provider CLI) are
|
|
@@ -84,12 +84,12 @@ export const sessionsDb = {
|
|
|
84
84
|
updated_at = excluded.updated_at,
|
|
85
85
|
project_path = excluded.project_path,
|
|
86
86
|
jsonl_path = excluded.jsonl_path,
|
|
87
|
-
isArchived = 0,
|
|
87
|
+
isArchived = CASE WHEN ? IS NULL OR julianday(excluded.updated_at) > julianday(sessions.updated_at) THEN 0 ELSE sessions.isArchived END,
|
|
88
88
|
custom_name = CASE
|
|
89
89
|
WHEN sessions.session_id <> sessions.provider_session_id AND sessions.custom_name IS NOT NULL
|
|
90
90
|
THEN sessions.custom_name
|
|
91
91
|
ELSE COALESCE(excluded.custom_name, sessions.custom_name)
|
|
92
|
-
END`).run(providerSessionId, provider, providerSessionId, customName ?? null, normalizedProjectPath, jsonlPath ?? null, createdAtValue, updatedAtValue);
|
|
92
|
+
END`).run(providerSessionId, provider, providerSessionId, customName ?? null, normalizedProjectPath, jsonlPath ?? null, createdAtValue, updatedAtValue, updatedAtValue);
|
|
93
93
|
return providerSessionId;
|
|
94
94
|
},
|
|
95
95
|
/**
|
|
@@ -109,6 +109,29 @@ export const sessionsDb = {
|
|
|
109
109
|
VALUES (?, ?, NULL, ?, ?, NULL, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`).run(sessionId, provider, customName ?? null, normalizedProjectPath);
|
|
110
110
|
return sessionId;
|
|
111
111
|
},
|
|
112
|
+
/**
|
|
113
|
+
* Inserts a session that already has its provider artifact on disk.
|
|
114
|
+
*
|
|
115
|
+
* Unlike `createAppSession` this writes `provider_session_id` and
|
|
116
|
+
* `jsonl_path` immediately, because a fork's transcript file exists before
|
|
117
|
+
* the row does — and the filesystem watcher would otherwise index it as an
|
|
118
|
+
* unrelated session under its own id.
|
|
119
|
+
*/
|
|
120
|
+
createForkedSession(input) {
|
|
121
|
+
const db = getConnection();
|
|
122
|
+
const normalizedProjectPath = normalizeProjectPathForProvider(input.provider, input.projectPath);
|
|
123
|
+
projectsDb.createProjectPath(normalizedProjectPath);
|
|
124
|
+
// The watcher may already have created a row for the new transcript. Its
|
|
125
|
+
// id is the provider-native one, which is what this row claims, so replace
|
|
126
|
+
// it rather than leaving two sidebar entries for one conversation.
|
|
127
|
+
db.transaction(() => {
|
|
128
|
+
db.prepare('DELETE FROM sessions WHERE session_id = ? AND session_id <> ?')
|
|
129
|
+
.run(input.providerSessionId, input.sessionId);
|
|
130
|
+
db.prepare(`INSERT INTO sessions (session_id, provider, provider_session_id, custom_name, project_path, jsonl_path, model, effort, forked_from_session_id, isArchived, created_at, updated_at)
|
|
131
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`).run(input.sessionId, input.provider, input.providerSessionId, input.customName, normalizedProjectPath, input.jsonlPath, input.model, input.effort, input.forkedFromSessionId);
|
|
132
|
+
})();
|
|
133
|
+
return input.sessionId;
|
|
134
|
+
},
|
|
112
135
|
/**
|
|
113
136
|
* Records the provider-native session id for one app-allocated session.
|
|
114
137
|
*
|
|
@@ -144,6 +167,98 @@ export const sessionsDb = {
|
|
|
144
167
|
});
|
|
145
168
|
merge();
|
|
146
169
|
},
|
|
170
|
+
/**
|
|
171
|
+
* Moves one session onto a different provider session and transcript.
|
|
172
|
+
*
|
|
173
|
+
* Only editing a message on a provider that has to branch to rewind (Codex)
|
|
174
|
+
* does this — an ordinary run keeps the same provider session for its whole
|
|
175
|
+
* life. `assignProviderSessionId` cannot be used for it: that one keeps the
|
|
176
|
+
* existing `jsonl_path` on purpose, so a session repointed with it would
|
|
177
|
+
* claim the new thread while still reading the old transcript.
|
|
178
|
+
*
|
|
179
|
+
* The watcher may already have indexed the new transcript under its own id.
|
|
180
|
+
* That row is the same conversation this one is about to become, so it is
|
|
181
|
+
* replaced rather than left behind as a second sidebar entry.
|
|
182
|
+
*/
|
|
183
|
+
repointSessionToProviderSession(sessionId, input) {
|
|
184
|
+
const db = getConnection();
|
|
185
|
+
db.transaction(() => {
|
|
186
|
+
db.prepare('DELETE FROM sessions WHERE session_id = ? AND session_id <> ?')
|
|
187
|
+
.run(input.providerSessionId, sessionId);
|
|
188
|
+
db.prepare(`UPDATE sessions SET
|
|
189
|
+
provider_session_id = ?,
|
|
190
|
+
jsonl_path = ?,
|
|
191
|
+
updated_at = CURRENT_TIMESTAMP
|
|
192
|
+
WHERE session_id = ?`).run(input.providerSessionId, input.jsonlPath, sessionId);
|
|
193
|
+
})();
|
|
194
|
+
},
|
|
195
|
+
/**
|
|
196
|
+
* Detaches a session from its provider session so the next run starts a new
|
|
197
|
+
* one.
|
|
198
|
+
*
|
|
199
|
+
* Used when an edit replaces the very first prompt: there is no conversation
|
|
200
|
+
* left to branch from, so the session starts over instead.
|
|
201
|
+
*/
|
|
202
|
+
detachProviderSession(sessionId) {
|
|
203
|
+
const db = getConnection();
|
|
204
|
+
db.prepare(`UPDATE sessions SET
|
|
205
|
+
provider_session_id = NULL,
|
|
206
|
+
jsonl_path = NULL,
|
|
207
|
+
updated_at = CURRENT_TIMESTAMP
|
|
208
|
+
WHERE session_id = ?`).run(sessionId);
|
|
209
|
+
},
|
|
210
|
+
/**
|
|
211
|
+
* Records that a session has left a provider session behind for good.
|
|
212
|
+
*
|
|
213
|
+
* The transcript stays on disk, which is deliberate — the abandoned attempt
|
|
214
|
+
* is recoverable — but the indexer must not offer it back, and on a session
|
|
215
|
+
* discovered from disk (whose app id *is* the provider id) rediscovering it
|
|
216
|
+
* would repoint the row at the conversation the user edited away from.
|
|
217
|
+
*/
|
|
218
|
+
markProviderSessionSuperseded(input) {
|
|
219
|
+
const db = getConnection();
|
|
220
|
+
db.prepare(`INSERT INTO superseded_provider_sessions (provider_session_id, provider, session_id, jsonl_path)
|
|
221
|
+
VALUES (?, ?, ?, ?)
|
|
222
|
+
ON CONFLICT(provider_session_id, provider) DO UPDATE SET
|
|
223
|
+
session_id = excluded.session_id,
|
|
224
|
+
jsonl_path = excluded.jsonl_path,
|
|
225
|
+
created_at = CURRENT_TIMESTAMP`).run(input.providerSessionId, input.provider, input.sessionId, input.jsonlPath);
|
|
226
|
+
},
|
|
227
|
+
isProviderSessionSuperseded(providerSessionId, provider) {
|
|
228
|
+
const db = getConnection();
|
|
229
|
+
const row = db
|
|
230
|
+
.prepare(`SELECT 1 AS found FROM superseded_provider_sessions
|
|
231
|
+
WHERE provider_session_id = ? AND provider = ?
|
|
232
|
+
LIMIT 1`)
|
|
233
|
+
.get(providerSessionId, provider);
|
|
234
|
+
return Boolean(row);
|
|
235
|
+
},
|
|
236
|
+
/**
|
|
237
|
+
* Transcripts one session has left behind, for the caller that deletes a
|
|
238
|
+
* conversation from disk.
|
|
239
|
+
*
|
|
240
|
+
* A conversation edited more than once has lived in more than one file, and
|
|
241
|
+
* the session row only ever points at the newest.
|
|
242
|
+
*/
|
|
243
|
+
getSupersededTranscriptPaths(sessionId) {
|
|
244
|
+
const db = getConnection();
|
|
245
|
+
const rows = db
|
|
246
|
+
.prepare(`SELECT jsonl_path FROM superseded_provider_sessions
|
|
247
|
+
WHERE session_id = ? AND jsonl_path IS NOT NULL`)
|
|
248
|
+
.all(sessionId);
|
|
249
|
+
return rows.map((row) => row.jsonl_path);
|
|
250
|
+
},
|
|
251
|
+
/**
|
|
252
|
+
* Forgets what a session left behind, once the session itself is gone.
|
|
253
|
+
*
|
|
254
|
+
* Without this the record outlives the row it was written for and keeps the
|
|
255
|
+
* indexer refusing a transcript that no longer belongs to anything — a
|
|
256
|
+
* conversation invisible to the app and impossible to delete through it.
|
|
257
|
+
*/
|
|
258
|
+
clearSupersededProviderSessions(sessionId) {
|
|
259
|
+
const db = getConnection();
|
|
260
|
+
db.prepare('DELETE FROM superseded_provider_sessions WHERE session_id = ?').run(sessionId);
|
|
261
|
+
},
|
|
147
262
|
/**
|
|
148
263
|
* Records the model one session runs with.
|
|
149
264
|
*
|
|
@@ -371,5 +486,29 @@ export const sessionsDb = {
|
|
|
371
486
|
const db = getConnection();
|
|
372
487
|
return db.prepare('DELETE FROM sessions WHERE session_id = ?').run(sessionId).changes > 0;
|
|
373
488
|
},
|
|
489
|
+
/** Used by the OpenCode synchronizer to remove indexed child sessions by their native id. */
|
|
490
|
+
deleteSessionByProviderSessionId(providerSessionId, provider) {
|
|
491
|
+
const db = getConnection();
|
|
492
|
+
return db
|
|
493
|
+
.prepare('DELETE FROM sessions WHERE provider_session_id = ? AND provider = ?')
|
|
494
|
+
.run(providerSessionId, provider).changes > 0;
|
|
495
|
+
},
|
|
496
|
+
/**
|
|
497
|
+
* Lists every indexed session that claims a transcript file on disk.
|
|
498
|
+
*
|
|
499
|
+
* Only rows with a `jsonl_path` are returned, which deliberately excludes
|
|
500
|
+
* app-created sessions still waiting for their first provider write and
|
|
501
|
+
* OpenCode rows (whose transcripts all live inside one shared sqlite file).
|
|
502
|
+
* Used by the session synchronizer to find rows whose transcript has been
|
|
503
|
+
* deleted underneath the index.
|
|
504
|
+
*/
|
|
505
|
+
getSessionsWithTranscriptPath() {
|
|
506
|
+
const db = getConnection();
|
|
507
|
+
return db
|
|
508
|
+
.prepare(`SELECT session_id, jsonl_path
|
|
509
|
+
FROM sessions
|
|
510
|
+
WHERE jsonl_path IS NOT NULL AND jsonl_path <> ''`)
|
|
511
|
+
.all();
|
|
512
|
+
},
|
|
374
513
|
};
|
|
375
514
|
//# sourceMappingURL=sessions.db.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.db.js","sourceRoot":"","sources":["../../../../../server/modules/database/repositories/sessions.db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,gDAAgD,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.db.js","sourceRoot":"","sources":["../../../../../server/modules/database/repositories/sessions.db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { getConnection } from '../../../modules/database/connection.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decodes one stored preference, dropping any row whose JSON no longer parses
|
|
4
|
+
* rather than failing the whole read. A single corrupted value must not cost
|
|
5
|
+
* the user every other setting they have.
|
|
6
|
+
*/
|
|
7
|
+
function decodePreference(row) {
|
|
8
|
+
try {
|
|
9
|
+
return [row.preference_key, JSON.parse(row.preference_value)];
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
console.warn(`[UserPreferences] Dropping unreadable value for "${row.preference_key}"`);
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export const userPreferencesDb = {
|
|
17
|
+
/**
|
|
18
|
+
* Returns every preference the user has ever set, as one object.
|
|
19
|
+
*
|
|
20
|
+
* The client fetches this once on start-up, so absent keys simply mean "the
|
|
21
|
+
* user never changed this" and the client applies its own default.
|
|
22
|
+
*/
|
|
23
|
+
getPreferences(userId) {
|
|
24
|
+
const db = getConnection();
|
|
25
|
+
const rows = db
|
|
26
|
+
.prepare(`SELECT preference_key, preference_value
|
|
27
|
+
FROM user_preferences
|
|
28
|
+
WHERE user_id = ?`)
|
|
29
|
+
.all(userId);
|
|
30
|
+
const preferences = {};
|
|
31
|
+
for (const row of rows) {
|
|
32
|
+
const decoded = decodePreference(row);
|
|
33
|
+
if (decoded) {
|
|
34
|
+
preferences[decoded[0]] = decoded[1];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return preferences;
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* Merge-patches preferences: keys present in `updates` are written, keys
|
|
41
|
+
* absent are left alone, and a key given as `undefined` is deleted.
|
|
42
|
+
*
|
|
43
|
+
* Runs in one transaction so a multi-key save from the settings dialog can
|
|
44
|
+
* never be observed half-applied.
|
|
45
|
+
*/
|
|
46
|
+
savePreferences(userId, updates) {
|
|
47
|
+
const db = getConnection();
|
|
48
|
+
const upsert = db.prepare(`INSERT INTO user_preferences (user_id, preference_key, preference_value, updated_at)
|
|
49
|
+
VALUES (?, ?, ?, CURRENT_TIMESTAMP)
|
|
50
|
+
ON CONFLICT(user_id, preference_key) DO UPDATE SET
|
|
51
|
+
preference_value = excluded.preference_value,
|
|
52
|
+
updated_at = CURRENT_TIMESTAMP`);
|
|
53
|
+
const remove = db.prepare('DELETE FROM user_preferences WHERE user_id = ? AND preference_key = ?');
|
|
54
|
+
db.transaction(() => {
|
|
55
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
56
|
+
if (value === undefined) {
|
|
57
|
+
remove.run(userId, key);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
upsert.run(userId, key, JSON.stringify(value));
|
|
61
|
+
}
|
|
62
|
+
})();
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=user-preferences.db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-preferences.db.js","sourceRoot":"","sources":["../../../../../server/modules/database/repositories/user-preferences.db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAOjE;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,GAAkB;IAC1C,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAY,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,oDAAoD,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;;;;;OAKG;IACH,cAAc,CAAC,MAAc;QAC3B,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;2BAEmB,CACpB;aACA,GAAG,CAAC,MAAM,CAAoB,CAAC;QAElC,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,MAAc,EAAE,OAAgC;QAC9D,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;;;;wCAIkC,CACnC,CAAC;QACF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,uEAAuE,CACxE,CAAC;QAEF,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBACxB,SAAS;gBACX,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;CACF,CAAC"}
|
|
@@ -88,6 +88,29 @@ CREATE TABLE IF NOT EXISTS projects (
|
|
|
88
88
|
isArchived BOOLEAN DEFAULT 0
|
|
89
89
|
);
|
|
90
90
|
`;
|
|
91
|
+
export const SCHEDULED_MESSAGES_TABLE_SCHEMA_SQL = `
|
|
92
|
+
CREATE TABLE IF NOT EXISTS scheduled_messages (
|
|
93
|
+
id TEXT PRIMARY KEY,
|
|
94
|
+
user_id INTEGER NOT NULL,
|
|
95
|
+
session_id TEXT NOT NULL,
|
|
96
|
+
content TEXT NOT NULL,
|
|
97
|
+
-- Composer preferences (model, effort, permission mode, attachments) as
|
|
98
|
+
-- they were when the message was scheduled, so it runs the way the user
|
|
99
|
+
-- set it up rather than however the session is configured hours later.
|
|
100
|
+
options TEXT NOT NULL DEFAULT '{}',
|
|
101
|
+
-- UTC. The client sends an absolute instant so the schedule does not move
|
|
102
|
+
-- when the user changes time zone between scheduling and firing.
|
|
103
|
+
scheduled_for DATETIME NOT NULL,
|
|
104
|
+
-- pending | sent | failed | cancelled
|
|
105
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
106
|
+
-- Why a failed one failed, shown next to it in the composer.
|
|
107
|
+
failure_reason TEXT,
|
|
108
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
109
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
110
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
111
|
+
FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE
|
|
112
|
+
);
|
|
113
|
+
`;
|
|
91
114
|
export const SESSIONS_TABLE_SCHEMA_SQL = `
|
|
92
115
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
93
116
|
session_id TEXT NOT NULL,
|
|
@@ -106,6 +129,10 @@ CREATE TABLE IF NOT EXISTS sessions (
|
|
|
106
129
|
-- restores its exact runtime configuration instead of provider defaults.
|
|
107
130
|
model TEXT,
|
|
108
131
|
effort TEXT,
|
|
132
|
+
-- The app session this one was branched from, NULL for sessions created
|
|
133
|
+
-- normally. Informational only: a fork is a fully independent provider
|
|
134
|
+
-- session, and deleting the source does not affect it.
|
|
135
|
+
forked_from_session_id TEXT,
|
|
109
136
|
isArchived BOOLEAN DEFAULT 0,
|
|
110
137
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
111
138
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
@@ -135,6 +162,11 @@ CREATE TABLE IF NOT EXISTS app_config (
|
|
|
135
162
|
* controlled in each provider's `-models.provider.ts` adapter so they can be
|
|
136
163
|
* updated without migrating application data. `model_id` is unique only within
|
|
137
164
|
* a provider because different CLIs can accept the same identifier.
|
|
165
|
+
*
|
|
166
|
+
* `effort_values` (JSON array of level ids) and `effort_default` hold the
|
|
167
|
+
* reasoning-effort levels the user declared for the model; both stay NULL when
|
|
168
|
+
* none were declared. They sit after the timestamps so fresh installs match the
|
|
169
|
+
* column order that `runMigrations` produces on upgraded databases.
|
|
138
170
|
*/
|
|
139
171
|
export const PROVIDER_MODELS_TABLE_SCHEMA_SQL = `
|
|
140
172
|
CREATE TABLE IF NOT EXISTS provider_models (
|
|
@@ -145,9 +177,70 @@ CREATE TABLE IF NOT EXISTS provider_models (
|
|
|
145
177
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
146
178
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
147
179
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
180
|
+
effort_values TEXT DEFAULT NULL,
|
|
181
|
+
effort_default TEXT DEFAULT NULL,
|
|
148
182
|
UNIQUE(provider, model_id)
|
|
149
183
|
);
|
|
150
184
|
`;
|
|
185
|
+
/**
|
|
186
|
+
* Per-user application preferences that used to live in browser localStorage.
|
|
187
|
+
*
|
|
188
|
+
* One row per (user, key); `preference_value` is always a JSON document so a
|
|
189
|
+
* key can hold a scalar (`"dark"`), a flag (`false`) or a whole settings blob
|
|
190
|
+
* without the schema having to know which. Keeping them server-side is what
|
|
191
|
+
* makes a preference follow the user from one device to another.
|
|
192
|
+
*/
|
|
193
|
+
export const USER_PREFERENCES_TABLE_SCHEMA_SQL = `
|
|
194
|
+
CREATE TABLE IF NOT EXISTS user_preferences (
|
|
195
|
+
user_id INTEGER NOT NULL,
|
|
196
|
+
preference_key TEXT NOT NULL,
|
|
197
|
+
preference_value TEXT NOT NULL,
|
|
198
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
199
|
+
PRIMARY KEY (user_id, preference_key),
|
|
200
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
201
|
+
);
|
|
202
|
+
`;
|
|
203
|
+
/**
|
|
204
|
+
* Unsent composer text and queued messages, per user and per chat scope.
|
|
205
|
+
*
|
|
206
|
+
* `draft_scope` is a session id, or `project:<projectId>` for a chat that has
|
|
207
|
+
* not been sent yet and therefore has no session. Storing this server-side is
|
|
208
|
+
* what lets a message typed on a laptop be finished on a phone.
|
|
209
|
+
*/
|
|
210
|
+
export const SESSION_DRAFTS_TABLE_SCHEMA_SQL = `
|
|
211
|
+
CREATE TABLE IF NOT EXISTS session_drafts (
|
|
212
|
+
user_id INTEGER NOT NULL,
|
|
213
|
+
draft_scope TEXT NOT NULL,
|
|
214
|
+
draft_text TEXT NOT NULL DEFAULT '',
|
|
215
|
+
queued_message TEXT,
|
|
216
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
217
|
+
PRIMARY KEY (user_id, draft_scope),
|
|
218
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
219
|
+
);
|
|
220
|
+
`;
|
|
221
|
+
/**
|
|
222
|
+
* Provider sessions an app session has moved off, and must never move back to.
|
|
223
|
+
*
|
|
224
|
+
* Editing a message on a provider that cannot resume a transcript partway
|
|
225
|
+
* (Codex) is done by branching: the conversation is copied up to the edited
|
|
226
|
+
* turn and the app session follows the copy. The original transcript is left
|
|
227
|
+
* on disk untouched — nothing is deleted — but it is no longer the session's,
|
|
228
|
+
* and the indexer would otherwise rediscover it on its next full scan and hand
|
|
229
|
+
* the session back to the version the user edited away from.
|
|
230
|
+
*/
|
|
231
|
+
export const SUPERSEDED_PROVIDER_SESSIONS_TABLE_SCHEMA_SQL = `
|
|
232
|
+
CREATE TABLE IF NOT EXISTS superseded_provider_sessions (
|
|
233
|
+
provider_session_id TEXT NOT NULL,
|
|
234
|
+
provider TEXT NOT NULL,
|
|
235
|
+
session_id TEXT NOT NULL,
|
|
236
|
+
-- The transcript the session left behind. Recorded because the session row
|
|
237
|
+
-- stops pointing at it, and "delete this conversation from disk" has to
|
|
238
|
+
-- reach every file the conversation ever lived in.
|
|
239
|
+
jsonl_path TEXT,
|
|
240
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
241
|
+
PRIMARY KEY (provider_session_id, provider)
|
|
242
|
+
);
|
|
243
|
+
`;
|
|
151
244
|
export const INIT_SCHEMA_SQL = `
|
|
152
245
|
-- Initialize authentication database
|
|
153
246
|
PRAGMA foreign_keys = ON;
|
|
@@ -195,5 +288,11 @@ ${APP_CONFIG_TABLE_SCHEMA_SQL}
|
|
|
195
288
|
${PROVIDER_MODELS_TABLE_SCHEMA_SQL}
|
|
196
289
|
CREATE INDEX IF NOT EXISTS idx_provider_models_provider_order
|
|
197
290
|
ON provider_models(provider, sort_order, id);
|
|
291
|
+
|
|
292
|
+
${USER_PREFERENCES_TABLE_SCHEMA_SQL}
|
|
293
|
+
|
|
294
|
+
${SESSION_DRAFTS_TABLE_SCHEMA_SQL}
|
|
295
|
+
|
|
296
|
+
${SUPERSEDED_PROVIDER_SESSIONS_TABLE_SCHEMA_SQL}
|
|
198
297
|
`;
|
|
199
298
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../server/modules/database/schema.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG;;;;;;;;;;;;CAY7B,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;CAWxC,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAG;;;;;;;;;;;;CAYhD,CAAC;AAEF,MAAM,CAAC,MAAM,8CAA8C,GAAG;;;;;;;CAO7D,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;CAO1C,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG;;;;;;;;;;CAUlD,CAAC;AAEF,MAAM,CAAC,MAAM,+CAA+C,GAAG;;;;;;;;;;;;;;;CAe9D,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;CAQxC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../server/modules/database/schema.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG;;;;;;;;;;;;CAY7B,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;CAWxC,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAG;;;;;;;;;;;;CAYhD,CAAC;AAEF,MAAM,CAAC,MAAM,8CAA8C,GAAG;;;;;;;CAO7D,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;CAO1C,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG;;;;;;;;;;CAUlD,CAAC;AAEF,MAAM,CAAC,MAAM,+CAA+C,GAAG;;;;;;;;;;;;;;;CAe9D,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;CAQxC,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBlD,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BxC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;CAKlC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;CAM1C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;CAa/C,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG;;;;;;;;;CAShD,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;CAU9C,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,6CAA6C,GAAG;;;;;;;;;;;;CAY5D,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;EAI7B,qBAAqB;;;;;EAKrB,yBAAyB;;;;;EAKzB,iCAAiC;;;;;EAKjC,8CAA8C;;;EAG9C,2BAA2B;;EAE3B,mCAAmC;;;EAGnC,+CAA+C;;;;EAI/C,yBAAyB;;;;EAIzB,yBAAyB;;;;;EAKzB,mBAAmB;;EAEnB,2BAA2B;;EAE3B,gCAAgC;;;;EAIhC,iCAAiC;;EAEjC,+BAA+B;;EAE/B,6CAA6C;CAC9C,CAAC"}
|