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
|
@@ -54,6 +54,7 @@ import { isRecord, sleep } from "./utils.js";
|
|
|
54
54
|
export { buildPinnedUnavailableErrorBody, buildTokenInvalidationBody, } from "./request/rate-limit-decision.js";
|
|
55
55
|
export { chooseAccount } from "./runtime/rotation-account-selection.js";
|
|
56
56
|
export { maybeInvalidateAffinityFromDisk, readPinnedAccountIndexFromDisk, readStorageMetaFromDisk, resetPinCacheForTesting, } from "./runtime/rotation-storage-meta.js";
|
|
57
|
+
export { resetRuntimePolicyCacheForTests } from "./policy/runtime-policy-cache.js";
|
|
57
58
|
const DEFAULT_HOST = "127.0.0.1";
|
|
58
59
|
function isLoopbackHost(host) {
|
|
59
60
|
const normalized = host.trim().toLowerCase();
|
|
@@ -87,6 +88,102 @@ function toUrlHost(host) {
|
|
|
87
88
|
const bare = stripIpv6Brackets(host);
|
|
88
89
|
return bare.includes(":") ? `[${bare}]` : bare;
|
|
89
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* True only for a NUMERIC loopback literal, as `new URL().hostname` reports it.
|
|
93
|
+
*
|
|
94
|
+
* Duplicates the wrapper's predicate (scripts/codex.js) at library level — a
|
|
95
|
+
* hostname like "localhost" is deliberately NOT enough: it is resolved by the
|
|
96
|
+
* OS at connect time, so an /etc/hosts or Windows hosts entry can point it at
|
|
97
|
+
* a routable address, and the upstream request carries the managed OAuth
|
|
98
|
+
* bearer token and the request body. WHATWG URL always reports an IPv6 host in
|
|
99
|
+
* its bracketed form, so `::1` is only ever seen here as `[::1]`.
|
|
100
|
+
*/
|
|
101
|
+
function isNumericLoopbackUrlHostname(hostname) {
|
|
102
|
+
if (hostname === "[::1]") {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
const ipv4 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(hostname);
|
|
106
|
+
if (!ipv4) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
const octets = ipv4.slice(1).map((part) => Number(part));
|
|
110
|
+
if (octets.some((octet) => !Number.isInteger(octet) || octet > 255)) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
// The whole 127.0.0.0/8 block is loopback, not just 127.0.0.1.
|
|
114
|
+
return octets[0] === 127;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Whether the raw URL text carries an explicit `:port` (mirrors the wrapper).
|
|
118
|
+
*
|
|
119
|
+
* `new URL()` erases a port that matches the scheme default, so
|
|
120
|
+
* `http://127.0.0.1:80/x` reports `parsed.port === ""` and a `!parsed.port`
|
|
121
|
+
* check would reject a perfectly valid, explicitly-ported loopback URL.
|
|
122
|
+
*/
|
|
123
|
+
function urlHasExplicitPort(raw) {
|
|
124
|
+
const withoutScheme = raw.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//, "");
|
|
125
|
+
const authority = withoutScheme.split(/[/?#]/, 1)[0] ?? "";
|
|
126
|
+
// Strip userinfo first, or a password containing ':' reads as a port.
|
|
127
|
+
const hostAndPort = authority.slice(authority.lastIndexOf("@") + 1);
|
|
128
|
+
if (hostAndPort.startsWith("[")) {
|
|
129
|
+
const close = hostAndPort.indexOf("]");
|
|
130
|
+
return close !== -1 && /^:\d+$/.test(hostAndPort.slice(close + 1));
|
|
131
|
+
}
|
|
132
|
+
const colon = hostAndPort.indexOf(":");
|
|
133
|
+
return colon !== -1 && /^:\d+$/.test(hostAndPort.slice(colon));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Library-boundary enforcement for the upstream the proxy forwards managed
|
|
137
|
+
* OAuth Bearer tokens to (runtime-proxy trust boundary).
|
|
138
|
+
*
|
|
139
|
+
* `options.upstreamBaseUrl` is a library input: callers are not all the
|
|
140
|
+
* wrapper, so the env-var validation in scripts/codex.js does not protect this
|
|
141
|
+
* boundary. A non-https or non-loopback value would exfiltrate account tokens
|
|
142
|
+
* to whatever host it names. The policy mirrors the wrapper exactly: https is
|
|
143
|
+
* always allowed, while http is accepted only for the documented dev path — a
|
|
144
|
+
* NUMERIC loopback host (127.0.0.0/8 or [::1], never a name) with an explicit
|
|
145
|
+
* port — and no URL may carry credentials, a query, or a fragment.
|
|
146
|
+
*/
|
|
147
|
+
function assertAllowedUpstreamBaseUrl(raw) {
|
|
148
|
+
let parsed;
|
|
149
|
+
try {
|
|
150
|
+
parsed = new URL(raw);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
throw new CodexValidationError(`Runtime rotation proxy upstreamBaseUrl is not a valid absolute URL.`, { field: "upstreamBaseUrl", expected: "an https URL, or an http URL on a numeric loopback host with an explicit port" });
|
|
154
|
+
}
|
|
155
|
+
const isDevLoopback = parsed.protocol === "http:" &&
|
|
156
|
+
isNumericLoopbackUrlHostname(parsed.hostname.toLowerCase()) &&
|
|
157
|
+
Boolean(parsed.port || urlHasExplicitPort(raw));
|
|
158
|
+
if ((parsed.protocol !== "https:" && !isDevLoopback) ||
|
|
159
|
+
parsed.username ||
|
|
160
|
+
parsed.password ||
|
|
161
|
+
parsed.search ||
|
|
162
|
+
parsed.hash) {
|
|
163
|
+
throw new CodexValidationError(`Runtime rotation proxy refuses upstreamBaseUrl "${raw}". ` +
|
|
164
|
+
"It forwards managed OAuth tokens: use https, or http only on a " +
|
|
165
|
+
"numeric loopback host (127.0.0.0/8 or [::1]; a name such as " +
|
|
166
|
+
'"localhost" can resolve off-host) with an explicit port, and no ' +
|
|
167
|
+
"credentials, query, or fragment.", {
|
|
168
|
+
field: "upstreamBaseUrl",
|
|
169
|
+
expected: "an https URL, or an http URL on a numeric loopback host with an explicit port",
|
|
170
|
+
context: { upstreamBaseUrl: raw },
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Whether a fetch rejection is undici refusing to follow a redirect.
|
|
176
|
+
*
|
|
177
|
+
* The upstream fetch runs `redirect: "error"` so a 3xx can never re-send the
|
|
178
|
+
* managed Bearer token to an arbitrary host. Instead of a Response, fetch
|
|
179
|
+
* rejects with `TypeError("fetch failed")` whose `cause` is the network error
|
|
180
|
+
* `unexpected redirect` (see undici's httpNetworkOrCacheFetch). Check the cause
|
|
181
|
+
* level and the bare message so a custom fetchImpl delivering the same network
|
|
182
|
+
* error unwrapped classifies identically.
|
|
183
|
+
*/
|
|
184
|
+
function isRedirectRejection(error) {
|
|
185
|
+
return [error, error?.cause].some((candidate) => candidate instanceof Error && candidate.message === "unexpected redirect");
|
|
186
|
+
}
|
|
90
187
|
// Structured logger for the default-on runtime proxy (errors-logging-01,
|
|
91
188
|
// runtime-proxy-04). Previously the 1900-LOC proxy had zero logger integration;
|
|
92
189
|
// failures surfaced only as a last-write-wins status.lastError string. Logs are
|
|
@@ -746,6 +843,13 @@ export async function startRuntimeRotationProxy(options) {
|
|
|
746
843
|
const bindHost = toBindHost(host);
|
|
747
844
|
const urlHost = toUrlHost(host);
|
|
748
845
|
const port = options.port ?? 0;
|
|
846
|
+
// Library-boundary trust enforcement: the wrapper validates the env override,
|
|
847
|
+
// but options.upstreamBaseUrl reaches here from any caller — and Bearer
|
|
848
|
+
// tokens are forwarded to whatever host it names. https always passes; http
|
|
849
|
+
// is allowed only for the documented numeric-loopback dev path.
|
|
850
|
+
if (options.upstreamBaseUrl !== undefined) {
|
|
851
|
+
assertAllowedUpstreamBaseUrl(options.upstreamBaseUrl);
|
|
852
|
+
}
|
|
749
853
|
const upstreamBaseUrl = options.upstreamBaseUrl ?? CODEX_BASE_URL;
|
|
750
854
|
const clientApiKey = typeof options.clientApiKey === "string" &&
|
|
751
855
|
options.clientApiKey.trim().length > 0
|
|
@@ -1366,8 +1470,8 @@ async function handleRequestInner(state, req, res, traceId) {
|
|
|
1366
1470
|
const subscriptionQuotaByAccount = {};
|
|
1367
1471
|
const resetCreditState = state.nativeOpenai && isResponsesRequest ? await cachedRead(state, "reset-credits", loadResetCreditState).catch(() => null) : null;
|
|
1368
1472
|
const quotaForScope = (account, scope) => {
|
|
1369
|
-
//
|
|
1370
|
-
const cached =
|
|
1473
|
+
// Scoped observations belong to this credential and workspace; legacy entries only describe the binding.
|
|
1474
|
+
const cached = findQuotaCacheEntryForAccount(subscriptionQuotaCache, account, accountManager.getAccountsSnapshot(), undefined, scope.accountId);
|
|
1371
1475
|
const observed = state.subscriptionQuotaObservations?.get(JSON.stringify([scope.id, context.model]));
|
|
1372
1476
|
const reset = resetCreditState?.snapshots[scope.id];
|
|
1373
1477
|
if (reset && reset.updatedAt > Math.max(cached?.updatedAt ?? 0, observed?.updatedAt ?? 0) && reset.updatedAt <= state.now() && state.now() - reset.updatedAt <= 60000)
|
|
@@ -1616,7 +1720,7 @@ async function handleRequestInner(state, req, res, traceId) {
|
|
|
1616
1720
|
continue;
|
|
1617
1721
|
for (const scope of scopes)
|
|
1618
1722
|
applyConfirmedReset({ account, scope, model: context.model, family: context.family, manager: accountManager, snapshot: resetCreditState.snapshots[scope.id], lastRedemptionAt: resetCreditState.lastRedemptionAt,
|
|
1619
|
-
previous: state.subscriptionQuotaObservations?.get(JSON.stringify([scope.id, context.model])) ??
|
|
1723
|
+
previous: state.subscriptionQuotaObservations?.get(JSON.stringify([scope.id, context.model])) ?? findQuotaCacheEntryForAccount(subscriptionQuotaCache, account, accountManager.getAccountsSnapshot(), undefined, scope.accountId),
|
|
1620
1724
|
observations: state.subscriptionQuotaObservations ??= new Map(), now: state.now(), clearQuotaScheduler: a => state.preemptiveQuotaScheduler.clear(buildQuotaScheduleKey(a, context.family, context.model)) });
|
|
1621
1725
|
}
|
|
1622
1726
|
}
|
|
@@ -2030,6 +2134,11 @@ async function handleRequestInner(state, req, res, traceId) {
|
|
|
2030
2134
|
method: context.method,
|
|
2031
2135
|
headers: outboundHeaders,
|
|
2032
2136
|
signal: fetchAbortController.signal,
|
|
2137
|
+
// Redirect pinning: never follow an upstream redirect — a 3xx from
|
|
2138
|
+
// a compromised or misconfigured endpoint would re-send the
|
|
2139
|
+
// managed Bearer token to an arbitrary host. Matches the model
|
|
2140
|
+
// catalog fetch above.
|
|
2141
|
+
redirect: "error",
|
|
2033
2142
|
};
|
|
2034
2143
|
if (context.method === "POST") {
|
|
2035
2144
|
upstreamRequestInit.body = context.body;
|
|
@@ -2062,6 +2171,30 @@ async function handleRequestInner(state, req, res, traceId) {
|
|
|
2062
2171
|
error: transportError,
|
|
2063
2172
|
});
|
|
2064
2173
|
refundConsumedPoolToken(refreshed.account);
|
|
2174
|
+
// A redirect rejection is upstream configuration, not a transport
|
|
2175
|
+
// outage or an account-health signal: the 3xx arrived (so the path
|
|
2176
|
+
// works and no generation started), the Bearer token never reached
|
|
2177
|
+
// the redirect target, and every managed account would hit the
|
|
2178
|
+
// same redirect — cooling + rotating here would drain the pool on
|
|
2179
|
+
// one endpoint fault. This also covers the WebSocket httpFetch
|
|
2180
|
+
// fallback: SocketSession preserves init, so a refused-upgrade
|
|
2181
|
+
// turn on API/ZDR credentials can reject this way. Fail the
|
|
2182
|
+
// request in place and leave account state untouched.
|
|
2183
|
+
if (isRedirectRejection(error)) {
|
|
2184
|
+
writeJson(res, 502, {
|
|
2185
|
+
error: {
|
|
2186
|
+
code: "upstream_redirect_rejected",
|
|
2187
|
+
message: "Upstream endpoint attempted a redirect; redirects are never followed.",
|
|
2188
|
+
},
|
|
2189
|
+
});
|
|
2190
|
+
await usageRecorder.record({
|
|
2191
|
+
outcome: "failure",
|
|
2192
|
+
statusCode: 502,
|
|
2193
|
+
errorCode: "upstream_redirect_rejected",
|
|
2194
|
+
account: refreshed.account,
|
|
2195
|
+
});
|
|
2196
|
+
return;
|
|
2197
|
+
}
|
|
2065
2198
|
// A timeout may occur after generation; do not retry within this request.
|
|
2066
2199
|
if (isImageRequest) {
|
|
2067
2200
|
writeJson(res, 502, {
|
package/dist/lib/schemas.d.ts
CHANGED
|
@@ -138,10 +138,10 @@ export declare const AccountMetadataV3Schema: z.ZodObject<{
|
|
|
138
138
|
rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
|
|
139
139
|
coolingDownUntil: z.ZodOptional<z.ZodNumber>;
|
|
140
140
|
cooldownReason: z.ZodOptional<z.ZodEnum<{
|
|
141
|
+
"rate-limit": "rate-limit";
|
|
141
142
|
"auth-failure": "auth-failure";
|
|
142
143
|
"network-error": "network-error";
|
|
143
144
|
"server-error": "server-error";
|
|
144
|
-
"rate-limit": "rate-limit";
|
|
145
145
|
}>>;
|
|
146
146
|
authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
|
|
147
147
|
authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
|
|
@@ -191,10 +191,10 @@ export declare const AccountStorageV3Schema: z.ZodObject<{
|
|
|
191
191
|
rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
|
|
192
192
|
coolingDownUntil: z.ZodOptional<z.ZodNumber>;
|
|
193
193
|
cooldownReason: z.ZodOptional<z.ZodEnum<{
|
|
194
|
+
"rate-limit": "rate-limit";
|
|
194
195
|
"auth-failure": "auth-failure";
|
|
195
196
|
"network-error": "network-error";
|
|
196
197
|
"server-error": "server-error";
|
|
197
|
-
"rate-limit": "rate-limit";
|
|
198
198
|
}>>;
|
|
199
199
|
authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
|
|
200
200
|
authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
|
|
@@ -225,6 +225,11 @@ export declare const AccountStorageV3Schema: z.ZodObject<{
|
|
|
225
225
|
export type AccountStorageV3FromSchema = z.infer<typeof AccountStorageV3Schema>;
|
|
226
226
|
/**
|
|
227
227
|
* Legacy V1 storage format for migration support.
|
|
228
|
+
*
|
|
229
|
+
* The V3-era top-level fields are accepted too: a hybrid file (version:1 but
|
|
230
|
+
* written by newer code) must not lose `activeIndexByFamily` /
|
|
231
|
+
* `pinnedAccountIndex` / `affinityGeneration` at the schema boundary before
|
|
232
|
+
* normalizeAccountStorage can consume them.
|
|
228
233
|
*/
|
|
229
234
|
export declare const AccountStorageV1Schema: z.ZodObject<{
|
|
230
235
|
version: z.ZodLiteral<1>;
|
|
@@ -255,13 +260,22 @@ export declare const AccountStorageV1Schema: z.ZodObject<{
|
|
|
255
260
|
rateLimitResetTime: z.ZodOptional<z.ZodNumber>;
|
|
256
261
|
coolingDownUntil: z.ZodOptional<z.ZodNumber>;
|
|
257
262
|
cooldownReason: z.ZodOptional<z.ZodEnum<{
|
|
263
|
+
"rate-limit": "rate-limit";
|
|
258
264
|
"auth-failure": "auth-failure";
|
|
259
265
|
"network-error": "network-error";
|
|
260
266
|
"server-error": "server-error";
|
|
261
|
-
"rate-limit": "rate-limit";
|
|
262
267
|
}>>;
|
|
263
|
-
}, z.core.$
|
|
268
|
+
}, z.core.$loose>>;
|
|
264
269
|
activeIndex: z.ZodNumber;
|
|
270
|
+
activeIndexByFamily: z.ZodOptional<z.ZodObject<{
|
|
271
|
+
"gpt-5-codex": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
272
|
+
"codex-max": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
273
|
+
codex: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
274
|
+
"gpt-5.2": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
275
|
+
"gpt-5.1": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
276
|
+
}, z.core.$strip>>;
|
|
277
|
+
pinnedAccountIndex: z.ZodOptional<z.ZodNumber>;
|
|
278
|
+
affinityGeneration: z.ZodOptional<z.ZodNumber>;
|
|
265
279
|
}, z.core.$strip>;
|
|
266
280
|
/**
|
|
267
281
|
* Union of V1 and V3 storage formats for migration detection.
|
|
@@ -295,13 +309,22 @@ export declare const AnyAccountStorageSchema: z.ZodDiscriminatedUnion<[z.ZodObje
|
|
|
295
309
|
rateLimitResetTime: z.ZodOptional<z.ZodNumber>;
|
|
296
310
|
coolingDownUntil: z.ZodOptional<z.ZodNumber>;
|
|
297
311
|
cooldownReason: z.ZodOptional<z.ZodEnum<{
|
|
312
|
+
"rate-limit": "rate-limit";
|
|
298
313
|
"auth-failure": "auth-failure";
|
|
299
314
|
"network-error": "network-error";
|
|
300
315
|
"server-error": "server-error";
|
|
301
|
-
"rate-limit": "rate-limit";
|
|
302
316
|
}>>;
|
|
303
|
-
}, z.core.$
|
|
317
|
+
}, z.core.$loose>>;
|
|
304
318
|
activeIndex: z.ZodNumber;
|
|
319
|
+
activeIndexByFamily: z.ZodOptional<z.ZodObject<{
|
|
320
|
+
"gpt-5-codex": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
321
|
+
"codex-max": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
322
|
+
codex: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
323
|
+
"gpt-5.2": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
324
|
+
"gpt-5.1": z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
|
325
|
+
}, z.core.$strip>>;
|
|
326
|
+
pinnedAccountIndex: z.ZodOptional<z.ZodNumber>;
|
|
327
|
+
affinityGeneration: z.ZodOptional<z.ZodNumber>;
|
|
305
328
|
}, z.core.$strip>, z.ZodObject<{
|
|
306
329
|
version: z.ZodLiteral<3>;
|
|
307
330
|
accounts: z.ZodArray<z.ZodObject<{
|
|
@@ -332,10 +355,10 @@ export declare const AnyAccountStorageSchema: z.ZodDiscriminatedUnion<[z.ZodObje
|
|
|
332
355
|
rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
|
|
333
356
|
coolingDownUntil: z.ZodOptional<z.ZodNumber>;
|
|
334
357
|
cooldownReason: z.ZodOptional<z.ZodEnum<{
|
|
358
|
+
"rate-limit": "rate-limit";
|
|
335
359
|
"auth-failure": "auth-failure";
|
|
336
360
|
"network-error": "network-error";
|
|
337
361
|
"server-error": "server-error";
|
|
338
|
-
"rate-limit": "rate-limit";
|
|
339
362
|
}>>;
|
|
340
363
|
authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
|
|
341
364
|
authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
|
|
@@ -397,10 +420,10 @@ export declare const FlaggedAccountMetadataV1Schema: z.ZodObject<{
|
|
|
397
420
|
rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
|
|
398
421
|
coolingDownUntil: z.ZodOptional<z.ZodNumber>;
|
|
399
422
|
cooldownReason: z.ZodOptional<z.ZodEnum<{
|
|
423
|
+
"rate-limit": "rate-limit";
|
|
400
424
|
"auth-failure": "auth-failure";
|
|
401
425
|
"network-error": "network-error";
|
|
402
426
|
"server-error": "server-error";
|
|
403
|
-
"rate-limit": "rate-limit";
|
|
404
427
|
}>>;
|
|
405
428
|
authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
|
|
406
429
|
authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
|
|
@@ -453,10 +476,10 @@ export declare const FlaggedAccountStorageV1Schema: z.ZodObject<{
|
|
|
453
476
|
rateLimitResetTimes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
|
|
454
477
|
coolingDownUntil: z.ZodOptional<z.ZodNumber>;
|
|
455
478
|
cooldownReason: z.ZodOptional<z.ZodEnum<{
|
|
479
|
+
"rate-limit": "rate-limit";
|
|
456
480
|
"auth-failure": "auth-failure";
|
|
457
481
|
"network-error": "network-error";
|
|
458
482
|
"server-error": "server-error";
|
|
459
|
-
"rate-limit": "rate-limit";
|
|
460
483
|
}>>;
|
|
461
484
|
authInvalidatedAt: z.ZodOptional<z.ZodNumber>;
|
|
462
485
|
authInvalidationErrorCode: z.ZodOptional<z.ZodString>;
|
|
@@ -495,12 +518,12 @@ export type AccountsJournalEntryFromSchema = z.infer<typeof AccountsJournalEntry
|
|
|
495
518
|
* Token failure reason codes.
|
|
496
519
|
*/
|
|
497
520
|
declare const TokenFailureReasonSchema: z.ZodEnum<{
|
|
498
|
-
unknown: "unknown";
|
|
499
521
|
http_error: "http_error";
|
|
500
522
|
invalid_response: "invalid_response";
|
|
501
523
|
network_error: "network_error";
|
|
502
524
|
missing_refresh: "missing_refresh";
|
|
503
525
|
timeout: "timeout";
|
|
526
|
+
unknown: "unknown";
|
|
504
527
|
}>;
|
|
505
528
|
export type TokenFailureReasonFromSchema = z.infer<typeof TokenFailureReasonSchema>;
|
|
506
529
|
/**
|
|
@@ -521,12 +544,12 @@ export type TokenSuccessFromSchema = z.infer<typeof TokenSuccessSchema>;
|
|
|
521
544
|
export declare const TokenFailureSchema: z.ZodObject<{
|
|
522
545
|
type: z.ZodLiteral<"failed">;
|
|
523
546
|
reason: z.ZodOptional<z.ZodEnum<{
|
|
524
|
-
unknown: "unknown";
|
|
525
547
|
http_error: "http_error";
|
|
526
548
|
invalid_response: "invalid_response";
|
|
527
549
|
network_error: "network_error";
|
|
528
550
|
missing_refresh: "missing_refresh";
|
|
529
551
|
timeout: "timeout";
|
|
552
|
+
unknown: "unknown";
|
|
530
553
|
}>>;
|
|
531
554
|
statusCode: z.ZodOptional<z.ZodNumber>;
|
|
532
555
|
message: z.ZodOptional<z.ZodString>;
|
|
@@ -545,12 +568,12 @@ export declare const TokenResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
545
568
|
}, z.core.$strip>, z.ZodObject<{
|
|
546
569
|
type: z.ZodLiteral<"failed">;
|
|
547
570
|
reason: z.ZodOptional<z.ZodEnum<{
|
|
548
|
-
unknown: "unknown";
|
|
549
571
|
http_error: "http_error";
|
|
550
572
|
invalid_response: "invalid_response";
|
|
551
573
|
network_error: "network_error";
|
|
552
574
|
missing_refresh: "missing_refresh";
|
|
553
575
|
timeout: "timeout";
|
|
576
|
+
unknown: "unknown";
|
|
554
577
|
}>>;
|
|
555
578
|
statusCode: z.ZodOptional<z.ZodNumber>;
|
|
556
579
|
message: z.ZodOptional<z.ZodString>;
|
|
@@ -624,4 +647,3 @@ export declare function safeParseJson<T>(raw: unknown, schema: z.ZodType<T>, con
|
|
|
624
647
|
*/
|
|
625
648
|
export declare function getValidationErrors(schema: z.ZodType, data: unknown): string[];
|
|
626
649
|
export {};
|
|
627
|
-
//# sourceMappingURL=schemas.d.ts.map
|
package/dist/lib/schemas.js
CHANGED
|
@@ -202,8 +202,16 @@ export const AccountStorageV3Schema = z.object({
|
|
|
202
202
|
});
|
|
203
203
|
/**
|
|
204
204
|
* Legacy V1 account metadata for migration support.
|
|
205
|
+
*
|
|
206
|
+
* Uses `passthrough` so V3-compatible extra fields (workspaces,
|
|
207
|
+
* rateLimitResetTimes, authInvalidatedAt, …) survive the schema boundary:
|
|
208
|
+
* version:1 files with V3-era rows are real (the flagged-accounts store is
|
|
209
|
+
* `version: 1` with full V3 rows) and migrateV1ToV3 now carries unknown
|
|
210
|
+
* fields forward — stripping them here would make that preservation a no-op
|
|
211
|
+
* for every schema-valid file. Same rationale as FlaggedAccountMetadataV1Schema.
|
|
205
212
|
*/
|
|
206
|
-
const AccountMetadataV1Schema = z
|
|
213
|
+
const AccountMetadataV1Schema = z
|
|
214
|
+
.object({
|
|
207
215
|
accountId: z.string().optional(),
|
|
208
216
|
accountIdSource: AccountIdSourceSchema.optional(),
|
|
209
217
|
accountLabel: z.string().optional(),
|
|
@@ -218,14 +226,23 @@ const AccountMetadataV1Schema = z.object({
|
|
|
218
226
|
rateLimitResetTime: z.number().optional(), // V1 used single value
|
|
219
227
|
coolingDownUntil: z.number().optional(),
|
|
220
228
|
cooldownReason: CooldownReasonSchema.optional(),
|
|
221
|
-
})
|
|
229
|
+
})
|
|
230
|
+
.passthrough();
|
|
222
231
|
/**
|
|
223
232
|
* Legacy V1 storage format for migration support.
|
|
233
|
+
*
|
|
234
|
+
* The V3-era top-level fields are accepted too: a hybrid file (version:1 but
|
|
235
|
+
* written by newer code) must not lose `activeIndexByFamily` /
|
|
236
|
+
* `pinnedAccountIndex` / `affinityGeneration` at the schema boundary before
|
|
237
|
+
* normalizeAccountStorage can consume them.
|
|
224
238
|
*/
|
|
225
239
|
export const AccountStorageV1Schema = z.object({
|
|
226
240
|
version: z.literal(1),
|
|
227
241
|
accounts: z.array(AccountMetadataV1Schema),
|
|
228
242
|
activeIndex: z.number().min(0),
|
|
243
|
+
activeIndexByFamily: ActiveIndexByFamilySchema.optional(),
|
|
244
|
+
pinnedAccountIndex: z.number().int().min(0).optional(),
|
|
245
|
+
affinityGeneration: z.number().int().min(0).optional(),
|
|
229
246
|
});
|
|
230
247
|
/**
|
|
231
248
|
* Union of V1 and V3 storage formats for migration detection.
|
package/dist/lib/shutdown.d.ts
CHANGED
|
@@ -6,4 +6,3 @@ export declare function selectNewestAccount<T extends AccountLike>(current: T |
|
|
|
6
6
|
export declare function collectDistinctIdentityValues(values: Array<string | undefined>): Set<string>;
|
|
7
7
|
export declare function findNewestMatchingIndex<T, TRef>(accounts: readonly T[], toRef: (account: T) => TRef, predicate: (ref: TRef) => boolean, selectNewest: (current: T | undefined, candidate: T) => T): number | undefined;
|
|
8
8
|
export {};
|
|
9
|
-
//# sourceMappingURL=account-match-utils.d.ts.map
|
|
@@ -15,16 +15,23 @@ export declare function saveAccountsToDisk(storage: AccountStorageV3, params: {
|
|
|
15
15
|
writeTemp: (tempPath: string, content: string) => Promise<void>;
|
|
16
16
|
statTemp: (tempPath: string) => Promise<{
|
|
17
17
|
size: number;
|
|
18
|
+
mtimeMs?: number;
|
|
19
|
+
ctimeMs?: number;
|
|
20
|
+
ino?: number;
|
|
18
21
|
}>;
|
|
19
22
|
renameTempToPath: (tempPath: string) => Promise<void>;
|
|
20
23
|
cleanupResetMarker: () => Promise<void>;
|
|
21
24
|
cleanupWal: () => Promise<void>;
|
|
22
25
|
cleanupTemp: (tempPath: string) => Promise<void>;
|
|
23
|
-
onSaved: (
|
|
26
|
+
onSaved: (stats: {
|
|
27
|
+
size: number;
|
|
28
|
+
mtimeMs?: number;
|
|
29
|
+
ctimeMs?: number;
|
|
30
|
+
ino?: number;
|
|
31
|
+
}, contentSha256: string) => void;
|
|
24
32
|
logWarn: (message: string, details: Record<string, unknown>) => void;
|
|
25
33
|
logError: (message: string, details: Record<string, unknown>) => void;
|
|
26
34
|
createStorageError: (error: unknown) => Error;
|
|
27
35
|
backupPath: string;
|
|
28
36
|
createTempPath: () => string;
|
|
29
37
|
}): Promise<void>;
|
|
30
|
-
//# sourceMappingURL=account-save.d.ts.map
|
|
@@ -34,7 +34,10 @@ export async function saveAccountsToDisk(storage, params) {
|
|
|
34
34
|
}
|
|
35
35
|
await params.renameTempToPath(tempPath);
|
|
36
36
|
await params.cleanupResetMarker();
|
|
37
|
-
|
|
37
|
+
// The temp file's stat fields survive the rename onto the primary path,
|
|
38
|
+
// so together with the content hash they are a free record of what this
|
|
39
|
+
// process last wrote — no extra stat of the destination is needed.
|
|
40
|
+
params.onSaved(stats, params.computeSha256(content));
|
|
38
41
|
await params.cleanupWal();
|
|
39
42
|
}
|
|
40
43
|
catch (error) {
|
|
@@ -7,4 +7,3 @@ export declare function getAccountsBackupRecoveryCandidates(path: string, depth:
|
|
|
7
7
|
export declare function getAccountsWalPath(path: string): string;
|
|
8
8
|
export declare function getIntentionalResetMarkerPath(path: string): string;
|
|
9
9
|
export { ACCOUNTS_BACKUP_SUFFIX, ACCOUNTS_WAL_SUFFIX, RESET_MARKER_SUFFIX };
|
|
10
|
-
//# sourceMappingURL=backup-paths.d.ts.map
|
|
@@ -10,4 +10,3 @@ export declare function clearCredentialSidecars(): Promise<void>;
|
|
|
10
10
|
* keys never survive a reset; the first failure is rethrown afterwards.
|
|
11
11
|
*/
|
|
12
12
|
export declare function clearAccountsAndCredentialSidecars(clearPool: () => Promise<void>): Promise<void>;
|
|
13
|
-
//# sourceMappingURL=credential-sidecars.d.ts.map
|
|
@@ -7,4 +7,3 @@ export declare function formatStorageErrorHint(error: unknown, path: string): st
|
|
|
7
7
|
* Wrap an arbitrary storage failure in a StorageError with a derived hint.
|
|
8
8
|
*/
|
|
9
9
|
export declare function toStorageError(message: string, error: unknown, path: string): StorageError;
|
|
10
|
-
//# sourceMappingURL=error-hints.d.ts.map
|
|
@@ -9,6 +9,33 @@ const abandonedOwners = new Set();
|
|
|
9
9
|
const leases = new AsyncLocalStorage();
|
|
10
10
|
const host = createHash("sha256").update(hostname()).digest("hex").slice(0, 16);
|
|
11
11
|
const ownerPattern = /^([a-f0-9]{16})\.([1-9][0-9]*)\.([a-f0-9-]{36})$/;
|
|
12
|
+
// Contended acquisition retries once ran on a fixed 25ms delay: every waiter
|
|
13
|
+
// woke on the same cadence and re-collided on the rename (p99 ~1.8s under ~200
|
|
14
|
+
// waiters). The base delay now grows mildly from 15ms toward 40ms with up to
|
|
15
|
+
// 10ms of uniform jitter, so each retry lands in ~[15,50)ms and waiters
|
|
16
|
+
// decorrelate instead of stampeding the lock together.
|
|
17
|
+
const LOCK_RETRY_MIN_DELAY_MS = 15;
|
|
18
|
+
const LOCK_RETRY_MAX_BASE_DELAY_MS = 40;
|
|
19
|
+
const LOCK_RETRY_GROWTH_FACTOR = 1.2;
|
|
20
|
+
const LOCK_RETRY_JITTER_MS = 10;
|
|
21
|
+
function lockRetryBaseDelayMs(failedAttempt) {
|
|
22
|
+
return Math.min(LOCK_RETRY_MIN_DELAY_MS * LOCK_RETRY_GROWTH_FACTOR ** (failedAttempt - 1), LOCK_RETRY_MAX_BASE_DELAY_MS);
|
|
23
|
+
}
|
|
24
|
+
// Derive the attempt cap from the delay schedule itself, not a flat ~40ms
|
|
25
|
+
// guess: the first retries are cheaper than steady state (15ms, 18ms, …), so
|
|
26
|
+
// ceil(waitMs / expected) let a short budget expire after roughly half the
|
|
27
|
+
// requested wait — a 70ms budget could return ELOCKED in ~33ms. Summing the
|
|
28
|
+
// zero-jitter base delays keeps retrying until the schedule has slept at
|
|
29
|
+
// least waitMs; jitter only ever extends the wait, never shortens it.
|
|
30
|
+
function lockMaxAttemptsForWaitMs(waitMs) {
|
|
31
|
+
let attempts = 1;
|
|
32
|
+
let coveredMs = 0;
|
|
33
|
+
while (coveredMs < waitMs) {
|
|
34
|
+
coveredMs += lockRetryBaseDelayMs(attempts);
|
|
35
|
+
attempts += 1;
|
|
36
|
+
}
|
|
37
|
+
return attempts;
|
|
38
|
+
}
|
|
12
39
|
function code(error) {
|
|
13
40
|
return error?.code;
|
|
14
41
|
}
|
|
@@ -152,7 +179,12 @@ export async function withFileTransactionLock(path, action, options = {}) {
|
|
|
152
179
|
await recoverDeadOwner(lock);
|
|
153
180
|
throw Object.assign(Error("Storage is busy with another live writer; retry shortly."), { code: "ELOCKED" });
|
|
154
181
|
}
|
|
155
|
-
}, {
|
|
182
|
+
}, {
|
|
183
|
+
maxAttempts: lockMaxAttemptsForWaitMs(options.waitMs ?? 10000),
|
|
184
|
+
backoffMs: lockRetryBaseDelayMs,
|
|
185
|
+
jitterMs: LOCK_RETRY_JITTER_MS,
|
|
186
|
+
retryableCodes: ["ELOCKED", "EBUSY", "EPERM", "EACCES", "EAGAIN"],
|
|
187
|
+
});
|
|
156
188
|
const lease = { active: true };
|
|
157
189
|
const context = new Map(leases.getStore());
|
|
158
190
|
context.set(key, lease);
|
|
@@ -3,4 +3,3 @@ export { ACCOUNTS_BACKUP_SUFFIX, ACCOUNTS_WAL_SUFFIX, getAccountsBackupPath, get
|
|
|
3
3
|
export declare function getAccountsBackupRecoveryCandidates(path: string): string[];
|
|
4
4
|
export declare function getFlaggedAccountsPath(storagePath: string, fileName: string): string;
|
|
5
5
|
export declare function getLegacyFlaggedAccountsPath(storagePath: string, legacyFileName: string): string;
|
|
6
|
-
//# sourceMappingURL=file-paths.d.ts.map
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { AccountMetadataV3, AccountStorageV3 } from "./public-types.js";
|
|
2
2
|
export declare function looksLikeSyntheticFixtureAccount(account: AccountMetadataV3): boolean;
|
|
3
3
|
export declare function looksLikeSyntheticFixtureStorage(storage: AccountStorageV3 | null): boolean;
|
|
4
|
-
//# sourceMappingURL=fixture-guards.d.ts.map
|
|
@@ -19,4 +19,3 @@ export declare function loadFlaggedAccountsEntry(params: {
|
|
|
19
19
|
logError: (message: string, details: Record<string, unknown>) => void;
|
|
20
20
|
logInfo: (message: string, details: Record<string, unknown>) => void;
|
|
21
21
|
}): Promise<FlaggedAccountStorageV1>;
|
|
22
|
-
//# sourceMappingURL=flagged-load-entry.d.ts.map
|
|
@@ -8,4 +8,3 @@ export declare function loadFlaggedAccountsFromFile(path: string, deps: {
|
|
|
8
8
|
normalizeFlaggedStorage: (data: unknown) => FlaggedAccountStorageV1;
|
|
9
9
|
sleep?: (ms: number) => Promise<void>;
|
|
10
10
|
}): Promise<FlaggedAccountStorageV1>;
|
|
11
|
-
//# sourceMappingURL=flagged-storage-file.d.ts.map
|