codex-multi-auth 2.17.0 → 2.17.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codex-plugin/plugin.json +9 -9
- package/LICENSE +21 -21
- package/README.md +142 -484
- package/assets/codex-multi-auth-icon.svg +39 -39
- package/assets/readme-hero.svg +31 -31
- package/config/README.md +31 -31
- package/config/codex-legacy.json +1221 -1221
- package/config/codex-modern.json +423 -423
- package/config/minimal-codex.json +15 -15
- package/dist/index.d.ts +0 -1
- package/dist/lib/account-policy.d.ts +18 -2
- package/dist/lib/account-policy.js +97 -40
- package/dist/lib/accounts/rate-limits.d.ts +0 -1
- package/dist/lib/accounts.d.ts +1 -8
- package/dist/lib/accounts.d.ts.map +1 -1
- package/dist/lib/accounts.js +7 -19
- package/dist/lib/api-route-store.d.ts +0 -1
- package/dist/lib/audit.d.ts +0 -1
- package/dist/lib/audit.js +43 -12
- package/dist/lib/auth/account-access.d.ts +0 -1
- package/dist/lib/auth/account-access.js +5 -1
- package/dist/lib/auth/auth.d.ts +4 -3
- package/dist/lib/auth/auth.js +220 -28
- package/dist/lib/auth/browser.d.ts +0 -1
- package/dist/lib/auth/callback-guidance.d.ts +0 -1
- package/dist/lib/auth/device-auth.d.ts +0 -1
- package/dist/lib/auth/index.d.ts +0 -1
- package/dist/lib/auth/org-override.d.ts +0 -1
- package/dist/lib/auth/server.d.ts +1 -2
- package/dist/lib/auth/server.js +100 -53
- package/dist/lib/auth/token-utils.d.ts +0 -1
- package/dist/lib/auth-rate-limit.d.ts +0 -1
- package/dist/lib/budget-guard.d.ts +16 -2
- package/dist/lib/budget-guard.js +123 -43
- package/dist/lib/capability-policy.d.ts +0 -1
- package/dist/lib/circuit-breaker.d.ts +20 -1
- package/dist/lib/circuit-breaker.js +24 -5
- package/dist/lib/cli.d.ts +0 -1
- package/dist/lib/codex-cli/index.d.ts +0 -1
- package/dist/lib/codex-cli/observability.d.ts +0 -1
- package/dist/lib/codex-cli/state.d.ts +0 -1
- package/dist/lib/codex-cli/sync.d.ts +0 -1
- package/dist/lib/codex-cli/writer.d.ts +0 -1
- package/dist/lib/codex-manager/account-credentials.d.ts +0 -1
- package/dist/lib/codex-manager/account-manager-commands.d.ts +0 -1
- package/dist/lib/codex-manager/account-pool-write.d.ts +0 -1
- package/dist/lib/codex-manager/active-account-sync.d.ts +6 -0
- package/dist/lib/codex-manager/active-account-sync.js +336 -0
- package/dist/lib/codex-manager/api-login-menu.d.ts +0 -1
- package/dist/lib/codex-manager/backend-category-entry.d.ts +0 -1
- package/dist/lib/codex-manager/backend-category-helpers.d.ts +0 -1
- package/dist/lib/codex-manager/backend-category-prompt.d.ts +0 -1
- package/dist/lib/codex-manager/backend-settings-controller.d.ts +0 -1
- package/dist/lib/codex-manager/backend-settings-entry.d.ts +0 -1
- package/dist/lib/codex-manager/backend-settings-helpers.d.ts +0 -1
- package/dist/lib/codex-manager/backend-settings-prompt.d.ts +0 -1
- package/dist/lib/codex-manager/backend-settings-schema.d.ts +0 -1
- package/dist/lib/codex-manager/behavior-settings-panel.d.ts +0 -1
- package/dist/lib/codex-manager/commands/account.d.ts +8 -3
- package/dist/lib/codex-manager/commands/account.js +46 -34
- package/dist/lib/codex-manager/commands/best.d.ts +0 -1
- package/dist/lib/codex-manager/commands/bridge.d.ts +0 -1
- package/dist/lib/codex-manager/commands/budget.d.ts +8 -3
- package/dist/lib/codex-manager/commands/budget.js +6 -4
- package/dist/lib/codex-manager/commands/check.d.ts +0 -1
- package/dist/lib/codex-manager/commands/config-explain.d.ts +0 -1
- package/dist/lib/codex-manager/commands/debug-bundle.d.ts +0 -1
- package/dist/lib/codex-manager/commands/forecast.d.ts +1 -2
- package/dist/lib/codex-manager/commands/forecast.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/forecast.js +2 -2
- package/dist/lib/codex-manager/commands/history.d.ts +0 -1
- package/dist/lib/codex-manager/commands/init-config.d.ts +0 -1
- package/dist/lib/codex-manager/commands/integrations.d.ts +0 -1
- package/dist/lib/codex-manager/commands/limits.d.ts +0 -1
- package/dist/lib/codex-manager/commands/models.d.ts +0 -1
- package/dist/lib/codex-manager/commands/monitor.d.ts +0 -1
- package/dist/lib/codex-manager/commands/report.d.ts +0 -1
- package/dist/lib/codex-manager/commands/resets.d.ts +0 -1
- package/dist/lib/codex-manager/commands/resets.js +9 -1
- package/dist/lib/codex-manager/commands/rotation.d.ts +0 -1
- package/dist/lib/codex-manager/commands/status.d.ts +0 -1
- package/dist/lib/codex-manager/commands/switch.d.ts +0 -1
- package/dist/lib/codex-manager/commands/uninstall.d.ts +0 -1
- package/dist/lib/codex-manager/commands/unpin.d.ts +0 -1
- package/dist/lib/codex-manager/commands/usage.d.ts +0 -1
- package/dist/lib/codex-manager/commands/verify.d.ts +0 -1
- package/dist/lib/codex-manager/commands/why-selected.d.ts +0 -1
- package/dist/lib/codex-manager/commands/workspace.d.ts +0 -1
- package/dist/lib/codex-manager/dashboard-display-panel.d.ts +0 -1
- package/dist/lib/codex-manager/dashboard-formatters.d.ts +0 -1
- package/dist/lib/codex-manager/dashboard-settings-controller.d.ts +0 -1
- package/dist/lib/codex-manager/dashboard-settings-data.d.ts +0 -1
- package/dist/lib/codex-manager/dashboard-settings-entry.d.ts +0 -1
- package/dist/lib/codex-manager/experimental-settings-entry.d.ts +0 -1
- package/dist/lib/codex-manager/experimental-settings-prompt.d.ts +0 -1
- package/dist/lib/codex-manager/experimental-settings-schema.d.ts +0 -1
- package/dist/lib/codex-manager/experimental-sync-target-entry.d.ts +0 -1
- package/dist/lib/codex-manager/experimental-sync-target.d.ts +0 -1
- package/dist/lib/codex-manager/forecast-report-shared.d.ts +0 -1
- package/dist/lib/codex-manager/formatters/account-formatters.d.ts +0 -1
- package/dist/lib/codex-manager/formatters/index.d.ts +0 -1
- package/dist/lib/codex-manager/formatters/model-formatters.d.ts +0 -1
- package/dist/lib/codex-manager/formatters/quota-formatters.d.ts +0 -1
- package/dist/lib/codex-manager/formatters/text-style.d.ts +0 -1
- package/dist/lib/codex-manager/health-check.d.ts +0 -1
- package/dist/lib/codex-manager/health-check.js +1 -1
- package/dist/lib/codex-manager/help.d.ts +0 -1
- package/dist/lib/codex-manager/login-action-panel.d.ts +0 -1
- package/dist/lib/codex-manager/login-flow.d.ts +0 -1
- package/dist/lib/codex-manager/login-menu-actions.d.ts +0 -1
- package/dist/lib/codex-manager/login-menu-data.d.ts +0 -1
- package/dist/lib/codex-manager/login-menu-data.d.ts.map +1 -1
- package/dist/lib/codex-manager/login-menu-data.js +7 -3
- package/dist/lib/codex-manager/login-oauth.d.ts +0 -1
- package/dist/lib/codex-manager/login-workspace-choice.d.ts +0 -1
- package/dist/lib/codex-manager/manual-callback.d.ts +0 -1
- package/dist/lib/codex-manager/persist-selected-account.d.ts +0 -1
- package/dist/lib/codex-manager/quota-cache-helpers.d.ts +7 -2
- package/dist/lib/codex-manager/quota-cache-helpers.d.ts.map +1 -1
- package/dist/lib/codex-manager/quota-cache-helpers.js +34 -19
- package/dist/lib/codex-manager/rate-limit-markers.d.ts +0 -1
- package/dist/lib/codex-manager/repair-commands.d.ts +0 -1
- package/dist/lib/codex-manager/repair-commands.js +1 -1
- package/dist/lib/codex-manager/settings-hub/backend.d.ts +0 -1
- package/dist/lib/codex-manager/settings-hub/dashboard.d.ts +0 -1
- package/dist/lib/codex-manager/settings-hub/experimental.d.ts +0 -1
- package/dist/lib/codex-manager/settings-hub/index.d.ts +0 -1
- package/dist/lib/codex-manager/settings-hub/shared.d.ts +0 -1
- package/dist/lib/codex-manager/settings-hub-entry.d.ts +0 -1
- package/dist/lib/codex-manager/settings-hub-menu.d.ts +0 -1
- package/dist/lib/codex-manager/settings-hub-prompt.d.ts +0 -1
- package/dist/lib/codex-manager/settings-hub.d.ts +0 -1
- package/dist/lib/codex-manager/settings-panels.d.ts +0 -1
- package/dist/lib/codex-manager/settings-persist-utils.d.ts +0 -1
- package/dist/lib/codex-manager/settings-preview.d.ts +0 -1
- package/dist/lib/codex-manager/settings-write-queue.d.ts +0 -1
- package/dist/lib/codex-manager/statusline-settings-panel.d.ts +0 -1
- package/dist/lib/codex-manager/theme-settings-panel.d.ts +0 -1
- package/dist/lib/codex-manager/unified-settings-controller.d.ts +0 -1
- package/dist/lib/codex-manager/unified-settings-entry.d.ts +0 -1
- package/dist/lib/codex-manager.d.ts +1 -2
- package/dist/lib/codex-manager.js +5 -95
- package/dist/lib/concurrency.d.ts +0 -1
- package/dist/lib/config-schema.d.ts +0 -1
- package/dist/lib/config.d.ts +0 -1
- package/dist/lib/config.js +46 -241
- package/dist/lib/constants.d.ts +0 -1
- package/dist/lib/context-budget/model-context-windows.d.ts +0 -1
- package/dist/lib/context-budget-guard.d.ts +0 -1
- package/dist/lib/context-budget-response.d.ts +0 -1
- package/dist/lib/context-budget-response.js +8 -8
- package/dist/lib/context-overflow.d.ts +0 -1
- package/dist/lib/context-overflow.js +10 -10
- package/dist/lib/dashboard-settings.d.ts +0 -1
- package/dist/lib/entitlement-cache.d.ts +0 -1
- package/dist/lib/env-parsing.d.ts +13 -1
- package/dist/lib/env-parsing.js +21 -0
- package/dist/lib/errors.d.ts +0 -1
- package/dist/lib/forecast.d.ts +0 -1
- package/dist/lib/fs-retry.d.ts +0 -1
- package/dist/lib/health.d.ts +0 -1
- package/dist/lib/index.d.ts +0 -1
- package/dist/lib/integration-generators.d.ts +0 -1
- package/dist/lib/live-account-sync.d.ts +0 -1
- package/dist/lib/local-bridge.d.ts +0 -1
- package/dist/lib/local-bridge.js +4 -1
- package/dist/lib/local-client-tokens.d.ts +0 -1
- package/dist/lib/local-client-tokens.js +125 -30
- package/dist/lib/logger.d.ts +0 -1
- package/dist/lib/logger.js +11 -1
- package/dist/lib/model-capability-matrix.d.ts +0 -1
- package/dist/lib/model-route-policy.d.ts +1 -2
- package/dist/lib/named-backup-export.d.ts +0 -1
- package/dist/lib/oauth-success.html +125 -125
- package/dist/lib/oc-chatgpt-import-adapter.d.ts +0 -1
- package/dist/lib/oc-chatgpt-orchestrator.d.ts +0 -1
- package/dist/lib/oc-chatgpt-target-detection.d.ts +0 -1
- package/dist/lib/parallel-probe.d.ts +0 -1
- package/dist/lib/policy/runtime-policy-cache.d.ts +80 -0
- package/dist/lib/policy/runtime-policy-cache.js +310 -0
- package/dist/lib/policy/runtime-policy.d.ts +1 -2
- package/dist/lib/policy/runtime-policy.js +46 -19
- package/dist/lib/preemptive-quota-scheduler.d.ts +0 -1
- package/dist/lib/proactive-refresh.d.ts +0 -1
- package/dist/lib/prompts/codex-host-bridge.d.ts +0 -1
- package/dist/lib/prompts/codex-host-bridge.js +138 -138
- package/dist/lib/prompts/codex.d.ts +0 -1
- package/dist/lib/prompts/codex.js +79 -79
- package/dist/lib/prompts/fetch-utils.d.ts +0 -1
- package/dist/lib/prompts/host-codex-prompt.d.ts +0 -1
- package/dist/lib/quota-cache.d.ts +7 -4
- package/dist/lib/quota-cache.d.ts.map +1 -1
- package/dist/lib/quota-cache.js +117 -61
- package/dist/lib/quota-probe.d.ts +0 -1
- package/dist/lib/quota-probe.js +5 -2
- package/dist/lib/quota-readiness.d.ts +7 -3
- package/dist/lib/quota-readiness.d.ts.map +1 -1
- package/dist/lib/quota-readiness.js +25 -4
- package/dist/lib/recovery/constants.d.ts +0 -1
- package/dist/lib/recovery/storage.d.ts +0 -1
- package/dist/lib/recovery/types.d.ts +0 -1
- package/dist/lib/recovery.d.ts +0 -1
- package/dist/lib/redaction.d.ts +0 -1
- package/dist/lib/refresh-guardian.d.ts +0 -1
- package/dist/lib/refresh-lease.d.ts +0 -1
- package/dist/lib/refresh-queue.d.ts +0 -1
- package/dist/lib/request/client-cancellation.d.ts +0 -1
- package/dist/lib/request/error-classification.d.ts +0 -1
- package/dist/lib/request/failover-config.d.ts +0 -1
- package/dist/lib/request/failure-policy.d.ts +0 -1
- package/dist/lib/request/fetch-helpers.d.ts +0 -1
- package/dist/lib/request/headers.d.ts +0 -1
- package/dist/lib/request/helpers/input-utils.d.ts +0 -1
- package/dist/lib/request/helpers/input-utils.js +88 -34
- package/dist/lib/request/helpers/model-map.d.ts +0 -1
- package/dist/lib/request/helpers/tool-utils.d.ts +0 -1
- package/dist/lib/request/helpers/tool-utils.js +421 -4
- package/dist/lib/request/index.d.ts +0 -1
- package/dist/lib/request/rate-limit-backoff.d.ts +0 -1
- package/dist/lib/request/rate-limit-decision.d.ts +0 -1
- package/dist/lib/request/request-attempt-budget.d.ts +0 -1
- package/dist/lib/request/request-init.d.ts +0 -1
- package/dist/lib/request/request-resilience.d.ts +0 -1
- package/dist/lib/request/request-transformer.d.ts +0 -1
- package/dist/lib/request/request-transformer.js +50 -25
- package/dist/lib/request/response-compaction.d.ts +0 -1
- package/dist/lib/request/response-handler.d.ts +0 -1
- package/dist/lib/request/response-metadata.d.ts +0 -1
- package/dist/lib/request/response-outcome.d.ts +0 -1
- package/dist/lib/request/stream-failover-runtime.d.ts +0 -1
- package/dist/lib/request/stream-failover.d.ts +0 -1
- package/dist/lib/request/stream-failover.js +28 -4
- package/dist/lib/request/token-refresh.d.ts +0 -1
- package/dist/lib/request/url-rewriting.d.ts +0 -1
- package/dist/lib/request/wait-utils.d.ts +0 -1
- package/dist/lib/rotation.d.ts +0 -1
- package/dist/lib/routing-mutex.d.ts +0 -1
- package/dist/lib/routing-profiles.d.ts +16 -2
- package/dist/lib/routing-profiles.js +119 -44
- package/dist/lib/runtime/account-check-helpers.d.ts +0 -1
- package/dist/lib/runtime/account-check-types.d.ts +0 -1
- package/dist/lib/runtime/account-check.d.ts +0 -1
- package/dist/lib/runtime/account-manager-cache-entry.d.ts +0 -1
- package/dist/lib/runtime/account-manager-cache.d.ts +0 -1
- package/dist/lib/runtime/account-model-catalog.d.ts +1 -2
- package/dist/lib/runtime/account-pool.d.ts +0 -1
- package/dist/lib/runtime/account-reset-credits.d.ts +0 -1
- package/dist/lib/runtime/account-reset-credits.js +8 -2
- package/dist/lib/runtime/account-scope.d.ts +0 -1
- package/dist/lib/runtime/account-select-event.d.ts +0 -1
- package/dist/lib/runtime/account-selection.d.ts +0 -1
- package/dist/lib/runtime/account-state.d.ts +0 -1
- package/dist/lib/runtime/account-status.d.ts +0 -1
- package/dist/lib/runtime/account-storage-scope-entry.d.ts +0 -1
- package/dist/lib/runtime/api-model-capabilities.d.ts +0 -1
- package/dist/lib/runtime/api-model-runtime.d.ts +0 -1
- package/dist/lib/runtime/app-bind.d.ts +0 -1
- package/dist/lib/runtime/app-bind.d.ts.map +1 -1
- package/dist/lib/runtime/app-bind.js +10 -2
- package/dist/lib/runtime/app-helper-selection.d.ts +0 -1
- package/dist/lib/runtime/auth-facade.d.ts +0 -1
- package/dist/lib/runtime/automatic-account-checks.d.ts +5 -2
- package/dist/lib/runtime/automatic-account-checks.d.ts.map +1 -1
- package/dist/lib/runtime/automatic-account-checks.js +29 -2
- package/dist/lib/runtime/automatic-subscription-checks.d.ts +1 -2
- package/dist/lib/runtime/automatic-subscription-checks.d.ts.map +1 -1
- package/dist/lib/runtime/automatic-subscription-checks.js +13 -16
- package/dist/lib/runtime/browser-oauth-flow.d.ts +0 -1
- package/dist/lib/runtime/capability-boost.d.ts +0 -1
- package/dist/lib/runtime/catalog-capabilities.d.ts +0 -1
- package/dist/lib/runtime/config-toml.d.ts +0 -1
- package/dist/lib/runtime/context-budget-settings.d.ts +0 -1
- package/dist/lib/runtime/event-handler.d.ts +0 -1
- package/dist/lib/runtime/first-run.d.ts +0 -1
- package/dist/lib/runtime/flagged-verify-types.d.ts +0 -1
- package/dist/lib/runtime/hydrate-emails.d.ts +0 -1
- package/dist/lib/runtime/inference-activity.d.ts +0 -1
- package/dist/lib/runtime/live-sync-entry.d.ts +0 -1
- package/dist/lib/runtime/live-sync.d.ts +0 -1
- package/dist/lib/runtime/loader-setup.d.ts +0 -1
- package/dist/lib/runtime/login-menu-accounts.d.ts +0 -1
- package/dist/lib/runtime/manual-oauth-flow.d.ts +0 -1
- package/dist/lib/runtime/model-discovery-status.d.ts +2 -3
- package/dist/lib/runtime/native-account-storage.d.ts +0 -1
- package/dist/lib/runtime/native-account-sync.d.ts +0 -1
- package/dist/lib/runtime/native-binding-lock.d.ts +0 -1
- package/dist/lib/runtime/native-client-auth.d.ts +0 -1
- package/dist/lib/runtime/native-provider-config.d.ts +0 -1
- package/dist/lib/runtime/native-rate-limits.d.ts +2 -1
- package/dist/lib/runtime/native-rate-limits.js +23 -6
- package/dist/lib/runtime/preemptive-quota.d.ts +0 -1
- package/dist/lib/runtime/quota-headers.d.ts +0 -1
- package/dist/lib/runtime/quota-probe.d.ts +0 -1
- package/dist/lib/runtime/quota-settings.d.ts +0 -1
- package/dist/lib/runtime/refresh-guardian-entry.d.ts +0 -1
- package/dist/lib/runtime/refresh-guardian.d.ts +0 -1
- package/dist/lib/runtime/request-init.d.ts +0 -1
- package/dist/lib/runtime/reset-credit-routing.d.ts +0 -1
- package/dist/lib/runtime/reset-credits.d.ts +0 -1
- package/dist/lib/runtime/response-output-history.d.ts +0 -1
- package/dist/lib/runtime/responses-websocket.d.ts +0 -1
- package/dist/lib/runtime/resume-picker.d.ts +0 -1
- package/dist/lib/runtime/rotation-account-selection.d.ts +0 -1
- package/dist/lib/runtime/rotation-proxy-state.d.ts +0 -1
- package/dist/lib/runtime/rotation-server-types.d.ts +0 -1
- package/dist/lib/runtime/rotation-storage-meta.d.ts +0 -1
- package/dist/lib/runtime/rotation-token-refresh.d.ts +0 -1
- package/dist/lib/runtime/runtime-capability-failures.d.ts +0 -1
- package/dist/lib/runtime/runtime-current-account.d.ts +0 -1
- package/dist/lib/runtime/runtime-observability.d.ts +0 -1
- package/dist/lib/runtime/runtime-services.d.ts +0 -1
- package/dist/lib/runtime/session-affinity-entry.d.ts +0 -1
- package/dist/lib/runtime/session-recovery.d.ts +0 -1
- package/dist/lib/runtime/status-marker.d.ts +0 -1
- package/dist/lib/runtime/storage-scope.d.ts +0 -1
- package/dist/lib/runtime/subscription-first-use.d.ts +0 -1
- package/dist/lib/runtime/subscription-quota-event.d.ts +0 -1
- package/dist/lib/runtime/subscription-quota-order.d.ts +0 -1
- package/dist/lib/runtime/toast.d.ts +0 -1
- package/dist/lib/runtime/ui-runtime-entry.d.ts +0 -1
- package/dist/lib/runtime/ui-runtime.d.ts +0 -1
- package/dist/lib/runtime/verify-flagged.d.ts +0 -1
- package/dist/lib/runtime/workspace-model-scopes.d.ts +0 -1
- package/dist/lib/runtime-constants.d.ts +0 -1
- package/dist/lib/runtime-paths.d.ts +0 -1
- package/dist/lib/runtime-rotation-proxy.d.ts +1 -1
- package/dist/lib/runtime-rotation-proxy.js +136 -3
- package/dist/lib/schemas.d.ts +35 -13
- package/dist/lib/schemas.js +19 -2
- package/dist/lib/session-affinity.d.ts +0 -1
- package/dist/lib/shutdown.d.ts +0 -1
- package/dist/lib/storage/account-clear-entry.d.ts +0 -1
- package/dist/lib/storage/account-clear.d.ts +0 -1
- package/dist/lib/storage/account-match-utils.d.ts +0 -1
- package/dist/lib/storage/account-persistence.d.ts +0 -1
- package/dist/lib/storage/account-port.d.ts +0 -1
- package/dist/lib/storage/account-save-entry.d.ts +0 -1
- package/dist/lib/storage/account-save.d.ts +9 -2
- package/dist/lib/storage/account-save.js +4 -1
- package/dist/lib/storage/account-snapshot.d.ts +0 -1
- package/dist/lib/storage/backup-metadata-builder.d.ts +0 -1
- package/dist/lib/storage/backup-metadata.d.ts +0 -1
- package/dist/lib/storage/backup-paths.d.ts +0 -1
- package/dist/lib/storage/backup-restore.d.ts +0 -1
- package/dist/lib/storage/cache-artifacts.d.ts +0 -1
- package/dist/lib/storage/credential-sidecars.d.ts +0 -1
- package/dist/lib/storage/error-hints.d.ts +0 -1
- package/dist/lib/storage/file-lock.d.ts +0 -1
- package/dist/lib/storage/file-lock.js +33 -1
- package/dist/lib/storage/file-paths.d.ts +0 -1
- package/dist/lib/storage/fixture-guards.d.ts +0 -1
- package/dist/lib/storage/flagged-entry.d.ts +0 -1
- package/dist/lib/storage/flagged-load-entry.d.ts +0 -1
- package/dist/lib/storage/flagged-save-entry.d.ts +0 -1
- package/dist/lib/storage/flagged-storage-file.d.ts +0 -1
- package/dist/lib/storage/flagged-storage-io.d.ts +0 -1
- package/dist/lib/storage/flagged-storage.d.ts +0 -1
- package/dist/lib/storage/gitignore.d.ts +0 -1
- package/dist/lib/storage/hash.d.ts +0 -1
- package/dist/lib/storage/health.d.ts +0 -1
- package/dist/lib/storage/identity.d.ts +0 -1
- package/dist/lib/storage/import-export.d.ts +0 -1
- package/dist/lib/storage/json-store-lock.d.ts +105 -0
- package/dist/lib/storage/json-store-lock.js +259 -0
- package/dist/lib/storage/metadata-section.d.ts +0 -1
- package/dist/lib/storage/migrations.d.ts +0 -1
- package/dist/lib/storage/migrations.js +31 -18
- package/dist/lib/storage/named-backup-entry.d.ts +0 -1
- package/dist/lib/storage/named-backups-entry.d.ts +0 -1
- package/dist/lib/storage/named-backups.d.ts +0 -1
- package/dist/lib/storage/path-state.d.ts +0 -1
- package/dist/lib/storage/paths.d.ts +0 -1
- package/dist/lib/storage/pending-auth.d.ts +10 -3
- package/dist/lib/storage/pending-auth.d.ts.map +1 -1
- package/dist/lib/storage/pending-auth.js +33 -9
- package/dist/lib/storage/project-migration.d.ts +0 -1
- package/dist/lib/storage/public-types.d.ts +0 -1
- package/dist/lib/storage/record-identity.d.ts +15 -0
- package/dist/lib/storage/record-identity.d.ts.map +1 -0
- package/dist/lib/storage/record-identity.js +16 -0
- package/dist/lib/storage/record-utils.d.ts +0 -1
- package/dist/lib/storage/restore-assessment.d.ts +0 -1
- package/dist/lib/storage/restore-backup-entry.d.ts +0 -1
- package/dist/lib/storage/restore-metadata.d.ts +0 -1
- package/dist/lib/storage/save-retry.d.ts +0 -1
- package/dist/lib/storage/snapshot-inspectors.d.ts +0 -1
- package/dist/lib/storage/snapshot-merge.d.ts +0 -1
- package/dist/lib/storage/storage-parser.d.ts +2 -1
- package/dist/lib/storage/storage-parser.js +10 -2
- package/dist/lib/storage/transactions.d.ts +0 -1
- package/dist/lib/storage.d.ts +15 -2
- package/dist/lib/storage.js +612 -25
- package/dist/lib/synthetic-response.d.ts +0 -1
- package/dist/lib/table-formatter.d.ts +0 -1
- package/dist/lib/temp-path.d.ts +0 -1
- package/dist/lib/tools/hashline-tools.d.ts +0 -1
- package/dist/lib/types.d.ts +0 -1
- package/dist/lib/ui/ansi.d.ts +0 -1
- package/dist/lib/ui/auth-menu-builder.d.ts +0 -1
- package/dist/lib/ui/auth-menu.d.ts +0 -1
- package/dist/lib/ui/check-progress.d.ts +0 -1
- package/dist/lib/ui/confirm.d.ts +0 -1
- package/dist/lib/ui/display-width.d.ts +0 -1
- package/dist/lib/ui/format.d.ts +0 -1
- package/dist/lib/ui/index.d.ts +0 -1
- package/dist/lib/ui/runtime.d.ts +0 -1
- package/dist/lib/ui/select.d.ts +0 -1
- package/dist/lib/ui/theme.d.ts +0 -1
- package/dist/lib/ui/ui-copy.d.ts +0 -1
- package/dist/lib/unified-settings.d.ts +13 -11
- package/dist/lib/unified-settings.js +22 -14
- package/dist/lib/update-notice.d.ts +0 -1
- package/dist/lib/usage/index.d.ts +0 -1
- package/dist/lib/usage/ledger.d.ts +0 -1
- package/dist/lib/usage/pricing.d.ts +0 -1
- package/dist/lib/usage/redaction.d.ts +0 -1
- package/dist/lib/usage/stream-usage-deferral.d.ts +0 -1
- package/dist/lib/usage/types.d.ts +0 -1
- package/dist/lib/usage/usage-extraction.d.ts +0 -1
- package/dist/lib/utils.d.ts +21 -1
- package/dist/lib/utils.js +31 -0
- package/dist/lib/wsl.d.ts +0 -1
- package/node_modules/@codex-ai/plugin/dist/index.d.ts +2 -2
- package/node_modules/@codex-ai/plugin/dist/index.js +2 -2
- package/node_modules/@codex-ai/plugin/dist/tool.d.ts +42 -42
- package/node_modules/@codex-ai/plugin/dist/tool.js +29 -29
- package/node_modules/@codex-ai/plugin/package.json +9 -9
- package/node_modules/@codex-ai/sdk/dist/index.d.ts +4 -4
- package/node_modules/@codex-ai/sdk/dist/index.js +2 -2
- package/node_modules/@codex-ai/sdk/package.json +8 -8
- package/package.json +206 -200
- package/scripts/codex-app-launcher.js +653 -653
- package/scripts/codex-app-router.js +373 -373
- package/scripts/codex-bin-resolver.js +332 -313
- package/scripts/codex-multi-auth.js +65 -59
- package/scripts/codex-routing.js +62 -62
- package/scripts/codex.js +6923 -6642
- package/scripts/install-codex-auth-utils.js +213 -213
- package/scripts/mcodex.js +367 -367
- package/scripts/postinstall.js +114 -114
- package/scripts/preuninstall.js +265 -265
- package/skills/codex-auth-setup/SKILL.md +73 -0
- package/vendor/codex-ai-plugin/dist/index.d.ts +2 -2
- package/vendor/codex-ai-plugin/dist/index.js +2 -2
- package/vendor/codex-ai-plugin/dist/tool.d.ts +42 -42
- package/vendor/codex-ai-plugin/dist/tool.js +29 -29
- package/vendor/codex-ai-plugin/package.json +9 -9
- package/vendor/codex-ai-sdk/dist/index.d.ts +4 -4
- package/vendor/codex-ai-sdk/dist/index.js +2 -2
- package/vendor/codex-ai-sdk/package.json +8 -8
package/dist/lib/auth/auth.js
CHANGED
|
@@ -33,6 +33,26 @@ const OAUTH_SENSITIVE_QUERY_PARAMS = [
|
|
|
33
33
|
"code",
|
|
34
34
|
"code_challenge",
|
|
35
35
|
"code_verifier",
|
|
36
|
+
"access_token",
|
|
37
|
+
"id_token",
|
|
38
|
+
"refresh_token",
|
|
39
|
+
"token",
|
|
40
|
+
"device_auth_id",
|
|
41
|
+
"user_code",
|
|
42
|
+
"authorization_code",
|
|
43
|
+
"client_secret",
|
|
44
|
+
"password",
|
|
45
|
+
// Credential-carrying names the logger's SENSITIVE_KEYS already masks:
|
|
46
|
+
// keep the query-key set aligned so they cannot reach a log either.
|
|
47
|
+
"api_key",
|
|
48
|
+
"apikey",
|
|
49
|
+
"authorization",
|
|
50
|
+
"credential",
|
|
51
|
+
"credentials",
|
|
52
|
+
"secret",
|
|
53
|
+
"assertion",
|
|
54
|
+
"client_assertion",
|
|
55
|
+
"id_token_hint",
|
|
36
56
|
];
|
|
37
57
|
function getOAuthResponseLogMetadata(rawResponse) {
|
|
38
58
|
if (Array.isArray(rawResponse)) {
|
|
@@ -55,13 +75,118 @@ const OAUTH_SENSITIVE_BODY_KEYS = [
|
|
|
55
75
|
"id_token",
|
|
56
76
|
"idToken",
|
|
57
77
|
"codeVerifier",
|
|
78
|
+
"code_verifier",
|
|
79
|
+
"code_challenge",
|
|
80
|
+
"codeChallenge",
|
|
58
81
|
"token",
|
|
59
82
|
"code",
|
|
60
|
-
"
|
|
83
|
+
"state",
|
|
84
|
+
"device_auth_id",
|
|
85
|
+
"deviceAuthId",
|
|
86
|
+
"user_code",
|
|
87
|
+
"userCode",
|
|
88
|
+
"authorization_code",
|
|
89
|
+
"authorizationCode",
|
|
90
|
+
"client_secret",
|
|
91
|
+
"clientSecret",
|
|
92
|
+
"password",
|
|
93
|
+
// Credential-carrying names the logger's SENSITIVE_KEYS already masks:
|
|
94
|
+
// keep the body-key set aligned so they cannot reach a log either.
|
|
95
|
+
"api_key",
|
|
96
|
+
"apiKey",
|
|
97
|
+
"apikey",
|
|
98
|
+
"authorization",
|
|
99
|
+
"credential",
|
|
100
|
+
"credentials",
|
|
101
|
+
"secret",
|
|
102
|
+
"assertion",
|
|
103
|
+
"client_assertion",
|
|
104
|
+
"clientAssertion",
|
|
105
|
+
"id_token_hint",
|
|
106
|
+
"idTokenHint",
|
|
107
|
+
];
|
|
108
|
+
function normalizeOAuthSensitiveKey(key) {
|
|
109
|
+
return key.toLowerCase().replace(/[\s_-]/g, "");
|
|
110
|
+
}
|
|
111
|
+
const OAUTH_SENSITIVE_KEY_SET = new Set([...OAUTH_SENSITIVE_BODY_KEYS, ...OAUTH_SENSITIVE_QUERY_PARAMS].map(normalizeOAuthSensitiveKey));
|
|
112
|
+
// A normalized key is also sensitive when it *ends* with a compound secret
|
|
113
|
+
// name — `x-api-key`, `x-client-secret`, `my-refresh-token`,
|
|
114
|
+
// `x-ms-token-aad-id-token` are still credentials. Bare `code`/`state`/`token`
|
|
115
|
+
// are excluded so `error_code`, `csrf_token`, `session_state`, `valid_token`
|
|
116
|
+
// and `api_keys` keep their documented over-redaction protection.
|
|
117
|
+
const OAUTH_SENSITIVE_KEY_SUFFIXES = [
|
|
118
|
+
"accesstoken",
|
|
119
|
+
"refreshtoken",
|
|
120
|
+
"idtoken",
|
|
121
|
+
"clientsecret",
|
|
122
|
+
"clientassertion",
|
|
123
|
+
"apikey",
|
|
124
|
+
"authorizationcode",
|
|
125
|
+
"codechallenge",
|
|
126
|
+
"codeverifier",
|
|
127
|
+
"deviceauthid",
|
|
128
|
+
"usercode",
|
|
129
|
+
"idtokenhint",
|
|
130
|
+
"authorization",
|
|
131
|
+
"credential",
|
|
132
|
+
"credentials",
|
|
133
|
+
"assertion",
|
|
134
|
+
"password",
|
|
135
|
+
"passwords",
|
|
136
|
+
"secret",
|
|
61
137
|
];
|
|
138
|
+
function isOAuthSensitiveKey(key) {
|
|
139
|
+
const normalized = normalizeOAuthSensitiveKey(key);
|
|
140
|
+
return (OAUTH_SENSITIVE_KEY_SET.has(normalized) ||
|
|
141
|
+
OAUTH_SENSITIVE_KEY_SUFFIXES.some((suffix) => normalized.endsWith(suffix)));
|
|
142
|
+
}
|
|
143
|
+
// Separator inside a compound key spelling: whitespace, `_`, `-`, `+`, and the
|
|
144
|
+
// percent-encoded space all collapse under normalizeOAuthSensitiveKey, so
|
|
145
|
+
// "client-secret", "ACCESS TOKEN" and "access%20token" must match too.
|
|
146
|
+
const OAUTH_KEY_SEPARATOR = "(?:[\\s_+-]|%20)*";
|
|
147
|
+
// Free-text key shapes. `code`/`state`/`token` need a non-word boundary so
|
|
148
|
+
// longer names like `error_code`/`device_code`/`csrf_token` are untouched.
|
|
149
|
+
const OAUTH_TEXT_SECRET_KEY_PATTERN = [
|
|
150
|
+
`(?:refresh|access|id)${OAUTH_KEY_SEPARATOR}token`,
|
|
151
|
+
`code${OAUTH_KEY_SEPARATOR}(?:challenge|verifier)`,
|
|
152
|
+
`device${OAUTH_KEY_SEPARATOR}auth${OAUTH_KEY_SEPARATOR}id`,
|
|
153
|
+
`user${OAUTH_KEY_SEPARATOR}code`,
|
|
154
|
+
`authorization${OAUTH_KEY_SEPARATOR}code`,
|
|
155
|
+
`client${OAUTH_KEY_SEPARATOR}secret`,
|
|
156
|
+
`api${OAUTH_KEY_SEPARATOR}key`,
|
|
157
|
+
`client${OAUTH_KEY_SEPARATOR}assertion`,
|
|
158
|
+
`id${OAUTH_KEY_SEPARATOR}token${OAUTH_KEY_SEPARATOR}hint`,
|
|
159
|
+
"authorization",
|
|
160
|
+
"credentials?",
|
|
161
|
+
"assertion",
|
|
162
|
+
"password",
|
|
163
|
+
"secret",
|
|
164
|
+
"state",
|
|
165
|
+
"token",
|
|
166
|
+
"code",
|
|
167
|
+
].join("|");
|
|
62
168
|
function scrubTokenLikeSubstrings(value) {
|
|
63
|
-
|
|
64
|
-
|
|
169
|
+
// Bearer runs first: in a "key: Bearer <jwt>" shape the key pass below
|
|
170
|
+
// would otherwise consume the literal word "Bearer" as its value and
|
|
171
|
+
// strand the token behind it.
|
|
172
|
+
let scrubbed = value.replace(/\bBearer(?:[\s+]|%20)+[A-Za-z0-9._~+/=-]{8,4096}/gi, "Bearer ***REDACTED***");
|
|
173
|
+
// `key <sep> value` in free text. Quoted keys and encoded separator gaps
|
|
174
|
+
// (%20/%22/%27) are tolerated; percent-encoded `:`/`=` (%3A/%3D, plus the
|
|
175
|
+
// double-encoded %253A/%253D) count as separators, and a key directly
|
|
176
|
+
// behind a %XX escape still counts as boundary (the escape itself is the
|
|
177
|
+
// delimiter). `_`/`-` are deliberately absent from the gap classes so
|
|
178
|
+
// `error_code`/`csrf-token` style names still survive. Value length is
|
|
179
|
+
// capped so a megabyte-scale run cannot exhaust the regex backtrack
|
|
180
|
+
// stack; the entropy pass below absorbs any leftover tail.
|
|
181
|
+
scrubbed = scrubbed.replace(new RegExp(`((?:(?<![A-Za-z0-9_])|(?<=%[0-9a-zA-Z]{2}))(?:${OAUTH_TEXT_SECRET_KEY_PATTERN})(?:[\\s'"+]|%2[027])*(?:[:=]|%3[ad]|%253[ad])(?:[\\s'"+]|%2[027])*)([^\\s,;"'{}&=*()<>?]{4,4096})`, "gi"), (_match, prefix) => `${prefix}***REDACTED***`);
|
|
182
|
+
// Bare high-entropy slugs (32-512 chars of token charset) with no key
|
|
183
|
+
// context. No word boundaries: consecutive chunks of a giant run each
|
|
184
|
+
// match, so a huge homogeneous value is consumed piecewise instead of
|
|
185
|
+
// overflowing the backtrack stack on one giant quantified match.
|
|
186
|
+
scrubbed = scrubbed.replace(/[A-Za-z0-9_-]{32,512}/g, "***REDACTED***");
|
|
187
|
+
// ChatGPT opaque token shapes — catches shorter RT_/AT_ values the entropy
|
|
188
|
+
// rule misses. No leading boundary: they may be glued inside identifiers.
|
|
189
|
+
scrubbed = scrubbed.replace(/(?:RT|AT)_ch_[A-Za-z0-9_-]{20,512}/g, "***REDACTED***");
|
|
65
190
|
return scrubbed;
|
|
66
191
|
}
|
|
67
192
|
function redactSensitiveFields(value) {
|
|
@@ -69,14 +194,17 @@ function redactSensitiveFields(value) {
|
|
|
69
194
|
return value.map((item) => redactSensitiveFields(item));
|
|
70
195
|
}
|
|
71
196
|
if (value !== null && typeof value === "object") {
|
|
72
|
-
|
|
73
|
-
|
|
197
|
+
// Null-prototype map so a `__proto__` key stays ordinary data instead of
|
|
198
|
+
// munging the output object's prototype.
|
|
199
|
+
const out = Object.create(null);
|
|
74
200
|
for (const [k, v] of Object.entries(value)) {
|
|
75
|
-
if (
|
|
201
|
+
if (isOAuthSensitiveKey(k)) {
|
|
76
202
|
out[k] = "***REDACTED***";
|
|
77
203
|
}
|
|
78
204
|
else {
|
|
79
|
-
|
|
205
|
+
// The key name itself can smuggle a token (an error response that
|
|
206
|
+
// echoes request fields verbatim) — scrub token shapes from it.
|
|
207
|
+
out[scrubTokenLikeSubstrings(k)] = redactSensitiveFields(v);
|
|
80
208
|
}
|
|
81
209
|
}
|
|
82
210
|
return out;
|
|
@@ -120,34 +248,98 @@ export function sanitizeOAuthResponseBodyForLog(rawBody) {
|
|
|
120
248
|
// Fall through to regex scrub for malformed JSON.
|
|
121
249
|
}
|
|
122
250
|
}
|
|
251
|
+
// Single-pass alternation over the normalized key shapes so case- and
|
|
252
|
+
// separator-varied spellings ("client-secret", "ACCESS TOKEN",
|
|
253
|
+
// "access%20token") still match when the body is not parseable JSON.
|
|
123
254
|
let scrubbed = rawBody;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
255
|
+
// "key":"value" / 'key':'value' style (JSON-like text); a stray separator
|
|
256
|
+
// may sit before the closing quote ("access_token ":).
|
|
257
|
+
scrubbed = scrubbed.replace(new RegExp(`(["'](?:${OAUTH_TEXT_SECRET_KEY_PATTERN})${OAUTH_KEY_SEPARATOR}["']\\s*:\\s*)["'][^"']*["']`, "gi"), `$1"***REDACTED***"`);
|
|
258
|
+
// key<sep>value style (urlencoded / query-string). The boundary class
|
|
259
|
+
// excludes `_` and alphanumerics so `device_code`/`error_code`/
|
|
260
|
+
// `csrf_token`/`opcode` are not redacted; a leading %XX escape does count
|
|
261
|
+
// as a boundary since it decodes to a delimiter.
|
|
262
|
+
scrubbed = scrubbed.replace(new RegExp(`(^|[^A-Za-z0-9_]|%[0-9a-zA-Z]{2})((?:${OAUTH_TEXT_SECRET_KEY_PATTERN})${OAUTH_KEY_SEPARATOR}(?:[:=]|%3[ad]|%253[ad]))[^&\\s]+`, "gi"), "$1$2***REDACTED***");
|
|
263
|
+
return scrubTokenLikeSubstrings(scrubbed);
|
|
264
|
+
}
|
|
265
|
+
function redactUrlSearchParamsForLog(params, depth) {
|
|
266
|
+
for (const key of new Set(params.keys())) {
|
|
267
|
+
if (isOAuthSensitiveKey(key)) {
|
|
268
|
+
params.set(key, "<redacted>");
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
// Non-sensitive keys still get a free-text scrub at every depth:
|
|
272
|
+
// `msg=refresh_token%3D...` or `error_description=Bearer ...` would
|
|
273
|
+
// otherwise carry embedded secrets straight into the log. URL values
|
|
274
|
+
// recurse structurally while depth remains, then fall back to the
|
|
275
|
+
// flat scrub so deeper nesting still loses its secrets.
|
|
276
|
+
const values = params.getAll(key);
|
|
277
|
+
const redactedValues = values.map((value) => /^https?:\/\//i.test(value) && depth > 0
|
|
278
|
+
? redactOAuthUrlForLogDepth(value, depth - 1)
|
|
279
|
+
: scrubTokenLikeSubstrings(value));
|
|
280
|
+
if (redactedValues.some((v, i) => v !== values[i])) {
|
|
281
|
+
params.delete(key);
|
|
282
|
+
for (const v of redactedValues)
|
|
283
|
+
params.append(key, v);
|
|
284
|
+
}
|
|
131
285
|
}
|
|
132
|
-
return scrubbed;
|
|
133
286
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
* Returns the original string when parsing fails.
|
|
137
|
-
*/
|
|
138
|
-
export function redactOAuthUrlForLog(rawUrl) {
|
|
287
|
+
function redactOAuthUrlForLogDepth(rawUrl, depth) {
|
|
288
|
+
let parsed;
|
|
139
289
|
try {
|
|
140
|
-
|
|
141
|
-
for (const key of OAUTH_SENSITIVE_QUERY_PARAMS) {
|
|
142
|
-
if (parsed.searchParams.has(key)) {
|
|
143
|
-
parsed.searchParams.set(key, "<redacted>");
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return parsed.toString();
|
|
290
|
+
parsed = new URL(rawUrl);
|
|
147
291
|
}
|
|
148
292
|
catch {
|
|
149
|
-
return
|
|
293
|
+
return "<unparseable-url>";
|
|
150
294
|
}
|
|
295
|
+
redactUrlSearchParamsForLog(parsed.searchParams, depth);
|
|
296
|
+
// Fragment params (#access_token=...) live in `hash`, not `searchParams`.
|
|
297
|
+
// A route-style fragment (#/path?code=...) keeps its prefix, which is
|
|
298
|
+
// itself free text that can carry secrets like `#code=...?` — scrub it
|
|
299
|
+
// rather than copying it back verbatim. The body is decoded first so a
|
|
300
|
+
// fully percent-encoded fragment cannot hide `?`/`=` from the splitter.
|
|
301
|
+
let hashBody = parsed.hash.startsWith("#") ? parsed.hash.slice(1) : "";
|
|
302
|
+
if (hashBody.includes("%")) {
|
|
303
|
+
try {
|
|
304
|
+
hashBody = decodeURIComponent(hashBody);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// Malformed escape — keep the raw fragment body.
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (hashBody.includes("=")) {
|
|
311
|
+
const qIndex = hashBody.indexOf("?");
|
|
312
|
+
const fragPath = qIndex >= 0 ? hashBody.slice(0, qIndex + 1) : "";
|
|
313
|
+
const fragParams = qIndex >= 0 ? hashBody.slice(qIndex + 1) : hashBody;
|
|
314
|
+
const scrubbedPath = scrubTokenLikeSubstrings(fragPath);
|
|
315
|
+
const params = new URLSearchParams(fragParams);
|
|
316
|
+
redactUrlSearchParamsForLog(params, depth);
|
|
317
|
+
const rebuilt = params.toString();
|
|
318
|
+
if (rebuilt !== fragParams || scrubbedPath !== fragPath) {
|
|
319
|
+
parsed.hash = `${scrubbedPath}${rebuilt}`;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else if (hashBody.length > 0) {
|
|
323
|
+
parsed.hash = scrubTokenLikeSubstrings(hashBody);
|
|
324
|
+
}
|
|
325
|
+
if (parsed.username)
|
|
326
|
+
parsed.username = "***";
|
|
327
|
+
if (parsed.password)
|
|
328
|
+
parsed.password = "***";
|
|
329
|
+
const scrubbedHost = scrubTokenLikeSubstrings(parsed.hostname);
|
|
330
|
+
if (scrubbedHost !== parsed.hostname)
|
|
331
|
+
parsed.hostname = scrubbedHost;
|
|
332
|
+
parsed.pathname = scrubTokenLikeSubstrings(parsed.pathname);
|
|
333
|
+
return parsed.toString();
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Redacts sensitive OAuth parameters for safe logging: query keys match
|
|
337
|
+
* case-insensitively, fragment and nested-URL params are covered, userinfo is
|
|
338
|
+
* masked, and unparseable input collapses to `<unparseable-url>` so the raw
|
|
339
|
+
* string can never reach a log verbatim.
|
|
340
|
+
*/
|
|
341
|
+
export function redactOAuthUrlForLog(rawUrl) {
|
|
342
|
+
return redactOAuthUrlForLogDepth(rawUrl, 1);
|
|
151
343
|
}
|
|
152
344
|
/**
|
|
153
345
|
* Generate a random state value for OAuth flow
|
|
@@ -36,4 +36,3 @@ export type CallbackFailureContext = {
|
|
|
36
36
|
* @returns Guidance lines. Empty strings are intentional blank separators.
|
|
37
37
|
*/
|
|
38
38
|
export declare function describeCallbackFailure(reason: CallbackFailureReason, context?: CallbackFailureContext): string[];
|
|
39
|
-
//# sourceMappingURL=callback-guidance.d.ts.map
|
|
@@ -39,4 +39,3 @@ export declare function requestDeviceAuthorization(options?: DeviceAuthFlowOptio
|
|
|
39
39
|
export declare function pollDeviceAuthorization(deviceCode: DeviceAuthCode, options?: DeviceAuthFlowOptions): Promise<DeviceAuthCompletionResult>;
|
|
40
40
|
export declare function runDeviceAuthFlow(options?: DeviceAuthFlowOptions): Promise<TokenResult>;
|
|
41
41
|
export {};
|
|
42
|
-
//# sourceMappingURL=device-auth.d.ts.map
|
package/dist/lib/auth/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { OAuthServerInfo } from "../types.js";
|
|
|
6
6
|
* and retains a single authorization code on the server instance until consumed via `waitForCode`.
|
|
7
7
|
* Only one code is stored at a time; call `close` to abort polling and shut down the server.
|
|
8
8
|
*
|
|
9
|
-
* On platforms such as Windows, binding
|
|
9
|
+
* On platforms such as Windows, binding the callback port may fail if another process holds it
|
|
10
10
|
* or if firewall/antivirus restrictions prevent local binding; in that case the returned `ready`
|
|
11
11
|
* flag is `false` to allow a manual paste fallback.
|
|
12
12
|
*
|
|
@@ -21,4 +21,3 @@ import type { OAuthServerInfo } from "../types.js";
|
|
|
21
21
|
export declare function startLocalOAuthServer({ state, }: {
|
|
22
22
|
state: string;
|
|
23
23
|
}): Promise<OAuthServerInfo>;
|
|
24
|
-
//# sourceMappingURL=server.d.ts.map
|
package/dist/lib/auth/server.js
CHANGED
|
@@ -7,6 +7,22 @@ import { AUTH_REDIRECT } from "./auth.js";
|
|
|
7
7
|
// Resolve path to oauth-success.html (one level up from auth/ subfolder)
|
|
8
8
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
9
|
const successHtml = fs.readFileSync(path.join(__dirname, "..", "oauth-success.html"), "utf-8");
|
|
10
|
+
/**
|
|
11
|
+
* Host the callback listener actually binds.
|
|
12
|
+
*
|
|
13
|
+
* The registered redirect URI keeps its registered host name
|
|
14
|
+
* (`http://localhost:1455/auth/callback`), but the LISTEN side pins a numeric
|
|
15
|
+
* IPv4 loopback: Node resolves a listen host through DNS, and on a dual-stack
|
|
16
|
+
* host "localhost" may resolve to ::1 first (leaving 127.0.0.1 clients unable
|
|
17
|
+
* to reach the callback) or — with a hostile hosts-file entry — somewhere
|
|
18
|
+
* off-box entirely. We therefore bind BOTH numeric loopbacks: whichever family
|
|
19
|
+
* a resolver picks lands on this listener, and a holder of the other family's
|
|
20
|
+
* same port still surfaces as EADDRINUSE instead of silently receiving the
|
|
21
|
+
* callback code.
|
|
22
|
+
*/
|
|
23
|
+
const OAUTH_BIND_HOSTS = AUTH_REDIRECT.host === "localhost"
|
|
24
|
+
? ["::1", "127.0.0.1"]
|
|
25
|
+
: [AUTH_REDIRECT.host];
|
|
10
26
|
/**
|
|
11
27
|
* Start a local HTTP server that captures an OAuth authorization code sent to /auth/callback.
|
|
12
28
|
*
|
|
@@ -14,7 +30,7 @@ const successHtml = fs.readFileSync(path.join(__dirname, "..", "oauth-success.ht
|
|
|
14
30
|
* and retains a single authorization code on the server instance until consumed via `waitForCode`.
|
|
15
31
|
* Only one code is stored at a time; call `close` to abort polling and shut down the server.
|
|
16
32
|
*
|
|
17
|
-
* On platforms such as Windows, binding
|
|
33
|
+
* On platforms such as Windows, binding the callback port may fail if another process holds it
|
|
18
34
|
* or if firewall/antivirus restrictions prevent local binding; in that case the returned `ready`
|
|
19
35
|
* flag is `false` to allow a manual paste fallback.
|
|
20
36
|
*
|
|
@@ -26,7 +42,7 @@ const successHtml = fs.readFileSync(path.join(__dirname, "..", "oauth-success.ht
|
|
|
26
42
|
* function to abort polling and close the server, and `waitForCode` which returns
|
|
27
43
|
* `{ code: string }` when a code becomes available or `null` on timeout/abort.
|
|
28
44
|
*/
|
|
29
|
-
export function startLocalOAuthServer({ state, }) {
|
|
45
|
+
export async function startLocalOAuthServer({ state, }) {
|
|
30
46
|
let pollAborted = false;
|
|
31
47
|
// Capture the authorization code/state in per-call closure variables rather
|
|
32
48
|
// than mutating the shared http.Server instance. Two logins in the same
|
|
@@ -35,7 +51,7 @@ export function startLocalOAuthServer({ state, }) {
|
|
|
35
51
|
// independent.
|
|
36
52
|
let capturedCode;
|
|
37
53
|
let capturedState;
|
|
38
|
-
const
|
|
54
|
+
const requestHandler = (req, res) => {
|
|
39
55
|
try {
|
|
40
56
|
const url = new URL(req.url || "", AUTH_REDIRECT.origin);
|
|
41
57
|
if (url.pathname !== AUTH_REDIRECT.path) {
|
|
@@ -72,58 +88,89 @@ export function startLocalOAuthServer({ state, }) {
|
|
|
72
88
|
res.statusCode = 500;
|
|
73
89
|
res.end("Internal error");
|
|
74
90
|
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
ready: true,
|
|
83
|
-
close: () => {
|
|
84
|
-
pollAborted = true;
|
|
85
|
-
server.close();
|
|
86
|
-
},
|
|
87
|
-
waitForCode: async (expectedState) => {
|
|
88
|
-
const POLL_INTERVAL_MS = 100;
|
|
89
|
-
const TIMEOUT_MS = 5 * 60 * 1000;
|
|
90
|
-
const maxIterations = Math.floor(TIMEOUT_MS / POLL_INTERVAL_MS);
|
|
91
|
-
const poll = () => new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
92
|
-
for (let i = 0; i < maxIterations; i++) {
|
|
93
|
-
if (pollAborted)
|
|
94
|
-
return null;
|
|
95
|
-
const lastCode = capturedCode;
|
|
96
|
-
if (lastCode) {
|
|
97
|
-
if (capturedState !== expectedState) {
|
|
98
|
-
logWarn("Discarding OAuth callback due to state mismatch in waitForCode");
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
return { code: lastCode };
|
|
102
|
-
}
|
|
103
|
-
await poll();
|
|
104
|
-
}
|
|
105
|
-
logWarn("OAuth poll timeout after 5 minutes");
|
|
106
|
-
return null;
|
|
107
|
-
},
|
|
91
|
+
};
|
|
92
|
+
const attempts = OAUTH_BIND_HOSTS.map((host) => {
|
|
93
|
+
const candidate = http.createServer(requestHandler);
|
|
94
|
+
candidate.unref();
|
|
95
|
+
const bound = new Promise((settle) => {
|
|
96
|
+
candidate.on("error", (err) => {
|
|
97
|
+
settle({ server: candidate, ok: false, code: err?.code });
|
|
108
98
|
});
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
logError(`Failed to bind ${AUTH_REDIRECT.origin} (${err?.code}). Falling back to manual paste.`);
|
|
112
|
-
resolve({
|
|
113
|
-
port: AUTH_REDIRECT.port,
|
|
114
|
-
ready: false,
|
|
115
|
-
bindErrorCode: err?.code,
|
|
116
|
-
close: () => {
|
|
117
|
-
pollAborted = true;
|
|
118
|
-
try {
|
|
119
|
-
server.close();
|
|
120
|
-
}
|
|
121
|
-
catch (closeErr) {
|
|
122
|
-
logError(`Failed to close OAuth server: ${closeErr?.message ?? String(closeErr)}`);
|
|
123
|
-
}
|
|
124
|
-
},
|
|
125
|
-
waitForCode: (_expectedState) => Promise.resolve(null),
|
|
99
|
+
candidate.listen(AUTH_REDIRECT.port, host, () => {
|
|
100
|
+
settle({ server: candidate, ok: true });
|
|
126
101
|
});
|
|
127
102
|
});
|
|
103
|
+
return { candidate, bound };
|
|
128
104
|
});
|
|
105
|
+
const servers = attempts.map((attempt) => attempt.candidate);
|
|
106
|
+
const closeAll = () => {
|
|
107
|
+
for (const candidate of servers) {
|
|
108
|
+
try {
|
|
109
|
+
candidate.close();
|
|
110
|
+
}
|
|
111
|
+
catch (closeErr) {
|
|
112
|
+
logError(`Failed to close OAuth server: ${closeErr?.message ?? String(closeErr)}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const waitForCode = async (expectedState) => {
|
|
117
|
+
const POLL_INTERVAL_MS = 100;
|
|
118
|
+
const TIMEOUT_MS = 5 * 60 * 1000;
|
|
119
|
+
const maxIterations = Math.floor(TIMEOUT_MS / POLL_INTERVAL_MS);
|
|
120
|
+
const poll = () => new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
121
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
122
|
+
if (pollAborted)
|
|
123
|
+
return null;
|
|
124
|
+
const lastCode = capturedCode;
|
|
125
|
+
if (lastCode) {
|
|
126
|
+
if (capturedState !== expectedState) {
|
|
127
|
+
logWarn("Discarding OAuth callback due to state mismatch in waitForCode");
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return { code: lastCode };
|
|
131
|
+
}
|
|
132
|
+
await poll();
|
|
133
|
+
}
|
|
134
|
+
logWarn("OAuth poll timeout after 5 minutes");
|
|
135
|
+
return null;
|
|
136
|
+
};
|
|
137
|
+
const outcomes = await Promise.all(attempts.map((attempt) => attempt.bound));
|
|
138
|
+
const inUse = outcomes.find((outcome) => outcome.code === "EADDRINUSE");
|
|
139
|
+
const bound = outcomes
|
|
140
|
+
.filter((outcome) => outcome.ok)
|
|
141
|
+
.map((outcome) => outcome.server);
|
|
142
|
+
if (inUse || bound.length === 0) {
|
|
143
|
+
// A holder on ANY loopback family conflicts with the registered callback
|
|
144
|
+
// URI — surface it instead of degrading to whichever family was free.
|
|
145
|
+
// When nothing bound, report the first error observed.
|
|
146
|
+
const code = inUse?.code ?? outcomes.find((outcome) => !outcome.ok)?.code;
|
|
147
|
+
logError(`Failed to bind ${AUTH_REDIRECT.origin} (${code}). Falling back to manual paste.`);
|
|
148
|
+
for (const candidate of bound) {
|
|
149
|
+
try {
|
|
150
|
+
candidate.close();
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Best effort — the port was never ours to keep anyway.
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
port: AUTH_REDIRECT.port,
|
|
158
|
+
ready: false,
|
|
159
|
+
bindErrorCode: code,
|
|
160
|
+
close: () => {
|
|
161
|
+
pollAborted = true;
|
|
162
|
+
closeAll();
|
|
163
|
+
},
|
|
164
|
+
waitForCode: (_expectedState) => Promise.resolve(null),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
port: AUTH_REDIRECT.port,
|
|
169
|
+
ready: true,
|
|
170
|
+
close: () => {
|
|
171
|
+
pollAborted = true;
|
|
172
|
+
closeAll();
|
|
173
|
+
},
|
|
174
|
+
waitForCode,
|
|
175
|
+
};
|
|
129
176
|
}
|
|
@@ -32,9 +32,23 @@ export interface BudgetGuardEvaluation {
|
|
|
32
32
|
export declare function getBudgetGuardPath(): string;
|
|
33
33
|
export declare function normalizeBudgetKey(value: string): string | null;
|
|
34
34
|
export declare function loadBudgetGuardStore(): Promise<BudgetGuardStore>;
|
|
35
|
-
export declare function saveBudgetGuardStore(store: BudgetGuardStore): Promise<void>;
|
|
35
|
+
export declare function saveBudgetGuardStore(store: BudgetGuardStore, baseline?: BudgetGuardStore): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Run a budget-guard read→mutate→write inside the write queue (in-process
|
|
38
|
+
* serialization) AND the cross-process lock directory, with mtime CAS retry:
|
|
39
|
+
* every attempt re-reads the freshest on-disk store and re-applies `mutate`
|
|
40
|
+
* before writing — so a mutation is applied to the latest committed state
|
|
41
|
+
* rather than merged by whole-record `updatedAt`, which can drop or clobber
|
|
42
|
+
* a concurrent process's change to the same key. `mutate` must be
|
|
43
|
+
* re-appliable across retries (apply precomputed work onto the store it is
|
|
44
|
+
* handed, don't capture mutated state). Prefer this over load→upsert→save
|
|
45
|
+
* whenever the caller is mutating rather than importing a foreign store.
|
|
46
|
+
*/
|
|
47
|
+
export declare function updateBudgetGuardStore<T>(mutate: (store: BudgetGuardStore) => {
|
|
48
|
+
result: T;
|
|
49
|
+
dirty: boolean;
|
|
50
|
+
}): Promise<T>;
|
|
36
51
|
export declare function upsertBudgetLimit(store: BudgetGuardStore, limit: Omit<BudgetLimit, "updatedAt">, now?: number): BudgetLimit;
|
|
37
52
|
export declare function getBudgetWindowStart(window: BudgetWindow, now?: number): number;
|
|
38
53
|
export declare function evaluateBudgetGuard(limit: BudgetLimit, summary: UsageSummary): BudgetGuardEvaluation;
|
|
39
54
|
export declare function resetBudgetGuardWriteQueueForTests(): void;
|
|
40
|
-
//# sourceMappingURL=budget-guard.d.ts.map
|