codex-multi-auth 2.3.0-beta.1 → 2.3.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/config/schema/config.schema.json +268 -21
- package/dist/index.js +0 -1
- package/dist/lib/account-policy.js +0 -1
- package/dist/lib/accounts/rate-limits.js +0 -1
- package/dist/lib/accounts.d.ts +3 -8
- package/dist/lib/accounts.d.ts.map +1 -1
- package/dist/lib/accounts.js +2 -3
- package/dist/lib/audit.js +0 -1
- package/dist/lib/auth/auth.js +0 -1
- package/dist/lib/auth/browser.js +0 -1
- package/dist/lib/auth/device-auth.js +0 -1
- package/dist/lib/auth/index.js +0 -1
- package/dist/lib/auth/org-override.js +0 -1
- package/dist/lib/auth/server.js +0 -1
- package/dist/lib/auth/token-utils.js +0 -1
- package/dist/lib/auth-rate-limit.js +0 -1
- package/dist/lib/budget-guard.js +0 -1
- package/dist/lib/capability-policy.js +0 -1
- package/dist/lib/circuit-breaker.js +0 -1
- package/dist/lib/cli.js +1 -2
- package/dist/lib/codex-cli/index.js +0 -1
- package/dist/lib/codex-cli/observability.js +0 -1
- package/dist/lib/codex-cli/state.js +0 -1
- package/dist/lib/codex-cli/sync.d.ts +2 -2
- package/dist/lib/codex-cli/sync.d.ts.map +1 -1
- package/dist/lib/codex-cli/sync.js +1 -2
- package/dist/lib/codex-cli/writer.js +0 -1
- package/dist/lib/codex-manager/account-credentials.d.ts +13 -0
- package/dist/lib/codex-manager/account-credentials.d.ts.map +1 -0
- package/dist/lib/codex-manager/account-credentials.js +55 -0
- package/dist/lib/codex-manager/account-manager-commands.js +0 -1
- package/dist/lib/codex-manager/account-pool-write.d.ts +1 -1
- package/dist/lib/codex-manager/account-pool-write.d.ts.map +1 -1
- package/dist/lib/codex-manager/account-pool-write.js +0 -1
- package/dist/lib/codex-manager/backend-category-entry.js +0 -1
- package/dist/lib/codex-manager/backend-category-helpers.js +0 -1
- package/dist/lib/codex-manager/backend-category-prompt.js +0 -1
- package/dist/lib/codex-manager/backend-settings-controller.js +0 -1
- package/dist/lib/codex-manager/backend-settings-entry.js +0 -1
- package/dist/lib/codex-manager/backend-settings-helpers.js +0 -1
- package/dist/lib/codex-manager/backend-settings-prompt.js +0 -1
- package/dist/lib/codex-manager/backend-settings-schema.js +0 -1
- package/dist/lib/codex-manager/behavior-settings-panel.d.ts +1 -1
- package/dist/lib/codex-manager/behavior-settings-panel.d.ts.map +1 -1
- package/dist/lib/codex-manager/behavior-settings-panel.js +0 -1
- package/dist/lib/codex-manager/commands/account.js +0 -1
- package/dist/lib/codex-manager/commands/best.d.ts +8 -0
- package/dist/lib/codex-manager/commands/best.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/best.js +64 -1
- package/dist/lib/codex-manager/commands/bridge.js +0 -1
- package/dist/lib/codex-manager/commands/budget.js +0 -1
- package/dist/lib/codex-manager/commands/check.js +0 -1
- package/dist/lib/codex-manager/commands/config-explain.js +0 -1
- package/dist/lib/codex-manager/commands/debug-bundle.js +0 -1
- package/dist/lib/codex-manager/commands/forecast.js +0 -1
- package/dist/lib/codex-manager/commands/init-config.js +0 -1
- package/dist/lib/codex-manager/commands/integrations.js +0 -1
- package/dist/lib/codex-manager/commands/models.js +0 -1
- package/dist/lib/codex-manager/commands/monitor.js +0 -1
- package/dist/lib/codex-manager/commands/report.js +0 -1
- package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/rotation.js +1 -4
- package/dist/lib/codex-manager/commands/status.js +0 -1
- package/dist/lib/codex-manager/commands/switch.js +0 -1
- package/dist/lib/codex-manager/commands/uninstall.d.ts.map +1 -1
- package/dist/lib/codex-manager/commands/uninstall.js +2 -33
- package/dist/lib/codex-manager/commands/unpin.js +0 -1
- package/dist/lib/codex-manager/commands/usage.js +0 -1
- package/dist/lib/codex-manager/commands/verify.js +0 -1
- package/dist/lib/codex-manager/commands/why-selected.js +0 -1
- package/dist/lib/codex-manager/commands/workspace.js +0 -1
- package/dist/lib/codex-manager/dashboard-display-panel.d.ts +1 -1
- package/dist/lib/codex-manager/dashboard-display-panel.d.ts.map +1 -1
- package/dist/lib/codex-manager/dashboard-display-panel.js +0 -1
- package/dist/lib/codex-manager/dashboard-formatters.js +0 -1
- package/dist/lib/codex-manager/dashboard-settings-controller.js +0 -1
- package/dist/lib/codex-manager/dashboard-settings-data.js +0 -1
- package/dist/lib/codex-manager/dashboard-settings-entry.js +0 -1
- package/dist/lib/codex-manager/experimental-settings-entry.js +0 -1
- package/dist/lib/codex-manager/experimental-settings-prompt.js +0 -1
- package/dist/lib/codex-manager/experimental-settings-schema.js +1 -2
- package/dist/lib/codex-manager/experimental-sync-target-entry.js +0 -1
- package/dist/lib/codex-manager/experimental-sync-target.js +0 -1
- package/dist/lib/codex-manager/forecast-report-commands.js +0 -1
- package/dist/lib/codex-manager/forecast-report-shared.d.ts +2 -2
- package/dist/lib/codex-manager/forecast-report-shared.d.ts.map +1 -1
- package/dist/lib/codex-manager/forecast-report-shared.js +5 -21
- package/dist/lib/codex-manager/formatters/account-formatters.d.ts +11 -0
- package/dist/lib/codex-manager/formatters/account-formatters.d.ts.map +1 -0
- package/dist/lib/codex-manager/formatters/account-formatters.js +79 -0
- package/dist/lib/codex-manager/formatters/index.d.ts +5 -0
- package/dist/lib/codex-manager/formatters/index.d.ts.map +1 -0
- package/dist/lib/codex-manager/formatters/index.js +4 -0
- package/dist/lib/codex-manager/formatters/model-formatters.d.ts +12 -0
- package/dist/lib/codex-manager/formatters/model-formatters.d.ts.map +1 -0
- package/dist/lib/codex-manager/formatters/model-formatters.js +23 -0
- package/dist/lib/codex-manager/formatters/quota-formatters.d.ts +11 -0
- package/dist/lib/codex-manager/formatters/quota-formatters.d.ts.map +1 -0
- package/dist/lib/codex-manager/formatters/quota-formatters.js +104 -0
- package/dist/lib/codex-manager/formatters/text-style.d.ts +14 -0
- package/dist/lib/codex-manager/formatters/text-style.d.ts.map +1 -0
- package/dist/lib/codex-manager/formatters/text-style.js +111 -0
- package/dist/lib/codex-manager/health-check.d.ts +14 -0
- package/dist/lib/codex-manager/health-check.d.ts.map +1 -0
- package/dist/lib/codex-manager/health-check.js +278 -0
- package/dist/lib/codex-manager/help.js +0 -1
- package/dist/lib/codex-manager/login-action-panel.d.ts +4 -0
- package/dist/lib/codex-manager/login-action-panel.d.ts.map +1 -0
- package/dist/lib/codex-manager/login-action-panel.js +238 -0
- package/dist/lib/codex-manager/login-flow.d.ts +17 -0
- package/dist/lib/codex-manager/login-flow.d.ts.map +1 -0
- package/dist/lib/codex-manager/login-flow.js +387 -0
- package/dist/lib/codex-manager/login-menu-actions.d.ts +20 -0
- package/dist/lib/codex-manager/login-menu-actions.d.ts.map +1 -0
- package/dist/lib/codex-manager/login-menu-actions.js +303 -0
- package/dist/lib/codex-manager/login-menu-data.d.ts +19 -0
- package/dist/lib/codex-manager/login-menu-data.d.ts.map +1 -0
- package/dist/lib/codex-manager/login-menu-data.js +378 -0
- package/dist/lib/codex-manager/login-oauth.d.ts +55 -0
- package/dist/lib/codex-manager/login-oauth.d.ts.map +1 -0
- package/dist/lib/codex-manager/login-oauth.js +345 -0
- package/dist/lib/codex-manager/manual-callback.js +0 -1
- package/dist/lib/codex-manager/persist-selected-account.d.ts +24 -0
- package/dist/lib/codex-manager/persist-selected-account.d.ts.map +1 -0
- package/dist/lib/codex-manager/persist-selected-account.js +107 -0
- package/dist/lib/codex-manager/quota-cache-helpers.d.ts +18 -0
- package/dist/lib/codex-manager/quota-cache-helpers.d.ts.map +1 -0
- package/dist/lib/codex-manager/quota-cache-helpers.js +112 -0
- package/dist/lib/codex-manager/rate-limit-markers.js +0 -1
- package/dist/lib/codex-manager/repair-commands.js +0 -1
- package/dist/lib/codex-manager/settings-hub/backend.js +1 -2
- package/dist/lib/codex-manager/settings-hub/dashboard.js +1 -2
- package/dist/lib/codex-manager/settings-hub/experimental.js +1 -2
- package/dist/lib/codex-manager/settings-hub/index.js +1 -2
- package/dist/lib/codex-manager/settings-hub/shared.js +0 -1
- package/dist/lib/codex-manager/settings-hub-entry.js +0 -1
- package/dist/lib/codex-manager/settings-hub-menu.js +0 -1
- package/dist/lib/codex-manager/settings-hub-prompt.js +0 -1
- package/dist/lib/codex-manager/settings-hub.js +0 -1
- package/dist/lib/codex-manager/settings-panels.js +0 -1
- package/dist/lib/codex-manager/settings-persist-utils.js +0 -1
- package/dist/lib/codex-manager/settings-preview.js +0 -1
- package/dist/lib/codex-manager/settings-write-queue.js +0 -1
- package/dist/lib/codex-manager/statusline-order.js +0 -1
- package/dist/lib/codex-manager/statusline-settings-panel.d.ts +1 -1
- package/dist/lib/codex-manager/statusline-settings-panel.d.ts.map +1 -1
- package/dist/lib/codex-manager/statusline-settings-panel.js +0 -1
- package/dist/lib/codex-manager/theme-settings-panel.d.ts +1 -1
- package/dist/lib/codex-manager/theme-settings-panel.d.ts.map +1 -1
- package/dist/lib/codex-manager/theme-settings-panel.js +0 -1
- package/dist/lib/codex-manager/unified-settings-controller.js +0 -1
- package/dist/lib/codex-manager/unified-settings-entry.js +0 -1
- package/dist/lib/codex-manager.d.ts +2 -4
- package/dist/lib/codex-manager.d.ts.map +1 -1
- package/dist/lib/codex-manager.js +219 -2570
- package/dist/lib/config-schema.d.ts +32 -0
- package/dist/lib/config-schema.d.ts.map +1 -0
- package/dist/lib/config-schema.js +96 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +60 -104
- package/dist/lib/constants.js +0 -1
- package/dist/lib/context-overflow.js +0 -1
- package/dist/lib/dashboard-settings.js +0 -1
- package/dist/lib/entitlement-cache.js +0 -1
- package/dist/lib/env-parsing.js +0 -1
- package/dist/lib/errors.js +0 -1
- package/dist/lib/forecast.js +0 -1
- package/dist/lib/fs-retry.d.ts +46 -0
- package/dist/lib/fs-retry.d.ts.map +1 -1
- package/dist/lib/fs-retry.js +74 -6
- package/dist/lib/health.js +0 -1
- package/dist/lib/index.js +0 -1
- package/dist/lib/integration-generators.js +0 -1
- package/dist/lib/live-account-sync.js +0 -1
- package/dist/lib/local-bridge.js +0 -1
- package/dist/lib/local-client-tokens.js +0 -1
- package/dist/lib/logger.js +0 -1
- package/dist/lib/model-capability-matrix.js +0 -1
- package/dist/lib/named-backup-export.js +0 -1
- package/dist/lib/oc-chatgpt-import-adapter.js +0 -1
- package/dist/lib/oc-chatgpt-orchestrator.js +0 -1
- package/dist/lib/oc-chatgpt-target-detection.js +0 -1
- package/dist/lib/parallel-probe.js +0 -1
- package/dist/lib/policy/runtime-policy.js +0 -1
- package/dist/lib/preemptive-quota-scheduler.js +0 -1
- package/dist/lib/proactive-refresh.js +0 -1
- package/dist/lib/prompts/codex-host-bridge.js +0 -1
- package/dist/lib/prompts/codex.d.ts +3 -11
- package/dist/lib/prompts/codex.d.ts.map +1 -1
- package/dist/lib/prompts/codex.js +4 -12
- package/dist/lib/prompts/fetch-utils.js +0 -1
- package/dist/lib/prompts/host-codex-prompt.js +0 -1
- package/dist/lib/quota-cache.d.ts.map +1 -1
- package/dist/lib/quota-cache.js +15 -43
- package/dist/lib/quota-probe.js +0 -1
- package/dist/lib/quota-readiness.js +0 -1
- package/dist/lib/recovery/constants.js +0 -1
- package/dist/lib/recovery/index.js +0 -1
- package/dist/lib/recovery/storage.d.ts.map +1 -1
- package/dist/lib/recovery/storage.js +30 -51
- package/dist/lib/recovery/storage.js.map +1 -1
- package/dist/lib/recovery/types.js +0 -1
- package/dist/lib/recovery.js +0 -1
- package/dist/lib/refresh-guardian.js +0 -1
- package/dist/lib/refresh-lease.d.ts.map +1 -1
- package/dist/lib/refresh-lease.js +1 -4
- package/dist/lib/refresh-queue.js +0 -1
- package/dist/lib/request/error-classification.d.ts +75 -0
- package/dist/lib/request/error-classification.d.ts.map +1 -0
- package/dist/lib/request/error-classification.js +295 -0
- package/dist/lib/request/failover-config.js +0 -1
- package/dist/lib/request/failure-policy.js +0 -1
- package/dist/lib/request/fetch-helpers.d.ts +10 -114
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
- package/dist/lib/request/fetch-helpers.js +7 -589
- package/dist/lib/request/headers.d.ts +33 -0
- package/dist/lib/request/headers.d.ts.map +1 -0
- package/dist/lib/request/headers.js +64 -0
- package/dist/lib/request/helpers/input-utils.js +0 -1
- package/dist/lib/request/helpers/model-map.d.ts +10 -0
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -1
- package/dist/lib/request/helpers/model-map.js +11 -1
- package/dist/lib/request/helpers/tool-utils.js +0 -1
- package/dist/lib/request/index.js +0 -1
- package/dist/lib/request/rate-limit-backoff.js +0 -1
- package/dist/lib/request/rate-limit-decision.d.ts +28 -0
- package/dist/lib/request/rate-limit-decision.d.ts.map +1 -0
- package/dist/lib/request/rate-limit-decision.js +191 -0
- package/dist/lib/request/request-attempt-budget.js +0 -1
- package/dist/lib/request/request-init.js +0 -1
- package/dist/lib/request/request-resilience.js +0 -1
- package/dist/lib/request/request-transformer.js +0 -1
- package/dist/lib/request/response-compaction.js +0 -1
- package/dist/lib/request/response-handler.js +0 -1
- package/dist/lib/request/response-metadata.js +0 -1
- package/dist/lib/request/stream-failover-runtime.d.ts +8 -0
- package/dist/lib/request/stream-failover-runtime.d.ts.map +1 -0
- package/dist/lib/request/stream-failover-runtime.js +149 -0
- package/dist/lib/request/stream-failover.js +0 -1
- package/dist/lib/request/token-refresh.d.ts +30 -0
- package/dist/lib/request/token-refresh.d.ts.map +1 -0
- package/dist/lib/request/token-refresh.js +116 -0
- package/dist/lib/request/url-rewriting.d.ts +24 -0
- package/dist/lib/request/url-rewriting.d.ts.map +1 -0
- package/dist/lib/request/url-rewriting.js +153 -0
- package/dist/lib/request/wait-utils.js +0 -1
- package/dist/lib/rotation.d.ts +1 -1
- package/dist/lib/rotation.d.ts.map +1 -1
- package/dist/lib/rotation.js +0 -1
- package/dist/lib/routing-mutex.js +0 -1
- package/dist/lib/routing-profiles.js +0 -1
- package/dist/lib/runtime/account-check-helpers.js +0 -1
- package/dist/lib/runtime/account-check-types.js +0 -1
- package/dist/lib/runtime/account-check.js +0 -1
- package/dist/lib/runtime/account-health-check.js +0 -1
- package/dist/lib/runtime/account-manager-cache-entry.js +0 -1
- package/dist/lib/runtime/account-manager-cache.js +0 -1
- package/dist/lib/runtime/account-pool.js +0 -1
- package/dist/lib/runtime/account-scope.js +0 -1
- package/dist/lib/runtime/account-select-event.js +0 -1
- package/dist/lib/runtime/account-selection.js +0 -1
- package/dist/lib/runtime/account-state.js +0 -1
- package/dist/lib/runtime/account-status.js +0 -1
- package/dist/lib/runtime/account-storage-scope-entry.js +0 -1
- package/dist/lib/runtime/app-bind.js +0 -1
- package/dist/lib/runtime/auth-facade.js +0 -1
- package/dist/lib/runtime/browser-oauth-flow.js +0 -1
- package/dist/lib/runtime/capability-boost.js +0 -1
- package/dist/lib/runtime/config-toml.js +0 -1
- package/dist/lib/runtime/event-handler.js +0 -1
- package/dist/lib/runtime/first-run.d.ts +80 -0
- package/dist/lib/runtime/first-run.d.ts.map +1 -0
- package/dist/lib/runtime/first-run.js +327 -0
- package/dist/lib/runtime/flagged-verify-types.js +0 -1
- package/dist/lib/runtime/hydrate-emails.js +0 -1
- package/dist/lib/runtime/live-sync-entry.js +0 -1
- package/dist/lib/runtime/live-sync.js +0 -1
- package/dist/lib/runtime/loader-setup.js +0 -1
- package/dist/lib/runtime/login-menu-accounts.js +0 -1
- package/dist/lib/runtime/manual-oauth-flow.js +0 -1
- package/dist/lib/runtime/oauth-browser-flow.js +0 -1
- package/dist/lib/runtime/preemptive-quota.js +0 -1
- package/dist/lib/runtime/quota-headers.js +0 -1
- package/dist/lib/runtime/quota-probe.js +0 -1
- package/dist/lib/runtime/quota-settings.js +0 -1
- package/dist/lib/runtime/refresh-guardian-entry.js +0 -1
- package/dist/lib/runtime/refresh-guardian.js +0 -1
- package/dist/lib/runtime/request-init.js +0 -1
- package/dist/lib/runtime/rotation-account-selection.d.ts +38 -0
- package/dist/lib/runtime/rotation-account-selection.d.ts.map +1 -0
- package/dist/lib/runtime/rotation-account-selection.js +172 -0
- package/dist/lib/runtime/rotation-proxy-state.d.ts +54 -0
- package/dist/lib/runtime/rotation-proxy-state.d.ts.map +1 -0
- package/dist/lib/runtime/rotation-proxy-state.js +56 -0
- package/dist/lib/runtime/rotation-server-types.d.ts +57 -0
- package/dist/lib/runtime/rotation-server-types.d.ts.map +1 -0
- package/dist/lib/runtime/rotation-server-types.js +1 -0
- package/dist/lib/runtime/rotation-storage-meta.d.ts +40 -0
- package/dist/lib/runtime/rotation-storage-meta.d.ts.map +1 -0
- package/dist/lib/runtime/rotation-storage-meta.js +143 -0
- package/dist/lib/runtime/rotation-token-refresh.d.ts +25 -0
- package/dist/lib/runtime/rotation-token-refresh.d.ts.map +1 -0
- package/dist/lib/runtime/rotation-token-refresh.js +99 -0
- package/dist/lib/runtime/runtime-current-account.d.ts.map +1 -1
- package/dist/lib/runtime/runtime-current-account.js +1 -4
- package/dist/lib/runtime/runtime-observability.js +0 -1
- package/dist/lib/runtime/runtime-services.js +0 -1
- package/dist/lib/runtime/session-affinity-entry.js +0 -1
- package/dist/lib/runtime/session-affinity.js +0 -1
- package/dist/lib/runtime/session-recovery.js +0 -1
- package/dist/lib/runtime/status-marker.js +0 -1
- package/dist/lib/runtime/storage-scope.js +0 -1
- package/dist/lib/runtime/toast.js +0 -1
- package/dist/lib/runtime/ui-runtime-entry.js +0 -1
- package/dist/lib/runtime/ui-runtime.js +0 -1
- package/dist/lib/runtime/verify-flagged.js +0 -1
- package/dist/lib/runtime-constants.js +0 -1
- package/dist/lib/runtime-paths.js +0 -1
- package/dist/lib/runtime-rotation-proxy.d.ts +7 -124
- package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
- package/dist/lib/runtime-rotation-proxy.js +614 -1353
- package/dist/lib/schemas.d.ts +3 -3
- package/dist/lib/schemas.js +1 -2
- package/dist/lib/session-affinity.js +0 -1
- package/dist/lib/shutdown.js +0 -1
- package/dist/lib/storage/account-clear-entry.js +0 -1
- package/dist/lib/storage/account-clear.js +0 -1
- package/dist/lib/storage/account-match-utils.js +0 -1
- package/dist/lib/storage/account-persistence.d.ts +1 -1
- package/dist/lib/storage/account-persistence.d.ts.map +1 -1
- package/dist/lib/storage/account-persistence.js +0 -1
- package/dist/lib/storage/account-port.d.ts +1 -1
- package/dist/lib/storage/account-port.d.ts.map +1 -1
- package/dist/lib/storage/account-port.js +0 -1
- package/dist/lib/storage/account-save-entry.d.ts +1 -1
- package/dist/lib/storage/account-save-entry.d.ts.map +1 -1
- package/dist/lib/storage/account-save-entry.js +0 -1
- package/dist/lib/storage/account-save.d.ts +1 -1
- package/dist/lib/storage/account-save.d.ts.map +1 -1
- package/dist/lib/storage/account-save.js +0 -1
- package/dist/lib/storage/account-snapshot.js +0 -1
- package/dist/lib/storage/backup-metadata-builder.d.ts +1 -1
- package/dist/lib/storage/backup-metadata-builder.d.ts.map +1 -1
- package/dist/lib/storage/backup-metadata-builder.js +0 -1
- package/dist/lib/storage/backup-metadata.d.ts +13 -0
- package/dist/lib/storage/backup-metadata.d.ts.map +1 -1
- package/dist/lib/storage/backup-metadata.js +0 -1
- package/dist/lib/storage/backup-paths.js +0 -1
- package/dist/lib/storage/backup-restore.d.ts +1 -1
- package/dist/lib/storage/backup-restore.d.ts.map +1 -1
- package/dist/lib/storage/backup-restore.js +0 -1
- package/dist/lib/storage/cache-artifacts.js +0 -1
- package/dist/lib/storage/error-hints.js +0 -1
- package/dist/lib/storage/file-paths.js +0 -1
- package/dist/lib/storage/fixture-guards.d.ts +1 -1
- package/dist/lib/storage/fixture-guards.d.ts.map +1 -1
- package/dist/lib/storage/fixture-guards.js +0 -1
- package/dist/lib/storage/flagged-entry.js +0 -1
- package/dist/lib/storage/flagged-load-entry.d.ts +1 -1
- package/dist/lib/storage/flagged-load-entry.d.ts.map +1 -1
- package/dist/lib/storage/flagged-load-entry.js +0 -1
- package/dist/lib/storage/flagged-save-entry.d.ts +1 -1
- package/dist/lib/storage/flagged-save-entry.d.ts.map +1 -1
- package/dist/lib/storage/flagged-save-entry.js +0 -1
- package/dist/lib/storage/flagged-storage-file.d.ts +1 -1
- package/dist/lib/storage/flagged-storage-file.d.ts.map +1 -1
- package/dist/lib/storage/flagged-storage-file.js +0 -1
- package/dist/lib/storage/flagged-storage-io.d.ts +1 -1
- package/dist/lib/storage/flagged-storage-io.d.ts.map +1 -1
- package/dist/lib/storage/flagged-storage-io.js +0 -1
- package/dist/lib/storage/flagged-storage.d.ts +1 -1
- package/dist/lib/storage/flagged-storage.d.ts.map +1 -1
- package/dist/lib/storage/flagged-storage.js +15 -2
- package/dist/lib/storage/flagged-storage.js.map +1 -1
- package/dist/lib/storage/gitignore.js +0 -1
- package/dist/lib/storage/hash.js +0 -1
- package/dist/lib/storage/health.js +0 -1
- package/dist/lib/storage/identity.js +0 -1
- package/dist/lib/storage/import-export.d.ts +1 -1
- package/dist/lib/storage/import-export.d.ts.map +1 -1
- package/dist/lib/storage/import-export.js +0 -1
- package/dist/lib/storage/metadata-section.js +0 -1
- package/dist/lib/storage/migrations.d.ts +5 -48
- package/dist/lib/storage/migrations.d.ts.map +1 -1
- package/dist/lib/storage/migrations.js +5 -2
- package/dist/lib/storage/named-backup-entry.js +0 -1
- package/dist/lib/storage/named-backups-entry.d.ts +1 -1
- package/dist/lib/storage/named-backups-entry.d.ts.map +1 -1
- package/dist/lib/storage/named-backups-entry.js +0 -1
- package/dist/lib/storage/named-backups.js +0 -1
- package/dist/lib/storage/path-state.js +0 -1
- package/dist/lib/storage/paths.js +0 -1
- package/dist/lib/storage/project-migration.d.ts +1 -1
- package/dist/lib/storage/project-migration.d.ts.map +1 -1
- package/dist/lib/storage/project-migration.js +0 -1
- package/dist/lib/storage/public-types.d.ts +70 -0
- package/dist/lib/storage/public-types.d.ts.map +1 -0
- package/dist/lib/storage/public-types.js +6 -0
- package/dist/lib/storage/record-utils.js +0 -1
- package/dist/lib/storage/restore-assessment.d.ts +1 -1
- package/dist/lib/storage/restore-assessment.d.ts.map +1 -1
- package/dist/lib/storage/restore-assessment.js +0 -1
- package/dist/lib/storage/restore-backup-entry.d.ts +1 -1
- package/dist/lib/storage/restore-backup-entry.d.ts.map +1 -1
- package/dist/lib/storage/restore-backup-entry.js +0 -1
- package/dist/lib/storage/restore-metadata.d.ts +1 -1
- package/dist/lib/storage/restore-metadata.d.ts.map +1 -1
- package/dist/lib/storage/restore-metadata.js +0 -1
- package/dist/lib/storage/restore.d.ts +1 -1
- package/dist/lib/storage/restore.d.ts.map +1 -1
- package/dist/lib/storage/restore.js +0 -1
- package/dist/lib/storage/save-retry.d.ts +10 -0
- package/dist/lib/storage/save-retry.d.ts.map +1 -0
- package/dist/lib/storage/save-retry.js +26 -0
- package/dist/lib/storage/snapshot-inspectors.d.ts +1 -1
- package/dist/lib/storage/snapshot-inspectors.d.ts.map +1 -1
- package/dist/lib/storage/snapshot-inspectors.js +0 -1
- package/dist/lib/storage/storage-parser.d.ts +1 -1
- package/dist/lib/storage/storage-parser.d.ts.map +1 -1
- package/dist/lib/storage/storage-parser.js +0 -1
- package/dist/lib/storage/transactions.d.ts +1 -1
- package/dist/lib/storage/transactions.d.ts.map +1 -1
- package/dist/lib/storage/transactions.js +0 -1
- package/dist/lib/storage.d.ts +3 -24
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +17 -32
- package/dist/lib/table-formatter.js +0 -1
- package/dist/lib/tools/hashline-tools.js +0 -1
- package/dist/lib/types.js +0 -1
- package/dist/lib/ui/ansi.js +0 -1
- package/dist/lib/ui/auth-menu-builder.d.ts +89 -0
- package/dist/lib/ui/auth-menu-builder.d.ts.map +1 -0
- package/dist/lib/ui/auth-menu-builder.js +350 -0
- package/dist/lib/ui/auth-menu.d.ts +2 -76
- package/dist/lib/ui/auth-menu.d.ts.map +1 -1
- package/dist/lib/ui/auth-menu.js +3 -349
- package/dist/lib/ui/confirm.js +0 -1
- package/dist/lib/ui/display-width.js +0 -1
- package/dist/lib/ui/format.js +0 -1
- package/dist/lib/ui/index.d.ts +10 -0
- package/dist/lib/ui/index.d.ts.map +1 -0
- package/dist/lib/ui/index.js +9 -0
- package/dist/lib/ui/runtime.js +0 -1
- package/dist/lib/ui/select.js +0 -1
- package/dist/lib/ui/theme.js +0 -1
- package/dist/lib/ui/ui-copy.d.ts +159 -0
- package/dist/lib/ui/ui-copy.d.ts.map +1 -0
- package/dist/lib/ui/ui-copy.js +163 -0
- package/dist/lib/unified-settings.js +0 -1
- package/dist/lib/update-notice.js +0 -1
- package/dist/lib/usage/index.js +0 -1
- package/dist/lib/usage/ledger.js +0 -1
- package/dist/lib/usage/pricing.js +0 -1
- package/dist/lib/usage/redaction.js +0 -1
- package/dist/lib/usage/types.js +0 -1
- package/dist/lib/utils.js +0 -1
- package/package.json +8 -8
- package/scripts/postinstall.js +34 -265
- package/scripts/preuninstall.js +2 -2
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { extractAccountId, sanitizeEmail } from "../accounts.js";
|
|
2
|
+
import { loadCodexCliState } from "../codex-cli/state.js";
|
|
3
|
+
import { setCodexCliActiveSelection } from "../codex-cli/writer.js";
|
|
4
|
+
import { DEFAULT_DASHBOARD_DISPLAY_SETTINGS, } from "../dashboard-settings.js";
|
|
5
|
+
import { loadQuotaCache, saveQuotaCache, } from "../quota-cache.js";
|
|
6
|
+
import { fetchCodexQuotaSnapshot, } from "../quota-probe.js";
|
|
7
|
+
import { buildQuotaEmailFallbackState, hasSafeQuotaEmailFallback, hasUniqueQuotaAccountId, isQuotaCacheEntryExhausted, normalizeQuotaAccountId, quotaLeftPercentFromUsed, } from "../quota-readiness.js";
|
|
8
|
+
import { resolveActiveIndex } from "../runtime/account-status.js";
|
|
9
|
+
import { getAppBindStatus } from "../runtime/app-bind.js";
|
|
10
|
+
import { isDisplayCurrentAccount, readAppRuntimeHelperAccountSignal, resolveAccountCurrentMarkers, resolveRuntimeCurrentAccount, } from "../runtime/runtime-current-account.js";
|
|
11
|
+
import { loadPersistedRuntimeObservabilitySnapshot } from "../runtime/runtime-observability.js";
|
|
12
|
+
import { hasUsableAccessToken } from "./account-credentials.js";
|
|
13
|
+
import { formatAccountQuotaSummary, formatRateLimitEntry, } from "./formatters/index.js";
|
|
14
|
+
import { cloneQuotaCacheData, DEFAULT_LIVE_PROBE_MODEL, getPersistedQuotaViewForAccount, updateQuotaCacheForAccount, } from "./quota-cache-helpers.js";
|
|
15
|
+
import { resolveMenuLayoutMode } from "./settings-hub.js";
|
|
16
|
+
/**
|
|
17
|
+
* Data layer for the login dashboard menu: quota auto-refresh targeting, the
|
|
18
|
+
* account-row view model (`ExistingAccountInfo`), runtime current-account
|
|
19
|
+
* resolution, and Codex CLI selection drift sync. Moved verbatim out of the
|
|
20
|
+
* `login` handler body in lib/codex-manager.ts (audit roadmap §4.1.1 phase 3).
|
|
21
|
+
* The interactive login control loop itself still lives in codex-manager.ts.
|
|
22
|
+
*/
|
|
23
|
+
export const DEFAULT_MENU_QUOTA_REFRESH_TTL_MS = 5 * 60_000;
|
|
24
|
+
const MENU_QUOTA_REFRESH_MODEL = DEFAULT_LIVE_PROBE_MODEL;
|
|
25
|
+
function resolveMenuQuotaProbeInput(account, cache, maxAgeMs, now, accounts, emailFallbackState = buildQuotaEmailFallbackState(accounts)) {
|
|
26
|
+
if (account.enabled === false)
|
|
27
|
+
return null;
|
|
28
|
+
if (!hasUsableAccessToken(account, now))
|
|
29
|
+
return null;
|
|
30
|
+
const existing = getPersistedQuotaViewForAccount(cache, account, accounts, now, emailFallbackState);
|
|
31
|
+
if (existing &&
|
|
32
|
+
typeof existing.updatedAt === "number" &&
|
|
33
|
+
Number.isFinite(existing.updatedAt) &&
|
|
34
|
+
now - existing.updatedAt < maxAgeMs) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
// Menu auto-refresh is cache-backed, so only probe when the result can be
|
|
38
|
+
// written behind a safe lookup key for later reuse.
|
|
39
|
+
const canStore = (normalizeQuotaAccountId(account.accountId) !== null &&
|
|
40
|
+
hasUniqueQuotaAccountId(accounts, account)) ||
|
|
41
|
+
hasSafeQuotaEmailFallback(emailFallbackState, account);
|
|
42
|
+
if (!canStore)
|
|
43
|
+
return null;
|
|
44
|
+
const accessToken = account.accessToken;
|
|
45
|
+
const accountId = accessToken
|
|
46
|
+
? (account.accountId ?? extractAccountId(accessToken))
|
|
47
|
+
: account.accountId;
|
|
48
|
+
if (!accountId || !accessToken)
|
|
49
|
+
return null;
|
|
50
|
+
return { accountId, accessToken };
|
|
51
|
+
}
|
|
52
|
+
function collectMenuQuotaRefreshTargets(storage, cache, maxAgeMs, now = Date.now(), emailFallbackState = buildQuotaEmailFallbackState(storage.accounts)) {
|
|
53
|
+
const targets = [];
|
|
54
|
+
for (const account of storage.accounts) {
|
|
55
|
+
const probeInput = resolveMenuQuotaProbeInput(account, cache, maxAgeMs, now, storage.accounts, emailFallbackState);
|
|
56
|
+
if (!probeInput)
|
|
57
|
+
continue;
|
|
58
|
+
targets.push({
|
|
59
|
+
account,
|
|
60
|
+
accountId: probeInput.accountId,
|
|
61
|
+
accessToken: probeInput.accessToken,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return targets;
|
|
65
|
+
}
|
|
66
|
+
export function countMenuQuotaRefreshTargets(storage, cache, maxAgeMs, now = Date.now()) {
|
|
67
|
+
const emailFallbackState = buildQuotaEmailFallbackState(storage.accounts);
|
|
68
|
+
let count = 0;
|
|
69
|
+
for (const account of storage.accounts) {
|
|
70
|
+
if (resolveMenuQuotaProbeInput(account, cache, maxAgeMs, now, storage.accounts, emailFallbackState)) {
|
|
71
|
+
count += 1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return count;
|
|
75
|
+
}
|
|
76
|
+
export async function refreshQuotaCacheForMenu(storage, cache, maxAgeMs, onProgress) {
|
|
77
|
+
if (storage.accounts.length === 0) {
|
|
78
|
+
return cache;
|
|
79
|
+
}
|
|
80
|
+
const emailFallbackState = buildQuotaEmailFallbackState(storage.accounts);
|
|
81
|
+
const nextCache = cloneQuotaCacheData(cache);
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
const targets = collectMenuQuotaRefreshTargets(storage, nextCache, maxAgeMs, now, emailFallbackState);
|
|
84
|
+
const total = targets.length;
|
|
85
|
+
let processed = 0;
|
|
86
|
+
onProgress?.(processed, total);
|
|
87
|
+
let changed = false;
|
|
88
|
+
const appliedSnapshots = [];
|
|
89
|
+
for (const target of targets) {
|
|
90
|
+
processed += 1;
|
|
91
|
+
onProgress?.(processed, total);
|
|
92
|
+
try {
|
|
93
|
+
const snapshot = await fetchCodexQuotaSnapshot({
|
|
94
|
+
accountId: target.accountId,
|
|
95
|
+
accessToken: target.accessToken,
|
|
96
|
+
model: MENU_QUOTA_REFRESH_MODEL,
|
|
97
|
+
});
|
|
98
|
+
const applied = updateQuotaCacheForAccount(nextCache, target.account, snapshot, storage.accounts, emailFallbackState);
|
|
99
|
+
if (applied)
|
|
100
|
+
appliedSnapshots.push({ account: target.account, snapshot });
|
|
101
|
+
changed = applied || changed;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Keep existing cached values if probing fails.
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (changed) {
|
|
108
|
+
// The probes above ran against a snapshot clone of the cache the menu
|
|
109
|
+
// loaded; another writer (a deep check, a second session) may have saved
|
|
110
|
+
// entries meanwhile, and writing the stale clone back whole-file would
|
|
111
|
+
// silently discard them (last write wins). Re-apply this run's results
|
|
112
|
+
// onto the freshest persisted cache instead.
|
|
113
|
+
//
|
|
114
|
+
// loadQuotaCache() is documented to never throw — on any read failure it
|
|
115
|
+
// returns empty maps. We also guard the empty-maps case explicitly: if the
|
|
116
|
+
// persisted cache came back empty (read failure / empty file), fall back to
|
|
117
|
+
// nextCache so non-probed entries are not wiped. The try/catch handles any
|
|
118
|
+
// mocked or future implementation that does throw.
|
|
119
|
+
let cacheToSave = nextCache;
|
|
120
|
+
try {
|
|
121
|
+
const persisted = await loadQuotaCache();
|
|
122
|
+
const persistedHasData = Object.keys(persisted.byAccountId).length > 0 ||
|
|
123
|
+
Object.keys(persisted.byEmail).length > 0;
|
|
124
|
+
if (persistedHasData) {
|
|
125
|
+
for (const { account, snapshot } of appliedSnapshots) {
|
|
126
|
+
updateQuotaCacheForAccount(persisted, account, snapshot, storage.accounts, emailFallbackState);
|
|
127
|
+
}
|
|
128
|
+
cacheToSave = persisted;
|
|
129
|
+
}
|
|
130
|
+
// else: persisted came back empty; keep cacheToSave = nextCache.
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// loadQuotaCache threw (unexpected); fall back to the snapshot clone
|
|
134
|
+
// so non-probed entries survive.
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
await saveQuotaCache(cacheToSave);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
// Quota cache is a derived artifact; a transient Windows EBUSY/EPERM
|
|
141
|
+
// here must not fail the menu refresh, but it should not vanish into
|
|
142
|
+
// the caller's background .catch either (same pattern as the health
|
|
143
|
+
// check's save).
|
|
144
|
+
console.warn(`Quota cache save failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
145
|
+
}
|
|
146
|
+
return cacheToSave;
|
|
147
|
+
}
|
|
148
|
+
return nextCache;
|
|
149
|
+
}
|
|
150
|
+
function mapAccountStatus(account, isCurrentAccount, now, persistedQuotaEntry) {
|
|
151
|
+
if (account.enabled === false)
|
|
152
|
+
return "disabled";
|
|
153
|
+
if (typeof account.coolingDownUntil === "number" &&
|
|
154
|
+
account.coolingDownUntil > now) {
|
|
155
|
+
return "cooldown";
|
|
156
|
+
}
|
|
157
|
+
if (persistedQuotaEntry && isQuotaCacheEntryExhausted(persistedQuotaEntry, now)) {
|
|
158
|
+
return "quota-exhausted";
|
|
159
|
+
}
|
|
160
|
+
if (persistedQuotaEntry?.status === 429)
|
|
161
|
+
return "rate-limited";
|
|
162
|
+
const rateLimit = formatRateLimitEntry(account, now, "codex");
|
|
163
|
+
if (rateLimit)
|
|
164
|
+
return "rate-limited";
|
|
165
|
+
if (isCurrentAccount)
|
|
166
|
+
return "active";
|
|
167
|
+
return "ok";
|
|
168
|
+
}
|
|
169
|
+
function parseLeftPercentFromQuotaSummary(summary, windowLabel) {
|
|
170
|
+
if (!summary)
|
|
171
|
+
return -1;
|
|
172
|
+
const match = summary.match(new RegExp(`(?:^|\\|)\\s*${windowLabel}\\s+(\\d{1,3})%`, "i"));
|
|
173
|
+
const value = Number.parseInt(match?.[1] ?? "", 10);
|
|
174
|
+
if (!Number.isFinite(value))
|
|
175
|
+
return -1;
|
|
176
|
+
return Math.max(0, Math.min(100, value));
|
|
177
|
+
}
|
|
178
|
+
function readQuotaLeftPercent(account, windowLabel) {
|
|
179
|
+
const direct = windowLabel === "5h"
|
|
180
|
+
? account.quota5hLeftPercent
|
|
181
|
+
: account.quota7dLeftPercent;
|
|
182
|
+
if (typeof direct === "number" && Number.isFinite(direct)) {
|
|
183
|
+
return Math.max(0, Math.min(100, Math.round(direct)));
|
|
184
|
+
}
|
|
185
|
+
return parseLeftPercentFromQuotaSummary(account.quotaSummary, windowLabel);
|
|
186
|
+
}
|
|
187
|
+
function readQuotaFloorPercent(account) {
|
|
188
|
+
return Math.min(readQuotaLeftPercent(account, "5h"), readQuotaLeftPercent(account, "7d"));
|
|
189
|
+
}
|
|
190
|
+
function accountStatusSortBucket(status) {
|
|
191
|
+
switch (status) {
|
|
192
|
+
case "active":
|
|
193
|
+
case "ok":
|
|
194
|
+
return 0;
|
|
195
|
+
case "unknown":
|
|
196
|
+
return 1;
|
|
197
|
+
case "quota-exhausted":
|
|
198
|
+
case "cooldown":
|
|
199
|
+
case "rate-limited":
|
|
200
|
+
return 2;
|
|
201
|
+
case "disabled":
|
|
202
|
+
case "error":
|
|
203
|
+
case "flagged":
|
|
204
|
+
return 3;
|
|
205
|
+
default:
|
|
206
|
+
return 1;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function accountReadinessSortBucket(account) {
|
|
210
|
+
const statusBucket = accountStatusSortBucket(account.status);
|
|
211
|
+
if (statusBucket >= 2)
|
|
212
|
+
return statusBucket;
|
|
213
|
+
return account.quotaRateLimited || account.quotaExhausted ? 2 : statusBucket;
|
|
214
|
+
}
|
|
215
|
+
function compareReadyFirstAccounts(left, right) {
|
|
216
|
+
const bucketDelta = accountReadinessSortBucket(left) - accountReadinessSortBucket(right);
|
|
217
|
+
if (bucketDelta !== 0)
|
|
218
|
+
return bucketDelta;
|
|
219
|
+
const leftFloor = readQuotaFloorPercent(left);
|
|
220
|
+
const rightFloor = readQuotaFloorPercent(right);
|
|
221
|
+
if (leftFloor !== rightFloor)
|
|
222
|
+
return rightFloor - leftFloor;
|
|
223
|
+
const left5h = readQuotaLeftPercent(left, "5h");
|
|
224
|
+
const right5h = readQuotaLeftPercent(right, "5h");
|
|
225
|
+
if (left5h !== right5h)
|
|
226
|
+
return right5h - left5h;
|
|
227
|
+
const left7d = readQuotaLeftPercent(left, "7d");
|
|
228
|
+
const right7d = readQuotaLeftPercent(right, "7d");
|
|
229
|
+
if (left7d !== right7d)
|
|
230
|
+
return right7d - left7d;
|
|
231
|
+
const leftLastUsed = left.lastUsed ?? 0;
|
|
232
|
+
const rightLastUsed = right.lastUsed ?? 0;
|
|
233
|
+
if (leftLastUsed !== rightLastUsed)
|
|
234
|
+
return rightLastUsed - leftLastUsed;
|
|
235
|
+
const leftSource = left.sourceIndex ?? left.index;
|
|
236
|
+
const rightSource = right.sourceIndex ?? right.index;
|
|
237
|
+
return leftSource - rightSource;
|
|
238
|
+
}
|
|
239
|
+
function applyAccountMenuOrdering(accounts, displaySettings) {
|
|
240
|
+
const sortEnabled = displaySettings.menuSortEnabled ??
|
|
241
|
+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortEnabled ??
|
|
242
|
+
true;
|
|
243
|
+
const sortMode = displaySettings.menuSortMode ??
|
|
244
|
+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortMode ??
|
|
245
|
+
"ready-first";
|
|
246
|
+
if (!sortEnabled || sortMode !== "ready-first") {
|
|
247
|
+
return [...accounts];
|
|
248
|
+
}
|
|
249
|
+
const sorted = [...accounts].sort(compareReadyFirstAccounts);
|
|
250
|
+
const pinCurrent = displaySettings.menuSortPinCurrent ??
|
|
251
|
+
DEFAULT_DASHBOARD_DISPLAY_SETTINGS.menuSortPinCurrent ??
|
|
252
|
+
false;
|
|
253
|
+
if (pinCurrent) {
|
|
254
|
+
const currentIndex = sorted.findIndex((account) => account.isCurrentAccount);
|
|
255
|
+
if (currentIndex > 0) {
|
|
256
|
+
const current = sorted.splice(currentIndex, 1)[0];
|
|
257
|
+
const first = sorted[0];
|
|
258
|
+
if (current && first && compareReadyFirstAccounts(current, first) <= 0) {
|
|
259
|
+
sorted.unshift(current);
|
|
260
|
+
}
|
|
261
|
+
else if (current) {
|
|
262
|
+
sorted.splice(currentIndex, 0, current);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return sorted;
|
|
267
|
+
}
|
|
268
|
+
export function toExistingAccountInfo(storage, quotaCache, displaySettings, runtimeCurrent = null) {
|
|
269
|
+
const now = Date.now();
|
|
270
|
+
const activeIndex = resolveActiveIndex(storage, "codex");
|
|
271
|
+
const layoutMode = resolveMenuLayoutMode(displaySettings);
|
|
272
|
+
const emailFallbackState = buildQuotaEmailFallbackState(storage.accounts);
|
|
273
|
+
const baseAccounts = storage.accounts.map((account, index) => {
|
|
274
|
+
const entry = getPersistedQuotaViewForAccount(quotaCache, account, storage.accounts, now, emailFallbackState);
|
|
275
|
+
const currentMarkers = resolveAccountCurrentMarkers(index, activeIndex, runtimeCurrent);
|
|
276
|
+
const isCurrentAccount = isDisplayCurrentAccount(index, activeIndex, runtimeCurrent);
|
|
277
|
+
const quotaExhausted = entry ? isQuotaCacheEntryExhausted(entry, now) : false;
|
|
278
|
+
return {
|
|
279
|
+
index,
|
|
280
|
+
sourceIndex: index,
|
|
281
|
+
accountId: account.accountId,
|
|
282
|
+
accountLabel: account.accountLabel,
|
|
283
|
+
email: account.email,
|
|
284
|
+
addedAt: account.addedAt,
|
|
285
|
+
lastUsed: account.lastUsed,
|
|
286
|
+
status: mapAccountStatus(account, isCurrentAccount, now, entry),
|
|
287
|
+
quotaSummary: (displaySettings.menuShowQuotaSummary ?? true) && entry
|
|
288
|
+
? formatAccountQuotaSummary(entry, now)
|
|
289
|
+
: undefined,
|
|
290
|
+
quota5hLeftPercent: quotaLeftPercentFromUsed(entry?.primary.usedPercent),
|
|
291
|
+
quota5hResetAtMs: entry?.primary.resetAtMs,
|
|
292
|
+
quota7dLeftPercent: quotaLeftPercentFromUsed(entry?.secondary.usedPercent),
|
|
293
|
+
quota7dResetAtMs: entry?.secondary.resetAtMs,
|
|
294
|
+
quotaRateLimited: entry?.status === 429,
|
|
295
|
+
quotaExhausted,
|
|
296
|
+
isCurrentAccount,
|
|
297
|
+
isDefaultAccount: index === activeIndex,
|
|
298
|
+
isRuntimeCurrentAccount: runtimeCurrent?.index === index,
|
|
299
|
+
currentMarkers,
|
|
300
|
+
enabled: account.enabled !== false,
|
|
301
|
+
showStatusBadge: displaySettings.menuShowStatusBadge ?? true,
|
|
302
|
+
showCurrentBadge: displaySettings.menuShowCurrentBadge ?? true,
|
|
303
|
+
showLastUsed: displaySettings.menuShowLastUsed ?? true,
|
|
304
|
+
showQuotaCooldown: displaySettings.menuShowQuotaCooldown ?? true,
|
|
305
|
+
showHintsForUnselectedRows: layoutMode === "expanded-rows",
|
|
306
|
+
highlightCurrentRow: displaySettings.menuHighlightCurrentRow ?? true,
|
|
307
|
+
focusStyle: displaySettings.menuFocusStyle ?? "row-invert",
|
|
308
|
+
statuslineFields: displaySettings.menuStatuslineFields ?? [
|
|
309
|
+
"last-used",
|
|
310
|
+
"limits",
|
|
311
|
+
"status",
|
|
312
|
+
],
|
|
313
|
+
};
|
|
314
|
+
});
|
|
315
|
+
const orderedAccounts = applyAccountMenuOrdering(baseAccounts, displaySettings);
|
|
316
|
+
const quickSwitchUsesVisibleRows = displaySettings.menuSortQuickSwitchVisibleRow ?? true;
|
|
317
|
+
return orderedAccounts.map((account, displayIndex) => ({
|
|
318
|
+
...account,
|
|
319
|
+
index: displayIndex,
|
|
320
|
+
quickSwitchNumber: quickSwitchUsesVisibleRows
|
|
321
|
+
? displayIndex + 1
|
|
322
|
+
: (account.sourceIndex ?? displayIndex) + 1,
|
|
323
|
+
}));
|
|
324
|
+
}
|
|
325
|
+
export async function loadRuntimeCurrentSelectionForStorage(storage, now = Date.now()) {
|
|
326
|
+
const [runtimeSnapshot, appBindStatus] = await Promise.all([
|
|
327
|
+
loadPersistedRuntimeObservabilitySnapshot().catch(() => null),
|
|
328
|
+
getAppBindStatus()
|
|
329
|
+
.then((status) => (status.running ? status.router : null))
|
|
330
|
+
.catch(() => null),
|
|
331
|
+
]);
|
|
332
|
+
return resolveRuntimeCurrentAccount(storage, {
|
|
333
|
+
runtimeSnapshot,
|
|
334
|
+
appBindStatus,
|
|
335
|
+
appHelperStatus: readAppRuntimeHelperAccountSignal(),
|
|
336
|
+
}, { now });
|
|
337
|
+
}
|
|
338
|
+
function activeAccountMatchesCodexCliState(account, state) {
|
|
339
|
+
if (!state)
|
|
340
|
+
return true;
|
|
341
|
+
const accountId = account.accountId?.trim();
|
|
342
|
+
const activeAccountId = state.activeAccountId?.trim();
|
|
343
|
+
if (accountId && activeAccountId) {
|
|
344
|
+
return accountId === activeAccountId;
|
|
345
|
+
}
|
|
346
|
+
const email = sanitizeEmail(account.email);
|
|
347
|
+
const activeEmail = sanitizeEmail(state.activeEmail);
|
|
348
|
+
if (email && activeEmail) {
|
|
349
|
+
return email === activeEmail;
|
|
350
|
+
}
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
export async function syncCodexCliActiveSelectionIfDrifted(storage) {
|
|
354
|
+
const activeIndex = resolveActiveIndex(storage, "codex");
|
|
355
|
+
if (activeIndex < 0 || activeIndex >= storage.accounts.length) {
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
const account = storage.accounts[activeIndex];
|
|
359
|
+
if (!account) {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
try {
|
|
363
|
+
const cliState = await loadCodexCliState({ forceRefresh: true });
|
|
364
|
+
if (!cliState || activeAccountMatchesCodexCliState(account, cliState)) {
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
return setCodexCliActiveSelection({
|
|
368
|
+
accountId: account.accountId,
|
|
369
|
+
email: account.email,
|
|
370
|
+
accessToken: account.accessToken,
|
|
371
|
+
refreshToken: account.refreshToken,
|
|
372
|
+
expiresAt: account.expiresAt,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type Workspace } from "../accounts.js";
|
|
2
|
+
import type { AccountIdSource, TokenResult } from "../types.js";
|
|
3
|
+
import { type AccountPoolWriteOutcome } from "./account-pool-write.js";
|
|
4
|
+
/**
|
|
5
|
+
* OAuth/device sign-in plumbing for the login dashboard: authorization-flow
|
|
6
|
+
* execution, manual callback entry, account-id selection for fresh tokens, and
|
|
7
|
+
* account-pool persistence of sign-in results. Moved verbatim out of
|
|
8
|
+
* lib/codex-manager.ts (audit roadmap §4.1.1 phase 4).
|
|
9
|
+
*/
|
|
10
|
+
/** @internal */
|
|
11
|
+
export type TokenSuccess = Extract<TokenResult, {
|
|
12
|
+
type: "success";
|
|
13
|
+
}>;
|
|
14
|
+
/** @internal */
|
|
15
|
+
export type TokenSuccessWithAccount = TokenSuccess & {
|
|
16
|
+
accountIdOverride?: string;
|
|
17
|
+
accountIdSource?: AccountIdSource;
|
|
18
|
+
accountLabel?: string;
|
|
19
|
+
workspaces?: Workspace[];
|
|
20
|
+
};
|
|
21
|
+
/** @internal */
|
|
22
|
+
export declare function isOAuthCancellation(result: Exclude<TokenResult, {
|
|
23
|
+
type: "success";
|
|
24
|
+
}>): boolean;
|
|
25
|
+
/** @internal */
|
|
26
|
+
export declare function isAbortError(error: unknown): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the account-id selection for freshly-minted tokens.
|
|
29
|
+
*
|
|
30
|
+
* The org-override precedence (explicit `login --org` wins over the ambient
|
|
31
|
+
* CODEX_AUTH_ACCOUNT_ID env, for this call only) lives in the internal
|
|
32
|
+
* lib/auth/org-override.ts module so it can be unit-tested without exporting this
|
|
33
|
+
* CLI-internal function. Threading the org as a parameter avoids mutating
|
|
34
|
+
* process.env for the duration of a login, which raced on concurrent re-entry.
|
|
35
|
+
*
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveAccountSelection(tokens: TokenSuccess, orgOverride?: string): TokenSuccessWithAccount;
|
|
39
|
+
/** @internal */
|
|
40
|
+
export type OAuthSignInMode = "browser" | "manual" | "device" | "restore-backup" | "cancel";
|
|
41
|
+
/** @internal */
|
|
42
|
+
export type SignInFlowOptions = {
|
|
43
|
+
timeoutMs?: number;
|
|
44
|
+
};
|
|
45
|
+
/** @internal */
|
|
46
|
+
export declare function runOAuthFlow(forceNewLogin: boolean, signInMode: Extract<OAuthSignInMode, "browser" | "manual">): Promise<TokenResult>;
|
|
47
|
+
/** @internal */
|
|
48
|
+
export declare function runSignInFlow(forceNewLogin: boolean, signInMode: Extract<OAuthSignInMode, "browser" | "manual" | "device">, options?: SignInFlowOptions): Promise<TokenResult>;
|
|
49
|
+
/** @internal */
|
|
50
|
+
export type PersistAccountPoolOutcome = AccountPoolWriteOutcome;
|
|
51
|
+
/** @internal */
|
|
52
|
+
export declare function persistAccountPool(results: TokenSuccessWithAccount[], replaceAll: boolean): Promise<PersistAccountPoolOutcome | null>;
|
|
53
|
+
/** @internal */
|
|
54
|
+
export declare function syncSelectionToCodex(tokens: TokenSuccessWithAccount): Promise<void>;
|
|
55
|
+
//# sourceMappingURL=login-oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-oauth.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/login-oauth.ts"],"names":[],"mappings":"AAEA,OAAO,EAON,KAAK,SAAS,EACd,MAAM,gBAAgB,CAAC;AAqBxB,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EACN,KAAK,uBAAuB,EAG5B,MAAM,yBAAyB,CAAC;AAOjC;;;;;GAKG;AAEH,gBAAgB;AAChB,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AACrE,gBAAgB;AAChB,MAAM,MAAM,uBAAuB,GAAG,YAAY,GAAG;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC;AAIF,gBAAgB;AAChB,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,GAC/C,OAAO,CAGT;AAED,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,MAAM,GAClB,uBAAuB,CA+DzB;AA0FD,gBAAgB;AAChB,MAAM,MAAM,eAAe,GACxB,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,gBAAgB,GAChB,QAAQ,CAAC;AACZ,gBAAgB;AAChB,MAAM,MAAM,iBAAiB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,gBAAgB;AAChB,wBAAsB,YAAY,CACjC,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,OAAO,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,CAAC,GACxD,OAAO,CAAC,WAAW,CAAC,CAwHtB;AAED,gBAAgB;AAChB,wBAAsB,aAAa,CAClC,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,OAAO,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC,EACrE,OAAO,GAAE,iBAAsB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAetB;AAED,gBAAgB;AAChB,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAEhE,gBAAgB;AAChB,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,uBAAuB,EAAE,EAClC,UAAU,EAAE,OAAO,GACjB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAuD3C;AAED,gBAAgB;AAChB,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,uBAAuB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|