@bitkyc08/opencodex 2.86.0 → 2.88.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/gui/dist/assets/App-CHC89EXQ.js +58 -0
- package/gui/dist/assets/App-wT3mXqFz.css +1 -0
- package/gui/dist/assets/{Tray-DyR9yBee.js → Tray-B5bC7AWL.js} +1 -1
- package/gui/dist/assets/index-B5bsvxor.js +94 -0
- package/gui/dist/assets/index-DPeB9HpV.css +1 -0
- package/gui/dist/assets/quota-summary-D8y2wTsB.js +1 -0
- package/gui/dist/index.html +2 -2
- package/package.json +1 -1
- package/src/adapters/anthropic/beta-allowlist.ts +9 -8
- package/src/adapters/anthropic/beta-body-pairs.ts +93 -0
- package/src/adapters/anthropic/passthrough.ts +7 -23
- package/src/adapters/anthropic-progress.ts +84 -0
- package/src/adapters/anthropic-rejection-memo.ts +71 -0
- package/src/adapters/anthropic-replay.ts +135 -0
- package/src/adapters/anthropic-tool-catalog.ts +11 -0
- package/src/adapters/anthropic.ts +151 -33
- package/src/adapters/base.ts +2 -0
- package/src/adapters/claude-cli/adapter.ts +111 -23
- package/src/adapters/claude-cli/profiles.ts +2 -1
- package/src/adapters/claude-cli/stable-replay.ts +108 -0
- package/src/adapters/claude-cli/usage-admission.ts +230 -0
- package/src/adapters/coding-agent/protocol.ts +1 -1
- package/src/adapters/coding-agent/turn.ts +18 -2
- package/src/adapters/dsh-account.ts +97 -0
- package/src/adapters/google-progress-history.ts +53 -0
- package/src/adapters/google.ts +52 -9
- package/src/adapters/openai-chat/messages.ts +4 -3
- package/src/adapters/openai-chat/passthrough.ts +8 -2
- package/src/adapters/openai-chat/reasoning-replay.ts +52 -0
- package/src/adapters/openai-responses/compaction-search-history.ts +14 -7
- package/src/adapters/openai-responses/passthrough.ts +57 -125
- package/src/adapters/openai-responses/request-strips.ts +25 -3
- package/src/adapters/openai-responses/transport.ts +81 -0
- package/src/adapters/qoder/adapter.ts +4 -2
- package/src/adapters/registry.ts +5 -0
- package/src/adapters/zed.ts +26 -1
- package/src/advisor/activity.ts +55 -0
- package/src/advisor/budget.ts +62 -0
- package/src/advisor/consult.ts +4 -1
- package/src/advisor/context.ts +16 -4
- package/src/advisor/evidence-tool.ts +21 -0
- package/src/advisor/evidence.ts +117 -0
- package/src/advisor/runtime.ts +79 -31
- package/src/advisor/settings.ts +11 -2
- package/src/bridge/errors.ts +19 -1
- package/src/bridge/internal.ts +7 -1
- package/src/bridge/response-json.ts +18 -3
- package/src/bridge/sse.ts +59 -8
- package/src/bridge/terminal-refusal.ts +59 -0
- package/src/claude/desktop-3p-library.ts +32 -7
- package/src/claude/desktop-3p.ts +55 -13
- package/src/claude/desktop-first-party.ts +1 -1
- package/src/claude/desktop-picker-platform.ts +4 -0
- package/src/claude/desktop-picker.ts +15 -8
- package/src/claude/desktop-system-proxy.ts +50 -4
- package/src/claude/inbound-content-options.ts +77 -0
- package/src/claude/inbound.ts +33 -0
- package/src/claude/intercept/picker-ca-startup.ts +2 -1
- package/src/claude/intercept/picker-runtime.ts +6 -5
- package/src/claude/intercept/picker-trust-windows.ts +338 -0
- package/src/claude/intercept/picker-trust.ts +19 -0
- package/src/claude/intercept/port-policy.ts +30 -0
- package/src/claude/intercept/runtime.ts +97 -94
- package/src/claude/outbound.ts +46 -13
- package/src/cli/account-api.ts +1 -0
- package/src/cli/account-policy-dto.ts +6 -0
- package/src/cli/account-policy.ts +34 -5
- package/src/cli/account-preservation.ts +44 -0
- package/src/cli/account.ts +8 -2
- package/src/cli/advisor.ts +17 -3
- package/src/cli/capabilities-accounts.ts +20 -1
- package/src/cli/capabilities-agents-routing.ts +5 -2
- package/src/cli/capabilities-base.ts +38 -10
- package/src/cli/capabilities-observe-system.ts +63 -3
- package/src/cli/capabilities-provider-models.ts +11 -0
- package/src/cli/codex-cli-update.ts +151 -41
- package/src/cli/codex-provider.ts +44 -0
- package/src/cli/combo-input.ts +10 -1
- package/src/cli/combo-result.ts +1 -1
- package/src/cli/combo.ts +2 -1
- package/src/cli/cross-home-owner.ts +33 -16
- package/src/cli/dispatch.ts +25 -4
- package/src/cli/doctor.ts +6 -1
- package/src/cli/ensure-desktop-cold-start.ts +60 -7
- package/src/cli/help.ts +3 -2
- package/src/cli/index.ts +1 -1
- package/src/cli/integration-plan-dto.ts +1 -0
- package/src/cli/log-history.ts +172 -0
- package/src/cli/loopback-family.ts +31 -0
- package/src/cli/models-runtime-subcommands.ts +1 -0
- package/src/cli/models-runtime.ts +72 -8
- package/src/cli/observe-stream.ts +2 -0
- package/src/cli/observe.ts +16 -4
- package/src/cli/provider.ts +27 -5
- package/src/cli/registry.ts +28 -8
- package/src/cli/runtime-api.ts +5 -3
- package/src/cli/system-command.ts +40 -8
- package/src/cli/uninstall-client-state.ts +32 -0
- package/src/cli/usage-compare.ts +309 -0
- package/src/cli/usage-model-search.ts +4 -4
- package/src/cli/usage-report.ts +2 -2
- package/src/cli/v2.ts +1 -1
- package/src/client/machine-listener.ts +1 -3
- package/src/client/runtime.ts +1 -0
- package/src/clients/client-path.ts +51 -0
- package/src/clients/config-export/contracts.ts +2 -1
- package/src/clients/config-export.ts +18 -44
- package/src/clients/gentle-shell-path.ts +87 -0
- package/src/codex/account-auto-switch.ts +2 -0
- package/src/codex/account-identity.ts +29 -0
- package/src/codex/account-label.ts +1 -1
- package/src/codex/account-lifecycle.ts +21 -5
- package/src/codex/account-preservation.ts +28 -0
- package/src/codex/account-use-remaining.ts +23 -0
- package/src/codex/app-server-processes.ts +97 -7
- package/src/codex/app-server-restart-service.ts +55 -4
- package/src/codex/auth-api/account-list.ts +4 -0
- package/src/codex/auth-api/account-pause-group.ts +6 -50
- package/src/codex/auth-api/account-preservation.ts +57 -0
- package/src/codex/auth-api/routes.ts +8 -0
- package/src/codex/auth-api/use-remaining-route.ts +36 -0
- package/src/codex/auth-api.ts +0 -1
- package/src/codex/auth-context.ts +2 -2
- package/src/codex/catalog/auto-review.ts +20 -3
- package/src/codex/catalog/build-entries.ts +9 -1
- package/src/codex/catalog/combo-member.ts +14 -5
- package/src/codex/catalog/configured-tiers.ts +1 -1
- package/src/codex/catalog/gather-capture.ts +2 -0
- package/src/codex/catalog/metadata.ts +11 -9
- package/src/codex/catalog/model-hints.ts +21 -16
- package/src/codex/catalog/model-visibility.ts +3 -1
- package/src/codex/catalog/parsing.ts +30 -86
- package/src/codex/catalog/provider-models.ts +36 -34
- package/src/codex/catalog/routed-gather.ts +14 -13
- package/src/codex/cli-install-provenance.ts +105 -17
- package/src/codex/cli-update-plan.ts +545 -0
- package/src/codex/config-write-lock.ts +23 -2
- package/src/codex/desktop-app/picker-freshness.ts +96 -0
- package/src/codex/desktop-app-restart.ts +21 -0
- package/src/codex/desktop-compatibility/installed-build.ts +24 -6
- package/src/codex/desktop-compatibility/routing-preflight.ts +1 -1
- package/src/codex/desktop-compatibility/runtime.ts +12 -3
- package/src/codex/desktop-compatibility/windows-key-protection.ts +115 -9
- package/src/codex/features.ts +85 -45
- package/src/codex/inject/history-failure.ts +27 -0
- package/src/codex/inject/restore.ts +24 -2
- package/src/codex/inject/routing-classify.ts +4 -3
- package/src/codex/inject.ts +18 -27
- package/src/codex/main-account-hard-lock.ts +30 -1
- package/src/codex/native-profile-startup.ts +1 -1
- package/src/codex/ocx-compaction-history.ts +12 -10
- package/src/codex/paths.ts +86 -1
- package/src/codex/provider-routing.ts +174 -0
- package/src/codex/refresh.ts +2 -2
- package/src/codex/routing/health-store.ts +1 -1
- package/src/codex/routing/selection.ts +4 -3
- package/src/codex/routing/thread-affinity.ts +1 -1
- package/src/codex/signed-in-identity.ts +43 -0
- package/src/codex/subagent-model-fallback.ts +1 -1
- package/src/codex/sync.ts +6 -1
- package/src/codex/user-identity.ts +16 -5
- package/src/codex/websocket-activity.ts +161 -0
- package/src/codex/websocket-registry.ts +25 -1
- package/src/codex/windows-local-appdata.ts +84 -0
- package/src/combos/failover.ts +6 -1
- package/src/combos/index.ts +1 -0
- package/src/combos/resolve.ts +46 -10
- package/src/combos/types.ts +15 -0
- package/src/config/diagnostics.ts +33 -6
- package/src/config/live-reconcile.ts +38 -2
- package/src/config/load-degrade.ts +17 -0
- package/src/config/opencode-wire-upgrade.ts +54 -0
- package/src/config/opencode-zen-upgrade.ts +53 -0
- package/src/config/owner-registry.ts +22 -17
- package/src/config/provider-validation.ts +45 -2
- package/src/config/schema/config-schema.ts +22 -0
- package/src/config/schema/leaf-validators.ts +38 -9
- package/src/config/schema/main-account-hard-lock-fallback.ts +26 -0
- package/src/config/schema/native-reasoning-retention.ts +26 -0
- package/src/config.ts +2 -0
- package/src/generated/compatibility-version.json +657 -297
- package/src/grok/sync.ts +1 -1
- package/src/images/loop.ts +116 -27
- package/src/integrations/catalog-refresh.ts +1 -1
- package/src/integrations/mutation-plan.ts +1 -0
- package/src/integrations/registry.ts +8 -0
- package/src/lib/codex-restart-contract.ts +15 -0
- package/src/lib/desktop-upstream-tunnel.ts +18 -53
- package/src/lib/empty-tool-catalog.ts +62 -0
- package/src/lib/errors.ts +19 -3
- package/src/lib/gcp-adc.ts +96 -9
- package/src/lib/gcp-credential-input.ts +12 -0
- package/src/lib/lab-live-route-production.ts +5 -0
- package/src/lib/opaque-proxy-tunnel.ts +217 -0
- package/src/lib/redact.ts +2 -2
- package/src/lib/request-failure-model.ts +2 -0
- package/src/oauth/account-quota-rank.ts +69 -2
- package/src/oauth/anthropic-account-refusal.ts +20 -2
- package/src/oauth/anthropic-oauth-definitions.ts +3 -1
- package/src/oauth/anthropic-routing.ts +1 -21
- package/src/oauth/anthropic.ts +38 -7
- package/src/oauth/callback-server.ts +27 -1
- package/src/oauth/chatgpt-device.ts +1 -1
- package/src/oauth/chatgpt-shared.ts +83 -0
- package/src/oauth/chatgpt.ts +8 -72
- package/src/oauth/dsh.ts +203 -0
- package/src/oauth/generic-account-failover.ts +40 -11
- package/src/oauth/generic-session-affinity.ts +125 -0
- package/src/oauth/index.ts +184 -109
- package/src/oauth/local-token-detect.ts +21 -1
- package/src/oauth/login-cli-errors.ts +44 -0
- package/src/oauth/login-cli.ts +69 -7
- package/src/oauth/login-flow-state.ts +371 -23
- package/src/oauth/meta-muse-errors.ts +41 -0
- package/src/oauth/meta-muse-keychain.ts +52 -0
- package/src/oauth/meta-muse.ts +51 -84
- package/src/oauth/model-discovery-auth.ts +3 -0
- package/src/oauth/pool-settings-capability.ts +4 -2
- package/src/oauth/refresh-flight-retirement.ts +48 -0
- package/src/oauth/session-affinity-key.ts +23 -0
- package/src/oauth/store-anthropic-instance.ts +9 -2
- package/src/oauth/store.ts +12 -5
- package/src/protocols/encoders/adapter-events.ts +6 -5
- package/src/protocols/encoders/messages.ts +9 -6
- package/src/protocols/provider-summary.ts +2 -1
- package/src/providers/api-key-cooldowns.ts +49 -0
- package/src/providers/api-key-resolve.ts +11 -6
- package/src/providers/api-key-response-ownership.ts +57 -0
- package/src/providers/api-key-selection.ts +31 -6
- package/src/providers/api-keys.ts +214 -3
- package/src/providers/claude-cli-usage.ts +96 -0
- package/src/providers/dsh-account-destination.ts +31 -0
- package/src/providers/dsh-account-models.ts +41 -0
- package/src/providers/gcp-credential-cleanup.ts +59 -0
- package/src/providers/key-failover.ts +54 -50
- package/src/providers/key-store.ts +7 -2
- package/src/providers/model-rename-fields.ts +3 -0
- package/src/providers/model-rename-migration.ts +2 -2
- package/src/providers/openai-tiers-destination.ts +11 -2
- package/src/providers/openai-tiers.ts +5 -12
- package/src/providers/opencode-go-transport.ts +3 -1
- package/src/providers/opencode-zen-rate-limit.ts +7 -2
- package/src/providers/quota/account-cache.ts +6 -5
- package/src/providers/quota/account-row.ts +34 -0
- package/src/providers/quota/antigravity.ts +28 -7
- package/src/providers/quota/dsh-account.ts +70 -0
- package/src/providers/quota/vendor-probes-oauth.ts +1 -93
- package/src/providers/quota-types.ts +2 -0
- package/src/providers/quota.ts +14 -20
- package/src/providers/registry/entries-core.ts +37 -8
- package/src/providers/registry/types.ts +1 -1
- package/src/providers/request-pacing.ts +77 -19
- package/src/providers/routed-config.ts +339 -0
- package/src/providers/service-tier.ts +2 -1
- package/src/quota/window-mapping.ts +5 -2
- package/src/responses/anthropic-progress.ts +34 -0
- package/src/responses/assistant-replay.ts +35 -0
- package/src/responses/compaction-history-framing.ts +65 -0
- package/src/responses/compaction.ts +6 -1
- package/src/responses/incomplete-reason.ts +31 -0
- package/src/responses/parser.ts +50 -5
- package/src/responses/reasoning-envelope.ts +4 -0
- package/src/responses/reasoning-replay-cache.ts +74 -6
- package/src/responses/reasoning-retention.ts +173 -0
- package/src/responses/retained-compaction.ts +46 -0
- package/src/responses/schema.ts +23 -0
- package/src/router.ts +8 -321
- package/src/routing/analytics.ts +7 -15
- package/src/routing/health.ts +37 -22
- package/src/routing/history/indexer.ts +6 -5
- package/src/routing/history/ingest.ts +6 -2
- package/src/routing/profile.ts +1 -1
- package/src/server/admission-model-scope.ts +17 -0
- package/src/server/auth-cors.ts +11 -0
- package/src/server/chat-completions.ts +7 -1
- package/src/server/chat-native-reasoning.ts +123 -0
- package/src/server/chat-native-sse.ts +110 -7
- package/src/server/chat-native.ts +76 -17
- package/src/server/claude-messages.ts +56 -414
- package/src/server/effort-policy.ts +1 -1
- package/src/server/images.ts +15 -2
- package/src/server/index/live-sideband.ts +3 -2
- package/src/server/index/model-alias-id.ts +36 -0
- package/src/server/index/optional-listeners.ts +2 -0
- package/src/server/index/serve-options.ts +20 -6
- package/src/server/index/startup-warnings.ts +2 -0
- package/src/server/index/websocket-handler.ts +18 -4
- package/src/server/index.ts +8 -8
- package/src/server/inference/advisor-diagnostics.ts +31 -0
- package/src/server/lifecycle.ts +13 -1
- package/src/server/management/advisor-routes.ts +15 -4
- package/src/server/management/claude-desktop-picker-routes.ts +1 -1
- package/src/server/management/combo-routes.ts +176 -50
- package/src/server/management/companion-routes.ts +1 -1
- package/src/server/management/config-routes.ts +75 -4
- package/src/server/management/cursor-integration-routes.ts +1 -1
- package/src/server/management/model-routes.ts +11 -6
- package/src/server/management/model-rows.ts +14 -0
- package/src/server/management/native-integration-routes.ts +2 -7
- package/src/server/management/native-reasoning-retention-routes.ts +41 -0
- package/src/server/management/oauth-account-routes.ts +87 -14
- package/src/server/management/provider-gcp-credential-routes.ts +29 -0
- package/src/server/management/provider-key-pacing-routes.ts +31 -0
- package/src/server/management/provider-overwrite-carry.ts +7 -0
- package/src/server/management/provider-routes.ts +25 -30
- package/src/server/management/route-registry.ts +10 -1
- package/src/server/management-api.ts +3 -1
- package/src/server/messages-native-tool-guard.ts +185 -0
- package/src/server/messages-native.ts +117 -24
- package/src/server/messages-shared.ts +431 -0
- package/src/server/relay.ts +1 -1
- package/src/server/request-log-terminal-status.ts +1 -1
- package/src/server/request-log.ts +6 -1
- package/src/server/responses/account-change-state.ts +8 -2
- package/src/server/responses/adapter-continuation.ts +47 -19
- package/src/server/responses/adapter-delivery.ts +72 -12
- package/src/server/responses/adapter-dispatch.ts +46 -3
- package/src/server/responses/advisor-retention.ts +117 -0
- package/src/server/responses/advisor-slot.ts +73 -41
- package/src/server/responses/anthropic-thinking-recovery.ts +153 -0
- package/src/server/responses/codex-ws-wire.ts +15 -8
- package/src/server/responses/combo-stream-preflight.ts +3 -2
- package/src/server/responses/compact.ts +303 -125
- package/src/server/responses/compaction-recovery.ts +20 -10
- package/src/server/responses/compaction-retention.ts +61 -0
- package/src/server/responses/context-overflow.ts +11 -6
- package/src/server/responses/core-auth.ts +6 -0
- package/src/server/responses/core-codex-account.ts +11 -1
- package/src/server/responses/core-combo-failure.ts +2 -0
- package/src/server/responses/core-combo.ts +121 -36
- package/src/server/responses/core-errors.ts +3 -3
- package/src/server/responses/core-lifetime.ts +8 -4
- package/src/server/responses/core-opaque-recovery.ts +35 -0
- package/src/server/responses/core-options.ts +7 -0
- package/src/server/responses/core-pipeline.ts +141 -0
- package/src/server/responses/core-replay.ts +23 -3
- package/src/server/responses/core.ts +2 -115
- package/src/server/responses/fetch-helpers.ts +73 -19
- package/src/server/responses/main-hard-lock-routing.ts +109 -0
- package/src/server/responses/native-response-control.ts +4 -2
- package/src/server/responses/passthrough-delivery.ts +3 -1
- package/src/server/responses/passthrough-dispatch.ts +15 -13
- package/src/server/responses/passthrough-execution.ts +3 -2
- package/src/server/responses/request-prepare.ts +77 -12
- package/src/server/responses/request-sidecar-auth.ts +2 -2
- package/src/server/responses/request-transport.ts +104 -27
- package/src/server/responses/response-effects.ts +2 -0
- package/src/server/responses/response-tool-ownership.ts +21 -0
- package/src/server/responses/run-turn-execution.ts +96 -30
- package/src/server/responses/sidecar-execution.ts +63 -9
- package/src/server/responses/sidecar-send-budget.ts +2 -2
- package/src/server/responses/terminal-guard.ts +2 -16
- package/src/server/responses-undeclared-tool-guard.ts +1 -1
- package/src/server/ws-bridge.ts +2 -0
- package/src/service/auth-preflight.ts +71 -0
- package/src/service/cli.ts +4 -2
- package/src/service/definition.ts +97 -0
- package/src/service/guards.ts +1 -61
- package/src/service/health-sentinel-linux.ts +112 -0
- package/src/service/health-sentinel-main.ts +76 -57
- package/src/service/health.ts +5 -89
- package/src/service/launchd.ts +27 -7
- package/src/service/logging.ts +72 -9
- package/src/service/repair.ts +2 -1
- package/src/service/state.ts +7 -8
- package/src/service/systemd.ts +1 -1
- package/src/service/windows-guarded-manager.ts +2 -1
- package/src/service/windows-ops.ts +1 -1
- package/src/service/windows-scheduler.ts +2 -7
- package/src/service/windows-taskxml.ts +2 -2
- package/src/service/windows-wscript.ts +14 -0
- package/src/service.ts +4 -2
- package/src/sidecar/auth.ts +2 -0
- package/src/types/config.ts +64 -3
- package/src/types/opencode-go.ts +61 -0
- package/src/types/opencode-zen.ts +35 -0
- package/src/types/provider.ts +32 -6
- package/src/types/request.ts +31 -2
- package/src/types/wire.ts +31 -37
- package/src/types.ts +2 -0
- package/src/update/npm-invocation.mjs +12 -2
- package/src/usage/cost.ts +48 -12
- package/src/usage/expected-prices.ts +3 -0
- package/src/usage/ledger-retention.ts +2 -1
- package/src/usage/ledger-scanner.ts +6 -5
- package/src/usage/log.ts +17 -8
- package/src/usage/summary.ts +30 -11
- package/src/usage/telemetry-contract.ts +1 -0
- package/src/usage/user-cost-overlays.ts +14 -19
- package/src/usage/user-cost-validation.ts +38 -0
- package/src/vision/eligibility.ts +13 -0
- package/src/web-search/anthropic-history.ts +59 -0
- package/src/web-search/loop.ts +236 -73
- package/src/web-search/progress-stream.ts +15 -2
- package/src/web-search/run-turn-loop.ts +9 -1
- package/gui/dist/assets/App-BjlttVLy.js +0 -58
- package/gui/dist/assets/App-CSJvmjNs.css +0 -1
- package/gui/dist/assets/index-BB6uK6tU.css +0 -1
- package/gui/dist/assets/index-BMssP4k3.js +0 -94
- package/gui/dist/assets/quota-summary-D8M1bc_R.js +0 -1
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
modelPinnedEffortsConfigError,
|
|
7
7
|
pinnedReasoningEffortConfigError,
|
|
8
8
|
modelDisplayNamesConfigError,
|
|
9
|
+
autoReviewOverrideConfigError,
|
|
9
10
|
autoReviewModelOverridesConfigError,
|
|
10
11
|
autoReviewModelTargetConfigError,
|
|
11
12
|
normalizeNonBlankStringArray,
|
|
@@ -28,13 +29,14 @@ import {
|
|
|
28
29
|
PROVIDER_WEB_SEARCH_BRIDGE_BACKENDS,
|
|
29
30
|
UPSTREAM_HTTP_VERSION_VALUES,
|
|
30
31
|
type OcxProviderConfig,
|
|
32
|
+
type OcxConfig,
|
|
31
33
|
type FastWire,
|
|
32
34
|
type ProviderCostOverlay,
|
|
33
35
|
} from "../../types";
|
|
34
36
|
import { fastWireDeclarationError } from "../../providers/fastwire";
|
|
35
37
|
import { getProviderRegistryEntry, providerMatchesRegistryTransport, providerModelWireDefault } from "../../providers/registry";
|
|
36
38
|
import { resolveOpenAiVirtualModel } from "../../providers/openai-virtual-models";
|
|
37
|
-
import { COST4_RATE_KEYS, isValidCost4Rate } from "../../usage/user-cost-overlays";
|
|
39
|
+
import { COST4_RATE_KEYS, isValidCost4Rate, isValidPromptLengthPricing, copyPromptLengthPricing } from "../../usage/user-cost-overlays";
|
|
38
40
|
import { MAX_COST4_RATE } from "../../usage/expected-prices";
|
|
39
41
|
import {
|
|
40
42
|
DECLARABLE_HOSTED_TOOL_TYPES,
|
|
@@ -63,6 +65,12 @@ export const compactionRoutingSchema = z.object({
|
|
|
63
65
|
.optional(),
|
|
64
66
|
}).strict();
|
|
65
67
|
|
|
68
|
+
export const reasoningRetentionSchema = z.object({
|
|
69
|
+
enabled: z.boolean().optional(),
|
|
70
|
+
maxContextPercent: z.number().gt(0).max(100).optional(),
|
|
71
|
+
maxTokens: z.number().int().positive().optional(),
|
|
72
|
+
}).strict();
|
|
73
|
+
|
|
66
74
|
/**
|
|
67
75
|
* One phase of Codex's memory pipeline. A present phase must name a model: the GUI's "Off"
|
|
68
76
|
* removes the phase instead of blanking it, so an empty entry would only ever come from a
|
|
@@ -133,12 +141,15 @@ const requestPacingSchema = z.object({
|
|
|
133
141
|
minIntervalMs: z.number().int().min(1).max(3_600_000).optional(),
|
|
134
142
|
maxConcurrentRequests: z.number().int().min(1).optional(),
|
|
135
143
|
models: z.record(z.string().trim().min(1), requestPacingRuleSchema).optional(),
|
|
144
|
+
keySelection: z.enum(["active", "round-robin"]).optional(),
|
|
145
|
+
keys: requestPacingRuleSchema.optional(),
|
|
136
146
|
}).strict().refine(value => value.enabled === false
|
|
137
147
|
|| value.requestsPerMinute !== undefined
|
|
138
148
|
|| value.minIntervalMs !== undefined
|
|
139
149
|
|| value.maxConcurrentRequests !== undefined
|
|
150
|
+
|| value.keys !== undefined || value.keySelection === "round-robin"
|
|
140
151
|
|| (value.models !== undefined && Object.keys(value.models).length > 0), {
|
|
141
|
-
message: "enabled request pacing needs a provider rule or
|
|
152
|
+
message: "enabled request pacing needs a provider, model, or key rule, or round-robin selection",
|
|
142
153
|
});
|
|
143
154
|
|
|
144
155
|
export function requestPacingConfigError(value: unknown): string | null {
|
|
@@ -257,6 +268,12 @@ const autoReviewModelOverridesSchema = z.unknown().superRefine((value, ctx) => {
|
|
|
257
268
|
if (error) ctx.addIssue({ code: "custom", message: error });
|
|
258
269
|
}).transform(value => normalizeAutoReviewModelOverrides(value));
|
|
259
270
|
|
|
271
|
+
/** Global auto-review override block; a malformed hand edit is stripped by load degradation. */
|
|
272
|
+
export const autoReviewOverrideSchema = z.unknown().superRefine((value, ctx) => {
|
|
273
|
+
const error = autoReviewOverrideConfigError(value, "autoReviewOverride");
|
|
274
|
+
if (error) ctx.addIssue({ code: "custom", message: error });
|
|
275
|
+
}).transform(value => value as NonNullable<OcxConfig["autoReviewOverride"]>);
|
|
276
|
+
|
|
260
277
|
const modelCapabilitiesSchema = z.unknown().superRefine((value, ctx) => {
|
|
261
278
|
const error = modelCapabilitiesConfigError(value);
|
|
262
279
|
if (error) ctx.addIssue({ code: "custom", message: error });
|
|
@@ -337,9 +354,12 @@ export const providerConfigSchema = z.object({
|
|
|
337
354
|
preserveResponsesReasoningContent: z.boolean().optional(),
|
|
338
355
|
preserveResponsesInputItemIds: z.boolean().optional(),
|
|
339
356
|
preserveResponsesMessageMetadata: z.boolean().optional(),
|
|
357
|
+
projectResponsesLiteHostedSearchHistory: z.boolean().optional(),
|
|
340
358
|
dropResponsesReasoningItems: z.boolean().optional(),
|
|
341
359
|
modelReasoningEffortsAuthoritative: z.boolean().optional(),
|
|
342
360
|
decodesNativeCompactionBlobs: z.boolean().optional(),
|
|
361
|
+
supportsNativeCompactionTrigger: z.boolean().optional(),
|
|
362
|
+
supportsNativeCompactEndpoint: z.boolean().optional(),
|
|
343
363
|
allowEncryptedV2AgentTasks: z.boolean().optional(),
|
|
344
364
|
allowPrivateNetwork: z.boolean().optional(),
|
|
345
365
|
// Per-provider egress (#2894): absent inherits the global proxy decision, "direct"/null
|
|
@@ -423,7 +443,7 @@ export { providerRelativeSendPathConfigError } from "../provider-relative-send-p
|
|
|
423
443
|
|
|
424
444
|
/**
|
|
425
445
|
* Validate `providers.<name>.modelCosts`: a plain object keyed by exact model
|
|
426
|
-
* id, each value
|
|
446
|
+
* id, each value four USD-per-1M-token rates and an optional prompt-length policy.
|
|
427
447
|
* Returns null when valid/absent, else a human-readable error.
|
|
428
448
|
*/
|
|
429
449
|
export function providerModelCostsConfigError(value: unknown, field = "modelCosts"): string | null {
|
|
@@ -443,25 +463,28 @@ export function providerModelCostsConfigError(value: unknown, field = "modelCost
|
|
|
443
463
|
const rates = entry as Record<string, unknown>;
|
|
444
464
|
for (const key of COST4_RATE_KEYS) {
|
|
445
465
|
const rate = rates[key];
|
|
446
|
-
if (!isValidCost4Rate(rate)) {
|
|
466
|
+
if (!Object.hasOwn(rates, key) || !isValidCost4Rate(rate)) {
|
|
447
467
|
return `${field}.${safeModelId}.${key} must be a non-negative finite number at most ${MAX_COST4_RATE} (USD per 1M tokens)`;
|
|
448
468
|
}
|
|
449
469
|
}
|
|
470
|
+
if (Object.hasOwn(rates, "promptLengthPricing") && !isValidPromptLengthPricing(rates.promptLengthPricing)) {
|
|
471
|
+
return `${field}.${safeModelId}.promptLengthPricing must be automatic, flat, or a complete custom policy with a positive safe-integer thresholdTokens, gt/gte comparison, and four valid rates`;
|
|
472
|
+
}
|
|
450
473
|
// Reject unknown fields: a misplaced apiKey/apiKeyPool under a cost row
|
|
451
474
|
// would otherwise be persisted and echoed verbatim by display paths that
|
|
452
475
|
// mask only top-level provider secrets.
|
|
453
476
|
const extraKeys = Object.keys(rates)
|
|
454
|
-
.filter((key) => !(COST4_RATE_KEYS as readonly string[]).includes(key));
|
|
477
|
+
.filter((key) => key !== "promptLengthPricing" && !(COST4_RATE_KEYS as readonly string[]).includes(key));
|
|
455
478
|
if (extraKeys.length > 0) {
|
|
456
|
-
return `${field}.${safeModelId} has unexpected fields ${JSON.stringify(extraKeys.map(redactSecretString).join(", "))} — only input, output, cacheRead, and
|
|
479
|
+
return `${field}.${safeModelId} has unexpected fields ${JSON.stringify(extraKeys.map(redactSecretString).join(", "))} — only input, output, cacheRead, cacheWrite, and promptLengthPricing are allowed (USD per 1M tokens)`;
|
|
457
480
|
}
|
|
458
481
|
}
|
|
459
482
|
return null;
|
|
460
483
|
}
|
|
461
484
|
|
|
462
485
|
/**
|
|
463
|
-
* Serialize `providers.<name>.modelCosts` for display: copy
|
|
464
|
-
*
|
|
486
|
+
* Serialize `providers.<name>.modelCosts` for display: copy the four validated
|
|
487
|
+
* rates and complete validated policy and DROP secret-shaped model ids, so a pasted
|
|
465
488
|
* API key in a key position cannot be echoed back by CLI/DTO display paths.
|
|
466
489
|
* The result uses a null prototype so "__proto__" remains an own row.
|
|
467
490
|
*/
|
|
@@ -471,6 +494,7 @@ export function sanitizeModelCostsForDisplay(costs: unknown): Record<string, Pro
|
|
|
471
494
|
for (const [modelId, entry] of Object.entries(costs)) {
|
|
472
495
|
if (!entry || typeof entry !== "object" || Array.isArray(entry)) continue;
|
|
473
496
|
const rates = entry as Record<string, unknown>;
|
|
497
|
+
if (Object.hasOwn(rates, "promptLengthPricing") && !isValidPromptLengthPricing(rates.promptLengthPricing)) continue;
|
|
474
498
|
const input = rates.input;
|
|
475
499
|
const output = rates.output;
|
|
476
500
|
const cacheRead = rates.cacheRead;
|
|
@@ -484,7 +508,10 @@ export function sanitizeModelCostsForDisplay(costs: unknown): Record<string, Pro
|
|
|
484
508
|
// Secret-shaped ids are DROPPED rather than mapped to "[REDACTED]" so
|
|
485
509
|
// distinct rows cannot collapse into one placeholder key.
|
|
486
510
|
if (redactSecretString(modelId) !== modelId) continue;
|
|
487
|
-
|
|
511
|
+
const policy = isValidPromptLengthPricing(rates.promptLengthPricing)
|
|
512
|
+
? copyPromptLengthPricing(rates.promptLengthPricing) : undefined;
|
|
513
|
+
out[modelId] = { input, output, cacheRead, cacheWrite,
|
|
514
|
+
...(policy ? { promptLengthPricing: policy } : {}) };
|
|
488
515
|
}
|
|
489
516
|
}
|
|
490
517
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
@@ -794,6 +821,8 @@ export const apiKeyEntrySchema = z.object({
|
|
|
794
821
|
// rather than promoting it.
|
|
795
822
|
allowedProviders: z.array(z.string().trim().min(1).max(256)).optional(),
|
|
796
823
|
allowedModels: z.array(z.string().trim().min(1).max(256)).optional(),
|
|
824
|
+
// Not `.catch`ed for the same reason: a damaged value must not grant metered spend.
|
|
825
|
+
allowMeteredComboTargets: z.boolean().optional(),
|
|
797
826
|
}).passthrough();
|
|
798
827
|
|
|
799
828
|
/**
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as z from "zod/v4";
|
|
2
|
+
import { pinnedReasoningEffortConfigError } from "../provider-validation";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Extended settings of the main-account hard lock (`codexMainAccountHardLockFallback`):
|
|
6
|
+
* while the lock blocks, a qualifying Codex-native request reroutes to `model` instead of
|
|
7
|
+
* failing. The dashboard row keeps the configured model when the switch is off, so
|
|
8
|
+
* `enabled: false` is a remembered pause, not a cleared setting; an absent section, an
|
|
9
|
+
* absent model, and a malformed section all mean the same thing — the lock refuses,
|
|
10
|
+
* exactly as it does today.
|
|
11
|
+
*/
|
|
12
|
+
export const mainAccountHardLockFallbackSchema = z.object({
|
|
13
|
+
enabled: z.boolean().optional(),
|
|
14
|
+
model: z.string().refine(model => model.length > 0 && model === model.trim() && !/\s/.test(model)),
|
|
15
|
+
reasoningEffort: z.string().refine(value => pinnedReasoningEffortConfigError(value) === null).optional(),
|
|
16
|
+
}).strict();
|
|
17
|
+
|
|
18
|
+
/** Candidate writes must reject sections the read schema would silently discard. */
|
|
19
|
+
export function mainAccountHardLockFallbackError(value: unknown): string | undefined {
|
|
20
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
|
|
21
|
+
const raw = (value as Record<string, unknown>).codexMainAccountHardLockFallback;
|
|
22
|
+
if (raw === undefined) return undefined;
|
|
23
|
+
return mainAccountHardLockFallbackSchema.safeParse(raw).success
|
|
24
|
+
? undefined
|
|
25
|
+
: "schema_invalid: codexMainAccountHardLockFallback requires a nonblank model selector and an optional declared reasoningEffort";
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as z from "zod/v4";
|
|
2
|
+
import type { OcxConfig } from "../../types";
|
|
3
|
+
|
|
4
|
+
/** Opt-in allowances for canonical ChatGPT reasoning replay; absence keeps existing cleanup. */
|
|
5
|
+
export const nativeReasoningRetentionSchema = z.object({
|
|
6
|
+
modelSwitch: z.boolean().optional(),
|
|
7
|
+
accountSwitch: z.boolean().optional(),
|
|
8
|
+
}).strict();
|
|
9
|
+
|
|
10
|
+
export function nativeReasoningRetentionConfigError(value: unknown): string | null {
|
|
11
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
12
|
+
const retention = (value as Record<string, unknown>).nativeReasoningRetention;
|
|
13
|
+
return retention === undefined || nativeReasoningRetentionSchema.safeParse(retention).success
|
|
14
|
+
? null : "schema_invalid: nativeReasoningRetention: accepts only optional boolean modelSwitch and accountSwitch fields";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Resolve malformed synthetic inputs the same way as degraded disk config: both off. */
|
|
18
|
+
export function resolveNativeReasoningRetention(
|
|
19
|
+
config: Pick<OcxConfig, "nativeReasoningRetention">,
|
|
20
|
+
): { modelSwitch: boolean; accountSwitch: boolean } {
|
|
21
|
+
const parsed = nativeReasoningRetentionSchema.safeParse(config.nativeReasoningRetention);
|
|
22
|
+
return {
|
|
23
|
+
modelSwitch: parsed.success && parsed.data.modelSwitch === true,
|
|
24
|
+
accountSwitch: parsed.success && parsed.data.accountSwitch === true,
|
|
25
|
+
};
|
|
26
|
+
}
|
package/src/config.ts
CHANGED
|
@@ -162,6 +162,7 @@ import { persistConfigUnlocked, readRawConfigJson } from "./config/persist-unloc
|
|
|
162
162
|
import { withConfigMutationLockSync, bumpGenerationForCooperatingConfigWrite } from "./config/mutation-lock";
|
|
163
163
|
import { getDefaultConfig } from "./config/proxy-env";
|
|
164
164
|
import { configSchema } from "./config/schema/config-schema";
|
|
165
|
+
import { sanitizeOpenCodeOverridesForLoad } from "./config/opencode-wire-upgrade";
|
|
165
166
|
import {
|
|
166
167
|
hardenExistingSecret,
|
|
167
168
|
normalizeApiKeyIds,
|
|
@@ -222,6 +223,7 @@ export function loadConfig(): OcxConfig {
|
|
|
222
223
|
try {
|
|
223
224
|
const raw = readFileSync(configPath, "utf-8").replace(/^\uFEFF/, "");
|
|
224
225
|
const parsed = JSON.parse(raw);
|
|
226
|
+
sanitizeOpenCodeOverridesForLoad(parsed);
|
|
225
227
|
sanitizeAliasesForLoad(parsed);
|
|
226
228
|
sanitizeReasoningPinsForLoad(parsed);
|
|
227
229
|
sanitizeModelDisplayNamesForLoad(parsed);
|