@kaitranntt/ccs 8.4.0 → 8.5.0-dev.2

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 (767) hide show
  1. package/README.md +5 -2
  2. package/config/base-claude.settings.json +1 -1
  3. package/config/base-glm.settings.json +4 -4
  4. package/config/base-glmt.settings.json +4 -4
  5. package/config/base-km.settings.json +4 -4
  6. package/config/base-mm.settings.json +4 -4
  7. package/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
  8. package/dist/api/services/cliproxy-profile-bridge.js +20 -9
  9. package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
  10. package/dist/api/services/profile-lifecycle-validation.d.ts.map +1 -1
  11. package/dist/api/services/profile-lifecycle-validation.js +2 -0
  12. package/dist/api/services/profile-lifecycle-validation.js.map +1 -1
  13. package/dist/api/services/profile-writer.d.ts.map +1 -1
  14. package/dist/api/services/profile-writer.js +18 -8
  15. package/dist/api/services/profile-writer.js.map +1 -1
  16. package/dist/auth/commands/backup-command.d.ts.map +1 -1
  17. package/dist/auth/commands/backup-command.js +0 -1
  18. package/dist/auth/commands/backup-command.js.map +1 -1
  19. package/dist/auth/commands/create-command.d.ts.map +1 -1
  20. package/dist/auth/commands/create-command.js +4 -14
  21. package/dist/auth/commands/create-command.js.map +1 -1
  22. package/dist/auth/commands/default-command.d.ts.map +1 -1
  23. package/dist/auth/commands/default-command.js +0 -1
  24. package/dist/auth/commands/default-command.js.map +1 -1
  25. package/dist/auth/commands/index.d.ts +2 -1
  26. package/dist/auth/commands/index.d.ts.map +1 -1
  27. package/dist/auth/commands/index.js +0 -1
  28. package/dist/auth/commands/index.js.map +1 -1
  29. package/dist/auth/commands/remove-command.d.ts.map +1 -1
  30. package/dist/auth/commands/remove-command.js +0 -2
  31. package/dist/auth/commands/remove-command.js.map +1 -1
  32. package/dist/auth/commands/resources-command.d.ts.map +1 -1
  33. package/dist/auth/commands/resources-command.js +0 -1
  34. package/dist/auth/commands/resources-command.js.map +1 -1
  35. package/dist/auth/commands/show-command.d.ts.map +1 -1
  36. package/dist/auth/commands/show-command.js +0 -1
  37. package/dist/auth/commands/show-command.js.map +1 -1
  38. package/dist/auth/commands/types.d.ts.map +1 -1
  39. package/dist/auth/commands/types.js +0 -1
  40. package/dist/auth/commands/types.js.map +1 -1
  41. package/dist/auth/profile-registry.d.ts +3 -1
  42. package/dist/auth/profile-registry.d.ts.map +1 -1
  43. package/dist/auth/profile-registry.js +21 -15
  44. package/dist/auth/profile-registry.js.map +1 -1
  45. package/dist/ccs.js +27 -21
  46. package/dist/ccs.js.map +1 -1
  47. package/dist/cliproxy/accounts/account-safety.d.ts.map +1 -1
  48. package/dist/cliproxy/accounts/account-safety.js +56 -56
  49. package/dist/cliproxy/accounts/account-safety.js.map +1 -1
  50. package/dist/cliproxy/auth/antigravity-responsibility.d.ts.map +1 -1
  51. package/dist/cliproxy/auth/antigravity-responsibility.js +15 -15
  52. package/dist/cliproxy/auth/antigravity-responsibility.js.map +1 -1
  53. package/dist/cliproxy/auth/auth-token-manager.d.ts.map +1 -1
  54. package/dist/cliproxy/auth/auth-token-manager.js +2 -1
  55. package/dist/cliproxy/auth/auth-token-manager.js.map +1 -1
  56. package/dist/cliproxy/auth/auth-types.d.ts.map +1 -1
  57. package/dist/cliproxy/auth/auth-types.js +3 -2
  58. package/dist/cliproxy/auth/auth-types.js.map +1 -1
  59. package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
  60. package/dist/cliproxy/auth/oauth-handler.js +16 -5
  61. package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
  62. package/dist/cliproxy/auth/provider-refreshers/index.d.ts +2 -1
  63. package/dist/cliproxy/auth/provider-refreshers/index.d.ts.map +1 -1
  64. package/dist/cliproxy/auth/provider-refreshers/index.js +4 -2
  65. package/dist/cliproxy/auth/provider-refreshers/index.js.map +1 -1
  66. package/dist/cliproxy/auth/token-manager.d.ts +2 -1
  67. package/dist/cliproxy/auth/token-manager.d.ts.map +1 -1
  68. package/dist/cliproxy/auth/token-manager.js +2 -1
  69. package/dist/cliproxy/auth/token-manager.js.map +1 -1
  70. package/dist/cliproxy/binary/lifecycle.d.ts.map +1 -1
  71. package/dist/cliproxy/binary/lifecycle.js +3 -2
  72. package/dist/cliproxy/binary/lifecycle.js.map +1 -1
  73. package/dist/cliproxy/binary/platform-detector.d.ts +1 -1
  74. package/dist/cliproxy/binary/platform-detector.d.ts.map +1 -1
  75. package/dist/cliproxy/config/env-builder.d.ts +7 -2
  76. package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
  77. package/dist/cliproxy/config/env-builder.js +53 -18
  78. package/dist/cliproxy/config/env-builder.js.map +1 -1
  79. package/dist/cliproxy/config/model-config.d.ts.map +1 -1
  80. package/dist/cliproxy/config/model-config.js +32 -32
  81. package/dist/cliproxy/config/model-config.js.map +1 -1
  82. package/dist/cliproxy/config/provider-route.d.ts +13 -0
  83. package/dist/cliproxy/config/provider-route.d.ts.map +1 -0
  84. package/dist/cliproxy/config/provider-route.js +38 -0
  85. package/dist/cliproxy/config/provider-route.js.map +1 -0
  86. package/dist/cliproxy/executor/arg-parser.d.ts.map +1 -1
  87. package/dist/cliproxy/executor/arg-parser.js +26 -26
  88. package/dist/cliproxy/executor/arg-parser.js.map +1 -1
  89. package/dist/cliproxy/executor/auth-coordinator.d.ts.map +1 -1
  90. package/dist/cliproxy/executor/auth-coordinator.js +15 -14
  91. package/dist/cliproxy/executor/auth-coordinator.js.map +1 -1
  92. package/dist/cliproxy/executor/browser-launch-setup.d.ts.map +1 -1
  93. package/dist/cliproxy/executor/browser-launch-setup.js +6 -2
  94. package/dist/cliproxy/executor/browser-launch-setup.js.map +1 -1
  95. package/dist/cliproxy/executor/env-resolver.d.ts.map +1 -1
  96. package/dist/cliproxy/executor/env-resolver.js +5 -1
  97. package/dist/cliproxy/executor/env-resolver.js.map +1 -1
  98. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  99. package/dist/cliproxy/executor/index.js +27 -17
  100. package/dist/cliproxy/executor/index.js.map +1 -1
  101. package/dist/cliproxy/executor/lifecycle-manager.d.ts.map +1 -1
  102. package/dist/cliproxy/executor/lifecycle-manager.js +18 -16
  103. package/dist/cliproxy/executor/lifecycle-manager.js.map +1 -1
  104. package/dist/cliproxy/executor/model-warnings.d.ts.map +1 -1
  105. package/dist/cliproxy/executor/model-warnings.js +24 -13
  106. package/dist/cliproxy/executor/model-warnings.js.map +1 -1
  107. package/dist/cliproxy/executor/proxy-chain-builder.d.ts.map +1 -1
  108. package/dist/cliproxy/executor/proxy-chain-builder.js +5 -1
  109. package/dist/cliproxy/executor/proxy-chain-builder.js.map +1 -1
  110. package/dist/cliproxy/executor/retry-handler.d.ts.map +1 -1
  111. package/dist/cliproxy/executor/retry-handler.js +13 -11
  112. package/dist/cliproxy/executor/retry-handler.js.map +1 -1
  113. package/dist/cliproxy/executor/session-bridge.d.ts.map +1 -1
  114. package/dist/cliproxy/executor/session-bridge.js +18 -10
  115. package/dist/cliproxy/executor/session-bridge.js.map +1 -1
  116. package/dist/cliproxy/management/remote-token-uploader.d.ts.map +1 -1
  117. package/dist/cliproxy/management/remote-token-uploader.js +11 -11
  118. package/dist/cliproxy/management/remote-token-uploader.js.map +1 -1
  119. package/dist/cliproxy/provider-capabilities.d.ts +6 -0
  120. package/dist/cliproxy/provider-capabilities.d.ts.map +1 -1
  121. package/dist/cliproxy/provider-capabilities.js +28 -3
  122. package/dist/cliproxy/provider-capabilities.js.map +1 -1
  123. package/dist/cliproxy/proxy/https-tunnel-proxy.d.ts +5 -1
  124. package/dist/cliproxy/proxy/https-tunnel-proxy.d.ts.map +1 -1
  125. package/dist/cliproxy/proxy/https-tunnel-proxy.js +22 -10
  126. package/dist/cliproxy/proxy/https-tunnel-proxy.js.map +1 -1
  127. package/dist/cliproxy/proxy/tool-sanitization-proxy.d.ts +0 -12
  128. package/dist/cliproxy/proxy/tool-sanitization-proxy.d.ts.map +1 -1
  129. package/dist/cliproxy/proxy/tool-sanitization-proxy.js +42 -72
  130. package/dist/cliproxy/proxy/tool-sanitization-proxy.js.map +1 -1
  131. package/dist/cliproxy/quota/quota-fetcher/account-quota-fetcher.d.ts +21 -0
  132. package/dist/cliproxy/quota/quota-fetcher/account-quota-fetcher.d.ts.map +1 -0
  133. package/dist/cliproxy/quota/quota-fetcher/account-quota-fetcher.js +154 -0
  134. package/dist/cliproxy/quota/quota-fetcher/account-quota-fetcher.js.map +1 -0
  135. package/dist/cliproxy/quota/quota-fetcher/all-accounts-fetcher.d.ts +35 -0
  136. package/dist/cliproxy/quota/quota-fetcher/all-accounts-fetcher.d.ts.map +1 -0
  137. package/dist/cliproxy/quota/quota-fetcher/all-accounts-fetcher.js +98 -0
  138. package/dist/cliproxy/quota/quota-fetcher/all-accounts-fetcher.js.map +1 -0
  139. package/dist/cliproxy/quota/quota-fetcher/auth-file-reader.d.ts +22 -0
  140. package/dist/cliproxy/quota/quota-fetcher/auth-file-reader.d.ts.map +1 -0
  141. package/dist/cliproxy/quota/quota-fetcher/auth-file-reader.js +111 -0
  142. package/dist/cliproxy/quota/quota-fetcher/auth-file-reader.js.map +1 -0
  143. package/dist/cliproxy/quota/quota-fetcher/available-models-fetcher.d.ts +17 -0
  144. package/dist/cliproxy/quota/quota-fetcher/available-models-fetcher.d.ts.map +1 -0
  145. package/dist/cliproxy/quota/quota-fetcher/available-models-fetcher.js +85 -0
  146. package/dist/cliproxy/quota/quota-fetcher/available-models-fetcher.js.map +1 -0
  147. package/dist/cliproxy/quota/quota-fetcher/constants.d.ts +25 -0
  148. package/dist/cliproxy/quota/quota-fetcher/constants.d.ts.map +1 -0
  149. package/dist/cliproxy/quota/quota-fetcher/constants.js +31 -0
  150. package/dist/cliproxy/quota/quota-fetcher/constants.js.map +1 -0
  151. package/dist/cliproxy/quota/quota-fetcher/http-client.d.ts +29 -0
  152. package/dist/cliproxy/quota/quota-fetcher/http-client.d.ts.map +1 -0
  153. package/dist/cliproxy/quota/quota-fetcher/http-client.js +199 -0
  154. package/dist/cliproxy/quota/quota-fetcher/http-client.js.map +1 -0
  155. package/dist/cliproxy/quota/quota-fetcher/project-lookup.d.ts +16 -0
  156. package/dist/cliproxy/quota/quota-fetcher/project-lookup.d.ts.map +1 -0
  157. package/dist/cliproxy/quota/quota-fetcher/project-lookup.js +89 -0
  158. package/dist/cliproxy/quota/quota-fetcher/project-lookup.js.map +1 -0
  159. package/dist/cliproxy/quota/quota-fetcher/status-classifier.d.ts +29 -0
  160. package/dist/cliproxy/quota/quota-fetcher/status-classifier.d.ts.map +1 -0
  161. package/dist/cliproxy/quota/quota-fetcher/status-classifier.js +168 -0
  162. package/dist/cliproxy/quota/quota-fetcher/status-classifier.js.map +1 -0
  163. package/dist/cliproxy/quota/quota-fetcher/types.d.ts +165 -0
  164. package/dist/cliproxy/quota/quota-fetcher/types.d.ts.map +1 -0
  165. package/dist/cliproxy/quota/quota-fetcher/types.js +9 -0
  166. package/dist/cliproxy/quota/quota-fetcher/types.js.map +1 -0
  167. package/dist/cliproxy/quota/quota-fetcher-claude.d.ts.map +1 -1
  168. package/dist/cliproxy/quota/quota-fetcher-claude.js +14 -3
  169. package/dist/cliproxy/quota/quota-fetcher-claude.js.map +1 -1
  170. package/dist/cliproxy/quota/quota-fetcher-codex.d.ts.map +1 -1
  171. package/dist/cliproxy/quota/quota-fetcher-codex.js +36 -9
  172. package/dist/cliproxy/quota/quota-fetcher-codex.js.map +1 -1
  173. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/auth-file-discovery.d.ts +26 -0
  174. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/auth-file-discovery.d.ts.map +1 -0
  175. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/auth-file-discovery.js +132 -0
  176. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/auth-file-discovery.js.map +1 -0
  177. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/bucket-building.d.ts +23 -0
  178. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/bucket-building.d.ts.map +1 -0
  179. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/bucket-building.js +54 -0
  180. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/bucket-building.js.map +1 -0
  181. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/constants.d.ts +26 -0
  182. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/constants.d.ts.map +1 -0
  183. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/constants.js +29 -0
  184. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/constants.js.map +1 -0
  185. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/error-parsing.d.ts +61 -0
  186. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/error-parsing.d.ts.map +1 -0
  187. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/error-parsing.js +259 -0
  188. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/error-parsing.js.map +1 -0
  189. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/index.d.ts +20 -0
  190. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/index.d.ts.map +1 -0
  191. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/index.js +38 -0
  192. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/index.js.map +1 -0
  193. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/managed-request.d.ts +82 -0
  194. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/managed-request.d.ts.map +1 -0
  195. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/managed-request.js +263 -0
  196. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/managed-request.js.map +1 -0
  197. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/quota-fetcher.d.ts +46 -0
  198. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/quota-fetcher.d.ts.map +1 -0
  199. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/quota-fetcher.js +188 -0
  200. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/quota-fetcher.js.map +1 -0
  201. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/shared-utils.d.ts +35 -0
  202. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/shared-utils.d.ts.map +1 -0
  203. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/shared-utils.js +65 -0
  204. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/shared-utils.js.map +1 -0
  205. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/supplementary-metadata.d.ts +37 -0
  206. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/supplementary-metadata.d.ts.map +1 -0
  207. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/supplementary-metadata.js +117 -0
  208. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/supplementary-metadata.js.map +1 -0
  209. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/token-parsing.d.ts +31 -0
  210. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/token-parsing.d.ts.map +1 -0
  211. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/token-parsing.js +77 -0
  212. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/token-parsing.js.map +1 -0
  213. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/types.d.ts +114 -0
  214. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/types.d.ts.map +1 -0
  215. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/types.js +10 -0
  216. package/dist/cliproxy/quota/quota-fetcher-gemini-cli/types.js.map +1 -0
  217. package/dist/cliproxy/quota/quota-fetcher-gemini-cli.d.ts +13 -58
  218. package/dist/cliproxy/quota/quota-fetcher-gemini-cli.d.ts.map +1 -1
  219. package/dist/cliproxy/quota/quota-fetcher-gemini-cli.js +20 -819
  220. package/dist/cliproxy/quota/quota-fetcher-gemini-cli.js.map +1 -1
  221. package/dist/cliproxy/quota/quota-fetcher-ghcp.d.ts.map +1 -1
  222. package/dist/cliproxy/quota/quota-fetcher-ghcp.js +19 -4
  223. package/dist/cliproxy/quota/quota-fetcher-ghcp.js.map +1 -1
  224. package/dist/cliproxy/quota/quota-fetcher.d.ts +12 -108
  225. package/dist/cliproxy/quota/quota-fetcher.d.ts.map +1 -1
  226. package/dist/cliproxy/quota/quota-fetcher.js +23 -766
  227. package/dist/cliproxy/quota/quota-fetcher.js.map +1 -1
  228. package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
  229. package/dist/cliproxy/quota/quota-manager.js +7 -3
  230. package/dist/cliproxy/quota/quota-manager.js.map +1 -1
  231. package/dist/cliproxy/routing/routing-strategy.d.ts.map +1 -1
  232. package/dist/cliproxy/routing/routing-strategy.js +11 -3
  233. package/dist/cliproxy/routing/routing-strategy.js.map +1 -1
  234. package/dist/commands/api-command/create-command.d.ts.map +1 -1
  235. package/dist/commands/api-command/create-command.js +17 -8
  236. package/dist/commands/api-command/create-command.js.map +1 -1
  237. package/dist/commands/bar/bar-server-probe.d.ts +16 -3
  238. package/dist/commands/bar/bar-server-probe.d.ts.map +1 -1
  239. package/dist/commands/bar/bar-server-probe.js +83 -18
  240. package/dist/commands/bar/bar-server-probe.js.map +1 -1
  241. package/dist/commands/bar/help-subcommand.d.ts.map +1 -1
  242. package/dist/commands/bar/help-subcommand.js +3 -2
  243. package/dist/commands/bar/help-subcommand.js.map +1 -1
  244. package/dist/commands/bar/index.d.ts.map +1 -1
  245. package/dist/commands/bar/index.js +1 -0
  246. package/dist/commands/bar/index.js.map +1 -1
  247. package/dist/commands/bar/install-subcommand.d.ts +4 -10
  248. package/dist/commands/bar/install-subcommand.d.ts.map +1 -1
  249. package/dist/commands/bar/install-subcommand.js +44 -53
  250. package/dist/commands/bar/install-subcommand.js.map +1 -1
  251. package/dist/commands/bar/launch-subcommand.d.ts +11 -1
  252. package/dist/commands/bar/launch-subcommand.d.ts.map +1 -1
  253. package/dist/commands/bar/launch-subcommand.js +82 -15
  254. package/dist/commands/bar/launch-subcommand.js.map +1 -1
  255. package/dist/commands/cliproxy/help-subcommand.js +5 -5
  256. package/dist/commands/cliproxy/help-subcommand.js.map +1 -1
  257. package/dist/commands/cliproxy/index.d.ts.map +1 -1
  258. package/dist/commands/cliproxy/index.js +7 -2
  259. package/dist/commands/cliproxy/index.js.map +1 -1
  260. package/dist/commands/cliproxy/pool-subcommand.d.ts.map +1 -1
  261. package/dist/commands/cliproxy/pool-subcommand.js +4 -2
  262. package/dist/commands/cliproxy/pool-subcommand.js.map +1 -1
  263. package/dist/commands/cliproxy/proxy-lifecycle-subcommand.d.ts +1 -1
  264. package/dist/commands/cliproxy/proxy-lifecycle-subcommand.d.ts.map +1 -1
  265. package/dist/commands/cliproxy/proxy-lifecycle-subcommand.js +13 -1
  266. package/dist/commands/cliproxy/proxy-lifecycle-subcommand.js.map +1 -1
  267. package/dist/commands/cliproxy/quota-subcommand/claude-window-helpers.d.ts +26 -0
  268. package/dist/commands/cliproxy/quota-subcommand/claude-window-helpers.d.ts.map +1 -0
  269. package/dist/commands/cliproxy/quota-subcommand/claude-window-helpers.js +82 -0
  270. package/dist/commands/cliproxy/quota-subcommand/claude-window-helpers.js.map +1 -0
  271. package/dist/commands/cliproxy/quota-subcommand/codex-window-helpers.d.ts +41 -0
  272. package/dist/commands/cliproxy/quota-subcommand/codex-window-helpers.d.ts.map +1 -0
  273. package/dist/commands/cliproxy/quota-subcommand/codex-window-helpers.js +202 -0
  274. package/dist/commands/cliproxy/quota-subcommand/codex-window-helpers.js.map +1 -0
  275. package/dist/commands/cliproxy/quota-subcommand/format-helpers.d.ts +32 -0
  276. package/dist/commands/cliproxy/quota-subcommand/format-helpers.d.ts.map +1 -0
  277. package/dist/commands/cliproxy/quota-subcommand/format-helpers.js +90 -0
  278. package/dist/commands/cliproxy/quota-subcommand/format-helpers.js.map +1 -0
  279. package/dist/commands/cliproxy/quota-subcommand/handlers.d.ts +25 -0
  280. package/dist/commands/cliproxy/quota-subcommand/handlers.d.ts.map +1 -0
  281. package/dist/commands/cliproxy/quota-subcommand/handlers.js +245 -0
  282. package/dist/commands/cliproxy/quota-subcommand/handlers.js.map +1 -0
  283. package/dist/commands/cliproxy/quota-subcommand/profile-args.d.ts +10 -0
  284. package/dist/commands/cliproxy/quota-subcommand/profile-args.d.ts.map +1 -0
  285. package/dist/commands/cliproxy/quota-subcommand/profile-args.js +37 -0
  286. package/dist/commands/cliproxy/quota-subcommand/profile-args.js.map +1 -0
  287. package/dist/commands/cliproxy/quota-subcommand/provider-runtime.d.ts +12 -0
  288. package/dist/commands/cliproxy/quota-subcommand/provider-runtime.d.ts.map +1 -0
  289. package/dist/commands/cliproxy/quota-subcommand/provider-runtime.js +64 -0
  290. package/dist/commands/cliproxy/quota-subcommand/provider-runtime.js.map +1 -0
  291. package/dist/commands/cliproxy/quota-subcommand/quota-failure-display.d.ts +27 -0
  292. package/dist/commands/cliproxy/quota-subcommand/quota-failure-display.d.ts.map +1 -0
  293. package/dist/commands/cliproxy/quota-subcommand/quota-failure-display.js +74 -0
  294. package/dist/commands/cliproxy/quota-subcommand/quota-failure-display.js.map +1 -0
  295. package/dist/commands/cliproxy/quota-subcommand/sections/antigravity.d.ts +10 -0
  296. package/dist/commands/cliproxy/quota-subcommand/sections/antigravity.d.ts.map +1 -0
  297. package/dist/commands/cliproxy/quota-subcommand/sections/antigravity.js +46 -0
  298. package/dist/commands/cliproxy/quota-subcommand/sections/antigravity.js.map +1 -0
  299. package/dist/commands/cliproxy/quota-subcommand/sections/claude.d.ts +14 -0
  300. package/dist/commands/cliproxy/quota-subcommand/sections/claude.d.ts.map +1 -0
  301. package/dist/commands/cliproxy/quota-subcommand/sections/claude.js +68 -0
  302. package/dist/commands/cliproxy/quota-subcommand/sections/claude.js.map +1 -0
  303. package/dist/commands/cliproxy/quota-subcommand/sections/codex.d.ts +14 -0
  304. package/dist/commands/cliproxy/quota-subcommand/sections/codex.d.ts.map +1 -0
  305. package/dist/commands/cliproxy/quota-subcommand/sections/codex.js +82 -0
  306. package/dist/commands/cliproxy/quota-subcommand/sections/codex.js.map +1 -0
  307. package/dist/commands/cliproxy/quota-subcommand/sections/gemini-cli.d.ts +14 -0
  308. package/dist/commands/cliproxy/quota-subcommand/sections/gemini-cli.d.ts.map +1 -0
  309. package/dist/commands/cliproxy/quota-subcommand/sections/gemini-cli.js +61 -0
  310. package/dist/commands/cliproxy/quota-subcommand/sections/gemini-cli.js.map +1 -0
  311. package/dist/commands/cliproxy/quota-subcommand/sections/ghcp.d.ts +13 -0
  312. package/dist/commands/cliproxy/quota-subcommand/sections/ghcp.d.ts.map +1 -0
  313. package/dist/commands/cliproxy/quota-subcommand/sections/ghcp.js +63 -0
  314. package/dist/commands/cliproxy/quota-subcommand/sections/ghcp.js.map +1 -0
  315. package/dist/commands/cliproxy/quota-subcommand/test-exports.d.ts +19 -0
  316. package/dist/commands/cliproxy/quota-subcommand/test-exports.d.ts.map +1 -0
  317. package/dist/commands/cliproxy/quota-subcommand/test-exports.js +22 -0
  318. package/dist/commands/cliproxy/quota-subcommand/test-exports.js.map +1 -0
  319. package/dist/commands/cliproxy/quota-subcommand/types.d.ts +42 -0
  320. package/dist/commands/cliproxy/quota-subcommand/types.d.ts.map +1 -0
  321. package/dist/commands/cliproxy/quota-subcommand/types.js +9 -0
  322. package/dist/commands/cliproxy/quota-subcommand/types.js.map +1 -0
  323. package/dist/commands/cliproxy/quota-subcommand.d.ts +14 -36
  324. package/dist/commands/cliproxy/quota-subcommand.d.ts.map +1 -1
  325. package/dist/commands/cliproxy/quota-subcommand.js +21 -872
  326. package/dist/commands/cliproxy/quota-subcommand.js.map +1 -1
  327. package/dist/commands/command-catalog.js +1 -1
  328. package/dist/commands/command-catalog.js.map +1 -1
  329. package/dist/commands/config-channels-command.d.ts +1 -1
  330. package/dist/commands/config-channels-command.d.ts.map +1 -1
  331. package/dist/commands/config-channels-command.js +3 -3
  332. package/dist/commands/config-channels-command.js.map +1 -1
  333. package/dist/commands/config-command-options.d.ts.map +1 -1
  334. package/dist/commands/config-command-options.js +11 -2
  335. package/dist/commands/config-command-options.js.map +1 -1
  336. package/dist/commands/persist-command/arg-parsing.d.ts +14 -0
  337. package/dist/commands/persist-command/arg-parsing.d.ts.map +1 -0
  338. package/dist/commands/persist-command/arg-parsing.js +84 -0
  339. package/dist/commands/persist-command/arg-parsing.js.map +1 -0
  340. package/dist/commands/persist-command/backup-rotation.d.ts +23 -0
  341. package/dist/commands/persist-command/backup-rotation.d.ts.map +1 -0
  342. package/dist/commands/persist-command/backup-rotation.js +265 -0
  343. package/dist/commands/persist-command/backup-rotation.js.map +1 -0
  344. package/dist/commands/persist-command/handler.d.ts +10 -0
  345. package/dist/commands/persist-command/handler.d.ts.map +1 -0
  346. package/dist/commands/persist-command/handler.js +267 -0
  347. package/dist/commands/persist-command/handler.js.map +1 -0
  348. package/dist/commands/persist-command/help.d.ts +9 -0
  349. package/dist/commands/persist-command/help.d.ts.map +1 -0
  350. package/dist/commands/persist-command/help.js +86 -0
  351. package/dist/commands/persist-command/help.js.map +1 -0
  352. package/dist/commands/persist-command/receipt.d.ts +13 -0
  353. package/dist/commands/persist-command/receipt.d.ts.map +1 -0
  354. package/dist/commands/persist-command/receipt.js +102 -0
  355. package/dist/commands/persist-command/receipt.js.map +1 -0
  356. package/dist/commands/persist-command/secret-detection.d.ts +11 -0
  357. package/dist/commands/persist-command/secret-detection.d.ts.map +1 -0
  358. package/dist/commands/persist-command/secret-detection.js +54 -0
  359. package/dist/commands/persist-command/secret-detection.js.map +1 -0
  360. package/dist/commands/persist-command/secure-file.d.ts +21 -0
  361. package/dist/commands/persist-command/secure-file.d.ts.map +1 -0
  362. package/dist/commands/persist-command/secure-file.js +231 -0
  363. package/dist/commands/persist-command/secure-file.js.map +1 -0
  364. package/dist/commands/persist-command/types.d.ts +42 -0
  365. package/dist/commands/persist-command/types.d.ts.map +1 -0
  366. package/dist/commands/persist-command/types.js +34 -0
  367. package/dist/commands/persist-command/types.js.map +1 -0
  368. package/dist/commands/persist-command.d.ts +7 -2
  369. package/dist/commands/persist-command.d.ts.map +1 -1
  370. package/dist/commands/persist-command.js +17 -933
  371. package/dist/commands/persist-command.js.map +1 -1
  372. package/dist/commands/proxy-command.d.ts.map +1 -1
  373. package/dist/commands/proxy-command.js +7 -1
  374. package/dist/commands/proxy-command.js.map +1 -1
  375. package/dist/commands/setup-command.d.ts.map +1 -1
  376. package/dist/commands/setup-command.js +11 -1
  377. package/dist/commands/setup-command.js.map +1 -1
  378. package/dist/commands/tokens-command.d.ts.map +1 -1
  379. package/dist/commands/tokens-command.js +6 -0
  380. package/dist/commands/tokens-command.js.map +1 -1
  381. package/dist/config/config-loader-facade.d.ts +1 -1
  382. package/dist/config/config-loader-facade.d.ts.map +1 -1
  383. package/dist/config/config-loader-facade.js +3 -1
  384. package/dist/config/config-loader-facade.js.map +1 -1
  385. package/dist/config/loader/config-getters.d.ts +16 -0
  386. package/dist/config/loader/config-getters.d.ts.map +1 -1
  387. package/dist/config/loader/config-getters.js +33 -1
  388. package/dist/config/loader/config-getters.js.map +1 -1
  389. package/dist/config/loader/defaults-merger.d.ts.map +1 -1
  390. package/dist/config/loader/defaults-merger.js +4 -0
  391. package/dist/config/loader/defaults-merger.js.map +1 -1
  392. package/dist/config/loader/yaml-serializer.d.ts.map +1 -1
  393. package/dist/config/loader/yaml-serializer.js +13 -0
  394. package/dist/config/loader/yaml-serializer.js.map +1 -1
  395. package/dist/config/schemas/index.d.ts +2 -0
  396. package/dist/config/schemas/index.d.ts.map +1 -1
  397. package/dist/config/schemas/index.js +5 -1
  398. package/dist/config/schemas/index.js.map +1 -1
  399. package/dist/config/schemas/runtime.d.ts +57 -0
  400. package/dist/config/schemas/runtime.d.ts.map +1 -0
  401. package/dist/config/schemas/runtime.js +51 -0
  402. package/dist/config/schemas/runtime.js.map +1 -0
  403. package/dist/config/schemas/unified-config.d.ts +3 -0
  404. package/dist/config/schemas/unified-config.d.ts.map +1 -1
  405. package/dist/config/schemas/unified-config.js.map +1 -1
  406. package/dist/config/unified-config-loader.d.ts +1 -1
  407. package/dist/config/unified-config-loader.d.ts.map +1 -1
  408. package/dist/config/unified-config-loader.js +25 -13
  409. package/dist/config/unified-config-loader.js.map +1 -1
  410. package/dist/copilot/copilot-executor.js +25 -25
  411. package/dist/copilot/copilot-executor.js.map +1 -1
  412. package/dist/cursor/cursor-daemon-entry.d.ts.map +1 -1
  413. package/dist/cursor/cursor-daemon-entry.js +34 -9
  414. package/dist/cursor/cursor-daemon-entry.js.map +1 -1
  415. package/dist/cursor/cursor-daemon.d.ts.map +1 -1
  416. package/dist/cursor/cursor-daemon.js +1 -0
  417. package/dist/cursor/cursor-daemon.js.map +1 -1
  418. package/dist/cursor/cursor-profile-executor.d.ts.map +1 -1
  419. package/dist/cursor/cursor-profile-executor.js +18 -17
  420. package/dist/cursor/cursor-profile-executor.js.map +1 -1
  421. package/dist/delegation/delegation-handler.d.ts.map +1 -1
  422. package/dist/delegation/delegation-handler.js +29 -23
  423. package/dist/delegation/delegation-handler.js.map +1 -1
  424. package/dist/delegation/headless-executor.d.ts +1 -0
  425. package/dist/delegation/headless-executor.d.ts.map +1 -1
  426. package/dist/delegation/headless-executor.js +36 -15
  427. package/dist/delegation/headless-executor.js.map +1 -1
  428. package/dist/delegation/session-manager.d.ts.map +1 -1
  429. package/dist/delegation/session-manager.js +12 -4
  430. package/dist/delegation/session-manager.js.map +1 -1
  431. package/dist/dispatcher/cli-argument-parser.d.ts +1 -1
  432. package/dist/dispatcher/cli-argument-parser.d.ts.map +1 -1
  433. package/dist/dispatcher/cli-argument-parser.js +24 -23
  434. package/dist/dispatcher/cli-argument-parser.js.map +1 -1
  435. package/dist/dispatcher/flows/cliproxy-flow.d.ts.map +1 -1
  436. package/dist/dispatcher/flows/cliproxy-flow.js +12 -15
  437. package/dist/dispatcher/flows/cliproxy-flow.js.map +1 -1
  438. package/dist/dispatcher/flows/copilot-flow.js +1 -1
  439. package/dist/dispatcher/flows/copilot-flow.js.map +1 -1
  440. package/dist/dispatcher/flows/cursor-flow.js +1 -1
  441. package/dist/dispatcher/flows/cursor-flow.js.map +1 -1
  442. package/dist/dispatcher/flows/settings-flow.d.ts.map +1 -1
  443. package/dist/dispatcher/flows/settings-flow.js +32 -29
  444. package/dist/dispatcher/flows/settings-flow.js.map +1 -1
  445. package/dist/dispatcher/pre-dispatch.d.ts.map +1 -1
  446. package/dist/dispatcher/pre-dispatch.js +26 -10
  447. package/dist/dispatcher/pre-dispatch.js.map +1 -1
  448. package/dist/dispatcher/profile-resolver.d.ts +1 -1
  449. package/dist/dispatcher/profile-resolver.d.ts.map +1 -1
  450. package/dist/dispatcher/profile-resolver.js +36 -23
  451. package/dist/dispatcher/profile-resolver.js.map +1 -1
  452. package/dist/docker/supervisord-lifecycle.d.ts.map +1 -1
  453. package/dist/docker/supervisord-lifecycle.js +5 -1
  454. package/dist/docker/supervisord-lifecycle.js.map +1 -1
  455. package/dist/errors/error-types.d.ts +26 -22
  456. package/dist/errors/error-types.d.ts.map +1 -1
  457. package/dist/errors/error-types.js +15 -12
  458. package/dist/errors/error-types.js.map +1 -1
  459. package/dist/errors/exit-codes.d.ts +20 -13
  460. package/dist/errors/exit-codes.d.ts.map +1 -1
  461. package/dist/errors/exit-codes.js +32 -28
  462. package/dist/errors/exit-codes.js.map +1 -1
  463. package/dist/glmt/delta-accumulator.d.ts +1 -0
  464. package/dist/glmt/delta-accumulator.d.ts.map +1 -1
  465. package/dist/glmt/delta-accumulator.js +12 -4
  466. package/dist/glmt/delta-accumulator.js.map +1 -1
  467. package/dist/glmt/glmt-proxy.d.ts.map +1 -1
  468. package/dist/glmt/glmt-proxy.js +39 -10
  469. package/dist/glmt/glmt-proxy.js.map +1 -1
  470. package/dist/glmt/glmt-transformer.d.ts.map +1 -1
  471. package/dist/glmt/glmt-transformer.js +1 -4
  472. package/dist/glmt/glmt-transformer.js.map +1 -1
  473. package/dist/glmt/pipeline/request-transformer.d.ts.map +1 -1
  474. package/dist/glmt/pipeline/request-transformer.js +5 -1
  475. package/dist/glmt/pipeline/request-transformer.js.map +1 -1
  476. package/dist/glmt/pipeline/response-builder.d.ts.map +1 -1
  477. package/dist/glmt/pipeline/response-builder.js +7 -3
  478. package/dist/glmt/pipeline/response-builder.js.map +1 -1
  479. package/dist/glmt/pipeline/stream-parser.d.ts.map +1 -1
  480. package/dist/glmt/pipeline/stream-parser.js +11 -5
  481. package/dist/glmt/pipeline/stream-parser.js.map +1 -1
  482. package/dist/glmt/pipeline/tool-call-handler.d.ts.map +1 -1
  483. package/dist/glmt/pipeline/tool-call-handler.js +7 -1
  484. package/dist/glmt/pipeline/tool-call-handler.js.map +1 -1
  485. package/dist/glmt/sse-parser.d.ts +1 -0
  486. package/dist/glmt/sse-parser.d.ts.map +1 -1
  487. package/dist/glmt/sse-parser.js +7 -3
  488. package/dist/glmt/sse-parser.js.map +1 -1
  489. package/dist/management/checks/cliproxy-check.d.ts.map +1 -1
  490. package/dist/management/checks/cliproxy-check.js +15 -1
  491. package/dist/management/checks/cliproxy-check.js.map +1 -1
  492. package/dist/management/checks/config-check.d.ts.map +1 -1
  493. package/dist/management/checks/config-check.js +4 -1
  494. package/dist/management/checks/config-check.js.map +1 -1
  495. package/dist/management/checks/profile-check.d.ts.map +1 -1
  496. package/dist/management/checks/profile-check.js +10 -6
  497. package/dist/management/checks/profile-check.js.map +1 -1
  498. package/dist/management/doctor.d.ts +7 -0
  499. package/dist/management/doctor.d.ts.map +1 -1
  500. package/dist/management/doctor.js +31 -9
  501. package/dist/management/doctor.js.map +1 -1
  502. package/dist/management/shared-manager/fs-helpers.d.ts +69 -0
  503. package/dist/management/shared-manager/fs-helpers.d.ts.map +1 -0
  504. package/dist/management/shared-manager/fs-helpers.js +241 -0
  505. package/dist/management/shared-manager/fs-helpers.js.map +1 -0
  506. package/dist/management/shared-manager/migrations.d.ts +21 -0
  507. package/dist/management/shared-manager/migrations.d.ts.map +1 -0
  508. package/dist/management/shared-manager/migrations.js +187 -0
  509. package/dist/management/shared-manager/migrations.js.map +1 -0
  510. package/dist/management/shared-manager/orchestrator.d.ts +87 -0
  511. package/dist/management/shared-manager/orchestrator.d.ts.map +1 -0
  512. package/dist/management/shared-manager/orchestrator.js +161 -0
  513. package/dist/management/shared-manager/orchestrator.js.map +1 -0
  514. package/dist/management/shared-manager/plugin-layout-internals.d.ts +42 -0
  515. package/dist/management/shared-manager/plugin-layout-internals.d.ts.map +1 -0
  516. package/dist/management/shared-manager/plugin-layout-internals.js +192 -0
  517. package/dist/management/shared-manager/plugin-layout-internals.js.map +1 -0
  518. package/dist/management/shared-manager/plugin-metadata-normalizer.d.ts +53 -0
  519. package/dist/management/shared-manager/plugin-metadata-normalizer.d.ts.map +1 -0
  520. package/dist/management/shared-manager/plugin-metadata-normalizer.js +253 -0
  521. package/dist/management/shared-manager/plugin-metadata-normalizer.js.map +1 -0
  522. package/dist/management/shared-manager/project-context-sync.d.ts +36 -0
  523. package/dist/management/shared-manager/project-context-sync.d.ts.map +1 -0
  524. package/dist/management/shared-manager/project-context-sync.js +204 -0
  525. package/dist/management/shared-manager/project-context-sync.js.map +1 -0
  526. package/dist/management/shared-manager/project-memory-sync.d.ts +21 -0
  527. package/dist/management/shared-manager/project-memory-sync.d.ts.map +1 -0
  528. package/dist/management/shared-manager/project-memory-sync.js +113 -0
  529. package/dist/management/shared-manager/project-memory-sync.js.map +1 -0
  530. package/dist/management/shared-manager/shared-dir-linker.d.ts +41 -0
  531. package/dist/management/shared-manager/shared-dir-linker.d.ts.map +1 -0
  532. package/dist/management/shared-manager/shared-dir-linker.js +227 -0
  533. package/dist/management/shared-manager/shared-dir-linker.js.map +1 -0
  534. package/dist/management/shared-manager/symlink-helpers.d.ts +61 -0
  535. package/dist/management/shared-manager/symlink-helpers.d.ts.map +1 -0
  536. package/dist/management/shared-manager/symlink-helpers.js +243 -0
  537. package/dist/management/shared-manager/symlink-helpers.js.map +1 -0
  538. package/dist/management/shared-manager/types.d.ts +45 -0
  539. package/dist/management/shared-manager/types.d.ts.map +1 -0
  540. package/dist/management/shared-manager/types.js +57 -0
  541. package/dist/management/shared-manager/types.js.map +1 -0
  542. package/dist/management/shared-manager.d.ts +13 -160
  543. package/dist/management/shared-manager.d.ts.map +1 -1
  544. package/dist/management/shared-manager.js +18 -1294
  545. package/dist/management/shared-manager.js.map +1 -1
  546. package/dist/proxy/proxy-daemon-entry.js +1 -1
  547. package/dist/proxy/proxy-daemon-entry.js.map +1 -1
  548. package/dist/proxy/server/messages-route.d.ts +10 -0
  549. package/dist/proxy/server/messages-route.d.ts.map +1 -1
  550. package/dist/proxy/server/messages-route.js +34 -7
  551. package/dist/proxy/server/messages-route.js.map +1 -1
  552. package/dist/proxy/server/proxy-server.d.ts.map +1 -1
  553. package/dist/proxy/server/proxy-server.js +1 -1
  554. package/dist/proxy/server/proxy-server.js.map +1 -1
  555. package/dist/proxy/transformers/sse-stream-transformer.d.ts.map +1 -1
  556. package/dist/proxy/transformers/sse-stream-transformer.js +12 -17
  557. package/dist/proxy/transformers/sse-stream-transformer.js.map +1 -1
  558. package/dist/services/logging/index.d.ts +1 -1
  559. package/dist/services/logging/index.d.ts.map +1 -1
  560. package/dist/services/logging/index.js +6 -1
  561. package/dist/services/logging/index.js.map +1 -1
  562. package/dist/services/logging/log-context.d.ts +27 -2
  563. package/dist/services/logging/log-context.d.ts.map +1 -1
  564. package/dist/services/logging/log-context.js +43 -4
  565. package/dist/services/logging/log-context.js.map +1 -1
  566. package/dist/services/logging/log-redaction.d.ts +9 -0
  567. package/dist/services/logging/log-redaction.d.ts.map +1 -1
  568. package/dist/services/logging/log-redaction.js +31 -3
  569. package/dist/services/logging/log-redaction.js.map +1 -1
  570. package/dist/services/logging/logger.js +2 -2
  571. package/dist/services/logging/logger.js.map +1 -1
  572. package/dist/shared/provider-preset-catalog.d.ts +1 -1
  573. package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
  574. package/dist/shared/provider-preset-catalog.js +21 -7
  575. package/dist/shared/provider-preset-catalog.js.map +1 -1
  576. package/dist/targets/claude-adapter.d.ts.map +1 -1
  577. package/dist/targets/claude-adapter.js +5 -0
  578. package/dist/targets/claude-adapter.js.map +1 -1
  579. package/dist/targets/codex-adapter.d.ts.map +1 -1
  580. package/dist/targets/codex-adapter.js +11 -10
  581. package/dist/targets/codex-adapter.js.map +1 -1
  582. package/dist/targets/codex-cliproxy-provider-config.d.ts.map +1 -1
  583. package/dist/targets/codex-cliproxy-provider-config.js +51 -14
  584. package/dist/targets/codex-cliproxy-provider-config.js.map +1 -1
  585. package/dist/targets/codex-detector.d.ts.map +1 -1
  586. package/dist/targets/codex-detector.js +14 -0
  587. package/dist/targets/codex-detector.js.map +1 -1
  588. package/dist/targets/droid-adapter.d.ts.map +1 -1
  589. package/dist/targets/droid-adapter.js +12 -12
  590. package/dist/targets/droid-adapter.js.map +1 -1
  591. package/dist/ui/assets/{Trans-RG_sMDEu.js → Trans-GYzYLs2D.js} +1 -1
  592. package/dist/ui/assets/{accounts-yTXURc-q.js → accounts-DC1QuyI9.js} +1 -1
  593. package/dist/ui/assets/{alert-dialog-DjvPgzFs.js → alert-dialog-6SiedqmE.js} +1 -1
  594. package/dist/ui/assets/{api-Ck1dtNEM.js → api-3s21dbNJ.js} +1 -1
  595. package/dist/ui/assets/{auth-section-DBnY_LPz.js → auth-section-XBfNgVN4.js} +1 -1
  596. package/dist/ui/assets/{backups-section-Ci-uL4Of.js → backups-section-BidiiVlq.js} +1 -1
  597. package/dist/ui/assets/{channels-BeS9O5q0.js → channels-pfgPUDGt.js} +1 -1
  598. package/dist/ui/assets/{checkbox-DFeFDZBp.js → checkbox-CJw_-nvC.js} +1 -1
  599. package/dist/ui/assets/{claude-extension-DS5qN19Z.js → claude-extension-BIIUOvTJ.js} +1 -1
  600. package/dist/ui/assets/{cliproxy-D7HJH4mZ.js → cliproxy-Cq8OX0Pu.js} +1 -1
  601. package/dist/ui/assets/{cliproxy-ai-providers-oJQZXrtc.js → cliproxy-ai-providers-DI760ZF0.js} +1 -1
  602. package/dist/ui/assets/{cliproxy-control-panel-2mRPEcRj.js → cliproxy-control-panel-CBqvpOqj.js} +1 -1
  603. package/dist/ui/assets/{codex-D0AUQ6jA.js → codex-DL4OLBUu.js} +1 -1
  604. package/dist/ui/assets/{confirm-dialog-B37-CVuq.js → confirm-dialog-CC_Cc3EO.js} +1 -1
  605. package/dist/ui/assets/{copilot-KaaW-mko.js → copilot-D2kEhTXR.js} +1 -1
  606. package/dist/ui/assets/{cursor-BKiTgYi5.js → cursor-BashLrYk.js} +1 -1
  607. package/dist/ui/assets/{droid-DHdqGnFw.js → droid-DaKTINFL.js} +1 -1
  608. package/dist/ui/assets/{globalenv-section-SfZO97nU.js → globalenv-section-BQicL8L0.js} +1 -1
  609. package/dist/ui/assets/{health-CSRS9O0D.js → health-bRbE_ADg.js} +1 -1
  610. package/dist/ui/assets/{index-CGgavq2X.js → index-B2JEyN3d.js} +36 -36
  611. package/dist/ui/assets/{index-Cu_F55_O.js → index-BwZdl1HU.js} +1 -1
  612. package/dist/ui/assets/{index-DWUuSBUe.js → index-CgeAb1-K.js} +1 -1
  613. package/dist/ui/assets/{index-iQuEEGbH.js → index-DAQ0qIQ_.js} +1 -1
  614. package/dist/ui/assets/{index-ChTYEBCZ.js → index-O2x1grGh.js} +1 -1
  615. package/dist/ui/assets/{index-DycwEe96.js → index-WA7tK6np.js} +1 -1
  616. package/dist/ui/assets/{index-DJ66NrBH.js → index-mf2X1GwS.js} +1 -1
  617. package/dist/ui/assets/{logs-tiZ_51mo.js → logs-qrBHUJ0H.js} +1 -1
  618. package/dist/ui/assets/{masked-input-D9FVoeMA.js → masked-input-CXwQ4E-g.js} +1 -1
  619. package/dist/ui/assets/{proxy-status-widget-2k26d8pS.js → proxy-status-widget-DPz4nCzR.js} +1 -1
  620. package/dist/ui/assets/{raw-json-settings-editor-panel-CguBh93H.js → raw-json-settings-editor-panel-CcvsWVh1.js} +1 -1
  621. package/dist/ui/assets/{searchable-select-C4wShshD.js → searchable-select-EXSjNCRu.js} +1 -1
  622. package/dist/ui/assets/{separator-mvGlDdEW.js → separator-D2CTfWBQ.js} +1 -1
  623. package/dist/ui/assets/{shared-Ck0yAwbs.js → shared-DpgzhFqe.js} +1 -1
  624. package/dist/ui/assets/{table-DrUJOxKL.js → table-DwbiGRYk.js} +1 -1
  625. package/dist/ui/assets/{updates-BVHBFcq8.js → updates-D8jfIb2y.js} +1 -1
  626. package/dist/ui/assets/{use-accounts-DLtuaniS.js → use-accounts-Bwtpnx-x.js} +1 -1
  627. package/dist/ui/index.html +1 -1
  628. package/dist/utils/bar-auth-token.d.ts +4 -0
  629. package/dist/utils/bar-auth-token.d.ts.map +1 -0
  630. package/dist/utils/bar-auth-token.js +60 -0
  631. package/dist/utils/bar-auth-token.js.map +1 -0
  632. package/dist/utils/browser/browser-settings.d.ts +3 -1
  633. package/dist/utils/browser/browser-settings.d.ts.map +1 -1
  634. package/dist/utils/browser/browser-settings.js +2 -2
  635. package/dist/utils/browser/browser-settings.js.map +1 -1
  636. package/dist/utils/browser/browser-setup.d.ts.map +1 -1
  637. package/dist/utils/browser/browser-setup.js +3 -1
  638. package/dist/utils/browser/browser-setup.js.map +1 -1
  639. package/dist/utils/browser/browser-status.d.ts.map +1 -1
  640. package/dist/utils/browser/browser-status.js +4 -2
  641. package/dist/utils/browser/browser-status.js.map +1 -1
  642. package/dist/utils/fetch-proxy-setup.d.ts +3 -2
  643. package/dist/utils/fetch-proxy-setup.d.ts.map +1 -1
  644. package/dist/utils/fetch-proxy-setup.js +10 -6
  645. package/dist/utils/fetch-proxy-setup.js.map +1 -1
  646. package/dist/utils/image-analysis/mcp-installer.d.ts.map +1 -1
  647. package/dist/utils/image-analysis/mcp-installer.js +16 -13
  648. package/dist/utils/image-analysis/mcp-installer.js.map +1 -1
  649. package/dist/utils/websearch/index.d.ts +1 -1
  650. package/dist/utils/websearch/index.d.ts.map +1 -1
  651. package/dist/utils/websearch/index.js +2 -1
  652. package/dist/utils/websearch/index.js.map +1 -1
  653. package/dist/utils/websearch/mcp-installer.d.ts +8 -0
  654. package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
  655. package/dist/utils/websearch/mcp-installer.js +34 -13
  656. package/dist/utils/websearch/mcp-installer.js.map +1 -1
  657. package/dist/utils/websearch-manager.d.ts +1 -1
  658. package/dist/utils/websearch-manager.d.ts.map +1 -1
  659. package/dist/utils/websearch-manager.js +2 -1
  660. package/dist/utils/websearch-manager.js.map +1 -1
  661. package/dist/web-server/middleware/request-logging-middleware.d.ts.map +1 -1
  662. package/dist/web-server/middleware/request-logging-middleware.js +14 -9
  663. package/dist/web-server/middleware/request-logging-middleware.js.map +1 -1
  664. package/dist/web-server/model-pricing.d.ts.map +1 -1
  665. package/dist/web-server/model-pricing.js +22 -2
  666. package/dist/web-server/model-pricing.js.map +1 -1
  667. package/dist/web-server/routes/bar-routes.d.ts +12 -1
  668. package/dist/web-server/routes/bar-routes.d.ts.map +1 -1
  669. package/dist/web-server/routes/bar-routes.js +22 -6
  670. package/dist/web-server/routes/bar-routes.js.map +1 -1
  671. package/dist/web-server/routes/claude-extension-routes.d.ts.map +1 -1
  672. package/dist/web-server/routes/claude-extension-routes.js +3 -2
  673. package/dist/web-server/routes/claude-extension-routes.js.map +1 -1
  674. package/dist/web-server/routes/cliproxy-auth-routes.d.ts +1 -0
  675. package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -1
  676. package/dist/web-server/routes/cliproxy-auth-routes.js +20 -5
  677. package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -1
  678. package/dist/web-server/routes/cliproxy-stats-routes/config-routes.d.ts +16 -0
  679. package/dist/web-server/routes/cliproxy-stats-routes/config-routes.d.ts.map +1 -0
  680. package/dist/web-server/routes/cliproxy-stats-routes/config-routes.js +219 -0
  681. package/dist/web-server/routes/cliproxy-stats-routes/config-routes.js.map +1 -0
  682. package/dist/web-server/routes/cliproxy-stats-routes/error-log-routes.d.ts +12 -0
  683. package/dist/web-server/routes/cliproxy-stats-routes/error-log-routes.d.ts.map +1 -0
  684. package/dist/web-server/routes/cliproxy-stats-routes/error-log-routes.js +153 -0
  685. package/dist/web-server/routes/cliproxy-stats-routes/error-log-routes.js.map +1 -0
  686. package/dist/web-server/routes/cliproxy-stats-routes/quota-helpers.d.ts +19 -0
  687. package/dist/web-server/routes/cliproxy-stats-routes/quota-helpers.d.ts.map +1 -0
  688. package/dist/web-server/routes/cliproxy-stats-routes/quota-helpers.js +38 -0
  689. package/dist/web-server/routes/cliproxy-stats-routes/quota-helpers.js.map +1 -0
  690. package/dist/web-server/routes/cliproxy-stats-routes/quota-routes.d.ts +13 -0
  691. package/dist/web-server/routes/cliproxy-stats-routes/quota-routes.d.ts.map +1 -0
  692. package/dist/web-server/routes/cliproxy-stats-routes/quota-routes.js +195 -0
  693. package/dist/web-server/routes/cliproxy-stats-routes/quota-routes.js.map +1 -0
  694. package/dist/web-server/routes/cliproxy-stats-routes/restart-route.d.ts +17 -0
  695. package/dist/web-server/routes/cliproxy-stats-routes/restart-route.d.ts.map +1 -0
  696. package/dist/web-server/routes/cliproxy-stats-routes/restart-route.js +34 -0
  697. package/dist/web-server/routes/cliproxy-stats-routes/restart-route.js.map +1 -0
  698. package/dist/web-server/routes/cliproxy-stats-routes/router.d.ts +10 -0
  699. package/dist/web-server/routes/cliproxy-stats-routes/router.d.ts.map +1 -0
  700. package/dist/web-server/routes/cliproxy-stats-routes/router.js +245 -0
  701. package/dist/web-server/routes/cliproxy-stats-routes/router.js.map +1 -0
  702. package/dist/web-server/routes/cliproxy-stats-routes/shared.d.ts +35 -0
  703. package/dist/web-server/routes/cliproxy-stats-routes/shared.d.ts.map +1 -0
  704. package/dist/web-server/routes/cliproxy-stats-routes/shared.js +59 -0
  705. package/dist/web-server/routes/cliproxy-stats-routes/shared.js.map +1 -0
  706. package/dist/web-server/routes/cliproxy-stats-routes/version-helpers.d.ts +44 -0
  707. package/dist/web-server/routes/cliproxy-stats-routes/version-helpers.d.ts.map +1 -0
  708. package/dist/web-server/routes/cliproxy-stats-routes/version-helpers.js +66 -0
  709. package/dist/web-server/routes/cliproxy-stats-routes/version-helpers.js.map +1 -0
  710. package/dist/web-server/routes/cliproxy-stats-routes.d.ts +16 -57
  711. package/dist/web-server/routes/cliproxy-stats-routes.d.ts.map +1 -1
  712. package/dist/web-server/routes/cliproxy-stats-routes.js +25 -926
  713. package/dist/web-server/routes/cliproxy-stats-routes.js.map +1 -1
  714. package/dist/web-server/routes/cliproxy-sync-routes.d.ts.map +1 -1
  715. package/dist/web-server/routes/cliproxy-sync-routes.js +9 -2
  716. package/dist/web-server/routes/cliproxy-sync-routes.js.map +1 -1
  717. package/dist/web-server/routes/copilot-settings-routes.d.ts.map +1 -1
  718. package/dist/web-server/routes/copilot-settings-routes.js +2 -1
  719. package/dist/web-server/routes/copilot-settings-routes.js.map +1 -1
  720. package/dist/web-server/routes/cursor-routes.d.ts.map +1 -1
  721. package/dist/web-server/routes/cursor-routes.js +3 -1
  722. package/dist/web-server/routes/cursor-routes.js.map +1 -1
  723. package/dist/web-server/routes/image-analysis-routes.d.ts.map +1 -1
  724. package/dist/web-server/routes/image-analysis-routes.js +2 -1
  725. package/dist/web-server/routes/image-analysis-routes.js.map +1 -1
  726. package/dist/web-server/routes/index.d.ts.map +1 -1
  727. package/dist/web-server/routes/index.js +6 -0
  728. package/dist/web-server/routes/index.js.map +1 -1
  729. package/dist/web-server/routes/persist-routes.d.ts.map +1 -1
  730. package/dist/web-server/routes/persist-routes.js +8 -1
  731. package/dist/web-server/routes/persist-routes.js.map +1 -1
  732. package/dist/web-server/routes/proxy-routes.d.ts.map +1 -1
  733. package/dist/web-server/routes/proxy-routes.js +33 -5
  734. package/dist/web-server/routes/proxy-routes.js.map +1 -1
  735. package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
  736. package/dist/web-server/routes/route-helpers.js +18 -6
  737. package/dist/web-server/routes/route-helpers.js.map +1 -1
  738. package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
  739. package/dist/web-server/routes/settings-routes.js +7 -6
  740. package/dist/web-server/routes/settings-routes.js.map +1 -1
  741. package/dist/web-server/usage/aggregator.d.ts.map +1 -1
  742. package/dist/web-server/usage/aggregator.js +8 -8
  743. package/dist/web-server/usage/aggregator.js.map +1 -1
  744. package/dist/web-server/usage/bar-analytics.d.ts +21 -0
  745. package/dist/web-server/usage/bar-analytics.d.ts.map +1 -1
  746. package/dist/web-server/usage/bar-analytics.js +78 -9
  747. package/dist/web-server/usage/bar-analytics.js.map +1 -1
  748. package/dist/web-server/usage/cliproxy-usage-transformer.d.ts.map +1 -1
  749. package/dist/web-server/usage/cliproxy-usage-transformer.js +9 -4
  750. package/dist/web-server/usage/cliproxy-usage-transformer.js.map +1 -1
  751. package/dist/web-server/usage/codex-local-quota-collector.d.ts +2 -2
  752. package/dist/web-server/usage/codex-local-quota-collector.d.ts.map +1 -1
  753. package/dist/web-server/usage/codex-local-quota-collector.js +39 -11
  754. package/dist/web-server/usage/codex-local-quota-collector.js.map +1 -1
  755. package/dist/web-server/usage/handlers.d.ts.map +1 -1
  756. package/dist/web-server/usage/handlers.js +1 -1
  757. package/dist/web-server/usage/handlers.js.map +1 -1
  758. package/dist/web-server/usage/native-quota-collector.d.ts +37 -9
  759. package/dist/web-server/usage/native-quota-collector.d.ts.map +1 -1
  760. package/dist/web-server/usage/native-quota-collector.js +226 -23
  761. package/dist/web-server/usage/native-quota-collector.js.map +1 -1
  762. package/package.json +1 -1
  763. package/scripts/ci-parity-gate.sh +31 -0
  764. package/scripts/generate-throw-error-baseline.js +103 -0
  765. package/scripts/github/stable-release-issue-cleanup-lib.mjs +51 -11
  766. package/scripts/hardening-inventory.js +62 -4
  767. package/scripts/maintainability-metrics.js +356 -0
@@ -1,932 +1,31 @@
1
1
  "use strict";
2
2
  /**
3
3
  * CLIProxy Stats Routes - Stats, status, models, error logs for CLIProxyAPI
4
- */
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
- Object.defineProperty(o, "default", { enumerable: true, value: v });
18
- }) : function(o, v) {
19
- o["default"] = v;
20
- });
21
- var __importStar = (this && this.__importStar) || function (mod) {
22
- if (mod && mod.__esModule) return mod;
23
- var result = {};
24
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
- __setModuleDefault(result, mod);
26
- return result;
4
+ *
5
+ * THIN BARREL. The implementation has been decomposed into focused submodules
6
+ * under `./cliproxy-stats-routes/`. This file preserves the original public
7
+ * surface so consumers can keep importing from 'cliproxy-stats-routes' with
8
+ * identical signatures.
9
+ *
10
+ * Public surface (verified by tests + callers):
11
+ * - default export : Express Router (routes/index.ts)
12
+ * - shouldCacheQuotaResult : quota cache predicate (quota-caching test)
13
+ * - registerCliproxyRestartRoute : restart route registrar (restart test)
14
+ * - resolveCliproxyUpdateCheckPayload : update-check resolver (version-fallback test)
15
+ * - resolveCliproxyVersionsPayload : versions resolver (version-fallback test)
16
+ */
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
19
  };
28
20
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.registerCliproxyRestartRoute = exports.resolveCliproxyVersionsPayload = exports.resolveCliproxyUpdateCheckPayload = exports.shouldCacheQuotaResult = void 0;
30
- const express_1 = require("express");
31
- const fs = __importStar(require("fs"));
32
- const path = __importStar(require("path"));
33
- const stats_fetcher_1 = require("../../cliproxy/services/stats-fetcher");
34
- const quota_fetcher_1 = require("../../cliproxy/quota/quota-fetcher");
35
- const quota_fetcher_codex_1 = require("../../cliproxy/quota/quota-fetcher-codex");
36
- const quota_fetcher_claude_1 = require("../../cliproxy/quota/quota-fetcher-claude");
37
- const quota_fetcher_gemini_cli_1 = require("../../cliproxy/quota/quota-fetcher-gemini-cli");
38
- const quota_fetcher_ghcp_1 = require("../../cliproxy/quota/quota-fetcher-ghcp");
39
- const quota_response_cache_1 = require("../../cliproxy/quota/quota-response-cache");
40
- const profile_detector_1 = require("../../auth/profile-detector");
41
- const config_generator_1 = require("../../cliproxy/config/config-generator");
42
- const session_tracker_1 = require("../../cliproxy/session-tracker");
43
- const service_manager_1 = require("../../cliproxy/service-manager");
44
- const binary_manager_1 = require("../../cliproxy/binary-manager");
45
- const version_checker_1 = require("../../cliproxy/binary/version-checker");
46
- const platform_detector_1 = require("../../cliproxy/binary/platform-detector");
47
- const port_manager_1 = require("../../cliproxy/config/port-manager");
48
- const model_id_normalizer_1 = require("../../cliproxy/ai-providers/model-id-normalizer");
49
- const cliproxy_dashboard_install_service_1 = require("../services/cliproxy-dashboard-install-service");
50
- const cliproxy_dashboard_restart_service_1 = require("../services/cliproxy-dashboard-restart-service");
51
- const auth_middleware_1 = require("../middleware/auth-middleware");
52
- const router = (0, express_1.Router)();
53
- const QUOTA_RATE_LIMIT_WINDOW_MS = 60000;
54
- const QUOTA_RATE_LIMIT_MAX_REQUESTS = 120;
55
- const quotaRateLimits = new Map();
56
- router.use((req, res, next) => {
57
- if ((0, auth_middleware_1.requireLocalAccessWhenAuthDisabled)(req, res, 'CLIProxy management endpoints require localhost access when dashboard auth is disabled.')) {
58
- next();
59
- }
60
- });
61
- function buildQuotaRateLimitKey(req, provider) {
62
- const clientIp = req.ip || req.socket.remoteAddress || 'unknown';
63
- return `${clientIp}:${provider}`;
64
- }
65
- function isQuotaRouteRateLimited(req, provider) {
66
- const key = buildQuotaRateLimitKey(req, provider);
67
- const now = Date.now();
68
- // Evict stale entries to prevent unbounded memory growth
69
- if (quotaRateLimits.size > 1000) {
70
- for (const [k, v] of quotaRateLimits) {
71
- if (now - v.windowStart >= QUOTA_RATE_LIMIT_WINDOW_MS * 2) {
72
- quotaRateLimits.delete(k);
73
- }
74
- }
75
- }
76
- const current = quotaRateLimits.get(key);
77
- if (!current || now - current.windowStart >= QUOTA_RATE_LIMIT_WINDOW_MS) {
78
- quotaRateLimits.set(key, { windowStart: now, count: 1 });
79
- return false;
80
- }
81
- current.count += 1;
82
- quotaRateLimits.set(key, current);
83
- return current.count > QUOTA_RATE_LIMIT_MAX_REQUESTS;
84
- }
85
- /**
86
- * Cache only stable failures; skip transient network errors (timeouts, 429s, 5xx).
87
- * Generic across all quota result types.
88
- */
89
- function shouldCacheQuotaResult(result) {
90
- if (result.success)
91
- return true;
92
- if (result.needsReauth || result.isForbidden)
93
- return true;
94
- if (result.retryable === true)
95
- return false;
96
- if (result.retryable === false)
97
- return true;
98
- if (typeof result.httpStatus === 'number') {
99
- if (result.httpStatus === 429 || result.httpStatus === 408 || result.httpStatus >= 500) {
100
- return false;
101
- }
102
- if (result.httpStatus >= 400 && result.httpStatus < 500) {
103
- return true;
104
- }
105
- }
106
- const msg = (result.error || '').toLowerCase();
107
- if (!msg)
108
- return false;
109
- const transientPatterns = ['timeout', 'rate limited', 'api error: 5', 'fetch failed'];
110
- return !transientPatterns.some((p) => msg.includes(p));
111
- }
112
- exports.shouldCacheQuotaResult = shouldCacheQuotaResult;
113
- function buildUpdateCheckFallback(backend, getInstalledVersionFn = binary_manager_1.getInstalledCliproxyVersion) {
114
- const currentVersion = getInstalledVersionFn(backend);
115
- const isStable = !(0, version_checker_1.isNewerVersion)(currentVersion, platform_detector_1.CLIPROXY_MAX_STABLE_VERSION);
116
- const backendLabel = backend === 'plus' ? 'CLIProxy Plus' : 'CLIProxy';
117
- return {
118
- hasUpdate: false,
119
- currentVersion,
120
- latestVersion: currentVersion,
121
- fromCache: true,
122
- checkedAt: Date.now(),
123
- backend,
124
- backendLabel,
125
- isStable,
126
- maxStableVersion: platform_detector_1.CLIPROXY_MAX_STABLE_VERSION,
127
- stabilityMessage: isStable
128
- ? undefined
129
- : `v${currentVersion} has known stability issues. Max stable: v${platform_detector_1.CLIPROXY_MAX_STABLE_VERSION}`,
130
- };
131
- }
132
- function buildVersionsFallback(backend, getInstalledVersionFn = binary_manager_1.getInstalledCliproxyVersion) {
133
- const currentVersion = getInstalledVersionFn(backend);
134
- return {
135
- versions: currentVersion ? [currentVersion] : [],
136
- latestStable: currentVersion || platform_detector_1.CLIPROXY_MAX_STABLE_VERSION,
137
- latest: currentVersion || platform_detector_1.CLIPROXY_MAX_STABLE_VERSION,
138
- fromCache: true,
139
- checkedAt: Date.now(),
140
- currentVersion,
141
- maxStableVersion: platform_detector_1.CLIPROXY_MAX_STABLE_VERSION,
142
- faultyRange: platform_detector_1.CLIPROXY_FAULTY_RANGE,
143
- };
144
- }
145
- async function resolveCliproxyUpdateCheckPayload(backend, deps = {}) {
146
- const checkCliproxyUpdateFn = deps.checkCliproxyUpdateFn ?? binary_manager_1.checkCliproxyUpdate;
147
- const getInstalledVersionFn = deps.getInstalledVersionFn ?? binary_manager_1.getInstalledCliproxyVersion;
148
- return checkCliproxyUpdateFn(backend).catch(() => buildUpdateCheckFallback(backend, getInstalledVersionFn));
149
- }
150
- exports.resolveCliproxyUpdateCheckPayload = resolveCliproxyUpdateCheckPayload;
151
- async function resolveCliproxyVersionsPayload(backend, deps = {}) {
152
- const fetchAllVersionsFn = deps.fetchAllVersionsFn ?? version_checker_1.fetchAllVersions;
153
- const getInstalledVersionFn = deps.getInstalledVersionFn ?? binary_manager_1.getInstalledCliproxyVersion;
154
- const result = await fetchAllVersionsFn(false, backend).catch(() => null);
155
- if (!result) {
156
- return buildVersionsFallback(backend, getInstalledVersionFn);
157
- }
158
- return {
159
- ...result,
160
- currentVersion: getInstalledVersionFn(backend),
161
- maxStableVersion: platform_detector_1.CLIPROXY_MAX_STABLE_VERSION,
162
- faultyRange: platform_detector_1.CLIPROXY_FAULTY_RANGE,
163
- };
164
- }
165
- exports.resolveCliproxyVersionsPayload = resolveCliproxyVersionsPayload;
166
- /**
167
- * Extract status code and model from error log file (lightweight parsing).
168
- * Reads first 4KB for model, last 2KB for status code. Async to avoid blocking event loop.
169
- */
170
- async function extractErrorLogMetadata(filePath) {
171
- let fh = null;
172
- try {
173
- fh = await fs.promises.open(filePath, 'r');
174
- const stat = await fh.stat();
175
- const fileSize = stat.size;
176
- // Read first 4KB for model (in request body)
177
- const startBuffer = Buffer.alloc(Math.min(4096, fileSize));
178
- await fh.read(startBuffer, 0, startBuffer.length, 0);
179
- const startContent = startBuffer.toString('utf-8');
180
- // Extract model from request body JSON: "model":"gemini-3-flash-preview"
181
- const modelMatch = startContent.match(/"model"\s*:\s*"([^"]+)"/);
182
- const model = modelMatch ? modelMatch[1] : undefined;
183
- // Read last 2KB for status code (in response section at end)
184
- let statusCode;
185
- if (fileSize > 2048) {
186
- const endBuffer = Buffer.alloc(2048);
187
- await fh.read(endBuffer, 0, 2048, fileSize - 2048);
188
- const endContent = endBuffer.toString('utf-8');
189
- const statusMatch = endContent.match(/Status:\s*(\d{3})/);
190
- statusCode = statusMatch ? parseInt(statusMatch[1], 10) : undefined;
191
- }
192
- else {
193
- // Small file - check start content for status
194
- const statusMatch = startContent.match(/Status:\s*(\d{3})/);
195
- statusCode = statusMatch ? parseInt(statusMatch[1], 10) : undefined;
196
- }
197
- return { statusCode, model };
198
- }
199
- catch {
200
- return {};
201
- }
202
- finally {
203
- await fh?.close();
204
- }
205
- }
206
- /**
207
- * Shared handler for stats/usage endpoint
208
- */
209
- const handleStatsRequest = async (_req, res) => {
210
- try {
211
- // Check if proxy is running first
212
- const running = await (0, stats_fetcher_1.isCliproxyRunning)();
213
- if (!running) {
214
- res.status(503).json({
215
- error: 'CLIProxy Plus not running',
216
- message: 'Start a CLIProxy session (gemini, codex, claude, agy, ghcp) to collect stats',
217
- });
218
- return;
219
- }
220
- // Fetch stats from management API
221
- const stats = await (0, stats_fetcher_1.fetchCliproxyStats)();
222
- if (!stats) {
223
- res.status(503).json({
224
- error: 'Stats unavailable',
225
- message: 'CLIProxy Plus is running but stats endpoint not responding',
226
- });
227
- return;
228
- }
229
- res.json(stats);
230
- }
231
- catch (error) {
232
- console.error(`[cliproxy-stats] ${error.message}`);
233
- res.status(500).json({ error: 'Internal server error' });
234
- }
235
- };
236
- /**
237
- * GET /api/cliproxy/stats - Get CLIProxyAPI usage statistics
238
- * Returns: CliproxyStats or error if proxy not running
239
- */
240
- router.get('/stats', handleStatsRequest);
241
- /**
242
- * GET /api/cliproxy/usage - Alias for /stats (frontend compatibility)
243
- */
244
- router.get('/usage', handleStatsRequest);
245
- /**
246
- * GET /api/cliproxy/status - Check CLIProxyAPI running status
247
- * Returns: { running: boolean }
248
- */
249
- router.get('/status', async (_req, res) => {
250
- try {
251
- const running = await (0, stats_fetcher_1.isCliproxyRunning)((0, port_manager_1.resolveLifecyclePort)());
252
- res.json({ running });
253
- }
254
- catch (error) {
255
- console.error(`[cliproxy-stats] ${error.message}`);
256
- res.status(500).json({ error: 'Internal server error' });
257
- }
258
- });
259
- /**
260
- * GET /api/cliproxy/proxy-status - Get detailed proxy process status
261
- * Returns: { running, port?, pid?, sessionCount?, startedAt? }
262
- * Combines session tracker data with actual port check for accuracy
263
- */
264
- router.get('/proxy-status', async (_req, res) => {
265
- try {
266
- const port = (0, port_manager_1.resolveLifecyclePort)();
267
- // First check session tracker for detailed info
268
- const sessionStatus = (0, session_tracker_1.getProxyStatus)(port);
269
- // If session tracker says running, trust it
270
- if (sessionStatus.running) {
271
- res.json(sessionStatus);
272
- return;
273
- }
274
- // Session tracker says not running, but proxy might be running without session tracking
275
- // (e.g., started before session persistence was implemented)
276
- const actuallyRunning = await (0, stats_fetcher_1.isCliproxyRunning)(port);
277
- if (actuallyRunning) {
278
- // Proxy running but no session lock - legacy/untracked instance
279
- res.json({
280
- running: true,
281
- port,
282
- sessionCount: 0, // Unknown sessions
283
- // No pid/startedAt since we don't have session lock
284
- });
285
- }
286
- else {
287
- res.json(sessionStatus);
288
- }
289
- }
290
- catch (error) {
291
- console.error(`[cliproxy-stats] ${error.message}`);
292
- res.status(500).json({ error: 'Internal server error' });
293
- }
294
- });
295
- /**
296
- * POST /api/cliproxy/proxy-start - Start the CLIProxy service
297
- * Returns: { started, alreadyRunning, port, error? }
298
- * Starts proxy in background if not already running
299
- */
300
- router.post('/proxy-start', async (_req, res) => {
301
- try {
302
- const result = await (0, service_manager_1.ensureCliproxyService)((0, port_manager_1.resolveLifecyclePort)());
303
- res.json(result);
304
- }
305
- catch (error) {
306
- console.error(`[cliproxy-stats] ${error.message}`);
307
- res.status(500).json({ error: 'Internal server error' });
308
- }
309
- });
310
- /**
311
- * POST /api/cliproxy/proxy-stop - Stop the CLIProxy service
312
- * Returns: { stopped, pid?, sessionCount?, error? }
313
- */
314
- router.post('/proxy-stop', async (_req, res) => {
315
- try {
316
- const result = await (0, session_tracker_1.stopProxy)((0, port_manager_1.resolveLifecyclePort)());
317
- res.json(result);
318
- }
319
- catch (error) {
320
- console.error(`[cliproxy-stats] ${error.message}`);
321
- res.status(500).json({ error: 'Internal server error' });
322
- }
323
- });
324
- /**
325
- * GET /api/cliproxy/update-check - Check for CLIProxyAPI binary updates
326
- * Returns: { hasUpdate, currentVersion, latestVersion, fromCache }
327
- */
328
- router.get('/update-check', async (_req, res) => {
329
- try {
330
- const backend = (0, binary_manager_1.getStoredConfiguredBackend)();
331
- const result = await resolveCliproxyUpdateCheckPayload(backend);
332
- res.json(result);
333
- }
334
- catch (error) {
335
- console.error(`[cliproxy-stats] ${error.message}`);
336
- res.status(500).json({ error: 'Internal server error' });
337
- }
338
- });
339
- /**
340
- * GET /api/cliproxy/models - Get available models from CLIProxyAPI
341
- * Returns: { models: CliproxyModel[], byCategory: Record<string, CliproxyModel[]>, totalCount: number }
342
- */
343
- router.get('/models', async (_req, res) => {
344
- try {
345
- // Check if proxy is running first
346
- const running = await (0, stats_fetcher_1.isCliproxyRunning)();
347
- if (!running) {
348
- res.status(503).json({
349
- error: 'CLIProxy Plus not running',
350
- message: 'Start a CLIProxy session (gemini, codex, claude, agy) to fetch available models',
351
- });
352
- return;
353
- }
354
- // Fetch models from /v1/models endpoint
355
- const modelsResponse = await (0, stats_fetcher_1.fetchCliproxyModels)();
356
- if (!modelsResponse) {
357
- res.status(503).json({
358
- error: 'Models unavailable',
359
- message: 'CLIProxy Plus is running but /v1/models endpoint not responding',
360
- });
361
- return;
362
- }
363
- res.json(modelsResponse);
364
- }
365
- catch (error) {
366
- console.error(`[cliproxy-stats] ${error.message}`);
367
- res.status(500).json({ error: 'Internal server error' });
368
- }
369
- });
370
- // ==================== Error Logs ====================
371
- /**
372
- * GET /api/cliproxy/error-logs - Get list of error log files
373
- * Returns: { files: CliproxyErrorLog[] } or error if proxy not running
374
- */
375
- router.get('/error-logs', async (_req, res) => {
376
- try {
377
- const running = await (0, stats_fetcher_1.isCliproxyRunning)();
378
- if (!running) {
379
- res.status(503).json({
380
- error: 'CLIProxy Plus not running',
381
- message: 'Start a CLIProxy session to view error logs',
382
- });
383
- return;
384
- }
385
- const files = await (0, stats_fetcher_1.fetchCliproxyErrorLogs)();
386
- if (files === null) {
387
- res.status(503).json({
388
- error: 'Error logs unavailable',
389
- message: 'CLIProxy Plus is running but error logs endpoint not responding',
390
- });
391
- return;
392
- }
393
- // Inject absolute paths and extract metadata from each file
394
- const logsDir = path.join((0, config_generator_1.getCliproxyWritablePath)(), 'logs');
395
- const filesWithMetadata = await Promise.all(files.map(async (file) => {
396
- const absolutePath = path.join(logsDir, file.name);
397
- const metadata = await extractErrorLogMetadata(absolutePath);
398
- return {
399
- ...file,
400
- absolutePath,
401
- statusCode: metadata.statusCode,
402
- model: metadata.model,
403
- };
404
- }));
405
- res.json({ files: filesWithMetadata });
406
- }
407
- catch (error) {
408
- console.error(`[cliproxy-stats] ${error.message}`);
409
- res.status(500).json({ error: 'Internal server error' });
410
- }
411
- });
412
- /**
413
- * GET /api/cliproxy/error-logs/:name - Get content of a specific error log
414
- * Returns: plain text log content
415
- */
416
- router.get('/error-logs/:name', async (req, res) => {
417
- const { name } = req.params;
418
- // Validate filename format and prevent path traversal
419
- if (!name ||
420
- !name.startsWith('error-') ||
421
- !name.endsWith('.log') ||
422
- name.includes('..') ||
423
- name.includes('/') ||
424
- name.includes('\\')) {
425
- res.status(400).json({ error: 'Invalid error log filename' });
426
- return;
427
- }
428
- try {
429
- const running = await (0, stats_fetcher_1.isCliproxyRunning)();
430
- if (!running) {
431
- res.status(503).json({ error: 'CLIProxy Plus not running' });
432
- return;
433
- }
434
- const content = await (0, stats_fetcher_1.fetchCliproxyErrorLogContent)(name);
435
- if (content === null) {
436
- res.status(404).json({ error: 'Error log not found' });
437
- return;
438
- }
439
- res.type('text/plain').send(content);
440
- }
441
- catch (error) {
442
- console.error(`[cliproxy-stats] ${error.message}`);
443
- res.status(500).json({ error: 'Internal server error' });
444
- }
445
- });
446
- // ==================== Config File ====================
447
- /**
448
- * GET /api/cliproxy/config.yaml - Get CLIProxy YAML config content
449
- * Returns: plain text YAML content
450
- */
451
- router.get('/config.yaml', async (_req, res) => {
452
- try {
453
- const configPath = (0, config_generator_1.getCliproxyConfigPath)();
454
- if (!fs.existsSync(configPath)) {
455
- res.status(404).json({ error: 'Config file not found' });
456
- return;
457
- }
458
- const content = fs.readFileSync(configPath, 'utf8');
459
- res.type('text/yaml').send(content);
460
- }
461
- catch (error) {
462
- console.error(`[cliproxy-stats] ${error.message}`);
463
- res.status(500).json({ error: 'Internal server error' });
464
- }
465
- });
466
- /**
467
- * PUT /api/cliproxy/config.yaml - Save CLIProxy YAML config content
468
- * Body: { content: string }
469
- * Returns: { success: true, path: string }
470
- */
471
- router.put('/config.yaml', async (req, res) => {
472
- try {
473
- const { content } = req.body;
474
- if (typeof content !== 'string') {
475
- res.status(400).json({ error: 'Missing required field: content' });
476
- return;
477
- }
478
- const configPath = (0, config_generator_1.getCliproxyConfigPath)();
479
- // Ensure parent directory exists
480
- const configDir = path.dirname(configPath);
481
- if (!fs.existsSync(configDir)) {
482
- fs.mkdirSync(configDir, { recursive: true });
483
- }
484
- // Write atomically
485
- const tempPath = configPath + '.tmp';
486
- fs.writeFileSync(tempPath, content);
487
- fs.renameSync(tempPath, configPath);
488
- res.json({ success: true, path: configPath });
489
- }
490
- catch (error) {
491
- console.error(`[cliproxy-stats] ${error.message}`);
492
- res.status(500).json({ error: 'Internal server error' });
493
- }
494
- });
495
- // ==================== Auth Files ====================
496
- /**
497
- * GET /api/cliproxy/auth-files - List auth files in auth directory
498
- * Returns: { files: Array<{ name, size, mtime }> }
499
- */
500
- router.get('/auth-files', async (_req, res) => {
501
- try {
502
- const authDir = (0, config_generator_1.getAuthDir)();
503
- if (!fs.existsSync(authDir)) {
504
- res.json({ files: [] });
505
- return;
506
- }
507
- const entries = fs.readdirSync(authDir, { withFileTypes: true });
508
- const files = entries
509
- .filter((entry) => entry.isFile())
510
- .map((entry) => {
511
- const filePath = path.join(authDir, entry.name);
512
- const stat = fs.statSync(filePath);
513
- return {
514
- name: entry.name,
515
- size: stat.size,
516
- mtime: stat.mtime.getTime(),
517
- };
518
- });
519
- res.json({ files, directory: authDir });
520
- }
521
- catch (error) {
522
- console.error(`[cliproxy-stats] ${error.message}`);
523
- res.status(500).json({ error: 'Internal server error' });
524
- }
525
- });
526
- /**
527
- * GET /api/cliproxy/auth-files/download - Download auth file content
528
- * Query: ?name=filename
529
- * Returns: file content as octet-stream
530
- */
531
- router.get('/auth-files/download', async (req, res) => {
532
- try {
533
- const { name } = req.query;
534
- if (!name || typeof name !== 'string') {
535
- res.status(400).json({ error: 'Missing required query parameter: name' });
536
- return;
537
- }
538
- // Validate filename - prevent path traversal
539
- if (name.includes('..') || name.includes('/') || name.includes('\\')) {
540
- res.status(400).json({ error: 'Invalid filename' });
541
- return;
542
- }
543
- const authDir = (0, config_generator_1.getAuthDir)();
544
- const filePath = path.join(authDir, name);
545
- if (!fs.existsSync(filePath)) {
546
- res.status(404).json({ error: 'Auth file not found' });
547
- return;
548
- }
549
- const content = fs.readFileSync(filePath);
550
- res.setHeader('Content-Disposition', `attachment; filename="${name}"`);
551
- res.type('application/octet-stream').send(content);
552
- }
553
- catch (error) {
554
- console.error(`[cliproxy-stats] ${error.message}`);
555
- res.status(500).json({ error: 'Internal server error' });
556
- }
557
- });
558
- // ==================== Model Updates ====================
559
- /**
560
- * PUT /api/cliproxy/models/:provider - Update model for a provider
561
- * Body: { model: string }
562
- * Returns: { success: true, provider, model }
563
- */
564
- router.put('/models/:provider', async (req, res) => {
565
- try {
566
- const { provider } = req.params;
567
- // Validate provider name to prevent path traversal via crafted provider param
568
- if (!provider || provider.length > 64 || !/^[a-zA-Z0-9_-]+$/.test(provider)) {
569
- res.status(400).json({ error: 'Invalid provider name' });
570
- return;
571
- }
572
- const { model } = req.body;
573
- if (!model || typeof model !== 'string') {
574
- res.status(400).json({ error: 'Missing required field: model' });
575
- return;
576
- }
577
- if (model.length > 256) {
578
- res.status(400).json({ error: 'Model ID exceeds maximum length (256 characters)' });
579
- return;
580
- }
581
- const deniedReason = (0, model_id_normalizer_1.getDeniedModelIdReasonForProvider)(model, provider);
582
- if (deniedReason) {
583
- res.status(400).json({ error: deniedReason });
584
- return;
585
- }
586
- // Get the settings file for this provider
587
- const ccsDir = (0, config_generator_1.getCliproxyWritablePath)();
588
- const settingsPath = path.join(ccsDir, `${provider}.settings.json`);
589
- if (!fs.existsSync(settingsPath)) {
590
- res.status(404).json({ error: `Settings file not found for provider: ${provider}` });
591
- return;
592
- }
593
- // Read and update settings
594
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
595
- const canonicalModel = (0, model_id_normalizer_1.canonicalizeModelIdForProvider)(model, provider);
596
- const env = settings.env && typeof settings.env === 'object' && !Array.isArray(settings.env)
597
- ? settings.env
598
- : {};
599
- const previousDefault = typeof env.ANTHROPIC_MODEL === 'string' ? env.ANTHROPIC_MODEL : canonicalModel;
600
- const previousCanonicalDefault = (0, model_id_normalizer_1.canonicalizeModelIdForProvider)(previousDefault, provider);
601
- for (const key of model_id_normalizer_1.MODEL_ENV_VAR_KEYS) {
602
- if (key === 'ANTHROPIC_MODEL') {
603
- env[key] = canonicalModel;
604
- continue;
605
- }
606
- const current = env[key];
607
- if (typeof current !== 'string') {
608
- env[key] = canonicalModel;
609
- continue;
610
- }
611
- const canonicalCurrent = (0, model_id_normalizer_1.canonicalizeModelIdForProvider)(current, provider);
612
- env[key] = canonicalCurrent === previousCanonicalDefault ? canonicalModel : canonicalCurrent;
613
- }
614
- settings.env = env;
615
- // Write atomically
616
- const tempPath = settingsPath + '.tmp';
617
- fs.writeFileSync(tempPath, JSON.stringify(settings, null, 2) + '\n');
618
- fs.renameSync(tempPath, settingsPath);
619
- res.json({ success: true, provider, model: canonicalModel });
620
- }
621
- catch (error) {
622
- console.error(`[cliproxy-stats] ${error.message}`);
623
- res.status(500).json({ error: 'Internal server error' });
624
- }
625
- });
626
- // ==================== Account Quota ====================
627
- // NOTE: Specific routes MUST be defined BEFORE generic routes for Express routing to work correctly
628
- // NOTE: All quota endpoints use in-memory caching (2 min TTL) to reduce external API calls
629
- /**
630
- * GET /api/cliproxy/quota/codex/:accountId - Get Codex quota for a specific account
631
- * Returns: CodexQuotaResult with rate limit windows
632
- * Caching: 2 minute TTL to reduce ChatGPT API calls
633
- */
634
- router.get('/quota/codex/:accountId', async (req, res) => {
635
- const { accountId } = req.params;
636
- if (isQuotaRouteRateLimited(req, 'codex')) {
637
- res
638
- .status(429)
639
- .json({ error: 'Too many quota requests', message: 'Retry after a short delay' });
640
- return;
641
- }
642
- // Validate accountId - prevent path traversal
643
- if (!accountId ||
644
- accountId.includes('..') ||
645
- accountId.includes('/') ||
646
- accountId.includes('\\')) {
647
- res.status(400).json({ error: 'Invalid account ID' });
648
- return;
649
- }
650
- try {
651
- // Check cache first
652
- const cached = (0, quota_response_cache_1.getCachedQuota)('codex', accountId);
653
- if (cached) {
654
- res.json({ ...cached, cached: true });
655
- return;
656
- }
657
- // Fetch from external API
658
- const result = await (0, quota_fetcher_codex_1.fetchCodexQuota)(accountId);
659
- // Cache successful and stable failure states; skip transient network failures.
660
- if (shouldCacheQuotaResult(result)) {
661
- (0, quota_response_cache_1.setCachedQuota)('codex', accountId, result);
662
- }
663
- res.json(result);
664
- }
665
- catch (error) {
666
- console.error(`[cliproxy-stats] ${error.message}`);
667
- res.status(500).json({ error: 'Internal server error' });
668
- }
669
- });
670
- /**
671
- * GET /api/cliproxy/quota/claude/:accountId - Get Claude quota for a specific account
672
- * Returns: ClaudeQuotaResult with policy windows (5h + weekly)
673
- * Caching: 2 minute TTL to reduce Anthropic API calls
674
- */
675
- router.get('/quota/claude/:accountId', async (req, res) => {
676
- const { accountId } = req.params;
677
- if (isQuotaRouteRateLimited(req, 'claude')) {
678
- res
679
- .status(429)
680
- .json({ error: 'Too many quota requests', message: 'Retry after a short delay' });
681
- return;
682
- }
683
- // Validate accountId - prevent path traversal
684
- if (!accountId ||
685
- accountId.includes('..') ||
686
- accountId.includes('/') ||
687
- accountId.includes('\\')) {
688
- res.status(400).json({ error: 'Invalid account ID' });
689
- return;
690
- }
691
- try {
692
- // Check cache first
693
- const cached = (0, quota_response_cache_1.getCachedQuota)('claude', accountId);
694
- if (cached) {
695
- res.json({ ...cached, cached: true });
696
- return;
697
- }
698
- // Fetch from external API
699
- const result = await (0, quota_fetcher_claude_1.fetchClaudeQuota)(accountId);
700
- // Cache successful and stable failure states; skip transient network failures.
701
- if (shouldCacheQuotaResult(result)) {
702
- (0, quota_response_cache_1.setCachedQuota)('claude', accountId, result);
703
- }
704
- res.json(result);
705
- }
706
- catch (error) {
707
- console.error(`[cliproxy-stats] ${error.message}`);
708
- res.status(500).json({ error: 'Internal server error' });
709
- }
710
- });
711
- /**
712
- * GET /api/cliproxy/quota/gemini/:accountId - Get Gemini quota for a specific account
713
- * Returns: GeminiCliQuotaResult with quota buckets
714
- * Caching: 2 minute TTL to reduce Google Cloud API calls
715
- */
716
- router.get('/quota/gemini/:accountId', async (req, res) => {
717
- const { accountId } = req.params;
718
- if (isQuotaRouteRateLimited(req, 'gemini')) {
719
- res
720
- .status(429)
721
- .json({ error: 'Too many quota requests', message: 'Retry after a short delay' });
722
- return;
723
- }
724
- // Validate accountId - prevent path traversal
725
- if (!accountId ||
726
- accountId.includes('..') ||
727
- accountId.includes('/') ||
728
- accountId.includes('\\')) {
729
- res.status(400).json({ error: 'Invalid account ID' });
730
- return;
731
- }
732
- try {
733
- // Check cache first
734
- const cached = (0, quota_response_cache_1.getCachedQuota)('gemini', accountId);
735
- if (cached) {
736
- res.json({ ...cached, cached: true });
737
- return;
738
- }
739
- // Fetch from external API
740
- const result = await (0, quota_fetcher_gemini_cli_1.fetchGeminiCliQuota)(accountId);
741
- // Cache successful and stable failure states; skip transient network failures.
742
- if (shouldCacheQuotaResult(result)) {
743
- (0, quota_response_cache_1.setCachedQuota)('gemini', accountId, result);
744
- }
745
- res.json(result);
746
- }
747
- catch (error) {
748
- console.error(`[cliproxy-stats] ${error.message}`);
749
- res.status(500).json({ error: 'Internal server error' });
750
- }
751
- });
752
- /**
753
- * GET /api/cliproxy/quota/ghcp/:accountId - Get GitHub Copilot (ghcp) quota for a specific account
754
- * Returns: GhcpQuotaResult with premium/chat/completions quota snapshots
755
- * Caching: 2 minute TTL to reduce GitHub API calls
756
- */
757
- router.get('/quota/ghcp/:accountId', async (req, res) => {
758
- const { accountId } = req.params;
759
- if (isQuotaRouteRateLimited(req, 'ghcp')) {
760
- res
761
- .status(429)
762
- .json({ error: 'Too many quota requests', message: 'Retry after a short delay' });
763
- return;
764
- }
765
- // Validate accountId - prevent path traversal
766
- if (!accountId ||
767
- accountId.includes('..') ||
768
- accountId.includes('/') ||
769
- accountId.includes('\\')) {
770
- res.status(400).json({ error: 'Invalid account ID' });
771
- return;
772
- }
773
- try {
774
- // Check cache first
775
- const cached = (0, quota_response_cache_1.getCachedQuota)('ghcp', accountId);
776
- if (cached) {
777
- res.json({ ...cached, cached: true });
778
- return;
779
- }
780
- // Fetch from GitHub API
781
- const result = await (0, quota_fetcher_ghcp_1.fetchGhcpQuota)(accountId);
782
- // Cache successful and stable failure states; skip transient network failures.
783
- if (shouldCacheQuotaResult(result)) {
784
- (0, quota_response_cache_1.setCachedQuota)('ghcp', accountId, result);
785
- }
786
- res.json(result);
787
- }
788
- catch (error) {
789
- console.error(`[cliproxy-stats] ${error.message}`);
790
- res.status(500).json({ error: 'Internal server error' });
791
- }
792
- });
793
- /**
794
- * GET /api/cliproxy/quota/:provider/:accountId - Get quota for a specific account (generic)
795
- * Returns: QuotaResult with model quotas and reset times
796
- * NOTE: This generic route MUST come after specific routes (codex, claude, gemini, ghcp)
797
- * Caching: 2 minute TTL to reduce external API calls
798
- */
799
- router.get('/quota/:provider/:accountId', async (req, res) => {
800
- const { provider, accountId } = req.params;
801
- if (isQuotaRouteRateLimited(req, provider)) {
802
- res
803
- .status(429)
804
- .json({ error: 'Too many quota requests', message: 'Retry after a short delay' });
805
- return;
806
- }
807
- // Validate provider - use canonical CLIPROXY_PROFILES
808
- const validProviders = [...profile_detector_1.CLIPROXY_PROFILES];
809
- if (!validProviders.includes(provider)) {
810
- res.status(400).json({
811
- error: 'Invalid provider',
812
- message: `Provider must be one of: ${validProviders.join(', ')}`,
813
- });
814
- return;
815
- }
816
- // Validate accountId - prevent path traversal
817
- if (!accountId ||
818
- accountId.includes('..') ||
819
- accountId.includes('/') ||
820
- accountId.includes('\\')) {
821
- res.status(400).json({ error: 'Invalid account ID' });
822
- return;
823
- }
824
- try {
825
- // Check cache first
826
- const cached = (0, quota_response_cache_1.getCachedQuota)(provider, accountId);
827
- if (cached) {
828
- res.json({ ...cached, cached: true });
829
- return;
830
- }
831
- // Fetch from external API
832
- const result = await (0, quota_fetcher_1.fetchAccountQuota)(provider, accountId);
833
- // Cache successful results
834
- if (result.success) {
835
- (0, quota_response_cache_1.setCachedQuota)(provider, accountId, result);
836
- }
837
- res.json(result);
838
- }
839
- catch (error) {
840
- console.error(`[cliproxy-stats] ${error.message}`);
841
- res.status(500).json({ error: 'Internal server error' });
842
- }
843
- });
844
- // ==================== Version Management ====================
845
- /**
846
- * GET /api/cliproxy/versions - Get all available CLIProxyAPI versions
847
- * Returns: { versions, latestStable, latest, currentVersion, maxStableVersion }
848
- */
849
- router.get('/versions', async (_req, res) => {
850
- try {
851
- const backend = (0, binary_manager_1.getStoredConfiguredBackend)();
852
- res.json(await resolveCliproxyVersionsPayload(backend));
853
- }
854
- catch (error) {
855
- console.error(`[cliproxy-stats] ${error.message}`);
856
- res.status(500).json({ error: 'Internal server error' });
857
- }
858
- });
859
- /**
860
- * POST /api/cliproxy/install - Install specific CLIProxyAPI version
861
- * Body: { version: string, force?: boolean }
862
- * Returns: { success, restarted?, port?, requiresConfirmation?, message? }
863
- */
864
- router.post('/install', async (req, res) => {
865
- try {
866
- const { version, force } = req.body;
867
- if (!version || typeof version !== 'string') {
868
- res.status(400).json({ error: 'Missing required field: version' });
869
- return;
870
- }
871
- // Validate version format
872
- if (!/^\d+\.\d+\.\d+(-\d+)?$/.test(version)) {
873
- res.status(400).json({ error: 'Invalid version format. Expected: X.Y.Z or X.Y.Z-N' });
874
- return;
875
- }
876
- // Check if version is faulty (v81-85) or experimental (above max stable)
877
- const isFaulty = (0, version_checker_1.isVersionFaulty)(version);
878
- const isExperimental = (0, version_checker_1.isNewerVersion)(version, platform_detector_1.CLIPROXY_MAX_STABLE_VERSION);
879
- if (isFaulty && !force) {
880
- res.json({
881
- success: false,
882
- isFaulty,
883
- isExperimental,
884
- requiresConfirmation: true,
885
- message: `Version ${version} has known bugs (v${platform_detector_1.CLIPROXY_FAULTY_RANGE.min.replace(/-\d+$/, '')}-${platform_detector_1.CLIPROXY_FAULTY_RANGE.max.replace(/-\d+$/, '')}). Set force=true to proceed.`,
886
- });
887
- return;
888
- }
889
- if (isExperimental && !force) {
890
- res.json({
891
- success: false,
892
- isFaulty,
893
- isExperimental,
894
- requiresConfirmation: true,
895
- message: `Version ${version} is experimental (above stable ${platform_detector_1.CLIPROXY_MAX_STABLE_VERSION.replace(/-\d+$/, '')}). Set force=true to proceed.`,
896
- });
897
- return;
898
- }
899
- const backend = (0, binary_manager_1.getStoredConfiguredBackend)();
900
- const installResult = await (0, cliproxy_dashboard_install_service_1.installDashboardCliproxyVersion)(version, backend);
901
- res.json({
902
- version,
903
- isFaulty,
904
- isExperimental,
905
- ...installResult,
906
- });
907
- }
908
- catch (error) {
909
- console.error(`[cliproxy-stats] ${error.message}`);
910
- res.status(500).json({ error: 'Internal server error' });
911
- }
912
- });
913
- /**
914
- * POST /api/cliproxy/restart - Restart CLIProxy without version change
915
- * Returns: { success, port?, error? }
916
- */
917
- function registerCliproxyRestartRoute(targetRouter, restartHandler = cliproxy_dashboard_restart_service_1.restartDashboardCliproxy) {
918
- targetRouter.post('/restart', async (_req, res) => {
919
- try {
920
- const result = await restartHandler();
921
- res.json(result);
922
- }
923
- catch (error) {
924
- console.error(`[cliproxy-stats] ${error.message}`);
925
- res.status(500).json({ error: 'Internal server error' });
926
- }
927
- });
928
- }
929
- exports.registerCliproxyRestartRoute = registerCliproxyRestartRoute;
930
- registerCliproxyRestartRoute(router);
931
- exports.default = router;
21
+ exports.resolveCliproxyVersionsPayload = exports.resolveCliproxyUpdateCheckPayload = exports.registerCliproxyRestartRoute = exports.shouldCacheQuotaResult = exports.default = void 0;
22
+ var router_1 = require("./cliproxy-stats-routes/router");
23
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(router_1).default; } });
24
+ var quota_helpers_1 = require("./cliproxy-stats-routes/quota-helpers");
25
+ Object.defineProperty(exports, "shouldCacheQuotaResult", { enumerable: true, get: function () { return quota_helpers_1.shouldCacheQuotaResult; } });
26
+ var restart_route_1 = require("./cliproxy-stats-routes/restart-route");
27
+ Object.defineProperty(exports, "registerCliproxyRestartRoute", { enumerable: true, get: function () { return restart_route_1.registerCliproxyRestartRoute; } });
28
+ var version_helpers_1 = require("./cliproxy-stats-routes/version-helpers");
29
+ Object.defineProperty(exports, "resolveCliproxyUpdateCheckPayload", { enumerable: true, get: function () { return version_helpers_1.resolveCliproxyUpdateCheckPayload; } });
30
+ Object.defineProperty(exports, "resolveCliproxyVersionsPayload", { enumerable: true, get: function () { return version_helpers_1.resolveCliproxyVersionsPayload; } });
932
31
  //# sourceMappingURL=cliproxy-stats-routes.js.map