@iislee/opencodex 2.11.0 → 2.35.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 +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -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 +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -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 +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- 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 +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- 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 +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- 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 +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- 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 +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- 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 +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- 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 +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- 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 +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -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 +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- 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 +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -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/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -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 +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -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 +360 -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 +622 -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 +675 -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 +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -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 +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -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 +157 -33
- package/src/images/plan.ts +24 -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-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -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/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- 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 +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- 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/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- 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/service-secrets.ts +15 -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 +253 -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 +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -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/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- 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/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -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 +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -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 +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -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 +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -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 +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -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 +155 -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 +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- 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 +1021 -190
- package/src/server/lifecycle.ts +336 -14
- 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 +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -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 +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -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 +289 -33
- 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 +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- 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/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -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 +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -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 +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -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 +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- 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 +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- 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 +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- 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 +27 -16
- 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 +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- 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/lib/pinned-http.ts
CHANGED
|
@@ -1,35 +1,63 @@
|
|
|
1
|
-
import http, { type IncomingMessage, type RequestOptions } from "node:http";
|
|
1
|
+
import http, { type ClientRequest, type IncomingMessage, type RequestOptions } from "node:http";
|
|
2
2
|
import https from "node:https";
|
|
3
3
|
|
|
4
4
|
export type PinnedAddress = { address: string; family: number };
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export type PinnedHttpErrorCode =
|
|
7
|
+
| "connect_timeout"
|
|
8
|
+
| "first_byte_timeout"
|
|
9
|
+
| "inactivity_timeout"
|
|
10
|
+
| "output_byte_limit";
|
|
11
|
+
|
|
12
|
+
export class PinnedHttpError extends Error {
|
|
13
|
+
override readonly name = "PinnedHttpError";
|
|
14
|
+
constructor(readonly code: PinnedHttpErrorCode, message: string) { super(message); }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface PinnedHttpRequestOptions {
|
|
7
18
|
headers?: HeadersInit;
|
|
8
19
|
maxBytes?: number;
|
|
20
|
+
/** Optional deadline for establishing the TCP connection and, for HTTPS, completing TLS. */
|
|
21
|
+
connectTimeoutMs?: number;
|
|
22
|
+
/** Optional deadline from connection establishment until response headers arrive. */
|
|
23
|
+
firstByteTimeoutMs?: number;
|
|
24
|
+
/** Optional maximum idle interval between response-body chunks. */
|
|
25
|
+
inactivityTimeoutMs?: number;
|
|
26
|
+
/** @deprecated Use firstByteTimeoutMs and inactivityTimeoutMs. */
|
|
9
27
|
idleTimeoutMs?: number;
|
|
10
28
|
rejectUnauthorized?: boolean;
|
|
11
29
|
context?: string;
|
|
12
30
|
}
|
|
13
31
|
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export function pinnedHttpGet(
|
|
32
|
+
/** @deprecated Use {@link PinnedHttpRequestOptions}. */
|
|
33
|
+
export type PinnedHttpGetOptions = PinnedHttpRequestOptions;
|
|
34
|
+
|
|
35
|
+
function pinnedHttpRequest(
|
|
19
36
|
url: string,
|
|
20
37
|
pinned: PinnedAddress,
|
|
38
|
+
method: "GET" | "POST",
|
|
39
|
+
body: string | undefined,
|
|
21
40
|
signal?: AbortSignal,
|
|
22
|
-
options?:
|
|
41
|
+
options?: PinnedHttpRequestOptions,
|
|
23
42
|
): Promise<Response> {
|
|
24
43
|
const parsed = new URL(url);
|
|
25
44
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
26
45
|
throw new Error(`${options?.context ?? "request"} must use HTTP or HTTPS, got ${parsed.protocol}`);
|
|
27
46
|
}
|
|
28
47
|
const context = options?.context ?? "request";
|
|
29
|
-
const
|
|
48
|
+
const connectTimeoutMs = options?.connectTimeoutMs;
|
|
49
|
+
const legacyIdleTimeoutMs = options?.idleTimeoutMs ?? 60_000;
|
|
50
|
+
const usesLegacyIdleTimeout = options?.firstByteTimeoutMs === undefined
|
|
51
|
+
&& options?.inactivityTimeoutMs === undefined;
|
|
52
|
+
const firstByteTimeoutMs = options?.firstByteTimeoutMs ?? legacyIdleTimeoutMs;
|
|
53
|
+
const inactivityTimeoutMs = options?.inactivityTimeoutMs ?? legacyIdleTimeoutMs;
|
|
54
|
+
const legacyFirstByteDisabled = usesLegacyIdleTimeout && legacyIdleTimeoutMs === 0;
|
|
30
55
|
const maxBytes = options?.maxBytes;
|
|
31
56
|
const headers = new Headers(options?.headers);
|
|
32
57
|
headers.set("host", parsed.host);
|
|
58
|
+
if (body !== undefined && !headers.has("content-length")) {
|
|
59
|
+
headers.set("content-length", String(Buffer.byteLength(body)));
|
|
60
|
+
}
|
|
33
61
|
const requestHeaders: Record<string, string> = {};
|
|
34
62
|
headers.forEach((value, key) => { requestHeaders[key] = value; });
|
|
35
63
|
|
|
@@ -40,18 +68,39 @@ export function pinnedHttpGet(
|
|
|
40
68
|
}
|
|
41
69
|
|
|
42
70
|
let settled = false;
|
|
71
|
+
let req: ClientRequest | undefined;
|
|
72
|
+
let connectTimer: ReturnType<typeof setTimeout> | undefined;
|
|
73
|
+
let firstByteTimer: ReturnType<typeof setTimeout> | undefined;
|
|
74
|
+
const clearConnectTimer = () => {
|
|
75
|
+
if (connectTimer !== undefined) clearTimeout(connectTimer);
|
|
76
|
+
connectTimer = undefined;
|
|
77
|
+
};
|
|
78
|
+
const clearFirstByteTimer = () => {
|
|
79
|
+
if (firstByteTimer !== undefined) clearTimeout(firstByteTimer);
|
|
80
|
+
firstByteTimer = undefined;
|
|
81
|
+
};
|
|
43
82
|
const fail = (error: unknown) => {
|
|
44
|
-
|
|
83
|
+
clearConnectTimer();
|
|
84
|
+
clearFirstByteTimer();
|
|
85
|
+
try { req?.destroy(); } catch { /* ignore */ }
|
|
45
86
|
if (settled) return;
|
|
46
87
|
settled = true;
|
|
47
88
|
reject(error instanceof Error ? error : new Error(String(error)));
|
|
48
89
|
};
|
|
90
|
+
const startFirstByteTimer = () => {
|
|
91
|
+
clearFirstByteTimer();
|
|
92
|
+
if (settled || legacyFirstByteDisabled) return;
|
|
93
|
+
firstByteTimer = setTimeout(
|
|
94
|
+
() => fail(new PinnedHttpError("first_byte_timeout", `${context} first byte timed out`)),
|
|
95
|
+
firstByteTimeoutMs,
|
|
96
|
+
);
|
|
97
|
+
};
|
|
49
98
|
const requestOptions: RequestOptions & { servername?: string } = {
|
|
50
99
|
protocol: parsed.protocol,
|
|
51
100
|
hostname: parsed.hostname,
|
|
52
101
|
port: parsed.port || (parsed.protocol === "https:" ? 443 : 80),
|
|
53
102
|
path: `${parsed.pathname}${parsed.search}`,
|
|
54
|
-
method
|
|
103
|
+
method,
|
|
55
104
|
headers: requestHeaders,
|
|
56
105
|
...(parsed.protocol === "https:"
|
|
57
106
|
? {
|
|
@@ -79,6 +128,8 @@ export function pinnedHttpGet(
|
|
|
79
128
|
};
|
|
80
129
|
|
|
81
130
|
const onResponse = (response: IncomingMessage) => {
|
|
131
|
+
clearConnectTimer();
|
|
132
|
+
clearFirstByteTimer();
|
|
82
133
|
const status = response.statusCode ?? 0;
|
|
83
134
|
const responseHeaders = new Headers();
|
|
84
135
|
for (const [key, value] of Object.entries(response.headers)) {
|
|
@@ -92,7 +143,7 @@ export function pinnedHttpGet(
|
|
|
92
143
|
|
|
93
144
|
if (status < 200 || status >= 300) {
|
|
94
145
|
try { response.destroy(); } catch { /* ignore */ }
|
|
95
|
-
try { req
|
|
146
|
+
try { req?.destroy(); } catch { /* ignore */ }
|
|
96
147
|
if (settled) return;
|
|
97
148
|
settled = true;
|
|
98
149
|
resolve(new Response(null, { status, headers: responseHeaders }));
|
|
@@ -102,32 +153,39 @@ export function pinnedHttpGet(
|
|
|
102
153
|
let received = 0;
|
|
103
154
|
const stream = new ReadableStream<Uint8Array>({
|
|
104
155
|
start(controller) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
156
|
+
let bodySettled = false;
|
|
157
|
+
const failBody = (error: Error) => {
|
|
158
|
+
if (bodySettled) return;
|
|
159
|
+
bodySettled = true;
|
|
108
160
|
try { controller.error(error); } catch { /* closed */ }
|
|
161
|
+
try { response.destroy(); } catch { /* ignore */ }
|
|
162
|
+
try { req?.destroy(); } catch { /* ignore */ }
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
response.setTimeout(inactivityTimeoutMs, () => {
|
|
166
|
+
failBody(new PinnedHttpError("inactivity_timeout", `${context} stalled`));
|
|
109
167
|
});
|
|
110
168
|
response.on("data", (chunk: Buffer | string) => {
|
|
169
|
+
if (bodySettled) return;
|
|
111
170
|
const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
112
171
|
received += buffer.byteLength;
|
|
113
172
|
if (maxBytes !== undefined && received > maxBytes) {
|
|
114
|
-
|
|
115
|
-
fail(error);
|
|
116
|
-
try { controller.error(error); } catch { /* closed */ }
|
|
173
|
+
failBody(new PinnedHttpError("output_byte_limit", `${context} exceeds ${maxBytes} byte cap`));
|
|
117
174
|
return;
|
|
118
175
|
}
|
|
119
176
|
try { controller.enqueue(buffer); } catch { /* closed */ }
|
|
120
177
|
});
|
|
121
178
|
response.on("end", () => {
|
|
179
|
+
if (bodySettled) return;
|
|
180
|
+
bodySettled = true;
|
|
122
181
|
try { controller.close(); } catch { /* closed */ }
|
|
123
182
|
});
|
|
124
183
|
response.on("error", (error: Error) => {
|
|
125
|
-
|
|
126
|
-
try { controller.error(error); } catch { /* closed */ }
|
|
184
|
+
failBody(error);
|
|
127
185
|
});
|
|
128
186
|
},
|
|
129
187
|
cancel() {
|
|
130
|
-
req
|
|
188
|
+
req?.destroy();
|
|
131
189
|
},
|
|
132
190
|
});
|
|
133
191
|
|
|
@@ -137,15 +195,76 @@ export function pinnedHttpGet(
|
|
|
137
195
|
};
|
|
138
196
|
|
|
139
197
|
const requestFn = parsed.protocol === "https:" ? https.request : http.request;
|
|
140
|
-
|
|
198
|
+
req = requestFn(requestOptions, onResponse);
|
|
199
|
+
if (usesLegacyIdleTimeout) startFirstByteTimer();
|
|
141
200
|
const onAbort = () => fail(signal?.reason instanceof Error ? signal.reason : new Error("aborted"));
|
|
142
|
-
|
|
143
|
-
|
|
201
|
+
req.on("socket", (socket) => {
|
|
202
|
+
const connectedEvent = parsed.protocol === "https:" ? "secureConnect" : "connect";
|
|
203
|
+
if (!socket.connecting) {
|
|
204
|
+
if (!usesLegacyIdleTimeout) startFirstByteTimer();
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (connectTimeoutMs !== undefined) {
|
|
208
|
+
connectTimer = setTimeout(
|
|
209
|
+
() => fail(new PinnedHttpError("connect_timeout", `${context} connect timed out`)),
|
|
210
|
+
connectTimeoutMs,
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
socket.once(connectedEvent, () => {
|
|
214
|
+
clearConnectTimer();
|
|
215
|
+
if (!usesLegacyIdleTimeout) startFirstByteTimer();
|
|
216
|
+
});
|
|
217
|
+
socket.once("error", () => {
|
|
218
|
+
clearConnectTimer();
|
|
219
|
+
clearFirstByteTimer();
|
|
220
|
+
});
|
|
221
|
+
socket.once("close", () => {
|
|
222
|
+
clearConnectTimer();
|
|
223
|
+
clearFirstByteTimer();
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
if (usesLegacyIdleTimeout) {
|
|
227
|
+
req.setTimeout(legacyIdleTimeoutMs, () => fail(new Error(`${context} timed out`)));
|
|
228
|
+
}
|
|
144
229
|
req.on("error", error => {
|
|
145
230
|
signal?.removeEventListener("abort", onAbort);
|
|
146
231
|
fail(error);
|
|
147
232
|
});
|
|
148
|
-
req.on("close", () =>
|
|
149
|
-
|
|
233
|
+
req.on("close", () => {
|
|
234
|
+
clearConnectTimer();
|
|
235
|
+
clearFirstByteTimer();
|
|
236
|
+
signal?.removeEventListener("abort", onAbort);
|
|
237
|
+
});
|
|
238
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
239
|
+
if (signal?.aborted && !settled) onAbort();
|
|
240
|
+
if (settled) return;
|
|
241
|
+
req.end(body);
|
|
150
242
|
});
|
|
151
243
|
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* GET a URL through one previously validated address. The original hostname
|
|
247
|
+
* remains authoritative for Host, SNI, and certificate verification.
|
|
248
|
+
*/
|
|
249
|
+
export function pinnedHttpGet(
|
|
250
|
+
url: string,
|
|
251
|
+
pinned: PinnedAddress,
|
|
252
|
+
signal?: AbortSignal,
|
|
253
|
+
options?: PinnedHttpRequestOptions,
|
|
254
|
+
): Promise<Response> {
|
|
255
|
+
return pinnedHttpRequest(url, pinned, "GET", undefined, signal, options);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* POST a string body through one previously validated address. The original
|
|
260
|
+
* hostname remains authoritative for Host, SNI, and certificate verification.
|
|
261
|
+
*/
|
|
262
|
+
export function pinnedHttpPost(
|
|
263
|
+
url: string,
|
|
264
|
+
pinned: PinnedAddress,
|
|
265
|
+
body: string,
|
|
266
|
+
signal?: AbortSignal,
|
|
267
|
+
options?: PinnedHttpRequestOptions,
|
|
268
|
+
): Promise<Response> {
|
|
269
|
+
return pinnedHttpRequest(url, pinned, "POST", body, signal, options);
|
|
270
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
|
-
import { loadConfig
|
|
2
|
+
import { loadConfig } from "../config";
|
|
3
|
+
import { readRuntimePort } from "../config/process-state";
|
|
3
4
|
import { configuredAdminToken } from "./admin-secrets";
|
|
4
5
|
|
|
5
6
|
export function isProcessAlive(pid: number): boolean {
|
|
@@ -52,6 +53,9 @@ export function gracefulStopHost(hostname: string | undefined): string {
|
|
|
52
53
|
*/
|
|
53
54
|
export type GracefulStopResult = boolean | "refused";
|
|
54
55
|
|
|
56
|
+
/** A proxy declined shutdown because a service under another home owns it (HTTP 409). */
|
|
57
|
+
export class ProxyOwnershipRefusedError extends Error {}
|
|
58
|
+
|
|
55
59
|
/**
|
|
56
60
|
* Ask a running proxy to stop itself via the management API (`POST /api/stop`), which
|
|
57
61
|
* drains in-flight turns, restores native Codex, and cleans its pid/runtime files.
|
|
@@ -110,7 +114,7 @@ export async function stopProxy(pid: number): Promise<void> {
|
|
|
110
114
|
if (graceful === "refused") {
|
|
111
115
|
// The proxy refused on purpose (foreign service owns it). Forcing would strip shared
|
|
112
116
|
// config while that service keeps the proxy alive.
|
|
113
|
-
throw new
|
|
117
|
+
throw new ProxyOwnershipRefusedError(
|
|
114
118
|
"The running proxy refused to stop: a service installed under a different "
|
|
115
119
|
+ "CODEX_HOME/OPENCODEX_HOME owns it. Run the stop from that home.",
|
|
116
120
|
);
|
|
@@ -6,17 +6,19 @@ import {
|
|
|
6
6
|
providerDestinationConfigError,
|
|
7
7
|
resolvePublicAddresses,
|
|
8
8
|
} from "./destination-policy";
|
|
9
|
-
import { pinnedHttpGet } from "./pinned-http";
|
|
9
|
+
import { pinnedHttpGet, pinnedHttpPost } from "./pinned-http";
|
|
10
10
|
import { outboundProxyConfigured } from "./proxy-env";
|
|
11
11
|
import { publicProviderBaseUrl } from "./provider-url";
|
|
12
12
|
|
|
13
13
|
type ProviderGetInit = Omit<RequestInit, "body" | "method" | "redirect">;
|
|
14
|
+
type ProviderPostInit = ProviderGetInit & { body: string };
|
|
14
15
|
type ProviderOutboundConfig = Pick<OcxProviderConfig, "baseUrl" | "allowPrivateNetwork"> & {
|
|
15
16
|
fetch?: typeof globalThis.fetch;
|
|
16
17
|
};
|
|
17
18
|
export interface ProviderOutboundDependencies {
|
|
18
19
|
resolveAddresses?: typeof resolvePublicAddresses;
|
|
19
20
|
pinnedGet?: typeof pinnedHttpGet;
|
|
21
|
+
pinnedPost?: typeof pinnedHttpPost;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
export class ProviderOutboundPolicyError extends Error {
|
|
@@ -102,13 +104,18 @@ export async function providerRedirectError(response: Response, requestUrl: stri
|
|
|
102
104
|
return `provider returned ${response.status} redirect to ${target}; configure the final provider URL directly`;
|
|
103
105
|
}
|
|
104
106
|
|
|
105
|
-
|
|
107
|
+
async function providerOutboundRequest(
|
|
106
108
|
name: string,
|
|
107
109
|
provider: ProviderOutboundConfig,
|
|
108
110
|
url: string,
|
|
109
|
-
|
|
111
|
+
method: "GET" | "POST",
|
|
112
|
+
init: ProviderGetInit | ProviderPostInit,
|
|
110
113
|
dependencies: ProviderOutboundDependencies = {},
|
|
111
114
|
): Promise<Response> {
|
|
115
|
+
const postUrl = method === "POST" ? new URL(url) : undefined;
|
|
116
|
+
if (postUrl?.protocol !== undefined && postUrl.protocol !== "https:") {
|
|
117
|
+
throw new ProviderOutboundPolicyError("provider POST URL must use HTTPS");
|
|
118
|
+
}
|
|
112
119
|
if (provider.fetch) {
|
|
113
120
|
// A caller-owned executor cannot be peer-pinned here. This branch keeps literal/config
|
|
114
121
|
// checks and redirect blocking, but does not provide the resolved-address guarantees of
|
|
@@ -128,18 +135,26 @@ export async function providerOutboundGet(
|
|
|
128
135
|
});
|
|
129
136
|
if (destinationError) throw new ProviderOutboundPolicyError(destinationError);
|
|
130
137
|
}
|
|
131
|
-
return provider.fetch(url, { ...init, method
|
|
138
|
+
return provider.fetch(url, { ...init, method, redirect: "manual" });
|
|
132
139
|
}
|
|
133
|
-
const parsed = new URL(url);
|
|
140
|
+
const parsed = postUrl ?? new URL(url);
|
|
134
141
|
const proxyConfigured = configuredProxyFor();
|
|
135
142
|
const resolveAddresses = dependencies.resolveAddresses ?? resolvePublicAddresses;
|
|
136
143
|
const pinnedGet = dependencies.pinnedGet ?? pinnedHttpGet;
|
|
144
|
+
const pinnedPost = dependencies.pinnedPost ?? pinnedHttpPost;
|
|
137
145
|
const allowPrivate = providerAllowsPrivateNetwork(name, provider);
|
|
138
146
|
let resolved: Awaited<ReturnType<typeof resolvePublicAddresses>>;
|
|
139
147
|
try {
|
|
140
148
|
resolved = await resolveAddresses(url, {
|
|
141
149
|
context: "provider URL",
|
|
142
150
|
allowPrivateNetwork: allowPrivate,
|
|
151
|
+
// Clash/Surge/Mihomo fake-IP DNS (198.18.0.0/15) answers are admitted only
|
|
152
|
+
// when this exact host will use the configured outbound proxy: the hostname
|
|
153
|
+
// then rides the proxy as an ordinary CONNECT instead of failing as a private
|
|
154
|
+
// destination or being pin-connected to the fake-IP (credit #1748). A NO_PROXY
|
|
155
|
+
// match is a direct route, so it keeps the benchmark answer rejected. Image/Lab
|
|
156
|
+
// fetch never passes this flag.
|
|
157
|
+
allowBenchmarkAddresses: proxyConfigured && !noProxyMatches(parsed),
|
|
143
158
|
});
|
|
144
159
|
} catch (error) {
|
|
145
160
|
const dnsResolutionFailed = error instanceof DestinationDnsResolutionError
|
|
@@ -150,11 +165,11 @@ export async function providerOutboundGet(
|
|
|
150
165
|
if (!proxyConfigured) throw error;
|
|
151
166
|
warnProxyBoundaryOnce();
|
|
152
167
|
warnProxyDnsDegradationOnce();
|
|
153
|
-
return globalThis.fetch(url, { ...init, method
|
|
168
|
+
return globalThis.fetch(url, { ...init, method, redirect: "manual" });
|
|
154
169
|
}
|
|
155
170
|
if (proxyConfigured && !resolved.privateNetwork) {
|
|
156
171
|
warnProxyBoundaryOnce();
|
|
157
|
-
return globalThis.fetch(url, { ...init, method
|
|
172
|
+
return globalThis.fetch(url, { ...init, method, redirect: "manual" });
|
|
158
173
|
}
|
|
159
174
|
if (proxyConfigured && resolved.privateNetwork && !noProxyMatches(parsed)) {
|
|
160
175
|
const hostname = normalizeProxyHostname(parsed.hostname);
|
|
@@ -162,9 +177,34 @@ export async function providerOutboundGet(
|
|
|
162
177
|
`provider URL resolves to a private-network destination; add ${hostname} to NO_PROXY before using allowPrivateNetwork with an outbound proxy`,
|
|
163
178
|
);
|
|
164
179
|
}
|
|
165
|
-
|
|
180
|
+
const requestOptions = {
|
|
166
181
|
headers: init.headers,
|
|
167
182
|
rejectUnauthorized: true,
|
|
168
183
|
context: "provider response",
|
|
169
|
-
}
|
|
184
|
+
};
|
|
185
|
+
const pinned = pickPinnedAddress(resolved.addresses);
|
|
186
|
+
if (method === "POST") {
|
|
187
|
+
return pinnedPost(url, pinned, (init as ProviderPostInit).body, init.signal ?? undefined, requestOptions);
|
|
188
|
+
}
|
|
189
|
+
return pinnedGet(url, pinned, init.signal ?? undefined, requestOptions);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export async function providerOutboundGet(
|
|
193
|
+
name: string,
|
|
194
|
+
provider: ProviderOutboundConfig,
|
|
195
|
+
url: string,
|
|
196
|
+
init: ProviderGetInit = {},
|
|
197
|
+
dependencies: ProviderOutboundDependencies = {},
|
|
198
|
+
): Promise<Response> {
|
|
199
|
+
return providerOutboundRequest(name, provider, url, "GET", init, dependencies);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export async function providerOutboundPost(
|
|
203
|
+
name: string,
|
|
204
|
+
provider: ProviderOutboundConfig,
|
|
205
|
+
url: string,
|
|
206
|
+
init: ProviderPostInit,
|
|
207
|
+
dependencies: ProviderOutboundDependencies = {},
|
|
208
|
+
): Promise<Response> {
|
|
209
|
+
return providerOutboundRequest(name, provider, url, "POST", init, dependencies);
|
|
170
210
|
}
|