@iislee/opencodex 2.11.0 → 2.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +114 -19
- package/bin/ocx.mjs +164 -36
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-BF38heuV.js +104 -0
- package/gui/dist/assets/index-DMiI18Kv.css +1 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +19 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +376 -52
- package/src/adapters/base.ts +54 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +129 -6
- package/src/adapters/cursor/discovery.ts +61 -4
- package/src/adapters/cursor/effort-map.ts +27 -3
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +174 -58
- package/src/adapters/cursor/live-transport.ts +609 -170
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +0 -1
- package/src/adapters/cursor/native-exec.ts +101 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +383 -65
- package/src/adapters/cursor/request-builder.ts +237 -31
- package/src/adapters/cursor/tool-definitions.ts +242 -12
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +28 -1
- package/src/adapters/cursor.ts +133 -7
- package/src/adapters/google-antigravity-replay.ts +558 -34
- package/src/adapters/google-antigravity-wire.ts +43 -10
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +618 -74
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +10 -1
- package/src/adapters/kiro.ts +92 -54
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1311 -336
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +830 -56
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +104 -21
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +428 -61
- package/src/chat/inbound.ts +43 -19
- package/src/chat/outbound.ts +82 -26
- package/src/claude/agents-inject.ts +32 -9
- package/src/claude/context-windows.ts +21 -5
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +70 -16
- package/src/cli/account-api.ts +35 -1
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +389 -2
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +30 -6
- package/src/cli/agent.ts +45 -1
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +29 -4
- package/src/cli/claude.ts +103 -34
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +593 -0
- package/src/cli/doctor.ts +315 -43
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +20 -271
- package/src/cli/index.ts +378 -519
- package/src/cli/init.ts +4 -17
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +35 -2
- package/src/cli/models.ts +100 -14
- package/src/cli/observe.ts +92 -3
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +18 -1
- package/src/cli/provider.ts +24 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +437 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +6 -3
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +10 -3
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/v2.ts +105 -10
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1358 -21
- package/src/codex/account-label.ts +14 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +493 -106
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +849 -242
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +345 -32
- package/src/codex/autostart-health.ts +8 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +68 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +121 -30
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +529 -45
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +224 -30
- package/src/codex/catalog/provider-fetch.ts +1460 -134
- package/src/codex/catalog/sync.ts +1449 -186
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +26 -20
- package/src/codex/history-provider.ts +231 -28
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1073 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +80 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +506 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +353 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +492 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +682 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +175 -13
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +505 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1009 -28
- package/src/codex/subagent-model-fallback.ts +350 -35
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +20 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +81 -9
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +1762 -140
- package/src/generated/compatibility-version.json +3164 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +152 -29
- package/src/images/plan.ts +23 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +153 -9
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +6 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +44 -2
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +4 -1
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +8 -2
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +398 -66
- package/src/oauth/key-providers.ts +16 -0
- package/src/oauth/kimi.ts +16 -2
- package/src/oauth/kiro.ts +50 -6
- package/src/oauth/local-token-detect.ts +11 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/store.ts +119 -21
- package/src/oauth/token-guardian.ts +9 -3
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +22 -5
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +253 -6
- package/src/providers/fastwire.ts +501 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +1 -1
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +29 -0
- package/src/providers/quota.ts +1319 -38
- package/src/providers/registry.ts +1429 -111
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +42 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +11 -4
- package/src/reasoning-effort.ts +49 -1
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +220 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +7 -1
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +565 -27
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +366 -30
- package/src/routing/analytics.ts +378 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +267 -46
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +130 -56
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +159 -43
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +865 -181
- package/src/server/lifecycle.ts +284 -13
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +398 -103
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/combo-routes.ts +62 -24
- package/src/server/management/config-routes.ts +464 -51
- package/src/server/management/context.ts +80 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +101 -32
- package/src/server/management/model-routes.ts +189 -131
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +80 -4
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +764 -157
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +288 -32
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +115 -14
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +132 -5
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +82 -42
- package/src/server/relay.ts +236 -76
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log.ts +235 -22
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/collaboration.ts +204 -35
- package/src/server/responses/compact.ts +442 -55
- package/src/server/responses/core.ts +2872 -331
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +79 -4
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +39 -38
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1111 -90
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +845 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +104 -1236
- package/src/update/index.ts +32 -19
- package/src/update/job.ts +442 -67
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +268 -16
- package/src/usage/log.ts +606 -41
- package/src/usage/summary.ts +177 -9
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +9 -3
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +11 -3
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +279 -50
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
package/src/cli/ready.ts
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ocx ready` — pure parser + dependency-injected runner.
|
|
3
|
+
*
|
|
4
|
+
* Lives outside cli/index.ts (which dispatches argv at module top level) so the
|
|
5
|
+
* full behavior is unit-testable without spawning a subprocess, opening a
|
|
6
|
+
* loopback socket, or touching the real HOME/CODEX_HOME. The runner returns an
|
|
7
|
+
* exit code; cli/index.ts only calls it and exits with the returned code.
|
|
8
|
+
*
|
|
9
|
+
* Contract (per P1 review):
|
|
10
|
+
* - Single wait loop. `--wait` waits for proxy discovery AND readiness within
|
|
11
|
+
* one bounded deadline (default 45s, max 300s). Without `--wait` a single
|
|
12
|
+
* identity-checked probe runs.
|
|
13
|
+
* - Invalid arguments return exit code 64 BEFORE any discovery/network work.
|
|
14
|
+
* - Output is sanitized: only the fixed `ready|pending|failed|unreachable`
|
|
15
|
+
* vocabulary, plus pid/port; never carries sync message, warning, path,
|
|
16
|
+
* provider, account, or error data.
|
|
17
|
+
*/
|
|
18
|
+
import { DEFAULT_PROBE_TIMEOUT_MS, findLiveProxy, probeReadiness } from "../server/proxy-liveness";
|
|
19
|
+
|
|
20
|
+
/** Default --wait deadline (45s). */
|
|
21
|
+
export const DEFAULT_READY_WAIT_TIMEOUT_SECONDS = 45;
|
|
22
|
+
/** Maximum allowed --wait deadline (300s). */
|
|
23
|
+
export const MAX_READY_WAIT_TIMEOUT_SECONDS = 300;
|
|
24
|
+
const POLL_INTERVAL_MS = 500;
|
|
25
|
+
/**
|
|
26
|
+
* Cap a remaining deadline budget to a positive per-call IO timeout. Stays
|
|
27
|
+
* positive (>= 1ms) and never exceeds the logical remaining time nor the
|
|
28
|
+
* shared per-call ceiling (DEFAULT_PROBE_TIMEOUT_MS). Passed by the production
|
|
29
|
+
* defaults to findLiveProxy's / probeReadiness's timeoutMs so their fetch waits
|
|
30
|
+
* are bounded by the deadline.
|
|
31
|
+
*/
|
|
32
|
+
function capIoTimeout(remainingMs: number): number {
|
|
33
|
+
return Math.max(1, Math.min(remainingMs, DEFAULT_PROBE_TIMEOUT_MS));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Fixed sanitized CLI status vocabulary. */
|
|
37
|
+
export type CliReadinessStatus = "ready" | "pending" | "failed" | "unreachable";
|
|
38
|
+
|
|
39
|
+
export interface ReadyArgs {
|
|
40
|
+
json: boolean;
|
|
41
|
+
wait: boolean;
|
|
42
|
+
timeoutSeconds: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type ReadyParseResult =
|
|
46
|
+
| { ok: true; args: ReadyArgs }
|
|
47
|
+
| { ok: false; code: 64 };
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Pure argument parser. Accepts `--json`, `--wait`, and
|
|
51
|
+
* `--wait --timeout <seconds>` (positive integer 1..300). Any unknown flag,
|
|
52
|
+
* positional argument, missing/invalid --timeout value, or `--timeout` without
|
|
53
|
+
* `--wait` is a usage error that must surface exit code 64.
|
|
54
|
+
*/
|
|
55
|
+
export function parseReadyArgs(argv: string[]): ReadyParseResult {
|
|
56
|
+
let json = false;
|
|
57
|
+
let wait = false;
|
|
58
|
+
let timeoutSeconds: number | undefined;
|
|
59
|
+
for (let i = 0; i < argv.length; i++) {
|
|
60
|
+
const flag = argv[i];
|
|
61
|
+
if (flag === "--json") {
|
|
62
|
+
json = true;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (flag === "--wait") {
|
|
66
|
+
wait = true;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (flag === "--timeout") {
|
|
70
|
+
const raw = argv[i + 1];
|
|
71
|
+
// Positive finite integer seconds only; /^[0-9]+$/ rejects negatives, decimals, hex, and "".
|
|
72
|
+
if (raw === undefined || !/^[0-9]+$/.test(raw)) return { ok: false, code: 64 };
|
|
73
|
+
const n = Number(raw);
|
|
74
|
+
if (!Number.isInteger(n) || n < 1 || n > MAX_READY_WAIT_TIMEOUT_SECONDS) return { ok: false, code: 64 };
|
|
75
|
+
timeoutSeconds = n;
|
|
76
|
+
i++;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// Any unknown flag or positional argument is a usage error.
|
|
80
|
+
return { ok: false, code: 64 };
|
|
81
|
+
}
|
|
82
|
+
// --timeout only applies to --wait; pairing it with a single probe is a usage error.
|
|
83
|
+
if (timeoutSeconds !== undefined && !wait) return { ok: false, code: 64 };
|
|
84
|
+
return {
|
|
85
|
+
ok: true,
|
|
86
|
+
args: {
|
|
87
|
+
json,
|
|
88
|
+
wait,
|
|
89
|
+
timeoutSeconds: timeoutSeconds ?? DEFAULT_READY_WAIT_TIMEOUT_SECONDS,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface ReadyLive {
|
|
95
|
+
pid: number | null;
|
|
96
|
+
port: number;
|
|
97
|
+
hostname?: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface ReadyProbe {
|
|
101
|
+
ready: boolean;
|
|
102
|
+
status: "ready" | "pending" | "failed" | null;
|
|
103
|
+
pid: number | null;
|
|
104
|
+
port: number | null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface ReadyIo {
|
|
108
|
+
/**
|
|
109
|
+
* Injected proxy discovery (defaults to the identity-checked findLiveProxy).
|
|
110
|
+
* Receives the positive remaining deadline budget (ms) in the --wait path so
|
|
111
|
+
* the production default can bound its fetch by the single deadline; receives
|
|
112
|
+
* `undefined` in the non-wait path so the default keeps its built-in timeout.
|
|
113
|
+
*/
|
|
114
|
+
findLive?: (remainingMs: number | undefined) => Promise<ReadyLive | null>;
|
|
115
|
+
/**
|
|
116
|
+
* Injected readiness probe (defaults to the strict probeReadiness). The third
|
|
117
|
+
* argument is the positive remaining deadline budget (ms) in the --wait path,
|
|
118
|
+
* and `undefined` in the non-wait path (default probe timeout preserved).
|
|
119
|
+
*/
|
|
120
|
+
probe?: (
|
|
121
|
+
port: number,
|
|
122
|
+
opts: { hostname?: string; expectedPid?: number },
|
|
123
|
+
remainingMs: number | undefined,
|
|
124
|
+
) => Promise<ReadyProbe | null>;
|
|
125
|
+
/** Injected sleep so tests can poll without real timers. */
|
|
126
|
+
sleep?: (ms: number) => Promise<void>;
|
|
127
|
+
/** Injected clock so the deadline is deterministic without real time. */
|
|
128
|
+
now?: () => number;
|
|
129
|
+
/** Injected stdout (only `.log` is used). */
|
|
130
|
+
stdout?: { log: (s: string) => void };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function sanitizeProbeStatus(status: ReadyProbe["status"]): Exclude<CliReadinessStatus, "ready"> {
|
|
134
|
+
if (status === "failed") return "failed";
|
|
135
|
+
if (status === "pending") return "pending";
|
|
136
|
+
return "unreachable";
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function report(
|
|
140
|
+
args: ReadyArgs,
|
|
141
|
+
ready: boolean,
|
|
142
|
+
status: CliReadinessStatus,
|
|
143
|
+
pid: number | null,
|
|
144
|
+
port: number | null,
|
|
145
|
+
stdout: { log: (s: string) => void },
|
|
146
|
+
): void {
|
|
147
|
+
if (args.json) {
|
|
148
|
+
stdout.log(JSON.stringify({ ready, status, pid, port }));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
switch (status) {
|
|
152
|
+
case "ready":
|
|
153
|
+
stdout.log(`Proxy ready (PID ${pid ?? "?"}, port ${port ?? "?"})`);
|
|
154
|
+
return;
|
|
155
|
+
case "pending":
|
|
156
|
+
stdout.log("Proxy running but not ready yet (pending).");
|
|
157
|
+
return;
|
|
158
|
+
case "failed":
|
|
159
|
+
stdout.log("Proxy running but not ready (sync failed).");
|
|
160
|
+
return;
|
|
161
|
+
case "unreachable":
|
|
162
|
+
stdout.log("Proxy not reachable or readiness unavailable.");
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Run `ocx ready` over injected I/O. Returns the exit code (0 only when ready,
|
|
169
|
+
* 1 for not-ready/timeout, 64 for usage errors — though usage errors are
|
|
170
|
+
* normally caught by parseReadyArgs before this runs). The runner performs NO
|
|
171
|
+
* real subprocess/network work when the io injections are supplied.
|
|
172
|
+
*/
|
|
173
|
+
export async function runReady(args: ReadyArgs, io: ReadyIo = {}): Promise<number> {
|
|
174
|
+
const find = io.findLive ?? (async (remainingMs: number | undefined) => {
|
|
175
|
+
// In the --wait path, forward an ABSOLUTE deadline derived from the real
|
|
176
|
+
// wall clock (Date.now, NOT the injected logical now) plus the remaining
|
|
177
|
+
// budget: the per-probe AbortSignal timeout is real wall-clock time, so the
|
|
178
|
+
// injected test clock must not govern the network deadline. findLiveProxy's
|
|
179
|
+
// deadlineAt budget recomputes remaining before each candidate probe and
|
|
180
|
+
// bounds each fetch by it (plus the per-probe cap below). Non-wait path
|
|
181
|
+
// keeps the built-in default.
|
|
182
|
+
// verifyPidFn is disabled: readiness is non-destructive, so the killable-pid
|
|
183
|
+
// OS command-line verification (WMIC/PowerShell, seconds on Windows) would
|
|
184
|
+
// run OUTSIDE the deadline budget for no readiness value. The /healthz
|
|
185
|
+
// identity marker and the strict /readyz contract validation remain.
|
|
186
|
+
const live = await findLiveProxy(
|
|
187
|
+
remainingMs === undefined
|
|
188
|
+
? { verifyPidFn: () => null }
|
|
189
|
+
: { deadlineAt: Date.now() + remainingMs, timeoutMs: DEFAULT_PROBE_TIMEOUT_MS, verifyPidFn: () => null },
|
|
190
|
+
);
|
|
191
|
+
return live ? { pid: live.pid, port: live.port, hostname: live.hostname } : null;
|
|
192
|
+
});
|
|
193
|
+
const probe = io.probe ?? (async (port, opts, remainingMs) =>
|
|
194
|
+
probeReadiness(port, opts, remainingMs === undefined ? {} : { timeoutMs: capIoTimeout(remainingMs) }));
|
|
195
|
+
const sleep = io.sleep ?? (ms => new Promise<void>(resolve => setTimeout(resolve, ms)));
|
|
196
|
+
const now = io.now ?? Date.now;
|
|
197
|
+
const stdout = io.stdout ?? console;
|
|
198
|
+
|
|
199
|
+
if (!args.wait) {
|
|
200
|
+
// Default: exactly one identity-checked readiness probe. No wait deadline —
|
|
201
|
+
// bounded only by the probe's own default timeout (remainingMs=undefined so
|
|
202
|
+
// the production defaults keep their built-in 750ms ceiling; no semantic
|
|
203
|
+
// regression vs. the single-probe behavior).
|
|
204
|
+
const live = await find(undefined);
|
|
205
|
+
if (!live) {
|
|
206
|
+
report(args, false, "unreachable", null, null, stdout);
|
|
207
|
+
return 1;
|
|
208
|
+
}
|
|
209
|
+
const p = await probe(live.port, { hostname: live.hostname, expectedPid: live.pid ?? undefined }, undefined);
|
|
210
|
+
if (p?.ready) {
|
|
211
|
+
report(args, true, "ready", p.pid, live.port, stdout);
|
|
212
|
+
return 0;
|
|
213
|
+
}
|
|
214
|
+
const status: CliReadinessStatus = sanitizeProbeStatus(p?.status ?? null);
|
|
215
|
+
report(args, false, status, p?.pid ?? live.pid ?? null, live.port, stdout);
|
|
216
|
+
return 1;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// --wait: ONE loop bounded by a single deadline (default 45s, max 300s). The
|
|
220
|
+
// deadline is the single source of truth:
|
|
221
|
+
// - Before EVERY discovery and EVERY probe we compute remaining = deadline -
|
|
222
|
+
// now(); if it is non-positive we return code 1 WITHOUT starting that I/O.
|
|
223
|
+
// - After each awaited discovery/probe we re-read the clock; reached/exceeded
|
|
224
|
+
// means timeout wins (code 1), so a ready probe resolving at/after the
|
|
225
|
+
// deadline does NOT promote to ready.
|
|
226
|
+
// - No second discovery/probe may start once the deadline is reached.
|
|
227
|
+
// - Each sleep is capped to the positive remaining time. The remaining
|
|
228
|
+
// budget is also forwarded to the production discovery/probe defaults so
|
|
229
|
+
// their individual fetch waits are bounded by this same deadline.
|
|
230
|
+
const deadline = now() + args.timeoutSeconds * 1000;
|
|
231
|
+
let lastStatus: CliReadinessStatus = "unreachable";
|
|
232
|
+
let lastPid: number | null = null;
|
|
233
|
+
let lastPort: number | null = null;
|
|
234
|
+
for (;;) {
|
|
235
|
+
// Before discovery: refuse to start I/O when the deadline has elapsed.
|
|
236
|
+
const remainingBeforeFind = deadline - now();
|
|
237
|
+
if (remainingBeforeFind <= 0) {
|
|
238
|
+
report(args, false, lastStatus, lastPid, lastPort, stdout);
|
|
239
|
+
return 1;
|
|
240
|
+
}
|
|
241
|
+
const live = await find(remainingBeforeFind);
|
|
242
|
+
// After discovery: re-read the clock. Reached/exceeded → timeout wins and
|
|
243
|
+
// no probe is started (no second discovery/probe after the deadline).
|
|
244
|
+
let clock = now();
|
|
245
|
+
if (clock >= deadline) {
|
|
246
|
+
report(args, false, lastStatus, lastPid, lastPort, stdout);
|
|
247
|
+
return 1;
|
|
248
|
+
}
|
|
249
|
+
if (live) {
|
|
250
|
+
lastPort = live.port;
|
|
251
|
+
// Before probe: remaining derived from the post-discovery reading
|
|
252
|
+
// (guaranteed positive because clock < deadline above). This bounds the
|
|
253
|
+
// probe's fetch wait by the single deadline.
|
|
254
|
+
const remainingBeforeProbe = deadline - clock;
|
|
255
|
+
const p = await probe(
|
|
256
|
+
live.port,
|
|
257
|
+
{ hostname: live.hostname, expectedPid: live.pid ?? undefined },
|
|
258
|
+
remainingBeforeProbe,
|
|
259
|
+
);
|
|
260
|
+
lastStatus = sanitizeProbeStatus(p?.status ?? null);
|
|
261
|
+
lastPid = p?.pid ?? live.pid ?? null;
|
|
262
|
+
// After every awaited probe: re-read the clock BEFORE terminal-failed or
|
|
263
|
+
// ready handling. Reached/exceeded → timeout wins (code 1) with the last
|
|
264
|
+
// sanitized status — a failed/ready probe resolving at/after the deadline
|
|
265
|
+
// must not take the terminal-failed shortcut or promote to ready.
|
|
266
|
+
clock = now();
|
|
267
|
+
if (clock >= deadline) {
|
|
268
|
+
report(args, false, lastStatus, lastPid, live.port, stdout);
|
|
269
|
+
return 1;
|
|
270
|
+
}
|
|
271
|
+
// `failed` is terminal only while still before the deadline: the startup
|
|
272
|
+
// sync has settled unsuccessfully, so waiting cannot change this gate.
|
|
273
|
+
// Report it immediately instead of consuming the rest of the timeout.
|
|
274
|
+
if (p?.status === "failed") {
|
|
275
|
+
report(args, false, "failed", lastPid, live.port, stdout);
|
|
276
|
+
return 1;
|
|
277
|
+
}
|
|
278
|
+
if (p?.ready) {
|
|
279
|
+
report(args, true, "ready", p.pid, live.port, stdout);
|
|
280
|
+
return 0;
|
|
281
|
+
}
|
|
282
|
+
} else {
|
|
283
|
+
// Discovery stopped finding the proxy: it may have exited since the last
|
|
284
|
+
// probe. Clear the cached status/identity so a stale `pending` (or its
|
|
285
|
+
// pid/port) cannot mislead a supervisor at timeout — the honest answer is
|
|
286
|
+
// `unreachable` with no identity.
|
|
287
|
+
lastStatus = "unreachable";
|
|
288
|
+
lastPid = null;
|
|
289
|
+
lastPort = null;
|
|
290
|
+
}
|
|
291
|
+
// Cap the sleep to the positive remaining time so we never sleep past the
|
|
292
|
+
// deadline. `clock` is the latest reading (post-discovery when no live
|
|
293
|
+
// proxy was found, post-probe otherwise) and is known to be < deadline.
|
|
294
|
+
const remainingForSleep = deadline - clock;
|
|
295
|
+
if (remainingForSleep <= 0) {
|
|
296
|
+
report(args, false, lastStatus, lastPid, lastPort, stdout);
|
|
297
|
+
return 1;
|
|
298
|
+
}
|
|
299
|
+
await sleep(Math.min(POLL_INTERVAL_MS, remainingForSleep));
|
|
300
|
+
}
|
|
301
|
+
}
|