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.
Files changed (434) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +86 -15
  3. package/dist/web/assets/AgentsDrawer-Db9wAyaZ.js +1 -0
  4. package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +1 -0
  5. package/dist/web/assets/Analytics-C4gMzv7g.js +1 -0
  6. package/dist/web/assets/Analytics-CyHhR126.css +1 -0
  7. package/dist/web/assets/AssetPathField-Bd_nMFu3.js +1 -0
  8. package/dist/web/assets/ChatHistoryDrawer-B2qBQs9L.css +1 -0
  9. package/dist/web/assets/ChatHistoryDrawer-CwzJHyNP.js +1 -0
  10. package/dist/web/assets/CollapseItem-CTCfSiue.js +1 -0
  11. package/dist/web/assets/CommandsDrawer-BZJxlPvV.css +1 -0
  12. package/dist/web/assets/CommandsDrawer-vDghB1U9.js +1 -0
  13. package/dist/web/assets/ConfigExportDrawer-C-XDvlHc.js +1 -0
  14. package/dist/web/assets/ConfigExportDrawer-dwruRKWr.css +1 -0
  15. package/dist/web/assets/ConfigTemplates-CYY8XRED.js +1 -0
  16. package/dist/web/assets/ConfigTemplatesDrawer-BfDi8yO3.css +1 -0
  17. package/dist/web/assets/ConfigTemplatesDrawer-CbsJp76X.js +1 -0
  18. package/dist/web/assets/ConfigTemplatesPanel-CWyPtk67.css +1 -0
  19. package/dist/web/assets/ConfigTemplatesPanel-liMSTh7s.js +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-D6QSiYaL.js +1 -0
  24. package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +1 -0
  25. package/dist/web/assets/GatewayConvertDrawer-RvET6iNG.js +1 -0
  26. package/dist/web/assets/Home-CSuFuJ9Y.css +1 -0
  27. package/dist/web/assets/Home-P8eseZcf.js +1 -0
  28. package/dist/web/assets/MarkdownEditor-CYmLGYju.js +1 -0
  29. package/dist/web/assets/MarkdownEditor-qfVgSre_.css +1 -0
  30. package/dist/web/assets/McpDrawer-C0dnsZhQ.css +1 -0
  31. package/dist/web/assets/McpDrawer-Ch3bkKIq.js +1 -0
  32. package/dist/web/assets/McpFormDrawer-BRbDcawn.css +1 -0
  33. package/dist/web/assets/McpFormDrawer-BcTlgSpN.js +1 -0
  34. package/dist/web/assets/PluginManager-Dh2o0xkZ.js +1 -0
  35. package/dist/web/assets/PluginsDrawer-DM3QjprE.css +1 -0
  36. package/dist/web/assets/PluginsDrawer-deKQ5u3I.js +1 -0
  37. package/dist/web/assets/PluginsPanel-BofsgQgj.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-DhSWJHTA.js +1 -0
  41. package/dist/web/assets/PromptsDrawer-BIgiYCEQ.css +1 -0
  42. package/dist/web/assets/PromptsDrawer-Cfb2FeeU.js +1 -0
  43. package/dist/web/assets/RecentSessionsDrawer-3eXamJhr.js +1 -0
  44. package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +1 -0
  45. package/dist/web/assets/SessionCard-CW0eHURI.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-DQfyDGWU.js +1 -0
  49. package/dist/web/assets/SettingsDrawer-Dw5NUgHC.css +1 -0
  50. package/dist/web/assets/SettingsDrawer-u_vwUuPS.js +1 -0
  51. package/dist/web/assets/SkillManager-C0GCT2Kb.css +1 -0
  52. package/dist/web/assets/SkillManager-DHMprJLA.js +1 -0
  53. package/dist/web/assets/SkillsDrawer-BCNme-aJ.css +1 -0
  54. package/dist/web/assets/SkillsDrawer-CkF3BpyC.js +1 -0
  55. package/dist/web/assets/SkillsPanel-B3Nm5j32.css +1 -0
  56. package/dist/web/assets/SkillsPanel-DWE4pFGx.js +1 -0
  57. package/dist/web/assets/SpeedTestDrawer-BgfG1Ked.js +1 -0
  58. package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +1 -0
  59. package/dist/web/assets/Upload-CNwaGOws.js +1 -0
  60. package/dist/web/assets/WorkspaceDrawer-Br5CeCzL.js +1 -0
  61. package/dist/web/assets/WorkspaceDrawer-CGnMu9p1.css +1 -0
  62. package/dist/web/assets/WorkspaceManager-B2O8-qIw.js +1 -0
  63. package/dist/web/assets/WorkspacePanel-5oDKit3c.js +1 -0
  64. package/dist/web/assets/WorkspacePanel-D0-zHTHP.css +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-BMAUPq5K.js +2 -0
  71. package/dist/web/assets/index-Bi1MQHYX.css +1 -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-jbmqZuJs.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 +104 -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 +165 -0
  140. package/src/platforms/channel-auth-service.js +107 -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 +98 -418
  269. package/src/{server/services → platforms}/notification-hooks.js +190 -1023
  270. package/src/platforms/oauth-credentials-service.js +635 -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 +133 -24
  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 +12 -2
  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 +876 -214
  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,508 @@
1
+ # Platform Implementation Drivers Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Move all platform-specific channel, proxy, session, statistics, native-config, resource, prompt, and MCP behavior out of `src/server` into per-platform Drivers, then delete obsolete platform services and remove CLI platform branches.
6
+
7
+ **Architecture:** `src/platforms/drivers/<platform>/<capability>.js` owns provider-specific behavior and may use platform-local helpers. `src/server` retains HTTP/CLI facades, shared application orchestration, SQLite/cache/scheduler/security infrastructure, and protocol-neutral utilities. Runtime remains the only capability lookup seam; legacy HTTP URLs and CLI command names remain unchanged.
8
+
9
+ **Tech Stack:** Node.js 22, CommonJS, Express, Vitest, Platform Registry/Runtime, existing filesystem/TOML/JSON/native configuration adapters.
10
+
11
+ ---
12
+
13
+ ## Scope and ownership map
14
+
15
+ ### Driver-owned implementations
16
+
17
+ - Claude: existing `channels-implementation.js`, plus proxy, sessions, statistics, native config, and provider-specific resource/config behavior.
18
+ - Codex: existing `channels-implementation.js`, plus proxy, sessions, statistics, native config, and provider-specific resource/config behavior.
19
+ - Gemini: contents of `gemini-channels.js`, `gemini-proxy-server.js`, `gemini-sessions.js`, `gemini-statistics-service.js`, `gemini-settings-manager.js`, and Gemini-specific serialization/helpers.
20
+ - OpenCode: contents of `opencode-channels.js`, `opencode-proxy-server.js`, `opencode-sessions.js`, `opencode-statistics-service.js`, `opencode-settings-manager.js`, `opencode-gateway-converter.js`, `opencode-normalization.js`, and OpenCode-specific serialization/helpers.
21
+ - OMP: contents of `omp-channels.js`, `omp-proxy-server.js`, `omp-sessions.js`, `omp-statistics-service.js`, `omp-settings-manager.js`, `omp-gateway*.js`, `omp-native-plugin-adapter.js`, and OMP managed-mode/auth behavior.
22
+
23
+ ### Server-owned implementations
24
+
25
+ - `src/server/api/**`: route, validation, status code, response-shape, and websocket compatibility.
26
+ - `src/commands/**`: prompt/menu/output handling and generic command dispatch.
27
+ - `src/server/services/base/**`, `session-history-index.js`, `channel-scheduler.js`, `channel-health.js`, `enhanced-cache.js`, `sqlite-connection.js`, `security/**`: platform-neutral infrastructure.
28
+ - `src/server/services/claude-wire.js`, `codex-wire.js`, `gemini-wire.js`: retain only if used as protocol-neutral wire utilities; platform-specific orchestration moves into the owning Driver.
29
+
30
+ ## Shared Driver contract
31
+
32
+ Each built-in Driver factory receives the existing Runtime context and returns capability methods. Methods return existing DTOs at the Driver/facade boundary; failures use `DriverResult` and preserve `cause` as a non-enumerable property.
33
+
34
+ ```js
35
+ const driver = runtime.getDriver(platform, capability);
36
+ const result = await driver[operation](input);
37
+ ```
38
+
39
+ The CLI-facing capability metadata uses this shape:
40
+
41
+ ```js
42
+ {
43
+ supportsCliCreate: true,
44
+ supportsCliToggle: true,
45
+ managedProviderConfig: false,
46
+ defaultPort: 20088
47
+ }
48
+ ```
49
+
50
+ The generic CLI must read metadata and methods; it must not compare platform names.
51
+
52
+ ---
53
+
54
+ ### Task 1: Freeze behavior and add migration guards
55
+
56
+ **Files:**
57
+ - Create: `tests/unit/platforms/drivers/platform-implementation-boundary.test.js`
58
+ - Modify: `tests/unit/platforms/drivers/builtin-driver-contract.test.js`
59
+ - Modify: `scripts/test-driver-reachability.js`
60
+
61
+ - [ ] **Step 1: Add failing boundary assertions**
62
+
63
+ Add tests that inspect production source files and fail while the current delegation remains:
64
+
65
+ ```js
66
+ it('does not load platform channel implementations from server services', () => {
67
+ const source = fs.readFileSync(path.join(ROOT, 'src/platforms/drivers/gemini/channels.js'), 'utf8');
68
+ expect(source).not.toMatch(/server\/services\/gemini-channels/);
69
+ });
70
+
71
+ it('does not keep concrete platform branches in CLI channel command', () => {
72
+ const source = fs.readFileSync(path.join(ROOT, 'src/commands/channels.js'), 'utf8');
73
+ expect(source).not.toMatch(/cliType === ['"](?:claude|codex|gemini|opencode|omp)/);
74
+ });
75
+ ```
76
+
77
+ Repeat the source assertion for all five proxy Drivers and both CLI commands. These tests are migration guards, not substitutes for behavior tests.
78
+
79
+ - [ ] **Step 2: Record every current caller before moving code**
80
+
81
+ Search production and tests for each implementation file. Save the caller list in the task notes and classify each caller as:
82
+
83
+ - HTTP facade that must be changed to Runtime;
84
+ - CLI facade that must be changed to Runtime;
85
+ - shared infrastructure that must receive a narrow injected callback;
86
+ - test-only mock path that must be moved to Driver seam;
87
+ - worker/dynamic entry point that must remain explicitly documented.
88
+
89
+ - [ ] **Step 3: Run the guard tests and confirm red state**
90
+
91
+ Run:
92
+
93
+ ```bash
94
+ npx vitest run tests/unit/platforms/drivers/platform-implementation-boundary.test.js
95
+ ```
96
+
97
+ Expected: failures identify the current Driver-to-service and CLI-to-service delegation points.
98
+
99
+ - [ ] **Step 4: Commit the characterization guard**
100
+
101
+ ```bash
102
+ git add tests/unit/platforms/drivers/platform-implementation-boundary.test.js tests/unit/platforms/drivers/builtin-driver-contract.test.js scripts/test-driver-reachability.js
103
+ git commit -m "test: guard platform implementation driver ownership"
104
+ ```
105
+
106
+ ---
107
+
108
+ ### Task 2: Move remaining channel implementations
109
+
110
+ **Files:**
111
+ - Create/modify: `src/platforms/drivers/gemini/channels.js`, `src/platforms/drivers/gemini/helpers/**`
112
+ - Create/modify: `src/platforms/drivers/opencode/channels.js`, `src/platforms/drivers/opencode/helpers/**`
113
+ - Create/modify: `src/platforms/drivers/omp/channels.js`, `src/platforms/drivers/omp/helpers/**`
114
+ - Modify: `src/server/services/base/base-channel-service.js`
115
+ - Modify: `src/server/services/channel-sync-utils.js`
116
+ - Delete after caller migration: `src/server/services/gemini-channels.js`, `src/server/services/opencode-channels.js`, `src/server/services/omp-channels.js`
117
+ - Modify: `src/server/api/gemini-channels.js`, `src/server/api/opencode-channels.js`, `src/server/api/omp-channels.js`
118
+ - Modify: `tests/unit/platforms/drivers/gemini-channels.test.js`, `opencode-channels.test.js`, `omp-channels.test.js`
119
+
120
+ - [ ] **Step 1: Define the per-platform channel Driver methods**
121
+
122
+ Each Driver must expose the methods already consumed by facades plus the common contract:
123
+
124
+ ```js
125
+ list(options = {})
126
+ getEnabled(options = {})
127
+ create(input)
128
+ update(id, patch)
129
+ remove(id)
130
+ markRecentlyUsed(id)
131
+ syncCurrent(options = {})
132
+ applyChannelToSettings(id, options = {})
133
+ getEffectiveApiKey(channel)
134
+ disableAll(options = {})
135
+ resetChannel(id)
136
+ getCliMetadata()
137
+ ```
138
+
139
+ Gemini-specific methods own `.env`, `apiFormat`, and Vertex handling. OpenCode-specific methods own provider ID derivation, config path selection, model collection, and Codex fallback key. OMP-specific methods own static/managed mode, provider grouping, OAuth credential lookup, and managed provider writes.
140
+
141
+ - [ ] **Step 2: Move actual function bodies, not imports**
142
+
143
+ Move each platform service function and its platform-only helper into that platform Driver directory. Replace direct imports of another platform service with injected shared callbacks or the owning Driver:
144
+
145
+ ```js
146
+ const shared = context.shared || {};
147
+ const channelStore = shared.channelStore;
148
+ const scheduler = shared.scheduler;
149
+ ```
150
+
151
+ Do not implement `createDriver()` by calling `createChannelDriver({ servicePath })`. The final factory must construct the implementation directly.
152
+
153
+ - [ ] **Step 3: Keep shared storage and scheduling generic**
154
+
155
+ Extend `BaseChannelService` only with platform-neutral operations required by more than one Driver. Do not add Gemini/OpenCode/OMP fields to its schema. Platform-specific fields remain under `extra` or the platform Driver DTO.
156
+
157
+ - [ ] **Step 4: Convert channel APIs to Runtime-only access**
158
+
159
+ For each route module, replace direct service imports with:
160
+
161
+ ```js
162
+ const { getPlatformRuntime } = require('../../platforms/runtime');
163
+
164
+ function getChannelsDriver() {
165
+ return getPlatformRuntime().getDriver('gemini', 'channels');
166
+ }
167
+ ```
168
+
169
+ Keep route-specific validation, HTTP status codes, response field names, health broadcasts, and speed-test orchestration in the API facade. The API must not import a platform service or proxy server.
170
+
171
+ - [ ] **Step 5: Migrate channel tests to the Driver seam**
172
+
173
+ Preserve tests for native config sync, invalid `apiFormat`, provider IDs, managed mode, and secret redaction. Replace `require.cache` mocks of deleted service paths with Driver factory/runtime mocks.
174
+
175
+ - [ ] **Step 6: Run channel regression**
176
+
177
+ ```bash
178
+ npx vitest run tests/unit/platforms/drivers/gemini-channels.test.js tests/unit/platforms/drivers/opencode-channels.test.js tests/unit/platforms/drivers/omp-channels.test.js tests/unit/api/gemini-channels-api.test.js tests/unit/api/opencode-channels-api.test.js tests/unit/api/omp-channels-api.test.js
179
+ ```
180
+
181
+ Expected: all existing channel behavior passes with no platform channel service import in production.
182
+
183
+ - [ ] **Step 7: Delete obsolete channel services and commit**
184
+
185
+ ```bash
186
+ git add src/platforms/drivers src/server/services/base src/server/services/channel-sync-utils.js src/server/api tests
187
+ git rm src/server/services/gemini-channels.js src/server/services/opencode-channels.js src/server/services/omp-channels.js
188
+ git commit -m "refactor: move platform channel implementations into drivers"
189
+ ```
190
+
191
+ ---
192
+
193
+ ### Task 3: Move proxy lifecycle and protocol implementations
194
+
195
+ **Files:**
196
+ - Modify/create: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/proxy.js`
197
+ - Create: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/proxy-helpers/**`
198
+ - Modify: `src/server/services/proxy-runtime.js`, `proxy-log-helper.js`, `request-logger.js`, `server-shutdown.js`
199
+ - Modify: `src/server/api/{proxy,codex-proxy,gemini-proxy,opencode-proxy,omp-proxy}.js`
200
+ - Delete after caller migration: `src/server/{proxy-server,codex-proxy-server,gemini-proxy-server,opencode-proxy-server,omp-proxy-server}.js`
201
+ - Modify: `src/commands/toggle-proxy.js`
202
+ - Modify: proxy Driver/API tests
203
+
204
+ - [ ] **Step 1: Split common listener infrastructure from platform behavior**
205
+
206
+ Extract only listener concerns into reusable infrastructure: Express app creation, HTTP server bind/close, shutdown hooks, request logging, health/scheduler callbacks, and runtime timestamps. Keep provider protocol logic in the platform Driver.
207
+
208
+ The Driver contract is:
209
+
210
+ ```js
211
+ status(options = {})
212
+ start(options = {})
213
+ stop(options = {})
214
+ restoreOnBoot(options = {})
215
+ handleRequest(request, response, options = {})
216
+ ```
217
+
218
+ - [ ] **Step 2: Move each proxy implementation by platform**
219
+
220
+ Move provider headers, target URLs, body conversion, stream conversion, retries, model collection, usage extraction, and native restoration into the corresponding Driver. Keep `claude-wire.js`, `codex-wire.js`, and `gemini-wire.js` only as stateless utilities when they have more than one caller; Driver orchestration must own their use.
221
+
222
+ OMP Driver must retain gateway drain, managed-provider routing, retry policy, and auth header mapping.
223
+
224
+ - [ ] **Step 3: Replace old proxy server exports with Runtime calls in every caller**
225
+
226
+ Update API, CLI, daemon, OAuth broadcast, channel API cache invalidation, and server shutdown paths to resolve `runtime.getDriver(platform, 'proxy')`. No production caller may require a `*-proxy-server.js` module.
227
+
228
+ - [ ] **Step 4: Remove platform branches from proxy APIs**
229
+
230
+ Keep old URL and payload compatibility. API flow:
231
+
232
+ ```js
233
+ const driver = getPlatformRuntime().getDriver(platform, 'proxy');
234
+ const result = await driver.start(options);
235
+ return sendLegacyProxyResponse(res, result);
236
+ ```
237
+
238
+ Active-channel selection belongs to the channel Driver/shared channel application helper, not repeated in each API file.
239
+
240
+ - [ ] **Step 5: Add fake-upstream behavior tests**
241
+
242
+ For each platform, send a fake request through `handleRequest()` and assert target URL, headers, body conversion, streaming/non-streaming response, and typed failure. Assert failed upstream requests do not return HTTP 200 with an empty body.
243
+
244
+ - [ ] **Step 6: Run proxy regression**
245
+
246
+ ```bash
247
+ npx vitest run tests/unit/platforms/drivers/*-proxy.test.js tests/unit/api/proxy-api.test.js tests/unit/api/codex-proxy-api.test.js tests/unit/api/gemini-proxy-api.test.js tests/unit/api/opencode-proxy-api.test.js tests/unit/api/omp-proxy-api.test.js
248
+ ```
249
+
250
+ - [ ] **Step 7: Delete proxy server modules and commit**
251
+
252
+ ```bash
253
+ git add src/platforms/drivers src/server/services src/server/api src/commands tests
254
+ git rm src/server/proxy-server.js src/server/codex-proxy-server.js src/server/gemini-proxy-server.js src/server/opencode-proxy-server.js src/server/omp-proxy-server.js
255
+ git commit -m "refactor: move platform proxy implementations into drivers"
256
+ ```
257
+
258
+ ---
259
+
260
+ ### Task 4: Move sessions, statistics, and native configuration
261
+
262
+ **Files:**
263
+ - Modify: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/{sessions,statistics,native-config}.js`
264
+ - Create: platform-local helpers required by the moved implementations
265
+ - Modify: `src/server/services/session-history-index.js`, `session-history-worker.js`, `statistics-service.js`, `config-sync-manager.js`
266
+ - Delete after caller migration: platform `*-sessions.js`, `*-statistics-service.js`, and platform settings manager files under `src/server/services`
267
+ - Modify: all platform sessions/statistics API modules
268
+ - Modify: `src/commands/**` session/status callers
269
+
270
+ - [ ] **Step 1: Move session-history parsing and inventory ownership**
271
+
272
+ Move platform-specific inventory and parse functions from `src/server/services/session-history-adapters/{claude,codex,gemini,omp}.js` into each platform `sessions.js`. Keep SQLite schema, stale/complete consistency, cache invalidation, and worker orchestration in `session-history-index.js`.
273
+
274
+ The Driver must expose:
275
+
276
+ ```js
277
+ inventory(options = {})
278
+ parse(descriptor, options = {})
279
+ listSessions(options = {})
280
+ recent(options = {})
281
+ search(query, options = {})
282
+ status(sessionId, options = {})
283
+ messages(sessionId, options = {})
284
+ delete(sessionId, options = {})
285
+ fork(sessionId, options = {})
286
+ ```
287
+
288
+ - [ ] **Step 2: Move platform statistics logic**
289
+
290
+ Move platform pricing/usage parsing, request payload construction, and platform file persistence into `statistics.js`. Shared `statistics-service.js` aggregates Driver DTOs and does not require platform statistics services.
291
+
292
+ - [ ] **Step 3: Move native config implementations**
293
+
294
+ Move platform settings manager behavior into `native-config.js`: path resolution, backup/restore, protected writes, native OAuth synchronization, env/TOML/JSON serialization, and proxy configuration state. Keep path validation and permission policy shared.
295
+
296
+ - [ ] **Step 4: Convert session/statistics APIs and CLI callers**
297
+
298
+ Replace direct platform service imports with Runtime capability lookups. Preserve old route response shapes, `source`, project identifiers, and installed-CLI error messages. CLI status/session commands must resolve `sessions` and `statistics` Driver methods.
299
+
300
+ - [ ] **Step 5: Run session/statistics/native regression**
301
+
302
+ ```bash
303
+ npx vitest run tests/unit/services/session-history-index.test.js tests/unit/services/statistics-service.test.js tests/unit/platforms/drivers/*-sessions.test.js tests/unit/platforms/drivers/*-statistics.test.js tests/unit/api/statistics.test.js
304
+ ```
305
+
306
+ - [ ] **Step 6: Delete obsolete platform services and commit**
307
+
308
+ ```bash
309
+ git add src/platforms/drivers src/server/services src/server/api src/commands tests
310
+ git rm src/server/services/codex-sessions.js src/server/services/gemini-sessions.js src/server/services/opencode-sessions.js src/server/services/omp-sessions.js src/server/services/claude-statistics-service.js src/server/services/codex-statistics-service.js src/server/services/gemini-statistics-service.js src/server/services/opencode-statistics-service.js src/server/services/omp-statistics-service.js
311
+ git commit -m "refactor: move session statistics and native config implementations"
312
+ ```
313
+
314
+ Delete only files proven to have no remaining production caller; retain generic `sessions.js` if it is the shared Claude/session application implementation and remove its platform-specific logic first.
315
+
316
+ ---
317
+
318
+ ### Task 5: Move resource, prompt, MCP, and platform serialization behavior
319
+
320
+ **Files:**
321
+ - Modify: `src/platforms/drivers/{claude,codex,gemini,opencode,omp}/{resource-sync,prompts,mcp}.js`
322
+ - Modify: `src/server/services/config-sync-manager.js`, `config-templates-service.js`, `prompts-service.js`, `mcp-service.js`, `config-export-service.js`
323
+ - Modify: `src/server/services/project-config-adapters/*.js`
324
+ - Modify: related Driver/API tests
325
+
326
+ - [ ] **Step 1: Move platform-specific projections**
327
+
328
+ Each Driver owns native paths, format conversion, provider serialization, and remove/restore semantics. Shared services keep traversal, manifest precedence, permissions, secret redaction, and project root validation.
329
+
330
+ - [ ] **Step 2: Keep shared services capability-agnostic**
331
+
332
+ Replace platform-name branches with:
333
+
334
+ ```js
335
+ for (const platform of runtime.list({ enabledOnly: true })) {
336
+ const driver = runtime.getDriver(platform.key, capability);
337
+ if (!driver || typeof driver[operation] !== 'function') continue;
338
+ await driver[operation](payload);
339
+ }
340
+ ```
341
+
342
+ - [ ] **Step 3: Run resource/prompt/MCP regression**
343
+
344
+ ```bash
345
+ npx vitest run tests/unit/services/config-sync-manager.test.js tests/unit/services/config-templates-service.test.js tests/unit/services/prompts-service.test.js tests/unit/services/mcp-service.test.js tests/unit/platforms/drivers/resource-sync.test.js tests/unit/platforms/drivers/capabilities.test.js
346
+ ```
347
+
348
+ - [ ] **Step 4: Commit capability projection migration**
349
+
350
+ ```bash
351
+ git add src/platforms/drivers src/server/services src/server/api tests
352
+ git commit -m "refactor: move platform resource projections into drivers"
353
+ ```
354
+
355
+ ---
356
+
357
+ ### Task 6: Make CLI commands Runtime-driven
358
+
359
+ **Files:**
360
+ - Modify: `src/commands/channels.js`
361
+ - Modify: `src/commands/toggle-proxy.js`
362
+ - Modify: `src/commands/daemon.js`, `src/commands/status.js`, `src/commands/sessions.js` if present
363
+ - Modify: `src/platforms/drivers/*/channels.js`, `proxy.js`, `native-config.js`
364
+ - Test: `tests/unit/commands/channels.test.js`, `toggle-proxy.test.js`, `status.test.js`, and new `tests/unit/commands/runtime-driven-cli.test.js`
365
+
366
+ - [ ] **Step 1: Add generic capability access helpers**
367
+
368
+ Use one helper with no platform switch:
369
+
370
+ ```js
371
+ function getCapability(platform, capability) {
372
+ const runtime = getPlatformRuntime();
373
+ return runtime.getDriver(normalizePlatformKey(platform), capability);
374
+ }
375
+ ```
376
+
377
+ `getChannelServices()` returns normalized Driver methods and metadata; it must not contain `require('../server/services/...')` or platform comparisons.
378
+
379
+ - [ ] **Step 2: Move platform CLI policy into Driver metadata**
380
+
381
+ Expose `getCliMetadata()` from each channel/proxy Driver. OMP returns `{ supportsCliCreate: false, managedProviderConfig: true }`; other platforms return their actual supported operations. Default port comes from Driver metadata or the validated platform manifest, not a CLI map.
382
+
383
+ - [ ] **Step 3: Replace CLI proxy lifecycle branches**
384
+
385
+ `toggle-proxy.js` gets `channels`, `proxy`, and `nativeConfig` Drivers from Runtime. Active channel restoration calls `channels.getBestChannelForRestore()` and `channels.applyChannelToSettings()`. It must not load `*-proxy-server.js`, `*-channels.js`, or `*-settings-manager.js`.
386
+
387
+ - [ ] **Step 4: Add config-only CLI regression**
388
+
389
+ Register a test-only `demo-cli` manifest with generic channels/proxy metadata. Verify CLI capability resolution works without adding a platform branch or editing a command source file.
390
+
391
+ - [ ] **Step 5: Run CLI tests and commit**
392
+
393
+ ```bash
394
+ npx vitest run tests/unit/commands/channels.test.js tests/unit/commands/toggle-proxy.test.js tests/unit/commands/runtime-driven-cli.test.js tests/unit/platforms/demo-cli-contract.test.js
395
+ ```
396
+
397
+ ```bash
398
+ git add src/commands src/platforms/drivers tests
399
+ git commit -m "refactor: make CLI commands runtime-driven"
400
+ ```
401
+
402
+ ---
403
+
404
+ ### Task 7: Remove legacy mappings, facades, and orphan files
405
+
406
+ **Files:**
407
+ - Modify: `src/platforms/drivers/legacy.js`
408
+ - Modify: `src/platforms/runtime.js`, `src/platforms/driver-registry.js` if required by removed registrations
409
+ - Modify: `scripts/test-driver-reachability.js`
410
+ - Delete: only server platform implementations with zero production/test-supported callers
411
+ - Modify: affected tests and mocks
412
+
413
+ - [ ] **Step 1: Remove migrated mappings from `legacy.js`**
414
+
415
+ Delete mappings for migrated platform channels, proxies, sessions, statistics, native config, prompts, MCP, and resource sync. `legacy.js` may retain only compatibility registration metadata and generic unsupported behavior; it must not point at platform implementation files under `src/server`.
416
+
417
+ - [ ] **Step 2: Search all production callers**
418
+
419
+ Run targeted repository searches for every deleted module name and classify any remaining result. Migrate valid callers before deletion. Keep only explicitly documented dynamic worker entries and generic infrastructure.
420
+
421
+ - [ ] **Step 3: Delete obsolete facades**
422
+
423
+ Delete a server facade only after all public API/CLI callers and test mocks use Runtime. Internal `require.resolve` compatibility is not preserved unless it is an explicitly supported public integration.
424
+
425
+ - [ ] **Step 4: Extend reachability checks**
426
+
427
+ Require the script to fail if:
428
+
429
+ - a built-in Driver loads `src/server` platform implementation;
430
+ - a command module contains a platform-specific require or branch;
431
+ - a deleted server platform module is imported;
432
+ - a Driver capability is only a `servicePath`/`localServicePath` wrapper.
433
+
434
+ - [ ] **Step 5: Commit cleanup**
435
+
436
+ ```bash
437
+ git add src/platforms src/server src/commands scripts tests
438
+ git commit -m "refactor: remove obsolete platform service implementations"
439
+ ```
440
+
441
+ ---
442
+
443
+ ### Task 8: Validate behavior and publish the follow-up PR
444
+
445
+ **Files:**
446
+ - Modify: tests only if a behavior gap is found
447
+ - Modify: plan/checklist only for completed steps
448
+
449
+ - [ ] **Step 1: Run focused migration tests**
450
+
451
+ ```bash
452
+ npx vitest run tests/unit/platforms/drivers tests/unit/commands/runtime-driven-cli.test.js tests/unit/services/session-history-index.test.js
453
+ ```
454
+
455
+ - [ ] **Step 2: Run API consistency**
456
+
457
+ ```bash
458
+ npm run test:api
459
+ ```
460
+
461
+ Expected: all existing API consistency checks pass.
462
+
463
+ - [ ] **Step 3: Run reachability and diff checks**
464
+
465
+ ```bash
466
+ node scripts/test-driver-reachability.js
467
+ git diff --check
468
+ git status --short
469
+ ```
470
+
471
+ Expected: no unexplained orphan modules and clean status after commit.
472
+
473
+ - [ ] **Step 4: Run the actual CLI smoke paths**
474
+
475
+ Exercise `--help`, `channel-status`, `switch-channel`, `toggle-proxy`, and `daemon` with mocked native/provider dependencies. Verify old command names, output status, and unsupported capability messages remain stable.
476
+
477
+ - [ ] **Step 5: Run full unit tests**
478
+
479
+ ```bash
480
+ npm run test:unit
481
+ ```
482
+
483
+ Record any environment-only failures exactly; do not report the suite as fully passing when Pinia resolution or unrelated plugin timeout failures occur.
484
+
485
+ - [ ] **Step 6: Review final ownership**
486
+
487
+ Search for:
488
+
489
+ ```bash
490
+ rg "server/(?:services/)?(?:gemini|opencode|omp|codex|claude)-(?:channels|sessions|statistics|settings)|server/(?:codex|gemini|opencode|omp)?-proxy-server|cliType ===" src
491
+ ```
492
+
493
+ The only allowed matches are HTTP facade names/comments and explicitly classified shared protocol/infrastructure utilities.
494
+
495
+ - [ ] **Step 7: Commit any final test-only corrections**
496
+
497
+ ```bash
498
+ git add tests scripts
499
+ git commit -m "test: verify platform implementation ownership"
500
+ ```
501
+
502
+ - [ ] **Step 8: Push and create the follow-up PR**
503
+
504
+ ```bash
505
+ git push -u origin refactor/move-platform-implementations-to-drivers
506
+ ```
507
+
508
+ Create a PR targeting `develop` with the ownership boundary, deleted modules, focused verification, API verification, reachability output, and any full-suite environment failures listed explicitly.