coding-tool-x 3.8.4 → 3.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +86 -15
  3. package/dist/web/assets/AgentsDrawer-BG6P3DX-.js +1 -0
  4. package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +1 -0
  5. package/dist/web/assets/Analytics--z_FmL5P.js +1 -0
  6. package/dist/web/assets/Analytics-CyHhR126.css +1 -0
  7. package/dist/web/assets/AssetPathField-CrJtRKHy.js +1 -0
  8. package/dist/web/assets/ChatHistoryDrawer-B2qBQs9L.css +1 -0
  9. package/dist/web/assets/ChatHistoryDrawer-BiuEryJj.js +1 -0
  10. package/dist/web/assets/CollapseItem-BAYEsL_Q.js +1 -0
  11. package/dist/web/assets/CommandsDrawer-BZJxlPvV.css +1 -0
  12. package/dist/web/assets/CommandsDrawer-YJ-U7BXN.js +1 -0
  13. package/dist/web/assets/ConfigExportDrawer-Ce_hAknW.js +1 -0
  14. package/dist/web/assets/ConfigExportDrawer-dwruRKWr.css +1 -0
  15. package/dist/web/assets/ConfigTemplates-Bvr1NN6K.js +1 -0
  16. package/dist/web/assets/ConfigTemplatesDrawer-BfDi8yO3.css +1 -0
  17. package/dist/web/assets/ConfigTemplatesDrawer-BjIeHfF-.js +1 -0
  18. package/dist/web/assets/ConfigTemplatesPanel-AV00tm_D.js +1 -0
  19. package/dist/web/assets/ConfigTemplatesPanel-CWyPtk67.css +1 -0
  20. package/dist/web/assets/Divider-D28g1gwj.js +1 -0
  21. package/dist/web/assets/DrawerContent-ChXgZ1Xm.js +1 -0
  22. package/dist/web/assets/FavoritesDrawer-CG9eI9Ay.css +1 -0
  23. package/dist/web/assets/FavoritesDrawer-Cz95o4CD.js +1 -0
  24. package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +1 -0
  25. package/dist/web/assets/GatewayConvertDrawer-DLlbMz27.js +1 -0
  26. package/dist/web/assets/Home-CSuFuJ9Y.css +1 -0
  27. package/dist/web/assets/Home-D7CCOFQC.js +1 -0
  28. package/dist/web/assets/MarkdownEditor-qfVgSre_.css +1 -0
  29. package/dist/web/assets/MarkdownEditor-rEZ-c72L.js +1 -0
  30. package/dist/web/assets/McpDrawer-C0dnsZhQ.css +1 -0
  31. package/dist/web/assets/McpDrawer-DfoCyxU2.js +1 -0
  32. package/dist/web/assets/McpFormDrawer-BRbDcawn.css +1 -0
  33. package/dist/web/assets/McpFormDrawer-SKu8HNUR.js +1 -0
  34. package/dist/web/assets/PluginManager-BbeK-3rV.js +1 -0
  35. package/dist/web/assets/PluginsDrawer-CWVJ7yjS.js +1 -0
  36. package/dist/web/assets/PluginsDrawer-DM3QjprE.css +1 -0
  37. package/dist/web/assets/PluginsPanel-Cm2N3StG.js +1 -0
  38. package/dist/web/assets/PluginsPanel-D6ZqITcR.css +1 -0
  39. package/dist/web/assets/ProjectList-677RLZ8O.css +1 -0
  40. package/dist/web/assets/ProjectList-CsjnsNPv.js +1 -0
  41. package/dist/web/assets/PromptsDrawer-BIgiYCEQ.css +1 -0
  42. package/dist/web/assets/PromptsDrawer-EGd3djFa.js +1 -0
  43. package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +1 -0
  44. package/dist/web/assets/RecentSessionsDrawer-D1vtoLAs.js +1 -0
  45. package/dist/web/assets/SessionCard-BgLg49U3.js +1 -0
  46. package/dist/web/assets/SessionCard-aM2NHu6i.css +1 -0
  47. package/dist/web/assets/SessionList-BpYRz1cX.css +1 -0
  48. package/dist/web/assets/SessionList-TRiTklWk.js +1 -0
  49. package/dist/web/assets/SettingsDrawer-d5liXjHq.css +1 -0
  50. package/dist/web/assets/SettingsDrawer-rz2WejGY.js +1 -0
  51. package/dist/web/assets/SkillManager-BTjTUbHq.js +1 -0
  52. package/dist/web/assets/SkillManager-C0GCT2Kb.css +1 -0
  53. package/dist/web/assets/SkillsDrawer-BCNme-aJ.css +1 -0
  54. package/dist/web/assets/SkillsDrawer-pN0hbkK3.js +1 -0
  55. package/dist/web/assets/SkillsPanel-B3Nm5j32.css +1 -0
  56. package/dist/web/assets/SkillsPanel-gmBWEoiF.js +1 -0
  57. package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +1 -0
  58. package/dist/web/assets/SpeedTestDrawer-DcNzuVJk.js +1 -0
  59. package/dist/web/assets/Upload-v5rV0qTT.js +1 -0
  60. package/dist/web/assets/WorkspaceDrawer-CGnMu9p1.css +1 -0
  61. package/dist/web/assets/WorkspaceDrawer-DxmicM4U.js +1 -0
  62. package/dist/web/assets/WorkspaceManager-CJHCjARN.js +1 -0
  63. package/dist/web/assets/WorkspacePanel-D0-zHTHP.css +1 -0
  64. package/dist/web/assets/WorkspacePanel-D8_Zq-du.js +1 -0
  65. package/dist/web/assets/_plugin-vue_export-helper-BeLZJZij.js +1 -0
  66. package/dist/web/assets/client-UDwXBP9i.js +1 -0
  67. package/dist/web/assets/clipboard-B46yyoz_.js +1 -0
  68. package/dist/web/assets/headers-cf-QapUq.js +1 -0
  69. package/dist/web/assets/icons-B2Vg-IOC.js +1 -0
  70. package/dist/web/assets/index-C0EHRym0.css +1 -0
  71. package/dist/web/assets/index-DnEocV0M.js +2 -0
  72. package/dist/web/assets/light-Cp0t7v32.js +1 -0
  73. package/dist/web/assets/markdown-u082bbtj.js +1 -0
  74. package/dist/web/assets/platforms-CBkB45JP.js +1 -0
  75. package/dist/web/assets/platforms-FTpjxAT6.js +1 -0
  76. package/dist/web/assets/project-config-B2baPzYL.js +1 -0
  77. package/dist/web/assets/sessions-Cmy31slD.js +1 -0
  78. package/dist/web/assets/sessions-yC_oVVh8.js +1 -0
  79. package/dist/web/assets/skill-repo-input-B_fkGlUK.js +1 -0
  80. package/dist/web/assets/use-lock-html-scroll-DXIqmUW4.js +1 -0
  81. package/dist/web/assets/use-message-DoLM8C1C.js +1 -0
  82. package/dist/web/assets/useResponsiveDrawer-B3uojyvV.js +1 -0
  83. package/dist/web/assets/vendors-D0c_0KLP.js +1 -0
  84. package/dist/web/assets/vue-vendor-BqZbbXHA.js +1 -0
  85. package/dist/web/assets/workspaces-mjyPVGS8.js +1 -0
  86. package/dist/web/assets/xml-CgY3RMlX.js +1 -0
  87. package/dist/web/index.html +12 -8
  88. package/docs/native-log-memory-2026-09-16.md +43 -0
  89. package/docs/superpowers/plans/2026-08-26-configuration-driven-cli-platform.md +1578 -0
  90. package/docs/superpowers/plans/2026-08-30-project-scoped-config-control.md +1260 -0
  91. package/docs/superpowers/plans/2026-09-01-omp-skill-refresh-boundary.md +213 -0
  92. package/docs/superpowers/plans/2026-09-01-realtime-logs-panel.md +125 -0
  93. package/docs/superpowers/plans/2026-09-02-config-driven-platform-boundary.md +86 -0
  94. package/docs/superpowers/plans/2026-09-02-platform-implementation-drivers.md +508 -0
  95. package/docs/superpowers/plans/2026-09-03-cli-platform-correctness-boundary.md +760 -0
  96. package/docs/superpowers/plans/2026-09-03-dependency-security-remediation.md +133 -0
  97. package/docs/superpowers/plans/2026-09-04-model-catalog-pricing-sync.md +1078 -0
  98. package/docs/superpowers/plans/2026-09-05-codex-project-scan-500.md +128 -0
  99. package/docs/superpowers/plans/2026-09-06-project-skill-path-fix.md +97 -0
  100. package/docs/superpowers/specs/2026-08-26-configuration-driven-cli-platform-design.md +408 -0
  101. package/docs/superpowers/specs/2026-08-30-project-scoped-config-control-design.md +467 -0
  102. package/docs/superpowers/specs/2026-09-01-claude-session-content-repair-design.md +111 -0
  103. package/docs/superpowers/specs/2026-09-01-omp-skill-refresh-boundary-design.md +83 -0
  104. package/docs/superpowers/specs/2026-09-01-realtime-logs-panel-design.md +27 -0
  105. package/docs/superpowers/specs/2026-09-02-config-driven-platform-boundary-design.md +64 -0
  106. package/docs/superpowers/specs/2026-09-02-platform-implementation-driver-boundary-design.md +123 -0
  107. package/docs/superpowers/specs/2026-09-03-cli-platform-correctness-boundary-design.md +249 -0
  108. package/docs/superpowers/specs/2026-09-03-dependency-security-remediation-design.md +87 -0
  109. package/docs/superpowers/specs/2026-09-04-model-catalog-pricing-sync-design.md +301 -0
  110. package/docs/superpowers/specs/2026-09-05-codex-project-scan-500-design.md +24 -0
  111. package/package.json +8 -4
  112. package/src/commands/channels.js +88 -191
  113. package/src/commands/cli-type.js +19 -11
  114. package/src/commands/daemon.js +94 -32
  115. package/src/commands/doctor.js +16 -9
  116. package/src/commands/export-config.js +23 -5
  117. package/src/commands/list.js +130 -52
  118. package/src/commands/logs.js +44 -27
  119. package/src/commands/platform-command-registry.js +78 -0
  120. package/src/commands/plugin.js +11 -5
  121. package/src/commands/port-config.js +34 -52
  122. package/src/commands/proxy-control.js +207 -145
  123. package/src/commands/proxy.js +2 -2
  124. package/src/commands/resume.js +87 -91
  125. package/src/commands/search.js +137 -67
  126. package/src/commands/stats.js +30 -22
  127. package/src/commands/switch.js +1 -1
  128. package/src/commands/toggle-proxy.js +94 -111
  129. package/src/commands/ui.js +67 -6
  130. package/src/commands/workspace.js +90 -8
  131. package/src/config/default.js +6 -53
  132. package/src/config/loader.js +61 -24
  133. package/src/config/model-metadata.js +49 -59
  134. package/src/config/model-metadata.json +4095 -99
  135. package/src/config/paths.js +181 -8
  136. package/src/index.js +134 -71
  137. package/src/platforms/access.js +196 -0
  138. package/src/{server/services → platforms}/agents-service.js +354 -197
  139. package/src/platforms/channel-auth-registry.js +162 -0
  140. package/src/platforms/channel-auth-service.js +82 -0
  141. package/src/{server/services → platforms}/commands-service.js +195 -115
  142. package/src/platforms/driver-registry.js +59 -0
  143. package/src/platforms/drivers/claude/api-operations.js +62 -0
  144. package/src/{server/services/channels.js → platforms/drivers/claude/channels-implementation.js} +131 -33
  145. package/src/platforms/drivers/claude/channels.js +39 -0
  146. package/src/{server/services/config-sync-service.js → platforms/drivers/claude/config-sync.js} +29 -5
  147. package/src/{server/services → platforms/drivers/claude}/health-check.js +4 -4
  148. package/src/platforms/drivers/claude/health.js +22 -0
  149. package/src/platforms/drivers/claude/mcp.js +9 -0
  150. package/src/{server/services/settings-manager.js → platforms/drivers/claude/native-config-implementation.js} +13 -4
  151. package/src/platforms/drivers/claude/native-config.js +46 -0
  152. package/src/platforms/drivers/claude/native-logs.js +72 -0
  153. package/src/{server/services/claude-openai-gateway.js → platforms/drivers/claude/openai-gateway.js} +8 -65
  154. package/src/platforms/drivers/claude/project-config.js +21 -0
  155. package/src/platforms/drivers/claude/projects.js +62 -0
  156. package/src/platforms/drivers/claude/prompts.js +9 -0
  157. package/src/{server/proxy-server.js → platforms/drivers/claude/proxy-implementation.js} +41 -278
  158. package/src/platforms/drivers/claude/proxy.js +16 -0
  159. package/src/platforms/drivers/claude/resource-sync.js +9 -0
  160. package/src/platforms/drivers/claude/session-history-adapter.js +313 -0
  161. package/src/{server/services/sessions.js → platforms/drivers/claude/sessions-implementation.js} +145 -35
  162. package/src/platforms/drivers/claude/sessions.js +76 -0
  163. package/src/{server/services/claude-statistics-service.js → platforms/drivers/claude/statistics-implementation.js} +2 -2
  164. package/src/platforms/drivers/claude/statistics.js +16 -0
  165. package/src/{server/services/claude-wire.js → platforms/drivers/claude/wire.js} +1 -1
  166. package/src/platforms/drivers/codex/api-operations.js +9 -0
  167. package/src/{server/services/codex-channels.js → platforms/drivers/codex/channels-implementation.js} +149 -14
  168. package/src/platforms/drivers/codex/channels.js +45 -0
  169. package/src/{server/services/codex-config.js → platforms/drivers/codex/config.js} +12 -2
  170. package/src/{server/services/codex-env-manager.js → platforms/drivers/codex/env-manager.js} +1 -1
  171. package/src/platforms/drivers/codex/mcp.js +9 -0
  172. package/src/{server/services/codex-settings-manager.js → platforms/drivers/codex/native-config-implementation.js} +15 -6
  173. package/src/platforms/drivers/codex/native-config.js +47 -0
  174. package/src/platforms/drivers/codex/native-logs.js +166 -0
  175. package/src/platforms/drivers/codex/project-config.js +21 -0
  176. package/src/platforms/drivers/codex/projects.js +26 -0
  177. package/src/platforms/drivers/codex/prompts.js +9 -0
  178. package/src/{server/codex-proxy-server.js → platforms/drivers/codex/proxy-implementation.js} +30 -233
  179. package/src/platforms/drivers/codex/proxy.js +16 -0
  180. package/src/platforms/drivers/codex/resource-sync.js +9 -0
  181. package/src/{server/services/session-history-adapters/codex.js → platforms/drivers/codex/session-history-adapter.js} +37 -23
  182. package/src/{server/services/codex-sessions.js → platforms/drivers/codex/sessions-implementation.js} +81 -75
  183. package/src/platforms/drivers/codex/sessions.js +36 -0
  184. package/src/{server/services/codex-statistics-service.js → platforms/drivers/codex/statistics-implementation.js} +2 -2
  185. package/src/platforms/drivers/codex/statistics.js +16 -0
  186. package/src/platforms/drivers/gemini/api-operations.js +9 -0
  187. package/src/{server/services/gemini-channels.js → platforms/drivers/gemini/channels-implementation.js} +202 -37
  188. package/src/platforms/drivers/gemini/channels.js +39 -0
  189. package/src/{server/services/gemini-config.js → platforms/drivers/gemini/config.js} +12 -2
  190. package/src/platforms/drivers/gemini/mcp.js +9 -0
  191. package/src/{server/services/gemini-settings-manager.js → platforms/drivers/gemini/native-config-implementation.js} +14 -5
  192. package/src/platforms/drivers/gemini/native-config.js +39 -0
  193. package/src/platforms/drivers/gemini/native-logs.js +180 -0
  194. package/src/platforms/drivers/gemini/project-config.js +21 -0
  195. package/src/platforms/drivers/gemini/projects.js +26 -0
  196. package/src/platforms/drivers/gemini/prompts.js +9 -0
  197. package/src/{server/gemini-proxy-server.js → platforms/drivers/gemini/proxy-implementation.js} +36 -267
  198. package/src/platforms/drivers/gemini/proxy.js +16 -0
  199. package/src/platforms/drivers/gemini/resource-sync.js +9 -0
  200. package/src/{server/services/session-history-adapters/gemini.js → platforms/drivers/gemini/session-history-adapter.js} +70 -18
  201. package/src/{server/services/gemini-sessions.js → platforms/drivers/gemini/sessions-implementation.js} +53 -37
  202. package/src/platforms/drivers/gemini/sessions.js +47 -0
  203. package/src/{server/services/gemini-statistics-service.js → platforms/drivers/gemini/statistics-implementation.js} +2 -2
  204. package/src/platforms/drivers/gemini/statistics.js +16 -0
  205. package/src/{server/services/gemini-wire.js → platforms/drivers/gemini/wire.js} +1 -1
  206. package/src/platforms/drivers/generic-filesystem.js +166 -0
  207. package/src/platforms/drivers/generic-jsonl.js +141 -0
  208. package/src/platforms/drivers/generic-mcp.js +44 -0
  209. package/src/platforms/drivers/generic-openai-compatible.js +45 -0
  210. package/src/platforms/drivers/generic-prompt.js +41 -0
  211. package/src/platforms/drivers/legacy.js +677 -0
  212. package/src/platforms/drivers/native-config-snapshot.js +125 -0
  213. package/src/platforms/drivers/native-log-utils.js +1292 -0
  214. package/src/platforms/drivers/notification-hooks.js +578 -0
  215. package/src/{server/api/omp-config.js → platforms/drivers/omp/api-operations.js} +52 -64
  216. package/src/{server/services/omp-auth-provider-worker.js → platforms/drivers/omp/auth-provider-worker.js} +1 -1
  217. package/src/{server/services/omp-auth-providers.js → platforms/drivers/omp/auth-providers.js} +1 -1
  218. package/src/{server/services/omp-channels.js → platforms/drivers/omp/channels-implementation.js} +166 -39
  219. package/src/platforms/drivers/omp/channels.js +58 -0
  220. package/src/{server/services/omp-config.js → platforms/drivers/omp/config.js} +53 -13
  221. package/src/{server/services/omp-gateway-routing.js → platforms/drivers/omp/gateway-routing.js} +14 -7
  222. package/src/{server/services/omp-gateway.js → platforms/drivers/omp/gateway.js} +4 -262
  223. package/src/platforms/drivers/omp/mcp.js +9 -0
  224. package/src/{server/services/omp-settings-manager.js → platforms/drivers/omp/native-config-implementation.js} +75 -10
  225. package/src/platforms/drivers/omp/native-config.js +46 -0
  226. package/src/platforms/drivers/omp/native-logs.js +52 -0
  227. package/src/{server/services/omp-native-plugin-adapter.js → platforms/drivers/omp/native-plugin-adapter.js} +91 -4
  228. package/src/platforms/drivers/omp/project-config.js +29 -0
  229. package/src/platforms/drivers/omp/projects.js +20 -0
  230. package/src/platforms/drivers/omp/prompts.js +9 -0
  231. package/src/{server/omp-proxy-server.js → platforms/drivers/omp/proxy-implementation.js} +6 -15
  232. package/src/platforms/drivers/omp/proxy.js +16 -0
  233. package/src/platforms/drivers/omp/resource-sync.js +9 -0
  234. package/src/{server/services/session-history-adapters/omp.js → platforms/drivers/omp/session-history-adapter.js} +42 -18
  235. package/src/{server/services/omp-sessions.js → platforms/drivers/omp/sessions-implementation.js} +130 -94
  236. package/src/platforms/drivers/omp/sessions.js +36 -0
  237. package/src/{server/services/omp-skill-discovery.js → platforms/drivers/omp/skill-discovery.js} +159 -32
  238. package/src/{server/services/omp-skill-settings-service.js → platforms/drivers/omp/skill-settings.js} +1 -1
  239. package/src/{server/services/omp-statistics-service.js → platforms/drivers/omp/statistics-implementation.js} +3 -3
  240. package/src/platforms/drivers/omp/statistics.js +16 -0
  241. package/src/platforms/drivers/opencode/api-operations.js +9 -0
  242. package/src/{server/services/opencode-channels.js → platforms/drivers/opencode/channels-implementation.js} +28 -9
  243. package/src/platforms/drivers/opencode/channels.js +40 -0
  244. package/src/platforms/drivers/opencode/conversion.js +41 -0
  245. package/src/{server/services/opencode-gateway-converter.js → platforms/drivers/opencode/gateway-converter.js} +1 -1
  246. package/src/platforms/drivers/opencode/mcp.js +9 -0
  247. package/src/{server/services/opencode-settings-manager.js → platforms/drivers/opencode/native-config-implementation.js} +17 -6
  248. package/src/platforms/drivers/opencode/native-config.js +26 -0
  249. package/src/platforms/drivers/opencode/native-logs.js +133 -0
  250. package/src/platforms/drivers/opencode/project-config.js +98 -0
  251. package/src/platforms/drivers/opencode/projects.js +20 -0
  252. package/src/platforms/drivers/opencode/prompts.js +9 -0
  253. package/src/{server/opencode-proxy-server.js → platforms/drivers/opencode/proxy-implementation.js} +27 -362
  254. package/src/platforms/drivers/opencode/proxy.js +16 -0
  255. package/src/platforms/drivers/opencode/resource-sync.js +9 -0
  256. package/src/{server/services/opencode-sessions.js → platforms/drivers/opencode/sessions-implementation.js} +211 -64
  257. package/src/platforms/drivers/opencode/sessions.js +48 -0
  258. package/src/{server/services/opencode-statistics-service.js → platforms/drivers/opencode/statistics-implementation.js} +2 -2
  259. package/src/platforms/drivers/opencode/statistics.js +16 -0
  260. package/src/platforms/drivers/secure-file-driver.js +272 -0
  261. package/src/platforms/drivers/unsupported.js +7 -0
  262. package/src/platforms/manifest-schema.js +398 -0
  263. package/src/platforms/manifests/claude.json +489 -0
  264. package/src/platforms/manifests/codex.json +448 -0
  265. package/src/platforms/manifests/gemini.json +447 -0
  266. package/src/platforms/manifests/omp.json +496 -0
  267. package/src/platforms/manifests/opencode.json +422 -0
  268. package/src/{server/services → platforms}/native-oauth-adapters.js +87 -417
  269. package/src/{server/services → platforms}/notification-hooks.js +140 -1023
  270. package/src/platforms/oauth-credentials-service.js +506 -0
  271. package/src/platforms/path-resolver.js +179 -0
  272. package/src/platforms/platform-path-context.js +305 -0
  273. package/src/platforms/registry.js +248 -0
  274. package/src/platforms/remote-notification-providers.js +678 -0
  275. package/src/platforms/runtime.js +259 -0
  276. package/src/{server/services/session-history-adapters/index.js → platforms/session-history-adapters.js} +8 -1
  277. package/src/plugins/plugin-loader.js +2 -2
  278. package/src/plugins/plugin-manager.js +2 -2
  279. package/src/plugins/registry.js +27 -10
  280. package/src/reset-config.js +21 -5
  281. package/src/server/api/agents.js +46 -72
  282. package/src/server/api/commands.js +16 -6
  283. package/src/server/api/config-registry.js +206 -59
  284. package/src/server/api/config-sync.js +3 -2
  285. package/src/server/api/config-templates.js +20 -4
  286. package/src/server/api/config.js +111 -102
  287. package/src/server/api/convert.js +54 -178
  288. package/src/server/api/dashboard.js +168 -102
  289. package/src/server/api/hooks.js +1 -1
  290. package/src/server/api/mcp.js +224 -84
  291. package/src/server/api/platform-api-config.js +102 -0
  292. package/src/server/api/platform-route-factory.js +215 -0
  293. package/src/server/api/platform-routes.js +26 -0
  294. package/src/server/api/platforms.js +110 -0
  295. package/src/server/api/plugins.js +57 -57
  296. package/src/server/api/project-config.js +168 -0
  297. package/src/server/api/prompts.js +58 -45
  298. package/src/server/api/settings.js +55 -8
  299. package/src/server/api/skills.js +262 -133
  300. package/src/server/api/ui-config.js +2 -2
  301. package/src/server/api/validation-errors.js +18 -4
  302. package/src/server/api/workspaces.js +47 -12
  303. package/src/server/index.js +164 -213
  304. package/src/server/platform-context.js +81 -0
  305. package/src/server/services/channel-balance.js +11 -20
  306. package/src/server/services/channel-health.js +21 -6
  307. package/src/server/services/channel-scheduler.js +29 -39
  308. package/src/server/services/channel-sync-utils.js +23 -13
  309. package/src/server/services/config-export-service.js +350 -319
  310. package/src/server/services/config-registry-service.js +280 -54
  311. package/src/server/services/config-sync-manager.js +172 -944
  312. package/src/server/services/config-templates-service.js +419 -353
  313. package/src/server/services/control-manifest-store.js +206 -0
  314. package/src/server/services/dashboard-snapshot-worker.js +656 -100
  315. package/src/server/services/effective-control-service.js +557 -0
  316. package/src/server/services/local-resource-index.js +314 -0
  317. package/src/server/services/mcp-service.js +607 -977
  318. package/src/server/services/model-detector.js +15 -10
  319. package/src/server/services/native-log-channel-resolver.js +214 -0
  320. package/src/server/services/native-log-observer.js +291 -0
  321. package/src/server/services/network-access.js +1 -1
  322. package/src/server/services/platform-catalog.js +82 -0
  323. package/src/server/services/platform-resolution.js +32 -29
  324. package/src/server/services/plugins-service.js +376 -122
  325. package/src/server/services/project-config-service.js +550 -0
  326. package/src/server/services/project-path-validation.js +31 -0
  327. package/src/server/services/prompts-service.js +267 -233
  328. package/src/server/services/proxy-runtime.js +7 -4
  329. package/src/server/services/remote-credential-cache.js +43 -0
  330. package/src/server/services/repo-scanner-base.js +182 -75
  331. package/src/server/services/request-logger.js +7 -4
  332. package/src/server/services/session-history-index.js +780 -213
  333. package/src/server/services/session-history-worker.js +228 -33
  334. package/src/server/services/session-snapshot-worker.js +124 -34
  335. package/src/server/services/session-snapshots.js +4 -2
  336. package/src/server/services/skill-artifact-store.js +355 -0
  337. package/src/server/services/skill-format-adapters.js +65 -0
  338. package/src/server/services/skill-projection-service.js +323 -0
  339. package/src/server/services/skill-refresh-task-service.js +275 -0
  340. package/src/server/services/skill-service.js +2020 -677
  341. package/src/server/services/snapshot-cache.js +30 -8
  342. package/src/server/services/speed-test.js +8 -8
  343. package/src/server/services/sqlite-connection.js +19 -3
  344. package/src/server/services/statistics-service.js +240 -57
  345. package/src/server/services/ui-config.js +107 -76
  346. package/src/server/services/usage-log-utils.js +98 -0
  347. package/src/server/services/web-build.js +1 -1
  348. package/src/server/services/workspace-service.js +59 -29
  349. package/src/server/utils/pricing.js +10 -19
  350. package/src/server/websocket-server.js +153 -28
  351. package/src/{server/services/base → shared}/base-channel-service.js +156 -28
  352. package/src/shared/capability-driver.js +104 -0
  353. package/src/shared/channel-auth-policy.js +27 -0
  354. package/src/shared/channel-driver.js +161 -0
  355. package/src/shared/driver-factories/api.js +180 -0
  356. package/src/shared/driver-factories/mcp.js +244 -0
  357. package/src/shared/driver-factories/projects.js +121 -0
  358. package/src/shared/driver-factories/prompts.js +58 -0
  359. package/src/shared/driver-factories/resource-sync.js +375 -0
  360. package/src/shared/driver-result.js +78 -0
  361. package/src/shared/mcp-format.js +189 -0
  362. package/src/shared/platforms.js +104 -167
  363. package/src/shared/project-config.js +512 -0
  364. package/src/shared/proxy-driver.js +57 -0
  365. package/src/{server/services/base → shared}/response-usage-parser.js +8 -4
  366. package/src/ui/menu.js +91 -67
  367. package/src/utils/port-helper.js +35 -19
  368. package/src/utils/session.js +1 -1
  369. package/dist/web/assets/Analytics-COEUXmd4.js +0 -25
  370. package/dist/web/assets/Analytics-RNn1BUbG.css +0 -1
  371. package/dist/web/assets/ConfigTemplates-DLLkS53H.js +0 -1
  372. package/dist/web/assets/Home-DCEyLzwX.js +0 -1
  373. package/dist/web/assets/Home-DYVy4cGZ.css +0 -1
  374. package/dist/web/assets/PluginManager-Oe1ZHoMO.js +0 -1
  375. package/dist/web/assets/ProjectList-CWjuAFof.js +0 -1
  376. package/dist/web/assets/ProjectList-VeMNXfgO.css +0 -1
  377. package/dist/web/assets/SessionList-C4chCPxK.css +0 -1
  378. package/dist/web/assets/SessionList-v3ehGg9U.js +0 -1
  379. package/dist/web/assets/SkillManager-BsX8Qpj0.css +0 -1
  380. package/dist/web/assets/SkillManager-DUF_qP5S.js +0 -1
  381. package/dist/web/assets/WorkspaceManager-CjAWBosO.js +0 -1
  382. package/dist/web/assets/icons-nGdSKQn2.js +0 -1
  383. package/dist/web/assets/index-D5hyHPj7.js +0 -2
  384. package/dist/web/assets/index-bJRG3RXH.css +0 -1
  385. package/dist/web/assets/markdown-BNJfEgCA.js +0 -1
  386. package/dist/web/assets/markdown-BfC0goYb.css +0 -10
  387. package/dist/web/assets/naive-ui-BALVpMgd.js +0 -1
  388. package/dist/web/assets/vendors-DQA4Hw9v.js +0 -7
  389. package/dist/web/assets/vue-vendor-B5RqjEjQ.js +0 -45
  390. package/src/config/model-pricing.js +0 -35
  391. package/src/server/api/channels.js +0 -439
  392. package/src/server/api/claude-hooks.js +0 -56
  393. package/src/server/api/claude-statistics.js +0 -57
  394. package/src/server/api/codex-channels.js +0 -491
  395. package/src/server/api/codex-projects.js +0 -117
  396. package/src/server/api/codex-proxy.js +0 -293
  397. package/src/server/api/codex-sessions.js +0 -652
  398. package/src/server/api/codex-statistics.js +0 -57
  399. package/src/server/api/gemini-channels.js +0 -392
  400. package/src/server/api/gemini-projects.js +0 -103
  401. package/src/server/api/gemini-proxy.js +0 -231
  402. package/src/server/api/gemini-sessions.js +0 -550
  403. package/src/server/api/gemini-statistics.js +0 -57
  404. package/src/server/api/health-check.js +0 -31
  405. package/src/server/api/oauth-credentials.js +0 -198
  406. package/src/server/api/omp-channels.js +0 -575
  407. package/src/server/api/omp-projects.js +0 -88
  408. package/src/server/api/omp-proxy.js +0 -125
  409. package/src/server/api/omp-sessions.js +0 -386
  410. package/src/server/api/omp-statistics.js +0 -40
  411. package/src/server/api/opencode-channels.js +0 -471
  412. package/src/server/api/opencode-projects.js +0 -110
  413. package/src/server/api/opencode-proxy.js +0 -354
  414. package/src/server/api/opencode-sessions.js +0 -466
  415. package/src/server/api/opencode-statistics.js +0 -57
  416. package/src/server/api/projects.js +0 -120
  417. package/src/server/api/proxy.js +0 -330
  418. package/src/server/api/sessions.js +0 -810
  419. package/src/server/services/oauth-credentials-service.js +0 -945
  420. package/src/server/services/omp-session-log-observer.js +0 -138
  421. package/src/server/services/opencode-gateway-adapters.js +0 -43
  422. package/src/server/services/project-snapshots.js +0 -59
  423. package/src/server/services/proxy-log-helper.js +0 -298
  424. package/src/server/services/session-cache.js +0 -127
  425. package/src/server/services/session-converter.js +0 -582
  426. package/src/server/services/session-history-adapters/claude.js +0 -235
  427. /package/src/{server/services/claude-token-recovery.js → platforms/drivers/claude/token-recovery.js} +0 -0
  428. /package/src/{server/services/codex-parser.js → platforms/drivers/codex/parser.js} +0 -0
  429. /package/src/{server/services/codex-speed-test-template.json → platforms/drivers/codex/speed-test-template.json} +0 -0
  430. /package/src/{server/services/codex-wire.js → platforms/drivers/codex/wire.js} +0 -0
  431. /package/src/{server/services/omp-auth-gateway-client.js → platforms/drivers/omp/auth-gateway-client.js} +0 -0
  432. /package/src/{server/services/opencode-normalization.js → platforms/drivers/opencode/normalization.js} +0 -0
  433. /package/src/{server/services → shared}/config-artifact-paths.js +0 -0
  434. /package/src/{server/services/base → shared}/proxy-utils.js +0 -0
@@ -0,0 +1,27 @@
1
+ # 实时日志面板空白修复设计
2
+
3
+ ## 问题
4
+
5
+ 渠道管理页的 `RightPanel.vue` 模板使用了 `<ProxyLogs>`,但脚本没有导入 `./ProxyLogs.vue`。Vue 将其保留为未解析的自定义元素,因此日志区域只渲染空容器,不显示标题、表头或日志内容。
6
+
7
+ ## 方案
8
+
9
+ 在 `src/web/src/components/RightPanel.vue` 的现有组件导入区补充:
10
+
11
+ ```js
12
+ import ProxyLogs from './ProxyLogs.vue'
13
+ ```
14
+
15
+ 保留现有的 `:source="currentChannel"` 绑定,不改动日志状态、WebSocket、统计接口或布局逻辑。
16
+
17
+ ## 验收标准
18
+
19
+ 1. 进入 `/cli/omp` 等渠道管理页后,日志区域实际渲染 `ProxyLogs` 组件。
20
+ 2. 面板显示“实时日志”、表头和已有日志;无日志时显示“暂无日志”,而不是空白区域。
21
+ 3. 当前渠道切换和 WebSocket 实时日志追加行为保持不变。
22
+ 4. 回归测试覆盖 `RightPanel.vue` 对 `ProxyLogs.vue` 的导入,前端构建成功。
23
+ 5. 使用 `http://localhost:19999/cli/omp` 进行浏览器冒烟验证。
24
+
25
+ ## 范围与风险
26
+
27
+ 仅修改组件导入和对应回归测试。不会触碰工作区已有的 `Home.vue`、`Home.test.js` 改动。风险为低:不改变公开接口或运行时数据流。
@@ -0,0 +1,64 @@
1
+ # 配置化平台边界设计
2
+
3
+ ## 目标
4
+
5
+ 删除按平台复制的 API、项目配置适配器和共享目录,把平台差异集中到 Registry/Manifest 与 Driver;`src/server` 只保留通用应用、HTTP 注册和基础设施。
6
+
7
+ ## 边界
8
+
9
+ ### `src/platforms`
10
+
11
+ - Manifest 描述平台能力、路由别名、配置资源和可用操作。
12
+ - `src/platforms/drivers/<platform>/` 保存平台专属业务:渠道、代理、会话、统计、原生配置、项目配置和 CLI/API 操作。
13
+ - 平台目录不再创建 `shared` 子目录。
14
+
15
+ ### `src/shared`
16
+
17
+ 保存跨平台、与 HTTP 无关的核心工具:
18
+
19
+ - 项目配置文件读写和路径安全
20
+ - MCP 配置格式转换和 secret 脱敏
21
+ - Driver 结果、错误和调用上下文
22
+ - 通用模型、渠道、会话 DTO 转换
23
+
24
+ ### `src/server`
25
+
26
+ - `src/server/api` 只保留通用路由工厂、请求解析、响应转换和路由注册。
27
+ - `src/server/services` 只保留通用应用服务、缓存、日志、调度和持久化基础设施。
28
+ - 不再保留 `codex-channels.js`、`gemini-proxy.js`、`project-config-adapters/codex.js` 等按平台文件。
29
+
30
+ ## API 设计
31
+
32
+ 统一路由从 manifest 和 capability 生成,兼容原有 URL 前缀:
33
+
34
+ ```js
35
+ const route = {
36
+ path: '/:platform/channels',
37
+ capability: 'channels',
38
+ operation: 'list'
39
+ };
40
+
41
+ const driver = runtime.getDriver(platform, route.capability);
42
+ const result = await driver[route.operation](requestContext);
43
+ return sendDriverResult(response, result);
44
+ ```
45
+
46
+ 平台 API 不再直接 import 具体 Driver 实现文件。平台专属校验、默认值、CLI 安装检测、配置文件路径和响应字段由 Driver 暴露的能力处理。
47
+
48
+ ## 项目配置
49
+
50
+ `project-config-adapters/<platform>.js` 移入对应 Driver 的 `project-config.js`。跨平台文件工具和 MCP 安全逻辑移入 `src/shared/project-config`。`ProjectConfigService` 只按 manifest 获取 Driver adapter,不维护平台工厂表。
51
+
52
+ ## 删除策略
53
+
54
+ - 删除重复的平台 API 路由文件和旧项目配置 adapter 目录。
55
+ - 删除迁移后没有生产调用方的兼容入口。
56
+ - 保留旧 URL,由统一路由注册器按 manifest aliases 注册。
57
+ - 不删除用户磁盘上的配置和会话数据。
58
+
59
+ ## 验证
60
+
61
+ - 静态扫描确认 `src/server/api` 和 `src/server/services` 不再直接引用平台实现文件。
62
+ - 每个平台的 channels、proxy、nativeConfig、sessions、statistics、projectConfig Driver 均可通过 Runtime 获取。
63
+ - 完整 `tests/unit` 通过。
64
+ - 旧平台 API URL 的响应格式和状态码测试通过。
@@ -0,0 +1,123 @@
1
+ # Platform Implementation Driver Boundary
2
+
3
+ ## Problem
4
+
5
+ The previous migration added Registry/Runtime Driver entry points, but several built-in Drivers still delegate their implementation to platform-specific modules under `src/server`:
6
+
7
+ - `src/platforms/drivers/{gemini,opencode,omp}/channels.js` delegate to `src/server/services/*-channels.js`.
8
+ - `src/platforms/drivers/*/proxy.js` delegate to `src/server/*-proxy-server.js`.
9
+ - `src/platforms/drivers/*/{sessions,statistics,native-config}.js` delegate to platform-specific services.
10
+ - `src/commands/channels.js` and `src/commands/toggle-proxy.js` retain platform conditionals and direct server imports.
11
+
12
+ This leaves Driver ownership nominal rather than real and prevents unused platform services from being removed.
13
+
14
+ ## Goals
15
+
16
+ 1. Move platform-specific behavior and I/O into the corresponding platform/capability Driver.
17
+ 2. Keep `src/server` limited to transport facades, shared application orchestration, and platform-neutral infrastructure.
18
+ 3. Make CLI channel/proxy commands Runtime-driven instead of platform-switch-driven.
19
+ 4. Delete platform service/proxy modules after all production callers and test seams are migrated.
20
+ 5. Preserve public HTTP paths, CLI commands, response shapes, native-config protection, OMP managed mode, and existing provider behavior.
21
+ 6. Keep platform code separated by platform directory; do not create one monolithic Driver implementation.
22
+
23
+ ## Non-goals
24
+
25
+ - Do not remove public legacy HTTP URLs.
26
+ - Do not expose arbitrary user-provided executable Driver modules.
27
+ - Do not move generic SQLite/cache/scheduler/security infrastructure into every platform Driver.
28
+ - Do not change provider protocol semantics while relocating ownership.
29
+
30
+ ## Target structure
31
+
32
+ ```text
33
+ src/platforms/drivers/
34
+ claude/
35
+ channels.js
36
+ proxy.js
37
+ sessions.js
38
+ statistics.js
39
+ native-config.js
40
+ resource-sync.js
41
+ prompts.js
42
+ mcp.js
43
+ helpers/ # only Claude-specific helpers
44
+ codex/
45
+ ...
46
+ gemini/
47
+ ...
48
+ opencode/
49
+ ...
50
+ omp/
51
+ ...
52
+ shared/ # result contracts and truly platform-neutral helpers
53
+
54
+ src/server/api/ # HTTP URL/parameter/response compatibility facades
55
+ src/commands/ # CLI interaction and output formatting only
56
+ src/server/services/base/ # shared application and infrastructure services
57
+ ```
58
+
59
+ A Driver may be split into platform-local helper files when a capability is large. Platform-specific configuration paths, provider serialization, auth lookup, wire conversion, proxy request handling, session parsing, and statistics parsing must remain under that platform directory.
60
+
61
+ ## Ownership rules
62
+
63
+ ### Driver-owned
64
+
65
+ - Channel storage normalization and platform-specific native synchronization.
66
+ - Platform provider IDs, model/provider configuration, auth/keychain integration, and platform-specific environment updates.
67
+ - Proxy lifecycle and request protocol conversion, including headers, body formats, retry behavior, upstream target resolution, and usage extraction.
68
+ - Native configuration read/write/restore and protection semantics.
69
+ - Session inventory/parsing/read/mutation semantics that depend on a platform schema.
70
+ - Platform statistics parsing, pricing selection, and persistence payload construction.
71
+ - Platform-specific prompt, MCP, resource, and config serialization.
72
+ - Capability metadata used by CLI, including `supportsCliCreate`, managed-mode behavior, and available operations.
73
+
74
+ ### Server-owned
75
+
76
+ - Express routers, legacy URL mounting, HTTP status/response conversion, and websocket transport.
77
+ - CLI prompts, menus, terminal formatting, and command dispatch.
78
+ - Generic channel application operations, scheduler policy, health aggregation, caches, SQLite schema/orchestration, worker lifecycle, security validation, and logging infrastructure.
79
+ - Registry/Runtime lookup and capability iteration.
80
+
81
+ Server facades may translate old argument order and return shapes, but must not contain provider I/O, platform branches, or duplicated platform business logic.
82
+
83
+ ## Dispatch contracts
84
+
85
+ CLI code obtains capability objects through Runtime:
86
+
87
+ ```js
88
+ const runtime = getPlatformRuntime();
89
+ const channels = runtime.getDriver(platform, 'channels');
90
+ const proxy = runtime.getDriver(platform, 'proxy');
91
+ ```
92
+
93
+ The CLI must use capability metadata/methods instead of checking concrete platform names. A new manifest platform with compatible generic Drivers must be discoverable without editing `src/commands`.
94
+
95
+ Legacy HTTP modules may retain names and paths, but their implementation is limited to:
96
+
97
+ 1. deserialize and validate request input;
98
+ 2. get the Driver from Runtime;
99
+ 3. invoke the capability;
100
+ 4. map Driver DTOs/results to the old response shape;
101
+ 5. broadcast transport events.
102
+
103
+ ## Migration order
104
+
105
+ 1. Characterize existing platform service/proxy behavior and identify production callers.
106
+ 2. Move remaining channel implementations, then proxy/wire implementations.
107
+ 3. Move sessions, statistics, native config, resource sync, prompts, and MCP implementations.
108
+ 4. Replace CLI platform branches with Runtime capability dispatch.
109
+ 5. Remove `legacy.js` mappings to platform-specific server modules.
110
+ 6. Migrate tests and `require.cache` seams to Driver/facade boundaries.
111
+ 7. Delete server modules with no production or explicitly supported compatibility caller.
112
+ 8. Run API, CLI, capability contract, reachability, and full regression checks.
113
+
114
+ ## Acceptance criteria
115
+
116
+ - No production `src` import from CLI or shared application code directly requires a platform-specific channel/session/statistics/settings/proxy implementation under `src/server`.
117
+ - No Driver capability is only a wrapper around a platform-specific server implementation.
118
+ - `legacy.js` contains no mapping to the migrated platform-specific implementation files.
119
+ - `src/commands/channels.js` and `toggle-proxy.js` contain no platform-specific require/switch branches.
120
+ - Public legacy HTTP URLs and CLI command names remain functional.
121
+ - Platform-specific implementation files exist only under their platform Driver directories, except explicitly classified shared protocol/infrastructure utilities.
122
+ - Reachability reports no unexplained orphan modules.
123
+ - Focused behavior tests cover each migrated capability and preserve error/secret/native-config semantics.
@@ -0,0 +1,249 @@
1
+ # CLI 平台正确性边界设计
2
+
3
+ ## 目标
4
+
5
+ 修复配置驱动平台内核之外仍存在的平台硬编码和错误回退,使 CLI 与 HTTP transport 统一通过 Registry/Runtime 解析平台和能力,同时严格保留现有 CLI 命令、旧 API URL、正常响应结构以及 `legacy:*` Driver。
6
+
7
+ 本轮是正确性边界修复,不完成 `legacy.js` 删除、共享 route profile 提取或全部平台实现重写。
8
+
9
+ ## 问题
10
+
11
+ 当前平台目录、Runtime、统一平台路由和 Web 平台目录已经配置驱动,但外围仍存在四类不一致:
12
+
13
+ 1. `cli-type.js` 接受 Registry 中的平台,`ui/menu.js` 却只接受四个内置平台,其他值静默回退 Claude。
14
+ 2. 交互式会话列表、搜索、工作区和恢复命令直接 import 或执行 Claude 实现,忽略 `currentCliType`。
15
+ 3. Project Config、Commands、Agents 等 HTTP/service 入口维护独立平台白名单,已注册平台仍可能被外层拒绝;部分未知平台会静默回退 Claude。
16
+ 4. Manifest route 引用不存在的 Driver operation 时,GET route 可能返回 200 空数据,掩盖配置或实现错误。
17
+
18
+ 这些行为破坏同一 invariant:平台存在性应只由 Registry 决定,能力可用性应只由 capability Driver 决定。
19
+
20
+ ## 决策
21
+
22
+ 采用一个窄的平台访问模块作为共享 seam。CLI 与 HTTP transport 不再判断具体平台名,只提供平台 key、capability 和可选 operation。
23
+
24
+ 不采用逐文件复制解析逻辑,因为那会形成第二套分散约定。不采用一次性删除全部 legacy Driver,因为其回归面超过正确性修复范围。
25
+
26
+ ## 平台访问模块
27
+
28
+ 新增跨 transport、与 Express/Inquirer 无关的平台访问模块。建议位置:
29
+
30
+ ```text
31
+ src/platforms/access.js
32
+ ```
33
+
34
+ 模块 interface:
35
+
36
+ ```js
37
+ resolvePlatform(key, options)
38
+ resolveCapability(key, capability, options)
39
+ resolveOperation(key, capability, operation, options)
40
+ ```
41
+
42
+ 返回值:
43
+
44
+ ```js
45
+ {
46
+ key,
47
+ manifest,
48
+ driver,
49
+ operation
50
+ }
51
+ ```
52
+
53
+ `resolvePlatform()` 只验证并返回 Registry definition。`resolveCapability()` 还验证 capability 声明并通过 Runtime 获取 Driver。`resolveOperation()` 再验证 Driver operation 存在。
54
+
55
+ 依赖通过 options 注入,生产环境默认使用 `getPlatformContext()`:
56
+
57
+ ```js
58
+ {
59
+ registry,
60
+ runtime,
61
+ fallback
62
+ }
63
+ ```
64
+
65
+ `fallback` 只适用于调用方没有提供平台值的兼容场景。只要调用方提供了非空平台值,未知值必须报错,绝不回退 Claude。
66
+
67
+ ## 错误模型
68
+
69
+ 平台访问错误包含稳定的机器字段:
70
+
71
+ ```js
72
+ {
73
+ code: 'not_found' | 'unsupported' | 'invalid' | 'failed',
74
+ platform,
75
+ capability,
76
+ operation,
77
+ message
78
+ }
79
+ ```
80
+
81
+ 错误语义:
82
+
83
+ | 场景 | code |
84
+ |---|---|
85
+ | 非空平台 key 未注册 | `not_found` |
86
+ | 已注册平台未声明 capability | `unsupported` |
87
+ | capability Driver 不存在 | `unsupported` |
88
+ | Driver 不提供 operation | `unsupported` |
89
+ | 调用参数格式错误 | `invalid` |
90
+ | Driver 创建或执行抛错 | `failed` |
91
+
92
+ HTTP 层继续使用现有状态映射:`invalid` 400、`not_found`/`unsupported` 404、`failed` 500。CLI 输出明确错误并停止当前操作,不改写配置、不访问 Claude 数据。
93
+
94
+ ## CLI 数据流
95
+
96
+ ### 平台选择与主菜单
97
+
98
+ `src/commands/cli-type.js` 继续从 Registry 生成可选平台。
99
+
100
+ `src/ui/menu.js` 删除平台枚举与具体 Driver implementation import。主菜单从 Registry definition 获取 label、terminalColor;通过 `resolveOperation()` 获取:
101
+
102
+ - `channels.current` 或 `channels.list`;
103
+ - `proxy.status`。
104
+
105
+ 不支持某项能力时只隐藏或显示“不支持”的对应状态,不把整个平台变成 Claude。
106
+
107
+ ### 会话列表与搜索
108
+
109
+ `src/commands/list.js` 和 `src/commands/search.js` 不再 import Claude sessions implementation。调用方传入当前平台,命令通过 Runtime 获取 `sessions` 和 `projects` Driver。
110
+
111
+ Driver interface 使用现有标准 operation:
112
+
113
+ ```text
114
+ projects.listProjects(options)
115
+ sessions.recent(limit, options)
116
+ sessions.searchAcrossProjects(keyword, limit, options)
117
+ sessions.search(projectName, keyword, contextLength, options)
118
+ ```
119
+
120
+ CLI 只格式化规范化 DTO。平台专属路径解析、项目显示名和会话文件结构留在 Driver。
121
+
122
+ 如果 Driver 不支持跨项目搜索,CLI 返回明确 `unsupported`,不扫描 Claude 会话目录作为 fallback。
123
+
124
+ ### 工作区
125
+
126
+ 工作区自身的创建、删除和元数据仍由 `workspace-service` 管理。需要发现平台项目时,通过当前平台 `projects` Driver 获取项目集合,不再直接调用 Claude session implementation。
127
+
128
+ ### 恢复会话
129
+
130
+ `src/commands/resume.js` 不再拼接硬编码的 `claude` 命令。恢复操作调用当前平台的 `sessions.launch(sessionId, options)`。
131
+
132
+ 平台 Driver 负责:
133
+
134
+ - 可执行文件和参数;
135
+ - 工作目录;
136
+ - session ID/项目 ID 的平台格式;
137
+ - 继承 stdio;
138
+ - 子进程退出码。
139
+
140
+ 本轮只要求内置平台保持已有可支持行为。尚无安全 launch 语义的平台返回 `unsupported`;不能退回 Claude。用户 Manifest 不允许直接声明任意 executable 或 shell 字符串,因此 generic Driver 默认不提供 `launch`。
141
+
142
+ ## HTTP 与应用服务
143
+
144
+ 以下模块删除独立平台 allowlist 或 fallback:
145
+
146
+ - Project Config API;
147
+ - Commands API/service;
148
+ - Agents API/service;
149
+ - MCP 中仅用于固定平台判定的常量;
150
+ - 共用的 managed platform resolver。
151
+
152
+ 统一规则:
153
+
154
+ 1. 请求层解析字符串和必填字段。
155
+ 2. Registry 判断平台是否存在。
156
+ 3. capability 判断功能是否存在。
157
+ 4. Driver 或应用服务处理平台语义。
158
+
159
+ Project Config 已经通过 Runtime 构建 adapter;HTTP 层只需删除额外白名单并依赖该 seam。
160
+
161
+ Commands 和 Agents 在本轮不强制改造成新的 capability Driver。它们仍可维护内置平台的格式映射,但必须:
162
+
163
+ - 对已注册但实现不支持的平台返回 `unsupported`;
164
+ - 对未知平台返回 `not_found`;
165
+ - 不回退 Claude;
166
+ - 不声称 `resourceTypes.commands/agents` 支持即可自动获得专属实现。
167
+
168
+ 这样先修正边界语义,不扩大为资源系统重写。
169
+
170
+ ## Manifest 与路由验证
171
+
172
+ Manifest 加载阶段增加 route contract 校验:
173
+
174
+ 1. capability 必须已声明;
175
+ 2. operation 必须属于该 capability 的允许 operation 集;
176
+ 3. request codec 名必须存在;
177
+ 4. response codec 名必须存在;
178
+ 5. method/path 仍遵循现有 schema。
179
+
180
+ operation contract 由代码中的只读表维护,不允许用户 Manifest 定义任意 executable behavior。该表只描述可调用的 interface,不包含平台实现。
181
+
182
+ `platform-route-factory` 的运行时规则改为:
183
+
184
+ - Driver 或 operation 缺失时一律返回结构化 `unsupported`;
185
+ - 不再因 GET 请求返回 200 空 payload;
186
+ - 正常 Driver 返回值、旧 aliases 和响应 codec 保持不变。
187
+
188
+ `emptyPayload()` 仅用于 Driver 明确返回成功但数据为空的正常化,不用于掩盖缺失实现。
189
+
190
+ ## 兼容性
191
+
192
+ 必须保留:
193
+
194
+ - `ctx claude|codex|gemini|opencode|omp start|stop|restart|status`;
195
+ - 现有 root aliases 和平台 API 前缀;
196
+ - 正常请求的响应字段和状态码;
197
+ - `legacy:*` Driver ID;
198
+ - `legacy.js` 及现有实现模块;
199
+ - 用户磁盘配置和会话数据格式;
200
+ - 现有 Web 平台目录接口。
201
+
202
+ 有意改变:
203
+
204
+ - 未知平台不再回退 Claude;
205
+ - 已知平台缺少 capability/operation 不再伪造空成功;
206
+ - 当前平台不是 Claude 时,交互式 CLI 不再访问 Claude 会话或配置。
207
+
208
+ 这些属于错误修复,不提供兼容 shim。
209
+
210
+ ## 测试策略
211
+
212
+ 行为测试必须覆盖:
213
+
214
+ 1. 非空未知平台产生 `not_found`,且没有调用 Claude Driver。
215
+ 2. 缺省平台仍按原公开契约使用 Claude,仅限明确允许 fallback 的入口。
216
+ 3. `omp` 与测试用 `demo-cli` 在主菜单中不被归一为 Claude。
217
+ 4. `demo-cli` 声明 generic projects/sessions 后,CLI 通过 Runtime Driver 读取。
218
+ 5. 无 `sessions.launch` 的平台恢复会话返回 `unsupported`。
219
+ 6. Project Config、Commands、Agents 对未知平台和已知但不支持的平台分别返回正确错误。
220
+ 7. Manifest 拒绝未知 codec 和 capability/operation 组合。
221
+ 8. route Driver 缺少 operation 时 GET/写请求均返回 `unsupported`。
222
+ 9. 五个内置平台命令和旧 API aliases 的既有 contract 保持通过。
223
+ 10. 平台 Driver contract、API contract、CLI command contract 和完整 unit suite 通过。
224
+
225
+ 测试只断言可观察行为和 Driver 调用,不把源码正则扫描作为主要正确性证明。
226
+
227
+ ## 实施顺序
228
+
229
+ 1. 建立平台访问模块及错误 contract。
230
+ 2. 修正 route validation 和 GET 空成功。
231
+ 3. 移除 Project Config/Commands/Agents 的错误回退和 transport 白名单。
232
+ 4. 迁移主菜单状态读取。
233
+ 5. 迁移会话列表和搜索。
234
+ 6. 迁移工作区项目发现。
235
+ 7. 引入并迁移 session launch operation。
236
+ 8. 运行聚焦回归、CLI smoke 和完整 unit suite。
237
+
238
+ 每一步单独提交,并保持旧公开契约可运行。
239
+
240
+ ## 非目标
241
+
242
+ - 删除 `legacy:*` 或 `legacy.js`;
243
+ - 重写五个平台的协议实现;
244
+ - 提取共享 API route profile;
245
+ - 修改 Manifest `enabled` 或 Registry `enabledOnly` 语义;
246
+ - 重构全部 Commands/Agents 内部格式映射;
247
+ - 允许用户 Manifest 执行任意命令或加载模块;
248
+ - 修改 Web UI 信息架构;
249
+ - 删除旧 URL、命令别名或响应字段。
@@ -0,0 +1,87 @@
1
+ # Dependency Security Remediation Design
2
+
3
+ ## Problem
4
+
5
+ A push to the GitHub default branch reports:
6
+
7
+ ```text
8
+ 175 vulnerabilities
9
+ 84 high, 84 moderate, 7 low
10
+ ```
11
+
12
+ The repository currently contains both npm and pnpm manifests/lockfiles at the root and under `src/web`, while project scripts use npm. Local audit reports are lower but still show tracked vulnerable dependency trees:
13
+
14
+ - Root: 1 high and 2 moderate vulnerabilities.
15
+ - Web: 1 critical, 9 high, and 6 moderate vulnerabilities.
16
+ - Root `pnpm-lock.yaml` is stale relative to `package.json`; it still locks packages such as `qs@6.13.0` and `lodash@4.17.21`.
17
+
18
+ The duplicate and inconsistent lockfiles can cause GitHub to scan multiple dependency trees and report repeated or stale alerts.
19
+
20
+ ## Goal
21
+
22
+ Make the repository's dependency state reproducibly secure and remove stale dependency scan sources.
23
+
24
+ Success criteria:
25
+
26
+ 1. npm is the sole supported package manager for this repository.
27
+ 2. Root and web npm lockfiles match their package manifests.
28
+ 3. Root and web `npm audit` report no unresolved high or critical vulnerabilities; the target is zero vulnerabilities where available fixes exist.
29
+ 4. Web production build and unit tests pass.
30
+ 5. Existing root tests pass.
31
+ 6. No runtime vulnerability is hidden through audit exclusions or ignored advisories.
32
+
33
+ ## Scope
34
+
35
+ ### In scope
36
+
37
+ - Root `package.json` and `package-lock.json` dependency updates.
38
+ - `src/web/package.json` and `src/web/package-lock.json` dependency updates.
39
+ - Removal of the stale root and web `pnpm-lock.yaml` files.
40
+ - Compatibility fixes required by dependency upgrades.
41
+ - Existing test/build configuration adjustments required by major toolchain upgrades.
42
+
43
+ ### Out of scope
44
+
45
+ - Unrelated business logic refactors.
46
+ - Replacing npm with pnpm.
47
+ - Suppressing or downgrading vulnerability reports.
48
+ - Changes to application security behavior unrelated to dependency compatibility.
49
+
50
+ ## Design
51
+
52
+ ### Package manager policy
53
+
54
+ Use npm because the repository's scripts invoke npm, the root packaging flow calls `npm run build:web`, and both npm lockfiles are already tracked. Remove the two pnpm lockfiles rather than maintaining a second dependency graph that is not used by the project.
55
+
56
+ ### Root dependency remediation
57
+
58
+ Refresh the root npm lockfile and update vulnerable transitive packages through direct dependency constraints or the existing `overrides` block. Preserve the current runtime API versions unless a security fix requires an upgrade. Keep `package.json` and `package-lock.json` synchronized.
59
+
60
+ ### Web dependency remediation
61
+
62
+ Upgrade direct packages with available security fixes, including Axios, ECharts, Markdown-It, Vite, Vitest, and Vue-ECharts. Apply the minimum versions containing fixes. Where a main-version upgrade is required, update only the affected configuration or call sites and verify existing behavior:
63
+
64
+ - Vite/Vitest/plugin-vue toolchain remains compatible with Node `>=22.13.0`.
65
+ - ECharts/Vue-ECharts chart initialization and option rendering remain compatible.
66
+ - Axios API modules retain their existing request/response behavior.
67
+ - Markdown rendering remains compatible with current components.
68
+
69
+ Regenerate the web npm lockfile after package changes. Do not hand-edit generated lockfile entries.
70
+
71
+ ## Failure handling
72
+
73
+ If an upgrade introduces a build or test failure, fix the concrete compatibility issue at its call site or configuration boundary. Do not add fallbacks that mask errors. If an advisory has no available fixed version, retain the dependency and document the exact unresolved path and reason in the implementation result.
74
+
75
+ ## Verification
76
+
77
+ Run, in order:
78
+
79
+ 1. Root `npm install --package-lock-only` or equivalent manifest-driven lockfile refresh.
80
+ 2. Web dependency installation and lockfile refresh.
81
+ 3. Root `npm audit`.
82
+ 4. Web `npm audit`.
83
+ 5. `npm run build:web` from the root.
84
+ 6. Web unit tests through the existing web test script.
85
+ 7. Root `npm test`.
86
+
87
+ The final check must inspect the changed files and confirm no pnpm lockfiles remain tracked, no audit-ignore configuration was introduced, and generated locks are reproducible from their manifests.