@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
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import net, { type Socket } from "node:net";
|
|
2
|
+
|
|
3
|
+
const DIRECT_LOCAL_HTTP_MAX_BYTES = 8 * 1024 * 1024;
|
|
4
|
+
const DIRECT_LOCAL_HTTP_TIMEOUT_MS = 10_000;
|
|
5
|
+
|
|
6
|
+
type DirectLocalHttpIo = {
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
connect?: (hostname: string, port: number) => Socket;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
function abortReason(signal: AbortSignal): Error {
|
|
12
|
+
if (signal.reason instanceof Error) return signal.reason;
|
|
13
|
+
const error = new Error("direct local HTTP request aborted");
|
|
14
|
+
error.name = "AbortError";
|
|
15
|
+
return error;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function headerBoundary(bytes: Buffer): number {
|
|
19
|
+
return bytes.indexOf("\r\n\r\n");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function validateTrailerLines(bytes: Buffer, start: number, end: number): void {
|
|
23
|
+
if (end === start) return;
|
|
24
|
+
for (const line of bytes.subarray(start, end).toString("latin1").split("\r\n")) {
|
|
25
|
+
if (line.indexOf(":") <= 0) {
|
|
26
|
+
throw new Error("direct local HTTP response has an invalid chunk trailer");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function decodeChunkedBody(body: Buffer): Buffer {
|
|
32
|
+
const chunks: Buffer[] = [];
|
|
33
|
+
let offset = 0;
|
|
34
|
+
for (;;) {
|
|
35
|
+
const lineEnd = body.indexOf("\r\n", offset);
|
|
36
|
+
if (lineEnd < 0) throw new Error("direct local HTTP response has a truncated chunk header");
|
|
37
|
+
const rawSize = body.subarray(offset, lineEnd).toString("ascii").split(";", 1)[0]?.trim() ?? "";
|
|
38
|
+
if (!/^[0-9a-f]+$/i.test(rawSize)) throw new Error("direct local HTTP response has an invalid chunk size");
|
|
39
|
+
const size = Number.parseInt(rawSize, 16);
|
|
40
|
+
offset = lineEnd + 2;
|
|
41
|
+
if (size === 0) {
|
|
42
|
+
if (body.length < offset + 2) throw new Error("direct local HTTP response has a truncated chunk trailer");
|
|
43
|
+
if (body[offset] !== 13 || body[offset + 1] !== 10) {
|
|
44
|
+
const trailerEnd = body.indexOf("\r\n\r\n", offset);
|
|
45
|
+
if (trailerEnd < 0) {
|
|
46
|
+
throw new Error("direct local HTTP response has a truncated chunk trailer");
|
|
47
|
+
}
|
|
48
|
+
validateTrailerLines(body, offset, trailerEnd);
|
|
49
|
+
if (trailerEnd + 4 !== body.length) {
|
|
50
|
+
throw new Error("direct local HTTP response has trailing bytes");
|
|
51
|
+
}
|
|
52
|
+
} else if (offset + 2 !== body.length) {
|
|
53
|
+
throw new Error("direct local HTTP response has trailing bytes");
|
|
54
|
+
}
|
|
55
|
+
return Buffer.concat(chunks);
|
|
56
|
+
}
|
|
57
|
+
if (!Number.isSafeInteger(size) || offset + size + 2 > body.length) {
|
|
58
|
+
throw new Error("direct local HTTP response has a truncated chunk body");
|
|
59
|
+
}
|
|
60
|
+
chunks.push(body.subarray(offset, offset + size));
|
|
61
|
+
offset += size;
|
|
62
|
+
if (body[offset] !== 13 || body[offset + 1] !== 10) {
|
|
63
|
+
throw new Error("direct local HTTP response has an invalid chunk terminator");
|
|
64
|
+
}
|
|
65
|
+
offset += 2;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
type ResponseFraming =
|
|
70
|
+
| { kind: "head"; searchFrom: number }
|
|
71
|
+
| { kind: "content-length"; totalBytes: number }
|
|
72
|
+
| { kind: "chunk-size"; offset: number; searchFrom: number }
|
|
73
|
+
| { kind: "chunk-body"; offset: number; size: number }
|
|
74
|
+
| { kind: "trailers"; offset: number; searchFrom: number }
|
|
75
|
+
| { kind: "close" }
|
|
76
|
+
| { kind: "complete" };
|
|
77
|
+
|
|
78
|
+
function parseResponseHead(bytes: Buffer, boundary: number): {
|
|
79
|
+
status: number;
|
|
80
|
+
statusText: string;
|
|
81
|
+
headers: Headers;
|
|
82
|
+
} {
|
|
83
|
+
const lines = bytes.subarray(0, boundary).toString("latin1").split("\r\n");
|
|
84
|
+
const statusLine = lines.shift() ?? "";
|
|
85
|
+
const match = /^HTTP\/1\.[01] ([0-9]{3})(?: (.*))?$/.exec(statusLine);
|
|
86
|
+
if (!match) throw new Error("direct local HTTP response has an invalid status line");
|
|
87
|
+
const status = Number(match[1]);
|
|
88
|
+
if (status < 200 || status > 599) throw new Error("direct local HTTP response has an unsupported status");
|
|
89
|
+
const headers = new Headers();
|
|
90
|
+
for (const line of lines) {
|
|
91
|
+
const colon = line.indexOf(":");
|
|
92
|
+
if (colon <= 0) throw new Error("direct local HTTP response has an invalid header");
|
|
93
|
+
headers.append(line.slice(0, colon).trim(), line.slice(colon + 1).trim());
|
|
94
|
+
}
|
|
95
|
+
return { status, statusText: match[2] ?? "", headers };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function advanceResponseFraming(bytes: Buffer, initial: ResponseFraming): ResponseFraming {
|
|
99
|
+
let framing = initial;
|
|
100
|
+
for (;;) {
|
|
101
|
+
if (framing.kind === "complete" || framing.kind === "close") return framing;
|
|
102
|
+
if (framing.kind === "head") {
|
|
103
|
+
const boundary = bytes.indexOf("\r\n\r\n", framing.searchFrom);
|
|
104
|
+
if (boundary < 0) {
|
|
105
|
+
if (bytes.length > 64 * 1024) throw new Error("direct local HTTP response headers exceed the byte cap");
|
|
106
|
+
return { kind: "head", searchFrom: Math.max(0, bytes.length - 3) };
|
|
107
|
+
}
|
|
108
|
+
const { status, headers } = parseResponseHead(bytes, boundary);
|
|
109
|
+
const bodyStart = boundary + 4;
|
|
110
|
+
if (status === 204 || status === 205 || status === 304) {
|
|
111
|
+
if (bytes.length > bodyStart) {
|
|
112
|
+
throw new Error("direct local HTTP response has a body for a bodyless status");
|
|
113
|
+
}
|
|
114
|
+
return { kind: "complete" };
|
|
115
|
+
}
|
|
116
|
+
if (/\bchunked\b/i.test(headers.get("transfer-encoding") ?? "")) {
|
|
117
|
+
framing = { kind: "chunk-size", offset: bodyStart, searchFrom: bodyStart };
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const rawLength = headers.get("content-length");
|
|
121
|
+
if (rawLength === null) return { kind: "close" };
|
|
122
|
+
if (!/^[0-9]+$/.test(rawLength)) throw new Error("direct local HTTP response has an invalid content length");
|
|
123
|
+
const length = Number(rawLength);
|
|
124
|
+
const totalBytes = bodyStart + length;
|
|
125
|
+
if (!Number.isSafeInteger(length) || totalBytes > DIRECT_LOCAL_HTTP_MAX_BYTES) {
|
|
126
|
+
throw new Error("direct local HTTP response exceeds the byte cap");
|
|
127
|
+
}
|
|
128
|
+
framing = { kind: "content-length", totalBytes };
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (framing.kind === "content-length") {
|
|
132
|
+
if (bytes.length > framing.totalBytes) {
|
|
133
|
+
throw new Error("direct local HTTP response has trailing bytes");
|
|
134
|
+
}
|
|
135
|
+
return bytes.length === framing.totalBytes ? { kind: "complete" } : framing;
|
|
136
|
+
}
|
|
137
|
+
if (framing.kind === "chunk-size") {
|
|
138
|
+
const lineEnd = bytes.indexOf("\r\n", framing.searchFrom);
|
|
139
|
+
if (lineEnd < 0) {
|
|
140
|
+
if (bytes.length - framing.offset > 8 * 1024) {
|
|
141
|
+
throw new Error("direct local HTTP response chunk header exceeds the byte cap");
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
...framing,
|
|
145
|
+
searchFrom: Math.max(framing.offset, bytes.length - 1),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const rawSize = bytes.subarray(framing.offset, lineEnd).toString("ascii").split(";", 1)[0]?.trim() ?? "";
|
|
149
|
+
if (!/^[0-9a-f]+$/i.test(rawSize)) throw new Error("direct local HTTP response has an invalid chunk size");
|
|
150
|
+
const size = Number.parseInt(rawSize, 16);
|
|
151
|
+
if (!Number.isSafeInteger(size) || size > DIRECT_LOCAL_HTTP_MAX_BYTES) {
|
|
152
|
+
throw new Error("direct local HTTP response chunk exceeds the byte cap");
|
|
153
|
+
}
|
|
154
|
+
const offset = lineEnd + 2;
|
|
155
|
+
framing = size === 0
|
|
156
|
+
? { kind: "trailers", offset, searchFrom: offset }
|
|
157
|
+
: { kind: "chunk-body", offset, size };
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (framing.kind === "chunk-body") {
|
|
161
|
+
const terminator = framing.offset + framing.size;
|
|
162
|
+
if (terminator + 2 > bytes.length) return framing;
|
|
163
|
+
if (bytes[terminator] !== 13 || bytes[terminator + 1] !== 10) {
|
|
164
|
+
throw new Error("direct local HTTP response has an invalid chunk terminator");
|
|
165
|
+
}
|
|
166
|
+
framing = { kind: "chunk-size", offset: terminator + 2, searchFrom: terminator + 2 };
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (bytes.length < framing.offset + 2) return framing;
|
|
170
|
+
if (bytes[framing.offset] === 13 && bytes[framing.offset + 1] === 10) {
|
|
171
|
+
if (bytes.length > framing.offset + 2) {
|
|
172
|
+
throw new Error("direct local HTTP response has trailing bytes");
|
|
173
|
+
}
|
|
174
|
+
return { kind: "complete" };
|
|
175
|
+
}
|
|
176
|
+
const trailerEnd = bytes.indexOf("\r\n\r\n", framing.searchFrom);
|
|
177
|
+
if (trailerEnd >= 0) {
|
|
178
|
+
validateTrailerLines(bytes, framing.offset, trailerEnd);
|
|
179
|
+
if (bytes.length > trailerEnd + 4) {
|
|
180
|
+
throw new Error("direct local HTTP response has trailing bytes");
|
|
181
|
+
}
|
|
182
|
+
return { kind: "complete" };
|
|
183
|
+
}
|
|
184
|
+
if (bytes.length - framing.offset > 64 * 1024) {
|
|
185
|
+
throw new Error("direct local HTTP response trailers exceed the byte cap");
|
|
186
|
+
}
|
|
187
|
+
return { ...framing, searchFrom: Math.max(framing.offset, bytes.length - 3) };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function parseResponse(bytes: Buffer): Response {
|
|
192
|
+
const boundary = headerBoundary(bytes);
|
|
193
|
+
if (boundary < 0) throw new Error("direct local HTTP response has no header boundary");
|
|
194
|
+
const { status, statusText, headers } = parseResponseHead(bytes, boundary);
|
|
195
|
+
|
|
196
|
+
let body = bytes.subarray(boundary + 4);
|
|
197
|
+
if (/\bchunked\b/i.test(headers.get("transfer-encoding") ?? "")) {
|
|
198
|
+
body = decodeChunkedBody(body);
|
|
199
|
+
headers.delete("transfer-encoding");
|
|
200
|
+
headers.delete("content-length");
|
|
201
|
+
} else {
|
|
202
|
+
const rawLength = headers.get("content-length");
|
|
203
|
+
if (rawLength !== null) {
|
|
204
|
+
if (!/^[0-9]+$/.test(rawLength)) throw new Error("direct local HTTP response has an invalid content length");
|
|
205
|
+
const length = Number(rawLength);
|
|
206
|
+
if (!Number.isSafeInteger(length) || body.byteLength < length) {
|
|
207
|
+
throw new Error("direct local HTTP response body is truncated");
|
|
208
|
+
}
|
|
209
|
+
body = body.subarray(0, length);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const bodyless = status === 204 || status === 205 || status === 304;
|
|
214
|
+
return new Response(bodyless ? null : new Uint8Array(body), {
|
|
215
|
+
status,
|
|
216
|
+
statusText,
|
|
217
|
+
headers,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Fetch one bodyless local HTTP GET or POST over a direct TCP connection.
|
|
223
|
+
*
|
|
224
|
+
* Bun's global fetch and Bun 1.3's node:http compatibility layer can honor
|
|
225
|
+
* HTTP(S)_PROXY. Local identity and capability probes must not expose headers
|
|
226
|
+
* to, or accept a fabricated response from, such a proxy. node:net connects to
|
|
227
|
+
* the selected listener without consulting proxy environment variables. Each
|
|
228
|
+
* caller retains an injected fetch seam for deterministic unit tests.
|
|
229
|
+
*/
|
|
230
|
+
export async function directLocalHttpFetch(
|
|
231
|
+
input: string | URL | Request,
|
|
232
|
+
init: RequestInit = {},
|
|
233
|
+
io: DirectLocalHttpIo = {},
|
|
234
|
+
): Promise<Response> {
|
|
235
|
+
const url = new URL(input instanceof Request ? input.url : String(input));
|
|
236
|
+
const method = (init.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
|
|
237
|
+
const signal = init.signal ?? (input instanceof Request ? input.signal : undefined);
|
|
238
|
+
const body = init.body ?? (input instanceof Request ? input.body : null);
|
|
239
|
+
|
|
240
|
+
if (url.protocol !== "http:") throw new Error("direct local request must use HTTP");
|
|
241
|
+
if (url.username || url.password) throw new Error("direct local request URL must not contain credentials");
|
|
242
|
+
if ((method !== "GET" && method !== "POST") || body !== null) {
|
|
243
|
+
throw new Error("direct local request must be a bodyless GET or POST");
|
|
244
|
+
}
|
|
245
|
+
if (signal?.aborted) throw abortReason(signal);
|
|
246
|
+
|
|
247
|
+
const headers = new Headers(init.headers ?? (input instanceof Request ? input.headers : undefined));
|
|
248
|
+
headers.delete("proxy-authorization");
|
|
249
|
+
headers.delete("proxy-connection");
|
|
250
|
+
if (method === "POST") headers.set("content-length", "0");
|
|
251
|
+
else headers.delete("content-length");
|
|
252
|
+
headers.set("host", url.host);
|
|
253
|
+
headers.set("connection", "close");
|
|
254
|
+
const headerLines: string[] = [];
|
|
255
|
+
headers.forEach((value, key) => { headerLines.push(`${key}: ${value}`); });
|
|
256
|
+
const requestBytes = Buffer.from(
|
|
257
|
+
`${method} ${url.pathname}${url.search} HTTP/1.1\r\n${headerLines.join("\r\n")}\r\n\r\n`,
|
|
258
|
+
"latin1",
|
|
259
|
+
);
|
|
260
|
+
const parsedHostname = url.hostname.startsWith("[") && url.hostname.endsWith("]")
|
|
261
|
+
? url.hostname.slice(1, -1)
|
|
262
|
+
: url.hostname;
|
|
263
|
+
const hostname = parsedHostname;
|
|
264
|
+
const port = url.port ? Number(url.port) : 80;
|
|
265
|
+
const timeoutMs = io.timeoutMs ?? DIRECT_LOCAL_HTTP_TIMEOUT_MS;
|
|
266
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
267
|
+
throw new Error("direct local HTTP timeout must be positive");
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return await new Promise<Response>((resolve, reject) => {
|
|
271
|
+
let socket: Socket | undefined;
|
|
272
|
+
let settled = false;
|
|
273
|
+
let receivedBytes = 0;
|
|
274
|
+
let responseBytes = Buffer.allocUnsafe(4 * 1024);
|
|
275
|
+
let framing: ResponseFraming = { kind: "head", searchFrom: 0 };
|
|
276
|
+
const cleanup = () => {
|
|
277
|
+
signal?.removeEventListener("abort", onAbort);
|
|
278
|
+
socket?.setTimeout(0);
|
|
279
|
+
};
|
|
280
|
+
const finish = (error?: Error) => {
|
|
281
|
+
if (settled) return;
|
|
282
|
+
settled = true;
|
|
283
|
+
cleanup();
|
|
284
|
+
try { socket?.destroy(); } catch { /* ignore */ }
|
|
285
|
+
if (error) {
|
|
286
|
+
reject(error);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
resolve(parseResponse(responseBytes.subarray(0, receivedBytes)));
|
|
291
|
+
} catch (parseError) {
|
|
292
|
+
reject(parseError instanceof Error ? parseError : new Error(String(parseError)));
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
const onAbort = () => {
|
|
296
|
+
const error = signal ? abortReason(signal) : new Error("direct local HTTP request aborted");
|
|
297
|
+
finish(error);
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
socket = (io.connect ?? ((host, selectedPort) => net.createConnection({
|
|
301
|
+
host,
|
|
302
|
+
port: selectedPort,
|
|
303
|
+
autoSelectFamily: true,
|
|
304
|
+
})))(hostname, port);
|
|
305
|
+
socket.setTimeout(timeoutMs, () => {
|
|
306
|
+
const error = new Error("direct local HTTP request timed out");
|
|
307
|
+
error.name = "TimeoutError";
|
|
308
|
+
finish(error);
|
|
309
|
+
});
|
|
310
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
311
|
+
if (signal?.aborted) {
|
|
312
|
+
onAbort();
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
socket.on("connect", () => {
|
|
316
|
+
try { socket?.write(requestBytes); } catch (error) {
|
|
317
|
+
finish(error instanceof Error ? error : new Error(String(error)));
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
socket.on("data", chunk => {
|
|
321
|
+
if (settled) return;
|
|
322
|
+
const bytes = Buffer.from(chunk);
|
|
323
|
+
receivedBytes += bytes.byteLength;
|
|
324
|
+
if (receivedBytes > DIRECT_LOCAL_HTTP_MAX_BYTES) {
|
|
325
|
+
finish(new Error("direct local HTTP response exceeds the byte cap"));
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (receivedBytes > responseBytes.byteLength) {
|
|
329
|
+
let capacity = responseBytes.byteLength;
|
|
330
|
+
while (capacity < receivedBytes) capacity = Math.min(DIRECT_LOCAL_HTTP_MAX_BYTES, capacity * 2);
|
|
331
|
+
const grown = Buffer.allocUnsafe(capacity);
|
|
332
|
+
responseBytes.copy(grown);
|
|
333
|
+
responseBytes = grown;
|
|
334
|
+
}
|
|
335
|
+
bytes.copy(responseBytes, receivedBytes - bytes.byteLength);
|
|
336
|
+
try {
|
|
337
|
+
framing = advanceResponseFraming(responseBytes.subarray(0, receivedBytes), framing);
|
|
338
|
+
if (framing.kind === "complete") finish();
|
|
339
|
+
} catch (error) {
|
|
340
|
+
finish(error instanceof Error ? error : new Error(String(error)));
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
socket.once("end", () => finish());
|
|
344
|
+
socket.once("error", error => finish(error));
|
|
345
|
+
socket.once("close", () => finish());
|
|
346
|
+
});
|
|
347
|
+
}
|
|
@@ -98,6 +98,24 @@ export function effortCapAppliesTo(
|
|
|
98
98
|
* validates against that backend. A custom responses provider (key mode) serving a
|
|
99
99
|
* native-looking bare id must NOT inherit the unrelated native ladder.
|
|
100
100
|
*/
|
|
101
|
+
/**
|
|
102
|
+
* Empty ladders mean "no effort control", not "this model cannot emit reasoning".
|
|
103
|
+
* Drop only `effort` so a Chat Completions `include_reasoning` / `reasoning.summary`
|
|
104
|
+
* request still reaches parseRequest and is not hidden by hideThinkingSummary.
|
|
105
|
+
*/
|
|
106
|
+
export function stripEmptyLadderEffort(
|
|
107
|
+
reasoning: unknown,
|
|
108
|
+
ladder: readonly string[] | undefined,
|
|
109
|
+
): unknown {
|
|
110
|
+
if (ladder === undefined || ladder.length > 0) return reasoning;
|
|
111
|
+
if (reasoning === undefined || reasoning === null || typeof reasoning !== "object" || Array.isArray(reasoning)) {
|
|
112
|
+
return reasoning;
|
|
113
|
+
}
|
|
114
|
+
const next = { ...(reasoning as Record<string, unknown>) };
|
|
115
|
+
delete next.effort;
|
|
116
|
+
return Object.keys(next).length > 0 ? next : undefined;
|
|
117
|
+
}
|
|
118
|
+
|
|
101
119
|
export function supportedLadderFor(route: { provider: OcxProviderConfig; modelId: string }): string[] | undefined {
|
|
102
120
|
const { provider, modelId } = route;
|
|
103
121
|
if (modelInList(provider.noReasoningModels, modelId)) return [];
|