@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
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
} from "../../combos";
|
|
27
27
|
import { isInjectionDebugEnabled } from "../../lib/debug-settings";
|
|
28
28
|
import { injectionDebugLog } from "../../lib/injection-debug-log";
|
|
29
|
-
import { modelInList, namespacedToolName } from "../../types";
|
|
29
|
+
import { modelInList, namespacedToolName, toolChoiceToolPredicate } from "../../types";
|
|
30
30
|
import type { AdapterEvent, OcxConfig, OcxParsedRequest, OcxProviderConfig, OcxProviderContinuationState, OcxUsage } from "../../types";
|
|
31
31
|
import {
|
|
32
32
|
forceRefreshOAuthAccessSnapshot,
|
|
@@ -96,23 +96,37 @@ import {
|
|
|
96
96
|
sanitizePassthroughHeaders,
|
|
97
97
|
} from "../relay";
|
|
98
98
|
import { hasResponsesItemIdRepair, relaySseWithResponsesItemIdRepair } from "../responses-item-id-repair";
|
|
99
|
-
import type { EffectiveSubagentRoster, SpawnAgentSurface } from "../../codex/catalog";
|
|
99
|
+
import type { EffectiveSubagentModel, EffectiveSubagentRoster, SpawnAgentSurface } from "../../codex/catalog";
|
|
100
100
|
import type { TranslatorBudget } from "../../lib/translator-budget";
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
export function buildToolBridgeMaps(parsed: OcxParsedRequest, budget?: TranslatorBudget): {
|
|
104
|
-
toolNsMap: Map<string, { namespace: string; name: string }>;
|
|
104
|
+
toolNsMap: Map<string, { namespace: string; name: string; freeform?: true }>;
|
|
105
|
+
declaredToolNames: Set<string>;
|
|
106
|
+
/** Declared parameter schema per request-visible tool name (#1611 integer repair). */
|
|
107
|
+
toolParameterSchemas: Map<string, Record<string, unknown>>;
|
|
105
108
|
freeformToolNames: Set<string>;
|
|
106
109
|
toolSearchToolNames: Set<string>;
|
|
107
110
|
} {
|
|
108
|
-
const toolNsMap = new Map<string, { namespace: string; name: string }>();
|
|
111
|
+
const toolNsMap = new Map<string, { namespace: string; name: string; freeform?: true }>();
|
|
112
|
+
const declaredToolNames = new Set<string>();
|
|
113
|
+
const toolParameterSchemas = new Map<string, Record<string, unknown>>();
|
|
109
114
|
const freeformToolNames = new Set<string>();
|
|
110
115
|
const toolSearchToolNames = new Set<string>();
|
|
111
|
-
|
|
116
|
+
const requestedTools = parsed.context.tools ?? [];
|
|
117
|
+
const toolAllowed = toolChoiceToolPredicate(parsed.options.toolChoice, requestedTools);
|
|
118
|
+
const authorizedTools = requestedTools.filter(toolAllowed);
|
|
119
|
+
for (const t of authorizedTools) {
|
|
120
|
+
// Upstream output is untrusted: only restore calls for tools the caller authorized.
|
|
121
|
+
const wireName = namespacedToolName(t.namespace, t.name);
|
|
122
|
+
budget?.chargeRetained(new TextEncoder().encode(wireName).byteLength, { kind: "retained_collectors" });
|
|
123
|
+
declaredToolNames.add(wireName);
|
|
124
|
+
// Retained by reference (the schema is already resident in parsed.context.tools),
|
|
125
|
+
// so this adds a map entry rather than a copy of every tool's parameters.
|
|
126
|
+
if (t.parameters && typeof t.parameters === "object") toolParameterSchemas.set(wireName, t.parameters);
|
|
112
127
|
if (t.namespace) {
|
|
113
|
-
const wireName = namespacedToolName(t.namespace, t.name);
|
|
114
128
|
budget?.chargeRetained(new TextEncoder().encode(JSON.stringify([wireName, t.namespace, t.name])).byteLength, { kind: "retained_collectors" });
|
|
115
|
-
toolNsMap.set(wireName, { namespace: t.namespace, name: t.name });
|
|
129
|
+
toolNsMap.set(wireName, { namespace: t.namespace, name: t.name, ...(t.freeform ? { freeform: true } : {}) });
|
|
116
130
|
}
|
|
117
131
|
if (t.freeform) {
|
|
118
132
|
budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
|
|
@@ -123,7 +137,30 @@ export function buildToolBridgeMaps(parsed: OcxParsedRequest, budget?: Translato
|
|
|
123
137
|
toolSearchToolNames.add(t.name);
|
|
124
138
|
}
|
|
125
139
|
}
|
|
126
|
-
|
|
140
|
+
// Some routed providers echo a bare tool_choice selector instead of the flattened catalog
|
|
141
|
+
// name. Accept only selectors the client actually sent and only when the full request catalog
|
|
142
|
+
// contains one tool with that logical name.
|
|
143
|
+
const choice = parsed.options.toolChoice;
|
|
144
|
+
const bareChoiceNames = new Set(
|
|
145
|
+
choice && typeof choice === "object"
|
|
146
|
+
? ("allowedTools" in choice ? choice.allowedTools : [choice.name])
|
|
147
|
+
: [],
|
|
148
|
+
);
|
|
149
|
+
const bareNameCounts = new Map<string, number>();
|
|
150
|
+
for (const t of requestedTools) {
|
|
151
|
+
bareNameCounts.set(t.name, (bareNameCounts.get(t.name) ?? 0) + 1);
|
|
152
|
+
}
|
|
153
|
+
for (const t of authorizedTools) {
|
|
154
|
+
if (!t.namespace || !bareChoiceNames.has(t.name) || bareNameCounts.get(t.name) !== 1 || declaredToolNames.has(t.name)) continue;
|
|
155
|
+
budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
|
|
156
|
+
declaredToolNames.add(t.name);
|
|
157
|
+
budget?.chargeRetained(new TextEncoder().encode(JSON.stringify([t.name, t.namespace, t.name])).byteLength, { kind: "retained_collectors" });
|
|
158
|
+
toolNsMap.set(t.name, { namespace: t.namespace, name: t.name, ...(t.freeform ? { freeform: true } : {}) });
|
|
159
|
+
if (t.parameters && typeof t.parameters === "object") {
|
|
160
|
+
toolParameterSchemas.set(t.name, t.parameters);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return { toolNsMap, declaredToolNames, toolParameterSchemas, freeformToolNames, toolSearchToolNames };
|
|
127
164
|
}
|
|
128
165
|
|
|
129
166
|
|
|
@@ -169,6 +206,7 @@ export function collabSurface(parsed: OcxParsedRequest): "v1" | "v2" | null {
|
|
|
169
206
|
|
|
170
207
|
export interface MultiAgentGuidanceOptions {
|
|
171
208
|
multiAgentGuidanceEnabled?: boolean;
|
|
209
|
+
codexAccountNamespace?: string;
|
|
172
210
|
injectionModel?: string;
|
|
173
211
|
injectionEffort?: string;
|
|
174
212
|
subagentModels?: string[];
|
|
@@ -183,7 +221,8 @@ export interface MultiAgentGuidanceDeps {
|
|
|
183
221
|
configuredModels: readonly string[],
|
|
184
222
|
surface: SpawnAgentSurface,
|
|
185
223
|
) => EffectiveSubagentRoster | Promise<EffectiveSubagentRoster>;
|
|
186
|
-
collectCatalogState?: () => { state: "fresh" | "stale" | "not_running" | "unknown" }
|
|
224
|
+
collectCatalogState?: () => { state: "fresh" | "stale" | "not_running" | "unknown" }
|
|
225
|
+
| Promise<{ state: "fresh" | "stale" | "not_running" | "unknown" }>;
|
|
187
226
|
}
|
|
188
227
|
|
|
189
228
|
async function defaultCollectCatalogState(): Promise<{ state: "fresh" | "stale" | "not_running" | "unknown" }> {
|
|
@@ -193,8 +232,8 @@ async function defaultCollectCatalogState(): Promise<{ state: "fresh" | "stale"
|
|
|
193
232
|
if (override === "fresh" || override === "stale" || override === "not_running" || override === "unknown") {
|
|
194
233
|
return { state: override };
|
|
195
234
|
}
|
|
196
|
-
const {
|
|
197
|
-
return
|
|
235
|
+
const { collectCodexAppServerCatalogStateForRequest } = await import("../../codex/app-server-processes");
|
|
236
|
+
return collectCodexAppServerCatalogStateForRequest();
|
|
198
237
|
}
|
|
199
238
|
|
|
200
239
|
|
|
@@ -207,6 +246,16 @@ export async function resolveEffectiveSubagentRoster(
|
|
|
207
246
|
return effectiveSubagentRoster(configuredModels, surface);
|
|
208
247
|
}
|
|
209
248
|
|
|
249
|
+
/** Reuse one parsed catalog snapshot across every roster projection for this request. */
|
|
250
|
+
async function createRequestScopedSubagentRosterResolver(): Promise<NonNullable<
|
|
251
|
+
MultiAgentGuidanceDeps["resolveEffectiveSubagentRoster"]
|
|
252
|
+
>> {
|
|
253
|
+
const { effectiveSubagentRoster, readCatalog, readCodexCatalogPath } = await import("../../codex/catalog");
|
|
254
|
+
const catalogEntries = readCatalog(readCodexCatalogPath())?.models ?? [];
|
|
255
|
+
return (configuredModels, surface) =>
|
|
256
|
+
effectiveSubagentRoster(configuredModels, surface, catalogEntries);
|
|
257
|
+
}
|
|
258
|
+
|
|
210
259
|
|
|
211
260
|
|
|
212
261
|
export async function multiAgentGuidanceText(
|
|
@@ -218,10 +267,14 @@ export async function multiAgentGuidanceText(
|
|
|
218
267
|
const {
|
|
219
268
|
injectionModel,
|
|
220
269
|
injectionEffort,
|
|
270
|
+
codexAccountNamespace,
|
|
221
271
|
subagentModels,
|
|
222
272
|
subagentModelFallback,
|
|
223
273
|
injectionPrompt,
|
|
224
274
|
} = options;
|
|
275
|
+
const activeAccountNamespace = codexAccountNamespace?.length
|
|
276
|
+
? codexAccountNamespace
|
|
277
|
+
: undefined;
|
|
225
278
|
const surface = collabSurface(parsed);
|
|
226
279
|
if (surface === null) return null;
|
|
227
280
|
|
|
@@ -231,9 +284,24 @@ export async function multiAgentGuidanceText(
|
|
|
231
284
|
// Codex cannot actually spawn makes spawn_agent reject the override, so
|
|
232
285
|
// suppress positive model claims while the state is stale or unknown.
|
|
233
286
|
const catalogState = await (deps.collectCatalogState ?? defaultCollectCatalogState)();
|
|
287
|
+
// #1354 / #1395: `collectCodexAppServerCatalogState()` folds every app-server
|
|
288
|
+
// owned by the current user into ONE global observation, and the inbound
|
|
289
|
+
// request carries no sender PID or catalog fingerprint. So a stale process A
|
|
290
|
+
// makes the global state `stale` even when this request came from a fresh
|
|
291
|
+
// process B, and `unknown` can be reached by a process-enumeration failure
|
|
292
|
+
// that says nothing about any particular server.
|
|
293
|
+
//
|
|
294
|
+
// Emitting "do not set model or reasoning_effort overrides" off that global
|
|
295
|
+
// observation prohibits options the active `spawn_agent` tool legitimately
|
|
296
|
+
// advertises, for a request we cannot attribute to the stale process. The
|
|
297
|
+
// safe behaviour is to withhold OpenCodex's own disk-derived claims —
|
|
298
|
+
// preferred model, roster, fallback, custom guidance — and stay silent about
|
|
299
|
+
// overrides, leaving the active tool schema authoritative.
|
|
300
|
+
//
|
|
301
|
+
// `fresh` and `not_running` are unchanged: there we can positively describe
|
|
302
|
+
// the catalog, so the guidance below still applies.
|
|
234
303
|
if (catalogState.state === "stale" || catalogState.state === "unknown") {
|
|
235
|
-
return
|
|
236
|
-
+ "model or reasoning_effort overrides until Codex restarts.</multi_agent_mode>";
|
|
304
|
+
return null;
|
|
237
305
|
}
|
|
238
306
|
// codex-rs supplies the Proactive text on v2; the proxy only adds model-designation
|
|
239
307
|
// guidance, and only when there is something concrete to designate: a configured
|
|
@@ -242,15 +310,51 @@ export async function multiAgentGuidanceText(
|
|
|
242
310
|
...(subagentModels ?? []),
|
|
243
311
|
...(injectionModel ? [injectionModel] : []),
|
|
244
312
|
];
|
|
245
|
-
const resolveRoster = deps.resolveEffectiveSubagentRoster
|
|
313
|
+
const resolveRoster = deps.resolveEffectiveSubagentRoster
|
|
314
|
+
?? await createRequestScopedSubagentRosterResolver();
|
|
246
315
|
const effective = await resolveRoster(configuredForGuidance, "v2");
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
316
|
+
// Resolve the roster and preferred roles independently so a bare native can project onto its
|
|
317
|
+
// generated account rows without making an unrelated provider/gpt-* row look equivalent.
|
|
318
|
+
// The intersection keeps both projections inside Codex's one global five-model window.
|
|
319
|
+
const candidateModels = new Set(effective.candidates.map(candidate => candidate.model));
|
|
320
|
+
const withinCandidateWindow = (candidate: EffectiveSubagentModel): boolean =>
|
|
321
|
+
candidateModels.has(candidate.model);
|
|
322
|
+
const configuredSubagents = subagentModels ?? [];
|
|
323
|
+
const subagentEffective = configuredSubagents.length > 0
|
|
324
|
+
? injectionModel
|
|
325
|
+
? await resolveRoster(configuredSubagents, "v2")
|
|
326
|
+
: effective
|
|
327
|
+
: undefined;
|
|
328
|
+
const preferredEffective = injectionModel
|
|
329
|
+
? configuredSubagents.length > 0
|
|
330
|
+
? await resolveRoster([injectionModel], "v2")
|
|
331
|
+
: effective
|
|
332
|
+
: undefined;
|
|
333
|
+
const explicitlyConfigured = (candidate: EffectiveSubagentModel): boolean =>
|
|
334
|
+
configuredSubagents.some(model =>
|
|
335
|
+
model.includes("/") && slugsEquivalent(model, candidate.model)
|
|
336
|
+
);
|
|
337
|
+
const allowedForCurrentRoute = (candidate: EffectiveSubagentModel): boolean =>
|
|
338
|
+
explicitlyConfigured(candidate)
|
|
339
|
+
|| !candidate.model.includes("/")
|
|
340
|
+
|| (activeAccountNamespace !== undefined
|
|
341
|
+
&& candidate.model.startsWith(`${activeAccountNamespace}/`));
|
|
342
|
+
const rosterModels = (subagentEffective?.advertised ?? [])
|
|
343
|
+
.filter(withinCandidateWindow)
|
|
344
|
+
.filter(allowedForCurrentRoute);
|
|
250
345
|
const roster = subagentRosterText(rosterModels);
|
|
251
|
-
const
|
|
252
|
-
|
|
346
|
+
const preferredCandidates = (preferredEffective?.advertised ?? []).filter(withinCandidateWindow);
|
|
347
|
+
const soleBarePreferred = preferredCandidates.length === 1
|
|
348
|
+
&& !preferredCandidates[0]!.model.includes("/")
|
|
349
|
+
? preferredCandidates[0]
|
|
253
350
|
: undefined;
|
|
351
|
+
const preferred = injectionModel?.includes("/")
|
|
352
|
+
? preferredCandidates[0]
|
|
353
|
+
: activeAccountNamespace
|
|
354
|
+
? preferredCandidates.find(candidate =>
|
|
355
|
+
candidate.model.startsWith(`${activeAccountNamespace}/`)
|
|
356
|
+
) ?? soleBarePreferred
|
|
357
|
+
: soleBarePreferred;
|
|
254
358
|
|
|
255
359
|
if (isInjectionDebugEnabled() && effective.excluded.length > 0) {
|
|
256
360
|
injectionDebugLog(`[opencodex] multi-agent guidance excluded: ${effective.excluded
|
|
@@ -260,7 +364,11 @@ export async function multiAgentGuidanceText(
|
|
|
260
364
|
const fallbackGuidance = subagentFallbackGuidanceText({ subagentModelFallback } as OcxConfig);
|
|
261
365
|
if (!injectionModel && roster === "" && fallbackGuidance === "") return null;
|
|
262
366
|
if (injectionPrompt) {
|
|
263
|
-
|
|
367
|
+
// Bare ids must resolve to a unique/current-route candidate. Preserve the legacy raw
|
|
368
|
+
// fallback only for explicit routed/account-qualified ids.
|
|
369
|
+
const promptModel = preferred?.model
|
|
370
|
+
?? (injectionModel?.includes("/") ? injectionModel : undefined);
|
|
371
|
+
return `<multi_agent_mode>${applyInjectionPlaceholders(injectionPrompt, promptModel, injectionEffort, roster, fallbackGuidance)}</multi_agent_mode>`;
|
|
264
372
|
}
|
|
265
373
|
if (!preferred && roster === "" && fallbackGuidance === "") return null;
|
|
266
374
|
let text = "When the active spawn_agent tool supports optional \"model\" or \"reasoning_effort\" overrides, "
|
|
@@ -323,32 +431,93 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
323
431
|
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
324
432
|
}
|
|
325
433
|
|
|
326
|
-
function
|
|
327
|
-
if (!isRecord(item) || item.type !== "message" || item.role !== "developer") return
|
|
328
|
-
if (!Array.isArray(item.content) || item.content.length !== 1) return
|
|
434
|
+
function generatedDeveloperText(item: unknown): string | undefined {
|
|
435
|
+
if (!isRecord(item) || item.type !== "message" || item.role !== "developer") return undefined;
|
|
436
|
+
if (!Array.isArray(item.content) || item.content.length !== 1) return undefined;
|
|
329
437
|
const [part] = item.content;
|
|
330
|
-
return isRecord(part) && part.type === "input_text" && part.text ===
|
|
438
|
+
return isRecord(part) && part.type === "input_text" && typeof part.text === "string"
|
|
439
|
+
? part.text
|
|
440
|
+
: undefined;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function isGeneratedDeveloperItem(item: unknown, text: string): boolean {
|
|
444
|
+
return generatedDeveloperText(item) === text;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function isDeveloperPrefixItem(item: unknown): boolean {
|
|
448
|
+
if (!isRecord(item)) return false;
|
|
449
|
+
if (item.type === "additional_tools") return item.role === "developer";
|
|
450
|
+
const type = item.type ?? (typeof item.role === "string" ? "message" : undefined);
|
|
451
|
+
return type === "message" && (item.role === "system" || item.role === "developer");
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
function leadingDeveloperPrefixLength(items: readonly unknown[]): number {
|
|
455
|
+
let index = 0;
|
|
456
|
+
while (index < items.length && isDeveloperPrefixItem(items[index])) index += 1;
|
|
457
|
+
return index;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function isConversationalItem(item: unknown): boolean {
|
|
461
|
+
if (!isRecord(item)) return false;
|
|
462
|
+
if (item.type === "agent_message") return true;
|
|
463
|
+
const type = item.type ?? (typeof item.role === "string" ? "message" : undefined);
|
|
464
|
+
return type === "message" && (item.role === "user" || item.role === "assistant");
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
function statefulRawInsertionIndex(items: readonly unknown[], replayPrefixLen: number): number {
|
|
468
|
+
for (let index = replayPrefixLen; index < items.length; index += 1) {
|
|
469
|
+
if (isConversationalItem(items[index])) return index;
|
|
470
|
+
}
|
|
471
|
+
const last = items[items.length - 1];
|
|
472
|
+
return isRecord(last) && last.type === "compaction_trigger"
|
|
473
|
+
? items.length - 1
|
|
474
|
+
: items.length;
|
|
331
475
|
}
|
|
332
476
|
|
|
333
477
|
export function injectDeveloperMessage(parsed: OcxParsedRequest, text: string): void {
|
|
334
478
|
const raw = parsed._rawBody as { input?: unknown } | undefined;
|
|
479
|
+
const rawInput = raw && Array.isArray(raw.input) ? raw.input : undefined;
|
|
480
|
+
const replayPrefixLen = rawInput
|
|
481
|
+
? Math.min(parsed._replayPrefixLen ?? 0, rawInput.length)
|
|
482
|
+
: 0;
|
|
335
483
|
const devItem = { type: "message", role: "developer", content: [{ type: "input_text", text }] };
|
|
336
|
-
if (
|
|
337
|
-
const
|
|
338
|
-
|
|
484
|
+
if (rawInput) {
|
|
485
|
+
const replayPrefix = rawInput.slice(0, replayPrefixLen);
|
|
486
|
+
const taggedGuidance = text.startsWith("<multi_agent_mode>") && text.endsWith("</multi_agent_mode>");
|
|
487
|
+
const lastTaggedGuidance = taggedGuidance
|
|
488
|
+
? replayPrefix.map(generatedDeveloperText)
|
|
489
|
+
.filter(item => item?.startsWith("<multi_agent_mode>") && item.endsWith("</multi_agent_mode>"))
|
|
490
|
+
.at(-1)
|
|
491
|
+
: undefined;
|
|
492
|
+
if (taggedGuidance ? lastTaggedGuidance === text : replayPrefix.some(item => isGeneratedDeveloperItem(item, text))) {
|
|
339
493
|
return;
|
|
340
494
|
}
|
|
341
495
|
}
|
|
342
496
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
497
|
+
const statefulContinuation = parsed.previousResponseId !== undefined;
|
|
498
|
+
const message = { role: "developer" as const, content: text, timestamp: Date.now() };
|
|
499
|
+
const statefulRawIndex = statefulContinuation && rawInput
|
|
500
|
+
? statefulRawInsertionIndex(rawInput, replayPrefixLen)
|
|
501
|
+
: undefined;
|
|
502
|
+
|
|
503
|
+
// A previous_response_id delta can begin with tool/protocol items. Keep those first, then place
|
|
504
|
+
// changed guidance before the current conversation. Stateless requests keep guidance in the prefix.
|
|
505
|
+
if (statefulContinuation) {
|
|
506
|
+
const index = Math.min(
|
|
507
|
+
parsed._continuationConversationMessageIndex ?? parsed.context.messages.length,
|
|
508
|
+
parsed.context.messages.length,
|
|
509
|
+
);
|
|
510
|
+
parsed.context.messages.splice(index, 0, message);
|
|
511
|
+
} else {
|
|
512
|
+
const prefixLen = parsed.context.messages.findIndex(item => item.role !== "developer");
|
|
513
|
+
parsed.context.messages.splice(prefixLen < 0 ? parsed.context.messages.length : prefixLen, 0, message);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
if (rawInput) {
|
|
517
|
+
if (statefulContinuation) {
|
|
518
|
+
rawInput.splice(statefulRawIndex!, 0, devItem);
|
|
350
519
|
} else {
|
|
351
|
-
|
|
520
|
+
rawInput.splice(leadingDeveloperPrefixLength(rawInput), 0, devItem);
|
|
352
521
|
}
|
|
353
522
|
}
|
|
354
523
|
}
|