@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,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordination helpers for the native Codex write section.
|
|
3
|
+
*
|
|
4
|
+
* Split out of `inject.ts` so the injection function keeps reading as the
|
|
5
|
+
* sequence it is, rather than doubling in length around the lock.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { existsSync, lstatSync, readFileSync } from "node:fs";
|
|
9
|
+
|
|
10
|
+
import { atomicWriteFile } from "../config";
|
|
11
|
+
import type { CodexWriteLockResult } from "./codex-write-lock";
|
|
12
|
+
import { inspectCodexCoordinatorPath } from "./coordinator-doctor";
|
|
13
|
+
import { JOURNAL_PATH } from "./journal";
|
|
14
|
+
import { updateIntegrationRecord } from "./integration-record";
|
|
15
|
+
import { CODEX_CONFIG_PATH, CODEX_PROFILE_PATH } from "./paths";
|
|
16
|
+
import type {
|
|
17
|
+
CodexArtifactId,
|
|
18
|
+
CodexProvenanceEntry,
|
|
19
|
+
} from "./convergence-types";
|
|
20
|
+
import {
|
|
21
|
+
codexWriteCoordination,
|
|
22
|
+
type CodexWriteCandidate,
|
|
23
|
+
type CodexWriteCoordination,
|
|
24
|
+
type CodexWriteEvidence,
|
|
25
|
+
} from "./write-coordination";
|
|
26
|
+
|
|
27
|
+
/** Bounded so a stuck holder cannot wedge `ocx start` indefinitely. */
|
|
28
|
+
export const DEFAULT_INJECT_LOCK_TIMEOUT_MS = 5_000;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Can this home be coordinated at all, decided BEFORE any lock attempt?
|
|
32
|
+
*
|
|
33
|
+
* The order matters and is not stylistic. `assertInitialStateCanBeCreated`
|
|
34
|
+
* refuses to create the first coordinator row while native routing residue
|
|
35
|
+
* exists (`transition-state.ts:268-280`) — correctly, because installing
|
|
36
|
+
* `{0,null}` over routed bytes would erase the only evidence that an
|
|
37
|
+
* interrupted transition needs salvage. But "already routed, no coordinator
|
|
38
|
+
* row" is the state of every install predating this substrate, so a "try the
|
|
39
|
+
* lock, fall back on refusal" shape would attempt acquisition on the entire
|
|
40
|
+
* installed base. Deciding first means that refusal path is never entered.
|
|
41
|
+
*
|
|
42
|
+
* `legacy-uncoordinated` is a temporary boundary, not a design: the
|
|
43
|
+
* compatibility-adoption contract (`005_contract.md:709-779`) records an
|
|
44
|
+
* existing routed home into the coordinator, and once that lands this branch
|
|
45
|
+
* narrows to homes not yet adopted.
|
|
46
|
+
*/
|
|
47
|
+
export type CodexWriteCoordinationEligibility =
|
|
48
|
+
| { kind: "coordinated" }
|
|
49
|
+
| { kind: "adopt" }
|
|
50
|
+
| { kind: "legacy-uncoordinated"; reason: string }
|
|
51
|
+
| { kind: "refused"; reason: string };
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A live SQLite creator exposes a zero-byte pathname before BEGIN IMMEDIATE.
|
|
55
|
+
* Requiring a settled filesystem age makes that scheduling window remain on
|
|
56
|
+
* the coordinated path while old crash remnants can use the legacy boundary.
|
|
57
|
+
*/
|
|
58
|
+
export const STABLE_ZERO_BYTE_COORDINATOR_AGE_MS = 1_000;
|
|
59
|
+
|
|
60
|
+
export function codexWriteCoordinationEligibility(deps: {
|
|
61
|
+
coordinatorPath: () => string;
|
|
62
|
+
residue: () => { kind: string };
|
|
63
|
+
integrationRecord: () => { kind: string };
|
|
64
|
+
nowMs?: () => number;
|
|
65
|
+
}): CodexWriteCoordinationEligibility {
|
|
66
|
+
let coordinatorExists: boolean;
|
|
67
|
+
let coordinatorIsStableZeroByte = false;
|
|
68
|
+
try {
|
|
69
|
+
const path = deps.coordinatorPath();
|
|
70
|
+
coordinatorExists = existsSync(path);
|
|
71
|
+
if (coordinatorExists) {
|
|
72
|
+
const entry = lstatSync(path);
|
|
73
|
+
if (entry.isFile() && !entry.isSymbolicLink() && entry.size === 0) {
|
|
74
|
+
const diagnostic = inspectCodexCoordinatorPath(path);
|
|
75
|
+
if (diagnostic.kind === "zero-byte") {
|
|
76
|
+
const lastIdentityChange = Math.max(diagnostic.identity.mtimeMs, diagnostic.identity.ctimeMs);
|
|
77
|
+
coordinatorIsStableZeroByte = (deps.nowMs?.() ?? Date.now()) - lastIdentityChange
|
|
78
|
+
>= STABLE_ZERO_BYTE_COORDINATOR_AGE_MS;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
} catch (error) {
|
|
83
|
+
return { kind: "refused", reason: `the coordinator path could not be resolved: ${String(error)}` };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Every existing coordinator remains authoritative unless it is proven to be
|
|
87
|
+
// an old, immutable SQLite-empty remnant. The age gate is part of that proof:
|
|
88
|
+
// a live creator exposes the same zero-byte pathname briefly before taking N,
|
|
89
|
+
// and sending that fresh file down the legacy path would bypass its lock.
|
|
90
|
+
// Non-empty, fresh, unsafe, changed, unversioned, and rowless files therefore
|
|
91
|
+
// stay coordinated and are validated/refused by the transaction owner.
|
|
92
|
+
//
|
|
93
|
+
// We do NOT initialize or adopt it here. Clean homes still enter the
|
|
94
|
+
// coordinated path, whose SQLite transaction safely initializes it. Routed
|
|
95
|
+
// or indeterminate legacy homes keep the same uncoordinated compatibility
|
|
96
|
+
// boundary they would have had if the remnant pathname were absent.
|
|
97
|
+
if (coordinatorExists && !coordinatorIsStableZeroByte) return { kind: "coordinated" };
|
|
98
|
+
|
|
99
|
+
const record = deps.integrationRecord();
|
|
100
|
+
if (record.kind === "invalid") {
|
|
101
|
+
return { kind: "refused", reason: "the Codex integration record is invalid" };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const residue = deps.residue();
|
|
105
|
+
if (residue.kind === "clean") return { kind: "coordinated" };
|
|
106
|
+
if (residue.kind === "residue" && !coordinatorIsStableZeroByte) return { kind: "adopt" };
|
|
107
|
+
/*
|
|
108
|
+
* Everything else keeps the path it has always had.
|
|
109
|
+
*
|
|
110
|
+
* `residue` is a pre-substrate routed home; `indeterminate` means the
|
|
111
|
+
* classifier could not read what is there — a profile it cannot parse, for
|
|
112
|
+
* instance, which is an ordinary re-injection over an older file rather than
|
|
113
|
+
* a hazard.
|
|
114
|
+
*
|
|
115
|
+
* Neither may CREATE a coordinator row: doing that over unclassified or
|
|
116
|
+
* routed bytes would erase the evidence an interrupted transition needs. But
|
|
117
|
+
* refusing the injection outright, which an earlier draft of this function
|
|
118
|
+
* did for `indeterminate`, breaks re-injection on homes that work today —
|
|
119
|
+
* caught by the shipped restore tests rather than by review. Declining to
|
|
120
|
+
* coordinate is the correct scope of the refusal; declining to write is not.
|
|
121
|
+
*/
|
|
122
|
+
return {
|
|
123
|
+
kind: "legacy-uncoordinated",
|
|
124
|
+
reason: coordinatorIsStableZeroByte
|
|
125
|
+
? "the coordinator is a zero-byte non-authoritative remnant and this routed home has not been adopted yet"
|
|
126
|
+
: residue.kind === "residue"
|
|
127
|
+
? "this home was routed before write coordination existed and has not been adopted yet"
|
|
128
|
+
: "the existing native Codex state could not be classified, so it cannot seed a coordinator row",
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** The transition row rejected this publication; a conflict, not an exception. */
|
|
133
|
+
export class CodexWriteConflictError extends Error {
|
|
134
|
+
readonly code = "CODEX_WRITE_CONFLICT";
|
|
135
|
+
constructor(message: string) {
|
|
136
|
+
super(message);
|
|
137
|
+
this.name = "CodexWriteConflictError";
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* A write failed AND its compensation failed.
|
|
143
|
+
*
|
|
144
|
+
* Carries which surfaces are unrestored, never their contents — this reaches
|
|
145
|
+
* logs and HTTP responses, and config bytes carry credentials.
|
|
146
|
+
*/
|
|
147
|
+
export class CodexPartialWriteError extends Error {
|
|
148
|
+
readonly code = "CODEX_PARTIAL_WRITE";
|
|
149
|
+
constructor(readonly unrestored: readonly string[]) {
|
|
150
|
+
super(`Native Codex files are in a partial state; unrestored: ${unrestored.join(", ")}.`);
|
|
151
|
+
this.name = "CodexPartialWriteError";
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function contentIdentity(path: string): string {
|
|
156
|
+
try {
|
|
157
|
+
return createHash("sha256").update(readFileSync(path)).digest("hex").slice(0, 32);
|
|
158
|
+
} catch {
|
|
159
|
+
return existsSync(path) ? "unreadable" : "absent";
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface CodexPreImages {
|
|
164
|
+
readonly config: string | null;
|
|
165
|
+
readonly profile: string | null;
|
|
166
|
+
readonly journal: string | null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** `null` means the file was ABSENT, which restoration must reproduce exactly. */
|
|
170
|
+
function readOrNull(path: string): string | null {
|
|
171
|
+
try {
|
|
172
|
+
return readFileSync(path, "utf-8");
|
|
173
|
+
} catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function captureCodexPreImages(): CodexPreImages {
|
|
179
|
+
return {
|
|
180
|
+
config: readOrNull(CODEX_CONFIG_PATH),
|
|
181
|
+
profile: readOrNull(CODEX_PROFILE_PATH),
|
|
182
|
+
journal: readOrNull(JOURNAL_PATH),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* How many transactions of evidence the ledger keeps.
|
|
188
|
+
*
|
|
189
|
+
* Each transaction appends three entries, and a `present` baseline embeds the artifact's exact
|
|
190
|
+
* bytes as base64 — a 25 KB `config.toml` is ~34 KB per entry, so roughly 100 KB per transaction.
|
|
191
|
+
* A machine that syncs on every start would grow this file without limit, and it is re-read and
|
|
192
|
+
* re-serialized on every append, so the cost is quadratic rather than merely large.
|
|
193
|
+
*
|
|
194
|
+
* A ledger is evidence, not an archive. The most recent transactions are the ones anyone
|
|
195
|
+
* diagnoses against, so the window keeps those and drops the oldest.
|
|
196
|
+
*/
|
|
197
|
+
export const CODEX_PROVENANCE_MAX_TRANSACTIONS = 16;
|
|
198
|
+
|
|
199
|
+
function provenanceBaseline(bytes: string | null): CodexProvenanceEntry["baseline"] {
|
|
200
|
+
if (bytes === null) return { kind: "absent" };
|
|
201
|
+
return {
|
|
202
|
+
kind: "present",
|
|
203
|
+
sha256: createHash("sha256").update(bytes).digest("hex"),
|
|
204
|
+
bytesBase64: Buffer.from(bytes).toString("base64"),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function provenancePostImage(path: string): string | null {
|
|
209
|
+
try {
|
|
210
|
+
return createHash("sha256").update(readFileSync(path)).digest("hex");
|
|
211
|
+
} catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Keep the newest `CODEX_PROVENANCE_MAX_TRANSACTIONS` transactions, whole.
|
|
218
|
+
*
|
|
219
|
+
* Trimming by ENTRY count would cut a transaction in half and leave evidence that says a
|
|
220
|
+
* transaction touched two artifacts when it touched three — worse than dropping it outright,
|
|
221
|
+
* because a partial record still reads as complete. Order is preserved; only whole leading
|
|
222
|
+
* transactions are removed.
|
|
223
|
+
*/
|
|
224
|
+
export function boundProvenanceEntries(
|
|
225
|
+
entries: readonly CodexProvenanceEntry[],
|
|
226
|
+
maxTransactions = CODEX_PROVENANCE_MAX_TRANSACTIONS,
|
|
227
|
+
): readonly CodexProvenanceEntry[] {
|
|
228
|
+
const order: string[] = [];
|
|
229
|
+
for (const entry of entries) if (!order.includes(entry.txId)) order.push(entry.txId);
|
|
230
|
+
if (order.length <= maxTransactions) return entries;
|
|
231
|
+
const keep = new Set(order.slice(order.length - maxTransactions));
|
|
232
|
+
return entries.filter(entry => keep.has(entry.txId));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Append evidence for an already-committed native transaction, best-effort. */
|
|
236
|
+
export function recordCodexNativeTransactionProvenance(
|
|
237
|
+
preImages: CodexPreImages,
|
|
238
|
+
txId: string,
|
|
239
|
+
) {
|
|
240
|
+
const at = new Date().toISOString();
|
|
241
|
+
const surfaces: readonly [CodexArtifactId, string, string | null][] = [
|
|
242
|
+
[{ kind: "config" }, CODEX_CONFIG_PATH, preImages.config],
|
|
243
|
+
[{ kind: "generated-profile" }, CODEX_PROFILE_PATH, preImages.profile],
|
|
244
|
+
[{ kind: "injection-journal" }, JOURNAL_PATH, preImages.journal],
|
|
245
|
+
];
|
|
246
|
+
const entries: readonly CodexProvenanceEntry[] = surfaces.map(([artifact, path, baseline]) => ({
|
|
247
|
+
artifact,
|
|
248
|
+
baseline: provenanceBaseline(baseline),
|
|
249
|
+
postImage: provenancePostImage(path),
|
|
250
|
+
txId,
|
|
251
|
+
at,
|
|
252
|
+
}));
|
|
253
|
+
return updateIntegrationRecord(record => ({
|
|
254
|
+
...record,
|
|
255
|
+
provenance: {
|
|
256
|
+
...record.provenance,
|
|
257
|
+
entries: boundProvenanceEntries([...(record.provenance?.entries ?? []), ...entries]),
|
|
258
|
+
},
|
|
259
|
+
}));
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Put back exactly what was there, and report honestly when that fails.
|
|
264
|
+
*
|
|
265
|
+
* Every surface is attempted even after one fails: a second failure is worth
|
|
266
|
+
* knowing about, and stopping early would leave more unrestored than necessary.
|
|
267
|
+
*/
|
|
268
|
+
export function restoreCodexPreImages(
|
|
269
|
+
pre: CodexPreImages,
|
|
270
|
+
): { complete: boolean; unrestored: readonly string[] } {
|
|
271
|
+
const unrestored: string[] = [];
|
|
272
|
+
const surfaces: readonly [string, string, string | null][] = [
|
|
273
|
+
["config", CODEX_CONFIG_PATH, pre.config],
|
|
274
|
+
["profile", CODEX_PROFILE_PATH, pre.profile],
|
|
275
|
+
["journal", JOURNAL_PATH, pre.journal],
|
|
276
|
+
];
|
|
277
|
+
for (const [name, path, bytes] of surfaces) {
|
|
278
|
+
try {
|
|
279
|
+
if (bytes === null) {
|
|
280
|
+
// Absent before, so absent after. A leftover file is not a restoration.
|
|
281
|
+
if (existsSync(path)) require("node:fs").unlinkSync(path);
|
|
282
|
+
} else if (readOrNull(path) !== bytes) {
|
|
283
|
+
atomicWriteFile(path, bytes);
|
|
284
|
+
}
|
|
285
|
+
} catch {
|
|
286
|
+
unrestored.push(name);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return { complete: unrestored.length === 0, unrestored };
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export function buildInjectWitness(
|
|
293
|
+
candidate: CodexWriteCandidate,
|
|
294
|
+
nativeInput: string,
|
|
295
|
+
persistedIdentity: string,
|
|
296
|
+
generation: CodexWriteEvidence["generation"],
|
|
297
|
+
observedOwnership: CodexWriteCoordination["observedOwnership"],
|
|
298
|
+
): CodexWriteCoordination {
|
|
299
|
+
return codexWriteCoordination(
|
|
300
|
+
candidate,
|
|
301
|
+
{
|
|
302
|
+
nativeInputIdentity: createHash("sha256").update(nativeInput).digest("hex"),
|
|
303
|
+
persistedIdentity,
|
|
304
|
+
generation,
|
|
305
|
+
journalIdentity: contentIdentity(JOURNAL_PATH),
|
|
306
|
+
canonicalTargets: {
|
|
307
|
+
config: CODEX_CONFIG_PATH,
|
|
308
|
+
profile: CODEX_PROFILE_PATH,
|
|
309
|
+
journal: JOURNAL_PATH,
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
observedOwnership,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* The under-lock re-read.
|
|
318
|
+
*
|
|
319
|
+
* The candidate bytes are fixed — they were computed before acquisition and do
|
|
320
|
+
* not change — so what is re-read is the EVIDENCE: the native input on disk, the
|
|
321
|
+
* journal, the generation from the open transaction. A comparison that copied
|
|
322
|
+
* those forward would match itself and prove nothing.
|
|
323
|
+
*/
|
|
324
|
+
export function recomputeInjectWitness(options: {
|
|
325
|
+
candidate: CodexWriteCandidate;
|
|
326
|
+
canonicalTargets: CodexWriteEvidence["canonicalTargets"];
|
|
327
|
+
persistedIdentity: string;
|
|
328
|
+
generation: CodexWriteEvidence["generation"];
|
|
329
|
+
observedOwnership: CodexWriteCoordination["observedOwnership"];
|
|
330
|
+
}): CodexWriteCoordination {
|
|
331
|
+
const nativeInput = readOrNull(options.canonicalTargets.config) ?? "";
|
|
332
|
+
return codexWriteCoordination(
|
|
333
|
+
options.candidate,
|
|
334
|
+
{
|
|
335
|
+
nativeInputIdentity: createHash("sha256").update(nativeInput).digest("hex"),
|
|
336
|
+
persistedIdentity: options.persistedIdentity,
|
|
337
|
+
generation: options.generation,
|
|
338
|
+
journalIdentity: contentIdentity(options.canonicalTargets.journal),
|
|
339
|
+
canonicalTargets: options.canonicalTargets,
|
|
340
|
+
},
|
|
341
|
+
options.observedOwnership,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/** Project a non-acquired lock result into the injection result shape. */
|
|
346
|
+
export function codexInjectLockOutcome(
|
|
347
|
+
result: Exclude<CodexWriteLockResult<unknown>, { status: "acquired" }>,
|
|
348
|
+
): { success: false; message: string; retryable: boolean } | {
|
|
349
|
+
success: true; status: "skipped"; skippedReason: "desired_disabled" | "desired_enabled"; message: string;
|
|
350
|
+
} {
|
|
351
|
+
if (result.status === "skipped") {
|
|
352
|
+
return {
|
|
353
|
+
success: true,
|
|
354
|
+
status: "skipped",
|
|
355
|
+
skippedReason: result.reason,
|
|
356
|
+
message: result.reason === "desired_disabled"
|
|
357
|
+
? "Codex integration is OFF; no Codex config, catalog, cache, or history was changed."
|
|
358
|
+
: "Codex integration was re-enabled; native restore was skipped.",
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
if (result.status === "busy") {
|
|
362
|
+
return {
|
|
363
|
+
success: false,
|
|
364
|
+
retryable: true,
|
|
365
|
+
message: `Another process is writing Codex configuration right now (waited ${result.waitedMs}ms). Retry shortly.`,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
success: false,
|
|
370
|
+
retryable: false,
|
|
371
|
+
message: `Codex configuration was not written: ${result.message}`,
|
|
372
|
+
};
|
|
373
|
+
}
|