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
|
@@ -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
|
|
|
@@ -262,12 +321,22 @@ function parseCodexAuthPayload(raw) {
|
|
|
262
321
|
const idTokenPayload = decodeJwtPayload(tokens.id_token);
|
|
263
322
|
const accessTokenPayload = decodeJwtPayload(tokens.access_token);
|
|
264
323
|
const exp = Number(idTokenPayload?.exp || accessTokenPayload?.exp || 0) || null;
|
|
324
|
+
const accountId = tokens.account_id
|
|
325
|
+
|| idTokenPayload?.chatgpt_account_id
|
|
326
|
+
|| accessTokenPayload?.chatgpt_account_id
|
|
327
|
+
|| idTokenPayload?.['https://api.openai.com/auth.chatgpt_account_id']
|
|
328
|
+
|| accessTokenPayload?.['https://api.openai.com/auth.chatgpt_account_id']
|
|
329
|
+
|| idTokenPayload?.['https://api.openai.com/auth']?.chatgpt_account_id
|
|
330
|
+
|| accessTokenPayload?.['https://api.openai.com/auth']?.chatgpt_account_id
|
|
331
|
+
|| idTokenPayload?.organizations?.[0]?.id
|
|
332
|
+
|| accessTokenPayload?.organizations?.[0]?.id
|
|
333
|
+
|| '';
|
|
265
334
|
return {
|
|
266
335
|
authMode: String(auth.auth_mode || 'chatgpt').trim() || 'chatgpt',
|
|
267
336
|
accessToken: String(tokens.access_token || '').trim(),
|
|
268
337
|
refreshToken: String(tokens.refresh_token || '').trim() || '',
|
|
269
338
|
idToken: String(tokens.id_token || '').trim() || '',
|
|
270
|
-
accountId: String(
|
|
339
|
+
accountId: String(accountId).trim(),
|
|
271
340
|
accountEmail: String(idTokenPayload?.email || '').trim() || '',
|
|
272
341
|
expiresAt: exp ? exp * 1000 : null,
|
|
273
342
|
lastRefresh: auth.last_refresh || null,
|
|
@@ -379,7 +448,7 @@ function applyCodexOAuth(credential) {
|
|
|
379
448
|
}
|
|
380
449
|
|
|
381
450
|
function inspectCodexState() {
|
|
382
|
-
const { getCodexProxyStatus } = require('
|
|
451
|
+
const { getCodexProxyStatus } = require('./drivers/codex/proxy-implementation');
|
|
383
452
|
const proxyStatus = getCodexProxyStatus();
|
|
384
453
|
const nativeOAuth = readCodexNativeOAuth();
|
|
385
454
|
|
|
@@ -536,6 +605,7 @@ function clearGeminiOAuth() {
|
|
|
536
605
|
}
|
|
537
606
|
|
|
538
607
|
function clearGeminiChannelConfig() {
|
|
608
|
+
ensureDir(path.dirname(NATIVE_PATHS.gemini.env));
|
|
539
609
|
const env = geminiSettingsManager.configExists()
|
|
540
610
|
? geminiSettingsManager.readEnv()
|
|
541
611
|
: {};
|
|
@@ -597,7 +667,7 @@ function applyGeminiOAuth(credential) {
|
|
|
597
667
|
}
|
|
598
668
|
|
|
599
669
|
function inspectGeminiState() {
|
|
600
|
-
const { getGeminiProxyStatus } = require('
|
|
670
|
+
const { getGeminiProxyStatus } = require('./drivers/gemini/proxy-implementation');
|
|
601
671
|
const proxyStatus = getGeminiProxyStatus();
|
|
602
672
|
const nativeOAuth = readGeminiNativeOAuth();
|
|
603
673
|
|
|
@@ -628,388 +698,10 @@ function inspectGeminiState() {
|
|
|
628
698
|
};
|
|
629
699
|
}
|
|
630
700
|
|
|
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
701
|
|
|
1010
702
|
function resolveOmpRuntime() {
|
|
1011
703
|
try {
|
|
1012
|
-
const ompConfig = require('./omp
|
|
704
|
+
const ompConfig = require('./drivers/omp/config');
|
|
1013
705
|
const runtime = ompConfig.resolveOmpRuntime(process.env, {});
|
|
1014
706
|
return runtime && runtime.runtime === 'omp' && runtime.installed ? runtime : null;
|
|
1015
707
|
} catch {
|
|
@@ -1045,7 +737,7 @@ function runOmpCommand(args = [], options = {}) {
|
|
|
1045
737
|
|
|
1046
738
|
function getOmpAuthSnapshot(options = {}) {
|
|
1047
739
|
try {
|
|
1048
|
-
const { getOmpAuthProviderSnapshot } = require('./omp
|
|
740
|
+
const { getOmpAuthProviderSnapshot } = require('./drivers/omp/auth-providers');
|
|
1049
741
|
return getOmpAuthProviderSnapshot({
|
|
1050
742
|
accountCheck: true,
|
|
1051
743
|
includeStatus: false,
|
|
@@ -1065,13 +757,11 @@ function readAllOmpNativeOAuth() {
|
|
|
1065
757
|
return snapshot.providers
|
|
1066
758
|
.filter(provider => provider?.loggedIn || Number(provider?.accountCount || 0) > 0)
|
|
1067
759
|
.flatMap((provider) => {
|
|
1068
|
-
const accounts = Array.isArray(provider.accounts)
|
|
1069
|
-
? provider.accounts
|
|
1070
|
-
: [{ index: 1, identity: '' }];
|
|
760
|
+
const accounts = Array.isArray(provider.accounts) ? provider.accounts : [];
|
|
1071
761
|
return accounts.map((account) => ({
|
|
1072
762
|
providerId: provider.id,
|
|
1073
|
-
accountId: String(account.index || '').trim(),
|
|
1074
|
-
accountEmail: String(account.identity || '').trim(),
|
|
763
|
+
accountId: String(account.index || account.id || account.accountId || '').trim(),
|
|
764
|
+
accountEmail: String(account.identity || account.email || account.accountEmail || '').trim(),
|
|
1075
765
|
storage: 'auth-broker',
|
|
1076
766
|
primaryToken: ''
|
|
1077
767
|
}));
|
|
@@ -1089,7 +779,7 @@ function clearOmpOAuth() {
|
|
|
1089
779
|
runOmpCommand(['auth-broker', 'logout', providerId], { timeout: 10000 });
|
|
1090
780
|
});
|
|
1091
781
|
try {
|
|
1092
|
-
require('./omp
|
|
782
|
+
require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
|
|
1093
783
|
} catch {
|
|
1094
784
|
// cache invalidation is best-effort
|
|
1095
785
|
}
|
|
@@ -1103,7 +793,7 @@ function disableOmpOAuthCredential(credential = {}) {
|
|
|
1103
793
|
}
|
|
1104
794
|
runOmpCommand(['auth-broker', 'logout', providerId], { timeout: 10000 });
|
|
1105
795
|
try {
|
|
1106
|
-
require('./omp
|
|
796
|
+
require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
|
|
1107
797
|
} catch {
|
|
1108
798
|
// cache invalidation is best-effort
|
|
1109
799
|
}
|
|
@@ -1164,7 +854,7 @@ function applyOmpOAuth(credential = {}) {
|
|
|
1164
854
|
throw new Error(`OMP auth-broker import failed: ${detail}`);
|
|
1165
855
|
}
|
|
1166
856
|
try {
|
|
1167
|
-
require('./omp
|
|
857
|
+
require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
|
|
1168
858
|
} catch {
|
|
1169
859
|
// cache invalidation is best-effort
|
|
1170
860
|
}
|
|
@@ -1180,8 +870,8 @@ function applyOmpOAuth(credential = {}) {
|
|
|
1180
870
|
}
|
|
1181
871
|
|
|
1182
872
|
function inspectOmpState() {
|
|
1183
|
-
const { getOmpProxyStatus } = require('
|
|
1184
|
-
const { isManagedOmpProvidersActive } = require('./omp-
|
|
873
|
+
const { getOmpProxyStatus } = require('./drivers/omp/proxy-implementation');
|
|
874
|
+
const { isManagedOmpProvidersActive } = require('./drivers/omp/native-config-implementation');
|
|
1185
875
|
const proxyStatus = getOmpProxyStatus();
|
|
1186
876
|
const nativeCredentials = readAllOmpNativeOAuth();
|
|
1187
877
|
|
|
@@ -1212,8 +902,6 @@ function inspectTool(tool) {
|
|
|
1212
902
|
return inspectCodexState();
|
|
1213
903
|
case 'gemini':
|
|
1214
904
|
return inspectGeminiState();
|
|
1215
|
-
case 'opencode':
|
|
1216
|
-
return inspectOpenCodeState();
|
|
1217
905
|
case 'omp':
|
|
1218
906
|
return inspectOmpState();
|
|
1219
907
|
default:
|
|
@@ -1229,8 +917,6 @@ function readNativeOAuth(tool) {
|
|
|
1229
917
|
return readCodexNativeOAuth();
|
|
1230
918
|
case 'gemini':
|
|
1231
919
|
return readGeminiNativeOAuth();
|
|
1232
|
-
case 'opencode':
|
|
1233
|
-
return readOpenCodeNativeOAuth();
|
|
1234
920
|
case 'omp':
|
|
1235
921
|
return readOmpNativeOAuth();
|
|
1236
922
|
default:
|
|
@@ -1252,8 +938,6 @@ function readAllNativeOAuth(tool) {
|
|
|
1252
938
|
const credential = readGeminiNativeOAuth();
|
|
1253
939
|
return credential ? [credential] : [];
|
|
1254
940
|
}
|
|
1255
|
-
case 'opencode':
|
|
1256
|
-
return readAllOpenCodeNativeOAuth();
|
|
1257
941
|
case 'omp':
|
|
1258
942
|
return readAllOmpNativeOAuth();
|
|
1259
943
|
default:
|
|
@@ -1272,9 +956,6 @@ function clearNativeOAuth(tool) {
|
|
|
1272
956
|
case 'gemini':
|
|
1273
957
|
clearGeminiOAuth();
|
|
1274
958
|
return;
|
|
1275
|
-
case 'opencode':
|
|
1276
|
-
clearOpenCodeOAuth();
|
|
1277
|
-
return;
|
|
1278
959
|
case 'omp':
|
|
1279
960
|
clearOmpOAuth();
|
|
1280
961
|
return;
|
|
@@ -1294,9 +975,6 @@ function disableNativeOAuthCredential(tool, credential = {}) {
|
|
|
1294
975
|
case 'gemini':
|
|
1295
976
|
clearGeminiOAuth();
|
|
1296
977
|
return;
|
|
1297
|
-
case 'opencode':
|
|
1298
|
-
disableOpenCodeOAuthCredential(credential);
|
|
1299
|
-
return;
|
|
1300
978
|
case 'omp':
|
|
1301
979
|
disableOmpOAuthCredential(credential);
|
|
1302
980
|
return;
|
|
@@ -1313,8 +991,6 @@ function applyOAuthCredential(tool, credential) {
|
|
|
1313
991
|
return applyCodexOAuth(credential);
|
|
1314
992
|
case 'gemini':
|
|
1315
993
|
return applyGeminiOAuth(credential);
|
|
1316
|
-
case 'opencode':
|
|
1317
|
-
return applyOpenCodeOAuth(credential);
|
|
1318
994
|
case 'omp':
|
|
1319
995
|
return applyOmpOAuth(credential);
|
|
1320
996
|
default:
|
|
@@ -1324,10 +1000,14 @@ function applyOAuthCredential(tool, credential) {
|
|
|
1324
1000
|
|
|
1325
1001
|
module.exports = {
|
|
1326
1002
|
SUPPORTED_TOOLS,
|
|
1003
|
+
configure,
|
|
1327
1004
|
fingerprintFor,
|
|
1328
1005
|
inspectTool,
|
|
1329
1006
|
readNativeOAuth,
|
|
1330
1007
|
readAllNativeOAuth,
|
|
1008
|
+
clearClaudeChannelConfig,
|
|
1009
|
+
clearGeminiChannelConfig,
|
|
1010
|
+
clearCodexChannelConfig,
|
|
1331
1011
|
clearNativeOAuth,
|
|
1332
1012
|
disableNativeOAuthCredential,
|
|
1333
1013
|
applyOAuthCredential
|