wind-agent-cli 1.37.2 → 1.37.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/LICENSE +718 -718
- package/README.md +1 -1
- package/dist/api-docs.html +901 -901
- package/dist/assets/{CodeEditor-B2Wf7Fg0.js → CodeEditor-BqmxpZ_D.js} +1 -1
- package/dist/assets/{FileTree-N2IkkHlv.js → FileTree-DLE7Ioai.js} +1 -1
- package/dist/assets/{GitPanel-DZCeuFZ2.js → GitPanel-f8RMRa8D.js} +1 -1
- package/dist/assets/{MarkdownPreview-C0tqYnVu.js → MarkdownPreview-93h_1tJa.js} +1 -1
- package/dist/assets/{PluginTabContent-Bnuf-fb8.js → PluginTabContent-DU1jjkXP.js} +1 -1
- package/dist/assets/{Shell-BfFnMZ-f.js → Shell-CN_2MRIM.js} +1 -1
- package/dist/assets/{StandaloneShell-QmyYwNAl.js → StandaloneShell-D0avS8UE.js} +1 -1
- package/dist/assets/{TaskMasterPanel-fMsmvN9L.js → TaskMasterPanel-Cpf1Q5Ph.js} +3 -3
- package/dist/assets/{abnfDiagram-N423BO3Z-DjPU7HLs.js → abnfDiagram-N423BO3Z-p3aJIm4T.js} +1 -1
- package/dist/assets/{arc-Pdq6Tvr3.js → arc-CTeud6Fl.js} +1 -1
- package/dist/assets/{architectureDiagram-T3A2C74G-D0JnT0Vh.js → architectureDiagram-T3A2C74G-CG7kRCJU.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-DpaEf3mv.js → blockDiagram-VBNYF7ZC-oSjQ1SgE.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-MpqlPGFi.js → c4Diagram-5PPSVZJV-RkzF0DJV.js} +1 -1
- package/dist/assets/channel-BfQbarn9.js +1 -0
- package/dist/assets/{chunk-2GRJ4B5K-DoSdNo8u.js → chunk-2GRJ4B5K-B07uZ07O.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-CE7I3uMn.js → chunk-2Q5K7J3B-DNSfO7xS.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-B4UQ8snD.js → chunk-5RXB4S5H-BTeYcgyb.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-B55XgqHZ.js → chunk-5VM5RSS4-B7vZV0zC.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-BS1KpefW.js → chunk-6Q2QTUOP-DuS_xUGG.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-DkEPedJP.js → chunk-GF5L2VYU-CKLZ3iVD.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-DOtkNhMm.js → chunk-JWPE2WC7-DD2hcXvs.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-BXLjviqM.js → chunk-KBJHAD2P-Cz-l38qp.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-C50fjNNz.js → chunk-RYQCIY6F-DGFIU1YM.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-QBYqCkb7.js → chunk-XXDRQBXY-CmfzoYFl.js} +1 -1
- package/dist/assets/classDiagram-JCYQIIEL-Bpfe3kq7.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-Bpfe3kq7.js +1 -0
- package/dist/assets/{code-xml-VK1YfShP.js → code-xml-CLpHzEOP.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-DrVTo1Nh.js → cose-bilkent-JH36ORCC-DlFcLXCB.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-DnJa_OlQ.js → cynefin-VYW2F7L2-P1HecReO.js} +1 -1
- package/dist/assets/{cynefinDiagram-MW4NZA55-CCxBjw9E.js → cynefinDiagram-MW4NZA55-COgduz5P.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-C_GvE4lu.js → dagre-VZM6K2ZE-Bbb-siGp.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-pFzs9HEu.js → diagram-7IWD3JNH-9CWGFMYR.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-CcehQC7x.js → diagram-B4RE2ZJO-TWK59T6V.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-hfKcrrxe.js → diagram-LBJQPF4R-ErMC9yaa.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-C1semJfK.js → diagram-Q27KOJAE-Dt_-C7hV.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-57hvXQXO.js → diagram-UB23O5K3-BJ1DnRAF.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-9KIAlAVw.js → ebnfDiagram-BXEA7PRR-CE1YaQ9s.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-B7OzJ767.js → erDiagram-JOGREHBK-Bqk7N9aY.js} +1 -1
- package/dist/assets/{flowDiagram-UKHOOZJN-CJV8fQPR.js → flowDiagram-UKHOOZJN-DEr2II5V.js} +1 -1
- package/dist/assets/{ganttDiagram-PKOTCBZU-CbMNWWQu.js → ganttDiagram-PKOTCBZU-CWYAUeYN.js} +1 -1
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-I_vZ5waO.js → gitGraphDiagram-DS77QQ5N-tdEcEIM6.js} +1 -1
- package/dist/assets/{index-ZHwIojzi.js → index-B-sTfSZq.js} +1 -1
- package/dist/assets/{index-GFhXZyl2.js → index-BSe3UiFA.js} +1 -1
- package/dist/assets/{index-DFnVoqpx.js → index-B_FDMWar.js} +5 -5
- package/dist/assets/{index-DlSeAkw_.js → index-CWJtg2pR.js} +1 -1
- package/dist/assets/{infoDiagram-6WML65LV-Dh20Tsbq.js → infoDiagram-6WML65LV-A3IqRUnO.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-DH2Sm3ko.js → ishikawaDiagram-WSZJBQD7-B2uL6bkK.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-BNFQqlVu.js → journeyDiagram-NVQOT4AX-D9JB-hRW.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-B3iL0ztJ.js → kanban-definition-27J2QSJJ-DmlgiV7K.js} +1 -1
- package/dist/assets/{linear-Cwe9dEKA.js → linear-Ct_eoJQk.js} +1 -1
- package/dist/assets/{mermaid.core-BYRQSshi.js → mermaid.core-CQ698HNn.js} +5 -5
- package/dist/assets/{mindmap-definition-FAOFIHXS-BgfBYMzr.js → mindmap-definition-FAOFIHXS-DGtMgQhf.js} +1 -1
- package/dist/assets/{pegDiagram-VL7TDLO6-CNYpECr8.js → pegDiagram-VL7TDLO6-CO6vP4n9.js} +1 -1
- package/dist/assets/{pieDiagram-7S7Q4E2Y-DeSrxc4I.js → pieDiagram-7S7Q4E2Y-DMkt_Zfr.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-BXVVQsa6.js → quadrantDiagram-CIZ2JOQS-DgNxRz6t.js} +1 -1
- package/dist/assets/{railroadDiagram-AXF67PYL-JTroIW8F.js → railroadDiagram-AXF67PYL-DKz9UqA9.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-C1Z_inLz.js → requirementDiagram-LRYGKXZP-L84XyGgV.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-DCJgKFUk.js → sankeyDiagram-W5VNT64P-CQqWbJ3j.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-D8Wrx5Vc.js → sequenceDiagram-SI44F4Z6--tnzS2tb.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-CXqD68vD.js → sizeCapture-X5ZJPWSS-DujwEOtm.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-CF0Ekqjo.js → stateDiagram-OKZ733FA-BK3TcZY2.js} +1 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-_medyomK.js +1 -0
- package/dist/assets/{swimlanes-SLNWSIFB-DVIax_k4.js → swimlanes-SLNWSIFB-naX-Uv1B.js} +2 -2
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DstIv3TC.js +8 -0
- package/dist/assets/{timeline-definition-Z64GVDOM-DSqk3ApG.js → timeline-definition-Z64GVDOM-C-vP_ddU.js} +1 -1
- package/dist/assets/{vennDiagram-T6HMQDX7-DNbTqyG5.js → vennDiagram-T6HMQDX7-DN-I7o-7.js} +1 -1
- package/dist/assets/{wardleyDiagram-T6FBY63Y-BNCpsFZV.js → wardleyDiagram-T6FBY63Y-Db9dsaXv.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M-XsVZphHr.js → xychartDiagram-ELKLHX3M-DE6OxW_p.js} +1 -1
- package/dist/clear-cache.html +85 -85
- package/dist/convert-icons.md +52 -52
- package/dist/favicon.svg +8 -8
- package/dist/generate-icons.js +48 -48
- package/dist/icons/codex-white.svg +3 -3
- package/dist/icons/codex.svg +3 -3
- package/dist/icons/cursor-white.svg +11 -11
- package/dist/icons/icon-128x128.svg +11 -11
- package/dist/icons/icon-144x144.svg +11 -11
- package/dist/icons/icon-152x152.svg +11 -11
- package/dist/icons/icon-192x192.svg +11 -11
- package/dist/icons/icon-384x384.svg +11 -11
- package/dist/icons/icon-512x512.svg +11 -11
- package/dist/icons/icon-72x72.svg +11 -11
- package/dist/icons/icon-96x96.svg +11 -11
- package/dist/icons/icon-template.svg +11 -11
- package/dist/index.html +56 -56
- package/dist/logo.svg +17 -17
- package/dist/manifest.json +60 -60
- package/dist/sw.js +124 -124
- package/dist-server/server/modules/cli/cli.service.js +36 -36
- package/dist-server/server/modules/cli/sandbox.service.js +38 -38
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +74 -74
- package/dist-server/server/modules/commands/commands.routes.js +24 -24
- package/dist-server/server/modules/database/migrations.js +190 -190
- package/dist-server/server/modules/database/repositories/api-keys.js +3 -3
- package/dist-server/server/modules/database/repositories/github-tokens.js +2 -2
- package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +28 -28
- package/dist-server/server/modules/database/repositories/notification-preferences.js +4 -4
- package/dist-server/server/modules/database/repositories/projects.db.js +61 -61
- package/dist-server/server/modules/database/repositories/provider-models.js +35 -35
- package/dist-server/server/modules/database/repositories/push-subscriptions.js +5 -5
- package/dist-server/server/modules/database/repositories/scan-state.db.js +5 -5
- package/dist-server/server/modules/database/repositories/sessions.db.js +92 -92
- package/dist-server/server/modules/database/schema.js +177 -177
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +6 -6
- package/dist-server/server/modules/git/git.routes.js +17 -17
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +12 -12
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +9 -9
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +17 -17
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +25 -25
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +27 -27
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js +9 -9
- package/dist-server/server/modules/providers/tests/mcp.test.js +3 -3
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +96 -96
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +18 -18
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js +419 -419
- package/electron/cloud.js +260 -260
- package/electron/desktopNotifications.js +378 -378
- package/electron/desktopWindow.js +766 -766
- package/electron/launcher/index.html +14 -14
- package/electron/launcher/launcher.css +801 -801
- package/electron/launcher/launcher.js +687 -687
- package/electron/localServer.js +549 -549
- package/electron/main.js +944 -944
- package/electron/preload.cjs +60 -60
- package/electron/scripts/generate-macos-icon.js +62 -62
- package/electron/serverInstaller.js +277 -277
- package/electron/tabs.js +87 -87
- package/electron/viewHost.js +331 -331
- package/package.json +250 -247
- package/public/api-docs.html +901 -901
- package/scripts/fix-node-pty.js +67 -67
- package/scripts/promote-dist-server.mjs +50 -50
- package/scripts/release/build-server-bundle.js +176 -176
- package/scripts/release/prepare-desktop-app.js +152 -152
- package/server/index.ts +399 -399
- package/server/load-env.ts +47 -47
- package/server/modules/agent/agent.module.ts +52 -52
- package/server/modules/agent/agent.routes.ts +1287 -1287
- package/server/modules/agent/index.ts +2 -2
- package/server/modules/agent/tests/agent.routes.test.ts +205 -205
- package/server/modules/assets/assets.routes.ts +150 -150
- package/server/modules/assets/index.ts +3 -3
- package/server/modules/assets/services/image-assets.service.ts +127 -127
- package/server/modules/assets/tests/image-assets.service.test.ts +74 -74
- package/server/modules/auth/auth.middleware.ts +163 -163
- package/server/modules/auth/auth.module.ts +38 -38
- package/server/modules/auth/auth.routes.ts +57 -57
- package/server/modules/auth/auth.service.ts +155 -155
- package/server/modules/auth/index.ts +9 -9
- package/server/modules/auth/tests/auth.service.test.ts +95 -95
- package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -120
- package/server/modules/browser-use/browser-use-mcp.ts +386 -386
- package/server/modules/browser-use/browser-use-runtime.ts +10 -10
- package/server/modules/browser-use/browser-use.routes.ts +96 -96
- package/server/modules/browser-use/browser-use.service.ts +836 -836
- package/server/modules/browser-use/index.ts +11 -11
- package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -10
- package/server/modules/cli/cli.module.ts +93 -93
- package/server/modules/cli/cli.service.ts +248 -248
- package/server/modules/cli/cli.ts +19 -19
- package/server/modules/cli/index.ts +2 -2
- package/server/modules/cli/sandbox.service.ts +398 -398
- package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -186
- package/server/modules/cli/tests/cli.service.test.ts +86 -86
- package/server/modules/cli/tests/sandbox.service.test.ts +58 -58
- package/server/modules/commands/commands.module.ts +22 -22
- package/server/modules/commands/commands.routes.ts +586 -586
- package/server/modules/commands/index.ts +2 -2
- package/server/modules/commands/tests/commands.test.ts +109 -109
- package/server/modules/database/connection.ts +143 -143
- package/server/modules/database/index.ts +17 -17
- package/server/modules/database/init-db.ts +17 -17
- package/server/modules/database/migrations.ts +515 -515
- package/server/modules/database/repositories/api-keys.ts +119 -119
- package/server/modules/database/repositories/app-config.ts +53 -53
- package/server/modules/database/repositories/credentials.ts +106 -106
- package/server/modules/database/repositories/github-tokens.ts +100 -100
- package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -153
- package/server/modules/database/repositories/notification-preferences.ts +117 -117
- package/server/modules/database/repositories/projects.db.ts +196 -196
- package/server/modules/database/repositories/provider-models.ts +168 -168
- package/server/modules/database/repositories/push-subscriptions.ts +80 -80
- package/server/modules/database/repositories/scan-state.db.ts +42 -42
- package/server/modules/database/repositories/sessions.db.ts +524 -524
- package/server/modules/database/repositories/users.ts +140 -140
- package/server/modules/database/repositories/vapid-keys.ts +57 -57
- package/server/modules/database/schema.ts +210 -210
- package/server/modules/database/tests/projects.db.integration.test.ts +72 -72
- package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -125
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -109
- package/server/modules/database/tests/sessions.db.integration.test.ts +116 -116
- package/server/modules/file-tree/file-tree.module.ts +116 -116
- package/server/modules/file-tree/file-tree.routes.ts +258 -258
- package/server/modules/file-tree/file-tree.service.ts +675 -675
- package/server/modules/file-tree/index.ts +2 -2
- package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -157
- package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -371
- package/server/modules/git/git-branch.service.ts +43 -43
- package/server/modules/git/git-parsing.service.ts +66 -66
- package/server/modules/git/git.module.ts +22 -22
- package/server/modules/git/git.routes.ts +1596 -1596
- package/server/modules/git/index.ts +2 -2
- package/server/modules/git/tests/git-branch.service.test.ts +60 -60
- package/server/modules/git/tests/git-init.routes.test.ts +132 -132
- package/server/modules/git/tests/git.test.ts +106 -106
- package/server/modules/notifications/index.ts +24 -24
- package/server/modules/notifications/notifications.routes.ts +127 -127
- package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -124
- package/server/modules/notifications/services/notification-orchestrator.service.js +310 -310
- package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -55
- package/server/modules/notifications/vapid-keys.service.ts +38 -38
- package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -109
- package/server/modules/plugins/index.ts +9 -9
- package/server/modules/plugins/plugin-process.service.ts +217 -217
- package/server/modules/plugins/plugin-registry.service.ts +459 -459
- package/server/modules/plugins/plugins.module.ts +33 -33
- package/server/modules/plugins/plugins.routes.ts +66 -66
- package/server/modules/plugins/plugins.service.ts +147 -147
- package/server/modules/plugins/tests/plugins.service.test.ts +32 -32
- package/server/modules/projects/index.ts +11 -11
- package/server/modules/projects/projects.routes.ts +273 -273
- package/server/modules/projects/services/project-clone.service.ts +323 -323
- package/server/modules/projects/services/project-delete.service.ts +90 -90
- package/server/modules/projects/services/project-management.service.ts +144 -144
- package/server/modules/projects/services/project-star.service.ts +78 -78
- package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -248
- package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -314
- package/server/modules/projects/tests/project-clone.service.test.ts +183 -183
- package/server/modules/projects/tests/project-management.service.test.ts +117 -117
- package/server/modules/projects/tests/project-star.service.test.ts +123 -123
- package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -105
- package/server/modules/providers/README.md +380 -380
- package/server/modules/providers/index.ts +10 -10
- package/server/modules/providers/list/claude/claude-auth.provider.ts +160 -160
- package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -135
- package/server/modules/providers/list/claude/claude-models.provider.ts +294 -294
- package/server/modules/providers/list/claude/claude-runtime.provider.js +1068 -1068
- package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -203
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +684 -684
- package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -265
- package/server/modules/providers/list/claude/claude.provider.ts +30 -30
- package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -100
- package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -135
- package/server/modules/providers/list/codex/codex-models.provider.ts +123 -123
- package/server/modules/providers/list/codex/codex-runtime.provider.js +533 -533
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +203 -203
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +938 -938
- package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -73
- package/server/modules/providers/list/codex/codex.provider.ts +28 -28
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -143
- package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -108
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -119
- package/server/modules/providers/list/cursor/cursor-runtime.provider.js +385 -385
- package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +159 -159
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -654
- package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -39
- package/server/modules/providers/list/cursor/cursor.provider.ts +30 -30
- package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -110
- package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -228
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +203 -203
- package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -434
- package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -261
- package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -179
- package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -500
- package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -78
- package/server/modules/providers/list/opencode/opencode.provider.ts +30 -30
- package/server/modules/providers/provider.registry.ts +36 -36
- package/server/modules/providers/provider.routes.ts +877 -877
- package/server/modules/providers/services/mcp.service.ts +109 -109
- package/server/modules/providers/services/provider-auth.service.ts +26 -26
- package/server/modules/providers/services/provider-capabilities.service.ts +97 -97
- package/server/modules/providers/services/provider-models.service.ts +401 -401
- package/server/modules/providers/services/provider-runtime.service.ts +108 -108
- package/server/modules/providers/services/provider-token-usage.service.ts +357 -357
- package/server/modules/providers/services/session-conversations-search.service.ts +1321 -1321
- package/server/modules/providers/services/session-synchronizer.service.ts +74 -74
- package/server/modules/providers/services/sessions-watcher.service.ts +247 -247
- package/server/modules/providers/services/sessions.service.ts +471 -471
- package/server/modules/providers/services/skills.service.ts +39 -39
- package/server/modules/providers/shared/base/abstract.provider.ts +32 -32
- package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -151
- package/server/modules/providers/shared/skills/skills.provider.ts +287 -287
- package/server/modules/providers/tests/claude-auth.test.ts +150 -150
- package/server/modules/providers/tests/claude-sessions.test.ts +61 -61
- package/server/modules/providers/tests/codex-sessions.test.ts +231 -231
- package/server/modules/providers/tests/mcp.test.ts +349 -349
- package/server/modules/providers/tests/opencode-models.test.ts +41 -41
- package/server/modules/providers/tests/opencode-sessions.test.ts +522 -522
- package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -247
- package/server/modules/providers/tests/provider-models.service.test.ts +353 -353
- package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -138
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -186
- package/server/modules/providers/tests/provider.routes.test.ts +244 -244
- package/server/modules/providers/tests/sessions-details.test.ts +73 -73
- package/server/modules/providers/tests/sessions.service.test.ts +127 -127
- package/server/modules/providers/tests/skills.test.ts +692 -692
- package/server/modules/settings/index.ts +2 -2
- package/server/modules/settings/settings.module.ts +50 -50
- package/server/modules/settings/settings.routes.ts +51 -51
- package/server/modules/settings/settings.service.ts +186 -186
- package/server/modules/settings/tests/settings.service.test.ts +54 -54
- package/server/modules/system/index.ts +2 -2
- package/server/modules/system/system.module.ts +62 -62
- package/server/modules/system/system.routes.ts +21 -21
- package/server/modules/system/system.service.ts +76 -76
- package/server/modules/system/tests/system.service.test.ts +118 -118
- package/server/modules/taskmaster/index.ts +2 -2
- package/server/modules/taskmaster/taskmaster.module.ts +24 -24
- package/server/modules/taskmaster/taskmaster.routes.ts +1482 -1482
- package/server/modules/taskmaster/taskmaster.service.ts +132 -132
- package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -144
- package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -97
- package/server/modules/user/index.ts +2 -2
- package/server/modules/user/tests/user.service.test.ts +61 -61
- package/server/modules/user/user.module.ts +58 -58
- package/server/modules/user/user.routes.ts +50 -50
- package/server/modules/user/user.service.ts +85 -85
- package/server/modules/voice/index.ts +2 -2
- package/server/modules/voice/tests/voice.service.test.ts +98 -98
- package/server/modules/voice/voice.module.ts +47 -47
- package/server/modules/voice/voice.routes.ts +113 -113
- package/server/modules/voice/voice.service.ts +192 -192
- package/server/modules/websocket/README.md +273 -273
- package/server/modules/websocket/index.ts +3 -3
- package/server/modules/websocket/services/chat-run-registry.service.ts +343 -343
- package/server/modules/websocket/services/chat-session-writer.service.ts +145 -145
- package/server/modules/websocket/services/chat-websocket.service.ts +425 -425
- package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -65
- package/server/modules/websocket/services/shell-websocket.service.ts +502 -502
- package/server/modules/websocket/services/websocket-auth.service.ts +59 -59
- package/server/modules/websocket/services/websocket-server.service.ts +124 -124
- package/server/modules/websocket/services/websocket-state.service.ts +16 -16
- package/server/modules/websocket/services/websocket-writer.service.ts +38 -38
- package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -59
- package/server/modules/websocket/tests/chat-run-registry.test.ts +282 -282
- package/server/modules/websocket/tests/shell-websocket.service.test.ts +100 -100
- package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -78
- package/server/modules/worktrees/index.ts +2 -2
- package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -53
- package/server/modules/worktrees/services/worktree-create.service.ts +104 -104
- package/server/modules/worktrees/services/worktree-git.service.ts +207 -207
- package/server/modules/worktrees/services/worktree-list.service.ts +143 -143
- package/server/modules/worktrees/services/worktree-merge.service.ts +157 -157
- package/server/modules/worktrees/services/worktree-open.service.ts +85 -85
- package/server/modules/worktrees/services/worktree-remove.service.ts +88 -88
- package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -68
- package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -142
- package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -84
- package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -45
- package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -213
- package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -122
- package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -227
- package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -199
- package/server/modules/worktrees/worktrees.module.ts +113 -113
- package/server/modules/worktrees/worktrees.routes.ts +116 -116
- package/server/shared/claude-cli-path.ts +139 -139
- package/server/shared/frontmatter.ts +18 -18
- package/server/shared/image-attachments.ts +435 -435
- package/server/shared/interfaces.ts +179 -179
- package/server/shared/tests/claude-cli-path.test.ts +61 -61
- package/server/shared/tests/image-attachments.test.ts +353 -353
- package/server/shared/tests/slice-tail-page.test.ts +42 -42
- package/server/shared/types.ts +1226 -1226
- package/server/shared/utils.ts +1161 -1161
- package/server/tsconfig.json +40 -40
- package/shared/networkHosts.js +22 -22
- package/dist/assets/channel-Bm0ZLE4z.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-DqEOcNxw.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-DqEOcNxw.js +0 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-DARLpEFJ.js +0 -1
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-CrgDgaY8.js +0 -8
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
import { getConnection } from '@/modules/database/connection.js';
|
|
2
|
-
import type {
|
|
3
|
-
CustomProviderModelInput,
|
|
4
|
-
CustomProviderModelRecord,
|
|
5
|
-
LLMProvider,
|
|
6
|
-
} from '@/shared/types.js';
|
|
7
|
-
|
|
8
|
-
type CustomProviderModelRow = {
|
|
9
|
-
id: number;
|
|
10
|
-
provider: LLMProvider;
|
|
11
|
-
model_id: string;
|
|
12
|
-
model_name: string;
|
|
13
|
-
sort_order: number;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const toCustomProviderModelRecord = (
|
|
17
|
-
row: CustomProviderModelRow,
|
|
18
|
-
): CustomProviderModelRecord => ({
|
|
19
|
-
recordId: row.id,
|
|
20
|
-
provider: row.provider,
|
|
21
|
-
modelId: row.model_id,
|
|
22
|
-
model: row.model_name,
|
|
23
|
-
sortOrder: row.sort_order,
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
const readCustomProviderModelRow = (
|
|
27
|
-
provider: LLMProvider,
|
|
28
|
-
recordId: number,
|
|
29
|
-
): CustomProviderModelRow | null => {
|
|
30
|
-
const row = getConnection().prepare(`
|
|
31
|
-
SELECT id, provider, model_id, model_name, sort_order
|
|
32
|
-
FROM provider_models
|
|
33
|
-
WHERE provider = ? AND id = ?
|
|
34
|
-
`).get(provider, recordId) as CustomProviderModelRow | undefined;
|
|
35
|
-
|
|
36
|
-
return row ?? null;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Custom provider-model persistence API consumed by the Providers module.
|
|
41
|
-
*
|
|
42
|
-
* Every row in this repository is user-created. Predefined models are owned by
|
|
43
|
-
* provider adapters and never enter this table. Model-id changes are propagated
|
|
44
|
-
* to stored sessions, while deletion replaces affected session selections with
|
|
45
|
-
* the predefined default supplied by the Providers service.
|
|
46
|
-
*/
|
|
47
|
-
export const providerModelsDb = {
|
|
48
|
-
listCustomProviderModels(provider: LLMProvider): CustomProviderModelRecord[] {
|
|
49
|
-
const rows = getConnection().prepare(`
|
|
50
|
-
SELECT id, provider, model_id, model_name, sort_order
|
|
51
|
-
FROM provider_models
|
|
52
|
-
WHERE provider = ?
|
|
53
|
-
ORDER BY sort_order ASC, lower(model_name) ASC, id ASC
|
|
54
|
-
`).all(provider) as CustomProviderModelRow[];
|
|
55
|
-
|
|
56
|
-
return rows.map(toCustomProviderModelRecord);
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
getCustomProviderModel(
|
|
60
|
-
provider: LLMProvider,
|
|
61
|
-
recordId: number,
|
|
62
|
-
): CustomProviderModelRecord | null {
|
|
63
|
-
const row = readCustomProviderModelRow(provider, recordId);
|
|
64
|
-
return row ? toCustomProviderModelRecord(row) : null;
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
findCustomProviderModelByModelId(
|
|
68
|
-
provider: LLMProvider,
|
|
69
|
-
modelId: string,
|
|
70
|
-
): CustomProviderModelRecord | null {
|
|
71
|
-
const row = getConnection().prepare(`
|
|
72
|
-
SELECT id, provider, model_id, model_name, sort_order
|
|
73
|
-
FROM provider_models
|
|
74
|
-
WHERE provider = ? AND model_id = ?
|
|
75
|
-
`).get(provider, modelId) as CustomProviderModelRow | undefined;
|
|
76
|
-
|
|
77
|
-
return row ? toCustomProviderModelRecord(row) : null;
|
|
78
|
-
},
|
|
79
|
-
|
|
80
|
-
createCustomProviderModel(
|
|
81
|
-
provider: LLMProvider,
|
|
82
|
-
input: CustomProviderModelInput,
|
|
83
|
-
): CustomProviderModelRecord {
|
|
84
|
-
const db = getConnection();
|
|
85
|
-
const nextOrder = db.prepare(`
|
|
86
|
-
SELECT COALESCE(MAX(sort_order), -1) + 1 AS next_order
|
|
87
|
-
FROM provider_models
|
|
88
|
-
WHERE provider = ?
|
|
89
|
-
`).get(provider) as { next_order: number };
|
|
90
|
-
|
|
91
|
-
const result = db.prepare(`
|
|
92
|
-
INSERT INTO provider_models (provider, model_id, model_name, sort_order)
|
|
93
|
-
VALUES (?, ?, ?, ?)
|
|
94
|
-
`).run(provider, input.id, input.model, nextOrder.next_order);
|
|
95
|
-
|
|
96
|
-
const row = readCustomProviderModelRow(provider, Number(result.lastInsertRowid));
|
|
97
|
-
if (!row) {
|
|
98
|
-
throw new Error('Created provider model could not be read back.');
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return toCustomProviderModelRecord(row);
|
|
102
|
-
},
|
|
103
|
-
|
|
104
|
-
updateCustomProviderModel(
|
|
105
|
-
provider: LLMProvider,
|
|
106
|
-
recordId: number,
|
|
107
|
-
input: CustomProviderModelInput,
|
|
108
|
-
): CustomProviderModelRecord | null {
|
|
109
|
-
const db = getConnection();
|
|
110
|
-
const update = db.transaction(() => {
|
|
111
|
-
const previous = readCustomProviderModelRow(provider, recordId);
|
|
112
|
-
if (!previous) {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
db.prepare(`
|
|
117
|
-
UPDATE provider_models
|
|
118
|
-
SET model_id = ?, model_name = ?, updated_at = CURRENT_TIMESTAMP
|
|
119
|
-
WHERE provider = ? AND id = ?
|
|
120
|
-
`).run(input.id, input.model, provider, recordId);
|
|
121
|
-
|
|
122
|
-
if (previous.model_id !== input.id) {
|
|
123
|
-
db.prepare(`
|
|
124
|
-
UPDATE sessions
|
|
125
|
-
SET model = ?, updated_at = CURRENT_TIMESTAMP
|
|
126
|
-
WHERE provider = ? AND model = ?
|
|
127
|
-
`).run(input.id, provider, previous.model_id);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return readCustomProviderModelRow(provider, recordId);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
const row = update();
|
|
134
|
-
return row ? toCustomProviderModelRecord(row) : null;
|
|
135
|
-
},
|
|
136
|
-
|
|
137
|
-
deleteCustomProviderModel(
|
|
138
|
-
provider: LLMProvider,
|
|
139
|
-
recordId: number,
|
|
140
|
-
fallbackModelId: string,
|
|
141
|
-
): CustomProviderModelRecord | null {
|
|
142
|
-
const db = getConnection();
|
|
143
|
-
const remove = db.transaction(() => {
|
|
144
|
-
const row = readCustomProviderModelRow(provider, recordId);
|
|
145
|
-
if (!row) {
|
|
146
|
-
return null;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// The effort is cleared alongside the model because it was chosen for the
|
|
150
|
-
// deleted model; replaced sessions resume on the fallback model's default.
|
|
151
|
-
db.prepare(`
|
|
152
|
-
UPDATE sessions
|
|
153
|
-
SET model = ?, effort = NULL, updated_at = CURRENT_TIMESTAMP
|
|
154
|
-
WHERE provider = ? AND model = ?
|
|
155
|
-
`).run(fallbackModelId, provider, row.model_id);
|
|
156
|
-
|
|
157
|
-
db.prepare(`
|
|
158
|
-
DELETE FROM provider_models
|
|
159
|
-
WHERE provider = ? AND id = ?
|
|
160
|
-
`).run(provider, recordId);
|
|
161
|
-
|
|
162
|
-
return row;
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
const row = remove();
|
|
166
|
-
return row ? toCustomProviderModelRecord(row) : null;
|
|
167
|
-
},
|
|
168
|
-
};
|
|
1
|
+
import { getConnection } from '@/modules/database/connection.js';
|
|
2
|
+
import type {
|
|
3
|
+
CustomProviderModelInput,
|
|
4
|
+
CustomProviderModelRecord,
|
|
5
|
+
LLMProvider,
|
|
6
|
+
} from '@/shared/types.js';
|
|
7
|
+
|
|
8
|
+
type CustomProviderModelRow = {
|
|
9
|
+
id: number;
|
|
10
|
+
provider: LLMProvider;
|
|
11
|
+
model_id: string;
|
|
12
|
+
model_name: string;
|
|
13
|
+
sort_order: number;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const toCustomProviderModelRecord = (
|
|
17
|
+
row: CustomProviderModelRow,
|
|
18
|
+
): CustomProviderModelRecord => ({
|
|
19
|
+
recordId: row.id,
|
|
20
|
+
provider: row.provider,
|
|
21
|
+
modelId: row.model_id,
|
|
22
|
+
model: row.model_name,
|
|
23
|
+
sortOrder: row.sort_order,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const readCustomProviderModelRow = (
|
|
27
|
+
provider: LLMProvider,
|
|
28
|
+
recordId: number,
|
|
29
|
+
): CustomProviderModelRow | null => {
|
|
30
|
+
const row = getConnection().prepare(`
|
|
31
|
+
SELECT id, provider, model_id, model_name, sort_order
|
|
32
|
+
FROM provider_models
|
|
33
|
+
WHERE provider = ? AND id = ?
|
|
34
|
+
`).get(provider, recordId) as CustomProviderModelRow | undefined;
|
|
35
|
+
|
|
36
|
+
return row ?? null;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Custom provider-model persistence API consumed by the Providers module.
|
|
41
|
+
*
|
|
42
|
+
* Every row in this repository is user-created. Predefined models are owned by
|
|
43
|
+
* provider adapters and never enter this table. Model-id changes are propagated
|
|
44
|
+
* to stored sessions, while deletion replaces affected session selections with
|
|
45
|
+
* the predefined default supplied by the Providers service.
|
|
46
|
+
*/
|
|
47
|
+
export const providerModelsDb = {
|
|
48
|
+
listCustomProviderModels(provider: LLMProvider): CustomProviderModelRecord[] {
|
|
49
|
+
const rows = getConnection().prepare(`
|
|
50
|
+
SELECT id, provider, model_id, model_name, sort_order
|
|
51
|
+
FROM provider_models
|
|
52
|
+
WHERE provider = ?
|
|
53
|
+
ORDER BY sort_order ASC, lower(model_name) ASC, id ASC
|
|
54
|
+
`).all(provider) as CustomProviderModelRow[];
|
|
55
|
+
|
|
56
|
+
return rows.map(toCustomProviderModelRecord);
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
getCustomProviderModel(
|
|
60
|
+
provider: LLMProvider,
|
|
61
|
+
recordId: number,
|
|
62
|
+
): CustomProviderModelRecord | null {
|
|
63
|
+
const row = readCustomProviderModelRow(provider, recordId);
|
|
64
|
+
return row ? toCustomProviderModelRecord(row) : null;
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
findCustomProviderModelByModelId(
|
|
68
|
+
provider: LLMProvider,
|
|
69
|
+
modelId: string,
|
|
70
|
+
): CustomProviderModelRecord | null {
|
|
71
|
+
const row = getConnection().prepare(`
|
|
72
|
+
SELECT id, provider, model_id, model_name, sort_order
|
|
73
|
+
FROM provider_models
|
|
74
|
+
WHERE provider = ? AND model_id = ?
|
|
75
|
+
`).get(provider, modelId) as CustomProviderModelRow | undefined;
|
|
76
|
+
|
|
77
|
+
return row ? toCustomProviderModelRecord(row) : null;
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
createCustomProviderModel(
|
|
81
|
+
provider: LLMProvider,
|
|
82
|
+
input: CustomProviderModelInput,
|
|
83
|
+
): CustomProviderModelRecord {
|
|
84
|
+
const db = getConnection();
|
|
85
|
+
const nextOrder = db.prepare(`
|
|
86
|
+
SELECT COALESCE(MAX(sort_order), -1) + 1 AS next_order
|
|
87
|
+
FROM provider_models
|
|
88
|
+
WHERE provider = ?
|
|
89
|
+
`).get(provider) as { next_order: number };
|
|
90
|
+
|
|
91
|
+
const result = db.prepare(`
|
|
92
|
+
INSERT INTO provider_models (provider, model_id, model_name, sort_order)
|
|
93
|
+
VALUES (?, ?, ?, ?)
|
|
94
|
+
`).run(provider, input.id, input.model, nextOrder.next_order);
|
|
95
|
+
|
|
96
|
+
const row = readCustomProviderModelRow(provider, Number(result.lastInsertRowid));
|
|
97
|
+
if (!row) {
|
|
98
|
+
throw new Error('Created provider model could not be read back.');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return toCustomProviderModelRecord(row);
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
updateCustomProviderModel(
|
|
105
|
+
provider: LLMProvider,
|
|
106
|
+
recordId: number,
|
|
107
|
+
input: CustomProviderModelInput,
|
|
108
|
+
): CustomProviderModelRecord | null {
|
|
109
|
+
const db = getConnection();
|
|
110
|
+
const update = db.transaction(() => {
|
|
111
|
+
const previous = readCustomProviderModelRow(provider, recordId);
|
|
112
|
+
if (!previous) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
db.prepare(`
|
|
117
|
+
UPDATE provider_models
|
|
118
|
+
SET model_id = ?, model_name = ?, updated_at = CURRENT_TIMESTAMP
|
|
119
|
+
WHERE provider = ? AND id = ?
|
|
120
|
+
`).run(input.id, input.model, provider, recordId);
|
|
121
|
+
|
|
122
|
+
if (previous.model_id !== input.id) {
|
|
123
|
+
db.prepare(`
|
|
124
|
+
UPDATE sessions
|
|
125
|
+
SET model = ?, updated_at = CURRENT_TIMESTAMP
|
|
126
|
+
WHERE provider = ? AND model = ?
|
|
127
|
+
`).run(input.id, provider, previous.model_id);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return readCustomProviderModelRow(provider, recordId);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const row = update();
|
|
134
|
+
return row ? toCustomProviderModelRecord(row) : null;
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
deleteCustomProviderModel(
|
|
138
|
+
provider: LLMProvider,
|
|
139
|
+
recordId: number,
|
|
140
|
+
fallbackModelId: string,
|
|
141
|
+
): CustomProviderModelRecord | null {
|
|
142
|
+
const db = getConnection();
|
|
143
|
+
const remove = db.transaction(() => {
|
|
144
|
+
const row = readCustomProviderModelRow(provider, recordId);
|
|
145
|
+
if (!row) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// The effort is cleared alongside the model because it was chosen for the
|
|
150
|
+
// deleted model; replaced sessions resume on the fallback model's default.
|
|
151
|
+
db.prepare(`
|
|
152
|
+
UPDATE sessions
|
|
153
|
+
SET model = ?, effort = NULL, updated_at = CURRENT_TIMESTAMP
|
|
154
|
+
WHERE provider = ? AND model = ?
|
|
155
|
+
`).run(fallbackModelId, provider, row.model_id);
|
|
156
|
+
|
|
157
|
+
db.prepare(`
|
|
158
|
+
DELETE FROM provider_models
|
|
159
|
+
WHERE provider = ? AND id = ?
|
|
160
|
+
`).run(provider, recordId);
|
|
161
|
+
|
|
162
|
+
return row;
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
const row = remove();
|
|
166
|
+
return row ? toCustomProviderModelRecord(row) : null;
|
|
167
|
+
},
|
|
168
|
+
};
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Push subscriptions repository.
|
|
3
|
-
*
|
|
4
|
-
* Persists browser push subscription endpoints and keys per user.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { getConnection } from '@/modules/database/connection.js';
|
|
8
|
-
|
|
9
|
-
type PushSubscriptionLookupRow = {
|
|
10
|
-
endpoint: string;
|
|
11
|
-
keys_p256dh: string;
|
|
12
|
-
keys_auth: string;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export const pushSubscriptionsDb = {
|
|
16
|
-
/** Upserts a push subscription endpoint for a user. */
|
|
17
|
-
createPushSubscription(
|
|
18
|
-
userId: number,
|
|
19
|
-
endpoint: string,
|
|
20
|
-
keysP256dh: string,
|
|
21
|
-
keysAuth: string
|
|
22
|
-
): void {
|
|
23
|
-
const db = getConnection();
|
|
24
|
-
db.prepare(
|
|
25
|
-
`INSERT INTO push_subscriptions (user_id, endpoint, keys_p256dh, keys_auth)
|
|
26
|
-
VALUES (?, ?, ?, ?)
|
|
27
|
-
ON CONFLICT(endpoint) DO UPDATE SET
|
|
28
|
-
user_id = excluded.user_id,
|
|
29
|
-
keys_p256dh = excluded.keys_p256dh,
|
|
30
|
-
keys_auth = excluded.keys_auth`
|
|
31
|
-
).run(userId, endpoint, keysP256dh, keysAuth);
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
/** Returns all subscriptions for a user. */
|
|
35
|
-
getPushSubscriptions(userId: number): PushSubscriptionLookupRow[] {
|
|
36
|
-
const db = getConnection();
|
|
37
|
-
return db
|
|
38
|
-
.prepare(
|
|
39
|
-
'SELECT endpoint, keys_p256dh, keys_auth FROM push_subscriptions WHERE user_id = ?'
|
|
40
|
-
)
|
|
41
|
-
.all(userId) as PushSubscriptionLookupRow[];
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
/** Deletes one subscription by endpoint. */
|
|
45
|
-
deletePushSubscription(endpoint: string): void {
|
|
46
|
-
const db = getConnection();
|
|
47
|
-
db.prepare('DELETE FROM push_subscriptions WHERE endpoint = ?').run(endpoint);
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
/** Deletes all subscriptions for a user. */
|
|
51
|
-
deletePushSubscriptionsForUser(userId: number): void {
|
|
52
|
-
const db = getConnection();
|
|
53
|
-
db.prepare('DELETE FROM push_subscriptions WHERE user_id = ?').run(userId);
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
// Legacy aliases used by existing services/routes
|
|
57
|
-
saveSubscription(
|
|
58
|
-
userId: number,
|
|
59
|
-
endpoint: string,
|
|
60
|
-
keysP256dh: string,
|
|
61
|
-
keysAuth: string
|
|
62
|
-
): void {
|
|
63
|
-
pushSubscriptionsDb.createPushSubscription(
|
|
64
|
-
userId,
|
|
65
|
-
endpoint,
|
|
66
|
-
keysP256dh,
|
|
67
|
-
keysAuth
|
|
68
|
-
);
|
|
69
|
-
},
|
|
70
|
-
getSubscriptions(userId: number): PushSubscriptionLookupRow[] {
|
|
71
|
-
return pushSubscriptionsDb.getPushSubscriptions(userId);
|
|
72
|
-
},
|
|
73
|
-
removeSubscription(endpoint: string): void {
|
|
74
|
-
pushSubscriptionsDb.deletePushSubscription(endpoint);
|
|
75
|
-
},
|
|
76
|
-
removeAllForUser(userId: number): void {
|
|
77
|
-
pushSubscriptionsDb.deletePushSubscriptionsForUser(userId);
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Push subscriptions repository.
|
|
3
|
+
*
|
|
4
|
+
* Persists browser push subscription endpoints and keys per user.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { getConnection } from '@/modules/database/connection.js';
|
|
8
|
+
|
|
9
|
+
type PushSubscriptionLookupRow = {
|
|
10
|
+
endpoint: string;
|
|
11
|
+
keys_p256dh: string;
|
|
12
|
+
keys_auth: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const pushSubscriptionsDb = {
|
|
16
|
+
/** Upserts a push subscription endpoint for a user. */
|
|
17
|
+
createPushSubscription(
|
|
18
|
+
userId: number,
|
|
19
|
+
endpoint: string,
|
|
20
|
+
keysP256dh: string,
|
|
21
|
+
keysAuth: string
|
|
22
|
+
): void {
|
|
23
|
+
const db = getConnection();
|
|
24
|
+
db.prepare(
|
|
25
|
+
`INSERT INTO push_subscriptions (user_id, endpoint, keys_p256dh, keys_auth)
|
|
26
|
+
VALUES (?, ?, ?, ?)
|
|
27
|
+
ON CONFLICT(endpoint) DO UPDATE SET
|
|
28
|
+
user_id = excluded.user_id,
|
|
29
|
+
keys_p256dh = excluded.keys_p256dh,
|
|
30
|
+
keys_auth = excluded.keys_auth`
|
|
31
|
+
).run(userId, endpoint, keysP256dh, keysAuth);
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
/** Returns all subscriptions for a user. */
|
|
35
|
+
getPushSubscriptions(userId: number): PushSubscriptionLookupRow[] {
|
|
36
|
+
const db = getConnection();
|
|
37
|
+
return db
|
|
38
|
+
.prepare(
|
|
39
|
+
'SELECT endpoint, keys_p256dh, keys_auth FROM push_subscriptions WHERE user_id = ?'
|
|
40
|
+
)
|
|
41
|
+
.all(userId) as PushSubscriptionLookupRow[];
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
/** Deletes one subscription by endpoint. */
|
|
45
|
+
deletePushSubscription(endpoint: string): void {
|
|
46
|
+
const db = getConnection();
|
|
47
|
+
db.prepare('DELETE FROM push_subscriptions WHERE endpoint = ?').run(endpoint);
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
/** Deletes all subscriptions for a user. */
|
|
51
|
+
deletePushSubscriptionsForUser(userId: number): void {
|
|
52
|
+
const db = getConnection();
|
|
53
|
+
db.prepare('DELETE FROM push_subscriptions WHERE user_id = ?').run(userId);
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
// Legacy aliases used by existing services/routes
|
|
57
|
+
saveSubscription(
|
|
58
|
+
userId: number,
|
|
59
|
+
endpoint: string,
|
|
60
|
+
keysP256dh: string,
|
|
61
|
+
keysAuth: string
|
|
62
|
+
): void {
|
|
63
|
+
pushSubscriptionsDb.createPushSubscription(
|
|
64
|
+
userId,
|
|
65
|
+
endpoint,
|
|
66
|
+
keysP256dh,
|
|
67
|
+
keysAuth
|
|
68
|
+
);
|
|
69
|
+
},
|
|
70
|
+
getSubscriptions(userId: number): PushSubscriptionLookupRow[] {
|
|
71
|
+
return pushSubscriptionsDb.getPushSubscriptions(userId);
|
|
72
|
+
},
|
|
73
|
+
removeSubscription(endpoint: string): void {
|
|
74
|
+
pushSubscriptionsDb.deletePushSubscription(endpoint);
|
|
75
|
+
},
|
|
76
|
+
removeAllForUser(userId: number): void {
|
|
77
|
+
pushSubscriptionsDb.deletePushSubscriptionsForUser(userId);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { getConnection } from '@/modules/database/connection.js';
|
|
2
|
-
|
|
3
|
-
type ScanStateRow = {
|
|
4
|
-
last_scanned_at: string;
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
export const scanStateDb = {
|
|
8
|
-
getLastScannedAt() {
|
|
9
|
-
const db = getConnection();
|
|
10
|
-
|
|
11
|
-
const row = db
|
|
12
|
-
.prepare(`SELECT last_scanned_at FROM scan_state WHERE id = 1`)
|
|
13
|
-
.get() as ScanStateRow;
|
|
14
|
-
|
|
15
|
-
if (!row) {
|
|
16
|
-
return null; // Before any scan, the row is undefined.
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
let lastScannedDate: Date | null = null;
|
|
20
|
-
const lastScannedStr = row.last_scanned_at;
|
|
21
|
-
|
|
22
|
-
if (lastScannedStr) {
|
|
23
|
-
// SQLite CURRENT_TIMESTAMP returns UTC in "YYYY-MM-DD HH:MM:SS" format.
|
|
24
|
-
// Replace space with 'T' and append 'Z' to parse reliably in JS across all platforms.
|
|
25
|
-
lastScannedDate = new Date(lastScannedStr.replace(' ', 'T') + 'Z');
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return lastScannedDate;
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
updateLastScannedAt(scannedAt: Date = new Date()) {
|
|
32
|
-
const db = getConnection();
|
|
33
|
-
const sqliteTimestamp = scannedAt.toISOString().slice(0, 19).replace('T', ' ');
|
|
34
|
-
|
|
35
|
-
db.prepare(`
|
|
36
|
-
INSERT INTO scan_state (id, last_scanned_at)
|
|
37
|
-
VALUES (1, ?)
|
|
38
|
-
ON CONFLICT (id)
|
|
39
|
-
DO UPDATE SET last_scanned_at = excluded.last_scanned_at
|
|
40
|
-
`).run(sqliteTimestamp);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
1
|
+
import { getConnection } from '@/modules/database/connection.js';
|
|
2
|
+
|
|
3
|
+
type ScanStateRow = {
|
|
4
|
+
last_scanned_at: string;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export const scanStateDb = {
|
|
8
|
+
getLastScannedAt() {
|
|
9
|
+
const db = getConnection();
|
|
10
|
+
|
|
11
|
+
const row = db
|
|
12
|
+
.prepare(`SELECT last_scanned_at FROM scan_state WHERE id = 1`)
|
|
13
|
+
.get() as ScanStateRow;
|
|
14
|
+
|
|
15
|
+
if (!row) {
|
|
16
|
+
return null; // Before any scan, the row is undefined.
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let lastScannedDate: Date | null = null;
|
|
20
|
+
const lastScannedStr = row.last_scanned_at;
|
|
21
|
+
|
|
22
|
+
if (lastScannedStr) {
|
|
23
|
+
// SQLite CURRENT_TIMESTAMP returns UTC in "YYYY-MM-DD HH:MM:SS" format.
|
|
24
|
+
// Replace space with 'T' and append 'Z' to parse reliably in JS across all platforms.
|
|
25
|
+
lastScannedDate = new Date(lastScannedStr.replace(' ', 'T') + 'Z');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return lastScannedDate;
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
updateLastScannedAt(scannedAt: Date = new Date()) {
|
|
32
|
+
const db = getConnection();
|
|
33
|
+
const sqliteTimestamp = scannedAt.toISOString().slice(0, 19).replace('T', ' ');
|
|
34
|
+
|
|
35
|
+
db.prepare(`
|
|
36
|
+
INSERT INTO scan_state (id, last_scanned_at)
|
|
37
|
+
VALUES (1, ?)
|
|
38
|
+
ON CONFLICT (id)
|
|
39
|
+
DO UPDATE SET last_scanned_at = excluded.last_scanned_at
|
|
40
|
+
`).run(sqliteTimestamp);
|
|
41
|
+
}
|
|
42
|
+
};
|