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
@@ -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
 
@@ -262,12 +321,22 @@ function parseCodexAuthPayload(raw) {
262
321
  const idTokenPayload = decodeJwtPayload(tokens.id_token);
263
322
  const accessTokenPayload = decodeJwtPayload(tokens.access_token);
264
323
  const exp = Number(idTokenPayload?.exp || accessTokenPayload?.exp || 0) || null;
324
+ const accountId = tokens.account_id
325
+ || idTokenPayload?.chatgpt_account_id
326
+ || accessTokenPayload?.chatgpt_account_id
327
+ || idTokenPayload?.['https://api.openai.com/auth.chatgpt_account_id']
328
+ || accessTokenPayload?.['https://api.openai.com/auth.chatgpt_account_id']
329
+ || idTokenPayload?.['https://api.openai.com/auth']?.chatgpt_account_id
330
+ || accessTokenPayload?.['https://api.openai.com/auth']?.chatgpt_account_id
331
+ || idTokenPayload?.organizations?.[0]?.id
332
+ || accessTokenPayload?.organizations?.[0]?.id
333
+ || '';
265
334
  return {
266
335
  authMode: String(auth.auth_mode || 'chatgpt').trim() || 'chatgpt',
267
336
  accessToken: String(tokens.access_token || '').trim(),
268
337
  refreshToken: String(tokens.refresh_token || '').trim() || '',
269
338
  idToken: String(tokens.id_token || '').trim() || '',
270
- accountId: String(tokens.account_id || '').trim() || '',
339
+ accountId: String(accountId).trim(),
271
340
  accountEmail: String(idTokenPayload?.email || '').trim() || '',
272
341
  expiresAt: exp ? exp * 1000 : null,
273
342
  lastRefresh: auth.last_refresh || null,
@@ -379,7 +448,7 @@ function applyCodexOAuth(credential) {
379
448
  }
380
449
 
381
450
  function inspectCodexState() {
382
- const { getCodexProxyStatus } = require('../codex-proxy-server');
451
+ const { getCodexProxyStatus } = require('./drivers/codex/proxy-implementation');
383
452
  const proxyStatus = getCodexProxyStatus();
384
453
  const nativeOAuth = readCodexNativeOAuth();
385
454
 
@@ -536,6 +605,7 @@ function clearGeminiOAuth() {
536
605
  }
537
606
 
538
607
  function clearGeminiChannelConfig() {
608
+ ensureDir(path.dirname(NATIVE_PATHS.gemini.env));
539
609
  const env = geminiSettingsManager.configExists()
540
610
  ? geminiSettingsManager.readEnv()
541
611
  : {};
@@ -597,7 +667,7 @@ function applyGeminiOAuth(credential) {
597
667
  }
598
668
 
599
669
  function inspectGeminiState() {
600
- const { getGeminiProxyStatus } = require('../gemini-proxy-server');
670
+ const { getGeminiProxyStatus } = require('./drivers/gemini/proxy-implementation');
601
671
  const proxyStatus = getGeminiProxyStatus();
602
672
  const nativeOAuth = readGeminiNativeOAuth();
603
673
 
@@ -628,388 +698,10 @@ function inspectGeminiState() {
628
698
  };
629
699
  }
630
700
 
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
701
 
1010
702
  function resolveOmpRuntime() {
1011
703
  try {
1012
- const ompConfig = require('./omp-config');
704
+ const ompConfig = require('./drivers/omp/config');
1013
705
  const runtime = ompConfig.resolveOmpRuntime(process.env, {});
1014
706
  return runtime && runtime.runtime === 'omp' && runtime.installed ? runtime : null;
1015
707
  } catch {
@@ -1045,7 +737,7 @@ function runOmpCommand(args = [], options = {}) {
1045
737
 
1046
738
  function getOmpAuthSnapshot(options = {}) {
1047
739
  try {
1048
- const { getOmpAuthProviderSnapshot } = require('./omp-auth-providers');
740
+ const { getOmpAuthProviderSnapshot } = require('./drivers/omp/auth-providers');
1049
741
  return getOmpAuthProviderSnapshot({
1050
742
  accountCheck: true,
1051
743
  includeStatus: false,
@@ -1065,13 +757,11 @@ function readAllOmpNativeOAuth() {
1065
757
  return snapshot.providers
1066
758
  .filter(provider => provider?.loggedIn || Number(provider?.accountCount || 0) > 0)
1067
759
  .flatMap((provider) => {
1068
- const accounts = Array.isArray(provider.accounts) && provider.accounts.length > 0
1069
- ? provider.accounts
1070
- : [{ index: 1, identity: '' }];
760
+ const accounts = Array.isArray(provider.accounts) ? provider.accounts : [];
1071
761
  return accounts.map((account) => ({
1072
762
  providerId: provider.id,
1073
- accountId: String(account.index || '').trim(),
1074
- accountEmail: String(account.identity || '').trim(),
763
+ accountId: String(account.index || account.id || account.accountId || '').trim(),
764
+ accountEmail: String(account.identity || account.email || account.accountEmail || '').trim(),
1075
765
  storage: 'auth-broker',
1076
766
  primaryToken: ''
1077
767
  }));
@@ -1089,7 +779,7 @@ function clearOmpOAuth() {
1089
779
  runOmpCommand(['auth-broker', 'logout', providerId], { timeout: 10000 });
1090
780
  });
1091
781
  try {
1092
- require('./omp-auth-providers').clearOmpAuthProviderCache();
782
+ require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
1093
783
  } catch {
1094
784
  // cache invalidation is best-effort
1095
785
  }
@@ -1103,7 +793,7 @@ function disableOmpOAuthCredential(credential = {}) {
1103
793
  }
1104
794
  runOmpCommand(['auth-broker', 'logout', providerId], { timeout: 10000 });
1105
795
  try {
1106
- require('./omp-auth-providers').clearOmpAuthProviderCache();
796
+ require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
1107
797
  } catch {
1108
798
  // cache invalidation is best-effort
1109
799
  }
@@ -1164,7 +854,7 @@ function applyOmpOAuth(credential = {}) {
1164
854
  throw new Error(`OMP auth-broker import failed: ${detail}`);
1165
855
  }
1166
856
  try {
1167
- require('./omp-auth-providers').clearOmpAuthProviderCache();
857
+ require('./drivers/omp/auth-providers').clearOmpAuthProviderCache();
1168
858
  } catch {
1169
859
  // cache invalidation is best-effort
1170
860
  }
@@ -1180,8 +870,8 @@ function applyOmpOAuth(credential = {}) {
1180
870
  }
1181
871
 
1182
872
  function inspectOmpState() {
1183
- const { getOmpProxyStatus } = require('../omp-proxy-server');
1184
- const { isManagedOmpProvidersActive } = require('./omp-settings-manager');
873
+ const { getOmpProxyStatus } = require('./drivers/omp/proxy-implementation');
874
+ const { isManagedOmpProvidersActive } = require('./drivers/omp/native-config-implementation');
1185
875
  const proxyStatus = getOmpProxyStatus();
1186
876
  const nativeCredentials = readAllOmpNativeOAuth();
1187
877
 
@@ -1212,8 +902,6 @@ function inspectTool(tool) {
1212
902
  return inspectCodexState();
1213
903
  case 'gemini':
1214
904
  return inspectGeminiState();
1215
- case 'opencode':
1216
- return inspectOpenCodeState();
1217
905
  case 'omp':
1218
906
  return inspectOmpState();
1219
907
  default:
@@ -1229,8 +917,6 @@ function readNativeOAuth(tool) {
1229
917
  return readCodexNativeOAuth();
1230
918
  case 'gemini':
1231
919
  return readGeminiNativeOAuth();
1232
- case 'opencode':
1233
- return readOpenCodeNativeOAuth();
1234
920
  case 'omp':
1235
921
  return readOmpNativeOAuth();
1236
922
  default:
@@ -1252,8 +938,6 @@ function readAllNativeOAuth(tool) {
1252
938
  const credential = readGeminiNativeOAuth();
1253
939
  return credential ? [credential] : [];
1254
940
  }
1255
- case 'opencode':
1256
- return readAllOpenCodeNativeOAuth();
1257
941
  case 'omp':
1258
942
  return readAllOmpNativeOAuth();
1259
943
  default:
@@ -1272,9 +956,6 @@ function clearNativeOAuth(tool) {
1272
956
  case 'gemini':
1273
957
  clearGeminiOAuth();
1274
958
  return;
1275
- case 'opencode':
1276
- clearOpenCodeOAuth();
1277
- return;
1278
959
  case 'omp':
1279
960
  clearOmpOAuth();
1280
961
  return;
@@ -1294,9 +975,6 @@ function disableNativeOAuthCredential(tool, credential = {}) {
1294
975
  case 'gemini':
1295
976
  clearGeminiOAuth();
1296
977
  return;
1297
- case 'opencode':
1298
- disableOpenCodeOAuthCredential(credential);
1299
- return;
1300
978
  case 'omp':
1301
979
  disableOmpOAuthCredential(credential);
1302
980
  return;
@@ -1313,8 +991,6 @@ function applyOAuthCredential(tool, credential) {
1313
991
  return applyCodexOAuth(credential);
1314
992
  case 'gemini':
1315
993
  return applyGeminiOAuth(credential);
1316
- case 'opencode':
1317
- return applyOpenCodeOAuth(credential);
1318
994
  case 'omp':
1319
995
  return applyOmpOAuth(credential);
1320
996
  default:
@@ -1324,10 +1000,14 @@ function applyOAuthCredential(tool, credential) {
1324
1000
 
1325
1001
  module.exports = {
1326
1002
  SUPPORTED_TOOLS,
1003
+ configure,
1327
1004
  fingerprintFor,
1328
1005
  inspectTool,
1329
1006
  readNativeOAuth,
1330
1007
  readAllNativeOAuth,
1008
+ clearClaudeChannelConfig,
1009
+ clearGeminiChannelConfig,
1010
+ clearCodexChannelConfig,
1331
1011
  clearNativeOAuth,
1332
1012
  disableNativeOAuthCredential,
1333
1013
  applyOAuthCredential