@kaitranntt/ccs 8.2.0 → 8.3.0-dev.1

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 (311) hide show
  1. package/README.md +12 -0
  2. package/config/base-claude.settings.json +1 -5
  3. package/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
  4. package/dist/api/services/cliproxy-profile-bridge.js +6 -0
  5. package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
  6. package/dist/api/services/profile-writer.d.ts.map +1 -1
  7. package/dist/api/services/profile-writer.js +18 -8
  8. package/dist/api/services/profile-writer.js.map +1 -1
  9. package/dist/auth/commands/create-command.d.ts.map +1 -1
  10. package/dist/auth/commands/create-command.js +11 -0
  11. package/dist/auth/commands/create-command.js.map +1 -1
  12. package/dist/cliproxy/accounts/account-safety-cross-lane.d.ts +41 -0
  13. package/dist/cliproxy/accounts/account-safety-cross-lane.d.ts.map +1 -0
  14. package/dist/cliproxy/accounts/account-safety-cross-lane.js +177 -0
  15. package/dist/cliproxy/accounts/account-safety-cross-lane.js.map +1 -0
  16. package/dist/cliproxy/accounts/account-safety.d.ts +29 -1
  17. package/dist/cliproxy/accounts/account-safety.d.ts.map +1 -1
  18. package/dist/cliproxy/accounts/account-safety.js +41 -7
  19. package/dist/cliproxy/accounts/account-safety.js.map +1 -1
  20. package/dist/cliproxy/accounts/drain-order.d.ts +277 -0
  21. package/dist/cliproxy/accounts/drain-order.d.ts.map +1 -0
  22. package/dist/cliproxy/accounts/drain-order.js +575 -0
  23. package/dist/cliproxy/accounts/drain-order.js.map +1 -0
  24. package/dist/cliproxy/accounts/pool-state.d.ts +132 -0
  25. package/dist/cliproxy/accounts/pool-state.d.ts.map +1 -0
  26. package/dist/cliproxy/accounts/pool-state.js +201 -0
  27. package/dist/cliproxy/accounts/pool-state.js.map +1 -0
  28. package/dist/cliproxy/accounts/registry.d.ts +17 -1
  29. package/dist/cliproxy/accounts/registry.d.ts.map +1 -1
  30. package/dist/cliproxy/accounts/registry.js +47 -1
  31. package/dist/cliproxy/accounts/registry.js.map +1 -1
  32. package/dist/cliproxy/accounts/types.d.ts +20 -0
  33. package/dist/cliproxy/accounts/types.d.ts.map +1 -1
  34. package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
  35. package/dist/cliproxy/auth/oauth-handler.js +29 -0
  36. package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
  37. package/dist/cliproxy/binary/platform-detector.d.ts.map +1 -1
  38. package/dist/cliproxy/binary/platform-detector.js +34 -1
  39. package/dist/cliproxy/binary/platform-detector.js.map +1 -1
  40. package/dist/cliproxy/binary/types.d.ts +3 -0
  41. package/dist/cliproxy/binary/types.d.ts.map +1 -1
  42. package/dist/cliproxy/binary/types.js +7 -2
  43. package/dist/cliproxy/binary/types.js.map +1 -1
  44. package/dist/cliproxy/binary/version-cache.d.ts.map +1 -1
  45. package/dist/cliproxy/binary/version-cache.js +4 -0
  46. package/dist/cliproxy/binary/version-cache.js.map +1 -1
  47. package/dist/cliproxy/claude-shadow-warning.d.ts +39 -0
  48. package/dist/cliproxy/claude-shadow-warning.d.ts.map +1 -0
  49. package/dist/cliproxy/claude-shadow-warning.js +187 -0
  50. package/dist/cliproxy/claude-shadow-warning.js.map +1 -0
  51. package/dist/cliproxy/config/base-config-loader.d.ts +6 -5
  52. package/dist/cliproxy/config/base-config-loader.d.ts.map +1 -1
  53. package/dist/cliproxy/config/base-config-loader.js +19 -12
  54. package/dist/cliproxy/config/base-config-loader.js.map +1 -1
  55. package/dist/cliproxy/config/env-builder.d.ts +3 -0
  56. package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
  57. package/dist/cliproxy/config/env-builder.js +158 -20
  58. package/dist/cliproxy/config/env-builder.js.map +1 -1
  59. package/dist/cliproxy/config/generator.d.ts +2 -1
  60. package/dist/cliproxy/config/generator.d.ts.map +1 -1
  61. package/dist/cliproxy/config/generator.js +66 -9
  62. package/dist/cliproxy/config/generator.js.map +1 -1
  63. package/dist/cliproxy/config/thinking-config.d.ts.map +1 -1
  64. package/dist/cliproxy/config/thinking-config.js +2 -0
  65. package/dist/cliproxy/config/thinking-config.js.map +1 -1
  66. package/dist/cliproxy/executor/account-resolution.d.ts.map +1 -1
  67. package/dist/cliproxy/executor/account-resolution.js +5 -0
  68. package/dist/cliproxy/executor/account-resolution.js.map +1 -1
  69. package/dist/cliproxy/executor/auth-coordinator.d.ts +4 -0
  70. package/dist/cliproxy/executor/auth-coordinator.d.ts.map +1 -1
  71. package/dist/cliproxy/executor/auth-coordinator.js +5 -1
  72. package/dist/cliproxy/executor/auth-coordinator.js.map +1 -1
  73. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  74. package/dist/cliproxy/executor/index.js +20 -0
  75. package/dist/cliproxy/executor/index.js.map +1 -1
  76. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  77. package/dist/cliproxy/model-catalog.js +15 -0
  78. package/dist/cliproxy/model-catalog.js.map +1 -1
  79. package/dist/cliproxy/proxy/upstream-response-timeout.d.ts.map +1 -1
  80. package/dist/cliproxy/proxy/upstream-response-timeout.js +8 -1
  81. package/dist/cliproxy/proxy/upstream-response-timeout.js.map +1 -1
  82. package/dist/cliproxy/quota/quota-fetcher-claude.d.ts +9 -0
  83. package/dist/cliproxy/quota/quota-fetcher-claude.d.ts.map +1 -1
  84. package/dist/cliproxy/quota/quota-fetcher-claude.js +53 -16
  85. package/dist/cliproxy/quota/quota-fetcher-claude.js.map +1 -1
  86. package/dist/cliproxy/quota/quota-fetcher.d.ts.map +1 -1
  87. package/dist/cliproxy/quota/quota-fetcher.js +4 -0
  88. package/dist/cliproxy/quota/quota-fetcher.js.map +1 -1
  89. package/dist/cliproxy/quota/quota-manager.d.ts +7 -0
  90. package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
  91. package/dist/cliproxy/quota/quota-manager.js +51 -2
  92. package/dist/cliproxy/quota/quota-manager.js.map +1 -1
  93. package/dist/cliproxy/routing/pool-onboarding-hint.d.ts +95 -0
  94. package/dist/cliproxy/routing/pool-onboarding-hint.d.ts.map +1 -0
  95. package/dist/cliproxy/routing/pool-onboarding-hint.js +172 -0
  96. package/dist/cliproxy/routing/pool-onboarding-hint.js.map +1 -0
  97. package/dist/cliproxy/routing/pool-opt-in-prompt.d.ts +50 -0
  98. package/dist/cliproxy/routing/pool-opt-in-prompt.d.ts.map +1 -0
  99. package/dist/cliproxy/routing/pool-opt-in-prompt.js +232 -0
  100. package/dist/cliproxy/routing/pool-opt-in-prompt.js.map +1 -0
  101. package/dist/cliproxy/routing/routing-strategy.d.ts +132 -0
  102. package/dist/cliproxy/routing/routing-strategy.d.ts.map +1 -1
  103. package/dist/cliproxy/routing/routing-strategy.js +342 -5
  104. package/dist/cliproxy/routing/routing-strategy.js.map +1 -1
  105. package/dist/cliproxy/services/stats-fetcher.d.ts +13 -0
  106. package/dist/cliproxy/services/stats-fetcher.d.ts.map +1 -1
  107. package/dist/cliproxy/services/stats-fetcher.js +25 -1
  108. package/dist/cliproxy/services/stats-fetcher.js.map +1 -1
  109. package/dist/commands/bar/help-subcommand.d.ts +2 -0
  110. package/dist/commands/bar/help-subcommand.d.ts.map +1 -0
  111. package/dist/commands/bar/help-subcommand.js +63 -0
  112. package/dist/commands/bar/help-subcommand.js.map +1 -0
  113. package/dist/commands/bar/index.d.ts +8 -0
  114. package/dist/commands/bar/index.d.ts.map +1 -0
  115. package/dist/commands/bar/index.js +78 -0
  116. package/dist/commands/bar/index.js.map +1 -0
  117. package/dist/commands/bar/install-subcommand.d.ts +92 -0
  118. package/dist/commands/bar/install-subcommand.d.ts.map +1 -0
  119. package/dist/commands/bar/install-subcommand.js +605 -0
  120. package/dist/commands/bar/install-subcommand.js.map +1 -0
  121. package/dist/commands/bar/launch-subcommand.d.ts +64 -0
  122. package/dist/commands/bar/launch-subcommand.d.ts.map +1 -0
  123. package/dist/commands/bar/launch-subcommand.js +236 -0
  124. package/dist/commands/bar/launch-subcommand.js.map +1 -0
  125. package/dist/commands/bar/uninstall-subcommand.d.ts +13 -0
  126. package/dist/commands/bar/uninstall-subcommand.d.ts.map +1 -0
  127. package/dist/commands/bar/uninstall-subcommand.js +78 -0
  128. package/dist/commands/bar/uninstall-subcommand.js.map +1 -0
  129. package/dist/commands/bar/version-subcommand.d.ts +8 -0
  130. package/dist/commands/bar/version-subcommand.d.ts.map +1 -0
  131. package/dist/commands/bar/version-subcommand.js +62 -0
  132. package/dist/commands/bar/version-subcommand.js.map +1 -0
  133. package/dist/commands/cliproxy/help-subcommand.d.ts.map +1 -1
  134. package/dist/commands/cliproxy/help-subcommand.js +20 -1
  135. package/dist/commands/cliproxy/help-subcommand.js.map +1 -1
  136. package/dist/commands/cliproxy/index.d.ts.map +1 -1
  137. package/dist/commands/cliproxy/index.js +20 -0
  138. package/dist/commands/cliproxy/index.js.map +1 -1
  139. package/dist/commands/cliproxy/order-subcommand.d.ts +16 -0
  140. package/dist/commands/cliproxy/order-subcommand.d.ts.map +1 -0
  141. package/dist/commands/cliproxy/order-subcommand.js +520 -0
  142. package/dist/commands/cliproxy/order-subcommand.js.map +1 -0
  143. package/dist/commands/cliproxy/pool-state-renderer.d.ts +40 -0
  144. package/dist/commands/cliproxy/pool-state-renderer.d.ts.map +1 -0
  145. package/dist/commands/cliproxy/pool-state-renderer.js +220 -0
  146. package/dist/commands/cliproxy/pool-state-renderer.js.map +1 -0
  147. package/dist/commands/cliproxy/pool-subcommand.d.ts +10 -0
  148. package/dist/commands/cliproxy/pool-subcommand.d.ts.map +1 -0
  149. package/dist/commands/cliproxy/pool-subcommand.js +112 -0
  150. package/dist/commands/cliproxy/pool-subcommand.js.map +1 -0
  151. package/dist/commands/cliproxy/quota-subcommand.d.ts.map +1 -1
  152. package/dist/commands/cliproxy/quota-subcommand.js +7 -0
  153. package/dist/commands/cliproxy/quota-subcommand.js.map +1 -1
  154. package/dist/commands/cliproxy/routing-subcommand.d.ts.map +1 -1
  155. package/dist/commands/cliproxy/routing-subcommand.js +19 -0
  156. package/dist/commands/cliproxy/routing-subcommand.js.map +1 -1
  157. package/dist/commands/command-catalog.d.ts.map +1 -1
  158. package/dist/commands/command-catalog.js +7 -0
  159. package/dist/commands/command-catalog.js.map +1 -1
  160. package/dist/commands/help-command.d.ts.map +1 -1
  161. package/dist/commands/help-command.js +6 -1
  162. package/dist/commands/help-command.js.map +1 -1
  163. package/dist/commands/root-command-router.d.ts.map +1 -1
  164. package/dist/commands/root-command-router.js +7 -0
  165. package/dist/commands/root-command-router.js.map +1 -1
  166. package/dist/config/loader/yaml-serializer.d.ts.map +1 -1
  167. package/dist/config/loader/yaml-serializer.js +13 -0
  168. package/dist/config/loader/yaml-serializer.js.map +1 -1
  169. package/dist/config/schemas/cliproxy.d.ts +37 -0
  170. package/dist/config/schemas/cliproxy.d.ts.map +1 -1
  171. package/dist/config/schemas/quota.d.ts +26 -2
  172. package/dist/config/schemas/quota.d.ts.map +1 -1
  173. package/dist/config/schemas/quota.js +20 -1
  174. package/dist/config/schemas/quota.js.map +1 -1
  175. package/dist/config/unified-config-loader.d.ts.map +1 -1
  176. package/dist/config/unified-config-loader.js +3 -0
  177. package/dist/config/unified-config-loader.js.map +1 -1
  178. package/dist/dispatcher/flows/account-flow.d.ts.map +1 -1
  179. package/dist/dispatcher/flows/account-flow.js +9 -0
  180. package/dist/dispatcher/flows/account-flow.js.map +1 -1
  181. package/dist/glmt/delta-accumulator.d.ts.map +1 -1
  182. package/dist/glmt/delta-accumulator.js +1 -0
  183. package/dist/glmt/delta-accumulator.js.map +1 -1
  184. package/dist/management/doctor.d.ts.map +1 -1
  185. package/dist/management/doctor.js +10 -0
  186. package/dist/management/doctor.js.map +1 -1
  187. package/dist/proxy/profile-router.d.ts +14 -0
  188. package/dist/proxy/profile-router.d.ts.map +1 -1
  189. package/dist/proxy/profile-router.js +1 -0
  190. package/dist/proxy/profile-router.js.map +1 -1
  191. package/dist/proxy/server/http-helpers.d.ts +5 -0
  192. package/dist/proxy/server/http-helpers.d.ts.map +1 -1
  193. package/dist/proxy/server/http-helpers.js +40 -1
  194. package/dist/proxy/server/http-helpers.js.map +1 -1
  195. package/dist/proxy/server/messages-route.d.ts.map +1 -1
  196. package/dist/proxy/server/messages-route.js +173 -10
  197. package/dist/proxy/server/messages-route.js.map +1 -1
  198. package/dist/proxy/upstream-url.d.ts +42 -2
  199. package/dist/proxy/upstream-url.d.ts.map +1 -1
  200. package/dist/proxy/upstream-url.js +83 -4
  201. package/dist/proxy/upstream-url.js.map +1 -1
  202. package/dist/ui/assets/{Trans-DsGR5Bhb.js → Trans-RG_sMDEu.js} +1 -1
  203. package/dist/ui/assets/accounts-yTXURc-q.js +1 -0
  204. package/dist/ui/assets/{alert-dialog-Do0XfN46.js → alert-dialog-DjvPgzFs.js} +1 -1
  205. package/dist/ui/assets/{api-B7OYas_V.js → api-Ck1dtNEM.js} +3 -3
  206. package/dist/ui/assets/{auth-section-BmTeNetL.js → auth-section-DBnY_LPz.js} +1 -1
  207. package/dist/ui/assets/{backups-section-COawLfTr.js → backups-section-Ci-uL4Of.js} +1 -1
  208. package/dist/ui/assets/{channels-C9LVYmNJ.js → channels-BeS9O5q0.js} +1 -1
  209. package/dist/ui/assets/{checkbox-BkFzg8C-.js → checkbox-DFeFDZBp.js} +1 -1
  210. package/dist/ui/assets/{claude-extension-Ch7L4lTF.js → claude-extension-DS5qN19Z.js} +1 -1
  211. package/dist/ui/assets/{cliproxy-B3uWt6gn.js → cliproxy-D7HJH4mZ.js} +1 -1
  212. package/dist/ui/assets/{cliproxy-ai-providers-Bn1_AdKD.js → cliproxy-ai-providers-oJQZXrtc.js} +1 -1
  213. package/dist/ui/assets/{cliproxy-control-panel-DC4pOOfY.js → cliproxy-control-panel-2mRPEcRj.js} +1 -1
  214. package/dist/ui/assets/codex-D0AUQ6jA.js +30 -0
  215. package/dist/ui/assets/{confirm-dialog-4rb-E8-R.js → confirm-dialog-B37-CVuq.js} +1 -1
  216. package/dist/ui/assets/{copilot-zgPXNkMw.js → copilot-KaaW-mko.js} +2 -2
  217. package/dist/ui/assets/{cursor-lRPpppk-.js → cursor-BKiTgYi5.js} +1 -1
  218. package/dist/ui/assets/{droid-koOj34SB.js → droid-DHdqGnFw.js} +2 -2
  219. package/dist/ui/assets/{globalenv-section-jOkPVwvN.js → globalenv-section-SfZO97nU.js} +1 -1
  220. package/dist/ui/assets/health-CSRS9O0D.js +1 -0
  221. package/dist/ui/assets/icons-DSLG1YsC.js +1 -0
  222. package/dist/ui/assets/{index-D7crOfea.js → index-CGgavq2X.js} +37 -37
  223. package/dist/ui/assets/{index-BLC5PyZn.js → index-ChTYEBCZ.js} +1 -1
  224. package/dist/ui/assets/index-Cu_F55_O.js +1 -0
  225. package/dist/ui/assets/{index-CRhKyfnS.js → index-DJ66NrBH.js} +1 -1
  226. package/dist/ui/assets/index-DWUuSBUe.js +1 -0
  227. package/dist/ui/assets/{index-BK-PSsqi.js → index-DycwEe96.js} +1 -1
  228. package/dist/ui/assets/index-DzFlVVV3.css +1 -0
  229. package/dist/ui/assets/{index-De3yNJ94.js → index-iQuEEGbH.js} +1 -1
  230. package/dist/ui/assets/{logs-BplpQHRb.js → logs-tiZ_51mo.js} +1 -1
  231. package/dist/ui/assets/{masked-input-DuLL3EwS.js → masked-input-D9FVoeMA.js} +1 -1
  232. package/dist/ui/assets/proxy-status-widget-2k26d8pS.js +1 -0
  233. package/dist/ui/assets/{raw-json-settings-editor-panel-ClPqZ6iZ.js → raw-json-settings-editor-panel-CguBh93H.js} +1 -1
  234. package/dist/ui/assets/{searchable-select-BH1b065u.js → searchable-select-C4wShshD.js} +1 -1
  235. package/dist/ui/assets/{separator-BOiJ0l4s.js → separator-mvGlDdEW.js} +1 -1
  236. package/dist/ui/assets/{shared-CunXigZu.js → shared-Ck0yAwbs.js} +1 -1
  237. package/dist/ui/assets/{table-C7ysR1Xz.js → table-DrUJOxKL.js} +1 -1
  238. package/dist/ui/assets/updates-BVHBFcq8.js +1 -0
  239. package/dist/ui/assets/{use-accounts-CwRU3ln9.js → use-accounts-DLtuaniS.js} +1 -1
  240. package/dist/ui/index.html +3 -3
  241. package/dist/utils/browser/mcp-installer.d.ts.map +1 -1
  242. package/dist/utils/browser/mcp-installer.js +5 -34
  243. package/dist/utils/browser/mcp-installer.js.map +1 -1
  244. package/dist/utils/claude-user-config-lock.d.ts +9 -0
  245. package/dist/utils/claude-user-config-lock.d.ts.map +1 -0
  246. package/dist/utils/claude-user-config-lock.js +96 -0
  247. package/dist/utils/claude-user-config-lock.js.map +1 -0
  248. package/dist/utils/image-analysis/mcp-installer.d.ts.map +1 -1
  249. package/dist/utils/image-analysis/mcp-installer.js +5 -34
  250. package/dist/utils/image-analysis/mcp-installer.js.map +1 -1
  251. package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
  252. package/dist/utils/websearch/mcp-installer.js +112 -78
  253. package/dist/utils/websearch/mcp-installer.js.map +1 -1
  254. package/dist/web-server/model-pricing.d.ts.map +1 -1
  255. package/dist/web-server/model-pricing.js +7 -0
  256. package/dist/web-server/model-pricing.js.map +1 -1
  257. package/dist/web-server/routes/account-routes.d.ts.map +1 -1
  258. package/dist/web-server/routes/account-routes.js +116 -0
  259. package/dist/web-server/routes/account-routes.js.map +1 -1
  260. package/dist/web-server/routes/bar-routes.d.ts +149 -0
  261. package/dist/web-server/routes/bar-routes.d.ts.map +1 -0
  262. package/dist/web-server/routes/bar-routes.js +415 -0
  263. package/dist/web-server/routes/bar-routes.js.map +1 -0
  264. package/dist/web-server/routes/index.d.ts.map +1 -1
  265. package/dist/web-server/routes/index.js +18 -0
  266. package/dist/web-server/routes/index.js.map +1 -1
  267. package/dist/web-server/usage/bar-analytics.d.ts +101 -0
  268. package/dist/web-server/usage/bar-analytics.d.ts.map +1 -0
  269. package/dist/web-server/usage/bar-analytics.js +315 -0
  270. package/dist/web-server/usage/bar-analytics.js.map +1 -0
  271. package/dist/web-server/usage/claude-native-credentials.d.ts +56 -0
  272. package/dist/web-server/usage/claude-native-credentials.d.ts.map +1 -0
  273. package/dist/web-server/usage/claude-native-credentials.js +140 -0
  274. package/dist/web-server/usage/claude-native-credentials.js.map +1 -0
  275. package/dist/web-server/usage/cliproxy-snapshot-reader.d.ts +24 -0
  276. package/dist/web-server/usage/cliproxy-snapshot-reader.d.ts.map +1 -0
  277. package/dist/web-server/usage/cliproxy-snapshot-reader.js +82 -0
  278. package/dist/web-server/usage/cliproxy-snapshot-reader.js.map +1 -0
  279. package/dist/web-server/usage/cliproxy-usage-syncer.d.ts +3 -2
  280. package/dist/web-server/usage/cliproxy-usage-syncer.d.ts.map +1 -1
  281. package/dist/web-server/usage/cliproxy-usage-syncer.js +14 -2
  282. package/dist/web-server/usage/cliproxy-usage-syncer.js.map +1 -1
  283. package/dist/web-server/usage/cliproxy-usage-transformer.d.ts +8 -1
  284. package/dist/web-server/usage/cliproxy-usage-transformer.d.ts.map +1 -1
  285. package/dist/web-server/usage/cliproxy-usage-transformer.js +31 -4
  286. package/dist/web-server/usage/cliproxy-usage-transformer.js.map +1 -1
  287. package/dist/web-server/usage/codex-local-quota-collector.d.ts +74 -0
  288. package/dist/web-server/usage/codex-local-quota-collector.d.ts.map +1 -0
  289. package/dist/web-server/usage/codex-local-quota-collector.js +250 -0
  290. package/dist/web-server/usage/codex-local-quota-collector.js.map +1 -0
  291. package/dist/web-server/usage/data-aggregator.d.ts +11 -0
  292. package/dist/web-server/usage/data-aggregator.d.ts.map +1 -1
  293. package/dist/web-server/usage/data-aggregator.js +29 -1
  294. package/dist/web-server/usage/data-aggregator.js.map +1 -1
  295. package/dist/web-server/usage/native-quota-collector.d.ts +44 -0
  296. package/dist/web-server/usage/native-quota-collector.d.ts.map +1 -0
  297. package/dist/web-server/usage/native-quota-collector.js +378 -0
  298. package/dist/web-server/usage/native-quota-collector.js.map +1 -0
  299. package/dist/web-server/usage/types.d.ts +2 -0
  300. package/dist/web-server/usage/types.d.ts.map +1 -1
  301. package/package.json +1 -1
  302. package/scripts/run-test-bucket.js +183 -17
  303. package/dist/ui/assets/accounts-DHBmHeH-.js +0 -1
  304. package/dist/ui/assets/codex-CcODhykP.js +0 -30
  305. package/dist/ui/assets/health-CxHauE3Y.js +0 -1
  306. package/dist/ui/assets/icons-DzKUh8vG.js +0 -1
  307. package/dist/ui/assets/index-DOfPoKe_.css +0 -1
  308. package/dist/ui/assets/index-DUGnoURR.js +0 -1
  309. package/dist/ui/assets/index-I_ek1xyD.js +0 -1
  310. package/dist/ui/assets/proxy-status-widget-BruRPTSl.js +0 -1
  311. package/dist/ui/assets/updates-BtBCV2xk.js +0 -1
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * Claude built-in provider — shadow warning and first-run routing notice
4
+ *
5
+ * Shadow warning
6
+ * --------------
7
+ * The claude and anthropic provider names are reserved built-ins (priority 0.5).
8
+ * A user who has a settings profile or account profile named 'claude' or 'anthropic'
9
+ * will silently get the built-in rather than their own profile. This module emits
10
+ * a one-line, TTY-only, once-per-install warning with a rename hint in that case.
11
+ *
12
+ * First-run routing notice
13
+ * ------------------------
14
+ * On the very first launch of `ccs claude` a one-line notice is printed to stderr
15
+ * reminding the user that traffic routes through the local CLIProxy instance and
16
+ * that bare `ccs` still launches native Claude Code.
17
+ *
18
+ * Persistence: marker files inside ~/.ccs/cliproxy/ are used for both notices.
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.maybeShowClaudeRoutingNotice = exports.maybeWarnClaudeShadow = void 0;
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const ui_1 = require("../utils/ui");
48
+ const config_loader_facade_1 = require("../config/config-loader-facade");
49
+ const config_manager_1 = require("../utils/config-manager");
50
+ const profile_registry_1 = require("../auth/profile-registry");
51
+ /** Marker file name inside ~/.ccs/cliproxy/ */
52
+ const SHADOW_WARNED_MARKER = '.claude-shadow-warned';
53
+ /** Names that the claude built-in shadows */
54
+ const SHADOWED_NAMES = new Set(['claude', 'anthropic']);
55
+ /** Get path to the once-per-install dismissal marker. */
56
+ function getShadowWarnedMarkerPath() {
57
+ return path.join((0, config_loader_facade_1.getCcsDir)(), 'cliproxy', SHADOW_WARNED_MARKER);
58
+ }
59
+ /** Return true if this install has already shown the shadow warning. */
60
+ function shadowWarnAlreadyShown() {
61
+ try {
62
+ return fs.existsSync(getShadowWarnedMarkerPath());
63
+ }
64
+ catch {
65
+ return true; // If we can't read, skip warning.
66
+ }
67
+ }
68
+ /** Persist the warning dismissal. */
69
+ function markShadowWarnShown() {
70
+ try {
71
+ const dir = path.join((0, config_loader_facade_1.getCcsDir)(), 'cliproxy');
72
+ fs.mkdirSync(dir, { recursive: true });
73
+ fs.writeFileSync(getShadowWarnedMarkerPath(), new Date().toISOString(), {
74
+ encoding: 'utf8',
75
+ flag: 'w',
76
+ });
77
+ }
78
+ catch {
79
+ // Best-effort — failure to persist is not fatal.
80
+ }
81
+ }
82
+ /**
83
+ * Check if the user has a settings or account profile named 'claude' or 'anthropic'
84
+ * that is being shadowed by the built-in provider.
85
+ */
86
+ function detectShadowedProfile() {
87
+ try {
88
+ if ((0, config_loader_facade_1.isUnifiedMode)()) {
89
+ const unified = (0, config_loader_facade_1.loadOrCreateUnifiedConfig)();
90
+ const profileNames = Object.keys(unified.profiles || {});
91
+ const accountNames = Object.keys(unified.accounts || {});
92
+ const variantNames = Object.keys(unified.cliproxy?.variants || {});
93
+ for (const name of [...profileNames, ...accountNames, ...variantNames]) {
94
+ if (SHADOWED_NAMES.has(name.toLowerCase()))
95
+ return name;
96
+ }
97
+ }
98
+ else {
99
+ const config = (0, config_manager_1.readConfig)();
100
+ const profileNames = Object.keys(config.profiles || {});
101
+ const cliproxyNames = Object.keys(config.cliproxy || {});
102
+ // Also check account-based profiles from profiles.json (mirror unified accounts check).
103
+ const registry = new profile_registry_1.ProfileRegistry();
104
+ const accountProfileNames = registry.listProfiles();
105
+ for (const name of [...profileNames, ...cliproxyNames, ...accountProfileNames]) {
106
+ if (SHADOWED_NAMES.has(name.toLowerCase()))
107
+ return name;
108
+ }
109
+ }
110
+ }
111
+ catch {
112
+ // If config is unreadable, skip the check silently.
113
+ }
114
+ return null;
115
+ }
116
+ /**
117
+ * Emit the shadow warning if conditions are met.
118
+ *
119
+ * Conditions:
120
+ * - Running in a TTY (no warning in pipes/CI)
121
+ * - Warning not already shown for this install
122
+ * - User has a profile named 'claude' or 'anthropic' that the built-in shadows
123
+ *
124
+ * Writes to stderr so it does not pollute stdout piped output.
125
+ */
126
+ function maybeWarnClaudeShadow() {
127
+ // TTY guard — no warning in non-interactive or CI environments
128
+ if (!process.stderr.isTTY)
129
+ return;
130
+ if (shadowWarnAlreadyShown())
131
+ return;
132
+ const shadowedName = detectShadowedProfile();
133
+ if (!shadowedName)
134
+ return;
135
+ markShadowWarnShown();
136
+ process.stderr.write('\n');
137
+ process.stderr.write((0, ui_1.warn)(`Profile '${shadowedName}' is shadowed by the built-in claude provider and cannot be reached via 'ccs ${shadowedName}'.`) + '\n');
138
+ process.stderr.write(` Rename it to continue using it: ccs config (or edit ~/.ccs/config.yaml / config.json)\n`);
139
+ process.stderr.write('\n');
140
+ }
141
+ exports.maybeWarnClaudeShadow = maybeWarnClaudeShadow;
142
+ // ── First-run routing notice ──────────────────────────────────────────────────
143
+ /** Marker file for the once-per-install routing notice. */
144
+ const ROUTING_NOTICE_MARKER = '.claude-routing-noticed';
145
+ function getRoutingNoticeMarkerPath() {
146
+ return path.join((0, config_loader_facade_1.getCcsDir)(), 'cliproxy', ROUTING_NOTICE_MARKER);
147
+ }
148
+ function routingNoticeAlreadyShown() {
149
+ try {
150
+ return fs.existsSync(getRoutingNoticeMarkerPath());
151
+ }
152
+ catch {
153
+ return true;
154
+ }
155
+ }
156
+ function markRoutingNoticeShown() {
157
+ try {
158
+ const dir = path.join((0, config_loader_facade_1.getCcsDir)(), 'cliproxy');
159
+ fs.mkdirSync(dir, { recursive: true });
160
+ fs.writeFileSync(getRoutingNoticeMarkerPath(), new Date().toISOString(), {
161
+ encoding: 'utf8',
162
+ flag: 'w',
163
+ });
164
+ }
165
+ catch {
166
+ // Best-effort.
167
+ }
168
+ }
169
+ /**
170
+ * Print a one-time routing notice when the claude built-in provider first launches.
171
+ *
172
+ * Informs the user that traffic is routed through the local CLIProxy instance
173
+ * (not the Anthropic API directly) and that bare `ccs` still uses native Claude Code.
174
+ *
175
+ * TTY-only; written to stderr.
176
+ */
177
+ function maybeShowClaudeRoutingNotice() {
178
+ if (!process.stderr.isTTY)
179
+ return;
180
+ if (routingNoticeAlreadyShown())
181
+ return;
182
+ markRoutingNoticeShown();
183
+ process.stderr.write((0, ui_1.info)('ccs claude: traffic routes through the local CLIProxy instance.') + '\n');
184
+ process.stderr.write(` Native Claude Code (direct Anthropic API) is still available via bare \`ccs\`.\n`);
185
+ }
186
+ exports.maybeShowClaudeRoutingNotice = maybeShowClaudeRoutingNotice;
187
+ //# sourceMappingURL=claude-shadow-warning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-shadow-warning.js","sourceRoot":"","sources":["../../src/cliproxy/claude-shadow-warning.ts"],"names":[],"mappings":"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"}
@@ -14,10 +14,10 @@ interface BaseSettings {
14
14
  env: {
15
15
  ANTHROPIC_BASE_URL: string;
16
16
  ANTHROPIC_AUTH_TOKEN: string;
17
- ANTHROPIC_MODEL: string;
18
- ANTHROPIC_DEFAULT_OPUS_MODEL: string;
19
- ANTHROPIC_DEFAULT_SONNET_MODEL: string;
20
- ANTHROPIC_DEFAULT_HAIKU_MODEL: string;
17
+ ANTHROPIC_MODEL?: string;
18
+ ANTHROPIC_DEFAULT_OPUS_MODEL?: string;
19
+ ANTHROPIC_DEFAULT_SONNET_MODEL?: string;
20
+ ANTHROPIC_DEFAULT_HAIKU_MODEL?: string;
21
21
  };
22
22
  }
23
23
  /**
@@ -27,7 +27,8 @@ interface BaseSettings {
27
27
  export declare function loadBaseConfig(provider: CLIProxyProvider): BaseSettings;
28
28
  /**
29
29
  * Get model mapping from base config
30
- * Extracts model names from env vars
30
+ * Extracts model names from env vars.
31
+ * Returns undefined model fields for the claude provider (model-neutral passthrough).
31
32
  */
32
33
  export declare function getModelMappingFromConfig(provider: CLIProxyProvider): ProviderModelMapping;
33
34
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"base-config-loader.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/config/base-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;;;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEvE,mCAAmC;AACnC,UAAU,YAAY;IACpB,GAAG,EAAE;QACH,kBAAkB,EAAE,MAAM,CAAC;QAC3B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,EAAE,MAAM,CAAC;QACxB,4BAA4B,EAAE,MAAM,CAAC;QACrC,8BAA8B,EAAE,MAAM,CAAC;QACvC,6BAA6B,EAAE,MAAM,CAAC;KACvC,CAAC;CACH;AAgBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,YAAY,CA6CvE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,oBAAoB,CAU1F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAGlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
1
+ {"version":3,"file":"base-config-loader.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/config/base-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;;;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEvE,mCAAmC;AACnC,UAAU,YAAY;IACpB,GAAG,EAAE;QACH,kBAAkB,EAAE,MAAM,CAAC;QAC3B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,4BAA4B,CAAC,EAAE,MAAM,CAAC;QACtC,8BAA8B,CAAC,EAAE,MAAM,CAAC;QACxC,6BAA6B,CAAC,EAAE,MAAM,CAAC;KACxC,CAAC;CACH;AAgBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,YAAY,CAiDvE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,oBAAoB,CAY1F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAGlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -68,15 +68,19 @@ function loadBaseConfig(provider) {
68
68
  if (!settings.env || typeof settings.env !== 'object') {
69
69
  throw new Error('Missing or invalid "env" object');
70
70
  }
71
- const required = [
72
- 'ANTHROPIC_MODEL',
73
- 'ANTHROPIC_DEFAULT_OPUS_MODEL',
74
- 'ANTHROPIC_DEFAULT_SONNET_MODEL',
75
- 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
76
- ];
77
- for (const field of required) {
78
- if (!settings.env[field]) {
79
- throw new Error(`Missing required field: env.${field}`);
71
+ // claude provider is model-neutral: it does not pin model env vars so that
72
+ // the user's own Claude Code model selection is respected end-to-end.
73
+ if (provider !== 'claude') {
74
+ const required = [
75
+ 'ANTHROPIC_MODEL',
76
+ 'ANTHROPIC_DEFAULT_OPUS_MODEL',
77
+ 'ANTHROPIC_DEFAULT_SONNET_MODEL',
78
+ 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
79
+ ];
80
+ for (const field of required) {
81
+ if (!settings.env[field]) {
82
+ throw new Error(`Missing required field: env.${field}`);
83
+ }
80
84
  }
81
85
  }
82
86
  // Cache and return
@@ -91,13 +95,16 @@ function loadBaseConfig(provider) {
91
95
  exports.loadBaseConfig = loadBaseConfig;
92
96
  /**
93
97
  * Get model mapping from base config
94
- * Extracts model names from env vars
98
+ * Extracts model names from env vars.
99
+ * Returns undefined model fields for the claude provider (model-neutral passthrough).
95
100
  */
96
101
  function getModelMappingFromConfig(provider) {
97
102
  const config = loadBaseConfig(provider);
103
+ // claude is model-neutral: ANTHROPIC_MODEL is absent from its config; callers
104
+ // that need model IDs (e.g. getClaudeEnvVars) guard on provider !== 'claude'.
98
105
  return {
99
- defaultModel: config.env.ANTHROPIC_MODEL,
100
- claudeModel: config.env.ANTHROPIC_MODEL,
106
+ defaultModel: config.env.ANTHROPIC_MODEL ?? '',
107
+ claudeModel: config.env.ANTHROPIC_MODEL ?? '',
101
108
  opusModel: config.env.ANTHROPIC_DEFAULT_OPUS_MODEL,
102
109
  sonnetModel: config.env.ANTHROPIC_DEFAULT_SONNET_MODEL,
103
110
  haikuModel: config.env.ANTHROPIC_DEFAULT_HAIKU_MODEL,
@@ -1 +1 @@
1
- {"version":3,"file":"base-config-loader.js","sourceRoot":"","sources":["../../../src/cliproxy/config/base-config-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-config-loader.js","sourceRoot":"","sources":["../../../src/cliproxy/config/base-config-loader.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,9 @@ export declare function getModelMapping(provider: CLIProxyProvider): ProviderMod
22
22
  * Get environment variables for Claude CLI (bundled defaults)
23
23
  * Uses provider-specific endpoint (e.g., /api/provider/gemini) for explicit routing.
24
24
  * This enables concurrent gemini/codex usage - each session routes to its provider via URL path.
25
+ *
26
+ * For the claude built-in provider the model env vars are intentionally omitted so that
27
+ * the user's own Claude Code /model selection is honored end-to-end (model-neutral passthrough).
25
28
  */
26
29
  export declare function getClaudeEnvVars(provider: CLIProxyProvider, port?: number): NodeJS.ProcessEnv;
27
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"env-builder.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/config/env-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;;;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAMvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAyK7E,mDAAmD;AACnD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,oBAAoB,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,GAAE,MAA8B,GACnC,MAAM,CAAC,UAAU,CAmCnB;AAyBD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CA4B9E;AA2HD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,GAAE,MAA8B,EACpC,kBAAkB,CAAC,EAAE,MAAM,EAC3B,mBAAmB,CAAC,EAAE,wBAAwB,GAC7C,MAAM,CAAC,UAAU,CAsEnB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAsGvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7F,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqFxB;AAED,qEAAqE;AACrE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,EAC7F,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,EACxC,IAAI,GAAE,MAA8B,EACpC,kBAAkB,CAAC,EAAE,MAAM,EAC3B,YAAY,CAAC,EAAE,qBAAqB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiFxB"}
1
+ {"version":3,"file":"env-builder.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/config/env-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;;;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAMvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AA4K7E,mDAAmD;AACnD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,oBAAoB,CAEhF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,GAAE,MAA8B,GACnC,MAAM,CAAC,UAAU,CAsCnB;AAyBD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CA4B9E;AA2HD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,GAAE,MAA8B,EACpC,kBAAkB,CAAC,EAAE,MAAM,EAC3B,mBAAmB,CAAC,EAAE,wBAAwB,GAC7C,MAAM,CAAC,UAAU,CAsEnB;AA8FD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CA4HvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7F,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+GxB;AAED,qEAAqE;AACrE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,EAC7F,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,EACxC,IAAI,GAAE,MAA8B,EACpC,kBAAkB,CAAC,EAAE,MAAM,EAC3B,YAAY,CAAC,EAAE,qBAAqB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiFxB"}
@@ -51,6 +51,8 @@ const REQUIRED_PROVIDER_ENV_KEYS = [
51
51
  'ANTHROPIC_DEFAULT_SONNET_MODEL',
52
52
  'ANTHROPIC_DEFAULT_HAIKU_MODEL',
53
53
  ];
54
+ /** Minimum required env vars for the claude built-in provider (model-neutral). */
55
+ const REQUIRED_CLAUDE_ENV_KEYS = ['ANTHROPIC_BASE_URL', 'ANTHROPIC_AUTH_TOKEN'];
54
56
  const CURSOR_LEGACY_ENV_OVERRIDE_KEYS = new Set([
55
57
  'ANTHROPIC_BASE_URL',
56
58
  'ANTHROPIC_AUTH_TOKEN',
@@ -176,23 +178,29 @@ exports.getModelMapping = getModelMapping;
176
178
  * Get environment variables for Claude CLI (bundled defaults)
177
179
  * Uses provider-specific endpoint (e.g., /api/provider/gemini) for explicit routing.
178
180
  * This enables concurrent gemini/codex usage - each session routes to its provider via URL path.
181
+ *
182
+ * For the claude built-in provider the model env vars are intentionally omitted so that
183
+ * the user's own Claude Code /model selection is honored end-to-end (model-neutral passthrough).
179
184
  */
180
185
  function getClaudeEnvVars(provider, port = port_manager_1.CLIPROXY_DEFAULT_PORT) {
181
- const models = getModelMapping(provider);
182
186
  // Base env vars from config file (includes ANTHROPIC_MAX_TOKENS, etc.)
183
187
  const baseEnvVars = (0, base_config_loader_1.getEnvVarsFromConfig)(provider);
184
- // Core env vars that we always set dynamically
188
+ // Filter out model pins and URL/auth from base config (we set them dynamically)
189
+ const { ANTHROPIC_BASE_URL: _baseUrl, ANTHROPIC_AUTH_TOKEN: _authToken, ANTHROPIC_MODEL: _model, ANTHROPIC_DEFAULT_OPUS_MODEL: _opusModel, ANTHROPIC_DEFAULT_SONNET_MODEL: _sonnetModel, ANTHROPIC_DEFAULT_HAIKU_MODEL: _haikuModel, ...additionalEnvVars } = baseEnvVars;
190
+ // Core transport env vars set dynamically for all providers
185
191
  const coreEnvVars = {
186
- // Provider-specific endpoint - routes to correct provider via URL path
187
192
  ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}/api/provider/${provider}`,
188
193
  ANTHROPIC_AUTH_TOKEN: (0, auth_token_manager_1.getEffectiveApiKey)(),
189
- ANTHROPIC_MODEL: models.claudeModel,
190
- ANTHROPIC_DEFAULT_OPUS_MODEL: models.opusModel || models.claudeModel,
191
- ANTHROPIC_DEFAULT_SONNET_MODEL: models.sonnetModel || models.claudeModel,
192
- ANTHROPIC_DEFAULT_HAIKU_MODEL: models.haikuModel || models.claudeModel,
193
194
  };
194
- // Filter out core env vars from base config to avoid conflicts
195
- const { ANTHROPIC_BASE_URL: _baseUrl, ANTHROPIC_AUTH_TOKEN: _authToken, ANTHROPIC_MODEL: _model, ANTHROPIC_DEFAULT_OPUS_MODEL: _opusModel, ANTHROPIC_DEFAULT_SONNET_MODEL: _sonnetModel, ANTHROPIC_DEFAULT_HAIKU_MODEL: _haikuModel, ...additionalEnvVars } = baseEnvVars;
195
+ // Model pins: omitted for claude provider (model-neutral passthrough).
196
+ // For all other providers, set model vars from the base config model mapping.
197
+ if (provider !== 'claude') {
198
+ const models = getModelMapping(provider);
199
+ coreEnvVars.ANTHROPIC_MODEL = models.claudeModel;
200
+ coreEnvVars.ANTHROPIC_DEFAULT_OPUS_MODEL = models.opusModel || models.claudeModel;
201
+ coreEnvVars.ANTHROPIC_DEFAULT_SONNET_MODEL = models.sonnetModel || models.claudeModel;
202
+ coreEnvVars.ANTHROPIC_DEFAULT_HAIKU_MODEL = models.haikuModel || models.claudeModel;
203
+ }
196
204
  // Merge core env vars with additional env vars from base config
197
205
  const mergedEnv = {
198
206
  ...coreEnvVars,
@@ -421,6 +429,94 @@ function getEffectiveEnvVars(provider, port = port_manager_1.CLIPROXY_DEFAULT_PO
421
429
  return { ...globalEnv, ...getClaudeEnvVars(provider, port) };
422
430
  }
423
431
  exports.getEffectiveEnvVars = getEffectiveEnvVars;
432
+ /**
433
+ * All historically-shipped default model pins that CCS auto-wrote into
434
+ * claude.settings.json before the model-neutral passthrough change.
435
+ * A key is removed only when the stored value exactly matches one of the values
436
+ * in that key's set, so user-customised values are always preserved.
437
+ */
438
+ const CLAUDE_STALE_MODEL_DEFAULTS = {
439
+ ANTHROPIC_MODEL: new Set([
440
+ 'claude-sonnet-4-20250514',
441
+ 'claude-sonnet-4-5-20250929',
442
+ 'claude-sonnet-4-6',
443
+ ]),
444
+ ANTHROPIC_DEFAULT_OPUS_MODEL: new Set([
445
+ 'claude-opus-4-20250514',
446
+ 'claude-opus-4-5-20251101',
447
+ 'claude-opus-4-6',
448
+ 'claude-opus-4-7',
449
+ ]),
450
+ ANTHROPIC_DEFAULT_SONNET_MODEL: new Set([
451
+ 'claude-sonnet-4-20250514',
452
+ 'claude-sonnet-4-5-20250929',
453
+ 'claude-sonnet-4-6',
454
+ ]),
455
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: new Set([
456
+ 'claude-haiku-3-5-20241022',
457
+ 'claude-haiku-4-5-20251001',
458
+ ]),
459
+ };
460
+ /** Marker file that records when the one-time stale-pin migration has run. */
461
+ const CLAUDE_MODEL_MIGRATED_MARKER = '.claude-model-migrated';
462
+ /** Return true if the one-time stale-pin migration has already been applied. */
463
+ function claudeModelMigrationDone() {
464
+ try {
465
+ return fs.existsSync(path.join((0, config_loader_facade_1.getCcsDir)(), 'cliproxy', CLAUDE_MODEL_MIGRATED_MARKER));
466
+ }
467
+ catch {
468
+ return true; // Cannot read — treat as done to avoid repeated rewrites.
469
+ }
470
+ }
471
+ /** Record that the one-time stale-pin migration has been applied. */
472
+ function markClaudeModelMigrationDone() {
473
+ try {
474
+ const dir = path.join((0, config_loader_facade_1.getCcsDir)(), 'cliproxy');
475
+ fs.mkdirSync(dir, { recursive: true });
476
+ fs.writeFileSync(path.join(dir, CLAUDE_MODEL_MIGRATED_MARKER), new Date().toISOString(), {
477
+ encoding: 'utf8',
478
+ flag: 'w',
479
+ });
480
+ }
481
+ catch {
482
+ // Best-effort — failure to persist is not fatal.
483
+ }
484
+ }
485
+ /**
486
+ * Remove stale model pins from an existing claude.settings.json env block.
487
+ * Only removes keys whose values appear in the set of historically-shipped
488
+ * defaults for that key, preserving user-customised values.
489
+ * Returns true when at least one key was removed (signals file needs rewriting).
490
+ */
491
+ function migrateClaudeStaleModelPins(env) {
492
+ let mutated = false;
493
+ for (const [key, staleValues] of Object.entries(CLAUDE_STALE_MODEL_DEFAULTS)) {
494
+ if (staleValues.has(env[key])) {
495
+ delete env[key];
496
+ mutated = true;
497
+ }
498
+ }
499
+ return mutated;
500
+ }
501
+ /**
502
+ * Read-level equivalent of the stale-pin migration for paths that must not
503
+ * mutate the settings file (e.g. the remote env builder). Returns a copy of
504
+ * the env with any value equal to a historical default dropped per-key, while
505
+ * user-custom pins are preserved. Same per-key Sets as the local migration, so
506
+ * local / --config / remote read paths agree on which pins are stale.
507
+ *
508
+ * No marker is consulted or written: this is purely a read-time filter, so it
509
+ * is idempotent across launches without a one-shot guard.
510
+ */
511
+ function filterClaudeStaleModelPins(env) {
512
+ const result = { ...env };
513
+ for (const [key, staleValues] of Object.entries(CLAUDE_STALE_MODEL_DEFAULTS)) {
514
+ if (staleValues.has(result[key])) {
515
+ delete result[key];
516
+ }
517
+ }
518
+ return result;
519
+ }
424
520
  /**
425
521
  * Copy bundled settings template to user directory if not exists
426
522
  * Called during installation/first run
@@ -435,8 +531,13 @@ function ensureProviderSettings(provider) {
435
531
  });
436
532
  };
437
533
  // Create initial file when missing.
534
+ // A freshly created file has no stale pins by construction, so mark migration
535
+ // done immediately to prevent the one-time strip from running unnecessarily.
438
536
  if (!fs.existsSync(settingsPath)) {
439
537
  writeSettings({ env: defaultEnv });
538
+ if (provider === 'claude') {
539
+ markClaudeModelMigrationDone();
540
+ }
440
541
  return;
441
542
  }
442
543
  // Existing file: repair missing/invalid core env keys without dropping user data.
@@ -472,11 +573,25 @@ function ensureProviderSettings(provider) {
472
573
  ? { ...envCandidate }
473
574
  : {};
474
575
  let mutated = !(envCandidate && typeof envCandidate === 'object' && !Array.isArray(envCandidate));
475
- for (const key of REQUIRED_PROVIDER_ENV_KEYS) {
576
+ // One-time migration: strip stale model pins written by older CCS versions into
577
+ // claude.settings.json. Guarded by a marker file so a user-re-pin that happens
578
+ // to equal a stale default value is not silently stripped on every subsequent launch.
579
+ if (provider === 'claude' && !claudeModelMigrationDone()) {
580
+ if (migrateClaudeStaleModelPins(mergedEnv)) {
581
+ mutated = true;
582
+ }
583
+ markClaudeModelMigrationDone();
584
+ }
585
+ // claude is model-neutral: only transport keys (URL + auth) are required; model pins are omitted.
586
+ const requiredKeys = provider === 'claude' ? REQUIRED_CLAUDE_ENV_KEYS : REQUIRED_PROVIDER_ENV_KEYS;
587
+ for (const key of requiredKeys) {
476
588
  const current = mergedEnv[key];
477
589
  if (typeof current !== 'string' || current.trim().length === 0) {
478
- mergedEnv[key] = defaultEnv[key] || '';
479
- mutated = true;
590
+ const fallback = defaultEnv[key];
591
+ if (fallback) {
592
+ mergedEnv[key] = fallback;
593
+ mutated = true;
594
+ }
480
595
  }
481
596
  }
482
597
  // Canonicalize provider-specific model aliases (e.g., AGY Sonnet 4.6 thinking legacy IDs).
@@ -580,6 +695,21 @@ function getRemoteEnvVars(provider, remoteConfig, customSettingsPath) {
580
695
  migrateDeprecatedModelNames(settingsPath, provider, settings);
581
696
  migrateIFlowPlaceholderModel(settingsPath, provider, settings);
582
697
  userEnvVars = settings.env;
698
+ // claude is model-neutral. The local launch path runs the one-time
699
+ // stale-pin migration (ensureProviderSettings), but the remote path
700
+ // never rewrites the file, so a remote-only user whose settings still
701
+ // carry an old auto-written default would stay pinned. Filter stale
702
+ // defaults at read level so values equal to a historical default are
703
+ // dropped while user-custom pins survive. Once the migration marker
704
+ // exists the file has already been cleaned, so any pin present after
705
+ // that is user-intentional (e.g. an explicit `ccs claude --config`
706
+ // pick that happens to equal a historical default) and must NOT be
707
+ // filtered. Priority 1 (explicit custom settings path) is
708
+ // intentionally left untouched: an explicitly passed settings file
709
+ // is the user's deliberate choice.
710
+ if (provider === 'claude' && !claudeModelMigrationDone()) {
711
+ userEnvVars = filterClaudeStaleModelPins(userEnvVars);
712
+ }
583
713
  }
584
714
  }
585
715
  catch {
@@ -589,17 +719,25 @@ function getRemoteEnvVars(provider, remoteConfig, customSettingsPath) {
589
719
  }
590
720
  // Priority 3: Base config defaults
591
721
  if (Object.keys(userEnvVars).length === 0) {
592
- const models = getModelMapping(provider);
593
722
  const baseEnvVars = (0, base_config_loader_1.getEnvVarsFromConfig)(provider);
594
723
  // Filter out URL/auth from base config (we'll set those from remote config)
595
724
  const { ANTHROPIC_BASE_URL: _baseUrl, ANTHROPIC_AUTH_TOKEN: _authToken, ...additionalEnvVars } = baseEnvVars;
596
- userEnvVars = {
597
- ...additionalEnvVars,
598
- ANTHROPIC_MODEL: models.claudeModel,
599
- ANTHROPIC_DEFAULT_OPUS_MODEL: models.opusModel || models.claudeModel,
600
- ANTHROPIC_DEFAULT_SONNET_MODEL: models.sonnetModel || models.claudeModel,
601
- ANTHROPIC_DEFAULT_HAIKU_MODEL: models.haikuModel || models.claudeModel,
602
- };
725
+ // claude is model-neutral: omit model pins so Claude Code's own /model
726
+ // selection is respected on remote launches too.
727
+ if (provider === 'claude') {
728
+ // Filter out undefined values coming from NodeJS.ProcessEnv spread.
729
+ userEnvVars = Object.fromEntries(Object.entries(additionalEnvVars).filter((entry) => typeof entry[1] === 'string'));
730
+ }
731
+ else {
732
+ const models = getModelMapping(provider);
733
+ userEnvVars = {
734
+ ...additionalEnvVars,
735
+ ANTHROPIC_MODEL: models.claudeModel,
736
+ ANTHROPIC_DEFAULT_OPUS_MODEL: models.opusModel || models.claudeModel,
737
+ ANTHROPIC_DEFAULT_SONNET_MODEL: models.sonnetModel || models.claudeModel,
738
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: models.haikuModel || models.claudeModel,
739
+ };
740
+ }
603
741
  }
604
742
  // Build final env: global + user settings + remote URL/auth override
605
743
  const env = {