@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
|
@@ -9,17 +9,18 @@ import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
|
|
|
9
9
|
import type { OcxConfig, OcxProviderConfig } from "../../types";
|
|
10
10
|
import { modelInList } from "../../types";
|
|
11
11
|
import { CODEX_REASONING_LEVELS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort";
|
|
12
|
-
import {
|
|
12
|
+
import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata";
|
|
13
13
|
import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive";
|
|
14
14
|
import { getProviderRegistryEntry } from "../../providers/registry";
|
|
15
15
|
import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap";
|
|
16
|
-
import { routedSlug, slugEquals, slugsEquivalent } from "../../providers/slug-codec";
|
|
16
|
+
import { routedSlug, slugEquals, slugEquivalenceKey, slugsEquivalent } from "../../providers/slug-codec";
|
|
17
17
|
import { CODEX_GPT5_IDENTITY_LINE } from "../../adapters/identity";
|
|
18
18
|
import { filterCursorConfiguredModelsByLiveDiscovery } from "../../adapters/cursor/discovery";
|
|
19
19
|
import { fetchCursorUsableModels } from "../../adapters/cursor/live-models";
|
|
20
20
|
import { isCanonicalOpenAiForwardProvider, OPENAI_API_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID } from "../../providers/openai-tiers";
|
|
21
21
|
import {
|
|
22
22
|
COMBO_NAMESPACE,
|
|
23
|
+
comboDisabledModelSelectors,
|
|
23
24
|
comboModelId,
|
|
24
25
|
getCombo,
|
|
25
26
|
listComboIds,
|
|
@@ -128,13 +129,30 @@ export function deriveComboCatalogModel(
|
|
|
128
129
|
): CatalogModel | null {
|
|
129
130
|
if (comboCatalogOmissionReason(combo, members) !== null) return null;
|
|
130
131
|
|
|
131
|
-
const
|
|
132
|
+
const derivedInputModalities = intersectStrings(
|
|
132
133
|
members.map(member => member.inputModalities ?? ["text"]),
|
|
133
134
|
);
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
const inputModalities = combo.imageInput === "disabled"
|
|
136
|
+
? derivedInputModalities.filter(modality => modality !== "image")
|
|
137
|
+
: derivedInputModalities;
|
|
138
|
+
if (inputModalities.length === 0) return null;
|
|
139
|
+
// Unknown ladders (`undefined`) are wildcards for catalog derivation — same
|
|
140
|
+
// boundary as the GUI picker. An explicit empty ladder still constrains.
|
|
141
|
+
const advertisedLadders = members
|
|
142
|
+
.map(member => member.reasoningEfforts)
|
|
143
|
+
.filter((ladder): ladder is string[] => ladder !== undefined);
|
|
144
|
+
const reasoningEfforts = advertisedLadders.length === 0
|
|
145
|
+
? []
|
|
146
|
+
: intersectStrings(advertisedLadders);
|
|
137
147
|
const contextWindow = Math.min(...members.map(member => member.contextWindow!));
|
|
148
|
+
const limitingMembers = members.filter(member => member.contextWindow === contextWindow);
|
|
149
|
+
const hasLimitingContextCapMetadata = limitingMembers.some(
|
|
150
|
+
member => typeof member.contextCapped === "boolean",
|
|
151
|
+
);
|
|
152
|
+
// A combo is cap-limited only when every member defining its effective minimum was
|
|
153
|
+
// itself reduced by a provider cap. An uncapped member at the same minimum means the
|
|
154
|
+
// combo would have the same window even without the cap.
|
|
155
|
+
const contextCapped = limitingMembers.every(member => member.contextCapped === true);
|
|
138
156
|
const maxInputTokens = Math.min(
|
|
139
157
|
...members.map(member => member.maxInputTokens ?? member.contextWindow!),
|
|
140
158
|
);
|
|
@@ -149,14 +167,25 @@ export function deriveComboCatalogModel(
|
|
|
149
167
|
owned_by: COMBO_NAMESPACE,
|
|
150
168
|
contextWindow,
|
|
151
169
|
maxInputTokens,
|
|
170
|
+
...(hasLimitingContextCapMetadata ? { contextCapped } : {}),
|
|
152
171
|
inputModalities,
|
|
153
172
|
reasoningEfforts,
|
|
154
173
|
...(combo.alias ? { alias: combo.alias } : {}),
|
|
174
|
+
...(combo.nativeAlias ? { nativeAlias: true } : {}),
|
|
175
|
+
...(combo.displayName ? { displayName: combo.displayName } : {}),
|
|
155
176
|
...(defaultReasoningEffort ? { defaultReasoningEffort } : {}),
|
|
156
177
|
...(members.every(member => member.parallelToolCalls === true)
|
|
157
178
|
? { parallelToolCalls: true }
|
|
158
179
|
: {}),
|
|
180
|
+
...(members.every(member => member.supportsServiceTier === true)
|
|
181
|
+
? { supportsServiceTier: true }
|
|
182
|
+
: members.some(member => member.supportsServiceTier === false)
|
|
183
|
+
? { supportsServiceTier: false }
|
|
184
|
+
: {}),
|
|
159
185
|
...(members.some(member => member.supportsReasoningSummaries === false) ? { supportsReasoningSummaries: false } : {}),
|
|
186
|
+
...(members.every(member => member.codexToolMode === "shell")
|
|
187
|
+
? { codexToolMode: "shell" as const }
|
|
188
|
+
: {}),
|
|
160
189
|
};
|
|
161
190
|
}
|
|
162
191
|
|
|
@@ -252,12 +281,15 @@ export function exactComboCatalogSlugs(
|
|
|
252
281
|
): Set<string> {
|
|
253
282
|
const disabled = new Set(config.disabledModels ?? []);
|
|
254
283
|
return new Set(listComboIds(config).flatMap(id => {
|
|
255
|
-
const
|
|
256
|
-
|
|
284
|
+
const raw = config.combos?.[id];
|
|
285
|
+
const alias = typeof raw?.alias === "string"
|
|
286
|
+
? raw.alias.trim()
|
|
257
287
|
: "";
|
|
258
288
|
const canonical = comboModelId(id);
|
|
259
289
|
const publicSlug = alias || canonical;
|
|
260
|
-
|
|
290
|
+
const comboDisabled = comboDisabledModelSelectors(id, raw ?? {})
|
|
291
|
+
.some(selector => disabled.has(selector));
|
|
292
|
+
return comboDisabled ? [] : [publicSlug];
|
|
261
293
|
}));
|
|
262
294
|
}
|
|
263
295
|
|
|
@@ -281,6 +313,10 @@ export function resetOpenAiApiCatalogWarningStateForTests(): void {
|
|
|
281
313
|
export const slugAliasCollisionWarnings = new Set<string>();
|
|
282
314
|
|
|
283
315
|
export const comboMasqueradeCollisionWarnings = new Set<string>();
|
|
316
|
+
|
|
317
|
+
export const comboUnrestorableShadowWarnings = new Set<string>();
|
|
318
|
+
|
|
319
|
+
export const accountSelectorShadowCollisionWarnings = new Set<string>();
|
|
284
320
|
let lastWarningReconciledGeneration = 0;
|
|
285
321
|
|
|
286
322
|
export function reconcileCatalogWarningMemos(generation: number): number {
|
|
@@ -288,11 +324,15 @@ export function reconcileCatalogWarningMemos(generation: number): number {
|
|
|
288
324
|
const removed = openAiApiCollisionWarnings.size
|
|
289
325
|
+ comboCatalogWarningSignatures.size
|
|
290
326
|
+ slugAliasCollisionWarnings.size
|
|
291
|
-
+ comboMasqueradeCollisionWarnings.size
|
|
327
|
+
+ comboMasqueradeCollisionWarnings.size
|
|
328
|
+
+ comboUnrestorableShadowWarnings.size
|
|
329
|
+
+ accountSelectorShadowCollisionWarnings.size;
|
|
292
330
|
openAiApiCollisionWarnings.clear();
|
|
293
331
|
comboCatalogWarningSignatures.clear();
|
|
294
332
|
slugAliasCollisionWarnings.clear();
|
|
295
333
|
comboMasqueradeCollisionWarnings.clear();
|
|
334
|
+
comboUnrestorableShadowWarnings.clear();
|
|
335
|
+
accountSelectorShadowCollisionWarnings.clear();
|
|
296
336
|
lastWarningReconciledGeneration = generation;
|
|
297
337
|
return removed;
|
|
298
338
|
}
|
|
@@ -305,6 +345,24 @@ export function warnComboMasqueradeCollisionOnce(slug: string): void {
|
|
|
305
345
|
);
|
|
306
346
|
}
|
|
307
347
|
|
|
348
|
+
export function warnComboUnrestorableShadowOnce(slug: string): void {
|
|
349
|
+
const key = slugEquivalenceKey(slug);
|
|
350
|
+
if (comboUnrestorableShadowWarnings.has(key)) return;
|
|
351
|
+
comboUnrestorableShadowWarnings.add(key);
|
|
352
|
+
console.warn(
|
|
353
|
+
`[opencodex] combo alias collision on "${safeCatalogWarningLabel(slug)}": the existing user-managed or foreign catalog row is retained because no pristine backup can restore it. Rename the combo alias to expose both models.`,
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/** Warn once when a live provider row loses its reserved slug to an account selector. */
|
|
358
|
+
export function warnAccountSelectorShadowedProviderOnce(slug: string): void {
|
|
359
|
+
if (accountSelectorShadowCollisionWarnings.has(slug)) return;
|
|
360
|
+
accountSelectorShadowCollisionWarnings.add(slug);
|
|
361
|
+
console.warn(
|
|
362
|
+
`[opencodex] account selector collision on "${safeCatalogWarningLabel(slug)}": the account-bound native model wins and the shadowed provider model is omitted from the catalog. Rename the provider or account selector.`,
|
|
363
|
+
);
|
|
364
|
+
}
|
|
365
|
+
|
|
308
366
|
export function resolveSlugAliasCollisions(goModels: CatalogModel[]): Set<CatalogModel> {
|
|
309
367
|
const skipped = new Set<CatalogModel>();
|
|
310
368
|
const winnerByAlias = new Map<string, CatalogModel>();
|
|
@@ -9,7 +9,7 @@ import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
|
|
|
9
9
|
import type { OcxConfig, OcxProviderConfig } from "../../types";
|
|
10
10
|
import { modelInList } from "../../types";
|
|
11
11
|
import { CODEX_REASONING_LEVELS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort";
|
|
12
|
-
import {
|
|
12
|
+
import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata";
|
|
13
13
|
import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive";
|
|
14
14
|
import { getProviderRegistryEntry } from "../../providers/registry";
|
|
15
15
|
import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap";
|
|
@@ -34,28 +34,121 @@ import upstreamModelsSnapshot from "../data/upstream-models.json";
|
|
|
34
34
|
import { activeCodexModelsCachePath, catalogBackupPathFor, findNativeTemplate, isDefaultCatalogPath, legacyCatalogBackupPath, parseCatalogJson, readCatalog, readCatalogBackup, readCodexCatalogPath } from "./parsing";
|
|
35
35
|
import type { RawCatalog, RawEntry } from "./parsing";
|
|
36
36
|
import { codexExecInvocation, isSpawnableCodexCandidate } from "../exec-invocation";
|
|
37
|
-
import {
|
|
38
|
-
|
|
37
|
+
import {
|
|
38
|
+
parsePersistedCodexRuntime,
|
|
39
|
+
peekCodexRuntimeProcessCache,
|
|
40
|
+
resolveAndPersistCodexRuntime,
|
|
41
|
+
} from "../runtime";
|
|
42
|
+
import type {
|
|
43
|
+
DeepReadonly,
|
|
44
|
+
EffortClampDiagnostic,
|
|
45
|
+
ResolvedCodexRuntime,
|
|
46
|
+
} from "../runtime";
|
|
47
|
+
import type {
|
|
48
|
+
CatalogGatherEvidenceSession,
|
|
49
|
+
CatalogGatherReadableSourceRole,
|
|
50
|
+
} from "./filesystem-evidence";
|
|
39
51
|
|
|
40
52
|
export { isSpawnableCodexCandidate, codexExecInvocation } from "../exec-invocation";
|
|
53
|
+
export type {
|
|
54
|
+
CatalogGatherEvidenceSession,
|
|
55
|
+
CatalogGatherReadableSourceRole,
|
|
56
|
+
} from "./filesystem-evidence";
|
|
41
57
|
|
|
42
58
|
export const BUNDLED_CATALOG_CACHE_MS = 60_000;
|
|
43
59
|
|
|
44
|
-
export
|
|
60
|
+
export type ReadonlyRawCatalog = DeepReadonly<RawCatalog>;
|
|
61
|
+
|
|
62
|
+
interface BundledCatalogMemo {
|
|
45
63
|
/** Selected runtime identity; must change when doctor/sync picks a different binary. */
|
|
46
|
-
key: string;
|
|
47
|
-
expiresAt: number;
|
|
48
|
-
|
|
49
|
-
|
|
64
|
+
readonly key: string;
|
|
65
|
+
readonly expiresAt: number;
|
|
66
|
+
readonly epoch: number;
|
|
67
|
+
readonly valueIdentity: string;
|
|
68
|
+
readonly value: ReadonlyRawCatalog | null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface BundledCatalogCacheState {
|
|
72
|
+
readonly epoch: number;
|
|
73
|
+
readonly valueIdentity: string | null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
let bundledCatalogEpoch = 0;
|
|
77
|
+
let bundledCatalogCache: BundledCatalogMemo | null = null;
|
|
78
|
+
|
|
79
|
+
function cloneAndDeepFreeze<T>(value: T): DeepReadonly<T> {
|
|
80
|
+
const clone = (current: unknown): unknown => {
|
|
81
|
+
if (Array.isArray(current)) return current.map(clone);
|
|
82
|
+
if (current && typeof current === "object") {
|
|
83
|
+
const out: Record<string, unknown> = {};
|
|
84
|
+
for (const [key, child] of Object.entries(current)) out[key] = clone(child);
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
return current;
|
|
88
|
+
};
|
|
89
|
+
const freeze = (current: unknown): unknown => {
|
|
90
|
+
if (!current || typeof current !== "object" || Object.isFrozen(current)) return current;
|
|
91
|
+
for (const child of Object.values(current)) freeze(child);
|
|
92
|
+
return Object.freeze(current);
|
|
93
|
+
};
|
|
94
|
+
return freeze(clone(value)) as DeepReadonly<T>;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function bundledRuntimeKey(
|
|
98
|
+
runtime: Pick<ResolvedCodexRuntime, "command" | "version">,
|
|
99
|
+
opencodexHome: string = process.env.OPENCODEX_HOME ?? "",
|
|
100
|
+
): string {
|
|
101
|
+
return [runtime.command, runtime.version ?? "", opencodexHome].join("\0");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function publishBundledCatalogCache(
|
|
105
|
+
key: string,
|
|
106
|
+
expiresAt: number,
|
|
107
|
+
value: RawCatalog | null,
|
|
108
|
+
): void {
|
|
109
|
+
const epoch = ++bundledCatalogEpoch;
|
|
110
|
+
bundledCatalogCache = {
|
|
111
|
+
key,
|
|
112
|
+
expiresAt,
|
|
113
|
+
epoch,
|
|
114
|
+
valueIdentity: `bundled:${epoch}`,
|
|
115
|
+
value: value === null ? null : cloneAndDeepFreeze(value),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function clearBundledCatalogCache(): void {
|
|
120
|
+
bundledCatalogEpoch += 1;
|
|
121
|
+
bundledCatalogCache = null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function bundledCatalogCacheState(): Readonly<BundledCatalogCacheState> {
|
|
125
|
+
return Object.freeze({
|
|
126
|
+
epoch: bundledCatalogEpoch,
|
|
127
|
+
valueIdentity: bundledCatalogCache?.valueIdentity ?? null,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
50
130
|
|
|
51
131
|
/** Test-only: clear the bundled-catalog cache (owned here; sync.ts calls this instead of assigning the import). */
|
|
52
132
|
export function resetBundledCatalogCacheForTests(): void {
|
|
53
|
-
|
|
133
|
+
clearBundledCatalogCache();
|
|
54
134
|
}
|
|
55
135
|
|
|
56
136
|
/** Drop the process-local bundled catalog memo (e.g. after runtime selection changes). */
|
|
57
137
|
export function invalidateBundledCatalogCache(): void {
|
|
58
|
-
|
|
138
|
+
clearBundledCatalogCache();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Test-only owner mutation seam; input is cloned and frozen before publication. */
|
|
142
|
+
export function setBundledCatalogCacheForTests(
|
|
143
|
+
runtime: Pick<ResolvedCodexRuntime, "command" | "version">,
|
|
144
|
+
value: RawCatalog | null,
|
|
145
|
+
options: Readonly<{ expiresAt?: number; opencodexHome?: string }> = {},
|
|
146
|
+
): void {
|
|
147
|
+
publishBundledCatalogCache(
|
|
148
|
+
bundledRuntimeKey(runtime, options.opencodexHome),
|
|
149
|
+
options.expiresAt ?? Date.now() + BUNDLED_CATALOG_CACHE_MS,
|
|
150
|
+
value,
|
|
151
|
+
);
|
|
59
152
|
}
|
|
60
153
|
|
|
61
154
|
export type ExecFile = (
|
|
@@ -143,7 +236,7 @@ export function runCodexDebugModels(
|
|
|
143
236
|
});
|
|
144
237
|
}
|
|
145
238
|
|
|
146
|
-
export function loadBundledCodexCatalog(deps: BundledCatalogDeps = {}):
|
|
239
|
+
export function loadBundledCodexCatalog(deps: BundledCatalogDeps = {}): ReadonlyRawCatalog | null {
|
|
147
240
|
const useCache = !deps.commandCandidates && !deps.execFileSync && !deps.configDir && !deps.env;
|
|
148
241
|
const execFile = deps.execFileSync ?? (execFileSync as unknown as ExecFile);
|
|
149
242
|
// Prefer the single resolved runtime so sync/clamp never probe a different binary
|
|
@@ -168,11 +261,7 @@ export function loadBundledCodexCatalog(deps: BundledCatalogDeps = {}): RawCatal
|
|
|
168
261
|
discoverAlternatives: deps.discoverAlternatives ?? false,
|
|
169
262
|
});
|
|
170
263
|
if (useCache) {
|
|
171
|
-
cacheKey =
|
|
172
|
-
resolved.runtime.command,
|
|
173
|
-
resolved.runtime.version ?? "",
|
|
174
|
-
process.env.OPENCODEX_HOME ?? "",
|
|
175
|
-
].join("\0");
|
|
264
|
+
cacheKey = bundledRuntimeKey(resolved.runtime);
|
|
176
265
|
}
|
|
177
266
|
return [resolved.runtime.command];
|
|
178
267
|
})();
|
|
@@ -183,33 +272,225 @@ export function loadBundledCodexCatalog(deps: BundledCatalogDeps = {}): RawCatal
|
|
|
183
272
|
&& bundledCatalogCache.key === cacheKey
|
|
184
273
|
&& bundledCatalogCache.expiresAt > Date.now()
|
|
185
274
|
) {
|
|
186
|
-
return bundledCatalogCache.value
|
|
275
|
+
return bundledCatalogCache.value === null
|
|
276
|
+
? null
|
|
277
|
+
: cloneAndDeepFreeze(bundledCatalogCache.value);
|
|
187
278
|
}
|
|
188
279
|
for (const command of unique(candidates)) {
|
|
189
280
|
try {
|
|
190
281
|
const catalog = parseCatalogJson(runCodexDebugModels(command, execFile, deps));
|
|
191
282
|
if (catalog && findNativeTemplate(catalog)) {
|
|
192
283
|
if (useCache && cacheKey) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
284
|
+
publishBundledCatalogCache(
|
|
285
|
+
cacheKey,
|
|
286
|
+
Date.now() + BUNDLED_CATALOG_CACHE_MS,
|
|
287
|
+
catalog,
|
|
288
|
+
);
|
|
289
|
+
return cloneAndDeepFreeze(bundledCatalogCache!.value!);
|
|
198
290
|
}
|
|
199
|
-
return catalog;
|
|
291
|
+
return cloneAndDeepFreeze(catalog);
|
|
200
292
|
}
|
|
201
293
|
} catch { /* try next candidate */ }
|
|
202
294
|
}
|
|
203
295
|
if (useCache && cacheKey) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
296
|
+
publishBundledCatalogCache(
|
|
297
|
+
cacheKey,
|
|
298
|
+
Date.now() + BUNDLED_CATALOG_CACHE_MS,
|
|
299
|
+
null,
|
|
300
|
+
);
|
|
209
301
|
}
|
|
210
302
|
return null;
|
|
211
303
|
}
|
|
212
304
|
|
|
305
|
+
export type CatalogGatherProcessLocalObservation =
|
|
306
|
+
| Readonly<{ state: "unused" }>
|
|
307
|
+
| Readonly<{ state: "used"; epoch: number; valueIdentity: string }>;
|
|
308
|
+
|
|
309
|
+
export type CodexRuntimeForCatalogGather =
|
|
310
|
+
| Readonly<{
|
|
311
|
+
kind: "available";
|
|
312
|
+
origin: "process-cache" | "persisted";
|
|
313
|
+
runtime: DeepReadonly<ResolvedCodexRuntime>;
|
|
314
|
+
processLocal: CatalogGatherProcessLocalObservation;
|
|
315
|
+
}>
|
|
316
|
+
| Readonly<{
|
|
317
|
+
kind: "runtime-unavailable";
|
|
318
|
+
processLocal: Readonly<{ state: "unused" }>;
|
|
319
|
+
}>;
|
|
320
|
+
|
|
321
|
+
export type CatalogSourceForGather =
|
|
322
|
+
| Readonly<{
|
|
323
|
+
kind: "available";
|
|
324
|
+
source:
|
|
325
|
+
| "bundled-catalog-template"
|
|
326
|
+
| "active-catalog-merge"
|
|
327
|
+
| "hashed-backup-fallback"
|
|
328
|
+
| "legacy-backup-fallback"
|
|
329
|
+
| "models-cache-fallback";
|
|
330
|
+
catalog: ReadonlyRawCatalog;
|
|
331
|
+
runtimeSupport:
|
|
332
|
+
| Readonly<{ kind: "available"; catalog: ReadonlyRawCatalog }>
|
|
333
|
+
| Readonly<{ kind: "unavailable" }>;
|
|
334
|
+
processLocal: Readonly<{
|
|
335
|
+
runtime: CatalogGatherProcessLocalObservation;
|
|
336
|
+
bundledCatalog: CatalogGatherProcessLocalObservation;
|
|
337
|
+
}>;
|
|
338
|
+
}>
|
|
339
|
+
| Readonly<{
|
|
340
|
+
kind: "catalog-unavailable";
|
|
341
|
+
processLocal: Readonly<{
|
|
342
|
+
runtime: Readonly<{ state: "unused" }>;
|
|
343
|
+
bundledCatalog: Readonly<{ state: "unused" }>;
|
|
344
|
+
}>;
|
|
345
|
+
}>;
|
|
346
|
+
|
|
347
|
+
export type CatalogGatherPathKind = "default" | "custom";
|
|
348
|
+
|
|
349
|
+
const UNUSED_PROCESS_LOCAL = Object.freeze({ state: "unused" as const });
|
|
350
|
+
|
|
351
|
+
function sameRuntimeIdentity(
|
|
352
|
+
left: Pick<ResolvedCodexRuntime, "command" | "version">,
|
|
353
|
+
right: Pick<ResolvedCodexRuntime, "command" | "version">,
|
|
354
|
+
): boolean {
|
|
355
|
+
return left.command === right.command && (left.version ?? null) === (right.version ?? null);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Observe an already-resolved runtime only. The evidence owner supplies the
|
|
360
|
+
* exact persisted bytes (or observed absence); this path never probes or writes.
|
|
361
|
+
*/
|
|
362
|
+
export function peekCodexRuntimeForCatalogGather(
|
|
363
|
+
evidenceSession: CatalogGatherEvidenceSession,
|
|
364
|
+
): CodexRuntimeForCatalogGather {
|
|
365
|
+
const persistedBytes = evidenceSession.readSource("runtime-selection");
|
|
366
|
+
const persisted = persistedBytes === null
|
|
367
|
+
? null
|
|
368
|
+
: parsePersistedCodexRuntime(persistedBytes);
|
|
369
|
+
const processMemo = peekCodexRuntimeProcessCache();
|
|
370
|
+
|
|
371
|
+
if (processMemo.kind === "available") {
|
|
372
|
+
const runtime = processMemo.value.runtime;
|
|
373
|
+
if (persistedBytes === null || (persisted && sameRuntimeIdentity(runtime, {
|
|
374
|
+
command: persisted.command,
|
|
375
|
+
version: persisted.selectedVersion ?? null,
|
|
376
|
+
}))) {
|
|
377
|
+
return cloneAndDeepFreeze({
|
|
378
|
+
kind: "available" as const,
|
|
379
|
+
origin: "process-cache" as const,
|
|
380
|
+
runtime,
|
|
381
|
+
processLocal: {
|
|
382
|
+
state: "used" as const,
|
|
383
|
+
epoch: processMemo.epoch,
|
|
384
|
+
valueIdentity: processMemo.valueIdentity,
|
|
385
|
+
},
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (persisted) {
|
|
391
|
+
return cloneAndDeepFreeze({
|
|
392
|
+
kind: "available" as const,
|
|
393
|
+
origin: "persisted" as const,
|
|
394
|
+
runtime: {
|
|
395
|
+
command: persisted.command,
|
|
396
|
+
version: persisted.selectedVersion ?? null,
|
|
397
|
+
source: persisted.source,
|
|
398
|
+
},
|
|
399
|
+
processLocal: UNUSED_PROCESS_LOCAL,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
return Object.freeze({
|
|
404
|
+
kind: "runtime-unavailable" as const,
|
|
405
|
+
processLocal: UNUSED_PROCESS_LOCAL,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Resolve only already-observed catalog sources. A cold process cache falls
|
|
411
|
+
* through to evidence-owned persisted sources and never becomes probe authority.
|
|
412
|
+
*/
|
|
413
|
+
export function resolveCatalogSourceForGather(
|
|
414
|
+
evidenceSession: CatalogGatherEvidenceSession,
|
|
415
|
+
pathKind: CatalogGatherPathKind,
|
|
416
|
+
): CatalogSourceForGather {
|
|
417
|
+
const bundledMemo = bundledCatalogCache;
|
|
418
|
+
let runtimeSupport:
|
|
419
|
+
| Readonly<{ kind: "available"; catalog: ReadonlyRawCatalog }>
|
|
420
|
+
| Readonly<{ kind: "unavailable" }> = Object.freeze({ kind: "unavailable" });
|
|
421
|
+
let processLocal: Readonly<{
|
|
422
|
+
runtime: CatalogGatherProcessLocalObservation;
|
|
423
|
+
bundledCatalog: CatalogGatherProcessLocalObservation;
|
|
424
|
+
}> = {
|
|
425
|
+
runtime: UNUSED_PROCESS_LOCAL,
|
|
426
|
+
bundledCatalog: UNUSED_PROCESS_LOCAL,
|
|
427
|
+
};
|
|
428
|
+
if (bundledMemo?.value && bundledMemo.expiresAt > Date.now()) {
|
|
429
|
+
const runtime = peekCodexRuntimeForCatalogGather(evidenceSession);
|
|
430
|
+
if (runtime.kind === "available" && bundledMemo.key === bundledRuntimeKey(runtime.runtime)) {
|
|
431
|
+
runtimeSupport = Object.freeze({
|
|
432
|
+
kind: "available" as const,
|
|
433
|
+
catalog: bundledMemo.value,
|
|
434
|
+
});
|
|
435
|
+
processLocal = {
|
|
436
|
+
runtime: runtime.processLocal,
|
|
437
|
+
bundledCatalog: {
|
|
438
|
+
state: "used" as const,
|
|
439
|
+
epoch: bundledMemo.epoch,
|
|
440
|
+
valueIdentity: bundledMemo.valueIdentity,
|
|
441
|
+
},
|
|
442
|
+
};
|
|
443
|
+
if (pathKind === "default") {
|
|
444
|
+
return cloneAndDeepFreeze({
|
|
445
|
+
kind: "available" as const,
|
|
446
|
+
source: "bundled-catalog-template" as const,
|
|
447
|
+
catalog: bundledMemo.value,
|
|
448
|
+
runtimeSupport,
|
|
449
|
+
processLocal,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
const roles = pathKind === "default"
|
|
456
|
+
? [
|
|
457
|
+
"active-catalog-merge",
|
|
458
|
+
"hashed-backup-fallback",
|
|
459
|
+
"legacy-backup-fallback",
|
|
460
|
+
"models-cache-fallback",
|
|
461
|
+
] as const
|
|
462
|
+
: [
|
|
463
|
+
"active-catalog-merge",
|
|
464
|
+
"hashed-backup-fallback",
|
|
465
|
+
"models-cache-fallback",
|
|
466
|
+
] as const;
|
|
467
|
+
for (const role of roles) {
|
|
468
|
+
const bytes = evidenceSession.readSource(role);
|
|
469
|
+
if (bytes === null) continue;
|
|
470
|
+
const catalog = parseCatalogJson(Buffer.from(bytes).toString("utf8"));
|
|
471
|
+
if (!catalog) continue;
|
|
472
|
+
// Custom catalogs may intentionally contain only routed rows. Keep their existing source
|
|
473
|
+
// priority (active, then backup/cache) without imposing the default catalog's native-template
|
|
474
|
+
// requirement; a valid active custom file therefore remains authoritative over stale fallbacks.
|
|
475
|
+
if (pathKind === "default" && !findNativeTemplate(catalog)) continue;
|
|
476
|
+
return cloneAndDeepFreeze({
|
|
477
|
+
kind: "available" as const,
|
|
478
|
+
source: role,
|
|
479
|
+
catalog,
|
|
480
|
+
runtimeSupport,
|
|
481
|
+
processLocal,
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
return Object.freeze({
|
|
486
|
+
kind: "catalog-unavailable" as const,
|
|
487
|
+
processLocal: Object.freeze({
|
|
488
|
+
runtime: UNUSED_PROCESS_LOCAL,
|
|
489
|
+
bundledCatalog: UNUSED_PROCESS_LOCAL,
|
|
490
|
+
}),
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
|
|
213
494
|
export function materializeBundledCodexCatalog(path: string, deps: BundledCatalogDeps = {}): RawCatalog | null {
|
|
214
495
|
const catalog = loadBundledCodexCatalog(deps);
|
|
215
496
|
if (!catalog) return null;
|
|
@@ -219,7 +500,7 @@ export function materializeBundledCodexCatalog(path: string, deps: BundledCatalo
|
|
|
219
500
|
} catch {
|
|
220
501
|
return null;
|
|
221
502
|
}
|
|
222
|
-
return catalog;
|
|
503
|
+
return JSON.parse(JSON.stringify(catalog)) as RawCatalog;
|
|
223
504
|
}
|
|
224
505
|
|
|
225
506
|
export function loadCatalogForSync(path: string): RawCatalog | null {
|
|
@@ -236,16 +517,33 @@ export function loadCatalogForSync(path: string): RawCatalog | null {
|
|
|
236
517
|
|
|
237
518
|
export function readCurrentCatalogOrCache(): RawCatalog | null {
|
|
238
519
|
const path = readCodexCatalogPath();
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
520
|
+
const bundled = isDefaultCatalogPath(path) ? loadBundledCodexCatalog() : null;
|
|
521
|
+
if (bundled) return JSON.parse(JSON.stringify(bundled)) as RawCatalog;
|
|
522
|
+
return readCatalog(path) ?? readCatalog(activeCodexModelsCachePath());
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Read the user-owned Codex catalog surfaces without substituting the bundled catalog.
|
|
527
|
+
*
|
|
528
|
+
* The bundled catalog is intentionally the authority for static native metadata on the default
|
|
529
|
+
* path. Account-qualified discovery needs the opposite view: an exact model id that Codex has
|
|
530
|
+
* observed in the user's catalog/cache may be account-scoped even when this release does not know
|
|
531
|
+
* it statically yet.
|
|
532
|
+
*/
|
|
533
|
+
export function readCurrentCodexCatalog(): RawCatalog | null {
|
|
534
|
+
return readCatalog(readCodexCatalogPath());
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
export function readCurrentCodexModelsCache(): RawCatalog | null {
|
|
538
|
+
return readCatalog(activeCodexModelsCachePath());
|
|
242
539
|
}
|
|
243
540
|
|
|
244
541
|
export function loadCatalogTemplate(): RawEntry | null {
|
|
245
542
|
const catalogPath = readCodexCatalogPath();
|
|
543
|
+
const bundled = loadBundledCodexCatalog();
|
|
246
544
|
const native = findNativeTemplate(readCatalog(catalogPath))
|
|
247
545
|
?? findNativeTemplate(readCatalogBackup(catalogPath))
|
|
248
546
|
?? findNativeTemplate(readCatalog(activeCodexModelsCachePath()))
|
|
249
|
-
?? findNativeTemplate(
|
|
547
|
+
?? findNativeTemplate(bundled ? JSON.parse(JSON.stringify(bundled)) as RawCatalog : null);
|
|
250
548
|
return native ? JSON.parse(JSON.stringify(native)) : null;
|
|
251
549
|
}
|