@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
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
export interface CliCommandEntry {
|
|
2
|
+
name: string;
|
|
3
|
+
aliases?: string[];
|
|
4
|
+
usage: string;
|
|
5
|
+
summary: string;
|
|
6
|
+
details?: string[];
|
|
7
|
+
hidden?: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const CLI_COMMANDS: CliCommandEntry[] = [
|
|
11
|
+
{
|
|
12
|
+
name: "init",
|
|
13
|
+
aliases: ["setup"],
|
|
14
|
+
usage: "ocx init",
|
|
15
|
+
summary: "Interactive setup for providers and Codex config injection.",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: "setup",
|
|
19
|
+
aliases: [],
|
|
20
|
+
usage: "ocx setup",
|
|
21
|
+
summary: "Interactive setup for providers and Codex config injection (alias of init).",
|
|
22
|
+
},
|
|
23
|
+
{ name: "start", usage: "ocx start [--port <port>]", summary: "Start the proxy server and sync models to Codex." },
|
|
24
|
+
{ name: "stop", usage: "ocx stop", summary: "Stop the proxy and restore native Codex config." },
|
|
25
|
+
{
|
|
26
|
+
name: "restore",
|
|
27
|
+
aliases: ["eject"],
|
|
28
|
+
usage: "ocx restore [back]",
|
|
29
|
+
summary: "Restore native Codex config without stopping the proxy; `restore back` re-points codex at the running proxy.",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "eject",
|
|
33
|
+
aliases: [],
|
|
34
|
+
usage: "ocx eject [back]",
|
|
35
|
+
summary: "Restore native Codex config without stopping the proxy; `eject back` re-points codex at the running proxy.",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "recover-history",
|
|
39
|
+
usage: "ocx recover-history --legacy-openai --yes",
|
|
40
|
+
summary: "Force all user-message opencodex rows to OpenAI for legacy recovery.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "uninstall",
|
|
44
|
+
aliases: ["remove"],
|
|
45
|
+
usage: "ocx uninstall",
|
|
46
|
+
summary: "Remove service/shim/config and restore native Codex.",
|
|
47
|
+
details: [
|
|
48
|
+
"Alias: ocx remove",
|
|
49
|
+
"Config cleanup requires ownership metadata created by a fresh install; legacy or shared directories are left in place.",
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "remove",
|
|
54
|
+
aliases: [],
|
|
55
|
+
usage: "ocx remove",
|
|
56
|
+
summary: "Remove service/shim/config and restore native Codex.",
|
|
57
|
+
details: [
|
|
58
|
+
"Alias of: ocx uninstall",
|
|
59
|
+
"Config cleanup requires ownership metadata created by a fresh install; legacy or shared directories are left in place.",
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "service",
|
|
64
|
+
usage: "ocx service [install|repair|restart|start|stop|status|uninstall|remove]",
|
|
65
|
+
summary: "Run as a background service.",
|
|
66
|
+
details: [
|
|
67
|
+
"With no subcommand, installs when absent or repairs/restarts an existing service.",
|
|
68
|
+
"`restart` is an alias of `repair` and does not re-register an installed service.",
|
|
69
|
+
"Use `ocx service status` to see diagnostics and log paths.",
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "codex-shim",
|
|
74
|
+
usage: "ocx codex-shim <install|status|uninstall|remove>",
|
|
75
|
+
summary: "Auto-start the proxy when `codex` launches.",
|
|
76
|
+
details: ["Use `remove` as an alias for `uninstall`."],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "tray",
|
|
80
|
+
usage: "ocx tray <install|start|stop|status|uninstall|remove> [--json] [--no-start]",
|
|
81
|
+
summary: "Install and control the Windows status tray icon.",
|
|
82
|
+
details: [
|
|
83
|
+
"The tray starts at Windows login and provides one-click proxy controls.",
|
|
84
|
+
"Tray start/stop controls the icon only; use its menu to start or stop the proxy.",
|
|
85
|
+
"--no-start (install only) installs the tray without launching it immediately.",
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{ name: "ensure", usage: "ocx ensure", summary: "Ensure the proxy is running and Codex config/cache are current." },
|
|
89
|
+
{
|
|
90
|
+
name: "sync",
|
|
91
|
+
usage: "ocx sync [--restart-codex] [--restart-desktop-app]",
|
|
92
|
+
summary: "Fetch provider models and inject them into Codex config.",
|
|
93
|
+
details: [
|
|
94
|
+
"After writing the catalog, warns if long-lived Codex app-server processes are still running.",
|
|
95
|
+
"--restart-codex sends SIGTERM only to matching app-server / code-mode-host processes (may interrupt active turns).",
|
|
96
|
+
"--restart-desktop-app (Windows only, opt-in) fully restarts the Codex desktop app so its model picker re-reads the catalog. Never implied by --restart-codex: it ends live conversations.",
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "sync-cache",
|
|
101
|
+
usage: "ocx sync-cache [--restart-codex] [--restart-desktop-app]",
|
|
102
|
+
summary: "Refresh Codex's model cache from the active catalog.",
|
|
103
|
+
details: [
|
|
104
|
+
"Warns when Codex app-server processes still hold an in-memory model list.",
|
|
105
|
+
"--restart-codex sends SIGTERM only to matching app-server / code-mode-host processes (may interrupt active turns).",
|
|
106
|
+
"--restart-desktop-app (Windows only, opt-in) fully restarts the Codex desktop app so its model picker re-reads the catalog. Never implied by --restart-codex: it ends live conversations.",
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
{ name: "status", usage: "ocx status", summary: "Check proxy server status." },
|
|
110
|
+
{
|
|
111
|
+
name: "doctor",
|
|
112
|
+
usage: "ocx doctor",
|
|
113
|
+
summary: "Diagnose environment/network issues (paths, WSL /mnt, proxy env, ChatGPT reachability).",
|
|
114
|
+
details: [
|
|
115
|
+
"Default mode is observe-only and reports the native-write coordinator state and exact path.",
|
|
116
|
+
"After stopping the proxy/service, `--recover-zero-byte-coordinator --yes` moves only a proven zero-byte coordinator to a same-directory backup.",
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: "debug",
|
|
121
|
+
usage: "ocx debug <provider|usage|injection|claude> <on|off|status|reset|logs [-f]>",
|
|
122
|
+
summary: "Show or toggle runtime provider, usage, injection, and Claude debug capture.",
|
|
123
|
+
details: [
|
|
124
|
+
"Provider: ocx debug provider on | off | status | reset | logs [-f]",
|
|
125
|
+
"Usage JSONL: ocx debug usage on | off | status | reset | logs [-f]",
|
|
126
|
+
"Env default: OCX_DEBUG=1 (legacy OCX_DEBUG_FRAMES still works)",
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
{ name: "login", usage: "ocx login <provider>", summary: "OAuth or API-key login for a provider." },
|
|
130
|
+
{ name: "logout", usage: "ocx logout <provider>", summary: "Remove a stored provider login." },
|
|
131
|
+
{ name: "gui", usage: "ocx gui", summary: "Open the opencodex dashboard." },
|
|
132
|
+
{
|
|
133
|
+
name: "update",
|
|
134
|
+
usage: "ocx update [--tag latest|preview]",
|
|
135
|
+
summary: "Update opencodex. Preview installs stay on the preview tag unless overridden.",
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "provider",
|
|
139
|
+
usage: "ocx provider <list|add|edit|test|remove|show|set-default|selected|quota|presets|account-mode>",
|
|
140
|
+
summary: "Non-interactive provider management.",
|
|
141
|
+
details: [
|
|
142
|
+
"Subcommands: list, add/edit/test/remove/show, set-default, selected, quota, presets, account-mode",
|
|
143
|
+
"Registry providers are auto-configured by name. Custom providers need --adapter and --base-url.",
|
|
144
|
+
"Run `ocx provider --help` for full usage and examples.",
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: "account",
|
|
149
|
+
usage: "ocx account <list|current|use|refresh|auto-switch|priority|login|reauth|code|cancel|remove|add-key|reset-credits|main> ...",
|
|
150
|
+
summary: "List and switch provider accounts and API-key pools (GUI parity).",
|
|
151
|
+
details: [
|
|
152
|
+
"list [provider] Codex account pool, OAuth accounts and API keys (identifiers shown masked as the API returns them).",
|
|
153
|
+
"current <provider> Show the active account or key.",
|
|
154
|
+
"use <provider> <id> Switch the active credential; 'main' selects the Codex App login.",
|
|
155
|
+
"refresh <provider> Force-refresh Codex or provider quota reports.",
|
|
156
|
+
"auto-switch <provider> <on|off|status|threshold N> Control the Codex pool threshold.",
|
|
157
|
+
"priority <provider> <id|main> [first|earlier|normal|later|last|-100..100|reset] Selection order; omit the value to read it.",
|
|
158
|
+
"remove <provider> <id> --yes Remove a stored account or key after an existence check.",
|
|
159
|
+
"add-key <provider> [--label <label>] Add a key read only from piped stdin.",
|
|
160
|
+
"login/reauth/code/cancel Run browser or manual-code auth from a headless shell.",
|
|
161
|
+
"reset-credits <id|main> [--consume --yes] Inspect or consume Codex reset credits.",
|
|
162
|
+
"main <subcommand> Manage the physical native Codex login separately from Pool routing.",
|
|
163
|
+
"Switching the active account takes effect immediately; running threads move on their next request, and in-flight requests keep the account they captured.",
|
|
164
|
+
"A selection-order change applies from the next unbound request and never moves a bound thread.",
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: "alias",
|
|
169
|
+
usage: "ocx alias <list|set|rm|defaults> ...",
|
|
170
|
+
summary: "Manage short provider and model names.",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "models",
|
|
174
|
+
aliases: ["model"],
|
|
175
|
+
usage: "ocx models <list|live|add|edit|remove|enable|disable|provider|selected|preset|context|shadow> ...",
|
|
176
|
+
summary: "List models and manage custom (manually registered) models.",
|
|
177
|
+
details: [
|
|
178
|
+
"List available models from static config with no subcommand (liveModels may add more at runtime).",
|
|
179
|
+
"add: register a model the provider catalog does not advertise yet.",
|
|
180
|
+
" --display-name <name> Human label (no slashes).",
|
|
181
|
+
" --context-window <tokens> e.g. 200000.",
|
|
182
|
+
" --modalities text,image Comma-separated (text|image|audio).",
|
|
183
|
+
"remove: delete a custom model by UUID or <provider>/<modelId>.",
|
|
184
|
+
"list-custom: show all custom models.",
|
|
185
|
+
"Changes apply immediately to a running proxy (catalog sync).",
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: "model",
|
|
190
|
+
aliases: [],
|
|
191
|
+
usage: "ocx model <subcommand>",
|
|
192
|
+
summary: "Alias of ocx models.",
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "combo",
|
|
196
|
+
usage: "ocx combo <list|show|set|remove> ...",
|
|
197
|
+
summary: "Manage combo failover and round-robin virtual models.",
|
|
198
|
+
details: ["Alias hierarchy: ocx route combo ...", "Use --targets provider/model[:weight],provider/model[:weight]."],
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
name: "route",
|
|
202
|
+
usage: "ocx route combo <list|show|set|remove> ...",
|
|
203
|
+
summary: "Manage routing features; combo is currently the supported routing resource.",
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "agent",
|
|
207
|
+
usage: "ocx agent <status|injection|effort|subagents|fallback|sidecar> ...",
|
|
208
|
+
summary: "Manage headless multi-agent, roster, effort, injection, and sidecar settings.",
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
name: "observe",
|
|
212
|
+
usage: "ocx observe <logs|usage|storage|memory|debug|claude-inbound|injection> ...",
|
|
213
|
+
summary: "Inspect proxy requests, usage, storage, memory, and debug data.",
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: "inspect",
|
|
217
|
+
usage: "ocx inspect <config|catalog|routing-analytics|pacing|key-providers|codex-prompt|client-config|star|windows-tray> ...",
|
|
218
|
+
summary: "Read effective config, catalog, analytics, pacing, and the generated client-config snippet.",
|
|
219
|
+
details: [
|
|
220
|
+
"`inspect star` reads the repository star status only. Starring uses your GitHub identity and is available from the dashboard alone.",
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
{ name: "logs", usage: "ocx logs [filters] [--follow] [--json|--jsonl]", summary: "Alias of ocx observe logs." },
|
|
224
|
+
{
|
|
225
|
+
name: "usage",
|
|
226
|
+
usage: "ocx usage [--range <today|1d|7d|30d|all>] [--surface <all|codex|claude|grok>] [--provider <name>] [--model <id>] [--json]",
|
|
227
|
+
summary: "Alias of ocx observe usage.",
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
name: "storage",
|
|
231
|
+
usage: "ocx storage <report|cleanup|trash|policy> ...",
|
|
232
|
+
summary: "Storage report, archived-session cleanup, trash restore, and the cleanup policy.",
|
|
233
|
+
details: [
|
|
234
|
+
"A bare `ocx storage` prints the report, as it did when this was an alias of `observe storage`.",
|
|
235
|
+
"`cleanup` previews by default and only deletes under --yes; `trash restore` and `policy run` also require --yes.",
|
|
236
|
+
],
|
|
237
|
+
},
|
|
238
|
+
{ name: "memory", usage: "ocx memory [--json]", summary: "Alias of ocx observe memory." },
|
|
239
|
+
{
|
|
240
|
+
name: "access",
|
|
241
|
+
usage: "ocx access <key|endpoints|models|test> ...",
|
|
242
|
+
summary: "Manage OpenCodex admission API keys and inspect external endpoints.",
|
|
243
|
+
},
|
|
244
|
+
{ name: "api-key", usage: "ocx api-key <list|create|remove> ...", summary: "Alias of ocx access key." },
|
|
245
|
+
{
|
|
246
|
+
name: "export",
|
|
247
|
+
usage: "ocx export --client <opencode|pi|omp|hermes|openclaw|kimi|gajae|dsh|mcode|zcode|prime|cline> [--json] [--out <path>] [--force]",
|
|
248
|
+
summary: "Print a client config (OpenCode, Pi, OMP, Hermes, OpenClaw, Kimi Code, Gajae Code, DeepSeek Harness, MiniMax Code, ZCode, Prime Agent, Cline) wired to the running proxy.",
|
|
249
|
+
details: [
|
|
250
|
+
"--json prints the generated document as JSON on stdout; use --out for the client's native format.",
|
|
251
|
+
"--out <path> writes the native config there and refuses to replace an existing file without --force.",
|
|
252
|
+
"The config never contains a real key; it carries a documented env reference or a non-secret loopback placeholder.",
|
|
253
|
+
"The destination path is printed for merging by hand — ocx never writes your real client config.",
|
|
254
|
+
],
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
name: "grok",
|
|
258
|
+
usage: "ocx grok <status|exclude|include|set|clear|apply> ...",
|
|
259
|
+
summary: "Manage and apply the Grok Build model fence.",
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
name: "integration",
|
|
263
|
+
usage: "ocx integration <claude|grok|client|native> ...",
|
|
264
|
+
summary: "Manage supported client integrations, and the native client toggles.",
|
|
265
|
+
details: [
|
|
266
|
+
"`native` shows or flips the native Claude/Claude Desktop/Codex/Grok toggles; the other subcommands manage the reversible file integrations.",
|
|
267
|
+
],
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
name: "system",
|
|
271
|
+
usage: "ocx system <status|settings|startup|diagnostics|sync|update> ...",
|
|
272
|
+
summary: "Manage headless runtime settings, startup, sync, diagnostics, and updates.",
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: "config",
|
|
276
|
+
usage: "ocx config <show|get|set|unset|validate|export|import> ...",
|
|
277
|
+
summary: "Inspect and safely modify validated OpenCodex configuration.",
|
|
278
|
+
details: ["Secrets are masked by show/get. Import requires --yes and validates before writing."],
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
name: "claude",
|
|
282
|
+
usage: "ocx claude [claude args...]",
|
|
283
|
+
summary: "Launch Claude Code wired to the proxy (env injection + gateway model discovery).",
|
|
284
|
+
details: [
|
|
285
|
+
"Ensures the proxy is running, then execs `claude` with ANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN,",
|
|
286
|
+
"CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 and model slots from config.claudeCode.",
|
|
287
|
+
"Routed models appear in the native /model picker with stable claude-opus-4-8-2026MMDD slot aliases (Claude Code >= 2.1.129).",
|
|
288
|
+
"Older versions: pick models via ANTHROPIC_MODEL or /model <id> directly (any string passes through).",
|
|
289
|
+
"User-exported ANTHROPIC_* variables always take precedence.",
|
|
290
|
+
"",
|
|
291
|
+
"Claude Desktop profile:",
|
|
292
|
+
" ocx claude desktop [apply] Save and apply the four-family profile",
|
|
293
|
+
" ocx claude desktop show [--json] Show routes, families, and defaults",
|
|
294
|
+
" ocx claude desktop move <route> <family> [--default]",
|
|
295
|
+
" ocx claude desktop default <family> <route|none>",
|
|
296
|
+
" ocx claude desktop export <path|-> Export versioned JSON (`-` = stdout)",
|
|
297
|
+
" ocx claude desktop import <path> [--apply] Validate and import JSON",
|
|
298
|
+
"Families: opus, fable, sonnet, haiku. New routes start in opus.",
|
|
299
|
+
"`none` is valid only when that family is empty.",
|
|
300
|
+
"Legacy apply flags remain supported: --static, --hybrid, --discovery-only.",
|
|
301
|
+
"",
|
|
302
|
+
"Claude Code settings: ocx claude config <status|set> ...",
|
|
303
|
+
],
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
name: "opencode",
|
|
307
|
+
usage: "ocx opencode [opencode args...]",
|
|
308
|
+
summary: "Launch opencode wired to the proxy (runtime provider config).",
|
|
309
|
+
details: [
|
|
310
|
+
"Ensures the proxy is running, then execs `opencode` with the generated `provider.opencodex`",
|
|
311
|
+
"block injected through OpenCode's inline runtime layer (`OPENCODE_CONFIG_CONTENT`). Any",
|
|
312
|
+
"existing inline config in the environment is preserved and only `provider.opencodex` is",
|
|
313
|
+
"overwritten for this launch.",
|
|
314
|
+
"Global/project opencode.json may be read to warn about an existing provider.opencodex",
|
|
315
|
+
"override; on-disk files are never modified.",
|
|
316
|
+
"Routed models appear in the model picker as opencodex/<provider>/<model>.",
|
|
317
|
+
"Stop using `ocx opencode` and plain `opencode` behaves exactly as before.",
|
|
318
|
+
],
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
name: "mcode",
|
|
322
|
+
usage: "ocx mcode [mcode args...]",
|
|
323
|
+
summary: "Launch MiniMax Code through its managed OpenCodex provider.",
|
|
324
|
+
details: [
|
|
325
|
+
"First connect the reversible file integration: ocx integration client enable --client mcode",
|
|
326
|
+
"The launcher verifies that custom_provider.opencodex targets the current loopback proxy before starting MCode.",
|
|
327
|
+
"Select custom_provider:opencodex/<model> from MCode's model picker.",
|
|
328
|
+
],
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
name: "mmx",
|
|
332
|
+
usage: "ocx mmx text <chat|repl> [mmx args...]",
|
|
333
|
+
summary: "Launch MiniMax CLI text commands through the proxy.",
|
|
334
|
+
details: [
|
|
335
|
+
"Only the official MMX Anthropic-compatible text surface is proxied.",
|
|
336
|
+
"Use plain mmx for MiniMax-native image, video, speech, music, vision, search, quota, auth, config, file, and update commands.",
|
|
337
|
+
"The wrapper isolates ~/.mmx credentials and refuses --api-key/--base-url overrides.",
|
|
338
|
+
],
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
name: "zcode",
|
|
342
|
+
usage: "ocx zcode [status|enable|disable|history|restore] [--json]",
|
|
343
|
+
summary: "Connect ZCode (Z.ai desktop client) to the proxy via its managed provider.",
|
|
344
|
+
details: [
|
|
345
|
+
"Alias of ocx integration client <sub> --client zcode.",
|
|
346
|
+
"enable writes the managed provider.opencodex block into ~/.zcode/v2/config.json; disable removes only that block.",
|
|
347
|
+
"ZCode reads its config at startup — restart ZCode after enable/disable.",
|
|
348
|
+
"Select OpenCodex Proxy/<provider>/<model> from ZCode's model picker.",
|
|
349
|
+
],
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
name: "restart",
|
|
353
|
+
usage: "ocx restart",
|
|
354
|
+
summary: "Stop the proxy and restart it (background). Equivalent to stop + ensure.",
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
name: "v2",
|
|
358
|
+
usage: "ocx v2 <status|on|off|mode <v1|default|v2>|keep-native-v1 <on|off>|threads <n>>",
|
|
359
|
+
summary: "Toggle the Codex multi_agent_v2 feature (multi-agent surface).",
|
|
360
|
+
details: [
|
|
361
|
+
"status Show flag, multi-agent mode, and thread limit.",
|
|
362
|
+
"on | off Enable/disable multi_agent_v2 (catalog resyncs).",
|
|
363
|
+
"mode <v1|default|v2> Force all models to one surface, or respect upstream pins.",
|
|
364
|
+
"keep-native-v1 <on|off> Under mode v2, keep ChatGPT-native models on v1.",
|
|
365
|
+
"threads <n> Set max_concurrent_threads_per_session (integer >= 1).",
|
|
366
|
+
"Flips preserve the active thread limit while moving between v1/v2 modes.",
|
|
367
|
+
],
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
name: "health",
|
|
371
|
+
usage: "ocx health [--json]",
|
|
372
|
+
summary: "Check proxy health. Exits 0 if healthy, 1 otherwise.",
|
|
373
|
+
details: ["Use --json for structured output: {ok, pid, port}."],
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
name: "capabilities",
|
|
377
|
+
usage: "ocx capabilities [--json] [--mutating-only] [--route <path>]",
|
|
378
|
+
summary: "List the declared CLI capabilities and the management routes they drive.",
|
|
379
|
+
details: [
|
|
380
|
+
"The machine-readable surface index: start here when driving ocx programmatically instead of parsing help text.",
|
|
381
|
+
"--route <path> answers the inverse question: which commands drive this management route.",
|
|
382
|
+
],
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
name: "ready",
|
|
386
|
+
usage: "ocx ready [--json] [--wait [--timeout <seconds>]]",
|
|
387
|
+
summary: "Check post-sync readiness. Exits 0 only when ready.",
|
|
388
|
+
details: [
|
|
389
|
+
"Exact unauthenticated GET /readyz returns HTTP 200 when ready, or 503 with Retry-After: 1 for pending or failed.",
|
|
390
|
+
"Its sanitized HTTP identity is {service, version, uptime, pid, port, status}; /healthz is separate liveness, not readiness.",
|
|
391
|
+
"Default is a single identity-checked /readyz probe; old proxies without /readyz fail closed as unreachable.",
|
|
392
|
+
"--wait polls until ready or timeout, but exits immediately on terminal failed (default 45s, max 300s).",
|
|
393
|
+
"--timeout requires --wait and accepts a positive integer (1..300).",
|
|
394
|
+
"--json emits {ready, status, pid, port}; status is one of ready|pending|failed|unreachable.",
|
|
395
|
+
"Invalid or unknown arguments exit 64. Not-ready, pending, failed, timeout, and unreachable exit 1.",
|
|
396
|
+
],
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
name: "lab",
|
|
400
|
+
usage: "ocx lab <status|verdicts|subjects|subject|observations|events|event|artifacts|artifact|catalog> [options] [--json]",
|
|
401
|
+
summary: "Read-only Compatibility Lab projection inspection (local SQLite; no daemon).",
|
|
402
|
+
details: [
|
|
403
|
+
"status Projection availability, schema versions, and row counts.",
|
|
404
|
+
"verdicts Paginated derived compatibility verdicts with filters.",
|
|
405
|
+
"subjects List subjects; subject <id> returns one typed subject.",
|
|
406
|
+
"observations Paginated observation rows from the projection.",
|
|
407
|
+
"events Event history; event <id> returns one safe typed event.",
|
|
408
|
+
"artifacts Artifact metadata only (no content download).",
|
|
409
|
+
"catalog Packaged protocol/live scenario catalog metadata.",
|
|
410
|
+
"Reads never rebuild the projection, trigger probes, or require the proxy.",
|
|
411
|
+
],
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
name: "pi",
|
|
415
|
+
usage: "ocx pi [status|apply|remove|settings|packages|pi-args...]",
|
|
416
|
+
summary: "Manage Pi models/settings/packages, or launch Pi wired to the proxy.",
|
|
417
|
+
details: [
|
|
418
|
+
"Management: status, apply (providers.opencodex), remove, settings, packages.",
|
|
419
|
+
"Launch: any other args are forwarded to the real `pi` binary after a best-effort apply.",
|
|
420
|
+
"Only providers.opencodex is written; other Pi providers and settings keys are preserved.",
|
|
421
|
+
"Package install/remove shells out to `pi install` / `pi remove` (full system access).",
|
|
422
|
+
],
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
name: "sync-cloud",
|
|
426
|
+
usage: "ocx sync-cloud [status|login|pull|push|daemon|stop]",
|
|
427
|
+
summary: "Manage OneDrive cloud sync for config and logs.",
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
name: "__refresh-version",
|
|
431
|
+
hidden: true,
|
|
432
|
+
usage: "ocx __refresh-version [preview|latest]",
|
|
433
|
+
summary: "Hidden detached helper: refresh the cached latest version.",
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
name: "__tray-start",
|
|
437
|
+
hidden: true,
|
|
438
|
+
usage: "ocx __tray-start",
|
|
439
|
+
summary: "Hidden internal: start the tray proxy.",
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
name: "__tray-restart",
|
|
443
|
+
hidden: true,
|
|
444
|
+
usage: "ocx __tray-restart",
|
|
445
|
+
summary: "Hidden internal: restart the tray proxy.",
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
name: "__startup-health",
|
|
449
|
+
hidden: true,
|
|
450
|
+
usage: "ocx __startup-health",
|
|
451
|
+
summary: "Hidden internal: print startup health JSON.",
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
name: "__tray-host",
|
|
455
|
+
hidden: true,
|
|
456
|
+
usage: "ocx __tray-host",
|
|
457
|
+
summary: "Hidden internal: run the Windows tray host.",
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
name: "__gui-update-worker",
|
|
461
|
+
hidden: true,
|
|
462
|
+
usage: "ocx __gui-update-worker <jobId> [channel] [restart]",
|
|
463
|
+
summary: "Hidden internal: run the GUI update worker.",
|
|
464
|
+
},
|
|
465
|
+
];
|
|
466
|
+
|
|
467
|
+
export function findCommand(name: string): CliCommandEntry | undefined {
|
|
468
|
+
// Exact-name wins so alias-name entries (setup/eject/remove/model) keep their
|
|
469
|
+
// own help text; the canonical entry is the fallback for alias lookups.
|
|
470
|
+
return CLI_COMMANDS.find(entry => entry.name === name)
|
|
471
|
+
?? CLI_COMMANDS.find(entry => entry.aliases?.includes(name));
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export function commandNames(): string[] {
|
|
475
|
+
return CLI_COMMANDS.map(entry => entry.name);
|
|
476
|
+
}
|
package/src/cli/root.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI head: version/help early exits, `ocx ready` pre-parse, and the bounded
|
|
3
|
+
* Codex-shim auto-restore preflight, in that order (Phase 1 of the CLI
|
|
4
|
+
* deepening — moved out of src/cli/index.ts).
|
|
5
|
+
*
|
|
6
|
+
* `parseCliHead` is pure (no I/O, no process access) so the ordering and the
|
|
7
|
+
* single-parse contract are unit-testable without a subprocess. `runCli` owns
|
|
8
|
+
* the exit paths and the shim preflight, then returns the dispatchable head
|
|
9
|
+
* for the command switch in src/cli/index.ts.
|
|
10
|
+
*/
|
|
11
|
+
import { hasHelpFlag, printSubcommandUsage, printUsage, printVersion } from "./help";
|
|
12
|
+
import { parseReadyArgs, type ReadyArgs } from "./ready";
|
|
13
|
+
import { maybeAutoRestoreCodexShim } from "./codex-shim-autorestore";
|
|
14
|
+
|
|
15
|
+
export interface CliHead {
|
|
16
|
+
kind: "version" | "help" | "ready" | "command";
|
|
17
|
+
command: string | undefined;
|
|
18
|
+
args: string[];
|
|
19
|
+
/** For kind "help": the subcommand whose usage should print, if any. */
|
|
20
|
+
helpTarget?: string;
|
|
21
|
+
/** Present only for `ready`; undefined when the ready args failed to parse. */
|
|
22
|
+
readyArgs?: ReadyArgs;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function parseCliHead(argv: string[]): CliHead {
|
|
26
|
+
const command = argv[0];
|
|
27
|
+
const args = argv;
|
|
28
|
+
if (command === "--version" || command === "-v" || command === "version") {
|
|
29
|
+
return { kind: "version", command, args };
|
|
30
|
+
}
|
|
31
|
+
if (command === undefined || command === "help" || command === "--help" || command === "-h") {
|
|
32
|
+
// `ocx help <sub>` carries the subcommand; bare/flag help prints the full usage.
|
|
33
|
+
return {
|
|
34
|
+
kind: "help",
|
|
35
|
+
command,
|
|
36
|
+
args,
|
|
37
|
+
...(command === "help" && args[1] ? { helpTarget: args[1] } : {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (command !== "help" && hasHelpFlag(args.slice(1))) {
|
|
41
|
+
// `ocx <cmd> --help|-h|help` prints that command's usage, not the full list.
|
|
42
|
+
return { kind: "help", command, args, helpTarget: command };
|
|
43
|
+
}
|
|
44
|
+
// P1: pre-parse `ocx ready` and reject invalid arguments with exit 64 BEFORE
|
|
45
|
+
// maybeAutoRestoreCodexShim (or any discovery/probe/filesystem-capable global
|
|
46
|
+
// preflight) runs. `ready --help` / `help ready` already exited above, so this
|
|
47
|
+
// only sees ready args without a help flag. Valid args are stashed so the
|
|
48
|
+
// switch dispatch can call runReady without a second parse.
|
|
49
|
+
if (command === "ready") {
|
|
50
|
+
const parsed = parseReadyArgs(args.slice(1));
|
|
51
|
+
if (!parsed.ok) return { kind: "ready", command, args, readyArgs: undefined };
|
|
52
|
+
return { kind: "ready", command, args, readyArgs: parsed.args };
|
|
53
|
+
}
|
|
54
|
+
return { kind: "command", command, args };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function runCli(argv: string[]): Promise<CliHead> {
|
|
58
|
+
const head = parseCliHead(argv);
|
|
59
|
+
switch (head.kind) {
|
|
60
|
+
case "version":
|
|
61
|
+
printVersion();
|
|
62
|
+
process.exit(0);
|
|
63
|
+
case "help": {
|
|
64
|
+
if (head.helpTarget) printSubcommandUsage(head.helpTarget);
|
|
65
|
+
else printUsage();
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
68
|
+
case "ready": {
|
|
69
|
+
// Fail-closed impossible-state guard: parseCliHead already ran the
|
|
70
|
+
// pre-parse before any shim/preflight side effect, so reaching here
|
|
71
|
+
// without readyArgs means dispatch diverged. Refuse with code 64 and
|
|
72
|
+
// perform NO I/O (no discovery/probe).
|
|
73
|
+
if (!head.readyArgs) {
|
|
74
|
+
console.error("Usage: ocx ready [--json] [--wait [--timeout <seconds>]]");
|
|
75
|
+
console.error(" --timeout requires --wait; <seconds> must be a positive integer (1..300).");
|
|
76
|
+
console.error(" Default wait timeout is 45 seconds.");
|
|
77
|
+
process.exit(64);
|
|
78
|
+
}
|
|
79
|
+
maybeAutoRestoreCodexShim(head.command, head.args);
|
|
80
|
+
return head;
|
|
81
|
+
}
|
|
82
|
+
case "command":
|
|
83
|
+
maybeAutoRestoreCodexShim(head.command, head.args);
|
|
84
|
+
return head;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CliUsageError,
|
|
3
|
+
printData,
|
|
4
|
+
rejectArgs,
|
|
5
|
+
runCliAction,
|
|
6
|
+
runtimeRequest,
|
|
7
|
+
takeFlag,
|
|
8
|
+
takeIntegerOption,
|
|
9
|
+
type RuntimeApiDeps,
|
|
10
|
+
} from "./runtime-api";
|
|
11
|
+
|
|
12
|
+
const USAGE = `Usage:
|
|
13
|
+
ocx route policy list [--json]
|
|
14
|
+
ocx route policy show <id> [--json]
|
|
15
|
+
ocx route policy dry-run <id> [--model-context <tokens>] [--tools]
|
|
16
|
+
[--image] [--structured-output] [--json]
|
|
17
|
+
ocx route policy evaluate <id> [--model-context <tokens>] [--tools]
|
|
18
|
+
[--image] [--structured-output] [--json]`;
|
|
19
|
+
|
|
20
|
+
interface ProfileRow {
|
|
21
|
+
id?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
revision?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function list(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
27
|
+
const args = [...argv];
|
|
28
|
+
const wantsJson = takeFlag(args, "--json");
|
|
29
|
+
rejectArgs(args, USAGE);
|
|
30
|
+
const result = await runtimeRequest<{ profiles?: ProfileRow[] }>("/api/routing-profiles", {}, deps);
|
|
31
|
+
const rows = result.profiles ?? [];
|
|
32
|
+
printData(
|
|
33
|
+
result,
|
|
34
|
+
wantsJson,
|
|
35
|
+
rows.length
|
|
36
|
+
? rows.map(row => `${String(row.id)} ${String(row.model ?? `policy/${row.id}`)} rev:${String(row.revision ?? "-")}`)
|
|
37
|
+
: ["No routing profiles configured."],
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function show(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
42
|
+
const args = [...argv];
|
|
43
|
+
const id = args.shift();
|
|
44
|
+
const wantsJson = takeFlag(args, "--json");
|
|
45
|
+
if (!id || id.startsWith("-")) throw new CliUsageError("profile id is required", USAGE);
|
|
46
|
+
rejectArgs(args, USAGE);
|
|
47
|
+
const result = await runtimeRequest<{ profiles?: ProfileRow[] }>("/api/routing-profiles", {}, deps);
|
|
48
|
+
const profile = (result.profiles ?? []).find(candidate => candidate.id === id);
|
|
49
|
+
if (!profile) throw new CliUsageError(`unknown routing profile: ${id}`, USAGE);
|
|
50
|
+
printData(profile, wantsJson);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function dryRun(argv: string[], deps: RuntimeApiDeps): Promise<void> {
|
|
54
|
+
const args = [...argv];
|
|
55
|
+
const id = args.shift();
|
|
56
|
+
const wantsJson = takeFlag(args, "--json");
|
|
57
|
+
if (!id || id.startsWith("-")) throw new CliUsageError("profile id is required", USAGE);
|
|
58
|
+
const modelContext = takeIntegerOption(args, "--model-context", { min: 1 });
|
|
59
|
+
const tools = takeFlag(args, "--tools");
|
|
60
|
+
const image = takeFlag(args, "--image");
|
|
61
|
+
const structuredOutput = takeFlag(args, "--structured-output");
|
|
62
|
+
rejectArgs(args, USAGE);
|
|
63
|
+
const result = await runtimeRequest(
|
|
64
|
+
"/api/routing-profiles/dry-run",
|
|
65
|
+
{
|
|
66
|
+
method: "POST",
|
|
67
|
+
headers: { "content-type": "application/json" },
|
|
68
|
+
body: JSON.stringify({
|
|
69
|
+
profile: id,
|
|
70
|
+
evidence: {
|
|
71
|
+
...(modelContext !== undefined ? { contextWindow: modelContext } : {}),
|
|
72
|
+
...(tools ? { toolsRequired: true } : {}),
|
|
73
|
+
...(image ? { imageInputRequired: true } : {}),
|
|
74
|
+
...(structuredOutput ? { structuredOutputRequired: true } : {}),
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
},
|
|
78
|
+
deps,
|
|
79
|
+
);
|
|
80
|
+
printData(result, wantsJson);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function handleRoutePolicyCommand(argv: string[], deps: RuntimeApiDeps = {}): Promise<number> {
|
|
84
|
+
return runCliAction(async () => {
|
|
85
|
+
const [sub, ...rest] = argv;
|
|
86
|
+
if (!sub) throw new CliUsageError("route policy requires a subcommand (list, show, dry-run, evaluate)", USAGE);
|
|
87
|
+
if (sub === "list") await list(rest, deps);
|
|
88
|
+
else if (sub === "show") await show(rest, deps);
|
|
89
|
+
else if (sub === "dry-run" || sub === "evaluate") await dryRun(rest, deps);
|
|
90
|
+
else throw new CliUsageError(`unknown route policy command: ${sub}`, USAGE);
|
|
91
|
+
});
|
|
92
|
+
}
|