coding-tool-x 3.8.4 → 3.8.5
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/CHANGELOG.md +15 -0
- package/README.md +86 -15
- package/dist/web/assets/AgentsDrawer-BG6P3DX-.js +1 -0
- package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +1 -0
- package/dist/web/assets/Analytics--z_FmL5P.js +1 -0
- package/dist/web/assets/Analytics-CyHhR126.css +1 -0
- package/dist/web/assets/AssetPathField-CrJtRKHy.js +1 -0
- package/dist/web/assets/ChatHistoryDrawer-B2qBQs9L.css +1 -0
- package/dist/web/assets/ChatHistoryDrawer-BiuEryJj.js +1 -0
- package/dist/web/assets/CollapseItem-BAYEsL_Q.js +1 -0
- package/dist/web/assets/CommandsDrawer-BZJxlPvV.css +1 -0
- package/dist/web/assets/CommandsDrawer-YJ-U7BXN.js +1 -0
- package/dist/web/assets/ConfigExportDrawer-Ce_hAknW.js +1 -0
- package/dist/web/assets/ConfigExportDrawer-dwruRKWr.css +1 -0
- package/dist/web/assets/ConfigTemplates-Bvr1NN6K.js +1 -0
- package/dist/web/assets/ConfigTemplatesDrawer-BfDi8yO3.css +1 -0
- package/dist/web/assets/ConfigTemplatesDrawer-BjIeHfF-.js +1 -0
- package/dist/web/assets/ConfigTemplatesPanel-AV00tm_D.js +1 -0
- package/dist/web/assets/ConfigTemplatesPanel-CWyPtk67.css +1 -0
- package/dist/web/assets/Divider-D28g1gwj.js +1 -0
- package/dist/web/assets/DrawerContent-ChXgZ1Xm.js +1 -0
- package/dist/web/assets/FavoritesDrawer-CG9eI9Ay.css +1 -0
- package/dist/web/assets/FavoritesDrawer-Cz95o4CD.js +1 -0
- package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +1 -0
- package/dist/web/assets/GatewayConvertDrawer-DLlbMz27.js +1 -0
- package/dist/web/assets/Home-CSuFuJ9Y.css +1 -0
- package/dist/web/assets/Home-D7CCOFQC.js +1 -0
- package/dist/web/assets/MarkdownEditor-qfVgSre_.css +1 -0
- package/dist/web/assets/MarkdownEditor-rEZ-c72L.js +1 -0
- package/dist/web/assets/McpDrawer-C0dnsZhQ.css +1 -0
- package/dist/web/assets/McpDrawer-DfoCyxU2.js +1 -0
- package/dist/web/assets/McpFormDrawer-BRbDcawn.css +1 -0
- package/dist/web/assets/McpFormDrawer-SKu8HNUR.js +1 -0
- package/dist/web/assets/PluginManager-BbeK-3rV.js +1 -0
- package/dist/web/assets/PluginsDrawer-CWVJ7yjS.js +1 -0
- package/dist/web/assets/PluginsDrawer-DM3QjprE.css +1 -0
- package/dist/web/assets/PluginsPanel-Cm2N3StG.js +1 -0
- package/dist/web/assets/PluginsPanel-D6ZqITcR.css +1 -0
- package/dist/web/assets/ProjectList-677RLZ8O.css +1 -0
- package/dist/web/assets/ProjectList-CsjnsNPv.js +1 -0
- package/dist/web/assets/PromptsDrawer-BIgiYCEQ.css +1 -0
- package/dist/web/assets/PromptsDrawer-EGd3djFa.js +1 -0
- package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +1 -0
- package/dist/web/assets/RecentSessionsDrawer-D1vtoLAs.js +1 -0
- package/dist/web/assets/SessionCard-BgLg49U3.js +1 -0
- package/dist/web/assets/SessionCard-aM2NHu6i.css +1 -0
- package/dist/web/assets/SessionList-BpYRz1cX.css +1 -0
- package/dist/web/assets/SessionList-TRiTklWk.js +1 -0
- package/dist/web/assets/SettingsDrawer-d5liXjHq.css +1 -0
- package/dist/web/assets/SettingsDrawer-rz2WejGY.js +1 -0
- package/dist/web/assets/SkillManager-BTjTUbHq.js +1 -0
- package/dist/web/assets/SkillManager-C0GCT2Kb.css +1 -0
- package/dist/web/assets/SkillsDrawer-BCNme-aJ.css +1 -0
- package/dist/web/assets/SkillsDrawer-pN0hbkK3.js +1 -0
- package/dist/web/assets/SkillsPanel-B3Nm5j32.css +1 -0
- package/dist/web/assets/SkillsPanel-gmBWEoiF.js +1 -0
- package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +1 -0
- package/dist/web/assets/SpeedTestDrawer-DcNzuVJk.js +1 -0
- package/dist/web/assets/Upload-v5rV0qTT.js +1 -0
- package/dist/web/assets/WorkspaceDrawer-CGnMu9p1.css +1 -0
- package/dist/web/assets/WorkspaceDrawer-DxmicM4U.js +1 -0
- package/dist/web/assets/WorkspaceManager-CJHCjARN.js +1 -0
- package/dist/web/assets/WorkspacePanel-D0-zHTHP.css +1 -0
- package/dist/web/assets/WorkspacePanel-D8_Zq-du.js +1 -0
- package/dist/web/assets/_plugin-vue_export-helper-BeLZJZij.js +1 -0
- package/dist/web/assets/client-UDwXBP9i.js +1 -0
- package/dist/web/assets/clipboard-B46yyoz_.js +1 -0
- package/dist/web/assets/headers-cf-QapUq.js +1 -0
- package/dist/web/assets/icons-B2Vg-IOC.js +1 -0
- package/dist/web/assets/index-C0EHRym0.css +1 -0
- package/dist/web/assets/index-DnEocV0M.js +2 -0
- package/dist/web/assets/light-Cp0t7v32.js +1 -0
- package/dist/web/assets/markdown-u082bbtj.js +1 -0
- package/dist/web/assets/platforms-CBkB45JP.js +1 -0
- package/dist/web/assets/platforms-FTpjxAT6.js +1 -0
- package/dist/web/assets/project-config-B2baPzYL.js +1 -0
- package/dist/web/assets/sessions-Cmy31slD.js +1 -0
- package/dist/web/assets/sessions-yC_oVVh8.js +1 -0
- package/dist/web/assets/skill-repo-input-B_fkGlUK.js +1 -0
- package/dist/web/assets/use-lock-html-scroll-DXIqmUW4.js +1 -0
- package/dist/web/assets/use-message-DoLM8C1C.js +1 -0
- package/dist/web/assets/useResponsiveDrawer-B3uojyvV.js +1 -0
- package/dist/web/assets/vendors-D0c_0KLP.js +1 -0
- package/dist/web/assets/vue-vendor-BqZbbXHA.js +1 -0
- package/dist/web/assets/workspaces-mjyPVGS8.js +1 -0
- package/dist/web/assets/xml-CgY3RMlX.js +1 -0
- package/dist/web/index.html +12 -8
- package/docs/native-log-memory-2026-09-16.md +43 -0
- package/docs/superpowers/plans/2026-08-26-configuration-driven-cli-platform.md +1578 -0
- package/docs/superpowers/plans/2026-08-30-project-scoped-config-control.md +1260 -0
- package/docs/superpowers/plans/2026-09-01-omp-skill-refresh-boundary.md +213 -0
- package/docs/superpowers/plans/2026-09-01-realtime-logs-panel.md +125 -0
- package/docs/superpowers/plans/2026-09-02-config-driven-platform-boundary.md +86 -0
- package/docs/superpowers/plans/2026-09-02-platform-implementation-drivers.md +508 -0
- package/docs/superpowers/plans/2026-09-03-cli-platform-correctness-boundary.md +760 -0
- package/docs/superpowers/plans/2026-09-03-dependency-security-remediation.md +133 -0
- package/docs/superpowers/plans/2026-09-04-model-catalog-pricing-sync.md +1078 -0
- package/docs/superpowers/plans/2026-09-05-codex-project-scan-500.md +128 -0
- package/docs/superpowers/plans/2026-09-06-project-skill-path-fix.md +97 -0
- package/docs/superpowers/specs/2026-08-26-configuration-driven-cli-platform-design.md +408 -0
- package/docs/superpowers/specs/2026-08-30-project-scoped-config-control-design.md +467 -0
- package/docs/superpowers/specs/2026-09-01-claude-session-content-repair-design.md +111 -0
- package/docs/superpowers/specs/2026-09-01-omp-skill-refresh-boundary-design.md +83 -0
- package/docs/superpowers/specs/2026-09-01-realtime-logs-panel-design.md +27 -0
- package/docs/superpowers/specs/2026-09-02-config-driven-platform-boundary-design.md +64 -0
- package/docs/superpowers/specs/2026-09-02-platform-implementation-driver-boundary-design.md +123 -0
- package/docs/superpowers/specs/2026-09-03-cli-platform-correctness-boundary-design.md +249 -0
- package/docs/superpowers/specs/2026-09-03-dependency-security-remediation-design.md +87 -0
- package/docs/superpowers/specs/2026-09-04-model-catalog-pricing-sync-design.md +301 -0
- package/docs/superpowers/specs/2026-09-05-codex-project-scan-500-design.md +24 -0
- package/package.json +8 -4
- package/src/commands/channels.js +88 -191
- package/src/commands/cli-type.js +19 -11
- package/src/commands/daemon.js +94 -32
- package/src/commands/doctor.js +16 -9
- package/src/commands/export-config.js +23 -5
- package/src/commands/list.js +130 -52
- package/src/commands/logs.js +44 -27
- package/src/commands/platform-command-registry.js +78 -0
- package/src/commands/plugin.js +11 -5
- package/src/commands/port-config.js +34 -52
- package/src/commands/proxy-control.js +207 -145
- package/src/commands/proxy.js +2 -2
- package/src/commands/resume.js +87 -91
- package/src/commands/search.js +137 -67
- package/src/commands/stats.js +30 -22
- package/src/commands/switch.js +1 -1
- package/src/commands/toggle-proxy.js +94 -111
- package/src/commands/ui.js +67 -6
- package/src/commands/workspace.js +90 -8
- package/src/config/default.js +6 -53
- package/src/config/loader.js +61 -24
- package/src/config/model-metadata.js +49 -59
- package/src/config/model-metadata.json +4095 -99
- package/src/config/paths.js +181 -8
- package/src/index.js +134 -71
- package/src/platforms/access.js +196 -0
- package/src/{server/services → platforms}/agents-service.js +354 -197
- package/src/platforms/channel-auth-registry.js +162 -0
- package/src/platforms/channel-auth-service.js +82 -0
- package/src/{server/services → platforms}/commands-service.js +195 -115
- package/src/platforms/driver-registry.js +59 -0
- package/src/platforms/drivers/claude/api-operations.js +62 -0
- package/src/{server/services/channels.js → platforms/drivers/claude/channels-implementation.js} +131 -33
- package/src/platforms/drivers/claude/channels.js +39 -0
- package/src/{server/services/config-sync-service.js → platforms/drivers/claude/config-sync.js} +29 -5
- package/src/{server/services → platforms/drivers/claude}/health-check.js +4 -4
- package/src/platforms/drivers/claude/health.js +22 -0
- package/src/platforms/drivers/claude/mcp.js +9 -0
- package/src/{server/services/settings-manager.js → platforms/drivers/claude/native-config-implementation.js} +13 -4
- package/src/platforms/drivers/claude/native-config.js +46 -0
- package/src/platforms/drivers/claude/native-logs.js +72 -0
- package/src/{server/services/claude-openai-gateway.js → platforms/drivers/claude/openai-gateway.js} +8 -65
- package/src/platforms/drivers/claude/project-config.js +21 -0
- package/src/platforms/drivers/claude/projects.js +62 -0
- package/src/platforms/drivers/claude/prompts.js +9 -0
- package/src/{server/proxy-server.js → platforms/drivers/claude/proxy-implementation.js} +41 -278
- package/src/platforms/drivers/claude/proxy.js +16 -0
- package/src/platforms/drivers/claude/resource-sync.js +9 -0
- package/src/platforms/drivers/claude/session-history-adapter.js +313 -0
- package/src/{server/services/sessions.js → platforms/drivers/claude/sessions-implementation.js} +145 -35
- package/src/platforms/drivers/claude/sessions.js +76 -0
- package/src/{server/services/claude-statistics-service.js → platforms/drivers/claude/statistics-implementation.js} +2 -2
- package/src/platforms/drivers/claude/statistics.js +16 -0
- package/src/{server/services/claude-wire.js → platforms/drivers/claude/wire.js} +1 -1
- package/src/platforms/drivers/codex/api-operations.js +9 -0
- package/src/{server/services/codex-channels.js → platforms/drivers/codex/channels-implementation.js} +149 -14
- package/src/platforms/drivers/codex/channels.js +45 -0
- package/src/{server/services/codex-config.js → platforms/drivers/codex/config.js} +12 -2
- package/src/{server/services/codex-env-manager.js → platforms/drivers/codex/env-manager.js} +1 -1
- package/src/platforms/drivers/codex/mcp.js +9 -0
- package/src/{server/services/codex-settings-manager.js → platforms/drivers/codex/native-config-implementation.js} +15 -6
- package/src/platforms/drivers/codex/native-config.js +47 -0
- package/src/platforms/drivers/codex/native-logs.js +166 -0
- package/src/platforms/drivers/codex/project-config.js +21 -0
- package/src/platforms/drivers/codex/projects.js +26 -0
- package/src/platforms/drivers/codex/prompts.js +9 -0
- package/src/{server/codex-proxy-server.js → platforms/drivers/codex/proxy-implementation.js} +30 -233
- package/src/platforms/drivers/codex/proxy.js +16 -0
- package/src/platforms/drivers/codex/resource-sync.js +9 -0
- package/src/{server/services/session-history-adapters/codex.js → platforms/drivers/codex/session-history-adapter.js} +37 -23
- package/src/{server/services/codex-sessions.js → platforms/drivers/codex/sessions-implementation.js} +81 -75
- package/src/platforms/drivers/codex/sessions.js +36 -0
- package/src/{server/services/codex-statistics-service.js → platforms/drivers/codex/statistics-implementation.js} +2 -2
- package/src/platforms/drivers/codex/statistics.js +16 -0
- package/src/platforms/drivers/gemini/api-operations.js +9 -0
- package/src/{server/services/gemini-channels.js → platforms/drivers/gemini/channels-implementation.js} +202 -37
- package/src/platforms/drivers/gemini/channels.js +39 -0
- package/src/{server/services/gemini-config.js → platforms/drivers/gemini/config.js} +12 -2
- package/src/platforms/drivers/gemini/mcp.js +9 -0
- package/src/{server/services/gemini-settings-manager.js → platforms/drivers/gemini/native-config-implementation.js} +14 -5
- package/src/platforms/drivers/gemini/native-config.js +39 -0
- package/src/platforms/drivers/gemini/native-logs.js +180 -0
- package/src/platforms/drivers/gemini/project-config.js +21 -0
- package/src/platforms/drivers/gemini/projects.js +26 -0
- package/src/platforms/drivers/gemini/prompts.js +9 -0
- package/src/{server/gemini-proxy-server.js → platforms/drivers/gemini/proxy-implementation.js} +36 -267
- package/src/platforms/drivers/gemini/proxy.js +16 -0
- package/src/platforms/drivers/gemini/resource-sync.js +9 -0
- package/src/{server/services/session-history-adapters/gemini.js → platforms/drivers/gemini/session-history-adapter.js} +70 -18
- package/src/{server/services/gemini-sessions.js → platforms/drivers/gemini/sessions-implementation.js} +53 -37
- package/src/platforms/drivers/gemini/sessions.js +47 -0
- package/src/{server/services/gemini-statistics-service.js → platforms/drivers/gemini/statistics-implementation.js} +2 -2
- package/src/platforms/drivers/gemini/statistics.js +16 -0
- package/src/{server/services/gemini-wire.js → platforms/drivers/gemini/wire.js} +1 -1
- package/src/platforms/drivers/generic-filesystem.js +166 -0
- package/src/platforms/drivers/generic-jsonl.js +141 -0
- package/src/platforms/drivers/generic-mcp.js +44 -0
- package/src/platforms/drivers/generic-openai-compatible.js +45 -0
- package/src/platforms/drivers/generic-prompt.js +41 -0
- package/src/platforms/drivers/legacy.js +677 -0
- package/src/platforms/drivers/native-config-snapshot.js +125 -0
- package/src/platforms/drivers/native-log-utils.js +1292 -0
- package/src/platforms/drivers/notification-hooks.js +578 -0
- package/src/{server/api/omp-config.js → platforms/drivers/omp/api-operations.js} +52 -64
- package/src/{server/services/omp-auth-provider-worker.js → platforms/drivers/omp/auth-provider-worker.js} +1 -1
- package/src/{server/services/omp-auth-providers.js → platforms/drivers/omp/auth-providers.js} +1 -1
- package/src/{server/services/omp-channels.js → platforms/drivers/omp/channels-implementation.js} +166 -39
- package/src/platforms/drivers/omp/channels.js +58 -0
- package/src/{server/services/omp-config.js → platforms/drivers/omp/config.js} +53 -13
- package/src/{server/services/omp-gateway-routing.js → platforms/drivers/omp/gateway-routing.js} +14 -7
- package/src/{server/services/omp-gateway.js → platforms/drivers/omp/gateway.js} +4 -262
- package/src/platforms/drivers/omp/mcp.js +9 -0
- package/src/{server/services/omp-settings-manager.js → platforms/drivers/omp/native-config-implementation.js} +75 -10
- package/src/platforms/drivers/omp/native-config.js +46 -0
- package/src/platforms/drivers/omp/native-logs.js +52 -0
- package/src/{server/services/omp-native-plugin-adapter.js → platforms/drivers/omp/native-plugin-adapter.js} +91 -4
- package/src/platforms/drivers/omp/project-config.js +29 -0
- package/src/platforms/drivers/omp/projects.js +20 -0
- package/src/platforms/drivers/omp/prompts.js +9 -0
- package/src/{server/omp-proxy-server.js → platforms/drivers/omp/proxy-implementation.js} +6 -15
- package/src/platforms/drivers/omp/proxy.js +16 -0
- package/src/platforms/drivers/omp/resource-sync.js +9 -0
- package/src/{server/services/session-history-adapters/omp.js → platforms/drivers/omp/session-history-adapter.js} +42 -18
- package/src/{server/services/omp-sessions.js → platforms/drivers/omp/sessions-implementation.js} +130 -94
- package/src/platforms/drivers/omp/sessions.js +36 -0
- package/src/{server/services/omp-skill-discovery.js → platforms/drivers/omp/skill-discovery.js} +159 -32
- package/src/{server/services/omp-skill-settings-service.js → platforms/drivers/omp/skill-settings.js} +1 -1
- package/src/{server/services/omp-statistics-service.js → platforms/drivers/omp/statistics-implementation.js} +3 -3
- package/src/platforms/drivers/omp/statistics.js +16 -0
- package/src/platforms/drivers/opencode/api-operations.js +9 -0
- package/src/{server/services/opencode-channels.js → platforms/drivers/opencode/channels-implementation.js} +28 -9
- package/src/platforms/drivers/opencode/channels.js +40 -0
- package/src/platforms/drivers/opencode/conversion.js +41 -0
- package/src/{server/services/opencode-gateway-converter.js → platforms/drivers/opencode/gateway-converter.js} +1 -1
- package/src/platforms/drivers/opencode/mcp.js +9 -0
- package/src/{server/services/opencode-settings-manager.js → platforms/drivers/opencode/native-config-implementation.js} +17 -6
- package/src/platforms/drivers/opencode/native-config.js +26 -0
- package/src/platforms/drivers/opencode/native-logs.js +133 -0
- package/src/platforms/drivers/opencode/project-config.js +98 -0
- package/src/platforms/drivers/opencode/projects.js +20 -0
- package/src/platforms/drivers/opencode/prompts.js +9 -0
- package/src/{server/opencode-proxy-server.js → platforms/drivers/opencode/proxy-implementation.js} +27 -362
- package/src/platforms/drivers/opencode/proxy.js +16 -0
- package/src/platforms/drivers/opencode/resource-sync.js +9 -0
- package/src/{server/services/opencode-sessions.js → platforms/drivers/opencode/sessions-implementation.js} +211 -64
- package/src/platforms/drivers/opencode/sessions.js +48 -0
- package/src/{server/services/opencode-statistics-service.js → platforms/drivers/opencode/statistics-implementation.js} +2 -2
- package/src/platforms/drivers/opencode/statistics.js +16 -0
- package/src/platforms/drivers/secure-file-driver.js +272 -0
- package/src/platforms/drivers/unsupported.js +7 -0
- package/src/platforms/manifest-schema.js +398 -0
- package/src/platforms/manifests/claude.json +489 -0
- package/src/platforms/manifests/codex.json +448 -0
- package/src/platforms/manifests/gemini.json +447 -0
- package/src/platforms/manifests/omp.json +496 -0
- package/src/platforms/manifests/opencode.json +422 -0
- package/src/{server/services → platforms}/native-oauth-adapters.js +87 -417
- package/src/{server/services → platforms}/notification-hooks.js +140 -1023
- package/src/platforms/oauth-credentials-service.js +506 -0
- package/src/platforms/path-resolver.js +179 -0
- package/src/platforms/platform-path-context.js +305 -0
- package/src/platforms/registry.js +248 -0
- package/src/platforms/remote-notification-providers.js +678 -0
- package/src/platforms/runtime.js +259 -0
- package/src/{server/services/session-history-adapters/index.js → platforms/session-history-adapters.js} +8 -1
- package/src/plugins/plugin-loader.js +2 -2
- package/src/plugins/plugin-manager.js +2 -2
- package/src/plugins/registry.js +27 -10
- package/src/reset-config.js +21 -5
- package/src/server/api/agents.js +46 -72
- package/src/server/api/commands.js +16 -6
- package/src/server/api/config-registry.js +206 -59
- package/src/server/api/config-sync.js +3 -2
- package/src/server/api/config-templates.js +20 -4
- package/src/server/api/config.js +111 -102
- package/src/server/api/convert.js +54 -178
- package/src/server/api/dashboard.js +168 -102
- package/src/server/api/hooks.js +1 -1
- package/src/server/api/mcp.js +224 -84
- package/src/server/api/platform-api-config.js +102 -0
- package/src/server/api/platform-route-factory.js +215 -0
- package/src/server/api/platform-routes.js +26 -0
- package/src/server/api/platforms.js +110 -0
- package/src/server/api/plugins.js +57 -57
- package/src/server/api/project-config.js +168 -0
- package/src/server/api/prompts.js +58 -45
- package/src/server/api/settings.js +55 -8
- package/src/server/api/skills.js +262 -133
- package/src/server/api/ui-config.js +2 -2
- package/src/server/api/validation-errors.js +18 -4
- package/src/server/api/workspaces.js +47 -12
- package/src/server/index.js +164 -213
- package/src/server/platform-context.js +81 -0
- package/src/server/services/channel-balance.js +11 -20
- package/src/server/services/channel-health.js +21 -6
- package/src/server/services/channel-scheduler.js +29 -39
- package/src/server/services/channel-sync-utils.js +23 -13
- package/src/server/services/config-export-service.js +350 -319
- package/src/server/services/config-registry-service.js +280 -54
- package/src/server/services/config-sync-manager.js +172 -944
- package/src/server/services/config-templates-service.js +419 -353
- package/src/server/services/control-manifest-store.js +206 -0
- package/src/server/services/dashboard-snapshot-worker.js +656 -100
- package/src/server/services/effective-control-service.js +557 -0
- package/src/server/services/local-resource-index.js +314 -0
- package/src/server/services/mcp-service.js +607 -977
- package/src/server/services/model-detector.js +15 -10
- package/src/server/services/native-log-channel-resolver.js +214 -0
- package/src/server/services/native-log-observer.js +291 -0
- package/src/server/services/network-access.js +1 -1
- package/src/server/services/platform-catalog.js +82 -0
- package/src/server/services/platform-resolution.js +32 -29
- package/src/server/services/plugins-service.js +376 -122
- package/src/server/services/project-config-service.js +550 -0
- package/src/server/services/project-path-validation.js +31 -0
- package/src/server/services/prompts-service.js +267 -233
- package/src/server/services/proxy-runtime.js +7 -4
- package/src/server/services/remote-credential-cache.js +43 -0
- package/src/server/services/repo-scanner-base.js +182 -75
- package/src/server/services/request-logger.js +7 -4
- package/src/server/services/session-history-index.js +780 -213
- package/src/server/services/session-history-worker.js +228 -33
- package/src/server/services/session-snapshot-worker.js +124 -34
- package/src/server/services/session-snapshots.js +4 -2
- package/src/server/services/skill-artifact-store.js +355 -0
- package/src/server/services/skill-format-adapters.js +65 -0
- package/src/server/services/skill-projection-service.js +323 -0
- package/src/server/services/skill-refresh-task-service.js +275 -0
- package/src/server/services/skill-service.js +2020 -677
- package/src/server/services/snapshot-cache.js +30 -8
- package/src/server/services/speed-test.js +8 -8
- package/src/server/services/sqlite-connection.js +19 -3
- package/src/server/services/statistics-service.js +240 -57
- package/src/server/services/ui-config.js +107 -76
- package/src/server/services/usage-log-utils.js +98 -0
- package/src/server/services/web-build.js +1 -1
- package/src/server/services/workspace-service.js +59 -29
- package/src/server/utils/pricing.js +10 -19
- package/src/server/websocket-server.js +153 -28
- package/src/{server/services/base → shared}/base-channel-service.js +156 -28
- package/src/shared/capability-driver.js +104 -0
- package/src/shared/channel-auth-policy.js +27 -0
- package/src/shared/channel-driver.js +161 -0
- package/src/shared/driver-factories/api.js +180 -0
- package/src/shared/driver-factories/mcp.js +244 -0
- package/src/shared/driver-factories/projects.js +121 -0
- package/src/shared/driver-factories/prompts.js +58 -0
- package/src/shared/driver-factories/resource-sync.js +375 -0
- package/src/shared/driver-result.js +78 -0
- package/src/shared/mcp-format.js +189 -0
- package/src/shared/platforms.js +104 -167
- package/src/shared/project-config.js +512 -0
- package/src/shared/proxy-driver.js +57 -0
- package/src/{server/services/base → shared}/response-usage-parser.js +8 -4
- package/src/ui/menu.js +91 -67
- package/src/utils/port-helper.js +35 -19
- package/src/utils/session.js +1 -1
- package/dist/web/assets/Analytics-COEUXmd4.js +0 -25
- package/dist/web/assets/Analytics-RNn1BUbG.css +0 -1
- package/dist/web/assets/ConfigTemplates-DLLkS53H.js +0 -1
- package/dist/web/assets/Home-DCEyLzwX.js +0 -1
- package/dist/web/assets/Home-DYVy4cGZ.css +0 -1
- package/dist/web/assets/PluginManager-Oe1ZHoMO.js +0 -1
- package/dist/web/assets/ProjectList-CWjuAFof.js +0 -1
- package/dist/web/assets/ProjectList-VeMNXfgO.css +0 -1
- package/dist/web/assets/SessionList-C4chCPxK.css +0 -1
- package/dist/web/assets/SessionList-v3ehGg9U.js +0 -1
- package/dist/web/assets/SkillManager-BsX8Qpj0.css +0 -1
- package/dist/web/assets/SkillManager-DUF_qP5S.js +0 -1
- package/dist/web/assets/WorkspaceManager-CjAWBosO.js +0 -1
- package/dist/web/assets/icons-nGdSKQn2.js +0 -1
- package/dist/web/assets/index-D5hyHPj7.js +0 -2
- package/dist/web/assets/index-bJRG3RXH.css +0 -1
- package/dist/web/assets/markdown-BNJfEgCA.js +0 -1
- package/dist/web/assets/markdown-BfC0goYb.css +0 -10
- package/dist/web/assets/naive-ui-BALVpMgd.js +0 -1
- package/dist/web/assets/vendors-DQA4Hw9v.js +0 -7
- package/dist/web/assets/vue-vendor-B5RqjEjQ.js +0 -45
- package/src/config/model-pricing.js +0 -35
- package/src/server/api/channels.js +0 -439
- package/src/server/api/claude-hooks.js +0 -56
- package/src/server/api/claude-statistics.js +0 -57
- package/src/server/api/codex-channels.js +0 -491
- package/src/server/api/codex-projects.js +0 -117
- package/src/server/api/codex-proxy.js +0 -293
- package/src/server/api/codex-sessions.js +0 -652
- package/src/server/api/codex-statistics.js +0 -57
- package/src/server/api/gemini-channels.js +0 -392
- package/src/server/api/gemini-projects.js +0 -103
- package/src/server/api/gemini-proxy.js +0 -231
- package/src/server/api/gemini-sessions.js +0 -550
- package/src/server/api/gemini-statistics.js +0 -57
- package/src/server/api/health-check.js +0 -31
- package/src/server/api/oauth-credentials.js +0 -198
- package/src/server/api/omp-channels.js +0 -575
- package/src/server/api/omp-projects.js +0 -88
- package/src/server/api/omp-proxy.js +0 -125
- package/src/server/api/omp-sessions.js +0 -386
- package/src/server/api/omp-statistics.js +0 -40
- package/src/server/api/opencode-channels.js +0 -471
- package/src/server/api/opencode-projects.js +0 -110
- package/src/server/api/opencode-proxy.js +0 -354
- package/src/server/api/opencode-sessions.js +0 -466
- package/src/server/api/opencode-statistics.js +0 -57
- package/src/server/api/projects.js +0 -120
- package/src/server/api/proxy.js +0 -330
- package/src/server/api/sessions.js +0 -810
- package/src/server/services/oauth-credentials-service.js +0 -945
- package/src/server/services/omp-session-log-observer.js +0 -138
- package/src/server/services/opencode-gateway-adapters.js +0 -43
- package/src/server/services/project-snapshots.js +0 -59
- package/src/server/services/proxy-log-helper.js +0 -298
- package/src/server/services/session-cache.js +0 -127
- package/src/server/services/session-converter.js +0 -582
- package/src/server/services/session-history-adapters/claude.js +0 -235
- /package/src/{server/services/claude-token-recovery.js → platforms/drivers/claude/token-recovery.js} +0 -0
- /package/src/{server/services/codex-parser.js → platforms/drivers/codex/parser.js} +0 -0
- /package/src/{server/services/codex-speed-test-template.json → platforms/drivers/codex/speed-test-template.json} +0 -0
- /package/src/{server/services/codex-wire.js → platforms/drivers/codex/wire.js} +0 -0
- /package/src/{server/services/omp-auth-gateway-client.js → platforms/drivers/omp/auth-gateway-client.js} +0 -0
- /package/src/{server/services/opencode-normalization.js → platforms/drivers/opencode/normalization.js} +0 -0
- /package/src/{server/services → shared}/config-artifact-paths.js +0 -0
- /package/src/{server/services/base → shared}/proxy-utils.js +0 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
# Platform Implementation Drivers Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
4
|
+
|
|
5
|
+
**Goal:** Move all platform-specific channel, proxy, session, statistics, native-config, resource, prompt, and MCP behavior out of `src/server` into per-platform Drivers, then delete obsolete platform services and remove CLI platform branches.
|
|
6
|
+
|
|
7
|
+
**Architecture:** `src/platforms/drivers/<platform>/<capability>.js` owns provider-specific behavior and may use platform-local helpers. `src/server` retains HTTP/CLI facades, shared application orchestration, SQLite/cache/scheduler/security infrastructure, and protocol-neutral utilities. Runtime remains the only capability lookup seam; legacy HTTP URLs and CLI command names remain unchanged.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Node.js 22, CommonJS, Express, Vitest, Platform Registry/Runtime, existing filesystem/TOML/JSON/native configuration adapters.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Scope and ownership map
|
|
14
|
+
|
|
15
|
+
### Driver-owned implementations
|
|
16
|
+
|
|
17
|
+
- Claude: existing `channels-implementation.js`, plus proxy, sessions, statistics, native config, and provider-specific resource/config behavior.
|
|
18
|
+
- Codex: existing `channels-implementation.js`, plus proxy, sessions, statistics, native config, and provider-specific resource/config behavior.
|
|
19
|
+
- Gemini: contents of `gemini-channels.js`, `gemini-proxy-server.js`, `gemini-sessions.js`, `gemini-statistics-service.js`, `gemini-settings-manager.js`, and Gemini-specific serialization/helpers.
|
|
20
|
+
- OpenCode: contents of `opencode-channels.js`, `opencode-proxy-server.js`, `opencode-sessions.js`, `opencode-statistics-service.js`, `opencode-settings-manager.js`, `opencode-gateway-converter.js`, `opencode-normalization.js`, and OpenCode-specific serialization/helpers.
|
|
21
|
+
- OMP: contents of `omp-channels.js`, `omp-proxy-server.js`, `omp-sessions.js`, `omp-statistics-service.js`, `omp-settings-manager.js`, `omp-gateway*.js`, `omp-native-plugin-adapter.js`, and OMP managed-mode/auth behavior.
|
|
22
|
+
|
|
23
|
+
### Server-owned implementations
|
|
24
|
+
|
|
25
|
+
- `src/server/api/**`: route, validation, status code, response-shape, and websocket compatibility.
|
|
26
|
+
- `src/commands/**`: prompt/menu/output handling and generic command dispatch.
|
|
27
|
+
- `src/server/services/base/**`, `session-history-index.js`, `channel-scheduler.js`, `channel-health.js`, `enhanced-cache.js`, `sqlite-connection.js`, `security/**`: platform-neutral infrastructure.
|
|
28
|
+
- `src/server/services/claude-wire.js`, `codex-wire.js`, `gemini-wire.js`: retain only if used as protocol-neutral wire utilities; platform-specific orchestration moves into the owning Driver.
|
|
29
|
+
|
|
30
|
+
## Shared Driver contract
|
|
31
|
+
|
|
32
|
+
Each built-in Driver factory receives the existing Runtime context and returns capability methods. Methods return existing DTOs at the Driver/facade boundary; failures use `DriverResult` and preserve `cause` as a non-enumerable property.
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
const driver = runtime.getDriver(platform, capability);
|
|
36
|
+
const result = await driver[operation](input);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The CLI-facing capability metadata uses this shape:
|
|
40
|
+
|
|
41
|
+
```js
|
|
42
|
+
{
|
|
43
|
+
supportsCliCreate: true,
|
|
44
|
+
supportsCliToggle: true,
|
|
45
|
+
managedProviderConfig: false,
|
|
46
|
+
defaultPort: 20088
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The generic CLI must read metadata and methods; it must not compare platform names.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### Task 1: Freeze behavior and add migration guards
|
|
55
|
+
|
|
56
|
+
**Files:**
|
|
57
|
+
- Create: `tests/unit/platforms/drivers/platform-implementation-boundary.test.js`
|
|
58
|
+
- Modify: `tests/unit/platforms/drivers/builtin-driver-contract.test.js`
|
|
59
|
+
- Modify: `scripts/test-driver-reachability.js`
|
|
60
|
+
|
|
61
|
+
- [ ] **Step 1: Add failing boundary assertions**
|
|
62
|
+
|
|
63
|
+
Add tests that inspect production source files and fail while the current delegation remains:
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
it('does not load platform channel implementations from server services', () => {
|
|
67
|
+
const source = fs.readFileSync(path.join(ROOT, 'src/platforms/drivers/gemini/channels.js'), 'utf8');
|
|
68
|
+
expect(source).not.toMatch(/server\/services\/gemini-channels/);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('does not keep concrete platform branches in CLI channel command', () => {
|
|
72
|
+
const source = fs.readFileSync(path.join(ROOT, 'src/commands/channels.js'), 'utf8');
|
|
73
|
+
expect(source).not.toMatch(/cliType === ['"](?:claude|codex|gemini|opencode|omp)/);
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Repeat the source assertion for all five proxy Drivers and both CLI commands. These tests are migration guards, not substitutes for behavior tests.
|
|
78
|
+
|
|
79
|
+
- [ ] **Step 2: Record every current caller before moving code**
|
|
80
|
+
|
|
81
|
+
Search production and tests for each implementation file. Save the caller list in the task notes and classify each caller as:
|
|
82
|
+
|
|
83
|
+
- HTTP facade that must be changed to Runtime;
|
|
84
|
+
- CLI facade that must be changed to Runtime;
|
|
85
|
+
- shared infrastructure that must receive a narrow injected callback;
|
|
86
|
+
- test-only mock path that must be moved to Driver seam;
|
|
87
|
+
- worker/dynamic entry point that must remain explicitly documented.
|
|
88
|
+
|
|
89
|
+
- [ ] **Step 3: Run the guard tests and confirm red state**
|
|
90
|
+
|
|
91
|
+
Run:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
npx vitest run tests/unit/platforms/drivers/platform-implementation-boundary.test.js
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Expected: failures identify the current Driver-to-service and CLI-to-service delegation points.
|
|
98
|
+
|
|
99
|
+
- [ ] **Step 4: Commit the characterization guard**
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
git add tests/unit/platforms/drivers/platform-implementation-boundary.test.js tests/unit/platforms/drivers/builtin-driver-contract.test.js scripts/test-driver-reachability.js
|
|
103
|
+
git commit -m "test: guard platform implementation driver ownership"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
### Task 2: Move remaining channel implementations
|
|
109
|
+
|
|
110
|
+
**Files:**
|
|
111
|
+
- Create/modify: `src/platforms/drivers/gemini/channels.js`, `src/platforms/drivers/gemini/helpers/**`
|
|
112
|
+
- Create/modify: `src/platforms/drivers/opencode/channels.js`, `src/platforms/drivers/opencode/helpers/**`
|
|
113
|
+
- Create/modify: `src/platforms/drivers/omp/channels.js`, `src/platforms/drivers/omp/helpers/**`
|
|
114
|
+
- Modify: `src/server/services/base/base-channel-service.js`
|
|
115
|
+
- Modify: `src/server/services/channel-sync-utils.js`
|
|
116
|
+
- Delete after caller migration: `src/server/services/gemini-channels.js`, `src/server/services/opencode-channels.js`, `src/server/services/omp-channels.js`
|
|
117
|
+
- Modify: `src/server/api/gemini-channels.js`, `src/server/api/opencode-channels.js`, `src/server/api/omp-channels.js`
|
|
118
|
+
- Modify: `tests/unit/platforms/drivers/gemini-channels.test.js`, `opencode-channels.test.js`, `omp-channels.test.js`
|
|
119
|
+
|
|
120
|
+
- [ ] **Step 1: Define the per-platform channel Driver methods**
|
|
121
|
+
|
|
122
|
+
Each Driver must expose the methods already consumed by facades plus the common contract:
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
list(options = {})
|
|
126
|
+
getEnabled(options = {})
|
|
127
|
+
create(input)
|
|
128
|
+
update(id, patch)
|
|
129
|
+
remove(id)
|
|
130
|
+
markRecentlyUsed(id)
|
|
131
|
+
syncCurrent(options = {})
|
|
132
|
+
applyChannelToSettings(id, options = {})
|
|
133
|
+
getEffectiveApiKey(channel)
|
|
134
|
+
disableAll(options = {})
|
|
135
|
+
resetChannel(id)
|
|
136
|
+
getCliMetadata()
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Gemini-specific methods own `.env`, `apiFormat`, and Vertex handling. OpenCode-specific methods own provider ID derivation, config path selection, model collection, and Codex fallback key. OMP-specific methods own static/managed mode, provider grouping, OAuth credential lookup, and managed provider writes.
|
|
140
|
+
|
|
141
|
+
- [ ] **Step 2: Move actual function bodies, not imports**
|
|
142
|
+
|
|
143
|
+
Move each platform service function and its platform-only helper into that platform Driver directory. Replace direct imports of another platform service with injected shared callbacks or the owning Driver:
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
const shared = context.shared || {};
|
|
147
|
+
const channelStore = shared.channelStore;
|
|
148
|
+
const scheduler = shared.scheduler;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Do not implement `createDriver()` by calling `createChannelDriver({ servicePath })`. The final factory must construct the implementation directly.
|
|
152
|
+
|
|
153
|
+
- [ ] **Step 3: Keep shared storage and scheduling generic**
|
|
154
|
+
|
|
155
|
+
Extend `BaseChannelService` only with platform-neutral operations required by more than one Driver. Do not add Gemini/OpenCode/OMP fields to its schema. Platform-specific fields remain under `extra` or the platform Driver DTO.
|
|
156
|
+
|
|
157
|
+
- [ ] **Step 4: Convert channel APIs to Runtime-only access**
|
|
158
|
+
|
|
159
|
+
For each route module, replace direct service imports with:
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
const { getPlatformRuntime } = require('../../platforms/runtime');
|
|
163
|
+
|
|
164
|
+
function getChannelsDriver() {
|
|
165
|
+
return getPlatformRuntime().getDriver('gemini', 'channels');
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Keep route-specific validation, HTTP status codes, response field names, health broadcasts, and speed-test orchestration in the API facade. The API must not import a platform service or proxy server.
|
|
170
|
+
|
|
171
|
+
- [ ] **Step 5: Migrate channel tests to the Driver seam**
|
|
172
|
+
|
|
173
|
+
Preserve tests for native config sync, invalid `apiFormat`, provider IDs, managed mode, and secret redaction. Replace `require.cache` mocks of deleted service paths with Driver factory/runtime mocks.
|
|
174
|
+
|
|
175
|
+
- [ ] **Step 6: Run channel regression**
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
npx vitest run tests/unit/platforms/drivers/gemini-channels.test.js tests/unit/platforms/drivers/opencode-channels.test.js tests/unit/platforms/drivers/omp-channels.test.js tests/unit/api/gemini-channels-api.test.js tests/unit/api/opencode-channels-api.test.js tests/unit/api/omp-channels-api.test.js
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Expected: all existing channel behavior passes with no platform channel service import in production.
|
|
182
|
+
|
|
183
|
+
- [ ] **Step 7: Delete obsolete channel services and commit**
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
git add src/platforms/drivers src/server/services/base src/server/services/channel-sync-utils.js src/server/api tests
|
|
187
|
+
git rm src/server/services/gemini-channels.js src/server/services/opencode-channels.js src/server/services/omp-channels.js
|
|
188
|
+
git commit -m "refactor: move platform channel implementations into drivers"
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### Task 3: Move proxy lifecycle and protocol implementations
|
|
194
|
+
|
|
195
|
+
**Files:**
|
|
196
|
+
- Modify/create: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/proxy.js`
|
|
197
|
+
- Create: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/proxy-helpers/**`
|
|
198
|
+
- Modify: `src/server/services/proxy-runtime.js`, `proxy-log-helper.js`, `request-logger.js`, `server-shutdown.js`
|
|
199
|
+
- Modify: `src/server/api/{proxy,codex-proxy,gemini-proxy,opencode-proxy,omp-proxy}.js`
|
|
200
|
+
- Delete after caller migration: `src/server/{proxy-server,codex-proxy-server,gemini-proxy-server,opencode-proxy-server,omp-proxy-server}.js`
|
|
201
|
+
- Modify: `src/commands/toggle-proxy.js`
|
|
202
|
+
- Modify: proxy Driver/API tests
|
|
203
|
+
|
|
204
|
+
- [ ] **Step 1: Split common listener infrastructure from platform behavior**
|
|
205
|
+
|
|
206
|
+
Extract only listener concerns into reusable infrastructure: Express app creation, HTTP server bind/close, shutdown hooks, request logging, health/scheduler callbacks, and runtime timestamps. Keep provider protocol logic in the platform Driver.
|
|
207
|
+
|
|
208
|
+
The Driver contract is:
|
|
209
|
+
|
|
210
|
+
```js
|
|
211
|
+
status(options = {})
|
|
212
|
+
start(options = {})
|
|
213
|
+
stop(options = {})
|
|
214
|
+
restoreOnBoot(options = {})
|
|
215
|
+
handleRequest(request, response, options = {})
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
- [ ] **Step 2: Move each proxy implementation by platform**
|
|
219
|
+
|
|
220
|
+
Move provider headers, target URLs, body conversion, stream conversion, retries, model collection, usage extraction, and native restoration into the corresponding Driver. Keep `claude-wire.js`, `codex-wire.js`, and `gemini-wire.js` only as stateless utilities when they have more than one caller; Driver orchestration must own their use.
|
|
221
|
+
|
|
222
|
+
OMP Driver must retain gateway drain, managed-provider routing, retry policy, and auth header mapping.
|
|
223
|
+
|
|
224
|
+
- [ ] **Step 3: Replace old proxy server exports with Runtime calls in every caller**
|
|
225
|
+
|
|
226
|
+
Update API, CLI, daemon, OAuth broadcast, channel API cache invalidation, and server shutdown paths to resolve `runtime.getDriver(platform, 'proxy')`. No production caller may require a `*-proxy-server.js` module.
|
|
227
|
+
|
|
228
|
+
- [ ] **Step 4: Remove platform branches from proxy APIs**
|
|
229
|
+
|
|
230
|
+
Keep old URL and payload compatibility. API flow:
|
|
231
|
+
|
|
232
|
+
```js
|
|
233
|
+
const driver = getPlatformRuntime().getDriver(platform, 'proxy');
|
|
234
|
+
const result = await driver.start(options);
|
|
235
|
+
return sendLegacyProxyResponse(res, result);
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Active-channel selection belongs to the channel Driver/shared channel application helper, not repeated in each API file.
|
|
239
|
+
|
|
240
|
+
- [ ] **Step 5: Add fake-upstream behavior tests**
|
|
241
|
+
|
|
242
|
+
For each platform, send a fake request through `handleRequest()` and assert target URL, headers, body conversion, streaming/non-streaming response, and typed failure. Assert failed upstream requests do not return HTTP 200 with an empty body.
|
|
243
|
+
|
|
244
|
+
- [ ] **Step 6: Run proxy regression**
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
npx vitest run tests/unit/platforms/drivers/*-proxy.test.js tests/unit/api/proxy-api.test.js tests/unit/api/codex-proxy-api.test.js tests/unit/api/gemini-proxy-api.test.js tests/unit/api/opencode-proxy-api.test.js tests/unit/api/omp-proxy-api.test.js
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
- [ ] **Step 7: Delete proxy server modules and commit**
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
git add src/platforms/drivers src/server/services src/server/api src/commands tests
|
|
254
|
+
git rm src/server/proxy-server.js src/server/codex-proxy-server.js src/server/gemini-proxy-server.js src/server/opencode-proxy-server.js src/server/omp-proxy-server.js
|
|
255
|
+
git commit -m "refactor: move platform proxy implementations into drivers"
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
### Task 4: Move sessions, statistics, and native configuration
|
|
261
|
+
|
|
262
|
+
**Files:**
|
|
263
|
+
- Modify: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/{sessions,statistics,native-config}.js`
|
|
264
|
+
- Create: platform-local helpers required by the moved implementations
|
|
265
|
+
- Modify: `src/server/services/session-history-index.js`, `session-history-worker.js`, `statistics-service.js`, `config-sync-manager.js`
|
|
266
|
+
- Delete after caller migration: platform `*-sessions.js`, `*-statistics-service.js`, and platform settings manager files under `src/server/services`
|
|
267
|
+
- Modify: all platform sessions/statistics API modules
|
|
268
|
+
- Modify: `src/commands/**` session/status callers
|
|
269
|
+
|
|
270
|
+
- [ ] **Step 1: Move session-history parsing and inventory ownership**
|
|
271
|
+
|
|
272
|
+
Move platform-specific inventory and parse functions from `src/server/services/session-history-adapters/{claude,codex,gemini,omp}.js` into each platform `sessions.js`. Keep SQLite schema, stale/complete consistency, cache invalidation, and worker orchestration in `session-history-index.js`.
|
|
273
|
+
|
|
274
|
+
The Driver must expose:
|
|
275
|
+
|
|
276
|
+
```js
|
|
277
|
+
inventory(options = {})
|
|
278
|
+
parse(descriptor, options = {})
|
|
279
|
+
listSessions(options = {})
|
|
280
|
+
recent(options = {})
|
|
281
|
+
search(query, options = {})
|
|
282
|
+
status(sessionId, options = {})
|
|
283
|
+
messages(sessionId, options = {})
|
|
284
|
+
delete(sessionId, options = {})
|
|
285
|
+
fork(sessionId, options = {})
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
- [ ] **Step 2: Move platform statistics logic**
|
|
289
|
+
|
|
290
|
+
Move platform pricing/usage parsing, request payload construction, and platform file persistence into `statistics.js`. Shared `statistics-service.js` aggregates Driver DTOs and does not require platform statistics services.
|
|
291
|
+
|
|
292
|
+
- [ ] **Step 3: Move native config implementations**
|
|
293
|
+
|
|
294
|
+
Move platform settings manager behavior into `native-config.js`: path resolution, backup/restore, protected writes, native OAuth synchronization, env/TOML/JSON serialization, and proxy configuration state. Keep path validation and permission policy shared.
|
|
295
|
+
|
|
296
|
+
- [ ] **Step 4: Convert session/statistics APIs and CLI callers**
|
|
297
|
+
|
|
298
|
+
Replace direct platform service imports with Runtime capability lookups. Preserve old route response shapes, `source`, project identifiers, and installed-CLI error messages. CLI status/session commands must resolve `sessions` and `statistics` Driver methods.
|
|
299
|
+
|
|
300
|
+
- [ ] **Step 5: Run session/statistics/native regression**
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
npx vitest run tests/unit/services/session-history-index.test.js tests/unit/services/statistics-service.test.js tests/unit/platforms/drivers/*-sessions.test.js tests/unit/platforms/drivers/*-statistics.test.js tests/unit/api/statistics.test.js
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
- [ ] **Step 6: Delete obsolete platform services and commit**
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
git add src/platforms/drivers src/server/services src/server/api src/commands tests
|
|
310
|
+
git rm src/server/services/codex-sessions.js src/server/services/gemini-sessions.js src/server/services/opencode-sessions.js src/server/services/omp-sessions.js src/server/services/claude-statistics-service.js src/server/services/codex-statistics-service.js src/server/services/gemini-statistics-service.js src/server/services/opencode-statistics-service.js src/server/services/omp-statistics-service.js
|
|
311
|
+
git commit -m "refactor: move session statistics and native config implementations"
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Delete only files proven to have no remaining production caller; retain generic `sessions.js` if it is the shared Claude/session application implementation and remove its platform-specific logic first.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
### Task 5: Move resource, prompt, MCP, and platform serialization behavior
|
|
319
|
+
|
|
320
|
+
**Files:**
|
|
321
|
+
- Modify: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/{resource-sync,prompts,mcp}.js`
|
|
322
|
+
- Modify: `src/server/services/config-sync-manager.js`, `config-templates-service.js`, `prompts-service.js`, `mcp-service.js`, `config-export-service.js`
|
|
323
|
+
- Modify: `src/server/services/project-config-adapters/*.js`
|
|
324
|
+
- Modify: related Driver/API tests
|
|
325
|
+
|
|
326
|
+
- [ ] **Step 1: Move platform-specific projections**
|
|
327
|
+
|
|
328
|
+
Each Driver owns native paths, format conversion, provider serialization, and remove/restore semantics. Shared services keep traversal, manifest precedence, permissions, secret redaction, and project root validation.
|
|
329
|
+
|
|
330
|
+
- [ ] **Step 2: Keep shared services capability-agnostic**
|
|
331
|
+
|
|
332
|
+
Replace platform-name branches with:
|
|
333
|
+
|
|
334
|
+
```js
|
|
335
|
+
for (const platform of runtime.list({ enabledOnly: true })) {
|
|
336
|
+
const driver = runtime.getDriver(platform.key, capability);
|
|
337
|
+
if (!driver || typeof driver[operation] !== 'function') continue;
|
|
338
|
+
await driver[operation](payload);
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
- [ ] **Step 3: Run resource/prompt/MCP regression**
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
npx vitest run tests/unit/services/config-sync-manager.test.js tests/unit/services/config-templates-service.test.js tests/unit/services/prompts-service.test.js tests/unit/services/mcp-service.test.js tests/unit/platforms/drivers/resource-sync.test.js tests/unit/platforms/drivers/capabilities.test.js
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
- [ ] **Step 4: Commit capability projection migration**
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
git add src/platforms/drivers src/server/services src/server/api tests
|
|
352
|
+
git commit -m "refactor: move platform resource projections into drivers"
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
### Task 6: Make CLI commands Runtime-driven
|
|
358
|
+
|
|
359
|
+
**Files:**
|
|
360
|
+
- Modify: `src/commands/channels.js`
|
|
361
|
+
- Modify: `src/commands/toggle-proxy.js`
|
|
362
|
+
- Modify: `src/commands/daemon.js`, `src/commands/status.js`, `src/commands/sessions.js` if present
|
|
363
|
+
- Modify: `src/platforms/drivers/*/channels.js`, `proxy.js`, `native-config.js`
|
|
364
|
+
- Test: `tests/unit/commands/channels.test.js`, `toggle-proxy.test.js`, `status.test.js`, and new `tests/unit/commands/runtime-driven-cli.test.js`
|
|
365
|
+
|
|
366
|
+
- [ ] **Step 1: Add generic capability access helpers**
|
|
367
|
+
|
|
368
|
+
Use one helper with no platform switch:
|
|
369
|
+
|
|
370
|
+
```js
|
|
371
|
+
function getCapability(platform, capability) {
|
|
372
|
+
const runtime = getPlatformRuntime();
|
|
373
|
+
return runtime.getDriver(normalizePlatformKey(platform), capability);
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
`getChannelServices()` returns normalized Driver methods and metadata; it must not contain `require('../server/services/...')` or platform comparisons.
|
|
378
|
+
|
|
379
|
+
- [ ] **Step 2: Move platform CLI policy into Driver metadata**
|
|
380
|
+
|
|
381
|
+
Expose `getCliMetadata()` from each channel/proxy Driver. OMP returns `{ supportsCliCreate: false, managedProviderConfig: true }`; other platforms return their actual supported operations. Default port comes from Driver metadata or the validated platform manifest, not a CLI map.
|
|
382
|
+
|
|
383
|
+
- [ ] **Step 3: Replace CLI proxy lifecycle branches**
|
|
384
|
+
|
|
385
|
+
`toggle-proxy.js` gets `channels`, `proxy`, and `nativeConfig` Drivers from Runtime. Active channel restoration calls `channels.getBestChannelForRestore()` and `channels.applyChannelToSettings()`. It must not load `*-proxy-server.js`, `*-channels.js`, or `*-settings-manager.js`.
|
|
386
|
+
|
|
387
|
+
- [ ] **Step 4: Add config-only CLI regression**
|
|
388
|
+
|
|
389
|
+
Register a test-only `demo-cli` manifest with generic channels/proxy metadata. Verify CLI capability resolution works without adding a platform branch or editing a command source file.
|
|
390
|
+
|
|
391
|
+
- [ ] **Step 5: Run CLI tests and commit**
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
npx vitest run tests/unit/commands/channels.test.js tests/unit/commands/toggle-proxy.test.js tests/unit/commands/runtime-driven-cli.test.js tests/unit/platforms/demo-cli-contract.test.js
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
git add src/commands src/platforms/drivers tests
|
|
399
|
+
git commit -m "refactor: make CLI commands runtime-driven"
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
### Task 7: Remove legacy mappings, facades, and orphan files
|
|
405
|
+
|
|
406
|
+
**Files:**
|
|
407
|
+
- Modify: `src/platforms/drivers/legacy.js`
|
|
408
|
+
- Modify: `src/platforms/runtime.js`, `src/platforms/driver-registry.js` if required by removed registrations
|
|
409
|
+
- Modify: `scripts/test-driver-reachability.js`
|
|
410
|
+
- Delete: only server platform implementations with zero production/test-supported callers
|
|
411
|
+
- Modify: affected tests and mocks
|
|
412
|
+
|
|
413
|
+
- [ ] **Step 1: Remove migrated mappings from `legacy.js`**
|
|
414
|
+
|
|
415
|
+
Delete mappings for migrated platform channels, proxies, sessions, statistics, native config, prompts, MCP, and resource sync. `legacy.js` may retain only compatibility registration metadata and generic unsupported behavior; it must not point at platform implementation files under `src/server`.
|
|
416
|
+
|
|
417
|
+
- [ ] **Step 2: Search all production callers**
|
|
418
|
+
|
|
419
|
+
Run targeted repository searches for every deleted module name and classify any remaining result. Migrate valid callers before deletion. Keep only explicitly documented dynamic worker entries and generic infrastructure.
|
|
420
|
+
|
|
421
|
+
- [ ] **Step 3: Delete obsolete facades**
|
|
422
|
+
|
|
423
|
+
Delete a server facade only after all public API/CLI callers and test mocks use Runtime. Internal `require.resolve` compatibility is not preserved unless it is an explicitly supported public integration.
|
|
424
|
+
|
|
425
|
+
- [ ] **Step 4: Extend reachability checks**
|
|
426
|
+
|
|
427
|
+
Require the script to fail if:
|
|
428
|
+
|
|
429
|
+
- a built-in Driver loads `src/server` platform implementation;
|
|
430
|
+
- a command module contains a platform-specific require or branch;
|
|
431
|
+
- a deleted server platform module is imported;
|
|
432
|
+
- a Driver capability is only a `servicePath`/`localServicePath` wrapper.
|
|
433
|
+
|
|
434
|
+
- [ ] **Step 5: Commit cleanup**
|
|
435
|
+
|
|
436
|
+
```bash
|
|
437
|
+
git add src/platforms src/server src/commands scripts tests
|
|
438
|
+
git commit -m "refactor: remove obsolete platform service implementations"
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
### Task 8: Validate behavior and publish the follow-up PR
|
|
444
|
+
|
|
445
|
+
**Files:**
|
|
446
|
+
- Modify: tests only if a behavior gap is found
|
|
447
|
+
- Modify: plan/checklist only for completed steps
|
|
448
|
+
|
|
449
|
+
- [ ] **Step 1: Run focused migration tests**
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
npx vitest run tests/unit/platforms/drivers tests/unit/commands/runtime-driven-cli.test.js tests/unit/services/session-history-index.test.js
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
- [ ] **Step 2: Run API consistency**
|
|
456
|
+
|
|
457
|
+
```bash
|
|
458
|
+
npm run test:api
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
Expected: all existing API consistency checks pass.
|
|
462
|
+
|
|
463
|
+
- [ ] **Step 3: Run reachability and diff checks**
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
node scripts/test-driver-reachability.js
|
|
467
|
+
git diff --check
|
|
468
|
+
git status --short
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
Expected: no unexplained orphan modules and clean status after commit.
|
|
472
|
+
|
|
473
|
+
- [ ] **Step 4: Run the actual CLI smoke paths**
|
|
474
|
+
|
|
475
|
+
Exercise `--help`, `channel-status`, `switch-channel`, `toggle-proxy`, and `daemon` with mocked native/provider dependencies. Verify old command names, output status, and unsupported capability messages remain stable.
|
|
476
|
+
|
|
477
|
+
- [ ] **Step 5: Run full unit tests**
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
npm run test:unit
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
Record any environment-only failures exactly; do not report the suite as fully passing when Pinia resolution or unrelated plugin timeout failures occur.
|
|
484
|
+
|
|
485
|
+
- [ ] **Step 6: Review final ownership**
|
|
486
|
+
|
|
487
|
+
Search for:
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
rg "server/(?:services/)?(?:gemini|opencode|omp|codex|claude)-(?:channels|sessions|statistics|settings)|server/(?:codex|gemini|opencode|omp)?-proxy-server|cliType ===" src
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
The only allowed matches are HTTP facade names/comments and explicitly classified shared protocol/infrastructure utilities.
|
|
494
|
+
|
|
495
|
+
- [ ] **Step 7: Commit any final test-only corrections**
|
|
496
|
+
|
|
497
|
+
```bash
|
|
498
|
+
git add tests scripts
|
|
499
|
+
git commit -m "test: verify platform implementation ownership"
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
- [ ] **Step 8: Push and create the follow-up PR**
|
|
503
|
+
|
|
504
|
+
```bash
|
|
505
|
+
git push -u origin refactor/move-platform-implementations-to-drivers
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
Create a PR targeting `develop` with the ownership boundary, deleted modules, focused verification, API verification, reachability output, and any full-suite environment failures listed explicitly.
|