@iislee/opencodex 2.11.0 → 2.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS_INSTALL.md +109 -0
- package/README.md +114 -19
- package/bin/ocx.mjs +164 -36
- package/bin/package-main.mjs +1 -1
- package/gui/dist/assets/index-BF38heuV.js +104 -0
- package/gui/dist/assets/index-DMiI18Kv.css +1 -0
- package/gui/dist/index.html +2 -2
- package/gui/dist/provider-icons/alibaba-color.svg +1 -1
- package/gui/dist/provider-icons/antigravity-color.svg +1 -1
- package/gui/dist/provider-icons/claude-color.svg +1 -1
- package/gui/dist/provider-icons/cline-color.svg +16 -0
- package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/commandcode-color.svg +1 -0
- package/gui/dist/provider-icons/copilot-color.svg +1 -1
- package/gui/dist/provider-icons/cursor-color.svg +1 -1
- package/gui/dist/provider-icons/deepseek-color.svg +1 -1
- package/gui/dist/provider-icons/firepass-color.svg +1 -1
- package/gui/dist/provider-icons/fireworks-color.svg +1 -1
- package/gui/dist/provider-icons/gemini-color.svg +1 -1
- package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
- package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
- package/gui/dist/provider-icons/grok.svg +1 -1
- package/gui/dist/provider-icons/groq-color.svg +1 -1
- package/gui/dist/provider-icons/huggingface-color.svg +1 -1
- package/gui/dist/provider-icons/kimi-color.svg +1 -1
- package/gui/dist/provider-icons/kiro-color.svg +2 -2
- package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
- package/gui/dist/provider-icons/mistral-color.svg +1 -1
- package/gui/dist/provider-icons/moonshot-color.svg +1 -1
- package/gui/dist/provider-icons/nvidia-color.svg +1 -1
- package/gui/dist/provider-icons/ollama-color.svg +1 -1
- package/gui/dist/provider-icons/openai.svg +1 -1
- package/gui/dist/provider-icons/opencode.svg +2 -1
- package/gui/dist/provider-icons/openrouter-color.svg +1 -1
- package/gui/dist/provider-icons/pi.svg +2 -2
- package/gui/dist/provider-icons/qianfan-color.svg +1 -1
- package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
- package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
- package/gui/dist/provider-icons/vllm-color.svg +1 -1
- package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
- package/package.json +19 -10
- package/src/adapters/anthropic-output-schema.ts +137 -0
- package/src/adapters/anthropic.ts +376 -52
- package/src/adapters/base.ts +54 -7
- package/src/adapters/client-fingerprint.ts +18 -12
- package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
- package/src/adapters/command-code.ts +601 -0
- package/src/adapters/cursor/checkpoint-store.ts +303 -0
- package/src/adapters/cursor/cursor-errors.ts +129 -6
- package/src/adapters/cursor/discovery.ts +61 -4
- package/src/adapters/cursor/effort-map.ts +27 -3
- package/src/adapters/cursor/framing.ts +39 -0
- package/src/adapters/cursor/h2-pool.ts +123 -0
- package/src/adapters/cursor/http1-bidi.ts +361 -0
- package/src/adapters/cursor/images.ts +704 -0
- package/src/adapters/cursor/live-models.ts +174 -58
- package/src/adapters/cursor/live-transport.ts +609 -170
- package/src/adapters/cursor/native-exec-common.ts +23 -2
- package/src/adapters/cursor/native-exec-fs.ts +10 -7
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +0 -1
- package/src/adapters/cursor/native-exec.ts +101 -14
- package/src/adapters/cursor/protobuf-events.ts +829 -11
- package/src/adapters/cursor/protobuf-request.ts +383 -65
- package/src/adapters/cursor/request-builder.ts +237 -31
- package/src/adapters/cursor/tool-definitions.ts +242 -12
- package/src/adapters/cursor/tool-result-normalize.ts +92 -0
- package/src/adapters/cursor/transport.ts +22 -0
- package/src/adapters/cursor/types.ts +28 -1
- package/src/adapters/cursor.ts +133 -7
- package/src/adapters/google-antigravity-replay.ts +558 -34
- package/src/adapters/google-antigravity-wire.ts +43 -10
- package/src/adapters/google-http.ts +38 -10
- package/src/adapters/google-tool-schema.ts +80 -15
- package/src/adapters/google-truncation.ts +11 -0
- package/src/adapters/google.ts +618 -74
- package/src/adapters/identity.ts +39 -6
- package/src/adapters/kiro-errors.ts +11 -0
- package/src/adapters/kiro-events.ts +19 -1
- package/src/adapters/kiro-thinking.ts +18 -2
- package/src/adapters/kiro-tools.ts +10 -1
- package/src/adapters/kiro.ts +92 -54
- package/src/adapters/mimo-free.ts +17 -0
- package/src/adapters/openai-chat-url.ts +11 -0
- package/src/adapters/openai-chat.ts +1311 -336
- package/src/adapters/openai-responses-url.ts +16 -0
- package/src/adapters/openai-responses.ts +830 -56
- package/src/adapters/registry.ts +175 -0
- package/src/adapters/responses-tool-schema.ts +67 -0
- package/src/adapters/tool-call-id.ts +119 -0
- package/src/adapters/tool-catalog-nudge.ts +104 -21
- package/src/adapters/xai-web-search.ts +185 -0
- package/src/bridge.ts +428 -61
- package/src/chat/inbound.ts +43 -19
- package/src/chat/outbound.ts +82 -26
- package/src/claude/agents-inject.ts +32 -9
- package/src/claude/context-windows.ts +21 -5
- package/src/claude/desktop-3p.ts +243 -9
- package/src/claude/gateway-cache.ts +41 -4
- package/src/claude/inbound.ts +72 -3
- package/src/claude/model-info.ts +38 -15
- package/src/claude/outbound.ts +70 -16
- package/src/cli/account-api.ts +35 -1
- package/src/cli/account-auth.ts +33 -6
- package/src/cli/account-catalog-refresh.ts +14 -0
- package/src/cli/account-extended.ts +389 -2
- package/src/cli/account-main.ts +317 -0
- package/src/cli/account.ts +30 -6
- package/src/cli/agent.ts +45 -1
- package/src/cli/claude-agent-startup-sync.ts +73 -0
- package/src/cli/claude-desktop.ts +29 -4
- package/src/cli/claude.ts +103 -34
- package/src/cli/codex-log-guard-doctor.ts +103 -0
- package/src/cli/codex-shim-autorestore.ts +2 -0
- package/src/cli/codex-shim-readiness.ts +76 -0
- package/src/cli/combo.ts +8 -0
- package/src/cli/config-command.ts +74 -10
- package/src/cli/dispatch.ts +593 -0
- package/src/cli/doctor.ts +315 -43
- package/src/cli/ensure-desired-integrations.ts +152 -0
- package/src/cli/export-command.ts +46 -20
- package/src/cli/help.ts +20 -271
- package/src/cli/index.ts +378 -519
- package/src/cli/init.ts +4 -17
- package/src/cli/integrations.ts +120 -2
- package/src/cli/lab.ts +607 -0
- package/src/cli/launcher-context.ts +77 -0
- package/src/cli/minimax.ts +497 -0
- package/src/cli/models-runtime.ts +35 -2
- package/src/cli/models.ts +100 -14
- package/src/cli/observe.ts +92 -3
- package/src/cli/opencode.ts +4 -2
- package/src/cli/provider-runtime.ts +18 -1
- package/src/cli/provider.ts +24 -3
- package/src/cli/ready.ts +301 -0
- package/src/cli/registry.ts +437 -0
- package/src/cli/root.ts +86 -0
- package/src/cli/route-policy.ts +92 -0
- package/src/cli/runtime-api.ts +6 -3
- package/src/cli/star-prompt.ts +71 -15
- package/src/cli/status.ts +10 -3
- package/src/cli/system-restart-client.ts +146 -0
- package/src/cli/tray-proxy.ts +153 -6
- package/src/cli/v2.ts +105 -10
- package/src/cli.ts +1 -1
- package/src/clients/config-export.ts +1358 -21
- package/src/codex/account-label.ts +14 -1
- package/src/codex/account-lifecycle.ts +130 -13
- package/src/codex/account-namespaces.ts +49 -3
- package/src/codex/account-priority.ts +83 -0
- package/src/codex/account-store.ts +29 -2
- package/src/codex/account-usability.ts +25 -2
- package/src/codex/admission.ts +256 -0
- package/src/codex/affinity-debug.ts +162 -0
- package/src/codex/app-server-processes.ts +493 -106
- package/src/codex/app-server-restart-service.ts +232 -0
- package/src/codex/auth-api.ts +849 -242
- package/src/codex/auth-collision.ts +5 -3
- package/src/codex/auth-context.ts +345 -32
- package/src/codex/autostart-health.ts +8 -1
- package/src/codex/catalog/account-models.ts +67 -0
- package/src/codex/catalog/aggregation.ts +68 -10
- package/src/codex/catalog/bundled.ts +331 -33
- package/src/codex/catalog/effort.ts +121 -30
- package/src/codex/catalog/filesystem-evidence.ts +302 -0
- package/src/codex/catalog/kinds.ts +2 -0
- package/src/codex/catalog/metadata.ts +529 -45
- package/src/codex/catalog/native-models.ts +72 -0
- package/src/codex/catalog/parsing.ts +224 -30
- package/src/codex/catalog/provider-fetch.ts +1460 -134
- package/src/codex/catalog/sync.ts +1449 -186
- package/src/codex/catalog-admission.ts +199 -0
- package/src/codex/catalog-refresh-status.ts +105 -0
- package/src/codex/catalog-write-serialization.ts +242 -0
- package/src/codex/catalog.ts +6 -3
- package/src/codex/codex-write-lock.ts +384 -0
- package/src/codex/convergence-types.ts +614 -0
- package/src/codex/convergence.ts +651 -0
- package/src/codex/coordinator-doctor.ts +332 -0
- package/src/codex/custom-model-catalog-migration.ts +176 -0
- package/src/codex/desired-state.ts +230 -0
- package/src/codex/features.ts +636 -39
- package/src/codex/generation.ts +202 -0
- package/src/codex/history-job.ts +407 -0
- package/src/codex/history-lock.ts +242 -0
- package/src/codex/history-migration-guardian.ts +26 -20
- package/src/codex/history-provider.ts +231 -28
- package/src/codex/history-transition.ts +105 -0
- package/src/codex/history-worker.ts +220 -0
- package/src/codex/inject-coordination.ts +290 -0
- package/src/codex/inject.ts +1073 -152
- package/src/codex/injected-marker.ts +37 -3
- package/src/codex/integration-record.ts +266 -0
- package/src/codex/internal/catalog-writer.ts +203 -0
- package/src/codex/internal/history-writer.ts +80 -0
- package/src/codex/journal.ts +66 -4
- package/src/codex/log-guard/inspect.ts +506 -0
- package/src/codex/log-guard/lock.ts +150 -0
- package/src/codex/log-guard/maintenance.ts +403 -0
- package/src/codex/log-guard/path-safety.ts +88 -0
- package/src/codex/log-guard/policy.ts +44 -0
- package/src/codex/log-guard/processes.ts +205 -0
- package/src/codex/log-guard/protection.ts +489 -0
- package/src/codex/log-guard/sqlite-errors.ts +9 -0
- package/src/codex/main-account-cache.ts +24 -0
- package/src/codex/main-account.ts +29 -1
- package/src/codex/management-convergence.ts +167 -0
- package/src/codex/model-cache.ts +56 -10
- package/src/codex/model-entitlements.ts +353 -0
- package/src/codex/native-main-admission.ts +47 -0
- package/src/codex/native-main-auth-temp.ts +187 -0
- package/src/codex/native-main-claim.ts +178 -0
- package/src/codex/native-main-lock-file.ts +162 -0
- package/src/codex/native-main-owner.ts +329 -0
- package/src/codex/native-profile-api.ts +247 -0
- package/src/codex/native-profile-manager.ts +1531 -0
- package/src/codex/native-profile-processes.ts +121 -0
- package/src/codex/native-profile-recovery.ts +99 -0
- package/src/codex/native-profile-stage-store.ts +387 -0
- package/src/codex/native-profile-startup.ts +492 -0
- package/src/codex/native-profile-store.ts +855 -0
- package/src/codex/native-profile-types.ts +120 -0
- package/src/codex/native-residue.ts +682 -0
- package/src/codex/paths.ts +80 -1
- package/src/codex/plan-from-token.ts +140 -0
- package/src/codex/plan.ts +40 -0
- package/src/codex/plugins-doctor.ts +1 -1
- package/src/codex/pool-rotation.ts +74 -4
- package/src/codex/project-config-warnings.ts +20 -6
- package/src/codex/prompt-journal.ts +352 -0
- package/src/codex/prompt-layers.ts +967 -0
- package/src/codex/prompt-lock.ts +143 -0
- package/src/codex/quota-rejection.ts +298 -0
- package/src/codex/quota.ts +175 -13
- package/src/codex/refresh.ts +11 -2
- package/src/codex/reset-credit-recovery.ts +1044 -0
- package/src/codex/routing.ts +505 -94
- package/src/codex/runtime.ts +159 -38
- package/src/codex/shim.ts +1009 -28
- package/src/codex/subagent-model-fallback.ts +350 -35
- package/src/codex/sync.ts +191 -2
- package/src/codex/transition-state.ts +612 -0
- package/src/codex/upstream-host-health.ts +368 -0
- package/src/codex/user-identity.ts +557 -0
- package/src/codex/warmup.ts +187 -81
- package/src/codex/write-coordination.ts +114 -0
- package/src/combos/failover.ts +20 -0
- package/src/combos/index.ts +4 -0
- package/src/combos/request.ts +32 -0
- package/src/combos/types.ts +81 -9
- package/src/config/provider-name.ts +24 -0
- package/src/config.ts +1762 -140
- package/src/generated/compatibility-version.json +3164 -0
- package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
- package/src/grok/inject.ts +16 -5
- package/src/grok/inspect.ts +45 -0
- package/src/grok/sync.ts +2 -2
- package/src/images/loop.ts +152 -29
- package/src/images/plan.ts +23 -13
- package/src/integrations/config-io.ts +269 -0
- package/src/integrations/journal.ts +315 -0
- package/src/integrations/merge.ts +135 -0
- package/src/integrations/mutation-flight.ts +71 -0
- package/src/integrations/native/ownership-preflight.ts +202 -0
- package/src/integrations/omp-yaml-source.ts +358 -0
- package/src/integrations/owned-refresh.ts +74 -0
- package/src/integrations/ownership.ts +111 -0
- package/src/integrations/registry.ts +159 -0
- package/src/integrations/serialize.ts +314 -0
- package/src/integrations/state.ts +361 -0
- package/src/integrations/store.ts +103 -0
- package/src/integrations/writer-lock.ts +98 -0
- package/src/integrations/writer.ts +691 -0
- package/src/lab/artifacts/sanitize.ts +586 -0
- package/src/lab/artifacts/secure-fs.ts +475 -0
- package/src/lab/artifacts/store.ts +310 -0
- package/src/lab/automation/budgets.ts +78 -0
- package/src/lab/automation/config-persistence.ts +256 -0
- package/src/lab/automation/constants.ts +39 -0
- package/src/lab/automation/cooldown.ts +103 -0
- package/src/lab/automation/dispatch.ts +211 -0
- package/src/lab/automation/index.ts +13 -0
- package/src/lab/automation/orchestrator.ts +499 -0
- package/src/lab/automation/persistence.ts +512 -0
- package/src/lab/automation/planner.ts +371 -0
- package/src/lab/automation/policy.ts +136 -0
- package/src/lab/automation/queue.ts +191 -0
- package/src/lab/automation/recovery.ts +24 -0
- package/src/lab/automation/route-context.ts +21 -0
- package/src/lab/automation/run-key.ts +44 -0
- package/src/lab/automation/runs-query.ts +34 -0
- package/src/lab/automation/types.ts +160 -0
- package/src/lab/conformance/assertion.ts +325 -0
- package/src/lab/conformance/digest.ts +22 -0
- package/src/lab/conformance/executor.ts +741 -0
- package/src/lab/conformance/fixture-provider.ts +27 -0
- package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
- package/src/lab/conformance/harness-budget.ts +47 -0
- package/src/lab/conformance/index.ts +5 -0
- package/src/lab/conformance/jcs.ts +64 -0
- package/src/lab/conformance/json-pointer.ts +39 -0
- package/src/lab/conformance/manifest.ts +180 -0
- package/src/lab/conformance/mcp-stub.ts +179 -0
- package/src/lab/conformance/negative-controls.ts +164 -0
- package/src/lab/conformance/observation.ts +355 -0
- package/src/lab/conformance/runner.ts +68 -0
- package/src/lab/conformance/sse-normalize.ts +59 -0
- package/src/lab/conformance/suite-manifest.ts +78 -0
- package/src/lab/conformance/types.ts +214 -0
- package/src/lab/constants.ts +126 -0
- package/src/lab/digest.ts +64 -0
- package/src/lab/events/errors.ts +9 -0
- package/src/lab/events/limits.ts +117 -0
- package/src/lab/events/types.ts +229 -0
- package/src/lab/events/validate.ts +781 -0
- package/src/lab/fabric/constants.ts +40 -0
- package/src/lab/fabric/executor.ts +492 -0
- package/src/lab/fabric/index.ts +80 -0
- package/src/lab/fabric/manifest.ts +222 -0
- package/src/lab/fabric/observe.ts +489 -0
- package/src/lab/fabric/patch.ts +79 -0
- package/src/lab/fabric/producer-child.ts +139 -0
- package/src/lab/fabric/producer-isolate.ts +276 -0
- package/src/lab/fabric/producer-protocol.ts +61 -0
- package/src/lab/fabric/scratch.ts +439 -0
- package/src/lab/fabric/subject.ts +106 -0
- package/src/lab/fabric/types.ts +134 -0
- package/src/lab/fabric/verifier.ts +98 -0
- package/src/lab/index.ts +54 -0
- package/src/lab/ledger/artifact-refs.ts +127 -0
- package/src/lab/ledger/invalidation.ts +136 -0
- package/src/lab/ledger/purge.ts +310 -0
- package/src/lab/ledger/store.ts +532 -0
- package/src/lab/live/credential-lease.ts +53 -0
- package/src/lab/live/destination.ts +155 -0
- package/src/lab/live/executor.ts +336 -0
- package/src/lab/live/inert-tools.ts +56 -0
- package/src/lab/live/manifest.ts +85 -0
- package/src/lab/live/mcp-loopback.ts +57 -0
- package/src/lab/live/runner.ts +19 -0
- package/src/lab/live/sandbox.ts +61 -0
- package/src/lab/live/suite-manifest.ts +41 -0
- package/src/lab/live/transport.ts +118 -0
- package/src/lab/live/types.ts +197 -0
- package/src/lab/observe/from-conformance.ts +301 -0
- package/src/lab/observe/from-live.ts +117 -0
- package/src/lab/paths.ts +153 -0
- package/src/lab/projection/rebuild.ts +495 -0
- package/src/lab/projection/schema.ts +135 -0
- package/src/lab/projection/verdicts.ts +474 -0
- package/src/lab/projection/verification.ts +412 -0
- package/src/lab/public/bundle.ts +217 -0
- package/src/lab/public/community-authority.ts +175 -0
- package/src/lab/public/community-files.ts +29 -0
- package/src/lab/public/community.ts +479 -0
- package/src/lab/public/file-safety.ts +155 -0
- package/src/lab/public/ids.ts +26 -0
- package/src/lab/public/index.ts +16 -0
- package/src/lab/public/mutation-lock.ts +424 -0
- package/src/lab/public/operator.ts +353 -0
- package/src/lab/public/origin-purge.ts +79 -0
- package/src/lab/public/origin.ts +203 -0
- package/src/lab/public/privacy.ts +143 -0
- package/src/lab/public/private-file.ts +261 -0
- package/src/lab/public/project.ts +124 -0
- package/src/lab/public/purge-test-fault.ts +21 -0
- package/src/lab/public/purge.ts +223 -0
- package/src/lab/public/registry.ts +44 -0
- package/src/lab/public/revocation.ts +252 -0
- package/src/lab/public/signature.ts +243 -0
- package/src/lab/public/storage.ts +105 -0
- package/src/lab/public/strict-json.ts +206 -0
- package/src/lab/public/time.ts +26 -0
- package/src/lab/public/types.ts +172 -0
- package/src/lab/public/validate.ts +391 -0
- package/src/lab/query/catalog.ts +101 -0
- package/src/lab/query/connection.ts +107 -0
- package/src/lab/query/constants.ts +4 -0
- package/src/lab/query/cursor.ts +132 -0
- package/src/lab/query/dto-map.ts +277 -0
- package/src/lab/query/errors.ts +22 -0
- package/src/lab/query/freshness.ts +53 -0
- package/src/lab/query/index.ts +45 -0
- package/src/lab/query/latest-observation.ts +59 -0
- package/src/lab/query/passive-production.ts +159 -0
- package/src/lab/query/queries.ts +444 -0
- package/src/lab/query/types.ts +266 -0
- package/src/lab/subject/behavior-fingerprint.ts +77 -0
- package/src/lab/subject/installation-salt.ts +112 -0
- package/src/lab/subject/protocol-subject.ts +80 -0
- package/src/lab/subject/route-subject.ts +74 -0
- package/src/lib/app-owned-memory-stores.ts +22 -0
- package/src/lib/bounded-body.ts +153 -9
- package/src/lib/bun-runtime.ts +125 -12
- package/src/lib/bun-stream-caps.ts +13 -9
- package/src/lib/codex-restart-contract.ts +120 -0
- package/src/lib/config-ownership.ts +6 -2
- package/src/lib/destination-policy.ts +65 -1
- package/src/lib/errors.ts +44 -2
- package/src/lib/fabric-task-execution-authority.ts +7 -0
- package/src/lib/fabric-task-host.ts +29 -0
- package/src/lib/lab-activation.ts +223 -0
- package/src/lib/lab-live-execution-authority.ts +13 -0
- package/src/lib/lab-live-host.ts +30 -0
- package/src/lib/lab-live-pinned-sender.ts +56 -0
- package/src/lib/lab-live-route-production.ts +130 -0
- package/src/lib/lab-passive-linker-registration.ts +26 -0
- package/src/lib/local-management-attestation.ts +51 -0
- package/src/lib/local-management-capability.ts +100 -0
- package/src/lib/local-provider-reload-contract.ts +100 -0
- package/src/lib/optional-shutdown-hooks.ts +57 -0
- package/src/lib/pinned-http.ts +145 -26
- package/src/lib/process-control.ts +4 -1
- package/src/lib/provider-outbound.ts +49 -9
- package/src/lib/redact.ts +419 -3
- package/src/lib/self-launch-argv.ts +15 -0
- package/src/lib/server-resource-ownership.ts +71 -0
- package/src/lib/shadow-call.ts +35 -4
- package/src/lib/sse-decoder.ts +41 -0
- package/src/lib/state-store-registrations.ts +10 -2
- package/src/lib/system-restart-contract.ts +73 -0
- package/src/lib/token-estimate.ts +19 -2
- package/src/lib/tool-argument-integers.ts +202 -0
- package/src/lib/translator-budget.ts +44 -0
- package/src/lib/upstream-http-version.ts +57 -0
- package/src/lib/upstream-reachability.ts +95 -0
- package/src/lib/upstream-retry.ts +156 -3
- package/src/lib/windows-atomic-replace.ts +155 -0
- package/src/lib/windows-elevation.ts +70 -2
- package/src/lib/windows-secret-acl.ts +409 -69
- package/src/lib/windows-service-wrappers.ts +72 -0
- package/src/lib/windows-text.ts +106 -0
- package/src/lib/windows-user-principal.ts +341 -0
- package/src/lib/winsw.ts +33 -5
- package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
- package/src/oauth/account-import/index.ts +15 -0
- package/src/oauth/account-import/parser.ts +83 -0
- package/src/oauth/account-import/registry.ts +18 -0
- package/src/oauth/account-import/service.ts +75 -0
- package/src/oauth/account-import/types.ts +91 -0
- package/src/oauth/anthropic.ts +12 -1
- package/src/oauth/callback-server.ts +8 -2
- package/src/oauth/chatgpt.ts +12 -1
- package/src/oauth/command-code.ts +239 -0
- package/src/oauth/cursor.ts +46 -5
- package/src/oauth/google-antigravity.ts +35 -3
- package/src/oauth/health.ts +20 -12
- package/src/oauth/index.ts +398 -66
- package/src/oauth/key-providers.ts +16 -0
- package/src/oauth/kimi.ts +16 -2
- package/src/oauth/kiro.ts +50 -6
- package/src/oauth/local-token-detect.ts +11 -2
- package/src/oauth/log.ts +3 -1
- package/src/oauth/login-cli.ts +88 -28
- package/src/oauth/nous.ts +798 -0
- package/src/oauth/store.ts +119 -21
- package/src/oauth/token-guardian.ts +9 -3
- package/src/pi/models.ts +2 -2
- package/src/providers/alibaba-region-migration.ts +1 -1
- package/src/providers/antigravity-models.ts +521 -31
- package/src/providers/base-url-choices.ts +10 -0
- package/src/providers/codex-capacity.ts +292 -0
- package/src/providers/command-code-efforts.ts +144 -0
- package/src/providers/context-cap.ts +22 -5
- package/src/providers/cursor-pool.ts +72 -0
- package/src/providers/derive.ts +253 -6
- package/src/providers/fastwire.ts +501 -0
- package/src/providers/free-directory.ts +10 -7
- package/src/providers/google-vertex-location.ts +14 -0
- package/src/providers/key-failover.ts +71 -3
- package/src/providers/label.ts +1 -1
- package/src/providers/model-discovery-limits.ts +16 -0
- package/src/providers/model-discovery.ts +115 -22
- package/src/providers/model-rename-migration.ts +255 -0
- package/src/providers/model-rename-startup.ts +28 -0
- package/src/providers/openai-sidecar.ts +72 -4
- package/src/providers/openai-tier-startup.ts +31 -2
- package/src/providers/openai-tiers.ts +119 -4
- package/src/providers/openai-virtual-models.ts +1 -0
- package/src/providers/opencode-zen-rate-limit.ts +102 -0
- package/src/providers/provider-id-rewrite.ts +29 -0
- package/src/providers/quota.ts +1319 -38
- package/src/providers/registry.ts +1429 -111
- package/src/providers/request-pacing.ts +310 -0
- package/src/providers/service-tier.ts +277 -0
- package/src/providers/slug-codec.ts +42 -6
- package/src/providers/static-model-discovery.ts +86 -0
- package/src/providers/xai-responses-opt-in.ts +15 -0
- package/src/providers/xai-transport.ts +11 -4
- package/src/reasoning-effort.ts +49 -1
- package/src/responses/compaction.ts +26 -1
- package/src/responses/custom-tool-compat.ts +266 -0
- package/src/responses/hosted-tool-policy.ts +9 -0
- package/src/responses/namespace-tool-compat.ts +355 -0
- package/src/responses/parser.ts +220 -38
- package/src/responses/provider-continuation.ts +98 -0
- package/src/responses/provider-opaque-metadata.ts +73 -0
- package/src/responses/reasoning-envelope.ts +9 -1
- package/src/responses/reasoning-replay-cache.ts +426 -0
- package/src/responses/schema.ts +7 -1
- package/src/responses/spill-store.ts +75 -10
- package/src/responses/state.ts +565 -27
- package/src/responses/thought-signature-replay.ts +347 -0
- package/src/responses/tool-search-compat.ts +301 -0
- package/src/responses/truncated-stop-reason.ts +60 -0
- package/src/router.ts +366 -30
- package/src/routing/analytics.ts +378 -0
- package/src/routing/capability.ts +244 -0
- package/src/routing/compatibility/assemble.ts +73 -0
- package/src/routing/compatibility/behavior.ts +278 -0
- package/src/routing/compatibility/catalog.ts +99 -0
- package/src/routing/compatibility/endpoint.ts +52 -0
- package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
- package/src/routing/compatibility/policy.ts +181 -0
- package/src/routing/compatibility/provider-slot.ts +56 -0
- package/src/routing/compatibility/reader.ts +110 -0
- package/src/routing/compatibility/subject.ts +191 -0
- package/src/routing/compatibility/types.ts +64 -0
- package/src/routing/compatibility/version.ts +104 -0
- package/src/routing/cost.ts +77 -0
- package/src/routing/evaluator.ts +495 -0
- package/src/routing/health.ts +412 -0
- package/src/routing/history/cursor.ts +43 -0
- package/src/routing/history/indexer.ts +605 -0
- package/src/routing/history/schema.ts +72 -0
- package/src/routing/profile-namespace.ts +15 -0
- package/src/routing/profile.ts +547 -0
- package/src/routing/quota.ts +145 -0
- package/src/routing/request-evidence.ts +45 -0
- package/src/routing/trace.ts +776 -0
- package/src/server/adapter-resolve.ts +2 -29
- package/src/server/auth-cors.ts +267 -46
- package/src/server/background-lifecycle.ts +182 -0
- package/src/server/chat-completions.ts +130 -56
- package/src/server/chat-native-sse.ts +331 -0
- package/src/server/chat-native.ts +426 -0
- package/src/server/claude-messages.ts +159 -43
- package/src/server/direct-local-http.ts +347 -0
- package/src/server/effort-policy.ts +18 -0
- package/src/server/github-copilot-responses-repair.ts +338 -0
- package/src/server/gui-static.ts +39 -10
- package/src/server/images.ts +94 -12
- package/src/server/index.ts +865 -181
- package/src/server/lifecycle.ts +284 -13
- package/src/server/live.ts +136 -17
- package/src/server/local-management-read-client.ts +90 -0
- package/src/server/local-provider-reload-client.ts +137 -0
- package/src/server/management/agent-settings-routes.ts +398 -103
- package/src/server/management/api-key-usage.ts +31 -5
- package/src/server/management/body.ts +6 -0
- package/src/server/management/combo-routes.ts +62 -24
- package/src/server/management/config-routes.ts +464 -51
- package/src/server/management/context.ts +80 -2
- package/src/server/management/integration-routes.ts +498 -0
- package/src/server/management/lab-automation-routes.ts +206 -0
- package/src/server/management/lab-routes.ts +563 -0
- package/src/server/management/logs-usage-routes.ts +101 -32
- package/src/server/management/model-routes.ts +189 -131
- package/src/server/management/model-rows.ts +163 -0
- package/src/server/management/native-integration-routes.ts +769 -0
- package/src/server/management/oauth-account-routes.ts +80 -4
- package/src/server/management/provider-capability-config.ts +48 -0
- package/src/server/management/provider-routes.ts +764 -157
- package/src/server/management/request-history-routes.ts +191 -0
- package/src/server/management/routing-analytics-routes.ts +74 -0
- package/src/server/management/routing-profile-routes.ts +380 -0
- package/src/server/management/shared.ts +27 -11
- package/src/server/management/sidebar-routes.ts +47 -31
- package/src/server/management/storage-log-guard-routes.ts +186 -0
- package/src/server/management/sync-response.ts +69 -0
- package/src/server/management/system-restart.ts +288 -32
- package/src/server/management/system-routes.ts +77 -0
- package/src/server/management/usage-summary-cache.ts +9 -1
- package/src/server/management/vision-sidecar-options.ts +167 -0
- package/src/server/management/web-search-sidecar-options.ts +120 -0
- package/src/server/management-api.ts +115 -14
- package/src/server/management-auth.ts +220 -5
- package/src/server/passive-route-linker.ts +66 -0
- package/src/server/ports.ts +41 -1
- package/src/server/proxy-liveness.ts +132 -5
- package/src/server/readiness.ts +99 -0
- package/src/server/relay-eager.ts +82 -42
- package/src/server/relay.ts +236 -76
- package/src/server/request-decompress.ts +113 -6
- package/src/server/request-log.ts +235 -22
- package/src/server/responses/agent-task-recovery-cache.ts +143 -0
- package/src/server/responses/agent-task-recovery.ts +465 -0
- package/src/server/responses/collaboration.ts +204 -35
- package/src/server/responses/compact.ts +442 -55
- package/src/server/responses/core.ts +2872 -331
- package/src/server/responses/empty-completion-guard.ts +276 -0
- package/src/server/responses/encrypted-payload.ts +62 -39
- package/src/server/responses/fetch-helpers.ts +79 -4
- package/src/server/responses/input-admission.ts +185 -0
- package/src/server/responses/pacing-overload.ts +13 -0
- package/src/server/responses/policy-fallback.ts +178 -0
- package/src/server/responses/responses-field-backfill.ts +251 -0
- package/src/server/responses/terminal-guard.ts +26 -5
- package/src/server/responses/upstream-error.ts +5 -0
- package/src/server/responses/ws-upstream.ts +308 -0
- package/src/server/responses-custom-tool-repair.ts +282 -0
- package/src/server/responses-item-id-repair.ts +54 -6
- package/src/server/responses-json-events.ts +90 -0
- package/src/server/responses-model-rewrite.ts +29 -0
- package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
- package/src/server/responses-snapshot-repair.ts +621 -0
- package/src/server/responses-terminal-repair.ts +342 -0
- package/src/server/responses-tool-search-repair.ts +267 -0
- package/src/server/responses-undeclared-tool-guard.ts +153 -0
- package/src/server/responses.ts +18 -2
- package/src/server/search.ts +78 -13
- package/src/server/sse-frame-buffer.ts +292 -0
- package/src/server/sse-payload-rewrite.ts +110 -22
- package/src/server/startup-action-control.ts +8 -1
- package/src/server/startup-health-cache.ts +19 -1
- package/src/server/system-env.ts +80 -9
- package/src/server/ws-bridge.ts +39 -38
- package/src/service-manager-probe.ts +892 -0
- package/src/service.ts +1111 -90
- package/src/sidecar/auth.ts +92 -0
- package/src/sidecar/candidates.ts +83 -0
- package/src/storage/cleanup.ts +2 -2
- package/src/storage/scanner.ts +1 -1
- package/src/storage/worker-lifecycle.ts +14 -14
- package/src/tray/windows-tray.ps1 +83 -9
- package/src/tray/windows.ts +43 -16
- package/src/types/accounts.ts +37 -0
- package/src/types/config.ts +845 -0
- package/src/types/provider.ts +545 -0
- package/src/types/request.ts +384 -0
- package/src/types/tools.ts +131 -0
- package/src/types/wire.ts +80 -0
- package/src/types.ts +104 -1236
- package/src/update/index.ts +32 -19
- package/src/update/job.ts +442 -67
- package/src/update/notify.ts +12 -6
- package/src/update/npm-cache-preflight.d.mts +47 -0
- package/src/update/npm-cache-preflight.mjs +201 -0
- package/src/update/transactional-install.d.mts +22 -0
- package/src/update/transactional-install.mjs +259 -0
- package/src/usage/cost.ts +0 -0
- package/src/usage/expected-prices.ts +268 -16
- package/src/usage/log.ts +606 -41
- package/src/usage/summary.ts +177 -9
- package/src/usage/user-cost-overlay-reconciler.ts +313 -0
- package/src/usage/user-cost-overlays.ts +314 -0
- package/src/vision/anthropic-describe.ts +10 -6
- package/src/vision/backends.ts +97 -0
- package/src/vision/describe.ts +9 -3
- package/src/vision/eligibility.ts +250 -0
- package/src/vision/index.ts +238 -24
- package/src/vision/reasoning.ts +55 -0
- package/src/vision/routed-describe.ts +175 -0
- package/src/vision/timeout-bounds.ts +9 -0
- package/src/web-search/anthropic-executor.ts +13 -7
- package/src/web-search/backends.ts +108 -0
- package/src/web-search/exa-executor.ts +88 -0
- package/src/web-search/executor.ts +11 -3
- package/src/web-search/gemini-executor.ts +141 -0
- package/src/web-search/index.ts +150 -15
- package/src/web-search/loop.ts +279 -50
- package/src/web-search/parse.ts +125 -30
- package/src/web-search/sources.ts +60 -0
- package/src/web-search/xai-executor.ts +219 -0
- package/gui/dist/assets/index-DTpMHS4F.js +0 -67
- package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
- package/gui/dist/provider-icons/antigravity.svg +0 -1
- package/gui/dist/provider-icons/claude.svg +0 -1
- package/gui/dist/provider-icons/copilot.svg +0 -1
- package/gui/dist/provider-icons/cursor.svg +0 -2
- package/gui/dist/provider-icons/gemini.svg +0 -1
- package/gui/dist/provider-icons/grok-color.svg +0 -1
- package/gui/dist/provider-icons/kiro.svg +0 -14
- package/src/cli/internal-dispatch.ts +0 -20
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
3
|
+
import { createArtifactStore, loadClaimSourceManifest } from "../artifacts/store";
|
|
4
|
+
import { ArtifactFsError } from "../artifacts/secure-fs";
|
|
5
|
+
import { sanitizeDiagnostic } from "../artifacts/sanitize";
|
|
6
|
+
import { LAB_PROJECTION_SPEC_VERSION } from "../constants";
|
|
7
|
+
import { expandScenario, loadCaseAuthority } from "../conformance/manifest";
|
|
8
|
+
import { scenarioManifestDigest, jcsStringify } from "../digest";
|
|
9
|
+
import {
|
|
10
|
+
parseSuiteManifestFromArtifact,
|
|
11
|
+
type ScenarioRequirements,
|
|
12
|
+
} from "./verification";
|
|
13
|
+
import type { ClaimSnapshotEvent, LabEvent, LedgerCorruption } from "../events/types";
|
|
14
|
+
import { buildInvalidationIndex, isEventExcluded } from "../ledger/invalidation";
|
|
15
|
+
import { replayLabLedger } from "../ledger/store";
|
|
16
|
+
import { ensureLabDirs } from "../paths";
|
|
17
|
+
import { LAB_SQLITE_DDL, LAB_SQLITE_SCHEMA_VERSION } from "./schema";
|
|
18
|
+
import {
|
|
19
|
+
claimKeyString,
|
|
20
|
+
excludeEventIds,
|
|
21
|
+
projectVerdicts,
|
|
22
|
+
projectionKeyString,
|
|
23
|
+
resolveClaimStates,
|
|
24
|
+
} from "./verdicts";
|
|
25
|
+
|
|
26
|
+
export interface RebuildResult {
|
|
27
|
+
events: number;
|
|
28
|
+
verdicts: number;
|
|
29
|
+
corruptions: LedgerCorruption[];
|
|
30
|
+
sqlitePath: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function wipeSqlite(path: string): void {
|
|
34
|
+
for (const candidate of [path, `${path}-wal`, `${path}-shm`]) {
|
|
35
|
+
let removed = false;
|
|
36
|
+
for (let attempt = 0; attempt < 8; attempt++) {
|
|
37
|
+
try {
|
|
38
|
+
if (existsSync(candidate)) unlinkSync(candidate);
|
|
39
|
+
removed = true;
|
|
40
|
+
break;
|
|
41
|
+
} catch (err) {
|
|
42
|
+
const code = err && typeof err === "object" && "code" in err
|
|
43
|
+
? String((err as { code: unknown }).code)
|
|
44
|
+
: "";
|
|
45
|
+
if (code !== "EBUSY" && code !== "EPERM") throw err;
|
|
46
|
+
if (attempt < 7) Bun.sleepSync(20 * (attempt + 1));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!removed) {
|
|
50
|
+
throw new Error(`failed to remove stale projection file after retries: ${candidate}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function resetProjectionSchema(db: Database): void {
|
|
56
|
+
db.exec(`
|
|
57
|
+
DROP TABLE IF EXISTS verdicts;
|
|
58
|
+
DROP TABLE IF EXISTS corruption;
|
|
59
|
+
DROP TABLE IF EXISTS artifacts;
|
|
60
|
+
DROP TABLE IF EXISTS purges;
|
|
61
|
+
DROP TABLE IF EXISTS invalidations;
|
|
62
|
+
DROP TABLE IF EXISTS claims;
|
|
63
|
+
DROP TABLE IF EXISTS observations;
|
|
64
|
+
DROP TABLE IF EXISTS subjects;
|
|
65
|
+
DROP TABLE IF EXISTS events;
|
|
66
|
+
DROP TABLE IF EXISTS schema_meta;
|
|
67
|
+
`);
|
|
68
|
+
db.exec(LAB_SQLITE_DDL);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
interface ArtifactValidationResult {
|
|
72
|
+
unusableObservationIds: Set<string>;
|
|
73
|
+
unusableClaimEventIds: Set<string>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Deterministic rebuild:
|
|
78
|
+
* delete compatibility.sqlite → replay JSONL → validate artifacts → project.
|
|
79
|
+
*/
|
|
80
|
+
export function rebuildLabProjection(configDir?: string): RebuildResult {
|
|
81
|
+
const paths = ensureLabDirs(configDir);
|
|
82
|
+
wipeSqlite(paths.sqlitePath);
|
|
83
|
+
|
|
84
|
+
const replay = replayLabLedger(paths.ledgerPath);
|
|
85
|
+
const corruptions: LedgerCorruption[] = [...replay.corruptions];
|
|
86
|
+
const index = buildInvalidationIndex(replay.events);
|
|
87
|
+
corruptions.push(...index.corruptions);
|
|
88
|
+
|
|
89
|
+
const artifactStore = createArtifactStore(paths.artifactsDir);
|
|
90
|
+
const validation = validateRequiredArtifacts(replay.events, index, artifactStore, corruptions);
|
|
91
|
+
|
|
92
|
+
const authority = loadCaseAuthority();
|
|
93
|
+
const scenarioRequirementsByDigest = new Map<string, ScenarioRequirements>();
|
|
94
|
+
for (const caseRecord of authority.cases) {
|
|
95
|
+
const expanded = expandScenario(caseRecord, authority);
|
|
96
|
+
scenarioRequirementsByDigest.set(scenarioManifestDigest(expanded), {
|
|
97
|
+
inboundProtocols: [...caseRecord.requirements.inboundProtocols],
|
|
98
|
+
upstreamProtocols: [...caseRecord.requirements.upstreamProtocols],
|
|
99
|
+
surfaces: [...caseRecord.requirements.surfaces],
|
|
100
|
+
freshness: { ...authority.manifestDefaults.freshness },
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const loadSuiteManifest = (digest: string) => {
|
|
105
|
+
try {
|
|
106
|
+
const bytes = artifactStore.get(digest, { artifactClass: "suite_manifest" });
|
|
107
|
+
const parsed = JSON.parse(new TextDecoder().decode(bytes));
|
|
108
|
+
return parseSuiteManifestFromArtifact(parsed);
|
|
109
|
+
} catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const loadScenarioManifest = (digest: string) => {
|
|
114
|
+
try {
|
|
115
|
+
const bytes = artifactStore.get(digest, { artifactClass: "scenario_manifest" });
|
|
116
|
+
return JSON.parse(new TextDecoder().decode(bytes)) as Record<string, unknown>;
|
|
117
|
+
} catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const loadScenarioRequirements = (digest: string) => scenarioRequirementsByDigest.get(digest) ?? null;
|
|
122
|
+
|
|
123
|
+
const db = new Database(paths.sqlitePath);
|
|
124
|
+
let transactionOpen = false;
|
|
125
|
+
// Every statement prepared below, so they can be finalized before the close.
|
|
126
|
+
//
|
|
127
|
+
// Bun keeps a prepared statement alive until it is finalized or garbage collected,
|
|
128
|
+
// and on Windows an unfinalized statement holds the database file open: `close()`
|
|
129
|
+
// leaves the handle, and `close(true)` throws "database is locked". A second
|
|
130
|
+
// rebuild then failed to unlink the previous projection with EBUSY, and the retry
|
|
131
|
+
// loop in `wipeSqlite` could only turn that into a slower failure. POSIX allows
|
|
132
|
+
// unlinking an open file, which is why this never surfaced there.
|
|
133
|
+
const prepared: Array<{ finalize(): void }> = [];
|
|
134
|
+
const prepare = (sql: string) => {
|
|
135
|
+
const statement = db.prepare(sql);
|
|
136
|
+
prepared.push(statement);
|
|
137
|
+
return statement;
|
|
138
|
+
};
|
|
139
|
+
try {
|
|
140
|
+
db.exec("PRAGMA journal_mode=DELETE;");
|
|
141
|
+
db.exec("PRAGMA foreign_keys=OFF;");
|
|
142
|
+
db.exec("BEGIN IMMEDIATE;");
|
|
143
|
+
transactionOpen = true;
|
|
144
|
+
resetProjectionSchema(db);
|
|
145
|
+
|
|
146
|
+
const insertMeta = prepare("INSERT OR REPLACE INTO schema_meta(key, value) VALUES (?, ?)");
|
|
147
|
+
insertMeta.run("schema_version", String(LAB_SQLITE_SCHEMA_VERSION));
|
|
148
|
+
insertMeta.run("projection_spec_version", LAB_PROJECTION_SPEC_VERSION);
|
|
149
|
+
insertMeta.run("built_at_ms", String(Date.now()));
|
|
150
|
+
|
|
151
|
+
const insertCorruption = prepare(
|
|
152
|
+
"INSERT INTO corruption(kind, line_number, event_id, detail) VALUES (?, ?, ?, ?)",
|
|
153
|
+
);
|
|
154
|
+
for (const c of corruptions) {
|
|
155
|
+
insertCorruption.run(c.kind, c.lineNumber ?? null, c.eventId ?? null, c.detail);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const insertEvent = prepare(
|
|
159
|
+
`INSERT INTO events(event_id, event_kind, recorded_at, producer, producer_version, payload_json, excluded, exclusion_reason)
|
|
160
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
161
|
+
);
|
|
162
|
+
const insertSubject = prepare(
|
|
163
|
+
`INSERT OR IGNORE INTO subjects(subject_id, subject_kind, subject_json) VALUES (?, ?, ?)`,
|
|
164
|
+
);
|
|
165
|
+
const insertObs = prepare(
|
|
166
|
+
`INSERT INTO observations(
|
|
167
|
+
event_id, subject_id, evidence_layer, suite_id, suite_version, suite_manifest_digest,
|
|
168
|
+
scenario_id, scenario_version, scenario_manifest_digest, outcome, completed_at, execution_mode
|
|
169
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
170
|
+
);
|
|
171
|
+
const insertClaim = prepare(
|
|
172
|
+
`INSERT INTO claims(
|
|
173
|
+
event_id, subject_id, capability, polarity, source_manifest_digest,
|
|
174
|
+
effective_at, recorded_at, supersedes_json, current, usable
|
|
175
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
176
|
+
);
|
|
177
|
+
const insertInv = prepare(
|
|
178
|
+
`INSERT INTO invalidations(event_id, reason, targets_json, recorded_at, applied) VALUES (?, ?, ?, ?, ?)`,
|
|
179
|
+
);
|
|
180
|
+
const insertPurge = prepare(
|
|
181
|
+
`INSERT INTO purges(event_id, target_event_ids_json, target_artifact_digests_json, purge_actions_json, recorded_at)
|
|
182
|
+
VALUES (?, ?, ?, ?, ?)`,
|
|
183
|
+
);
|
|
184
|
+
const insertArtifact = prepare(
|
|
185
|
+
`INSERT INTO artifacts(digest, artifact_class, media_type, byte_count, status, last_error)
|
|
186
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
187
|
+
ON CONFLICT(digest) DO UPDATE SET
|
|
188
|
+
artifact_class = COALESCE(excluded.artifact_class, artifacts.artifact_class),
|
|
189
|
+
media_type = COALESCE(excluded.media_type, artifacts.media_type),
|
|
190
|
+
byte_count = COALESCE(excluded.byte_count, artifacts.byte_count),
|
|
191
|
+
status = CASE
|
|
192
|
+
WHEN artifacts.status = 'purged_unavailable' OR excluded.status = 'purged_unavailable'
|
|
193
|
+
THEN 'purged_unavailable'
|
|
194
|
+
WHEN artifacts.status = 'corrupt' OR excluded.status = 'corrupt'
|
|
195
|
+
THEN 'corrupt'
|
|
196
|
+
ELSE 'present'
|
|
197
|
+
END,
|
|
198
|
+
last_error = COALESCE(excluded.last_error, artifacts.last_error)`,
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
const excluded = excludeEventIds(index);
|
|
202
|
+
const usableClaimEvents = replay.events.filter(
|
|
203
|
+
(e): e is ClaimSnapshotEvent =>
|
|
204
|
+
e.eventKind === "claim_snapshot" && !isEventExcluded(e.eventId, index),
|
|
205
|
+
);
|
|
206
|
+
const claimStates = resolveClaimStates(usableClaimEvents, {
|
|
207
|
+
unusableClaimEventIds: validation.unusableClaimEventIds,
|
|
208
|
+
purgedEventIds: index.purgedEventIds,
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
for (const event of replay.events) {
|
|
212
|
+
const isExcluded = excluded.has(event.eventId);
|
|
213
|
+
let exclusionReason: string | null = null;
|
|
214
|
+
if (index.purgedEventIds.has(event.eventId)) exclusionReason = "purged";
|
|
215
|
+
else if (index.invalidatedBy.has(event.eventId)) exclusionReason = "invalidated";
|
|
216
|
+
|
|
217
|
+
insertEvent.run(
|
|
218
|
+
event.eventId,
|
|
219
|
+
event.eventKind,
|
|
220
|
+
event.recordedAt,
|
|
221
|
+
event.producer,
|
|
222
|
+
event.producerVersion,
|
|
223
|
+
jcsStringify(event),
|
|
224
|
+
isExcluded ? 1 : 0,
|
|
225
|
+
exclusionReason,
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
if (event.eventKind === "observation") {
|
|
229
|
+
insertSubject.run(event.subjectId, event.subject.subjectKind, jcsStringify(event.subject));
|
|
230
|
+
const usable = !isExcluded && !validation.unusableObservationIds.has(event.eventId);
|
|
231
|
+
if (usable) {
|
|
232
|
+
insertObs.run(
|
|
233
|
+
event.eventId,
|
|
234
|
+
event.subjectId,
|
|
235
|
+
event.evidenceLayer,
|
|
236
|
+
event.suiteId,
|
|
237
|
+
event.suiteVersion,
|
|
238
|
+
event.suiteManifestDigest,
|
|
239
|
+
event.scenarioId,
|
|
240
|
+
event.scenarioVersion,
|
|
241
|
+
event.scenarioManifestDigest,
|
|
242
|
+
event.outcome,
|
|
243
|
+
event.completedAt,
|
|
244
|
+
event.executionMode,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
for (const ref of event.artifactRefs) {
|
|
248
|
+
const purged = index.purgedArtifactDigests.has(ref.digest);
|
|
249
|
+
const corrupt = validation.unusableObservationIds.has(event.eventId);
|
|
250
|
+
insertArtifact.run(
|
|
251
|
+
ref.digest,
|
|
252
|
+
ref.artifactClass,
|
|
253
|
+
ref.mediaType,
|
|
254
|
+
ref.byteCount,
|
|
255
|
+
purged ? "purged_unavailable" : corrupt ? "corrupt" : "present",
|
|
256
|
+
corrupt ? "required artifact unusable" : null,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
} else if (event.eventKind === "claim_snapshot") {
|
|
260
|
+
insertSubject.run(event.subjectId, event.subject.subjectKind, jcsStringify(event.subject));
|
|
261
|
+
const key = claimKeyString(event.subjectId, event.capability);
|
|
262
|
+
const state = claimStates.states.get(key);
|
|
263
|
+
const current = state?.current?.eventId === event.eventId ? 1 : 0;
|
|
264
|
+
const claimCorruption = corruptions.find(
|
|
265
|
+
(c) => c.kind === "claim_corruption" && c.eventId === event.eventId,
|
|
266
|
+
);
|
|
267
|
+
const usable = !isExcluded && !state?.corruption &&
|
|
268
|
+
!validation.unusableClaimEventIds.has(event.eventId) ? 1 : 0;
|
|
269
|
+
|
|
270
|
+
if (!isExcluded) {
|
|
271
|
+
insertArtifact.run(
|
|
272
|
+
event.sourceManifestDigest,
|
|
273
|
+
"claim_source_manifest",
|
|
274
|
+
"application/json",
|
|
275
|
+
null,
|
|
276
|
+
claimCorruption ? "corrupt" : "present",
|
|
277
|
+
claimCorruption?.detail ?? null,
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
insertClaim.run(
|
|
282
|
+
event.eventId,
|
|
283
|
+
event.subjectId,
|
|
284
|
+
event.capability,
|
|
285
|
+
event.polarity,
|
|
286
|
+
event.sourceManifestDigest,
|
|
287
|
+
event.effectiveAt,
|
|
288
|
+
event.recordedAt,
|
|
289
|
+
jcsStringify(event.supersedes),
|
|
290
|
+
current,
|
|
291
|
+
usable,
|
|
292
|
+
);
|
|
293
|
+
} else if (event.eventKind === "invalidation") {
|
|
294
|
+
const applied = !corruptions.some((c) => c.eventId === event.eventId && c.kind === "invalid_reference");
|
|
295
|
+
insertInv.run(
|
|
296
|
+
event.eventId,
|
|
297
|
+
event.reason,
|
|
298
|
+
jcsStringify(event.targetEventIds),
|
|
299
|
+
event.recordedAt,
|
|
300
|
+
applied ? 1 : 0,
|
|
301
|
+
);
|
|
302
|
+
} else if (event.eventKind === "purge_tombstone") {
|
|
303
|
+
insertPurge.run(
|
|
304
|
+
event.eventId,
|
|
305
|
+
jcsStringify(event.targetEventIds),
|
|
306
|
+
jcsStringify(event.targetArtifactDigests),
|
|
307
|
+
jcsStringify(event.purgeActions),
|
|
308
|
+
event.recordedAt,
|
|
309
|
+
);
|
|
310
|
+
for (const digest of event.targetArtifactDigests) {
|
|
311
|
+
insertArtifact.run(digest, null, null, null, "purged_unavailable", null);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const { verdicts, corruptions: verdictCorruptions } = projectVerdicts(replay.events, {
|
|
317
|
+
index,
|
|
318
|
+
unusableObservationIds: validation.unusableObservationIds,
|
|
319
|
+
unusableClaimEventIds: validation.unusableClaimEventIds,
|
|
320
|
+
loadSuiteManifest,
|
|
321
|
+
loadScenarioManifest,
|
|
322
|
+
loadScenarioRequirements,
|
|
323
|
+
});
|
|
324
|
+
for (const c of verdictCorruptions) {
|
|
325
|
+
if (!corruptions.some((x) => x.detail === c.detail && x.eventId === c.eventId)) {
|
|
326
|
+
corruptions.push(c);
|
|
327
|
+
insertCorruption.run(c.kind, c.lineNumber ?? null, c.eventId ?? null, c.detail);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const insertVerdict = prepare(
|
|
332
|
+
`INSERT INTO verdicts(
|
|
333
|
+
projection_key, subject_id, evidence_layer, suite_id, suite_version, suite_manifest_digest,
|
|
334
|
+
projection_spec_version, verdict, as_of, scenario_manifest_digests_json, claim_source_digest,
|
|
335
|
+
contributing_event_ids_json, contradicting_event_ids_json, notes_json
|
|
336
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
for (const v of verdicts) {
|
|
340
|
+
insertVerdict.run(
|
|
341
|
+
projectionKeyString(v.key),
|
|
342
|
+
v.key.subjectId,
|
|
343
|
+
v.key.evidenceLayer,
|
|
344
|
+
v.key.suiteId,
|
|
345
|
+
v.key.suiteVersion,
|
|
346
|
+
v.key.suiteManifestDigest,
|
|
347
|
+
v.key.projectionSpecVersion,
|
|
348
|
+
v.verdict,
|
|
349
|
+
v.asOf,
|
|
350
|
+
jcsStringify(v.scenarioManifestDigests),
|
|
351
|
+
v.claimSourceDigest ?? null,
|
|
352
|
+
jcsStringify(v.contributingEventIds),
|
|
353
|
+
jcsStringify(v.contradictingEventIds),
|
|
354
|
+
jcsStringify(v.notes),
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
db.exec("COMMIT;");
|
|
359
|
+
transactionOpen = false;
|
|
360
|
+
return {
|
|
361
|
+
events: replay.events.length,
|
|
362
|
+
verdicts: verdicts.length,
|
|
363
|
+
corruptions,
|
|
364
|
+
sqlitePath: paths.sqlitePath,
|
|
365
|
+
};
|
|
366
|
+
} catch (err) {
|
|
367
|
+
if (transactionOpen) {
|
|
368
|
+
try {
|
|
369
|
+
db.exec("ROLLBACK;");
|
|
370
|
+
} catch {
|
|
371
|
+
// Preserve the original rebuild failure.
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
throw err;
|
|
375
|
+
} finally {
|
|
376
|
+
try {
|
|
377
|
+
db.exec("PRAGMA foreign_keys=ON;");
|
|
378
|
+
} catch {
|
|
379
|
+
// Closing the disposable DB is still safe if pragma restoration fails.
|
|
380
|
+
}
|
|
381
|
+
// Finalize before closing: an outstanding statement keeps the file open on
|
|
382
|
+
// Windows, and the next rebuild cannot unlink the projection it is replacing.
|
|
383
|
+
for (const statement of prepared) {
|
|
384
|
+
try {
|
|
385
|
+
statement.finalize();
|
|
386
|
+
} catch {
|
|
387
|
+
// A statement already finalized by an error path is not a rebuild failure.
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
db.close();
|
|
391
|
+
artifactStore.close();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function validateRequiredArtifacts(
|
|
396
|
+
events: LabEvent[],
|
|
397
|
+
index: ReturnType<typeof buildInvalidationIndex>,
|
|
398
|
+
artifactStore: ReturnType<typeof createArtifactStore>,
|
|
399
|
+
corruptions: LedgerCorruption[],
|
|
400
|
+
): ArtifactValidationResult {
|
|
401
|
+
const unusableObservationIds = new Set<string>();
|
|
402
|
+
const unusableClaimEventIds = new Set<string>();
|
|
403
|
+
|
|
404
|
+
for (const event of events) {
|
|
405
|
+
if (isEventExcluded(event.eventId, index)) continue;
|
|
406
|
+
if (event.eventKind === "observation") {
|
|
407
|
+
const required: Array<{ digest: string; artifactClass: "scenario_manifest" | "suite_manifest" | "fixture" }> = [
|
|
408
|
+
{ digest: event.scenarioManifestDigest, artifactClass: "scenario_manifest" },
|
|
409
|
+
{ digest: event.suiteManifestDigest, artifactClass: "suite_manifest" },
|
|
410
|
+
...event.fixtureDigests.map((digest) => ({ digest, artifactClass: "fixture" as const })),
|
|
411
|
+
];
|
|
412
|
+
let unusable = false;
|
|
413
|
+
for (const { digest, artifactClass } of required) {
|
|
414
|
+
if (index.purgedArtifactDigests.has(digest)) {
|
|
415
|
+
corruptions.push({
|
|
416
|
+
kind: "missing_artifact",
|
|
417
|
+
eventId: event.eventId,
|
|
418
|
+
detail: `required artifact purged: ${digest}`,
|
|
419
|
+
});
|
|
420
|
+
unusable = true;
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
try {
|
|
424
|
+
artifactStore.get(digest, { artifactClass });
|
|
425
|
+
} catch (err) {
|
|
426
|
+
const detail = sanitizeDiagnostic(err);
|
|
427
|
+
corruptions.push({
|
|
428
|
+
kind: err instanceof ArtifactFsError &&
|
|
429
|
+
(err.code === "artifact_mismatch" || err.message.includes("mismatch"))
|
|
430
|
+
? "artifact_mismatch"
|
|
431
|
+
: "missing_artifact",
|
|
432
|
+
eventId: event.eventId,
|
|
433
|
+
detail,
|
|
434
|
+
});
|
|
435
|
+
unusable = true;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
if (unusable) unusableObservationIds.add(event.eventId);
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
if (event.eventKind === "claim_snapshot") {
|
|
443
|
+
if (index.purgedArtifactDigests.has(event.sourceManifestDigest)) {
|
|
444
|
+
unusableClaimEventIds.add(event.eventId);
|
|
445
|
+
corruptions.push({
|
|
446
|
+
kind: "claim_corruption",
|
|
447
|
+
eventId: event.eventId,
|
|
448
|
+
detail: `claim source artifact purged: ${event.sourceManifestDigest}`,
|
|
449
|
+
});
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
const loaded = loadClaimSourceManifest(artifactStore, event.sourceManifestDigest, {
|
|
453
|
+
subjectId: event.subjectId,
|
|
454
|
+
capability: event.capability,
|
|
455
|
+
});
|
|
456
|
+
if (!loaded.ok) {
|
|
457
|
+
unusableClaimEventIds.add(event.eventId);
|
|
458
|
+
corruptions.push({
|
|
459
|
+
kind: "claim_corruption",
|
|
460
|
+
eventId: event.eventId,
|
|
461
|
+
detail: loaded.corruption,
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return { unusableObservationIds, unusableClaimEventIds };
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/** Snapshot derived verdict rows for rebuild-determinism tests (excludes asOf wall clock). */
|
|
471
|
+
export function readVerdictSnapshot(sqlitePath: string): unknown[] {
|
|
472
|
+
const db = new Database(sqlitePath, { readonly: true });
|
|
473
|
+
try {
|
|
474
|
+
return db
|
|
475
|
+
.query(
|
|
476
|
+
`SELECT projection_key, subject_id, evidence_layer, suite_id, suite_version,
|
|
477
|
+
suite_manifest_digest, projection_spec_version, verdict,
|
|
478
|
+
scenario_manifest_digests_json, claim_source_digest,
|
|
479
|
+
contributing_event_ids_json, contradicting_event_ids_json, notes_json
|
|
480
|
+
FROM verdicts ORDER BY projection_key`,
|
|
481
|
+
)
|
|
482
|
+
.all();
|
|
483
|
+
} finally {
|
|
484
|
+
db.close();
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
export function readCorruptionRows(sqlitePath: string): unknown[] {
|
|
489
|
+
const db = new Database(sqlitePath, { readonly: true });
|
|
490
|
+
try {
|
|
491
|
+
return db.query(`SELECT kind, line_number, event_id, detail FROM corruption ORDER BY id`).all();
|
|
492
|
+
} finally {
|
|
493
|
+
db.close();
|
|
494
|
+
}
|
|
495
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disposable SQLite projection schema for Compatibility Lab (CL-02).
|
|
3
|
+
* Not canonical storage — rebuildable from JSONL + content-addressed artifacts.
|
|
4
|
+
*/
|
|
5
|
+
export const LAB_SQLITE_SCHEMA_VERSION = 3;
|
|
6
|
+
|
|
7
|
+
export const LAB_SQLITE_DDL = `
|
|
8
|
+
CREATE TABLE IF NOT EXISTS schema_meta (
|
|
9
|
+
key TEXT PRIMARY KEY,
|
|
10
|
+
value TEXT NOT NULL
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
14
|
+
event_id TEXT PRIMARY KEY,
|
|
15
|
+
event_kind TEXT NOT NULL CHECK (event_kind IN ('observation', 'claim_snapshot', 'invalidation', 'purge_tombstone')),
|
|
16
|
+
recorded_at INTEGER NOT NULL,
|
|
17
|
+
producer TEXT NOT NULL,
|
|
18
|
+
producer_version TEXT NOT NULL,
|
|
19
|
+
payload_json TEXT NOT NULL,
|
|
20
|
+
excluded INTEGER NOT NULL DEFAULT 0 CHECK (excluded IN (0, 1)),
|
|
21
|
+
exclusion_reason TEXT
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(event_kind, recorded_at);
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_events_excluded ON events(excluded);
|
|
26
|
+
|
|
27
|
+
CREATE TABLE IF NOT EXISTS subjects (
|
|
28
|
+
subject_id TEXT PRIMARY KEY,
|
|
29
|
+
subject_kind TEXT NOT NULL,
|
|
30
|
+
subject_json TEXT NOT NULL
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE TABLE IF NOT EXISTS observations (
|
|
34
|
+
event_id TEXT PRIMARY KEY,
|
|
35
|
+
subject_id TEXT NOT NULL,
|
|
36
|
+
evidence_layer TEXT NOT NULL CHECK (evidence_layer IN ('protocol_conformance', 'live_route_compatibility', 'task_effectiveness')),
|
|
37
|
+
suite_id TEXT NOT NULL,
|
|
38
|
+
suite_version TEXT NOT NULL,
|
|
39
|
+
suite_manifest_digest TEXT NOT NULL,
|
|
40
|
+
scenario_id TEXT NOT NULL,
|
|
41
|
+
scenario_version TEXT NOT NULL,
|
|
42
|
+
scenario_manifest_digest TEXT NOT NULL,
|
|
43
|
+
outcome TEXT NOT NULL CHECK (outcome IN ('pass', 'fail', 'blocked', 'inconclusive')),
|
|
44
|
+
completed_at INTEGER NOT NULL,
|
|
45
|
+
execution_mode TEXT NOT NULL CHECK (execution_mode IN ('fixture', 'live', 'fabric')),
|
|
46
|
+
FOREIGN KEY(event_id) REFERENCES events(event_id)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_observations_proj ON observations(
|
|
50
|
+
subject_id, evidence_layer, suite_id, suite_version, suite_manifest_digest, completed_at
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_observations_exact_identity ON observations(
|
|
54
|
+
evidence_layer,
|
|
55
|
+
subject_id,
|
|
56
|
+
suite_id,
|
|
57
|
+
suite_version,
|
|
58
|
+
suite_manifest_digest,
|
|
59
|
+
scenario_id,
|
|
60
|
+
scenario_version,
|
|
61
|
+
scenario_manifest_digest,
|
|
62
|
+
completed_at DESC,
|
|
63
|
+
event_id DESC
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
CREATE TABLE IF NOT EXISTS claims (
|
|
67
|
+
event_id TEXT PRIMARY KEY,
|
|
68
|
+
subject_id TEXT NOT NULL,
|
|
69
|
+
capability TEXT NOT NULL,
|
|
70
|
+
polarity TEXT NOT NULL CHECK (polarity IN ('supported', 'not_supported', 'withdrawn')),
|
|
71
|
+
source_manifest_digest TEXT NOT NULL,
|
|
72
|
+
effective_at INTEGER NOT NULL,
|
|
73
|
+
recorded_at INTEGER NOT NULL,
|
|
74
|
+
supersedes_json TEXT NOT NULL,
|
|
75
|
+
current INTEGER NOT NULL DEFAULT 0 CHECK (current IN (0, 1)),
|
|
76
|
+
usable INTEGER NOT NULL DEFAULT 1 CHECK (usable IN (0, 1)),
|
|
77
|
+
FOREIGN KEY(event_id) REFERENCES events(event_id)
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
CREATE INDEX IF NOT EXISTS idx_claims_key ON claims(subject_id, capability, effective_at, event_id);
|
|
81
|
+
|
|
82
|
+
CREATE TABLE IF NOT EXISTS invalidations (
|
|
83
|
+
event_id TEXT PRIMARY KEY,
|
|
84
|
+
reason TEXT NOT NULL,
|
|
85
|
+
targets_json TEXT NOT NULL,
|
|
86
|
+
recorded_at INTEGER NOT NULL,
|
|
87
|
+
applied INTEGER NOT NULL DEFAULT 0 CHECK (applied IN (0, 1)),
|
|
88
|
+
FOREIGN KEY(event_id) REFERENCES events(event_id)
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
CREATE TABLE IF NOT EXISTS purges (
|
|
92
|
+
event_id TEXT PRIMARY KEY,
|
|
93
|
+
target_event_ids_json TEXT NOT NULL,
|
|
94
|
+
target_artifact_digests_json TEXT NOT NULL,
|
|
95
|
+
purge_actions_json TEXT NOT NULL,
|
|
96
|
+
recorded_at INTEGER NOT NULL,
|
|
97
|
+
FOREIGN KEY(event_id) REFERENCES events(event_id)
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
101
|
+
digest TEXT PRIMARY KEY,
|
|
102
|
+
artifact_class TEXT,
|
|
103
|
+
media_type TEXT,
|
|
104
|
+
byte_count INTEGER,
|
|
105
|
+
status TEXT NOT NULL CHECK (status IN ('present', 'corrupt', 'purged_unavailable')),
|
|
106
|
+
last_error TEXT
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
CREATE TABLE IF NOT EXISTS verdicts (
|
|
110
|
+
projection_key TEXT PRIMARY KEY,
|
|
111
|
+
subject_id TEXT NOT NULL,
|
|
112
|
+
evidence_layer TEXT NOT NULL,
|
|
113
|
+
suite_id TEXT NOT NULL,
|
|
114
|
+
suite_version TEXT NOT NULL,
|
|
115
|
+
suite_manifest_digest TEXT NOT NULL,
|
|
116
|
+
projection_spec_version TEXT NOT NULL,
|
|
117
|
+
verdict TEXT NOT NULL CHECK (verdict IN ('UNKNOWN', 'CLAIMED', 'PROBED', 'VERIFIED', 'DEGRADED', 'BLOCKED', 'UNSUPPORTED')),
|
|
118
|
+
as_of INTEGER NOT NULL,
|
|
119
|
+
scenario_manifest_digests_json TEXT NOT NULL,
|
|
120
|
+
claim_source_digest TEXT,
|
|
121
|
+
contributing_event_ids_json TEXT NOT NULL,
|
|
122
|
+
contradicting_event_ids_json TEXT NOT NULL,
|
|
123
|
+
notes_json TEXT NOT NULL
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_verdicts_subject ON verdicts(subject_id, evidence_layer, suite_id);
|
|
127
|
+
|
|
128
|
+
CREATE TABLE IF NOT EXISTS corruption (
|
|
129
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
130
|
+
kind TEXT NOT NULL,
|
|
131
|
+
line_number INTEGER,
|
|
132
|
+
event_id TEXT,
|
|
133
|
+
detail TEXT NOT NULL
|
|
134
|
+
);
|
|
135
|
+
`;
|