@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/chat/inbound.ts
CHANGED
|
@@ -8,12 +8,25 @@
|
|
|
8
8
|
export class ChatCompletionsRequestError extends Error {}
|
|
9
9
|
|
|
10
10
|
type Rec = Record<string, unknown>;
|
|
11
|
+
type ChatCompletionsRoutingBody = Rec & { model: string; messages: unknown[] };
|
|
11
12
|
|
|
12
13
|
function isRec(v: unknown): v is Rec {
|
|
13
14
|
return !!v && typeof v === "object" && !Array.isArray(v);
|
|
14
15
|
}
|
|
15
16
|
|
|
17
|
+
/** Validate only the fields needed before Chat routing, without projecting the body. */
|
|
18
|
+
export function assertChatCompletionsRoutingBody(raw: unknown): asserts raw is ChatCompletionsRoutingBody {
|
|
19
|
+
if (!isRec(raw)) throw new ChatCompletionsRequestError("request body must be a JSON object");
|
|
20
|
+
if (typeof raw.model !== "string" || raw.model.length === 0) {
|
|
21
|
+
throw new ChatCompletionsRequestError("model is required");
|
|
22
|
+
}
|
|
23
|
+
if (!Array.isArray(raw.messages) || raw.messages.length === 0) {
|
|
24
|
+
throw new ChatCompletionsRequestError("messages must be a non-empty array");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
16
28
|
const OUTPUT_CONFIG_EFFORTS = new Set(["minimal", "low", "medium", "high", "xhigh", "max", "ultra"]);
|
|
29
|
+
const OUTPUT_CONFIG_SUMMARIES = new Set(["auto", "concise", "detailed", "none"]);
|
|
17
30
|
|
|
18
31
|
function contentToText(content: unknown): string {
|
|
19
32
|
if (typeof content === "string") return content;
|
|
@@ -86,17 +99,8 @@ function pushSystemText(parts: string[], content: unknown): void {
|
|
|
86
99
|
if (text) parts.push(text);
|
|
87
100
|
}
|
|
88
101
|
|
|
89
|
-
function toolCallsToItems(toolCalls: unknown, input: Rec[]): void {
|
|
102
|
+
function toolCallsToItems(toolCalls: unknown, input: Rec[], knownNameByCallId: Map<string, string>): void {
|
|
90
103
|
if (!Array.isArray(toolCalls)) return;
|
|
91
|
-
// Recover names from earlier function_call items in the same transcript when a client
|
|
92
|
-
// re-sends tool_calls with only id/arguments (replace-style merge lost function.name).
|
|
93
|
-
const knownNameByCallId = new Map<string, string>();
|
|
94
|
-
for (const item of input) {
|
|
95
|
-
if (!isRec(item) || item.type !== "function_call") continue;
|
|
96
|
-
if (typeof item.call_id === "string" && typeof item.name === "string" && item.name.length > 0) {
|
|
97
|
-
knownNameByCallId.set(item.call_id, item.name);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
104
|
for (const raw of toolCalls) {
|
|
101
105
|
if (!isRec(raw)) continue;
|
|
102
106
|
const fn = isRec(raw.function) ? raw.function : null;
|
|
@@ -205,21 +209,34 @@ function resolveReasoningEffort(raw: Rec): string | undefined {
|
|
|
205
209
|
return undefined;
|
|
206
210
|
}
|
|
207
211
|
|
|
212
|
+
/**
|
|
213
|
+
* Chat Completions clients (Grok Build, Copilot, OpenAI-compatible SDKs) expect
|
|
214
|
+
* `delta.reasoning_content` whenever the model thinks. The internal Responses
|
|
215
|
+
* parser hides thinking unless `reasoning.summary` is set and is not `"none"`.
|
|
216
|
+
* Map the common Chat Completions knobs onto that field. When the client only
|
|
217
|
+
* sent an effort, default the summary to `"auto"` so traces are not swallowed.
|
|
218
|
+
*/
|
|
219
|
+
function resolveReasoningSummary(raw: Rec): string | undefined {
|
|
220
|
+
if (isRec(raw.reasoning) && typeof raw.reasoning.summary === "string" && OUTPUT_CONFIG_SUMMARIES.has(raw.reasoning.summary)) {
|
|
221
|
+
return raw.reasoning.summary;
|
|
222
|
+
}
|
|
223
|
+
if (raw.include_reasoning === false) return "none";
|
|
224
|
+
if (raw.include_reasoning === true) return "auto";
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
|
|
208
228
|
/**
|
|
209
229
|
* Translate an OpenAI Chat Completions request body into a /v1/responses request body.
|
|
210
230
|
* Throws ChatCompletionsRequestError (-> 400) on malformed input.
|
|
211
231
|
*/
|
|
212
232
|
export function chatCompletionsToResponsesBody(raw: unknown): Rec {
|
|
213
|
-
|
|
214
|
-
if (typeof raw.model !== "string" || raw.model.length === 0) {
|
|
215
|
-
throw new ChatCompletionsRequestError("model is required");
|
|
216
|
-
}
|
|
217
|
-
if (!Array.isArray(raw.messages) || raw.messages.length === 0) {
|
|
218
|
-
throw new ChatCompletionsRequestError("messages must be a non-empty array");
|
|
219
|
-
}
|
|
233
|
+
assertChatCompletionsRoutingBody(raw);
|
|
220
234
|
|
|
221
235
|
const systemParts: string[] = [];
|
|
222
236
|
const input: Rec[] = [];
|
|
237
|
+
// Recover replace-style tool calls incrementally instead of rebuilding the
|
|
238
|
+
// call-id index from the entire translated transcript for every message.
|
|
239
|
+
const knownNameByCallId = new Map<string, string>();
|
|
223
240
|
|
|
224
241
|
for (const msg of raw.messages) {
|
|
225
242
|
if (!isRec(msg)) continue;
|
|
@@ -237,7 +254,7 @@ export function chatCompletionsToResponsesBody(raw: unknown): Rec {
|
|
|
237
254
|
case "assistant": {
|
|
238
255
|
const blocks = assistantContentToBlocks(msg.content);
|
|
239
256
|
if (blocks.length > 0) input.push({ type: "message", role: "assistant", content: blocks });
|
|
240
|
-
if (msg.tool_calls !== undefined) toolCallsToItems(msg.tool_calls, input);
|
|
257
|
+
if (msg.tool_calls !== undefined) toolCallsToItems(msg.tool_calls, input, knownNameByCallId);
|
|
241
258
|
break;
|
|
242
259
|
}
|
|
243
260
|
case "tool": {
|
|
@@ -282,11 +299,18 @@ export function chatCompletionsToResponsesBody(raw: unknown): Rec {
|
|
|
282
299
|
if (raw.stop !== undefined) body.stop = raw.stop;
|
|
283
300
|
if (typeof raw.user === "string") body.user = raw.user;
|
|
284
301
|
if (typeof raw.parallel_tool_calls === "boolean") body.parallel_tool_calls = raw.parallel_tool_calls;
|
|
302
|
+
if (typeof raw.service_tier === "string") body.service_tier = raw.service_tier;
|
|
285
303
|
if (typeof raw.prompt_cache_key === "string") body.prompt_cache_key = raw.prompt_cache_key;
|
|
286
304
|
if (raw.metadata !== undefined) body.metadata = raw.metadata;
|
|
287
305
|
|
|
288
306
|
const effort = resolveReasoningEffort(raw);
|
|
289
|
-
|
|
307
|
+
const summary = resolveReasoningSummary(raw);
|
|
308
|
+
if (effort || summary !== undefined) {
|
|
309
|
+
body.reasoning = {
|
|
310
|
+
...(effort ? { effort } : {}),
|
|
311
|
+
summary: summary ?? "auto",
|
|
312
|
+
};
|
|
313
|
+
}
|
|
290
314
|
|
|
291
315
|
const text = responseFormatToText(raw.response_format);
|
|
292
316
|
if (text) body.text = text;
|
package/src/chat/outbound.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
type Rec = Record<string, unknown>;
|
|
9
9
|
|
|
10
|
-
import { decodeServerSentEvents } from "../lib/sse-decoder";
|
|
10
|
+
import { decodeServerSentEvents, sseFieldValue } from "../lib/sse-decoder";
|
|
11
11
|
import { isTranslatorBudgetExceededError, type TranslatorBudget } from "../lib/translator-budget";
|
|
12
12
|
import { classifyError, CYBER_POLICY_ERROR_CODE, isCyberPolicyCode, isCyberPolicyMessage } from "../lib/errors";
|
|
13
13
|
|
|
@@ -319,7 +319,9 @@ export function responsesSseToChatCompletionsSse(
|
|
|
319
319
|
closeToolCalls();
|
|
320
320
|
try { void sseIterator?.return(undefined).catch(() => {}); } catch { /* already closed */ }
|
|
321
321
|
classified.code = "translation_buffer_limit";
|
|
322
|
-
|
|
322
|
+
// Provider-controlled overflow is an upstream failure on every path:
|
|
323
|
+
// streaming frame, collector, and defensive JSON agree on 502.
|
|
324
|
+
classified.type = "upstream_error";
|
|
323
325
|
} else if (isCyberPolicyCode(details?.code) || classified.code === CYBER_POLICY_ERROR_CODE) {
|
|
324
326
|
classified.code = CYBER_POLICY_ERROR_CODE;
|
|
325
327
|
classified.type = "invalid_request_error";
|
|
@@ -468,7 +470,7 @@ export function responsesSseToChatCompletionsSse(
|
|
|
468
470
|
fail(message, {
|
|
469
471
|
code,
|
|
470
472
|
...(code === "translation_buffer_limit"
|
|
471
|
-
? { status:
|
|
473
|
+
? { status: 502, type: "upstream_error" }
|
|
472
474
|
: { type, ...(code === CYBER_POLICY_ERROR_CODE ? { status: 400 } : {}) }),
|
|
473
475
|
});
|
|
474
476
|
break;
|
|
@@ -514,7 +516,7 @@ export function responsesSseToChatCompletionsSse(
|
|
|
514
516
|
if (isTranslatorBudgetExceededError(err)) {
|
|
515
517
|
upstreamAbort.abort(err);
|
|
516
518
|
closeToolCalls();
|
|
517
|
-
fail(err.message, { status:
|
|
519
|
+
fail(err.message, { status: 502, type: "upstream_error", code: err.code });
|
|
518
520
|
} else {
|
|
519
521
|
fail(err instanceof Error ? err.message : String(err));
|
|
520
522
|
}
|
|
@@ -629,6 +631,9 @@ export async function collectChatCompletion(
|
|
|
629
631
|
let content = "";
|
|
630
632
|
let reasoning = "";
|
|
631
633
|
const toolCalls = new Map<number, { id: string; name: string; arguments: string; argumentBytes: number }>();
|
|
634
|
+
// Per-call budget scopes (2 MiB/call enforced by the budget): the map key is the
|
|
635
|
+
// wire index, which is stable across deltas and present before the call id.
|
|
636
|
+
const callScope = (index: number) => `chat_collect_${index}`;
|
|
632
637
|
let finishReason = "stop";
|
|
633
638
|
let usage: unknown;
|
|
634
639
|
let streamError: ChatCompletionsStreamError | null = null;
|
|
@@ -648,9 +653,11 @@ export async function collectChatCompletion(
|
|
|
648
653
|
} catch (err) {
|
|
649
654
|
if (isChatCompletionsStreamError(err)) throw err;
|
|
650
655
|
if (isTranslatorBudgetExceededError(err)) {
|
|
656
|
+
// Provider-controlled overflow is an upstream failure, not a client
|
|
657
|
+
// request error: match the adapter/bridge contract (502 upstream_error).
|
|
651
658
|
throw new ChatCompletionsStreamError(err.message, {
|
|
652
|
-
status:
|
|
653
|
-
type: "
|
|
659
|
+
status: 502,
|
|
660
|
+
type: "upstream_error",
|
|
654
661
|
code: err.code,
|
|
655
662
|
});
|
|
656
663
|
}
|
|
@@ -664,8 +671,9 @@ export async function collectChatCompletion(
|
|
|
664
671
|
const rawFrame = buffer.slice(0, sep);
|
|
665
672
|
buffer = replaceRetained(buffer, buffer.slice(sep + 2), "live_transient");
|
|
666
673
|
for (const line of rawFrame.split("\n")) {
|
|
667
|
-
|
|
668
|
-
|
|
674
|
+
const rawData = sseFieldValue(line, "data");
|
|
675
|
+
if (rawData === null) continue;
|
|
676
|
+
const data = rawData.trim();
|
|
669
677
|
if (!data || data === "[DONE]") continue;
|
|
670
678
|
let parsed: unknown;
|
|
671
679
|
try { parsed = JSON.parse(data); } catch { continue; }
|
|
@@ -677,11 +685,15 @@ export async function collectChatCompletion(
|
|
|
677
685
|
const type = typeof parsed.error.type === "string" ? parsed.error.type : "server_error";
|
|
678
686
|
const code = typeof parsed.error.code === "string" ? parsed.error.code : null;
|
|
679
687
|
const status = code === "translation_buffer_limit"
|
|
680
|
-
?
|
|
688
|
+
? 502
|
|
681
689
|
: code === CYBER_POLICY_ERROR_CODE || isCyberPolicyMessage(message)
|
|
682
690
|
? 400
|
|
683
691
|
: streamErrorStatus(message);
|
|
684
|
-
streamError = new ChatCompletionsStreamError(message, {
|
|
692
|
+
streamError = new ChatCompletionsStreamError(message, {
|
|
693
|
+
status,
|
|
694
|
+
type: code === "translation_buffer_limit" ? "upstream_error" : type,
|
|
695
|
+
code,
|
|
696
|
+
});
|
|
685
697
|
continue;
|
|
686
698
|
}
|
|
687
699
|
if (parsed.usage) usage = parsed.usage;
|
|
@@ -697,7 +709,12 @@ export async function collectChatCompletion(
|
|
|
697
709
|
for (const tc of delta.tool_calls) {
|
|
698
710
|
if (!isRec(tc)) continue;
|
|
699
711
|
const index = typeof tc.index === "number" ? tc.index : 0;
|
|
700
|
-
|
|
712
|
+
let current = toolCalls.get(index);
|
|
713
|
+
if (!current) {
|
|
714
|
+
current = { id: "", name: "", arguments: "", argumentBytes: 0 };
|
|
715
|
+
toolCalls.set(index, current);
|
|
716
|
+
translatorBudget.openCall(callScope(index));
|
|
717
|
+
}
|
|
701
718
|
if (typeof tc.id === "string") current.id = tc.id;
|
|
702
719
|
const fn = isRec(tc.function) ? tc.function : {};
|
|
703
720
|
// Done-frame final arguments are authoritative last-write-wins snapshots.
|
|
@@ -707,27 +724,43 @@ export async function collectChatCompletion(
|
|
|
707
724
|
const nextBytes = replace
|
|
708
725
|
? Buffer.byteLength(fn.arguments)
|
|
709
726
|
: appendedUtf8Bytes(current.arguments, current.argumentBytes, fn.arguments);
|
|
710
|
-
const reservation = translatorBudget.reserveTransient(nextBytes, { kind: "
|
|
727
|
+
const reservation = translatorBudget.reserveTransient(nextBytes, { kind: "tool_args", callId: callScope(index) });
|
|
711
728
|
try {
|
|
712
729
|
current.arguments = replace ? fn.arguments : current.arguments + fn.arguments;
|
|
713
730
|
reservation.commitRetained();
|
|
714
|
-
translatorBudget.releaseRetained(current.argumentBytes, { kind: "
|
|
731
|
+
translatorBudget.releaseRetained(current.argumentBytes, { kind: "tool_args", callId: callScope(index) });
|
|
715
732
|
current.argumentBytes = nextBytes;
|
|
716
733
|
} catch (error) {
|
|
717
734
|
reservation.release();
|
|
718
735
|
throw error;
|
|
719
736
|
}
|
|
720
737
|
}
|
|
721
|
-
toolCalls.set(index, current);
|
|
722
738
|
}
|
|
723
739
|
}
|
|
724
740
|
}
|
|
725
741
|
}
|
|
726
742
|
}
|
|
743
|
+
} catch (error) {
|
|
744
|
+
// Never leak an open call scope on the error path; the turn budget's
|
|
745
|
+
// dispose is a backstop, not the owner of this transfer.
|
|
746
|
+
for (const index of toolCalls.keys()) translatorBudget.closeCall(callScope(index));
|
|
747
|
+
// Processing-time overflow (per-call or turn cap) gets the same typed
|
|
748
|
+
// contract as read-time overflow: 502 upstream_error.
|
|
749
|
+
if (isTranslatorBudgetExceededError(error)) {
|
|
750
|
+
throw new ChatCompletionsStreamError(error.message, {
|
|
751
|
+
status: 502,
|
|
752
|
+
type: "upstream_error",
|
|
753
|
+
code: error.code,
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
throw error;
|
|
727
757
|
} finally {
|
|
728
758
|
reader.releaseLock();
|
|
729
759
|
}
|
|
730
|
-
if (streamError)
|
|
760
|
+
if (streamError) {
|
|
761
|
+
for (const index of toolCalls.keys()) translatorBudget.closeCall(callScope(index));
|
|
762
|
+
throw streamError;
|
|
763
|
+
}
|
|
731
764
|
|
|
732
765
|
const message: Rec = {
|
|
733
766
|
role: "assistant",
|
|
@@ -735,17 +768,40 @@ export async function collectChatCompletion(
|
|
|
735
768
|
};
|
|
736
769
|
if (reasoning) message.reasoning_content = reasoning;
|
|
737
770
|
if (toolCalls.size > 0) {
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
771
|
+
// Final owner transfer is itself a charging operation: if it overflows,
|
|
772
|
+
// release every copy already charged in this loop and close every scope
|
|
773
|
+
// still open — the error must not escape as a raw budget exception.
|
|
774
|
+
const chargedCopies: number[] = [];
|
|
775
|
+
try {
|
|
776
|
+
message.tool_calls = [...toolCalls.entries()]
|
|
777
|
+
.sort((a, b) => a[0] - b[0])
|
|
778
|
+
.map(([index, tc]) => {
|
|
779
|
+
const copy = {
|
|
780
|
+
id: tc.id || `call_${uuid().slice(0, 16)}`,
|
|
781
|
+
type: "function",
|
|
782
|
+
function: { name: tc.name, arguments: tc.arguments },
|
|
783
|
+
};
|
|
784
|
+
const copyBytes = Buffer.byteLength(JSON.stringify(copy));
|
|
785
|
+
translatorBudget.chargeRetained(copyBytes, { kind: "retained_collectors" });
|
|
786
|
+
chargedCopies.push(copyBytes);
|
|
787
|
+
// The serialized owner is charged; release the per-call accumulation.
|
|
788
|
+
translatorBudget.closeCall(callScope(index));
|
|
789
|
+
return copy;
|
|
790
|
+
});
|
|
791
|
+
} catch (error) {
|
|
792
|
+
for (const copyBytes of chargedCopies) {
|
|
793
|
+
translatorBudget.releaseRetained(copyBytes, { kind: "retained_collectors" });
|
|
794
|
+
}
|
|
795
|
+
for (const index of toolCalls.keys()) translatorBudget.closeCall(callScope(index));
|
|
796
|
+
if (isTranslatorBudgetExceededError(error)) {
|
|
797
|
+
throw new ChatCompletionsStreamError(error.message, {
|
|
798
|
+
status: 502,
|
|
799
|
+
type: "upstream_error",
|
|
800
|
+
code: error.code,
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
throw error;
|
|
804
|
+
}
|
|
749
805
|
if (finishReason === "stop") finishReason = "tool_calls";
|
|
750
806
|
}
|
|
751
807
|
|
|
@@ -11,16 +11,17 @@
|
|
|
11
11
|
* Ownership contract: this module only creates/overwrites/deletes files matching
|
|
12
12
|
* `ocx-*.md` inside the agents dir. User-authored agents are never touched.
|
|
13
13
|
*/
|
|
14
|
-
import { lstatSync, mkdirSync, readdirSync, readFileSync,
|
|
14
|
+
import { lstatSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
15
15
|
import { join } from "node:path";
|
|
16
16
|
import type { OcxConfig } from "../types";
|
|
17
|
+
import { renameAtomicFile } from "../lib/windows-atomic-replace";
|
|
17
18
|
import { claudeCodeAlias, claudeCodeNativeAlias } from "./alias";
|
|
18
|
-
import {
|
|
19
|
+
import { AUTO_CONTEXT_OFF, shouldMarkOneMillion, stripOneMillionMarker, withOneMillionMarker } from "./context-windows";
|
|
19
20
|
import { claudeConfigDir } from "./gateway-cache";
|
|
20
21
|
import { DEFAULT_SUBAGENT_MODELS, hasOwnProvider } from "../config";
|
|
21
22
|
import { effectiveBlockedSkillNames, resolveInboundModel } from "./inbound";
|
|
22
23
|
import { knownModelIdsForProvider } from "../router";
|
|
23
|
-
import {
|
|
24
|
+
import { decodeRoutedModelIdOrThrow } from "../providers/slug-codec";
|
|
24
25
|
|
|
25
26
|
export interface ClaudeAgentDef {
|
|
26
27
|
file: string;
|
|
@@ -58,13 +59,34 @@ function pickerDefaultModel(configDir: string): string | null {
|
|
|
58
59
|
/** Roster entry -> alias + display parts. Entries are bare native slugs or "provider/id".
|
|
59
60
|
* Codex-facing encoded ids (`provider/vendor-model`) decode to the native slash id first
|
|
60
61
|
* so the alias joins the raw-native context-window map (context-windows.ts). */
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Generated subagent defs cannot rely on the parent's auto-context compaction
|
|
65
|
+
* pairing, so their [1m] marker follows the AUTHORITATIVE window only: mark when
|
|
66
|
+
* the effective window (exact selector, then the canonical [1m] form, then bare)
|
|
67
|
+
* is genuinely >= 1M; strip an inherited unsafe marker back to the bare selector;
|
|
68
|
+
* with no window information, keep the selector as it was. Genuine routed [1m]
|
|
69
|
+
* ids are preserved through the canonical-exact lookup. (#854)
|
|
70
|
+
*/
|
|
71
|
+
function withSubagentContextMarker(selector: string, windows: Record<string, number>): string {
|
|
72
|
+
const bare = stripOneMillionMarker(selector);
|
|
73
|
+
const wasMarked = selector !== bare;
|
|
74
|
+
const canonicalExact = wasMarked ? `${bare}[1m]` : selector;
|
|
75
|
+
const authoritativeWindow = windows[selector] ?? windows[canonicalExact] ?? windows[bare];
|
|
76
|
+
if (typeof authoritativeWindow === "number" && authoritativeWindow > 0) {
|
|
77
|
+
return shouldMarkOneMillion(authoritativeWindow, AUTO_CONTEXT_OFF)
|
|
78
|
+
? (withOneMillionMarker(selector, windows) ?? selector)
|
|
79
|
+
: bare;
|
|
80
|
+
}
|
|
81
|
+
return wasMarked ? selector : bare;
|
|
82
|
+
}
|
|
61
83
|
function entryParts(entry: string, config: OcxConfig): { alias: string; id: string; provider: string } {
|
|
62
84
|
const slash = entry.indexOf("/");
|
|
63
85
|
if (slash > 0) {
|
|
64
86
|
const provider = entry.slice(0, slash);
|
|
65
87
|
const prov = hasOwnProvider(config.providers, provider) ? config.providers[provider] : undefined;
|
|
66
88
|
const id = prov
|
|
67
|
-
?
|
|
89
|
+
? decodeRoutedModelIdOrThrow(entry.slice(slash + 1), knownModelIdsForProvider(provider, prov, config))
|
|
68
90
|
: entry.slice(slash + 1);
|
|
69
91
|
return { alias: claudeCodeAlias(provider, id), id, provider };
|
|
70
92
|
}
|
|
@@ -72,7 +94,6 @@ function entryParts(entry: string, config: OcxConfig): { alias: string; id: stri
|
|
|
72
94
|
}
|
|
73
95
|
|
|
74
96
|
export function buildClaudeAgentDefs(config: OcxConfig, windows: Record<string, number>, configDir = claudeConfigDir()): ClaudeAgentDef[] {
|
|
75
|
-
const auto = resolveAutoContext(config.claudeCode);
|
|
76
97
|
const blockedSkills = effectiveBlockedSkillNames(config.claudeCode);
|
|
77
98
|
const blockedSkillsFor = (model: string): readonly string[] => {
|
|
78
99
|
const unmarked = stripOneMillionMarker(model);
|
|
@@ -87,8 +108,10 @@ export function buildClaudeAgentDefs(config: OcxConfig, windows: Record<string,
|
|
|
87
108
|
const coveredModels = new Set<string>();
|
|
88
109
|
|
|
89
110
|
const push = (name: string, alias: string, description: string) => {
|
|
90
|
-
//
|
|
91
|
-
|
|
111
|
+
// Generated defs mark [1m] on the authoritative window only — never the
|
|
112
|
+
// main-session auto-context predicate (a 372K route marked [1m] would be
|
|
113
|
+
// accounted at 1M with no compaction safety net in the subagent).
|
|
114
|
+
const model = withSubagentContextMarker(alias, windows);
|
|
92
115
|
const bare = alias.toLowerCase();
|
|
93
116
|
if (coveredModels.has(bare)) return;
|
|
94
117
|
coveredModels.add(bare);
|
|
@@ -120,7 +143,7 @@ export function buildClaudeAgentDefs(config: OcxConfig, windows: Record<string,
|
|
|
120
143
|
// the next launch sync — documented limit. No resolvable default -> no self def.
|
|
121
144
|
const selfModel = pickerDefaultModel(configDir) ?? (config.claudeCode?.model?.trim() || null);
|
|
122
145
|
if (selfModel) {
|
|
123
|
-
const marked =
|
|
146
|
+
const marked = withSubagentContextMarker(selfModel, windows);
|
|
124
147
|
defs.push({
|
|
125
148
|
file: `${OWNED_PREFIX}self.md`,
|
|
126
149
|
name: `${OWNED_PREFIX}self`,
|
|
@@ -213,7 +236,7 @@ export function syncClaudeAgentDefs(defs: readonly ClaudeAgentDef[], configDir =
|
|
|
213
236
|
} catch { /* does not exist: ours to create */ }
|
|
214
237
|
const tmp = `${target}.tmp-${process.pid}`;
|
|
215
238
|
writeFileSync(tmp, renderAgentDef(def), { encoding: "utf8", mode: 0o644 });
|
|
216
|
-
|
|
239
|
+
renameAtomicFile(tmp, target, undefined, "claude-agents");
|
|
217
240
|
written.push(def.file);
|
|
218
241
|
}
|
|
219
242
|
return written;
|
|
@@ -10,12 +10,24 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { aliasForNative, aliasForRoute } from "./alias";
|
|
12
12
|
import { desktop3pAlias } from "./desktop-3p";
|
|
13
|
-
import { nativeOpenAiContextWindow, type CatalogModel } from "../codex/catalog";
|
|
13
|
+
import { nativeOpenAiContextWindow, type CatalogModel, type NativeContextLimitsInput } from "../codex/catalog";
|
|
14
14
|
|
|
15
15
|
const ONE_MILLION = 1_000_000;
|
|
16
16
|
|
|
17
|
-
/**
|
|
18
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Auto-context defaults (devlog 260712 020, user-approved).
|
|
19
|
+
*
|
|
20
|
+
* The compact window is the token count at which Claude Code starts compacting, and it is
|
|
21
|
+
* also the floor `shouldMarkOneMillion` uses — a model may only carry the marker if it can
|
|
22
|
+
* host this window. 350,000 was chosen when the widest native row advertised 372,000.
|
|
23
|
+
*
|
|
24
|
+
* It now matches the auto-compaction limit the Codex catalog ships for the same models
|
|
25
|
+
* (`nativeAutoCompactLimit`: 829,800 against the 922,000 native window). Leaving the two
|
|
26
|
+
* apart meant one model compacting at 350k under Claude Code and at 829,800 under Codex.
|
|
27
|
+
* The value stays clear of the measured 922,000 ceiling by ~92k, so compaction still has
|
|
28
|
+
* room to run before the upstream refuses.
|
|
29
|
+
*/
|
|
30
|
+
export const AUTO_COMPACT_WINDOW_DEFAULT = 829_800;
|
|
19
31
|
export const AUTO_CONTEXT_FLOOR = 200_000;
|
|
20
32
|
/** Binary-verified accepted range for CLAUDE_CODE_AUTO_COMPACT_WINDOW (2.1.207: pSo=1e5, yDs=1e6). */
|
|
21
33
|
export const AUTO_COMPACT_WINDOW_MIN = 100_000;
|
|
@@ -59,7 +71,7 @@ function inAutoCompactRange(value: number): boolean {
|
|
|
59
71
|
* predicate so marker and threshold never separate (audit 021 #2); an invalid
|
|
60
72
|
* value disables auto marking entirely (the CLI would ignore it, leaving marked
|
|
61
73
|
* sub-1M models without their safety net). Out-of-range CONFIG values fall back
|
|
62
|
-
* to
|
|
74
|
+
* to AUTO_COMPACT_WINDOW_DEFAULT (the management API rejects them; this guards hand-edits).
|
|
63
75
|
*/
|
|
64
76
|
export function resolveAutoContext(claudeCode: AutoContextConfigSlice | undefined, envOverride?: string): AutoContextMode {
|
|
65
77
|
if (claudeCode?.autoContext === false) return AUTO_CONTEXT_OFF;
|
|
@@ -89,6 +101,10 @@ export function shouldMarkOneMillion(window: number | undefined, auto: AutoConte
|
|
|
89
101
|
export function buildClaudeContextWindows(
|
|
90
102
|
nativeSlugs: readonly string[],
|
|
91
103
|
routedModels: readonly CatalogModel[],
|
|
104
|
+
// A configured providerContextCaps.openai has to reach the native rows here too. Without
|
|
105
|
+
// it the Claude surface keeps advertising the uncapped authoritative window while the
|
|
106
|
+
// Codex catalog advertises the capped one, and the two disagree about the same model.
|
|
107
|
+
nativeContextCap?: NativeContextLimitsInput,
|
|
92
108
|
): Record<string, number> {
|
|
93
109
|
const out: Record<string, number> = {};
|
|
94
110
|
const put = (key: string | null, value: number) => {
|
|
@@ -96,7 +112,7 @@ export function buildClaudeContextWindows(
|
|
|
96
112
|
if (out[key] === undefined) out[key] = value; // first-wins (registry policy)
|
|
97
113
|
};
|
|
98
114
|
for (const slug of nativeSlugs) {
|
|
99
|
-
const window = nativeOpenAiContextWindow(slug);
|
|
115
|
+
const window = nativeOpenAiContextWindow(slug, nativeContextCap);
|
|
100
116
|
if (typeof window !== "number" || window <= 0) continue;
|
|
101
117
|
put(slug, window);
|
|
102
118
|
put(desktop3pAlias("native", slug), window);
|