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
|
@@ -2,47 +2,59 @@
|
|
|
2
2
|
|
|
3
3
|
const fs = require('fs');
|
|
4
4
|
const path = require('path');
|
|
5
|
-
const { getCodexDir } = require('
|
|
6
|
-
const {
|
|
5
|
+
const { getCodexDir } = require('./config');
|
|
6
|
+
const { parseSession } = require('./parser');
|
|
7
|
+
|
|
8
|
+
function configure({ pathContext } = {}) {
|
|
9
|
+
require('./config').configure?.({ pathContext });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function extractSessionIdFromRolloutFilename(filePath) {
|
|
13
|
+
const basename = path.basename(filePath, '.jsonl');
|
|
14
|
+
const match = basename.match(/([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/i);
|
|
15
|
+
return match ? match[1] : basename;
|
|
16
|
+
}
|
|
7
17
|
|
|
8
18
|
/**
|
|
9
19
|
* Scan all Codex session files recursively.
|
|
10
20
|
* @returns {Array<{filePath: string, size: number, mtimeMs: number, sessionId: string}>}
|
|
11
21
|
*/
|
|
12
|
-
function scanSessionFiles() {
|
|
22
|
+
async function scanSessionFiles(projectsDir = null) {
|
|
13
23
|
const results = [];
|
|
14
|
-
const sessionsDir = path.join(getCodexDir(), 'sessions');
|
|
24
|
+
const sessionsDir = projectsDir || path.join(getCodexDir(), 'sessions');
|
|
15
25
|
|
|
16
|
-
|
|
26
|
+
try {
|
|
27
|
+
await fs.promises.stat(sessionsDir);
|
|
28
|
+
} catch (_) {
|
|
17
29
|
return results;
|
|
18
30
|
}
|
|
19
31
|
|
|
20
|
-
function scanDir(dir) {
|
|
32
|
+
async function scanDir(dir) {
|
|
21
33
|
let entries;
|
|
22
34
|
try {
|
|
23
|
-
entries = fs.
|
|
35
|
+
entries = await fs.promises.readdir(dir, { withFileTypes: true });
|
|
24
36
|
} catch (_) {
|
|
25
37
|
return;
|
|
26
38
|
}
|
|
27
39
|
for (const entry of entries) {
|
|
28
40
|
const fullPath = path.join(dir, entry.name);
|
|
29
41
|
if (entry.isDirectory()) {
|
|
30
|
-
scanDir(fullPath);
|
|
42
|
+
await scanDir(fullPath);
|
|
31
43
|
} else if (entry.isFile() && entry.name.match(/^rollout-.*\.jsonl$/)) {
|
|
32
44
|
try {
|
|
33
|
-
const stat = fs.
|
|
45
|
+
const stat = await fs.promises.stat(fullPath);
|
|
34
46
|
results.push({
|
|
35
47
|
filePath: fullPath,
|
|
36
48
|
size: stat.size,
|
|
37
49
|
mtimeMs: stat.mtimeMs,
|
|
38
|
-
sessionId:
|
|
50
|
+
sessionId: extractSessionIdFromRolloutFilename(fullPath)
|
|
39
51
|
});
|
|
40
52
|
} catch (_) {}
|
|
41
53
|
}
|
|
42
54
|
}
|
|
43
55
|
}
|
|
44
56
|
|
|
45
|
-
scanDir(sessionsDir);
|
|
57
|
+
await scanDir(sessionsDir);
|
|
46
58
|
return results;
|
|
47
59
|
}
|
|
48
60
|
|
|
@@ -67,8 +79,8 @@ function extractCodexProjectName(meta) {
|
|
|
67
79
|
* Inventory all Codex session files.
|
|
68
80
|
* @returns {Promise<Array>}
|
|
69
81
|
*/
|
|
70
|
-
async function inventory() {
|
|
71
|
-
const files = scanSessionFiles();
|
|
82
|
+
async function inventory({ projectsDir } = {}) {
|
|
83
|
+
const files = await scanSessionFiles(projectsDir);
|
|
72
84
|
return files.map(f => ({
|
|
73
85
|
filePath: f.filePath,
|
|
74
86
|
size: f.size,
|
|
@@ -83,13 +95,15 @@ async function inventory() {
|
|
|
83
95
|
*/
|
|
84
96
|
async function parse(descriptor) {
|
|
85
97
|
const { filePath, size, mtimeMs, sessionId } = descriptor;
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
const tokenUsage = extractTokenUsage(lines);
|
|
91
|
-
|
|
98
|
+
const parsed = parseSession(filePath);
|
|
99
|
+
const meta = parsed?.meta;
|
|
100
|
+
const messages = parsed?.messages || [];
|
|
101
|
+
const tokenUsage = parsed?.tokens;
|
|
92
102
|
const projectName = extractCodexProjectName(meta);
|
|
103
|
+
const descriptorIdIsNative = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(sessionId);
|
|
104
|
+
const nativeSessionId = descriptorIdIsNative
|
|
105
|
+
? sessionId
|
|
106
|
+
: (typeof meta?.sessionId === 'string' && meta.sessionId.trim() ? meta.sessionId.trim() : sessionId);
|
|
93
107
|
const usageJson = tokenUsage ? JSON.stringify(tokenUsage) : null;
|
|
94
108
|
|
|
95
109
|
// Build normalized messages
|
|
@@ -119,7 +133,7 @@ async function parse(descriptor) {
|
|
|
119
133
|
|
|
120
134
|
const isUser = msg.role === 'user' || msg.role === 'human';
|
|
121
135
|
return {
|
|
122
|
-
messageId: msg.id || `codex-${
|
|
136
|
+
messageId: msg.id || `codex-${nativeSessionId}-${idx}`,
|
|
123
137
|
role: msg.role || 'unknown',
|
|
124
138
|
type: msg.type || msg.role || 'unknown',
|
|
125
139
|
subtype: msg.subtype || null,
|
|
@@ -136,10 +150,10 @@ async function parse(descriptor) {
|
|
|
136
150
|
const lastMsg = normalizedMessages[normalizedMessages.length - 1];
|
|
137
151
|
|
|
138
152
|
const session = {
|
|
139
|
-
sessionId,
|
|
153
|
+
sessionId: nativeSessionId,
|
|
140
154
|
projectName,
|
|
141
155
|
projectDisplayName: projectName,
|
|
142
|
-
projectFullPath: null,
|
|
156
|
+
projectFullPath: typeof meta?.cwd === 'string' && meta.cwd.trim() ? meta.cwd.trim() : null,
|
|
143
157
|
firstMessage: firstUserMsg ? firstUserMsg.content : null,
|
|
144
158
|
gitBranch: meta ? (meta.gitBranch || null) : null,
|
|
145
159
|
provider: null,
|
|
@@ -155,4 +169,4 @@ async function parse(descriptor) {
|
|
|
155
169
|
return { session, messages: normalizedMessages };
|
|
156
170
|
}
|
|
157
171
|
|
|
158
|
-
module.exports = { inventory, parse, extractCodexProjectName };
|
|
172
|
+
module.exports = { configure, inventory, parse, extractCodexProjectName };
|
package/src/{server/services/codex-sessions.js → platforms/drivers/codex/sessions-implementation.js}
RENAMED
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const path = require('path');
|
|
3
|
-
const { getCodexDir } = require('./
|
|
4
|
-
const { parseSession, parseSessionMeta, extractSessionMeta, readJSONL } = require('./
|
|
5
|
-
const { globalCache, CacheKeys } = require('
|
|
6
|
-
|
|
3
|
+
const { getCodexDir } = require('./config');
|
|
4
|
+
const { parseSession, parseSessionMeta, extractSessionMeta, readJSONL } = require('./parser');
|
|
5
|
+
const { globalCache, CacheKeys } = require('../../../server/services/enhanced-cache');
|
|
6
|
+
let sessionHistoryIndex = null;
|
|
7
|
+
let codexDirOverride = null;
|
|
8
|
+
|
|
9
|
+
function configure({ sessionHistoryIndex: index, pathContext } = {}) {
|
|
10
|
+
sessionHistoryIndex = index || null;
|
|
11
|
+
codexDirOverride = pathContext?.customized ? (pathContext.native?.dir || null) : null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function getSessionHistoryIndex(options = {}) {
|
|
15
|
+
if (!sessionHistoryIndex) {
|
|
16
|
+
const { getDefaultDependencies } = require('../../../platforms/runtime');
|
|
17
|
+
sessionHistoryIndex = getDefaultDependencies().sessionHistoryIndex;
|
|
18
|
+
if (!sessionHistoryIndex) {
|
|
19
|
+
const indexModule = require('../../../server/services/session-history-index');
|
|
20
|
+
sessionHistoryIndex = Object.keys(options).length > 0
|
|
21
|
+
? indexModule.createSessionHistoryIndex({ config: options })
|
|
22
|
+
: indexModule;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return sessionHistoryIndex;
|
|
26
|
+
}
|
|
7
27
|
|
|
8
28
|
const COUNTS_CACHE_TTL_MS = 30 * 1000;
|
|
9
29
|
const SCAN_FILES_CACHE_TTL_MS = 15 * 1000;
|
|
@@ -44,7 +64,7 @@ function getCodexSessionsCacheKey(projectName) {
|
|
|
44
64
|
* 获取会话目录
|
|
45
65
|
*/
|
|
46
66
|
function getSessionsDir() {
|
|
47
|
-
return path.join(getCodexDir(), 'sessions');
|
|
67
|
+
return path.join(codexDirOverride || getCodexDir(), 'sessions');
|
|
48
68
|
}
|
|
49
69
|
|
|
50
70
|
/**
|
|
@@ -229,7 +249,8 @@ function normalizeSession(codexSession) {
|
|
|
229
249
|
* @returns {Array} 项目对象数组
|
|
230
250
|
*/
|
|
231
251
|
async function getProjects(options = {}) {
|
|
232
|
-
|
|
252
|
+
if (!fs.existsSync(getSessionsDir())) return [];
|
|
253
|
+
const projects = await getSessionHistoryIndex({ ...options, projectsDir: getSessionsDir() }).listProjects('codex', options);
|
|
233
254
|
const savedOrder = getProjectOrder();
|
|
234
255
|
if (savedOrder.length === 0) return projects;
|
|
235
256
|
|
|
@@ -245,9 +266,9 @@ async function getProjects(options = {}) {
|
|
|
245
266
|
* @returns {Array} 归一化的会话数组
|
|
246
267
|
*/
|
|
247
268
|
async function getSessionsByProject(projectName, options = {}) {
|
|
248
|
-
const indexed = await
|
|
249
|
-
const forkRelations = require('
|
|
250
|
-
const aliases = require('
|
|
269
|
+
const indexed = await getSessionHistoryIndex().listSessions('codex', projectName, options);
|
|
270
|
+
const forkRelations = require('../claude/sessions-implementation').getForkRelations();
|
|
271
|
+
const aliases = require('../../../server/services/alias').loadAliases();
|
|
251
272
|
const sessions = indexed.map(session => ({
|
|
252
273
|
...session,
|
|
253
274
|
mtime: new Date(session.mtime).toISOString(),
|
|
@@ -269,7 +290,7 @@ async function getSessionsByProject(projectName, options = {}) {
|
|
|
269
290
|
* @returns {Object|null} 归一化的会话对象
|
|
270
291
|
*/
|
|
271
292
|
async function getSessionById(sessionId) {
|
|
272
|
-
const status = await
|
|
293
|
+
const status = await getSessionHistoryIndex().getSessionStatus('codex', sessionId);
|
|
273
294
|
if (!status) return null;
|
|
274
295
|
const session = parseSession(status.filePath);
|
|
275
296
|
if (!session) return null;
|
|
@@ -282,7 +303,7 @@ async function getSessionById(sessionId) {
|
|
|
282
303
|
* @returns {Array} 搜索结果
|
|
283
304
|
*/
|
|
284
305
|
async function searchSessions(keyword) {
|
|
285
|
-
return
|
|
306
|
+
return getSessionHistoryIndex().searchSessions('codex', keyword);
|
|
286
307
|
}
|
|
287
308
|
|
|
288
309
|
/**
|
|
@@ -305,8 +326,8 @@ function deleteProject(projectName) {
|
|
|
305
326
|
|
|
306
327
|
// 删除所有会话文件
|
|
307
328
|
let deletedCount = 0;
|
|
308
|
-
const { getForkRelations, saveForkRelations } = require('
|
|
309
|
-
const { deleteAlias } = require('
|
|
329
|
+
const { getForkRelations, saveForkRelations } = require('../claude/sessions-implementation');
|
|
330
|
+
const { deleteAlias } = require('../../../server/services/alias');
|
|
310
331
|
const forkRelations = getForkRelations();
|
|
311
332
|
let forkRelationsModified = false;
|
|
312
333
|
|
|
@@ -377,9 +398,9 @@ function deleteProject(projectName) {
|
|
|
377
398
|
* @returns {Array} 最近会话数组
|
|
378
399
|
*/
|
|
379
400
|
async function getRecentSessions(limit = 5) {
|
|
380
|
-
const indexed = await
|
|
381
|
-
const forkRelations = require('
|
|
382
|
-
const aliases = require('
|
|
401
|
+
const indexed = await getSessionHistoryIndex().getRecentSessions('codex', limit);
|
|
402
|
+
const forkRelations = require('../claude/sessions-implementation').getForkRelations();
|
|
403
|
+
const aliases = require('../../../server/services/alias').loadAliases();
|
|
383
404
|
return indexed.map(session => ({
|
|
384
405
|
...session,
|
|
385
406
|
mtime: new Date(session.mtime).toISOString(),
|
|
@@ -404,7 +425,7 @@ function deleteSession(sessionId) {
|
|
|
404
425
|
fs.unlinkSync(targetFile.filePath);
|
|
405
426
|
|
|
406
427
|
// 清理 fork 关系
|
|
407
|
-
const { getForkRelations, saveForkRelations } = require('
|
|
428
|
+
const { getForkRelations, saveForkRelations } = require('../claude/sessions-implementation');
|
|
408
429
|
const forkRelations = getForkRelations();
|
|
409
430
|
|
|
410
431
|
// 删除作为源的 fork 关系
|
|
@@ -420,7 +441,7 @@ function deleteSession(sessionId) {
|
|
|
420
441
|
saveForkRelations(forkRelations);
|
|
421
442
|
|
|
422
443
|
// 清理别名
|
|
423
|
-
const { deleteAlias } = require('
|
|
444
|
+
const { deleteAlias } = require('../../../server/services/alias');
|
|
424
445
|
try {
|
|
425
446
|
deleteAlias(sessionId);
|
|
426
447
|
} catch (err) {
|
|
@@ -444,17 +465,17 @@ function forkSession(sessionId, options = {}) {
|
|
|
444
465
|
throw new Error('Session not found');
|
|
445
466
|
}
|
|
446
467
|
|
|
447
|
-
// 读取原会话文件内容
|
|
448
|
-
const originalContent = fs.readFileSync(sourceFile.filePath, 'utf8');
|
|
449
|
-
const content = sliceCodexContentByUserMessage(
|
|
450
|
-
originalContent,
|
|
451
|
-
options.afterUserMessageNumber
|
|
452
|
-
);
|
|
453
|
-
|
|
454
468
|
// 生成新的 session ID (使用 crypto.randomUUID 生成 v4 UUID)
|
|
455
469
|
const crypto = require('crypto');
|
|
456
470
|
const newSessionId = crypto.randomUUID();
|
|
457
471
|
|
|
472
|
+
// 读取原会话文件内容,并确保副本的原生元数据使用新 ID
|
|
473
|
+
const originalContent = fs.readFileSync(sourceFile.filePath, 'utf8');
|
|
474
|
+
const content = rewriteCodexSessionId(
|
|
475
|
+
sliceCodexContentByUserMessage(originalContent, options.afterUserMessageNumber),
|
|
476
|
+
newSessionId
|
|
477
|
+
);
|
|
478
|
+
|
|
458
479
|
// 生成新的时间戳(Codex 格式:YYYY-MM-DDTHH-MM-SS)
|
|
459
480
|
const now = new Date();
|
|
460
481
|
const timestamp = now.toISOString()
|
|
@@ -480,12 +501,12 @@ function forkSession(sessionId, options = {}) {
|
|
|
480
501
|
fs.writeFileSync(newFilePath, content, 'utf8');
|
|
481
502
|
|
|
482
503
|
// 保存 fork 关系(复用 Claude Code 的 fork 关系存储)
|
|
483
|
-
const { getForkRelations, saveForkRelations } = require('
|
|
504
|
+
const { getForkRelations, saveForkRelations } = require('../claude/sessions-implementation');
|
|
484
505
|
const forkRelations = getForkRelations();
|
|
485
506
|
forkRelations[newSessionId] = sessionId;
|
|
486
507
|
saveForkRelations(forkRelations);
|
|
487
508
|
if (options.alias) {
|
|
488
|
-
const { setAlias } = require('
|
|
509
|
+
const { setAlias } = require('../../../server/services/alias');
|
|
489
510
|
setAlias(newSessionId, options.alias);
|
|
490
511
|
}
|
|
491
512
|
|
|
@@ -506,7 +527,7 @@ function forkSession(sessionId, options = {}) {
|
|
|
506
527
|
* @returns {Array} 会话 ID 数组
|
|
507
528
|
*/
|
|
508
529
|
function getSessionOrder(projectName) {
|
|
509
|
-
const { getSessionOrder: getClaudeSessionOrder } = require('
|
|
530
|
+
const { getSessionOrder: getClaudeSessionOrder } = require('../claude/sessions-implementation');
|
|
510
531
|
// 复用 Claude Code 的排序存储,使用 "codex-" 前缀区分
|
|
511
532
|
return getClaudeSessionOrder(`codex-${projectName}`);
|
|
512
533
|
}
|
|
@@ -517,7 +538,7 @@ function getSessionOrder(projectName) {
|
|
|
517
538
|
* @param {Array} order - 会话 ID 数组
|
|
518
539
|
*/
|
|
519
540
|
function saveSessionOrder(projectName, order) {
|
|
520
|
-
const { saveSessionOrder: saveClaudeSessionOrder } = require('
|
|
541
|
+
const { saveSessionOrder: saveClaudeSessionOrder } = require('../claude/sessions-implementation');
|
|
521
542
|
// 复用 Claude Code 的排序存储,使用 "codex-" 前缀区分
|
|
522
543
|
saveClaudeSessionOrder(`codex-${projectName}`, order);
|
|
523
544
|
const cacheKey = getCodexSessionsCacheKey(projectName);
|
|
@@ -530,10 +551,10 @@ function saveSessionOrder(projectName, order) {
|
|
|
530
551
|
* @returns {Array} 项目名称数组
|
|
531
552
|
*/
|
|
532
553
|
function getProjectOrder() {
|
|
533
|
-
const { getProjectOrder: getClaudeProjectOrder } = require('
|
|
534
|
-
const { getCodexDir } = require('./
|
|
554
|
+
const { getProjectOrder: getClaudeProjectOrder } = require('../claude/sessions-implementation');
|
|
555
|
+
const { getCodexDir } = require('./config');
|
|
535
556
|
// 复用 Claude Code 的排序存储,使用特殊的配置对象标识 Codex
|
|
536
|
-
return getClaudeProjectOrder({ projectsDir: getCodexDir() });
|
|
557
|
+
return getClaudeProjectOrder({ projectsDir: codexDirOverride || getCodexDir() });
|
|
537
558
|
}
|
|
538
559
|
|
|
539
560
|
/**
|
|
@@ -541,10 +562,10 @@ function getProjectOrder() {
|
|
|
541
562
|
* @param {Array} order - 项目名称数组
|
|
542
563
|
*/
|
|
543
564
|
function saveProjectOrder(order) {
|
|
544
|
-
const { saveProjectOrder: saveClaudeProjectOrder } = require('
|
|
545
|
-
const { getCodexDir } = require('./
|
|
565
|
+
const { saveProjectOrder: saveClaudeProjectOrder } = require('../claude/sessions-implementation');
|
|
566
|
+
const { getCodexDir } = require('./config');
|
|
546
567
|
// 复用 Claude Code 的排序存储
|
|
547
|
-
saveClaudeProjectOrder({ projectsDir: getCodexDir() }, order);
|
|
568
|
+
saveClaudeProjectOrder({ projectsDir: codexDirOverride || getCodexDir() }, order);
|
|
548
569
|
globalCache.delete(CODEX_PROJECTS_CACHE_KEY);
|
|
549
570
|
}
|
|
550
571
|
|
|
@@ -644,6 +665,22 @@ function joinTextPreserveEol(lines, eol, hasTrailingEol) {
|
|
|
644
665
|
return hasTrailingEol ? `${text}${eol}` : text;
|
|
645
666
|
}
|
|
646
667
|
|
|
668
|
+
function rewriteCodexSessionId(content, sessionId) {
|
|
669
|
+
const { lines, eol, hasTrailingEol } = splitTextPreserveEol(content);
|
|
670
|
+
const rewritten = lines.map(line => {
|
|
671
|
+
if (!line.trim()) return line;
|
|
672
|
+
try {
|
|
673
|
+
const record = JSON.parse(line);
|
|
674
|
+
if (record?.type === 'session_meta' && record.payload && typeof record.payload === 'object') {
|
|
675
|
+
record.payload.id = sessionId;
|
|
676
|
+
return JSON.stringify(record);
|
|
677
|
+
}
|
|
678
|
+
} catch (_) {}
|
|
679
|
+
return line;
|
|
680
|
+
});
|
|
681
|
+
return joinTextPreserveEol(rewritten, eol, hasTrailingEol);
|
|
682
|
+
}
|
|
683
|
+
|
|
647
684
|
function sliceCodexContentByUserMessage(content, afterUserMessageNumber) {
|
|
648
685
|
if (!Number.isInteger(afterUserMessageNumber) || afterUserMessageNumber <= 0) {
|
|
649
686
|
return content;
|
|
@@ -767,54 +804,23 @@ function findSessionFileById(sessionId) {
|
|
|
767
804
|
return null;
|
|
768
805
|
}
|
|
769
806
|
|
|
770
|
-
function calculateProjectAndSessionCounts() {
|
|
771
|
-
const sessions = scanSessionFiles();
|
|
772
|
-
if (sessions.length === 0) {
|
|
773
|
-
return EMPTY_COUNTS;
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
const projectNames = new Set();
|
|
777
|
-
sessions.forEach((session) => {
|
|
778
|
-
const payload = readSessionMetaPayloadFast(session.filePath);
|
|
779
|
-
const projectName = extractCodexProjectNameFromMeta(payload || {});
|
|
780
|
-
if (projectName) {
|
|
781
|
-
projectNames.add(projectName);
|
|
782
|
-
}
|
|
783
|
-
});
|
|
784
|
-
|
|
785
|
-
return {
|
|
786
|
-
projectCount: projectNames.size,
|
|
787
|
-
sessionCount: sessions.length
|
|
788
|
-
};
|
|
789
|
-
}
|
|
790
807
|
|
|
791
808
|
/**
|
|
792
809
|
* 获取 Codex 项目与会话数量(用于仪表盘轻量统计)
|
|
793
810
|
*/
|
|
794
|
-
function getProjectAndSessionCounts(options = {}) {
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
countsCache.expiresAt = 0;
|
|
798
|
-
scanFilesCache.expiresAt = 0;
|
|
799
|
-
sessionFileIndexCache.expiresAt = 0;
|
|
800
|
-
}
|
|
801
|
-
if (!options.force && countsCache.expiresAt > now) {
|
|
802
|
-
return countsCache.value;
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
try {
|
|
806
|
-
const counts = calculateProjectAndSessionCounts();
|
|
807
|
-
countsCache = {
|
|
808
|
-
value: counts,
|
|
809
|
-
expiresAt: now + COUNTS_CACHE_TTL_MS
|
|
810
|
-
};
|
|
811
|
-
return counts;
|
|
812
|
-
} catch (err) {
|
|
813
|
-
return countsCache.value || EMPTY_COUNTS;
|
|
811
|
+
async function getProjectAndSessionCounts(options = {}) {
|
|
812
|
+
if (!fs.existsSync(getSessionsDir())) {
|
|
813
|
+
return { projectCount: 0, sessionCount: 0 };
|
|
814
814
|
}
|
|
815
|
+
const projects = await getSessionHistoryIndex({ ...options, projectsDir: getSessionsDir() }).listProjects('codex', options);
|
|
816
|
+
return {
|
|
817
|
+
projectCount: projects.length,
|
|
818
|
+
sessionCount: projects.reduce((sum, project) => sum + (project.sessionCount || 0), 0)
|
|
819
|
+
};
|
|
815
820
|
}
|
|
816
821
|
|
|
817
822
|
module.exports = {
|
|
823
|
+
configure,
|
|
818
824
|
getSessionsDir,
|
|
819
825
|
scanSessionFiles,
|
|
820
826
|
getAllSessions,
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { createCapabilityDriver } = require('../../../shared/capability-driver');
|
|
4
|
+
|
|
5
|
+
function createDriver(context = {}) {
|
|
6
|
+
return createCapabilityDriver({
|
|
7
|
+
...context,
|
|
8
|
+
platform: 'codex',
|
|
9
|
+
capability: 'sessions',
|
|
10
|
+
parserVersion: 2,
|
|
11
|
+
servicePath: './codex/sessions-implementation',
|
|
12
|
+
localServicePath: '../platforms/drivers/codex/sessions-implementation',
|
|
13
|
+
adapterLocalPath: '../platforms/drivers/codex/session-history-adapter',
|
|
14
|
+
adapterMethods: { inventory: 'inventory', parse: 'parse' },
|
|
15
|
+
methods: {
|
|
16
|
+
listSessions: 'getSessionsByProject',
|
|
17
|
+
recent: 'getRecentSessions',
|
|
18
|
+
search: 'searchSessions',
|
|
19
|
+
getSessionById: 'getSessionById',
|
|
20
|
+
delete: 'deleteSession',
|
|
21
|
+
fork: 'forkSession',
|
|
22
|
+
saveSessionOrder: 'saveSessionOrder',
|
|
23
|
+
getSessionOrder: 'getSessionOrder',
|
|
24
|
+
getProjectOrder: 'getProjectOrder',
|
|
25
|
+
status: 'getSessionStatus',
|
|
26
|
+
messages: 'getSessionMessages'
|
|
27
|
+
},
|
|
28
|
+
onSuccess: operation => {
|
|
29
|
+
if (['delete', 'fork', 'saveSessionOrder'].includes(operation)) {
|
|
30
|
+
context.sessionHistoryIndex?.invalidateSource('codex');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = { createDriver };
|
|
@@ -3,8 +3,8 @@ const {
|
|
|
3
3
|
getStatistics: getSharedStatistics,
|
|
4
4
|
getDailyStatistics: getSharedDailyStatistics,
|
|
5
5
|
getTodayStatistics: getSharedTodayStatistics
|
|
6
|
-
} = require('
|
|
7
|
-
const { normalizeUsageTokens, toNumber } = require('
|
|
6
|
+
} = require('../../../server/services/statistics-service');
|
|
7
|
+
const { normalizeUsageTokens, toNumber } = require('../../../server/services/usage-log-utils');
|
|
8
8
|
|
|
9
9
|
const TOOL_TYPE = 'codex';
|
|
10
10
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { createCapabilityDriver } = require('../../../shared/capability-driver');
|
|
4
|
+
|
|
5
|
+
function createDriver(context = {}) {
|
|
6
|
+
return createCapabilityDriver({
|
|
7
|
+
...context,
|
|
8
|
+
platform: 'codex',
|
|
9
|
+
capability: 'statistics',
|
|
10
|
+
servicePath: './codex/statistics-implementation',
|
|
11
|
+
localServicePath: '../platforms/drivers/codex/statistics-implementation',
|
|
12
|
+
methods: {"getStatistics":"getStatistics","getDailyStatistics":"getDailyStatistics","getTodayStatistics":"getTodayStatistics","recordRequest":"recordRequest","resetStatistics":"resetStatistics"}
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
module.exports = { createDriver };
|