codex-multi-auth 2.3.0-beta.0 → 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/.codex-plugin/plugin.json +1 -1
- package/README.md +4 -3
- 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 +95 -0
- package/dist/lib/codex-manager/account-pool-write.d.ts.map +1 -0
- package/dist/lib/codex-manager/account-pool-write.js +165 -0
- package/dist/lib/codex-manager/account-pool-write.js.map +1 -0
- 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.d.ts +33 -0
- package/dist/lib/codex-manager/manual-callback.d.ts.map +1 -0
- package/dist/lib/codex-manager/manual-callback.js +30 -0
- package/dist/lib/codex-manager/manual-callback.js.map +1 -0
- 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 -2578
- package/dist/lib/codex-manager.js.map +1 -1
- 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/copy.d.ts +2 -0
- package/dist/lib/ui/copy.d.ts.map +1 -1
- package/dist/lib/ui/copy.js +2 -0
- package/dist/lib/ui/copy.js.map +1 -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,54 @@
|
|
|
1
|
+
import { AccountManager } from "../accounts.js";
|
|
2
|
+
import type { RuntimeRotationProxyStatus } from "./rotation-server-types.js";
|
|
3
|
+
import type { SessionAffinityStore } from "../session-affinity.js";
|
|
4
|
+
/**
|
|
5
|
+
* Per-instance configuration resolved once in `startRuntimeRotationProxy`,
|
|
6
|
+
* captured as explicit fields instead of closure variables so the request
|
|
7
|
+
* handler and the stale-reload recovery can be plain functions.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export interface RotationProxyStateInit {
|
|
12
|
+
activeAccountManager: AccountManager;
|
|
13
|
+
routingMutexMode: "enabled" | "legacy";
|
|
14
|
+
schedulingStrategy: "hybrid" | "sequential";
|
|
15
|
+
fetchImpl: typeof fetch;
|
|
16
|
+
upstreamBaseUrl: string;
|
|
17
|
+
clientApiKey: string;
|
|
18
|
+
now: () => number;
|
|
19
|
+
tokenRefreshSkewMs: number;
|
|
20
|
+
networkErrorCooldownMs: number;
|
|
21
|
+
serverErrorCooldownMs: number;
|
|
22
|
+
tokenInvalidationCooldownMs: number;
|
|
23
|
+
minRotationIntervalMs: number;
|
|
24
|
+
pidOffsetEnabled: boolean;
|
|
25
|
+
fetchTimeoutMs: number;
|
|
26
|
+
streamStallTimeoutMs: number;
|
|
27
|
+
maxRuntimeAccountAttempts: number;
|
|
28
|
+
maxRequestBodyBytes: number;
|
|
29
|
+
quotaRemainingPercentThreshold: number;
|
|
30
|
+
sessionAffinityStore: SessionAffinityStore | null;
|
|
31
|
+
lastObservedAffinityGeneration: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Mutable rotation-loop state shared by every request of one proxy instance.
|
|
35
|
+
* `activeAccountManager` and `lastObservedAffinityGeneration` are reassigned
|
|
36
|
+
* at runtime (stale-state recovery and affinity-generation tracking), so the
|
|
37
|
+
* whole container is passed by reference and never copied.
|
|
38
|
+
*
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export interface RotationProxyState extends RotationProxyStateInit {
|
|
42
|
+
readonly knownAccountManagers: Set<AccountManager>;
|
|
43
|
+
readonly status: RuntimeRotationProxyStatus;
|
|
44
|
+
readonly threadGoalFallbacks: Map<string, string | null>;
|
|
45
|
+
lastGlobalAccountIndex: number | null;
|
|
46
|
+
lastGlobalSwitchAt: number;
|
|
47
|
+
staleRuntimeReloadPromise: Promise<AccountManager | null> | null;
|
|
48
|
+
lastStaleRuntimeReloadAt: number;
|
|
49
|
+
}
|
|
50
|
+
/** @internal */
|
|
51
|
+
export declare function createRotationProxyState(init: RotationProxyStateInit): RotationProxyState;
|
|
52
|
+
/** @internal */
|
|
53
|
+
export declare function recoverStaleRuntimeState(state: RotationProxyState): Promise<AccountManager | null>;
|
|
54
|
+
//# sourceMappingURL=rotation-proxy-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotation-proxy-state.d.ts","sourceRoot":"","sources":["../../../lib/runtime/rotation-proxy-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACtC,oBAAoB,EAAE,cAAc,CAAC;IACrC,gBAAgB,EAAE,SAAS,GAAG,QAAQ,CAAC;IACvC,kBAAkB,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC5C,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2BAA2B,EAAE,MAAM,CAAC;IACpC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yBAAyB,EAAE,MAAM,CAAC;IAClC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8BAA8B,EAAE,MAAM,CAAC;IACvC,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClD,8BAA8B,EAAE,MAAM,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IACjE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,yBAAyB,EAAE,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACjE,wBAAwB,EAAE,MAAM,CAAC;CACjC;AAID,gBAAgB;AAChB,wBAAgB,wBAAwB,CACvC,IAAI,EAAE,sBAAsB,GAC1B,kBAAkB,CAuBpB;AAED,gBAAgB;AAChB,wBAAsB,wBAAwB,CAC7C,KAAK,EAAE,kBAAkB,GACvB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA0BhC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { AccountManager } from "../accounts.js";
|
|
2
|
+
import { recordRuntimeReload, recordRuntimeReset, } from "./runtime-observability.js";
|
|
3
|
+
const STALE_RUNTIME_RELOAD_DEDUPE_MS = 1_000;
|
|
4
|
+
/** @internal */
|
|
5
|
+
export function createRotationProxyState(init) {
|
|
6
|
+
return {
|
|
7
|
+
...init,
|
|
8
|
+
knownAccountManagers: new Set([init.activeAccountManager]),
|
|
9
|
+
status: {
|
|
10
|
+
startedAt: init.now(),
|
|
11
|
+
totalRequests: 0,
|
|
12
|
+
upstreamRequests: 0,
|
|
13
|
+
retries: 0,
|
|
14
|
+
rotations: 0,
|
|
15
|
+
streamsStarted: 0,
|
|
16
|
+
lastError: null,
|
|
17
|
+
lastAccountIndex: null,
|
|
18
|
+
lastAccountLabel: null,
|
|
19
|
+
lastAccountId: null,
|
|
20
|
+
lastAccountUpdatedAt: null,
|
|
21
|
+
},
|
|
22
|
+
threadGoalFallbacks: new Map(),
|
|
23
|
+
lastGlobalAccountIndex: null,
|
|
24
|
+
lastGlobalSwitchAt: 0,
|
|
25
|
+
staleRuntimeReloadPromise: null,
|
|
26
|
+
lastStaleRuntimeReloadAt: 0,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** @internal */
|
|
30
|
+
export async function recoverStaleRuntimeState(state) {
|
|
31
|
+
if (Date.now() - state.lastStaleRuntimeReloadAt <= STALE_RUNTIME_RELOAD_DEDUPE_MS) {
|
|
32
|
+
return state.activeAccountManager;
|
|
33
|
+
}
|
|
34
|
+
if (state.staleRuntimeReloadPromise) {
|
|
35
|
+
return state.staleRuntimeReloadPromise;
|
|
36
|
+
}
|
|
37
|
+
state.staleRuntimeReloadPromise = (async () => {
|
|
38
|
+
AccountManager.resetVolatileRuntimeState();
|
|
39
|
+
recordRuntimeReset("pool-exhausted-no-account");
|
|
40
|
+
const reloaded = await AccountManager.loadFromDisk();
|
|
41
|
+
reloaded.setRoutingMutexMode(state.routingMutexMode);
|
|
42
|
+
state.activeAccountManager = reloaded;
|
|
43
|
+
state.knownAccountManagers.add(reloaded);
|
|
44
|
+
state.lastStaleRuntimeReloadAt = Date.now();
|
|
45
|
+
recordRuntimeReload("pool-exhausted-no-account");
|
|
46
|
+
return reloaded;
|
|
47
|
+
})()
|
|
48
|
+
.catch((error) => {
|
|
49
|
+
state.status.lastError = error instanceof Error ? error.message : String(error);
|
|
50
|
+
return null;
|
|
51
|
+
})
|
|
52
|
+
.finally(() => {
|
|
53
|
+
state.staleRuntimeReloadPromise = null;
|
|
54
|
+
});
|
|
55
|
+
return state.staleRuntimeReloadPromise;
|
|
56
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { AccountManager } from "../accounts.js";
|
|
2
|
+
import type { ModelFamily } from "../prompts/codex.js";
|
|
3
|
+
export interface RuntimeRotationProxyServer {
|
|
4
|
+
host: string;
|
|
5
|
+
port: number;
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
close: () => Promise<void>;
|
|
8
|
+
getStatus: () => RuntimeRotationProxyStatus;
|
|
9
|
+
}
|
|
10
|
+
export interface RuntimeRotationProxyStatus {
|
|
11
|
+
startedAt: number;
|
|
12
|
+
totalRequests: number;
|
|
13
|
+
upstreamRequests: number;
|
|
14
|
+
retries: number;
|
|
15
|
+
rotations: number;
|
|
16
|
+
streamsStarted: number;
|
|
17
|
+
lastError: string | null;
|
|
18
|
+
lastAccountIndex: number | null;
|
|
19
|
+
lastAccountLabel: string | null;
|
|
20
|
+
lastAccountId: string | null;
|
|
21
|
+
lastAccountUpdatedAt: number | null;
|
|
22
|
+
}
|
|
23
|
+
export interface RuntimeRotationProxyOptions {
|
|
24
|
+
host?: string;
|
|
25
|
+
port?: number;
|
|
26
|
+
upstreamBaseUrl?: string;
|
|
27
|
+
clientApiKey: string;
|
|
28
|
+
accountManager?: AccountManager;
|
|
29
|
+
fetchImpl?: typeof fetch;
|
|
30
|
+
now?: () => number;
|
|
31
|
+
quotaRemainingPercentThreshold?: number;
|
|
32
|
+
maxRequestBodyBytes?: number;
|
|
33
|
+
fetchTimeoutMs?: number;
|
|
34
|
+
streamStallTimeoutMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface RequestContext {
|
|
37
|
+
body: Buffer;
|
|
38
|
+
headers: Headers;
|
|
39
|
+
method: "GET" | "POST";
|
|
40
|
+
upstreamPath: string;
|
|
41
|
+
model: string | null;
|
|
42
|
+
family: ModelFamily;
|
|
43
|
+
stream: boolean;
|
|
44
|
+
sessionKey: string | null;
|
|
45
|
+
}
|
|
46
|
+
export type ExhaustionReason = "rate-limit" | "server-error" | "network-error" | "auth-failure" | "budget" | "deactivated" | "no-account";
|
|
47
|
+
export type RuntimeProxyHttpError = Error & {
|
|
48
|
+
statusCode: number;
|
|
49
|
+
code: string;
|
|
50
|
+
};
|
|
51
|
+
export interface RuntimeRotationAccountIdentity {
|
|
52
|
+
index: number;
|
|
53
|
+
label: string;
|
|
54
|
+
accountId: string | null;
|
|
55
|
+
updatedAt: number;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=rotation-server-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotation-server-types.d.ts","sourceRoot":"","sources":["../../../lib/runtime/rotation-server-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,0BAA0B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,MAAM,0BAA0B,CAAC;CAC5C;AAED,MAAM,WAAW,0BAA0B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,GACzB,YAAY,GACZ,cAAc,GACd,eAAe,GACf,cAAc,GACd,QAAQ,GACR,aAAa,GACb,YAAY,CAAC;AAChB,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,WAAW,8BAA8B;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { SessionAffinityStore } from "../session-affinity.js";
|
|
2
|
+
export interface StorageMeta {
|
|
3
|
+
pinnedAccountIndex: number | null;
|
|
4
|
+
affinityGeneration: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Cheap, hot-path-safe single read with mtime-cache short-circuit. When the
|
|
8
|
+
* file's `mtimeMs` and `size` match the cached snapshot for this path we
|
|
9
|
+
* return the cached value WITHOUT reading or hashing the file. Only when
|
|
10
|
+
* mtime/size differ (or were never cached) do we `readFileSync` + sha1 and,
|
|
11
|
+
* if the content hash still matches, skip the `JSON.parse`. Transient
|
|
12
|
+
* failures (EBUSY/EPERM/EACCES/EAGAIN, partial-write SyntaxError) fall through
|
|
13
|
+
* to the last cached value for this path; defaults are only returned when the
|
|
14
|
+
* file has never been successfully read.
|
|
15
|
+
*
|
|
16
|
+
* Replaces an earlier retry loop with a sub-15ms busy-wait that blocked the
|
|
17
|
+
* event loop on every transient failure. The proxy is on the request hot
|
|
18
|
+
* path; serving a slightly stale (but consistent) value is strictly better
|
|
19
|
+
* than blocking. See #474.
|
|
20
|
+
*/
|
|
21
|
+
export declare function readStorageMetaFromDisk(storagePath?: string): StorageMeta;
|
|
22
|
+
/**
|
|
23
|
+
* Backwards-compatible helper retained for tests. Prefer `readStorageMetaFromDisk`
|
|
24
|
+
* for new callers that also need `affinityGeneration`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function readPinnedAccountIndexFromDisk(storagePath?: string): number | null;
|
|
27
|
+
/**
|
|
28
|
+
* Test-only: reset the storage-meta content-hash cache between scenarios so
|
|
29
|
+
* each test starts from a clean read-from-disk state.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resetPinCacheForTesting(): void;
|
|
32
|
+
/**
|
|
33
|
+
* If the on-disk `affinityGeneration` is greater than `lastObservedGeneration`,
|
|
34
|
+
* drop every entry in `sessionAffinityStore` and return the new generation so
|
|
35
|
+
* the caller can update its tracker. Otherwise returns `lastObservedGeneration`
|
|
36
|
+
* unchanged. Extracted so the request-flow logic can be unit-tested without
|
|
37
|
+
* spinning up the full proxy. See issue #474.
|
|
38
|
+
*/
|
|
39
|
+
export declare function maybeInvalidateAffinityFromDisk(sessionAffinityStore: SessionAffinityStore | null, lastObservedGeneration: number, storagePath?: string): number;
|
|
40
|
+
//# sourceMappingURL=rotation-storage-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotation-storage-meta.d.ts","sourceRoot":"","sources":["../../../lib/runtime/rotation-storage-meta.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAqCnE,MAAM,WAAW,WAAW;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,EAAE,MAAM,CAAC;CAC3B;AA8BD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CACtC,WAAW,GAAE,MAAyB,GACpC,WAAW,CA6Eb;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,WAAW,GAAE,MAAyB,GACpC,MAAM,GAAG,IAAI,CAEf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC9C,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,EACjD,sBAAsB,EAAE,MAAM,EAC9B,WAAW,GAAE,MAAyB,GACpC,MAAM,CAOR"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
3
|
+
import { getStoragePath } from "../storage.js";
|
|
4
|
+
// Keyed by absolute storage path so multiple proxy instances and concurrent
|
|
5
|
+
// vitest workers (each pointing at their own temp storage file) cannot
|
|
6
|
+
// corrupt each other's snapshots. See issue #474.
|
|
7
|
+
const STORAGE_META_CACHE = new Map();
|
|
8
|
+
// The mtime+size short-circuit (L3) may only be trusted once the cached
|
|
9
|
+
// mtime is far enough in the past that no *subsequent* write could share the
|
|
10
|
+
// same coarse mtime tick. Filesystems report mtime at wildly different
|
|
11
|
+
// granularities (ext4 ns, FAT 2s, some network/Windows volumes ~1s, and CI
|
|
12
|
+
// containers occasionally coarser), and our writers use atomic rename, so two
|
|
13
|
+
// rapid CLI bumps can land on an identical mtimeMs. Within this settle window
|
|
14
|
+
// we therefore ignore mtime equality and fall back to the read + sha1 path
|
|
15
|
+
// (the real source of truth). Outside it, the file has been quiescent long
|
|
16
|
+
// enough that mtime equality provably means "unchanged", so we skip the read.
|
|
17
|
+
// 2s comfortably exceeds the coarsest mtime granularity we expect in practice.
|
|
18
|
+
const MTIME_SHORTCIRCUIT_SETTLE_MS = 2_000;
|
|
19
|
+
function hashStorageBytes(bytes) {
|
|
20
|
+
return createHash("sha1").update(bytes).digest("hex");
|
|
21
|
+
}
|
|
22
|
+
function metaFromSnapshot(snapshot) {
|
|
23
|
+
return {
|
|
24
|
+
pinnedAccountIndex: snapshot.pinnedAccountIndex,
|
|
25
|
+
affinityGeneration: snapshot.affinityGeneration,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Cheap, hot-path-safe single read with mtime-cache short-circuit. When the
|
|
30
|
+
* file's `mtimeMs` and `size` match the cached snapshot for this path we
|
|
31
|
+
* return the cached value WITHOUT reading or hashing the file. Only when
|
|
32
|
+
* mtime/size differ (or were never cached) do we `readFileSync` + sha1 and,
|
|
33
|
+
* if the content hash still matches, skip the `JSON.parse`. Transient
|
|
34
|
+
* failures (EBUSY/EPERM/EACCES/EAGAIN, partial-write SyntaxError) fall through
|
|
35
|
+
* to the last cached value for this path; defaults are only returned when the
|
|
36
|
+
* file has never been successfully read.
|
|
37
|
+
*
|
|
38
|
+
* Replaces an earlier retry loop with a sub-15ms busy-wait that blocked the
|
|
39
|
+
* event loop on every transient failure. The proxy is on the request hot
|
|
40
|
+
* path; serving a slightly stale (but consistent) value is strictly better
|
|
41
|
+
* than blocking. See #474.
|
|
42
|
+
*/
|
|
43
|
+
export function readStorageMetaFromDisk(storagePath = getStoragePath()) {
|
|
44
|
+
if (!existsSync(storagePath)) {
|
|
45
|
+
STORAGE_META_CACHE.delete(storagePath);
|
|
46
|
+
return { pinnedAccountIndex: null, affinityGeneration: 0 };
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
// mtime+size short-circuit (L3): when neither has changed since the last
|
|
50
|
+
// successful read AND the cached mtime has settled (see
|
|
51
|
+
// MTIME_SHORTCIRCUIT_SETTLE_MS) we return the cached snapshot without
|
|
52
|
+
// reading or hashing the file. During the settle window we deliberately
|
|
53
|
+
// fall through to the read + sha1 path below, which stays the source of
|
|
54
|
+
// truth and protects against the coarse-mtime collision described on
|
|
55
|
+
// StorageMetaSnapshot. So this is a pure fast path for the common
|
|
56
|
+
// "file quiescent, proxy polling every request" case.
|
|
57
|
+
const stats = statSync(storagePath);
|
|
58
|
+
const cachedByStat = STORAGE_META_CACHE.get(storagePath);
|
|
59
|
+
if (cachedByStat &&
|
|
60
|
+
cachedByStat.mtimeMs === stats.mtimeMs &&
|
|
61
|
+
cachedByStat.size === stats.size &&
|
|
62
|
+
Date.now() - stats.mtimeMs > MTIME_SHORTCIRCUIT_SETTLE_MS) {
|
|
63
|
+
return metaFromSnapshot(cachedByStat);
|
|
64
|
+
}
|
|
65
|
+
const bytes = readFileSync(storagePath);
|
|
66
|
+
const contentHash = hashStorageBytes(bytes);
|
|
67
|
+
const cached = STORAGE_META_CACHE.get(storagePath);
|
|
68
|
+
if (cached && cached.contentHash === contentHash) {
|
|
69
|
+
// Content is byte-identical despite the mtime/size change (e.g. an
|
|
70
|
+
// atomic-rename rewrite of the same bytes). Refresh the stat fields so
|
|
71
|
+
// the next request takes the fast path, but skip the JSON.parse.
|
|
72
|
+
const refreshed = {
|
|
73
|
+
...cached,
|
|
74
|
+
mtimeMs: stats.mtimeMs,
|
|
75
|
+
size: stats.size,
|
|
76
|
+
};
|
|
77
|
+
STORAGE_META_CACHE.set(storagePath, refreshed);
|
|
78
|
+
return metaFromSnapshot(refreshed);
|
|
79
|
+
}
|
|
80
|
+
const parsed = JSON.parse(bytes.toString("utf8"));
|
|
81
|
+
const pinnedAccountIndex = typeof parsed.pinnedAccountIndex === "number" &&
|
|
82
|
+
Number.isFinite(parsed.pinnedAccountIndex)
|
|
83
|
+
? Math.trunc(parsed.pinnedAccountIndex)
|
|
84
|
+
: null;
|
|
85
|
+
const affinityGeneration = typeof parsed.affinityGeneration === "number" &&
|
|
86
|
+
Number.isFinite(parsed.affinityGeneration) &&
|
|
87
|
+
Number.isInteger(parsed.affinityGeneration) &&
|
|
88
|
+
parsed.affinityGeneration >= 0
|
|
89
|
+
? parsed.affinityGeneration
|
|
90
|
+
: 0;
|
|
91
|
+
const snapshot = {
|
|
92
|
+
mtimeMs: stats.mtimeMs,
|
|
93
|
+
size: stats.size,
|
|
94
|
+
contentHash,
|
|
95
|
+
pinnedAccountIndex,
|
|
96
|
+
affinityGeneration,
|
|
97
|
+
};
|
|
98
|
+
STORAGE_META_CACHE.set(storagePath, snapshot);
|
|
99
|
+
return { pinnedAccountIndex, affinityGeneration };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// On any failure, prefer the last good snapshot for this path so we
|
|
103
|
+
// don't blow away affinity unnecessarily. Defensive: even non-transient
|
|
104
|
+
// errors fall back to the cache when one exists — better stale than
|
|
105
|
+
// wrong. Defaults are only returned when this file has never been read
|
|
106
|
+
// successfully (cache miss).
|
|
107
|
+
void error;
|
|
108
|
+
const cached = STORAGE_META_CACHE.get(storagePath);
|
|
109
|
+
if (cached) {
|
|
110
|
+
return metaFromSnapshot(cached);
|
|
111
|
+
}
|
|
112
|
+
return { pinnedAccountIndex: null, affinityGeneration: 0 };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Backwards-compatible helper retained for tests. Prefer `readStorageMetaFromDisk`
|
|
117
|
+
* for new callers that also need `affinityGeneration`.
|
|
118
|
+
*/
|
|
119
|
+
export function readPinnedAccountIndexFromDisk(storagePath = getStoragePath()) {
|
|
120
|
+
return readStorageMetaFromDisk(storagePath).pinnedAccountIndex;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Test-only: reset the storage-meta content-hash cache between scenarios so
|
|
124
|
+
* each test starts from a clean read-from-disk state.
|
|
125
|
+
*/
|
|
126
|
+
export function resetPinCacheForTesting() {
|
|
127
|
+
STORAGE_META_CACHE.clear();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* If the on-disk `affinityGeneration` is greater than `lastObservedGeneration`,
|
|
131
|
+
* drop every entry in `sessionAffinityStore` and return the new generation so
|
|
132
|
+
* the caller can update its tracker. Otherwise returns `lastObservedGeneration`
|
|
133
|
+
* unchanged. Extracted so the request-flow logic can be unit-tested without
|
|
134
|
+
* spinning up the full proxy. See issue #474.
|
|
135
|
+
*/
|
|
136
|
+
export function maybeInvalidateAffinityFromDisk(sessionAffinityStore, lastObservedGeneration, storagePath = getStoragePath()) {
|
|
137
|
+
const meta = readStorageMetaFromDisk(storagePath);
|
|
138
|
+
if (meta.affinityGeneration > lastObservedGeneration) {
|
|
139
|
+
sessionAffinityStore?.clearAll();
|
|
140
|
+
return meta.affinityGeneration;
|
|
141
|
+
}
|
|
142
|
+
return lastObservedGeneration;
|
|
143
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AccountManager, ManagedAccount } from "../accounts.js";
|
|
2
|
+
import type { ModelFamily } from "../prompts/codex.js";
|
|
3
|
+
/** @internal */
|
|
4
|
+
export declare const DEFAULT_AUTH_FAILURE_COOLDOWN_MS = 30000;
|
|
5
|
+
/** @internal */
|
|
6
|
+
export declare function applyMonotonicAuthCooldown(accountManager: AccountManager, account: ManagedAccount, cooldownMs: number): void;
|
|
7
|
+
/** @internal */
|
|
8
|
+
export declare function ensureFreshAccessToken(params: {
|
|
9
|
+
accountManager: AccountManager;
|
|
10
|
+
account: ManagedAccount;
|
|
11
|
+
family: ModelFamily;
|
|
12
|
+
model: string | null;
|
|
13
|
+
now: number;
|
|
14
|
+
tokenRefreshSkewMs: number;
|
|
15
|
+
tokenInvalidationCooldownMs: number;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
ok: true;
|
|
18
|
+
accessToken: string;
|
|
19
|
+
account: ManagedAccount;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
retryable: boolean;
|
|
23
|
+
invalidated?: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=rotation-token-refresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotation-token-refresh.d.ts","sourceRoot":"","sources":["../../../lib/runtime/rotation-token-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQvD,gBAAgB;AAChB,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAMvD,gBAAgB;AAChB,wBAAgB,0BAA0B,CACzC,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,GAChB,IAAI,CAUN;AA6CD,gBAAgB;AAChB,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACpD,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,MAAM,CAAC;CACpC,GAAG,OAAO,CACR;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAC1D,CAgEA"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { queuedRefresh } from "../refresh-queue.js";
|
|
2
|
+
import { isTokenInvalidationError, isTokenRefreshRetryable, } from "../request/rate-limit-decision.js";
|
|
3
|
+
/** @internal */
|
|
4
|
+
export const DEFAULT_AUTH_FAILURE_COOLDOWN_MS = 30_000;
|
|
5
|
+
// Monotonic auth-failure cooldown: only extend, never shorten. Two concurrent
|
|
6
|
+
// requests on the same account can race so that an invalidation path sets a
|
|
7
|
+
// long cooldown (5 min) and a subsequent generic 401 truncates it (30 s).
|
|
8
|
+
// Reading the live coolingDownUntil before writing prevents that race.
|
|
9
|
+
/** @internal */
|
|
10
|
+
export function applyMonotonicAuthCooldown(accountManager, account, cooldownMs) {
|
|
11
|
+
const existing = accountManager.getAccountByIndex(account.index)?.coolingDownUntil ?? 0;
|
|
12
|
+
// Intentionally Date.now(), not the proxy's injected now(): coolingDownUntil is
|
|
13
|
+
// written by markAccountCoolingDown via nowMs() (== Date.now()), so both sides of
|
|
14
|
+
// this comparison must live in the same real-wall-clock domain. Switching to the
|
|
15
|
+
// injected now() would mis-compare an injected-clock value against a real-clock
|
|
16
|
+
// deadline and silently defeat the monotonic guard.
|
|
17
|
+
if (Date.now() + cooldownMs > existing) {
|
|
18
|
+
accountManager.markAccountCoolingDown(account, cooldownMs, "auth-failure");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function hasUsableAccessToken(account, now, skewMs) {
|
|
22
|
+
return (typeof account.access === "string" &&
|
|
23
|
+
account.access.trim().length > 0 &&
|
|
24
|
+
typeof account.expires === "number" &&
|
|
25
|
+
account.expires > now + Math.max(0, skewMs));
|
|
26
|
+
}
|
|
27
|
+
const runtimeRefreshCommitQueues = new WeakMap();
|
|
28
|
+
async function commitRefreshedAuthOnce(accountManager, account, auth) {
|
|
29
|
+
const key = [
|
|
30
|
+
account.index,
|
|
31
|
+
account.accountId ?? "",
|
|
32
|
+
account.email ?? "",
|
|
33
|
+
account.refreshToken,
|
|
34
|
+
].join("\0");
|
|
35
|
+
let queue = runtimeRefreshCommitQueues.get(accountManager);
|
|
36
|
+
if (!queue) {
|
|
37
|
+
queue = new Map();
|
|
38
|
+
runtimeRefreshCommitQueues.set(accountManager, queue);
|
|
39
|
+
}
|
|
40
|
+
const existing = queue.get(key);
|
|
41
|
+
if (existing)
|
|
42
|
+
return existing;
|
|
43
|
+
const pending = accountManager
|
|
44
|
+
.commitRefreshedAuth(account, auth)
|
|
45
|
+
.finally(() => queue?.delete(key));
|
|
46
|
+
queue.set(key, pending);
|
|
47
|
+
return pending;
|
|
48
|
+
}
|
|
49
|
+
/** @internal */
|
|
50
|
+
export async function ensureFreshAccessToken(params) {
|
|
51
|
+
const { accountManager, account, family, model, now, tokenRefreshSkewMs, tokenInvalidationCooldownMs } = params;
|
|
52
|
+
if (hasUsableAccessToken(account, now, tokenRefreshSkewMs)) {
|
|
53
|
+
return { ok: true, accessToken: account.access ?? "", account };
|
|
54
|
+
}
|
|
55
|
+
const refreshResult = await queuedRefresh(account.refreshToken);
|
|
56
|
+
if (refreshResult.type === "failed") {
|
|
57
|
+
accountManager.recordFailure(account, family, model);
|
|
58
|
+
accountManager.incrementAuthFailures(account);
|
|
59
|
+
// If the refresh endpoint itself returns an explicit invalidation message
|
|
60
|
+
// (e.g. Microsoft/Outlook SSO revokes the refresh token server-side), apply
|
|
61
|
+
// the long cooldown and signal to the caller to stop rotating rather than
|
|
62
|
+
// presenting other accounts' tokens from the same IP.
|
|
63
|
+
const invalidated = isTokenInvalidationError(refreshResult.message ?? "");
|
|
64
|
+
applyMonotonicAuthCooldown(accountManager, account, invalidated ? tokenInvalidationCooldownMs : DEFAULT_AUTH_FAILURE_COOLDOWN_MS);
|
|
65
|
+
accountManager.saveToDiskDebounced();
|
|
66
|
+
return { ok: false, retryable: isTokenRefreshRetryable(refreshResult), invalidated };
|
|
67
|
+
}
|
|
68
|
+
const auth = {
|
|
69
|
+
type: "oauth",
|
|
70
|
+
access: refreshResult.access,
|
|
71
|
+
refresh: refreshResult.refresh,
|
|
72
|
+
expires: refreshResult.expires,
|
|
73
|
+
};
|
|
74
|
+
try {
|
|
75
|
+
const updatedAccount = await commitRefreshedAuthOnce(accountManager, account, auth);
|
|
76
|
+
// If commit succeeded, use the stored access token from the committed
|
|
77
|
+
// account — this also handles the dedup case where two concurrent callers
|
|
78
|
+
// share one commit and both end up with the same committed token.
|
|
79
|
+
// If commit returned null (account missing from storage after persist),
|
|
80
|
+
// fall back to the original account object but always use refreshResult.access:
|
|
81
|
+
// the original account may carry an expired token, and using that would
|
|
82
|
+
// cause a downstream 401 and incorrectly trigger invalidation-cooldown logic.
|
|
83
|
+
const resolvedAccount = updatedAccount ?? account;
|
|
84
|
+
const accessToken = updatedAccount !== null
|
|
85
|
+
? (updatedAccount.access ?? refreshResult.access)
|
|
86
|
+
: refreshResult.access;
|
|
87
|
+
return {
|
|
88
|
+
ok: true,
|
|
89
|
+
accessToken,
|
|
90
|
+
account: resolvedAccount,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
accountManager.recordFailure(account, family, model);
|
|
95
|
+
accountManager.markAccountCoolingDown(account, DEFAULT_AUTH_FAILURE_COOLDOWN_MS, "auth-failure");
|
|
96
|
+
accountManager.saveToDiskDebounced();
|
|
97
|
+
return { ok: false, retryable: true };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-current-account.d.ts","sourceRoot":"","sources":["../../../lib/runtime/runtime-current-account.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-current-account.d.ts","sourceRoot":"","sources":["../../../lib/runtime/runtime-current-account.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,MAAM,MAAM,2BAA2B,GACpC,uBAAuB,GACvB,UAAU,GACV,YAAY,CAAC;AAEhB,MAAM,MAAM,0BAA0B,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,2BAA2B,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,8BAA8B;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,2BAA2B,CAAC;IACpC,SAAS,EAAE,0BAA0B,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC5C,eAAe,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAC;IACtD,aAAa,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC9C;AAED,eAAO,MAAM,kCAAkC,QAAsB,CAAC;AAItE,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AA8DD,wBAAgB,0BAA0B,IAAI,6BAA6B,GAAG,IAAI,CA0BjF;AAED,wBAAgB,8BAA8B,CAC7C,MAAM,EAAE,6BAA6B,GAAG,IAAI,GAC1C,oBAAoB,GAAG,IAAI,CAc7B;AAED,wBAAgB,iCAAiC,IAAI,oBAAoB,GAAG,IAAI,CAE/E;AA+FD,wBAAgB,4BAA4B,CAC3C,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,4BAA4B,EACrC,OAAO,GAAE,4BAAiC,GACxC,8BAA8B,GAAG,IAAI,CAgDvC;AAED,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,8BAA8B,GAAG,IAAI,GACnD,oBAAoB,EAAE,CAWxB;AAED,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,8BAA8B,GAAG,IAAI,GACnD,OAAO,CAET"}
|
|
@@ -3,6 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { APP_RUNTIME_HELPER_STATUS_FILE } from "../runtime-constants.js";
|
|
5
5
|
import { getCodexMultiAuthDir } from "../runtime-paths.js";
|
|
6
|
+
import { isRecord } from "../utils.js";
|
|
6
7
|
export const RUNTIME_CURRENT_ACCOUNT_MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
7
8
|
const APP_RUNTIME_HELPER_KIND = "codex-app-runtime-rotation-helper";
|
|
8
9
|
const MAX_STATUS_FILE_BYTES = 1024 * 1024; // 1 MB sanity cap
|
|
@@ -35,9 +36,6 @@ function normalizeTimestamp(signal) {
|
|
|
35
36
|
].filter((timestamp) => timestamp !== null);
|
|
36
37
|
return timestamps.length > 0 ? Math.max(...timestamps) : null;
|
|
37
38
|
}
|
|
38
|
-
function isRecord(value) {
|
|
39
|
-
return typeof value === "object" && value !== null;
|
|
40
|
-
}
|
|
41
39
|
function readOptionalNumber(record, key) {
|
|
42
40
|
const value = record[key];
|
|
43
41
|
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
@@ -258,4 +256,3 @@ export function resolveAccountCurrentMarkers(index, storedCurrentIndex, runtimeC
|
|
|
258
256
|
export function isDisplayCurrentAccount(index, storedCurrentIndex, runtimeCurrent) {
|
|
259
257
|
return runtimeCurrent ? index === runtimeCurrent.index : index === storedCurrentIndex;
|
|
260
258
|
}
|
|
261
|
-
//# sourceMappingURL=runtime-current-account.js.map
|