coding-tool-x 3.8.3 → 3.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +86 -15
  3. package/dist/web/assets/AgentsDrawer-BG6P3DX-.js +1 -0
  4. package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +1 -0
  5. package/dist/web/assets/Analytics--z_FmL5P.js +1 -0
  6. package/dist/web/assets/Analytics-CyHhR126.css +1 -0
  7. package/dist/web/assets/AssetPathField-CrJtRKHy.js +1 -0
  8. package/dist/web/assets/ChatHistoryDrawer-B2qBQs9L.css +1 -0
  9. package/dist/web/assets/ChatHistoryDrawer-BiuEryJj.js +1 -0
  10. package/dist/web/assets/CollapseItem-BAYEsL_Q.js +1 -0
  11. package/dist/web/assets/CommandsDrawer-BZJxlPvV.css +1 -0
  12. package/dist/web/assets/CommandsDrawer-YJ-U7BXN.js +1 -0
  13. package/dist/web/assets/ConfigExportDrawer-Ce_hAknW.js +1 -0
  14. package/dist/web/assets/ConfigExportDrawer-dwruRKWr.css +1 -0
  15. package/dist/web/assets/ConfigTemplates-Bvr1NN6K.js +1 -0
  16. package/dist/web/assets/ConfigTemplatesDrawer-BfDi8yO3.css +1 -0
  17. package/dist/web/assets/ConfigTemplatesDrawer-BjIeHfF-.js +1 -0
  18. package/dist/web/assets/ConfigTemplatesPanel-AV00tm_D.js +1 -0
  19. package/dist/web/assets/ConfigTemplatesPanel-CWyPtk67.css +1 -0
  20. package/dist/web/assets/Divider-D28g1gwj.js +1 -0
  21. package/dist/web/assets/DrawerContent-ChXgZ1Xm.js +1 -0
  22. package/dist/web/assets/FavoritesDrawer-CG9eI9Ay.css +1 -0
  23. package/dist/web/assets/FavoritesDrawer-Cz95o4CD.js +1 -0
  24. package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +1 -0
  25. package/dist/web/assets/GatewayConvertDrawer-DLlbMz27.js +1 -0
  26. package/dist/web/assets/Home-CSuFuJ9Y.css +1 -0
  27. package/dist/web/assets/Home-D7CCOFQC.js +1 -0
  28. package/dist/web/assets/MarkdownEditor-qfVgSre_.css +1 -0
  29. package/dist/web/assets/MarkdownEditor-rEZ-c72L.js +1 -0
  30. package/dist/web/assets/McpDrawer-C0dnsZhQ.css +1 -0
  31. package/dist/web/assets/McpDrawer-DfoCyxU2.js +1 -0
  32. package/dist/web/assets/McpFormDrawer-BRbDcawn.css +1 -0
  33. package/dist/web/assets/McpFormDrawer-SKu8HNUR.js +1 -0
  34. package/dist/web/assets/PluginManager-BbeK-3rV.js +1 -0
  35. package/dist/web/assets/PluginsDrawer-CWVJ7yjS.js +1 -0
  36. package/dist/web/assets/PluginsDrawer-DM3QjprE.css +1 -0
  37. package/dist/web/assets/PluginsPanel-Cm2N3StG.js +1 -0
  38. package/dist/web/assets/PluginsPanel-D6ZqITcR.css +1 -0
  39. package/dist/web/assets/ProjectList-677RLZ8O.css +1 -0
  40. package/dist/web/assets/ProjectList-CsjnsNPv.js +1 -0
  41. package/dist/web/assets/PromptsDrawer-BIgiYCEQ.css +1 -0
  42. package/dist/web/assets/PromptsDrawer-EGd3djFa.js +1 -0
  43. package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +1 -0
  44. package/dist/web/assets/RecentSessionsDrawer-D1vtoLAs.js +1 -0
  45. package/dist/web/assets/SessionCard-BgLg49U3.js +1 -0
  46. package/dist/web/assets/SessionCard-aM2NHu6i.css +1 -0
  47. package/dist/web/assets/SessionList-BpYRz1cX.css +1 -0
  48. package/dist/web/assets/SessionList-TRiTklWk.js +1 -0
  49. package/dist/web/assets/SettingsDrawer-d5liXjHq.css +1 -0
  50. package/dist/web/assets/SettingsDrawer-rz2WejGY.js +1 -0
  51. package/dist/web/assets/SkillManager-BTjTUbHq.js +1 -0
  52. package/dist/web/assets/SkillManager-C0GCT2Kb.css +1 -0
  53. package/dist/web/assets/SkillsDrawer-BCNme-aJ.css +1 -0
  54. package/dist/web/assets/SkillsDrawer-pN0hbkK3.js +1 -0
  55. package/dist/web/assets/SkillsPanel-B3Nm5j32.css +1 -0
  56. package/dist/web/assets/SkillsPanel-gmBWEoiF.js +1 -0
  57. package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +1 -0
  58. package/dist/web/assets/SpeedTestDrawer-DcNzuVJk.js +1 -0
  59. package/dist/web/assets/Upload-v5rV0qTT.js +1 -0
  60. package/dist/web/assets/WorkspaceDrawer-CGnMu9p1.css +1 -0
  61. package/dist/web/assets/WorkspaceDrawer-DxmicM4U.js +1 -0
  62. package/dist/web/assets/WorkspaceManager-CJHCjARN.js +1 -0
  63. package/dist/web/assets/WorkspacePanel-D0-zHTHP.css +1 -0
  64. package/dist/web/assets/WorkspacePanel-D8_Zq-du.js +1 -0
  65. package/dist/web/assets/_plugin-vue_export-helper-BeLZJZij.js +1 -0
  66. package/dist/web/assets/client-UDwXBP9i.js +1 -0
  67. package/dist/web/assets/clipboard-B46yyoz_.js +1 -0
  68. package/dist/web/assets/headers-cf-QapUq.js +1 -0
  69. package/dist/web/assets/icons-B2Vg-IOC.js +1 -0
  70. package/dist/web/assets/index-C0EHRym0.css +1 -0
  71. package/dist/web/assets/index-DnEocV0M.js +2 -0
  72. package/dist/web/assets/light-Cp0t7v32.js +1 -0
  73. package/dist/web/assets/markdown-u082bbtj.js +1 -0
  74. package/dist/web/assets/platforms-CBkB45JP.js +1 -0
  75. package/dist/web/assets/platforms-FTpjxAT6.js +1 -0
  76. package/dist/web/assets/project-config-B2baPzYL.js +1 -0
  77. package/dist/web/assets/sessions-Cmy31slD.js +1 -0
  78. package/dist/web/assets/sessions-yC_oVVh8.js +1 -0
  79. package/dist/web/assets/skill-repo-input-B_fkGlUK.js +1 -0
  80. package/dist/web/assets/use-lock-html-scroll-DXIqmUW4.js +1 -0
  81. package/dist/web/assets/use-message-DoLM8C1C.js +1 -0
  82. package/dist/web/assets/useResponsiveDrawer-B3uojyvV.js +1 -0
  83. package/dist/web/assets/vendors-D0c_0KLP.js +1 -0
  84. package/dist/web/assets/vue-vendor-BqZbbXHA.js +1 -0
  85. package/dist/web/assets/workspaces-mjyPVGS8.js +1 -0
  86. package/dist/web/assets/xml-CgY3RMlX.js +1 -0
  87. package/dist/web/index.html +12 -8
  88. package/docs/native-log-memory-2026-09-16.md +43 -0
  89. package/docs/superpowers/plans/2026-08-26-configuration-driven-cli-platform.md +1578 -0
  90. package/docs/superpowers/plans/2026-08-30-project-scoped-config-control.md +1260 -0
  91. package/docs/superpowers/plans/2026-09-01-omp-skill-refresh-boundary.md +213 -0
  92. package/docs/superpowers/plans/2026-09-01-realtime-logs-panel.md +125 -0
  93. package/docs/superpowers/plans/2026-09-02-config-driven-platform-boundary.md +86 -0
  94. package/docs/superpowers/plans/2026-09-02-platform-implementation-drivers.md +508 -0
  95. package/docs/superpowers/plans/2026-09-03-cli-platform-correctness-boundary.md +760 -0
  96. package/docs/superpowers/plans/2026-09-03-dependency-security-remediation.md +133 -0
  97. package/docs/superpowers/plans/2026-09-04-model-catalog-pricing-sync.md +1078 -0
  98. package/docs/superpowers/plans/2026-09-05-codex-project-scan-500.md +128 -0
  99. package/docs/superpowers/plans/2026-09-06-project-skill-path-fix.md +97 -0
  100. package/docs/superpowers/specs/2026-08-26-configuration-driven-cli-platform-design.md +408 -0
  101. package/docs/superpowers/specs/2026-08-30-project-scoped-config-control-design.md +467 -0
  102. package/docs/superpowers/specs/2026-09-01-claude-session-content-repair-design.md +111 -0
  103. package/docs/superpowers/specs/2026-09-01-omp-skill-refresh-boundary-design.md +83 -0
  104. package/docs/superpowers/specs/2026-09-01-realtime-logs-panel-design.md +27 -0
  105. package/docs/superpowers/specs/2026-09-02-config-driven-platform-boundary-design.md +64 -0
  106. package/docs/superpowers/specs/2026-09-02-platform-implementation-driver-boundary-design.md +123 -0
  107. package/docs/superpowers/specs/2026-09-03-cli-platform-correctness-boundary-design.md +249 -0
  108. package/docs/superpowers/specs/2026-09-03-dependency-security-remediation-design.md +87 -0
  109. package/docs/superpowers/specs/2026-09-04-model-catalog-pricing-sync-design.md +301 -0
  110. package/docs/superpowers/specs/2026-09-05-codex-project-scan-500-design.md +24 -0
  111. package/package.json +13 -8
  112. package/src/commands/channels.js +88 -191
  113. package/src/commands/cli-type.js +19 -11
  114. package/src/commands/daemon.js +94 -32
  115. package/src/commands/doctor.js +16 -9
  116. package/src/commands/export-config.js +23 -5
  117. package/src/commands/list.js +130 -52
  118. package/src/commands/logs.js +44 -27
  119. package/src/commands/platform-command-registry.js +78 -0
  120. package/src/commands/plugin.js +11 -5
  121. package/src/commands/port-config.js +34 -52
  122. package/src/commands/proxy-control.js +207 -145
  123. package/src/commands/proxy.js +2 -2
  124. package/src/commands/resume.js +87 -91
  125. package/src/commands/search.js +137 -67
  126. package/src/commands/stats.js +30 -22
  127. package/src/commands/switch.js +1 -1
  128. package/src/commands/toggle-proxy.js +94 -111
  129. package/src/commands/ui.js +67 -6
  130. package/src/commands/workspace.js +90 -8
  131. package/src/config/default.js +6 -53
  132. package/src/config/loader.js +61 -24
  133. package/src/config/model-metadata.js +49 -59
  134. package/src/config/model-metadata.json +4095 -99
  135. package/src/config/paths.js +181 -8
  136. package/src/index.js +134 -71
  137. package/src/platforms/access.js +196 -0
  138. package/src/{server/services → platforms}/agents-service.js +354 -197
  139. package/src/platforms/channel-auth-registry.js +162 -0
  140. package/src/platforms/channel-auth-service.js +82 -0
  141. package/src/{server/services → platforms}/commands-service.js +195 -115
  142. package/src/platforms/driver-registry.js +59 -0
  143. package/src/platforms/drivers/claude/api-operations.js +62 -0
  144. package/src/{server/services/channels.js → platforms/drivers/claude/channels-implementation.js} +131 -33
  145. package/src/platforms/drivers/claude/channels.js +39 -0
  146. package/src/{server/services/config-sync-service.js → platforms/drivers/claude/config-sync.js} +29 -5
  147. package/src/{server/services → platforms/drivers/claude}/health-check.js +4 -4
  148. package/src/platforms/drivers/claude/health.js +22 -0
  149. package/src/platforms/drivers/claude/mcp.js +9 -0
  150. package/src/{server/services/settings-manager.js → platforms/drivers/claude/native-config-implementation.js} +13 -4
  151. package/src/platforms/drivers/claude/native-config.js +46 -0
  152. package/src/platforms/drivers/claude/native-logs.js +72 -0
  153. package/src/{server/services/claude-openai-gateway.js → platforms/drivers/claude/openai-gateway.js} +8 -65
  154. package/src/platforms/drivers/claude/project-config.js +21 -0
  155. package/src/platforms/drivers/claude/projects.js +62 -0
  156. package/src/platforms/drivers/claude/prompts.js +9 -0
  157. package/src/{server/proxy-server.js → platforms/drivers/claude/proxy-implementation.js} +41 -278
  158. package/src/platforms/drivers/claude/proxy.js +16 -0
  159. package/src/platforms/drivers/claude/resource-sync.js +9 -0
  160. package/src/platforms/drivers/claude/session-history-adapter.js +313 -0
  161. package/src/{server/services/sessions.js → platforms/drivers/claude/sessions-implementation.js} +145 -35
  162. package/src/platforms/drivers/claude/sessions.js +76 -0
  163. package/src/{server/services/claude-statistics-service.js → platforms/drivers/claude/statistics-implementation.js} +2 -2
  164. package/src/platforms/drivers/claude/statistics.js +16 -0
  165. package/src/{server/services/claude-wire.js → platforms/drivers/claude/wire.js} +1 -1
  166. package/src/platforms/drivers/codex/api-operations.js +9 -0
  167. package/src/{server/services/codex-channels.js → platforms/drivers/codex/channels-implementation.js} +149 -14
  168. package/src/platforms/drivers/codex/channels.js +45 -0
  169. package/src/{server/services/codex-config.js → platforms/drivers/codex/config.js} +12 -2
  170. package/src/{server/services/codex-env-manager.js → platforms/drivers/codex/env-manager.js} +1 -1
  171. package/src/platforms/drivers/codex/mcp.js +9 -0
  172. package/src/{server/services/codex-settings-manager.js → platforms/drivers/codex/native-config-implementation.js} +15 -6
  173. package/src/platforms/drivers/codex/native-config.js +47 -0
  174. package/src/platforms/drivers/codex/native-logs.js +166 -0
  175. package/src/platforms/drivers/codex/project-config.js +21 -0
  176. package/src/platforms/drivers/codex/projects.js +26 -0
  177. package/src/platforms/drivers/codex/prompts.js +9 -0
  178. package/src/{server/codex-proxy-server.js → platforms/drivers/codex/proxy-implementation.js} +30 -233
  179. package/src/platforms/drivers/codex/proxy.js +16 -0
  180. package/src/platforms/drivers/codex/resource-sync.js +9 -0
  181. package/src/{server/services/session-history-adapters/codex.js → platforms/drivers/codex/session-history-adapter.js} +37 -23
  182. package/src/{server/services/codex-sessions.js → platforms/drivers/codex/sessions-implementation.js} +81 -75
  183. package/src/platforms/drivers/codex/sessions.js +36 -0
  184. package/src/{server/services/codex-statistics-service.js → platforms/drivers/codex/statistics-implementation.js} +2 -2
  185. package/src/platforms/drivers/codex/statistics.js +16 -0
  186. package/src/platforms/drivers/gemini/api-operations.js +9 -0
  187. package/src/{server/services/gemini-channels.js → platforms/drivers/gemini/channels-implementation.js} +202 -37
  188. package/src/platforms/drivers/gemini/channels.js +39 -0
  189. package/src/{server/services/gemini-config.js → platforms/drivers/gemini/config.js} +12 -2
  190. package/src/platforms/drivers/gemini/mcp.js +9 -0
  191. package/src/{server/services/gemini-settings-manager.js → platforms/drivers/gemini/native-config-implementation.js} +14 -5
  192. package/src/platforms/drivers/gemini/native-config.js +39 -0
  193. package/src/platforms/drivers/gemini/native-logs.js +180 -0
  194. package/src/platforms/drivers/gemini/project-config.js +21 -0
  195. package/src/platforms/drivers/gemini/projects.js +26 -0
  196. package/src/platforms/drivers/gemini/prompts.js +9 -0
  197. package/src/{server/gemini-proxy-server.js → platforms/drivers/gemini/proxy-implementation.js} +36 -267
  198. package/src/platforms/drivers/gemini/proxy.js +16 -0
  199. package/src/platforms/drivers/gemini/resource-sync.js +9 -0
  200. package/src/{server/services/session-history-adapters/gemini.js → platforms/drivers/gemini/session-history-adapter.js} +70 -18
  201. package/src/{server/services/gemini-sessions.js → platforms/drivers/gemini/sessions-implementation.js} +53 -37
  202. package/src/platforms/drivers/gemini/sessions.js +47 -0
  203. package/src/{server/services/gemini-statistics-service.js → platforms/drivers/gemini/statistics-implementation.js} +2 -2
  204. package/src/platforms/drivers/gemini/statistics.js +16 -0
  205. package/src/{server/services/gemini-wire.js → platforms/drivers/gemini/wire.js} +1 -1
  206. package/src/platforms/drivers/generic-filesystem.js +166 -0
  207. package/src/platforms/drivers/generic-jsonl.js +141 -0
  208. package/src/platforms/drivers/generic-mcp.js +44 -0
  209. package/src/platforms/drivers/generic-openai-compatible.js +45 -0
  210. package/src/platforms/drivers/generic-prompt.js +41 -0
  211. package/src/platforms/drivers/legacy.js +677 -0
  212. package/src/platforms/drivers/native-config-snapshot.js +125 -0
  213. package/src/platforms/drivers/native-log-utils.js +1292 -0
  214. package/src/platforms/drivers/notification-hooks.js +578 -0
  215. package/src/{server/api/omp-config.js → platforms/drivers/omp/api-operations.js} +52 -64
  216. package/src/{server/services/omp-auth-provider-worker.js → platforms/drivers/omp/auth-provider-worker.js} +1 -1
  217. package/src/{server/services/omp-auth-providers.js → platforms/drivers/omp/auth-providers.js} +1 -1
  218. package/src/{server/services/omp-channels.js → platforms/drivers/omp/channels-implementation.js} +166 -39
  219. package/src/platforms/drivers/omp/channels.js +58 -0
  220. package/src/{server/services/omp-config.js → platforms/drivers/omp/config.js} +53 -13
  221. package/src/{server/services/omp-gateway-routing.js → platforms/drivers/omp/gateway-routing.js} +14 -7
  222. package/src/{server/services/omp-gateway.js → platforms/drivers/omp/gateway.js} +4 -262
  223. package/src/platforms/drivers/omp/mcp.js +9 -0
  224. package/src/{server/services/omp-settings-manager.js → platforms/drivers/omp/native-config-implementation.js} +75 -10
  225. package/src/platforms/drivers/omp/native-config.js +46 -0
  226. package/src/platforms/drivers/omp/native-logs.js +52 -0
  227. package/src/{server/services/omp-native-plugin-adapter.js → platforms/drivers/omp/native-plugin-adapter.js} +91 -4
  228. package/src/platforms/drivers/omp/project-config.js +29 -0
  229. package/src/platforms/drivers/omp/projects.js +20 -0
  230. package/src/platforms/drivers/omp/prompts.js +9 -0
  231. package/src/{server/omp-proxy-server.js → platforms/drivers/omp/proxy-implementation.js} +6 -15
  232. package/src/platforms/drivers/omp/proxy.js +16 -0
  233. package/src/platforms/drivers/omp/resource-sync.js +9 -0
  234. package/src/{server/services/session-history-adapters/omp.js → platforms/drivers/omp/session-history-adapter.js} +42 -18
  235. package/src/{server/services/omp-sessions.js → platforms/drivers/omp/sessions-implementation.js} +130 -94
  236. package/src/platforms/drivers/omp/sessions.js +36 -0
  237. package/src/{server/services/omp-skill-discovery.js → platforms/drivers/omp/skill-discovery.js} +159 -32
  238. package/src/{server/services/omp-skill-settings-service.js → platforms/drivers/omp/skill-settings.js} +1 -1
  239. package/src/{server/services/omp-statistics-service.js → platforms/drivers/omp/statistics-implementation.js} +3 -3
  240. package/src/platforms/drivers/omp/statistics.js +16 -0
  241. package/src/platforms/drivers/opencode/api-operations.js +9 -0
  242. package/src/{server/services/opencode-channels.js → platforms/drivers/opencode/channels-implementation.js} +28 -9
  243. package/src/platforms/drivers/opencode/channels.js +40 -0
  244. package/src/platforms/drivers/opencode/conversion.js +41 -0
  245. package/src/{server/services/opencode-gateway-converter.js → platforms/drivers/opencode/gateway-converter.js} +1 -1
  246. package/src/platforms/drivers/opencode/mcp.js +9 -0
  247. package/src/{server/services/opencode-settings-manager.js → platforms/drivers/opencode/native-config-implementation.js} +17 -6
  248. package/src/platforms/drivers/opencode/native-config.js +26 -0
  249. package/src/platforms/drivers/opencode/native-logs.js +133 -0
  250. package/src/platforms/drivers/opencode/project-config.js +98 -0
  251. package/src/platforms/drivers/opencode/projects.js +20 -0
  252. package/src/platforms/drivers/opencode/prompts.js +9 -0
  253. package/src/{server/opencode-proxy-server.js → platforms/drivers/opencode/proxy-implementation.js} +27 -362
  254. package/src/platforms/drivers/opencode/proxy.js +16 -0
  255. package/src/platforms/drivers/opencode/resource-sync.js +9 -0
  256. package/src/{server/services/opencode-sessions.js → platforms/drivers/opencode/sessions-implementation.js} +211 -64
  257. package/src/platforms/drivers/opencode/sessions.js +48 -0
  258. package/src/{server/services/opencode-statistics-service.js → platforms/drivers/opencode/statistics-implementation.js} +2 -2
  259. package/src/platforms/drivers/opencode/statistics.js +16 -0
  260. package/src/platforms/drivers/secure-file-driver.js +272 -0
  261. package/src/platforms/drivers/unsupported.js +7 -0
  262. package/src/platforms/manifest-schema.js +398 -0
  263. package/src/platforms/manifests/claude.json +489 -0
  264. package/src/platforms/manifests/codex.json +448 -0
  265. package/src/platforms/manifests/gemini.json +447 -0
  266. package/src/platforms/manifests/omp.json +496 -0
  267. package/src/platforms/manifests/opencode.json +422 -0
  268. package/src/{server/services → platforms}/native-oauth-adapters.js +87 -417
  269. package/src/{server/services → platforms}/notification-hooks.js +140 -1023
  270. package/src/platforms/oauth-credentials-service.js +506 -0
  271. package/src/platforms/path-resolver.js +179 -0
  272. package/src/platforms/platform-path-context.js +305 -0
  273. package/src/platforms/registry.js +248 -0
  274. package/src/platforms/remote-notification-providers.js +678 -0
  275. package/src/platforms/runtime.js +259 -0
  276. package/src/{server/services/session-history-adapters/index.js → platforms/session-history-adapters.js} +8 -1
  277. package/src/plugins/plugin-loader.js +2 -2
  278. package/src/plugins/plugin-manager.js +2 -2
  279. package/src/plugins/registry.js +27 -10
  280. package/src/reset-config.js +21 -5
  281. package/src/server/api/agents.js +46 -72
  282. package/src/server/api/commands.js +16 -6
  283. package/src/server/api/config-registry.js +206 -59
  284. package/src/server/api/config-sync.js +3 -2
  285. package/src/server/api/config-templates.js +20 -4
  286. package/src/server/api/config.js +111 -102
  287. package/src/server/api/convert.js +54 -178
  288. package/src/server/api/dashboard.js +168 -102
  289. package/src/server/api/hooks.js +1 -1
  290. package/src/server/api/mcp.js +224 -84
  291. package/src/server/api/platform-api-config.js +102 -0
  292. package/src/server/api/platform-route-factory.js +215 -0
  293. package/src/server/api/platform-routes.js +26 -0
  294. package/src/server/api/platforms.js +110 -0
  295. package/src/server/api/plugins.js +57 -57
  296. package/src/server/api/project-config.js +168 -0
  297. package/src/server/api/prompts.js +58 -45
  298. package/src/server/api/settings.js +55 -8
  299. package/src/server/api/skills.js +262 -133
  300. package/src/server/api/ui-config.js +2 -2
  301. package/src/server/api/validation-errors.js +18 -4
  302. package/src/server/api/workspaces.js +47 -12
  303. package/src/server/index.js +164 -213
  304. package/src/server/platform-context.js +81 -0
  305. package/src/server/services/channel-balance.js +11 -20
  306. package/src/server/services/channel-health.js +21 -6
  307. package/src/server/services/channel-scheduler.js +29 -39
  308. package/src/server/services/channel-sync-utils.js +23 -13
  309. package/src/server/services/config-export-service.js +350 -319
  310. package/src/server/services/config-registry-service.js +280 -54
  311. package/src/server/services/config-sync-manager.js +172 -944
  312. package/src/server/services/config-templates-service.js +419 -353
  313. package/src/server/services/control-manifest-store.js +206 -0
  314. package/src/server/services/dashboard-snapshot-worker.js +656 -100
  315. package/src/server/services/effective-control-service.js +557 -0
  316. package/src/server/services/local-resource-index.js +314 -0
  317. package/src/server/services/mcp-service.js +607 -977
  318. package/src/server/services/model-detector.js +15 -10
  319. package/src/server/services/native-log-channel-resolver.js +214 -0
  320. package/src/server/services/native-log-observer.js +291 -0
  321. package/src/server/services/network-access.js +1 -1
  322. package/src/server/services/platform-catalog.js +82 -0
  323. package/src/server/services/platform-resolution.js +32 -29
  324. package/src/server/services/plugins-service.js +376 -122
  325. package/src/server/services/project-config-service.js +550 -0
  326. package/src/server/services/project-path-validation.js +31 -0
  327. package/src/server/services/prompts-service.js +267 -233
  328. package/src/server/services/proxy-runtime.js +7 -4
  329. package/src/server/services/remote-credential-cache.js +43 -0
  330. package/src/server/services/repo-scanner-base.js +182 -75
  331. package/src/server/services/request-logger.js +7 -4
  332. package/src/server/services/session-history-index.js +780 -213
  333. package/src/server/services/session-history-worker.js +228 -33
  334. package/src/server/services/session-snapshot-worker.js +124 -34
  335. package/src/server/services/session-snapshots.js +4 -2
  336. package/src/server/services/skill-artifact-store.js +355 -0
  337. package/src/server/services/skill-format-adapters.js +65 -0
  338. package/src/server/services/skill-projection-service.js +323 -0
  339. package/src/server/services/skill-refresh-task-service.js +275 -0
  340. package/src/server/services/skill-service.js +2020 -677
  341. package/src/server/services/snapshot-cache.js +30 -8
  342. package/src/server/services/speed-test.js +8 -8
  343. package/src/server/services/sqlite-connection.js +19 -3
  344. package/src/server/services/statistics-service.js +240 -57
  345. package/src/server/services/ui-config.js +107 -76
  346. package/src/server/services/usage-log-utils.js +98 -0
  347. package/src/server/services/web-build.js +1 -1
  348. package/src/server/services/workspace-service.js +59 -29
  349. package/src/server/utils/pricing.js +10 -19
  350. package/src/server/websocket-server.js +153 -28
  351. package/src/{server/services/base → shared}/base-channel-service.js +156 -28
  352. package/src/shared/capability-driver.js +104 -0
  353. package/src/shared/channel-auth-policy.js +27 -0
  354. package/src/shared/channel-driver.js +161 -0
  355. package/src/shared/driver-factories/api.js +180 -0
  356. package/src/shared/driver-factories/mcp.js +244 -0
  357. package/src/shared/driver-factories/projects.js +121 -0
  358. package/src/shared/driver-factories/prompts.js +58 -0
  359. package/src/shared/driver-factories/resource-sync.js +375 -0
  360. package/src/shared/driver-result.js +78 -0
  361. package/src/shared/mcp-format.js +189 -0
  362. package/src/shared/platforms.js +104 -167
  363. package/src/shared/project-config.js +512 -0
  364. package/src/shared/proxy-driver.js +57 -0
  365. package/src/{server/services/base → shared}/response-usage-parser.js +8 -4
  366. package/src/ui/menu.js +91 -67
  367. package/src/utils/port-helper.js +35 -19
  368. package/src/utils/session.js +1 -1
  369. package/dist/web/assets/Analytics-COEUXmd4.js +0 -25
  370. package/dist/web/assets/Analytics-RNn1BUbG.css +0 -1
  371. package/dist/web/assets/ConfigTemplates-DLLkS53H.js +0 -1
  372. package/dist/web/assets/Home-DCEyLzwX.js +0 -1
  373. package/dist/web/assets/Home-DYVy4cGZ.css +0 -1
  374. package/dist/web/assets/PluginManager-Oe1ZHoMO.js +0 -1
  375. package/dist/web/assets/ProjectList-CWjuAFof.js +0 -1
  376. package/dist/web/assets/ProjectList-VeMNXfgO.css +0 -1
  377. package/dist/web/assets/SessionList-C4chCPxK.css +0 -1
  378. package/dist/web/assets/SessionList-v3ehGg9U.js +0 -1
  379. package/dist/web/assets/SkillManager-BsX8Qpj0.css +0 -1
  380. package/dist/web/assets/SkillManager-DUF_qP5S.js +0 -1
  381. package/dist/web/assets/WorkspaceManager-CjAWBosO.js +0 -1
  382. package/dist/web/assets/icons-nGdSKQn2.js +0 -1
  383. package/dist/web/assets/index-D5hyHPj7.js +0 -2
  384. package/dist/web/assets/index-bJRG3RXH.css +0 -1
  385. package/dist/web/assets/markdown-BNJfEgCA.js +0 -1
  386. package/dist/web/assets/markdown-BfC0goYb.css +0 -10
  387. package/dist/web/assets/naive-ui-BALVpMgd.js +0 -1
  388. package/dist/web/assets/vendors-DQA4Hw9v.js +0 -7
  389. package/dist/web/assets/vue-vendor-B5RqjEjQ.js +0 -45
  390. package/src/config/model-pricing.js +0 -35
  391. package/src/server/api/channels.js +0 -439
  392. package/src/server/api/claude-hooks.js +0 -56
  393. package/src/server/api/claude-statistics.js +0 -57
  394. package/src/server/api/codex-channels.js +0 -491
  395. package/src/server/api/codex-projects.js +0 -117
  396. package/src/server/api/codex-proxy.js +0 -293
  397. package/src/server/api/codex-sessions.js +0 -652
  398. package/src/server/api/codex-statistics.js +0 -57
  399. package/src/server/api/gemini-channels.js +0 -392
  400. package/src/server/api/gemini-projects.js +0 -103
  401. package/src/server/api/gemini-proxy.js +0 -231
  402. package/src/server/api/gemini-sessions.js +0 -550
  403. package/src/server/api/gemini-statistics.js +0 -57
  404. package/src/server/api/health-check.js +0 -31
  405. package/src/server/api/oauth-credentials.js +0 -198
  406. package/src/server/api/omp-channels.js +0 -575
  407. package/src/server/api/omp-projects.js +0 -88
  408. package/src/server/api/omp-proxy.js +0 -125
  409. package/src/server/api/omp-sessions.js +0 -386
  410. package/src/server/api/omp-statistics.js +0 -40
  411. package/src/server/api/opencode-channels.js +0 -471
  412. package/src/server/api/opencode-projects.js +0 -110
  413. package/src/server/api/opencode-proxy.js +0 -354
  414. package/src/server/api/opencode-sessions.js +0 -466
  415. package/src/server/api/opencode-statistics.js +0 -57
  416. package/src/server/api/projects.js +0 -120
  417. package/src/server/api/proxy.js +0 -330
  418. package/src/server/api/sessions.js +0 -810
  419. package/src/server/services/oauth-credentials-service.js +0 -945
  420. package/src/server/services/omp-session-log-observer.js +0 -138
  421. package/src/server/services/opencode-gateway-adapters.js +0 -43
  422. package/src/server/services/project-snapshots.js +0 -59
  423. package/src/server/services/proxy-log-helper.js +0 -298
  424. package/src/server/services/session-cache.js +0 -127
  425. package/src/server/services/session-converter.js +0 -582
  426. package/src/server/services/session-history-adapters/claude.js +0 -235
  427. /package/src/{server/services/claude-token-recovery.js → platforms/drivers/claude/token-recovery.js} +0 -0
  428. /package/src/{server/services/codex-parser.js → platforms/drivers/codex/parser.js} +0 -0
  429. /package/src/{server/services/codex-speed-test-template.json → platforms/drivers/codex/speed-test-template.json} +0 -0
  430. /package/src/{server/services/codex-wire.js → platforms/drivers/codex/wire.js} +0 -0
  431. /package/src/{server/services/omp-auth-gateway-client.js → platforms/drivers/omp/auth-gateway-client.js} +0 -0
  432. /package/src/{server/services/opencode-normalization.js → platforms/drivers/opencode/normalization.js} +0 -0
  433. /package/src/{server/services → shared}/config-artifact-paths.js +0 -0
  434. /package/src/{server/services/base → shared}/proxy-utils.js +0 -0
@@ -5,20 +5,50 @@ const crypto = require('crypto');
5
5
  const { spawnSync } = require('child_process');
6
6
  const toml = require('toml');
7
7
  const tomlStringify = require('@iarna/toml').stringify;
8
- const { NATIVE_PATHS, PATHS } = require('../../config/paths');
9
- const claudeSettingsManager = require('./settings-manager');
10
- const codexSettingsManager = require('./codex-settings-manager');
11
- const geminiSettingsManager = require('./gemini-settings-manager');
12
- const opencodeSettingsManager = require('./opencode-settings-manager');
13
- const { syncCodexUserEnvironment } = require('./codex-env-manager');
14
- const nativeKeychain = require('./native-keychain');
15
- const { maskToken, decodeJwtPayload, removeFileIfExists, sha256 } = require('./oauth-utils');
16
-
17
- const SUPPORTED_TOOLS = ['claude', 'codex', 'gemini', 'opencode', 'omp'];
8
+ const pathsModule = require('../config/paths');
9
+ const DEFAULT_NATIVE_PATHS = pathsModule.NATIVE_PATHS;
10
+ const DEFAULT_PATHS = pathsModule.PATHS;
11
+ let NATIVE_PATHS = DEFAULT_NATIVE_PATHS;
12
+ let PATHS = DEFAULT_PATHS;
13
+ const claudeSettingsManager = require('./drivers/claude/native-config-implementation');
14
+ const codexSettingsManager = require('./drivers/codex/native-config-implementation');
15
+ const geminiSettingsManager = require('./drivers/gemini/native-config-implementation');
16
+ const { syncCodexUserEnvironment } = require('./drivers/codex/env-manager');
17
+ const nativeKeychain = require('../server/services/native-keychain');
18
+ const { maskToken, decodeJwtPayload, removeFileIfExists, sha256 } = require('../server/services/oauth-utils');
19
+
20
+ const SUPPORTED_TOOLS = ['claude', 'codex', 'gemini', 'omp'];
18
21
  const GEMINI_MAIN_ACCOUNT_KEY = 'main-account';
19
22
  const GEMINI_KEYCHAIN_SERVICE = 'gemini-cli-oauth';
20
23
  const CODEX_KEYCHAIN_SERVICE = 'Codex Auth';
21
24
 
25
+ function configure({ pathContext } = {}) {
26
+ if (!pathContext?.customized) {
27
+ NATIVE_PATHS = DEFAULT_NATIVE_PATHS;
28
+ PATHS = DEFAULT_PATHS;
29
+ return;
30
+ }
31
+
32
+ const platform = String(pathContext.platform || '').trim().toLowerCase();
33
+ const native = pathContext.native && typeof pathContext.native === 'object'
34
+ ? pathContext.native
35
+ : {};
36
+ const state = pathContext.state && typeof pathContext.state === 'object'
37
+ ? pathContext.state
38
+ : {};
39
+ NATIVE_PATHS = {
40
+ ...DEFAULT_NATIVE_PATHS,
41
+ ...(platform ? { [platform]: { ...(DEFAULT_NATIVE_PATHS[platform] || {}), ...native } } : {})
42
+ };
43
+ PATHS = {
44
+ ...DEFAULT_PATHS,
45
+ channels: {
46
+ ...(DEFAULT_PATHS.channels || {}),
47
+ ...(platform && state.channels ? { [platform]: state.channels } : {})
48
+ }
49
+ };
50
+ }
51
+
22
52
  function ensureDir(dirPath) {
23
53
  if (!dirPath) return;
24
54
  fs.mkdirSync(dirPath, { recursive: true });
@@ -152,8 +182,37 @@ function clearClaudeOAuth() {
152
182
  settings.env = settings.env || {};
153
183
  delete settings.env.ANTHROPIC_AUTH_TOKEN;
154
184
  delete settings.env.CLAUDE_CODE_OAUTH_TOKEN;
185
+ ensureDir(path.dirname(NATIVE_PATHS.claude.settings));
155
186
  claudeSettingsManager.writeSettings(settings);
156
187
  }
188
+ function clearClaudeChannelConfig() {
189
+ let settings = {};
190
+ try {
191
+ settings = claudeSettingsManager.settingsExists()
192
+ ? claudeSettingsManager.readSettings()
193
+ : {};
194
+ } catch {
195
+ settings = {};
196
+ }
197
+
198
+ settings.env = settings.env || {};
199
+ [
200
+ 'ANTHROPIC_BASE_URL',
201
+ 'ANTHROPIC_API_KEY',
202
+ 'ANTHROPIC_AUTH_TOKEN',
203
+ 'CLAUDE_CODE_OAUTH_TOKEN',
204
+ 'ANTHROPIC_MODEL',
205
+ 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
206
+ 'ANTHROPIC_DEFAULT_SONNET_MODEL',
207
+ 'ANTHROPIC_DEFAULT_OPUS_MODEL'
208
+ ].forEach((key) => {
209
+ delete settings.env[key];
210
+ });
211
+ delete settings.apiKeyHelper;
212
+ ensureDir(path.dirname(NATIVE_PATHS.claude.settings));
213
+ claudeSettingsManager.writeSettings(settings);
214
+ }
215
+
157
216
 
158
217
  function applyClaudeOAuth(credential) {
159
218
  clearClaudeOAuth();
@@ -199,7 +258,7 @@ function applyClaudeOAuth(credential) {
199
258
  }
200
259
 
201
260
  function inspectClaudeState() {
202
- const { getProxyStatus } = require('../proxy-server');
261
+ const { getProxyStatus } = require('./drivers/claude/proxy-implementation');
203
262
  const proxyStatus = getProxyStatus();
204
263
  const nativeOAuth = readClaudeNativeOAuth();
205
264
 
@@ -379,7 +438,7 @@ function applyCodexOAuth(credential) {
379
438
  }
380
439
 
381
440
  function inspectCodexState() {
382
- const { getCodexProxyStatus } = require('../codex-proxy-server');
441
+ const { getCodexProxyStatus } = require('./drivers/codex/proxy-implementation');
383
442
  const proxyStatus = getCodexProxyStatus();
384
443
  const nativeOAuth = readCodexNativeOAuth();
385
444
 
@@ -536,6 +595,7 @@ function clearGeminiOAuth() {
536
595
  }
537
596
 
538
597
  function clearGeminiChannelConfig() {
598
+ ensureDir(path.dirname(NATIVE_PATHS.gemini.env));
539
599
  const env = geminiSettingsManager.configExists()
540
600
  ? geminiSettingsManager.readEnv()
541
601
  : {};
@@ -597,7 +657,7 @@ function applyGeminiOAuth(credential) {
597
657
  }
598
658
 
599
659
  function inspectGeminiState() {
600
- const { getGeminiProxyStatus } = require('../gemini-proxy-server');
660
+ const { getGeminiProxyStatus } = require('./drivers/gemini/proxy-implementation');
601
661
  const proxyStatus = getGeminiProxyStatus();
602
662
  const nativeOAuth = readGeminiNativeOAuth();
603
663
 
@@ -628,388 +688,10 @@ function inspectGeminiState() {
628
688
  };
629
689
  }
630
690
 
631
- function parseOpenCodeOAuthPayload(raw) {
632
- if (!raw || typeof raw !== 'object') {
633
- return null;
634
- }
635
-
636
- if (raw.type === 'oauth' || raw.access) {
637
- return parseOpenCodeOAuthEntry(raw.providerId, raw);
638
- }
639
-
640
- if (raw.openai && typeof raw.openai === 'object') {
641
- return parseOpenCodeOAuthEntry('openai', raw.openai);
642
- }
643
-
644
- for (const [providerId, value] of Object.entries(raw)) {
645
- const parsed = parseOpenCodeOAuthEntry(providerId, value);
646
- if (parsed) {
647
- return parsed;
648
- }
649
- }
650
-
651
- return null;
652
- }
653
-
654
- function parseOpenCodeOAuthEntry(providerId, target) {
655
- const normalizedProviderId = String(providerId || 'openai').trim() || 'openai';
656
-
657
- if (!target || target.type !== 'oauth' || !target.access) {
658
- return null;
659
- }
660
-
661
- return {
662
- providerId: normalizedProviderId,
663
- accessToken: String(target.access || '').trim(),
664
- refreshToken: String(target.refresh || '').trim() || '',
665
- expiresAt: Number(target.expires || 0) || null,
666
- accountId: String(target.accountId || '').trim() || '',
667
- enterpriseUrl: String(target.enterpriseUrl || '').trim() || '',
668
- primaryToken: String(target.access || '').trim()
669
- };
670
- }
671
-
672
- function getActiveOpenCodeProviderId() {
673
- try {
674
- const configPath = opencodeSettingsManager.selectConfigPath();
675
- if (!configPath || !fs.existsSync(configPath)) {
676
- return '';
677
- }
678
-
679
- const config = opencodeSettingsManager.readConfig(configPath);
680
- const modelRef = String(config?.model || '').trim();
681
- if (modelRef.includes('/')) {
682
- return modelRef.split('/')[0].trim();
683
- }
684
-
685
- const providerIds = config?.provider && typeof config.provider === 'object'
686
- ? Object.keys(config.provider).filter(Boolean)
687
- : [];
688
- return providerIds.length === 1 ? providerIds[0] : '';
689
- } catch {
690
- return '';
691
- }
692
- }
693
-
694
- function readAllOpenCodeNativeOAuth() {
695
- const payload = readJsonFile(NATIVE_PATHS.opencode.auth, null);
696
- if (!payload || typeof payload !== 'object') {
697
- return [];
698
- }
699
-
700
- const activeProviderId = getActiveOpenCodeProviderId();
701
- const credentials = Object.entries(payload)
702
- .map(([providerId, value]) => parseOpenCodeOAuthEntry(providerId, value))
703
- .filter(Boolean)
704
- .map((entry) => ({ ...entry, storage: 'auth-file' }));
705
-
706
- if (!activeProviderId || credentials.length <= 1) {
707
- return credentials;
708
- }
709
-
710
- return credentials.sort((left, right) => {
711
- if (left.providerId === activeProviderId) return -1;
712
- if (right.providerId === activeProviderId) return 1;
713
- return left.providerId.localeCompare(right.providerId);
714
- });
715
- }
716
-
717
- function readOpenCodeNativeOAuth() {
718
- return readAllOpenCodeNativeOAuth()[0] || null;
719
- }
720
-
721
- function clearOpenCodeOAuth() {
722
- const payload = readJsonFile(NATIVE_PATHS.opencode.auth, {});
723
- if (!payload || typeof payload !== 'object') {
724
- return;
725
- }
726
-
727
- const removedProviderIds = [];
728
- Object.keys(payload).forEach((providerId) => {
729
- if (payload[providerId]?.type === 'oauth') {
730
- removedProviderIds.push(providerId);
731
- delete payload[providerId];
732
- }
733
- });
734
-
735
- if (Object.keys(payload).length === 0) {
736
- removeFileIfExists(NATIVE_PATHS.opencode.auth);
737
- } else {
738
- writeJsonFile(NATIVE_PATHS.opencode.auth, payload);
739
- }
740
-
741
- syncOpenCodeConfigAfterOAuthRemoval(removedProviderIds);
742
- }
743
-
744
- function disableOpenCodeOAuthCredential(credential = {}) {
745
- const providerId = String(credential.providerId || '').trim();
746
- const accessToken = String(credential.accessToken || credential.primaryToken || '').trim();
747
- const payload = readJsonFile(NATIVE_PATHS.opencode.auth, {});
748
- if (!payload || typeof payload !== 'object') {
749
- return;
750
- }
751
-
752
- const removedProviderIds = [];
753
- Object.keys(payload).forEach((key) => {
754
- const target = payload[key];
755
- if (!target || target.type !== 'oauth') {
756
- return;
757
- }
758
-
759
- const providerMatched = providerId && key === providerId;
760
- const tokenMatched = accessToken && String(target.access || '').trim() === accessToken;
761
- if (providerMatched || tokenMatched) {
762
- removedProviderIds.push(key);
763
- delete payload[key];
764
- }
765
- });
766
-
767
- if (Object.keys(payload).length === 0) {
768
- removeFileIfExists(NATIVE_PATHS.opencode.auth);
769
- } else {
770
- writeJsonFile(NATIVE_PATHS.opencode.auth, payload);
771
- }
772
-
773
- syncOpenCodeConfigAfterOAuthRemoval(removedProviderIds);
774
- }
775
-
776
- function isManagedOpenCodeProvider(provider) {
777
- if (!provider || typeof provider !== 'object') {
778
- return false;
779
- }
780
-
781
- if (provider.__ctx_managed__ === true) {
782
- return true;
783
- }
784
-
785
- const apiKey = String(provider?.options?.apiKey || '').trim();
786
- const baseUrl = String(provider?.options?.baseURL || '').trim();
787
- return apiKey === 'PROXY_KEY' && (baseUrl.includes('127.0.0.1') || baseUrl.includes('localhost'));
788
- }
789
-
790
- function isProxyBackedOpenCodeProvider(provider) {
791
- if (!provider || typeof provider !== 'object') {
792
- return false;
793
- }
794
-
795
- const apiKey = String(provider?.options?.apiKey || '').trim();
796
- const baseUrl = String(provider?.options?.baseURL || '').trim();
797
- return apiKey === 'PROXY_KEY' && (baseUrl.includes('127.0.0.1') || baseUrl.includes('localhost'));
798
- }
799
-
800
- function isMeaningfulOpenCodeProvider(provider) {
801
- if (!provider || typeof provider !== 'object') {
802
- return false;
803
- }
804
-
805
- if (provider.__ctx_managed__ === true) {
806
- return true;
807
- }
808
-
809
- if (typeof provider.npm === 'string' && provider.npm.trim()) {
810
- return true;
811
- }
812
-
813
- if (typeof provider.name === 'string' && provider.name.trim()) {
814
- return true;
815
- }
816
-
817
- if (provider.options && typeof provider.options === 'object' && Object.keys(provider.options).length > 0) {
818
- return true;
819
- }
820
-
821
- if (provider.models && typeof provider.models === 'object' && Object.keys(provider.models).length > 0) {
822
- return true;
823
- }
824
-
825
- return false;
826
- }
827
-
828
- function clearOpenCodeManagedModelSelection(config) {
829
- const modelRef = String(config?.model || '').trim();
830
- if (!modelRef || !modelRef.includes('/')) {
831
- return;
832
- }
833
-
834
- const providerId = modelRef.split('/')[0].trim();
835
- if (!providerId) {
836
- return;
837
- }
838
-
839
- const provider = config?.provider?.[providerId];
840
- if (isManagedOpenCodeProvider(provider)) {
841
- delete config.model;
842
- }
843
- }
844
-
845
- function getConfiguredOpenCodeProviderId(config) {
846
- const modelRef = String(config?.model || '').trim();
847
- if (modelRef.includes('/')) {
848
- return modelRef.split('/')[0].trim();
849
- }
850
-
851
- const providerIds = config?.provider && typeof config.provider === 'object'
852
- ? Object.keys(config.provider).filter(Boolean)
853
- : [];
854
- return providerIds.length === 1 ? providerIds[0] : '';
855
- }
856
-
857
- function buildOpenCodeModelRef(providerId, provider) {
858
- if (!providerId || !provider || typeof provider !== 'object') {
859
- return '';
860
- }
861
-
862
- const modelIds = provider.models && typeof provider.models === 'object'
863
- ? Object.keys(provider.models).filter(Boolean)
864
- : [];
865
-
866
- if (modelIds.length === 0) {
867
- return '';
868
- }
869
-
870
- return `${providerId}/${modelIds[0]}`;
871
- }
872
-
873
- function pickFallbackOpenCodeModel(config, excludedProviderIds = new Set()) {
874
- const providers = config?.provider && typeof config.provider === 'object'
875
- ? Object.entries(config.provider)
876
- : [];
877
-
878
- for (const [providerId, provider] of providers) {
879
- if (excludedProviderIds.has(providerId)) {
880
- continue;
881
- }
882
-
883
- const modelRef = buildOpenCodeModelRef(providerId, provider);
884
- if (modelRef) {
885
- return modelRef;
886
- }
887
- }
888
-
889
- return '';
890
- }
891
-
892
- function syncOpenCodeConfigAfterOAuthRemoval(removedProviderIds = []) {
893
- const removedIds = new Set((removedProviderIds || []).filter(Boolean));
894
- if (removedIds.size === 0) {
895
- return;
896
- }
897
-
898
- const configPath = opencodeSettingsManager.selectConfigPath();
899
- if (!configPath || !fs.existsSync(configPath)) {
900
- return;
901
- }
902
-
903
- let config = {};
904
- try {
905
- config = opencodeSettingsManager.readConfig(configPath);
906
- } catch {
907
- return;
908
- }
909
-
910
- config = config && typeof config === 'object' ? config : {};
911
- config.provider = config.provider && typeof config.provider === 'object' ? config.provider : {};
912
-
913
- let changed = false;
914
- for (const providerId of removedIds) {
915
- const provider = config.provider[providerId];
916
- if (provider && !isMeaningfulOpenCodeProvider(provider)) {
917
- delete config.provider[providerId];
918
- changed = true;
919
- }
920
- }
921
-
922
- const activeProviderId = getConfiguredOpenCodeProviderId(config);
923
- if (activeProviderId && removedIds.has(activeProviderId)) {
924
- const activeProvider = config.provider[activeProviderId];
925
- if (!isMeaningfulOpenCodeProvider(activeProvider)) {
926
- const fallbackModel = pickFallbackOpenCodeModel(config, removedIds);
927
- if (fallbackModel) {
928
- config.model = fallbackModel;
929
- } else {
930
- delete config.model;
931
- }
932
- changed = true;
933
- }
934
- }
935
-
936
- if (Object.keys(config.provider).length === 0) {
937
- delete config.provider;
938
- changed = true;
939
- }
940
-
941
- if (changed) {
942
- opencodeSettingsManager.writeConfig(configPath, config);
943
- }
944
- }
945
-
946
- function applyOpenCodeOAuth(credential) {
947
- const providerId = String(credential.providerId || 'openai').trim() || 'openai';
948
- const payload = readJsonFile(NATIVE_PATHS.opencode.auth, {});
949
- payload[providerId] = {
950
- type: 'oauth',
951
- access: credential.accessToken,
952
- refresh: credential.refreshToken || '',
953
- expires: credential.expiresAt || null,
954
- accountId: credential.accountId || undefined,
955
- enterpriseUrl: credential.enterpriseUrl || undefined
956
- };
957
- writeJsonFile(NATIVE_PATHS.opencode.auth, payload);
958
-
959
- const configPath = opencodeSettingsManager.selectConfigPath();
960
- const config = fs.existsSync(configPath)
961
- ? opencodeSettingsManager.readConfig(configPath)
962
- : {};
963
- config.provider = config.provider && typeof config.provider === 'object' ? config.provider : {};
964
- config.provider[providerId] = config.provider[providerId] && typeof config.provider[providerId] === 'object'
965
- ? config.provider[providerId]
966
- : {};
967
- // Preserve existing ctx-managed API providers for OpenCode coexistence, but
968
- // drop the active managed selection so OAuth-backed providers become available.
969
- clearOpenCodeManagedModelSelection(config);
970
- opencodeSettingsManager.writeConfig(configPath, config);
971
-
972
- return { storage: 'auth-file' };
973
- }
974
-
975
- function inspectOpenCodeState() {
976
- const { getOpenCodeProxyStatus } = require('../opencode-proxy-server');
977
- const proxyStatus = getOpenCodeProxyStatus();
978
- const nativeOAuth = readOpenCodeNativeOAuth();
979
-
980
- let channelConfigured = false;
981
- try {
982
- const configPath = opencodeSettingsManager.selectConfigPath();
983
- const config = fs.existsSync(configPath)
984
- ? opencodeSettingsManager.readConfig(configPath)
985
- : {};
986
- const providers = config?.provider && typeof config.provider === 'object'
987
- ? Object.values(config.provider)
988
- : [];
989
- channelConfigured = providers.some(provider => (
990
- isMeaningfulOpenCodeProvider(provider) && !isProxyBackedOpenCodeProvider(provider)
991
- ));
992
- } catch {
993
- channelConfigured = false;
994
- }
995
-
996
- return {
997
- tool: 'opencode',
998
- mode: proxyStatus.running
999
- ? 'proxy'
1000
- : (nativeOAuth && channelConfigured
1001
- ? 'mixed'
1002
- : (nativeOAuth ? 'oauth' : (channelConfigured ? 'channel' : 'idle'))),
1003
- proxyRunning: proxyStatus.running,
1004
- oauthPresent: Boolean(nativeOAuth),
1005
- channelConfigured,
1006
- nativeCredential: nativeOAuth ? buildNativeSummary(nativeOAuth) : null
1007
- };
1008
- }
1009
691
 
1010
692
  function resolveOmpRuntime() {
1011
693
  try {
1012
- const ompConfig = require('./omp-config');
694
+ const ompConfig = require('./drivers/omp/config');
1013
695
  const runtime = ompConfig.resolveOmpRuntime(process.env, {});
1014
696
  return runtime && runtime.runtime === 'omp' && runtime.installed ? runtime : null;
1015
697
  } catch {
@@ -1045,7 +727,7 @@ function runOmpCommand(args = [], options = {}) {
1045
727
 
1046
728
  function getOmpAuthSnapshot(options = {}) {
1047
729
  try {
1048
- const { getOmpAuthProviderSnapshot } = require('./omp-auth-providers');
730
+ const { getOmpAuthProviderSnapshot } = require('./drivers/omp/auth-providers');
1049
731
  return getOmpAuthProviderSnapshot({
1050
732
  accountCheck: true,
1051
733
  includeStatus: false,
@@ -1065,13 +747,11 @@ function readAllOmpNativeOAuth() {
1065
747
  return snapshot.providers
1066
748
  .filter(provider => provider?.loggedIn || Number(provider?.accountCount || 0) > 0)
1067
749
  .flatMap((provider) => {
1068
- const accounts = Array.isArray(provider.accounts) && provider.accounts.length > 0
1069
- ? provider.accounts
1070
- : [{ index: 1, identity: '' }];
750
+ const accounts = Array.isArray(provider.accounts) ? provider.accounts : [];
1071
751
  return accounts.map((account) => ({
1072
752
  providerId: provider.id,
1073
- accountId: String(account.index || '').trim(),
1074
- accountEmail: String(account.identity || '').trim(),
753
+ accountId: String(account.index || account.id || account.accountId || '').trim(),
754
+ accountEmail: String(account.identity || account.email || account.accountEmail || '').trim(),
1075
755
  storage: 'auth-broker',
1076
756
  primaryToken: ''
1077
757
  }));
@@ -1089,7 +769,7 @@ function clearOmpOAuth() {
1089
769
  runOmpCommand(['auth-broker', 'logout', providerId], { timeout: 10000 });
1090
770
  });
1091
771
  try {
1092
- require('./omp-auth-providers').clearOmpAuthProviderCache();
772
+ require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
1093
773
  } catch {
1094
774
  // cache invalidation is best-effort
1095
775
  }
@@ -1103,7 +783,7 @@ function disableOmpOAuthCredential(credential = {}) {
1103
783
  }
1104
784
  runOmpCommand(['auth-broker', 'logout', providerId], { timeout: 10000 });
1105
785
  try {
1106
- require('./omp-auth-providers').clearOmpAuthProviderCache();
786
+ require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
1107
787
  } catch {
1108
788
  // cache invalidation is best-effort
1109
789
  }
@@ -1164,7 +844,7 @@ function applyOmpOAuth(credential = {}) {
1164
844
  throw new Error(`OMP auth-broker import failed: ${detail}`);
1165
845
  }
1166
846
  try {
1167
- require('./omp-auth-providers').clearOmpAuthProviderCache();
847
+ require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
1168
848
  } catch {
1169
849
  // cache invalidation is best-effort
1170
850
  }
@@ -1180,8 +860,8 @@ function applyOmpOAuth(credential = {}) {
1180
860
  }
1181
861
 
1182
862
  function inspectOmpState() {
1183
- const { getOmpProxyStatus } = require('../omp-proxy-server');
1184
- const { isManagedOmpProvidersActive } = require('./omp-settings-manager');
863
+ const { getOmpProxyStatus } = require('./drivers/omp/proxy-implementation');
864
+ const { isManagedOmpProvidersActive } = require('./drivers/omp/native-config-implementation');
1185
865
  const proxyStatus = getOmpProxyStatus();
1186
866
  const nativeCredentials = readAllOmpNativeOAuth();
1187
867
 
@@ -1212,8 +892,6 @@ function inspectTool(tool) {
1212
892
  return inspectCodexState();
1213
893
  case 'gemini':
1214
894
  return inspectGeminiState();
1215
- case 'opencode':
1216
- return inspectOpenCodeState();
1217
895
  case 'omp':
1218
896
  return inspectOmpState();
1219
897
  default:
@@ -1229,8 +907,6 @@ function readNativeOAuth(tool) {
1229
907
  return readCodexNativeOAuth();
1230
908
  case 'gemini':
1231
909
  return readGeminiNativeOAuth();
1232
- case 'opencode':
1233
- return readOpenCodeNativeOAuth();
1234
910
  case 'omp':
1235
911
  return readOmpNativeOAuth();
1236
912
  default:
@@ -1252,8 +928,6 @@ function readAllNativeOAuth(tool) {
1252
928
  const credential = readGeminiNativeOAuth();
1253
929
  return credential ? [credential] : [];
1254
930
  }
1255
- case 'opencode':
1256
- return readAllOpenCodeNativeOAuth();
1257
931
  case 'omp':
1258
932
  return readAllOmpNativeOAuth();
1259
933
  default:
@@ -1272,9 +946,6 @@ function clearNativeOAuth(tool) {
1272
946
  case 'gemini':
1273
947
  clearGeminiOAuth();
1274
948
  return;
1275
- case 'opencode':
1276
- clearOpenCodeOAuth();
1277
- return;
1278
949
  case 'omp':
1279
950
  clearOmpOAuth();
1280
951
  return;
@@ -1294,9 +965,6 @@ function disableNativeOAuthCredential(tool, credential = {}) {
1294
965
  case 'gemini':
1295
966
  clearGeminiOAuth();
1296
967
  return;
1297
- case 'opencode':
1298
- disableOpenCodeOAuthCredential(credential);
1299
- return;
1300
968
  case 'omp':
1301
969
  disableOmpOAuthCredential(credential);
1302
970
  return;
@@ -1313,8 +981,6 @@ function applyOAuthCredential(tool, credential) {
1313
981
  return applyCodexOAuth(credential);
1314
982
  case 'gemini':
1315
983
  return applyGeminiOAuth(credential);
1316
- case 'opencode':
1317
- return applyOpenCodeOAuth(credential);
1318
984
  case 'omp':
1319
985
  return applyOmpOAuth(credential);
1320
986
  default:
@@ -1324,10 +990,14 @@ function applyOAuthCredential(tool, credential) {
1324
990
 
1325
991
  module.exports = {
1326
992
  SUPPORTED_TOOLS,
993
+ configure,
1327
994
  fingerprintFor,
1328
995
  inspectTool,
1329
996
  readNativeOAuth,
1330
997
  readAllNativeOAuth,
998
+ clearClaudeChannelConfig,
999
+ clearGeminiChannelConfig,
1000
+ clearCodexChannelConfig,
1331
1001
  clearNativeOAuth,
1332
1002
  disableNativeOAuthCredential,
1333
1003
  applyOAuthCredential