@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.
- package/README.md +12 -0
- package/config/base-claude.settings.json +1 -5
- package/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
- package/dist/api/services/cliproxy-profile-bridge.js +6 -0
- package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
- package/dist/api/services/profile-writer.d.ts.map +1 -1
- package/dist/api/services/profile-writer.js +18 -8
- package/dist/api/services/profile-writer.js.map +1 -1
- package/dist/auth/commands/create-command.d.ts.map +1 -1
- package/dist/auth/commands/create-command.js +11 -0
- package/dist/auth/commands/create-command.js.map +1 -1
- package/dist/cliproxy/accounts/account-safety-cross-lane.d.ts +41 -0
- package/dist/cliproxy/accounts/account-safety-cross-lane.d.ts.map +1 -0
- package/dist/cliproxy/accounts/account-safety-cross-lane.js +177 -0
- package/dist/cliproxy/accounts/account-safety-cross-lane.js.map +1 -0
- package/dist/cliproxy/accounts/account-safety.d.ts +29 -1
- package/dist/cliproxy/accounts/account-safety.d.ts.map +1 -1
- package/dist/cliproxy/accounts/account-safety.js +41 -7
- package/dist/cliproxy/accounts/account-safety.js.map +1 -1
- package/dist/cliproxy/accounts/drain-order.d.ts +277 -0
- package/dist/cliproxy/accounts/drain-order.d.ts.map +1 -0
- package/dist/cliproxy/accounts/drain-order.js +575 -0
- package/dist/cliproxy/accounts/drain-order.js.map +1 -0
- package/dist/cliproxy/accounts/pool-state.d.ts +132 -0
- package/dist/cliproxy/accounts/pool-state.d.ts.map +1 -0
- package/dist/cliproxy/accounts/pool-state.js +201 -0
- package/dist/cliproxy/accounts/pool-state.js.map +1 -0
- package/dist/cliproxy/accounts/registry.d.ts +17 -1
- package/dist/cliproxy/accounts/registry.d.ts.map +1 -1
- package/dist/cliproxy/accounts/registry.js +47 -1
- package/dist/cliproxy/accounts/registry.js.map +1 -1
- package/dist/cliproxy/accounts/types.d.ts +20 -0
- package/dist/cliproxy/accounts/types.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth/oauth-handler.js +29 -0
- package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
- package/dist/cliproxy/binary/platform-detector.d.ts.map +1 -1
- package/dist/cliproxy/binary/platform-detector.js +34 -1
- package/dist/cliproxy/binary/platform-detector.js.map +1 -1
- package/dist/cliproxy/binary/types.d.ts +3 -0
- package/dist/cliproxy/binary/types.d.ts.map +1 -1
- package/dist/cliproxy/binary/types.js +7 -2
- package/dist/cliproxy/binary/types.js.map +1 -1
- package/dist/cliproxy/binary/version-cache.d.ts.map +1 -1
- package/dist/cliproxy/binary/version-cache.js +4 -0
- package/dist/cliproxy/binary/version-cache.js.map +1 -1
- package/dist/cliproxy/claude-shadow-warning.d.ts +39 -0
- package/dist/cliproxy/claude-shadow-warning.d.ts.map +1 -0
- package/dist/cliproxy/claude-shadow-warning.js +187 -0
- package/dist/cliproxy/claude-shadow-warning.js.map +1 -0
- package/dist/cliproxy/config/base-config-loader.d.ts +6 -5
- package/dist/cliproxy/config/base-config-loader.d.ts.map +1 -1
- package/dist/cliproxy/config/base-config-loader.js +19 -12
- package/dist/cliproxy/config/base-config-loader.js.map +1 -1
- package/dist/cliproxy/config/env-builder.d.ts +3 -0
- package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
- package/dist/cliproxy/config/env-builder.js +158 -20
- package/dist/cliproxy/config/env-builder.js.map +1 -1
- package/dist/cliproxy/config/generator.d.ts +2 -1
- package/dist/cliproxy/config/generator.d.ts.map +1 -1
- package/dist/cliproxy/config/generator.js +66 -9
- package/dist/cliproxy/config/generator.js.map +1 -1
- package/dist/cliproxy/config/thinking-config.d.ts.map +1 -1
- package/dist/cliproxy/config/thinking-config.js +2 -0
- package/dist/cliproxy/config/thinking-config.js.map +1 -1
- package/dist/cliproxy/executor/account-resolution.d.ts.map +1 -1
- package/dist/cliproxy/executor/account-resolution.js +5 -0
- package/dist/cliproxy/executor/account-resolution.js.map +1 -1
- package/dist/cliproxy/executor/auth-coordinator.d.ts +4 -0
- package/dist/cliproxy/executor/auth-coordinator.d.ts.map +1 -1
- package/dist/cliproxy/executor/auth-coordinator.js +5 -1
- package/dist/cliproxy/executor/auth-coordinator.js.map +1 -1
- package/dist/cliproxy/executor/index.d.ts.map +1 -1
- package/dist/cliproxy/executor/index.js +20 -0
- package/dist/cliproxy/executor/index.js.map +1 -1
- package/dist/cliproxy/model-catalog.d.ts.map +1 -1
- package/dist/cliproxy/model-catalog.js +15 -0
- package/dist/cliproxy/model-catalog.js.map +1 -1
- package/dist/cliproxy/proxy/upstream-response-timeout.d.ts.map +1 -1
- package/dist/cliproxy/proxy/upstream-response-timeout.js +8 -1
- package/dist/cliproxy/proxy/upstream-response-timeout.js.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher-claude.d.ts +9 -0
- package/dist/cliproxy/quota/quota-fetcher-claude.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher-claude.js +53 -16
- package/dist/cliproxy/quota/quota-fetcher-claude.js.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-fetcher.js +4 -0
- package/dist/cliproxy/quota/quota-fetcher.js.map +1 -1
- package/dist/cliproxy/quota/quota-manager.d.ts +7 -0
- package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-manager.js +51 -2
- package/dist/cliproxy/quota/quota-manager.js.map +1 -1
- package/dist/cliproxy/routing/pool-onboarding-hint.d.ts +95 -0
- package/dist/cliproxy/routing/pool-onboarding-hint.d.ts.map +1 -0
- package/dist/cliproxy/routing/pool-onboarding-hint.js +172 -0
- package/dist/cliproxy/routing/pool-onboarding-hint.js.map +1 -0
- package/dist/cliproxy/routing/pool-opt-in-prompt.d.ts +50 -0
- package/dist/cliproxy/routing/pool-opt-in-prompt.d.ts.map +1 -0
- package/dist/cliproxy/routing/pool-opt-in-prompt.js +232 -0
- package/dist/cliproxy/routing/pool-opt-in-prompt.js.map +1 -0
- package/dist/cliproxy/routing/routing-strategy.d.ts +132 -0
- package/dist/cliproxy/routing/routing-strategy.d.ts.map +1 -1
- package/dist/cliproxy/routing/routing-strategy.js +342 -5
- package/dist/cliproxy/routing/routing-strategy.js.map +1 -1
- package/dist/cliproxy/services/stats-fetcher.d.ts +13 -0
- package/dist/cliproxy/services/stats-fetcher.d.ts.map +1 -1
- package/dist/cliproxy/services/stats-fetcher.js +25 -1
- package/dist/cliproxy/services/stats-fetcher.js.map +1 -1
- package/dist/commands/bar/help-subcommand.d.ts +2 -0
- package/dist/commands/bar/help-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/help-subcommand.js +63 -0
- package/dist/commands/bar/help-subcommand.js.map +1 -0
- package/dist/commands/bar/index.d.ts +8 -0
- package/dist/commands/bar/index.d.ts.map +1 -0
- package/dist/commands/bar/index.js +78 -0
- package/dist/commands/bar/index.js.map +1 -0
- package/dist/commands/bar/install-subcommand.d.ts +92 -0
- package/dist/commands/bar/install-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/install-subcommand.js +605 -0
- package/dist/commands/bar/install-subcommand.js.map +1 -0
- package/dist/commands/bar/launch-subcommand.d.ts +64 -0
- package/dist/commands/bar/launch-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/launch-subcommand.js +236 -0
- package/dist/commands/bar/launch-subcommand.js.map +1 -0
- package/dist/commands/bar/uninstall-subcommand.d.ts +13 -0
- package/dist/commands/bar/uninstall-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/uninstall-subcommand.js +78 -0
- package/dist/commands/bar/uninstall-subcommand.js.map +1 -0
- package/dist/commands/bar/version-subcommand.d.ts +8 -0
- package/dist/commands/bar/version-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/version-subcommand.js +62 -0
- package/dist/commands/bar/version-subcommand.js.map +1 -0
- package/dist/commands/cliproxy/help-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/help-subcommand.js +20 -1
- package/dist/commands/cliproxy/help-subcommand.js.map +1 -1
- package/dist/commands/cliproxy/index.d.ts.map +1 -1
- package/dist/commands/cliproxy/index.js +20 -0
- package/dist/commands/cliproxy/index.js.map +1 -1
- package/dist/commands/cliproxy/order-subcommand.d.ts +16 -0
- package/dist/commands/cliproxy/order-subcommand.d.ts.map +1 -0
- package/dist/commands/cliproxy/order-subcommand.js +520 -0
- package/dist/commands/cliproxy/order-subcommand.js.map +1 -0
- package/dist/commands/cliproxy/pool-state-renderer.d.ts +40 -0
- package/dist/commands/cliproxy/pool-state-renderer.d.ts.map +1 -0
- package/dist/commands/cliproxy/pool-state-renderer.js +220 -0
- package/dist/commands/cliproxy/pool-state-renderer.js.map +1 -0
- package/dist/commands/cliproxy/pool-subcommand.d.ts +10 -0
- package/dist/commands/cliproxy/pool-subcommand.d.ts.map +1 -0
- package/dist/commands/cliproxy/pool-subcommand.js +112 -0
- package/dist/commands/cliproxy/pool-subcommand.js.map +1 -0
- package/dist/commands/cliproxy/quota-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/quota-subcommand.js +7 -0
- package/dist/commands/cliproxy/quota-subcommand.js.map +1 -1
- package/dist/commands/cliproxy/routing-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/routing-subcommand.js +19 -0
- package/dist/commands/cliproxy/routing-subcommand.js.map +1 -1
- package/dist/commands/command-catalog.d.ts.map +1 -1
- package/dist/commands/command-catalog.js +7 -0
- package/dist/commands/command-catalog.js.map +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +6 -1
- package/dist/commands/help-command.js.map +1 -1
- package/dist/commands/root-command-router.d.ts.map +1 -1
- package/dist/commands/root-command-router.js +7 -0
- package/dist/commands/root-command-router.js.map +1 -1
- package/dist/config/loader/yaml-serializer.d.ts.map +1 -1
- package/dist/config/loader/yaml-serializer.js +13 -0
- package/dist/config/loader/yaml-serializer.js.map +1 -1
- package/dist/config/schemas/cliproxy.d.ts +37 -0
- package/dist/config/schemas/cliproxy.d.ts.map +1 -1
- package/dist/config/schemas/quota.d.ts +26 -2
- package/dist/config/schemas/quota.d.ts.map +1 -1
- package/dist/config/schemas/quota.js +20 -1
- package/dist/config/schemas/quota.js.map +1 -1
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +3 -0
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/dispatcher/flows/account-flow.d.ts.map +1 -1
- package/dist/dispatcher/flows/account-flow.js +9 -0
- package/dist/dispatcher/flows/account-flow.js.map +1 -1
- package/dist/glmt/delta-accumulator.d.ts.map +1 -1
- package/dist/glmt/delta-accumulator.js +1 -0
- package/dist/glmt/delta-accumulator.js.map +1 -1
- package/dist/management/doctor.d.ts.map +1 -1
- package/dist/management/doctor.js +10 -0
- package/dist/management/doctor.js.map +1 -1
- package/dist/proxy/profile-router.d.ts +14 -0
- package/dist/proxy/profile-router.d.ts.map +1 -1
- package/dist/proxy/profile-router.js +1 -0
- package/dist/proxy/profile-router.js.map +1 -1
- package/dist/proxy/server/http-helpers.d.ts +5 -0
- package/dist/proxy/server/http-helpers.d.ts.map +1 -1
- package/dist/proxy/server/http-helpers.js +40 -1
- package/dist/proxy/server/http-helpers.js.map +1 -1
- package/dist/proxy/server/messages-route.d.ts.map +1 -1
- package/dist/proxy/server/messages-route.js +173 -10
- package/dist/proxy/server/messages-route.js.map +1 -1
- package/dist/proxy/upstream-url.d.ts +42 -2
- package/dist/proxy/upstream-url.d.ts.map +1 -1
- package/dist/proxy/upstream-url.js +83 -4
- package/dist/proxy/upstream-url.js.map +1 -1
- package/dist/ui/assets/{Trans-DsGR5Bhb.js → Trans-RG_sMDEu.js} +1 -1
- package/dist/ui/assets/accounts-yTXURc-q.js +1 -0
- package/dist/ui/assets/{alert-dialog-Do0XfN46.js → alert-dialog-DjvPgzFs.js} +1 -1
- package/dist/ui/assets/{api-B7OYas_V.js → api-Ck1dtNEM.js} +3 -3
- package/dist/ui/assets/{auth-section-BmTeNetL.js → auth-section-DBnY_LPz.js} +1 -1
- package/dist/ui/assets/{backups-section-COawLfTr.js → backups-section-Ci-uL4Of.js} +1 -1
- package/dist/ui/assets/{channels-C9LVYmNJ.js → channels-BeS9O5q0.js} +1 -1
- package/dist/ui/assets/{checkbox-BkFzg8C-.js → checkbox-DFeFDZBp.js} +1 -1
- package/dist/ui/assets/{claude-extension-Ch7L4lTF.js → claude-extension-DS5qN19Z.js} +1 -1
- package/dist/ui/assets/{cliproxy-B3uWt6gn.js → cliproxy-D7HJH4mZ.js} +1 -1
- package/dist/ui/assets/{cliproxy-ai-providers-Bn1_AdKD.js → cliproxy-ai-providers-oJQZXrtc.js} +1 -1
- package/dist/ui/assets/{cliproxy-control-panel-DC4pOOfY.js → cliproxy-control-panel-2mRPEcRj.js} +1 -1
- package/dist/ui/assets/codex-D0AUQ6jA.js +30 -0
- package/dist/ui/assets/{confirm-dialog-4rb-E8-R.js → confirm-dialog-B37-CVuq.js} +1 -1
- package/dist/ui/assets/{copilot-zgPXNkMw.js → copilot-KaaW-mko.js} +2 -2
- package/dist/ui/assets/{cursor-lRPpppk-.js → cursor-BKiTgYi5.js} +1 -1
- package/dist/ui/assets/{droid-koOj34SB.js → droid-DHdqGnFw.js} +2 -2
- package/dist/ui/assets/{globalenv-section-jOkPVwvN.js → globalenv-section-SfZO97nU.js} +1 -1
- package/dist/ui/assets/health-CSRS9O0D.js +1 -0
- package/dist/ui/assets/icons-DSLG1YsC.js +1 -0
- package/dist/ui/assets/{index-D7crOfea.js → index-CGgavq2X.js} +37 -37
- package/dist/ui/assets/{index-BLC5PyZn.js → index-ChTYEBCZ.js} +1 -1
- package/dist/ui/assets/index-Cu_F55_O.js +1 -0
- package/dist/ui/assets/{index-CRhKyfnS.js → index-DJ66NrBH.js} +1 -1
- package/dist/ui/assets/index-DWUuSBUe.js +1 -0
- package/dist/ui/assets/{index-BK-PSsqi.js → index-DycwEe96.js} +1 -1
- package/dist/ui/assets/index-DzFlVVV3.css +1 -0
- package/dist/ui/assets/{index-De3yNJ94.js → index-iQuEEGbH.js} +1 -1
- package/dist/ui/assets/{logs-BplpQHRb.js → logs-tiZ_51mo.js} +1 -1
- package/dist/ui/assets/{masked-input-DuLL3EwS.js → masked-input-D9FVoeMA.js} +1 -1
- package/dist/ui/assets/proxy-status-widget-2k26d8pS.js +1 -0
- package/dist/ui/assets/{raw-json-settings-editor-panel-ClPqZ6iZ.js → raw-json-settings-editor-panel-CguBh93H.js} +1 -1
- package/dist/ui/assets/{searchable-select-BH1b065u.js → searchable-select-C4wShshD.js} +1 -1
- package/dist/ui/assets/{separator-BOiJ0l4s.js → separator-mvGlDdEW.js} +1 -1
- package/dist/ui/assets/{shared-CunXigZu.js → shared-Ck0yAwbs.js} +1 -1
- package/dist/ui/assets/{table-C7ysR1Xz.js → table-DrUJOxKL.js} +1 -1
- package/dist/ui/assets/updates-BVHBFcq8.js +1 -0
- package/dist/ui/assets/{use-accounts-CwRU3ln9.js → use-accounts-DLtuaniS.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/utils/browser/mcp-installer.d.ts.map +1 -1
- package/dist/utils/browser/mcp-installer.js +5 -34
- package/dist/utils/browser/mcp-installer.js.map +1 -1
- package/dist/utils/claude-user-config-lock.d.ts +9 -0
- package/dist/utils/claude-user-config-lock.d.ts.map +1 -0
- package/dist/utils/claude-user-config-lock.js +96 -0
- package/dist/utils/claude-user-config-lock.js.map +1 -0
- package/dist/utils/image-analysis/mcp-installer.d.ts.map +1 -1
- package/dist/utils/image-analysis/mcp-installer.js +5 -34
- package/dist/utils/image-analysis/mcp-installer.js.map +1 -1
- package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
- package/dist/utils/websearch/mcp-installer.js +112 -78
- package/dist/utils/websearch/mcp-installer.js.map +1 -1
- package/dist/web-server/model-pricing.d.ts.map +1 -1
- package/dist/web-server/model-pricing.js +7 -0
- package/dist/web-server/model-pricing.js.map +1 -1
- package/dist/web-server/routes/account-routes.d.ts.map +1 -1
- package/dist/web-server/routes/account-routes.js +116 -0
- package/dist/web-server/routes/account-routes.js.map +1 -1
- package/dist/web-server/routes/bar-routes.d.ts +149 -0
- package/dist/web-server/routes/bar-routes.d.ts.map +1 -0
- package/dist/web-server/routes/bar-routes.js +415 -0
- package/dist/web-server/routes/bar-routes.js.map +1 -0
- package/dist/web-server/routes/index.d.ts.map +1 -1
- package/dist/web-server/routes/index.js +18 -0
- package/dist/web-server/routes/index.js.map +1 -1
- package/dist/web-server/usage/bar-analytics.d.ts +101 -0
- package/dist/web-server/usage/bar-analytics.d.ts.map +1 -0
- package/dist/web-server/usage/bar-analytics.js +315 -0
- package/dist/web-server/usage/bar-analytics.js.map +1 -0
- package/dist/web-server/usage/claude-native-credentials.d.ts +56 -0
- package/dist/web-server/usage/claude-native-credentials.d.ts.map +1 -0
- package/dist/web-server/usage/claude-native-credentials.js +140 -0
- package/dist/web-server/usage/claude-native-credentials.js.map +1 -0
- package/dist/web-server/usage/cliproxy-snapshot-reader.d.ts +24 -0
- package/dist/web-server/usage/cliproxy-snapshot-reader.d.ts.map +1 -0
- package/dist/web-server/usage/cliproxy-snapshot-reader.js +82 -0
- package/dist/web-server/usage/cliproxy-snapshot-reader.js.map +1 -0
- package/dist/web-server/usage/cliproxy-usage-syncer.d.ts +3 -2
- package/dist/web-server/usage/cliproxy-usage-syncer.d.ts.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-syncer.js +14 -2
- package/dist/web-server/usage/cliproxy-usage-syncer.js.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-transformer.d.ts +8 -1
- package/dist/web-server/usage/cliproxy-usage-transformer.d.ts.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-transformer.js +31 -4
- package/dist/web-server/usage/cliproxy-usage-transformer.js.map +1 -1
- package/dist/web-server/usage/codex-local-quota-collector.d.ts +74 -0
- package/dist/web-server/usage/codex-local-quota-collector.d.ts.map +1 -0
- package/dist/web-server/usage/codex-local-quota-collector.js +250 -0
- package/dist/web-server/usage/codex-local-quota-collector.js.map +1 -0
- package/dist/web-server/usage/data-aggregator.d.ts +11 -0
- package/dist/web-server/usage/data-aggregator.d.ts.map +1 -1
- package/dist/web-server/usage/data-aggregator.js +29 -1
- package/dist/web-server/usage/data-aggregator.js.map +1 -1
- package/dist/web-server/usage/native-quota-collector.d.ts +44 -0
- package/dist/web-server/usage/native-quota-collector.d.ts.map +1 -0
- package/dist/web-server/usage/native-quota-collector.js +378 -0
- package/dist/web-server/usage/native-quota-collector.js.map +1 -0
- package/dist/web-server/usage/types.d.ts +2 -0
- package/dist/web-server/usage/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/run-test-bucket.js +183 -17
- package/dist/ui/assets/accounts-DHBmHeH-.js +0 -1
- package/dist/ui/assets/codex-CcODhykP.js +0 -30
- package/dist/ui/assets/health-CxHauE3Y.js +0 -1
- package/dist/ui/assets/icons-DzKUh8vG.js +0 -1
- package/dist/ui/assets/index-DOfPoKe_.css +0 -1
- package/dist/ui/assets/index-DUGnoURR.js +0 -1
- package/dist/ui/assets/index-I_ek1xyD.js +0 -1
- package/dist/ui/assets/proxy-status-widget-BruRPTSl.js +0 -1
- 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":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,oCAAyC;AACzC,yEAIwC;AACxC,4DAAqD;AACrD,+DAA2D;AAE3D,+CAA+C;AAC/C,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAErD,6CAA6C;AAC7C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAExD,yDAAyD;AACzD,SAAS,yBAAyB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAA,gCAAS,GAAE,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;AAClE,CAAC;AAED,wEAAwE;AACxE,SAAS,sBAAsB;IAC7B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,UAAU,CAAC,yBAAyB,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,kCAAkC;IACjD,CAAC;AACH,CAAC;AAED,qCAAqC;AACrC,SAAS,mBAAmB;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,gCAAS,GAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,yBAAyB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;YACtE,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB;IAC5B,IAAI,CAAC;QACH,IAAI,IAAA,oCAAa,GAAE,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAA,gDAAyB,GAAE,CAAC;YAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YACnE,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;gBACvE,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBAAE,OAAO,IAAI,CAAC;YAC1D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAA,2BAAU,GAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACzD,wFAAwF;YACxF,MAAM,QAAQ,GAAG,IAAI,kCAAe,EAAE,CAAC;YACvC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YACpD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,YAAY,EAAE,GAAG,aAAa,EAAE,GAAG,mBAAmB,CAAC,EAAE,CAAC;gBAC/E,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBAAE,OAAO,IAAI,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,qBAAqB;IACnC,+DAA+D;IAC/D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO;IAElC,IAAI,sBAAsB,EAAE;QAAE,OAAO;IAErC,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;IAC7C,IAAI,CAAC,YAAY;QAAE,OAAO;IAE1B,mBAAmB,EAAE,CAAC;IAEtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAA,SAAI,EACF,YAAY,YAAY,gFAAgF,YAAY,IAAI,CACzH,GAAG,IAAI,CACT,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8FAA8F,CAC/F,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AArBD,sDAqBC;AAED,iFAAiF;AAEjF,2DAA2D;AAC3D,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AAExD,SAAS,0BAA0B;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAA,gCAAS,GAAE,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,yBAAyB;IAChC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,gCAAS,GAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,0BAA0B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;YACvE,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,4BAA4B;IAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO;IAClC,IAAI,yBAAyB,EAAE;QAAE,OAAO;IAExC,sBAAsB,EAAE,CAAC;IAEzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAA,SAAI,EAAC,iEAAiE,CAAC,GAAG,IAAI,CAC/E,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sFAAsF,CACvF,CAAC;AACJ,CAAC;AAZD,oEAYC"}
|
|
@@ -14,10 +14,10 @@ interface BaseSettings {
|
|
|
14
14
|
env: {
|
|
15
15
|
ANTHROPIC_BASE_URL: string;
|
|
16
16
|
ANTHROPIC_AUTH_TOKEN: string;
|
|
17
|
-
ANTHROPIC_MODEL
|
|
18
|
-
ANTHROPIC_DEFAULT_OPUS_MODEL
|
|
19
|
-
ANTHROPIC_DEFAULT_SONNET_MODEL
|
|
20
|
-
ANTHROPIC_DEFAULT_HAIKU_MODEL
|
|
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;
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAe7B,kDAAkD;AAClD,MAAM,WAAW,GAAwC,IAAI,GAAG,EAAE,CAAC;AAEnE;;;GAGG;AACH,SAAS,iBAAiB,CAAC,QAA0B;IACnD,+CAA+C;IAC/C,+CAA+C;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,QAAQ,gBAAgB,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,QAA0B;IACvD,oBAAoB;IACpB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,MAAM,UAAU,IAAI;YACjE,8BAA8B,QAAQ,gBAAgB,CACzD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnD,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,QAAQ,GAAG;
|
|
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;
|
|
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
|
-
//
|
|
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
|
-
//
|
|
195
|
-
|
|
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
|
-
|
|
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
|
-
|
|
479
|
-
|
|
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
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
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 = {
|