coding-tool-x 3.8.4 → 3.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +86 -15
  3. package/dist/web/assets/AgentsDrawer-BG6P3DX-.js +1 -0
  4. package/dist/web/assets/AgentsDrawer-Pw2k-ZAa.css +1 -0
  5. package/dist/web/assets/Analytics--z_FmL5P.js +1 -0
  6. package/dist/web/assets/Analytics-CyHhR126.css +1 -0
  7. package/dist/web/assets/AssetPathField-CrJtRKHy.js +1 -0
  8. package/dist/web/assets/ChatHistoryDrawer-B2qBQs9L.css +1 -0
  9. package/dist/web/assets/ChatHistoryDrawer-BiuEryJj.js +1 -0
  10. package/dist/web/assets/CollapseItem-BAYEsL_Q.js +1 -0
  11. package/dist/web/assets/CommandsDrawer-BZJxlPvV.css +1 -0
  12. package/dist/web/assets/CommandsDrawer-YJ-U7BXN.js +1 -0
  13. package/dist/web/assets/ConfigExportDrawer-Ce_hAknW.js +1 -0
  14. package/dist/web/assets/ConfigExportDrawer-dwruRKWr.css +1 -0
  15. package/dist/web/assets/ConfigTemplates-Bvr1NN6K.js +1 -0
  16. package/dist/web/assets/ConfigTemplatesDrawer-BfDi8yO3.css +1 -0
  17. package/dist/web/assets/ConfigTemplatesDrawer-BjIeHfF-.js +1 -0
  18. package/dist/web/assets/ConfigTemplatesPanel-AV00tm_D.js +1 -0
  19. package/dist/web/assets/ConfigTemplatesPanel-CWyPtk67.css +1 -0
  20. package/dist/web/assets/Divider-D28g1gwj.js +1 -0
  21. package/dist/web/assets/DrawerContent-ChXgZ1Xm.js +1 -0
  22. package/dist/web/assets/FavoritesDrawer-CG9eI9Ay.css +1 -0
  23. package/dist/web/assets/FavoritesDrawer-Cz95o4CD.js +1 -0
  24. package/dist/web/assets/GatewayConvertDrawer-CuNlf7AC.css +1 -0
  25. package/dist/web/assets/GatewayConvertDrawer-DLlbMz27.js +1 -0
  26. package/dist/web/assets/Home-CSuFuJ9Y.css +1 -0
  27. package/dist/web/assets/Home-D7CCOFQC.js +1 -0
  28. package/dist/web/assets/MarkdownEditor-qfVgSre_.css +1 -0
  29. package/dist/web/assets/MarkdownEditor-rEZ-c72L.js +1 -0
  30. package/dist/web/assets/McpDrawer-C0dnsZhQ.css +1 -0
  31. package/dist/web/assets/McpDrawer-DfoCyxU2.js +1 -0
  32. package/dist/web/assets/McpFormDrawer-BRbDcawn.css +1 -0
  33. package/dist/web/assets/McpFormDrawer-SKu8HNUR.js +1 -0
  34. package/dist/web/assets/PluginManager-BbeK-3rV.js +1 -0
  35. package/dist/web/assets/PluginsDrawer-CWVJ7yjS.js +1 -0
  36. package/dist/web/assets/PluginsDrawer-DM3QjprE.css +1 -0
  37. package/dist/web/assets/PluginsPanel-Cm2N3StG.js +1 -0
  38. package/dist/web/assets/PluginsPanel-D6ZqITcR.css +1 -0
  39. package/dist/web/assets/ProjectList-677RLZ8O.css +1 -0
  40. package/dist/web/assets/ProjectList-CsjnsNPv.js +1 -0
  41. package/dist/web/assets/PromptsDrawer-BIgiYCEQ.css +1 -0
  42. package/dist/web/assets/PromptsDrawer-EGd3djFa.js +1 -0
  43. package/dist/web/assets/RecentSessionsDrawer-CKFsOYDM.css +1 -0
  44. package/dist/web/assets/RecentSessionsDrawer-D1vtoLAs.js +1 -0
  45. package/dist/web/assets/SessionCard-BgLg49U3.js +1 -0
  46. package/dist/web/assets/SessionCard-aM2NHu6i.css +1 -0
  47. package/dist/web/assets/SessionList-BpYRz1cX.css +1 -0
  48. package/dist/web/assets/SessionList-TRiTklWk.js +1 -0
  49. package/dist/web/assets/SettingsDrawer-d5liXjHq.css +1 -0
  50. package/dist/web/assets/SettingsDrawer-rz2WejGY.js +1 -0
  51. package/dist/web/assets/SkillManager-BTjTUbHq.js +1 -0
  52. package/dist/web/assets/SkillManager-C0GCT2Kb.css +1 -0
  53. package/dist/web/assets/SkillsDrawer-BCNme-aJ.css +1 -0
  54. package/dist/web/assets/SkillsDrawer-pN0hbkK3.js +1 -0
  55. package/dist/web/assets/SkillsPanel-B3Nm5j32.css +1 -0
  56. package/dist/web/assets/SkillsPanel-gmBWEoiF.js +1 -0
  57. package/dist/web/assets/SpeedTestDrawer-Dc0WToJ_.css +1 -0
  58. package/dist/web/assets/SpeedTestDrawer-DcNzuVJk.js +1 -0
  59. package/dist/web/assets/Upload-v5rV0qTT.js +1 -0
  60. package/dist/web/assets/WorkspaceDrawer-CGnMu9p1.css +1 -0
  61. package/dist/web/assets/WorkspaceDrawer-DxmicM4U.js +1 -0
  62. package/dist/web/assets/WorkspaceManager-CJHCjARN.js +1 -0
  63. package/dist/web/assets/WorkspacePanel-D0-zHTHP.css +1 -0
  64. package/dist/web/assets/WorkspacePanel-D8_Zq-du.js +1 -0
  65. package/dist/web/assets/_plugin-vue_export-helper-BeLZJZij.js +1 -0
  66. package/dist/web/assets/client-UDwXBP9i.js +1 -0
  67. package/dist/web/assets/clipboard-B46yyoz_.js +1 -0
  68. package/dist/web/assets/headers-cf-QapUq.js +1 -0
  69. package/dist/web/assets/icons-B2Vg-IOC.js +1 -0
  70. package/dist/web/assets/index-C0EHRym0.css +1 -0
  71. package/dist/web/assets/index-DnEocV0M.js +2 -0
  72. package/dist/web/assets/light-Cp0t7v32.js +1 -0
  73. package/dist/web/assets/markdown-u082bbtj.js +1 -0
  74. package/dist/web/assets/platforms-CBkB45JP.js +1 -0
  75. package/dist/web/assets/platforms-FTpjxAT6.js +1 -0
  76. package/dist/web/assets/project-config-B2baPzYL.js +1 -0
  77. package/dist/web/assets/sessions-Cmy31slD.js +1 -0
  78. package/dist/web/assets/sessions-yC_oVVh8.js +1 -0
  79. package/dist/web/assets/skill-repo-input-B_fkGlUK.js +1 -0
  80. package/dist/web/assets/use-lock-html-scroll-DXIqmUW4.js +1 -0
  81. package/dist/web/assets/use-message-DoLM8C1C.js +1 -0
  82. package/dist/web/assets/useResponsiveDrawer-B3uojyvV.js +1 -0
  83. package/dist/web/assets/vendors-D0c_0KLP.js +1 -0
  84. package/dist/web/assets/vue-vendor-BqZbbXHA.js +1 -0
  85. package/dist/web/assets/workspaces-mjyPVGS8.js +1 -0
  86. package/dist/web/assets/xml-CgY3RMlX.js +1 -0
  87. package/dist/web/index.html +12 -8
  88. package/docs/native-log-memory-2026-09-16.md +43 -0
  89. package/docs/superpowers/plans/2026-08-26-configuration-driven-cli-platform.md +1578 -0
  90. package/docs/superpowers/plans/2026-08-30-project-scoped-config-control.md +1260 -0
  91. package/docs/superpowers/plans/2026-09-01-omp-skill-refresh-boundary.md +213 -0
  92. package/docs/superpowers/plans/2026-09-01-realtime-logs-panel.md +125 -0
  93. package/docs/superpowers/plans/2026-09-02-config-driven-platform-boundary.md +86 -0
  94. package/docs/superpowers/plans/2026-09-02-platform-implementation-drivers.md +508 -0
  95. package/docs/superpowers/plans/2026-09-03-cli-platform-correctness-boundary.md +760 -0
  96. package/docs/superpowers/plans/2026-09-03-dependency-security-remediation.md +133 -0
  97. package/docs/superpowers/plans/2026-09-04-model-catalog-pricing-sync.md +1078 -0
  98. package/docs/superpowers/plans/2026-09-05-codex-project-scan-500.md +128 -0
  99. package/docs/superpowers/plans/2026-09-06-project-skill-path-fix.md +97 -0
  100. package/docs/superpowers/specs/2026-08-26-configuration-driven-cli-platform-design.md +408 -0
  101. package/docs/superpowers/specs/2026-08-30-project-scoped-config-control-design.md +467 -0
  102. package/docs/superpowers/specs/2026-09-01-claude-session-content-repair-design.md +111 -0
  103. package/docs/superpowers/specs/2026-09-01-omp-skill-refresh-boundary-design.md +83 -0
  104. package/docs/superpowers/specs/2026-09-01-realtime-logs-panel-design.md +27 -0
  105. package/docs/superpowers/specs/2026-09-02-config-driven-platform-boundary-design.md +64 -0
  106. package/docs/superpowers/specs/2026-09-02-platform-implementation-driver-boundary-design.md +123 -0
  107. package/docs/superpowers/specs/2026-09-03-cli-platform-correctness-boundary-design.md +249 -0
  108. package/docs/superpowers/specs/2026-09-03-dependency-security-remediation-design.md +87 -0
  109. package/docs/superpowers/specs/2026-09-04-model-catalog-pricing-sync-design.md +301 -0
  110. package/docs/superpowers/specs/2026-09-05-codex-project-scan-500-design.md +24 -0
  111. package/package.json +8 -4
  112. package/src/commands/channels.js +88 -191
  113. package/src/commands/cli-type.js +19 -11
  114. package/src/commands/daemon.js +94 -32
  115. package/src/commands/doctor.js +16 -9
  116. package/src/commands/export-config.js +23 -5
  117. package/src/commands/list.js +130 -52
  118. package/src/commands/logs.js +44 -27
  119. package/src/commands/platform-command-registry.js +78 -0
  120. package/src/commands/plugin.js +11 -5
  121. package/src/commands/port-config.js +34 -52
  122. package/src/commands/proxy-control.js +207 -145
  123. package/src/commands/proxy.js +2 -2
  124. package/src/commands/resume.js +87 -91
  125. package/src/commands/search.js +137 -67
  126. package/src/commands/stats.js +30 -22
  127. package/src/commands/switch.js +1 -1
  128. package/src/commands/toggle-proxy.js +94 -111
  129. package/src/commands/ui.js +67 -6
  130. package/src/commands/workspace.js +90 -8
  131. package/src/config/default.js +6 -53
  132. package/src/config/loader.js +61 -24
  133. package/src/config/model-metadata.js +49 -59
  134. package/src/config/model-metadata.json +4095 -99
  135. package/src/config/paths.js +181 -8
  136. package/src/index.js +134 -71
  137. package/src/platforms/access.js +196 -0
  138. package/src/{server/services → platforms}/agents-service.js +354 -197
  139. package/src/platforms/channel-auth-registry.js +162 -0
  140. package/src/platforms/channel-auth-service.js +82 -0
  141. package/src/{server/services → platforms}/commands-service.js +195 -115
  142. package/src/platforms/driver-registry.js +59 -0
  143. package/src/platforms/drivers/claude/api-operations.js +62 -0
  144. package/src/{server/services/channels.js → platforms/drivers/claude/channels-implementation.js} +131 -33
  145. package/src/platforms/drivers/claude/channels.js +39 -0
  146. package/src/{server/services/config-sync-service.js → platforms/drivers/claude/config-sync.js} +29 -5
  147. package/src/{server/services → platforms/drivers/claude}/health-check.js +4 -4
  148. package/src/platforms/drivers/claude/health.js +22 -0
  149. package/src/platforms/drivers/claude/mcp.js +9 -0
  150. package/src/{server/services/settings-manager.js → platforms/drivers/claude/native-config-implementation.js} +13 -4
  151. package/src/platforms/drivers/claude/native-config.js +46 -0
  152. package/src/platforms/drivers/claude/native-logs.js +72 -0
  153. package/src/{server/services/claude-openai-gateway.js → platforms/drivers/claude/openai-gateway.js} +8 -65
  154. package/src/platforms/drivers/claude/project-config.js +21 -0
  155. package/src/platforms/drivers/claude/projects.js +62 -0
  156. package/src/platforms/drivers/claude/prompts.js +9 -0
  157. package/src/{server/proxy-server.js → platforms/drivers/claude/proxy-implementation.js} +41 -278
  158. package/src/platforms/drivers/claude/proxy.js +16 -0
  159. package/src/platforms/drivers/claude/resource-sync.js +9 -0
  160. package/src/platforms/drivers/claude/session-history-adapter.js +313 -0
  161. package/src/{server/services/sessions.js → platforms/drivers/claude/sessions-implementation.js} +145 -35
  162. package/src/platforms/drivers/claude/sessions.js +76 -0
  163. package/src/{server/services/claude-statistics-service.js → platforms/drivers/claude/statistics-implementation.js} +2 -2
  164. package/src/platforms/drivers/claude/statistics.js +16 -0
  165. package/src/{server/services/claude-wire.js → platforms/drivers/claude/wire.js} +1 -1
  166. package/src/platforms/drivers/codex/api-operations.js +9 -0
  167. package/src/{server/services/codex-channels.js → platforms/drivers/codex/channels-implementation.js} +149 -14
  168. package/src/platforms/drivers/codex/channels.js +45 -0
  169. package/src/{server/services/codex-config.js → platforms/drivers/codex/config.js} +12 -2
  170. package/src/{server/services/codex-env-manager.js → platforms/drivers/codex/env-manager.js} +1 -1
  171. package/src/platforms/drivers/codex/mcp.js +9 -0
  172. package/src/{server/services/codex-settings-manager.js → platforms/drivers/codex/native-config-implementation.js} +15 -6
  173. package/src/platforms/drivers/codex/native-config.js +47 -0
  174. package/src/platforms/drivers/codex/native-logs.js +166 -0
  175. package/src/platforms/drivers/codex/project-config.js +21 -0
  176. package/src/platforms/drivers/codex/projects.js +26 -0
  177. package/src/platforms/drivers/codex/prompts.js +9 -0
  178. package/src/{server/codex-proxy-server.js → platforms/drivers/codex/proxy-implementation.js} +30 -233
  179. package/src/platforms/drivers/codex/proxy.js +16 -0
  180. package/src/platforms/drivers/codex/resource-sync.js +9 -0
  181. package/src/{server/services/session-history-adapters/codex.js → platforms/drivers/codex/session-history-adapter.js} +37 -23
  182. package/src/{server/services/codex-sessions.js → platforms/drivers/codex/sessions-implementation.js} +81 -75
  183. package/src/platforms/drivers/codex/sessions.js +36 -0
  184. package/src/{server/services/codex-statistics-service.js → platforms/drivers/codex/statistics-implementation.js} +2 -2
  185. package/src/platforms/drivers/codex/statistics.js +16 -0
  186. package/src/platforms/drivers/gemini/api-operations.js +9 -0
  187. package/src/{server/services/gemini-channels.js → platforms/drivers/gemini/channels-implementation.js} +202 -37
  188. package/src/platforms/drivers/gemini/channels.js +39 -0
  189. package/src/{server/services/gemini-config.js → platforms/drivers/gemini/config.js} +12 -2
  190. package/src/platforms/drivers/gemini/mcp.js +9 -0
  191. package/src/{server/services/gemini-settings-manager.js → platforms/drivers/gemini/native-config-implementation.js} +14 -5
  192. package/src/platforms/drivers/gemini/native-config.js +39 -0
  193. package/src/platforms/drivers/gemini/native-logs.js +180 -0
  194. package/src/platforms/drivers/gemini/project-config.js +21 -0
  195. package/src/platforms/drivers/gemini/projects.js +26 -0
  196. package/src/platforms/drivers/gemini/prompts.js +9 -0
  197. package/src/{server/gemini-proxy-server.js → platforms/drivers/gemini/proxy-implementation.js} +36 -267
  198. package/src/platforms/drivers/gemini/proxy.js +16 -0
  199. package/src/platforms/drivers/gemini/resource-sync.js +9 -0
  200. package/src/{server/services/session-history-adapters/gemini.js → platforms/drivers/gemini/session-history-adapter.js} +70 -18
  201. package/src/{server/services/gemini-sessions.js → platforms/drivers/gemini/sessions-implementation.js} +53 -37
  202. package/src/platforms/drivers/gemini/sessions.js +47 -0
  203. package/src/{server/services/gemini-statistics-service.js → platforms/drivers/gemini/statistics-implementation.js} +2 -2
  204. package/src/platforms/drivers/gemini/statistics.js +16 -0
  205. package/src/{server/services/gemini-wire.js → platforms/drivers/gemini/wire.js} +1 -1
  206. package/src/platforms/drivers/generic-filesystem.js +166 -0
  207. package/src/platforms/drivers/generic-jsonl.js +141 -0
  208. package/src/platforms/drivers/generic-mcp.js +44 -0
  209. package/src/platforms/drivers/generic-openai-compatible.js +45 -0
  210. package/src/platforms/drivers/generic-prompt.js +41 -0
  211. package/src/platforms/drivers/legacy.js +677 -0
  212. package/src/platforms/drivers/native-config-snapshot.js +125 -0
  213. package/src/platforms/drivers/native-log-utils.js +1292 -0
  214. package/src/platforms/drivers/notification-hooks.js +578 -0
  215. package/src/{server/api/omp-config.js → platforms/drivers/omp/api-operations.js} +52 -64
  216. package/src/{server/services/omp-auth-provider-worker.js → platforms/drivers/omp/auth-provider-worker.js} +1 -1
  217. package/src/{server/services/omp-auth-providers.js → platforms/drivers/omp/auth-providers.js} +1 -1
  218. package/src/{server/services/omp-channels.js → platforms/drivers/omp/channels-implementation.js} +166 -39
  219. package/src/platforms/drivers/omp/channels.js +58 -0
  220. package/src/{server/services/omp-config.js → platforms/drivers/omp/config.js} +53 -13
  221. package/src/{server/services/omp-gateway-routing.js → platforms/drivers/omp/gateway-routing.js} +14 -7
  222. package/src/{server/services/omp-gateway.js → platforms/drivers/omp/gateway.js} +4 -262
  223. package/src/platforms/drivers/omp/mcp.js +9 -0
  224. package/src/{server/services/omp-settings-manager.js → platforms/drivers/omp/native-config-implementation.js} +75 -10
  225. package/src/platforms/drivers/omp/native-config.js +46 -0
  226. package/src/platforms/drivers/omp/native-logs.js +52 -0
  227. package/src/{server/services/omp-native-plugin-adapter.js → platforms/drivers/omp/native-plugin-adapter.js} +91 -4
  228. package/src/platforms/drivers/omp/project-config.js +29 -0
  229. package/src/platforms/drivers/omp/projects.js +20 -0
  230. package/src/platforms/drivers/omp/prompts.js +9 -0
  231. package/src/{server/omp-proxy-server.js → platforms/drivers/omp/proxy-implementation.js} +6 -15
  232. package/src/platforms/drivers/omp/proxy.js +16 -0
  233. package/src/platforms/drivers/omp/resource-sync.js +9 -0
  234. package/src/{server/services/session-history-adapters/omp.js → platforms/drivers/omp/session-history-adapter.js} +42 -18
  235. package/src/{server/services/omp-sessions.js → platforms/drivers/omp/sessions-implementation.js} +130 -94
  236. package/src/platforms/drivers/omp/sessions.js +36 -0
  237. package/src/{server/services/omp-skill-discovery.js → platforms/drivers/omp/skill-discovery.js} +159 -32
  238. package/src/{server/services/omp-skill-settings-service.js → platforms/drivers/omp/skill-settings.js} +1 -1
  239. package/src/{server/services/omp-statistics-service.js → platforms/drivers/omp/statistics-implementation.js} +3 -3
  240. package/src/platforms/drivers/omp/statistics.js +16 -0
  241. package/src/platforms/drivers/opencode/api-operations.js +9 -0
  242. package/src/{server/services/opencode-channels.js → platforms/drivers/opencode/channels-implementation.js} +28 -9
  243. package/src/platforms/drivers/opencode/channels.js +40 -0
  244. package/src/platforms/drivers/opencode/conversion.js +41 -0
  245. package/src/{server/services/opencode-gateway-converter.js → platforms/drivers/opencode/gateway-converter.js} +1 -1
  246. package/src/platforms/drivers/opencode/mcp.js +9 -0
  247. package/src/{server/services/opencode-settings-manager.js → platforms/drivers/opencode/native-config-implementation.js} +17 -6
  248. package/src/platforms/drivers/opencode/native-config.js +26 -0
  249. package/src/platforms/drivers/opencode/native-logs.js +133 -0
  250. package/src/platforms/drivers/opencode/project-config.js +98 -0
  251. package/src/platforms/drivers/opencode/projects.js +20 -0
  252. package/src/platforms/drivers/opencode/prompts.js +9 -0
  253. package/src/{server/opencode-proxy-server.js → platforms/drivers/opencode/proxy-implementation.js} +27 -362
  254. package/src/platforms/drivers/opencode/proxy.js +16 -0
  255. package/src/platforms/drivers/opencode/resource-sync.js +9 -0
  256. package/src/{server/services/opencode-sessions.js → platforms/drivers/opencode/sessions-implementation.js} +211 -64
  257. package/src/platforms/drivers/opencode/sessions.js +48 -0
  258. package/src/{server/services/opencode-statistics-service.js → platforms/drivers/opencode/statistics-implementation.js} +2 -2
  259. package/src/platforms/drivers/opencode/statistics.js +16 -0
  260. package/src/platforms/drivers/secure-file-driver.js +272 -0
  261. package/src/platforms/drivers/unsupported.js +7 -0
  262. package/src/platforms/manifest-schema.js +398 -0
  263. package/src/platforms/manifests/claude.json +489 -0
  264. package/src/platforms/manifests/codex.json +448 -0
  265. package/src/platforms/manifests/gemini.json +447 -0
  266. package/src/platforms/manifests/omp.json +496 -0
  267. package/src/platforms/manifests/opencode.json +422 -0
  268. package/src/{server/services → platforms}/native-oauth-adapters.js +87 -417
  269. package/src/{server/services → platforms}/notification-hooks.js +140 -1023
  270. package/src/platforms/oauth-credentials-service.js +506 -0
  271. package/src/platforms/path-resolver.js +179 -0
  272. package/src/platforms/platform-path-context.js +305 -0
  273. package/src/platforms/registry.js +248 -0
  274. package/src/platforms/remote-notification-providers.js +678 -0
  275. package/src/platforms/runtime.js +259 -0
  276. package/src/{server/services/session-history-adapters/index.js → platforms/session-history-adapters.js} +8 -1
  277. package/src/plugins/plugin-loader.js +2 -2
  278. package/src/plugins/plugin-manager.js +2 -2
  279. package/src/plugins/registry.js +27 -10
  280. package/src/reset-config.js +21 -5
  281. package/src/server/api/agents.js +46 -72
  282. package/src/server/api/commands.js +16 -6
  283. package/src/server/api/config-registry.js +206 -59
  284. package/src/server/api/config-sync.js +3 -2
  285. package/src/server/api/config-templates.js +20 -4
  286. package/src/server/api/config.js +111 -102
  287. package/src/server/api/convert.js +54 -178
  288. package/src/server/api/dashboard.js +168 -102
  289. package/src/server/api/hooks.js +1 -1
  290. package/src/server/api/mcp.js +224 -84
  291. package/src/server/api/platform-api-config.js +102 -0
  292. package/src/server/api/platform-route-factory.js +215 -0
  293. package/src/server/api/platform-routes.js +26 -0
  294. package/src/server/api/platforms.js +110 -0
  295. package/src/server/api/plugins.js +57 -57
  296. package/src/server/api/project-config.js +168 -0
  297. package/src/server/api/prompts.js +58 -45
  298. package/src/server/api/settings.js +55 -8
  299. package/src/server/api/skills.js +262 -133
  300. package/src/server/api/ui-config.js +2 -2
  301. package/src/server/api/validation-errors.js +18 -4
  302. package/src/server/api/workspaces.js +47 -12
  303. package/src/server/index.js +164 -213
  304. package/src/server/platform-context.js +81 -0
  305. package/src/server/services/channel-balance.js +11 -20
  306. package/src/server/services/channel-health.js +21 -6
  307. package/src/server/services/channel-scheduler.js +29 -39
  308. package/src/server/services/channel-sync-utils.js +23 -13
  309. package/src/server/services/config-export-service.js +350 -319
  310. package/src/server/services/config-registry-service.js +280 -54
  311. package/src/server/services/config-sync-manager.js +172 -944
  312. package/src/server/services/config-templates-service.js +419 -353
  313. package/src/server/services/control-manifest-store.js +206 -0
  314. package/src/server/services/dashboard-snapshot-worker.js +656 -100
  315. package/src/server/services/effective-control-service.js +557 -0
  316. package/src/server/services/local-resource-index.js +314 -0
  317. package/src/server/services/mcp-service.js +607 -977
  318. package/src/server/services/model-detector.js +15 -10
  319. package/src/server/services/native-log-channel-resolver.js +214 -0
  320. package/src/server/services/native-log-observer.js +291 -0
  321. package/src/server/services/network-access.js +1 -1
  322. package/src/server/services/platform-catalog.js +82 -0
  323. package/src/server/services/platform-resolution.js +32 -29
  324. package/src/server/services/plugins-service.js +376 -122
  325. package/src/server/services/project-config-service.js +550 -0
  326. package/src/server/services/project-path-validation.js +31 -0
  327. package/src/server/services/prompts-service.js +267 -233
  328. package/src/server/services/proxy-runtime.js +7 -4
  329. package/src/server/services/remote-credential-cache.js +43 -0
  330. package/src/server/services/repo-scanner-base.js +182 -75
  331. package/src/server/services/request-logger.js +7 -4
  332. package/src/server/services/session-history-index.js +780 -213
  333. package/src/server/services/session-history-worker.js +228 -33
  334. package/src/server/services/session-snapshot-worker.js +124 -34
  335. package/src/server/services/session-snapshots.js +4 -2
  336. package/src/server/services/skill-artifact-store.js +355 -0
  337. package/src/server/services/skill-format-adapters.js +65 -0
  338. package/src/server/services/skill-projection-service.js +323 -0
  339. package/src/server/services/skill-refresh-task-service.js +275 -0
  340. package/src/server/services/skill-service.js +2020 -677
  341. package/src/server/services/snapshot-cache.js +30 -8
  342. package/src/server/services/speed-test.js +8 -8
  343. package/src/server/services/sqlite-connection.js +19 -3
  344. package/src/server/services/statistics-service.js +240 -57
  345. package/src/server/services/ui-config.js +107 -76
  346. package/src/server/services/usage-log-utils.js +98 -0
  347. package/src/server/services/web-build.js +1 -1
  348. package/src/server/services/workspace-service.js +59 -29
  349. package/src/server/utils/pricing.js +10 -19
  350. package/src/server/websocket-server.js +153 -28
  351. package/src/{server/services/base → shared}/base-channel-service.js +156 -28
  352. package/src/shared/capability-driver.js +104 -0
  353. package/src/shared/channel-auth-policy.js +27 -0
  354. package/src/shared/channel-driver.js +161 -0
  355. package/src/shared/driver-factories/api.js +180 -0
  356. package/src/shared/driver-factories/mcp.js +244 -0
  357. package/src/shared/driver-factories/projects.js +121 -0
  358. package/src/shared/driver-factories/prompts.js +58 -0
  359. package/src/shared/driver-factories/resource-sync.js +375 -0
  360. package/src/shared/driver-result.js +78 -0
  361. package/src/shared/mcp-format.js +189 -0
  362. package/src/shared/platforms.js +104 -167
  363. package/src/shared/project-config.js +512 -0
  364. package/src/shared/proxy-driver.js +57 -0
  365. package/src/{server/services/base → shared}/response-usage-parser.js +8 -4
  366. package/src/ui/menu.js +91 -67
  367. package/src/utils/port-helper.js +35 -19
  368. package/src/utils/session.js +1 -1
  369. package/dist/web/assets/Analytics-COEUXmd4.js +0 -25
  370. package/dist/web/assets/Analytics-RNn1BUbG.css +0 -1
  371. package/dist/web/assets/ConfigTemplates-DLLkS53H.js +0 -1
  372. package/dist/web/assets/Home-DCEyLzwX.js +0 -1
  373. package/dist/web/assets/Home-DYVy4cGZ.css +0 -1
  374. package/dist/web/assets/PluginManager-Oe1ZHoMO.js +0 -1
  375. package/dist/web/assets/ProjectList-CWjuAFof.js +0 -1
  376. package/dist/web/assets/ProjectList-VeMNXfgO.css +0 -1
  377. package/dist/web/assets/SessionList-C4chCPxK.css +0 -1
  378. package/dist/web/assets/SessionList-v3ehGg9U.js +0 -1
  379. package/dist/web/assets/SkillManager-BsX8Qpj0.css +0 -1
  380. package/dist/web/assets/SkillManager-DUF_qP5S.js +0 -1
  381. package/dist/web/assets/WorkspaceManager-CjAWBosO.js +0 -1
  382. package/dist/web/assets/icons-nGdSKQn2.js +0 -1
  383. package/dist/web/assets/index-D5hyHPj7.js +0 -2
  384. package/dist/web/assets/index-bJRG3RXH.css +0 -1
  385. package/dist/web/assets/markdown-BNJfEgCA.js +0 -1
  386. package/dist/web/assets/markdown-BfC0goYb.css +0 -10
  387. package/dist/web/assets/naive-ui-BALVpMgd.js +0 -1
  388. package/dist/web/assets/vendors-DQA4Hw9v.js +0 -7
  389. package/dist/web/assets/vue-vendor-B5RqjEjQ.js +0 -45
  390. package/src/config/model-pricing.js +0 -35
  391. package/src/server/api/channels.js +0 -439
  392. package/src/server/api/claude-hooks.js +0 -56
  393. package/src/server/api/claude-statistics.js +0 -57
  394. package/src/server/api/codex-channels.js +0 -491
  395. package/src/server/api/codex-projects.js +0 -117
  396. package/src/server/api/codex-proxy.js +0 -293
  397. package/src/server/api/codex-sessions.js +0 -652
  398. package/src/server/api/codex-statistics.js +0 -57
  399. package/src/server/api/gemini-channels.js +0 -392
  400. package/src/server/api/gemini-projects.js +0 -103
  401. package/src/server/api/gemini-proxy.js +0 -231
  402. package/src/server/api/gemini-sessions.js +0 -550
  403. package/src/server/api/gemini-statistics.js +0 -57
  404. package/src/server/api/health-check.js +0 -31
  405. package/src/server/api/oauth-credentials.js +0 -198
  406. package/src/server/api/omp-channels.js +0 -575
  407. package/src/server/api/omp-projects.js +0 -88
  408. package/src/server/api/omp-proxy.js +0 -125
  409. package/src/server/api/omp-sessions.js +0 -386
  410. package/src/server/api/omp-statistics.js +0 -40
  411. package/src/server/api/opencode-channels.js +0 -471
  412. package/src/server/api/opencode-projects.js +0 -110
  413. package/src/server/api/opencode-proxy.js +0 -354
  414. package/src/server/api/opencode-sessions.js +0 -466
  415. package/src/server/api/opencode-statistics.js +0 -57
  416. package/src/server/api/projects.js +0 -120
  417. package/src/server/api/proxy.js +0 -330
  418. package/src/server/api/sessions.js +0 -810
  419. package/src/server/services/oauth-credentials-service.js +0 -945
  420. package/src/server/services/omp-session-log-observer.js +0 -138
  421. package/src/server/services/opencode-gateway-adapters.js +0 -43
  422. package/src/server/services/project-snapshots.js +0 -59
  423. package/src/server/services/proxy-log-helper.js +0 -298
  424. package/src/server/services/session-cache.js +0 -127
  425. package/src/server/services/session-converter.js +0 -582
  426. package/src/server/services/session-history-adapters/claude.js +0 -235
  427. /package/src/{server/services/claude-token-recovery.js → platforms/drivers/claude/token-recovery.js} +0 -0
  428. /package/src/{server/services/codex-parser.js → platforms/drivers/codex/parser.js} +0 -0
  429. /package/src/{server/services/codex-speed-test-template.json → platforms/drivers/codex/speed-test-template.json} +0 -0
  430. /package/src/{server/services/codex-wire.js → platforms/drivers/codex/wire.js} +0 -0
  431. /package/src/{server/services/omp-auth-gateway-client.js → platforms/drivers/omp/auth-gateway-client.js} +0 -0
  432. /package/src/{server/services/opencode-normalization.js → platforms/drivers/opencode/normalization.js} +0 -0
  433. /package/src/{server/services → shared}/config-artifact-paths.js +0 -0
  434. /package/src/{server/services/base → shared}/proxy-utils.js +0 -0
@@ -1,9 +1,29 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
- const { getCodexDir } = require('./codex-config');
4
- const { parseSession, parseSessionMeta, extractSessionMeta, readJSONL } = require('./codex-parser');
5
- const { globalCache, CacheKeys } = require('./enhanced-cache');
6
- const { listProjects: idxListProjects, listSessions: idxListSessions, getSessionStatus: idxGetSessionStatus, getRecentSessions: idxGetRecent, searchSessions: idxSearch } = require('./session-history-index');
3
+ const { getCodexDir } = require('./config');
4
+ const { parseSession, parseSessionMeta, extractSessionMeta, readJSONL } = require('./parser');
5
+ const { globalCache, CacheKeys } = require('../../../server/services/enhanced-cache');
6
+ let sessionHistoryIndex = null;
7
+ let codexDirOverride = null;
8
+
9
+ function configure({ sessionHistoryIndex: index, pathContext } = {}) {
10
+ sessionHistoryIndex = index || null;
11
+ codexDirOverride = pathContext?.customized ? (pathContext.native?.dir || null) : null;
12
+ }
13
+
14
+ function getSessionHistoryIndex(options = {}) {
15
+ if (!sessionHistoryIndex) {
16
+ const { getDefaultDependencies } = require('../../../platforms/runtime');
17
+ sessionHistoryIndex = getDefaultDependencies().sessionHistoryIndex;
18
+ if (!sessionHistoryIndex) {
19
+ const indexModule = require('../../../server/services/session-history-index');
20
+ sessionHistoryIndex = Object.keys(options).length > 0
21
+ ? indexModule.createSessionHistoryIndex({ config: options })
22
+ : indexModule;
23
+ }
24
+ }
25
+ return sessionHistoryIndex;
26
+ }
7
27
 
8
28
  const COUNTS_CACHE_TTL_MS = 30 * 1000;
9
29
  const SCAN_FILES_CACHE_TTL_MS = 15 * 1000;
@@ -44,7 +64,7 @@ function getCodexSessionsCacheKey(projectName) {
44
64
  * 获取会话目录
45
65
  */
46
66
  function getSessionsDir() {
47
- return path.join(getCodexDir(), 'sessions');
67
+ return path.join(codexDirOverride || getCodexDir(), 'sessions');
48
68
  }
49
69
 
50
70
  /**
@@ -229,7 +249,8 @@ function normalizeSession(codexSession) {
229
249
  * @returns {Array} 项目对象数组
230
250
  */
231
251
  async function getProjects(options = {}) {
232
- const projects = await idxListProjects('codex', options);
252
+ if (!fs.existsSync(getSessionsDir())) return [];
253
+ const projects = await getSessionHistoryIndex({ ...options, projectsDir: getSessionsDir() }).listProjects('codex', options);
233
254
  const savedOrder = getProjectOrder();
234
255
  if (savedOrder.length === 0) return projects;
235
256
 
@@ -245,9 +266,9 @@ async function getProjects(options = {}) {
245
266
  * @returns {Array} 归一化的会话数组
246
267
  */
247
268
  async function getSessionsByProject(projectName, options = {}) {
248
- const indexed = await idxListSessions('codex', projectName, options);
249
- const forkRelations = require('./sessions').getForkRelations();
250
- const aliases = require('./alias').loadAliases();
269
+ const indexed = await getSessionHistoryIndex().listSessions('codex', projectName, options);
270
+ const forkRelations = require('../claude/sessions-implementation').getForkRelations();
271
+ const aliases = require('../../../server/services/alias').loadAliases();
251
272
  const sessions = indexed.map(session => ({
252
273
  ...session,
253
274
  mtime: new Date(session.mtime).toISOString(),
@@ -269,7 +290,7 @@ async function getSessionsByProject(projectName, options = {}) {
269
290
  * @returns {Object|null} 归一化的会话对象
270
291
  */
271
292
  async function getSessionById(sessionId) {
272
- const status = await idxGetSessionStatus('codex', sessionId);
293
+ const status = await getSessionHistoryIndex().getSessionStatus('codex', sessionId);
273
294
  if (!status) return null;
274
295
  const session = parseSession(status.filePath);
275
296
  if (!session) return null;
@@ -282,7 +303,7 @@ async function getSessionById(sessionId) {
282
303
  * @returns {Array} 搜索结果
283
304
  */
284
305
  async function searchSessions(keyword) {
285
- return idxSearch('codex', keyword);
306
+ return getSessionHistoryIndex().searchSessions('codex', keyword);
286
307
  }
287
308
 
288
309
  /**
@@ -305,8 +326,8 @@ function deleteProject(projectName) {
305
326
 
306
327
  // 删除所有会话文件
307
328
  let deletedCount = 0;
308
- const { getForkRelations, saveForkRelations } = require('./sessions');
309
- const { deleteAlias } = require('./alias');
329
+ const { getForkRelations, saveForkRelations } = require('../claude/sessions-implementation');
330
+ const { deleteAlias } = require('../../../server/services/alias');
310
331
  const forkRelations = getForkRelations();
311
332
  let forkRelationsModified = false;
312
333
 
@@ -377,9 +398,9 @@ function deleteProject(projectName) {
377
398
  * @returns {Array} 最近会话数组
378
399
  */
379
400
  async function getRecentSessions(limit = 5) {
380
- const indexed = await idxGetRecent('codex', limit);
381
- const forkRelations = require('./sessions').getForkRelations();
382
- const aliases = require('./alias').loadAliases();
401
+ const indexed = await getSessionHistoryIndex().getRecentSessions('codex', limit);
402
+ const forkRelations = require('../claude/sessions-implementation').getForkRelations();
403
+ const aliases = require('../../../server/services/alias').loadAliases();
383
404
  return indexed.map(session => ({
384
405
  ...session,
385
406
  mtime: new Date(session.mtime).toISOString(),
@@ -404,7 +425,7 @@ function deleteSession(sessionId) {
404
425
  fs.unlinkSync(targetFile.filePath);
405
426
 
406
427
  // 清理 fork 关系
407
- const { getForkRelations, saveForkRelations } = require('./sessions');
428
+ const { getForkRelations, saveForkRelations } = require('../claude/sessions-implementation');
408
429
  const forkRelations = getForkRelations();
409
430
 
410
431
  // 删除作为源的 fork 关系
@@ -420,7 +441,7 @@ function deleteSession(sessionId) {
420
441
  saveForkRelations(forkRelations);
421
442
 
422
443
  // 清理别名
423
- const { deleteAlias } = require('./alias');
444
+ const { deleteAlias } = require('../../../server/services/alias');
424
445
  try {
425
446
  deleteAlias(sessionId);
426
447
  } catch (err) {
@@ -444,17 +465,17 @@ function forkSession(sessionId, options = {}) {
444
465
  throw new Error('Session not found');
445
466
  }
446
467
 
447
- // 读取原会话文件内容
448
- const originalContent = fs.readFileSync(sourceFile.filePath, 'utf8');
449
- const content = sliceCodexContentByUserMessage(
450
- originalContent,
451
- options.afterUserMessageNumber
452
- );
453
-
454
468
  // 生成新的 session ID (使用 crypto.randomUUID 生成 v4 UUID)
455
469
  const crypto = require('crypto');
456
470
  const newSessionId = crypto.randomUUID();
457
471
 
472
+ // 读取原会话文件内容,并确保副本的原生元数据使用新 ID
473
+ const originalContent = fs.readFileSync(sourceFile.filePath, 'utf8');
474
+ const content = rewriteCodexSessionId(
475
+ sliceCodexContentByUserMessage(originalContent, options.afterUserMessageNumber),
476
+ newSessionId
477
+ );
478
+
458
479
  // 生成新的时间戳(Codex 格式:YYYY-MM-DDTHH-MM-SS)
459
480
  const now = new Date();
460
481
  const timestamp = now.toISOString()
@@ -480,12 +501,12 @@ function forkSession(sessionId, options = {}) {
480
501
  fs.writeFileSync(newFilePath, content, 'utf8');
481
502
 
482
503
  // 保存 fork 关系(复用 Claude Code 的 fork 关系存储)
483
- const { getForkRelations, saveForkRelations } = require('./sessions');
504
+ const { getForkRelations, saveForkRelations } = require('../claude/sessions-implementation');
484
505
  const forkRelations = getForkRelations();
485
506
  forkRelations[newSessionId] = sessionId;
486
507
  saveForkRelations(forkRelations);
487
508
  if (options.alias) {
488
- const { setAlias } = require('./alias');
509
+ const { setAlias } = require('../../../server/services/alias');
489
510
  setAlias(newSessionId, options.alias);
490
511
  }
491
512
 
@@ -506,7 +527,7 @@ function forkSession(sessionId, options = {}) {
506
527
  * @returns {Array} 会话 ID 数组
507
528
  */
508
529
  function getSessionOrder(projectName) {
509
- const { getSessionOrder: getClaudeSessionOrder } = require('./sessions');
530
+ const { getSessionOrder: getClaudeSessionOrder } = require('../claude/sessions-implementation');
510
531
  // 复用 Claude Code 的排序存储,使用 "codex-" 前缀区分
511
532
  return getClaudeSessionOrder(`codex-${projectName}`);
512
533
  }
@@ -517,7 +538,7 @@ function getSessionOrder(projectName) {
517
538
  * @param {Array} order - 会话 ID 数组
518
539
  */
519
540
  function saveSessionOrder(projectName, order) {
520
- const { saveSessionOrder: saveClaudeSessionOrder } = require('./sessions');
541
+ const { saveSessionOrder: saveClaudeSessionOrder } = require('../claude/sessions-implementation');
521
542
  // 复用 Claude Code 的排序存储,使用 "codex-" 前缀区分
522
543
  saveClaudeSessionOrder(`codex-${projectName}`, order);
523
544
  const cacheKey = getCodexSessionsCacheKey(projectName);
@@ -530,10 +551,10 @@ function saveSessionOrder(projectName, order) {
530
551
  * @returns {Array} 项目名称数组
531
552
  */
532
553
  function getProjectOrder() {
533
- const { getProjectOrder: getClaudeProjectOrder } = require('./sessions');
534
- const { getCodexDir } = require('./codex-config');
554
+ const { getProjectOrder: getClaudeProjectOrder } = require('../claude/sessions-implementation');
555
+ const { getCodexDir } = require('./config');
535
556
  // 复用 Claude Code 的排序存储,使用特殊的配置对象标识 Codex
536
- return getClaudeProjectOrder({ projectsDir: getCodexDir() });
557
+ return getClaudeProjectOrder({ projectsDir: codexDirOverride || getCodexDir() });
537
558
  }
538
559
 
539
560
  /**
@@ -541,10 +562,10 @@ function getProjectOrder() {
541
562
  * @param {Array} order - 项目名称数组
542
563
  */
543
564
  function saveProjectOrder(order) {
544
- const { saveProjectOrder: saveClaudeProjectOrder } = require('./sessions');
545
- const { getCodexDir } = require('./codex-config');
565
+ const { saveProjectOrder: saveClaudeProjectOrder } = require('../claude/sessions-implementation');
566
+ const { getCodexDir } = require('./config');
546
567
  // 复用 Claude Code 的排序存储
547
- saveClaudeProjectOrder({ projectsDir: getCodexDir() }, order);
568
+ saveClaudeProjectOrder({ projectsDir: codexDirOverride || getCodexDir() }, order);
548
569
  globalCache.delete(CODEX_PROJECTS_CACHE_KEY);
549
570
  }
550
571
 
@@ -644,6 +665,22 @@ function joinTextPreserveEol(lines, eol, hasTrailingEol) {
644
665
  return hasTrailingEol ? `${text}${eol}` : text;
645
666
  }
646
667
 
668
+ function rewriteCodexSessionId(content, sessionId) {
669
+ const { lines, eol, hasTrailingEol } = splitTextPreserveEol(content);
670
+ const rewritten = lines.map(line => {
671
+ if (!line.trim()) return line;
672
+ try {
673
+ const record = JSON.parse(line);
674
+ if (record?.type === 'session_meta' && record.payload && typeof record.payload === 'object') {
675
+ record.payload.id = sessionId;
676
+ return JSON.stringify(record);
677
+ }
678
+ } catch (_) {}
679
+ return line;
680
+ });
681
+ return joinTextPreserveEol(rewritten, eol, hasTrailingEol);
682
+ }
683
+
647
684
  function sliceCodexContentByUserMessage(content, afterUserMessageNumber) {
648
685
  if (!Number.isInteger(afterUserMessageNumber) || afterUserMessageNumber <= 0) {
649
686
  return content;
@@ -767,54 +804,23 @@ function findSessionFileById(sessionId) {
767
804
  return null;
768
805
  }
769
806
 
770
- function calculateProjectAndSessionCounts() {
771
- const sessions = scanSessionFiles();
772
- if (sessions.length === 0) {
773
- return EMPTY_COUNTS;
774
- }
775
-
776
- const projectNames = new Set();
777
- sessions.forEach((session) => {
778
- const payload = readSessionMetaPayloadFast(session.filePath);
779
- const projectName = extractCodexProjectNameFromMeta(payload || {});
780
- if (projectName) {
781
- projectNames.add(projectName);
782
- }
783
- });
784
-
785
- return {
786
- projectCount: projectNames.size,
787
- sessionCount: sessions.length
788
- };
789
- }
790
807
 
791
808
  /**
792
809
  * 获取 Codex 项目与会话数量(用于仪表盘轻量统计)
793
810
  */
794
- function getProjectAndSessionCounts(options = {}) {
795
- const now = Date.now();
796
- if (options.force) {
797
- countsCache.expiresAt = 0;
798
- scanFilesCache.expiresAt = 0;
799
- sessionFileIndexCache.expiresAt = 0;
800
- }
801
- if (!options.force && countsCache.expiresAt > now) {
802
- return countsCache.value;
803
- }
804
-
805
- try {
806
- const counts = calculateProjectAndSessionCounts();
807
- countsCache = {
808
- value: counts,
809
- expiresAt: now + COUNTS_CACHE_TTL_MS
810
- };
811
- return counts;
812
- } catch (err) {
813
- return countsCache.value || EMPTY_COUNTS;
811
+ async function getProjectAndSessionCounts(options = {}) {
812
+ if (!fs.existsSync(getSessionsDir())) {
813
+ return { projectCount: 0, sessionCount: 0 };
814
814
  }
815
+ const projects = await getSessionHistoryIndex({ ...options, projectsDir: getSessionsDir() }).listProjects('codex', options);
816
+ return {
817
+ projectCount: projects.length,
818
+ sessionCount: projects.reduce((sum, project) => sum + (project.sessionCount || 0), 0)
819
+ };
815
820
  }
816
821
 
817
822
  module.exports = {
823
+ configure,
818
824
  getSessionsDir,
819
825
  scanSessionFiles,
820
826
  getAllSessions,
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ const { createCapabilityDriver } = require('../../../shared/capability-driver');
4
+
5
+ function createDriver(context = {}) {
6
+ return createCapabilityDriver({
7
+ ...context,
8
+ platform: 'codex',
9
+ capability: 'sessions',
10
+ parserVersion: 2,
11
+ servicePath: './codex/sessions-implementation',
12
+ localServicePath: '../platforms/drivers/codex/sessions-implementation',
13
+ adapterLocalPath: '../platforms/drivers/codex/session-history-adapter',
14
+ adapterMethods: { inventory: 'inventory', parse: 'parse' },
15
+ methods: {
16
+ listSessions: 'getSessionsByProject',
17
+ recent: 'getRecentSessions',
18
+ search: 'searchSessions',
19
+ getSessionById: 'getSessionById',
20
+ delete: 'deleteSession',
21
+ fork: 'forkSession',
22
+ saveSessionOrder: 'saveSessionOrder',
23
+ getSessionOrder: 'getSessionOrder',
24
+ getProjectOrder: 'getProjectOrder',
25
+ status: 'getSessionStatus',
26
+ messages: 'getSessionMessages'
27
+ },
28
+ onSuccess: operation => {
29
+ if (['delete', 'fork', 'saveSessionOrder'].includes(operation)) {
30
+ context.sessionHistoryIndex?.invalidateSource('codex');
31
+ }
32
+ }
33
+ });
34
+ }
35
+
36
+ module.exports = { createDriver };
@@ -3,8 +3,8 @@ const {
3
3
  getStatistics: getSharedStatistics,
4
4
  getDailyStatistics: getSharedDailyStatistics,
5
5
  getTodayStatistics: getSharedTodayStatistics
6
- } = require('./statistics-service');
7
- const { normalizeUsageTokens, toNumber } = require('./proxy-log-helper');
6
+ } = require('../../../server/services/statistics-service');
7
+ const { normalizeUsageTokens, toNumber } = require('../../../server/services/usage-log-utils');
8
8
 
9
9
  const TOOL_TYPE = 'codex';
10
10
 
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const { createCapabilityDriver } = require('../../../shared/capability-driver');
4
+
5
+ function createDriver(context = {}) {
6
+ return createCapabilityDriver({
7
+ ...context,
8
+ platform: 'codex',
9
+ capability: 'statistics',
10
+ servicePath: './codex/statistics-implementation',
11
+ localServicePath: '../platforms/drivers/codex/statistics-implementation',
12
+ methods: {"getStatistics":"getStatistics","getDailyStatistics":"getDailyStatistics","getTodayStatistics":"getTodayStatistics","recordRequest":"recordRequest","resetStatistics":"resetStatistics"}
13
+ });
14
+ }
15
+
16
+ module.exports = { createDriver };
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ const { createApiOperationsDriver } = require('../../../shared/driver-factories/api');
4
+
5
+ function createDriver(context = {}) {
6
+ return createApiOperationsDriver({ ...context, platform: 'gemini' });
7
+ }
8
+
9
+ module.exports = { createDriver };