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