coding-tool-x 3.8.3 → 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 +18 -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 +13 -8
- 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,213 @@
|
|
|
1
|
+
# OMP Skill Refresh Boundary 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:** Make the OMP Skill panel's local scan path explicit and ensure only the manual “刷新远端” action can enqueue a remote Skill refresh.
|
|
6
|
+
|
|
7
|
+
**Architecture:** Keep the existing scan/refresh API split. Rename the generic `SkillsPanel.vue` list-loading operation to `scanLocalSkills`, route every lifecycle/update callback through it, and leave `handleRefresh` as the only caller of `refreshSkills`. Preserve the existing server GET scan-only contract and lock it with an OMP-specific API test; rebuild the ignored Web bundle for deployment verification.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Vue 3 `<script setup>`, Vitest, Vue Test Utils, Express, Supertest, Vite, Node.js.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
### Task 1: Lock OMP panel scan-only lifecycle
|
|
14
|
+
|
|
15
|
+
**Files:**
|
|
16
|
+
- Modify: `src/web/src/components/__tests__/SkillsPanelSwitch.test.js`
|
|
17
|
+
- Modify: `src/web/src/components/SkillsPanel.vue:260-286,297,430,454,468-486`
|
|
18
|
+
|
|
19
|
+
- [ ] **Step 1: Extend the frontend test fixture to include OMP**
|
|
20
|
+
|
|
21
|
+
Add OMP to the mocked platform catalog and retain the existing `getSkills`, `refreshSkills`, and task mocks. Add a helper that mounts the real `SkillsPanel` with explicit OMP props:
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
async function createOmpWrapper(props = {}) {
|
|
25
|
+
const { default: SkillsPanel } = await import('../SkillsPanel.vue')
|
|
26
|
+
return mount(SkillsPanel, {
|
|
27
|
+
props: { platform: 'omp', ...props },
|
|
28
|
+
global: {
|
|
29
|
+
stubs: {
|
|
30
|
+
SkillCard: { template: '<div />' },
|
|
31
|
+
SkillRepoManager: { template: '<div />' },
|
|
32
|
+
SkillCreateModal: { template: '<div />' },
|
|
33
|
+
SkillDetailDrawer: { template: '<div />' },
|
|
34
|
+
OmpSkillSettingsModal: { template: '<div />' }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- [ ] **Step 2: Add the OMP mount and drawer-open regression assertions**
|
|
42
|
+
|
|
43
|
+
Add tests that exercise both initial standalone rendering and a hidden-then-visible drawer. The assertions must distinguish a local GET scan from the remote refresh command:
|
|
44
|
+
|
|
45
|
+
```js
|
|
46
|
+
test.each([
|
|
47
|
+
{ inDrawer: false, drawerVisible: false },
|
|
48
|
+
{ inDrawer: true, drawerVisible: true }
|
|
49
|
+
])('OMP panel load scans local state without remote refresh (%o)', async props => {
|
|
50
|
+
const wrapper = await createOmpWrapper(props)
|
|
51
|
+
await flushPromises()
|
|
52
|
+
|
|
53
|
+
expect(api.getSkills).toHaveBeenCalledWith('omp', {})
|
|
54
|
+
expect(api.refreshSkills).not.toHaveBeenCalled()
|
|
55
|
+
wrapper.unmount()
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
test('opening a hidden OMP drawer scans once without enqueuing refresh', async () => {
|
|
59
|
+
const wrapper = await createOmpWrapper({ inDrawer: true, drawerVisible: false })
|
|
60
|
+
await flushPromises()
|
|
61
|
+
expect(api.getSkills).not.toHaveBeenCalled()
|
|
62
|
+
|
|
63
|
+
await wrapper.setProps({ drawerVisible: true })
|
|
64
|
+
await flushPromises()
|
|
65
|
+
|
|
66
|
+
expect(api.getSkills).toHaveBeenCalledWith('omp', {})
|
|
67
|
+
expect(api.refreshSkills).not.toHaveBeenCalled()
|
|
68
|
+
wrapper.unmount()
|
|
69
|
+
})
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Run before the production rename:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npm run test:unit -- --run src/components/__tests__/SkillsPanelSwitch.test.js
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Expected baseline: the existing source's scan-only behavior remains green; this is a regression characterization because the reported behavior is not reproducible in the checked-out source. Do not change the assertions to force a false failure.
|
|
79
|
+
|
|
80
|
+
- [ ] **Step 3: Rename the generic loader to make the boundary explicit**
|
|
81
|
+
|
|
82
|
+
In `src/web/src/components/SkillsPanel.vue`, rename `loadData` to `scanLocalSkills` and update every non-refresh reference:
|
|
83
|
+
|
|
84
|
+
```js
|
|
85
|
+
async function scanLocalSkills({ notifyError = true } = {}) {
|
|
86
|
+
// Keep the existing request-id, platform/scope checks, GET getSkills call,
|
|
87
|
+
// response validation, state assignment, and error handling unchanged.
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Update these call sites to `scanLocalSkills`:
|
|
92
|
+
|
|
93
|
+
- `SkillRepoManager @updated`;
|
|
94
|
+
- `SkillCreateModal @created`;
|
|
95
|
+
- `SkillDetailDrawer @updated`;
|
|
96
|
+
- `handleImport` completion;
|
|
97
|
+
- `handleRefresh` completion after task polling;
|
|
98
|
+
- `handleOmpSettingsSaved` passed callback;
|
|
99
|
+
- standalone `onMounted` load;
|
|
100
|
+
- `drawerVisible` watcher;
|
|
101
|
+
- platform/scope/project-path watcher.
|
|
102
|
+
|
|
103
|
+
Keep `handleRefresh` unchanged in responsibility: it alone calls `refreshSkills(platform, scopeOptions.value)`, polls `getSkillRefreshTask`, and calls `scanLocalSkills()` after a terminal task. No lifecycle callback may call `refreshSkills` or pass a boolean force argument.
|
|
104
|
+
|
|
105
|
+
- [ ] **Step 4: Re-run the focused frontend tests**
|
|
106
|
+
|
|
107
|
+
Run:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
npm run test:unit -- --run src/components/__tests__/SkillsPanelSwitch.test.js
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Expected: all tests pass; the OMP mount/open cases show `getSkills('omp', {})` and zero `refreshSkills` calls.
|
|
114
|
+
|
|
115
|
+
- [ ] **Step 5: Commit the frontend boundary change**
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
git add src/web/src/components/SkillsPanel.vue src/web/src/components/__tests__/SkillsPanelSwitch.test.js
|
|
119
|
+
git commit -m "fix: keep OMP skill panel scans local"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### Task 2: Lock the server scan-only contract for OMP
|
|
125
|
+
|
|
126
|
+
**Files:**
|
|
127
|
+
- Modify: `tests/unit/api/skills-api.test.js:718-750`
|
|
128
|
+
- Verify only: `src/server/api/skills.js:145-209`
|
|
129
|
+
|
|
130
|
+
- [ ] **Step 1: Add an OMP-specific GET regression test**
|
|
131
|
+
|
|
132
|
+
Within `describe('new Skill control surface')`, add a test using the existing injected service fixture:
|
|
133
|
+
|
|
134
|
+
```js
|
|
135
|
+
test('OMP GET ignores refresh query and never starts remote work', async () => {
|
|
136
|
+
const ompService = services.omp
|
|
137
|
+
ompService.scanSkills = vi.fn(async () => ({
|
|
138
|
+
skills: [{ name: 'omp-local', enabled: false, cached: true, managed: true }],
|
|
139
|
+
refresh: { state: 'never_fetched', taskId: null, fetchedAt: null, error: null }
|
|
140
|
+
}))
|
|
141
|
+
ompService.refreshRemoteSkills = vi.fn()
|
|
142
|
+
|
|
143
|
+
const app = buildInjectedApp({
|
|
144
|
+
controlService: { setSkillEnabled: vi.fn() },
|
|
145
|
+
refreshTasks: { enqueue: vi.fn(), get: vi.fn() }
|
|
146
|
+
})
|
|
147
|
+
const res = await request(app).get('/?platform=omp&refresh=1')
|
|
148
|
+
|
|
149
|
+
expect(res.status).toBe(200)
|
|
150
|
+
expect(ompService.scanSkills).toHaveBeenCalledWith({ scope: 'user' })
|
|
151
|
+
expect(ompService.refreshRemoteSkills).not.toHaveBeenCalled()
|
|
152
|
+
})
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
- [ ] **Step 2: Run the server regression test before any server edit**
|
|
156
|
+
|
|
157
|
+
Run:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
npm exec -- vitest run tests/unit/api/skills-api.test.js -t "OMP GET ignores refresh query and never starts remote work"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Expected baseline: PASS, confirming the server boundary is already correct in the checked-out source. No server production change is required unless this test exposes a regression.
|
|
164
|
+
|
|
165
|
+
- [ ] **Step 3: Commit the server contract test**
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
git add tests/unit/api/skills-api.test.js
|
|
169
|
+
git commit -m "test: cover OMP scan-only skill listing"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
### Task 3: Rebuild and verify the deployed behavior
|
|
175
|
+
|
|
176
|
+
**Files:**
|
|
177
|
+
- Modify generated ignored output: `dist/web/` (via the existing build command; do not stage it)
|
|
178
|
+
|
|
179
|
+
- [ ] **Step 1: Run focused frontend and server tests together**
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
npm run test:unit -- --run src/components/__tests__/SkillsPanelSwitch.test.js
|
|
183
|
+
npm exec -- vitest run tests/unit/api/skills-api.test.js tests/unit/services/skill-service.test.js -t "OMP GET ignores refresh query and never starts remote work|scanSkills never performs a network refresh|scanSkills does not refresh remote OMP repositories"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Expected: all selected tests pass, with no `POST /skills/refresh` on panel mount/open paths.
|
|
187
|
+
|
|
188
|
+
- [ ] **Step 2: Rebuild the production Web bundle**
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
npm run build:web
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Expected: Vite completes successfully and the generated bundle contains the scan-only `GET /skills` request path; `refreshSkills` remains reachable only from the explicit refresh handler.
|
|
195
|
+
|
|
196
|
+
- [ ] **Step 3: Run the original browser smoke scenario**
|
|
197
|
+
|
|
198
|
+
Use the actual Web UI to:
|
|
199
|
+
|
|
200
|
+
1. open `/cli/omp`;
|
|
201
|
+
2. open the Skills drawer;
|
|
202
|
+
3. record API requests during each action.
|
|
203
|
+
|
|
204
|
+
Expected: panel load/open produces `GET /api/skills?platform=omp&scope=user` and no `POST /api/skills/refresh`. The existing independent `GET /api/channel-balances?source=omp` balance probe is not part of this Skill-refresh assertion.
|
|
205
|
+
|
|
206
|
+
- [ ] **Step 4: Commit only tracked source/test changes and report deployment requirement**
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
git status --short
|
|
210
|
+
git log -2 --oneline
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Expected: only the pre-existing untracked `.omx/` and `.worktrees/` entries remain outside the two task commits. Deployment must rebuild `dist/` and restart any existing backend process; a stale process or stale packaged bundle can retain the old behavior even when source tests pass.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# 实时日志面板空白修复 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:** 修复渠道管理页未渲染 `ProxyLogs` 导致实时日志区域空白的问题。
|
|
6
|
+
|
|
7
|
+
**Architecture:** 保持现有日志数据流和组件边界不变,仅在 `RightPanel.vue` 显式导入其模板使用的 `ProxyLogs.vue`。使用仓库已有的静态前端组件测试模式增加回归断言,并通过前端构建和真实页面冒烟验证渲染结果。
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Vue 3 `<script setup>`、Vite、Vitest、Node.js。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
### Task 1: Add regression coverage for component registration
|
|
14
|
+
|
|
15
|
+
**Files:**
|
|
16
|
+
- Modify: `tests/unit/web/log-components.test.js`
|
|
17
|
+
|
|
18
|
+
- [ ] **Step 1: Write the failing test**
|
|
19
|
+
|
|
20
|
+
在现有 `describe('web log components source routing', ...)` 中追加:
|
|
21
|
+
|
|
22
|
+
```js
|
|
23
|
+
test('RightPanel registers the ProxyLogs component used by its template', () => {
|
|
24
|
+
const source = readProjectFile('src/web/src/components/RightPanel.vue')
|
|
25
|
+
|
|
26
|
+
expect(source).toContain("import ProxyLogs from './ProxyLogs.vue'")
|
|
27
|
+
expect(source).toContain('<ProxyLogs :source="currentChannel" />')
|
|
28
|
+
})
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- [ ] **Step 2: Run the focused test and verify it fails**
|
|
32
|
+
|
|
33
|
+
Run from repository root:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npx vitest run tests/unit/web/log-components.test.js
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Expected: the new test fails because `RightPanel.vue` currently has no `ProxyLogs` import.
|
|
40
|
+
|
|
41
|
+
- [ ] **Step 3: Confirm failure is the intended regression**
|
|
42
|
+
|
|
43
|
+
The failure must identify the missing import assertion, not a test parse/setup error. Do not change production code before this failure is observed.
|
|
44
|
+
|
|
45
|
+
### Task 2: Register and render the existing log component
|
|
46
|
+
|
|
47
|
+
**Files:**
|
|
48
|
+
- Modify: `src/web/src/components/RightPanel.vue:147-152`
|
|
49
|
+
|
|
50
|
+
- [ ] **Step 1: Add the minimal import**
|
|
51
|
+
|
|
52
|
+
Add the import alongside the other channel panel imports:
|
|
53
|
+
|
|
54
|
+
```js
|
|
55
|
+
import ProxyLogs from './ProxyLogs.vue'
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Do not change the existing template binding:
|
|
59
|
+
|
|
60
|
+
```vue
|
|
61
|
+
<ProxyLogs :source="currentChannel" />
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Do not modify `ProxyLogs.vue`, WebSocket handling, Pinia state, statistics APIs, or layout CSS.
|
|
65
|
+
|
|
66
|
+
- [ ] **Step 2: Run the focused regression test**
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx vitest run tests/unit/web/log-components.test.js
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Expected: all tests in this file pass.
|
|
73
|
+
|
|
74
|
+
- [ ] **Step 3: Build the frontend**
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm run build:web
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Expected: Vite completes successfully without unresolved component warnings or build errors.
|
|
81
|
+
|
|
82
|
+
### Task 3: Verify the real channel-management surface
|
|
83
|
+
|
|
84
|
+
**Files:**
|
|
85
|
+
- No source changes.
|
|
86
|
+
|
|
87
|
+
- [ ] **Step 1: Open the running local application**
|
|
88
|
+
|
|
89
|
+
Use the existing local service at `http://localhost:19999` and navigate to:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
http://localhost:19999/cli/omp
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- [ ] **Step 2: Verify the rendered log panel**
|
|
96
|
+
|
|
97
|
+
Confirm the right panel contains:
|
|
98
|
+
|
|
99
|
+
- `实时日志`
|
|
100
|
+
- the table header (`渠道`, `请求`, `回复`, platform-specific columns, `时间`)
|
|
101
|
+
- either existing log rows or `暂无日志`
|
|
102
|
+
- the connection status footer
|
|
103
|
+
|
|
104
|
+
The `.logs-section` must contain rendered `.proxy-logs` content rather than an unresolved `<proxylogs>` custom element.
|
|
105
|
+
|
|
106
|
+
- [ ] **Step 3: Verify the changed contract after build**
|
|
107
|
+
|
|
108
|
+
Refresh the page and repeat the check on at least one other channel route, such as `/cli/codex` or `/cli/claude`. Existing dashboard log behavior must remain intact.
|
|
109
|
+
|
|
110
|
+
### Task 4: Final review and cleanup
|
|
111
|
+
|
|
112
|
+
**Files:**
|
|
113
|
+
- Review only: `src/web/src/components/RightPanel.vue`, `tests/unit/web/log-components.test.js`
|
|
114
|
+
|
|
115
|
+
- [ ] **Step 1: Inspect the final diff**
|
|
116
|
+
|
|
117
|
+
Confirm only the intended import and regression test are present, and existing user modifications remain untouched.
|
|
118
|
+
|
|
119
|
+
- [ ] **Step 2: Run the focused test once more**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
npx vitest run tests/unit/web/log-components.test.js
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Expected: PASS.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# 配置化平台边界实施计划
|
|
2
|
+
|
|
3
|
+
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax.
|
|
4
|
+
|
|
5
|
+
**Goal:** 删除平台专属 API 和项目配置适配器目录,把平台业务收敛到 Driver,把跨平台核心工具收敛到 `src/shared`。
|
|
6
|
+
|
|
7
|
+
**Architecture:** 保留一个通用 platform API route factory,使用 manifest 的 aliases、capabilities 和 route definitions 生成旧 URL;Driver 提供平台操作和校验。`src/server` 只保留 HTTP 注册、请求响应转换、通用服务与基础设施;`src/platforms/drivers/<platform>` 不创建 shared 子目录。
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Node.js 22、CommonJS、Express、Vitest、现有 Registry/Runtime/manifest loader。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
### Task 1: 搬迁共享项目配置核心
|
|
14
|
+
|
|
15
|
+
**Files:**
|
|
16
|
+
- Create: `src/shared/project-config.js`
|
|
17
|
+
- Modify: `src/server/services/project-config-service.js`
|
|
18
|
+
- Modify: `src/server/services/mcp-service.js`
|
|
19
|
+
- Modify: `src/server/services/config-templates-service.js`
|
|
20
|
+
- Modify: `src/server/services/config-sync-manager.js`
|
|
21
|
+
- Modify: `src/server/services/skill-service.js`
|
|
22
|
+
- Modify: `src/server/services/skill-projection-service.js`
|
|
23
|
+
- Modify: `src/server/api/mcp.js`
|
|
24
|
+
- Create/modify: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/project-config.js`
|
|
25
|
+
- Delete: `src/server/services/project-config-adapters/`
|
|
26
|
+
- Test: affected project-config and MCP tests
|
|
27
|
+
|
|
28
|
+
- [ ] 将 `project-config-adapters/shared.js` 的通用路径安全、JSON/TOML 原子读写、MCP patch、secret 脱敏函数搬到 `src/shared/project-config.js`,只修正相对 import。
|
|
29
|
+
- [ ] 将五个平台 adapter 搬到对应 Driver 的 `project-config.js`,导出相同 `createAdapter`,平台格式仅由 Driver 自身实现。
|
|
30
|
+
- [ ] 修改 `ProjectConfigService`,从 Runtime/manifest 获取 `projectConfig` Driver,不再维护 `FACTORIES` 和旧目录路径。
|
|
31
|
+
- [ ] 将通用服务和 API 的 shared import 统一改为 `src/shared/project-config`。
|
|
32
|
+
- [ ] 删除旧 `project-config-adapters` 目录。
|
|
33
|
+
- [ ] 运行 `npx vitest run tests/unit/services/project-config-service.test.js tests/unit/services/mcp-service.test.js tests/unit/api/project-config.test.js --no-file-parallelism --maxWorkers=1`。
|
|
34
|
+
|
|
35
|
+
### Task 2: 建立配置化平台 API 路由描述
|
|
36
|
+
|
|
37
|
+
**Files:**
|
|
38
|
+
- Create: `src/server/api/platform-api-config.js`
|
|
39
|
+
- Modify: `src/platforms/manifest-schema.js`
|
|
40
|
+
- Modify: `src/platforms/manifests/*.json`
|
|
41
|
+
- Modify: `src/platforms/drivers/legacy.js`
|
|
42
|
+
- Modify: `src/server/api/platform-route-factory.js`
|
|
43
|
+
- Test: platform registry and route factory tests
|
|
44
|
+
|
|
45
|
+
- [ ] 为 manifest 增加可选 `api` 描述,包含平台旧 URL alias 和 capability route operation;schema 严格校验 path、method、capability、operation。
|
|
46
|
+
- [ ] 把各平台共同的 projects、sessions、channels、proxy、statistics 路由整理成一份配置,不复制五份 Express route 文件。
|
|
47
|
+
- [ ] 在 route factory 中统一解析 platform、project、session、channel 参数,调用 Runtime Driver,并统一映射 `ok/unsupported/invalid/failed`。
|
|
48
|
+
- [ ] 将仅平台不同的参数名、安装检测、默认值和校验作为 Driver operation 或 manifest data,不在路由 factory 中写平台分支。
|
|
49
|
+
- [ ] 为旧 `/api/channels`、`/api/codex/...`、`/api/gemini/...`、`/api/opencode/...`、`/api/omp/...` 注册 aliases。
|
|
50
|
+
- [ ] 添加未知平台、unsupported capability、Driver error 和旧 URL 等价响应测试。
|
|
51
|
+
|
|
52
|
+
### Task 3: 将平台 API 业务下沉到 Driver
|
|
53
|
+
|
|
54
|
+
**Files:**
|
|
55
|
+
- Create: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/api-operations.js`
|
|
56
|
+
- Modify: corresponding channel/proxy/session/statistics/config Driver files
|
|
57
|
+
- Modify: `src/server/index.js`
|
|
58
|
+
- Delete: platform-specific files under `src/server/api/`
|
|
59
|
+
- Modify: API tests to exercise generic router and old aliases
|
|
60
|
+
|
|
61
|
+
- [ ] 从平台 API 文件提取 provider 校验、CLI 安装检测、默认模型、speed-test、native config、session operation 和 platform DTO 到对应 `api-operations.js` 或现有 capability Driver。
|
|
62
|
+
- [ ] 保持旧请求参数和响应格式,由 operation adapter 生成兼容 DTO;通用路由只负责调用和输出。
|
|
63
|
+
- [ ] 让每个平台 Driver 暴露相同 operation names,不支持的 operation 返回结构化 `unsupported`。
|
|
64
|
+
- [ ] 用一个通用 router 替换 server index 中的平台 API require/mount 列表。
|
|
65
|
+
- [ ] 删除 `codex-channels.js`、`gemini-channels.js`、`opencode-channels.js`、`omp-channels.js`、各平台 proxy/projects/sessions/statistics API 文件及不再需要的单独路由目录。
|
|
66
|
+
- [ ] 保留真正通用的 `platform-route-factory.js`、validation、response 和 websocket 基础设施。
|
|
67
|
+
|
|
68
|
+
### Task 4: 清理引用和迁移测试
|
|
69
|
+
|
|
70
|
+
**Files:**
|
|
71
|
+
- Modify: all production imports of deleted API/config adapter paths
|
|
72
|
+
- Modify: tests under `tests/unit/api`, `tests/unit/services`, `tests/unit/platforms`
|
|
73
|
+
- Delete: tests that only assert deleted platform route modules
|
|
74
|
+
|
|
75
|
+
- [ ] 全局搜索并消除 `src/server/api/<platform>-*.js` 和 `src/server/services/project-config-adapters` 的生产及测试引用。
|
|
76
|
+
- [ ] 将 require.cache mock seam 改为 generic router 或 Driver operation seam。
|
|
77
|
+
- [ ] 删除仅覆盖重复路由实现的测试,保留每个平台的行为 contract test。
|
|
78
|
+
- [ ] 检查 `src/platforms/drivers` 不存在 `shared` 子目录。
|
|
79
|
+
|
|
80
|
+
### Task 5: 完整验证与提交
|
|
81
|
+
|
|
82
|
+
- [ ] 运行所有 API、Driver、项目配置和 CLI 相关测试。
|
|
83
|
+
- [ ] 运行完整 `npx vitest run tests/unit --no-file-parallelism --maxWorkers=1 --testTimeout=30000`。
|
|
84
|
+
- [ ] 运行所有平台 capability Driver 加载冒烟和 `git diff --check`。
|
|
85
|
+
- [ ] 检查工作树无测试生成数据库差异。
|
|
86
|
+
- [ ] 提交:`refactor: make platform APIs configuration-driven`。
|