@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,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal catalog admission for the management refresh path.
|
|
3
|
+
*
|
|
4
|
+
* The r2 #1 catalog incident left gather and native writes in one awaited
|
|
5
|
+
* callback. WP9 needs generation and filesystem-target evidence before it can
|
|
6
|
+
* split those phases, but importing WP12 authority would make WP9 depend on a
|
|
7
|
+
* later phase. This reader therefore captures only the exact resident config,
|
|
8
|
+
* its cooperating generation, and identities for catalog-owned targets.
|
|
9
|
+
*/
|
|
10
|
+
import { createHmac, randomBytes } from "node:crypto";
|
|
11
|
+
import { join, resolve } from "node:path";
|
|
12
|
+
|
|
13
|
+
import { observeConfigGeneration } from "../config";
|
|
14
|
+
import type { OcxConfig } from "../types";
|
|
15
|
+
import type {
|
|
16
|
+
CatalogAdmissionSnapshot,
|
|
17
|
+
CatalogConvergeRequestInput,
|
|
18
|
+
ConfigGeneration,
|
|
19
|
+
ConvergeRequest,
|
|
20
|
+
} from "./convergence-types";
|
|
21
|
+
import {
|
|
22
|
+
catalogBackupPathFor,
|
|
23
|
+
legacyCatalogBackupPath,
|
|
24
|
+
samePath,
|
|
25
|
+
} from "./catalog/parsing";
|
|
26
|
+
import { readRootTomlString } from "./paths";
|
|
27
|
+
import {
|
|
28
|
+
acceptCatalogGatherSourcePath,
|
|
29
|
+
captureAndSealCatalogHomeSelection,
|
|
30
|
+
captureCatalogGatherTargetIdentity,
|
|
31
|
+
createCatalogGatherEvidenceSession,
|
|
32
|
+
readCatalogGatherSource,
|
|
33
|
+
sealCatalogGatherEvidenceSession,
|
|
34
|
+
} from "./catalog/filesystem-evidence";
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Construct the one request shape permitted for management catalog refreshes.
|
|
38
|
+
* Callers choose the deadline only; they cannot widen scope or choose direction.
|
|
39
|
+
*/
|
|
40
|
+
export function createCatalogConvergeRequest({
|
|
41
|
+
deadlineMs,
|
|
42
|
+
}: CatalogConvergeRequestInput): ConvergeRequest {
|
|
43
|
+
if (!Number.isSafeInteger(deadlineMs) || deadlineMs <= 0) {
|
|
44
|
+
throw new TypeError("Catalog convergence deadlineMs must be a positive safe integer.");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
action: "converge",
|
|
49
|
+
scope: "catalog",
|
|
50
|
+
reason: "management-mutation",
|
|
51
|
+
mode: "automatic",
|
|
52
|
+
deadlineMs,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const CONFIG_IDENTITY_KEY = randomBytes(32);
|
|
57
|
+
const configReferenceIdentities = new WeakMap<object, string>();
|
|
58
|
+
let nextConfigReferenceIdentity = 0;
|
|
59
|
+
|
|
60
|
+
function encodeLengthPrefixed(value: string): string {
|
|
61
|
+
return `${Buffer.byteLength(value, "utf8")}:${value}`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function canonicalConfigEncoding(value: unknown, ancestors = new Set<object>()): string {
|
|
65
|
+
if (value === null) return "null";
|
|
66
|
+
switch (typeof value) {
|
|
67
|
+
case "undefined": return "undefined";
|
|
68
|
+
case "boolean": return value ? "boolean:1" : "boolean:0";
|
|
69
|
+
case "string": return `string:${encodeLengthPrefixed(value)}`;
|
|
70
|
+
case "number": {
|
|
71
|
+
if (!Number.isFinite(value)) throw new TypeError("Catalog config identity cannot encode a non-finite number.");
|
|
72
|
+
return `number:${Object.is(value, -0) ? "-0" : String(value)}`;
|
|
73
|
+
}
|
|
74
|
+
case "bigint":
|
|
75
|
+
case "function":
|
|
76
|
+
case "symbol":
|
|
77
|
+
throw new TypeError(`Catalog config identity cannot encode ${typeof value}.`);
|
|
78
|
+
case "object": break;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (ancestors.has(value)) throw new TypeError("Catalog config identity cannot encode a cyclic graph.");
|
|
82
|
+
// Symbol keys are process-local metadata (e.g. the user-cost-overlay
|
|
83
|
+
// preservation-owner tag) that JSON.stringify omits and no persist path
|
|
84
|
+
// writes. They must not change the durable config identity, so encoding
|
|
85
|
+
// proceeds over the enumerable string-keyed properties below (Object.keys
|
|
86
|
+
// already ignores symbols). Symbol VALUES are still refused above.
|
|
87
|
+
ancestors.add(value);
|
|
88
|
+
try {
|
|
89
|
+
if (Array.isArray(value)) {
|
|
90
|
+
const items = Array.from({ length: value.length }, (_, index) => (
|
|
91
|
+
Object.hasOwn(value, index)
|
|
92
|
+
? `item:${canonicalConfigEncoding(value[index], ancestors)}`
|
|
93
|
+
: "hole"
|
|
94
|
+
));
|
|
95
|
+
return `array:${value.length}:${items.map(encodeLengthPrefixed).join("")}`;
|
|
96
|
+
}
|
|
97
|
+
const keys = Object.keys(value).sort();
|
|
98
|
+
const entries = keys.map(key => {
|
|
99
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
100
|
+
if (!descriptor || !("value" in descriptor)) {
|
|
101
|
+
throw new TypeError("Catalog config identity cannot encode accessor properties.");
|
|
102
|
+
}
|
|
103
|
+
return `${encodeLengthPrefixed(key)}${encodeLengthPrefixed(canonicalConfigEncoding(descriptor.value, ancestors))}`;
|
|
104
|
+
});
|
|
105
|
+
return `object:${keys.length}:${entries.join("")}`;
|
|
106
|
+
} finally {
|
|
107
|
+
ancestors.delete(value);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function keyedConfigIdentity(domain: string, payload: string): string {
|
|
112
|
+
return createHmac("sha256", CONFIG_IDENTITY_KEY)
|
|
113
|
+
.update(encodeLengthPrefixed(domain))
|
|
114
|
+
.update(encodeLengthPrefixed(payload))
|
|
115
|
+
.digest("hex");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function catalogConfigIdentity(
|
|
119
|
+
config: Readonly<OcxConfig>,
|
|
120
|
+
generation: ConfigGeneration,
|
|
121
|
+
): CatalogAdmissionSnapshot["configIdentity"] {
|
|
122
|
+
let referenceIdentity = configReferenceIdentities.get(config);
|
|
123
|
+
if (!referenceIdentity) {
|
|
124
|
+
nextConfigReferenceIdentity += 1;
|
|
125
|
+
referenceIdentity = keyedConfigIdentity("catalog-config-reference-v1", String(nextConfigReferenceIdentity));
|
|
126
|
+
configReferenceIdentities.set(config, referenceIdentity);
|
|
127
|
+
}
|
|
128
|
+
return Object.freeze({
|
|
129
|
+
referenceIdentity,
|
|
130
|
+
generation: Object.freeze({ ...generation }),
|
|
131
|
+
snapshotIdentity: keyedConfigIdentity("catalog-config-snapshot-v1", canonicalConfigEncoding(config)),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Capture the catalog-only evidence WP9 can validate without consulting WP12.
|
|
137
|
+
* The config reference is retained verbatim; no persisted config re-read may
|
|
138
|
+
* replace the object already held by the management callback.
|
|
139
|
+
*/
|
|
140
|
+
export function captureCatalogAdmissionSnapshot(
|
|
141
|
+
config: Readonly<OcxConfig>,
|
|
142
|
+
): CatalogAdmissionSnapshot {
|
|
143
|
+
const generation = observeConfigGeneration();
|
|
144
|
+
if (generation.kind === "absent") {
|
|
145
|
+
/*
|
|
146
|
+
* Absence is refused HERE and admitted elsewhere, and the difference is the
|
|
147
|
+
* lock. Codex write admission may carry an absent generation because it goes
|
|
148
|
+
* on to take the config transaction and read a real zero inside it. Catalog
|
|
149
|
+
* gather has no such transaction — by contract it holds no lock and writes
|
|
150
|
+
* nothing — so it has no way to turn absence into an observation. Refusing
|
|
151
|
+
* is the only honest answer available to it.
|
|
152
|
+
*
|
|
153
|
+
* The wording matters beyond this line: `admissionFailure` in
|
|
154
|
+
* management-convergence.ts classifies this throw by matching its MESSAGE,
|
|
155
|
+
* and an unrecognized one becomes a non-retryable `failed/disk` instead of
|
|
156
|
+
* the retryable skip a missing coordinator has always produced. Keeping the
|
|
157
|
+
* "config generation is database" phrasing preserves that projection — a
|
|
158
|
+
* caller that could simply try again should still be told to.
|
|
159
|
+
*/
|
|
160
|
+
throw new Error("Cannot capture Codex catalog admission: config generation is database (absent).");
|
|
161
|
+
}
|
|
162
|
+
if (generation.kind !== "ready") {
|
|
163
|
+
throw new Error(`Cannot capture Codex catalog admission: config generation is ${generation.reason}.`);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const evidenceSession = createCatalogGatherEvidenceSession();
|
|
167
|
+
const homeSelection = captureAndSealCatalogHomeSelection(evidenceSession);
|
|
168
|
+
const configPath = join(homeSelection.canonicalCodexHome, "config.toml");
|
|
169
|
+
acceptCatalogGatherSourcePath(evidenceSession, "catalog-target-selection", configPath);
|
|
170
|
+
const configBytes = readCatalogGatherSource(evidenceSession, "catalog-target-selection");
|
|
171
|
+
const configuredCatalogPath = configBytes === null
|
|
172
|
+
? null
|
|
173
|
+
: readRootTomlString(Buffer.from(configBytes).toString("utf8"), "model_catalog_json");
|
|
174
|
+
const defaultCatalogPath = join(homeSelection.canonicalCodexHome, "opencodex-catalog.json");
|
|
175
|
+
const catalogPath = configuredCatalogPath
|
|
176
|
+
? resolve(homeSelection.canonicalCodexHome, configuredCatalogPath)
|
|
177
|
+
: defaultCatalogPath;
|
|
178
|
+
const backupPaths = [
|
|
179
|
+
catalogBackupPathFor(catalogPath),
|
|
180
|
+
...(samePath(catalogPath, defaultCatalogPath) ? [legacyCatalogBackupPath()] : []),
|
|
181
|
+
];
|
|
182
|
+
const targets = {
|
|
183
|
+
catalog: captureCatalogGatherTargetIdentity(evidenceSession, catalogPath),
|
|
184
|
+
cache: captureCatalogGatherTargetIdentity(
|
|
185
|
+
evidenceSession,
|
|
186
|
+
join(homeSelection.canonicalCodexHome, "models_cache.json"),
|
|
187
|
+
),
|
|
188
|
+
catalogBackups: backupPaths.map(path => captureCatalogGatherTargetIdentity(evidenceSession, path)),
|
|
189
|
+
};
|
|
190
|
+
const sourceEvidence = sealCatalogGatherEvidenceSession(evidenceSession);
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
config,
|
|
194
|
+
generation: generation.generation,
|
|
195
|
+
configIdentity: catalogConfigIdentity(config, generation.generation),
|
|
196
|
+
targets,
|
|
197
|
+
sourceEvidence,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { CatalogDisposition, CatalogFailureCause, CatalogNotice } from "./convergence-types";
|
|
2
|
+
|
|
3
|
+
const INVALID_CATALOG_DISPOSITION_FIELD = Symbol("invalid-catalog-disposition-field");
|
|
4
|
+
|
|
5
|
+
/** Read an own data property without invoking prototype getters or accessors. */
|
|
6
|
+
function ownDataProperty(value: object, key: PropertyKey): unknown {
|
|
7
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
8
|
+
return descriptor && "value" in descriptor
|
|
9
|
+
? descriptor.value
|
|
10
|
+
: INVALID_CATALOG_DISPOSITION_FIELD;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Accept only the public catalog degradation codes. */
|
|
14
|
+
function isCatalogNotice(value: unknown): value is CatalogNotice {
|
|
15
|
+
return value === "provider-auth" || value === "provider-network" || value === "fallback";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Copy a bounded notice array without trusting accessors or a custom iterator. */
|
|
19
|
+
function normalizeCatalogNotices(value: unknown): CatalogNotice[] | null {
|
|
20
|
+
if (!Array.isArray(value)) return null;
|
|
21
|
+
const length = ownDataProperty(value, "length");
|
|
22
|
+
if (typeof length !== "number" || !Number.isInteger(length) || length < 0 || length > 3) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const notices: CatalogNotice[] = [];
|
|
26
|
+
for (let index = 0; index < length; index += 1) {
|
|
27
|
+
const notice = ownDataProperty(value, String(index));
|
|
28
|
+
if (!isCatalogNotice(notice)) return null;
|
|
29
|
+
notices.push(notice);
|
|
30
|
+
}
|
|
31
|
+
return notices;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Rebuild a catalog disposition from a strict set of own data properties.
|
|
36
|
+
*
|
|
37
|
+
* Management callbacks are internal today, but this response is a privacy
|
|
38
|
+
* boundary. Avoid coercion, accessors, custom iterators, and `toJSON` hooks so a
|
|
39
|
+
* malformed callback cannot smuggle private provider or account detail into a
|
|
40
|
+
* management response.
|
|
41
|
+
*/
|
|
42
|
+
export function normalizeCatalogDisposition(value: unknown): CatalogDisposition | null {
|
|
43
|
+
if (value === null || typeof value !== "object") return null;
|
|
44
|
+
try {
|
|
45
|
+
if (Array.isArray(value)) return null;
|
|
46
|
+
const status = ownDataProperty(value, "status");
|
|
47
|
+
if (status === "committed") {
|
|
48
|
+
const changed = ownDataProperty(value, "changed");
|
|
49
|
+
const degraded = ownDataProperty(value, "degraded");
|
|
50
|
+
const notices = normalizeCatalogNotices(ownDataProperty(value, "notices"));
|
|
51
|
+
if (typeof changed !== "boolean" || typeof degraded !== "boolean" || notices === null) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return { status, changed, degraded, notices };
|
|
55
|
+
}
|
|
56
|
+
if (status === "skipped") {
|
|
57
|
+
const reason = ownDataProperty(value, "reason");
|
|
58
|
+
const retryable = ownDataProperty(value, "retryable");
|
|
59
|
+
if ((reason !== "not-requested"
|
|
60
|
+
&& reason !== "catalog-unavailable"
|
|
61
|
+
&& reason !== "busy"
|
|
62
|
+
&& reason !== "stale"
|
|
63
|
+
&& reason !== "refused")
|
|
64
|
+
|| typeof retryable !== "boolean") return null;
|
|
65
|
+
return { status, reason, retryable };
|
|
66
|
+
}
|
|
67
|
+
if (status === "failed") {
|
|
68
|
+
const reason = ownDataProperty(value, "reason");
|
|
69
|
+
const phase = ownDataProperty(value, "phase");
|
|
70
|
+
const retryable = ownDataProperty(value, "retryable");
|
|
71
|
+
const partialWrite = ownDataProperty(value, "partialWrite");
|
|
72
|
+
if ((reason !== "provider-auth" && reason !== "provider-network" && reason !== "disk"
|
|
73
|
+
&& reason !== "request-invalid" && reason !== "admission" && reason !== "internal")
|
|
74
|
+
|| (phase !== "gather" && phase !== "commit")
|
|
75
|
+
|| typeof retryable !== "boolean"
|
|
76
|
+
|| typeof partialWrite !== "boolean") return null;
|
|
77
|
+
// The cause is rebuilt from closed vocabularies, never copied through: this is the
|
|
78
|
+
// boundary that keeps a message, path or account id from riding out on a failure.
|
|
79
|
+
const cause = normalizeCatalogFailureCause(ownDataProperty(value, "cause"));
|
|
80
|
+
return { status, reason, phase, retryable, partialWrite, ...(cause ? { cause } : {}) };
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
} catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const FAILURE_CAUSE_KINDS: ReadonlySet<string> = new Set(["invalid-request", "lock-busy", "io", "unknown"]);
|
|
89
|
+
const FAILURE_CAUSE_CODES: ReadonlySet<string> = new Set([
|
|
90
|
+
"ENOSPC", "EACCES", "EPERM", "EROFS", "ENOENT", "SQLITE_BUSY",
|
|
91
|
+
]);
|
|
92
|
+
|
|
93
|
+
function normalizeCatalogFailureCause(value: unknown): CatalogFailureCause | undefined {
|
|
94
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return undefined;
|
|
95
|
+
const kind = ownDataProperty(value, "kind");
|
|
96
|
+
if (typeof kind !== "string" || !FAILURE_CAUSE_KINDS.has(kind)) return undefined;
|
|
97
|
+
const code = ownDataProperty(value, "code");
|
|
98
|
+
const safeCode = typeof code === "string" && FAILURE_CAUSE_CODES.has(code) ? code : undefined;
|
|
99
|
+
return { kind, ...(safeCode ? { code: safeCode } : {}) } as CatalogFailureCause;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Whether a persisted mutation still needs a successful catalog commit. */
|
|
103
|
+
export function catalogRefreshIsPending(disposition: CatalogDisposition): boolean {
|
|
104
|
+
return disposition.status !== "committed";
|
|
105
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* K — the permanent catalog serialization primitive.
|
|
3
|
+
*
|
|
4
|
+
* Round 4 of the audit killed the idea that "the replacement happens under a
|
|
5
|
+
* lock" is enough. The retained `/api/sync` chain reads the active catalog,
|
|
6
|
+
* captures it, awaits provider gathering, and only then writes from that
|
|
7
|
+
* captured state (`src/codex/catalog/sync.ts:513,520,526,565`). If convergence
|
|
8
|
+
* publishes Y while that await is pending, taking a lock afterwards does not
|
|
9
|
+
* make the captured X fresh — the writer legally overwrites Y while holding it.
|
|
10
|
+
* So K serializes the whole read-transform-write transaction, either by
|
|
11
|
+
* recomputing under K or by revalidating complete evidence under K, not by
|
|
12
|
+
* guarding the last rename.
|
|
13
|
+
*
|
|
14
|
+
* The second defect that round found was subtler: an opaque TypeScript permit
|
|
15
|
+
* type proves a permit-bearing call path EXISTS. It cannot prove the callback
|
|
16
|
+
* still holds K. A leaked permit used after its callback returned type-checks
|
|
17
|
+
* perfectly. So the type is not the mechanism — this module owns a private
|
|
18
|
+
* active-permit registry, and every mutator asks it at runtime whether the
|
|
19
|
+
* permit it holds is still live for the home it is about to write.
|
|
20
|
+
*
|
|
21
|
+
* K is permanent and is NOT WP11's native write lock. It never reads or
|
|
22
|
+
* advances the native pair. Order is `N -> K -> C`; there is no `C -> K` and no
|
|
23
|
+
* `K -> N` (`005_contract.md:660-762`).
|
|
24
|
+
*
|
|
25
|
+
* Design record: devlog/_fin/260804_codex_write_substrate/005_contract.md §3.
|
|
26
|
+
*/
|
|
27
|
+
import { chmodSync, lstatSync, realpathSync } from "node:fs";
|
|
28
|
+
|
|
29
|
+
import { Database } from "bun:sqlite";
|
|
30
|
+
|
|
31
|
+
import {
|
|
32
|
+
CodexUserIdentityRefusal,
|
|
33
|
+
resolveCodexCatalogSerializationDatabasePath,
|
|
34
|
+
resolveEffectiveUserIdentity,
|
|
35
|
+
samePathIdentity,
|
|
36
|
+
} from "./user-identity";
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Authorization to perform the fixed sequence of catalog mutations inside ONE
|
|
40
|
+
* K acquisition.
|
|
41
|
+
*
|
|
42
|
+
* Deliberately carries no usable field. Holding this object is necessary but
|
|
43
|
+
* never sufficient: `assertCatalogWritePermit` is what actually decides, by
|
|
44
|
+
* looking the object up in a registry this module alone can write. A forged
|
|
45
|
+
* cast, a prototype copy, or a symbol clone produces a value of this type that
|
|
46
|
+
* every writer refuses.
|
|
47
|
+
*/
|
|
48
|
+
export interface CatalogWritePermit {
|
|
49
|
+
readonly [catalogWritePermitBrand]: true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
declare const catalogWritePermitBrand: unique symbol;
|
|
53
|
+
|
|
54
|
+
export type CatalogSerializationOutcome<T> =
|
|
55
|
+
| { kind: "completed"; value: T }
|
|
56
|
+
| { kind: "unavailable"; reason: "busy" | "database" | "unsafe-path" };
|
|
57
|
+
|
|
58
|
+
export class CatalogWritePermitRefusal extends Error {
|
|
59
|
+
readonly code = "CODEX_CATALOG_WRITE_PERMIT_REFUSED";
|
|
60
|
+
|
|
61
|
+
constructor(message: string) {
|
|
62
|
+
super(message);
|
|
63
|
+
this.name = "CatalogWritePermitRefusal";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface PermitRegistration {
|
|
68
|
+
/** The exact canonical CODEX_HOME whose artifacts this acquisition may write. */
|
|
69
|
+
readonly canonicalCodexHome: string;
|
|
70
|
+
/** Identifies the acquisition, so a permit cannot outlive its transaction. */
|
|
71
|
+
readonly transactionId: string;
|
|
72
|
+
live: boolean;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The registry is a module-private WeakMap keyed by permit IDENTITY. There is
|
|
77
|
+
* no exported constructor, brand value, or registration API, so the only way to
|
|
78
|
+
* obtain a registered permit is to be inside a live callback.
|
|
79
|
+
*/
|
|
80
|
+
const activePermits = new WeakMap<object, PermitRegistration>();
|
|
81
|
+
|
|
82
|
+
let acquisitionCounter = 0;
|
|
83
|
+
|
|
84
|
+
function isBusy(error: unknown): boolean {
|
|
85
|
+
const code = error && typeof error === "object" && "code" in error
|
|
86
|
+
? String((error as { code?: unknown }).code)
|
|
87
|
+
: "";
|
|
88
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
89
|
+
return code === "SQLITE_BUSY" || code === "SQLITE_LOCKED"
|
|
90
|
+
|| /database (?:is|table is) locked/i.test(message);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The runtime proof every low-level catalog/backup/cache mutator must obtain
|
|
95
|
+
* before its FIRST filesystem mutation — including temp creation, hardening,
|
|
96
|
+
* unlink, link, rename, truncate, or replacement.
|
|
97
|
+
*
|
|
98
|
+
* `owningCodexHome` is supplied by the caller rather than inferred from the
|
|
99
|
+
* target's parent directory, because an accepted configured catalog target may
|
|
100
|
+
* be absolute and outside CODEX_HOME entirely.
|
|
101
|
+
*/
|
|
102
|
+
export function assertCatalogWritePermit(
|
|
103
|
+
permit: CatalogWritePermit,
|
|
104
|
+
owningCodexHome: string,
|
|
105
|
+
): void {
|
|
106
|
+
const registration = activePermits.get(permit as unknown as object);
|
|
107
|
+
if (!registration) {
|
|
108
|
+
throw new CatalogWritePermitRefusal(
|
|
109
|
+
"The catalog write permit was not minted by the serialization owner.",
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
if (!registration.live) {
|
|
113
|
+
throw new CatalogWritePermitRefusal(
|
|
114
|
+
"The catalog write permit belongs to a released acquisition.",
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
if (registration.canonicalCodexHome !== owningCodexHome) {
|
|
118
|
+
throw new CatalogWritePermitRefusal(
|
|
119
|
+
"The catalog write permit authorizes a different CODEX_HOME.",
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Acquire K for one canonical CODEX_HOME and run `write` while it is held.
|
|
126
|
+
*
|
|
127
|
+
* Synchronous by contract: the callback performs no provider request, runtime
|
|
128
|
+
* probe, OAuth refresh, subprocess, or awaited work. It may enter
|
|
129
|
+
* `withExpectedConfigGenerationSync` — that is the `K -> C` edge.
|
|
130
|
+
*
|
|
131
|
+
* `busy_timeout = 0` with `BEGIN IMMEDIATE` makes contention fail fast and
|
|
132
|
+
* typed; the outer async orchestration decides whether to retry within its
|
|
133
|
+
* deadline. Blocking here would hold K across an unbounded wait.
|
|
134
|
+
*/
|
|
135
|
+
export function withCatalogWriteSerialization<T>(
|
|
136
|
+
canonicalCodexHome: string,
|
|
137
|
+
write: (permit: CatalogWritePermit) => T,
|
|
138
|
+
): CatalogSerializationOutcome<T> {
|
|
139
|
+
let databasePath: string;
|
|
140
|
+
try {
|
|
141
|
+
databasePath = resolveCodexCatalogSerializationDatabasePath(
|
|
142
|
+
resolveEffectiveUserIdentity(),
|
|
143
|
+
canonicalCodexHome,
|
|
144
|
+
);
|
|
145
|
+
} catch (error) {
|
|
146
|
+
if (error instanceof CodexUserIdentityRefusal) {
|
|
147
|
+
return { kind: "unavailable", reason: "unsafe-path" };
|
|
148
|
+
}
|
|
149
|
+
return { kind: "unavailable", reason: "database" };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
let database: Database | undefined;
|
|
153
|
+
let transactionOpen = false;
|
|
154
|
+
let registration: PermitRegistration | undefined;
|
|
155
|
+
let permit: CatalogWritePermit | undefined;
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
let databaseWasAbsent = false;
|
|
159
|
+
try {
|
|
160
|
+
const before = lstatSync(databasePath);
|
|
161
|
+
if (before.isSymbolicLink() || !before.isFile()) {
|
|
162
|
+
return { kind: "unavailable", reason: "unsafe-path" };
|
|
163
|
+
}
|
|
164
|
+
if (process.platform !== "win32") {
|
|
165
|
+
const uid = process.getuid?.();
|
|
166
|
+
if (uid === undefined || before.uid !== uid || (before.mode & 0o777) !== 0o600) {
|
|
167
|
+
return { kind: "unavailable", reason: "unsafe-path" };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
} catch (cause) {
|
|
171
|
+
const code = cause && typeof cause === "object" && "code" in cause
|
|
172
|
+
? String((cause as { code?: unknown }).code)
|
|
173
|
+
: "";
|
|
174
|
+
if (code !== "ENOENT") throw cause;
|
|
175
|
+
databaseWasAbsent = true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
database = new Database(databasePath, { create: true });
|
|
179
|
+
if (databaseWasAbsent) {
|
|
180
|
+
try { chmodSync(databasePath, 0o600); } catch { /* Windows applies ACLs in WP11. */ }
|
|
181
|
+
}
|
|
182
|
+
const opened = lstatSync(databasePath);
|
|
183
|
+
if (opened.isSymbolicLink() || !opened.isFile()
|
|
184
|
+
|| !samePathIdentity(realpathSync.native(databasePath), databasePath)) {
|
|
185
|
+
return { kind: "unavailable", reason: "unsafe-path" };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
database.exec("PRAGMA busy_timeout = 0; BEGIN IMMEDIATE");
|
|
189
|
+
transactionOpen = true;
|
|
190
|
+
|
|
191
|
+
acquisitionCounter += 1;
|
|
192
|
+
registration = {
|
|
193
|
+
canonicalCodexHome,
|
|
194
|
+
transactionId: `${process.pid}:${acquisitionCounter}`,
|
|
195
|
+
live: true,
|
|
196
|
+
};
|
|
197
|
+
// A bare object: nothing about it is guessable or reconstructable, because
|
|
198
|
+
// authority lives in the registry entry rather than in the value.
|
|
199
|
+
permit = {} as CatalogWritePermit;
|
|
200
|
+
activePermits.set(permit as unknown as object, registration);
|
|
201
|
+
|
|
202
|
+
let value: T;
|
|
203
|
+
try {
|
|
204
|
+
value = write(permit);
|
|
205
|
+
} finally {
|
|
206
|
+
// Revoke BEFORE the transaction is released, so a mutator racing the
|
|
207
|
+
// release can never find a live permit without a live lock. This runs on
|
|
208
|
+
// the throwing path too, which is the case a `finally`-less version gets
|
|
209
|
+
// wrong.
|
|
210
|
+
registration.live = false;
|
|
211
|
+
activePermits.delete(permit as unknown as object);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
database.exec("COMMIT");
|
|
215
|
+
transactionOpen = false;
|
|
216
|
+
return { kind: "completed", value };
|
|
217
|
+
} catch (error) {
|
|
218
|
+
if (transactionOpen) {
|
|
219
|
+
try { database?.exec("ROLLBACK"); } catch { /* close releases the transaction */ }
|
|
220
|
+
transactionOpen = false;
|
|
221
|
+
}
|
|
222
|
+
if (registration?.live) {
|
|
223
|
+
registration.live = false;
|
|
224
|
+
if (permit) activePermits.delete(permit as unknown as object);
|
|
225
|
+
}
|
|
226
|
+
if (error instanceof CodexUserIdentityRefusal) {
|
|
227
|
+
return { kind: "unavailable", reason: "unsafe-path" };
|
|
228
|
+
}
|
|
229
|
+
if (isBusy(error)) return { kind: "unavailable", reason: "busy" };
|
|
230
|
+
// A callback failure is the caller's error, not a lock outcome: K acquired
|
|
231
|
+
// fine. Reporting it as `unavailable` would tell the caller to retry
|
|
232
|
+
// something that will fail identically.
|
|
233
|
+
throw error;
|
|
234
|
+
} finally {
|
|
235
|
+
try { database?.close(); } catch { /* acquisition already finished */ }
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** Test-only: prove a leaked permit is dead without reaching into the registry. */
|
|
240
|
+
export function isCatalogWritePermitLive(permit: CatalogWritePermit): boolean {
|
|
241
|
+
return activePermits.get(permit as unknown as object)?.live === true;
|
|
242
|
+
}
|
package/src/codex/catalog.ts
CHANGED
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
// Public surface preserved exactly; importers keep using "src/codex/catalog".
|
|
3
3
|
export { isMediaGenerationModelId, shouldExposeRoutedModel, readCodexCatalogPath, readCatalog, normalizeRoutedCatalogEntry, catalogModelSlug, filterSupportedNativeSlugs, catalogModelSupportsReasoningSummaries } from "./catalog/parsing";
|
|
4
4
|
export type { CatalogModel, MultiAgentMode } from "./catalog/parsing";
|
|
5
|
-
export { NATIVE_OPENAI_MODELS, nativeOpenAiContextWindow, disabledNativeSlugs, visibleNativeSlugs, desktopVisibleNativeSlugs, nativeModelRows, applyNativeVisibility, upstreamNativeEntry, nativeOpenAiSlugs, listCatalogNativeSlugs, nativeReasoningEfforts, nativeDefaultReasoningEffort } from "./catalog/metadata";
|
|
5
|
+
export { accountBoundNativeOpenAiSlugs, accountBoundNativeOpenAiSlugsBySelector, CODEX_NATIVE_ALIAS_CATALOG_KIND, NATIVE_DAYBREAK_BLUE_MODEL, NATIVE_GPT56_CONTEXT_WINDOW, NATIVE_GPT56_MAX_INPUT_TOKENS, NATIVE_GPT56_OPT_IN_CONTEXT_WINDOW, NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS, NATIVE_OPENAI_MODELS, configuredNativeAliasSlugs, desktopAllowlistSuppressedNativeSlugs, isNativeAliasCatalogEntry, isNativeOpenAiCapabilityAliasModel, nativeContextLimits, nativeOpenAiCapabilitySourceSlug, nativeOpenAiContextWindow, nativeOpenAiMaxInputTokens, disabledNativeSlugs, visibleNativeSlugs, desktopVisibleNativeSlugs, nativeModelRows, applyNativeVisibility, observedAccountBoundNativeEntries, observedAccountBoundNativeOpenAiSlugs, upstreamNativeEntry, nativeOpenAiSlugs, listCatalogNativeSlugs, nativeInputModalities, nativeReasoningEfforts, nativeDefaultReasoningEffort, shouldIncludeAccountBoundNativeOpenAi, shouldIncludeNativeOpenAi, type NativeContextLimits, type NativeContextLimitsInput } from "./catalog/metadata";
|
|
6
6
|
export { isSpawnableCodexCandidate, codexExecInvocation, loadBundledCodexCatalog, materializeBundledCodexCatalog, loadCatalogTemplate } from "./catalog/bundled";
|
|
7
7
|
export { nativeEffortClamp, shouldApplyNativeEffortClamp, catalogModelEfforts, codexSupportedReasoningEfforts, clampedDefaultEffort, clampEntryToCodexSupportedEfforts, clampCatalogModelsToCodexSupport } from "./catalog/effort";
|
|
8
|
-
export { applyProviderConfigHints, isDatedVariantId, filterCatalogVisibleModels, gatherRoutedModels, clearGatherRoutedModelsInflight, augmentRoutedModelsWithRegistryOpenAiApiRows,
|
|
8
|
+
export { applyProviderConfigHints, isDatedVariantId, filterCatalogVisibleModels, gatherRoutedModels, clearGatherRoutedModelsInflight, fetchProviderModels, augmentRoutedModelsWithRegistryOpenAiApiRows, augmentRoutedModelsWithMetadata, resolveComboCatalogMember, configuredComboTargetModelsByProvider, peekProviderModelsLocal, catalogGatherNeedsLiveRefresh, kickGatherRoutedModelsBackground } from "./catalog/provider-fetch";
|
|
9
|
+
export type { GatherRoutedModelsOptions } from "./catalog/provider-fetch";
|
|
9
10
|
export { deriveComboCatalogModel, exactComboCatalogSlugs, getLastComboCatalogOmissions, resetOpenAiApiCatalogWarningStateForTests, uniqueCatalogModelsForPublicList, uniqueCatalogModelsForRawPublicList, buildComboCatalogOmission, comboCatalogOmissionReason, summarizeComboCatalogOmissions } from "./catalog/aggregation";
|
|
10
11
|
export type { ComboCatalogOmission, ComboCatalogOmissionReason } from "./catalog/aggregation";
|
|
11
|
-
export { MAX_SPAWN_AGENT_MODEL_OVERRIDES, effectiveSubagentRoster, buildCatalogEntries, resetCatalogRuntimeStateForTests, orderForSubagents, mergeCatalogEntriesForSync, syncCatalogModels, restoreCodexCatalog, invalidateCodexModelsCache } from "./catalog/sync";
|
|
12
|
+
export { MAX_SPAWN_AGENT_MODEL_OVERRIDES, CANONICAL_NATIVE_CATALOG_CONTENT_POLICY, effectiveSubagentRoster, buildCatalogEntries, mergeCatalogEntriesFromObservedState, resetCatalogRuntimeStateForTests, orderForSubagents, mergeCatalogEntriesForSync, syncCatalogModels, restoreCodexCatalog, invalidateCodexModelsCache, finalizeAutoReviewModelOverride } from "./catalog/sync";
|
|
13
|
+
export type { ObservedCatalogMergeInput } from "./catalog/sync";
|
|
12
14
|
export type { SpawnAgentSurface, SubagentRosterExclusionReason, EffectiveSubagentModel, SubagentRosterExclusion, EffectiveSubagentRoster } from "./catalog/sync";
|
|
15
|
+
export { accountBoundNativeDisplayName, accountBoundNativeModelSlugs, CODEX_ACCOUNT_BOUND_CATALOG_KIND, trustedAccountBoundNativeCatalogSlug, visibleCodexAccountSelectors } from "./catalog/account-models";
|