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,259 @@
1
+ 'use strict';
2
+
3
+ const path = require('path');
4
+ const { createPlatformRegistry } = require('./registry');
5
+ const { resolveTemplate } = require('./path-resolver');
6
+ const { createPlatformPathContext } = require('./platform-path-context');
7
+
8
+ const PATH_CONTEXT_ENV_KEYS = [
9
+ 'HOME',
10
+ 'USERPROFILE',
11
+ 'APPDATA',
12
+ 'CLAUDE_CONFIG_DIR',
13
+ 'CODEX_HOME',
14
+ 'XDG_CONFIG_HOME',
15
+ 'XDG_DATA_HOME',
16
+ 'XDG_STATE_HOME',
17
+ 'PATH',
18
+ 'OMP_COMMAND',
19
+ 'OMP_CONFIG_DIR',
20
+ 'OMP_PROFILE',
21
+ 'PI_CODING_AGENT_DIR',
22
+ 'OMP_CODING_AGENT_DIR'
23
+ ];
24
+
25
+ let platformRegistry;
26
+ let platformRuntime;
27
+ let defaultDependencies = Object.freeze({});
28
+
29
+ function getDefaultDriverRegistry() {
30
+ try {
31
+ const { getDriverRegistry } = require('./driver-registry');
32
+ return getDriverRegistry();
33
+ } catch (error) {
34
+ if (error.code !== 'MODULE_NOT_FOUND' || !error.message.includes("'./driver-registry'")) throw error;
35
+ throw new Error('Platform driver registry is not available; create(id, context) cannot be resolved');
36
+ }
37
+ }
38
+
39
+ function isUrl(value) {
40
+ return /^[a-z][a-z0-9+.-]*:\/\//i.test(String(value));
41
+ }
42
+
43
+ function isExplicitFilesystemRoot(value) {
44
+ return path.isAbsolute(String(value));
45
+ }
46
+
47
+ function expandTilde(value, homeDir) {
48
+ if (value === '~') return homeDir;
49
+ if (value.startsWith('~/') || value.startsWith('~\\')) return path.join(homeDir, value.slice(2));
50
+ return value;
51
+ }
52
+
53
+ function assertInsideHome(home, candidate, manifestKey, mappingName) {
54
+ const relative = path.relative(home, candidate);
55
+ if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
56
+ throw new Error(`Manifest ${manifestKey || 'platform'} resource mapping ${mappingName} escapes home`);
57
+ }
58
+ }
59
+
60
+ function hasDeclaredHome(manifest) {
61
+ return Boolean(manifest && manifest.paths && Object.prototype.hasOwnProperty.call(manifest.paths, 'home'));
62
+ }
63
+
64
+ function resolveResourceMappings(manifest, resolvedPaths = {}, pathOptions = {}, strictHome = false) {
65
+ const resourceMappings = manifest.resourceMappings || {};
66
+ const home = resolvedPaths.home || process.cwd();
67
+ const homeDir = pathOptions.homeDir || require('os').homedir();
68
+ const declaredHome = hasDeclaredHome(manifest);
69
+ const resolved = { env: { ...process.env, ...(pathOptions.env || {}) }, home };
70
+ return Object.fromEntries(Object.entries(resourceMappings).map(([type, value]) => {
71
+ if (typeof value === 'string' && !value.trim()) return [type, value];
72
+ const raw = expandTilde(resolveTemplate(value, resolved), homeDir);
73
+ const target = isUrl(raw) || path.isAbsolute(raw) ? raw : path.join(home, raw);
74
+ const requiresContainment = !isExplicitFilesystemRoot(value) || (strictHome && declaredHome);
75
+ if (!isUrl(target) && requiresContainment) assertInsideHome(home, path.normalize(target), manifest.key, type);
76
+ return [type, isUrl(target) ? target : path.normalize(target)];
77
+ }));
78
+ }
79
+
80
+ function resolvePromptFile(manifest, resolvedPaths = {}, pathOptions = {}, strictHome = false) {
81
+ if (manifest.promptFile === null || manifest.promptFile === undefined) return manifest.promptFile;
82
+ if (typeof manifest.promptFile === 'string' && !manifest.promptFile.trim()) return manifest.promptFile;
83
+ const home = resolvedPaths.home || process.cwd();
84
+ const homeDir = pathOptions.homeDir || require('os').homedir();
85
+ const raw = expandTilde(resolveTemplate(manifest.promptFile, { env: { ...process.env, ...(pathOptions.env || {}) }, home }), homeDir);
86
+ if (isUrl(raw)) throw new Error(`Manifest ${manifest.key || 'platform'} promptFile must be a filesystem path`);
87
+ const target = path.isAbsolute(raw) ? path.normalize(raw) : path.normalize(path.join(home, raw));
88
+ const requiresContainment = !isExplicitFilesystemRoot(manifest.promptFile) || (strictHome && hasDeclaredHome(manifest));
89
+ if (requiresContainment) assertInsideHome(home, target, manifest.key, 'promptFile');
90
+ return target;
91
+ }
92
+
93
+ function buildResolvedManifest(rawManifest, resolvedPaths, pathOptions = {}, driverId) {
94
+ if (!rawManifest) return null;
95
+ const paths = resolvedPaths || rawManifest.paths;
96
+ const strictHome = driverId === 'generic-mcp' || driverId === 'generic-prompt';
97
+ const resourceMappings = rawManifest.resourceMappings
98
+ ? resolveResourceMappings(rawManifest, paths || {}, pathOptions, strictHome)
99
+ : rawManifest.resourceMappings;
100
+ const promptFile = resolvePromptFile(rawManifest, paths || {}, pathOptions, strictHome);
101
+ const selectedMapping = driverId === 'generic-mcp'
102
+ ? rawManifest.resourceMappings && rawManifest.resourceMappings.mcp
103
+ : driverId === 'generic-prompt'
104
+ ? (rawManifest.resourceMappings && typeof rawManifest.resourceMappings.prompts === 'string' && rawManifest.resourceMappings.prompts.trim()
105
+ ? rawManifest.resourceMappings.prompts
106
+ : rawManifest.promptFile)
107
+ : null;
108
+ if (strictHome && !hasDeclaredHome(rawManifest) && isExplicitFilesystemRoot(selectedMapping) && paths && Object.prototype.hasOwnProperty.call(paths, 'home')) {
109
+ const driverPaths = { ...paths };
110
+ delete driverPaths.home;
111
+ return { ...rawManifest, paths: driverPaths, resourceMappings, promptFile };
112
+ }
113
+ return { ...rawManifest, paths, resourceMappings, promptFile };
114
+ }
115
+
116
+ function isLegacyDriverId(driverId) {
117
+ return typeof driverId === 'string' && driverId.startsWith('legacy:');
118
+ }
119
+
120
+ function getDefaultDependencies() {
121
+ return { ...defaultDependencies };
122
+ }
123
+
124
+ function canReuseDefaultPathContext(pathOptions = {}) {
125
+ return !pathOptions || (
126
+ typeof pathOptions === 'object'
127
+ && !Array.isArray(pathOptions)
128
+ && Object.keys(pathOptions).length === 0
129
+ );
130
+ }
131
+
132
+ function getDefaultPathContextFingerprint(platform, manifest) {
133
+ try {
134
+ const pathConfig = require('../config/paths');
135
+ const nativeKey = manifest?.pathResolverId || platform;
136
+ const native = pathConfig.NATIVE_PATHS?.[nativeKey] || null;
137
+ const state = typeof pathConfig.getPlatformStatePaths === 'function'
138
+ ? pathConfig.getPlatformStatePaths(platform)
139
+ : null;
140
+ let homeDir = pathConfig.HOME_DIR || '';
141
+ if (!homeDir) {
142
+ const { resolvePreferredHomeDir } = require('../utils/home-dir');
143
+ homeDir = typeof resolvePreferredHomeDir === 'function'
144
+ ? resolvePreferredHomeDir(process.platform, process.env, require('os').homedir())
145
+ : '';
146
+ }
147
+ return JSON.stringify({
148
+ homeDir,
149
+ native,
150
+ state,
151
+ env: Object.fromEntries(PATH_CONTEXT_ENV_KEYS.map(key => [key, process.env[key] || '']))
152
+ });
153
+ } catch {
154
+ return '';
155
+ }
156
+ }
157
+
158
+ function configureDefaultDependencies(dependencies = {}) {
159
+ if (!dependencies || typeof dependencies !== 'object' || Array.isArray(dependencies)) {
160
+ throw new TypeError('Platform default dependencies must be an object');
161
+ }
162
+ defaultDependencies = Object.freeze({ ...dependencies });
163
+ return getDefaultDependencies();
164
+ }
165
+
166
+ function createPlatformRuntime({ registry, driverRegistry, dependencies = {} } = {}) {
167
+ const resolvedDependencies = { ...dependencies };
168
+ const resolvedRegistry = registry || createPlatformRegistry();
169
+ const defaultPathContextCache = new Map();
170
+ const runtime = {
171
+ getDriver(platform, capability, context = {}) {
172
+ const driverId = resolvedRegistry.getCapability(platform, capability);
173
+ if (!driverId) return null;
174
+ if (!driverRegistry || typeof driverRegistry.create !== 'function') return null;
175
+ const rawManifest = typeof resolvedRegistry.resolve === 'function' ? resolvedRegistry.resolve(platform) : null;
176
+ const pathOptions = context.pathResolver || context.pathResolverOptions || resolvedDependencies.pathResolver || resolvedDependencies.pathResolverOptions || {};
177
+ let pathContext = null;
178
+ let resolvedPaths = null;
179
+ if (rawManifest) {
180
+ const cacheKey = String(platform || '').trim().toLowerCase();
181
+ const useCache = canReuseDefaultPathContext(pathOptions);
182
+ const cached = useCache ? defaultPathContextCache.get(cacheKey) : null;
183
+ const pathContextFingerprint = useCache
184
+ ? getDefaultPathContextFingerprint(cacheKey, rawManifest)
185
+ : '';
186
+ if (cached && cached.fingerprint === pathContextFingerprint) {
187
+ ({ pathContext, resolvedPaths } = cached);
188
+ } else {
189
+ if (typeof resolvedRegistry.resolvePathContext === 'function') {
190
+ pathContext = resolvedRegistry.resolvePathContext(platform, pathOptions);
191
+ resolvedPaths = pathContext && pathContext.paths;
192
+ } else if (typeof resolvedRegistry.resolvePaths === 'function') {
193
+ resolvedPaths = resolvedRegistry.resolvePaths(platform, pathOptions);
194
+ pathContext = createPlatformPathContext({
195
+ key: platform,
196
+ manifest: rawManifest,
197
+ resolvedPaths,
198
+ pathOptions
199
+ });
200
+ }
201
+ if (useCache && (pathContext || resolvedPaths)) {
202
+ defaultPathContextCache.set(cacheKey, {
203
+ pathContext,
204
+ resolvedPaths,
205
+ fingerprint: pathContextFingerprint
206
+ });
207
+ }
208
+ }
209
+ }
210
+ const manifest = isLegacyDriverId(driverId)
211
+ ? rawManifest
212
+ : buildResolvedManifest(rawManifest, resolvedPaths, pathOptions, driverId);
213
+ const driverContext = {
214
+ ...resolvedDependencies,
215
+ platform,
216
+ capability,
217
+ manifest,
218
+ pathContext,
219
+ paths: pathContext ? pathContext.native : resolvedPaths,
220
+ context,
221
+ dependencies: resolvedDependencies
222
+ };
223
+ Object.defineProperty(driverContext, 'runtime', { value: runtime });
224
+ return driverRegistry.create(driverId, driverContext);
225
+ },
226
+ invoke(platform, capability, operation, args = []) {
227
+ const driver = runtime.getDriver(platform, capability);
228
+ if (!driver || typeof driver[operation] !== 'function') {
229
+ throw new Error(`Unsupported platform capability operation: ${platform}.${capability}.${operation}`);
230
+ }
231
+ return driver[operation](...args);
232
+ }
233
+ };
234
+ return runtime;
235
+ }
236
+
237
+ function getPlatformRegistry() {
238
+ if (!platformRegistry) platformRegistry = createPlatformRegistry();
239
+ return platformRegistry;
240
+ }
241
+
242
+ function getPlatformRuntime() {
243
+ if (!platformRuntime) {
244
+ platformRuntime = createPlatformRuntime({
245
+ registry: getPlatformRegistry(),
246
+ driverRegistry: getDefaultDriverRegistry(),
247
+ dependencies: getDefaultDependencies()
248
+ });
249
+ }
250
+ return platformRuntime;
251
+ }
252
+
253
+ module.exports = {
254
+ configureDefaultDependencies,
255
+ createPlatformRuntime,
256
+ getPlatformRegistry,
257
+ getPlatformRuntime,
258
+ getDefaultDependencies
259
+ };
@@ -1,8 +1,15 @@
1
1
  'use strict';
2
2
 
3
+ const ADAPTER_PATHS = Object.freeze({
4
+ claude: './drivers/claude/session-history-adapter',
5
+ codex: './drivers/codex/session-history-adapter',
6
+ gemini: './drivers/gemini/session-history-adapter',
7
+ omp: './drivers/omp/session-history-adapter'
8
+ });
9
+
3
10
  function optionalAdapter(name) {
4
11
  try {
5
- return require(`./${name}`);
12
+ return require(ADAPTER_PATHS[name]);
6
13
  } catch (_) {
7
14
  return {
8
15
  inventory: async () => [],
@@ -12,7 +12,7 @@ const loadedPlugins = new Map();
12
12
  * @param {string} name - Plugin name
13
13
  * @returns {Object} Result object with success status and optional error
14
14
  */
15
- function loadPlugin(name) {
15
+ function loadPlugin(name, options = {}) {
16
16
  // ERROR ISOLATION: Wrap entire function to prevent CTX crash
17
17
  try {
18
18
  // Check if already loaded
@@ -24,7 +24,7 @@ function loadPlugin(name) {
24
24
  }
25
25
 
26
26
  // Get plugin info from registry
27
- const pluginInfo = getPlugin(name);
27
+ const pluginInfo = options.pluginInfo || getPlugin(name);
28
28
  if (!pluginInfo) {
29
29
  return {
30
30
  success: false,
@@ -36,8 +36,8 @@ function initializePlugins(options = {}) {
36
36
  .sort((a, b) => (a[1].loadOrder || 10) - (b[1].loadOrder || 10));
37
37
 
38
38
  // Load each enabled plugin
39
- for (const [name] of sortedPlugins) {
40
- const result = loadPlugin(name);
39
+ for (const [name, pluginInfo] of sortedPlugins) {
40
+ const result = loadPlugin(name, { pluginInfo });
41
41
 
42
42
  if (result.success) {
43
43
  loadedCount++;
@@ -2,6 +2,20 @@ const fs = require('fs');
2
2
  const path = require('path');
3
3
  const { PLUGINS_DIR, REGISTRY_FILE } = require('./constants');
4
4
 
5
+ let registryCache = null;
6
+
7
+ function getRegistryMtime() {
8
+ try {
9
+ return fs.statSync(REGISTRY_FILE).mtimeMs;
10
+ } catch {
11
+ return null;
12
+ }
13
+ }
14
+ function cacheRegistry(data) {
15
+ registryCache = { data, mtimeMs: getRegistryMtime() };
16
+ return data;
17
+ }
18
+
5
19
  /**
6
20
  * Ensure plugins directory exists
7
21
  */
@@ -19,24 +33,26 @@ function loadRegistry() {
19
33
  ensurePluginsDir();
20
34
 
21
35
  if (!fs.existsSync(REGISTRY_FILE)) {
22
- const emptyRegistry = { plugins: {} };
23
- fs.writeFileSync(REGISTRY_FILE, JSON.stringify(emptyRegistry, null, 2), 'utf8');
24
- return emptyRegistry;
36
+ const data = { plugins: {} };
37
+ saveRegistry(data);
38
+ return data;
39
+ }
40
+
41
+ const mtimeMs = getRegistryMtime();
42
+ if (registryCache && registryCache.mtimeMs === mtimeMs) {
43
+ return registryCache.data;
25
44
  }
26
45
 
27
46
  try {
28
47
  const content = fs.readFileSync(REGISTRY_FILE, 'utf8');
29
48
  const data = JSON.parse(content);
30
-
31
- // Ensure plugins key exists
32
- if (!data.plugins) {
33
- data.plugins = {};
34
- }
35
-
49
+ if (!data.plugins) data.plugins = {};
50
+ registryCache = { data, mtimeMs };
36
51
  return data;
37
52
  } catch (error) {
38
53
  console.error('Failed to load registry:', error.message);
39
- return { plugins: {} };
54
+ registryCache = { data: { plugins: {} }, mtimeMs };
55
+ return registryCache.data;
40
56
  }
41
57
  }
42
58
 
@@ -49,6 +65,7 @@ function saveRegistry(data) {
49
65
 
50
66
  try {
51
67
  fs.writeFileSync(REGISTRY_FILE, JSON.stringify(data, null, 2), 'utf8');
68
+ cacheRegistry(data);
52
69
  } catch (error) {
53
70
  throw new Error(`Failed to save registry: ${error.message}`);
54
71
  }
@@ -1,6 +1,7 @@
1
1
  const fs = require('fs');
2
2
  const { PATHS, NATIVE_PATHS, ensureStorageDirMigrated } = require('./config/paths');
3
3
  const { isWindowsLikePlatform } = require('./utils/home-dir');
4
+ const { getPlatformContext } = require('./server/platform-context');
4
5
 
5
6
  function buildEchoCommand(value) {
6
7
  if (isWindowsLikePlatform(process.platform, process.env)) {
@@ -14,10 +15,25 @@ async function resetConfig() {
14
15
  console.log('\n开始恢复默认配置...\n');
15
16
  ensureStorageDirMigrated();
16
17
 
18
+ let claudeNativePaths = NATIVE_PATHS.claude;
19
+ let claudeStatePaths = {
20
+ activeChannel: PATHS.activeChannel.claude,
21
+ channels: PATHS.channels.claude
22
+ };
23
+ try {
24
+ const pathContext = getPlatformContext().registry.resolvePathContext('claude');
25
+ if (pathContext?.customized) {
26
+ claudeNativePaths = { ...claudeNativePaths, ...(pathContext.native || {}) };
27
+ claudeStatePaths = { ...claudeStatePaths, ...(pathContext.state || {}) };
28
+ }
29
+ } catch (_) {
30
+ // Keep legacy defaults when reset is invoked without a usable registry.
31
+ }
32
+
17
33
  try {
18
34
  // 1. 尝试停止代理服务器(如果正在运行)
19
35
  try {
20
- const { stopProxyServer, getProxyStatus } = require('./server/proxy-server');
36
+ const { stopProxyServer, getProxyStatus } = require('./platforms/drivers/claude/proxy-implementation');
21
37
  const status = getProxyStatus();
22
38
 
23
39
  if (status.running) {
@@ -31,8 +47,8 @@ async function resetConfig() {
31
47
  }
32
48
 
33
49
  // 2. 检查并恢复 settings.json
34
- const settingsPath = NATIVE_PATHS.claude.settings;
35
- const backupPath = NATIVE_PATHS.claude.settingsBackup;
50
+ const settingsPath = claudeNativePaths.settings;
51
+ const backupPath = claudeNativePaths.settingsBackup;
36
52
 
37
53
  if (fs.existsSync(backupPath)) {
38
54
  console.log('发现备份文件,正在恢复...');
@@ -50,10 +66,10 @@ async function resetConfig() {
50
66
  console.log('检测到代理配置,尝试恢复到正常渠道...');
51
67
 
52
68
  // 读取激活的渠道
53
- const activeChannelPath = PATHS.activeChannel.claude;
69
+ const activeChannelPath = claudeStatePaths.activeChannel;
54
70
  if (fs.existsSync(activeChannelPath)) {
55
71
  const activeChannelData = JSON.parse(fs.readFileSync(activeChannelPath, 'utf8'));
56
- const channelsPath = PATHS.channels.claude;
72
+ const channelsPath = claudeStatePaths.channels;
57
73
 
58
74
  if (fs.existsSync(channelsPath)) {
59
75
  const channelsData = JSON.parse(fs.readFileSync(channelsPath, 'utf8'));