@iislee/opencodex 2.11.0 → 2.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +117 -22
- package/bin/ocx.mjs +245 -88
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-Be1sDpWw.css +1 -0
- package/gui/dist/assets/index-D4OKgUV4.js +114 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +21 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +475 -62
- package/src/adapters/base.ts +82 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +637 -0
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/catalog.ts +541 -0
- package/src/adapters/cursor/checkpoint-store.ts +308 -0
- package/src/adapters/cursor/cursor-errors.ts +144 -6
- package/src/adapters/cursor/discovery.ts +122 -14
- package/src/adapters/cursor/effort-map.ts +106 -4
- package/src/adapters/cursor/envelope-echo.ts +290 -0
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +180 -59
- package/src/adapters/cursor/live-transport.ts +623 -170
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -3
- package/src/adapters/cursor/native-exec.ts +121 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +447 -75
- package/src/adapters/cursor/request-builder.ts +271 -35
- package/src/adapters/cursor/tool-definitions.ts +252 -12
- package/src/adapters/cursor/tool-result-normalize.ts +115 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +48 -1
- package/src/adapters/cursor.ts +336 -39
- package/src/adapters/exec-tool-result-normalize.ts +99 -0
- package/src/adapters/google-antigravity-replay.ts +713 -41
- package/src/adapters/google-antigravity-wire.ts +48 -10
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +742 -86
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +27 -0
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +65 -17
- package/src/adapters/kiro.ts +270 -73
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1377 -344
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1164 -64
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +36 -1
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +105 -21
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/adapters/xai-web-search.ts +186 -0
- package/src/bridge.ts +512 -92
- package/src/chat/inbound.ts +57 -20
- package/src/chat/outbound.ts +97 -33
- package/src/claude/agents-inject.ts +40 -10
- package/src/claude/context-windows.ts +37 -14
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +88 -21
- package/src/cli/access.ts +46 -3
- package/src/cli/account-api.ts +150 -19
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +648 -28
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +97 -19
- package/src/cli/agent.ts +53 -2
- package/src/cli/alias.ts +66 -0
- package/src/cli/capabilities-command.ts +94 -0
- package/src/cli/capabilities.ts +496 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +60 -15
- package/src/cli/claude.ts +129 -35
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +821 -0
- package/src/cli/doctor.ts +440 -56
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +34 -274
- package/src/cli/index.ts +417 -528
- package/src/cli/init.ts +5 -17
- package/src/cli/inspect.ts +230 -0
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +130 -2
- package/src/cli/models.ts +118 -16
- package/src/cli/observe.ts +123 -11
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +34 -3
- package/src/cli/provider.ts +25 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +476 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +57 -10
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +51 -4
- package/src/cli/storage.ts +234 -0
- package/src/cli/system-command.ts +16 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/usage-report.ts +184 -0
- package/src/cli/v2.ts +137 -18
- package/src/cli/version-skew.ts +46 -0
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1442 -23
- package/src/clients/effective-status.ts +30 -2
- package/src/clients/probes/cline.ts +81 -0
- package/src/codex/account-label.ts +35 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +84 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +570 -107
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +893 -246
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +348 -32
- package/src/codex/autostart-health.ts +24 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +86 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +138 -32
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +555 -45
- package/src/codex/catalog/native-models.ts +75 -0
- package/src/codex/catalog/parsing.ts +269 -30
- package/src/codex/catalog/provider-fetch.ts +1626 -144
- package/src/codex/catalog/sync.ts +1576 -187
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +386 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +676 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/desktop-app-restart.ts +355 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +436 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-manifest.ts +112 -0
- package/src/codex/history-migration-guardian.ts +30 -24
- package/src/codex/history-provider.ts +1016 -235
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +223 -0
- package/src/codex/inject-coordination.ts +373 -0
- package/src/codex/inject.ts +1114 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +81 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +524 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +360 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +622 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +675 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +1313 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +264 -21
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +514 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1065 -31
- package/src/codex/subagent-model-fallback.ts +437 -43
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +720 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +47 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +91 -9
- package/src/compatibility/index.ts +26 -0
- package/src/compatibility/manifest.ts +253 -0
- package/src/compatibility/openai-responses.ts +121 -0
- package/src/config/atomic-write.ts +219 -0
- package/src/config/paths.ts +40 -0
- package/src/config/process-state.ts +309 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config/provider-validation.ts +177 -0
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +1713 -709
- package/src/generated/compatibility-version.json +3324 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +157 -33
- package/src/images/plan.ts +24 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership-policy.ts +160 -0
- package/src/integrations/ownership.ts +155 -0
- package/src/integrations/registry.ts +166 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +433 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +715 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/admin-secrets.ts +24 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +167 -11
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +26 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +80 -5
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +6 -2
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +15 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +253 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +30 -4
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/cline.ts +203 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +462 -71
- package/src/oauth/key-providers.ts +25 -0
- package/src/oauth/kimi.ts +25 -3
- package/src/oauth/kiro.ts +95 -6
- package/src/oauth/local-token-detect.ts +13 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/open-browser-choice.ts +26 -0
- package/src/oauth/store.ts +133 -26
- package/src/oauth/token-guardian.ts +9 -3
- package/src/oauth/types.ts +15 -0
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/auto-compact-budget.ts +65 -0
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +176 -0
- package/src/providers/context-cap.ts +26 -8
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +281 -6
- package/src/providers/fastwire.ts +507 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +35 -2
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +30 -0
- package/src/providers/quota.ts +1379 -40
- package/src/providers/registry.ts +1545 -112
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +94 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +32 -4
- package/src/reasoning-effort.ts +68 -3
- package/src/responses/apply-patch-envelope.ts +63 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +384 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +435 -0
- package/src/responses/parser.ts +225 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +504 -0
- package/src/responses/schema.ts +12 -2
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +659 -31
- package/src/responses/thought-signature-replay.ts +364 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/responses/turn-termination.ts +107 -0
- package/src/router.ts +405 -31
- package/src/routing/analytics.ts +379 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +155 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +289 -48
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +154 -72
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +445 -0
- package/src/server/claude-messages.ts +160 -44
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +1021 -190
- package/src/server/lifecycle.ts +336 -14
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +433 -116
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +64 -25
- package/src/server/management/config-routes.ts +511 -51
- package/src/server/management/context.ts +89 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +127 -52
- package/src/server/management/model-routes.ts +461 -133
- package/src/server/management/model-rows.ts +167 -0
- package/src/server/management/native-integration-routes.ts +770 -0
- package/src/server/management/oauth-account-routes.ts +90 -8
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +836 -159
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/route-registry.ts +332 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +289 -33
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +126 -23
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +1 -1
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +161 -10
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +221 -54
- package/src/server/relay.ts +479 -87
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log-conversation.ts +51 -0
- package/src/server/request-log.ts +298 -31
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/codex-auth-error.ts +55 -0
- package/src/server/responses/collaboration.ts +239 -36
- package/src/server/responses/combo-stream-preflight.ts +178 -0
- package/src/server/responses/compact.ts +444 -72
- package/src/server/responses/core.ts +3579 -436
- package/src/server/responses/empty-completion-guard.ts +333 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +89 -99
- package/src/server/responses/input-admission.ts +187 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +343 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +381 -0
- package/src/server/responses-custom-tool-repair.ts +363 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +363 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +376 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +319 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +53 -40
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1153 -94
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/policy-job.ts +14 -4
- package/src/storage/policy.ts +88 -23
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +911 -0
- package/src/types/provider.ts +614 -0
- package/src/types/request.ts +397 -0
- package/src/types/tools.ts +236 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +107 -1237
- package/src/update/index.ts +37 -23
- package/src/update/job.ts +445 -68
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +266 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +287 -16
- package/src/usage/log.ts +666 -50
- package/src/usage/summary.ts +388 -17
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +27 -16
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +119 -0
- package/src/web-search/executor.ts +21 -6
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +284 -54
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
package/bin/ocx.mjs
CHANGED
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
* opencodex npm bin launcher.
|
|
4
4
|
*
|
|
5
5
|
* The package source is TypeScript that runs on the Bun runtime. To let
|
|
6
|
-
* `npm install -g @
|
|
6
|
+
* `npm install -g @bitkyc08/opencodex` work without a separately-installed Bun,
|
|
7
7
|
* we bundle the runtime via the `bun` npm dependency and exec it from this
|
|
8
8
|
* Node shim. (Dev still runs `bun run src/cli/index.ts` directly via the shebang on
|
|
9
9
|
* src/cli/index.ts — only the published npm `bin` routes through here.)
|
|
10
10
|
*/
|
|
11
11
|
import { spawn, spawnSync } from "node:child_process";
|
|
12
|
+
import { randomBytes } from "node:crypto";
|
|
12
13
|
import { createRequire } from "node:module";
|
|
13
14
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
14
15
|
import { homedir } from "node:os";
|
|
@@ -16,12 +17,19 @@ import { dirname, join, resolve } from "node:path";
|
|
|
16
17
|
import { fileURLToPath } from "node:url";
|
|
17
18
|
import { isRealBunBinary } from "../src/lib/bun-binary-validator.mjs";
|
|
18
19
|
import { npmInvocation } from "../src/update/npm-invocation.mjs";
|
|
20
|
+
import {
|
|
21
|
+
npmCachePreflightFailureMessage,
|
|
22
|
+
runNpmCachePreflight,
|
|
23
|
+
} from "../src/update/npm-cache-preflight.mjs";
|
|
19
24
|
import { handoffWindowsTrayForUpdate, planWindowsTrayUpdate } from "../src/update/tray-update-plan.mjs";
|
|
25
|
+
import { bootRestoreProbe, transactionalNpmUpdate } from "../src/update/transactional-install.mjs";
|
|
20
26
|
|
|
21
|
-
const PKG = "@
|
|
27
|
+
const PKG = "@bitkyc08/opencodex";
|
|
22
28
|
const require = createRequire(import.meta.url);
|
|
23
29
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
24
30
|
const cliPath = join(here, "..", "src", "cli", "index.ts");
|
|
31
|
+
const NODE_LAUNCH_CONTEXT_ENV = "OCX_NODE_LAUNCH_CONTEXT";
|
|
32
|
+
const NODE_LAUNCH_PROOF_PREFIX = "--ocx-internal-launch-proof=";
|
|
25
33
|
|
|
26
34
|
function isNodeModulesInstall() {
|
|
27
35
|
return here.split(/[\\/]/).includes("node_modules");
|
|
@@ -133,21 +141,60 @@ function runNpmSelfUpdate() {
|
|
|
133
141
|
process.exit(0);
|
|
134
142
|
}
|
|
135
143
|
|
|
144
|
+
const cachePreflight = runNpmCachePreflight();
|
|
145
|
+
if (!cachePreflight.ok) {
|
|
146
|
+
console.error(`opencodex: ${npmCachePreflightFailureMessage(cachePreflight.reason)}. Aborting before stopping the proxy.`);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
|
|
136
150
|
// Remember whether a background service manages the proxy BEFORE stopping — `ocx stop`
|
|
137
|
-
// unloads it
|
|
151
|
+
// unloads it, so a successful update must refresh and restart it afterwards.
|
|
138
152
|
const serviceStatePath = join(configDir(), "service-state.json");
|
|
139
153
|
const serviceWasInstalled = existsSync(serviceStatePath);
|
|
140
154
|
const trayBeforeUpdate = planWindowsTrayUpdate(
|
|
141
155
|
process.platform === "win32" ? trayInstallState() : { installed: false, running: false },
|
|
142
156
|
);
|
|
143
|
-
/**
|
|
144
|
-
|
|
157
|
+
/**
|
|
158
|
+
* Refresh the existing service without re-registering it. `service repair` discovers
|
|
159
|
+
* the installed backend itself and, on Windows scheduler installs, rewrites the wrapper
|
|
160
|
+
* assets and restarts the existing task without `schtasks /create` — the elevation a
|
|
161
|
+
* non-admin `ocx update` does not have.
|
|
162
|
+
*/
|
|
163
|
+
function serviceRefreshArgs() {
|
|
164
|
+
return [launcher, "service", "repair"];
|
|
165
|
+
}
|
|
166
|
+
/** Register from scratch, preserving the recorded backend. Only for a genuinely absent service. */
|
|
167
|
+
function serviceInstallArgs() {
|
|
145
168
|
try {
|
|
146
169
|
const state = JSON.parse(readFileSync(serviceStatePath, "utf8"));
|
|
147
170
|
if (state.backend === "native") return [launcher, "service", "install", "--native"];
|
|
148
171
|
} catch { /* missing or corrupt — fall through to default */ }
|
|
149
172
|
return [launcher, "service", "install"];
|
|
150
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Structured "is a service actually registered?" answer.
|
|
176
|
+
*
|
|
177
|
+
* This file is plain Node ESM and cannot import `diagnoseService()` from the
|
|
178
|
+
* TypeScript runtime, so it asks the freshly-installed launcher — which runs that
|
|
179
|
+
* diagnostic under Bun — and reads `startup.serviceInstalled`.
|
|
180
|
+
*
|
|
181
|
+
* Returns `null` when the probe itself could not answer, which callers must treat as
|
|
182
|
+
* "unknown" rather than "absent": failing closed here means NOT re-registering.
|
|
183
|
+
*/
|
|
184
|
+
function readServiceInstalledFromStatus(launcherPath) {
|
|
185
|
+
try {
|
|
186
|
+
const st = spawnSync(process.execPath, [launcherPath, "status", "--json"], {
|
|
187
|
+
encoding: "utf8",
|
|
188
|
+
timeout: 20_000,
|
|
189
|
+
windowsHide: true,
|
|
190
|
+
});
|
|
191
|
+
if (st.status !== 0 || typeof st.stdout !== "string" || !st.stdout.trim()) return null;
|
|
192
|
+
const installed = JSON.parse(st.stdout)?.startup?.serviceInstalled;
|
|
193
|
+
return typeof installed === "boolean" ? installed : null;
|
|
194
|
+
} catch {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
151
198
|
|
|
152
199
|
// Capture listen target before stop clears runtime-port.json (mirrors GUI/CLI update worker).
|
|
153
200
|
// Do not treat a live runtime port of 10100 as "missing" — track whether the read succeeded.
|
|
@@ -180,11 +227,90 @@ function runNpmSelfUpdate() {
|
|
|
180
227
|
} catch { /* keep default */ }
|
|
181
228
|
}
|
|
182
229
|
|
|
230
|
+
const launcher = fileURLToPath(import.meta.url);
|
|
231
|
+
|
|
232
|
+
function startProxyDirectly() {
|
|
233
|
+
if (!existsSync(launcher)) {
|
|
234
|
+
console.error("opencodex: cannot restart the proxy because the launcher is missing; reinstall opencodex manually.");
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const env = { ...process.env };
|
|
238
|
+
delete env.OCX_SERVICE;
|
|
239
|
+
console.log(`Attempting to restart the proxy on port ${bakePort}.`);
|
|
240
|
+
const child = spawn(process.execPath, [launcher, "start", "--port", String(bakePort)], {
|
|
241
|
+
detached: true,
|
|
242
|
+
stdio: "ignore",
|
|
243
|
+
windowsHide: true,
|
|
244
|
+
env,
|
|
245
|
+
});
|
|
246
|
+
child.on("error", error => {
|
|
247
|
+
console.error(`opencodex: direct proxy restart failed: ${error.message}`);
|
|
248
|
+
});
|
|
249
|
+
child.unref();
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function refreshBackgroundServiceOrStartDirect() {
|
|
253
|
+
const prevBake = process.env.OCX_BAKE_PORT;
|
|
254
|
+
process.env.OCX_BAKE_PORT = String(bakePort);
|
|
255
|
+
try {
|
|
256
|
+
let svc = spawnSync(process.execPath, serviceRefreshArgs(), { stdio: "inherit", windowsHide: true });
|
|
257
|
+
// `serviceWasInstalled` is inferred from service-state.json alone, which can be
|
|
258
|
+
// STALE — present while the registration is gone. Repair refuses that case by
|
|
259
|
+
// design, and its thrown Error is indistinguishable from any other failure at
|
|
260
|
+
// this layer (plain Error, inherited stdio, generic exit status). So ask for
|
|
261
|
+
// structured state instead of parsing the failure: install only when the
|
|
262
|
+
// diagnostic says the service is genuinely absent. Installing after ANY repair
|
|
263
|
+
// failure would resurrect the elevation prompt this change exists to avoid, and
|
|
264
|
+
// could re-register a service the user just uninstalled.
|
|
265
|
+
if (svc.status !== 0 && readServiceInstalledFromStatus(launcher) === false) {
|
|
266
|
+
console.log("No registered service found — installing it instead.");
|
|
267
|
+
svc = spawnSync(process.execPath, serviceInstallArgs(), { stdio: "inherit", windowsHide: true });
|
|
268
|
+
}
|
|
269
|
+
let needDirectStart = svc.status !== 0;
|
|
270
|
+
if (!needDirectStart) {
|
|
271
|
+
// Exit 0 can still leave stale/missing assets that never bring the proxy
|
|
272
|
+
// back — match the GUI/CLI fallthrough so /healthz is not left dead.
|
|
273
|
+
try {
|
|
274
|
+
const st = spawnSync(process.execPath, [launcher, "status", "--json"], {
|
|
275
|
+
encoding: "utf8",
|
|
276
|
+
timeout: 20_000,
|
|
277
|
+
windowsHide: true,
|
|
278
|
+
});
|
|
279
|
+
if (st.status === 0 && typeof st.stdout === "string" && st.stdout.trim()) {
|
|
280
|
+
const parsed = JSON.parse(st.stdout);
|
|
281
|
+
const proxyUp = parsed?.proxy?.running === true || parsed?.proxy?.health?.ok === true;
|
|
282
|
+
const viable = parsed?.startup?.serviceViable === true;
|
|
283
|
+
if (!proxyUp && !viable) needDirectStart = true;
|
|
284
|
+
} else {
|
|
285
|
+
// status failed or empty — fail closed to direct start (match CLI).
|
|
286
|
+
needDirectStart = true;
|
|
287
|
+
}
|
|
288
|
+
} catch {
|
|
289
|
+
needDirectStart = true;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (needDirectStart) {
|
|
293
|
+
// A repair needs no elevation, but it can still fail — or exit 0 while leaving
|
|
294
|
+
// a non-viable manager. Fall back to a direct detached proxy start so the
|
|
295
|
+
// update never leaves the user without a running proxy.
|
|
296
|
+
console.warn(
|
|
297
|
+
svc.status === 0
|
|
298
|
+
? "opencodex: service refresh left a non-viable manager — starting the proxy directly instead."
|
|
299
|
+
: "opencodex: service refresh failed — starting the proxy directly instead.",
|
|
300
|
+
);
|
|
301
|
+
console.warn(" Run 'ocx service repair' to see why the background service could not restart.");
|
|
302
|
+
startProxyDirectly();
|
|
303
|
+
}
|
|
304
|
+
} finally {
|
|
305
|
+
if (prevBake === undefined) delete process.env.OCX_BAKE_PORT;
|
|
306
|
+
else process.env.OCX_BAKE_PORT = prevBake;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
183
310
|
// Never replace package files under a live proxy — stop it first (full `ocx stop`
|
|
184
311
|
// semantics: graceful drain, service stop, native Codex restore). Gate on the service
|
|
185
312
|
// and the runtime-port record too: a service-managed or orphaned proxy can be live
|
|
186
313
|
// while ocx.pid is stale/missing.
|
|
187
|
-
const launcher = fileURLToPath(import.meta.url);
|
|
188
314
|
if (trayBeforeUpdate.stopBeforeReplacement) {
|
|
189
315
|
console.log("⏹ Handing off the Windows tray before updating...");
|
|
190
316
|
try {
|
|
@@ -202,6 +328,17 @@ function runNpmSelfUpdate() {
|
|
|
202
328
|
}
|
|
203
329
|
const hasRuntimeState =
|
|
204
330
|
existsSync(join(configDir(), "ocx.pid")) || existsSync(join(configDir(), "runtime-port.json"));
|
|
331
|
+
|
|
332
|
+
function recoverStoppedRuntimeAfterFailure() {
|
|
333
|
+
if (serviceWasInstalled) {
|
|
334
|
+
console.warn("opencodex: update failed after stopping the proxy — restoring the previous background service.");
|
|
335
|
+
refreshBackgroundServiceOrStartDirect();
|
|
336
|
+
} else if (hasRuntimeState) {
|
|
337
|
+
console.warn("opencodex: update failed after stopping the proxy — restarting the previous version directly.");
|
|
338
|
+
startProxyDirectly();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
205
342
|
if (serviceWasInstalled || hasRuntimeState) {
|
|
206
343
|
console.log("⏹ Stopping the running proxy before updating...");
|
|
207
344
|
const stopRes = spawnSync(process.execPath, [launcher, "stop"], { stdio: "inherit", windowsHide: true });
|
|
@@ -214,20 +351,58 @@ function runNpmSelfUpdate() {
|
|
|
214
351
|
}
|
|
215
352
|
if (historyRestoreIncomplete()) {
|
|
216
353
|
console.warn(
|
|
217
|
-
"opencodex: WARNING — Codex resume
|
|
218
|
-
"
|
|
219
|
-
" After the update: close the Codex app, then run 'ocx stop' once to
|
|
354
|
+
"opencodex: WARNING — Codex resume-history metadata restore is incomplete (a backup manifest remains).\n" +
|
|
355
|
+
" The DB may be busy or the manifest/target may need review; untracked routed history is intentionally unchanged.\n" +
|
|
356
|
+
" After the update: close the Codex app, run 'ocx doctor', then run 'ocx stop' once to retry.",
|
|
220
357
|
);
|
|
221
358
|
}
|
|
222
359
|
}
|
|
223
360
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
361
|
+
// #1942/#1849: stage -> verify -> swap -> rollback instead of installing straight
|
|
362
|
+
// into the live tree. A failure at any point leaves either the old or the new tree
|
|
363
|
+
// complete — never a file-less skeleton. Falls back to the legacy in-place install
|
|
364
|
+
// only when the transactional module cannot run at all.
|
|
365
|
+
const packageDir = resolve(here, "..");
|
|
366
|
+
console.log(`Updating${latest ? ` to v${latest}` : ""} (transactional)...`);
|
|
367
|
+
let res;
|
|
368
|
+
try {
|
|
369
|
+
const tx = transactionalNpmUpdate({
|
|
370
|
+
packageDir,
|
|
371
|
+
pkgName: PKG,
|
|
372
|
+
targetVersion: latest || undefined,
|
|
373
|
+
tag,
|
|
374
|
+
runNpm: (args) => {
|
|
375
|
+
const invocation = npmInvocation(args);
|
|
376
|
+
if (!invocation) return { status: 1 };
|
|
377
|
+
return spawnSync(invocation.file, invocation.args, {
|
|
378
|
+
stdio: "inherit",
|
|
379
|
+
timeout: 180000,
|
|
380
|
+
windowsHide: true,
|
|
381
|
+
...invocation.options,
|
|
382
|
+
});
|
|
383
|
+
},
|
|
384
|
+
log: (line) => console.log(line),
|
|
385
|
+
});
|
|
386
|
+
if (tx.ok) {
|
|
387
|
+
res = { status: 0 };
|
|
388
|
+
} else if (tx.phase === "stage" || tx.phase === "verify") {
|
|
389
|
+
// Live tree untouched: report and stop. Nothing to roll back.
|
|
390
|
+
console.error(`opencodex: update aborted before touching the live install (${tx.phase}): ${tx.error}`);
|
|
391
|
+
res = { status: 1 };
|
|
392
|
+
} else {
|
|
393
|
+
console.error(`opencodex: update failed (${tx.phase}): ${tx.error}${tx.rolledBack ? " — previous version restored." : ""}`);
|
|
394
|
+
res = { status: 1 };
|
|
395
|
+
}
|
|
396
|
+
} catch (error) {
|
|
397
|
+
// An unexpected throw means we cannot prove the live tree is untouched, so the
|
|
398
|
+
// legacy in-place install (which deletes live first) is exactly the wrong rescue —
|
|
399
|
+
// it recreates the #1849 destruction path. Report and stop; the boot probe and the
|
|
400
|
+
// recovery marker cover the swap-window states.
|
|
401
|
+
console.error(`opencodex: transactional update failed unexpectedly (${error?.message ?? error}). ` +
|
|
402
|
+
`The live install was not knowingly modified; run 'ocx update' again or reinstall with ` +
|
|
403
|
+
`npm install -g --allow-scripts=bun ${PKG}@${tag}.`);
|
|
404
|
+
res = { status: 1 };
|
|
405
|
+
}
|
|
231
406
|
if (res.status === 0) {
|
|
232
407
|
console.log(`\nUpdated${latest ? ` to v${latest}` : ""}.`);
|
|
233
408
|
repairCodexShimIfNeeded();
|
|
@@ -241,72 +416,19 @@ function runNpmSelfUpdate() {
|
|
|
241
416
|
if (trayBeforeUpdate.restoreOnFailure) runTrayLifecycle(launcher, "start");
|
|
242
417
|
}
|
|
243
418
|
}
|
|
244
|
-
// The stop above unloaded any managed service;
|
|
419
|
+
// The stop above unloaded any managed service; refresh via the freshly-installed
|
|
245
420
|
// launcher so the new files write the baked paths and the service restarts.
|
|
246
421
|
if (serviceWasInstalled) {
|
|
247
|
-
console.log("
|
|
248
|
-
|
|
249
|
-
process.env.OCX_BAKE_PORT = String(bakePort);
|
|
250
|
-
try {
|
|
251
|
-
const svcArgs = serviceReinstallArgs();
|
|
252
|
-
const svc = spawnSync(process.execPath, svcArgs, { stdio: "inherit", windowsHide: true });
|
|
253
|
-
let needDirectStart = svc.status !== 0;
|
|
254
|
-
if (!needDirectStart) {
|
|
255
|
-
// Exit 0 can still leave stale/missing assets that never bring the proxy
|
|
256
|
-
// back — match the GUI/CLI fallthrough so /healthz is not left dead.
|
|
257
|
-
try {
|
|
258
|
-
const st = spawnSync(process.execPath, [launcher, "status", "--json"], {
|
|
259
|
-
encoding: "utf8",
|
|
260
|
-
timeout: 20_000,
|
|
261
|
-
windowsHide: true,
|
|
262
|
-
});
|
|
263
|
-
if (st.status === 0 && typeof st.stdout === "string" && st.stdout.trim()) {
|
|
264
|
-
const parsed = JSON.parse(st.stdout);
|
|
265
|
-
const proxyUp = parsed?.proxy?.running === true || parsed?.proxy?.health?.ok === true;
|
|
266
|
-
const viable = parsed?.startup?.serviceViable === true;
|
|
267
|
-
if (!proxyUp && !viable) needDirectStart = true;
|
|
268
|
-
} else {
|
|
269
|
-
// status failed or empty — fail closed to direct start (match CLI).
|
|
270
|
-
needDirectStart = true;
|
|
271
|
-
}
|
|
272
|
-
} catch {
|
|
273
|
-
needDirectStart = true;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
if (needDirectStart) {
|
|
277
|
-
// On Windows, schtasks /create requires elevation. The launcher inherits the
|
|
278
|
-
// user's (non-admin) token, so the service reinstall can fail with access
|
|
279
|
-
// denied — or exit 0 while leaving a non-viable manager. Fall back to a
|
|
280
|
-
// direct detached proxy start so the update never leaves the user without
|
|
281
|
-
// a running proxy.
|
|
282
|
-
console.warn(
|
|
283
|
-
svc.status === 0
|
|
284
|
-
? "opencodex: service refresh left a non-viable manager — starting the proxy directly instead."
|
|
285
|
-
: "opencodex: service refresh failed — starting the proxy directly instead.",
|
|
286
|
-
);
|
|
287
|
-
console.warn(" Run 'ocx service install' as administrator to refresh the background service.");
|
|
288
|
-
const env = { ...process.env };
|
|
289
|
-
delete env.OCX_SERVICE;
|
|
290
|
-
const child = spawn(process.execPath, [launcher, "start", "--port", String(bakePort)], {
|
|
291
|
-
detached: true,
|
|
292
|
-
stdio: "ignore",
|
|
293
|
-
windowsHide: true,
|
|
294
|
-
env,
|
|
295
|
-
});
|
|
296
|
-
child.unref();
|
|
297
|
-
console.log(`Proxy starting on port ${bakePort}.`);
|
|
298
|
-
}
|
|
299
|
-
} finally {
|
|
300
|
-
if (prevBake === undefined) delete process.env.OCX_BAKE_PORT;
|
|
301
|
-
else process.env.OCX_BAKE_PORT = prevBake;
|
|
302
|
-
}
|
|
422
|
+
console.log("Refreshing the background service with the updated files...");
|
|
423
|
+
refreshBackgroundServiceOrStartDirect();
|
|
303
424
|
} else {
|
|
304
425
|
console.log("Restart the proxy: ocx start");
|
|
305
426
|
}
|
|
306
427
|
process.exit(0);
|
|
307
428
|
}
|
|
308
429
|
if (trayBeforeUpdate.restoreOnFailure) runTrayLifecycle(launcher, "start");
|
|
309
|
-
|
|
430
|
+
recoverStoppedRuntimeAfterFailure();
|
|
431
|
+
console.error(`\nUpdate failed (npm exit ${res.status ?? "?"}). Try manually: npm install -g --allow-scripts=bun ${PKG}@${tag}`);
|
|
310
432
|
process.exit(1);
|
|
311
433
|
}
|
|
312
434
|
|
|
@@ -317,6 +439,11 @@ function bunBinDir() {
|
|
|
317
439
|
}
|
|
318
440
|
|
|
319
441
|
const BUN_OVERRIDE_ENV = "OPENCODEX_BUN_PATH";
|
|
442
|
+
// Mirrors BUN_RUNTIME_SOURCE_ENV in src/lib/bun-runtime.ts. This launcher is plain
|
|
443
|
+
// Node and runs before any TypeScript is loaded, so the name is repeated rather than
|
|
444
|
+
// imported; tests/ocx-launcher-source.test.ts pins the two together.
|
|
445
|
+
const BUN_RUNTIME_SOURCE_ENV = "OCX_BUN_RUNTIME_SOURCE";
|
|
446
|
+
const BUN_RUNTIME_PATH_ENV = "OCX_BUN_RUNTIME_PATH";
|
|
320
447
|
|
|
321
448
|
function findBunBinary(bunDir) {
|
|
322
449
|
// The npm `bun` package ships the binary as bin/bun.exe on every platform;
|
|
@@ -334,7 +461,7 @@ function fail(msg) {
|
|
|
334
461
|
"The bundled Bun runtime could not be prepared. This usually means the\n" +
|
|
335
462
|
"install skipped lifecycle scripts (e.g. npm blocked bun's postinstall\n" +
|
|
336
463
|
"under allowScripts) or optional dependencies. Reinstall with:\n" +
|
|
337
|
-
" npm install -g --allow-scripts=bun @
|
|
464
|
+
" npm install -g --allow-scripts=bun @bitkyc08/opencodex\n" +
|
|
338
465
|
"(use sudo if the original install used sudo; without --ignore-scripts\n" +
|
|
339
466
|
"and without --omit=optional / optional=false)"
|
|
340
467
|
);
|
|
@@ -347,7 +474,7 @@ function resolveBun() {
|
|
|
347
474
|
const override = process.env[BUN_OVERRIDE_ENV]?.trim();
|
|
348
475
|
if (override) {
|
|
349
476
|
const overridePath = resolve(override);
|
|
350
|
-
if (isRealBunBinary(overridePath)) return overridePath;
|
|
477
|
+
if (isRealBunBinary(overridePath)) return { path: overridePath, source: "override" };
|
|
351
478
|
console.error(
|
|
352
479
|
`opencodex: ${BUN_OVERRIDE_ENV} is missing, unreadable, or not a complete Bun binary; falling back to the bundled runtime.`,
|
|
353
480
|
);
|
|
@@ -361,7 +488,7 @@ function resolveBun() {
|
|
|
361
488
|
}
|
|
362
489
|
|
|
363
490
|
let bin = findBunBinary(bunDir);
|
|
364
|
-
if (bin) return bin;
|
|
491
|
+
if (bin) return { path: bin, source: "bundled" };
|
|
365
492
|
|
|
366
493
|
// Lazy fallback: --ignore-scripts (or a failed postinstall) leaves the
|
|
367
494
|
// ~450-byte placeholder stub. Run the bun package's own installer once.
|
|
@@ -371,7 +498,7 @@ function resolveBun() {
|
|
|
371
498
|
if (r.status === 0) bin = findBunBinary(bunDir);
|
|
372
499
|
}
|
|
373
500
|
if (!bin) fail("Bun binary missing after install attempt.");
|
|
374
|
-
return bin;
|
|
501
|
+
return { path: bin, source: "bundled" };
|
|
375
502
|
}
|
|
376
503
|
|
|
377
504
|
// `ocx update --help` prints usage and exits WITHOUT side effects. The npm launcher
|
|
@@ -389,7 +516,22 @@ if (process.argv[2] === "update" && isNodeModulesInstall() && !isBunGlobalInstal
|
|
|
389
516
|
runNpmSelfUpdate();
|
|
390
517
|
}
|
|
391
518
|
|
|
392
|
-
|
|
519
|
+
// #1849 boot probe: a prior update that lost power (or double-faulted) mid-swap leaves a
|
|
520
|
+
// backup sibling and a broken live tree. Restore before anything tries to run from the
|
|
521
|
+
// broken tree; reap stale backups once the live tree verifies healthy.
|
|
522
|
+
if (isNodeModulesInstall() && !isBunGlobalInstall()) {
|
|
523
|
+
try {
|
|
524
|
+
const probe = bootRestoreProbe(resolve(here, ".."));
|
|
525
|
+
if (probe.action === "restored") {
|
|
526
|
+
console.warn(`opencodex: previous update left a broken install — restored the backup from ${probe.from}.`);
|
|
527
|
+
} else if (probe.action === "failed") {
|
|
528
|
+
console.warn(`opencodex: a backup from a failed update exists but could not be restored automatically: ${probe.error}`);
|
|
529
|
+
}
|
|
530
|
+
} catch { /* the probe must never block launch */ }
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
const bunRuntime = resolveBun();
|
|
534
|
+
const bun = bunRuntime.path;
|
|
393
535
|
|
|
394
536
|
// Run the Bun child asynchronously and FORWARD termination signals to it, then wait
|
|
395
537
|
// for its graceful shutdown before this launcher exits. The previous blocking
|
|
@@ -401,20 +543,35 @@ const bun = resolveBun();
|
|
|
401
543
|
// Provenance seam for issue #701: THIS launcher runs under Node, which does not
|
|
402
544
|
// auto-load a project `.env`/`.env.local`; the Bun child does, before any opencodex
|
|
403
545
|
// code evaluates. So this is the last point that can still tell a real shell export
|
|
404
|
-
// from a working-directory dotenv value, and we record which Anthropic credential
|
|
405
|
-
// slots already existed.
|
|
406
|
-
//
|
|
546
|
+
// from a working-directory dotenv value, and we record which Anthropic credential or
|
|
547
|
+
// destination slots already existed. The context is paired with a random proof carried
|
|
548
|
+
// in argv, which project dotenv cannot modify during an ordinary `ocx` invocation.
|
|
549
|
+
// `src/cli/claude.ts` treats anything present in the Bun child but missing from this
|
|
550
|
+
// list as ambient project pollution rather than user auth or destination,
|
|
407
551
|
// which stopped a project dotenv from silently moving a claude.ai subscriber onto API
|
|
408
|
-
// billing
|
|
409
|
-
// distinct from the variable being absent (no launcher at all — change nothing), so
|
|
410
|
-
// this must stay a plain assignment and never be collapsed to a falsy check.
|
|
552
|
+
// billing and prevents it from redirecting the subscriber's OAuth bearer.
|
|
411
553
|
// Disabling Bun's dotenv wholesale with --no-env-file is NOT an option: config
|
|
412
554
|
// interpolation and provider settings legitimately read the project environment.
|
|
413
|
-
const preBunAnthropicSlots = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"]
|
|
555
|
+
const preBunAnthropicSlots = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_BASE_URL"]
|
|
414
556
|
.filter(name => typeof process.env[name] === "string" && process.env[name] !== "");
|
|
415
|
-
const
|
|
557
|
+
const launchProof = randomBytes(32).toString("base64url");
|
|
558
|
+
const launchContext = JSON.stringify({
|
|
559
|
+
version: 1,
|
|
560
|
+
proof: launchProof,
|
|
561
|
+
anthropicEnvSlots: preBunAnthropicSlots,
|
|
562
|
+
});
|
|
563
|
+
const child = spawn(bun, [cliPath, `${NODE_LAUNCH_PROOF_PREFIX}${launchProof}`, ...process.argv.slice(2)], {
|
|
416
564
|
stdio: "inherit",
|
|
417
|
-
|
|
565
|
+
// A headless Windows parent (Task Scheduler, dashboard restart, shortcut) has no
|
|
566
|
+
// console to inherit. Without this flag Windows allocates a visible console for
|
|
567
|
+
// the long-running Bun child, and closing that window kills the proxy (#1236).
|
|
568
|
+
windowsHide: true,
|
|
569
|
+
env: {
|
|
570
|
+
...process.env,
|
|
571
|
+
[NODE_LAUNCH_CONTEXT_ENV]: launchContext,
|
|
572
|
+
[BUN_RUNTIME_SOURCE_ENV]: bunRuntime.source,
|
|
573
|
+
[BUN_RUNTIME_PATH_ENV]: bunRuntime.path,
|
|
574
|
+
},
|
|
418
575
|
});
|
|
419
576
|
|
|
420
577
|
// Windows has no real POSIX signals (no SIGHUP); forwarding is best-effort there.
|
package/bin/package-main.mjs
CHANGED