@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/claude/outbound.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - message_delta.usage is cumulative; message_start embeds a full message snapshot.
|
|
10
10
|
* - errors: {type:"error", error:{type,message}}; may arrive mid-stream after HTTP 200.
|
|
11
11
|
*/
|
|
12
|
+
import { createHash } from "node:crypto";
|
|
12
13
|
import { isTransientUpstreamStatus } from "../lib/upstream-retry";
|
|
13
14
|
import {
|
|
14
15
|
isTranslatorBudgetExceededError,
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
TranslatorBudgetExceededError,
|
|
17
18
|
type TranslatorBudget,
|
|
18
19
|
} from "../lib/translator-budget";
|
|
20
|
+
import { sseFieldOffset, sseFieldValue } from "../lib/sse-decoder";
|
|
19
21
|
|
|
20
22
|
type Rec = Record<string, unknown>;
|
|
21
23
|
|
|
@@ -23,6 +25,27 @@ function isRec(v: unknown): v is Rec {
|
|
|
23
25
|
return !!v && typeof v === "object" && !Array.isArray(v);
|
|
24
26
|
}
|
|
25
27
|
|
|
28
|
+
function reasoningIdentityDigest(value: string): string {
|
|
29
|
+
return createHash("sha256").update(value).digest("base64url");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Fixed-size identity that preserves protocol boundaries without retaining upstream strings. */
|
|
33
|
+
function boundedReasoningIdentity(value: unknown): string {
|
|
34
|
+
if (typeof value === "number") {
|
|
35
|
+
if (Number.isSafeInteger(value) && value >= 0) return `n${value}`;
|
|
36
|
+
if (Number.isFinite(value)) return `d${value}`;
|
|
37
|
+
return Number.isNaN(value) ? "dnan" : value > 0 ? "dinf" : "d-inf";
|
|
38
|
+
}
|
|
39
|
+
if (typeof value === "string") {
|
|
40
|
+
return `s${reasoningIdentityDigest(value)}`;
|
|
41
|
+
}
|
|
42
|
+
if (value === null) return "z";
|
|
43
|
+
if (typeof value === "boolean") return value ? "b1" : "b0";
|
|
44
|
+
if (Array.isArray(value)) return `a${reasoningIdentityDigest(JSON.stringify(value) ?? "[]")}`;
|
|
45
|
+
// Preserve the prior String(record) category semantics without serializing untrusted trees.
|
|
46
|
+
return typeof value === "object" ? "o" : "u";
|
|
47
|
+
}
|
|
48
|
+
|
|
26
49
|
function uuid(): string {
|
|
27
50
|
return crypto.randomUUID().replace(/-/g, "");
|
|
28
51
|
}
|
|
@@ -187,6 +210,8 @@ interface OpenBlock {
|
|
|
187
210
|
argsBufBytes?: number;
|
|
188
211
|
webSearchArgsEmitted?: boolean;
|
|
189
212
|
callId?: string;
|
|
213
|
+
/** Last fixed-size reasoning identity (item + summary/content index) seen by this block. */
|
|
214
|
+
reasoningPartKey?: string;
|
|
190
215
|
}
|
|
191
216
|
|
|
192
217
|
/** Streaming: Responses SSE bytes -> Anthropic Messages SSE bytes. */
|
|
@@ -242,14 +267,13 @@ export function responsesSseToAnthropicSse(
|
|
|
242
267
|
emit("message_start", { type: "message_start", message: messageSnapshot(model) });
|
|
243
268
|
emit("ping", { type: "ping" });
|
|
244
269
|
};
|
|
245
|
-
//
|
|
246
|
-
//
|
|
247
|
-
//
|
|
270
|
+
// Once a semantic Anthropic message has started, keepalive pings protect remote
|
|
271
|
+
// deployments behind LB/NAT idle timeouts. Transport-only Responses prelude frames
|
|
272
|
+
// must not manufacture a message before a possible initial error.
|
|
248
273
|
if (pingIntervalMs > 0) {
|
|
249
274
|
pingTimer = setInterval(() => {
|
|
250
|
-
if (terminated) return;
|
|
275
|
+
if (terminated || !started) return;
|
|
251
276
|
try {
|
|
252
|
-
ensureStarted();
|
|
253
277
|
emit("ping", { type: "ping" });
|
|
254
278
|
} catch { /* controller torn down; the read loop is ending anyway */ }
|
|
255
279
|
}, pingIntervalMs);
|
|
@@ -325,20 +349,24 @@ export function responsesSseToAnthropicSse(
|
|
|
325
349
|
))));
|
|
326
350
|
return;
|
|
327
351
|
}
|
|
328
|
-
ensureStarted();
|
|
329
|
-
closeOpenBlock();
|
|
330
352
|
const type = upstreamDerived && isTransientUpstreamStatus(status) ? "overloaded_error" : undefined;
|
|
353
|
+
if (!started) {
|
|
354
|
+
// An initial upstream failure is an Anthropic error stream, not a partial message.
|
|
355
|
+
// Do not manufacture message_start/ping before the terminal error.
|
|
356
|
+
emit("error", anthropicErrorBody(status, message, type, code));
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
closeOpenBlock();
|
|
331
360
|
emit("error", anthropicErrorBody(status, message, type, code));
|
|
332
361
|
};
|
|
333
362
|
|
|
334
363
|
const handleFrame = (eventName: string, data: Rec) => {
|
|
335
364
|
switch (eventName) {
|
|
336
365
|
case "response.created":
|
|
337
|
-
|
|
366
|
+
// Transport prelude only. Start Anthropic framing on semantic output or completion.
|
|
338
367
|
break;
|
|
339
368
|
case "response.heartbeat":
|
|
340
|
-
|
|
341
|
-
emit("ping", { type: "ping" });
|
|
369
|
+
if (started) emit("ping", { type: "ping" });
|
|
342
370
|
break;
|
|
343
371
|
case "response.output_text.delta": {
|
|
344
372
|
if (typeof data.delta !== "string" || data.delta.length === 0) break;
|
|
@@ -353,6 +381,24 @@ export function responsesSseToAnthropicSse(
|
|
|
353
381
|
case "response.reasoning_text.delta": {
|
|
354
382
|
if (typeof data.delta !== "string" || data.delta.length === 0) break;
|
|
355
383
|
ensureBlock("thinking");
|
|
384
|
+
// The JSON path joins reasoning summary/content parts with "\n\n"
|
|
385
|
+
// (responsesJsonToAnthropicMessage); mirror that at part and item boundaries
|
|
386
|
+
// so multi-part summaries do not glue into one run-on paragraph. Frames
|
|
387
|
+
// without part indices produce a constant key and never get a separator.
|
|
388
|
+
const slot = eventName === "response.reasoning_summary_text.delta"
|
|
389
|
+
? `s${boundedReasoningIdentity(data.summary_index)}`
|
|
390
|
+
: `c${boundedReasoningIdentity(data.content_index)}`;
|
|
391
|
+
// Upstream string metadata can be arbitrarily large. Hash strings into fixed-size
|
|
392
|
+
// components while retaining item and part equality, rather than dropping item_id and
|
|
393
|
+
// accidentally joining distinct malformed reasoning items.
|
|
394
|
+
const partKey = `${boundedReasoningIdentity(data.item_id)}:${slot}`;
|
|
395
|
+
if (open!.reasoningPartKey !== undefined && open!.reasoningPartKey !== partKey) {
|
|
396
|
+
emit("content_block_delta", {
|
|
397
|
+
type: "content_block_delta", index: open!.index,
|
|
398
|
+
delta: { type: "thinking_delta", thinking: "\n\n" },
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
open!.reasoningPartKey = partKey;
|
|
356
402
|
emit("content_block_delta", {
|
|
357
403
|
type: "content_block_delta", index: open!.index,
|
|
358
404
|
delta: { type: "thinking_delta", thinking: data.delta },
|
|
@@ -571,10 +617,16 @@ export function responsesSseToAnthropicSse(
|
|
|
571
617
|
while (lineStart <= rawFrame.length) {
|
|
572
618
|
const newline = rawFrame.indexOf("\n", lineStart);
|
|
573
619
|
const lineEnd = newline === -1 ? rawFrame.length : newline;
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
620
|
+
// The space after the colon is optional in text/event-stream (#1170);
|
|
621
|
+
// compute the value offset the same way sseFieldValue does, without
|
|
622
|
+
// slicing the line first — the byte accounting below is keyed to
|
|
623
|
+
// offsets into rawFrame.
|
|
624
|
+
const eventOffset = sseFieldOffset(rawFrame, lineStart, lineEnd, "event");
|
|
625
|
+
const dataOffset = sseFieldOffset(rawFrame, lineStart, lineEnd, "data");
|
|
626
|
+
if (eventOffset !== -1) {
|
|
627
|
+
eventName = rawFrame.slice(eventOffset, lineEnd).trim();
|
|
628
|
+
} else if (dataOffset !== -1) {
|
|
629
|
+
const fragmentStart = dataOffset;
|
|
578
630
|
const fragmentBytes = utf8SliceBytes(rawFrame, fragmentStart, lineEnd);
|
|
579
631
|
const fragmentReservation = translatorBudget.reserveTransient(fragmentBytes, { kind: "live_transient" });
|
|
580
632
|
let fragmentCommitted = false;
|
|
@@ -844,8 +896,10 @@ export async function collectAnthropicMessage(
|
|
|
844
896
|
let eventName = "";
|
|
845
897
|
let dataLine = "";
|
|
846
898
|
for (const line of rawFrame.split("\n")) {
|
|
847
|
-
|
|
848
|
-
|
|
899
|
+
const eventValue = sseFieldValue(line, "event");
|
|
900
|
+
if (eventValue !== null) { eventName = eventValue.trim(); continue; }
|
|
901
|
+
const dataValue = sseFieldValue(line, "data");
|
|
902
|
+
if (dataValue !== null) dataLine += dataValue;
|
|
849
903
|
}
|
|
850
904
|
if (!eventName || !dataLine) continue;
|
|
851
905
|
let data: unknown;
|
package/src/cli/account-api.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface AccountRow {
|
|
|
21
21
|
masked?: string;
|
|
22
22
|
active: boolean;
|
|
23
23
|
needsReauth?: boolean;
|
|
24
|
+
/** Codex pool selection order, higher used earlier. Absent where ordering does not apply. */
|
|
25
|
+
priority?: number;
|
|
24
26
|
quota?: CodexQuotaDto | null;
|
|
25
27
|
}
|
|
26
28
|
|
|
@@ -28,6 +30,17 @@ export type ClassifyResult = { type: AccountType } | { error: string };
|
|
|
28
30
|
|
|
29
31
|
export type AccountStdin = NodeJS.ReadableStream & { isTTY?: boolean };
|
|
30
32
|
|
|
33
|
+
export interface NativeMainLoginChild {
|
|
34
|
+
exited: Promise<number>;
|
|
35
|
+
kill(signal?: number | NodeJS.Signals): void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface StageLeaseClock {
|
|
39
|
+
now(): number;
|
|
40
|
+
setTimeout(callback: () => void, ms: number): ReturnType<typeof setTimeout>;
|
|
41
|
+
clearTimeout(timer: ReturnType<typeof setTimeout>): void;
|
|
42
|
+
}
|
|
43
|
+
|
|
31
44
|
export interface AccountDeps {
|
|
32
45
|
/** Test injection: skip findLiveProxy and call the API at this base URL. */
|
|
33
46
|
baseUrl?: string;
|
|
@@ -35,6 +48,16 @@ export interface AccountDeps {
|
|
|
35
48
|
loadConfigImpl?: () => OcxConfig;
|
|
36
49
|
stdinImpl?: AccountStdin;
|
|
37
50
|
stdinTimeoutMs?: number;
|
|
51
|
+
/** Internal test seam for the account-import POST; production is capped at ten minutes. */
|
|
52
|
+
importTimeoutMs?: number;
|
|
53
|
+
/** Test/platform injection for the official Codex login in a restricted staging home. */
|
|
54
|
+
spawnCodexLoginImpl?: (codexHome: string) => NativeMainLoginChild;
|
|
55
|
+
/** Legacy test seam. Production always uses the spawned child handle above. */
|
|
56
|
+
runCodexLoginImpl?: (codexHome: string) => Promise<number>;
|
|
57
|
+
/** Test-only heartbeat cadence floor. Production keeps the five-second floor. */
|
|
58
|
+
stageHeartbeatIntervalMinMs?: number;
|
|
59
|
+
/** Test-only clock for deterministic native-profile lease deadline coverage. */
|
|
60
|
+
stageLeaseClock?: StageLeaseClock;
|
|
38
61
|
}
|
|
39
62
|
|
|
40
63
|
export function classifyAccount(config: OcxConfig, name: string): ClassifyResult {
|
|
@@ -68,6 +91,7 @@ export async function apiJson(
|
|
|
68
91
|
method: "GET" | "PUT" | "POST" | "DELETE",
|
|
69
92
|
path: string,
|
|
70
93
|
body?: unknown,
|
|
94
|
+
options: { signal?: AbortSignal } = {},
|
|
71
95
|
): Promise<ApiResult> {
|
|
72
96
|
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
73
97
|
try {
|
|
@@ -75,6 +99,7 @@ export async function apiJson(
|
|
|
75
99
|
method,
|
|
76
100
|
headers: runningProxyUpdateHeaders(),
|
|
77
101
|
body: body === undefined ? undefined : JSON.stringify(body),
|
|
102
|
+
signal: options.signal,
|
|
78
103
|
});
|
|
79
104
|
const json = (await res.json().catch(() => ({}))) as Record<string, unknown>;
|
|
80
105
|
return { status: res.status, json };
|
|
@@ -98,6 +123,9 @@ export function proxyUnreachable(): number {
|
|
|
98
123
|
export function apiError(json: Record<string, unknown>, fallback: string): number {
|
|
99
124
|
const message = typeof json.error === "string" ? json.error : fallback;
|
|
100
125
|
console.error(`Error: ${message}`);
|
|
126
|
+
if (json.cleanupRequired === true) {
|
|
127
|
+
console.error("Warning: native-login staging cleanup is still required; run 'ocx account main doctor'.");
|
|
128
|
+
}
|
|
101
129
|
return 1;
|
|
102
130
|
}
|
|
103
131
|
|
|
@@ -117,6 +145,10 @@ export interface CodexQuotaDto {
|
|
|
117
145
|
monthlyPercent?: number;
|
|
118
146
|
weeklyResetAt?: number;
|
|
119
147
|
monthlyResetAt?: number;
|
|
148
|
+
/** Sub-day burst window, when upstream declares one (#1791). */
|
|
149
|
+
shortPercent?: number;
|
|
150
|
+
shortResetAt?: number;
|
|
151
|
+
shortWindowSeconds?: number;
|
|
120
152
|
}
|
|
121
153
|
|
|
122
154
|
export interface ProviderQuotaWindowDto {
|
|
@@ -148,13 +180,14 @@ interface CodexAccountDto {
|
|
|
148
180
|
plan?: string;
|
|
149
181
|
isMain?: boolean;
|
|
150
182
|
needsReauth?: boolean;
|
|
183
|
+
priority?: number;
|
|
151
184
|
quota?: CodexQuotaDto | null;
|
|
152
185
|
}
|
|
153
186
|
|
|
154
187
|
function projectQuota(quota: CodexQuotaDto | null | undefined): CodexQuotaDto | null {
|
|
155
188
|
if (!quota) return null;
|
|
156
189
|
const projected: CodexQuotaDto = {};
|
|
157
|
-
for (const key of ["weeklyPercent", "monthlyPercent", "weeklyResetAt", "monthlyResetAt"] as const) {
|
|
190
|
+
for (const key of ["weeklyPercent", "monthlyPercent", "weeklyResetAt", "monthlyResetAt", "shortPercent", "shortResetAt", "shortWindowSeconds"] as const) {
|
|
158
191
|
if (typeof quota[key] === "number" && Number.isFinite(quota[key])) projected[key] = quota[key];
|
|
159
192
|
}
|
|
160
193
|
return projected;
|
|
@@ -195,6 +228,7 @@ export async function fetchCodexRows(
|
|
|
195
228
|
plan: a.plan,
|
|
196
229
|
active: a.id === activeId,
|
|
197
230
|
needsReauth: a.needsReauth,
|
|
231
|
+
priority: typeof a.priority === "number" ? a.priority : 0,
|
|
198
232
|
...(forceRefresh ? { quota: projectQuota(a.quota) } : {}),
|
|
199
233
|
}));
|
|
200
234
|
return { rows, activeId, autoSwitchThreshold, status: 200 };
|
package/src/cli/account-auth.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { writeSync } from "node:fs";
|
|
2
|
+
import { warnIfCodexCatalogRefreshPending } from "./account-catalog-refresh";
|
|
1
3
|
import {
|
|
2
4
|
CliUsageError,
|
|
3
5
|
printData,
|
|
@@ -12,6 +14,22 @@ import {
|
|
|
12
14
|
type RuntimeApiDeps,
|
|
13
15
|
} from "./runtime-api";
|
|
14
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Write the whole block to fd 1 synchronously (#1007). `console.log` can
|
|
19
|
+
* buffer behind a pipe, which hid the authorization URL for the entire
|
|
20
|
+
* polling window under non-TTY stdout. A partial write loops; a zero-byte
|
|
21
|
+
* write is a hard failure, never silent progress.
|
|
22
|
+
*/
|
|
23
|
+
function writeStdoutFully(text: string): void {
|
|
24
|
+
const bytes = Buffer.from(text, "utf8");
|
|
25
|
+
let offset = 0;
|
|
26
|
+
while (offset < bytes.length) {
|
|
27
|
+
const written = writeSync(1, bytes, offset, bytes.length - offset);
|
|
28
|
+
if (written <= 0) throw new CliUsageError("failed to write login instructions to stdout");
|
|
29
|
+
offset += written;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
15
33
|
const USAGE = `Usage:
|
|
16
34
|
ocx account login <provider> [--id <account-id>] [--reauth] [--code -] [--no-wait] [--json]
|
|
17
35
|
ocx account code <provider> [--flow <flow-id>] [--json] (reads the code from stdin)
|
|
@@ -82,9 +100,14 @@ async function login(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
|
82
100
|
body: JSON.stringify({ ...(id ? { id } : {}), ...(reauth ? { reauth: true } : {}) }),
|
|
83
101
|
}, deps);
|
|
84
102
|
if (!wantsJson) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
103
|
+
// One atomic pre-poll block, flushed synchronously so a piped parent
|
|
104
|
+
// reads the URL before the polling window starts (#1007).
|
|
105
|
+
const block = [
|
|
106
|
+
start.url ? `Open this URL to sign in:\n${start.url}` : "",
|
|
107
|
+
start.instructions ?? "",
|
|
108
|
+
start.flowId ? `Flow: ${start.flowId}` : "",
|
|
109
|
+
].filter(line => line !== "").join("\n");
|
|
110
|
+
if (block) writeStdoutFully(`${block}\n`);
|
|
88
111
|
}
|
|
89
112
|
if (code && start.flowId) {
|
|
90
113
|
await runtimeRequest("/api/codex-auth/login/code", {
|
|
@@ -105,6 +128,7 @@ async function login(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
|
105
128
|
);
|
|
106
129
|
if (state.status === "done") {
|
|
107
130
|
printData(state, wantsJson, [`Logged in${state.email ? ` as ${String(state.email)}` : ""}.`]);
|
|
131
|
+
if (!wantsJson) warnIfCodexCatalogRefreshPending(state);
|
|
108
132
|
return;
|
|
109
133
|
}
|
|
110
134
|
if (state.status === "error" || state.status === "expired") {
|
|
@@ -120,9 +144,12 @@ async function login(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
|
120
144
|
body: JSON.stringify({ provider, addAccount: !reauth, ...(reauth && id ? { accountId: id, reauth: true } : {}) }),
|
|
121
145
|
}, deps);
|
|
122
146
|
if (!wantsJson) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
147
|
+
const block = [
|
|
148
|
+
start.url ? `Open this URL to sign in:\n${start.url}` : "",
|
|
149
|
+
start.instructions ?? "",
|
|
150
|
+
start.deviceCode ? `Device code: ${start.deviceCode}` : "",
|
|
151
|
+
].filter(line => line !== "").join("\n");
|
|
152
|
+
if (block) writeStdoutFully(`${block}\n`);
|
|
126
153
|
}
|
|
127
154
|
if (code) {
|
|
128
155
|
await runtimeRequest("/api/oauth/login/code", {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const CODEX_CATALOG_REFRESH_PENDING_WARNING =
|
|
2
|
+
"Warning: the account change was saved, but the Codex model catalog refresh is pending. Run 'ocx sync' to retry.";
|
|
3
|
+
|
|
4
|
+
/** Read only the public completion flag from an account mutation response. */
|
|
5
|
+
export function codexCatalogRefreshPending(value: unknown): boolean {
|
|
6
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return false;
|
|
7
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, "catalogRefreshPending");
|
|
8
|
+
return descriptor !== undefined && "value" in descriptor && descriptor.value === true;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Print fixed recovery guidance without reflecting server or account details. */
|
|
12
|
+
export function warnIfCodexCatalogRefreshPending(value: unknown): void {
|
|
13
|
+
if (codexCatalogRefreshPending(value)) console.error(CODEX_CATALOG_REFRESH_PENDING_WARNING);
|
|
14
|
+
}
|