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
|
@@ -5,20 +5,50 @@ const crypto = require('crypto');
|
|
|
5
5
|
const { spawnSync } = require('child_process');
|
|
6
6
|
const toml = require('toml');
|
|
7
7
|
const tomlStringify = require('@iarna/toml').stringify;
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
const
|
|
8
|
+
const pathsModule = require('../config/paths');
|
|
9
|
+
const DEFAULT_NATIVE_PATHS = pathsModule.NATIVE_PATHS;
|
|
10
|
+
const DEFAULT_PATHS = pathsModule.PATHS;
|
|
11
|
+
let NATIVE_PATHS = DEFAULT_NATIVE_PATHS;
|
|
12
|
+
let PATHS = DEFAULT_PATHS;
|
|
13
|
+
const claudeSettingsManager = require('./drivers/claude/native-config-implementation');
|
|
14
|
+
const codexSettingsManager = require('./drivers/codex/native-config-implementation');
|
|
15
|
+
const geminiSettingsManager = require('./drivers/gemini/native-config-implementation');
|
|
16
|
+
const { syncCodexUserEnvironment } = require('./drivers/codex/env-manager');
|
|
17
|
+
const nativeKeychain = require('../server/services/native-keychain');
|
|
18
|
+
const { maskToken, decodeJwtPayload, removeFileIfExists, sha256 } = require('../server/services/oauth-utils');
|
|
19
|
+
|
|
20
|
+
const SUPPORTED_TOOLS = ['claude', 'codex', 'gemini', 'omp'];
|
|
18
21
|
const GEMINI_MAIN_ACCOUNT_KEY = 'main-account';
|
|
19
22
|
const GEMINI_KEYCHAIN_SERVICE = 'gemini-cli-oauth';
|
|
20
23
|
const CODEX_KEYCHAIN_SERVICE = 'Codex Auth';
|
|
21
24
|
|
|
25
|
+
function configure({ pathContext } = {}) {
|
|
26
|
+
if (!pathContext?.customized) {
|
|
27
|
+
NATIVE_PATHS = DEFAULT_NATIVE_PATHS;
|
|
28
|
+
PATHS = DEFAULT_PATHS;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const platform = String(pathContext.platform || '').trim().toLowerCase();
|
|
33
|
+
const native = pathContext.native && typeof pathContext.native === 'object'
|
|
34
|
+
? pathContext.native
|
|
35
|
+
: {};
|
|
36
|
+
const state = pathContext.state && typeof pathContext.state === 'object'
|
|
37
|
+
? pathContext.state
|
|
38
|
+
: {};
|
|
39
|
+
NATIVE_PATHS = {
|
|
40
|
+
...DEFAULT_NATIVE_PATHS,
|
|
41
|
+
...(platform ? { [platform]: { ...(DEFAULT_NATIVE_PATHS[platform] || {}), ...native } } : {})
|
|
42
|
+
};
|
|
43
|
+
PATHS = {
|
|
44
|
+
...DEFAULT_PATHS,
|
|
45
|
+
channels: {
|
|
46
|
+
...(DEFAULT_PATHS.channels || {}),
|
|
47
|
+
...(platform && state.channels ? { [platform]: state.channels } : {})
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
22
52
|
function ensureDir(dirPath) {
|
|
23
53
|
if (!dirPath) return;
|
|
24
54
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
@@ -152,8 +182,37 @@ function clearClaudeOAuth() {
|
|
|
152
182
|
settings.env = settings.env || {};
|
|
153
183
|
delete settings.env.ANTHROPIC_AUTH_TOKEN;
|
|
154
184
|
delete settings.env.CLAUDE_CODE_OAUTH_TOKEN;
|
|
185
|
+
ensureDir(path.dirname(NATIVE_PATHS.claude.settings));
|
|
155
186
|
claudeSettingsManager.writeSettings(settings);
|
|
156
187
|
}
|
|
188
|
+
function clearClaudeChannelConfig() {
|
|
189
|
+
let settings = {};
|
|
190
|
+
try {
|
|
191
|
+
settings = claudeSettingsManager.settingsExists()
|
|
192
|
+
? claudeSettingsManager.readSettings()
|
|
193
|
+
: {};
|
|
194
|
+
} catch {
|
|
195
|
+
settings = {};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
settings.env = settings.env || {};
|
|
199
|
+
[
|
|
200
|
+
'ANTHROPIC_BASE_URL',
|
|
201
|
+
'ANTHROPIC_API_KEY',
|
|
202
|
+
'ANTHROPIC_AUTH_TOKEN',
|
|
203
|
+
'CLAUDE_CODE_OAUTH_TOKEN',
|
|
204
|
+
'ANTHROPIC_MODEL',
|
|
205
|
+
'ANTHROPIC_DEFAULT_HAIKU_MODEL',
|
|
206
|
+
'ANTHROPIC_DEFAULT_SONNET_MODEL',
|
|
207
|
+
'ANTHROPIC_DEFAULT_OPUS_MODEL'
|
|
208
|
+
].forEach((key) => {
|
|
209
|
+
delete settings.env[key];
|
|
210
|
+
});
|
|
211
|
+
delete settings.apiKeyHelper;
|
|
212
|
+
ensureDir(path.dirname(NATIVE_PATHS.claude.settings));
|
|
213
|
+
claudeSettingsManager.writeSettings(settings);
|
|
214
|
+
}
|
|
215
|
+
|
|
157
216
|
|
|
158
217
|
function applyClaudeOAuth(credential) {
|
|
159
218
|
clearClaudeOAuth();
|
|
@@ -199,7 +258,7 @@ function applyClaudeOAuth(credential) {
|
|
|
199
258
|
}
|
|
200
259
|
|
|
201
260
|
function inspectClaudeState() {
|
|
202
|
-
const { getProxyStatus } = require('
|
|
261
|
+
const { getProxyStatus } = require('./drivers/claude/proxy-implementation');
|
|
203
262
|
const proxyStatus = getProxyStatus();
|
|
204
263
|
const nativeOAuth = readClaudeNativeOAuth();
|
|
205
264
|
|
|
@@ -379,7 +438,7 @@ function applyCodexOAuth(credential) {
|
|
|
379
438
|
}
|
|
380
439
|
|
|
381
440
|
function inspectCodexState() {
|
|
382
|
-
const { getCodexProxyStatus } = require('
|
|
441
|
+
const { getCodexProxyStatus } = require('./drivers/codex/proxy-implementation');
|
|
383
442
|
const proxyStatus = getCodexProxyStatus();
|
|
384
443
|
const nativeOAuth = readCodexNativeOAuth();
|
|
385
444
|
|
|
@@ -536,6 +595,7 @@ function clearGeminiOAuth() {
|
|
|
536
595
|
}
|
|
537
596
|
|
|
538
597
|
function clearGeminiChannelConfig() {
|
|
598
|
+
ensureDir(path.dirname(NATIVE_PATHS.gemini.env));
|
|
539
599
|
const env = geminiSettingsManager.configExists()
|
|
540
600
|
? geminiSettingsManager.readEnv()
|
|
541
601
|
: {};
|
|
@@ -597,7 +657,7 @@ function applyGeminiOAuth(credential) {
|
|
|
597
657
|
}
|
|
598
658
|
|
|
599
659
|
function inspectGeminiState() {
|
|
600
|
-
const { getGeminiProxyStatus } = require('
|
|
660
|
+
const { getGeminiProxyStatus } = require('./drivers/gemini/proxy-implementation');
|
|
601
661
|
const proxyStatus = getGeminiProxyStatus();
|
|
602
662
|
const nativeOAuth = readGeminiNativeOAuth();
|
|
603
663
|
|
|
@@ -628,388 +688,10 @@ function inspectGeminiState() {
|
|
|
628
688
|
};
|
|
629
689
|
}
|
|
630
690
|
|
|
631
|
-
function parseOpenCodeOAuthPayload(raw) {
|
|
632
|
-
if (!raw || typeof raw !== 'object') {
|
|
633
|
-
return null;
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
if (raw.type === 'oauth' || raw.access) {
|
|
637
|
-
return parseOpenCodeOAuthEntry(raw.providerId, raw);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
if (raw.openai && typeof raw.openai === 'object') {
|
|
641
|
-
return parseOpenCodeOAuthEntry('openai', raw.openai);
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
for (const [providerId, value] of Object.entries(raw)) {
|
|
645
|
-
const parsed = parseOpenCodeOAuthEntry(providerId, value);
|
|
646
|
-
if (parsed) {
|
|
647
|
-
return parsed;
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
return null;
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
function parseOpenCodeOAuthEntry(providerId, target) {
|
|
655
|
-
const normalizedProviderId = String(providerId || 'openai').trim() || 'openai';
|
|
656
|
-
|
|
657
|
-
if (!target || target.type !== 'oauth' || !target.access) {
|
|
658
|
-
return null;
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
return {
|
|
662
|
-
providerId: normalizedProviderId,
|
|
663
|
-
accessToken: String(target.access || '').trim(),
|
|
664
|
-
refreshToken: String(target.refresh || '').trim() || '',
|
|
665
|
-
expiresAt: Number(target.expires || 0) || null,
|
|
666
|
-
accountId: String(target.accountId || '').trim() || '',
|
|
667
|
-
enterpriseUrl: String(target.enterpriseUrl || '').trim() || '',
|
|
668
|
-
primaryToken: String(target.access || '').trim()
|
|
669
|
-
};
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
function getActiveOpenCodeProviderId() {
|
|
673
|
-
try {
|
|
674
|
-
const configPath = opencodeSettingsManager.selectConfigPath();
|
|
675
|
-
if (!configPath || !fs.existsSync(configPath)) {
|
|
676
|
-
return '';
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
const config = opencodeSettingsManager.readConfig(configPath);
|
|
680
|
-
const modelRef = String(config?.model || '').trim();
|
|
681
|
-
if (modelRef.includes('/')) {
|
|
682
|
-
return modelRef.split('/')[0].trim();
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
const providerIds = config?.provider && typeof config.provider === 'object'
|
|
686
|
-
? Object.keys(config.provider).filter(Boolean)
|
|
687
|
-
: [];
|
|
688
|
-
return providerIds.length === 1 ? providerIds[0] : '';
|
|
689
|
-
} catch {
|
|
690
|
-
return '';
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
function readAllOpenCodeNativeOAuth() {
|
|
695
|
-
const payload = readJsonFile(NATIVE_PATHS.opencode.auth, null);
|
|
696
|
-
if (!payload || typeof payload !== 'object') {
|
|
697
|
-
return [];
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
const activeProviderId = getActiveOpenCodeProviderId();
|
|
701
|
-
const credentials = Object.entries(payload)
|
|
702
|
-
.map(([providerId, value]) => parseOpenCodeOAuthEntry(providerId, value))
|
|
703
|
-
.filter(Boolean)
|
|
704
|
-
.map((entry) => ({ ...entry, storage: 'auth-file' }));
|
|
705
|
-
|
|
706
|
-
if (!activeProviderId || credentials.length <= 1) {
|
|
707
|
-
return credentials;
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
return credentials.sort((left, right) => {
|
|
711
|
-
if (left.providerId === activeProviderId) return -1;
|
|
712
|
-
if (right.providerId === activeProviderId) return 1;
|
|
713
|
-
return left.providerId.localeCompare(right.providerId);
|
|
714
|
-
});
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
function readOpenCodeNativeOAuth() {
|
|
718
|
-
return readAllOpenCodeNativeOAuth()[0] || null;
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
function clearOpenCodeOAuth() {
|
|
722
|
-
const payload = readJsonFile(NATIVE_PATHS.opencode.auth, {});
|
|
723
|
-
if (!payload || typeof payload !== 'object') {
|
|
724
|
-
return;
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
const removedProviderIds = [];
|
|
728
|
-
Object.keys(payload).forEach((providerId) => {
|
|
729
|
-
if (payload[providerId]?.type === 'oauth') {
|
|
730
|
-
removedProviderIds.push(providerId);
|
|
731
|
-
delete payload[providerId];
|
|
732
|
-
}
|
|
733
|
-
});
|
|
734
|
-
|
|
735
|
-
if (Object.keys(payload).length === 0) {
|
|
736
|
-
removeFileIfExists(NATIVE_PATHS.opencode.auth);
|
|
737
|
-
} else {
|
|
738
|
-
writeJsonFile(NATIVE_PATHS.opencode.auth, payload);
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
syncOpenCodeConfigAfterOAuthRemoval(removedProviderIds);
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
function disableOpenCodeOAuthCredential(credential = {}) {
|
|
745
|
-
const providerId = String(credential.providerId || '').trim();
|
|
746
|
-
const accessToken = String(credential.accessToken || credential.primaryToken || '').trim();
|
|
747
|
-
const payload = readJsonFile(NATIVE_PATHS.opencode.auth, {});
|
|
748
|
-
if (!payload || typeof payload !== 'object') {
|
|
749
|
-
return;
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
const removedProviderIds = [];
|
|
753
|
-
Object.keys(payload).forEach((key) => {
|
|
754
|
-
const target = payload[key];
|
|
755
|
-
if (!target || target.type !== 'oauth') {
|
|
756
|
-
return;
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
const providerMatched = providerId && key === providerId;
|
|
760
|
-
const tokenMatched = accessToken && String(target.access || '').trim() === accessToken;
|
|
761
|
-
if (providerMatched || tokenMatched) {
|
|
762
|
-
removedProviderIds.push(key);
|
|
763
|
-
delete payload[key];
|
|
764
|
-
}
|
|
765
|
-
});
|
|
766
|
-
|
|
767
|
-
if (Object.keys(payload).length === 0) {
|
|
768
|
-
removeFileIfExists(NATIVE_PATHS.opencode.auth);
|
|
769
|
-
} else {
|
|
770
|
-
writeJsonFile(NATIVE_PATHS.opencode.auth, payload);
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
syncOpenCodeConfigAfterOAuthRemoval(removedProviderIds);
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
function isManagedOpenCodeProvider(provider) {
|
|
777
|
-
if (!provider || typeof provider !== 'object') {
|
|
778
|
-
return false;
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
if (provider.__ctx_managed__ === true) {
|
|
782
|
-
return true;
|
|
783
|
-
}
|
|
784
|
-
|
|
785
|
-
const apiKey = String(provider?.options?.apiKey || '').trim();
|
|
786
|
-
const baseUrl = String(provider?.options?.baseURL || '').trim();
|
|
787
|
-
return apiKey === 'PROXY_KEY' && (baseUrl.includes('127.0.0.1') || baseUrl.includes('localhost'));
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
function isProxyBackedOpenCodeProvider(provider) {
|
|
791
|
-
if (!provider || typeof provider !== 'object') {
|
|
792
|
-
return false;
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
const apiKey = String(provider?.options?.apiKey || '').trim();
|
|
796
|
-
const baseUrl = String(provider?.options?.baseURL || '').trim();
|
|
797
|
-
return apiKey === 'PROXY_KEY' && (baseUrl.includes('127.0.0.1') || baseUrl.includes('localhost'));
|
|
798
|
-
}
|
|
799
|
-
|
|
800
|
-
function isMeaningfulOpenCodeProvider(provider) {
|
|
801
|
-
if (!provider || typeof provider !== 'object') {
|
|
802
|
-
return false;
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
if (provider.__ctx_managed__ === true) {
|
|
806
|
-
return true;
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
if (typeof provider.npm === 'string' && provider.npm.trim()) {
|
|
810
|
-
return true;
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
if (typeof provider.name === 'string' && provider.name.trim()) {
|
|
814
|
-
return true;
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
if (provider.options && typeof provider.options === 'object' && Object.keys(provider.options).length > 0) {
|
|
818
|
-
return true;
|
|
819
|
-
}
|
|
820
|
-
|
|
821
|
-
if (provider.models && typeof provider.models === 'object' && Object.keys(provider.models).length > 0) {
|
|
822
|
-
return true;
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
return false;
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
function clearOpenCodeManagedModelSelection(config) {
|
|
829
|
-
const modelRef = String(config?.model || '').trim();
|
|
830
|
-
if (!modelRef || !modelRef.includes('/')) {
|
|
831
|
-
return;
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
const providerId = modelRef.split('/')[0].trim();
|
|
835
|
-
if (!providerId) {
|
|
836
|
-
return;
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
const provider = config?.provider?.[providerId];
|
|
840
|
-
if (isManagedOpenCodeProvider(provider)) {
|
|
841
|
-
delete config.model;
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
|
|
845
|
-
function getConfiguredOpenCodeProviderId(config) {
|
|
846
|
-
const modelRef = String(config?.model || '').trim();
|
|
847
|
-
if (modelRef.includes('/')) {
|
|
848
|
-
return modelRef.split('/')[0].trim();
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
const providerIds = config?.provider && typeof config.provider === 'object'
|
|
852
|
-
? Object.keys(config.provider).filter(Boolean)
|
|
853
|
-
: [];
|
|
854
|
-
return providerIds.length === 1 ? providerIds[0] : '';
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
function buildOpenCodeModelRef(providerId, provider) {
|
|
858
|
-
if (!providerId || !provider || typeof provider !== 'object') {
|
|
859
|
-
return '';
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
const modelIds = provider.models && typeof provider.models === 'object'
|
|
863
|
-
? Object.keys(provider.models).filter(Boolean)
|
|
864
|
-
: [];
|
|
865
|
-
|
|
866
|
-
if (modelIds.length === 0) {
|
|
867
|
-
return '';
|
|
868
|
-
}
|
|
869
|
-
|
|
870
|
-
return `${providerId}/${modelIds[0]}`;
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
function pickFallbackOpenCodeModel(config, excludedProviderIds = new Set()) {
|
|
874
|
-
const providers = config?.provider && typeof config.provider === 'object'
|
|
875
|
-
? Object.entries(config.provider)
|
|
876
|
-
: [];
|
|
877
|
-
|
|
878
|
-
for (const [providerId, provider] of providers) {
|
|
879
|
-
if (excludedProviderIds.has(providerId)) {
|
|
880
|
-
continue;
|
|
881
|
-
}
|
|
882
|
-
|
|
883
|
-
const modelRef = buildOpenCodeModelRef(providerId, provider);
|
|
884
|
-
if (modelRef) {
|
|
885
|
-
return modelRef;
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
return '';
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
function syncOpenCodeConfigAfterOAuthRemoval(removedProviderIds = []) {
|
|
893
|
-
const removedIds = new Set((removedProviderIds || []).filter(Boolean));
|
|
894
|
-
if (removedIds.size === 0) {
|
|
895
|
-
return;
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
const configPath = opencodeSettingsManager.selectConfigPath();
|
|
899
|
-
if (!configPath || !fs.existsSync(configPath)) {
|
|
900
|
-
return;
|
|
901
|
-
}
|
|
902
|
-
|
|
903
|
-
let config = {};
|
|
904
|
-
try {
|
|
905
|
-
config = opencodeSettingsManager.readConfig(configPath);
|
|
906
|
-
} catch {
|
|
907
|
-
return;
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
config = config && typeof config === 'object' ? config : {};
|
|
911
|
-
config.provider = config.provider && typeof config.provider === 'object' ? config.provider : {};
|
|
912
|
-
|
|
913
|
-
let changed = false;
|
|
914
|
-
for (const providerId of removedIds) {
|
|
915
|
-
const provider = config.provider[providerId];
|
|
916
|
-
if (provider && !isMeaningfulOpenCodeProvider(provider)) {
|
|
917
|
-
delete config.provider[providerId];
|
|
918
|
-
changed = true;
|
|
919
|
-
}
|
|
920
|
-
}
|
|
921
|
-
|
|
922
|
-
const activeProviderId = getConfiguredOpenCodeProviderId(config);
|
|
923
|
-
if (activeProviderId && removedIds.has(activeProviderId)) {
|
|
924
|
-
const activeProvider = config.provider[activeProviderId];
|
|
925
|
-
if (!isMeaningfulOpenCodeProvider(activeProvider)) {
|
|
926
|
-
const fallbackModel = pickFallbackOpenCodeModel(config, removedIds);
|
|
927
|
-
if (fallbackModel) {
|
|
928
|
-
config.model = fallbackModel;
|
|
929
|
-
} else {
|
|
930
|
-
delete config.model;
|
|
931
|
-
}
|
|
932
|
-
changed = true;
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
if (Object.keys(config.provider).length === 0) {
|
|
937
|
-
delete config.provider;
|
|
938
|
-
changed = true;
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
if (changed) {
|
|
942
|
-
opencodeSettingsManager.writeConfig(configPath, config);
|
|
943
|
-
}
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
function applyOpenCodeOAuth(credential) {
|
|
947
|
-
const providerId = String(credential.providerId || 'openai').trim() || 'openai';
|
|
948
|
-
const payload = readJsonFile(NATIVE_PATHS.opencode.auth, {});
|
|
949
|
-
payload[providerId] = {
|
|
950
|
-
type: 'oauth',
|
|
951
|
-
access: credential.accessToken,
|
|
952
|
-
refresh: credential.refreshToken || '',
|
|
953
|
-
expires: credential.expiresAt || null,
|
|
954
|
-
accountId: credential.accountId || undefined,
|
|
955
|
-
enterpriseUrl: credential.enterpriseUrl || undefined
|
|
956
|
-
};
|
|
957
|
-
writeJsonFile(NATIVE_PATHS.opencode.auth, payload);
|
|
958
|
-
|
|
959
|
-
const configPath = opencodeSettingsManager.selectConfigPath();
|
|
960
|
-
const config = fs.existsSync(configPath)
|
|
961
|
-
? opencodeSettingsManager.readConfig(configPath)
|
|
962
|
-
: {};
|
|
963
|
-
config.provider = config.provider && typeof config.provider === 'object' ? config.provider : {};
|
|
964
|
-
config.provider[providerId] = config.provider[providerId] && typeof config.provider[providerId] === 'object'
|
|
965
|
-
? config.provider[providerId]
|
|
966
|
-
: {};
|
|
967
|
-
// Preserve existing ctx-managed API providers for OpenCode coexistence, but
|
|
968
|
-
// drop the active managed selection so OAuth-backed providers become available.
|
|
969
|
-
clearOpenCodeManagedModelSelection(config);
|
|
970
|
-
opencodeSettingsManager.writeConfig(configPath, config);
|
|
971
|
-
|
|
972
|
-
return { storage: 'auth-file' };
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
function inspectOpenCodeState() {
|
|
976
|
-
const { getOpenCodeProxyStatus } = require('../opencode-proxy-server');
|
|
977
|
-
const proxyStatus = getOpenCodeProxyStatus();
|
|
978
|
-
const nativeOAuth = readOpenCodeNativeOAuth();
|
|
979
|
-
|
|
980
|
-
let channelConfigured = false;
|
|
981
|
-
try {
|
|
982
|
-
const configPath = opencodeSettingsManager.selectConfigPath();
|
|
983
|
-
const config = fs.existsSync(configPath)
|
|
984
|
-
? opencodeSettingsManager.readConfig(configPath)
|
|
985
|
-
: {};
|
|
986
|
-
const providers = config?.provider && typeof config.provider === 'object'
|
|
987
|
-
? Object.values(config.provider)
|
|
988
|
-
: [];
|
|
989
|
-
channelConfigured = providers.some(provider => (
|
|
990
|
-
isMeaningfulOpenCodeProvider(provider) && !isProxyBackedOpenCodeProvider(provider)
|
|
991
|
-
));
|
|
992
|
-
} catch {
|
|
993
|
-
channelConfigured = false;
|
|
994
|
-
}
|
|
995
|
-
|
|
996
|
-
return {
|
|
997
|
-
tool: 'opencode',
|
|
998
|
-
mode: proxyStatus.running
|
|
999
|
-
? 'proxy'
|
|
1000
|
-
: (nativeOAuth && channelConfigured
|
|
1001
|
-
? 'mixed'
|
|
1002
|
-
: (nativeOAuth ? 'oauth' : (channelConfigured ? 'channel' : 'idle'))),
|
|
1003
|
-
proxyRunning: proxyStatus.running,
|
|
1004
|
-
oauthPresent: Boolean(nativeOAuth),
|
|
1005
|
-
channelConfigured,
|
|
1006
|
-
nativeCredential: nativeOAuth ? buildNativeSummary(nativeOAuth) : null
|
|
1007
|
-
};
|
|
1008
|
-
}
|
|
1009
691
|
|
|
1010
692
|
function resolveOmpRuntime() {
|
|
1011
693
|
try {
|
|
1012
|
-
const ompConfig = require('./omp
|
|
694
|
+
const ompConfig = require('./drivers/omp/config');
|
|
1013
695
|
const runtime = ompConfig.resolveOmpRuntime(process.env, {});
|
|
1014
696
|
return runtime && runtime.runtime === 'omp' && runtime.installed ? runtime : null;
|
|
1015
697
|
} catch {
|
|
@@ -1045,7 +727,7 @@ function runOmpCommand(args = [], options = {}) {
|
|
|
1045
727
|
|
|
1046
728
|
function getOmpAuthSnapshot(options = {}) {
|
|
1047
729
|
try {
|
|
1048
|
-
const { getOmpAuthProviderSnapshot } = require('./omp
|
|
730
|
+
const { getOmpAuthProviderSnapshot } = require('./drivers/omp/auth-providers');
|
|
1049
731
|
return getOmpAuthProviderSnapshot({
|
|
1050
732
|
accountCheck: true,
|
|
1051
733
|
includeStatus: false,
|
|
@@ -1065,13 +747,11 @@ function readAllOmpNativeOAuth() {
|
|
|
1065
747
|
return snapshot.providers
|
|
1066
748
|
.filter(provider => provider?.loggedIn || Number(provider?.accountCount || 0) > 0)
|
|
1067
749
|
.flatMap((provider) => {
|
|
1068
|
-
const accounts = Array.isArray(provider.accounts)
|
|
1069
|
-
? provider.accounts
|
|
1070
|
-
: [{ index: 1, identity: '' }];
|
|
750
|
+
const accounts = Array.isArray(provider.accounts) ? provider.accounts : [];
|
|
1071
751
|
return accounts.map((account) => ({
|
|
1072
752
|
providerId: provider.id,
|
|
1073
|
-
accountId: String(account.index || '').trim(),
|
|
1074
|
-
accountEmail: String(account.identity || '').trim(),
|
|
753
|
+
accountId: String(account.index || account.id || account.accountId || '').trim(),
|
|
754
|
+
accountEmail: String(account.identity || account.email || account.accountEmail || '').trim(),
|
|
1075
755
|
storage: 'auth-broker',
|
|
1076
756
|
primaryToken: ''
|
|
1077
757
|
}));
|
|
@@ -1089,7 +769,7 @@ function clearOmpOAuth() {
|
|
|
1089
769
|
runOmpCommand(['auth-broker', 'logout', providerId], { timeout: 10000 });
|
|
1090
770
|
});
|
|
1091
771
|
try {
|
|
1092
|
-
require('./omp
|
|
772
|
+
require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
|
|
1093
773
|
} catch {
|
|
1094
774
|
// cache invalidation is best-effort
|
|
1095
775
|
}
|
|
@@ -1103,7 +783,7 @@ function disableOmpOAuthCredential(credential = {}) {
|
|
|
1103
783
|
}
|
|
1104
784
|
runOmpCommand(['auth-broker', 'logout', providerId], { timeout: 10000 });
|
|
1105
785
|
try {
|
|
1106
|
-
require('./omp
|
|
786
|
+
require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
|
|
1107
787
|
} catch {
|
|
1108
788
|
// cache invalidation is best-effort
|
|
1109
789
|
}
|
|
@@ -1164,7 +844,7 @@ function applyOmpOAuth(credential = {}) {
|
|
|
1164
844
|
throw new Error(`OMP auth-broker import failed: ${detail}`);
|
|
1165
845
|
}
|
|
1166
846
|
try {
|
|
1167
|
-
require('./omp
|
|
847
|
+
require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
|
|
1168
848
|
} catch {
|
|
1169
849
|
// cache invalidation is best-effort
|
|
1170
850
|
}
|
|
@@ -1180,8 +860,8 @@ function applyOmpOAuth(credential = {}) {
|
|
|
1180
860
|
}
|
|
1181
861
|
|
|
1182
862
|
function inspectOmpState() {
|
|
1183
|
-
const { getOmpProxyStatus } = require('
|
|
1184
|
-
const { isManagedOmpProvidersActive } = require('./omp-
|
|
863
|
+
const { getOmpProxyStatus } = require('./drivers/omp/proxy-implementation');
|
|
864
|
+
const { isManagedOmpProvidersActive } = require('./drivers/omp/native-config-implementation');
|
|
1185
865
|
const proxyStatus = getOmpProxyStatus();
|
|
1186
866
|
const nativeCredentials = readAllOmpNativeOAuth();
|
|
1187
867
|
|
|
@@ -1212,8 +892,6 @@ function inspectTool(tool) {
|
|
|
1212
892
|
return inspectCodexState();
|
|
1213
893
|
case 'gemini':
|
|
1214
894
|
return inspectGeminiState();
|
|
1215
|
-
case 'opencode':
|
|
1216
|
-
return inspectOpenCodeState();
|
|
1217
895
|
case 'omp':
|
|
1218
896
|
return inspectOmpState();
|
|
1219
897
|
default:
|
|
@@ -1229,8 +907,6 @@ function readNativeOAuth(tool) {
|
|
|
1229
907
|
return readCodexNativeOAuth();
|
|
1230
908
|
case 'gemini':
|
|
1231
909
|
return readGeminiNativeOAuth();
|
|
1232
|
-
case 'opencode':
|
|
1233
|
-
return readOpenCodeNativeOAuth();
|
|
1234
910
|
case 'omp':
|
|
1235
911
|
return readOmpNativeOAuth();
|
|
1236
912
|
default:
|
|
@@ -1252,8 +928,6 @@ function readAllNativeOAuth(tool) {
|
|
|
1252
928
|
const credential = readGeminiNativeOAuth();
|
|
1253
929
|
return credential ? [credential] : [];
|
|
1254
930
|
}
|
|
1255
|
-
case 'opencode':
|
|
1256
|
-
return readAllOpenCodeNativeOAuth();
|
|
1257
931
|
case 'omp':
|
|
1258
932
|
return readAllOmpNativeOAuth();
|
|
1259
933
|
default:
|
|
@@ -1272,9 +946,6 @@ function clearNativeOAuth(tool) {
|
|
|
1272
946
|
case 'gemini':
|
|
1273
947
|
clearGeminiOAuth();
|
|
1274
948
|
return;
|
|
1275
|
-
case 'opencode':
|
|
1276
|
-
clearOpenCodeOAuth();
|
|
1277
|
-
return;
|
|
1278
949
|
case 'omp':
|
|
1279
950
|
clearOmpOAuth();
|
|
1280
951
|
return;
|
|
@@ -1294,9 +965,6 @@ function disableNativeOAuthCredential(tool, credential = {}) {
|
|
|
1294
965
|
case 'gemini':
|
|
1295
966
|
clearGeminiOAuth();
|
|
1296
967
|
return;
|
|
1297
|
-
case 'opencode':
|
|
1298
|
-
disableOpenCodeOAuthCredential(credential);
|
|
1299
|
-
return;
|
|
1300
968
|
case 'omp':
|
|
1301
969
|
disableOmpOAuthCredential(credential);
|
|
1302
970
|
return;
|
|
@@ -1313,8 +981,6 @@ function applyOAuthCredential(tool, credential) {
|
|
|
1313
981
|
return applyCodexOAuth(credential);
|
|
1314
982
|
case 'gemini':
|
|
1315
983
|
return applyGeminiOAuth(credential);
|
|
1316
|
-
case 'opencode':
|
|
1317
|
-
return applyOpenCodeOAuth(credential);
|
|
1318
984
|
case 'omp':
|
|
1319
985
|
return applyOmpOAuth(credential);
|
|
1320
986
|
default:
|
|
@@ -1324,10 +990,14 @@ function applyOAuthCredential(tool, credential) {
|
|
|
1324
990
|
|
|
1325
991
|
module.exports = {
|
|
1326
992
|
SUPPORTED_TOOLS,
|
|
993
|
+
configure,
|
|
1327
994
|
fingerprintFor,
|
|
1328
995
|
inspectTool,
|
|
1329
996
|
readNativeOAuth,
|
|
1330
997
|
readAllNativeOAuth,
|
|
998
|
+
clearClaudeChannelConfig,
|
|
999
|
+
clearGeminiChannelConfig,
|
|
1000
|
+
clearCodexChannelConfig,
|
|
1331
1001
|
clearNativeOAuth,
|
|
1332
1002
|
disableNativeOAuthCredential,
|
|
1333
1003
|
applyOAuthCredential
|