coding-tool-x 3.8.4 → 3.8.6
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-Db9wAyaZ.js +1 -0
- package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +1 -0
- package/dist/web/assets/Analytics-C4gMzv7g.js +1 -0
- package/dist/web/assets/Analytics-CyHhR126.css +1 -0
- package/dist/web/assets/AssetPathField-Bd_nMFu3.js +1 -0
- package/dist/web/assets/ChatHistoryDrawer-B2qBQs9L.css +1 -0
- package/dist/web/assets/ChatHistoryDrawer-CwzJHyNP.js +1 -0
- package/dist/web/assets/CollapseItem-CTCfSiue.js +1 -0
- package/dist/web/assets/CommandsDrawer-BZJxlPvV.css +1 -0
- package/dist/web/assets/CommandsDrawer-vDghB1U9.js +1 -0
- package/dist/web/assets/ConfigExportDrawer-C-XDvlHc.js +1 -0
- package/dist/web/assets/ConfigExportDrawer-dwruRKWr.css +1 -0
- package/dist/web/assets/ConfigTemplates-CYY8XRED.js +1 -0
- package/dist/web/assets/ConfigTemplatesDrawer-BfDi8yO3.css +1 -0
- package/dist/web/assets/ConfigTemplatesDrawer-CbsJp76X.js +1 -0
- package/dist/web/assets/ConfigTemplatesPanel-CWyPtk67.css +1 -0
- package/dist/web/assets/ConfigTemplatesPanel-liMSTh7s.js +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-D6QSiYaL.js +1 -0
- package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +1 -0
- package/dist/web/assets/GatewayConvertDrawer-RvET6iNG.js +1 -0
- package/dist/web/assets/Home-CSuFuJ9Y.css +1 -0
- package/dist/web/assets/Home-P8eseZcf.js +1 -0
- package/dist/web/assets/MarkdownEditor-CYmLGYju.js +1 -0
- package/dist/web/assets/MarkdownEditor-qfVgSre_.css +1 -0
- package/dist/web/assets/McpDrawer-C0dnsZhQ.css +1 -0
- package/dist/web/assets/McpDrawer-Ch3bkKIq.js +1 -0
- package/dist/web/assets/McpFormDrawer-BRbDcawn.css +1 -0
- package/dist/web/assets/McpFormDrawer-BcTlgSpN.js +1 -0
- package/dist/web/assets/PluginManager-Dh2o0xkZ.js +1 -0
- package/dist/web/assets/PluginsDrawer-DM3QjprE.css +1 -0
- package/dist/web/assets/PluginsDrawer-deKQ5u3I.js +1 -0
- package/dist/web/assets/PluginsPanel-BofsgQgj.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-DhSWJHTA.js +1 -0
- package/dist/web/assets/PromptsDrawer-BIgiYCEQ.css +1 -0
- package/dist/web/assets/PromptsDrawer-Cfb2FeeU.js +1 -0
- package/dist/web/assets/RecentSessionsDrawer-3eXamJhr.js +1 -0
- package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +1 -0
- package/dist/web/assets/SessionCard-CW0eHURI.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-DQfyDGWU.js +1 -0
- package/dist/web/assets/SettingsDrawer-Dw5NUgHC.css +1 -0
- package/dist/web/assets/SettingsDrawer-u_vwUuPS.js +1 -0
- package/dist/web/assets/SkillManager-C0GCT2Kb.css +1 -0
- package/dist/web/assets/SkillManager-DHMprJLA.js +1 -0
- package/dist/web/assets/SkillsDrawer-BCNme-aJ.css +1 -0
- package/dist/web/assets/SkillsDrawer-CkF3BpyC.js +1 -0
- package/dist/web/assets/SkillsPanel-B3Nm5j32.css +1 -0
- package/dist/web/assets/SkillsPanel-DWE4pFGx.js +1 -0
- package/dist/web/assets/SpeedTestDrawer-BgfG1Ked.js +1 -0
- package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +1 -0
- package/dist/web/assets/Upload-CNwaGOws.js +1 -0
- package/dist/web/assets/WorkspaceDrawer-Br5CeCzL.js +1 -0
- package/dist/web/assets/WorkspaceDrawer-CGnMu9p1.css +1 -0
- package/dist/web/assets/WorkspaceManager-B2O8-qIw.js +1 -0
- package/dist/web/assets/WorkspacePanel-5oDKit3c.js +1 -0
- package/dist/web/assets/WorkspacePanel-D0-zHTHP.css +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-BMAUPq5K.js +2 -0
- package/dist/web/assets/index-Bi1MQHYX.css +1 -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-jbmqZuJs.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 +104 -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 +165 -0
- package/src/platforms/channel-auth-service.js +107 -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 +98 -418
- package/src/{server/services → platforms}/notification-hooks.js +190 -1023
- package/src/platforms/oauth-credentials-service.js +635 -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 +133 -24
- 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 +12 -2
- 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 +876 -214
- 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
package/CHANGELOG.md
CHANGED
|
@@ -5,8 +5,21 @@
|
|
|
5
5
|
该项目遵循 [Semantic Versioning](https://semver.org/)。
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
|
+
### Added
|
|
9
|
+
- **原生路径可配置** - 新增 `~/.cc-tool/config/platform-paths.json` 路径覆盖层;Claude、Codex、Gemini、OpenCode、OMP 及新增 Registry 平台的原生配置、会话状态、渠道、Skills、Plugins 和请求快照均可按平台重定向,未配置时保持原有默认路径,不自动搬迁已有数据。
|
|
10
|
+
- **配置驱动的平台 Registry** - 新增 Manifest 校验、allowlisted capability driver、`~/.cc-tool/config/platforms.json` 用户扩展和安全的 `GET /api/platforms` 公共目录;符合通用协议的 CLI 可通过受控 Manifest / driver 扩展,但不会自动获得任意平台的完整能力。
|
|
11
|
+
- **Registry-backed CLI / Web UI 路由** - 代理、日志、统计、端口配置、Dashboard 聚合和前端平台元数据改为从 Registry 派生,同时保留旧 CLI/API facade、OMP managed mode 与现有测试 mock seam。
|
|
12
|
+
- **项目级配置控制** - 在项目历史会话页管理原生项目指令、Skills 和 MCP,配置按项目 realpath 隔离并保留用户级配置。
|
|
13
|
+
- **Skill 有效控制面** - Skill 仓库只保存 source reference;手动刷新异步下载仓库中全部 Skill 的完整目录,不保存仓库归档或 tree,并按五个平台的 native format 分开持久化
|
|
14
|
+
- **Skill 缓存与开关** - 所有扫描到的 Skill 默认登记为 `managed=true`;新远端 Skill 默认 `needs_review/disabled`,`enabled` 控制实际 CLI/OMP 加载,关闭只撤销 native projection
|
|
15
|
+
- **配置驱动通知设置** - Hooks capability、可信 hooks/provider adapter 和公开字段 schema 统一从平台注册表发现;设置面板可消费新增平台/provider 描述,无需重复维护前端模板。
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- **兼容性边界明确** - 用户配置禁止任意 Node.js 模块、函数值和 shell 命令;特殊 SQLite、OAuth/keychain、非标准配置及 fork 语义继续由专用 capability driver 负责;既有 CLI/API 兼容路径与 mock seam 保持有意稳定。
|
|
19
|
+
- **手动刷新边界** - Skill 页面进入、浏览器刷新、切换页面和添加/修改仓库只读取或保存本地状态;只有用户手动点击刷新才触发远端网络任务。
|
|
8
20
|
|
|
9
21
|
### Security
|
|
22
|
+
- **控制面安全** - MCP/Skill 控制清单不保存完整 secret;项目 MCP 静态 secret 默认拒绝;LAN 远程写默认关闭,并要求 same-origin/loopback 控制
|
|
10
23
|
- **依赖安全升级** - adm-zip 升至 0.6.0(GHSA-xcpc-8h2w-3j85)、js-yaml 升至 4.3.1(GHSA-h67p-54hq-rp68 / GHSA-52cp-r559-cp3m / GHSA-5p4m-2wfm-xmqj)、pm2 升至 7.0.3(GHSA-x5gf-qvw8-r2rm),overrides 同步更新 basic-ftp / qs / systeminformation / js-yaml;`npm audit` 报告归零
|
|
11
24
|
|
|
12
25
|
### Fixed
|
|
@@ -14,6 +27,8 @@
|
|
|
14
27
|
- **OMP Codex Responses 路径兼容** - managed gateway 将 OMP 原生 `openai-codex-responses` 的 `/codex/responses` 请求映射到 OpenAI-compatible 渠道的 `/v1/responses`,避免 Codex-only 服务返回 HTTP 404
|
|
15
28
|
- **OMP 渠道失败不再冻结** - OMP 动态切换开启后,失败渠道不再进入冻结状态。OMP 网关按请求即时回退其他渠道,冻结会导致短暂故障的渠道在恢复前被排除在后续分配之外
|
|
16
29
|
- **OMP 动态切换凭据稳定** - 同步当前 OMP 渠道时不再把动态切换生成的本地网关 `base_url` 和 capability API Key 覆盖真实渠道配置;同一渠道的受管 provider 生成值现在复用持久化网关密钥保持稳定
|
|
30
|
+
- **测速模型用户配置持久化** - 自定义测速模型写入用户配置并在重载时回填;包内 `src/config/model-metadata.json` 保持只读,旧配置按静态 metadata/catalog fallback 兼容。
|
|
31
|
+
- **Claude Hooks 路由兼容** - 保留 `/api/claude/hooks*` 与 `/api/hooks` 的既有语义,避免 Claude root alias 截获通用通知设置接口。
|
|
17
32
|
|
|
18
33
|
## [3.6.7] - 2026-05-16
|
|
19
34
|
|
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# coding-tool-x
|
|
2
2
|
|
|
3
|
-
> 面向 Claude Code、Codex CLI、Gemini CLI、OpenCode、OMP
|
|
3
|
+
> 面向 Claude Code、Codex CLI、Gemini CLI、OpenCode、OMP 的统一增强控制台,并支持通过 Manifest 扩展兼容协议的 Coding CLI
|
|
4
4
|
> Web UI + CLI + 多平台代理 + 配置托管 + 工作区编排 + 分析面板
|
|
5
5
|
|
|
6
6
|

|
|
7
7
|

|
|
8
|
-

|
|
9
9
|
|
|
10
10
|

|
|
11
11
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## 适合做什么
|
|
17
17
|
|
|
18
|
-
-
|
|
18
|
+
- 统一查看已启用平台的项目和会话
|
|
19
19
|
- 管理多渠道代理、测速、模型探测和健康状态
|
|
20
20
|
- 集中托管 Prompts、Skills、Agents、Commands、MCP、Plugins 等常用配置项
|
|
21
21
|
- 为多项目创建工作区,必要时自动创建 Git worktree
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
### 会话与项目
|
|
28
28
|
|
|
29
|
-
-
|
|
29
|
+
- 支持内置平台及已启用扩展平台的项目与会话列表;具体能力以平台 Manifest 为准
|
|
30
30
|
- 支持项目排序、项目搜索、会话排序、会话搜索
|
|
31
31
|
- 支持最近会话、收藏、别名、聊天记录查看
|
|
32
32
|
- 支持新建会话、删除会话、复制启动命令
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
|
|
36
36
|
### 多渠道代理
|
|
37
37
|
|
|
38
|
-
-
|
|
38
|
+
- 具备渠道能力的平台支持独立代理端口和独立渠道配置
|
|
39
39
|
- 支持渠道增删改查、启用 / 停用、权重、并发限制
|
|
40
40
|
- 支持速度测试、模型可用性探测、健康检查与故障冻结
|
|
41
41
|
- 支持模型重定向和默认测速模型配置
|
|
@@ -45,10 +45,17 @@
|
|
|
45
45
|
|
|
46
46
|
- 集中存储在 `~/.cc-tool`
|
|
47
47
|
- 保留并同步各平台原生配置目录,而不是替代原生用法
|
|
48
|
-
- 支持 Prompts
|
|
48
|
+
- 支持 Prompts 预设管理,并同步到声明 `prompts` capability 的平台提示文件;具体平台能力以 Manifest 为准
|
|
49
49
|
- 支持 Skills、Agents、Commands、Plugins 的中心托管与按支持的平台启停
|
|
50
50
|
- OMP Commands 按 OMP 原生语义管理为 slash commands,OMP Plugins 按 packages / extensions 管理
|
|
51
51
|
- 支持 MCP 服务器配置、预设、连通性测试和多平台写入;OMP 写入原生 `mcp.json`
|
|
52
|
+
- Skill 仓库只保存 source reference;手动刷新时下载仓库中发现的每个 Skill 完整目录,不保存仓库归档或 tree
|
|
53
|
+
- 每个 CLI 使用独立的 Skill artifact 格式和目录:`claude-skill-v1`、`codex-skill-v1`、`gemini-skill-v1`、`opencode-skill-v1`、`omp-skill-v1`
|
|
54
|
+
- Skill 页面进入、浏览器刷新和页面切换只扫描本地;只有用户点击“刷新远端”才创建异步网络任务
|
|
55
|
+
- Skill `enabled` 控制实际 CLI/OMP 加载;关闭只移除 native projection,不删除本地 artifact
|
|
56
|
+
- 新下载 Skill 默认 `trust=needs_review`、`enabled=false`,审批前不会进入实际运行面
|
|
57
|
+
- 所有扫描到的 Skill 默认登记为 `managed=true`;`managed` 不等于已启用
|
|
58
|
+
- OMP 可将提示词同步为原生 prompt templates;MCP/Skill activation、trust 和 secret reference 由同一有效控制面管理
|
|
52
59
|
- 支持 Claude、Codex、Gemini、OpenCode 的 OAuth 凭证池管理与回写原生配置;OMP auth 通过原生配置导入导出保留
|
|
53
60
|
- 支持 ZIP / JSON 配置导入导出
|
|
54
61
|
|
|
@@ -59,7 +66,7 @@
|
|
|
59
66
|
- 支持配置模板,将提示词、技能、命令、代理、MCP、插件组合成一套模板
|
|
60
67
|
- 支持 Dashboard、Analytics、日志、统计导出、环境诊断
|
|
61
68
|
- 支持面板访问密码
|
|
62
|
-
- LAN
|
|
69
|
+
- LAN 模式默认禁止远程写操作;只有显式设置 `CC_TOOL_ALLOW_REMOTE_WRITE=true` 才允许
|
|
63
70
|
|
|
64
71
|
### 通知
|
|
65
72
|
|
|
@@ -73,7 +80,7 @@
|
|
|
73
80
|
| --- | --- | --- | --- | --- | --- |
|
|
74
81
|
| 项目 / 会话查看 | 支持 | 支持 | 支持 | 支持 | 支持 |
|
|
75
82
|
| 渠道 / 代理管理 | 支持 | 支持 | 支持 | 支持 | 支持,含余额显示与批量测速 |
|
|
76
|
-
| Prompts 预设同步 | 支持 | 支持 | 支持 | 支持 |
|
|
83
|
+
| Prompts 预设同步 | 支持 | 支持 | 支持 | 支持 | 不提供集中式提示文件同步 |
|
|
77
84
|
| Skills 管理 | 支持 | 支持 | 支持 | 支持 | 原生支持 |
|
|
78
85
|
| Commands 管理 | 支持 | 支持 | 支持 | 支持 | 映射为 OMP commands |
|
|
79
86
|
| Agents 管理 | 支持 | 用户级 | 支持 | 支持 | 不提供直接原生管理 |
|
|
@@ -87,10 +94,18 @@
|
|
|
87
94
|
|
|
88
95
|
- Codex Agents 目前仅支持用户级代理
|
|
89
96
|
- OpenCode 会话读取使用内置 `node:sqlite`,不再依赖本机 sqlite3 可执行文件
|
|
90
|
-
- OMP 的原生资源轴包含 skills、commands、prompt templates、packages / extensions 和 MCP `mcp.json
|
|
97
|
+
- OMP 的原生资源轴包含 skills、commands、prompt templates、packages / extensions 和 MCP `mcp.json`;集中式 Prompts 预设不向 OMP 同步,Agents 暂不作为独立可写配置文件管理
|
|
91
98
|
- OMP 平台键统一为 `omp`,不再保留 `omp` 平台键兼容
|
|
92
99
|
- OMP OAuth 不在 OAuth Credentials 抽屉中直接增删改;`auth.json` 仍随 Config Export / Import 的 native config 快照迁移
|
|
93
100
|
|
|
101
|
+
## 配置驱动的平台扩展
|
|
102
|
+
|
|
103
|
+
- 平台目录由 Registry 统一发布;用户 Manifest 放在 `~/.cc-tool/config/platforms.json`,修改后由服务重新加载。
|
|
104
|
+
- 通用 CLI 必须提供有效 Manifest,并且只能使用项目 allowlist 中的通用 capability driver;声明式配置不会自动赋予任意 CLI 完整功能。
|
|
105
|
+
- 非标准协议(例如特殊数据库、OAuth / keychain 或平台专有配置语义)必须由专用 capability driver 实现,不能仅靠 Manifest 拼接出等价行为。
|
|
106
|
+
- 用户配置禁止加载任意 Node.js 模块、执行函数值或 shell 命令;Manifest 只能引用受控路径和已登记的 driver。
|
|
107
|
+
- 现有 CLI/API facade、OMP managed mode、旧的 mock path 和测试 seam 会继续保留;配置驱动扩展不会替换已有平台专用实现。
|
|
108
|
+
|
|
94
109
|
## 安装
|
|
95
110
|
|
|
96
111
|
### 全局安装
|
|
@@ -155,11 +170,11 @@ ctx ui --host
|
|
|
155
170
|
LAN 模式说明:
|
|
156
171
|
|
|
157
172
|
- 服务会监听 `0.0.0.0`
|
|
158
|
-
-
|
|
159
|
-
-
|
|
173
|
+
- 默认禁止 LAN 远程写操作,保护 Skill/MCP/配置控制面
|
|
174
|
+
- 如需允许远程写操作,必须显式设置:
|
|
160
175
|
|
|
161
176
|
```bash
|
|
162
|
-
CC_TOOL_ALLOW_REMOTE_WRITE=
|
|
177
|
+
CC_TOOL_ALLOW_REMOTE_WRITE=true ctx ui --host
|
|
163
178
|
```
|
|
164
179
|
|
|
165
180
|
### 单独控制平台代理
|
|
@@ -247,6 +262,25 @@ ctx omp start
|
|
|
247
262
|
- 聊天历史查看
|
|
248
263
|
- 收藏、别名、删除、复制启动命令,部分平台支持 Fork
|
|
249
264
|
|
|
265
|
+
|
|
266
|
+
#### 项目级配置
|
|
267
|
+
|
|
268
|
+
在项目历史会话页点击“项目配置”,可管理当前项目的项目指令、Skill 和 MCP。
|
|
269
|
+
项目级 Skill 页面只扫描本地 artifact/native roots;远端仓库不会因为打开页面、刷新浏览器或切换项目而拉取。
|
|
270
|
+
|
|
271
|
+
支持的项目级原生位置:
|
|
272
|
+
|
|
273
|
+
| 平台 | 项目指令 | 项目 Skills | 项目 MCP |
|
|
274
|
+
| --- | --- | --- | --- |
|
|
275
|
+
| Claude | `CLAUDE.md` | `.claude/skills/` | `.mcp.json` |
|
|
276
|
+
| Codex | `AGENTS.md` | `.agents/skills/`(读取兼容 `.codex/skills/`) | `.codex/config.toml` 的 `[mcp_servers]` |
|
|
277
|
+
| Gemini | `GEMINI.md` | `.gemini/skills/` | `.gemini/settings.json` 的 `mcpServers` |
|
|
278
|
+
| OpenCode | `.opencode/AGENTS.md`(以平台 Manifest 为准) | `.opencode/skills/` | `.opencode/opencode.json` |
|
|
279
|
+
| OMP | 无单独项目指令文件 | `.omp/skills/` | `.omp/mcp.json` |
|
|
280
|
+
|
|
281
|
+
项目 Skill 关闭只移除该项目的 native projection,不删除 artifact;同名项目 Skill 优先于 inherited user Skill。
|
|
282
|
+
平台无法安全投影的 managed project Skill 返回 `projection: unsupported`,不伪造关闭成功。
|
|
283
|
+
静态 MCP 环境变量、Headers 或凭据禁止写入项目 Git;项目 MCP 只允许环境变量引用或 secret reference。
|
|
250
284
|
### 配置管理
|
|
251
285
|
|
|
252
286
|
- Prompts
|
|
@@ -350,9 +384,46 @@ npm test
|
|
|
350
384
|
|
|
351
385
|
## 已知说明
|
|
352
386
|
|
|
353
|
-
- `ctx ui --host` 开启 LAN
|
|
354
|
-
-
|
|
355
|
-
-
|
|
387
|
+
- `ctx ui --host` 开启 LAN 访问后默认禁止远程写操作;只有显式设置 `CC_TOOL_ALLOW_REMOTE_WRITE=true` 才允许
|
|
388
|
+
- Skill refresh 是异步网络任务;打开 Skill 面板、刷新浏览器和切换页面只扫描本地
|
|
389
|
+
- Skill `enabled` 控制实际 CLI/OMP 加载;关闭不会删除 artifact;新远端 Skill 默认 needs_review/disabled
|
|
390
|
+
- MCP/Skill 的 secret 不写入 control manifest、项目 Git、任务状态、日志或 API 响应
|
|
391
|
+
- 项目 native Skill/MCP 若平台无法安全表达开关,会返回 `projection: unsupported` 或 `external`,不伪造关闭成功
|
|
392
|
+
|
|
393
|
+
## 可配置 CLI 平台
|
|
394
|
+
|
|
395
|
+
平台目录由 Registry 统一提供。用户扩展写入:
|
|
396
|
+
|
|
397
|
+
```text
|
|
398
|
+
~/.cc-tool/config/platforms.json
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
每个平台必须通过 Manifest 校验,并只能引用内置 allowlisted driver(例如 `generic-jsonl`、`generic-filesystem` 或 `generic-openai-compatible`)。配置文件不支持任意 Node.js 模块、`require`、函数值或 shell 命令;运行时不会从用户配置动态加载可执行代码。
|
|
402
|
+
|
|
403
|
+
声明稳定文件协议的平台可以直接复用 generic driver。特殊 SQLite schema、OAuth / keychain、非标准配置或特殊 fork 语义仍需要专用 capability driver;不能仅靠配置保证任意 CLI 获得完整功能对等。
|
|
404
|
+
|
|
405
|
+
现有 `ctx claude ...`、`ctx codex ...` 等 CLI/API 路径继续保留。`GET /api/platforms` 只返回安全的公共元数据;旧 facade、`require.resolve()` + `require.cache` 测试 seam 以及 OMP managed mode 都是有意保留的兼容契约。
|
|
406
|
+
|
|
407
|
+
### 原生路径覆盖
|
|
408
|
+
|
|
409
|
+
原生路径可以单独写入 `~/.cc-tool/config/platform-paths.json`,不需要修改平台 Manifest。路径配置只覆盖 `paths`,不会改变平台能力、Driver 或命令定义:
|
|
410
|
+
|
|
411
|
+
```json
|
|
412
|
+
{
|
|
413
|
+
"platforms": {
|
|
414
|
+
"demo-cli": {
|
|
415
|
+
"paths": {
|
|
416
|
+
"home": "/opt/demo-cli",
|
|
417
|
+
"sessions": "/opt/demo-cli/history",
|
|
418
|
+
"settings": "/opt/demo-cli/settings.json",
|
|
419
|
+
"channels": "/opt/demo-cli/cc-tool/channels.json"
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
路径值支持 `{home}` 和 `$ENV_VAR`;内置平台未配置覆盖时继续使用原有默认目录。配置变化不会自动搬迁已有数据;无效覆盖文件会被忽略并记录诊断信息。
|
|
356
427
|
|
|
357
428
|
## 相关文档
|
|
358
429
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e,s as a,t as l}from"./_plugin-vue_export-helper-BeLZJZij.js";import{C as t,D as s,K as n,O as i,S as o,V as u,W as c,Y as d,Z as r,_t as p,b as v,et as f,g,ht as m,m as y,mt as h,r as b,st as k,w as _,x as w}from"./vue-vendor-BqZbbXHA.js";import{n as C}from"./client-UDwXBP9i.js";import{r as x,s as j,t as M}from"./platforms-CBkB45JP.js";import{A as z,B as N,Ft as P,Mt as U,N as F,U as I,_ as $,h as B,p as O,tt as D,v as L,w as S}from"./icons-B2Vg-IOC.js";import{l as q}from"./light-Cp0t7v32.js";import{a as A,c as R,i as T,o as E,r as V,s as G,t as H}from"./AssetPathField-Bd_nMFu3.js";import{n as W,t as Y}from"./useResponsiveDrawer-jbmqZuJs.js";import{t as K}from"./DrawerContent-ChXgZ1Xm.js";import{$ as Z,B as J,F as Q,I as X,N as ee,Nt as ae,O as le,V as te,ct as se,dt as ne,et as ie,k as oe,lt as ue,nt as ce,pt as de,tt as re}from"./index-BMAUPq5K.js";import{t as pe}from"./MarkdownEditor-CYmLGYju.js";async function ve(e=null,a="claude",l={}){const t=le("agents",a,l.scope||"",e||"");return oe(t,l=>C.get("/agents",{params:e?{projectPath:e,platform:a}:{platform:a},signal:l}).then(e=>e.data),"agents",`agents:${a}`)}var fe={class:"asset-card-main"},ge={class:"asset-card-top"},me={class:"asset-card-title-stack"},ye={class:"asset-card-title-row"},he={class:"asset-name"},be={class:"asset-tags"},ke={key:0,class:"asset-description"},_e={class:"asset-meta"},we={key:0,class:"asset-meta-item"},Ce={key:1,class:"asset-meta-item"},xe={class:"asset-card-actions"},je={class:"asset-platform-strip"},Me=["onClick"],ze=l({__name:"AgentCard",props:{agent:{type:Object,required:!0},deleting:{type:Boolean,default:!1},registryInfo:{type:Object,default:null},toggling:{type:Boolean,default:!1}},emits:["click","edit","delete","toggle-enabled","toggle-platform"],setup(l,{emit:u}){const r=l,b=u,{byCapability:k}=ae(),C=v(()=>k("agents"));return(u,v)=>{return c(),_("div",{class:m(["agent-card asset-card",{"is-project":"project"===l.agent.scope,"is-managed":l.registryInfo}]),onClick:v[4]||(v[4]=e=>b("click",l.agent))},[w("div",fe,[w("div",ge,[w("div",me,[w("div",ye,[w("span",{class:m(["asset-status-dot",{active:l.registryInfo?.enabled||"project"===l.agent.scope}])},null,2),w("span",he,p(l.agent.name),1)]),w("div",be,[i(h(ne),{type:"user"===l.agent.scope?"info":"success",size:"tiny",bordered:!1},{default:f(()=>[s(p("user"===l.agent.scope?"用户级":"项目级"),1)]),_:1},8,["type"]),l.registryInfo?(c(),o(h(ne),{key:0,type:"success",size:"tiny",bordered:!1},{default:f(()=>[...v[5]||(v[5]=[s("托管",-1)])]),_:1})):t("",!0),l.agent.model?(c(),o(h(ne),{key:1,type:"warning",size:"tiny",bordered:!1},{default:f(()=>[s(p(l.agent.model),1)]),_:1})):t("",!0)])])]),l.agent.description?(c(),_("div",ke,p((x=l.agent.description,x?x.length>80?x.slice(0,80)+"...":x:"")),1)):t("",!0),w("div",_e,[l.agent.tools?(c(),_("span",we,[i(h(e),{size:"12"},{default:f(()=>[i(h(I))]),_:1}),s(" "+p((k=l.agent.tools,k?k.length>30?k.slice(0,30)+"...":k:"")),1)])):t("",!0),l.agent.permissionMode?(c(),_("span",Ce,[i(h(e),{size:"12"},{default:f(()=>[i(h(O))]),_:1}),s(" "+p(l.agent.permissionMode),1)])):t("",!0)])]),w("div",xe,[l.registryInfo?(c(),_(g,{key:0},[i(h(Z),{trigger:"hover"},{trigger:f(()=>[i(h(Q),{value:l.registryInfo.enabled,size:"small",loading:l.toggling,"onUpdate:value":v[0]||(v[0]=e=>b("toggle-enabled",l.agent,e)),onClick:v[1]||(v[1]=y(()=>{},["stop"]))},null,8,["value","loading"])]),default:f(()=>[s(" "+p(l.registryInfo.enabled?"已启用":"已禁用"),1)]),_:1}),w("div",je,[(c(!0),_(g,null,n(C.value,a=>(c(),o(h(Z),{key:a.key,trigger:"hover"},{trigger:f(()=>[w("span",{class:m(["asset-platform-icon",{active:l.registryInfo.platforms?.[a.key]}]),onClick:y(e=>b("toggle-platform",l.agent,a.key,!l.registryInfo.platforms?.[a.key]),["stop"])},[i(h(e),{size:"14"},{default:f(()=>[(c(),o(d(a.icon)))]),_:2},1024)],10,Me)]),default:f(()=>[s(" "+p(a.label||a.title||a.key)+" "+p(l.registryInfo.platforms?.[a.key]?"已启用":"未启用"),1)]),_:2},1024))),128))])],64)):(c(),_(g,{key:1},[i(h(a),{size:"tiny",tertiary:"",onClick:v[2]||(v[2]=y(e=>b("edit",l.agent),["stop"]))},{default:f(()=>[...v[6]||(v[6]=[s(" 编辑 ",-1)])]),_:1}),i(h(a),{size:"tiny",tertiary:"",type:"error",loading:r.deleting,onClick:v[3]||(v[3]=y(e=>b("delete",l.agent),["stop"]))},{default:f(()=>[...v[7]||(v[7]=[s(" 删除 ",-1)])]),_:1},8,["loading"])],64))])],2);var k,x}}},[["__scopeId","data-v-044e4192"]]),Ne={class:"asset-detail-drawer-header"},Pe={class:"asset-detail-identity"},Ue={class:"asset-detail-heading"},Fe={class:"asset-detail-name"},Ie={class:"asset-detail-meta"},$e={key:2,class:"asset-detail-subtle"},Be={class:"asset-detail-body"},Oe={key:0,class:"asset-detail-loading"},De={class:"asset-detail-container"},Le={class:"asset-detail-info-section"},Se={class:"asset-detail-description"},qe={class:"asset-detail-info-section"},Ae={class:"asset-detail-list"},Re={class:"asset-detail-row"},Te={class:"asset-detail-value"},Ee={key:0,class:"asset-detail-row"},Ve={class:"asset-detail-value mono"},Ge={key:1,class:"asset-detail-row"},He={class:"asset-detail-value mono"},We={key:2,class:"asset-detail-row"},Ye={class:"asset-detail-value"},Ke={key:3,class:"asset-detail-row"},Ze={class:"asset-detail-value"},Je={key:4,class:"asset-detail-row"},Qe={class:"asset-detail-value"},Xe={key:1,class:"asset-detail-info-section"},ea={class:"asset-detail-box"},aa={class:"asset-detail-code"},la={key:2,class:"asset-detail-empty"},ta={__name:"AgentDetailDrawer",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},platform:{type:String,default:"claude"},loading:{type:Boolean,default:!1}},emits:["update:visible"],setup(a,{emit:l}){const{drawerWidth:n}=Y(600),u=a,d=l,r=v({get:()=>u.visible,set:e=>d("update:visible",e)}),g={height:"100%",minHeight:0,overflow:"hidden"},m=v(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[u.platform]||"")),y=v(()=>u.agent?.fileName?"codex"===u.platform?`[agents.${u.agent.fileName}]`:`${u.agent.fileName}.md`:""),b=v(()=>u.agent?"codex"===u.platform?u.agent.fullContent||"(无内容)":u.agent.systemPrompt||"(无内容)":"(无内容)"),k=v(()=>u.agent?.fullPath||u.agent?.path||"");function C(e){return"project"===e?"项目级":"用户级"}return(l,u)=>(c(),o(h(W),{show:r.value,"onUpdate:show":u[0]||(u[0]=e=>r.value=e),width:h(n),placement:"right","show-mask":!0},{default:f(()=>[i(h(K),{closable:"","native-scrollbar":!1,"body-content-style":g},{header:f(()=>[w("div",Ne,[w("div",Pe,[i(h(e),{size:20,class:"asset-detail-icon"},{default:f(()=>[i(h(z))]),_:1}),w("div",Ue,[w("span",Fe,p(a.agent?.name||"代理详情"),1),w("div",Ie,[a.agent?.scope?(c(),o(h(ne),{key:0,type:"project"===a.agent.scope?"success":"info",size:"tiny",bordered:!1},{default:f(()=>[s(p(C(a.agent.scope)),1)]),_:1},8,["type"])):t("",!0),a.agent?.model?(c(),o(h(ne),{key:1,type:"warning",size:"tiny",bordered:!1},{default:f(()=>[s(p(a.agent.model),1)]),_:1})):t("",!0),m.value?(c(),_("span",$e,p(m.value),1)):t("",!0)])])])])]),default:f(()=>[w("div",Be,[a.loading&&!a.agent?(c(),_("div",Oe,[i(h(X),{size:"medium"}),u[1]||(u[1]=w("p",null,"加载代理详情中...",-1))])):a.agent?(c(),o(h(G),{key:1,type:"line",animated:"",class:"asset-detail-tabs"},{default:f(()=>[i(h(R),{name:"overview",tab:"概览"},{default:f(()=>[w("div",De,["codex"===a.platform&&a.agent.configReadError?(c(),o(h(ue),{key:0,type:"warning",bordered:!1},{default:f(()=>[s(p(a.agent.configReadError),1)]),_:1})):t("",!0),w("div",Le,[u[2]||(u[2]=w("h3",{class:"asset-detail-section-title"},"描述",-1)),w("p",Se,p(a.agent.description||"暂无描述"),1)]),w("div",qe,[u[9]||(u[9]=w("h3",{class:"asset-detail-section-title"},"基础信息",-1)),w("div",Ae,[w("div",Re,[u[3]||(u[3]=w("span",{class:"asset-detail-label"},"作用域",-1)),w("span",Te,p(C(a.agent.scope)),1)]),a.agent.fileName?(c(),_("div",Ee,[u[4]||(u[4]=w("span",{class:"asset-detail-label"},"文件名",-1)),w("span",Ve,p(y.value),1)])):t("",!0),"codex"===a.platform&&a.agent.configFile?(c(),_("div",Ge,[u[5]||(u[5]=w("span",{class:"asset-detail-label"},"config_file",-1)),w("span",He,p(a.agent.configFile),1)])):t("",!0),a.agent.model?(c(),_("div",We,[u[6]||(u[6]=w("span",{class:"asset-detail-label"},"模型",-1)),w("span",Ye,p(a.agent.model),1)])):t("",!0),a.agent.permissionMode?(c(),_("div",Ke,[u[7]||(u[7]=w("span",{class:"asset-detail-label"},"权限模式",-1)),w("span",Ze,p(a.agent.permissionMode),1)])):t("",!0),a.agent.skills?(c(),_("div",Je,[u[8]||(u[8]=w("span",{class:"asset-detail-label"},"技能",-1)),w("span",Qe,p(a.agent.skills),1)])):t("",!0)])]),a.agent.tools?(c(),_("div",Xe,[u[10]||(u[10]=w("h3",{class:"asset-detail-section-title"},"可用工具",-1)),w("div",ea,[i(h(e),{size:16},{default:f(()=>[i(h(I))]),_:1}),w("code",null,p(a.agent.tools),1)])])):t("",!0),i(H,{path:k.value},null,8,["path"])])]),_:1}),i(h(R),{name:"content",tab:"codex"===a.platform?"配置":"提示词"},{default:f(()=>[w("pre",aa,p(b.value),1)]),_:1},8,["tab"])]),_:1})):(c(),_("div",la,[i(h(e),{size:44,class:"asset-detail-empty-icon"},{default:f(()=>[i(h(D))]),_:1}),u[11]||(u[11]=w("p",null,"未选择代理",-1))]))])]),_:1})]),_:1},8,["show","width"]))}},sa={class:"config-edit-header"},na={class:"config-edit-identity"},ia={class:"config-edit-icon"},oa={class:"config-edit-title-stack"},ua={class:"config-edit-kicker"},ca={class:"config-edit-title"},da={class:"config-edit-badges"},ra={class:"config-edit-section"},pa={class:"section-heading"},va={class:"field-grid"},fa={class:"scope-option"},ga={class:"scope-path"},ma={class:"scope-option"},ya={class:"scope-path"},ha={key:0,class:"platform-note"},ba={class:"config-edit-section"},ka={class:"section-heading"},_a={key:1,class:"empty-config-box"},wa={class:"field-grid"},Ca={key:0,class:"config-edit-section content-section"},xa={class:"section-heading"},ja={class:"modal-footer"},Ma=l({__name:"AgentFormModal",props:{visible:{type:Boolean,default:!1},agent:{type:Object,default:null},projectPath:{type:String,default:null},platform:{type:String,default:"claude"}},emits:["update:visible","saved"],setup(l,{emit:n}){const u=l,d=n,y=v({get:()=>u.visible,set:e=>d("update:visible",e)}),b=v(()=>!!u.agent),x=v(()=>"codex"===u.platform),j=v(()=>"claude"===u.platform),M=v(()=>"codex"===u.platform||"opencode"===u.platform),P=v(()=>b.value?"编辑代理":"创建代理"),U=v(()=>({claude:"Claude Code",codex:"Codex CLI",gemini:"Gemini CLI",opencode:"OpenCode"}[u.platform]||"Claude Code")),I=v(()=>"codex"===u.platform?"~/.codex/config.toml":"opencode"===u.platform?"~/.config/opencode/agents/":"gemini"===u.platform?"~/.gemini/agents/":"~/.claude/agents/"),$=v(()=>"opencode"===u.platform?".opencode/agents/":"gemini"===u.platform?".gemini/agents/":".claude/agents/"),O=v(()=>"project"===H.value.scope?"项目级":"用户级"),S=v(()=>G.find(e=>e.value===H.value.configMode)?.label||"配置"),A=k(null),R=k(!1),T={maxHeight:"calc(92vh - 134px)",overflowY:"auto",paddingBottom:"18px"},E=[{label:"Sonnet",value:"sonnet"},{label:"Opus",value:"opus"},{label:"Haiku",value:"haiku"},{label:"继承 (inherit)",value:"inherit"}],V=[{label:"默认 (default)",value:"default"},{label:"宽松 (permissive)",value:"permissive"},{label:"严格 (strict)",value:"strict"}],G=[{label:"仅描述",value:"none"},{label:"托管 TOML",value:"managed"},{label:"自定义路径",value:"custom"}],H=k({fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}),W=v(()=>{const e={fileName:{required:!0,message:"请输入文件名",trigger:"blur"},scope:{required:!0,message:"请选择作用域",trigger:"change"},description:{required:!0,message:"请输入代理描述",trigger:"blur"}};return j.value&&(e.name={required:!0,message:"请输入代理名称",trigger:"blur"}),x.value&&(e.configMode={required:!0,message:"请选择配置模式",trigger:"change"},e.configFile={required:"custom"===H.value.configMode,message:"请输入自定义配置文件路径",trigger:"blur"}),e});function Y(){H.value={fileName:"",scope:"user",name:"",description:"",configMode:"none",configFile:"",configContent:"",tools:"",model:"",permissionMode:"",skills:"",systemPrompt:""}}function K(){y.value=!1,Y()}async function Z(){try{await(A.value?.validate())}catch{return}R.value=!0;try{const e={...H.value,projectPath:u.projectPath};x.value?("custom"===H.value.configMode?e.configFile=H.value.configFile:delete e.configFile,"managed"===H.value.configMode||"custom"===H.value.configMode?e.configContent=H.value.configContent||"":delete e.configContent):(delete e.configMode,delete e.configFile,delete e.configContent),b.value?(await async function(e,a,l,t="claude"){return(await C.put(`/agents/${a}/${e}`,{...l,platform:t})).data}(H.value.fileName,H.value.scope,e,u.platform),ee.success("代理更新成功")):(await async function(e,a="claude"){return(await C.post("/agents",{...e,platform:a})).data}(e,u.platform),ee.success("代理创建成功")),d("saved"),y.value=!1,Y()}catch(e){ee.error("操作失败: "+e.message)}finally{R.value=!1}}return r(()=>u.agent,e=>{if(e){const a=e.configMode||(e.configFile?String(e.configFile).includes("/.codex/agents/")?"managed":"custom":"none");H.value={fileName:e.fileName||"",scope:e.scope||"user",name:e.name||"",description:e.description||"",configMode:a,configFile:e.configFile||"",configContent:e.fullContent||"",tools:e.tools||"",model:e.model||"",permissionMode:e.permissionMode||"",skills:e.skills||"",systemPrompt:e.systemPrompt||""}}else Y()},{immediate:!0}),r(()=>u.platform,e=>{"codex"===e&&(H.value.scope="user",H.value.configMode||(H.value.configMode="none"))},{immediate:!0}),(l,n)=>(c(),o(h(q),{show:y.value,"onUpdate:show":n[13]||(n[13]=e=>y.value=e),preset:"card",title:P.value,style:{width:"min(940px, 96vw)","max-height":"92vh"},"content-style":T,"mask-closable":!1,class:"config-edit-modal"},{footer:f(()=>[w("div",ja,[i(h(a),{onClick:K},{default:f(()=>[...n[21]||(n[21]=[s("取消",-1)])]),_:1}),i(h(a),{type:"primary",loading:R.value,onClick:Z},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(L))]),_:1})]),default:f(()=>[s(" "+p(b.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:f(()=>[w("div",sa,[w("div",na,[w("span",ia,[i(h(e),{size:22},{default:f(()=>[i(h(z))]),_:1})]),w("div",oa,[w("span",ua,p(U.value),1),w("span",ca,p(b.value?H.value.fileName||"编辑代理":"创建新代理"),1)])]),w("div",da,[i(h(ne),{size:"small",bordered:!1,type:"info"},{default:f(()=>[s(p(O.value),1)]),_:1}),x.value?(c(),o(h(ne),{key:0,size:"small",bordered:!1,type:"success"},{default:f(()=>[...n[14]||(n[14]=[s("Codex 用户级",-1)])]),_:1})):t("",!0),x.value&&"none"!==H.value.configMode?(c(),o(h(ne),{key:1,size:"small",bordered:!1,type:"warning"},{default:f(()=>[s(p(S.value),1)]),_:1})):t("",!0)])]),i(h(te),{ref_key:"formRef",ref:A,model:H.value,rules:W.value,"label-placement":"top","require-mark-placement":"right-hanging",class:"config-edit-form"},{default:f(()=>[w("div",{class:m(["config-edit-grid",{"is-codex":x.value}])},[w("section",ra,[w("div",pa,[i(h(e),{size:16},{default:f(()=>[i(h(F))]),_:1}),n[15]||(n[15]=w("span",null,"基础信息",-1))]),w("div",va,[i(h(J),{label:"文件名",path:"fileName"},{default:f(()=>[i(h(se),{value:H.value.fileName,"onUpdate:value":n[0]||(n[0]=e=>H.value.fileName=e),disabled:b.value,placeholder:"code-reviewer"},null,8,["value","disabled"])]),_:1}),j.value?(c(),o(h(J),{key:0,label:"显示名称",path:"name"},{default:f(()=>[i(h(se),{value:H.value.name,"onUpdate:value":n[1]||(n[1]=e=>H.value.name=e),placeholder:"代理的显示名称"},null,8,["value"])]),_:1})):t("",!0)]),i(h(J),{label:"作用域",path:"scope"},{default:f(()=>[i(h(ie),{value:H.value.scope,"onUpdate:value":n[2]||(n[2]=e=>H.value.scope=e),disabled:b.value,class:m(["scope-picker",{"single-option":x.value}])},{default:f(()=>[i(h(re),{value:"user"},{default:f(()=>[w("span",fa,[n[16]||(n[16]=w("span",{class:"scope-title"},"用户级",-1)),w("span",ga,p(I.value),1)])]),_:1}),x.value?t("",!0):(c(),o(h(re),{key:0,value:"project"},{default:f(()=>[w("span",ma,[n[17]||(n[17]=w("span",{class:"scope-title"},"项目级",-1)),w("span",ya,p($.value),1)])]),_:1}))]),_:1},8,["value","disabled","class"])]),_:1}),i(h(J),{label:"描述",path:"description"},{default:f(()=>[i(h(se),{value:H.value.description,"onUpdate:value":n[3]||(n[3]=e=>H.value.description=e),type:"textarea",autosize:{minRows:3,maxRows:5},placeholder:"一句话说明这个代理什么时候该被调用"},null,8,["value"])]),_:1}),x.value?(c(),_("div",ha,[i(h(e),{size:16},{default:f(()=>[i(h(N))]),_:1}),n[18]||(n[18]=w("span",null,[s("Codex agents 写入用户级配置。描述会进入 "),w("code",null,"~/.codex/config.toml"),s(",TOML 配置可托管到 "),w("code",null,"~/.codex/agents/"),s("。")],-1))])):t("",!0)]),w("section",ba,[w("div",ka,[i(h(e),{size:16},{default:f(()=>[i(h(B))]),_:1}),w("span",null,p(x.value?"运行配置":"模型与权限"),1)]),x.value?(c(),_(g,{key:0},[i(h(J),{label:"配置模式",path:"configMode"},{default:f(()=>[i(h(ce),{value:H.value.configMode,"onUpdate:value":n[4]||(n[4]=e=>H.value.configMode=e),options:G,placeholder:"选择配置模式"},null,8,["value"])]),_:1}),"custom"===H.value.configMode?(c(),o(h(J),{key:0,label:"配置文件路径",path:"configFile"},{default:f(()=>[i(h(se),{value:H.value.configFile,"onUpdate:value":n[5]||(n[5]=e=>H.value.configFile=e),placeholder:"~/.omx/agents/my-agent.toml"},null,8,["value"])]),_:1})):t("",!0),"none"===H.value.configMode?(c(),_("div",_a,[i(h(e),{size:18},{default:f(()=>[i(h(D))]),_:1}),n[19]||(n[19]=w("span",null,"仅保存代理描述,不额外写入模型或工具配置。",-1))])):(c(),o(h(J),{key:2,label:"Agent Config (TOML)",path:"configContent",class:"editor-form-item"},{default:f(()=>[i(h(se),{value:H.value.configContent,"onUpdate:value":n[6]||(n[6]=e=>H.value.configContent=e),type:"textarea",autosize:{minRows:14,maxRows:22},class:"toml-editor",placeholder:'model = "gpt-5.4"'},null,8,["value"])]),_:1}))],64)):(c(),_(g,{key:1},[i(h(J),{label:"可用工具",path:"tools"},{default:f(()=>[i(h(se),{value:H.value.tools,"onUpdate:value":n[7]||(n[7]=e=>H.value.tools=e),placeholder:"Read, Edit, Bash"},null,8,["value"])]),_:1}),i(h(J),{label:"模型",path:"model"},{default:f(()=>[M.value?(c(),o(h(se),{key:0,value:H.value.model,"onUpdate:value":n[8]||(n[8]=e=>H.value.model=e),placeholder:"gpt-5, claude-sonnet-4, openrouter/model"},null,8,["value"])):(c(),o(h(ce),{key:1,value:H.value.model,"onUpdate:value":n[9]||(n[9]=e=>H.value.model=e),options:E,placeholder:"选择模型",clearable:""},null,8,["value"]))]),_:1}),w("div",wa,["opencode"!==u.platform?(c(),o(h(J),{key:0,label:"权限模式",path:"permissionMode"},{default:f(()=>[i(h(ce),{value:H.value.permissionMode,"onUpdate:value":n[10]||(n[10]=e=>H.value.permissionMode=e),options:V,placeholder:"选择权限模式",clearable:""},null,8,["value"])]),_:1})):t("",!0),"opencode"!==u.platform?(c(),o(h(J),{key:1,label:"技能",path:"skills"},{default:f(()=>[i(h(se),{value:H.value.skills,"onUpdate:value":n[11]||(n[11]=e=>H.value.skills=e),placeholder:"自动加载的技能,逗号分隔"},null,8,["value"])]),_:1})):t("",!0)])],64))]),x.value?t("",!0):(c(),_("section",Ca,[w("div",xa,[i(h(e),{size:16},{default:f(()=>[i(h(D))]),_:1}),n[20]||(n[20]=w("span",null,"系统提示词",-1))]),i(h(J),{path:"systemPrompt","show-label":!1,class:"editor-form-item"},{default:f(()=>[i(pe,{modelValue:H.value.systemPrompt,"onUpdate:modelValue":n[12]||(n[12]=e=>H.value.systemPrompt=e),rows:10,"min-height":240,placeholder:"定义代理的行为、边界和输出要求","default-editing":!b.value},null,8,["modelValue","default-editing"])]),_:1})]))],2)]),_:1},8,["model","rules"])]),_:1},8,["show","title"]))}},[["__scopeId","data-v-00915421"]]),za={key:0,class:"asset-panel-header"},Na={class:"asset-title-group"},Pa={class:"asset-heading"},Ua={class:"asset-title-row"},Fa={class:"asset-platform-pill"},Ia={key:0,class:"asset-action-row"},$a={key:1,class:"asset-drawer-toolbar"},Ba={key:0,class:"asset-action-row"},Oa={class:"asset-summary"},Da={class:"asset-summary-item"},La={class:"asset-summary-value"},Sa={class:"asset-summary-item"},qa={class:"asset-summary-value"},Aa={class:"asset-summary-item"},Ra={class:"asset-summary-value"},Ta={class:"asset-summary-item"},Ea={class:"asset-summary-value"},Va={class:"asset-filter-bar"},Ga={class:"asset-panel-content"},Ha={key:0,class:"asset-empty"},Wa={key:1,class:"asset-list"},Ya={class:"asset-footer"},Ka=l({__name:"AgentsPanel",props:{hideBack:{type:Boolean,default:!1},inDrawer:{type:Boolean,default:!1},projectPath:{type:String,default:null},platform:{type:String,default:""}},emits:["back","updated"],setup(l,{emit:d}){const y=l,F=d,I=M(),B=b(),O=k([]),D=k(!1),L=k(""),q=k("all"),R=k(!1),G=k(!1),H=k(null),W=k(!1),Y=k(null),K=k({}),Z=k({}),J=k({});let Q=0;const{byCapability:te}=ae(),ne=v(()=>te("agents").map(e=>e.key)),ie=v(()=>ne.value.includes(ue.value)),ue=v(()=>String(y.platform||x(B)||"").trim().toLowerCase()),re=v(()=>"opencode"===ue.value?"使用 @agent 或 Task 在 OpenCode 中调用":"gemini"===ue.value?"使用 @agent 调用 Gemini 自定义代理":"使用 Task tool 调用自定义代理"),pe=v(()=>{const e=I.get(ue.value)||j(ue.value);return e.label||e.title||"Claude Code"}),fe=[{label:"全部",value:"all"},{label:"用户级",value:"user"},{label:"项目级",value:"project"},{label:"已托管",value:"managed"}],ge=v(()=>O.value.filter(e=>"user"===e.scope).length),me=v(()=>O.value.filter(e=>"project"===e.scope).length),ye=v(()=>Object.keys(Z.value).length);function he(e){if(!e)return"";const a="string"==typeof e.scope&&e.scope.trim()?e.scope.trim():"unknown",l="string"==typeof e.path&&e.path.trim()?e.path.trim():"",t="string"==typeof e.fileName&&e.fileName.trim()?e.fileName.trim():"";return`${a}:${l||t}`}function be(e){if(!e)return"";const a=[];if("string"==typeof e.path&&e.path.trim()&&a.push(e.path.trim()),"string"==typeof e.fileName&&e.fileName.trim()){const l=e.fileName.trim();a.push(`${l}.md`,l)}"string"==typeof e.name&&e.name.trim()&&a.push(e.name.trim());for(const l of a)if(Z.value[l])return l;return a[0]||""}const ke=v(()=>{let e=O.value;if("user"===q.value?e=e.filter(e=>"user"===e.scope):"project"===q.value?e=e.filter(e=>"project"===e.scope):"managed"===q.value&&(e=e.filter(e=>Z.value[be(e)])),L.value.trim()){const a=L.value.toLowerCase();e=e.filter(e=>e.name?.toLowerCase().includes(a)||e.description?.toLowerCase().includes(a)||e.fileName?.toLowerCase().includes(a))}return e}),_e=v(()=>L.value?"没有匹配的代理":"user"===q.value?"暂无用户级代理":"project"===q.value?"暂无项目级代理":"managed"===q.value?"暂无托管的代理":ie.value?"暂无自定义代理":`${pe.value} 暂未提供 Agents 能力`);async function we(){if(!ie.value)return O.value=[],Z.value={},void(D.value=!1);D.value=!0;try{const[e,a]=await Promise.all([ve(y.projectPath,ue.value),V("agents",{platform:ue.value,projectPath:y.projectPath})]);if(e.success&&(O.value=e.agents||[]),a.success){Z.value={};for(const[e,l]of Object.entries(a.items||{}))Z.value[e]=l}}catch(e){ee.error("加载代理列表失败: "+e.message)}finally{D.value=!1}}async function Ce(e,a){const l=be(e);if(l){J.value[l]=!0;try{(await A("agents",l,a)).success&&(ee.success(a?"已启用":"已禁用"),await we())}catch(t){ee.error("切换失败: "+t.message)}finally{delete J.value[l]}}else ee.error("未找到代理对应的托管配置键")}async function xe(e,a,l){const t=be(e);if(t){J.value[t]=!0;try{(await E("agents",t,a,l)).success&&(ee.success(`${a} ${l?"已启用":"已禁用"}`),await we())}catch(s){ee.error("切换失败: "+s.message)}finally{delete J.value[t]}}else ee.error("未找到代理对应的托管配置键")}async function je(){D.value=!0;try{const e=await T("agents");e?.success||ee.warning(e?.message||"同步失败,已继续刷新列表")}catch(e){ee.warning("同步失败,已继续刷新列表: "+e.message)}await we()}function Me(){Y.value=null,R.value=!0}function Ne(e){R.value=e,e||(Y.value=null)}function Pe(e){Fe(e,!0)}async function Ue(e){const a=he(e);K.value[a]=!0;try{(await async function(e,a,l=null,t="claude"){const s={};return t&&(s.platform=t),l&&(s.projectPath=l),(await C.delete(`/agents/${a}/${e}`,{params:s})).data}(e.fileName,e.scope,y.projectPath,ue.value)).success&&(ee.success("代理已删除"),await we(),F("updated"))}catch(l){ee.error("删除失败: "+l.message)}finally{delete K.value[a]}}async function Fe(e,a=!1){if(!e)return;const l=++Q;W.value=!0,a||(H.value=null,G.value=!0);try{const t=await async function(e,a,l=null,t="claude"){const s={};t&&(s.platform=t),l&&(s.projectPath=l);const n=le(`agent-detail:${e}`,t,a||"",l||"");return oe(n,l=>C.get(`/agents/${a}/${e}`,{params:s,signal:l}).then(e=>e.data),"agent-detail",`agent-detail:${t}`)}(e.fileName,e.scope,y.projectPath,ue.value);if(l!==Q)return;const s=t?.agent||e;a?(Y.value=s,R.value=!0):H.value=s}catch(t){if(l!==Q)return;ee.error("加载代理详情失败: "+t.message),a?(Y.value=e,R.value=!0):H.value=e}finally{l===Q&&(W.value=!1)}}function Ie(e){Fe(e,!1)}function $e(){Y.value=null,we(),F("updated")}function Be(){F("back")}return u(()=>{we()}),r(ue,()=>{Q+=1,W.value=!1,H.value=null,we()}),(u,d)=>(c(),_("div",{class:m(["agents-panel asset-panel",{"in-drawer":y.inDrawer}])},[y.inDrawer?t("",!0):(c(),_("div",za,[w("div",Na,[y.hideBack?t("",!0):(c(),o(h(a),{key:0,text:"",onClick:Be,class:"back-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(U))]),_:1})]),_:1})),w("div",Pa,[w("div",Ua,[d[3]||(d[3]=w("span",{class:"asset-title"},"代理管理",-1)),w("span",Fa,p(pe.value),1)]),d[4]||(d[4]=w("div",{class:"asset-subtitle"},"维护自定义代理、工具权限和平台启用状态",-1))])]),ie.value?(c(),_("div",Ia,[i(h(a),{text:"",onClick:Me,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(P))]),_:1})]),default:f(()=>[d[5]||(d[5]=s(" 创建 ",-1))]),_:1}),i(h(a),{text:"",onClick:je,loading:D.value,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(S))]),_:1})]),default:f(()=>[d[6]||(d[6]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])),y.inDrawer?(c(),_("div",$a,[ie.value?(c(),_("div",Ba,[i(h(a),{text:"",onClick:Me,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(P))]),_:1})]),default:f(()=>[d[7]||(d[7]=s(" 创建 ",-1))]),_:1}),i(h(a),{text:"",onClick:je,loading:D.value,class:"action-btn"},{icon:f(()=>[i(h(e),null,{default:f(()=>[i(h(S))]),_:1})]),default:f(()=>[d[8]||(d[8]=s(" 刷新 ",-1))]),_:1},8,["loading"])])):t("",!0)])):t("",!0),w("div",Oa,[w("span",Da,[d[9]||(d[9]=w("span",{class:"asset-summary-label"},"全部",-1)),w("span",La,p(O.value.length),1)]),w("span",Sa,[d[10]||(d[10]=w("span",{class:"asset-summary-label"},"用户级",-1)),w("span",qa,p(ge.value),1)]),w("span",Aa,[d[11]||(d[11]=w("span",{class:"asset-summary-label"},"项目级",-1)),w("span",Ra,p(me.value),1)]),w("span",Ta,[d[12]||(d[12]=w("span",{class:"asset-summary-label"},"托管",-1)),w("span",Ea,p(ye.value),1)])]),w("div",Va,[i(h(se),{value:L.value,"onUpdate:value":d[0]||(d[0]=e=>L.value=e),placeholder:"搜索代理、描述或文件名",clearable:"",size:"small",class:"asset-search"},{prefix:f(()=>[i(h(e),null,{default:f(()=>[i(h($))]),_:1})]),_:1},8,["value"]),i(h(ce),{value:q.value,"onUpdate:value":d[1]||(d[1]=e=>q.value=e),options:fe,size:"small",class:"asset-filter"},null,8,["value"])]),w("div",Ga,[i(h(X),{show:D.value},{default:f(()=>[0!==ke.value.length||D.value?(c(),_("div",Wa,[(c(!0),_(g,null,n(ke.value,e=>(c(),o(ze,{key:he(e),agent:e,deleting:!!K.value[he(e)],"registry-info":Z.value[be(e)],toggling:!!J.value[be(e)],onEdit:Pe,onDelete:Ue,onClick:Ie,onToggleEnabled:Ce,onTogglePlatform:xe},null,8,["agent","deleting","registry-info","toggling"]))),128))])):(c(),_("div",Ha,[i(h(de),{description:_e.value},{icon:f(()=>[i(h(e),{size:"48",color:"var(--text-quaternary)"},{default:f(()=>[i(h(z))]),_:1})]),extra:f(()=>[ie.value?(c(),o(h(a),{key:0,size:"small",onClick:Me},{default:f(()=>[...d[13]||(d[13]=[s(" 创建第一个代理 ",-1)])]),_:1})):t("",!0)]),_:1},8,["description"])]))]),_:1},8,["show"])]),w("div",Ya,[i(h(e),{size:"14",class:"asset-info-icon"},{default:f(()=>[i(h(N))]),_:1}),w("span",null,p(re.value),1)]),i(Ma,{visible:R.value,"onUpdate:visible":Ne,agent:Y.value,"project-path":l.projectPath,platform:ue.value,onSaved:$e},null,8,["visible","agent","project-path","platform"]),i(ta,{visible:G.value,"onUpdate:visible":d[2]||(d[2]=e=>G.value=e),agent:H.value,platform:ue.value,loading:W.value},null,8,["visible","agent","platform","loading"])],2))}},[["__scopeId","data-v-b673c699"]]),Za=l({__name:"AgentsDrawer",props:{visible:Boolean,platform:{type:String,default:""}},emits:["update:visible"],setup(e,{emit:a}){const l=e,t=a,{drawerWidth:s}=Y(720),n=v({get:()=>l.visible,set:e=>t("update:visible",e)}),u={padding:0,display:"flex",flexDirection:"column",overflow:"hidden"};return(e,a)=>(c(),o(h(W),{show:n.value,"onUpdate:show":a[1]||(a[1]=e=>n.value=e),width:h(s),placement:"right","mask-closable":!0},{default:f(()=>[i(h(K),{closable:"","native-scrollbar":!1,"body-content-style":u},{header:f(()=>[...a[2]||(a[2]=[w("div",{class:"drawer-header"},[w("span",null,"代理管理")],-1)])]),default:f(()=>[i(Ka,{onBack:a[0]||(a[0]=e=>n.value=!1),"hide-back":!0,"in-drawer":!0,platform:l.platform},null,8,["platform"])]),_:1})]),_:1},8,["show","width"]))}},[["__scopeId","data-v-b9b7a7fa"]]);export{Za as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.asset-meta-item[data-v-044e4192]{max-width:150px}.config-edit-header[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;justify-content:space-between;align-items:flex-start;gap:18px;margin:-4px 0 18px;padding:16px;display:flex}.config-edit-identity[data-v-00915421]{align-items:center;gap:12px;min-width:0;display:flex}.config-edit-icon[data-v-00915421]{width:42px;height:42px;color:var(--primary-color);background:oklch(62% .15 151/.1);border:1px solid oklch(62% .15 151/.28);border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.config-edit-title-stack[data-v-00915421]{flex-direction:column;gap:3px;min-width:0;display:flex}.config-edit-kicker[data-v-00915421]{color:var(--text-tertiary);font-size:12px;line-height:1.3}.config-edit-title[data-v-00915421]{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:18px;font-weight:650;line-height:1.3;overflow:hidden}.config-edit-badges[data-v-00915421]{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;display:flex}.config-edit-form[data-v-00915421]{min-width:0}.config-edit-grid[data-v-00915421]{grid-template-columns:minmax(280px,.9fr) minmax(340px,1.1fr);gap:14px;display:grid}.config-edit-grid.is-codex[data-v-00915421]{align-items:start}.config-edit-section[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:8px;min-width:0;padding:16px}.content-section[data-v-00915421]{grid-column:1/-1}.section-heading[data-v-00915421]{color:var(--text-primary);align-items:center;gap:8px;margin-bottom:14px;font-size:13px;font-weight:650;display:flex}.field-grid[data-v-00915421]{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.scope-picker[data-v-00915421]{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;width:100%;display:grid}.scope-picker.single-option[data-v-00915421]{grid-template-columns:1fr}.scope-picker[data-v-00915421] .n-radio{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;align-items:flex-start;min-width:0;margin:0;padding:10px}.scope-option[data-v-00915421]{flex-direction:column;gap:2px;min-width:0;display:flex}.scope-title[data-v-00915421]{color:var(--text-primary);font-size:13px;font-weight:600}.scope-path[data-v-00915421]{overflow-wrap:anywhere;color:var(--text-tertiary);font-family:var(--font-mono);font-size:11px;line-height:1.4}.platform-note[data-v-00915421],.empty-config-box[data-v-00915421]{border:1px solid var(--border-primary);background:var(--bg-secondary);color:var(--text-secondary);border-radius:8px;align-items:flex-start;gap:8px;padding:11px 12px;font-size:12px;line-height:1.6;display:flex}.platform-note code[data-v-00915421]{font-family:var(--font-mono);font-size:11px}.empty-config-box[data-v-00915421]{align-items:center;margin-top:4px}.editor-form-item[data-v-00915421]{margin-bottom:0}.toml-editor[data-v-00915421] textarea{font-family:var(--font-mono);font-size:12px;line-height:1.65}.modal-footer[data-v-00915421]{justify-content:flex-end;gap:10px;padding-top:2px;display:flex}@media (width<=760px){.config-edit-header[data-v-00915421]{flex-direction:column}.config-edit-grid[data-v-00915421],.field-grid[data-v-00915421],.scope-picker[data-v-00915421]{grid-template-columns:1fr}}.back-btn[data-v-b673c699]{padding:4px}.action-btn[data-v-b673c699]{padding:4px 8px}.drawer-header[data-v-b9b7a7fa]{color:var(--text-primary);font-size:16px;font-weight:600}
|