@kaitranntt/ccs 6.7.0 → 6.7.1-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -23
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +24 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/services/index.d.ts +10 -0
- package/dist/api/services/index.d.ts.map +1 -0
- package/dist/api/services/index.js +26 -0
- package/dist/api/services/index.js.map +1 -0
- package/dist/api/services/profile-reader.d.ts +28 -0
- package/dist/api/services/profile-reader.d.ts.map +1 -0
- package/dist/api/services/profile-reader.js +148 -0
- package/dist/api/services/profile-reader.js.map +1 -0
- package/dist/api/services/profile-types.d.ts +42 -0
- package/dist/api/services/profile-types.d.ts.map +1 -0
- package/dist/api/services/profile-types.js +8 -0
- package/dist/api/services/profile-types.js.map +1 -0
- package/dist/api/services/profile-writer.d.ts +6 -0
- package/dist/api/services/profile-writer.d.ts.map +1 -0
- package/dist/api/services/profile-writer.js +176 -0
- package/dist/api/services/profile-writer.js.map +1 -0
- package/dist/api/services/validation-service.d.ts +26 -0
- package/dist/api/services/validation-service.d.ts.map +1 -0
- package/dist/api/services/validation-service.js +77 -0
- package/dist/api/services/validation-service.js.map +1 -0
- package/dist/auth/auth-commands.d.ts +16 -22
- package/dist/auth/auth-commands.d.ts.map +1 -1
- package/dist/auth/auth-commands.js +29 -467
- package/dist/auth/auth-commands.js.map +1 -1
- package/dist/auth/commands/create-command.d.ts +11 -0
- package/dist/auth/commands/create-command.d.ts.map +1 -0
- package/dist/auth/commands/create-command.js +137 -0
- package/dist/auth/commands/create-command.js.map +1 -0
- package/dist/auth/commands/default-command.d.ts +15 -0
- package/dist/auth/commands/default-command.d.ts.map +1 -0
- package/dist/auth/commands/default-command.js +71 -0
- package/dist/auth/commands/default-command.js.map +1 -0
- package/dist/auth/commands/index.d.ts +12 -0
- package/dist/auth/commands/index.d.ts.map +1 -0
- package/dist/auth/commands/index.js +25 -0
- package/dist/auth/commands/index.js.map +1 -0
- package/dist/auth/commands/list-command.d.ts +11 -0
- package/dist/auth/commands/list-command.d.ts.map +1 -0
- package/dist/auth/commands/list-command.js +124 -0
- package/dist/auth/commands/list-command.js.map +1 -0
- package/dist/auth/commands/remove-command.d.ts +11 -0
- package/dist/auth/commands/remove-command.d.ts.map +1 -0
- package/dist/auth/commands/remove-command.js +102 -0
- package/dist/auth/commands/remove-command.js.map +1 -0
- package/dist/auth/commands/show-command.d.ts +11 -0
- package/dist/auth/commands/show-command.d.ts.map +1 -0
- package/dist/auth/commands/show-command.js +103 -0
- package/dist/auth/commands/show-command.js.map +1 -0
- package/dist/auth/commands/types.d.ts +50 -0
- package/dist/auth/commands/types.d.ts.map +1 -0
- package/dist/auth/commands/types.js +26 -0
- package/dist/auth/commands/types.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +16 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/profile-detector.d.ts +0 -5
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +1 -9
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/auth/profile-registry.d.ts +0 -4
- package/dist/auth/profile-registry.d.ts.map +1 -1
- package/dist/auth/profile-registry.js +3 -10
- package/dist/auth/profile-registry.js.map +1 -1
- package/dist/ccs.js +21 -4
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/auth/auth-types.d.ts +85 -0
- package/dist/cliproxy/auth/auth-types.d.ts.map +1 -0
- package/dist/cliproxy/auth/auth-types.js +100 -0
- package/dist/cliproxy/auth/auth-types.js.map +1 -0
- package/dist/cliproxy/auth/environment-detector.d.ts +30 -0
- package/dist/cliproxy/auth/environment-detector.d.ts.map +1 -0
- package/dist/cliproxy/auth/environment-detector.js +124 -0
- package/dist/cliproxy/auth/environment-detector.js.map +1 -0
- package/dist/cliproxy/auth/index.d.ts +11 -0
- package/dist/cliproxy/auth/index.d.ts.map +1 -0
- package/dist/cliproxy/auth/index.js +35 -0
- package/dist/cliproxy/auth/index.js.map +1 -0
- package/dist/cliproxy/auth/oauth-handler.d.ts +29 -0
- package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-handler.js +205 -0
- package/dist/cliproxy/auth/oauth-handler.js.map +1 -0
- package/dist/cliproxy/auth/oauth-process.d.ts +27 -0
- package/dist/cliproxy/auth/oauth-process.d.ts.map +1 -0
- package/dist/cliproxy/auth/oauth-process.js +209 -0
- package/dist/cliproxy/auth/oauth-process.js.map +1 -0
- package/dist/cliproxy/auth/token-manager.d.ts +53 -0
- package/dist/cliproxy/auth/token-manager.d.ts.map +1 -0
- package/dist/cliproxy/auth/token-manager.js +250 -0
- package/dist/cliproxy/auth/token-manager.js.map +1 -0
- package/dist/cliproxy/auth-handler.d.ts +13 -103
- package/dist/cliproxy/auth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth-handler.js +35 -766
- package/dist/cliproxy/auth-handler.js.map +1 -1
- package/dist/cliproxy/binary/downloader.d.ts +29 -0
- package/dist/cliproxy/binary/downloader.d.ts.map +1 -0
- package/dist/cliproxy/binary/downloader.js +218 -0
- package/dist/cliproxy/binary/downloader.js.map +1 -0
- package/dist/cliproxy/binary/extractor.d.ts +12 -0
- package/dist/cliproxy/binary/extractor.d.ts.map +1 -0
- package/dist/cliproxy/binary/extractor.js +27 -0
- package/dist/cliproxy/binary/extractor.js.map +1 -0
- package/dist/cliproxy/binary/index.d.ts +13 -0
- package/dist/cliproxy/binary/index.d.ts.map +1 -0
- package/dist/cliproxy/binary/index.js +53 -0
- package/dist/cliproxy/binary/index.js.map +1 -0
- package/dist/cliproxy/binary/installer.d.ts +24 -0
- package/dist/cliproxy/binary/installer.d.ts.map +1 -0
- package/dist/cliproxy/binary/installer.js +117 -0
- package/dist/cliproxy/binary/installer.js.map +1 -0
- package/dist/cliproxy/binary/lifecycle.d.ts +11 -0
- package/dist/cliproxy/binary/lifecycle.d.ts.map +1 -0
- package/dist/cliproxy/binary/lifecycle.js +106 -0
- package/dist/cliproxy/binary/lifecycle.js.map +1 -0
- package/dist/cliproxy/binary/tar-extractor.d.ts +9 -0
- package/dist/cliproxy/binary/tar-extractor.d.ts.map +1 -0
- package/dist/cliproxy/binary/tar-extractor.js +118 -0
- package/dist/cliproxy/binary/tar-extractor.js.map +1 -0
- package/dist/cliproxy/binary/types.d.ts +24 -0
- package/dist/cliproxy/binary/types.d.ts.map +1 -0
- package/dist/cliproxy/binary/types.js +14 -0
- package/dist/cliproxy/binary/types.js.map +1 -0
- package/dist/cliproxy/binary/updater.d.ts +7 -0
- package/dist/cliproxy/binary/updater.d.ts.map +1 -0
- package/dist/cliproxy/binary/updater.js +18 -0
- package/dist/cliproxy/binary/updater.js.map +1 -0
- package/dist/cliproxy/binary/verifier.d.ts +18 -0
- package/dist/cliproxy/binary/verifier.d.ts.map +1 -0
- package/dist/cliproxy/binary/verifier.js +82 -0
- package/dist/cliproxy/binary/verifier.js.map +1 -0
- package/dist/cliproxy/binary/version-cache.d.ts +46 -0
- package/dist/cliproxy/binary/version-cache.d.ts.map +1 -0
- package/dist/cliproxy/binary/version-cache.js +171 -0
- package/dist/cliproxy/binary/version-cache.js.map +1 -0
- package/dist/cliproxy/binary/version-checker.d.ts +19 -0
- package/dist/cliproxy/binary/version-checker.d.ts.map +1 -0
- package/dist/cliproxy/binary/version-checker.js +77 -0
- package/dist/cliproxy/binary/version-checker.js.map +1 -0
- package/dist/cliproxy/binary/zip-extractor.d.ts +9 -0
- package/dist/cliproxy/binary/zip-extractor.d.ts.map +1 -0
- package/dist/cliproxy/binary/zip-extractor.js +110 -0
- package/dist/cliproxy/binary/zip-extractor.js.map +1 -0
- package/dist/cliproxy/binary-manager.d.ts +16 -170
- package/dist/cliproxy/binary-manager.d.ts.map +1 -1
- package/dist/cliproxy/binary-manager.js +38 -865
- package/dist/cliproxy/binary-manager.js.map +1 -1
- package/dist/cliproxy/remote-proxy-client.d.ts +3 -0
- package/dist/cliproxy/remote-proxy-client.d.ts.map +1 -1
- package/dist/cliproxy/remote-proxy-client.js +7 -3
- package/dist/cliproxy/remote-proxy-client.js.map +1 -1
- package/dist/cliproxy/services/binary-service.d.ts +65 -0
- package/dist/cliproxy/services/binary-service.d.ts.map +1 -0
- package/dist/cliproxy/services/binary-service.js +140 -0
- package/dist/cliproxy/services/binary-service.js.map +1 -0
- package/dist/cliproxy/services/index.d.ts +8 -0
- package/dist/cliproxy/services/index.d.ts.map +1 -0
- package/dist/cliproxy/services/index.js +31 -0
- package/dist/cliproxy/services/index.js.map +1 -0
- package/dist/cliproxy/services/proxy-lifecycle-service.d.ts +38 -0
- package/dist/cliproxy/services/proxy-lifecycle-service.d.ts.map +1 -0
- package/dist/cliproxy/services/proxy-lifecycle-service.js +41 -0
- package/dist/cliproxy/services/proxy-lifecycle-service.js.map +1 -0
- package/dist/cliproxy/services/variant-config-adapter.d.ts +38 -0
- package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -0
- package/dist/cliproxy/services/variant-config-adapter.js +172 -0
- package/dist/cliproxy/services/variant-config-adapter.js.map +1 -0
- package/dist/cliproxy/services/variant-service.d.ts +37 -0
- package/dist/cliproxy/services/variant-service.d.ts.map +1 -0
- package/dist/cliproxy/services/variant-service.js +128 -0
- package/dist/cliproxy/services/variant-service.js.map +1 -0
- package/dist/cliproxy/services/variant-settings.d.ts +32 -0
- package/dist/cliproxy/services/variant-settings.d.ts.map +1 -0
- package/dist/cliproxy/services/variant-settings.js +128 -0
- package/dist/cliproxy/services/variant-settings.js.map +1 -0
- package/dist/commands/api-command.d.ts +3 -6
- package/dist/commands/api-command.d.ts.map +1 -1
- package/dist/commands/api-command.js +84 -445
- package/dist/commands/api-command.js.map +1 -1
- package/dist/commands/cliproxy-command.d.ts +0 -3
- package/dist/commands/cliproxy-command.d.ts.map +1 -1
- package/dist/commands/cliproxy-command.js +182 -621
- package/dist/commands/cliproxy-command.js.map +1 -1
- package/dist/commands/index.d.ts +17 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +33 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/config/unified-config-loader.d.ts +7 -0
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +11 -1
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/delegation/executor/index.d.ts +7 -0
- package/dist/delegation/executor/index.d.ts.map +1 -0
- package/dist/delegation/executor/index.js +28 -0
- package/dist/delegation/executor/index.js.map +1 -0
- package/dist/delegation/executor/result-aggregator.d.ts +30 -0
- package/dist/delegation/executor/result-aggregator.d.ts.map +1 -0
- package/dist/delegation/executor/result-aggregator.js +66 -0
- package/dist/delegation/executor/result-aggregator.js.map +1 -0
- package/dist/delegation/executor/stream-parser.d.ts +28 -0
- package/dist/delegation/executor/stream-parser.d.ts.map +1 -0
- package/dist/delegation/executor/stream-parser.js +140 -0
- package/dist/delegation/executor/stream-parser.js.map +1 -0
- package/dist/delegation/executor/types.d.ts +121 -0
- package/dist/delegation/executor/types.d.ts.map +1 -0
- package/dist/delegation/executor/types.js +6 -0
- package/dist/delegation/executor/types.js.map +1 -0
- package/dist/delegation/headless-executor.d.ts +13 -91
- package/dist/delegation/headless-executor.d.ts.map +1 -1
- package/dist/delegation/headless-executor.js +84 -291
- package/dist/delegation/headless-executor.js.map +1 -1
- package/dist/delegation/index.d.ts +11 -0
- package/dist/delegation/index.d.ts.map +1 -0
- package/dist/delegation/index.js +33 -0
- package/dist/delegation/index.js.map +1 -0
- package/dist/delegation/result-formatter.d.ts +1 -30
- package/dist/delegation/result-formatter.d.ts.map +1 -1
- package/dist/delegation/result-formatter.js.map +1 -1
- package/dist/errors/cleanup-registry.d.ts +64 -0
- package/dist/errors/cleanup-registry.d.ts.map +1 -0
- package/dist/errors/cleanup-registry.js +141 -0
- package/dist/errors/cleanup-registry.js.map +1 -0
- package/dist/errors/error-handler.d.ts +45 -0
- package/dist/errors/error-handler.d.ts.map +1 -0
- package/dist/errors/error-handler.js +150 -0
- package/dist/errors/error-handler.js.map +1 -0
- package/dist/errors/error-types.d.ts +102 -0
- package/dist/errors/error-types.d.ts.map +1 -0
- package/dist/errors/error-types.js +158 -0
- package/dist/errors/error-types.js.map +1 -0
- package/dist/errors/exit-codes.d.ts +49 -0
- package/dist/errors/exit-codes.d.ts.map +1 -0
- package/dist/errors/exit-codes.js +72 -0
- package/dist/errors/exit-codes.js.map +1 -0
- package/dist/errors/index.d.ts +29 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +62 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/glmt/glmt-transformer.d.ts +29 -248
- package/dist/glmt/glmt-transformer.d.ts.map +1 -1
- package/dist/glmt/glmt-transformer.js +63 -718
- package/dist/glmt/glmt-transformer.js.map +1 -1
- package/dist/glmt/index.d.ts +14 -0
- package/dist/glmt/index.d.ts.map +1 -0
- package/dist/glmt/index.js +41 -0
- package/dist/glmt/index.js.map +1 -0
- package/dist/glmt/pipeline/content-transformer.d.ts +39 -0
- package/dist/glmt/pipeline/content-transformer.d.ts.map +1 -0
- package/dist/glmt/pipeline/content-transformer.js +162 -0
- package/dist/glmt/pipeline/content-transformer.js.map +1 -0
- package/dist/glmt/pipeline/index.d.ts +12 -0
- package/dist/glmt/pipeline/index.d.ts.map +1 -0
- package/dist/glmt/pipeline/index.js +20 -0
- package/dist/glmt/pipeline/index.js.map +1 -0
- package/dist/glmt/pipeline/request-transformer.d.ts +31 -0
- package/dist/glmt/pipeline/request-transformer.d.ts.map +1 -0
- package/dist/glmt/pipeline/request-transformer.js +116 -0
- package/dist/glmt/pipeline/request-transformer.js.map +1 -0
- package/dist/glmt/pipeline/response-builder.d.ts +52 -0
- package/dist/glmt/pipeline/response-builder.d.ts.map +1 -0
- package/dist/glmt/pipeline/response-builder.js +205 -0
- package/dist/glmt/pipeline/response-builder.js.map +1 -0
- package/dist/glmt/pipeline/stream-parser.d.ts +59 -0
- package/dist/glmt/pipeline/stream-parser.d.ts.map +1 -0
- package/dist/glmt/pipeline/stream-parser.js +241 -0
- package/dist/glmt/pipeline/stream-parser.js.map +1 -0
- package/dist/glmt/pipeline/tool-call-handler.d.ts +22 -0
- package/dist/glmt/pipeline/tool-call-handler.d.ts.map +1 -0
- package/dist/glmt/pipeline/tool-call-handler.js +87 -0
- package/dist/glmt/pipeline/tool-call-handler.js.map +1 -0
- package/dist/glmt/pipeline/types.d.ts +159 -0
- package/dist/glmt/pipeline/types.d.ts.map +1 -0
- package/dist/glmt/pipeline/types.js +6 -0
- package/dist/glmt/pipeline/types.js.map +1 -0
- package/dist/management/checks/cliproxy-check.d.ts +37 -0
- package/dist/management/checks/cliproxy-check.d.ts.map +1 -0
- package/dist/management/checks/cliproxy-check.js +187 -0
- package/dist/management/checks/cliproxy-check.js.map +1 -0
- package/dist/management/checks/config-check.d.ts +27 -0
- package/dist/management/checks/config-check.d.ts.map +1 -0
- package/dist/management/checks/config-check.js +158 -0
- package/dist/management/checks/config-check.js.map +1 -0
- package/dist/management/checks/env-check.d.ts +17 -0
- package/dist/management/checks/env-check.d.ts.map +1 -0
- package/dist/management/checks/env-check.js +71 -0
- package/dist/management/checks/env-check.js.map +1 -0
- package/dist/management/checks/index.d.ts +12 -0
- package/dist/management/checks/index.d.ts.map +1 -0
- package/dist/management/checks/index.js +48 -0
- package/dist/management/checks/index.js.map +1 -0
- package/dist/management/checks/oauth-check.d.ts +16 -0
- package/dist/management/checks/oauth-check.d.ts.map +1 -0
- package/dist/management/checks/oauth-check.js +68 -0
- package/dist/management/checks/oauth-check.js.map +1 -0
- package/dist/management/checks/profile-check.d.ts +36 -0
- package/dist/management/checks/profile-check.d.ts.map +1 -0
- package/dist/management/checks/profile-check.js +165 -0
- package/dist/management/checks/profile-check.js.map +1 -0
- package/dist/management/checks/symlink-check.d.ts +30 -0
- package/dist/management/checks/symlink-check.d.ts.map +1 -0
- package/dist/management/checks/symlink-check.js +204 -0
- package/dist/management/checks/symlink-check.js.map +1 -0
- package/dist/management/checks/system-check.d.ts +25 -0
- package/dist/management/checks/system-check.d.ts.map +1 -0
- package/dist/management/checks/system-check.js +136 -0
- package/dist/management/checks/system-check.js.map +1 -0
- package/dist/management/checks/types.d.ts +64 -0
- package/dist/management/checks/types.d.ts.map +1 -0
- package/dist/management/checks/types.js +63 -0
- package/dist/management/checks/types.js.map +1 -0
- package/dist/management/doctor.d.ts +3 -92
- package/dist/management/doctor.d.ts.map +1 -1
- package/dist/management/doctor.js +15 -831
- package/dist/management/doctor.js.map +1 -1
- package/dist/management/index.d.ts +15 -0
- package/dist/management/index.d.ts.map +1 -0
- package/dist/management/index.js +56 -0
- package/dist/management/index.js.map +1 -0
- package/dist/management/repair/auto-repair.d.ts +13 -0
- package/dist/management/repair/auto-repair.d.ts.map +1 -0
- package/dist/management/repair/auto-repair.js +170 -0
- package/dist/management/repair/auto-repair.js.map +1 -0
- package/dist/management/repair/index.d.ts +5 -0
- package/dist/management/repair/index.d.ts.map +1 -0
- package/dist/management/repair/index.js +9 -0
- package/dist/management/repair/index.js.map +1 -0
- package/dist/types/delegation.d.ts +1 -13
- package/dist/types/delegation.d.ts.map +1 -1
- package/dist/types/utils.d.ts +27 -0
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/ui/assets/{accounts-p1_nf0Jy.js → accounts--0JKEYYO.js} +1 -1
- package/dist/ui/assets/analytics-CX5PurM9.js +1 -0
- package/dist/ui/assets/api-D80tfZOx.js +1 -0
- package/dist/ui/assets/{card-CCDc-Mx9.js → card-B-DPlvgo.js} +1 -1
- package/dist/ui/assets/cliproxy-D4AoDTZB.js +3 -0
- package/dist/ui/assets/cliproxy-control-panel-CJ2CfYod.js +1 -0
- package/dist/ui/assets/{code-editor-Br9x-r-E.js → code-editor-DIj6qdUG.js} +1 -1
- package/dist/ui/assets/confirm-dialog-DZkzZLrs.js +1 -0
- package/dist/ui/assets/copilot-Q9tyCgYD.js +4 -0
- package/dist/ui/assets/form-utils-DP6ILe7Z.js +20 -0
- package/dist/ui/assets/health-Cw76uZRy.js +1 -0
- package/dist/ui/assets/{icons-BOsxPbiD.js → icons-ZmwVoUeR.js} +1 -1
- package/dist/ui/assets/index-C1W0iP_Z.js +46 -0
- package/dist/ui/assets/index-It66SkKf.css +1 -0
- package/dist/ui/assets/{radix-ui-DFHQr9A5.js → radix-ui-CV3R9pD6.js} +3 -3
- package/dist/ui/assets/settings-CDdHW_gU.js +1 -0
- package/dist/ui/assets/{shared-BfYhSN4-.js → shared--pI8rTbP.js} +1 -1
- package/dist/ui/assets/{switch-CMk95lwf.js → switch-BP6SzLyZ.js} +1 -1
- package/dist/ui/assets/{tanstack-C4gT2P7V.js → tanstack-Df9bCj5R.js} +1 -1
- package/dist/ui/index.html +6 -6
- package/dist/utils/claude-spawner.d.ts +54 -0
- package/dist/utils/claude-spawner.d.ts.map +1 -0
- package/dist/utils/claude-spawner.js +118 -0
- package/dist/utils/claude-spawner.js.map +1 -0
- package/dist/utils/delegation-validator.d.ts +8 -4
- package/dist/utils/delegation-validator.d.ts.map +1 -1
- package/dist/utils/delegation-validator.js.map +1 -1
- package/dist/utils/helpers.d.ts +0 -11
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +1 -57
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +50 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/time.d.ts +10 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +27 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/ui/boxes.d.ts +24 -0
- package/dist/utils/ui/boxes.d.ts.map +1 -0
- package/dist/utils/ui/boxes.js +108 -0
- package/dist/utils/ui/boxes.js.map +1 -0
- package/dist/utils/ui/colors.d.ts +25 -0
- package/dist/utils/ui/colors.d.ts.map +1 -0
- package/dist/utils/ui/colors.js +70 -0
- package/dist/utils/ui/colors.js.map +1 -0
- package/dist/utils/ui/index.d.ts +51 -0
- package/dist/utils/ui/index.d.ts.map +1 -0
- package/dist/utils/ui/index.js +96 -0
- package/dist/utils/ui/index.js.map +1 -0
- package/dist/utils/ui/indicators.d.ts +23 -0
- package/dist/utils/ui/indicators.d.ts.map +1 -0
- package/dist/utils/ui/indicators.js +39 -0
- package/dist/utils/ui/indicators.js.map +1 -0
- package/dist/utils/ui/init.d.ts +30 -0
- package/dist/utils/ui/init.d.ts.map +1 -0
- package/dist/utils/ui/init.js +102 -0
- package/dist/utils/ui/init.js.map +1 -0
- package/dist/utils/ui/spinner.d.ts +13 -0
- package/dist/utils/ui/spinner.d.ts.map +1 -0
- package/dist/utils/ui/spinner.js +89 -0
- package/dist/utils/ui/spinner.js.map +1 -0
- package/dist/utils/ui/tables.d.ts +12 -0
- package/dist/utils/ui/tables.d.ts.map +1 -0
- package/dist/utils/ui/tables.js +69 -0
- package/dist/utils/ui/tables.js.map +1 -0
- package/dist/utils/ui/tasks.d.ts +26 -0
- package/dist/utils/ui/tasks.d.ts.map +1 -0
- package/dist/utils/ui/tasks.js +102 -0
- package/dist/utils/ui/tasks.js.map +1 -0
- package/dist/utils/ui/text.d.ts +24 -0
- package/dist/utils/ui/text.d.ts.map +1 -0
- package/dist/utils/ui/text.js +60 -0
- package/dist/utils/ui/text.js.map +1 -0
- package/dist/utils/ui/types.d.ts +36 -0
- package/dist/utils/ui/types.d.ts.map +1 -0
- package/dist/utils/ui/types.js +33 -0
- package/dist/utils/ui/types.js.map +1 -0
- package/dist/utils/ui.d.ts +3 -138
- package/dist/utils/ui.d.ts.map +1 -1
- package/dist/utils/ui.js +40 -567
- package/dist/utils/ui.js.map +1 -1
- package/dist/utils/websearch/gemini-cli.d.ts +36 -0
- package/dist/utils/websearch/gemini-cli.d.ts.map +1 -0
- package/dist/utils/websearch/gemini-cli.js +132 -0
- package/dist/utils/websearch/gemini-cli.js.map +1 -0
- package/dist/utils/websearch/grok-cli.d.ts +26 -0
- package/dist/utils/websearch/grok-cli.d.ts.map +1 -0
- package/dist/utils/websearch/grok-cli.js +81 -0
- package/dist/utils/websearch/grok-cli.js.map +1 -0
- package/dist/utils/websearch/hook-config.d.ts +21 -0
- package/dist/utils/websearch/hook-config.d.ts.map +1 -0
- package/dist/utils/websearch/hook-config.js +183 -0
- package/dist/utils/websearch/hook-config.js.map +1 -0
- package/dist/utils/websearch/hook-env.d.ts +16 -0
- package/dist/utils/websearch/hook-env.d.ts.map +1 -0
- package/dist/utils/websearch/hook-env.js +62 -0
- package/dist/utils/websearch/hook-env.js.map +1 -0
- package/dist/utils/websearch/hook-installer.d.ts +27 -0
- package/dist/utils/websearch/hook-installer.d.ts.map +1 -0
- package/dist/utils/websearch/hook-installer.js +141 -0
- package/dist/utils/websearch/hook-installer.js.map +1 -0
- package/dist/utils/websearch/index.d.ts +15 -0
- package/dist/utils/websearch/index.d.ts.map +1 -0
- package/dist/utils/websearch/index.js +44 -0
- package/dist/utils/websearch/index.js.map +1 -0
- package/dist/utils/websearch/opencode-cli.d.ts +26 -0
- package/dist/utils/websearch/opencode-cli.d.ts.map +1 -0
- package/dist/utils/websearch/opencode-cli.js +81 -0
- package/dist/utils/websearch/opencode-cli.js.map +1 -0
- package/dist/utils/websearch/status.d.ts +35 -0
- package/dist/utils/websearch/status.d.ts.map +1 -0
- package/dist/utils/websearch/status.js +185 -0
- package/dist/utils/websearch/status.js.map +1 -0
- package/dist/utils/websearch/types.d.ts +85 -0
- package/dist/utils/websearch/types.d.ts.map +1 -0
- package/dist/utils/websearch/types.js +10 -0
- package/dist/utils/websearch/types.js.map +1 -0
- package/dist/utils/websearch-manager.d.ts +7 -186
- package/dist/utils/websearch-manager.d.ts.map +1 -1
- package/dist/utils/websearch-manager.js +37 -710
- package/dist/utils/websearch-manager.js.map +1 -1
- package/dist/web-server/data-aggregator.d.ts +3 -51
- package/dist/web-server/data-aggregator.d.ts.map +1 -1
- package/dist/web-server/data-aggregator.js +18 -386
- package/dist/web-server/data-aggregator.js.map +1 -1
- package/dist/web-server/health/cliproxy-checks.d.ts +23 -0
- package/dist/web-server/health/cliproxy-checks.d.ts.map +1 -0
- package/dist/web-server/health/cliproxy-checks.js +145 -0
- package/dist/web-server/health/cliproxy-checks.js.map +1 -0
- package/dist/web-server/health/config-checks.d.ts +19 -0
- package/dist/web-server/health/config-checks.d.ts.map +1 -0
- package/dist/web-server/health/config-checks.js +174 -0
- package/dist/web-server/health/config-checks.js.map +1 -0
- package/dist/web-server/health/environment-checks.d.ts +11 -0
- package/dist/web-server/health/environment-checks.d.ts.map +1 -0
- package/dist/web-server/health/environment-checks.js +40 -0
- package/dist/web-server/health/environment-checks.js.map +1 -0
- package/dist/web-server/health/index.d.ts +13 -0
- package/dist/web-server/health/index.d.ts.map +1 -0
- package/dist/web-server/health/index.js +41 -0
- package/dist/web-server/health/index.js.map +1 -0
- package/dist/web-server/health/oauth-checks.d.ts +11 -0
- package/dist/web-server/health/oauth-checks.d.ts.map +1 -0
- package/dist/web-server/health/oauth-checks.js +34 -0
- package/dist/web-server/health/oauth-checks.js.map +1 -0
- package/dist/web-server/health/profile-checks.d.ts +19 -0
- package/dist/web-server/health/profile-checks.d.ts.map +1 -0
- package/dist/web-server/health/profile-checks.js +152 -0
- package/dist/web-server/health/profile-checks.js.map +1 -0
- package/dist/web-server/health/symlink-checks.d.ts +15 -0
- package/dist/web-server/health/symlink-checks.d.ts.map +1 -0
- package/dist/web-server/health/symlink-checks.js +173 -0
- package/dist/web-server/health/symlink-checks.js.map +1 -0
- package/dist/web-server/health/system-checks.d.ts +19 -0
- package/dist/web-server/health/system-checks.d.ts.map +1 -0
- package/dist/web-server/health/system-checks.js +127 -0
- package/dist/web-server/health/system-checks.js.map +1 -0
- package/dist/web-server/health/types.d.ts +34 -0
- package/dist/web-server/health/types.d.ts.map +1 -0
- package/dist/web-server/health/types.js +8 -0
- package/dist/web-server/health/types.js.map +1 -0
- package/dist/web-server/health/websearch-checks.d.ts +11 -0
- package/dist/web-server/health/websearch-checks.d.ts.map +1 -0
- package/dist/web-server/health/websearch-checks.js +53 -0
- package/dist/web-server/health/websearch-checks.js.map +1 -0
- package/dist/web-server/health-service.d.ts +4 -30
- package/dist/web-server/health-service.d.ts.map +1 -1
- package/dist/web-server/health-service.js +28 -695
- package/dist/web-server/health-service.js.map +1 -1
- package/dist/web-server/index.d.ts.map +1 -1
- package/dist/web-server/index.js +2 -5
- package/dist/web-server/index.js.map +1 -1
- package/dist/web-server/routes/cliproxy-auth-routes.d.ts +6 -0
- package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -0
- package/dist/web-server/routes/cliproxy-auth-routes.js +202 -0
- package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -0
- package/dist/web-server/routes/cliproxy-stats-routes.d.ts +6 -0
- package/dist/web-server/routes/cliproxy-stats-routes.d.ts.map +1 -0
- package/dist/web-server/routes/cliproxy-stats-routes.js +253 -0
- package/dist/web-server/routes/cliproxy-stats-routes.js.map +1 -0
- package/dist/web-server/routes/config-routes.d.ts +6 -0
- package/dist/web-server/routes/config-routes.d.ts.map +1 -0
- package/dist/web-server/routes/config-routes.js +145 -0
- package/dist/web-server/routes/config-routes.js.map +1 -0
- package/dist/web-server/routes/copilot-routes.d.ts +6 -0
- package/dist/web-server/routes/copilot-routes.d.ts.map +1 -0
- package/dist/web-server/routes/copilot-routes.js +195 -0
- package/dist/web-server/routes/copilot-routes.js.map +1 -0
- package/dist/web-server/routes/copilot-settings-routes.d.ts +6 -0
- package/dist/web-server/routes/copilot-settings-routes.d.ts.map +1 -0
- package/dist/web-server/routes/copilot-settings-routes.js +122 -0
- package/dist/web-server/routes/copilot-settings-routes.js.map +1 -0
- package/dist/web-server/routes/health-routes.d.ts +6 -0
- package/dist/web-server/routes/health-routes.d.ts.map +1 -0
- package/dist/web-server/routes/health-routes.js +30 -0
- package/dist/web-server/routes/health-routes.js.map +1 -0
- package/dist/web-server/routes/index.d.ts +8 -0
- package/dist/web-server/routes/index.d.ts.map +1 -0
- package/dist/web-server/routes/index.js +54 -0
- package/dist/web-server/routes/index.js.map +1 -0
- package/dist/web-server/routes/misc-routes.d.ts +6 -0
- package/dist/web-server/routes/misc-routes.d.ts.map +1 -0
- package/dist/web-server/routes/misc-routes.js +219 -0
- package/dist/web-server/routes/misc-routes.js.map +1 -0
- package/dist/web-server/routes/profile-routes.d.ts +6 -0
- package/dist/web-server/routes/profile-routes.d.ts.map +1 -0
- package/dist/web-server/routes/profile-routes.js +164 -0
- package/dist/web-server/routes/profile-routes.js.map +1 -0
- package/dist/web-server/routes/provider-routes.d.ts +6 -0
- package/dist/web-server/routes/provider-routes.d.ts.map +1 -0
- package/dist/web-server/routes/provider-routes.js +146 -0
- package/dist/web-server/routes/provider-routes.js.map +1 -0
- package/dist/web-server/routes/route-helpers.d.ts +55 -0
- package/dist/web-server/routes/route-helpers.d.ts.map +1 -0
- package/dist/web-server/routes/route-helpers.js +201 -0
- package/dist/web-server/routes/route-helpers.js.map +1 -0
- package/dist/web-server/routes/settings-routes.d.ts +6 -0
- package/dist/web-server/routes/settings-routes.d.ts.map +1 -0
- package/dist/web-server/routes/settings-routes.js +207 -0
- package/dist/web-server/routes/settings-routes.js.map +1 -0
- package/dist/web-server/routes/variant-routes.d.ts +6 -0
- package/dist/web-server/routes/variant-routes.d.ts.map +1 -0
- package/dist/web-server/routes/variant-routes.js +158 -0
- package/dist/web-server/routes/variant-routes.js.map +1 -0
- package/dist/web-server/routes/websearch-routes.d.ts +6 -0
- package/dist/web-server/routes/websearch-routes.d.ts.map +1 -0
- package/dist/web-server/routes/websearch-routes.js +130 -0
- package/dist/web-server/routes/websearch-routes.js.map +1 -0
- package/dist/web-server/services/index.d.ts +7 -0
- package/dist/web-server/services/index.d.ts.map +1 -0
- package/dist/web-server/services/index.js +21 -0
- package/dist/web-server/services/index.js.map +1 -0
- package/dist/web-server/services/usage-aggregator.d.ts +7 -0
- package/dist/web-server/services/usage-aggregator.d.ts.map +1 -0
- package/dist/web-server/services/usage-aggregator.js +23 -0
- package/dist/web-server/services/usage-aggregator.js.map +1 -0
- package/dist/web-server/usage/aggregator.d.ts +54 -0
- package/dist/web-server/usage/aggregator.d.ts.map +1 -0
- package/dist/web-server/usage/aggregator.js +470 -0
- package/dist/web-server/usage/aggregator.js.map +1 -0
- package/dist/web-server/usage/data-aggregator.d.ts +55 -0
- package/dist/web-server/usage/data-aggregator.d.ts.map +1 -0
- package/dist/web-server/usage/data-aggregator.js +391 -0
- package/dist/web-server/usage/data-aggregator.js.map +1 -0
- package/dist/web-server/usage/disk-cache.d.ts +46 -0
- package/dist/web-server/usage/disk-cache.d.ts.map +1 -0
- package/dist/web-server/usage/disk-cache.js +162 -0
- package/dist/web-server/usage/disk-cache.js.map +1 -0
- package/dist/web-server/usage/handlers.d.ts +50 -0
- package/dist/web-server/usage/handlers.d.ts.map +1 -0
- package/dist/web-server/usage/handlers.js +524 -0
- package/dist/web-server/usage/handlers.js.map +1 -0
- package/dist/web-server/usage/index.d.ts +12 -0
- package/dist/web-server/usage/index.d.ts.map +1 -0
- package/dist/web-server/usage/index.js +54 -0
- package/dist/web-server/usage/index.js.map +1 -0
- package/dist/web-server/usage/routes.d.ts +11 -0
- package/dist/web-server/usage/routes.d.ts.map +1 -0
- package/dist/web-server/usage/routes.js +37 -0
- package/dist/web-server/usage/routes.js.map +1 -0
- package/dist/web-server/usage/types.d.ts +119 -0
- package/dist/web-server/usage/types.d.ts.map +1 -0
- package/dist/web-server/usage/types.js +9 -0
- package/dist/web-server/usage/types.js.map +1 -0
- package/dist/web-server/usage-disk-cache.d.ts +3 -42
- package/dist/web-server/usage-disk-cache.d.ts.map +1 -1
- package/dist/web-server/usage-disk-cache.js +5 -144
- package/dist/web-server/usage-disk-cache.js.map +1 -1
- package/dist/web-server/usage-routes.d.ts +3 -31
- package/dist/web-server/usage-routes.d.ts.map +1 -1
- package/dist/web-server/usage-routes.js +8 -1139
- package/dist/web-server/usage-routes.js.map +1 -1
- package/dist/web-server/usage-types.d.ts +3 -115
- package/dist/web-server/usage-types.d.ts.map +1 -1
- package/dist/web-server/usage-types.js +17 -3
- package/dist/web-server/usage-types.js.map +1 -1
- package/package.json +1 -1
- package/scripts/dev-release.sh +113 -0
- package/dist/ui/assets/analytics-D1k2nYcF.js +0 -1
- package/dist/ui/assets/api-D9VVmZ1j.js +0 -1
- package/dist/ui/assets/cliproxy-CTt_Nsft.js +0 -1
- package/dist/ui/assets/cliproxy-control-panel-DKMAi4_4.js +0 -1
- package/dist/ui/assets/copilot-C6F8PT_L.js +0 -4
- package/dist/ui/assets/form-utils-BuXDJb0w.js +0 -20
- package/dist/ui/assets/health-DiAvJaSn.js +0 -1
- package/dist/ui/assets/index-Brq6EBKZ.css +0 -1
- package/dist/ui/assets/index-ByU8ZhED.js +0 -48
- package/dist/ui/assets/settings-CEomZLGl.js +0 -1
- package/dist/web-server/routes.d.ts +0 -7
- package/dist/web-server/routes.d.ts.map +0 -1
- package/dist/web-server/routes.js +0 -1891
- package/dist/web-server/routes.js.map +0 -1
|
@@ -11,756 +11,44 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Token storage: ~/.ccs/cliproxy/auth/<provider>/
|
|
13
13
|
* Each provider has its own directory to avoid conflicts.
|
|
14
|
+
*
|
|
15
|
+
* This file is a facade that re-exports from the auth/ submodule.
|
|
16
|
+
* The actual implementation is split across:
|
|
17
|
+
* - auth/auth-types.ts - Types and OAuth configurations
|
|
18
|
+
* - auth/token-manager.ts - Token storage/retrieval/validation
|
|
19
|
+
* - auth/oauth-handler.ts - OAuth flow handling
|
|
20
|
+
* - auth/environment-detector.ts - Headless detection and port management
|
|
14
21
|
*/
|
|
15
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
-
if (k2 === undefined) k2 = k;
|
|
17
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
-
}
|
|
21
|
-
Object.defineProperty(o, k2, desc);
|
|
22
|
-
}) : (function(o, m, k, k2) {
|
|
23
|
-
if (k2 === undefined) k2 = k;
|
|
24
|
-
o[k2] = m[k];
|
|
25
|
-
}));
|
|
26
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
-
}) : function(o, v) {
|
|
29
|
-
o["default"] = v;
|
|
30
|
-
});
|
|
31
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
23
|
+
exports.initializeAccounts = exports.ensureAuth = exports.triggerOAuth = exports.showStep = exports.getTimeoutTroubleshooting = exports.killProcessOnPort = exports.isHeadlessEnvironment = exports.displayAuthStatus = exports.clearAuth = exports.getAllAuthStatus = exports.getAuthStatus = exports.isAuthenticated = exports.isTokenFileForProvider = exports.getProviderTokenDir = exports.getOAuthConfig = exports.PROVIDER_TYPE_VALUES = exports.PROVIDER_AUTH_PREFIXES = exports.OAUTH_CONFIGS = exports.OAUTH_CALLBACK_PORTS = void 0;
|
|
24
|
+
// Re-export configurations
|
|
25
|
+
var auth_1 = require("./auth");
|
|
26
|
+
Object.defineProperty(exports, "OAUTH_CALLBACK_PORTS", { enumerable: true, get: function () { return auth_1.OAUTH_CALLBACK_PORTS; } });
|
|
27
|
+
Object.defineProperty(exports, "OAUTH_CONFIGS", { enumerable: true, get: function () { return auth_1.OAUTH_CONFIGS; } });
|
|
28
|
+
Object.defineProperty(exports, "PROVIDER_AUTH_PREFIXES", { enumerable: true, get: function () { return auth_1.PROVIDER_AUTH_PREFIXES; } });
|
|
29
|
+
Object.defineProperty(exports, "PROVIDER_TYPE_VALUES", { enumerable: true, get: function () { return auth_1.PROVIDER_TYPE_VALUES; } });
|
|
30
|
+
Object.defineProperty(exports, "getOAuthConfig", { enumerable: true, get: function () { return auth_1.getOAuthConfig; } });
|
|
31
|
+
// Re-export token management functions
|
|
32
|
+
var auth_2 = require("./auth");
|
|
33
|
+
Object.defineProperty(exports, "getProviderTokenDir", { enumerable: true, get: function () { return auth_2.getProviderTokenDir; } });
|
|
34
|
+
Object.defineProperty(exports, "isTokenFileForProvider", { enumerable: true, get: function () { return auth_2.isTokenFileForProvider; } });
|
|
35
|
+
Object.defineProperty(exports, "isAuthenticated", { enumerable: true, get: function () { return auth_2.isAuthenticated; } });
|
|
36
|
+
Object.defineProperty(exports, "getAuthStatus", { enumerable: true, get: function () { return auth_2.getAuthStatus; } });
|
|
37
|
+
Object.defineProperty(exports, "getAllAuthStatus", { enumerable: true, get: function () { return auth_2.getAllAuthStatus; } });
|
|
38
|
+
Object.defineProperty(exports, "clearAuth", { enumerable: true, get: function () { return auth_2.clearAuth; } });
|
|
39
|
+
Object.defineProperty(exports, "displayAuthStatus", { enumerable: true, get: function () { return auth_2.displayAuthStatus; } });
|
|
40
|
+
// Re-export environment detection functions
|
|
41
|
+
var auth_3 = require("./auth");
|
|
42
|
+
Object.defineProperty(exports, "isHeadlessEnvironment", { enumerable: true, get: function () { return auth_3.isHeadlessEnvironment; } });
|
|
43
|
+
Object.defineProperty(exports, "killProcessOnPort", { enumerable: true, get: function () { return auth_3.killProcessOnPort; } });
|
|
44
|
+
Object.defineProperty(exports, "getTimeoutTroubleshooting", { enumerable: true, get: function () { return auth_3.getTimeoutTroubleshooting; } });
|
|
45
|
+
Object.defineProperty(exports, "showStep", { enumerable: true, get: function () { return auth_3.showStep; } });
|
|
46
|
+
// Re-export OAuth handling functions
|
|
47
|
+
var auth_4 = require("./auth");
|
|
48
|
+
Object.defineProperty(exports, "triggerOAuth", { enumerable: true, get: function () { return auth_4.triggerOAuth; } });
|
|
49
|
+
Object.defineProperty(exports, "ensureAuth", { enumerable: true, get: function () { return auth_4.ensureAuth; } });
|
|
50
|
+
// Re-export account management initialization
|
|
46
51
|
const account_manager_1 = require("./account-manager");
|
|
47
|
-
const oauth_port_diagnostics_1 = require("../management/oauth-port-diagnostics");
|
|
48
|
-
const project_selection_handler_1 = require("./project-selection-handler");
|
|
49
|
-
/**
|
|
50
|
-
* OAuth callback ports used by CLIProxyAPI (hardcoded in binary)
|
|
51
|
-
* See: https://github.com/router-for-me/CLIProxyAPI/tree/main/internal/auth
|
|
52
|
-
*
|
|
53
|
-
* OAuth flow types per provider:
|
|
54
|
-
* - Gemini: Authorization Code Flow with local callback server on port 8085
|
|
55
|
-
* - Codex: Authorization Code Flow with local callback server on port 1455
|
|
56
|
-
* - Agy: Authorization Code Flow with local callback server on port 51121
|
|
57
|
-
* - Qwen: Device Code Flow (polling-based, NO callback port needed)
|
|
58
|
-
*
|
|
59
|
-
* We auto-kill processes on callback ports before OAuth to avoid conflicts.
|
|
60
|
-
*/
|
|
61
|
-
const OAUTH_CALLBACK_PORTS = {
|
|
62
|
-
gemini: 8085,
|
|
63
|
-
// codex uses 1455
|
|
64
|
-
// agy uses 51121
|
|
65
|
-
// qwen uses Device Code Flow - no callback port needed
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* Kill any process using a specific port
|
|
69
|
-
* Used to free OAuth callback port before authentication
|
|
70
|
-
*/
|
|
71
|
-
function killProcessOnPort(port, verbose) {
|
|
72
|
-
try {
|
|
73
|
-
if (process.platform === 'win32') {
|
|
74
|
-
// Windows: use netstat + taskkill
|
|
75
|
-
const result = (0, child_process_1.execSync)(`netstat -ano | findstr :${port}`, {
|
|
76
|
-
encoding: 'utf-8',
|
|
77
|
-
stdio: 'pipe',
|
|
78
|
-
});
|
|
79
|
-
const lines = result.trim().split('\n');
|
|
80
|
-
for (const line of lines) {
|
|
81
|
-
const parts = line.trim().split(/\s+/);
|
|
82
|
-
const pid = parts[parts.length - 1];
|
|
83
|
-
if (pid && /^\d+$/.test(pid)) {
|
|
84
|
-
(0, child_process_1.execSync)(`taskkill /F /PID ${pid}`, { stdio: 'pipe' });
|
|
85
|
-
if (verbose)
|
|
86
|
-
console.error(`[auth] Killed process ${pid} on port ${port}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
// Unix: use lsof + kill
|
|
93
|
-
const result = (0, child_process_1.execSync)(`lsof -ti:${port}`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
94
|
-
const pids = result
|
|
95
|
-
.trim()
|
|
96
|
-
.split('\n')
|
|
97
|
-
.filter((p) => p);
|
|
98
|
-
for (const pid of pids) {
|
|
99
|
-
(0, child_process_1.execSync)(`kill -9 ${pid}`, { stdio: 'pipe' });
|
|
100
|
-
if (verbose)
|
|
101
|
-
console.error(`[auth] Killed process ${pid} on port ${port}`);
|
|
102
|
-
}
|
|
103
|
-
return pids.length > 0;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// No process on port or command failed - that's fine
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Detect if running in a headless environment (no browser available)
|
|
113
|
-
*
|
|
114
|
-
* IMPROVED: Avoids false positives on Windows desktop environments
|
|
115
|
-
* where isTTY may be undefined due to terminal wrapper behavior.
|
|
116
|
-
*
|
|
117
|
-
* Case study: Vietnamese Windows users reported "command hangs" because
|
|
118
|
-
* their terminal (PowerShell via npm) didn't set isTTY correctly.
|
|
119
|
-
*/
|
|
120
|
-
function isHeadlessEnvironment() {
|
|
121
|
-
// SSH session - always headless
|
|
122
|
-
if (process.env.SSH_TTY || process.env.SSH_CLIENT || process.env.SSH_CONNECTION) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
// No display on Linux (X11/Wayland) - headless
|
|
126
|
-
if (process.platform === 'linux' && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY) {
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
// Windows desktop - NEVER headless unless SSH (already checked above)
|
|
130
|
-
// This fixes false positive where Windows npm wrappers don't set isTTY correctly
|
|
131
|
-
// Windows desktop environments always have browser capability
|
|
132
|
-
if (process.platform === 'win32') {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
// macOS - check for proper terminal
|
|
136
|
-
if (process.platform === 'darwin') {
|
|
137
|
-
// Non-interactive stdin on macOS means likely piped/scripted
|
|
138
|
-
if (!process.stdin.isTTY) {
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
// Linux with display - check TTY
|
|
144
|
-
if (process.platform === 'linux') {
|
|
145
|
-
if (!process.stdin.isTTY) {
|
|
146
|
-
return true;
|
|
147
|
-
}
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
// Default fallback for unknown platforms
|
|
151
|
-
return !process.stdin.isTTY;
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* OAuth configurations per provider
|
|
155
|
-
* Note: CLIProxyAPI handles actual OAuth - these are for display/manual flow
|
|
156
|
-
*/
|
|
157
|
-
const OAUTH_CONFIGS = {
|
|
158
|
-
gemini: {
|
|
159
|
-
provider: 'gemini',
|
|
160
|
-
displayName: 'Google Gemini',
|
|
161
|
-
authUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
162
|
-
scopes: ['https://www.googleapis.com/auth/generative-language'],
|
|
163
|
-
authFlag: '--login',
|
|
164
|
-
},
|
|
165
|
-
codex: {
|
|
166
|
-
provider: 'codex',
|
|
167
|
-
displayName: 'Codex',
|
|
168
|
-
authUrl: 'https://auth.openai.com/authorize',
|
|
169
|
-
scopes: ['openid', 'profile'],
|
|
170
|
-
authFlag: '--codex-login',
|
|
171
|
-
},
|
|
172
|
-
agy: {
|
|
173
|
-
provider: 'agy',
|
|
174
|
-
displayName: 'Antigravity',
|
|
175
|
-
authUrl: 'https://antigravity.ai/oauth/authorize',
|
|
176
|
-
scopes: ['api'],
|
|
177
|
-
authFlag: '--antigravity-login',
|
|
178
|
-
},
|
|
179
|
-
qwen: {
|
|
180
|
-
provider: 'qwen',
|
|
181
|
-
displayName: 'Qwen Code',
|
|
182
|
-
authUrl: 'https://chat.qwen.ai/api/v1/oauth2/device/code',
|
|
183
|
-
scopes: ['openid', 'profile', 'email', 'model.completion'],
|
|
184
|
-
authFlag: '--qwen-login',
|
|
185
|
-
},
|
|
186
|
-
iflow: {
|
|
187
|
-
provider: 'iflow',
|
|
188
|
-
displayName: 'iFlow',
|
|
189
|
-
authUrl: 'https://iflow.cn/oauth',
|
|
190
|
-
scopes: ['phone', 'profile', 'email'],
|
|
191
|
-
authFlag: '--iflow-login',
|
|
192
|
-
},
|
|
193
|
-
};
|
|
194
|
-
/**
|
|
195
|
-
* Get OAuth config for provider
|
|
196
|
-
*/
|
|
197
|
-
function getOAuthConfig(provider) {
|
|
198
|
-
const config = OAUTH_CONFIGS[provider];
|
|
199
|
-
if (!config) {
|
|
200
|
-
throw new Error(`Unknown provider: ${provider}`);
|
|
201
|
-
}
|
|
202
|
-
return config;
|
|
203
|
-
}
|
|
204
|
-
exports.getOAuthConfig = getOAuthConfig;
|
|
205
|
-
/**
|
|
206
|
-
* Get token directory for provider
|
|
207
|
-
*/
|
|
208
|
-
function getProviderTokenDir(provider) {
|
|
209
|
-
return (0, config_generator_1.getProviderAuthDir)(provider);
|
|
210
|
-
}
|
|
211
|
-
exports.getProviderTokenDir = getProviderTokenDir;
|
|
212
|
-
/**
|
|
213
|
-
* Provider-specific auth file prefixes (fallback detection)
|
|
214
|
-
* CLIProxyAPI names auth files with provider prefix (e.g., "antigravity-user@email.json")
|
|
215
|
-
* Note: Gemini tokens may NOT have prefix - CLIProxyAPI uses {email}-{projectID}.json format
|
|
216
|
-
*/
|
|
217
|
-
const PROVIDER_AUTH_PREFIXES = {
|
|
218
|
-
gemini: ['gemini-', 'google-'],
|
|
219
|
-
codex: ['codex-', 'openai-'],
|
|
220
|
-
agy: ['antigravity-', 'agy-'],
|
|
221
|
-
qwen: ['qwen-'],
|
|
222
|
-
iflow: ['iflow-'],
|
|
223
|
-
};
|
|
224
|
-
/**
|
|
225
|
-
* Provider type values inside token JSON files
|
|
226
|
-
* CLIProxyAPI sets "type" field in token JSON (e.g., {"type": "gemini"})
|
|
227
|
-
*/
|
|
228
|
-
const PROVIDER_TYPE_VALUES = {
|
|
229
|
-
gemini: ['gemini'],
|
|
230
|
-
codex: ['codex'],
|
|
231
|
-
agy: ['antigravity'],
|
|
232
|
-
qwen: ['qwen'],
|
|
233
|
-
iflow: ['iflow'],
|
|
234
|
-
};
|
|
235
|
-
/**
|
|
236
|
-
* Check if a JSON file contains a token for the given provider
|
|
237
|
-
* Reads the file and checks the "type" field
|
|
238
|
-
*/
|
|
239
|
-
function isTokenFileForProvider(filePath, provider) {
|
|
240
|
-
try {
|
|
241
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
242
|
-
const data = JSON.parse(content);
|
|
243
|
-
const typeValue = (data.type || '').toLowerCase();
|
|
244
|
-
const validTypes = PROVIDER_TYPE_VALUES[provider] || [];
|
|
245
|
-
return validTypes.includes(typeValue);
|
|
246
|
-
}
|
|
247
|
-
catch {
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Check if provider has valid authentication
|
|
253
|
-
* CLIProxyAPI stores OAuth tokens as JSON files in the auth directory.
|
|
254
|
-
* Detection strategy:
|
|
255
|
-
* 1. First check by filename prefix (fast path)
|
|
256
|
-
* 2. If no match, check JSON content for "type" field (Gemini uses {email}-{projectID}.json without prefix)
|
|
257
|
-
*/
|
|
258
|
-
function isAuthenticated(provider) {
|
|
259
|
-
const tokenDir = getProviderTokenDir(provider);
|
|
260
|
-
if (!fs.existsSync(tokenDir)) {
|
|
261
|
-
return false;
|
|
262
|
-
}
|
|
263
|
-
const validPrefixes = PROVIDER_AUTH_PREFIXES[provider] || [];
|
|
264
|
-
try {
|
|
265
|
-
const files = fs.readdirSync(tokenDir);
|
|
266
|
-
const jsonFiles = files.filter((f) => f.endsWith('.json') || f.endsWith('.token') || f === 'credentials');
|
|
267
|
-
// Strategy 1: Check by filename prefix (fast path for antigravity, codex)
|
|
268
|
-
const prefixMatch = jsonFiles.some((f) => {
|
|
269
|
-
const lowerFile = f.toLowerCase();
|
|
270
|
-
return validPrefixes.some((prefix) => lowerFile.startsWith(prefix));
|
|
271
|
-
});
|
|
272
|
-
if (prefixMatch)
|
|
273
|
-
return true;
|
|
274
|
-
// Strategy 2: Check JSON content for "type" field (needed for Gemini)
|
|
275
|
-
for (const f of jsonFiles) {
|
|
276
|
-
const filePath = path.join(tokenDir, f);
|
|
277
|
-
if (isTokenFileForProvider(filePath, provider)) {
|
|
278
|
-
return true;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
return false;
|
|
282
|
-
}
|
|
283
|
-
catch {
|
|
284
|
-
return false;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
exports.isAuthenticated = isAuthenticated;
|
|
288
|
-
/**
|
|
289
|
-
* Get detailed auth status for provider
|
|
290
|
-
* Uses same detection strategy as isAuthenticated: prefix first, then content
|
|
291
|
-
*/
|
|
292
|
-
function getAuthStatus(provider) {
|
|
293
|
-
const tokenDir = getProviderTokenDir(provider);
|
|
294
|
-
let tokenFiles = [];
|
|
295
|
-
let lastAuth;
|
|
296
|
-
const validPrefixes = PROVIDER_AUTH_PREFIXES[provider] || [];
|
|
297
|
-
if (fs.existsSync(tokenDir)) {
|
|
298
|
-
const files = fs.readdirSync(tokenDir);
|
|
299
|
-
const jsonFiles = files.filter((f) => f.endsWith('.json') || f.endsWith('.token') || f === 'credentials');
|
|
300
|
-
// Check each file: by prefix OR by content
|
|
301
|
-
tokenFiles = jsonFiles.filter((f) => {
|
|
302
|
-
const lowerFile = f.toLowerCase();
|
|
303
|
-
// Strategy 1: prefix match
|
|
304
|
-
if (validPrefixes.some((prefix) => lowerFile.startsWith(prefix))) {
|
|
305
|
-
return true;
|
|
306
|
-
}
|
|
307
|
-
// Strategy 2: content match (for Gemini tokens without prefix)
|
|
308
|
-
const filePath = path.join(tokenDir, f);
|
|
309
|
-
return isTokenFileForProvider(filePath, provider);
|
|
310
|
-
});
|
|
311
|
-
// Get most recent modification time
|
|
312
|
-
for (const file of tokenFiles) {
|
|
313
|
-
const filePath = path.join(tokenDir, file);
|
|
314
|
-
try {
|
|
315
|
-
const stats = fs.statSync(filePath);
|
|
316
|
-
if (!lastAuth || stats.mtime > lastAuth) {
|
|
317
|
-
lastAuth = stats.mtime;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
catch {
|
|
321
|
-
// Skip if can't stat file
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
// Get registered accounts for multi-account support
|
|
326
|
-
const accounts = (0, account_manager_1.getProviderAccounts)(provider);
|
|
327
|
-
const defaultAccount = (0, account_manager_1.getDefaultAccount)(provider);
|
|
328
|
-
return {
|
|
329
|
-
provider,
|
|
330
|
-
authenticated: tokenFiles.length > 0,
|
|
331
|
-
tokenDir,
|
|
332
|
-
tokenFiles,
|
|
333
|
-
lastAuth,
|
|
334
|
-
accounts,
|
|
335
|
-
defaultAccount: defaultAccount?.id,
|
|
336
|
-
};
|
|
337
|
-
}
|
|
338
|
-
exports.getAuthStatus = getAuthStatus;
|
|
339
|
-
/**
|
|
340
|
-
* Get auth status for all providers
|
|
341
|
-
*/
|
|
342
|
-
function getAllAuthStatus() {
|
|
343
|
-
const providers = ['gemini', 'codex', 'agy', 'qwen', 'iflow'];
|
|
344
|
-
return providers.map(getAuthStatus);
|
|
345
|
-
}
|
|
346
|
-
exports.getAllAuthStatus = getAllAuthStatus;
|
|
347
|
-
/**
|
|
348
|
-
* Clear authentication for provider
|
|
349
|
-
* Only removes files belonging to the specified provider (by prefix or content)
|
|
350
|
-
* Does NOT remove the shared auth directory or other providers' files
|
|
351
|
-
*/
|
|
352
|
-
function clearAuth(provider) {
|
|
353
|
-
const tokenDir = getProviderTokenDir(provider);
|
|
354
|
-
if (!fs.existsSync(tokenDir)) {
|
|
355
|
-
return false;
|
|
356
|
-
}
|
|
357
|
-
const validPrefixes = PROVIDER_AUTH_PREFIXES[provider] || [];
|
|
358
|
-
const files = fs.readdirSync(tokenDir);
|
|
359
|
-
let removedCount = 0;
|
|
360
|
-
// Only remove files that belong to this provider
|
|
361
|
-
for (const file of files) {
|
|
362
|
-
const filePath = path.join(tokenDir, file);
|
|
363
|
-
const lowerFile = file.toLowerCase();
|
|
364
|
-
// Check by prefix first (fast path)
|
|
365
|
-
const matchesByPrefix = validPrefixes.some((prefix) => lowerFile.startsWith(prefix));
|
|
366
|
-
// If no prefix match, check by content (for Gemini tokens without prefix)
|
|
367
|
-
const matchesByContent = !matchesByPrefix && isTokenFileForProvider(filePath, provider);
|
|
368
|
-
if (matchesByPrefix || matchesByContent) {
|
|
369
|
-
try {
|
|
370
|
-
fs.unlinkSync(filePath);
|
|
371
|
-
removedCount++;
|
|
372
|
-
}
|
|
373
|
-
catch {
|
|
374
|
-
// Failed to remove - skip
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
// DO NOT remove the shared auth directory - other providers may still have tokens
|
|
379
|
-
return removedCount > 0;
|
|
380
|
-
}
|
|
381
|
-
exports.clearAuth = clearAuth;
|
|
382
|
-
/**
|
|
383
|
-
* Display a single step status line
|
|
384
|
-
*/
|
|
385
|
-
function showStep(step, total, status, message) {
|
|
386
|
-
const statusIcon = status === 'ok' ? '[OK]' : status === 'fail' ? '[X]' : '[..]';
|
|
387
|
-
console.log(`${statusIcon} [${step}/${total}] ${message}`);
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* Get platform-specific troubleshooting for OAuth timeout
|
|
391
|
-
*/
|
|
392
|
-
function getTimeoutTroubleshooting(provider, port) {
|
|
393
|
-
const lines = [];
|
|
394
|
-
lines.push('');
|
|
395
|
-
lines.push('TROUBLESHOOTING:');
|
|
396
|
-
lines.push(' 1. Check browser completed auth (should show success page)');
|
|
397
|
-
if (port) {
|
|
398
|
-
lines.push(` 2. Check for port conflicts: lsof -ti:${port} or ss -tlnp | grep ${port}`);
|
|
399
|
-
lines.push(` 3. Try: ccs ${provider} --auth --verbose`);
|
|
400
|
-
}
|
|
401
|
-
else {
|
|
402
|
-
lines.push(` 2. Try: ccs ${provider} --auth --verbose`);
|
|
403
|
-
}
|
|
404
|
-
return lines;
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Trigger OAuth flow for provider
|
|
408
|
-
* Auto-detects headless environment and uses --no-browser flag accordingly
|
|
409
|
-
* Shows real-time step-by-step progress for better user feedback
|
|
410
|
-
* @param provider - The CLIProxy provider to authenticate
|
|
411
|
-
* @param options - OAuth options
|
|
412
|
-
* @param options.add - If true, skip confirm prompt when adding another account
|
|
413
|
-
* @returns Account info if successful, null otherwise
|
|
414
|
-
*/
|
|
415
|
-
async function triggerOAuth(provider, options = {}) {
|
|
416
|
-
const oauthConfig = getOAuthConfig(provider);
|
|
417
|
-
const { verbose = false, add = false, nickname, fromUI = false } = options;
|
|
418
|
-
const callbackPort = oauth_port_diagnostics_1.OAUTH_CALLBACK_PORTS[provider];
|
|
419
|
-
const isCLI = !fromUI; // CLI mode = auto-select default project
|
|
420
|
-
// Auto-detect headless if not explicitly set
|
|
421
|
-
const headless = options.headless ?? isHeadlessEnvironment();
|
|
422
|
-
const log = (msg) => {
|
|
423
|
-
if (verbose) {
|
|
424
|
-
console.error(`[auth] ${msg}`);
|
|
425
|
-
}
|
|
426
|
-
};
|
|
427
|
-
// Check for existing accounts and prompt if --add not specified
|
|
428
|
-
const existingAccounts = (0, account_manager_1.getProviderAccounts)(provider);
|
|
429
|
-
if (existingAccounts.length > 0 && !add) {
|
|
430
|
-
console.log('');
|
|
431
|
-
console.log((0, ui_1.info)(`${existingAccounts.length} account(s) already authenticated for ${oauthConfig.displayName}`));
|
|
432
|
-
// Import readline for confirm prompt
|
|
433
|
-
const readline = await Promise.resolve().then(() => __importStar(require('readline')));
|
|
434
|
-
const rl = readline.createInterface({
|
|
435
|
-
input: process.stdin,
|
|
436
|
-
output: process.stdout,
|
|
437
|
-
});
|
|
438
|
-
const confirmed = await new Promise((resolve) => {
|
|
439
|
-
rl.question('[?] Add another account? (y/N): ', (answer) => {
|
|
440
|
-
rl.close();
|
|
441
|
-
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
442
|
-
});
|
|
443
|
-
});
|
|
444
|
-
if (!confirmed) {
|
|
445
|
-
console.log((0, ui_1.info)('Cancelled'));
|
|
446
|
-
return null;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
// Enhanced pre-flight check with real-time display
|
|
450
|
-
console.log('');
|
|
451
|
-
console.log((0, ui_1.info)(`Pre-flight OAuth check for ${oauthConfig.displayName}...`));
|
|
452
|
-
const preflight = await (0, oauth_port_diagnostics_1.enhancedPreflightOAuthCheck)(provider);
|
|
453
|
-
// Display each check result
|
|
454
|
-
for (const check of preflight.checks) {
|
|
455
|
-
const icon = check.status === 'ok' ? '[OK]' : check.status === 'warn' ? '[!]' : '[X]';
|
|
456
|
-
console.log(` ${icon} ${check.name}: ${check.message}`);
|
|
457
|
-
if (check.fixCommand && check.status !== 'ok') {
|
|
458
|
-
console.log(` Fix: ${check.fixCommand}`);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
// Show firewall warning prominently on Windows
|
|
462
|
-
if (preflight.firewallWarning) {
|
|
463
|
-
console.log('');
|
|
464
|
-
console.log((0, ui_1.warn)('Windows Firewall may block OAuth callback'));
|
|
465
|
-
console.log(' If auth hangs, run as Administrator:');
|
|
466
|
-
console.log(` ${(0, ui_1.color)(preflight.firewallFixCommand || '', 'command')}`);
|
|
467
|
-
}
|
|
468
|
-
if (!preflight.ready) {
|
|
469
|
-
console.log('');
|
|
470
|
-
console.log((0, ui_1.fail)('Pre-flight check failed. Resolve issues above and retry.'));
|
|
471
|
-
return null;
|
|
472
|
-
}
|
|
473
|
-
console.log('');
|
|
474
|
-
// Step 1: Ensure binary exists
|
|
475
|
-
showStep(1, 4, 'progress', 'Preparing CLIProxy binary...');
|
|
476
|
-
let binaryPath;
|
|
477
|
-
try {
|
|
478
|
-
binaryPath = await (0, binary_manager_1.ensureCLIProxyBinary)(verbose);
|
|
479
|
-
// Clear and rewrite with OK
|
|
480
|
-
process.stdout.write('\x1b[1A\x1b[2K'); // Move up and clear line
|
|
481
|
-
showStep(1, 4, 'ok', 'CLIProxy binary ready');
|
|
482
|
-
}
|
|
483
|
-
catch (error) {
|
|
484
|
-
process.stdout.write('\x1b[1A\x1b[2K');
|
|
485
|
-
showStep(1, 4, 'fail', 'Failed to prepare CLIProxy binary');
|
|
486
|
-
console.error((0, ui_1.fail)(error.message));
|
|
487
|
-
throw error;
|
|
488
|
-
}
|
|
489
|
-
// Ensure auth directory exists
|
|
490
|
-
const tokenDir = getProviderTokenDir(provider);
|
|
491
|
-
fs.mkdirSync(tokenDir, { recursive: true, mode: 0o700 });
|
|
492
|
-
// Generate config file (CLIProxyAPI requires it even for auth)
|
|
493
|
-
const configPath = (0, config_generator_1.generateConfig)(provider);
|
|
494
|
-
log(`Config generated: ${configPath}`);
|
|
495
|
-
// Free OAuth callback port if needed
|
|
496
|
-
const localCallbackPort = OAUTH_CALLBACK_PORTS[provider];
|
|
497
|
-
if (localCallbackPort) {
|
|
498
|
-
const killed = killProcessOnPort(localCallbackPort, verbose);
|
|
499
|
-
if (killed) {
|
|
500
|
-
log(`Freed port ${localCallbackPort} for OAuth callback`);
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
// Build args: config + auth flag + optional --no-browser for headless
|
|
504
|
-
const args = ['--config', configPath, oauthConfig.authFlag];
|
|
505
|
-
if (headless) {
|
|
506
|
-
args.push('--no-browser');
|
|
507
|
-
}
|
|
508
|
-
// Step 2: Starting callback server
|
|
509
|
-
showStep(2, 4, 'progress', `Starting callback server on port ${callbackPort || 'N/A'}...`);
|
|
510
|
-
// Show headless instructions if needed
|
|
511
|
-
if (headless) {
|
|
512
|
-
console.log('');
|
|
513
|
-
console.log((0, ui_1.warn)('PORT FORWARDING REQUIRED'));
|
|
514
|
-
console.log(` OAuth callback uses localhost:${callbackPort} which must be reachable.`);
|
|
515
|
-
console.log(' Run this on your LOCAL machine:');
|
|
516
|
-
console.log(` ${(0, ui_1.color)(`ssh -L ${callbackPort}:localhost:${callbackPort} <USER>@<HOST>`, 'command')}`);
|
|
517
|
-
console.log('');
|
|
518
|
-
}
|
|
519
|
-
return new Promise((resolve) => {
|
|
520
|
-
// Spawn CLIProxyAPI with auth flag
|
|
521
|
-
// Use pipe for stdin to auto-respond to interactive prompts (e.g., project selection)
|
|
522
|
-
const authProcess = (0, child_process_1.spawn)(binaryPath, args, {
|
|
523
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
524
|
-
env: {
|
|
525
|
-
...process.env,
|
|
526
|
-
CLI_PROXY_AUTH_DIR: tokenDir,
|
|
527
|
-
},
|
|
528
|
-
});
|
|
529
|
-
let stderrData = '';
|
|
530
|
-
let urlDisplayed = false;
|
|
531
|
-
let browserOpened = false;
|
|
532
|
-
let projectPromptHandled = false;
|
|
533
|
-
let accumulatedOutput = ''; // Accumulate output to parse project list
|
|
534
|
-
let parsedProjects = [];
|
|
535
|
-
const sessionId = (0, project_selection_handler_1.generateSessionId)(); // Unique session ID for this auth flow
|
|
536
|
-
const startTime = Date.now();
|
|
537
|
-
authProcess.stdout?.on('data', async (data) => {
|
|
538
|
-
const output = data.toString();
|
|
539
|
-
log(`stdout: ${output.trim()}`);
|
|
540
|
-
// Accumulate output for project list parsing
|
|
541
|
-
accumulatedOutput += output;
|
|
542
|
-
// Parse project list when available
|
|
543
|
-
if ((0, project_selection_handler_1.isProjectList)(accumulatedOutput) && parsedProjects.length === 0) {
|
|
544
|
-
parsedProjects = (0, project_selection_handler_1.parseProjectList)(accumulatedOutput);
|
|
545
|
-
log(`Parsed ${parsedProjects.length} projects`);
|
|
546
|
-
}
|
|
547
|
-
// Handle project selection prompt
|
|
548
|
-
if (!projectPromptHandled && (0, project_selection_handler_1.isProjectSelectionPrompt)(output)) {
|
|
549
|
-
projectPromptHandled = true;
|
|
550
|
-
const defaultProjectId = (0, project_selection_handler_1.parseDefaultProject)(output) || '';
|
|
551
|
-
// If we have projects and this is a UI-triggered flow, request selection
|
|
552
|
-
if (parsedProjects.length > 0 && !isCLI) {
|
|
553
|
-
log(`Requesting project selection from UI (session: ${sessionId})`);
|
|
554
|
-
const prompt = {
|
|
555
|
-
sessionId,
|
|
556
|
-
provider,
|
|
557
|
-
projects: parsedProjects,
|
|
558
|
-
defaultProjectId,
|
|
559
|
-
supportsAll: output.includes('ALL'),
|
|
560
|
-
};
|
|
561
|
-
try {
|
|
562
|
-
// Request selection from UI (with timeout fallback to default)
|
|
563
|
-
const selectedId = await (0, project_selection_handler_1.requestProjectSelection)(prompt);
|
|
564
|
-
// Write selection to stdin (empty = default, else project ID or ALL)
|
|
565
|
-
const response = selectedId || '';
|
|
566
|
-
log(`User selected: ${response || '(default)'}`);
|
|
567
|
-
authProcess.stdin?.write(response + '\n');
|
|
568
|
-
}
|
|
569
|
-
catch {
|
|
570
|
-
// Fallback to default on error
|
|
571
|
-
log('Project selection failed, using default');
|
|
572
|
-
authProcess.stdin?.write('\n');
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
else {
|
|
576
|
-
// CLI mode or no projects: auto-select default
|
|
577
|
-
log('CLI mode or no projects, auto-selecting default');
|
|
578
|
-
authProcess.stdin?.write('\n');
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
// Detect when callback server starts or browser opens
|
|
582
|
-
if (!browserOpened && (output.includes('listening') || output.includes('http'))) {
|
|
583
|
-
process.stdout.write('\x1b[1A\x1b[2K');
|
|
584
|
-
showStep(2, 4, 'ok', `Callback server listening on port ${callbackPort}`);
|
|
585
|
-
showStep(3, 4, 'progress', 'Opening browser...');
|
|
586
|
-
browserOpened = true;
|
|
587
|
-
}
|
|
588
|
-
// In headless mode, display OAuth URLs prominently
|
|
589
|
-
if (headless) {
|
|
590
|
-
const urlMatch = output.match(/https?:\/\/[^\s]+/);
|
|
591
|
-
if (urlMatch && !urlDisplayed) {
|
|
592
|
-
console.log('');
|
|
593
|
-
console.log((0, ui_1.info)(`${oauthConfig.displayName} OAuth URL:`));
|
|
594
|
-
console.log(` ${urlMatch[0]}`);
|
|
595
|
-
console.log('');
|
|
596
|
-
urlDisplayed = true;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
});
|
|
600
|
-
authProcess.stderr?.on('data', (data) => {
|
|
601
|
-
const output = data.toString();
|
|
602
|
-
stderrData += output;
|
|
603
|
-
log(`stderr: ${output.trim()}`);
|
|
604
|
-
// Also check stderr for URLs
|
|
605
|
-
if (headless && !urlDisplayed) {
|
|
606
|
-
const urlMatch = output.match(/https?:\/\/[^\s]+/);
|
|
607
|
-
if (urlMatch) {
|
|
608
|
-
console.log('');
|
|
609
|
-
console.log((0, ui_1.info)(`${oauthConfig.displayName} OAuth URL:`));
|
|
610
|
-
console.log(` ${urlMatch[0]}`);
|
|
611
|
-
console.log('');
|
|
612
|
-
urlDisplayed = true;
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
});
|
|
616
|
-
// After a short delay, assume browser opened and show waiting
|
|
617
|
-
setTimeout(() => {
|
|
618
|
-
if (!browserOpened) {
|
|
619
|
-
process.stdout.write('\x1b[1A\x1b[2K');
|
|
620
|
-
showStep(2, 4, 'ok', `Callback server ready (port ${callbackPort})`);
|
|
621
|
-
showStep(3, 4, 'ok', 'Browser opened');
|
|
622
|
-
browserOpened = true;
|
|
623
|
-
}
|
|
624
|
-
showStep(4, 4, 'progress', 'Waiting for OAuth callback...');
|
|
625
|
-
console.log('');
|
|
626
|
-
console.log((0, ui_1.info)('Complete the login in your browser. This page will update automatically.'));
|
|
627
|
-
if (!verbose) {
|
|
628
|
-
console.log((0, ui_1.info)('If stuck, try: ccs ' + provider + ' --auth --verbose'));
|
|
629
|
-
}
|
|
630
|
-
}, 2000);
|
|
631
|
-
// Timeout after 5 minutes for headless, 2 minutes for normal
|
|
632
|
-
const timeoutMs = headless ? 300000 : 120000;
|
|
633
|
-
const timeout = setTimeout(() => {
|
|
634
|
-
authProcess.kill();
|
|
635
|
-
console.log('');
|
|
636
|
-
console.log((0, ui_1.fail)(`OAuth timed out after ${headless ? 5 : 2} minutes`));
|
|
637
|
-
// Show platform-specific troubleshooting
|
|
638
|
-
const troubleshooting = getTimeoutTroubleshooting(provider, callbackPort);
|
|
639
|
-
for (const line of troubleshooting) {
|
|
640
|
-
console.log(line);
|
|
641
|
-
}
|
|
642
|
-
resolve(null);
|
|
643
|
-
}, timeoutMs);
|
|
644
|
-
authProcess.on('exit', (code) => {
|
|
645
|
-
clearTimeout(timeout);
|
|
646
|
-
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
647
|
-
if (code === 0) {
|
|
648
|
-
// Verify token was created BEFORE showing success
|
|
649
|
-
if (isAuthenticated(provider)) {
|
|
650
|
-
console.log('');
|
|
651
|
-
console.log((0, ui_1.ok)(`Authentication successful (${elapsed}s)`));
|
|
652
|
-
// Register the account in accounts registry
|
|
653
|
-
const account = registerAccountFromToken(provider, tokenDir, nickname);
|
|
654
|
-
resolve(account);
|
|
655
|
-
}
|
|
656
|
-
else {
|
|
657
|
-
console.log('');
|
|
658
|
-
console.log((0, ui_1.fail)('Token not found after authentication'));
|
|
659
|
-
console.log('');
|
|
660
|
-
console.log('The browser showed success but callback was not received.');
|
|
661
|
-
// Show platform-specific guidance
|
|
662
|
-
if (process.platform === 'win32') {
|
|
663
|
-
console.log('');
|
|
664
|
-
console.log('On Windows, this usually means:');
|
|
665
|
-
console.log(' 1. Windows Firewall blocked the callback');
|
|
666
|
-
console.log(' 2. Antivirus software blocked the connection');
|
|
667
|
-
console.log('');
|
|
668
|
-
console.log('Try running as Administrator:');
|
|
669
|
-
console.log(` netsh advfirewall firewall add rule name="CCS OAuth" dir=in action=allow protocol=TCP localport=${callbackPort}`);
|
|
670
|
-
}
|
|
671
|
-
console.log('');
|
|
672
|
-
console.log(`Try: ccs ${provider} --auth --verbose`);
|
|
673
|
-
resolve(null);
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
else {
|
|
677
|
-
console.log('');
|
|
678
|
-
console.log((0, ui_1.fail)(`CLIProxyAPI auth exited with code ${code}`));
|
|
679
|
-
if (stderrData && !urlDisplayed) {
|
|
680
|
-
console.log(` ${stderrData.trim().split('\n')[0]}`);
|
|
681
|
-
}
|
|
682
|
-
if (headless && !urlDisplayed) {
|
|
683
|
-
console.log('');
|
|
684
|
-
console.log((0, ui_1.info)('No OAuth URL was displayed. Try with --verbose for details.'));
|
|
685
|
-
}
|
|
686
|
-
resolve(null);
|
|
687
|
-
}
|
|
688
|
-
});
|
|
689
|
-
authProcess.on('error', (error) => {
|
|
690
|
-
clearTimeout(timeout);
|
|
691
|
-
console.log('');
|
|
692
|
-
console.log((0, ui_1.fail)(`Failed to start auth process: ${error.message}`));
|
|
693
|
-
resolve(null);
|
|
694
|
-
});
|
|
695
|
-
});
|
|
696
|
-
}
|
|
697
|
-
exports.triggerOAuth = triggerOAuth;
|
|
698
|
-
/**
|
|
699
|
-
* Register account from newly created token file
|
|
700
|
-
* Scans auth directory for new token and extracts email
|
|
701
|
-
* @param provider - The CLIProxy provider
|
|
702
|
-
* @param tokenDir - Directory containing token files
|
|
703
|
-
* @param nickname - Optional nickname (uses auto-generated from email if not provided)
|
|
704
|
-
*/
|
|
705
|
-
function registerAccountFromToken(provider, tokenDir, nickname) {
|
|
706
|
-
try {
|
|
707
|
-
const files = fs.readdirSync(tokenDir);
|
|
708
|
-
const jsonFiles = files.filter((f) => f.endsWith('.json'));
|
|
709
|
-
// Find newest token file for this provider
|
|
710
|
-
let newestFile = null;
|
|
711
|
-
let newestMtime = 0;
|
|
712
|
-
for (const file of jsonFiles) {
|
|
713
|
-
const filePath = path.join(tokenDir, file);
|
|
714
|
-
if (!isTokenFileForProvider(filePath, provider))
|
|
715
|
-
continue;
|
|
716
|
-
const stats = fs.statSync(filePath);
|
|
717
|
-
if (stats.mtimeMs > newestMtime) {
|
|
718
|
-
newestMtime = stats.mtimeMs;
|
|
719
|
-
newestFile = file;
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
if (!newestFile) {
|
|
723
|
-
return null;
|
|
724
|
-
}
|
|
725
|
-
// Read token to extract email
|
|
726
|
-
const tokenPath = path.join(tokenDir, newestFile);
|
|
727
|
-
const content = fs.readFileSync(tokenPath, 'utf-8');
|
|
728
|
-
const data = JSON.parse(content);
|
|
729
|
-
const email = data.email || undefined;
|
|
730
|
-
// Register the account (use provided nickname or auto-generate from email)
|
|
731
|
-
return (0, account_manager_1.registerAccount)(provider, newestFile, email, nickname || (0, account_manager_1.generateNickname)(email));
|
|
732
|
-
}
|
|
733
|
-
catch {
|
|
734
|
-
return null;
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
/**
|
|
738
|
-
* Ensure provider is authenticated
|
|
739
|
-
* Triggers OAuth flow if not authenticated
|
|
740
|
-
* @param provider - The CLIProxy provider
|
|
741
|
-
* @param options - Auth options including optional account
|
|
742
|
-
* @returns true if authenticated, false otherwise
|
|
743
|
-
*/
|
|
744
|
-
async function ensureAuth(provider, options = {}) {
|
|
745
|
-
// Check if already authenticated
|
|
746
|
-
if (isAuthenticated(provider)) {
|
|
747
|
-
if (options.verbose) {
|
|
748
|
-
console.error(`[auth] ${provider} already authenticated`);
|
|
749
|
-
}
|
|
750
|
-
// Touch the account to update last used time
|
|
751
|
-
const defaultAccount = (0, account_manager_1.getDefaultAccount)(provider);
|
|
752
|
-
if (defaultAccount) {
|
|
753
|
-
(0, account_manager_1.touchAccount)(provider, options.account || defaultAccount.id);
|
|
754
|
-
}
|
|
755
|
-
return true;
|
|
756
|
-
}
|
|
757
|
-
// Not authenticated - trigger OAuth
|
|
758
|
-
const oauthConfig = getOAuthConfig(provider);
|
|
759
|
-
console.log((0, ui_1.info)(`${oauthConfig.displayName} authentication required`));
|
|
760
|
-
const account = await triggerOAuth(provider, options);
|
|
761
|
-
return account !== null;
|
|
762
|
-
}
|
|
763
|
-
exports.ensureAuth = ensureAuth;
|
|
764
52
|
/**
|
|
765
53
|
* Initialize accounts registry from existing tokens
|
|
766
54
|
* Should be called on startup to populate accounts from existing token files
|
|
@@ -769,23 +57,4 @@ function initializeAccounts() {
|
|
|
769
57
|
(0, account_manager_1.discoverExistingAccounts)();
|
|
770
58
|
}
|
|
771
59
|
exports.initializeAccounts = initializeAccounts;
|
|
772
|
-
/**
|
|
773
|
-
* Display auth status for all providers
|
|
774
|
-
*/
|
|
775
|
-
function displayAuthStatus() {
|
|
776
|
-
console.log('CLIProxy Authentication Status:');
|
|
777
|
-
console.log('');
|
|
778
|
-
const statuses = getAllAuthStatus();
|
|
779
|
-
for (const status of statuses) {
|
|
780
|
-
const oauthConfig = getOAuthConfig(status.provider);
|
|
781
|
-
const icon = status.authenticated ? '[OK]' : '[!]';
|
|
782
|
-
const authStatus = status.authenticated ? 'Authenticated' : 'Not authenticated';
|
|
783
|
-
const lastAuthStr = status.lastAuth ? ` (last: ${status.lastAuth.toLocaleDateString()})` : '';
|
|
784
|
-
console.log(`${icon} ${oauthConfig.displayName}: ${authStatus}${lastAuthStr}`);
|
|
785
|
-
}
|
|
786
|
-
console.log('');
|
|
787
|
-
console.log('To authenticate: ccs <provider> --auth');
|
|
788
|
-
console.log('To logout: ccs <provider> --logout');
|
|
789
|
-
}
|
|
790
|
-
exports.displayAuthStatus = displayAuthStatus;
|
|
791
60
|
//# sourceMappingURL=auth-handler.js.map
|