@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/models.ts
CHANGED
|
@@ -5,15 +5,72 @@ import { randomUUID } from "node:crypto";
|
|
|
5
5
|
import { createInterface } from "node:readline/promises";
|
|
6
6
|
import { syncModelsToCodex } from "../codex/sync";
|
|
7
7
|
import { hasOwnProvider, isValidProviderName, loadConfig, saveConfig } from "../config";
|
|
8
|
-
import {
|
|
8
|
+
import { canonicalizeReasoningEfforts, isDeclaredReasoningEffort, modelRecordValue } from "../reasoning-effort";
|
|
9
|
+
import { encodedModelIdCollides, routedSlug, slugEquals } from "../providers/slug-codec";
|
|
10
|
+
import { knownModelIdsForProvider } from "../router";
|
|
9
11
|
import { findLiveProxy } from "../server/proxy-liveness";
|
|
10
|
-
import type
|
|
12
|
+
import { modelInList, type OcxConfig, type OcxCustomModel } from "../types";
|
|
11
13
|
|
|
12
|
-
const ADD_USAGE = "Usage: ocx models add <provider> <modelId> [--display-name <name>] [--context-window <tokens>] [--modalities text,image,audio]";
|
|
14
|
+
const ADD_USAGE = "Usage: ocx models add <provider> <modelId> [--display-name <name>] [--context-window <tokens>] [--modalities text,image,audio] [--reasoning-efforts <none,minimal,low,medium,high,xhigh,max,ultra>] [--default-reasoning-effort <level>]";
|
|
13
15
|
const REMOVE_USAGE = "Usage: ocx models remove <customId|provider/modelId> [--yes]";
|
|
14
16
|
const LIST_CUSTOM_USAGE = "Usage: ocx models list-custom [--json]";
|
|
15
17
|
const ALLOWED_MODALITIES = new Set(["text", "image", "audio"]);
|
|
16
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Parse and validate the reasoning flags shared by `ocx models add` (offline path).
|
|
21
|
+
* "-" means "inherit" and omits the field entirely; "" means an explicit empty ladder
|
|
22
|
+
* ("no reasoning" override, the same state the dashboard stores for the toggle-off
|
|
23
|
+
* checkbox set). Malformed CSV like `low,,high` or `,,` is rejected instead of being
|
|
24
|
+
* silently normalized. Values are canonicalized into Codex ladder order so the stored
|
|
25
|
+
* config matches what the API stores.
|
|
26
|
+
*/
|
|
27
|
+
export function parseReasoningArgs(
|
|
28
|
+
reasoningEffortsValue: string | undefined,
|
|
29
|
+
defaultEffortValue: string | undefined,
|
|
30
|
+
): { reasoningEfforts?: string[]; defaultReasoningEffort?: string; error?: string } {
|
|
31
|
+
if (reasoningEffortsValue === undefined && defaultEffortValue === undefined) return {};
|
|
32
|
+
let reasoningEfforts: string[] | undefined;
|
|
33
|
+
if (reasoningEffortsValue !== undefined) {
|
|
34
|
+
const trimmed = reasoningEffortsValue.trim();
|
|
35
|
+
if (trimmed === "-") {
|
|
36
|
+
reasoningEfforts = undefined;
|
|
37
|
+
} else if (trimmed === "") {
|
|
38
|
+
// Explicit no-reasoning override, exactly like the API's [] / the dashboard's
|
|
39
|
+
// uncheck-all state.
|
|
40
|
+
reasoningEfforts = [];
|
|
41
|
+
} else {
|
|
42
|
+
const parts = trimmed.split(",").map(value => value.trim());
|
|
43
|
+
if (parts.some(part => part === "")) {
|
|
44
|
+
return { error: "--reasoning-efforts must be comma-separated values from none, minimal, low, medium, high, xhigh, max, ultra (\"\" for no reasoning, \"-\" to inherit)" };
|
|
45
|
+
}
|
|
46
|
+
const invalid = parts.filter(value => !isDeclaredReasoningEffort(value));
|
|
47
|
+
if (invalid.length > 0) {
|
|
48
|
+
return { error: `unsupported reasoning effort: ${invalid.join(", ")} (allowed: none, minimal, low, medium, high, xhigh, max, ultra)` };
|
|
49
|
+
}
|
|
50
|
+
reasoningEfforts = canonicalizeReasoningEfforts(parts);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let defaultReasoningEffort: string | undefined;
|
|
54
|
+
if (defaultEffortValue !== undefined) {
|
|
55
|
+
const trimmed = defaultEffortValue.trim();
|
|
56
|
+
if (trimmed === "-") {
|
|
57
|
+
defaultReasoningEffort = undefined;
|
|
58
|
+
} else {
|
|
59
|
+
if (!isDeclaredReasoningEffort(trimmed)) {
|
|
60
|
+
return { error: `unsupported reasoning effort: ${trimmed} (allowed: none, minimal, low, medium, high, xhigh, max, ultra)` };
|
|
61
|
+
}
|
|
62
|
+
if (!reasoningEfforts || reasoningEfforts.length === 0) {
|
|
63
|
+
return { error: "--default-reasoning-effort requires --reasoning-efforts" };
|
|
64
|
+
}
|
|
65
|
+
if (!reasoningEfforts.includes(trimmed)) {
|
|
66
|
+
return { error: `--default-reasoning-effort "${trimmed}" is not in the declared reasoning efforts` };
|
|
67
|
+
}
|
|
68
|
+
defaultReasoningEffort = trimmed;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { reasoningEfforts, defaultReasoningEffort };
|
|
72
|
+
}
|
|
73
|
+
|
|
17
74
|
interface ModelEntry {
|
|
18
75
|
provider: string;
|
|
19
76
|
model: string;
|
|
@@ -41,15 +98,22 @@ function collectModels(config: OcxConfig, providerFilter?: string): ModelEntry[]
|
|
|
41
98
|
if (seen.has(model)) return;
|
|
42
99
|
seen.add(model);
|
|
43
100
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
101
|
+
// Resolve exactly as the runtime does, or this command reports capabilities the
|
|
102
|
+
// proxy will not honour: `isModelTextOnly` matches noVisionModels with modelInList
|
|
103
|
+
// and reads modelInputModalities with modelRecordValue, so a `gpt-oss` entry covers
|
|
104
|
+
// `gpt-oss:120b`. A bare lookup reported that model as unclassified on every field.
|
|
105
|
+
// noVisionModels is checked first because `isModelTextOnly` returns true on that
|
|
106
|
+
// match before it ever reads modelInputModalities: a `gpt-oss` noVision entry beats
|
|
107
|
+
// an exact `gpt-oss:120b` entry that lists "image", and the proxy rejects the image.
|
|
108
|
+
const noVision = modelInList(prov.noVisionModels, model);
|
|
109
|
+
const modalities = noVision ? ["text"] : (modelRecordValue(inputModalities, model) ?? null);
|
|
110
|
+
const efforts = modelRecordValue(reasoningEfforts, model) ?? prov.reasoningEfforts ?? null;
|
|
47
111
|
|
|
48
112
|
entries.push({
|
|
49
113
|
provider: provName,
|
|
50
114
|
model,
|
|
51
115
|
isDefault,
|
|
52
|
-
contextWindow: contextWindows
|
|
116
|
+
contextWindow: modelRecordValue(contextWindows, model) ?? globalContext,
|
|
53
117
|
inputModalities: modalities,
|
|
54
118
|
reasoningEfforts: efforts,
|
|
55
119
|
});
|
|
@@ -102,9 +166,13 @@ function rejectUnexpectedArgs(args: string[], usage: string): void {
|
|
|
102
166
|
async function syncCustomModelsIfLive(): Promise<void> {
|
|
103
167
|
const live = await findLiveProxy();
|
|
104
168
|
if (!live) return;
|
|
105
|
-
await syncModelsToCodex(live.port).catch(error => {
|
|
169
|
+
const synced = await syncModelsToCodex(live.port).catch(error => {
|
|
106
170
|
console.error(`Warning: custom model saved, but catalog sync failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
171
|
+
return null;
|
|
107
172
|
});
|
|
173
|
+
if (synced?.status === "skipped") {
|
|
174
|
+
console.log("Custom model saved; Codex integration is OFF, so its catalog was not changed.");
|
|
175
|
+
}
|
|
108
176
|
}
|
|
109
177
|
|
|
110
178
|
async function handleCustomAdd(args: string[]): Promise<void> {
|
|
@@ -114,11 +182,12 @@ async function handleCustomAdd(args: string[]): Promise<void> {
|
|
|
114
182
|
const displayNameValue = consumeFlagValue(rest, "--display-name");
|
|
115
183
|
const contextWindowValue = consumeFlagValue(rest, "--context-window");
|
|
116
184
|
const modalitiesValue = consumeFlagValue(rest, "--modalities");
|
|
185
|
+
const reasoningEffortsValue = consumeFlagValue(rest, "--reasoning-efforts");
|
|
186
|
+
const defaultEffortValue = consumeFlagValue(rest, "--default-reasoning-effort");
|
|
117
187
|
rejectUnexpectedArgs(rest, ADD_USAGE);
|
|
118
188
|
|
|
119
189
|
if (!provider || !modelId) fail("provider and modelId are required", ADD_USAGE);
|
|
120
190
|
if (!isValidProviderName(provider)) fail(`invalid provider name "${provider}"`);
|
|
121
|
-
if (modelId.includes("/")) fail("modelId must not contain /");
|
|
122
191
|
|
|
123
192
|
const config = loadConfig();
|
|
124
193
|
if (!hasOwnProvider(config.providers, provider)) {
|
|
@@ -146,11 +215,18 @@ async function handleCustomAdd(args: string[]): Promise<void> {
|
|
|
146
215
|
inputModalities = [...new Set(inputModalities)];
|
|
147
216
|
}
|
|
148
217
|
|
|
218
|
+
const parsed = parseReasoningArgs(reasoningEffortsValue, defaultEffortValue);
|
|
219
|
+
if (parsed.error) fail(parsed.error);
|
|
220
|
+
|
|
149
221
|
const existing = config.customModels ?? [];
|
|
150
222
|
const slug = routedSlug(provider, modelId);
|
|
151
223
|
if (existing.some(model => routedSlug(model.provider, model.modelId) === slug)) {
|
|
152
224
|
fail(`custom model "${slug}" already exists`);
|
|
153
225
|
}
|
|
226
|
+
const known = knownModelIdsForProvider(provider, config.providers[provider], config);
|
|
227
|
+
if (encodedModelIdCollides(modelId, known)) {
|
|
228
|
+
fail(`custom model "${slug}" is ambiguous; it encodes to an existing model id`);
|
|
229
|
+
}
|
|
154
230
|
|
|
155
231
|
const entry: OcxCustomModel = {
|
|
156
232
|
id: randomUUID(),
|
|
@@ -159,6 +235,8 @@ async function handleCustomAdd(args: string[]): Promise<void> {
|
|
|
159
235
|
...(displayName ? { displayName } : {}),
|
|
160
236
|
...(contextWindow ? { contextWindow } : {}),
|
|
161
237
|
...(inputModalities ? { inputModalities } : {}),
|
|
238
|
+
...(parsed.reasoningEfforts ? { reasoningEfforts: parsed.reasoningEfforts } : {}),
|
|
239
|
+
...(parsed.defaultReasoningEffort ? { defaultReasoningEffort: parsed.defaultReasoningEffort } : {}),
|
|
162
240
|
addedAt: new Date().toISOString(),
|
|
163
241
|
};
|
|
164
242
|
config.customModels = [...existing, entry];
|
|
@@ -189,10 +267,16 @@ async function handleCustomRemove(args: string[]): Promise<void> {
|
|
|
189
267
|
|
|
190
268
|
const config = loadConfig();
|
|
191
269
|
const existing = config.customModels ?? [];
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
270
|
+
const matchingIndexes = existing.flatMap((model, index) => (
|
|
271
|
+
target.includes("/")
|
|
272
|
+
? slugEquals(target, model.provider, model.modelId)
|
|
273
|
+
: model.id === target
|
|
274
|
+
) ? [index] : []);
|
|
275
|
+
if (matchingIndexes.length === 0) fail(`custom model "${target}" not found`);
|
|
276
|
+
if (matchingIndexes.length > 1) {
|
|
277
|
+
fail(`custom model selector "${target}" is ambiguous; use the custom model id`);
|
|
278
|
+
}
|
|
279
|
+
const index = matchingIndexes[0]!;
|
|
196
280
|
|
|
197
281
|
const model = existing[index];
|
|
198
282
|
if (!confirmed && !(await confirmCustomRemoval(model))) {
|
|
@@ -214,12 +298,14 @@ function customModelCells(model: OcxCustomModel): string[] {
|
|
|
214
298
|
model.displayName ?? "-",
|
|
215
299
|
model.contextWindow ? `${Math.round(model.contextWindow / 1000)}k` : "-",
|
|
216
300
|
model.inputModalities?.join(",") ?? "-",
|
|
301
|
+
model.reasoningEfforts?.join(",") ?? "-",
|
|
302
|
+
model.defaultReasoningEffort ?? "-",
|
|
217
303
|
];
|
|
218
304
|
}
|
|
219
305
|
|
|
220
306
|
function printCustomModelGroup(provider: string, models: OcxCustomModel[]): void {
|
|
221
307
|
const rows = models.map(customModelCells);
|
|
222
|
-
const headers = ["ID", "MODEL", "DISPLAY NAME", "CONTEXT", "MODALITIES"];
|
|
308
|
+
const headers = ["ID", "MODEL", "DISPLAY NAME", "CONTEXT", "MODALITIES", "EFFORTS", "DEFAULT EFFORT"];
|
|
223
309
|
const widths = headers.map((header, column) => Math.max(header.length, ...rows.map(row => row[column].length)));
|
|
224
310
|
const line = (cells: string[]) => cells.map((cell, column) => cell.padEnd(widths[column])).join(" ");
|
|
225
311
|
console.log(`${provider}:`);
|
package/src/cli/observe.ts
CHANGED
|
@@ -14,8 +14,11 @@ import {
|
|
|
14
14
|
const USAGE = `Usage:
|
|
15
15
|
ocx observe logs [--provider <name>] [--model <id>] [--status <code>]
|
|
16
16
|
[--limit <n>] [--follow] [--json|--jsonl]
|
|
17
|
+
ocx logs explain <request-id> [--json]
|
|
18
|
+
ocx logs rebuild-index
|
|
19
|
+
ocx logs index-status
|
|
17
20
|
ocx observe usage [--range <7d|30d|all>] [--surface <all|codex|claude|grok>] [--json]
|
|
18
|
-
ocx observe storage [--json]
|
|
21
|
+
ocx observe storage [codex-logs [status|protect|unprotect|repair|compact] [--mode <compat|quiet>]] [--json]
|
|
19
22
|
ocx observe memory [--json]
|
|
20
23
|
ocx observe debug [--json]
|
|
21
24
|
ocx observe claude-inbound [--limit <n>] [--json]
|
|
@@ -79,6 +82,50 @@ async function logs(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
|
79
82
|
} while (true);
|
|
80
83
|
}
|
|
81
84
|
|
|
85
|
+
async function explain(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
86
|
+
const args = [...argv];
|
|
87
|
+
const requestId = args.shift();
|
|
88
|
+
const wantsJson = takeFlag(args, "--json");
|
|
89
|
+
if (!requestId) throw new CliUsageError("request id is required", USAGE);
|
|
90
|
+
rejectArgs(args, USAGE);
|
|
91
|
+
const encoded = encodeURIComponent(requestId);
|
|
92
|
+
const result = await runtimeRequest(`/api/request-history/${encoded}/route-decision`, {}, deps);
|
|
93
|
+
printData(result, wantsJson, wantsJson ? undefined : [JSON.stringify(result, null, 2)]);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function rebuildIndex(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
97
|
+
const args = [...argv];
|
|
98
|
+
const wantsJson = takeFlag(args, "--json");
|
|
99
|
+
rejectArgs(args, USAGE);
|
|
100
|
+
const { rebuildRequestHistoryIndex } = await import("../routing/history/indexer");
|
|
101
|
+
const meta = await rebuildRequestHistoryIndex();
|
|
102
|
+
if (wantsJson) printData(meta, true);
|
|
103
|
+
else {
|
|
104
|
+
console.log(`Request-history index rebuilt (${meta.dbPath})`);
|
|
105
|
+
console.log(` schema version: ${meta.schemaVersion}`);
|
|
106
|
+
console.log(` indexed rows: ${meta.indexedRows}`);
|
|
107
|
+
console.log(` source size: ${meta.sourceSize} bytes`);
|
|
108
|
+
console.log(` last error: ${meta.lastError ?? "none"}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function indexStatus(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
113
|
+
const args = [...argv];
|
|
114
|
+
const wantsJson = takeFlag(args, "--json");
|
|
115
|
+
rejectArgs(args, USAGE);
|
|
116
|
+
const { requestHistoryIndexStatus } = await import("../routing/history/indexer");
|
|
117
|
+
const meta = await requestHistoryIndexStatus();
|
|
118
|
+
if (wantsJson) printData(meta, true);
|
|
119
|
+
else {
|
|
120
|
+
console.log(`Request-history index (${meta.dbPath})`);
|
|
121
|
+
console.log(` schema version: ${meta.schemaVersion}`);
|
|
122
|
+
console.log(` indexed rows: ${meta.indexedRows}`);
|
|
123
|
+
console.log(` source size: ${meta.sourceSize} bytes`);
|
|
124
|
+
console.log(` indexed offset: ${meta.indexedOffset} bytes`);
|
|
125
|
+
console.log(` last error: ${meta.lastError ?? "none"}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
82
129
|
async function usage(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
83
130
|
const args = [...argv];
|
|
84
131
|
const wantsJson = takeFlag(args, "--json");
|
|
@@ -100,12 +147,54 @@ async function simple(path: string, argv: string[], deps: RuntimeApiDeps): Promi
|
|
|
100
147
|
printData(result, wantsJson, summaryLines(result));
|
|
101
148
|
}
|
|
102
149
|
|
|
150
|
+
async function storage(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
151
|
+
if (argv[0] !== "codex-logs") {
|
|
152
|
+
await simple("/api/storage", argv, deps);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const args = argv.slice(1);
|
|
157
|
+
const action = args[0] && !args[0].startsWith("-") ? args.shift()! : "status";
|
|
158
|
+
const wantsJson = takeFlag(args, "--json");
|
|
159
|
+
const mode = takeOption(args, "--mode");
|
|
160
|
+
rejectArgs(args, USAGE);
|
|
161
|
+
|
|
162
|
+
let result: unknown;
|
|
163
|
+
if (action === "status") {
|
|
164
|
+
if (mode !== undefined) throw new CliUsageError("--mode is only valid with codex-logs protect", USAGE);
|
|
165
|
+
result = await runtimeRequest("/api/storage/codex-logs", {}, deps);
|
|
166
|
+
} else if (action === "protect") {
|
|
167
|
+
const requestedMode = mode ?? "compat";
|
|
168
|
+
if (requestedMode !== "compat" && requestedMode !== "quiet") {
|
|
169
|
+
throw new CliUsageError("--mode must be compat or quiet", USAGE);
|
|
170
|
+
}
|
|
171
|
+
result = await runtimeRequest("/api/storage/codex-logs/protect", {
|
|
172
|
+
method: "POST",
|
|
173
|
+
headers: { "content-type": "application/json" },
|
|
174
|
+
body: JSON.stringify({ mode: requestedMode }),
|
|
175
|
+
}, deps);
|
|
176
|
+
} else if (action === "unprotect" || action === "repair" || action === "compact") {
|
|
177
|
+
if (mode !== undefined) throw new CliUsageError("--mode is only valid with codex-logs protect", USAGE);
|
|
178
|
+
result = await runtimeRequest(`/api/storage/codex-logs/${action}`, { method: "POST" }, deps);
|
|
179
|
+
} else {
|
|
180
|
+
throw new CliUsageError(`unknown codex-logs action ${action}`, USAGE);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
printData(result, wantsJson, summaryLines(result));
|
|
184
|
+
}
|
|
185
|
+
|
|
103
186
|
export async function handleObserveCommand(argv: string[], deps: RuntimeApiDeps = {}): Promise<number> {
|
|
104
187
|
return runCliAction(async () => {
|
|
105
188
|
const [sub = "logs", ...rest] = argv;
|
|
106
|
-
if (sub === "logs")
|
|
189
|
+
if (sub === "logs") {
|
|
190
|
+
const action = rest[0];
|
|
191
|
+
if (action === "explain") await explain(rest.slice(1), deps);
|
|
192
|
+
else if (action === "rebuild-index") await rebuildIndex(rest.slice(1), deps);
|
|
193
|
+
else if (action === "index-status") await indexStatus(rest.slice(1), deps);
|
|
194
|
+
else await logs(rest, deps);
|
|
195
|
+
}
|
|
107
196
|
else if (sub === "usage") await usage(rest, deps);
|
|
108
|
-
else if (sub === "storage") await
|
|
197
|
+
else if (sub === "storage") await storage(rest, deps);
|
|
109
198
|
else if (sub === "memory") await simple("/api/system/memory", rest, deps);
|
|
110
199
|
else if (sub === "debug") await simple("/api/debug", rest, deps);
|
|
111
200
|
else if (sub === "claude-inbound") await simple("/api/claude/inbound-debug", rest, deps);
|
package/src/cli/opencode.ts
CHANGED
|
@@ -40,6 +40,8 @@ import { loadServiceTokenFromFile, serviceApiTokenFilePath } from "../lib/servic
|
|
|
40
40
|
import { providerCodexAccountMode } from "../providers/registry";
|
|
41
41
|
import { findLiveProxy, probeHostname, type LiveProxy } from "../server/proxy-liveness";
|
|
42
42
|
import type { OcxConfig } from "../types";
|
|
43
|
+
import { withProcessRuntimeProvenance } from "../lib/bun-runtime";
|
|
44
|
+
import { selfLaunchArgv } from "../lib/self-launch-argv";
|
|
43
45
|
|
|
44
46
|
/**
|
|
45
47
|
* The provider-block serializer, its constants, and the config-path helpers now live in
|
|
@@ -493,11 +495,11 @@ async function ensureProxyForOpencode(config: OcxConfig): Promise<LiveProxy | nu
|
|
|
493
495
|
if (live) return live;
|
|
494
496
|
const cfgPort = config.port;
|
|
495
497
|
const pinPort = typeof cfgPort === "number" && cfgPort > 0 ? cfgPort : 10100;
|
|
496
|
-
const child = spawn(process.execPath, [
|
|
498
|
+
const child = spawn(process.execPath, selfLaunchArgv(["start", "--port", String(pinPort)]), {
|
|
497
499
|
detached: true,
|
|
498
500
|
stdio: "ignore",
|
|
499
501
|
windowsHide: true,
|
|
500
|
-
env: opencodeProxyStartEnv(process.env) as NodeJS.ProcessEnv,
|
|
502
|
+
env: withProcessRuntimeProvenance(opencodeProxyStartEnv(process.env) as NodeJS.ProcessEnv),
|
|
501
503
|
});
|
|
502
504
|
// Without a listener an 'error' (bad argv[1], EMFILE, AV denial) throws synchronously
|
|
503
505
|
// and kills this process; the health poll below already reports the failure properly.
|
|
@@ -16,7 +16,8 @@ const USAGE = `Usage:
|
|
|
16
16
|
ocx provider edit <name> [--adapter <id>] [--base-url <url>] [--default-model <id|->]
|
|
17
17
|
[--auth-mode <key|forward|oauth|local|->] [--note <text|->]
|
|
18
18
|
[--api-key-transport <x-api-key|bearer|->]
|
|
19
|
-
[--
|
|
19
|
+
[--headers <json>] [--enabled <on|off>] [--live-models <on|off>]
|
|
20
|
+
[--allow-private-network <on|off>] [--json]
|
|
20
21
|
ocx provider test <name> [--json]
|
|
21
22
|
ocx provider quota [--refresh] [--json]
|
|
22
23
|
ocx provider presets [--json]
|
|
@@ -39,6 +40,7 @@ async function edit(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
|
39
40
|
const authMode = cleared(takeOption(args, "--auth-mode"));
|
|
40
41
|
const note = cleared(takeOption(args, "--note"));
|
|
41
42
|
const apiKeyTransport = cleared(takeOption(args, "--api-key-transport"));
|
|
43
|
+
const headers = takeOption(args, "--headers");
|
|
42
44
|
const enabled = takeBooleanOption(args, "--enabled");
|
|
43
45
|
const liveModels = takeBooleanOption(args, "--live-models");
|
|
44
46
|
const allowPrivateNetwork = takeBooleanOption(args, "--allow-private-network");
|
|
@@ -49,6 +51,21 @@ async function edit(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
|
49
51
|
if (authMode !== undefined) patch.authMode = authMode;
|
|
50
52
|
if (note !== undefined) patch.note = note;
|
|
51
53
|
if (apiKeyTransport !== undefined) patch.apiKeyTransport = apiKeyTransport;
|
|
54
|
+
if (headers !== undefined) {
|
|
55
|
+
if (headers === "-") {
|
|
56
|
+
patch.headers = null;
|
|
57
|
+
} else {
|
|
58
|
+
let parsed: unknown;
|
|
59
|
+
try { parsed = JSON.parse(headers); } catch { throw new CliUsageError("--headers must be valid JSON"); }
|
|
60
|
+
if (parsed === null) {
|
|
61
|
+
patch.headers = null;
|
|
62
|
+
} else if (typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
63
|
+
throw new CliUsageError("--headers must be a JSON object like {\"X-Custom\":\"value\"}");
|
|
64
|
+
} else {
|
|
65
|
+
patch.headers = parsed;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
52
69
|
if (enabled !== undefined) patch.disabled = !enabled;
|
|
53
70
|
if (liveModels !== undefined) patch.liveModels = liveModels;
|
|
54
71
|
if (allowPrivateNetwork !== undefined) patch.allowPrivateNetwork = allowPrivateNetwork;
|
package/src/cli/provider.ts
CHANGED
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
* show <name> Show provider config details (secrets masked)
|
|
9
9
|
* set-default <name> Change the default provider
|
|
10
10
|
*/
|
|
11
|
-
import { apiKeyTransportConfigError, hasOwnProvider, isValidProviderName, loadConfig, saveConfig } from "../config";
|
|
11
|
+
import { apiKeyTransportConfigError, hasOwnProvider, isValidProviderName, loadConfig, sanitizeModelCostsForDisplay, saveConfig } from "../config";
|
|
12
12
|
import { hasHelpFlag } from "./help";
|
|
13
13
|
import { getProviderRegistryEntry, PROVIDER_REGISTRY } from "../providers/registry";
|
|
14
14
|
import { providerConfigSeed } from "../providers/derive";
|
|
15
|
+
import { dropProviderCustomModels } from "../providers/provider-id-rewrite";
|
|
15
16
|
import type { OcxProviderConfig } from "../types";
|
|
16
17
|
import { findLiveProxy } from "../server/proxy-liveness";
|
|
17
18
|
import { syncModelsToCodex } from "../codex/sync";
|
|
@@ -209,7 +210,14 @@ async function handleAdd(args: string[]): Promise<void> {
|
|
|
209
210
|
provConfig.apiKeyTransport = apiKeyTransport;
|
|
210
211
|
}
|
|
211
212
|
|
|
213
|
+
const existingProvider = config.providers[name];
|
|
212
214
|
config.providers[name] = provConfig;
|
|
215
|
+
// A --force overwrite rotates the key/endpoint but must not drop a
|
|
216
|
+
// user-configured price overlay (same rule as the /api/providers path and
|
|
217
|
+
// the login paths); there is no explicit clear/replace flag yet.
|
|
218
|
+
if (existingProvider?.modelCosts !== undefined && provConfig.modelCosts === undefined) {
|
|
219
|
+
provConfig.modelCosts = existingProvider.modelCosts;
|
|
220
|
+
}
|
|
213
221
|
if (allowPrivateNetwork) provConfig.allowPrivateNetwork = true;
|
|
214
222
|
if (setDefault) config.defaultProvider = name;
|
|
215
223
|
|
|
@@ -229,12 +237,18 @@ async function handleAdd(args: string[]): Promise<void> {
|
|
|
229
237
|
return;
|
|
230
238
|
}
|
|
231
239
|
|
|
240
|
+
let codexSyncSkipped = false;
|
|
232
241
|
if (wantsSync) {
|
|
233
242
|
const live = await findLiveProxy();
|
|
234
243
|
if (live) {
|
|
235
|
-
await syncModelsToCodex(live.port).catch(e => {
|
|
244
|
+
const synced = await syncModelsToCodex(live.port).catch(e => {
|
|
236
245
|
console.error(`Warning: sync failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
246
|
+
return null;
|
|
237
247
|
});
|
|
248
|
+
if (synced?.status === "skipped") {
|
|
249
|
+
codexSyncSkipped = true;
|
|
250
|
+
console.log("Provider saved; Codex integration is OFF, so Codex sync was skipped.");
|
|
251
|
+
}
|
|
238
252
|
}
|
|
239
253
|
}
|
|
240
254
|
|
|
@@ -249,7 +263,7 @@ async function handleAdd(args: string[]): Promise<void> {
|
|
|
249
263
|
console.log(` Set API key with: ocx provider add ${name} --api-key <key> --force`);
|
|
250
264
|
console.log(` Or set env var: ${envKey}`);
|
|
251
265
|
}
|
|
252
|
-
if (wantsSync) {
|
|
266
|
+
if (wantsSync && !codexSyncSkipped) {
|
|
253
267
|
console.log(` Models synced to Codex.`);
|
|
254
268
|
} else {
|
|
255
269
|
console.log(` Apply to Codex: ocx sync`);
|
|
@@ -296,6 +310,7 @@ function handleRemove(args: string[]): void {
|
|
|
296
310
|
}
|
|
297
311
|
|
|
298
312
|
delete config.providers[name];
|
|
313
|
+
const droppedCustomModels = dropProviderCustomModels(config, name);
|
|
299
314
|
validateAndSave(config);
|
|
300
315
|
|
|
301
316
|
|
|
@@ -306,11 +321,16 @@ function handleRemove(args: string[]): void {
|
|
|
306
321
|
remainingProviders: Object.keys(config.providers),
|
|
307
322
|
defaultProvider: config.defaultProvider,
|
|
308
323
|
needsSync: true,
|
|
324
|
+
...(droppedCustomModels > 0 ? { droppedCustomModels } : {}),
|
|
309
325
|
}, null, 2));
|
|
310
326
|
return;
|
|
311
327
|
}
|
|
312
328
|
|
|
313
329
|
console.log(`✅ Provider "${name}" removed.`);
|
|
330
|
+
if (droppedCustomModels > 0) {
|
|
331
|
+
const plural = droppedCustomModels === 1 ? "model" : "models";
|
|
332
|
+
console.log(` Also removed ${droppedCustomModels} custom ${plural} that belonged to it.`);
|
|
333
|
+
}
|
|
314
334
|
}
|
|
315
335
|
|
|
316
336
|
// ---------------------------------------------------------------------------
|
|
@@ -336,6 +356,7 @@ function handleShow(args: string[]): void {
|
|
|
336
356
|
const prov = config.providers[name];
|
|
337
357
|
const display = {
|
|
338
358
|
...prov,
|
|
359
|
+
...(prov.modelCosts !== undefined ? { modelCosts: sanitizeModelCostsForDisplay(prov.modelCosts) } : {}),
|
|
339
360
|
...(prov.apiKey ? { apiKey: maskSecret(prov.apiKey) } : {}),
|
|
340
361
|
...(prov.apiKeyPool ? { apiKeyPool: prov.apiKeyPool.map(e => ({ ...e, key: maskSecret(e.key) })) } : {}),
|
|
341
362
|
};
|