@kaitranntt/ccs 7.76.0-dev.2 → 7.76.0-dev.3
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/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
- package/dist/api/services/cliproxy-profile-bridge.js +5 -6
- package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
- package/dist/api/services/openrouter-catalog.js +2 -2
- package/dist/api/services/openrouter-catalog.js.map +1 -1
- package/dist/api/services/profile-lifecycle-service.d.ts.map +1 -1
- package/dist/api/services/profile-lifecycle-service.js +6 -6
- package/dist/api/services/profile-lifecycle-service.js.map +1 -1
- package/dist/api/services/profile-reader.d.ts.map +1 -1
- package/dist/api/services/profile-reader.js +14 -15
- package/dist/api/services/profile-reader.js.map +1 -1
- package/dist/api/services/profile-writer.d.ts.map +1 -1
- package/dist/api/services/profile-writer.js +13 -13
- 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 +2 -2
- package/dist/auth/commands/create-command.js.map +1 -1
- package/dist/auth/commands/default-command.d.ts.map +1 -1
- package/dist/auth/commands/default-command.js +3 -3
- package/dist/auth/commands/default-command.js.map +1 -1
- package/dist/auth/commands/remove-command.d.ts.map +1 -1
- package/dist/auth/commands/remove-command.js +2 -2
- package/dist/auth/commands/remove-command.js.map +1 -1
- package/dist/auth/profile-continuity-inheritance.d.ts.map +1 -1
- package/dist/auth/profile-continuity-inheritance.js +4 -4
- package/dist/auth/profile-continuity-inheritance.js.map +1 -1
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +5 -6
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/auth/profile-registry.d.ts.map +1 -1
- package/dist/auth/profile-registry.js +14 -15
- package/dist/auth/profile-registry.js.map +1 -1
- package/dist/auth/resume-lane-diagnostics.d.ts.map +1 -1
- package/dist/auth/resume-lane-diagnostics.js +2 -2
- package/dist/auth/resume-lane-diagnostics.js.map +1 -1
- package/dist/ccs.js +30 -1257
- package/dist/ccs.js.map +1 -1
- package/dist/channels/official-channels-ids.d.ts +21 -0
- package/dist/channels/official-channels-ids.d.ts.map +1 -0
- package/dist/channels/official-channels-ids.js +46 -0
- package/dist/channels/official-channels-ids.js.map +1 -0
- package/dist/channels/official-channels-runtime.d.ts +2 -5
- package/dist/channels/official-channels-runtime.d.ts.map +1 -1
- package/dist/channels/official-channels-runtime.js +14 -29
- package/dist/channels/official-channels-runtime.js.map +1 -1
- package/dist/channels/official-channels-store.d.ts.map +1 -1
- package/dist/channels/official-channels-store.js +2 -2
- package/dist/channels/official-channels-store.js.map +1 -1
- package/dist/cliproxy/accounts/account-safety.js +4 -4
- package/dist/cliproxy/accounts/account-safety.js.map +1 -1
- package/dist/cliproxy/auth/antigravity-responsibility.js +2 -2
- package/dist/cliproxy/auth/antigravity-responsibility.js.map +1 -1
- package/dist/cliproxy/auth/auth-token-manager.d.ts.map +1 -1
- package/dist/cliproxy/auth/auth-token-manager.js +8 -8
- package/dist/cliproxy/auth/auth-token-manager.js.map +1 -1
- package/dist/cliproxy/auth/token-refresh-config.d.ts.map +1 -1
- package/dist/cliproxy/auth/token-refresh-config.js +2 -2
- package/dist/cliproxy/auth/token-refresh-config.js.map +1 -1
- package/dist/cliproxy/binary-manager.d.ts.map +1 -1
- package/dist/cliproxy/binary-manager.js +2 -2
- package/dist/cliproxy/binary-manager.js.map +1 -1
- package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
- package/dist/cliproxy/config/env-builder.js +2 -2
- package/dist/cliproxy/config/env-builder.js.map +1 -1
- package/dist/cliproxy/config/generator.d.ts.map +1 -1
- package/dist/cliproxy/config/generator.js +5 -5
- package/dist/cliproxy/config/generator.js.map +1 -1
- package/dist/cliproxy/config/model-config.d.ts.map +1 -1
- package/dist/cliproxy/config/model-config.js +2 -2
- package/dist/cliproxy/config/model-config.js.map +1 -1
- package/dist/cliproxy/config/path-resolver.d.ts.map +1 -1
- package/dist/cliproxy/config/path-resolver.js +4 -4
- package/dist/cliproxy/config/path-resolver.js.map +1 -1
- package/dist/cliproxy/config/thinking-config.d.ts.map +1 -1
- package/dist/cliproxy/config/thinking-config.js +2 -2
- package/dist/cliproxy/config/thinking-config.js.map +1 -1
- package/dist/cliproxy/executor/account-resolution.d.ts +52 -0
- package/dist/cliproxy/executor/account-resolution.d.ts.map +1 -0
- package/dist/cliproxy/executor/account-resolution.js +154 -0
- package/dist/cliproxy/executor/account-resolution.js.map +1 -0
- package/dist/cliproxy/executor/arg-parser.d.ts +96 -0
- package/dist/cliproxy/executor/arg-parser.d.ts.map +1 -0
- package/dist/cliproxy/executor/arg-parser.js +529 -0
- package/dist/cliproxy/executor/arg-parser.js.map +1 -0
- package/dist/cliproxy/executor/auth-coordinator.d.ts +96 -0
- package/dist/cliproxy/executor/auth-coordinator.d.ts.map +1 -0
- package/dist/cliproxy/executor/auth-coordinator.js +342 -0
- package/dist/cliproxy/executor/auth-coordinator.js.map +1 -0
- package/dist/cliproxy/executor/browser-launch-setup.d.ts +36 -0
- package/dist/cliproxy/executor/browser-launch-setup.d.ts.map +1 -0
- package/dist/cliproxy/executor/browser-launch-setup.js +80 -0
- package/dist/cliproxy/executor/browser-launch-setup.js.map +1 -0
- package/dist/cliproxy/executor/claude-launcher.d.ts +55 -0
- package/dist/cliproxy/executor/claude-launcher.d.ts.map +1 -0
- package/dist/cliproxy/executor/claude-launcher.js +112 -0
- package/dist/cliproxy/executor/claude-launcher.js.map +1 -0
- package/dist/cliproxy/executor/index.d.ts +4 -9
- package/dist/cliproxy/executor/index.d.ts.map +1 -1
- package/dist/cliproxy/executor/index.js +110 -866
- package/dist/cliproxy/executor/index.js.map +1 -1
- package/dist/cliproxy/executor/model-warnings.d.ts +22 -0
- package/dist/cliproxy/executor/model-warnings.d.ts.map +1 -0
- package/dist/cliproxy/executor/model-warnings.js +67 -0
- package/dist/cliproxy/executor/model-warnings.js.map +1 -0
- package/dist/cliproxy/executor/proxy-chain-builder.d.ts +71 -0
- package/dist/cliproxy/executor/proxy-chain-builder.d.ts.map +1 -0
- package/dist/cliproxy/executor/proxy-chain-builder.js +143 -0
- package/dist/cliproxy/executor/proxy-chain-builder.js.map +1 -0
- package/dist/cliproxy/executor/proxy-resolver.d.ts +44 -0
- package/dist/cliproxy/executor/proxy-resolver.d.ts.map +1 -0
- package/dist/cliproxy/executor/proxy-resolver.js +173 -0
- package/dist/cliproxy/executor/proxy-resolver.js.map +1 -0
- package/dist/cliproxy/proxy/proxy-target-resolver.js +2 -2
- package/dist/cliproxy/proxy/proxy-target-resolver.js.map +1 -1
- package/dist/cliproxy/proxy/tool-sanitization-proxy.d.ts.map +1 -1
- package/dist/cliproxy/proxy/tool-sanitization-proxy.js +2 -2
- package/dist/cliproxy/proxy/tool-sanitization-proxy.js.map +1 -1
- package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-manager.js +4 -4
- package/dist/cliproxy/quota/quota-manager.js.map +1 -1
- package/dist/cliproxy/routing/routing-strategy.d.ts.map +1 -1
- package/dist/cliproxy/routing/routing-strategy.js +5 -5
- package/dist/cliproxy/routing/routing-strategy.js.map +1 -1
- package/dist/cliproxy/services/binary-service.js +8 -8
- package/dist/cliproxy/services/binary-service.js.map +1 -1
- package/dist/cliproxy/services/catalog-cache.d.ts.map +1 -1
- package/dist/cliproxy/services/catalog-cache.js +2 -2
- package/dist/cliproxy/services/catalog-cache.js.map +1 -1
- package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-config-adapter.js +10 -10
- package/dist/cliproxy/services/variant-config-adapter.js.map +1 -1
- package/dist/cliproxy/services/variant-service.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-service.js +7 -8
- package/dist/cliproxy/services/variant-service.js.map +1 -1
- package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-settings.js +5 -5
- package/dist/cliproxy/services/variant-settings.js.map +1 -1
- package/dist/cliproxy/sync/auto-sync-watcher.js +3 -4
- package/dist/cliproxy/sync/auto-sync-watcher.js.map +1 -1
- package/dist/cliproxy/sync/profile-mapper.d.ts.map +1 -1
- package/dist/cliproxy/sync/profile-mapper.js +2 -2
- package/dist/cliproxy/sync/profile-mapper.js.map +1 -1
- package/dist/commands/browser-command.d.ts.map +1 -1
- package/dist/commands/browser-command.js +7 -7
- package/dist/commands/browser-command.js.map +1 -1
- package/dist/commands/cliproxy/resolve-lifecycle-port.d.ts.map +1 -1
- package/dist/commands/cliproxy/resolve-lifecycle-port.js +2 -2
- package/dist/commands/cliproxy/resolve-lifecycle-port.js.map +1 -1
- package/dist/commands/cliproxy/variant-subcommand.d.ts.map +1 -1
- package/dist/commands/cliproxy/variant-subcommand.js +4 -4
- package/dist/commands/cliproxy/variant-subcommand.js.map +1 -1
- package/dist/commands/config-auth/disable-command.d.ts.map +1 -1
- package/dist/commands/config-auth/disable-command.js +3 -3
- package/dist/commands/config-auth/disable-command.js.map +1 -1
- package/dist/commands/config-auth/setup-command.d.ts.map +1 -1
- package/dist/commands/config-auth/setup-command.js +2 -2
- package/dist/commands/config-auth/setup-command.js.map +1 -1
- package/dist/commands/config-auth/show-command.js +2 -2
- package/dist/commands/config-auth/show-command.js.map +1 -1
- package/dist/commands/config-channels-command.d.ts.map +1 -1
- package/dist/commands/config-channels-command.js +4 -4
- package/dist/commands/config-channels-command.js.map +1 -1
- package/dist/commands/config-command.d.ts +1 -1
- package/dist/commands/config-command.d.ts.map +1 -1
- package/dist/commands/config-command.js +2 -2
- package/dist/commands/config-command.js.map +1 -1
- package/dist/commands/config-image-analysis-command.d.ts.map +1 -1
- package/dist/commands/config-image-analysis-command.js +4 -4
- package/dist/commands/config-image-analysis-command.js.map +1 -1
- package/dist/commands/config-thinking-command.d.ts.map +1 -1
- package/dist/commands/config-thinking-command.js +4 -4
- package/dist/commands/config-thinking-command.js.map +1 -1
- package/dist/commands/copilot-command.d.ts.map +1 -1
- package/dist/commands/copilot-command.js +4 -4
- package/dist/commands/copilot-command.js.map +1 -1
- package/dist/commands/cursor-command.d.ts.map +1 -1
- package/dist/commands/cursor-command.js +7 -7
- package/dist/commands/cursor-command.js.map +1 -1
- package/dist/commands/env-command.d.ts.map +1 -1
- package/dist/commands/env-command.js +2 -2
- package/dist/commands/env-command.js.map +1 -1
- package/dist/commands/migrate-command.d.ts.map +1 -1
- package/dist/commands/migrate-command.js +2 -2
- package/dist/commands/migrate-command.js.map +1 -1
- package/dist/commands/proxy-command.d.ts.map +1 -1
- package/dist/commands/proxy-command.js +2 -1
- package/dist/commands/proxy-command.js.map +1 -1
- package/dist/commands/setup-command.d.ts.map +1 -1
- package/dist/commands/setup-command.js +6 -7
- package/dist/commands/setup-command.js.map +1 -1
- package/dist/commands/version-command.d.ts.map +1 -1
- package/dist/commands/version-command.js +2 -1
- package/dist/commands/version-command.js.map +1 -1
- package/dist/config/loader/config-getters.d.ts +121 -0
- package/dist/config/loader/config-getters.d.ts.map +1 -0
- package/dist/config/loader/config-getters.js +260 -0
- package/dist/config/loader/config-getters.js.map +1 -0
- package/dist/config/loader/defaults-merger.d.ts +21 -0
- package/dist/config/loader/defaults-merger.d.ts.map +1 -0
- package/dist/config/loader/defaults-merger.js +270 -0
- package/dist/config/loader/defaults-merger.js.map +1 -0
- package/dist/config/loader/io-locks.d.ts +76 -0
- package/dist/config/loader/io-locks.d.ts.map +1 -0
- package/dist/config/loader/io-locks.js +297 -0
- package/dist/config/loader/io-locks.js.map +1 -0
- package/dist/config/loader/normalizers.d.ts +40 -0
- package/dist/config/loader/normalizers.d.ts.map +1 -0
- package/dist/config/loader/normalizers.js +172 -0
- package/dist/config/loader/normalizers.js.map +1 -0
- package/dist/config/loader/yaml-serializer.d.ts +19 -0
- package/dist/config/loader/yaml-serializer.d.ts.map +1 -0
- package/dist/config/loader/yaml-serializer.js +299 -0
- package/dist/config/loader/yaml-serializer.js.map +1 -0
- package/dist/config/unified-config-loader.d.ts +21 -124
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +100 -1098
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/copilot/copilot-daemon.d.ts.map +1 -1
- package/dist/copilot/copilot-daemon.js +2 -2
- package/dist/copilot/copilot-daemon.js.map +1 -1
- package/dist/copilot/copilot-executor.d.ts.map +1 -1
- package/dist/copilot/copilot-executor.js +2 -2
- package/dist/copilot/copilot-executor.js.map +1 -1
- package/dist/copilot/copilot-package-manager.js +2 -2
- package/dist/copilot/copilot-package-manager.js.map +1 -1
- package/dist/cursor/cursor-auth.js +2 -2
- package/dist/cursor/cursor-auth.js.map +1 -1
- package/dist/cursor/cursor-daemon-pid.js +2 -2
- package/dist/cursor/cursor-daemon-pid.js.map +1 -1
- package/dist/cursor/cursor-profile-executor.d.ts.map +1 -1
- package/dist/cursor/cursor-profile-executor.js +2 -2
- package/dist/cursor/cursor-profile-executor.js.map +1 -1
- package/dist/delegation/delegation-handler.js +2 -2
- package/dist/delegation/delegation-handler.js.map +1 -1
- package/dist/delegation/headless-executor.d.ts.map +1 -1
- package/dist/delegation/headless-executor.js +4 -4
- package/dist/delegation/headless-executor.js.map +1 -1
- package/dist/delegation/session-manager.js +2 -2
- package/dist/delegation/session-manager.js.map +1 -1
- package/dist/dispatcher/cli-argument-parser.d.ts +70 -0
- package/dist/dispatcher/cli-argument-parser.d.ts.map +1 -0
- package/dist/dispatcher/cli-argument-parser.js +285 -0
- package/dist/dispatcher/cli-argument-parser.js.map +1 -0
- package/dist/dispatcher/dispatcher-context.d.ts +24 -0
- package/dist/dispatcher/dispatcher-context.d.ts.map +1 -0
- package/dist/dispatcher/dispatcher-context.js +11 -0
- package/dist/dispatcher/dispatcher-context.js.map +1 -0
- package/dist/dispatcher/environment-builder.d.ts +20 -0
- package/dist/dispatcher/environment-builder.d.ts.map +1 -0
- package/dist/dispatcher/environment-builder.js +95 -0
- package/dist/dispatcher/environment-builder.js.map +1 -0
- package/dist/dispatcher/flows/account-flow.d.ts +9 -0
- package/dist/dispatcher/flows/account-flow.d.ts.map +1 -0
- package/dist/dispatcher/flows/account-flow.js +49 -0
- package/dist/dispatcher/flows/account-flow.js.map +1 -0
- package/dist/dispatcher/flows/cliproxy-flow.d.ts +8 -0
- package/dist/dispatcher/flows/cliproxy-flow.d.ts.map +1 -0
- package/dist/dispatcher/flows/cliproxy-flow.js +165 -0
- package/dist/dispatcher/flows/cliproxy-flow.js.map +1 -0
- package/dist/dispatcher/flows/copilot-flow.d.ts +8 -0
- package/dist/dispatcher/flows/copilot-flow.d.ts.map +1 -0
- package/dist/dispatcher/flows/copilot-flow.js +72 -0
- package/dist/dispatcher/flows/copilot-flow.js.map +1 -0
- package/dist/dispatcher/flows/cursor-flow.d.ts +8 -0
- package/dist/dispatcher/flows/cursor-flow.d.ts.map +1 -0
- package/dist/dispatcher/flows/cursor-flow.js +62 -0
- package/dist/dispatcher/flows/cursor-flow.js.map +1 -0
- package/dist/dispatcher/flows/default-flow.d.ts +10 -0
- package/dist/dispatcher/flows/default-flow.d.ts.map +1 -0
- package/dist/dispatcher/flows/default-flow.js +99 -0
- package/dist/dispatcher/flows/default-flow.js.map +1 -0
- package/dist/dispatcher/flows/settings-flow.d.ts +9 -0
- package/dist/dispatcher/flows/settings-flow.d.ts.map +1 -0
- package/dist/dispatcher/flows/settings-flow.js +318 -0
- package/dist/dispatcher/flows/settings-flow.js.map +1 -0
- package/dist/dispatcher/flows/settings-image-analysis-prep.d.ts +28 -0
- package/dist/dispatcher/flows/settings-image-analysis-prep.d.ts.map +1 -0
- package/dist/dispatcher/flows/settings-image-analysis-prep.js +81 -0
- package/dist/dispatcher/flows/settings-image-analysis-prep.js.map +1 -0
- package/dist/dispatcher/pre-dispatch.d.ts +23 -0
- package/dist/dispatcher/pre-dispatch.d.ts.map +1 -0
- package/dist/dispatcher/pre-dispatch.js +156 -0
- package/dist/dispatcher/pre-dispatch.js.map +1 -0
- package/dist/dispatcher/profile-resolver.d.ts +65 -0
- package/dist/dispatcher/profile-resolver.d.ts.map +1 -0
- package/dist/dispatcher/profile-resolver.js +290 -0
- package/dist/dispatcher/profile-resolver.js.map +1 -0
- package/dist/dispatcher/target-executor.d.ts +26 -0
- package/dist/dispatcher/target-executor.d.ts.map +1 -0
- package/dist/dispatcher/target-executor.js +81 -0
- package/dist/dispatcher/target-executor.js.map +1 -0
- package/dist/docker/docker-assets.d.ts.map +1 -1
- package/dist/docker/docker-assets.js +2 -2
- package/dist/docker/docker-assets.js.map +1 -1
- package/dist/glmt/glmt-transformer.d.ts.map +1 -1
- package/dist/glmt/glmt-transformer.js +2 -2
- package/dist/glmt/glmt-transformer.js.map +1 -1
- package/dist/management/checks/config-check.d.ts.map +1 -1
- package/dist/management/checks/config-check.js +2 -2
- package/dist/management/checks/config-check.js.map +1 -1
- package/dist/management/checks/env-check.d.ts.map +1 -1
- package/dist/management/checks/env-check.js +2 -1
- package/dist/management/checks/env-check.js.map +1 -1
- package/dist/management/checks/image-analysis-check.d.ts.map +1 -1
- package/dist/management/checks/image-analysis-check.js +4 -4
- package/dist/management/checks/image-analysis-check.js.map +1 -1
- package/dist/management/checks/profile-check.js +4 -4
- package/dist/management/checks/profile-check.js.map +1 -1
- package/dist/management/checks/symlink-check.js +2 -2
- package/dist/management/checks/symlink-check.js.map +1 -1
- package/dist/management/checks/system-check.js +2 -2
- package/dist/management/checks/system-check.js.map +1 -1
- package/dist/management/instance-manager.d.ts.map +1 -1
- package/dist/management/instance-manager.js +2 -1
- package/dist/management/instance-manager.js.map +1 -1
- package/dist/management/recovery-manager.d.ts.map +1 -1
- package/dist/management/recovery-manager.js +5 -5
- package/dist/management/recovery-manager.js.map +1 -1
- package/dist/management/repair/auto-repair.d.ts.map +1 -1
- package/dist/management/repair/auto-repair.js +2 -2
- package/dist/management/repair/auto-repair.js.map +1 -1
- package/dist/management/shared-manager.d.ts.map +1 -1
- package/dist/management/shared-manager.js +2 -2
- package/dist/management/shared-manager.js.map +1 -1
- package/dist/proxy/proxy-daemon-entry.js +2 -2
- package/dist/proxy/proxy-daemon-entry.js.map +1 -1
- package/dist/proxy/proxy-daemon-paths.js +2 -2
- package/dist/proxy/proxy-daemon-paths.js.map +1 -1
- package/dist/proxy/proxy-port-resolver.js +2 -2
- package/dist/proxy/proxy-port-resolver.js.map +1 -1
- package/dist/proxy/request-router.d.ts.map +1 -1
- package/dist/proxy/request-router.js +3 -3
- package/dist/proxy/request-router.js.map +1 -1
- package/dist/services/logging/log-config.d.ts.map +1 -1
- package/dist/services/logging/log-config.js +3 -3
- package/dist/services/logging/log-config.js.map +1 -1
- package/dist/services/logging/log-paths.js +3 -3
- package/dist/services/logging/log-paths.js.map +1 -1
- package/dist/utils/browser/browser-setup.d.ts +2 -2
- package/dist/utils/browser/browser-setup.d.ts.map +1 -1
- package/dist/utils/browser/browser-setup.js +4 -4
- package/dist/utils/browser/browser-setup.js.map +1 -1
- package/dist/utils/browser/browser-status.d.ts.map +1 -1
- package/dist/utils/browser/browser-status.js +3 -3
- package/dist/utils/browser/browser-status.js.map +1 -1
- package/dist/utils/hooks/get-image-analysis-hook-env.d.ts.map +1 -1
- package/dist/utils/hooks/get-image-analysis-hook-env.js +2 -2
- package/dist/utils/hooks/get-image-analysis-hook-env.js.map +1 -1
- package/dist/utils/hooks/image-analyzer-hook-configuration.d.ts.map +1 -1
- package/dist/utils/hooks/image-analyzer-hook-configuration.js +2 -2
- package/dist/utils/hooks/image-analyzer-hook-configuration.js.map +1 -1
- package/dist/utils/hooks/image-analyzer-hook-installer.d.ts.map +1 -1
- package/dist/utils/hooks/image-analyzer-hook-installer.js +2 -2
- package/dist/utils/hooks/image-analyzer-hook-installer.js.map +1 -1
- package/dist/utils/hooks/image-analyzer-profile-hook-injector.d.ts.map +1 -1
- package/dist/utils/hooks/image-analyzer-profile-hook-injector.js +2 -2
- package/dist/utils/hooks/image-analyzer-profile-hook-injector.js.map +1 -1
- package/dist/utils/image-analysis/mcp-installer.d.ts.map +1 -1
- package/dist/utils/image-analysis/mcp-installer.js +5 -5
- package/dist/utils/image-analysis/mcp-installer.js.map +1 -1
- package/dist/utils/shell-executor.d.ts.map +1 -1
- package/dist/utils/shell-executor.js +2 -2
- package/dist/utils/shell-executor.js.map +1 -1
- package/dist/utils/websearch/hook-config.d.ts.map +1 -1
- package/dist/utils/websearch/hook-config.js +3 -3
- package/dist/utils/websearch/hook-config.js.map +1 -1
- package/dist/utils/websearch/hook-env.js +2 -2
- package/dist/utils/websearch/hook-env.js.map +1 -1
- package/dist/utils/websearch/hook-installer.d.ts.map +1 -1
- package/dist/utils/websearch/hook-installer.js +2 -2
- package/dist/utils/websearch/hook-installer.js.map +1 -1
- package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
- package/dist/utils/websearch/mcp-installer.js +5 -5
- package/dist/utils/websearch/mcp-installer.js.map +1 -1
- package/dist/utils/websearch/profile-hook-injector.d.ts.map +1 -1
- package/dist/utils/websearch/profile-hook-injector.js +3 -3
- package/dist/utils/websearch/profile-hook-injector.js.map +1 -1
- package/dist/utils/websearch/provider-secrets.js +2 -2
- package/dist/utils/websearch/provider-secrets.js.map +1 -1
- package/dist/utils/websearch/status.d.ts.map +1 -1
- package/dist/utils/websearch/status.js +4 -4
- package/dist/utils/websearch/status.js.map +1 -1
- package/dist/web-server/file-watcher.js +2 -2
- package/dist/web-server/file-watcher.js.map +1 -1
- package/dist/web-server/health/config-checks.d.ts.map +1 -1
- package/dist/web-server/health/config-checks.js +3 -3
- package/dist/web-server/health/config-checks.js.map +1 -1
- package/dist/web-server/health/profile-checks.d.ts.map +1 -1
- package/dist/web-server/health/profile-checks.js +3 -3
- package/dist/web-server/health/profile-checks.js.map +1 -1
- package/dist/web-server/health-service.d.ts.map +1 -1
- package/dist/web-server/health-service.js +7 -6
- package/dist/web-server/health-service.js.map +1 -1
- package/dist/web-server/middleware/auth-middleware.d.ts.map +1 -1
- package/dist/web-server/middleware/auth-middleware.js +6 -7
- package/dist/web-server/middleware/auth-middleware.js.map +1 -1
- package/dist/web-server/models-dev/registry-cache.d.ts.map +1 -1
- package/dist/web-server/models-dev/registry-cache.js +2 -2
- package/dist/web-server/models-dev/registry-cache.js.map +1 -1
- package/dist/web-server/overview-routes.d.ts.map +1 -1
- package/dist/web-server/overview-routes.js +2 -2
- package/dist/web-server/overview-routes.js.map +1 -1
- package/dist/web-server/routes/account-routes.d.ts.map +1 -1
- package/dist/web-server/routes/account-routes.js +7 -7
- package/dist/web-server/routes/account-routes.js.map +1 -1
- package/dist/web-server/routes/auth-routes.d.ts.map +1 -1
- package/dist/web-server/routes/auth-routes.js +4 -4
- package/dist/web-server/routes/auth-routes.js.map +1 -1
- package/dist/web-server/routes/browser-routes.d.ts.map +1 -1
- package/dist/web-server/routes/browser-routes.js +2 -2
- package/dist/web-server/routes/browser-routes.js.map +1 -1
- package/dist/web-server/routes/channels-routes.d.ts.map +1 -1
- package/dist/web-server/routes/channels-routes.js +4 -4
- package/dist/web-server/routes/channels-routes.js.map +1 -1
- package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cliproxy-auth-routes.js +2 -2
- package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -1
- package/dist/web-server/routes/cliproxy-local-proxy.d.ts.map +1 -1
- package/dist/web-server/routes/cliproxy-local-proxy.js +2 -2
- package/dist/web-server/routes/cliproxy-local-proxy.js.map +1 -1
- package/dist/web-server/routes/cliproxy-sync-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cliproxy-sync-routes.js +2 -2
- package/dist/web-server/routes/cliproxy-sync-routes.js.map +1 -1
- package/dist/web-server/routes/config-routes.d.ts.map +1 -1
- package/dist/web-server/routes/config-routes.js +6 -6
- package/dist/web-server/routes/config-routes.js.map +1 -1
- package/dist/web-server/routes/copilot-routes.d.ts.map +1 -1
- package/dist/web-server/routes/copilot-routes.js +3 -3
- package/dist/web-server/routes/copilot-routes.js.map +1 -1
- package/dist/web-server/routes/copilot-settings-routes.d.ts.map +1 -1
- package/dist/web-server/routes/copilot-settings-routes.js +6 -7
- package/dist/web-server/routes/copilot-settings-routes.js.map +1 -1
- package/dist/web-server/routes/cursor-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cursor-routes.js +5 -5
- package/dist/web-server/routes/cursor-routes.js.map +1 -1
- package/dist/web-server/routes/cursor-settings-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cursor-settings-routes.js +8 -9
- package/dist/web-server/routes/cursor-settings-routes.js.map +1 -1
- package/dist/web-server/routes/image-analysis-routes.d.ts.map +1 -1
- package/dist/web-server/routes/image-analysis-routes.js +5 -6
- package/dist/web-server/routes/image-analysis-routes.js.map +1 -1
- package/dist/web-server/routes/misc-routes.d.ts.map +1 -1
- package/dist/web-server/routes/misc-routes.js +10 -11
- package/dist/web-server/routes/misc-routes.js.map +1 -1
- package/dist/web-server/routes/proxy-routes.d.ts.map +1 -1
- package/dist/web-server/routes/proxy-routes.js +6 -6
- package/dist/web-server/routes/proxy-routes.js.map +1 -1
- package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
- package/dist/web-server/routes/route-helpers.js +7 -6
- package/dist/web-server/routes/route-helpers.js.map +1 -1
- package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
- package/dist/web-server/routes/settings-routes.js +8 -9
- package/dist/web-server/routes/settings-routes.js.map +1 -1
- package/dist/web-server/routes/websearch-routes.d.ts.map +1 -1
- package/dist/web-server/routes/websearch-routes.js +4 -4
- package/dist/web-server/routes/websearch-routes.js.map +1 -1
- package/dist/web-server/services/claude-extension-binding-service.js +2 -2
- package/dist/web-server/services/claude-extension-binding-service.js.map +1 -1
- package/dist/web-server/services/logs-dashboard-service.d.ts.map +1 -1
- package/dist/web-server/services/logs-dashboard-service.js +2 -2
- package/dist/web-server/services/logs-dashboard-service.js.map +1 -1
- package/dist/web-server/shared-routes.d.ts.map +1 -1
- package/dist/web-server/shared-routes.js +4 -4
- package/dist/web-server/shared-routes.js.map +1 -1
- package/dist/web-server/usage/aggregator.d.ts.map +1 -1
- package/dist/web-server/usage/aggregator.js +2 -2
- package/dist/web-server/usage/aggregator.js.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-syncer.d.ts.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-syncer.js +2 -2
- package/dist/web-server/usage/cliproxy-usage-syncer.js.map +1 -1
- package/dist/web-server/usage/disk-cache.js +2 -2
- package/dist/web-server/usage/disk-cache.js.map +1 -1
- package/package.json +1 -1
package/dist/ccs.js
CHANGED
|
@@ -25,457 +25,46 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
};
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
27
|
require("./utils/fetch-proxy-setup");
|
|
28
|
-
const fs = __importStar(require("fs"));
|
|
29
|
-
const claude_detector_1 = require("./utils/claude-detector");
|
|
30
|
-
const config_manager_1 = require("./utils/config-manager");
|
|
31
|
-
const helpers_1 = require("./utils/helpers");
|
|
32
|
-
const api_key_validator_1 = require("./utils/api-key-validator");
|
|
33
28
|
const error_manager_1 = require("./utils/error-manager");
|
|
34
|
-
const cliproxy_1 = require("./cliproxy");
|
|
35
|
-
const env_builder_1 = require("./cliproxy/config/env-builder");
|
|
36
|
-
const port_manager_1 = require("./cliproxy/config/port-manager");
|
|
37
|
-
const websearch_manager_1 = require("./utils/websearch-manager");
|
|
38
|
-
const image_analysis_1 = require("./utils/image-analysis");
|
|
39
|
-
const browser_1 = require("./utils/browser");
|
|
40
|
-
const unified_config_loader_1 = require("./config/unified-config-loader");
|
|
41
|
-
const image_analyzer_profile_hook_injector_1 = require("./utils/hooks/image-analyzer-profile-hook-injector");
|
|
42
|
-
const hooks_1 = require("./utils/hooks");
|
|
43
29
|
const ui_1 = require("./utils/ui");
|
|
44
|
-
const constants_1 = require("./copilot/constants");
|
|
45
|
-
const official_channels_runtime_1 = require("./channels/official-channels-runtime");
|
|
46
|
-
const official_channels_store_1 = require("./channels/official-channels-store");
|
|
47
|
-
const constants_2 = require("./cursor/constants");
|
|
48
|
-
const provider_capabilities_1 = require("./cliproxy/provider-capabilities");
|
|
49
30
|
// Import centralized error handling
|
|
50
31
|
const errors_1 = require("./errors");
|
|
51
|
-
const root_command_router_1 = require("./commands/root-command-router");
|
|
52
|
-
// Import extracted utility functions
|
|
53
|
-
const shell_executor_1 = require("./utils/shell-executor");
|
|
54
|
-
const glmt_deprecation_1 = require("./utils/glmt-deprecation");
|
|
55
|
-
const openai_compat_launch_settings_1 = require("./utils/openai-compat-launch-settings");
|
|
56
|
-
const resume_lane_warning_1 = require("./auth/resume-lane-warning");
|
|
57
32
|
const logging_1 = require("./services/logging");
|
|
58
|
-
const browser_codex_overrides_1 = require("./utils/browser-codex-overrides");
|
|
59
33
|
// Import target adapter system
|
|
60
34
|
const targets_1 = require("./targets");
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
//
|
|
67
|
-
const version_1 = require("./utils/version");
|
|
68
|
-
const update_checker_1 = require("./utils/update-checker");
|
|
69
|
-
const CODEX_RUNTIME_REASONING_LEVELS = new Set(['minimal', 'low', 'medium', 'high', 'xhigh']);
|
|
70
|
-
const CODEX_NATIVE_PASSTHROUGH_FLAGS = new Set(['--help', '-h', '--version', '-v']);
|
|
71
|
-
const NATIVE_CLAUDE_EFFORT_LEVELS = ['low', 'medium', 'high', 'xhigh', 'max'];
|
|
72
|
-
const NATIVE_CLAUDE_EFFORT_LEVEL_SET = new Set(NATIVE_CLAUDE_EFFORT_LEVELS);
|
|
73
|
-
function resolveCodexRuntimeConfigOverrides(target, browserLaunchOverride) {
|
|
74
|
-
if (target !== 'codex') {
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
const codexBrowserExposure = (0, browser_1.resolveBrowserExposure)((0, unified_config_loader_1.getBrowserConfig)().codex, browserLaunchOverride);
|
|
78
|
-
if (!codexBrowserExposure.exposeForLaunch) {
|
|
79
|
-
return [];
|
|
80
|
-
}
|
|
81
|
-
return (0, browser_codex_overrides_1.buildCodexBrowserMcpOverrides)();
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Smart profile detection
|
|
85
|
-
*/
|
|
86
|
-
function detectProfile(args) {
|
|
87
|
-
if (args.length === 0 || args[0].startsWith('-')) {
|
|
88
|
-
// No args or first arg is a flag → use default profile
|
|
89
|
-
return { profile: 'default', remainingArgs: args };
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
// First arg doesn't start with '-' → treat as profile name
|
|
93
|
-
return { profile: args[0], remainingArgs: args.slice(1) };
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
function normalizeLegacyCursorArgs(args) {
|
|
97
|
-
if (args[0] === 'legacy' && args[1] === 'cursor') {
|
|
98
|
-
return [constants_2.LEGACY_CURSOR_PROFILE_NAME, ...args.slice(2)];
|
|
99
|
-
}
|
|
100
|
-
return args;
|
|
101
|
-
}
|
|
102
|
-
function printCursorLegacySubcommandDeprecation(subcommand) {
|
|
103
|
-
console.error((0, ui_1.info)(`\`ccs cursor ${subcommand}\` is deprecated for the legacy Cursor IDE bridge.`));
|
|
104
|
-
console.error((0, ui_1.info)(`Use \`ccs legacy cursor ${subcommand}\` for the old bridge, or \`ccs cursor --auth|--accounts|--config\` for the CLIProxy provider.`));
|
|
105
|
-
console.error('');
|
|
106
|
-
}
|
|
107
|
-
function resolveRuntimeReasoningFlags(args, envThinkingValue) {
|
|
108
|
-
const runtime = (0, droid_reasoning_runtime_1.resolveDroidReasoningRuntime)(args, envThinkingValue);
|
|
109
|
-
if (runtime.duplicateDisplays.length > 0) {
|
|
110
|
-
console.error((0, ui_1.warn)(`[!] Multiple reasoning flags detected. Using first occurrence: ${runtime.sourceDisplay || '<first-flag>'}`));
|
|
111
|
-
}
|
|
112
|
-
return {
|
|
113
|
-
argsWithoutReasoningFlags: runtime.argsWithoutReasoningFlags,
|
|
114
|
-
reasoningOverride: runtime.reasoningOverride,
|
|
115
|
-
reasoningSource: runtime.sourceFlag
|
|
116
|
-
? 'flag'
|
|
117
|
-
: runtime.reasoningOverride !== undefined
|
|
118
|
-
? 'env'
|
|
119
|
-
: undefined,
|
|
120
|
-
sourceDisplay: runtime.sourceDisplay,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
function normalizeCodexRuntimeReasoningOverride(value) {
|
|
124
|
-
return typeof value === 'string' && CODEX_RUNTIME_REASONING_LEVELS.has(value) ? value : undefined;
|
|
125
|
-
}
|
|
126
|
-
function exitWithRuntimeReasoningFlagError(message, options) {
|
|
127
|
-
console.error((0, ui_1.fail)(message));
|
|
128
|
-
console.error(' Examples: --thinking low, --thinking 8192, --thinking off');
|
|
129
|
-
console.error(` Codex alias: --effort ${options.codexAliasLevels}`);
|
|
130
|
-
if (options.includeDroidExecExample) {
|
|
131
|
-
console.error(' Droid exec: --reasoning-effort high');
|
|
132
|
-
}
|
|
133
|
-
process.exit(1);
|
|
134
|
-
}
|
|
135
|
-
function normalizeNativeClaudeEffortArgs(args) {
|
|
136
|
-
const normalizedArgs = [];
|
|
137
|
-
const allowedValues = NATIVE_CLAUDE_EFFORT_LEVELS.join(', ');
|
|
138
|
-
for (let i = 0; i < args.length; i++) {
|
|
139
|
-
const arg = args[i];
|
|
140
|
-
if (arg === '--effort') {
|
|
141
|
-
const rawValue = args[i + 1];
|
|
142
|
-
if (!rawValue || rawValue.startsWith('-') || !rawValue.trim()) {
|
|
143
|
-
throw new Error(`--effort requires a value: ${allowedValues}`);
|
|
144
|
-
}
|
|
145
|
-
const value = rawValue.toLowerCase();
|
|
146
|
-
if (!NATIVE_CLAUDE_EFFORT_LEVEL_SET.has(value)) {
|
|
147
|
-
throw new Error(`Invalid --effort value: ${rawValue}. Expected one of: ${allowedValues}.`);
|
|
148
|
-
}
|
|
149
|
-
normalizedArgs.push(arg, value);
|
|
150
|
-
i++;
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
if (arg.startsWith('--effort=')) {
|
|
154
|
-
const rawValue = arg.slice('--effort='.length);
|
|
155
|
-
if (!rawValue.trim()) {
|
|
156
|
-
throw new Error(`--effort requires a value: ${allowedValues}`);
|
|
157
|
-
}
|
|
158
|
-
const value = rawValue.toLowerCase();
|
|
159
|
-
if (!NATIVE_CLAUDE_EFFORT_LEVEL_SET.has(value)) {
|
|
160
|
-
throw new Error(`Invalid --effort value: ${rawValue}. Expected one of: ${allowedValues}.`);
|
|
161
|
-
}
|
|
162
|
-
normalizedArgs.push(`--effort=${value}`);
|
|
163
|
-
continue;
|
|
164
|
-
}
|
|
165
|
-
normalizedArgs.push(arg);
|
|
166
|
-
}
|
|
167
|
-
return normalizedArgs;
|
|
168
|
-
}
|
|
169
|
-
function shouldNormalizeNativeClaudeEffort(profileType) {
|
|
170
|
-
return profileType === 'default' || profileType === 'account' || profileType === 'settings';
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Perform background update check (refreshes cache, no notification)
|
|
174
|
-
*/
|
|
175
|
-
async function refreshUpdateCache() {
|
|
176
|
-
try {
|
|
177
|
-
const currentVersion = (0, version_1.getVersion)();
|
|
178
|
-
// npm is now the only supported installation method
|
|
179
|
-
await (0, update_checker_1.checkForUpdates)(currentVersion, true, 'npm');
|
|
180
|
-
}
|
|
181
|
-
catch (_e) {
|
|
182
|
-
// Silently fail - update check shouldn't crash main CLI
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Show update notification if cached result indicates update available
|
|
187
|
-
* Returns true if notification was shown
|
|
188
|
-
*/
|
|
189
|
-
async function showCachedUpdateNotification() {
|
|
190
|
-
try {
|
|
191
|
-
const currentVersion = (0, version_1.getVersion)();
|
|
192
|
-
const updateInfo = (0, update_checker_1.checkCachedUpdate)(currentVersion);
|
|
193
|
-
if (updateInfo) {
|
|
194
|
-
await (0, update_checker_1.showUpdateNotification)(updateInfo);
|
|
195
|
-
return true;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
catch (_e) {
|
|
199
|
-
// Silently fail
|
|
200
|
-
}
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
203
|
-
function resolveNativeClaudeLaunchArgs(args, profileType, targetConfigDir) {
|
|
204
|
-
const config = (0, unified_config_loader_1.getOfficialChannelsConfig)();
|
|
205
|
-
const environment = (0, official_channels_runtime_1.getOfficialChannelsEnvironmentStatus)(targetConfigDir ? { CLAUDE_CONFIG_DIR: targetConfigDir } : undefined);
|
|
206
|
-
const channelReadiness = {
|
|
207
|
-
telegram: (0, official_channels_store_1.getOfficialChannelReadiness)('telegram'),
|
|
208
|
-
discord: (0, official_channels_store_1.getOfficialChannelReadiness)('discord'),
|
|
209
|
-
imessage: !(0, official_channels_runtime_1.officialChannelRequiresMacOS)('imessage') || process.platform === 'darwin',
|
|
210
|
-
};
|
|
211
|
-
const plan = (0, official_channels_runtime_1.resolveOfficialChannelsLaunchPlan)({
|
|
212
|
-
args,
|
|
213
|
-
config,
|
|
214
|
-
target: 'claude',
|
|
215
|
-
profileType,
|
|
216
|
-
environment,
|
|
217
|
-
channelReadiness,
|
|
218
|
-
});
|
|
219
|
-
for (const message of plan.skippedMessages) {
|
|
220
|
-
console.error((0, ui_1.warn)(message));
|
|
221
|
-
}
|
|
222
|
-
if (config.selected.length > 0 &&
|
|
223
|
-
environment.auth.state === 'eligible' &&
|
|
224
|
-
environment.auth.orgRequirementMessage) {
|
|
225
|
-
console.error((0, ui_1.warn)(environment.auth.orgRequirementMessage));
|
|
226
|
-
}
|
|
227
|
-
if (!plan.applied) {
|
|
228
|
-
return args;
|
|
229
|
-
}
|
|
230
|
-
return (0, official_channels_runtime_1.buildOfficialChannelsArgs)(args, plan.appliedChannels, plan.wantsPermissionBypass);
|
|
231
|
-
}
|
|
232
|
-
function shouldPassthroughNativeCodexFlagCommand(args) {
|
|
233
|
-
return getNativeCodexPassthroughArgs(args) !== null;
|
|
234
|
-
}
|
|
235
|
-
function getNativeCodexPassthroughArgs(args) {
|
|
236
|
-
const targetArgs = (0, target_resolver_1.stripTargetFlag)(args);
|
|
237
|
-
if ((0, target_resolver_1.resolveTargetType)(args) !== 'codex' || targetArgs.length === 0) {
|
|
238
|
-
return null;
|
|
239
|
-
}
|
|
240
|
-
const firstArg = targetArgs[0] || '';
|
|
241
|
-
if (CODEX_NATIVE_PASSTHROUGH_FLAGS.has(firstArg)) {
|
|
242
|
-
return targetArgs;
|
|
243
|
-
}
|
|
244
|
-
const secondArg = targetArgs[1] || '';
|
|
245
|
-
if (firstArg === 'codex' && CODEX_NATIVE_PASSTHROUGH_FLAGS.has(secondArg)) {
|
|
246
|
-
return targetArgs.slice(1);
|
|
247
|
-
}
|
|
248
|
-
return null;
|
|
249
|
-
}
|
|
250
|
-
function execNativeCodexFlagCommand(args) {
|
|
251
|
-
const adapter = (0, targets_1.getTarget)('codex');
|
|
252
|
-
if (!adapter) {
|
|
253
|
-
console.error((0, ui_1.fail)('Target adapter not found for "codex"'));
|
|
254
|
-
process.exit(1);
|
|
255
|
-
}
|
|
256
|
-
const binaryInfo = adapter.detectBinary();
|
|
257
|
-
if (!binaryInfo) {
|
|
258
|
-
console.error((0, ui_1.fail)('Codex CLI not found.'));
|
|
259
|
-
console.error((0, ui_1.info)('Install a recent @openai/codex build, then retry.'));
|
|
260
|
-
process.exit(1);
|
|
261
|
-
}
|
|
262
|
-
const targetArgs = getNativeCodexPassthroughArgs(args);
|
|
263
|
-
if (!targetArgs) {
|
|
264
|
-
console.error((0, ui_1.fail)('Native Codex passthrough args could not be resolved.'));
|
|
265
|
-
process.exit(1);
|
|
266
|
-
}
|
|
267
|
-
const creds = {
|
|
268
|
-
profile: 'default',
|
|
269
|
-
baseUrl: '',
|
|
270
|
-
apiKey: '',
|
|
271
|
-
};
|
|
272
|
-
const builtArgs = adapter.buildArgs('default', targetArgs, {
|
|
273
|
-
creds,
|
|
274
|
-
profileType: 'default',
|
|
275
|
-
binaryInfo,
|
|
276
|
-
});
|
|
277
|
-
const targetEnv = adapter.buildEnv(creds, 'default');
|
|
278
|
-
adapter.exec(builtArgs, targetEnv, { binaryInfo });
|
|
279
|
-
}
|
|
35
|
+
// Import extracted dispatcher modules
|
|
36
|
+
const cli_argument_parser_1 = require("./dispatcher/cli-argument-parser");
|
|
37
|
+
const target_executor_1 = require("./dispatcher/target-executor");
|
|
38
|
+
const pre_dispatch_1 = require("./dispatcher/pre-dispatch");
|
|
39
|
+
const profile_resolver_1 = require("./dispatcher/profile-resolver");
|
|
40
|
+
// ========== Main Execution ==========
|
|
280
41
|
async function main() {
|
|
281
|
-
// Register target adapters
|
|
42
|
+
// Register target adapters (singleton wiring — stays in main)
|
|
282
43
|
(0, targets_1.registerTarget)(new targets_1.ClaudeAdapter());
|
|
283
44
|
(0, targets_1.registerTarget)(new targets_1.DroidAdapter());
|
|
284
45
|
(0, targets_1.registerTarget)(new targets_1.CodexAdapter());
|
|
285
46
|
const cliLogger = (0, logging_1.createLogger)('cli');
|
|
286
|
-
|
|
287
|
-
const
|
|
288
|
-
|
|
289
|
-
// Must happen before any status messages (ok, info, fail, etc.)
|
|
290
|
-
if (!isCompletionCommand && process.stdout.isTTY && !process.env['CI']) {
|
|
291
|
-
const { initUI } = await Promise.resolve().then(() => __importStar(require('./utils/ui')));
|
|
292
|
-
await initUI();
|
|
293
|
-
}
|
|
294
|
-
// Parse --config-dir flag (must happen before any config loading)
|
|
295
|
-
const configDirIdx = args.findIndex((a) => a === '--config-dir' || a.startsWith('--config-dir='));
|
|
296
|
-
if (configDirIdx !== -1) {
|
|
297
|
-
const arg = args[configDirIdx];
|
|
298
|
-
let configDirValue;
|
|
299
|
-
let spliceCount = 1;
|
|
300
|
-
if (arg.startsWith('--config-dir=')) {
|
|
301
|
-
configDirValue = arg.split('=').slice(1).join('=');
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
configDirValue = args[configDirIdx + 1];
|
|
305
|
-
spliceCount = 2;
|
|
306
|
-
}
|
|
307
|
-
if (!configDirValue || configDirValue.startsWith('-')) {
|
|
308
|
-
console.error((0, ui_1.fail)('--config-dir requires a path argument'));
|
|
309
|
-
process.exit(1);
|
|
310
|
-
}
|
|
311
|
-
try {
|
|
312
|
-
const stat = fs.statSync(configDirValue);
|
|
313
|
-
if (!stat.isDirectory()) {
|
|
314
|
-
console.error((0, ui_1.fail)(`Not a directory: ${configDirValue}`));
|
|
315
|
-
process.exit(1);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
catch {
|
|
319
|
-
console.error((0, ui_1.fail)(`Config directory not found: ${configDirValue}`));
|
|
320
|
-
console.error((0, ui_1.info)('Create the directory first, then copy your config files into it.'));
|
|
321
|
-
process.exit(1);
|
|
322
|
-
}
|
|
323
|
-
(0, config_manager_1.setGlobalConfigDir)(configDirValue);
|
|
324
|
-
// Security warning: cloud sync paths expose OAuth tokens
|
|
325
|
-
const cloudService = (0, config_manager_1.detectCloudSyncPath)(configDirValue);
|
|
326
|
-
if (!isCompletionCommand && cloudService) {
|
|
327
|
-
console.error((0, ui_1.warn)(`CCS directory is under ${cloudService}.`));
|
|
328
|
-
console.error(' OAuth tokens in cliproxy/auth/ will be synced to cloud.');
|
|
329
|
-
console.error(' Consider: CCS_DIR=/path/outside/cloud ccs ...');
|
|
330
|
-
}
|
|
331
|
-
// Remove consumed args so they don't leak to Claude CLI
|
|
332
|
-
args.splice(configDirIdx, spliceCount);
|
|
333
|
-
}
|
|
334
|
-
else if (process.env.CCS_DIR) {
|
|
335
|
-
// Also warn for CCS_DIR env var pointing to cloud sync
|
|
336
|
-
const cloudService = (0, config_manager_1.detectCloudSyncPath)(process.env.CCS_DIR);
|
|
337
|
-
if (!isCompletionCommand && cloudService) {
|
|
338
|
-
console.error((0, ui_1.warn)(`CCS directory is under ${cloudService}.`));
|
|
339
|
-
console.error(' OAuth tokens in cliproxy/auth/ will be synced to cloud.');
|
|
340
|
-
console.error(' Consider: CCS_DIR=/path/outside/cloud ccs ...');
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
else if (process.env.CCS_HOME) {
|
|
344
|
-
// Also warn for CCS_HOME env var pointing to cloud sync
|
|
345
|
-
const cloudService = (0, config_manager_1.detectCloudSyncPath)(process.env.CCS_HOME);
|
|
346
|
-
if (!isCompletionCommand && cloudService) {
|
|
347
|
-
console.error((0, ui_1.warn)(`CCS directory is under ${cloudService}.`));
|
|
348
|
-
console.error(' OAuth tokens in cliproxy/auth/ will be synced to cloud.');
|
|
349
|
-
console.error(' Consider: CCS_DIR=/path/outside/cloud ccs ...');
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
if (isCompletionCommand) {
|
|
353
|
-
await (0, root_command_router_1.tryHandleRootCommand)(args);
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
args = normalizeLegacyCursorArgs(args);
|
|
357
|
-
let browserLaunchOverride;
|
|
358
|
-
try {
|
|
359
|
-
const browserLaunchFlags = (0, browser_1.resolveBrowserLaunchFlagResolution)(args);
|
|
360
|
-
browserLaunchOverride = browserLaunchFlags.override;
|
|
361
|
-
args = browserLaunchFlags.argsWithoutFlags;
|
|
362
|
-
}
|
|
363
|
-
catch (error) {
|
|
364
|
-
console.error((0, ui_1.fail)(error.message));
|
|
365
|
-
process.exit(1);
|
|
47
|
+
// Phase A: bootstrap + early arg pre-parse
|
|
48
|
+
const bootstrap = await (0, cli_argument_parser_1.bootstrapAndParseEarlyCli)(process.argv.slice(2));
|
|
49
|
+
if (bootstrap.exitNow) {
|
|
366
50
|
return;
|
|
367
51
|
}
|
|
52
|
+
const args = bootstrap.args;
|
|
53
|
+
const browserLaunchOverride = bootstrap.browserLaunchOverride;
|
|
368
54
|
cliLogger.info('command.start', 'CLI invocation started', {
|
|
369
55
|
command: args[0] || 'default',
|
|
370
56
|
argCount: args.length,
|
|
371
57
|
flags: args.filter((arg) => arg.startsWith('-')).slice(0, 20),
|
|
372
58
|
});
|
|
373
|
-
|
|
374
|
-
|
|
59
|
+
// Phase B: pre-dispatch side-effects (update check, migrate, recovery, root commands, routing)
|
|
60
|
+
const preDispatchConsumed = await (0, pre_dispatch_1.runPreDispatchHandlers)({ args, cliLogger });
|
|
61
|
+
if (preDispatchConsumed) {
|
|
375
62
|
return;
|
|
376
63
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
'version',
|
|
382
|
-
'--version',
|
|
383
|
-
'-v',
|
|
384
|
-
'help',
|
|
385
|
-
'--help',
|
|
386
|
-
'-h',
|
|
387
|
-
'update',
|
|
388
|
-
'--update',
|
|
389
|
-
];
|
|
390
|
-
if (process.stdout.isTTY && !process.env['CI'] && !skipUpdateCheck.includes(firstArg)) {
|
|
391
|
-
// 1. Show cached update notification (async for proper UI)
|
|
392
|
-
await showCachedUpdateNotification();
|
|
393
|
-
// 2. Refresh cache in background if stale (non-blocking)
|
|
394
|
-
if ((0, update_checker_1.isCacheStale)()) {
|
|
395
|
-
refreshUpdateCache();
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
// Auto-migrate to unified config format (silent if already migrated)
|
|
399
|
-
// Skip if user is explicitly running migrate command
|
|
400
|
-
if (firstArg !== 'migrate') {
|
|
401
|
-
const { autoMigrate } = await Promise.resolve().then(() => __importStar(require('./config/migration-manager')));
|
|
402
|
-
await autoMigrate();
|
|
403
|
-
}
|
|
404
|
-
// Auto-recovery for missing configuration (BEFORE any early-exit commands)
|
|
405
|
-
// This ensures ALL commands benefit from auto-recovery, not just profile-switching flow
|
|
406
|
-
// Recovery is safe to run early - it only creates missing files with safe defaults
|
|
407
|
-
// Wrapped in try-catch to prevent blocking --version/--help on permission errors
|
|
408
|
-
try {
|
|
409
|
-
const RecoveryManagerModule = await Promise.resolve().then(() => __importStar(require('./management/recovery-manager')));
|
|
410
|
-
const RecoveryManager = RecoveryManagerModule.default;
|
|
411
|
-
const recovery = new RecoveryManager();
|
|
412
|
-
const recovered = recovery.recoverAll();
|
|
413
|
-
if (recovered) {
|
|
414
|
-
recovery.showRecoveryHints();
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
catch (err) {
|
|
418
|
-
cliLogger.warn('recovery.failed', 'Auto-recovery failed during CLI startup', {
|
|
419
|
-
message: err.message,
|
|
420
|
-
});
|
|
421
|
-
// Recovery is best-effort - don't block basic CLI functionality
|
|
422
|
-
console.warn('[!] Recovery failed:', err.message);
|
|
423
|
-
}
|
|
424
|
-
if (await (0, root_command_router_1.tryHandleRootCommand)(args)) {
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
if (typeof firstArg === 'string' &&
|
|
428
|
-
(0, provider_capabilities_1.isCLIProxyProvider)(firstArg) &&
|
|
429
|
-
args.length > 1 &&
|
|
430
|
-
(args.includes('--help') || args.includes('-h'))) {
|
|
431
|
-
const { showProviderShortcutHelp } = await Promise.resolve().then(() => __importStar(require('./commands/help-command')));
|
|
432
|
-
await showProviderShortcutHelp(firstArg);
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
// Special case: copilot command (GitHub Copilot integration)
|
|
436
|
-
// Route known subcommands to command handler, keep all other args as profile passthrough.
|
|
437
|
-
if (firstArg === 'copilot' && args.length > 1) {
|
|
438
|
-
const copilotToken = args[1];
|
|
439
|
-
const shouldRouteToCopilotCommand = (0, constants_1.isCopilotSubcommandToken)(copilotToken);
|
|
440
|
-
if (shouldRouteToCopilotCommand) {
|
|
441
|
-
const { handleCopilotCommand } = await Promise.resolve().then(() => __importStar(require('./commands/copilot-command')));
|
|
442
|
-
const exitCode = await handleCopilotCommand(args.slice(1));
|
|
443
|
-
process.exit(exitCode);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
// Special case: explicit legacy Cursor bridge namespace.
|
|
447
|
-
if (firstArg === constants_2.LEGACY_CURSOR_PROFILE_NAME && args.length > 1) {
|
|
448
|
-
const { handleCursorCommand } = await Promise.resolve().then(() => __importStar(require('./commands/cursor-command')));
|
|
449
|
-
const cursorToken = args[1];
|
|
450
|
-
if ((0, constants_2.isCursorSubcommandToken)(cursorToken)) {
|
|
451
|
-
const exitCode = await handleCursorCommand(args.slice(1));
|
|
452
|
-
process.exit(exitCode);
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
// Compatibility shim: old `ccs cursor <subcommand>` still forwards to the legacy bridge
|
|
456
|
-
// for one migration window, but bare/positional `ccs cursor` now belongs to CLIProxy.
|
|
457
|
-
if (firstArg === 'cursor' && args.length > 1) {
|
|
458
|
-
const { handleCursorCommand } = await Promise.resolve().then(() => __importStar(require('./commands/cursor-command')));
|
|
459
|
-
const cursorToken = args[1];
|
|
460
|
-
if ((0, constants_2.isCursorSubcommandToken)(cursorToken) && cursorToken !== '--help' && cursorToken !== '-h') {
|
|
461
|
-
printCursorLegacySubcommandDeprecation(cursorToken);
|
|
462
|
-
const exitCode = await handleCursorCommand(args.slice(1));
|
|
463
|
-
process.exit(exitCode);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
// First-time install: offer setup wizard for interactive users
|
|
467
|
-
// Check independently of recovery status (user may have empty config.yaml)
|
|
468
|
-
// Skip if headless, CI, or non-TTY environment
|
|
469
|
-
const { isFirstTimeInstall } = await Promise.resolve().then(() => __importStar(require('./commands/setup-command')));
|
|
470
|
-
if (process.stdout.isTTY && !process.env['CI'] && isFirstTimeInstall()) {
|
|
471
|
-
console.log('');
|
|
472
|
-
console.log((0, ui_1.info)('First-time install detected. Run `ccs setup` for guided configuration.'));
|
|
473
|
-
console.log(' Or use `ccs config` for the web dashboard.');
|
|
474
|
-
console.log('');
|
|
475
|
-
}
|
|
476
|
-
// Use ProfileDetector to determine profile type
|
|
477
|
-
const ProfileDetectorModule = await Promise.resolve().then(() => __importStar(require('./auth/profile-detector')));
|
|
478
|
-
const ProfileDetector = ProfileDetectorModule.default;
|
|
64
|
+
// Phase C: profile + target detection (extracted to dispatcher/profile-resolver.ts)
|
|
65
|
+
const resolvedProfile = await (0, profile_resolver_1.resolveProfileAndTarget)({ args, browserLaunchOverride, cliLogger });
|
|
66
|
+
const { profile, profileInfo, resolvedTarget, nativeClaudeRemainingArgs } = resolvedProfile;
|
|
67
|
+
// Dynamic imports needed by Phase E flows — preserve original load ordering.
|
|
479
68
|
const InstanceManagerModule = await Promise.resolve().then(() => __importStar(require('./management/instance-manager')));
|
|
480
69
|
const InstanceManager = InstanceManagerModule.default;
|
|
481
70
|
const ProfileRegistryModule = await Promise.resolve().then(() => __importStar(require('./auth/profile-registry')));
|
|
@@ -484,195 +73,16 @@ async function main() {
|
|
|
484
73
|
const { resolveAccountContextPolicy, isAccountContextMetadata } = AccountContextModule;
|
|
485
74
|
const ProfileContinuityModule = await Promise.resolve().then(() => __importStar(require('./auth/profile-continuity-inheritance')));
|
|
486
75
|
const { resolveProfileContinuityInheritance } = ProfileContinuityModule;
|
|
487
|
-
|
|
76
|
+
// Build full dispatch context (Phase E)
|
|
77
|
+
const dispatchCtx = {
|
|
78
|
+
...resolvedProfile,
|
|
79
|
+
InstanceManager,
|
|
80
|
+
ProfileRegistry,
|
|
81
|
+
resolveAccountContextPolicy,
|
|
82
|
+
isAccountContextMetadata,
|
|
83
|
+
resolveProfileContinuityInheritance,
|
|
84
|
+
};
|
|
488
85
|
try {
|
|
489
|
-
// Detect profile (strip --target flags before profile detection)
|
|
490
|
-
const cleanArgs = (0, target_resolver_1.stripTargetFlag)(args);
|
|
491
|
-
const { profile, remainingArgs } = detectProfile(cleanArgs);
|
|
492
|
-
const profileInfo = detector.detectProfileType(profile);
|
|
493
|
-
let resolvedTarget;
|
|
494
|
-
try {
|
|
495
|
-
resolvedTarget = (0, target_resolver_1.resolveTargetType)(args, profileInfo.target ? { target: profileInfo.target } : undefined);
|
|
496
|
-
}
|
|
497
|
-
catch (error) {
|
|
498
|
-
console.error((0, ui_1.fail)(error.message));
|
|
499
|
-
process.exit(1);
|
|
500
|
-
return;
|
|
501
|
-
}
|
|
502
|
-
// Detect Claude CLI (needed for claude target and all CLIProxy-derived flows)
|
|
503
|
-
const claudeCliRaw = (0, claude_detector_1.detectClaudeCli)();
|
|
504
|
-
if (resolvedTarget === 'claude' && !claudeCliRaw) {
|
|
505
|
-
await error_manager_1.ErrorManager.showClaudeNotFound();
|
|
506
|
-
process.exit(1);
|
|
507
|
-
}
|
|
508
|
-
const claudeCli = claudeCliRaw || '';
|
|
509
|
-
// Resolve non-claude target adapter once.
|
|
510
|
-
const targetAdapter = resolvedTarget !== 'claude' ? (0, targets_1.getTarget)(resolvedTarget) : null;
|
|
511
|
-
let resolvedSettingsPath;
|
|
512
|
-
let resolvedSettings;
|
|
513
|
-
let resolvedCliproxyBridge;
|
|
514
|
-
// Preflight unsupported profile/target combinations BEFORE binary detection,
|
|
515
|
-
// so users get the most actionable error even when the target CLI is not installed.
|
|
516
|
-
if (resolvedTarget !== 'claude') {
|
|
517
|
-
if (!targetAdapter) {
|
|
518
|
-
console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
|
|
519
|
-
process.exit(1);
|
|
520
|
-
}
|
|
521
|
-
if (profileInfo.type === 'settings') {
|
|
522
|
-
resolvedSettingsPath = profileInfo.settingsPath
|
|
523
|
-
? (0, helpers_1.expandPath)(profileInfo.settingsPath)
|
|
524
|
-
: (0, config_manager_1.getSettingsPath)(profileInfo.name);
|
|
525
|
-
resolvedSettings = (0, config_manager_1.loadSettings)(resolvedSettingsPath);
|
|
526
|
-
resolvedCliproxyBridge = (0, cliproxy_profile_bridge_1.resolveCliproxyBridgeMetadata)(resolvedSettings);
|
|
527
|
-
const compatibility = (0, targets_1.evaluateTargetRuntimeCompatibility)({
|
|
528
|
-
target: resolvedTarget,
|
|
529
|
-
profileType: profileInfo.type,
|
|
530
|
-
cliproxyBridgeProvider: resolvedCliproxyBridge?.provider ?? null,
|
|
531
|
-
});
|
|
532
|
-
if (!compatibility.supported) {
|
|
533
|
-
console.error((0, ui_1.fail)(compatibility.reason || `${targetAdapter.displayName} does not support this profile.`));
|
|
534
|
-
if (compatibility.suggestion) {
|
|
535
|
-
console.error((0, ui_1.info)(compatibility.suggestion));
|
|
536
|
-
}
|
|
537
|
-
process.exit(1);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
else {
|
|
541
|
-
const compatibility = (0, targets_1.evaluateTargetRuntimeCompatibility)({
|
|
542
|
-
target: resolvedTarget,
|
|
543
|
-
profileType: profileInfo.type,
|
|
544
|
-
cliproxyProvider: profileInfo.type === 'cliproxy' ? profileInfo.provider : undefined,
|
|
545
|
-
isComposite: profileInfo.type === 'cliproxy' ? Boolean(profileInfo.isComposite) : undefined,
|
|
546
|
-
});
|
|
547
|
-
if (!compatibility.supported) {
|
|
548
|
-
console.error((0, ui_1.fail)(compatibility.reason || `${targetAdapter.displayName} does not support this profile.`));
|
|
549
|
-
if (compatibility.suggestion) {
|
|
550
|
-
console.error((0, ui_1.info)(compatibility.suggestion));
|
|
551
|
-
}
|
|
552
|
-
process.exit(1);
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
if (profileInfo.type === 'default') {
|
|
556
|
-
if (!targetAdapter.supportsProfileType('default')) {
|
|
557
|
-
console.error((0, ui_1.fail)(`${targetAdapter.displayName} does not support default profile mode`));
|
|
558
|
-
process.exit(1);
|
|
559
|
-
}
|
|
560
|
-
// For default mode, Droid requires explicit credentials from environment.
|
|
561
|
-
if (resolvedTarget === 'droid') {
|
|
562
|
-
const baseUrl = process.env['ANTHROPIC_BASE_URL'] || '';
|
|
563
|
-
const apiKey = process.env['ANTHROPIC_AUTH_TOKEN'] || '';
|
|
564
|
-
if (!baseUrl.trim() || !apiKey.trim()) {
|
|
565
|
-
console.error((0, ui_1.fail)(`${targetAdapter.displayName} default mode requires ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN`));
|
|
566
|
-
console.error((0, ui_1.info)('Use a settings-based profile instead: ccs glm --target droid'));
|
|
567
|
-
process.exit(1);
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
// For non-claude targets, verify target binary exists once and pass it through.
|
|
573
|
-
const targetBinaryInfo = targetAdapter?.detectBinary() ?? null;
|
|
574
|
-
const browserConfig = (0, unified_config_loader_1.getBrowserConfig)();
|
|
575
|
-
const claudeAttachConfig = resolvedTarget === 'claude'
|
|
576
|
-
? (0, browser_1.getEffectiveClaudeBrowserAttachConfig)(browserConfig)
|
|
577
|
-
: undefined;
|
|
578
|
-
const codexRuntimeConfigOverrides = resolveCodexRuntimeConfigOverrides(resolvedTarget, browserLaunchOverride);
|
|
579
|
-
const claudeBrowserExposure = resolvedTarget === 'claude'
|
|
580
|
-
? (0, browser_1.resolveBrowserExposure)({
|
|
581
|
-
enabled: claudeAttachConfig?.enabled ?? browserConfig.claude.enabled,
|
|
582
|
-
policy: browserConfig.claude.policy,
|
|
583
|
-
}, browserLaunchOverride)
|
|
584
|
-
: undefined;
|
|
585
|
-
const codexBrowserExposure = resolvedTarget === 'codex'
|
|
586
|
-
? (0, browser_1.resolveBrowserExposure)(browserConfig.codex, browserLaunchOverride)
|
|
587
|
-
: undefined;
|
|
588
|
-
const blockedBrowserOverrideWarning = resolvedTarget === 'claude' && claudeBrowserExposure
|
|
589
|
-
? (0, browser_1.getBlockedBrowserOverrideWarning)('Claude Browser Attach', claudeBrowserExposure)
|
|
590
|
-
: resolvedTarget === 'codex' && codexBrowserExposure
|
|
591
|
-
? (0, browser_1.getBlockedBrowserOverrideWarning)('Codex Browser Tools', codexBrowserExposure)
|
|
592
|
-
: undefined;
|
|
593
|
-
if (blockedBrowserOverrideWarning) {
|
|
594
|
-
console.error((0, ui_1.warn)(blockedBrowserOverrideWarning));
|
|
595
|
-
}
|
|
596
|
-
if (resolvedTarget !== 'claude' && !targetBinaryInfo) {
|
|
597
|
-
const displayName = targetAdapter?.displayName || resolvedTarget;
|
|
598
|
-
console.error((0, ui_1.fail)(`${displayName} CLI not found.`));
|
|
599
|
-
if (resolvedTarget === 'droid') {
|
|
600
|
-
console.error((0, ui_1.info)('Install: npm i -g @factory/cli'));
|
|
601
|
-
}
|
|
602
|
-
else if (resolvedTarget === 'codex') {
|
|
603
|
-
console.error((0, ui_1.info)('Install a recent @openai/codex build, then retry.'));
|
|
604
|
-
}
|
|
605
|
-
process.exit(1);
|
|
606
|
-
}
|
|
607
|
-
// Best-effort: prune stale Droid model entries at runtime so settings.json stays clean.
|
|
608
|
-
if (resolvedTarget === 'droid') {
|
|
609
|
-
try {
|
|
610
|
-
const allProfiles = detector.getAllProfiles();
|
|
611
|
-
const activeProfiles = allProfiles.settings.filter((name) => /^[a-zA-Z0-9._-]+$/.test(name));
|
|
612
|
-
await (0, targets_1.pruneOrphanedModels)(activeProfiles);
|
|
613
|
-
}
|
|
614
|
-
catch (error) {
|
|
615
|
-
console.error((0, ui_1.warn)(`[!] Droid prune skipped: ${error.message}`));
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
let targetRemainingArgs = remainingArgs;
|
|
619
|
-
let runtimeReasoningOverride;
|
|
620
|
-
let nativeClaudeRemainingArgs = remainingArgs;
|
|
621
|
-
if (resolvedTarget === 'droid') {
|
|
622
|
-
try {
|
|
623
|
-
const droidRoute = (0, droid_command_router_1.routeDroidCommandArgs)(remainingArgs);
|
|
624
|
-
targetRemainingArgs = droidRoute.argsForDroid;
|
|
625
|
-
if (droidRoute.mode === 'interactive') {
|
|
626
|
-
const runtime = resolveRuntimeReasoningFlags(remainingArgs, process.env.CCS_THINKING);
|
|
627
|
-
targetRemainingArgs = runtime.argsWithoutReasoningFlags;
|
|
628
|
-
runtimeReasoningOverride = runtime.reasoningOverride;
|
|
629
|
-
}
|
|
630
|
-
else {
|
|
631
|
-
if (droidRoute.duplicateReasoningDisplays.length > 0) {
|
|
632
|
-
console.error((0, ui_1.warn)(`[!] Multiple reasoning flags detected. Using first occurrence: ${droidRoute.reasoningSourceDisplay || '<first-flag>'}`));
|
|
633
|
-
}
|
|
634
|
-
if (droidRoute.autoPrependedExec && process.stdout.isTTY) {
|
|
635
|
-
console.error((0, ui_1.info)('Detected Droid exec-only flags. Routing as: droid exec <flags> [prompt]'));
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
catch (error) {
|
|
640
|
-
if (error instanceof droid_reasoning_runtime_1.DroidReasoningFlagError || error instanceof droid_command_router_1.DroidCommandRouterError) {
|
|
641
|
-
exitWithRuntimeReasoningFlagError(error.message, {
|
|
642
|
-
codexAliasLevels: 'minimal|low|medium|high|xhigh',
|
|
643
|
-
includeDroidExecExample: true,
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
throw error;
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
else if (resolvedTarget === 'codex') {
|
|
650
|
-
try {
|
|
651
|
-
const runtime = resolveRuntimeReasoningFlags(remainingArgs, process.env.CCS_THINKING);
|
|
652
|
-
targetRemainingArgs = runtime.argsWithoutReasoningFlags;
|
|
653
|
-
const normalizedReasoning = normalizeCodexRuntimeReasoningOverride(runtime.reasoningOverride);
|
|
654
|
-
if (runtime.reasoningOverride !== undefined && !normalizedReasoning) {
|
|
655
|
-
if (runtime.reasoningSource === 'flag') {
|
|
656
|
-
throw new droid_reasoning_runtime_1.DroidReasoningFlagError('Codex target supports reasoning levels only: minimal, low, medium, high, xhigh.', '--effort');
|
|
657
|
-
}
|
|
658
|
-
runtimeReasoningOverride = undefined;
|
|
659
|
-
}
|
|
660
|
-
else {
|
|
661
|
-
runtimeReasoningOverride = normalizedReasoning;
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
catch (error) {
|
|
665
|
-
if (error instanceof droid_reasoning_runtime_1.DroidReasoningFlagError) {
|
|
666
|
-
exitWithRuntimeReasoningFlagError(error.message, {
|
|
667
|
-
codexAliasLevels: 'minimal|low|medium|high|xhigh',
|
|
668
|
-
});
|
|
669
|
-
}
|
|
670
|
-
throw error;
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
else if (resolvedTarget === 'claude' && shouldNormalizeNativeClaudeEffort(profileInfo.type)) {
|
|
674
|
-
nativeClaudeRemainingArgs = normalizeNativeClaudeEffortArgs(remainingArgs);
|
|
675
|
-
}
|
|
676
86
|
// Special case: headless delegation (-p/--prompt)
|
|
677
87
|
// Keep existing behavior for Claude targets only; non-claude targets must continue
|
|
678
88
|
// through normal adapter dispatch logic.
|
|
@@ -685,645 +95,8 @@ async function main() {
|
|
|
685
95
|
return;
|
|
686
96
|
}
|
|
687
97
|
}
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
const imageAnalysisMcpReady = resolvedTarget === 'claude' ? (0, image_analysis_1.ensureImageAnalysisMcpOrThrow)() : true;
|
|
691
|
-
if (resolvedTarget === 'claude') {
|
|
692
|
-
(0, websearch_manager_1.ensureWebSearchMcpOrThrow)();
|
|
693
|
-
}
|
|
694
|
-
const provider = profileInfo.provider || profileInfo.name;
|
|
695
|
-
const expandedCliproxySettingsPath = profileInfo.settingsPath
|
|
696
|
-
? (0, helpers_1.expandPath)(profileInfo.settingsPath)
|
|
697
|
-
: undefined;
|
|
698
|
-
if (resolvedTarget === 'claude') {
|
|
699
|
-
if (imageAnalysisMcpReady) {
|
|
700
|
-
(0, image_analyzer_profile_hook_injector_1.removeImageAnalysisProfileHook)(profileInfo.name, expandedCliproxySettingsPath);
|
|
701
|
-
}
|
|
702
|
-
else {
|
|
703
|
-
const imageAnalysisFallbackHookReady = (0, hooks_1.prepareImageAnalysisFallbackHook)();
|
|
704
|
-
(0, image_analyzer_profile_hook_injector_1.ensureProfileHooks)({
|
|
705
|
-
profileName: profileInfo.name,
|
|
706
|
-
profileType: profileInfo.type,
|
|
707
|
-
cliproxyProvider: provider,
|
|
708
|
-
isComposite: profileInfo.isComposite,
|
|
709
|
-
settingsPath: expandedCliproxySettingsPath,
|
|
710
|
-
sharedHookInstalled: imageAnalysisFallbackHookReady,
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
const customSettingsPath = profileInfo.settingsPath; // undefined for hardcoded profiles
|
|
715
|
-
const variantPort = profileInfo.port; // variant-specific port for isolation
|
|
716
|
-
const cliproxyPort = variantPort || port_manager_1.CLIPROXY_DEFAULT_PORT;
|
|
717
|
-
if (resolvedTarget !== 'claude') {
|
|
718
|
-
const adapter = targetAdapter;
|
|
719
|
-
if (!adapter) {
|
|
720
|
-
console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
|
|
721
|
-
process.exitCode = 1;
|
|
722
|
-
return;
|
|
723
|
-
}
|
|
724
|
-
if (!adapter.supportsProfileType('cliproxy')) {
|
|
725
|
-
console.error((0, ui_1.fail)(`${adapter.displayName} does not support CLIProxy profiles`));
|
|
726
|
-
process.exitCode = 1;
|
|
727
|
-
return;
|
|
728
|
-
}
|
|
729
|
-
// Keep CLIProxy management/auth flags on Claude flow only.
|
|
730
|
-
const unsupportedCliproxyFlags = [
|
|
731
|
-
'--auth',
|
|
732
|
-
'--logout',
|
|
733
|
-
'--accounts',
|
|
734
|
-
'--add',
|
|
735
|
-
'--use',
|
|
736
|
-
'--config',
|
|
737
|
-
'--headless',
|
|
738
|
-
'--paste-callback',
|
|
739
|
-
'--port-forward',
|
|
740
|
-
'--nickname',
|
|
741
|
-
'--kiro-auth-method',
|
|
742
|
-
'--kiro-idc-start-url',
|
|
743
|
-
'--kiro-idc-region',
|
|
744
|
-
'--kiro-idc-flow',
|
|
745
|
-
'--backend',
|
|
746
|
-
'--proxy-host',
|
|
747
|
-
'--proxy-port',
|
|
748
|
-
'--proxy-protocol',
|
|
749
|
-
'--proxy-auth-token',
|
|
750
|
-
'--proxy-timeout',
|
|
751
|
-
'--local-proxy',
|
|
752
|
-
'--remote-only',
|
|
753
|
-
'--no-fallback',
|
|
754
|
-
'--allow-self-signed',
|
|
755
|
-
'--1m',
|
|
756
|
-
'--no-1m',
|
|
757
|
-
];
|
|
758
|
-
const providedUnsupportedFlag = unsupportedCliproxyFlags.find((flag) => targetRemainingArgs.includes(flag) ||
|
|
759
|
-
targetRemainingArgs.some((arg) => arg.startsWith(`${flag}=`)));
|
|
760
|
-
if (providedUnsupportedFlag) {
|
|
761
|
-
console.error((0, ui_1.fail)(`${providedUnsupportedFlag} is only supported when running CLIProxy profiles on Claude target`));
|
|
762
|
-
console.error((0, ui_1.info)(`Run with Claude target: ccs ${profileInfo.name} --target claude ...`));
|
|
763
|
-
process.exitCode = 1;
|
|
764
|
-
return;
|
|
765
|
-
}
|
|
766
|
-
// For Droid execution path, require existing OAuth auth and running local proxy.
|
|
767
|
-
if (profileInfo.isComposite && profileInfo.compositeTiers) {
|
|
768
|
-
const compositeProviders = [
|
|
769
|
-
...new Set(Object.values(profileInfo.compositeTiers).map((tier) => tier.provider)),
|
|
770
|
-
];
|
|
771
|
-
const missingProvider = compositeProviders.find((p) => !(0, cliproxy_1.isAuthenticated)(p));
|
|
772
|
-
if (missingProvider) {
|
|
773
|
-
console.error((0, ui_1.fail)(`Missing OAuth auth for composite tier provider: ${missingProvider}`));
|
|
774
|
-
console.error((0, ui_1.info)(`Authenticate first: ccs ${missingProvider} --auth`));
|
|
775
|
-
process.exitCode = 1;
|
|
776
|
-
return;
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
else if (!(0, cliproxy_1.isAuthenticated)(provider)) {
|
|
780
|
-
console.error((0, ui_1.fail)(`No OAuth authentication found for provider: ${provider}`));
|
|
781
|
-
console.error((0, ui_1.info)(`Authenticate first: ccs ${provider} --auth`));
|
|
782
|
-
process.exitCode = 1;
|
|
783
|
-
return;
|
|
784
|
-
}
|
|
785
|
-
const ensureServiceResult = await (0, cliproxy_1.ensureCliproxyService)(cliproxyPort, targetRemainingArgs.includes('--verbose') || targetRemainingArgs.includes('-v'));
|
|
786
|
-
if (!ensureServiceResult.started) {
|
|
787
|
-
console.error((0, ui_1.fail)(ensureServiceResult.error || 'Failed to start local CLIProxy service'));
|
|
788
|
-
process.exitCode = 1;
|
|
789
|
-
return;
|
|
790
|
-
}
|
|
791
|
-
const envVars = profileInfo.isComposite && profileInfo.compositeTiers && profileInfo.compositeDefaultTier
|
|
792
|
-
? (0, env_builder_1.getCompositeEnvVars)(profileInfo.compositeTiers, profileInfo.compositeDefaultTier, cliproxyPort, customSettingsPath)
|
|
793
|
-
: (0, env_builder_1.getEffectiveEnvVars)(provider, cliproxyPort, customSettingsPath);
|
|
794
|
-
const creds = {
|
|
795
|
-
profile: profileInfo.name,
|
|
796
|
-
baseUrl: envVars['ANTHROPIC_BASE_URL'] || '',
|
|
797
|
-
apiKey: envVars['ANTHROPIC_AUTH_TOKEN'] || '',
|
|
798
|
-
model: envVars['ANTHROPIC_MODEL'] || undefined,
|
|
799
|
-
provider: (0, targets_1.resolveDroidProvider)({
|
|
800
|
-
provider: envVars['CCS_DROID_PROVIDER'] || envVars['DROID_PROVIDER'],
|
|
801
|
-
baseUrl: envVars['ANTHROPIC_BASE_URL'],
|
|
802
|
-
model: envVars['ANTHROPIC_MODEL'],
|
|
803
|
-
}),
|
|
804
|
-
reasoningOverride: runtimeReasoningOverride,
|
|
805
|
-
runtimeConfigOverrides: codexRuntimeConfigOverrides,
|
|
806
|
-
envVars,
|
|
807
|
-
};
|
|
808
|
-
if (!creds.baseUrl || !creds.apiKey) {
|
|
809
|
-
console.error((0, ui_1.fail)(`Missing CLIProxy runtime credentials for ${profileInfo.name} (ANTHROPIC_BASE_URL/AUTH_TOKEN)`));
|
|
810
|
-
console.error((0, ui_1.info)('Reconfigure with: ccs config > CLIProxy, or run ccs <provider> --config'));
|
|
811
|
-
process.exitCode = 1;
|
|
812
|
-
return;
|
|
813
|
-
}
|
|
814
|
-
await adapter.prepareCredentials(creds);
|
|
815
|
-
const targetArgs = adapter.buildArgs(profileInfo.name, targetRemainingArgs, {
|
|
816
|
-
creds,
|
|
817
|
-
profileType: profileInfo.type,
|
|
818
|
-
binaryInfo: targetBinaryInfo || undefined,
|
|
819
|
-
});
|
|
820
|
-
const targetEnv = adapter.buildEnv(creds, profileInfo.type);
|
|
821
|
-
adapter.exec(targetArgs, targetEnv, { binaryInfo: targetBinaryInfo || undefined });
|
|
822
|
-
return;
|
|
823
|
-
}
|
|
824
|
-
await (0, cliproxy_1.execClaudeWithCLIProxy)(claudeCli, provider, remainingArgs, {
|
|
825
|
-
customSettingsPath,
|
|
826
|
-
port: cliproxyPort,
|
|
827
|
-
isComposite: profileInfo.isComposite,
|
|
828
|
-
compositeTiers: profileInfo.compositeTiers,
|
|
829
|
-
compositeDefaultTier: profileInfo.compositeDefaultTier,
|
|
830
|
-
profileName: profileInfo.name,
|
|
831
|
-
});
|
|
832
|
-
}
|
|
833
|
-
else if (profileInfo.type === 'copilot') {
|
|
834
|
-
// COPILOT FLOW: GitHub Copilot subscription via copilot-api proxy
|
|
835
|
-
(0, websearch_manager_1.ensureWebSearchMcpOrThrow)();
|
|
836
|
-
const imageAnalysisMcpReady = (0, image_analysis_1.ensureImageAnalysisMcpOrThrow)();
|
|
837
|
-
if (resolvedTarget === 'claude') {
|
|
838
|
-
if (imageAnalysisMcpReady) {
|
|
839
|
-
(0, image_analyzer_profile_hook_injector_1.removeImageAnalysisProfileHook)(profileInfo.name);
|
|
840
|
-
}
|
|
841
|
-
else {
|
|
842
|
-
const imageAnalysisFallbackHookReady = (0, hooks_1.prepareImageAnalysisFallbackHook)();
|
|
843
|
-
(0, image_analyzer_profile_hook_injector_1.ensureProfileHooks)({
|
|
844
|
-
profileName: profileInfo.name,
|
|
845
|
-
profileType: profileInfo.type,
|
|
846
|
-
sharedHookInstalled: imageAnalysisFallbackHookReady,
|
|
847
|
-
});
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
const { executeCopilotProfile } = await Promise.resolve().then(() => __importStar(require('./copilot')));
|
|
851
|
-
const copilotConfig = profileInfo.copilotConfig;
|
|
852
|
-
if (!copilotConfig) {
|
|
853
|
-
console.error((0, ui_1.fail)('Copilot configuration not found'));
|
|
854
|
-
process.exit(1);
|
|
855
|
-
}
|
|
856
|
-
const continuityInheritance = await resolveProfileContinuityInheritance({
|
|
857
|
-
profileName: profileInfo.name,
|
|
858
|
-
profileType: profileInfo.type,
|
|
859
|
-
target: resolvedTarget,
|
|
860
|
-
});
|
|
861
|
-
if (continuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
|
|
862
|
-
console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${continuityInheritance.sourceAccount}"`));
|
|
863
|
-
}
|
|
864
|
-
const exitCode = await executeCopilotProfile(copilotConfig, remainingArgs, continuityInheritance.claudeConfigDir, claudeCli);
|
|
865
|
-
process.exit(exitCode);
|
|
866
|
-
}
|
|
867
|
-
else if (profileInfo.type === 'cursor') {
|
|
868
|
-
// CURSOR FLOW: local Cursor daemon profile
|
|
869
|
-
(0, websearch_manager_1.ensureWebSearchMcpOrThrow)();
|
|
870
|
-
(0, hooks_1.installImageAnalyzerHook)();
|
|
871
|
-
(0, image_analyzer_profile_hook_injector_1.ensureProfileHooks)({
|
|
872
|
-
profileName: profileInfo.name,
|
|
873
|
-
profileType: profileInfo.type,
|
|
874
|
-
});
|
|
875
|
-
const { executeCursorProfile } = await Promise.resolve().then(() => __importStar(require('./cursor')));
|
|
876
|
-
const cursorConfig = profileInfo.cursorConfig;
|
|
877
|
-
if (!cursorConfig) {
|
|
878
|
-
console.error((0, ui_1.fail)('Cursor configuration not found'));
|
|
879
|
-
process.exit(1);
|
|
880
|
-
}
|
|
881
|
-
const continuityInheritance = await resolveProfileContinuityInheritance({
|
|
882
|
-
profileName: profileInfo.name,
|
|
883
|
-
profileType: profileInfo.type,
|
|
884
|
-
target: resolvedTarget,
|
|
885
|
-
});
|
|
886
|
-
if (continuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
|
|
887
|
-
console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${continuityInheritance.sourceAccount}"`));
|
|
888
|
-
}
|
|
889
|
-
const exitCode = await executeCursorProfile(cursorConfig, remainingArgs, continuityInheritance.claudeConfigDir, claudeCli);
|
|
890
|
-
process.exit(exitCode);
|
|
891
|
-
}
|
|
892
|
-
else if (profileInfo.type === 'settings') {
|
|
893
|
-
// Settings-based profiles (glm, glmt) are third-party providers
|
|
894
|
-
const imageAnalysisMcpReady = resolvedTarget === 'claude' ? (0, image_analysis_1.ensureImageAnalysisMcpOrThrow)() : true;
|
|
895
|
-
const browserAttachRuntime = resolvedTarget === 'claude' &&
|
|
896
|
-
claudeBrowserExposure?.exposeForLaunch &&
|
|
897
|
-
claudeAttachConfig?.enabled
|
|
898
|
-
? await (0, browser_1.resolveOptionalBrowserAttachRuntime)(claudeAttachConfig)
|
|
899
|
-
: undefined;
|
|
900
|
-
const browserRuntimeEnv = browserAttachRuntime?.runtimeEnv;
|
|
901
|
-
if (browserAttachRuntime?.warning) {
|
|
902
|
-
process.stderr.write(`${(0, ui_1.warn)(browserAttachRuntime.warning)}\n`);
|
|
903
|
-
}
|
|
904
|
-
if (resolvedTarget === 'claude') {
|
|
905
|
-
(0, websearch_manager_1.ensureWebSearchMcpOrThrow)();
|
|
906
|
-
if (browserRuntimeEnv) {
|
|
907
|
-
(0, browser_1.ensureBrowserMcpOrThrow)();
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
// Display WebSearch status (single line, equilibrium UX)
|
|
911
|
-
(0, websearch_manager_1.displayWebSearchStatus)();
|
|
912
|
-
const continuityInheritance = resolvedTarget === 'claude'
|
|
913
|
-
? await resolveProfileContinuityInheritance({
|
|
914
|
-
profileName: profileInfo.name,
|
|
915
|
-
profileType: profileInfo.type,
|
|
916
|
-
target: resolvedTarget,
|
|
917
|
-
})
|
|
918
|
-
: {};
|
|
919
|
-
if (continuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
|
|
920
|
-
console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${continuityInheritance.sourceAccount}"`));
|
|
921
|
-
}
|
|
922
|
-
const inheritedClaudeConfigDir = continuityInheritance.claudeConfigDir;
|
|
923
|
-
(0, websearch_manager_1.syncWebSearchMcpToConfigDir)(inheritedClaudeConfigDir);
|
|
924
|
-
(0, image_analysis_1.syncImageAnalysisMcpToConfigDir)(inheritedClaudeConfigDir);
|
|
925
|
-
if (browserRuntimeEnv &&
|
|
926
|
-
inheritedClaudeConfigDir &&
|
|
927
|
-
!(0, browser_1.syncBrowserMcpToConfigDir)(inheritedClaudeConfigDir)) {
|
|
928
|
-
throw new Error('Browser MCP is enabled, but CCS could not sync the browser MCP config into the inherited Claude instance.');
|
|
929
|
-
}
|
|
930
|
-
const expandedSettingsPath = resolvedSettingsPath ??
|
|
931
|
-
(profileInfo.settingsPath
|
|
932
|
-
? (0, helpers_1.expandPath)(profileInfo.settingsPath)
|
|
933
|
-
: (0, config_manager_1.getSettingsPath)(profileInfo.name));
|
|
934
|
-
const settings = resolvedSettings ?? (0, config_manager_1.loadSettings)(expandedSettingsPath);
|
|
935
|
-
const cliproxyBridge = resolvedCliproxyBridge ?? (0, cliproxy_profile_bridge_1.resolveCliproxyBridgeMetadata)(settings);
|
|
936
|
-
let imageAnalysisFallbackHookReady;
|
|
937
|
-
if (resolvedTarget === 'claude') {
|
|
938
|
-
if (imageAnalysisMcpReady) {
|
|
939
|
-
(0, image_analyzer_profile_hook_injector_1.removeImageAnalysisProfileHook)(profileInfo.name, expandedSettingsPath);
|
|
940
|
-
}
|
|
941
|
-
else {
|
|
942
|
-
imageAnalysisFallbackHookReady = (0, hooks_1.prepareImageAnalysisFallbackHook)();
|
|
943
|
-
(0, image_analyzer_profile_hook_injector_1.ensureProfileHooks)({
|
|
944
|
-
profileName: profileInfo.name,
|
|
945
|
-
profileType: profileInfo.type,
|
|
946
|
-
settingsPath: expandedSettingsPath,
|
|
947
|
-
settings,
|
|
948
|
-
cliproxyBridge,
|
|
949
|
-
sharedHookInstalled: imageAnalysisFallbackHookReady,
|
|
950
|
-
});
|
|
951
|
-
}
|
|
952
|
-
}
|
|
953
|
-
if (resolvedTarget !== 'claude') {
|
|
954
|
-
const compatibility = (0, targets_1.evaluateTargetRuntimeCompatibility)({
|
|
955
|
-
target: resolvedTarget,
|
|
956
|
-
profileType: profileInfo.type,
|
|
957
|
-
cliproxyBridgeProvider: cliproxyBridge?.provider ?? null,
|
|
958
|
-
});
|
|
959
|
-
if (!compatibility.supported) {
|
|
960
|
-
console.error((0, ui_1.fail)(compatibility.reason ||
|
|
961
|
-
`${targetAdapter?.displayName || resolvedTarget} does not support this profile.`));
|
|
962
|
-
if (compatibility.suggestion) {
|
|
963
|
-
console.error((0, ui_1.info)(compatibility.suggestion));
|
|
964
|
-
}
|
|
965
|
-
process.exit(1);
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
|
-
const rawSettingsEnv = profileInfo.env ?? settings.env ?? {};
|
|
969
|
-
const isDeprecatedGlmtProfile = (0, glmt_deprecation_1.isDeprecatedGlmtProfileName)(profileInfo.name);
|
|
970
|
-
const glmtNormalization = isDeprecatedGlmtProfile
|
|
971
|
-
? (0, glmt_deprecation_1.normalizeDeprecatedGlmtEnv)(rawSettingsEnv)
|
|
972
|
-
: null;
|
|
973
|
-
const settingsEnv = glmtNormalization?.env ?? rawSettingsEnv;
|
|
974
|
-
if (glmtNormalization) {
|
|
975
|
-
for (const message of glmtNormalization.warnings) {
|
|
976
|
-
console.error((0, ui_1.warn)(message));
|
|
977
|
-
}
|
|
978
|
-
}
|
|
979
|
-
// Pre-flight validation for Z.AI-compatible profiles.
|
|
980
|
-
if (profileInfo.name === 'glm' || isDeprecatedGlmtProfile) {
|
|
981
|
-
const apiKey = settingsEnv['ANTHROPIC_AUTH_TOKEN'];
|
|
982
|
-
if (apiKey) {
|
|
983
|
-
const validation = await (0, api_key_validator_1.validateGlmKey)(apiKey, settingsEnv['ANTHROPIC_BASE_URL']);
|
|
984
|
-
if (!validation.valid) {
|
|
985
|
-
console.error('');
|
|
986
|
-
console.error((0, ui_1.fail)(validation.error || 'API key validation failed'));
|
|
987
|
-
if (validation.suggestion) {
|
|
988
|
-
console.error('');
|
|
989
|
-
console.error(validation.suggestion);
|
|
990
|
-
}
|
|
991
|
-
console.error('');
|
|
992
|
-
console.error((0, ui_1.info)('To skip validation: CCS_SKIP_PREFLIGHT=1 ccs glm "prompt"'));
|
|
993
|
-
process.exit(1);
|
|
994
|
-
}
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
if (profileInfo.name === 'mm') {
|
|
998
|
-
const apiKey = settingsEnv['ANTHROPIC_AUTH_TOKEN'];
|
|
999
|
-
if (apiKey) {
|
|
1000
|
-
const validation = await (0, api_key_validator_1.validateMiniMaxKey)(apiKey, settingsEnv['ANTHROPIC_BASE_URL']);
|
|
1001
|
-
if (!validation.valid) {
|
|
1002
|
-
console.error('');
|
|
1003
|
-
console.error((0, ui_1.fail)(validation.error || 'API key validation failed'));
|
|
1004
|
-
if (validation.suggestion) {
|
|
1005
|
-
console.error('');
|
|
1006
|
-
console.error(validation.suggestion);
|
|
1007
|
-
}
|
|
1008
|
-
console.error('');
|
|
1009
|
-
console.error((0, ui_1.info)('To skip validation: CCS_SKIP_PREFLIGHT=1 ccs mm "prompt"'));
|
|
1010
|
-
process.exit(1);
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
// Pre-flight validation for Anthropic direct profiles (ANTHROPIC_API_KEY + no BASE_URL)
|
|
1015
|
-
{
|
|
1016
|
-
const anthropicApiKey = settingsEnv['ANTHROPIC_API_KEY'];
|
|
1017
|
-
const hasBaseUrl = !!settingsEnv['ANTHROPIC_BASE_URL'];
|
|
1018
|
-
if (anthropicApiKey && !hasBaseUrl) {
|
|
1019
|
-
const validation = await (0, api_key_validator_1.validateAnthropicKey)(anthropicApiKey);
|
|
1020
|
-
if (!validation.valid) {
|
|
1021
|
-
console.error('');
|
|
1022
|
-
console.error((0, ui_1.fail)(validation.error || 'API key validation failed'));
|
|
1023
|
-
if (validation.suggestion) {
|
|
1024
|
-
console.error('');
|
|
1025
|
-
console.error(validation.suggestion);
|
|
1026
|
-
}
|
|
1027
|
-
console.error('');
|
|
1028
|
-
console.error((0, ui_1.info)(`To skip validation: CCS_SKIP_PREFLIGHT=1 ccs ${profileInfo.name} "prompt"`));
|
|
1029
|
-
process.exit(1);
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
}
|
|
1033
|
-
const webSearchEnv = (0, websearch_manager_1.getWebSearchHookEnv)();
|
|
1034
|
-
const imageAnalysisStatus = await (0, hooks_1.resolveImageAnalysisRuntimeStatus)({
|
|
1035
|
-
profileName: profileInfo.name,
|
|
1036
|
-
profileType: profileInfo.type,
|
|
1037
|
-
settings,
|
|
1038
|
-
cliproxyBridge,
|
|
1039
|
-
sharedHookInstalled: imageAnalysisFallbackHookReady,
|
|
1040
|
-
});
|
|
1041
|
-
const runtimeConnection = (0, hooks_1.resolveImageAnalysisRuntimeConnection)();
|
|
1042
|
-
let imageAnalysisEnv = (0, hooks_1.getImageAnalysisHookEnv)({
|
|
1043
|
-
profileName: profileInfo.name,
|
|
1044
|
-
profileType: profileInfo.type,
|
|
1045
|
-
settings,
|
|
1046
|
-
cliproxyBridge,
|
|
1047
|
-
});
|
|
1048
|
-
imageAnalysisEnv = (0, hooks_1.applyImageAnalysisRuntimeOverrides)(imageAnalysisEnv, {
|
|
1049
|
-
backendId: imageAnalysisStatus.backendId,
|
|
1050
|
-
model: imageAnalysisStatus.model,
|
|
1051
|
-
runtimePath: imageAnalysisStatus.runtimePath,
|
|
1052
|
-
baseUrl: runtimeConnection.baseUrl,
|
|
1053
|
-
apiKey: runtimeConnection.apiKey,
|
|
1054
|
-
allowSelfSigned: runtimeConnection.allowSelfSigned,
|
|
1055
|
-
});
|
|
1056
|
-
imageAnalysisEnv = {
|
|
1057
|
-
...imageAnalysisEnv,
|
|
1058
|
-
CCS_IMAGE_ANALYSIS_SKIP_HOOK: resolvedTarget === 'claude' && imageAnalysisMcpReady ? '1' : '0',
|
|
1059
|
-
};
|
|
1060
|
-
const imageAnalysisProvider = imageAnalysisEnv['CCS_CURRENT_PROVIDER'];
|
|
1061
|
-
if (resolvedTarget === 'claude' &&
|
|
1062
|
-
imageAnalysisEnv['CCS_IMAGE_ANALYSIS_SKIP'] !== '1' &&
|
|
1063
|
-
imageAnalysisProvider) {
|
|
1064
|
-
const verboseProxyLaunch = remainingArgs.includes('--verbose') ||
|
|
1065
|
-
remainingArgs.includes('-v') ||
|
|
1066
|
-
targetRemainingArgs.includes('--verbose') ||
|
|
1067
|
-
targetRemainingArgs.includes('-v');
|
|
1068
|
-
if (imageAnalysisStatus.effectiveRuntimeMode === 'native-read') {
|
|
1069
|
-
console.error((0, ui_1.info)(`${imageAnalysisStatus.effectiveRuntimeReason || `Image analysis via ${imageAnalysisProvider} is unavailable.`} This session will use native Read.`));
|
|
1070
|
-
imageAnalysisEnv = {
|
|
1071
|
-
...imageAnalysisEnv,
|
|
1072
|
-
CCS_CURRENT_PROVIDER: '',
|
|
1073
|
-
CCS_IMAGE_ANALYSIS_SKIP: '1',
|
|
1074
|
-
CCS_IMAGE_ANALYSIS_RUNTIME_PATH: '',
|
|
1075
|
-
CCS_IMAGE_ANALYSIS_RUNTIME_BASE_URL: '',
|
|
1076
|
-
CCS_IMAGE_ANALYSIS_RUNTIME_API_KEY: '',
|
|
1077
|
-
CCS_IMAGE_ANALYSIS_RUNTIME_ALLOW_SELF_SIGNED: '0',
|
|
1078
|
-
};
|
|
1079
|
-
}
|
|
1080
|
-
else if (imageAnalysisStatus.proxyReadiness === 'stopped') {
|
|
1081
|
-
const ensureServiceResult = await (0, cliproxy_1.ensureCliproxyService)(port_manager_1.CLIPROXY_DEFAULT_PORT, verboseProxyLaunch);
|
|
1082
|
-
if (!ensureServiceResult.started) {
|
|
1083
|
-
console.error((0, ui_1.warn)(`Image analysis via ${imageAnalysisProvider} is unavailable because CCS could not start the local CLIProxy service. This session will use native Read.`));
|
|
1084
|
-
imageAnalysisEnv = {
|
|
1085
|
-
...imageAnalysisEnv,
|
|
1086
|
-
CCS_CURRENT_PROVIDER: '',
|
|
1087
|
-
CCS_IMAGE_ANALYSIS_SKIP: '1',
|
|
1088
|
-
};
|
|
1089
|
-
}
|
|
1090
|
-
}
|
|
1091
|
-
}
|
|
1092
|
-
// Get global env vars (DISABLE_TELEMETRY, etc.) for third-party profiles
|
|
1093
|
-
const globalEnvConfig = (0, unified_config_loader_1.getGlobalEnvConfig)();
|
|
1094
|
-
const globalEnv = globalEnvConfig.enabled ? globalEnvConfig.env : {};
|
|
1095
|
-
// Log global env injection for visibility (debug mode only)
|
|
1096
|
-
if (globalEnvConfig.enabled && Object.keys(globalEnv).length > 0 && process.env.CCS_DEBUG) {
|
|
1097
|
-
const envNames = Object.keys(globalEnv).join(', ');
|
|
1098
|
-
console.error((0, ui_1.info)(`Global env: ${envNames}`));
|
|
1099
|
-
}
|
|
1100
|
-
// For Claude target launches that already pass `--settings`, keep runtime
|
|
1101
|
-
// env free of ANTHROPIC routing/auth while preserving non-routing profile
|
|
1102
|
-
// env so nested Team/subagent sessions can still inherit model intent and
|
|
1103
|
-
// other profile-scoped runtime flags.
|
|
1104
|
-
const settingsRuntimeEnv = (0, shell_executor_1.stripBrowserEnv)({ ...globalEnv, ...settingsEnv });
|
|
1105
|
-
const claudeRuntimeEnvVars = {
|
|
1106
|
-
...(0, shell_executor_1.stripAnthropicRoutingEnv)(settingsRuntimeEnv),
|
|
1107
|
-
...(inheritedClaudeConfigDir ? { CLAUDE_CONFIG_DIR: inheritedClaudeConfigDir } : {}),
|
|
1108
|
-
...webSearchEnv,
|
|
1109
|
-
...imageAnalysisEnv,
|
|
1110
|
-
...(browserRuntimeEnv || {}),
|
|
1111
|
-
CCS_PROFILE_TYPE: 'settings',
|
|
1112
|
-
CCS_STRIP_INHERITED_ANTHROPIC_ENV: '1',
|
|
1113
|
-
};
|
|
1114
|
-
// Non-Claude targets still need effective credentials injected directly.
|
|
1115
|
-
const envVars = {
|
|
1116
|
-
...settingsRuntimeEnv,
|
|
1117
|
-
...(inheritedClaudeConfigDir ? { CLAUDE_CONFIG_DIR: inheritedClaudeConfigDir } : {}),
|
|
1118
|
-
...webSearchEnv,
|
|
1119
|
-
...imageAnalysisEnv,
|
|
1120
|
-
...(browserRuntimeEnv || {}),
|
|
1121
|
-
CCS_PROFILE_TYPE: 'settings',
|
|
1122
|
-
};
|
|
1123
|
-
// Dispatch through target adapter for non-claude targets
|
|
1124
|
-
if (resolvedTarget !== 'claude') {
|
|
1125
|
-
const adapter = targetAdapter;
|
|
1126
|
-
if (!adapter) {
|
|
1127
|
-
console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
|
|
1128
|
-
process.exit(1);
|
|
1129
|
-
}
|
|
1130
|
-
const directAnthropicBaseUrl = settingsEnv['ANTHROPIC_BASE_URL'] ||
|
|
1131
|
-
(settingsEnv['ANTHROPIC_API_KEY'] ? 'https://api.anthropic.com' : '');
|
|
1132
|
-
const creds = {
|
|
1133
|
-
profile: profileInfo.name,
|
|
1134
|
-
baseUrl: directAnthropicBaseUrl,
|
|
1135
|
-
apiKey: settingsEnv['ANTHROPIC_AUTH_TOKEN'] || settingsEnv['ANTHROPIC_API_KEY'] || '',
|
|
1136
|
-
model: settingsEnv['ANTHROPIC_MODEL'],
|
|
1137
|
-
provider: (0, targets_1.resolveDroidProvider)({
|
|
1138
|
-
provider: settingsEnv['CCS_DROID_PROVIDER'] || settingsEnv['DROID_PROVIDER'],
|
|
1139
|
-
baseUrl: directAnthropicBaseUrl,
|
|
1140
|
-
model: settingsEnv['ANTHROPIC_MODEL'],
|
|
1141
|
-
}),
|
|
1142
|
-
reasoningOverride: runtimeReasoningOverride,
|
|
1143
|
-
runtimeConfigOverrides: codexRuntimeConfigOverrides,
|
|
1144
|
-
envVars,
|
|
1145
|
-
};
|
|
1146
|
-
await adapter.prepareCredentials(creds);
|
|
1147
|
-
const targetArgs = adapter.buildArgs(profileInfo.name, targetRemainingArgs, {
|
|
1148
|
-
creds,
|
|
1149
|
-
profileType: profileInfo.type,
|
|
1150
|
-
binaryInfo: targetBinaryInfo || undefined,
|
|
1151
|
-
});
|
|
1152
|
-
const targetEnv = adapter.buildEnv(creds, profileInfo.type);
|
|
1153
|
-
adapter.exec(targetArgs, targetEnv, { binaryInfo: targetBinaryInfo || undefined });
|
|
1154
|
-
return;
|
|
1155
|
-
}
|
|
1156
|
-
const imageAnalysisArgs = imageAnalysisMcpReady
|
|
1157
|
-
? (0, image_analysis_1.appendThirdPartyImageAnalysisToolArgs)(nativeClaudeRemainingArgs)
|
|
1158
|
-
: nativeClaudeRemainingArgs;
|
|
1159
|
-
const browserArgs = browserRuntimeEnv
|
|
1160
|
-
? (0, browser_1.appendBrowserToolArgs)(imageAnalysisArgs)
|
|
1161
|
-
: imageAnalysisArgs;
|
|
1162
|
-
const openAICompatProfile = (0, proxy_1.resolveOpenAICompatProfileConfig)(profileInfo.name, expandedSettingsPath, settingsEnv);
|
|
1163
|
-
if (openAICompatProfile) {
|
|
1164
|
-
const proxyStart = await (0, proxy_1.startOpenAICompatProxy)(openAICompatProfile, {
|
|
1165
|
-
insecure: openAICompatProfile.insecure,
|
|
1166
|
-
});
|
|
1167
|
-
if (!proxyStart.success) {
|
|
1168
|
-
console.error((0, ui_1.fail)(proxyStart.error || 'Failed to start local OpenAI-compatible proxy'));
|
|
1169
|
-
process.exit(1);
|
|
1170
|
-
}
|
|
1171
|
-
console.error((0, ui_1.info)(`Using local OpenAI-compatible proxy for "${profileInfo.name}" on port ${proxyStart.port}`));
|
|
1172
|
-
const proxyEnv = {
|
|
1173
|
-
...envVars,
|
|
1174
|
-
...(0, proxy_1.buildOpenAICompatProxyEnv)(openAICompatProfile, proxyStart.port, proxyStart.authToken || '', inheritedClaudeConfigDir),
|
|
1175
|
-
};
|
|
1176
|
-
delete proxyEnv.ANTHROPIC_API_KEY;
|
|
1177
|
-
const launchSettings = (0, openai_compat_launch_settings_1.createOpenAICompatLaunchSettings)(expandedSettingsPath, settings);
|
|
1178
|
-
const launchArgs = [
|
|
1179
|
-
'--settings',
|
|
1180
|
-
launchSettings.settingsPath,
|
|
1181
|
-
...(0, websearch_manager_1.appendThirdPartyWebSearchToolArgs)(browserArgs),
|
|
1182
|
-
];
|
|
1183
|
-
const traceEnv = (0, websearch_manager_1.createWebSearchTraceContext)({
|
|
1184
|
-
launcher: 'ccs.settings-profile.proxy',
|
|
1185
|
-
args: launchArgs,
|
|
1186
|
-
profile: profileInfo.name,
|
|
1187
|
-
profileType: profileInfo.type,
|
|
1188
|
-
settingsPath: expandedSettingsPath,
|
|
1189
|
-
});
|
|
1190
|
-
(0, shell_executor_1.execClaude)(claudeCli, launchArgs, { ...proxyEnv, ...traceEnv }, launchSettings.cleanup);
|
|
1191
|
-
return;
|
|
1192
|
-
}
|
|
1193
|
-
const launchArgs = [
|
|
1194
|
-
'--settings',
|
|
1195
|
-
expandedSettingsPath,
|
|
1196
|
-
...(0, websearch_manager_1.appendThirdPartyWebSearchToolArgs)(browserArgs),
|
|
1197
|
-
];
|
|
1198
|
-
const traceEnv = (0, websearch_manager_1.createWebSearchTraceContext)({
|
|
1199
|
-
launcher: 'ccs.settings-profile',
|
|
1200
|
-
args: launchArgs,
|
|
1201
|
-
profile: profileInfo.name,
|
|
1202
|
-
profileType: profileInfo.type,
|
|
1203
|
-
settingsPath: expandedSettingsPath,
|
|
1204
|
-
});
|
|
1205
|
-
(0, shell_executor_1.execClaude)(claudeCli, launchArgs, { ...claudeRuntimeEnvVars, ...traceEnv });
|
|
1206
|
-
}
|
|
1207
|
-
else if (profileInfo.type === 'account') {
|
|
1208
|
-
// NEW FLOW: Account-based profile (work, personal)
|
|
1209
|
-
// All platforms: Use instance isolation with CLAUDE_CONFIG_DIR
|
|
1210
|
-
const registry = new ProfileRegistry();
|
|
1211
|
-
const instanceMgr = new InstanceManager();
|
|
1212
|
-
const accountMetadata = isAccountContextMetadata(profileInfo.profile)
|
|
1213
|
-
? profileInfo.profile
|
|
1214
|
-
: undefined;
|
|
1215
|
-
const isBareProfile = typeof profileInfo.profile === 'object' &&
|
|
1216
|
-
profileInfo.profile !== null &&
|
|
1217
|
-
profileInfo.profile.bare === true;
|
|
1218
|
-
const contextPolicy = resolveAccountContextPolicy(accountMetadata);
|
|
1219
|
-
// Ensure instance exists (lazy init if needed)
|
|
1220
|
-
const instancePath = await instanceMgr.ensureInstance(profileInfo.name, contextPolicy, {
|
|
1221
|
-
bare: isBareProfile,
|
|
1222
|
-
});
|
|
1223
|
-
// Update last_used timestamp (check unified config first, fallback to legacy)
|
|
1224
|
-
if (registry.hasAccountUnified(profileInfo.name)) {
|
|
1225
|
-
registry.touchAccountUnified(profileInfo.name);
|
|
1226
|
-
}
|
|
1227
|
-
else {
|
|
1228
|
-
registry.touchProfile(profileInfo.name);
|
|
1229
|
-
}
|
|
1230
|
-
// Execute Claude with instance isolation
|
|
1231
|
-
// Skip WebSearch hook - account profiles use native server-side WebSearch
|
|
1232
|
-
// Skip Image Analyzer hook - account profiles have native vision support
|
|
1233
|
-
const envVars = {
|
|
1234
|
-
CLAUDE_CONFIG_DIR: instancePath,
|
|
1235
|
-
CCS_PROFILE_TYPE: 'account',
|
|
1236
|
-
CCS_WEBSEARCH_SKIP: '1',
|
|
1237
|
-
CCS_IMAGE_ANALYSIS_SKIP: '1',
|
|
1238
|
-
};
|
|
1239
|
-
await (0, resume_lane_warning_1.maybeWarnAboutResumeLaneMismatch)(profileInfo.name, instancePath, nativeClaudeRemainingArgs);
|
|
1240
|
-
const launchArgs = resolveNativeClaudeLaunchArgs(nativeClaudeRemainingArgs, 'account', instancePath);
|
|
1241
|
-
(0, shell_executor_1.execClaude)(claudeCli, launchArgs, envVars);
|
|
1242
|
-
}
|
|
1243
|
-
else {
|
|
1244
|
-
// DEFAULT: No profile configured, use Claude's own defaults
|
|
1245
|
-
// Skip WebSearch hook - native Claude has server-side WebSearch
|
|
1246
|
-
// Skip Image Analyzer hook - native Claude has native vision support
|
|
1247
|
-
const envVars = {
|
|
1248
|
-
CCS_PROFILE_TYPE: 'default',
|
|
1249
|
-
CCS_WEBSEARCH_SKIP: '1',
|
|
1250
|
-
CCS_IMAGE_ANALYSIS_SKIP: '1',
|
|
1251
|
-
};
|
|
1252
|
-
const browserAttachRuntime = resolvedTarget === 'claude' &&
|
|
1253
|
-
claudeBrowserExposure?.exposeForLaunch &&
|
|
1254
|
-
claudeAttachConfig?.enabled
|
|
1255
|
-
? await (0, browser_1.resolveOptionalBrowserAttachRuntime)(claudeAttachConfig)
|
|
1256
|
-
: undefined;
|
|
1257
|
-
const browserRuntimeEnv = browserAttachRuntime?.runtimeEnv;
|
|
1258
|
-
if (browserAttachRuntime?.warning) {
|
|
1259
|
-
process.stderr.write(`${(0, ui_1.warn)(browserAttachRuntime.warning)}\n`);
|
|
1260
|
-
}
|
|
1261
|
-
if (resolvedTarget === 'claude') {
|
|
1262
|
-
if (browserRuntimeEnv) {
|
|
1263
|
-
(0, browser_1.ensureBrowserMcpOrThrow)();
|
|
1264
|
-
Object.assign(envVars, browserRuntimeEnv);
|
|
1265
|
-
}
|
|
1266
|
-
const defaultContinuityInheritance = await resolveProfileContinuityInheritance({
|
|
1267
|
-
profileName: profileInfo.name,
|
|
1268
|
-
profileType: profileInfo.type,
|
|
1269
|
-
target: resolvedTarget,
|
|
1270
|
-
});
|
|
1271
|
-
if (defaultContinuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
|
|
1272
|
-
console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${defaultContinuityInheritance.sourceAccount}"`));
|
|
1273
|
-
}
|
|
1274
|
-
if (defaultContinuityInheritance.claudeConfigDir) {
|
|
1275
|
-
envVars.CLAUDE_CONFIG_DIR = defaultContinuityInheritance.claudeConfigDir;
|
|
1276
|
-
if (browserRuntimeEnv &&
|
|
1277
|
-
!(0, browser_1.syncBrowserMcpToConfigDir)(defaultContinuityInheritance.claudeConfigDir)) {
|
|
1278
|
-
throw new Error('Browser MCP is enabled, but CCS could not sync the browser MCP config into the inherited Claude instance.');
|
|
1279
|
-
}
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1282
|
-
// Dispatch through target adapter for non-claude targets
|
|
1283
|
-
if (resolvedTarget !== 'claude') {
|
|
1284
|
-
const adapter = targetAdapter;
|
|
1285
|
-
if (!adapter) {
|
|
1286
|
-
console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
|
|
1287
|
-
process.exit(1);
|
|
1288
|
-
}
|
|
1289
|
-
if (!adapter.supportsProfileType('default')) {
|
|
1290
|
-
console.error((0, ui_1.fail)(`${adapter.displayName} does not support default profile mode`));
|
|
1291
|
-
process.exit(1);
|
|
1292
|
-
}
|
|
1293
|
-
const creds = {
|
|
1294
|
-
profile: 'default',
|
|
1295
|
-
baseUrl: process.env['ANTHROPIC_BASE_URL'] || '',
|
|
1296
|
-
apiKey: process.env['ANTHROPIC_AUTH_TOKEN'] || '',
|
|
1297
|
-
model: process.env['ANTHROPIC_MODEL'],
|
|
1298
|
-
provider: (0, targets_1.resolveDroidProvider)({
|
|
1299
|
-
provider: process.env['CCS_DROID_PROVIDER'] || process.env['DROID_PROVIDER'],
|
|
1300
|
-
baseUrl: process.env['ANTHROPIC_BASE_URL'],
|
|
1301
|
-
model: process.env['ANTHROPIC_MODEL'],
|
|
1302
|
-
}),
|
|
1303
|
-
reasoningOverride: runtimeReasoningOverride,
|
|
1304
|
-
runtimeConfigOverrides: codexRuntimeConfigOverrides,
|
|
1305
|
-
browserRuntimeEnv,
|
|
1306
|
-
};
|
|
1307
|
-
if (resolvedTarget === 'droid' && (!creds.baseUrl || !creds.apiKey)) {
|
|
1308
|
-
console.error((0, ui_1.fail)(`${adapter.displayName} default mode requires ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN`));
|
|
1309
|
-
console.error((0, ui_1.info)('Use a settings-based profile instead: ccs glm --target droid'));
|
|
1310
|
-
process.exit(1);
|
|
1311
|
-
}
|
|
1312
|
-
await adapter.prepareCredentials(creds);
|
|
1313
|
-
const targetArgs = adapter.buildArgs('default', targetRemainingArgs, {
|
|
1314
|
-
creds,
|
|
1315
|
-
profileType: 'default',
|
|
1316
|
-
binaryInfo: targetBinaryInfo || undefined,
|
|
1317
|
-
});
|
|
1318
|
-
const targetEnv = adapter.buildEnv(creds, 'default');
|
|
1319
|
-
adapter.exec(targetArgs, targetEnv, { binaryInfo: targetBinaryInfo || undefined });
|
|
1320
|
-
return;
|
|
1321
|
-
}
|
|
1322
|
-
const launchArgs = resolveNativeClaudeLaunchArgs(browserRuntimeEnv
|
|
1323
|
-
? (0, browser_1.appendBrowserToolArgs)(nativeClaudeRemainingArgs)
|
|
1324
|
-
: nativeClaudeRemainingArgs, 'default', envVars.CLAUDE_CONFIG_DIR);
|
|
1325
|
-
(0, shell_executor_1.execClaude)(claudeCli, launchArgs, envVars);
|
|
1326
|
-
}
|
|
98
|
+
// Phase E: dispatch to per-profile-type flow (all 6 branches now live in flows/)
|
|
99
|
+
await (0, target_executor_1.dispatchProfile)(dispatchCtx);
|
|
1327
100
|
}
|
|
1328
101
|
catch (error) {
|
|
1329
102
|
const err = error;
|