@iislee/opencodex 2.11.0 → 2.31.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/AGENTS_INSTALL.md +109 -0
- package/README.md +114 -19
- package/bin/ocx.mjs +164 -36
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-BF38heuV.js +104 -0
- package/gui/dist/assets/index-DMiI18Kv.css +1 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +19 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +376 -52
- package/src/adapters/base.ts +54 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +129 -6
- package/src/adapters/cursor/discovery.ts +61 -4
- package/src/adapters/cursor/effort-map.ts +27 -3
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +174 -58
- package/src/adapters/cursor/live-transport.ts +609 -170
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +0 -1
- package/src/adapters/cursor/native-exec.ts +101 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +383 -65
- package/src/adapters/cursor/request-builder.ts +237 -31
- package/src/adapters/cursor/tool-definitions.ts +242 -12
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +28 -1
- package/src/adapters/cursor.ts +133 -7
- package/src/adapters/google-antigravity-replay.ts +558 -34
- package/src/adapters/google-antigravity-wire.ts +43 -10
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +618 -74
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +10 -1
- package/src/adapters/kiro.ts +92 -54
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1311 -336
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +830 -56
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +104 -21
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +428 -61
- package/src/chat/inbound.ts +43 -19
- package/src/chat/outbound.ts +82 -26
- package/src/claude/agents-inject.ts +32 -9
- package/src/claude/context-windows.ts +21 -5
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +70 -16
- package/src/cli/account-api.ts +35 -1
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +389 -2
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +30 -6
- package/src/cli/agent.ts +45 -1
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +29 -4
- package/src/cli/claude.ts +103 -34
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +593 -0
- package/src/cli/doctor.ts +315 -43
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +20 -271
- package/src/cli/index.ts +378 -519
- package/src/cli/init.ts +4 -17
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +35 -2
- package/src/cli/models.ts +100 -14
- package/src/cli/observe.ts +92 -3
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +18 -1
- package/src/cli/provider.ts +24 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +437 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +6 -3
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +10 -3
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/v2.ts +105 -10
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1358 -21
- package/src/codex/account-label.ts +14 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +493 -106
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +849 -242
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +345 -32
- package/src/codex/autostart-health.ts +8 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +68 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +121 -30
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +529 -45
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +224 -30
- package/src/codex/catalog/provider-fetch.ts +1460 -134
- package/src/codex/catalog/sync.ts +1449 -186
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +26 -20
- package/src/codex/history-provider.ts +231 -28
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1073 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +80 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +506 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +353 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +492 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +682 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +175 -13
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +505 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1009 -28
- package/src/codex/subagent-model-fallback.ts +350 -35
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +20 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +81 -9
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +1762 -140
- package/src/generated/compatibility-version.json +3164 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +152 -29
- package/src/images/plan.ts +23 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +153 -9
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +6 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +44 -2
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +4 -1
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +8 -2
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +398 -66
- package/src/oauth/key-providers.ts +16 -0
- package/src/oauth/kimi.ts +16 -2
- package/src/oauth/kiro.ts +50 -6
- package/src/oauth/local-token-detect.ts +11 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/store.ts +119 -21
- package/src/oauth/token-guardian.ts +9 -3
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +22 -5
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +253 -6
- package/src/providers/fastwire.ts +501 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +1 -1
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +29 -0
- package/src/providers/quota.ts +1319 -38
- package/src/providers/registry.ts +1429 -111
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +42 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +11 -4
- package/src/reasoning-effort.ts +49 -1
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +220 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +7 -1
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +565 -27
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +366 -30
- package/src/routing/analytics.ts +378 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +267 -46
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +130 -56
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +159 -43
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +865 -181
- package/src/server/lifecycle.ts +284 -13
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +398 -103
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/combo-routes.ts +62 -24
- package/src/server/management/config-routes.ts +464 -51
- package/src/server/management/context.ts +80 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +101 -32
- package/src/server/management/model-routes.ts +189 -131
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +80 -4
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +764 -157
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +288 -32
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +115 -14
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +132 -5
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +82 -42
- package/src/server/relay.ts +236 -76
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log.ts +235 -22
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/collaboration.ts +204 -35
- package/src/server/responses/compact.ts +442 -55
- package/src/server/responses/core.ts +2872 -331
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +79 -4
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +39 -38
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1111 -90
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +845 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +104 -1236
- package/src/update/index.ts +32 -19
- package/src/update/job.ts +442 -67
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +268 -16
- package/src/usage/log.ts +606 -41
- package/src/usage/summary.ts +177 -9
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +9 -3
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +11 -3
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +279 -50
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
package/src/codex/quota.ts
CHANGED
|
@@ -2,13 +2,36 @@ import { existsSync, readFileSync, unlinkSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { atomicWriteFile, getConfigDir } from "../config";
|
|
4
4
|
import { captureConfigGeneration, type GenerationContext } from "../lib/state-store-sweeper";
|
|
5
|
+
import { isThirtyDayOnlyCodexPlan } from "./plan";
|
|
5
6
|
|
|
6
7
|
export type StoredAccountQuota = {
|
|
7
8
|
weeklyPercent?: number;
|
|
8
9
|
monthlyPercent?: number;
|
|
9
10
|
weeklyResetAt?: number;
|
|
10
11
|
monthlyResetAt?: number;
|
|
12
|
+
/**
|
|
13
|
+
* A sub-day burst window, when upstream declares one (#1791).
|
|
14
|
+
*
|
|
15
|
+
* K12 and similar plans enforce a rolling 5-hour limit ALONGSIDE the weekly one.
|
|
16
|
+
* Not folding it into `weeklyPercent` stopped the mislabeling, but dropping it
|
|
17
|
+
* entirely hides a limit that genuinely blocks the account: a 429 at 100% here is
|
|
18
|
+
* real even while the weekly quota is untouched.
|
|
19
|
+
*
|
|
20
|
+
* `shortWindowSeconds` is retained because the duration is the only thing that makes
|
|
21
|
+
* this window self-describing; the slot it arrived in is not stable across plans.
|
|
22
|
+
*/
|
|
23
|
+
shortPercent?: number;
|
|
24
|
+
shortResetAt?: number;
|
|
25
|
+
shortWindowSeconds?: number;
|
|
11
26
|
resetCredits?: number;
|
|
27
|
+
/**
|
|
28
|
+
* True when `monthlyPercent` came from an explicitly-monthly PRIMARY window —
|
|
29
|
+
* i.e. it is the account's governing quota reading, not a supplementary
|
|
30
|
+
* tertiary window. Tertiary-only monthly data lands in the same field but says
|
|
31
|
+
* nothing about the weekly quota that actually gates a non-Go/Free account,
|
|
32
|
+
* so recovery must be able to tell the two apart (#967 audit).
|
|
33
|
+
*/
|
|
34
|
+
monthlyIsPrimaryWindow?: boolean;
|
|
12
35
|
updatedAt: number;
|
|
13
36
|
};
|
|
14
37
|
|
|
@@ -28,7 +51,7 @@ let persistTimer: ReturnType<typeof setTimeout> | null = null;
|
|
|
28
51
|
|
|
29
52
|
export type WhamUsageResponse = {
|
|
30
53
|
email?: string | null;
|
|
31
|
-
plan_type?:
|
|
54
|
+
plan_type?: unknown;
|
|
32
55
|
rate_limit?: {
|
|
33
56
|
// Live WHAM payloads send explicit nulls for absent windows (issue #315 repro).
|
|
34
57
|
primary_window?: WhamUsageWindow | null;
|
|
@@ -47,6 +70,19 @@ type WhamUsageWindow = {
|
|
|
47
70
|
};
|
|
48
71
|
|
|
49
72
|
const MONTHLY_WINDOW_MIN_SECONDS = 28 * 24 * 60 * 60;
|
|
73
|
+
/**
|
|
74
|
+
* Shortest window still plausibly the WEEKLY quota (#1791).
|
|
75
|
+
*
|
|
76
|
+
* K12 and similar plans send a 5-hour primary window plus a 7-day secondary. Folding the
|
|
77
|
+
* primary into `weeklyPercent` reported the 5-hour bar as the weekly one and discarded the
|
|
78
|
+
* real weekly reading entirely, so the dashboard showed a window that reset every few hours
|
|
79
|
+
* and routing never saw the limit that actually gates the account.
|
|
80
|
+
*
|
|
81
|
+
* 24h is the discriminator: anything shorter is a burst window, not a weekly one. A window
|
|
82
|
+
* with no declared duration is unchanged, because older payloads omit `limit_window_seconds`
|
|
83
|
+
* and guessing there would break every legacy account.
|
|
84
|
+
*/
|
|
85
|
+
const WEEKLY_WINDOW_MIN_SECONDS = 24 * 60 * 60;
|
|
50
86
|
const MONTHLY_WINDOW_MIN_MINUTES = MONTHLY_WINDOW_MIN_SECONDS / 60;
|
|
51
87
|
|
|
52
88
|
const accountQuota = new Map<string, StoredAccountQuota>();
|
|
@@ -63,19 +99,72 @@ export const CODEX_UNKNOWN_USAGE_SCORE = 101;
|
|
|
63
99
|
export const CODEX_EXHAUSTED_USAGE_PERCENT = 100;
|
|
64
100
|
|
|
65
101
|
export function isCodexQuotaExhausted(
|
|
66
|
-
quota: Pick<StoredAccountQuota, "weeklyPercent" | "monthlyPercent"> | null,
|
|
67
|
-
plan?:
|
|
102
|
+
quota: Pick<StoredAccountQuota, "weeklyPercent" | "monthlyPercent" | "shortPercent"> | null,
|
|
103
|
+
plan?: unknown,
|
|
68
104
|
): boolean {
|
|
69
105
|
if (!quota) return false;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
106
|
+
// The burst window counts on EVERY plan. It is upstream-enforced independently, so an
|
|
107
|
+
// account at 100% there is blocked regardless of which longer window governs its plan;
|
|
108
|
+
// omitting it would route traffic straight into a 429 (#1791).
|
|
109
|
+
const values = codexQuotaWindowForPlan(plan) === "monthly"
|
|
110
|
+
? [quota.monthlyPercent, quota.shortPercent]
|
|
111
|
+
: [quota.weeklyPercent, quota.monthlyPercent, quota.shortPercent];
|
|
74
112
|
return values.some(value => typeof value === "number"
|
|
75
113
|
&& Number.isFinite(value)
|
|
76
114
|
&& value >= CODEX_EXHAUSTED_USAGE_PERCENT);
|
|
77
115
|
}
|
|
78
116
|
|
|
117
|
+
/**
|
|
118
|
+
* Which usage window a plan reports in. This is the SINGLE rule shared by quota
|
|
119
|
+
* parsing, exhaustion, and recovery — they must not diverge.
|
|
120
|
+
*
|
|
121
|
+
* An allowlist of "known" plans was tried here and was wrong: the upstream model
|
|
122
|
+
* snapshot alone carries 21 distinct plan strings (`edu_plus`, `finserv`, `k12`,
|
|
123
|
+
* `quorum`, `self_serve_business_usage_based`, ...), and `CodexAccount.plan` is an
|
|
124
|
+
* unrestricted string, so any list is a list of the plans someone remembered.
|
|
125
|
+
* Twelve real plans would have been refused recovery and stayed cooled forever —
|
|
126
|
+
* the very defect this unit exists to fix, reintroduced as a typo-shaped hole.
|
|
127
|
+
*
|
|
128
|
+
* The honest rule is the parser's own: Go and Free report a 30-day window,
|
|
129
|
+
* everything else (including an absent plan) reports weekly. Recovery reads the
|
|
130
|
+
* window the parser actually wrote rather than second-guessing it.
|
|
131
|
+
*/
|
|
132
|
+
export function codexQuotaWindowForPlan(plan?: unknown): "monthly" | "weekly" {
|
|
133
|
+
return isThirtyDayOnlyCodexPlan(plan) ? "monthly" : "weekly";
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function isCompleteCodexQuotaRecoverySnapshot(
|
|
137
|
+
quota: Pick<StoredAccountQuota, "weeklyPercent" | "monthlyPercent" | "monthlyIsPrimaryWindow" | "shortPercent"> | null,
|
|
138
|
+
plan?: unknown,
|
|
139
|
+
): boolean {
|
|
140
|
+
if (!quota || isCodexQuotaExhausted(quota, plan)) return false;
|
|
141
|
+
// Recovery still fails closed on MISSING EVIDENCE — a credits-only or windowless payload
|
|
142
|
+
// carries no usage reading at all and must never clear a cooldown. What it does not do is
|
|
143
|
+
// fail closed on an unfamiliar plan NAME, which only ever meant "cooled forever".
|
|
144
|
+
//
|
|
145
|
+
// The parser classifies windows by DURATION, not by plan name: a Team response whose
|
|
146
|
+
// primary window is explicitly monthly parses to monthlyPercent only (no secondary
|
|
147
|
+
// window exists), so requiring weeklyPercent because the plan is not go/free would
|
|
148
|
+
// strand exactly those accounts until their predicted expiry. Accept whichever window(s)
|
|
149
|
+
// the parser actually wrote; Go/Free never carry a weekly value, so monthly-only is
|
|
150
|
+
// required there.
|
|
151
|
+
//
|
|
152
|
+
// Audit correction: "the parser wrote monthlyPercent" is NOT by itself evidence for a
|
|
153
|
+
// weekly-quota plan. A tertiary-only response also writes monthlyPercent, and it says
|
|
154
|
+
// nothing about the weekly quota that actually gates a Team/Plus account — accepting it
|
|
155
|
+
// would clear the cooldown on a reading of a different window. Only an explicitly-monthly
|
|
156
|
+
// PRIMARY window is the governing reading, which is what `monthlyIsPrimaryWindow` records.
|
|
157
|
+
if (codexQuotaWindowForPlan(plan) === "monthly") {
|
|
158
|
+
return finitePercent(quota.monthlyPercent);
|
|
159
|
+
}
|
|
160
|
+
if (finitePercent(quota.weeklyPercent)) return true;
|
|
161
|
+
return quota.monthlyIsPrimaryWindow === true && finitePercent(quota.monthlyPercent);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function finitePercent(value: number | undefined): boolean {
|
|
165
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
166
|
+
}
|
|
167
|
+
|
|
79
168
|
export function normalizeUsagePercent(value: unknown): number | undefined {
|
|
80
169
|
const numeric = typeof value === "number"
|
|
81
170
|
? value
|
|
@@ -97,10 +186,19 @@ function normalizeResetAt(value: unknown): number | undefined {
|
|
|
97
186
|
}
|
|
98
187
|
|
|
99
188
|
function hasKnownQuotaValue(quota: Omit<StoredAccountQuota, "updatedAt">): boolean {
|
|
100
|
-
return [quota.weeklyPercent, quota.monthlyPercent]
|
|
189
|
+
return [quota.weeklyPercent, quota.monthlyPercent, quota.shortPercent]
|
|
101
190
|
.some(value => typeof value === "number" && Number.isFinite(value));
|
|
102
191
|
}
|
|
103
192
|
|
|
193
|
+
/** True only for a window that DECLARES a duration shorter than a day. */
|
|
194
|
+
function isExplicitShortWindow(window: WhamUsageWindow | null | undefined): boolean {
|
|
195
|
+
const seconds = window?.limit_window_seconds;
|
|
196
|
+
return typeof seconds === "number"
|
|
197
|
+
&& Number.isFinite(seconds)
|
|
198
|
+
&& seconds > 0
|
|
199
|
+
&& seconds < WEEKLY_WINDOW_MIN_SECONDS;
|
|
200
|
+
}
|
|
201
|
+
|
|
104
202
|
function isExplicitMonthlyWindow(window: WhamUsageWindow | null | undefined): boolean {
|
|
105
203
|
const seconds = window?.limit_window_seconds;
|
|
106
204
|
return typeof seconds === "number"
|
|
@@ -128,8 +226,14 @@ function snapshotHasMonthly(quota: Omit<StoredAccountQuota, "updatedAt">): boole
|
|
|
128
226
|
return quota.monthlyPercent !== undefined || quota.monthlyResetAt !== undefined;
|
|
129
227
|
}
|
|
130
228
|
|
|
229
|
+
function snapshotHasShort(quota: Omit<StoredAccountQuota, "updatedAt">): boolean {
|
|
230
|
+
return quota.shortPercent !== undefined
|
|
231
|
+
|| quota.shortResetAt !== undefined
|
|
232
|
+
|| quota.shortWindowSeconds !== undefined;
|
|
233
|
+
}
|
|
234
|
+
|
|
131
235
|
function snapshotHasUsage(quota: Omit<StoredAccountQuota, "updatedAt">): boolean {
|
|
132
|
-
return snapshotHasWeekly(quota) || snapshotHasMonthly(quota);
|
|
236
|
+
return snapshotHasWeekly(quota) || snapshotHasMonthly(quota) || snapshotHasShort(quota);
|
|
133
237
|
}
|
|
134
238
|
export function setAccountQuotaFromParsed(
|
|
135
239
|
accountId: string,
|
|
@@ -147,6 +251,10 @@ export function setAccountQuotaFromParsed(
|
|
|
147
251
|
if (existing?.weeklyResetAt !== undefined) next.weeklyResetAt = existing.weeklyResetAt;
|
|
148
252
|
if (existing?.monthlyPercent !== undefined) next.monthlyPercent = existing.monthlyPercent;
|
|
149
253
|
if (existing?.monthlyResetAt !== undefined) next.monthlyResetAt = existing.monthlyResetAt;
|
|
254
|
+
if (existing?.monthlyIsPrimaryWindow === true) next.monthlyIsPrimaryWindow = true;
|
|
255
|
+
if (existing?.shortPercent !== undefined) next.shortPercent = existing.shortPercent;
|
|
256
|
+
if (existing?.shortResetAt !== undefined) next.shortResetAt = existing.shortResetAt;
|
|
257
|
+
if (existing?.shortWindowSeconds !== undefined) next.shortWindowSeconds = existing.shortWindowSeconds;
|
|
150
258
|
next.resetCredits = quota.resetCredits;
|
|
151
259
|
accountQuota.set(accountId, next);
|
|
152
260
|
schedulePersistAccountQuotas();
|
|
@@ -166,9 +274,28 @@ export function setAccountQuotaFromParsed(
|
|
|
166
274
|
if (snapshotHasMonthly(quota)) {
|
|
167
275
|
if (quota.monthlyPercent !== undefined) next.monthlyPercent = quota.monthlyPercent;
|
|
168
276
|
if (quota.monthlyResetAt !== undefined) next.monthlyResetAt = quota.monthlyResetAt;
|
|
169
|
-
|
|
277
|
+
// Carry the provenance with the value it describes. Recovery reads `freshQuota` directly,
|
|
278
|
+
// so this is not on its path today — but a cached snapshot that kept `monthlyPercent`
|
|
279
|
+
// while silently dropping `monthlyIsPrimaryWindow` would look like tertiary-only data to
|
|
280
|
+
// any future reader, and that failure would be invisible.
|
|
281
|
+
if (quota.monthlyIsPrimaryWindow === true) next.monthlyIsPrimaryWindow = true;
|
|
282
|
+
} else if ((snapshotHasWeekly(quota) || snapshotHasShort(quota))
|
|
283
|
+
&& existing?.monthlyPercent !== undefined) {
|
|
170
284
|
next.monthlyPercent = existing.monthlyPercent;
|
|
171
285
|
if (existing.monthlyResetAt !== undefined) next.monthlyResetAt = existing.monthlyResetAt;
|
|
286
|
+
if (existing.monthlyIsPrimaryWindow === true) next.monthlyIsPrimaryWindow = true;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (snapshotHasShort(quota)) {
|
|
290
|
+
if (quota.shortPercent !== undefined) next.shortPercent = quota.shortPercent;
|
|
291
|
+
if (quota.shortResetAt !== undefined) next.shortResetAt = quota.shortResetAt;
|
|
292
|
+
if (quota.shortWindowSeconds !== undefined) next.shortWindowSeconds = quota.shortWindowSeconds;
|
|
293
|
+
} else {
|
|
294
|
+
// Header and reset-credit updates are partial snapshots. Preserve the last full WHAM
|
|
295
|
+
// burst tuple when those updates do not carry enough window metadata to replace it.
|
|
296
|
+
if (existing?.shortPercent !== undefined) next.shortPercent = existing.shortPercent;
|
|
297
|
+
if (existing?.shortResetAt !== undefined) next.shortResetAt = existing.shortResetAt;
|
|
298
|
+
if (existing?.shortWindowSeconds !== undefined) next.shortWindowSeconds = existing.shortWindowSeconds;
|
|
172
299
|
}
|
|
173
300
|
|
|
174
301
|
if (quota.resetCredits !== undefined) next.resetCredits = quota.resetCredits;
|
|
@@ -201,6 +328,10 @@ export function parseUpstreamQuotaHeaders(headers: Headers): Omit<StoredAccountQ
|
|
|
201
328
|
if (primaryPercent !== undefined) {
|
|
202
329
|
quota.monthlyPercent = primaryPercent;
|
|
203
330
|
if (primaryResetAt !== undefined) quota.monthlyResetAt = primaryResetAt;
|
|
331
|
+
// Same provenance rule as parseUsageQuota(): this monthly value is the governing
|
|
332
|
+
// primary window, not a supplementary tertiary one. Not on the recovery path today,
|
|
333
|
+
// but the two parsers must agree on what a bare monthlyPercent means.
|
|
334
|
+
quota.monthlyIsPrimaryWindow = true;
|
|
204
335
|
}
|
|
205
336
|
if (secondaryPercent !== undefined) {
|
|
206
337
|
quota.weeklyPercent = secondaryPercent;
|
|
@@ -253,8 +384,16 @@ export function updateAccountQuota(
|
|
|
253
384
|
const quota: StoredAccountQuota = {
|
|
254
385
|
...(existing?.weeklyPercent !== undefined ? { weeklyPercent: existing.weeklyPercent } : {}),
|
|
255
386
|
...(existing?.monthlyPercent !== undefined ? { monthlyPercent: existing.monthlyPercent } : {}),
|
|
387
|
+
// Carry provenance with the value it describes. Dropping it here would downgrade a proven
|
|
388
|
+
// explicit-primary reading to "unproven" on the next unrelated weekly update.
|
|
389
|
+
...(existing?.monthlyPercent !== undefined && existing.monthlyIsPrimaryWindow === true
|
|
390
|
+
? { monthlyIsPrimaryWindow: true }
|
|
391
|
+
: {}),
|
|
256
392
|
...(existing?.weeklyResetAt !== undefined ? { weeklyResetAt: existing.weeklyResetAt } : {}),
|
|
257
393
|
...(existing?.monthlyResetAt !== undefined ? { monthlyResetAt: existing.monthlyResetAt } : {}),
|
|
394
|
+
...(existing?.shortPercent !== undefined ? { shortPercent: existing.shortPercent } : {}),
|
|
395
|
+
...(existing?.shortResetAt !== undefined ? { shortResetAt: existing.shortResetAt } : {}),
|
|
396
|
+
...(existing?.shortWindowSeconds !== undefined ? { shortWindowSeconds: existing.shortWindowSeconds } : {}),
|
|
258
397
|
...(existing?.resetCredits !== undefined ? { resetCredits: existing.resetCredits } : {}),
|
|
259
398
|
updatedAt: Date.now(),
|
|
260
399
|
};
|
|
@@ -268,6 +407,10 @@ export function updateAccountQuota(
|
|
|
268
407
|
if (nextMonthly !== undefined) {
|
|
269
408
|
quota.monthlyPercent = nextMonthly;
|
|
270
409
|
if (nextMonthlyResetAt !== undefined) quota.monthlyResetAt = nextMonthlyResetAt;
|
|
410
|
+
// A caller-supplied monthly value arrives without window provenance, so it REPLACES the
|
|
411
|
+
// proven reading and must not inherit its flag — otherwise an unproven number would be
|
|
412
|
+
// treated as governing evidence.
|
|
413
|
+
delete quota.monthlyIsPrimaryWindow;
|
|
271
414
|
}
|
|
272
415
|
if (resetCredits !== undefined) quota.resetCredits = resetCredits;
|
|
273
416
|
|
|
@@ -367,7 +510,7 @@ export function parseUsageQuota(data: WhamUsageResponse): Omit<StoredAccountQuot
|
|
|
367
510
|
}
|
|
368
511
|
|
|
369
512
|
const quota: Omit<StoredAccountQuota, "updatedAt"> = {};
|
|
370
|
-
const thirtyDayOnly =
|
|
513
|
+
const thirtyDayOnly = codexQuotaWindowForPlan(data.plan_type) === "monthly";
|
|
371
514
|
const primaryWindow = data.rate_limit.primary_window;
|
|
372
515
|
const secondaryWindow = data.rate_limit.secondary_window;
|
|
373
516
|
const tertiaryWindow = data.rate_limit.tertiary_window;
|
|
@@ -386,10 +529,25 @@ export function parseUsageQuota(data: WhamUsageResponse): Omit<StoredAccountQuot
|
|
|
386
529
|
// - 선택한 방식: only an explicit primary duration of at least 28 days changes it to monthly.
|
|
387
530
|
// - 다른 대안 대신 이 방식을 선택한 이유: it accepts calendar-month variance and preserves legacy payloads.
|
|
388
531
|
// - 장점, 단점 및 영향: Team monthly quotas classify correctly; unknown durations remain weekly by design.
|
|
389
|
-
|
|
532
|
+
// #1791: a primary window that declares a sub-day duration is a burst window, not the
|
|
533
|
+
// weekly one. Skip it so the secondary (the real 7-day window) is what lands in
|
|
534
|
+
// `weeklyPercent`; without this the 5-hour bar was reported as weekly and the actual
|
|
535
|
+
// weekly reading was dropped on the floor.
|
|
536
|
+
const primaryIsShort = isExplicitShortWindow(primaryWindow);
|
|
537
|
+
const weeklyCandidatePercent = primaryIsShort ? undefined : primaryPercent;
|
|
538
|
+
const weeklyCandidateResetAt = primaryIsShort ? undefined : primaryResetAt;
|
|
539
|
+
// Keep the burst reading instead of dropping it on the floor: it is a real limit, and
|
|
540
|
+
// the account is blocked when it fills even though the weekly window is fine (#1791).
|
|
541
|
+
if (primaryIsShort && primaryPercent !== undefined) {
|
|
542
|
+
quota.shortPercent = primaryPercent;
|
|
543
|
+
if (primaryResetAt !== undefined) quota.shortResetAt = primaryResetAt;
|
|
544
|
+
const seconds = primaryWindow?.limit_window_seconds;
|
|
545
|
+
if (typeof seconds === "number" && Number.isFinite(seconds)) quota.shortWindowSeconds = seconds;
|
|
546
|
+
}
|
|
547
|
+
const weeklyPercent = primaryIsMonthly ? secondaryPercent : weeklyCandidatePercent ?? secondaryPercent;
|
|
390
548
|
const weeklyResetAt = primaryIsMonthly
|
|
391
549
|
? secondaryResetAt
|
|
392
|
-
:
|
|
550
|
+
: weeklyCandidatePercent !== undefined ? weeklyCandidateResetAt : secondaryResetAt;
|
|
393
551
|
const monthlyPercent = primaryIsMonthly ? primaryPercent ?? tertiaryPercent : tertiaryPercent;
|
|
394
552
|
const monthlyResetAt = primaryIsMonthly && primaryPercent !== undefined ? primaryResetAt : tertiaryResetAt;
|
|
395
553
|
if (thirtyDayOnly) {
|
|
@@ -404,6 +562,10 @@ export function parseUsageQuota(data: WhamUsageResponse): Omit<StoredAccountQuot
|
|
|
404
562
|
if (!thirtyDayOnly && monthlyPercent !== undefined) {
|
|
405
563
|
quota.monthlyPercent = monthlyPercent;
|
|
406
564
|
if (monthlyResetAt !== undefined) quota.monthlyResetAt = monthlyResetAt;
|
|
565
|
+
// Record WHERE this reading came from. Only an explicitly-monthly primary window is the
|
|
566
|
+
// account's governing quota; a tertiary window lands in the same field but describes a
|
|
567
|
+
// different period, so recovery must not treat the two as interchangeable.
|
|
568
|
+
if (primaryIsMonthly && primaryPercent !== undefined) quota.monthlyIsPrimaryWindow = true;
|
|
407
569
|
}
|
|
408
570
|
if (resetCredits !== undefined) quota.resetCredits = resetCredits;
|
|
409
571
|
|
package/src/codex/refresh.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { ComboCatalogOmission } from "./catalog/aggregation";
|
|
|
4
4
|
import { CODEX_MODELS_CACHE_PATH } from "./paths";
|
|
5
5
|
import { atomicWriteFile } from "../config";
|
|
6
6
|
import type { OcxConfig } from "../types";
|
|
7
|
+
import type { CodexCatalogSyncOptions } from "./catalog/sync";
|
|
7
8
|
|
|
8
9
|
export interface CodexCatalogRefreshResult {
|
|
9
10
|
added: number;
|
|
@@ -12,6 +13,8 @@ export interface CodexCatalogRefreshResult {
|
|
|
12
13
|
catalogWritten: boolean;
|
|
13
14
|
cacheSynced: boolean;
|
|
14
15
|
comboOmissions: ComboCatalogOmission[];
|
|
16
|
+
/** Desired OFF observed under K during the catalog commit; no cache write either. */
|
|
17
|
+
skippedReason?: "desired_disabled";
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
interface RefreshDeps {
|
|
@@ -40,14 +43,20 @@ export function syncCodexModelsCacheFromCatalog(catalogPath: string): void {
|
|
|
40
43
|
export async function refreshCodexModelCatalog(
|
|
41
44
|
config: OcxConfig,
|
|
42
45
|
deps: RefreshDeps = defaultDeps,
|
|
46
|
+
options?: CodexCatalogSyncOptions,
|
|
43
47
|
): Promise<CodexCatalogRefreshResult> {
|
|
44
|
-
const result = await deps.syncCatalogModels(config);
|
|
48
|
+
const result = await deps.syncCatalogModels(config, options);
|
|
45
49
|
const catalogExists = deps.existsSync(result.path);
|
|
46
50
|
const catalogWritten = result.catalogWritten === true;
|
|
47
51
|
const comboOmissions = result.comboOmissions ?? [];
|
|
52
|
+
if (result.skippedReason === "desired_disabled") {
|
|
53
|
+
// The commit path observed OFF under K. Invalidate nothing: rewriting the
|
|
54
|
+
// models cache here would be exactly the routed-cache write the skip refused.
|
|
55
|
+
return { ...result, catalogExists, catalogWritten: false, cacheSynced: false, comboOmissions };
|
|
56
|
+
}
|
|
48
57
|
if (!catalogExists) {
|
|
49
58
|
return { ...result, catalogExists, catalogWritten: false, cacheSynced: false, comboOmissions };
|
|
50
59
|
}
|
|
51
|
-
const cacheSynced = deps.invalidateCodexModelsCache();
|
|
60
|
+
const cacheSynced = deps.invalidateCodexModelsCache(options);
|
|
52
61
|
return { ...result, catalogExists, catalogWritten, cacheSynced, comboOmissions };
|
|
53
62
|
}
|