@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,435 @@
|
|
|
1
|
+
import { namespacedToolName } from "../types";
|
|
2
|
+
import { collectResponsesToolGroups } from "./tool-groups";
|
|
3
|
+
|
|
4
|
+
export interface RoutedNamespaceToolIdentity {
|
|
5
|
+
namespace: string;
|
|
6
|
+
name: string;
|
|
7
|
+
/**
|
|
8
|
+
* The kind the tool was DECLARED as. Restoration and `tool_choice` matching both
|
|
9
|
+
* need it: a wire name identifies which tool, not which kind of call may carry it,
|
|
10
|
+
* so without this a tool declared `function` could be selected by a `custom`
|
|
11
|
+
* selector and come back as a `custom_tool_call` — the same name/kind mismatch
|
|
12
|
+
* that motivated narrowing the alias map in the first place.
|
|
13
|
+
*/
|
|
14
|
+
kind: "function" | "custom";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type RoutedNamespaceToolAliases = ReadonlyMap<string, RoutedNamespaceToolIdentity>;
|
|
18
|
+
|
|
19
|
+
const BUILTIN_FUNCTIONS_NAMESPACE = "functions";
|
|
20
|
+
|
|
21
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
22
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function namespaceIdentity(namespace: string, name: string): string {
|
|
26
|
+
return `${namespace}\u0000${name}`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A name that can become a wire tool name. Control characters are rejected because the identity
|
|
31
|
+
* key below joins namespace and name with NUL: a name carrying one could otherwise forge another
|
|
32
|
+
* tool's identity and silently take over its wire name.
|
|
33
|
+
*/
|
|
34
|
+
function isRepresentableName(name: unknown): name is string {
|
|
35
|
+
if (typeof name !== "string" || name.length === 0) return false;
|
|
36
|
+
for (let index = 0; index < name.length; index += 1) {
|
|
37
|
+
const code = name.charCodeAt(index);
|
|
38
|
+
// C0 controls and DEL, written as code points so this source never carries one itself.
|
|
39
|
+
if (code <= 0x1f || code === 0x7f) return false;
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type NamespaceGroup = {
|
|
45
|
+
namespace: string;
|
|
46
|
+
/** Children that can be lowered to a flat declaration; unrepresentable ones are omitted. */
|
|
47
|
+
children: Record<string, unknown>[];
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Read a private namespace group, or return undefined when the value is not one.
|
|
52
|
+
*
|
|
53
|
+
* Children that cannot be expressed as a flat declaration — a nested group, a missing name, a
|
|
54
|
+
* control character in the name — are dropped, and a group left with no children is dropped whole
|
|
55
|
+
* by the rewrite. Preserving the private `namespace` shape instead would lose every tool in the
|
|
56
|
+
* request rather than one: the strict gateways this layer exists for reject that tool type before
|
|
57
|
+
* inference, which is the failure the layer was written to prevent.
|
|
58
|
+
*/
|
|
59
|
+
function parseNamespaceGroup(tool: unknown): NamespaceGroup | undefined {
|
|
60
|
+
if (
|
|
61
|
+
!isPlainObject(tool)
|
|
62
|
+
|| tool.type !== "namespace"
|
|
63
|
+
|| !isRepresentableName(tool.name)
|
|
64
|
+
|| !Array.isArray(tool.tools)
|
|
65
|
+
) return undefined;
|
|
66
|
+
const children: Record<string, unknown>[] = [];
|
|
67
|
+
for (const child of tool.tools) {
|
|
68
|
+
if (!isPlainObject(child) || child.type === "namespace" || !isRepresentableName(child.name)) continue;
|
|
69
|
+
children.push(child);
|
|
70
|
+
}
|
|
71
|
+
return { namespace: tool.name, children };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Wire identity of a lowered tool. A `functions` child and an identical top-level declaration share
|
|
76
|
+
* one identity because they denote the same logical tool: `buildTools` flattens the reserved group
|
|
77
|
+
* without a namespace, so the parser already treats them as one and tolerates the duplicate.
|
|
78
|
+
*/
|
|
79
|
+
function loweredIdentity(namespace: string, name: string): string {
|
|
80
|
+
return namespace === BUILTIN_FUNCTIONS_NAMESPACE
|
|
81
|
+
? namespaceIdentity(BUILTIN_FUNCTIONS_NAMESPACE, name)
|
|
82
|
+
: namespaceIdentity(namespace, name);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function loweredWireName(namespace: string, name: string): string {
|
|
86
|
+
return namespace === BUILTIN_FUNCTIONS_NAMESPACE ? name : namespacedToolName(namespace, name);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function addSelector(
|
|
90
|
+
selectors: Map<string, string | null>,
|
|
91
|
+
selector: string,
|
|
92
|
+
wireName: string,
|
|
93
|
+
): void {
|
|
94
|
+
const current = selectors.get(selector);
|
|
95
|
+
if (current === undefined) selectors.set(selector, wireName);
|
|
96
|
+
else if (current !== wireName) selectors.set(selector, null);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
type NamespaceRewritePlan = {
|
|
100
|
+
aliases: Map<string, RoutedNamespaceToolIdentity>;
|
|
101
|
+
bareWireNames: Set<string>;
|
|
102
|
+
identities: Map<string, string>;
|
|
103
|
+
selectors: Map<string, string | null>;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/** Two distinct logical tools would occupy one wire name; the caller maps this to a 400. */
|
|
107
|
+
export class NamespaceToolCollisionError extends Error {}
|
|
108
|
+
|
|
109
|
+
function buildRewritePlan(groups: readonly unknown[][]): NamespaceRewritePlan {
|
|
110
|
+
const aliases = new Map<string, RoutedNamespaceToolIdentity>();
|
|
111
|
+
const bareWireNames = new Set<string>();
|
|
112
|
+
const identities = new Map<string, string>();
|
|
113
|
+
const selectors = new Map<string, string | null>();
|
|
114
|
+
const wireOwners = new Map<string, string>();
|
|
115
|
+
|
|
116
|
+
for (const group of groups) {
|
|
117
|
+
for (const tool of group) {
|
|
118
|
+
if (isPlainObject(tool) && tool.type !== "namespace" && isRepresentableName(tool.name)) {
|
|
119
|
+
// A bare declaration is the reserved group's flattened form, so it claims that identity:
|
|
120
|
+
// declaring the same tool both ways is the duplicate the parser already tolerates, not a
|
|
121
|
+
// collision, and `promoteClientLoadedTools` produces exactly that shape.
|
|
122
|
+
wireOwners.set(tool.name, loweredIdentity(BUILTIN_FUNCTIONS_NAMESPACE, tool.name));
|
|
123
|
+
bareWireNames.add(tool.name);
|
|
124
|
+
addSelector(selectors, tool.name, tool.name);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (const group of groups) {
|
|
130
|
+
for (const tool of group) {
|
|
131
|
+
const parsed = parseNamespaceGroup(tool);
|
|
132
|
+
if (!parsed) continue;
|
|
133
|
+
for (const child of parsed.children) {
|
|
134
|
+
const childName = child.name as string;
|
|
135
|
+
const identity = loweredIdentity(parsed.namespace, childName);
|
|
136
|
+
const wireName = loweredWireName(parsed.namespace, childName);
|
|
137
|
+
const owner = wireOwners.get(wireName);
|
|
138
|
+
if (owner !== undefined && owner !== identity) {
|
|
139
|
+
throw new NamespaceToolCollisionError(
|
|
140
|
+
`namespace tool wire-name collision for "${wireName}"; rename one of the colliding tools`,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
wireOwners.set(wireName, identity);
|
|
144
|
+
identities.set(identity, wireName);
|
|
145
|
+
addSelector(selectors, wireName, wireName);
|
|
146
|
+
addSelector(selectors, `${parsed.namespace}.${childName}`, wireName);
|
|
147
|
+
addSelector(selectors, childName, wireName);
|
|
148
|
+
if (parsed.namespace !== BUILTIN_FUNCTIONS_NAMESPACE) {
|
|
149
|
+
// A child declared `custom` stays custom; everything else lowers to a
|
|
150
|
+
// function, which is how `buildTools` flattens it upstream.
|
|
151
|
+
const kind = child.type === "custom" ? "custom" : "function";
|
|
152
|
+
aliases.set(wireName, { namespace: parsed.namespace, name: childName, kind });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return { aliases, bareWireNames, identities, selectors };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Lower every namespace group in one tool container. `emitted` is shared across the whole body so
|
|
163
|
+
* a tool declared both bare and under `functions` is written once rather than twice.
|
|
164
|
+
*
|
|
165
|
+
* No `type: "namespace"` value survives this pass, including a group this layer cannot read:
|
|
166
|
+
* relaying the private shape is what the strict gateway rejects.
|
|
167
|
+
*/
|
|
168
|
+
function rewriteToolList(
|
|
169
|
+
tools: unknown[],
|
|
170
|
+
plan: NamespaceRewritePlan,
|
|
171
|
+
emitted: Set<string>,
|
|
172
|
+
): unknown[] {
|
|
173
|
+
let changed = false;
|
|
174
|
+
const rewritten: unknown[] = [];
|
|
175
|
+
for (const tool of tools) {
|
|
176
|
+
if (isPlainObject(tool) && tool.type === "namespace") {
|
|
177
|
+
changed = true;
|
|
178
|
+
const parsed = parseNamespaceGroup(tool);
|
|
179
|
+
if (!parsed) continue;
|
|
180
|
+
for (const child of parsed.children) {
|
|
181
|
+
const wireName = plan.identities.get(loweredIdentity(parsed.namespace, child.name as string));
|
|
182
|
+
// A bare declaration is the canonical representation of a `functions` child. Decide that
|
|
183
|
+
// from the complete catalog rather than whichever container happens to be rewritten first.
|
|
184
|
+
if (
|
|
185
|
+
wireName === undefined
|
|
186
|
+
|| (parsed.namespace === BUILTIN_FUNCTIONS_NAMESPACE && plan.bareWireNames.has(wireName))
|
|
187
|
+
|| emitted.has(wireName)
|
|
188
|
+
) continue;
|
|
189
|
+
emitted.add(wireName);
|
|
190
|
+
rewritten.push(wireName === child.name ? child : { ...child, name: wireName });
|
|
191
|
+
}
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (isPlainObject(tool) && isRepresentableName(tool.name)) {
|
|
195
|
+
if (emitted.has(tool.name)) {
|
|
196
|
+
changed = true;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
emitted.add(tool.name);
|
|
200
|
+
}
|
|
201
|
+
rewritten.push(tool);
|
|
202
|
+
}
|
|
203
|
+
return changed ? rewritten : tools;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Resolve one `{namespace?, name}` reference to its wire name and drop the private `namespace` key.
|
|
208
|
+
*
|
|
209
|
+
* `bareFallback` is for tool_choice, where a bare name is a selector the caller expects resolved
|
|
210
|
+
* against the catalog. Replayed call items pass `false`: a history item records which tool actually
|
|
211
|
+
* ran, so resolving a bare name through a same-named namespace child would rewrite history on a
|
|
212
|
+
* coincidence rather than translate it.
|
|
213
|
+
*
|
|
214
|
+
* An explicit namespace is always lowered, even when this turn's catalog no longer declares that
|
|
215
|
+
* group — a compaction turn drops the whole catalog, and a catalog can change mid-session. Leaving
|
|
216
|
+
* the key in place ships a Codex-private field to a gateway that rejects unknown fields, which is
|
|
217
|
+
* the failure this layer exists to prevent, and this layer's own response restoration is what put
|
|
218
|
+
* the key on the item.
|
|
219
|
+
*/
|
|
220
|
+
/**
|
|
221
|
+
* A selector's `namespace` is either absent — meaning "unqualified, resolve the bare
|
|
222
|
+
* name" — or a string naming the group. A present-but-non-string value is neither, and
|
|
223
|
+
* a malformed selector must not authorize anything: not through the unqualified
|
|
224
|
+
* fallback, and not by happening to carry an already-flattened wire name, which would
|
|
225
|
+
* otherwise match the alias map exactly and arm it anyway.
|
|
226
|
+
*/
|
|
227
|
+
function hasMalformedNamespace(value: Record<string, unknown>): boolean {
|
|
228
|
+
return "namespace" in value && typeof value.namespace !== "string";
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function rewriteNamedSelector(
|
|
232
|
+
value: unknown,
|
|
233
|
+
plan: NamespaceRewritePlan,
|
|
234
|
+
bareFallback: boolean,
|
|
235
|
+
): unknown {
|
|
236
|
+
if (!isPlainObject(value) || typeof value.name !== "string") return value;
|
|
237
|
+
// Malformed: hand it back untouched so no rewrite occurs. Authorization rejects it
|
|
238
|
+
// separately — returning it unchanged is not by itself enough, because the name it
|
|
239
|
+
// carries may already BE a wire name.
|
|
240
|
+
if (hasMalformedNamespace(value)) return value;
|
|
241
|
+
const namespace = value.namespace;
|
|
242
|
+
if (typeof namespace !== "string") {
|
|
243
|
+
if (!bareFallback) return value;
|
|
244
|
+
const wireName = plan.selectors.get(value.name) ?? undefined;
|
|
245
|
+
return wireName === undefined || wireName === value.name ? value : { ...value, name: wireName };
|
|
246
|
+
}
|
|
247
|
+
const { namespace: _dropped, ...rest } = value;
|
|
248
|
+
const wireName = plan.identities.get(loweredIdentity(namespace, value.name))
|
|
249
|
+
?? loweredWireName(namespace, value.name);
|
|
250
|
+
return { ...rest, name: wireName };
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function rewriteToolChoice(value: unknown, plan: NamespaceRewritePlan): unknown {
|
|
254
|
+
if (!isPlainObject(value)) return value;
|
|
255
|
+
if ((value.type === "function" || value.type === "custom") && typeof value.name === "string") {
|
|
256
|
+
return rewriteNamedSelector(value, plan, true);
|
|
257
|
+
}
|
|
258
|
+
if (value.type !== "allowed_tools" || !Array.isArray(value.tools)) return value;
|
|
259
|
+
let changed = false;
|
|
260
|
+
const tools = value.tools.map(tool => {
|
|
261
|
+
if (!isPlainObject(tool) || typeof tool.name !== "string") return tool;
|
|
262
|
+
const rewritten = rewriteNamedSelector(tool, plan, true);
|
|
263
|
+
changed ||= rewritten !== tool;
|
|
264
|
+
return rewritten;
|
|
265
|
+
});
|
|
266
|
+
return changed ? { ...value, tools } : value;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Keep response restoration inside the caller's per-turn tool authorization boundary. The
|
|
271
|
+
* upstream sees every flattened declaration even when `tool_choice` narrows the tools it may call,
|
|
272
|
+
* so its output cannot be trusted merely because a wire name appeared in that catalog.
|
|
273
|
+
*/
|
|
274
|
+
function authorizedAliases(
|
|
275
|
+
aliases: Map<string, RoutedNamespaceToolIdentity>,
|
|
276
|
+
toolChoice: unknown,
|
|
277
|
+
): Map<string, RoutedNamespaceToolIdentity> {
|
|
278
|
+
if (toolChoice === undefined || toolChoice === "auto" || toolChoice === "required") return aliases;
|
|
279
|
+
if (toolChoice === "none" || !isPlainObject(toolChoice)) return new Map();
|
|
280
|
+
|
|
281
|
+
// name -> the kind the selector claimed. A selector authorizes a tool only when it
|
|
282
|
+
// names it AND agrees about what kind of tool it is.
|
|
283
|
+
let authorized: Map<string, "function" | "custom">;
|
|
284
|
+
if (
|
|
285
|
+
(toolChoice.type === "function" || toolChoice.type === "custom")
|
|
286
|
+
&& typeof toolChoice.name === "string"
|
|
287
|
+
) {
|
|
288
|
+
// A malformed namespace makes the whole selector untrustworthy, even when its
|
|
289
|
+
// name is already a flattened wire name that would match the alias map exactly.
|
|
290
|
+
if (hasMalformedNamespace(toolChoice)) return new Map();
|
|
291
|
+
authorized = new Map([[toolChoice.name, toolChoice.type]]);
|
|
292
|
+
} else if (toolChoice.type === "allowed_tools" && Array.isArray(toolChoice.tools)) {
|
|
293
|
+
authorized = new Map();
|
|
294
|
+
for (const tool of toolChoice.tools) {
|
|
295
|
+
// Match the top-level branch above: only a function/custom selector can
|
|
296
|
+
// authorize a client namespace call. `allowed_tools` entries are typed
|
|
297
|
+
// `{type: string}` by the schema, so the accepted set is open-ended and
|
|
298
|
+
// an allowlist is the only closure that also covers kinds added later.
|
|
299
|
+
// Without this, `{type: "file_search", name: "<wire-name>"}` keeps the
|
|
300
|
+
// alias, and an upstream `function_call` carrying that name is restored
|
|
301
|
+
// into a namespace call the caller never permitted.
|
|
302
|
+
if (!isPlainObject(tool)) continue;
|
|
303
|
+
if (tool.type !== "function" && tool.type !== "custom") continue;
|
|
304
|
+
if (typeof tool.name !== "string") continue;
|
|
305
|
+
if (hasMalformedNamespace(tool)) continue;
|
|
306
|
+
authorized.set(tool.name, tool.type);
|
|
307
|
+
}
|
|
308
|
+
} else {
|
|
309
|
+
// An explicit selector for another tool kind does not authorize a client namespace call.
|
|
310
|
+
return new Map();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// The kind must agree too. A wire name says WHICH tool, not what kind of call may
|
|
314
|
+
// carry it, so a `custom` selector naming a tool declared `function` is the same
|
|
315
|
+
// name/kind mismatch as a `file_search` selector naming it — narrower, but the
|
|
316
|
+
// same class, and `allowed_tools[].type` accepts any string so both are reachable.
|
|
317
|
+
return new Map(
|
|
318
|
+
[...aliases].filter(([wireName, identity]) => authorized.get(wireName) === identity.kind),
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function rewriteInputItem(item: unknown, plan: NamespaceRewritePlan, emitted: Set<string>): unknown {
|
|
323
|
+
if (!isPlainObject(item)) return item;
|
|
324
|
+
if (item.type === "additional_tools" && Array.isArray(item.tools)) {
|
|
325
|
+
const tools = rewriteToolList(item.tools, plan, emitted);
|
|
326
|
+
return tools === item.tools ? item : { ...item, tools };
|
|
327
|
+
}
|
|
328
|
+
if (
|
|
329
|
+
(item.type === "function_call" || item.type === "custom_tool_call")
|
|
330
|
+
&& typeof item.name === "string"
|
|
331
|
+
) return rewriteNamedSelector(item, plan, false);
|
|
332
|
+
return item;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Lower Codex's private Responses namespace declarations for public/third-party gateways.
|
|
337
|
+
*
|
|
338
|
+
* Codex 0.147 groups ordinary tools under the reserved `functions` namespace; those children
|
|
339
|
+
* become bare top-level declarations. Other namespaces use the same collision-checked
|
|
340
|
+
* `<namespace>__<name>` wire identity as the chat adapters. The returned request-local aliases
|
|
341
|
+
* are the only names response restoration is allowed to expand.
|
|
342
|
+
*/
|
|
343
|
+
export function rewriteRoutedNamespaceToolsForUpstream(body: unknown): {
|
|
344
|
+
body: unknown;
|
|
345
|
+
aliases: Map<string, RoutedNamespaceToolIdentity>;
|
|
346
|
+
} {
|
|
347
|
+
if (!isPlainObject(body)) return { body, aliases: new Map() };
|
|
348
|
+
const groups = collectResponsesToolGroups(body);
|
|
349
|
+
const plan = buildRewritePlan(groups);
|
|
350
|
+
|
|
351
|
+
// Deliberately not gated on the plan being non-empty: a turn whose catalog is absent can still
|
|
352
|
+
// replay call items carrying a private `namespace`.
|
|
353
|
+
const emitted = new Set<string>();
|
|
354
|
+
const tools = Array.isArray(body.tools) ? rewriteToolList(body.tools, plan, emitted) : body.tools;
|
|
355
|
+
|
|
356
|
+
let input = body.input;
|
|
357
|
+
if (Array.isArray(body.input)) {
|
|
358
|
+
let inputChanged = false;
|
|
359
|
+
const rewrittenInput = body.input.map(item => {
|
|
360
|
+
const next = rewriteInputItem(item, plan, emitted);
|
|
361
|
+
if (next !== item) inputChanged = true;
|
|
362
|
+
return next;
|
|
363
|
+
});
|
|
364
|
+
if (inputChanged) input = rewrittenInput;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const toolChoice = rewriteToolChoice(body.tool_choice, plan);
|
|
368
|
+
return {
|
|
369
|
+
body: {
|
|
370
|
+
...body,
|
|
371
|
+
...(tools !== body.tools ? { tools } : {}),
|
|
372
|
+
...(input !== body.input ? { input } : {}),
|
|
373
|
+
...(toolChoice !== body.tool_choice ? { tool_choice: toolChoice } : {}),
|
|
374
|
+
},
|
|
375
|
+
aliases: authorizedAliases(plan.aliases, toolChoice),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export function restoreRoutedNamespaceCalls(
|
|
380
|
+
value: unknown,
|
|
381
|
+
aliases: RoutedNamespaceToolAliases,
|
|
382
|
+
): { value: unknown; changed: boolean } {
|
|
383
|
+
if (Array.isArray(value)) {
|
|
384
|
+
let changed = false;
|
|
385
|
+
const restored = value.map(entry => {
|
|
386
|
+
const result = restoreRoutedNamespaceCalls(entry, aliases);
|
|
387
|
+
changed ||= result.changed;
|
|
388
|
+
return result.value;
|
|
389
|
+
});
|
|
390
|
+
return changed ? { value: restored, changed: true } : { value, changed: false };
|
|
391
|
+
}
|
|
392
|
+
if (!isPlainObject(value)) return { value, changed: false };
|
|
393
|
+
|
|
394
|
+
let changed = false;
|
|
395
|
+
const restored: Record<string, unknown> = {};
|
|
396
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
397
|
+
const result = restoreRoutedNamespaceCalls(entry, aliases);
|
|
398
|
+
restored[key] = result.value;
|
|
399
|
+
changed ||= result.changed;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if (
|
|
403
|
+
(value.type === "function_call" || value.type === "custom_tool_call")
|
|
404
|
+
&& typeof value.name === "string"
|
|
405
|
+
) {
|
|
406
|
+
const identity = aliases.get(value.name);
|
|
407
|
+
if (identity) {
|
|
408
|
+
restored.name = identity.name;
|
|
409
|
+
restored.namespace = identity.namespace;
|
|
410
|
+
changed = true;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return changed ? { value: restored, changed: true } : { value, changed: false };
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export function restoreRoutedNamespaceCallsInJson(
|
|
417
|
+
text: string,
|
|
418
|
+
aliases: RoutedNamespaceToolAliases,
|
|
419
|
+
): string {
|
|
420
|
+
if (aliases.size === 0) return text;
|
|
421
|
+
let payload: unknown;
|
|
422
|
+
try {
|
|
423
|
+
payload = JSON.parse(text);
|
|
424
|
+
} catch {
|
|
425
|
+
return text;
|
|
426
|
+
}
|
|
427
|
+
const restored = restoreRoutedNamespaceCalls(payload, aliases);
|
|
428
|
+
return restored.changed ? JSON.stringify(restored.value) : text;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
export function createRoutedNamespaceCallRestoreRewrite(
|
|
432
|
+
aliases: RoutedNamespaceToolAliases,
|
|
433
|
+
): (payload: string) => string {
|
|
434
|
+
return payload => restoreRoutedNamespaceCallsInJson(payload, aliases);
|
|
435
|
+
}
|