@yansigit/opencodex 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/LICENSE +21 -0
- package/README.md +303 -0
- package/assets/architecture.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/claude-code-models.gif +0 -0
- package/assets/codex-app-picker.png +0 -0
- package/bin/ocx.mjs +587 -0
- package/bin/package-main.mjs +9 -0
- package/gui/dist/assets/index-BNJ7r4Gd.js +102 -0
- package/gui/dist/assets/index-CGoDO3uO.css +1 -0
- package/gui/dist/favicon.png +0 -0
- package/gui/dist/icons.svg +24 -0
- package/gui/dist/index.html +25 -0
- package/gui/dist/logo.png +0 -0
- package/gui/dist/provider-icons/alibaba-color.svg +1 -0
- package/gui/dist/provider-icons/antigravity-color.svg +1 -0
- package/gui/dist/provider-icons/claude-color.svg +1 -0
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -0
- package/gui/dist/provider-icons/cursor-color.svg +2 -0
- package/gui/dist/provider-icons/deepseek-color.svg +1 -0
- package/gui/dist/provider-icons/discord.svg +1 -0
- package/gui/dist/provider-icons/firepass-color.svg +1 -0
- package/gui/dist/provider-icons/fireworks-color.svg +1 -0
- package/gui/dist/provider-icons/gemini-color.svg +1 -0
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
- package/gui/dist/provider-icons/grok.svg +1 -0
- package/gui/dist/provider-icons/groq-color.svg +1 -0
- package/gui/dist/provider-icons/huggingface-color.svg +1 -0
- package/gui/dist/provider-icons/kimi-color.svg +1 -0
- package/gui/dist/provider-icons/kiro-color.svg +15 -0
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
- package/gui/dist/provider-icons/mistral-color.svg +1 -0
- package/gui/dist/provider-icons/moonshot-color.svg +1 -0
- package/gui/dist/provider-icons/nvidia-color.svg +1 -0
- package/gui/dist/provider-icons/ollama-color.svg +1 -0
- package/gui/dist/provider-icons/openai.svg +1 -0
- package/gui/dist/provider-icons/opencode.svg +2 -0
- package/gui/dist/provider-icons/openrouter-color.svg +1 -0
- package/gui/dist/provider-icons/pi.svg +21 -0
- package/gui/dist/provider-icons/qianfan-color.svg +1 -0
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
- package/gui/dist/provider-icons/telegram.svg +1 -0
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
- package/gui/dist/provider-icons/vllm-color.svg +1 -0
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
- package/package.json +108 -0
- package/src/AGENTS.md +28 -0
- package/src/adapters/anthropic-image-guard.ts +251 -0
- package/src/adapters/anthropic-image-normalize.ts +518 -0
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +1327 -0
- package/src/adapters/azure.ts +36 -0
- package/src/adapters/base.ts +121 -0
- package/src/adapters/client-fingerprint.ts +65 -0
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/arg-codec.ts +38 -0
- package/src/adapters/cursor/arg-normalize.ts +104 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +288 -0
- package/src/adapters/cursor/discovery.ts +333 -0
- package/src/adapters/cursor/effort-map.ts +151 -0
- package/src/adapters/cursor/exec-policy.ts +88 -0
- package/src/adapters/cursor/framing.ts +250 -0
- package/src/adapters/cursor/gen/agent_pb.ts +15274 -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/kv-store.ts +52 -0
- package/src/adapters/cursor/live-models.ts +269 -0
- package/src/adapters/cursor/live-smoke-gate.ts +41 -0
- package/src/adapters/cursor/live-transport.ts +1653 -0
- package/src/adapters/cursor/mcp-config.ts +42 -0
- package/src/adapters/cursor/mcp-manager.ts +333 -0
- package/src/adapters/cursor/message-mapper.ts +49 -0
- package/src/adapters/cursor/native-exec-common.ts +76 -0
- package/src/adapters/cursor/native-exec-desktop.ts +184 -0
- package/src/adapters/cursor/native-exec-fs.ts +332 -0
- package/src/adapters/cursor/native-exec-mcp.ts +153 -0
- package/src/adapters/cursor/native-exec-network.ts +43 -0
- package/src/adapters/cursor/native-exec-shell.ts +547 -0
- package/src/adapters/cursor/native-exec-tools.ts +118 -0
- package/src/adapters/cursor/native-exec.ts +663 -0
- package/src/adapters/cursor/protobuf-events.ts +1381 -0
- package/src/adapters/cursor/protobuf-request.ts +1032 -0
- package/src/adapters/cursor/request-builder.ts +461 -0
- package/src/adapters/cursor/thread-continuity.ts +67 -0
- package/src/adapters/cursor/tool-definitions.ts +735 -0
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport-retry.ts +132 -0
- package/src/adapters/cursor/transport.ts +79 -0
- package/src/adapters/cursor/types.ts +79 -0
- package/src/adapters/cursor.ts +322 -0
- package/src/adapters/google-antigravity-hosts.ts +48 -0
- package/src/adapters/google-antigravity-replay.ts +827 -0
- package/src/adapters/google-antigravity-tools.ts +105 -0
- package/src/adapters/google-antigravity-wire.ts +141 -0
- package/src/adapters/google-errors.ts +92 -0
- package/src/adapters/google-http.ts +460 -0
- package/src/adapters/google-tool-schema.ts +238 -0
- package/src/adapters/google-truncation.ts +24 -0
- package/src/adapters/google-wire-compiler.ts +232 -0
- package/src/adapters/google.ts +1377 -0
- package/src/adapters/identity.ts +77 -0
- package/src/adapters/image.ts +23 -0
- package/src/adapters/kiro-constants.ts +16 -0
- package/src/adapters/kiro-errors.ts +208 -0
- package/src/adapters/kiro-events.ts +197 -0
- package/src/adapters/kiro-images.ts +129 -0
- package/src/adapters/kiro-retry.ts +312 -0
- package/src/adapters/kiro-thinking.ts +112 -0
- package/src/adapters/kiro-tool-fallback.ts +36 -0
- package/src/adapters/kiro-tools.ts +224 -0
- package/src/adapters/kiro-truncation.ts +33 -0
- package/src/adapters/kiro-wire.ts +129 -0
- package/src/adapters/kiro.ts +1936 -0
- package/src/adapters/mimo-free.ts +280 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1980 -0
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +1911 -0
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/run-turn-queue.ts +114 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +154 -0
- package/src/adapters/upstream-http-error.ts +48 -0
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +1986 -0
- package/src/chat/inbound.ts +319 -0
- package/src/chat/outbound.ts +821 -0
- package/src/claude/agents-inject.ts +266 -0
- package/src/claude/alias.ts +149 -0
- package/src/claude/auth-detect.ts +229 -0
- package/src/claude/auth-mode-migration.ts +32 -0
- package/src/claude/auth-mode.ts +62 -0
- package/src/claude/context-windows.ts +205 -0
- package/src/claude/desktop-3p-guard.ts +35 -0
- package/src/claude/desktop-3p-paths.ts +84 -0
- package/src/claude/desktop-3p.ts +615 -0
- package/src/claude/desktop-health.ts +26 -0
- package/src/claude/desktop-profile.ts +263 -0
- package/src/claude/gateway-cache.ts +107 -0
- package/src/claude/inbound-debug.ts +163 -0
- package/src/claude/inbound.ts +578 -0
- package/src/claude/model-info.ts +174 -0
- package/src/claude/outbound.ts +926 -0
- package/src/cli/access.ts +108 -0
- package/src/cli/account-api.ts +302 -0
- package/src/cli/account-auth.ts +250 -0
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +737 -0
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +299 -0
- package/src/cli/agent-driven.ts +70 -0
- package/src/cli/agent.ts +290 -0
- package/src/cli/catalog-prewarm.ts +27 -0
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +213 -0
- package/src/cli/claude.ts +355 -0
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +47 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +127 -0
- package/src/cli/config-command.ts +209 -0
- package/src/cli/debug.ts +228 -0
- package/src/cli/dispatch.ts +585 -0
- package/src/cli/doctor.ts +1202 -0
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +213 -0
- package/src/cli/help.ts +101 -0
- package/src/cli/index.ts +973 -0
- package/src/cli/init.ts +211 -0
- package/src/cli/integrations.ts +260 -0
- package/src/cli/interactive-confirm.ts +133 -0
- 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 +245 -0
- package/src/cli/models.ts +422 -0
- package/src/cli/observe.ts +206 -0
- package/src/cli/opencode.ts +588 -0
- package/src/cli/provider-replit.ts +232 -0
- package/src/cli/provider-runtime.ts +179 -0
- package/src/cli/provider.ts +492 -0
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +422 -0
- package/src/cli/replit-gateway-key-input.ts +138 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +328 -0
- package/src/cli/star-prompt.ts +211 -0
- package/src/cli/status-oauth.ts +78 -0
- package/src/cli/status.ts +328 -0
- package/src/cli/system-command.ts +112 -0
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +199 -0
- package/src/cli/v2.ts +268 -0
- package/src/cli.ts +10 -0
- package/src/clients/config-export.ts +1704 -0
- package/src/codex/account-id.ts +34 -0
- package/src/codex/account-label.ts +47 -0
- package/src/codex/account-lifecycle.ts +172 -0
- package/src/codex/account-namespace-match.ts +63 -0
- package/src/codex/account-namespaces.ts +195 -0
- package/src/codex/account-pause.ts +20 -0
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-runtime-state.ts +31 -0
- package/src/codex/account-store.ts +544 -0
- package/src/codex/account-usability.ts +43 -0
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/agent-roles-sync.ts +225 -0
- package/src/codex/agent-roles.ts +238 -0
- package/src/codex/app-server-processes.ts +1143 -0
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +2147 -0
- package/src/codex/auth-collision.ts +109 -0
- package/src/codex/auth-context.ts +665 -0
- package/src/codex/autostart-health.ts +156 -0
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +436 -0
- package/src/codex/catalog/bundled.ts +549 -0
- package/src/codex/catalog/effort.ts +446 -0
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +664 -0
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +650 -0
- package/src/codex/catalog/provider-fetch.ts +2064 -0
- package/src/codex/catalog/sync.ts +1883 -0
- 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 +14 -0
- 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/data/upstream-models.json +830 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/exec-invocation.ts +22 -0
- package/src/codex/features.ts +1566 -0
- 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 +108 -0
- package/src/codex/history-provider.ts +979 -0
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/home.ts +206 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1733 -0
- package/src/codex/injected-marker.ts +106 -0
- 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 +225 -0
- 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 +56 -0
- package/src/codex/main-account.ts +68 -0
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +273 -0
- 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 +144 -0
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +242 -0
- package/src/codex/pool-rotation.ts +295 -0
- package/src/codex/project-config-warnings.ts +425 -0
- 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 +573 -0
- package/src/codex/refresh.ts +62 -0
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +1888 -0
- package/src/codex/runtime.ts +659 -0
- package/src/codex/shim.ts +2170 -0
- package/src/codex/subagent-defaults.ts +550 -0
- package/src/codex/subagent-model-fallback.ts +784 -0
- package/src/codex/sync.ts +319 -0
- 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 +298 -0
- package/src/codex/websocket-registry.ts +100 -0
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +160 -0
- package/src/combos/index.ts +45 -0
- package/src/combos/request.ts +94 -0
- package/src/combos/resolve.ts +232 -0
- package/src/combos/types.ts +398 -0
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +4041 -0
- package/src/fork/register.ts +3 -0
- package/src/generated/compatibility-version.json +3116 -0
- package/src/generated/model-metadata.ts +106 -0
- package/src/github/star-state.ts +203 -0
- package/src/grok/inject.ts +530 -0
- package/src/grok/inspect.ts +45 -0
- package/src/grok/status.ts +121 -0
- package/src/grok/sync.ts +66 -0
- package/src/images/artifacts.ts +516 -0
- package/src/images/fulfill-video.ts +163 -0
- package/src/images/fulfill.ts +149 -0
- package/src/images/index.ts +4 -0
- package/src/images/loop.ts +955 -0
- package/src/images/plan.ts +143 -0
- package/src/images/synthetic-tool.ts +133 -0
- package/src/images/types.ts +41 -0
- package/src/images/xai-client.ts +141 -0
- package/src/images/xai-video-client.ts +163 -0
- package/src/index.ts +22 -0
- 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/abort.ts +146 -0
- package/src/lib/admin-secrets.ts +25 -0
- package/src/lib/admission.ts +83 -0
- package/src/lib/app-owned-memory-stores.ts +195 -0
- package/src/lib/app-owned-memory.ts +265 -0
- package/src/lib/bounded-body.ts +346 -0
- package/src/lib/bun-binary-validator.d.mts +3 -0
- package/src/lib/bun-binary-validator.mjs +18 -0
- package/src/lib/bun-runtime.ts +184 -0
- package/src/lib/bun-stream-caps.ts +130 -0
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +364 -0
- package/src/lib/crash-guard.ts +344 -0
- package/src/lib/debug-log-buffer.ts +83 -0
- package/src/lib/debug-settings.ts +108 -0
- package/src/lib/debug.ts +31 -0
- package/src/lib/destination-policy.ts +380 -0
- package/src/lib/errors.ts +406 -0
- package/src/lib/eventstream-decoder.ts +253 -0
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/gcp-adc.ts +341 -0
- package/src/lib/injection-debug-log.ts +58 -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/open-url.ts +25 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +270 -0
- package/src/lib/privacy.ts +20 -0
- package/src/lib/process-control.ts +168 -0
- package/src/lib/provider-outbound.ts +210 -0
- package/src/lib/provider-url.ts +14 -0
- package/src/lib/proxy-env.ts +18 -0
- package/src/lib/redact.ts +521 -0
- package/src/lib/retry-after.ts +55 -0
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/service-secrets.ts +25 -0
- package/src/lib/shadow-call.ts +61 -0
- package/src/lib/sidecar-tracker.ts +52 -0
- package/src/lib/sse-decoder.ts +364 -0
- package/src/lib/state-store-registrations.ts +119 -0
- package/src/lib/state-store-sweeper.ts +184 -0
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/test-home-guard.ts +90 -0
- package/src/lib/token-estimate.ts +86 -0
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +400 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +392 -0
- package/src/lib/win-exec.ts +115 -0
- package/src/lib/win-paths.ts +68 -0
- package/src/lib/windows-atomic-replace.ts +156 -0
- package/src/lib/windows-elevation.ts +773 -0
- package/src/lib/windows-secret-acl.ts +854 -0
- 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 +403 -0
- 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-routing.ts +594 -0
- package/src/oauth/anthropic.ts +188 -0
- package/src/oauth/antigravity-routing.ts +151 -0
- package/src/oauth/callback-server.ts +300 -0
- package/src/oauth/chatgpt.ts +161 -0
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +252 -0
- package/src/oauth/github-copilot.ts +428 -0
- package/src/oauth/google-antigravity.ts +262 -0
- package/src/oauth/health.ts +407 -0
- package/src/oauth/index.ts +1504 -0
- package/src/oauth/key-providers.ts +124 -0
- package/src/oauth/kimi.ts +227 -0
- package/src/oauth/kiro-credentials.ts +726 -0
- package/src/oauth/kiro.ts +621 -0
- package/src/oauth/local-token-detect.ts +130 -0
- package/src/oauth/log.ts +50 -0
- package/src/oauth/login-cli.ts +223 -0
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/pkce.ts +15 -0
- package/src/oauth/store.ts +728 -0
- package/src/oauth/token-guardian.ts +309 -0
- package/src/oauth/types.ts +62 -0
- package/src/oauth/xai.ts +241 -0
- package/src/providers/alibaba-region-backup.ts +75 -0
- package/src/providers/alibaba-region-migration.ts +156 -0
- package/src/providers/alibaba-region-startup.ts +36 -0
- package/src/providers/antigravity-models.ts +695 -0
- package/src/providers/antigravity-quota.ts +216 -0
- package/src/providers/api-keys.ts +140 -0
- package/src/providers/base-url-choices.ts +74 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +82 -0
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +586 -0
- package/src/providers/fastwire.ts +501 -0
- package/src/providers/free-directory.ts +187 -0
- package/src/providers/github-copilot-transport.ts +56 -0
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +271 -0
- package/src/providers/kiro-models.ts +67 -0
- package/src/providers/label.ts +19 -0
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +449 -0
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +243 -0
- package/src/providers/openai-tier-startup.ts +56 -0
- package/src/providers/openai-tiers.ts +423 -0
- package/src/providers/openai-virtual-models.ts +83 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/openrouter-routing.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +185 -0
- package/src/providers/quota.ts +2345 -0
- package/src/providers/registry.ts +2918 -0
- package/src/providers/replit/constants.ts +27 -0
- package/src/providers/replit/derive.ts +85 -0
- package/src/providers/replit/headers.ts +28 -0
- package/src/providers/replit/origin.ts +55 -0
- package/src/providers/replit/pair-install-response.ts +72 -0
- package/src/providers/replit/probe.ts +199 -0
- package/src/providers/replit/setup.ts +350 -0
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +103 -0
- 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 +148 -0
- package/src/reasoning-effort.ts +183 -0
- package/src/responses/compaction.ts +142 -0
- 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 +838 -0
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +60 -0
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +165 -0
- package/src/responses/spill-store.ts +459 -0
- package/src/responses/state.ts +1433 -0
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-groups.ts +19 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +761 -0
- 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 +53 -0
- package/src/server/auth-cors.ts +751 -0
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +442 -0
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +1030 -0
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +190 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +152 -0
- package/src/server/image-retry.ts +42 -0
- package/src/server/images.ts +568 -0
- package/src/server/index.ts +1813 -0
- package/src/server/lifecycle.ts +498 -0
- package/src/server/live.ts +717 -0
- 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 +1433 -0
- package/src/server/management/api-access.ts +141 -0
- package/src/server/management/api-key-usage.ts +193 -0
- package/src/server/management/body.ts +41 -0
- package/src/server/management/combo-routes.ts +263 -0
- package/src/server/management/config-routes.ts +835 -0
- package/src/server/management/context.ts +113 -0
- 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 +586 -0
- package/src/server/management/model-routes.ts +560 -0
- 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 +637 -0
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +1033 -0
- package/src/server/management/replit-provider-routes.ts +86 -0
- 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 +385 -0
- package/src/server/management/shared.ts +286 -0
- package/src/server/management/sidebar-routes.ts +106 -0
- 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 +435 -0
- package/src/server/management/system-routes.ts +194 -0
- package/src/server/management/usage-summary-cache.ts +94 -0
- 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 +314 -0
- package/src/server/management-auth.ts +482 -0
- package/src/server/memory-watchdog.ts +156 -0
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/port-reclaim.ts +307 -0
- package/src/server/ports.ts +156 -0
- package/src/server/proxy-liveness.ts +328 -0
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +353 -0
- package/src/server/relay.ts +1209 -0
- package/src/server/request-decompress.ts +239 -0
- package/src/server/request-log-conversation.ts +168 -0
- package/src/server/request-log.ts +1259 -0
- 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 +551 -0
- package/src/server/responses/compact.ts +771 -0
- package/src/server/responses/core.ts +5389 -0
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +331 -0
- package/src/server/responses/fetch-helpers.ts +232 -0
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/passthrough-error.ts +78 -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 +251 -0
- package/src/server/responses/upstream-error.ts +53 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -0
- package/src/server/responses-image-gen-repair.ts +132 -0
- package/src/server/responses-item-id-repair.ts +272 -0
- 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 +25 -0
- package/src/server/search.ts +201 -0
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +263 -0
- package/src/server/startup-action-control.ts +315 -0
- package/src/server/startup-health-cache.ts +131 -0
- package/src/server/system-env.ts +484 -0
- package/src/server/windows-tcp-drop.ts +184 -0
- package/src/server/windows-tray-control.ts +41 -0
- package/src/server/ws-bridge.ts +472 -0
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +3575 -0
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/stall-timeout.ts +20 -0
- package/src/storage/cleanup-job.ts +57 -0
- package/src/storage/cleanup.ts +3085 -0
- package/src/storage/policy-job.ts +457 -0
- package/src/storage/policy-scheduler.ts +40 -0
- package/src/storage/policy-worker.ts +59 -0
- package/src/storage/policy.ts +527 -0
- package/src/storage/restore-job.ts +299 -0
- package/src/storage/restore-worker.ts +58 -0
- package/src/storage/scanner.ts +238 -0
- package/src/storage/storage-mutation-coordinator.ts +139 -0
- package/src/storage/worker-lifecycle.ts +215 -0
- package/src/tray/assets/opencodex-tray-offline.ico +0 -0
- package/src/tray/assets/opencodex-tray-online.ico +0 -0
- package/src/tray/assets/opencodex-tray-warning.ico +0 -0
- package/src/tray/assets/opencodex-tray.png +0 -0
- package/src/tray/windows-tray.ps1 +364 -0
- package/src/tray/windows.ts +757 -0
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +876 -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 +106 -0
- package/src/update/badge.ts +72 -0
- package/src/update/index.ts +415 -0
- package/src/update/job.ts +1887 -0
- package/src/update/notify.ts +263 -0
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/npm-invocation.d.mts +23 -0
- package/src/update/npm-invocation.mjs +94 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -0
- package/src/update/tray-update-plan.d.mts +18 -0
- package/src/update/tray-update-plan.mjs +38 -0
- package/src/usage/cost.ts +625 -0
- package/src/usage/debug.ts +97 -0
- package/src/usage/expected-prices.ts +416 -0
- package/src/usage/log.ts +1223 -0
- package/src/usage/summary.ts +753 -0
- package/src/usage/totals.ts +14 -0
- 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 +189 -0
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +131 -0
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +681 -0
- 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 +195 -0
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +113 -0
- package/src/web-search/format-result.ts +89 -0
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +331 -0
- package/src/web-search/loop.ts +896 -0
- package/src/web-search/parse.ts +315 -0
- package/src/web-search/progress-stream.ts +342 -0
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/synthetic-tool.ts +47 -0
- package/src/web-search/xai-executor.ts +219 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { enforceAppOwnedMemoryBudget, type RetainedStoreSnapshot } from "../../lib/app-owned-memory";
|
|
2
|
+
import type { UsageSummary } from "../../usage/summary";
|
|
3
|
+
|
|
4
|
+
export type CachedUsageSummary = UsageSummary & {
|
|
5
|
+
historyTruncated: boolean;
|
|
6
|
+
truncatedPrefixBytes: number;
|
|
7
|
+
entriesTruncated: boolean;
|
|
8
|
+
entriesDropped: number;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export interface UsageSummaryCacheEntry {
|
|
12
|
+
revisionKey: string;
|
|
13
|
+
/** path/dev/ino/birthtime only; appends keep this stable. */
|
|
14
|
+
identityKey: string;
|
|
15
|
+
maxReadBytes: number;
|
|
16
|
+
/** userCostOverlayVersion() when the summary was computed; overlay edits invalidate the entry. */
|
|
17
|
+
overlayVersion: number;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
/** Generation freshness: ignore size/mtime until this instant. */
|
|
20
|
+
freshUntil: number;
|
|
21
|
+
lastSeenSize: number;
|
|
22
|
+
summary: CachedUsageSummary;
|
|
23
|
+
revisionReadAt: number;
|
|
24
|
+
sizeBytes: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const usageSummaryCache = new Map<string, UsageSummaryCacheEntry>();
|
|
28
|
+
let usageSummaryCacheBytes = 0;
|
|
29
|
+
let oldestUsageSummaryKey: string | undefined;
|
|
30
|
+
let oldestUsageSummaryAt: number | null = null;
|
|
31
|
+
|
|
32
|
+
function recomputeOldestUsageSummary(): void {
|
|
33
|
+
oldestUsageSummaryKey = undefined;
|
|
34
|
+
oldestUsageSummaryAt = null;
|
|
35
|
+
for (const [key, entry] of usageSummaryCache) {
|
|
36
|
+
const readAt = entry.revisionReadAt;
|
|
37
|
+
if (oldestUsageSummaryAt !== null && readAt >= oldestUsageSummaryAt) continue;
|
|
38
|
+
oldestUsageSummaryKey = key;
|
|
39
|
+
oldestUsageSummaryAt = readAt;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function deleteUsageSummaryCacheEntry(key: string): number {
|
|
44
|
+
const entry = usageSummaryCache.get(key);
|
|
45
|
+
if (!entry) return 0;
|
|
46
|
+
usageSummaryCache.delete(key);
|
|
47
|
+
usageSummaryCacheBytes = Math.max(0, usageSummaryCacheBytes - entry.sizeBytes);
|
|
48
|
+
if (oldestUsageSummaryKey === key) recomputeOldestUsageSummary();
|
|
49
|
+
return entry.sizeBytes;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function getUsageSummaryCacheEntry(key: string): UsageSummaryCacheEntry | undefined {
|
|
53
|
+
return usageSummaryCache.get(key);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function discardUsageSummaryCacheEntry(key: string): number {
|
|
57
|
+
return deleteUsageSummaryCacheEntry(key);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function setUsageSummaryCacheEntry(
|
|
61
|
+
key: string,
|
|
62
|
+
entry: Omit<UsageSummaryCacheEntry, "sizeBytes">,
|
|
63
|
+
): void {
|
|
64
|
+
deleteUsageSummaryCacheEntry(key);
|
|
65
|
+
const sizeBytes = Buffer.byteLength(JSON.stringify({ key, ...entry }), "utf8");
|
|
66
|
+
usageSummaryCache.set(key, { ...entry, sizeBytes });
|
|
67
|
+
usageSummaryCacheBytes += sizeBytes;
|
|
68
|
+
if (oldestUsageSummaryAt === null || entry.revisionReadAt < oldestUsageSummaryAt) {
|
|
69
|
+
oldestUsageSummaryKey = key;
|
|
70
|
+
oldestUsageSummaryAt = entry.revisionReadAt;
|
|
71
|
+
}
|
|
72
|
+
enforceAppOwnedMemoryBudget();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function usageSummaryRetainedStoreSnapshot(): RetainedStoreSnapshot {
|
|
76
|
+
return {
|
|
77
|
+
count: usageSummaryCache.size,
|
|
78
|
+
bytes: usageSummaryCacheBytes,
|
|
79
|
+
evictableBytes: usageSummaryCacheBytes,
|
|
80
|
+
pinnedBytes: 0,
|
|
81
|
+
oldestAt: oldestUsageSummaryAt,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function evictOldestUsageSummaryForBudget(): number {
|
|
86
|
+
return oldestUsageSummaryKey === undefined ? 0 : deleteUsageSummaryCacheEntry(oldestUsageSummaryKey);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function resetUsageSummaryCacheForTests(): void {
|
|
90
|
+
usageSummaryCache.clear();
|
|
91
|
+
usageSummaryCacheBytes = 0;
|
|
92
|
+
oldestUsageSummaryKey = undefined;
|
|
93
|
+
oldestUsageSummaryAt = null;
|
|
94
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one place that decides which models the management API offers as vision
|
|
3
|
+
* describers, and which it refuses to persist.
|
|
4
|
+
*
|
|
5
|
+
* Two routes write a vision sidecar model — `PUT /api/sidecar-settings` and the
|
|
6
|
+
* `visionSidecar` override in `PUT /api/claude-code`. They share this module so
|
|
7
|
+
* the policy cannot drift: a gate on one route and a stale copy on the other is
|
|
8
|
+
* the same as no gate at all.
|
|
9
|
+
*/
|
|
10
|
+
import type { OcxConfig } from "../../types";
|
|
11
|
+
import { findAnthropicVisionProvider, type AnthropicVisionProvider } from "../../vision";
|
|
12
|
+
import { VISION_BACKENDS } from "../../vision/backends";
|
|
13
|
+
import {
|
|
14
|
+
modelAcceptsImageInput,
|
|
15
|
+
visionEligibleModelOptions,
|
|
16
|
+
type VisionCandidateModel,
|
|
17
|
+
type VisionModelOption,
|
|
18
|
+
type VisionSidecarBackend,
|
|
19
|
+
} from "../../vision/eligibility";
|
|
20
|
+
import { pickerVisibleSidecarCandidates } from "../../sidecar/candidates";
|
|
21
|
+
import { resolveSidecarAuth } from "../../sidecar/auth";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Backends whose executor could actually run (#2188 roadmap 170): openai
|
|
25
|
+
* forward, anthropic OAuth, xai OAuth, Antigravity OAuth — resolved by the
|
|
26
|
+
* VISION_BACKENDS descriptor table so this module and the options path cannot
|
|
27
|
+
* drift on what "active" means.
|
|
28
|
+
*
|
|
29
|
+
* `anthropicSidecar` is REQUIRED rather than defaulted. `findAnthropicVisionProvider`
|
|
30
|
+
* reads the OAuth account store from disk, and a default argument made every helper
|
|
31
|
+
* in this chain re-resolve it whenever a caller passed an explicit `undefined` —
|
|
32
|
+
* which is exactly the no-executor case. Passing it in keeps one read per request.
|
|
33
|
+
* The descriptor table re-derives the anthropic flag from the shared auth
|
|
34
|
+
* module; asserting the caller's resolution stays consistent with it is the
|
|
35
|
+
* job of the shared module, not this file.
|
|
36
|
+
*/
|
|
37
|
+
export function enabledVisionBackends(
|
|
38
|
+
config: OcxConfig,
|
|
39
|
+
anthropicSidecar: AnthropicVisionProvider | undefined,
|
|
40
|
+
): VisionSidecarBackend[] {
|
|
41
|
+
const auth = resolveSidecarAuth(config);
|
|
42
|
+
// Preserve the caller's resolution for the anthropic side: the descriptor
|
|
43
|
+
// reads the shared auth module, but a caller that already resolved "no
|
|
44
|
+
// executor" must not see anthropic options it cannot dispatch. The filter
|
|
45
|
+
// applies to the ACTIVE set only — the fresh-install fallback below stays
|
|
46
|
+
// both universal sides, exactly the pre-widening behavior (test 6 pins it).
|
|
47
|
+
const active = VISION_BACKENDS
|
|
48
|
+
.filter(descriptor => descriptor.isActive(auth, config))
|
|
49
|
+
.map(descriptor => descriptor.backend)
|
|
50
|
+
.filter(backend => backend !== "anthropic" || anthropicSidecar !== undefined);
|
|
51
|
+
// "routed" is active by construction, so the fresh-install fallback keys on
|
|
52
|
+
// the UNIVERSAL sides: when neither resolves, both are offered so the picker
|
|
53
|
+
// stays populated (permissive-unknown rule; test 6 pins it).
|
|
54
|
+
if (!active.includes("openai") && !active.includes("anthropic")) {
|
|
55
|
+
return ["openai", "anthropic", ...active];
|
|
56
|
+
}
|
|
57
|
+
return active;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Visible catalog rows in the shape the eligibility predicate consumes.
|
|
62
|
+
* Sourced from the unified picker set (#2188): picker-visible rows ∪ auth
|
|
63
|
+
* slots, UNFILTERED. Rule 2 (− provably text-only) belongs to the OPTIONS
|
|
64
|
+
* path only (visionEligibleModelOptions already applies it). The PUT gate
|
|
65
|
+
* consumes this list as EVIDENCE: a picker row proving an id text-only is
|
|
66
|
+
* exactly what visionDescriberIsProvablyBlind needs to reject that id, so
|
|
67
|
+
* pre-filtering here would deaden the gate (review F1: reject → allow flip).
|
|
68
|
+
*/
|
|
69
|
+
export async function visionCandidateRows(config: OcxConfig): Promise<VisionCandidateModel[]> {
|
|
70
|
+
const auth = resolveSidecarAuth(config);
|
|
71
|
+
const all = await pickerVisibleSidecarCandidates(config, auth);
|
|
72
|
+
return all.map(candidate => ({
|
|
73
|
+
provider: candidate.provider,
|
|
74
|
+
id: candidate.id,
|
|
75
|
+
...(candidate.inputModalities ? { inputModalities: candidate.inputModalities } : {}),
|
|
76
|
+
...(candidate.native ? { native: true } : {}),
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function visionModelOptionsFrom(
|
|
81
|
+
config: OcxConfig,
|
|
82
|
+
candidates: readonly VisionCandidateModel[],
|
|
83
|
+
anthropicSidecar: AnthropicVisionProvider | undefined,
|
|
84
|
+
): VisionModelOption[] {
|
|
85
|
+
return visionEligibleModelOptions(
|
|
86
|
+
config,
|
|
87
|
+
candidates,
|
|
88
|
+
enabledVisionBackends(config, anthropicSidecar),
|
|
89
|
+
anthropicSidecar?.providerName,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Convenience for read paths that have no candidate list in hand yet. */
|
|
94
|
+
export async function visionModelOptionsFor(
|
|
95
|
+
config: OcxConfig,
|
|
96
|
+
anthropicSidecar: AnthropicVisionProvider | undefined,
|
|
97
|
+
): Promise<VisionModelOption[]> {
|
|
98
|
+
return visionModelOptionsFrom(config, await visionCandidateRows(config), anthropicSidecar);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Can we PROVE the requested describer is blind?
|
|
103
|
+
*
|
|
104
|
+
* Only a positive `false` rejects. An id no source knows stays allowed, because
|
|
105
|
+
* the runtime never required catalog membership and an operator may be ahead of
|
|
106
|
+
* our tables.
|
|
107
|
+
*
|
|
108
|
+
* When no catalog row matches, the caller's `backend` is only a HINT, never the
|
|
109
|
+
* authority. Trusting it let a client launder a known-blind OpenAI model past the
|
|
110
|
+
* gate by claiming `backend: "anthropic"`, since the id is absent from the
|
|
111
|
+
* Anthropic table and absence reads as "unknown".
|
|
112
|
+
*
|
|
113
|
+
* A NAMESPACED id ("provider/model", the routed-backend option shape) names
|
|
114
|
+
* its provider outright, so that provider's config row and metadata family
|
|
115
|
+
* are probed directly. A BARE id probes ALL configured provider families and
|
|
116
|
+
* any positive text-only verdict wins (roadmap 170: a bare `grok-4` is
|
|
117
|
+
* provably text-only in the xai vendor table and must not slip through a
|
|
118
|
+
* two-family probe). That is safe precisely because the vendor tables share
|
|
119
|
+
* no bare model id (collision scan in roadmap 160: openai 48, anthropic 26,
|
|
120
|
+
* xai 32, google 43, zero overlaps), so they can never disagree about one.
|
|
121
|
+
*/
|
|
122
|
+
export function visionDescriberIsProvablyBlind(
|
|
123
|
+
config: OcxConfig,
|
|
124
|
+
requested: string,
|
|
125
|
+
candidates: readonly VisionCandidateModel[],
|
|
126
|
+
backendHint: VisionSidecarBackend | undefined,
|
|
127
|
+
): boolean {
|
|
128
|
+
// Catalog rows can carry operator-authored modalities. A positive claim from one
|
|
129
|
+
// must not hide another row or canonical metadata that proves this id is blind.
|
|
130
|
+
if (candidates.some(candidate => candidate.id === requested
|
|
131
|
+
&& modelAcceptsImageInput(config, candidate) === false)) return true;
|
|
132
|
+
|
|
133
|
+
// Namespaced routed id: the provider is named, probe it directly (config
|
|
134
|
+
// row enrichment + its metadata family both flow through the predicate).
|
|
135
|
+
const sep = requested.indexOf("/");
|
|
136
|
+
if (sep > 0) {
|
|
137
|
+
const provider = requested.slice(0, sep);
|
|
138
|
+
const id = requested.slice(sep + 1);
|
|
139
|
+
if (modelAcceptsImageInput(config, { provider, id }) === false) return true;
|
|
140
|
+
// A namespaced candidate row (value shape) may also carry the proof.
|
|
141
|
+
return candidates.some(candidate => candidate.provider === provider && candidate.id === id
|
|
142
|
+
&& modelAcceptsImageInput(config, candidate) === false);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Bare id: probe the base vendor families plus every configured provider —
|
|
146
|
+
// a positive text-only verdict from any source wins.
|
|
147
|
+
const families = new Set(["openai", "anthropic", "xai", "google-antigravity", ...Object.keys(config.providers ?? {})]);
|
|
148
|
+
const ordered = backendHint === "anthropic"
|
|
149
|
+
? ["anthropic", ...[...families].filter(family => family !== "anthropic")]
|
|
150
|
+
: ["openai", ...[...families].filter(family => family !== "openai")];
|
|
151
|
+
return ordered.some(provider => modelAcceptsImageInput(config, { provider, id: requested }) === false);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** The 400 body both routes return, so the two errors cannot diverge either. */
|
|
155
|
+
export function visionDescriberRejection(
|
|
156
|
+
field: "vision.model" | "visionSidecar.model",
|
|
157
|
+
requested: string,
|
|
158
|
+
config: OcxConfig,
|
|
159
|
+
candidates: readonly VisionCandidateModel[],
|
|
160
|
+
): { error: string; allowed: string[] } {
|
|
161
|
+
return {
|
|
162
|
+
error: `${field} "${requested}" cannot describe images: it has no image input support, or it is a model the vision sidecar describes FOR.`,
|
|
163
|
+
// The rejection path is not hot, so it resolves the executor itself rather than
|
|
164
|
+
// making every 400 caller thread one through.
|
|
165
|
+
allowed: visionModelOptionsFrom(config, candidates, findAnthropicVisionProvider(config)).map(option => option.value),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one place that decides which models the management API offers as the
|
|
3
|
+
* web-search sidecar, and which it refuses to persist (#2188).
|
|
4
|
+
*
|
|
5
|
+
* Two routes write `webSearchSidecar.model` — `PUT /api/sidecar-settings`
|
|
6
|
+
* and the `webSearchSidecar` override in `PUT /api/claude-code`. They share
|
|
7
|
+
* this module for the same reason the vision routes share
|
|
8
|
+
* vision-sidecar-options.ts: a gate on one route and a stale copy on the
|
|
9
|
+
* other is the same as no gate at all. `ocx config set` raw JSON writes
|
|
10
|
+
* bypass management gates by design (operator escape hatch, same as vision).
|
|
11
|
+
*
|
|
12
|
+
* Unlike vision's provably-blind gate (reject only on positive proof), the
|
|
13
|
+
* web-search gate is MEMBERSHIP: the executor set is closed and known, so an
|
|
14
|
+
* id outside (candidates ∪ auth slots) can never run and is refused.
|
|
15
|
+
*/
|
|
16
|
+
import type { OcxConfig } from "../../types";
|
|
17
|
+
import { AUTH_SLOT_MODELS, resolveSidecarAuth } from "../../sidecar/auth";
|
|
18
|
+
import { pickerVisibleSidecarCandidates, type SidecarCandidate } from "../../sidecar/candidates";
|
|
19
|
+
import { WEB_SEARCH_BACKENDS, webSearchSidecarCandidates } from "../../web-search/backends";
|
|
20
|
+
import type { WebSearchBackendId } from "../../web-search/index";
|
|
21
|
+
|
|
22
|
+
// The full configured union. Rows only ever materialize for backends whose
|
|
23
|
+
// executor admits the candidate, so inert arms (gemini/exa without config)
|
|
24
|
+
// simply never produce rows.
|
|
25
|
+
export type WebSearchBackend = WebSearchBackendId;
|
|
26
|
+
|
|
27
|
+
export interface WebSearchCandidateRow extends SidecarCandidate {
|
|
28
|
+
/** Executor backend that admitted this exact candidate row. */
|
|
29
|
+
backend: WebSearchBackend;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface WebSearchModelOption {
|
|
33
|
+
value: string;
|
|
34
|
+
label: string;
|
|
35
|
+
/** Exact runnable pair represented by this picker row. */
|
|
36
|
+
backend: WebSearchBackend;
|
|
37
|
+
model: string;
|
|
38
|
+
/** True when the row is an auth-slot entitlement rather than a picker row. */
|
|
39
|
+
authSlot?: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The candidate rows the web-search executors can actually run right now. */
|
|
43
|
+
export async function webSearchCandidateRows(config: OcxConfig): Promise<WebSearchCandidateRow[]> {
|
|
44
|
+
const auth = resolveSidecarAuth(config);
|
|
45
|
+
const all = await pickerVisibleSidecarCandidates(config, auth);
|
|
46
|
+
return webSearchSidecarCandidates(config, auth, all).flatMap(candidate => {
|
|
47
|
+
const descriptor = WEB_SEARCH_BACKENDS.find(entry =>
|
|
48
|
+
entry.isActive(auth, config) && entry.eligibleModel(candidate, auth));
|
|
49
|
+
return descriptor ? [{ ...candidate, backend: descriptor.backend }] : [];
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The GUI/CLI option list. The persisted model is display-grandfathered so an
|
|
55
|
+
* operator can SEE a now-illegal setting in the picker (parity with the vision
|
|
56
|
+
* GET); new writes of such an id are still rejected by the gate below.
|
|
57
|
+
*/
|
|
58
|
+
export function webSearchModelOptionsFrom(
|
|
59
|
+
config: Pick<OcxConfig, "webSearchSidecar">,
|
|
60
|
+
candidates: readonly WebSearchCandidateRow[],
|
|
61
|
+
): WebSearchModelOption[] {
|
|
62
|
+
const byValue = new Map<string, WebSearchModelOption>();
|
|
63
|
+
for (const candidate of candidates) {
|
|
64
|
+
if (byValue.has(candidate.id)) continue;
|
|
65
|
+
byValue.set(candidate.id, {
|
|
66
|
+
value: candidate.id,
|
|
67
|
+
label: candidate.id,
|
|
68
|
+
backend: candidate.backend,
|
|
69
|
+
model: candidate.id,
|
|
70
|
+
...(candidate.authSlot ? { authSlot: true } : {}),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const persisted = config.webSearchSidecar?.model;
|
|
74
|
+
if (persisted && !byValue.has(persisted)) {
|
|
75
|
+
byValue.set(persisted, {
|
|
76
|
+
value: persisted,
|
|
77
|
+
label: persisted,
|
|
78
|
+
backend: config.webSearchSidecar?.backend ?? "openai",
|
|
79
|
+
model: persisted,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return [...byValue.values()].sort((a, b) => a.value.localeCompare(b.value));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Membership gate: reject when the id is neither a runnable candidate nor an
|
|
87
|
+
* auth-slot model. Auth slots pass even when the matching login is currently
|
|
88
|
+
* absent — the slot is a legal setting whose executor simply is not live yet,
|
|
89
|
+
* and refusing it would make settings order-dependent on login state.
|
|
90
|
+
*/
|
|
91
|
+
export function webSearchModelIsRejected(
|
|
92
|
+
backend: WebSearchBackend,
|
|
93
|
+
requested: string,
|
|
94
|
+
candidates: readonly WebSearchCandidateRow[],
|
|
95
|
+
): boolean {
|
|
96
|
+
if (requested === AUTH_SLOT_MODELS.codex) return backend !== "openai";
|
|
97
|
+
if (requested === AUTH_SLOT_MODELS.anthropic) return backend !== "anthropic";
|
|
98
|
+
return !candidates.some(candidate => candidate.backend === backend && candidate.id === requested);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Uniform 400 payload naming the filter, mirroring visionDescriberRejection's shape. */
|
|
102
|
+
export function webSearchModelRejection(
|
|
103
|
+
field: string,
|
|
104
|
+
backend: WebSearchBackend,
|
|
105
|
+
requested: string,
|
|
106
|
+
candidates: readonly WebSearchCandidateRow[],
|
|
107
|
+
): { error: string; allowedModels: string[] } {
|
|
108
|
+
const allowed = new Set(candidates
|
|
109
|
+
.filter(candidate => candidate.backend === backend)
|
|
110
|
+
.map(candidate => candidate.id));
|
|
111
|
+
// Preserve the response contract: allowedModels lists both always-configurable
|
|
112
|
+
// auth-slot ids even though the pair gate below binds each to its own backend.
|
|
113
|
+
allowed.add(AUTH_SLOT_MODELS.codex);
|
|
114
|
+
allowed.add(AUTH_SLOT_MODELS.anthropic);
|
|
115
|
+
return {
|
|
116
|
+
error: `${field}: backend/model pair "${backend}/${requested}" is not a web-search sidecar candidate — ` +
|
|
117
|
+
"the model must be picker-visible and runnable by that executor-backed backend (or its auth-slot model)",
|
|
118
|
+
allowedModels: [...allowed].sort(),
|
|
119
|
+
};
|
|
120
|
+
}
|