voratiq 0.1.0-beta.2 → 0.1.0-beta.21
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/README.md +41 -29
- package/dist/agents/launch/chat.d.ts +23 -0
- package/dist/agents/launch/chat.js +44 -0
- package/dist/agents/launch/environment.d.ts +8 -0
- package/dist/{commands/run/agents/workspace-prep.js → agents/launch/environment.js} +5 -27
- package/dist/agents/launch/prompt.d.ts +6 -0
- package/dist/agents/launch/prompt.js +12 -0
- package/dist/agents/launch/provider-state.d.ts +39 -0
- package/dist/agents/launch/provider-state.js +103 -0
- package/dist/agents/runtime/auth.d.ts +27 -0
- package/dist/agents/runtime/auth.js +72 -0
- package/dist/agents/runtime/chat.d.ts +5 -0
- package/dist/agents/runtime/chat.js +7 -0
- package/dist/agents/runtime/errors.d.ts +27 -0
- package/dist/agents/runtime/errors.js +51 -0
- package/dist/{commands/run/agents → agents/runtime}/failures.d.ts +0 -1
- package/dist/agents/runtime/failures.js +136 -0
- package/dist/agents/runtime/harness.d.ts +2 -0
- package/dist/agents/runtime/harness.js +119 -0
- package/dist/{commands/run/agents/sandbox-launcher.d.ts → agents/runtime/launcher.d.ts} +18 -6
- package/dist/{commands/run/agents/sandbox-launcher.js → agents/runtime/launcher.js} +17 -39
- package/dist/{commands/run/agents/workspace-prep.d.ts → agents/runtime/manifest.d.ts} +6 -6
- package/dist/agents/runtime/manifest.js +34 -0
- package/dist/agents/runtime/policy.d.ts +32 -0
- package/dist/agents/runtime/policy.js +240 -0
- package/dist/agents/runtime/registry.d.ts +4 -0
- package/dist/agents/runtime/registry.js +54 -0
- package/dist/{commands/run → agents/runtime}/sandbox.d.ts +8 -2
- package/dist/{commands/run → agents/runtime}/sandbox.js +28 -67
- package/dist/agents/runtime/shim/run-agent-shim.d.ts +1 -0
- package/dist/agents/runtime/shim/run-agent-shim.js +276 -0
- package/dist/agents/runtime/types.d.ts +91 -0
- package/dist/{commands/run/agents → agents/runtime}/watchdog.d.ts +4 -3
- package/dist/{commands/run/agents → agents/runtime}/watchdog.js +155 -26
- package/dist/auth/providers/codex.js +7 -2
- package/dist/auth/providers/gemini.js +14 -6
- package/dist/auth/providers/types.d.ts +1 -0
- package/dist/auth/providers/utils.d.ts +0 -1
- package/dist/auth/providers/utils.js +1 -49
- package/dist/bin.js +369 -71
- package/dist/cli/apply.d.ts +4 -0
- package/dist/cli/apply.js +28 -9
- package/dist/cli/auto.d.ts +32 -0
- package/dist/cli/auto.js +232 -0
- package/dist/cli/contract.d.ts +328 -0
- package/dist/cli/contract.js +480 -0
- package/dist/cli/errors.d.ts +3 -0
- package/dist/cli/errors.js +21 -3
- package/dist/cli/init.d.ts +5 -0
- package/dist/cli/init.js +34 -6
- package/dist/cli/list.d.ts +6 -4
- package/dist/cli/list.js +39 -16
- package/dist/cli/mcp.d.ts +2 -0
- package/dist/cli/mcp.js +16 -0
- package/dist/cli/message.d.ts +28 -0
- package/dist/cli/message.js +147 -0
- package/dist/cli/operator-envelope.d.ts +180 -0
- package/dist/cli/operator-envelope.js +425 -0
- package/dist/cli/output.d.ts +15 -1
- package/dist/cli/output.js +153 -5
- package/dist/cli/prune.d.ts +7 -3
- package/dist/cli/prune.js +57 -12
- package/dist/cli/reduce.d.ts +29 -0
- package/dist/cli/reduce.js +211 -0
- package/dist/cli/root-launcher.d.ts +4 -0
- package/dist/cli/root-launcher.js +15 -0
- package/dist/cli/run.d.ts +27 -1
- package/dist/cli/run.js +108 -16
- package/dist/cli/spec.d.ts +31 -0
- package/dist/cli/spec.js +180 -0
- package/dist/cli/verify.d.ts +35 -0
- package/dist/cli/verify.js +297 -0
- package/dist/commands/apply/command.d.ts +2 -0
- package/dist/commands/apply/command.js +145 -6
- package/dist/commands/apply/errors.d.ts +43 -4
- package/dist/commands/apply/errors.js +100 -22
- package/dist/commands/apply/types.d.ts +2 -1
- package/dist/commands/auto/command.d.ts +145 -0
- package/dist/commands/auto/command.js +433 -0
- package/dist/commands/auto/errors.d.ts +19 -0
- package/dist/commands/auto/errors.js +19 -0
- package/dist/commands/auto/validation.d.ts +14 -0
- package/dist/commands/auto/validation.js +90 -0
- package/dist/commands/fetch.d.ts +2 -2
- package/dist/commands/fetch.js +4 -4
- package/dist/commands/init/agents.d.ts +2 -1
- package/dist/commands/init/agents.js +66 -63
- package/dist/commands/init/command.js +300 -16
- package/dist/commands/init/types.d.ts +18 -7
- package/dist/commands/interactive/lifecycle.d.ts +15 -0
- package/dist/commands/interactive/lifecycle.js +141 -0
- package/dist/commands/list/command.d.ts +10 -3
- package/dist/commands/list/command.js +597 -40
- package/dist/commands/message/command.d.ts +23 -0
- package/dist/commands/message/command.js +215 -0
- package/dist/commands/message/errors.d.ts +9 -0
- package/dist/commands/message/errors.js +20 -0
- package/dist/commands/message/lifecycle.d.ts +14 -0
- package/dist/commands/message/lifecycle.js +128 -0
- package/dist/commands/prune/command.d.ts +2 -1
- package/dist/commands/prune/command.js +61 -10
- package/dist/commands/prune/errors.d.ts +1 -1
- package/dist/commands/prune/errors.js +5 -5
- package/dist/commands/prune/types.d.ts +21 -0
- package/dist/commands/reduce/command.d.ts +26 -0
- package/dist/commands/reduce/command.js +145 -0
- package/dist/commands/reduce/errors.d.ts +17 -0
- package/dist/commands/reduce/errors.js +32 -0
- package/dist/commands/reduce/targets.d.ts +11 -0
- package/dist/commands/reduce/targets.js +271 -0
- package/dist/commands/root-launcher/command.d.ts +31 -0
- package/dist/commands/root-launcher/command.js +233 -0
- package/dist/commands/run/command.d.ts +6 -1
- package/dist/commands/run/command.js +70 -40
- package/dist/commands/run/lifecycle.d.ts +7 -5
- package/dist/commands/run/lifecycle.js +45 -23
- package/dist/commands/run/record-init.d.ts +4 -1
- package/dist/commands/run/record-init.js +5 -2
- package/dist/commands/run/shim/run-agent-shim.d.ts +2 -1
- package/dist/commands/run/shim/run-agent-shim.js +4 -219
- package/dist/commands/run/validation.d.ts +2 -3
- package/dist/commands/run/validation.js +54 -25
- package/dist/commands/shared/max-parallel.d.ts +5 -0
- package/dist/commands/shared/max-parallel.js +15 -0
- package/dist/commands/shared/preview.d.ts +10 -0
- package/dist/commands/shared/preview.js +60 -0
- package/dist/commands/shared/resolve-reduction-competitors.d.ts +15 -0
- package/dist/commands/shared/resolve-reduction-competitors.js +13 -0
- package/dist/commands/shared/resolve-stage-competitors.d.ts +19 -0
- package/dist/commands/shared/resolve-stage-competitors.js +171 -0
- package/dist/commands/shared/session-id.d.ts +1 -0
- package/dist/commands/shared/session-id.js +1 -0
- package/dist/commands/spec/command.d.ts +22 -0
- package/dist/commands/spec/command.js +330 -0
- package/dist/commands/spec/errors.d.ts +11 -0
- package/dist/commands/spec/errors.js +23 -0
- package/dist/commands/verify/agents.d.ts +8 -0
- package/dist/commands/verify/agents.js +29 -0
- package/dist/commands/verify/command.d.ts +23 -0
- package/dist/commands/verify/command.js +168 -0
- package/dist/commands/verify/lifecycle.d.ts +14 -0
- package/dist/commands/verify/lifecycle.js +229 -0
- package/dist/commands/verify/max-parallel.d.ts +7 -0
- package/dist/commands/verify/max-parallel.js +15 -0
- package/dist/commands/verify/targets.d.ts +18 -0
- package/dist/commands/verify/targets.js +420 -0
- package/dist/competition/command-adapter.d.ts +35 -0
- package/dist/competition/command-adapter.js +20 -0
- package/dist/competition/core.d.ts +41 -0
- package/dist/competition/core.js +181 -0
- package/dist/competition/shared/extra-context.d.ts +14 -0
- package/dist/competition/shared/extra-context.js +100 -0
- package/dist/competition/shared/preflight.d.ts +11 -0
- package/dist/competition/shared/preflight.js +39 -0
- package/dist/competition/shared/prompt-helpers.d.ts +16 -0
- package/dist/competition/shared/prompt-helpers.js +27 -0
- package/dist/competition/shared/prune.d.ts +1 -0
- package/dist/competition/shared/prune.js +4 -0
- package/dist/competition/shared/sandbox-policy.d.ts +9 -0
- package/dist/competition/shared/sandbox-policy.js +7 -0
- package/dist/competition/shared/teardown.d.ts +36 -0
- package/dist/competition/shared/teardown.js +101 -0
- package/dist/configs/agents/defaults.d.ts +31 -2
- package/dist/configs/agents/defaults.js +346 -30
- package/dist/configs/agents/errors.js +14 -11
- package/dist/configs/agents/loader.d.ts +11 -1
- package/dist/configs/agents/loader.js +71 -4
- package/dist/configs/agents/types.js +2 -2
- package/dist/configs/environment/detect.js +9 -4
- package/dist/configs/environment/errors.js +4 -4
- package/dist/configs/environment/loader.d.ts +1 -1
- package/dist/configs/environment/loader.js +3 -3
- package/dist/configs/orchestration/bootstrap.d.ts +16 -0
- package/dist/configs/orchestration/bootstrap.js +122 -0
- package/dist/configs/orchestration/errors.d.ts +15 -0
- package/dist/configs/orchestration/errors.js +28 -0
- package/dist/configs/orchestration/loader.d.ts +9 -0
- package/dist/configs/orchestration/loader.js +148 -0
- package/dist/configs/orchestration/types.d.ts +102 -0
- package/dist/configs/orchestration/types.js +65 -0
- package/dist/configs/sandbox/defaults.js +14 -4
- package/dist/configs/sandbox/errors.d.ts +1 -1
- package/dist/configs/sandbox/errors.js +1 -1
- package/dist/configs/sandbox/loader.js +6 -4
- package/dist/configs/sandbox/schemas.js +4 -2
- package/dist/configs/settings/loader.d.ts +7 -0
- package/dist/configs/settings/loader.js +81 -0
- package/dist/configs/settings/types.d.ts +47 -0
- package/dist/configs/settings/types.js +23 -0
- package/dist/configs/verification/errors.d.ts +11 -0
- package/dist/configs/verification/errors.js +21 -0
- package/dist/configs/verification/loader.d.ts +8 -0
- package/dist/configs/verification/loader.js +43 -0
- package/dist/configs/verification/methods.d.ts +35 -0
- package/dist/configs/verification/methods.js +41 -0
- package/dist/configs/verification/programmatic-defaults.d.ts +10 -0
- package/dist/configs/verification/programmatic-defaults.js +42 -0
- package/dist/configs/verification/programmatic-detect.d.ts +10 -0
- package/dist/configs/{evals/detect.js → verification/programmatic-detect.js} +22 -33
- package/dist/configs/verification/types.d.ts +49 -0
- package/dist/configs/verification/types.js +45 -0
- package/dist/contracts/list.d.ts +207 -0
- package/dist/contracts/list.js +154 -0
- package/dist/domain/interactive/model/types.d.ts +104 -0
- package/dist/domain/interactive/model/types.js +83 -0
- package/dist/domain/interactive/persistence/adapter.d.ts +39 -0
- package/dist/domain/interactive/persistence/adapter.js +144 -0
- package/dist/domain/interactive/prompt.d.ts +3 -0
- package/dist/domain/interactive/prompt.js +7 -0
- package/dist/domain/message/competition/adapter.d.ts +36 -0
- package/dist/domain/message/competition/adapter.js +197 -0
- package/dist/domain/message/competition/prompt.d.ts +8 -0
- package/dist/domain/message/competition/prompt.js +29 -0
- package/dist/domain/message/model/mutators.d.ts +17 -0
- package/dist/domain/message/model/mutators.js +107 -0
- package/dist/domain/message/model/types.d.ts +100 -0
- package/dist/domain/message/model/types.js +87 -0
- package/dist/domain/message/persistence/adapter.d.ts +43 -0
- package/dist/domain/message/persistence/adapter.js +124 -0
- package/dist/domain/reduce/competition/adapter.d.ts +42 -0
- package/dist/domain/reduce/competition/adapter.js +826 -0
- package/dist/domain/reduce/competition/output-validation.d.ts +4 -0
- package/dist/domain/reduce/competition/output-validation.js +18 -0
- package/dist/domain/reduce/competition/prompt.d.ts +10 -0
- package/dist/domain/reduce/competition/prompt.js +96 -0
- package/dist/domain/reduce/competition/reduction.d.ts +9 -0
- package/dist/domain/reduce/competition/reduction.js +32 -0
- package/dist/domain/reduce/model/types.d.ts +122 -0
- package/dist/domain/reduce/model/types.js +84 -0
- package/dist/domain/reduce/persistence/adapter.d.ts +43 -0
- package/dist/domain/reduce/persistence/adapter.js +126 -0
- package/dist/domain/run/competition/adapter.d.ts +30 -0
- package/dist/domain/run/competition/adapter.js +39 -0
- package/dist/domain/run/competition/agent-execution.d.ts +20 -0
- package/dist/domain/run/competition/agent-execution.js +45 -0
- package/dist/domain/run/competition/agent-preparation.d.ts +12 -0
- package/dist/domain/run/competition/agent-preparation.js +24 -0
- package/dist/domain/run/competition/agents/artifacts.d.ts +17 -0
- package/dist/domain/run/competition/agents/artifacts.js +173 -0
- package/dist/{commands/run → domain/run/competition}/agents/lifecycle.d.ts +3 -3
- package/dist/{commands/run → domain/run/competition}/agents/lifecycle.js +84 -64
- package/dist/domain/run/competition/agents/post-processing.d.ts +12 -0
- package/dist/domain/run/competition/agents/post-processing.js +4 -0
- package/dist/domain/run/competition/agents/preparation.js +64 -0
- package/dist/{commands/run → domain/run/competition}/agents/run-context.d.ts +9 -16
- package/dist/{commands/run → domain/run/competition}/agents/run-context.js +22 -70
- package/dist/{commands/run → domain/run/competition}/agents/types.d.ts +10 -13
- package/dist/domain/run/competition/agents/workspace.d.ts +21 -0
- package/dist/domain/run/competition/agents/workspace.js +47 -0
- package/dist/{commands/run → domain/run/competition}/errors.d.ts +8 -1
- package/dist/{commands/run → domain/run/competition}/errors.js +39 -9
- package/dist/{commands/run → domain/run/competition}/phases.d.ts +1 -2
- package/dist/domain/run/competition/phases.js +1 -0
- package/dist/domain/run/competition/prompt.d.ts +7 -0
- package/dist/domain/run/competition/prompt.js +27 -0
- package/dist/{commands/run → domain/run/competition}/reports.d.ts +5 -3
- package/dist/{commands/run → domain/run/competition}/reports.js +7 -19
- package/dist/domain/run/competition/termination-state.d.ts +4 -0
- package/dist/domain/run/competition/termination-state.js +12 -0
- package/dist/{records → domain/run/model}/enhanced.d.ts +6 -7
- package/dist/{records → domain/run/model}/enhanced.js +11 -11
- package/dist/{records → domain/run/model}/errors.d.ts +1 -1
- package/dist/{records → domain/run/model}/errors.js +5 -5
- package/dist/{records → domain/run/model}/mutators.d.ts +4 -3
- package/dist/{records → domain/run/model}/mutators.js +58 -36
- package/dist/domain/run/model/types.d.ts +376 -0
- package/dist/domain/run/model/types.js +192 -0
- package/dist/{records/persistence.d.ts → domain/run/persistence/adapter.d.ts} +9 -3
- package/dist/domain/run/persistence/adapter.js +340 -0
- package/dist/domain/run/persistence/error-mapping.d.ts +2 -0
- package/dist/domain/run/persistence/error-mapping.js +17 -0
- package/dist/domain/shared/lifecycle.d.ts +54 -0
- package/dist/domain/shared/lifecycle.js +165 -0
- package/dist/domain/shared/token-usage.d.ts +21 -0
- package/dist/domain/shared/token-usage.js +38 -0
- package/dist/domain/spec/competition/adapter.d.ts +31 -0
- package/dist/domain/spec/competition/adapter.js +196 -0
- package/dist/domain/spec/competition/prompt.d.ts +11 -0
- package/dist/domain/spec/competition/prompt.js +44 -0
- package/dist/domain/spec/model/output.d.ts +13 -0
- package/dist/domain/spec/model/output.js +36 -0
- package/dist/domain/spec/model/types.d.ts +98 -0
- package/dist/domain/spec/model/types.js +84 -0
- package/dist/domain/spec/persistence/adapter.d.ts +51 -0
- package/dist/domain/spec/persistence/adapter.js +140 -0
- package/dist/domain/verify/blinding/aliases.d.ts +7 -0
- package/dist/domain/verify/blinding/aliases.js +23 -0
- package/dist/domain/verify/competition/adapter.d.ts +54 -0
- package/dist/domain/verify/competition/adapter.js +444 -0
- package/dist/domain/verify/competition/artifacts.d.ts +6 -0
- package/dist/domain/verify/competition/artifacts.js +7 -0
- package/dist/domain/verify/competition/blinding.d.ts +24 -0
- package/dist/domain/verify/competition/blinding.js +109 -0
- package/dist/domain/verify/competition/finalize.d.ts +11 -0
- package/dist/domain/verify/competition/finalize.js +65 -0
- package/dist/domain/verify/competition/programmatic.d.ts +15 -0
- package/dist/domain/verify/competition/programmatic.js +352 -0
- package/dist/domain/verify/competition/prompt.d.ts +19 -0
- package/dist/domain/verify/competition/prompt.js +63 -0
- package/dist/domain/verify/competition/rubric.d.ts +23 -0
- package/dist/domain/verify/competition/rubric.js +77 -0
- package/dist/domain/verify/competition/shared-layout.d.ts +121 -0
- package/dist/domain/verify/competition/shared-layout.js +365 -0
- package/dist/domain/verify/competition/target.d.ts +47 -0
- package/dist/domain/verify/competition/target.js +1 -0
- package/dist/domain/verify/model/mutators.d.ts +16 -0
- package/dist/domain/verify/model/mutators.js +126 -0
- package/dist/domain/verify/model/types.d.ts +408 -0
- package/dist/domain/verify/model/types.js +289 -0
- package/dist/domain/verify/persistence/adapter.d.ts +43 -0
- package/dist/domain/verify/persistence/adapter.js +126 -0
- package/dist/domain/verify/programmatic/runner.d.ts +22 -0
- package/dist/domain/verify/programmatic/runner.js +209 -0
- package/dist/domain/verify/rubric-result.d.ts +28 -0
- package/dist/domain/verify/rubric-result.js +121 -0
- package/dist/extra-context/contract.d.ts +17 -0
- package/dist/extra-context/contract.js +60 -0
- package/dist/interactive/index.d.ts +2 -0
- package/dist/interactive/index.js +1 -0
- package/dist/interactive/providers/launch.d.ts +23 -0
- package/dist/interactive/providers/launch.js +203 -0
- package/dist/interactive/providers/mcp.d.ts +13 -0
- package/dist/interactive/providers/mcp.js +547 -0
- package/dist/interactive/providers/shared.d.ts +2 -0
- package/dist/interactive/providers/shared.js +1 -0
- package/dist/interactive/providers.d.ts +3 -0
- package/dist/interactive/providers.js +3 -0
- package/dist/interactive/records.d.ts +2 -0
- package/dist/interactive/records.js +1 -0
- package/dist/interactive/substrate.d.ts +21 -0
- package/dist/interactive/substrate.js +522 -0
- package/dist/interactive/types.d.ts +101 -0
- package/dist/interactive/types.js +1 -0
- package/dist/mcp/server.d.ts +88 -0
- package/dist/mcp/server.js +790 -0
- package/dist/persistence/error-mapping.d.ts +19 -0
- package/dist/persistence/error-mapping.js +44 -0
- package/dist/persistence/errors.d.ts +26 -0
- package/dist/persistence/errors.js +49 -0
- package/dist/persistence/extra-context.d.ts +9 -0
- package/dist/persistence/extra-context.js +60 -0
- package/dist/{records → persistence}/history-lock.js +2 -2
- package/dist/persistence/record-path-schema.d.ts +3 -0
- package/dist/persistence/record-path-schema.js +16 -0
- package/dist/persistence/session-store.d.ts +92 -0
- package/dist/persistence/session-store.js +412 -0
- package/dist/policy/auto.d.ts +13 -0
- package/dist/policy/auto.js +22 -0
- package/dist/policy/index.d.ts +5 -0
- package/dist/policy/index.js +5 -0
- package/dist/policy/resolution.d.ts +6 -0
- package/dist/policy/resolution.js +23 -0
- package/dist/policy/result.d.ts +53 -0
- package/dist/policy/result.js +15 -0
- package/dist/policy/selector.d.ts +11 -0
- package/dist/policy/selector.js +57 -0
- package/dist/policy/verification.d.ts +77 -0
- package/dist/policy/verification.js +365 -0
- package/dist/policy/verifier-selection.d.ts +13 -0
- package/dist/policy/verifier-selection.js +78 -0
- package/dist/preflight/branch.d.ts +9 -0
- package/dist/preflight/branch.js +48 -0
- package/dist/preflight/errors.d.ts +3 -0
- package/dist/preflight/errors.js +10 -3
- package/dist/preflight/index.d.ts +13 -0
- package/dist/preflight/index.js +43 -8
- package/dist/render/interactions/confirmation.js +4 -2
- package/dist/render/transcripts/apply.js +9 -10
- package/dist/render/transcripts/auto.d.ts +27 -0
- package/dist/render/transcripts/auto.js +21 -0
- package/dist/render/transcripts/init.d.ts +4 -15
- package/dist/render/transcripts/init.js +71 -72
- package/dist/render/transcripts/list.d.ts +10 -1
- package/dist/render/transcripts/list.js +121 -15
- package/dist/render/transcripts/message.d.ts +72 -0
- package/dist/render/transcripts/message.js +362 -0
- package/dist/render/transcripts/prune.d.ts +7 -2
- package/dist/render/transcripts/prune.js +64 -17
- package/dist/render/transcripts/reduce.d.ts +74 -0
- package/dist/render/transcripts/reduce.js +395 -0
- package/dist/render/transcripts/root-launcher.d.ts +19 -0
- package/dist/render/transcripts/root-launcher.js +40 -0
- package/dist/render/transcripts/run.d.ts +35 -6
- package/dist/render/transcripts/run.js +241 -165
- package/dist/render/transcripts/shared.d.ts +2 -0
- package/dist/render/transcripts/shared.js +11 -4
- package/dist/render/transcripts/spec.d.ts +74 -0
- package/dist/render/transcripts/spec.js +394 -0
- package/dist/render/transcripts/stage-progress.d.ts +22 -0
- package/dist/render/transcripts/stage-progress.js +6 -0
- package/dist/render/transcripts/update-check.d.ts +2 -0
- package/dist/render/transcripts/update-check.js +22 -0
- package/dist/render/transcripts/verify.d.ts +74 -0
- package/dist/render/transcripts/verify.js +409 -0
- package/dist/render/utils/agents.d.ts +10 -9
- package/dist/render/utils/agents.js +30 -82
- package/dist/render/utils/badges.d.ts +3 -20
- package/dist/render/utils/badges.js +3 -36
- package/dist/render/utils/duration.d.ts +12 -0
- package/dist/render/utils/duration.js +37 -0
- package/dist/render/utils/interactive-frame.d.ts +6 -0
- package/dist/render/utils/interactive-frame.js +38 -0
- package/dist/render/utils/records.js +4 -4
- package/dist/render/utils/runs.d.ts +3 -9
- package/dist/render/utils/runs.js +16 -48
- package/dist/render/utils/stage-output.d.ts +20 -0
- package/dist/render/utils/stage-output.js +44 -0
- package/dist/render/utils/timezone.d.ts +2 -0
- package/dist/render/utils/timezone.js +42 -0
- package/dist/render/utils/transcript-shell.d.ts +66 -0
- package/dist/render/utils/transcript-shell.js +155 -0
- package/dist/render/utils/transcript.d.ts +7 -1
- package/dist/render/utils/transcript.js +12 -2
- package/dist/render/utils/wrap.d.ts +1 -0
- package/dist/render/utils/wrap.js +20 -0
- package/dist/status/colors.d.ts +2 -3
- package/dist/status/colors.js +3 -3
- package/dist/status/index.d.ts +108 -8
- package/dist/status/index.js +164 -5
- package/dist/update-check/checker.d.ts +24 -0
- package/dist/update-check/checker.js +130 -0
- package/dist/update-check/prompt.d.ts +25 -0
- package/dist/update-check/prompt.js +62 -0
- package/dist/update-check/semver.d.ts +17 -0
- package/dist/update-check/semver.js +36 -0
- package/dist/update-check/state-path.d.ts +8 -0
- package/dist/update-check/state-path.js +18 -0
- package/dist/utils/binaries.js +14 -8
- package/dist/utils/errors.d.ts +3 -1
- package/dist/utils/errors.js +3 -1
- package/dist/utils/git.d.ts +10 -0
- package/dist/utils/git.js +15 -3
- package/dist/utils/output.d.ts +5 -1
- package/dist/utils/output.js +4 -2
- package/dist/utils/process.d.ts +2 -1
- package/dist/utils/process.js +7 -3
- package/dist/utils/session-id.d.ts +1 -0
- package/dist/utils/session-id.js +22 -0
- package/dist/utils/slug.d.ts +2 -0
- package/dist/utils/slug.js +15 -0
- package/dist/utils/voratiq-cli-target.d.ts +9 -0
- package/dist/utils/voratiq-cli-target.js +58 -0
- package/dist/workspace/agents.d.ts +13 -16
- package/dist/workspace/agents.js +22 -147
- package/dist/workspace/chat/artifacts.d.ts +9 -0
- package/dist/workspace/chat/artifacts.js +82 -12
- package/dist/workspace/chat/native-usage.d.ts +13 -0
- package/dist/workspace/chat/native-usage.js +60 -0
- package/dist/workspace/chat/sources.d.ts +9 -5
- package/dist/workspace/chat/sources.js +89 -23
- package/dist/workspace/chat/token-usage-result.d.ts +23 -0
- package/dist/workspace/chat/token-usage-result.js +7 -0
- package/dist/workspace/chat/usage-extractor.d.ts +30 -0
- package/dist/workspace/chat/usage-extractor.js +461 -0
- package/dist/workspace/chat/usage-mappings.d.ts +20 -0
- package/dist/workspace/chat/usage-mappings.js +136 -0
- package/dist/workspace/credential-guard.js +1 -1
- package/dist/workspace/dependencies.js +4 -4
- package/dist/workspace/errors.d.ts +5 -0
- package/dist/workspace/errors.js +13 -3
- package/dist/workspace/layout.d.ts +17 -6
- package/dist/workspace/layout.js +51 -32
- package/dist/workspace/promotion.d.ts +32 -0
- package/dist/workspace/promotion.js +34 -0
- package/dist/workspace/prune.d.ts +1 -1
- package/dist/workspace/run.d.ts +1 -3
- package/dist/workspace/run.js +6 -15
- package/dist/workspace/setup.d.ts +8 -0
- package/dist/workspace/setup.js +359 -56
- package/dist/workspace/shim.js +1 -1
- package/dist/workspace/structure.d.ts +91 -26
- package/dist/workspace/structure.js +227 -43
- package/dist/workspace/templates.d.ts +9 -3
- package/dist/workspace/templates.js +26 -15
- package/dist/workspace/verification-defaults.d.ts +12 -0
- package/dist/workspace/verification-defaults.js +1017 -0
- package/package.json +30 -24
- package/dist/cli/review.d.ts +0 -12
- package/dist/cli/review.js +0 -33
- package/dist/commands/errors.d.ts +0 -4
- package/dist/commands/errors.js +0 -7
- package/dist/commands/init/evals.d.ts +0 -4
- package/dist/commands/init/evals.js +0 -219
- package/dist/commands/review/command.d.ts +0 -10
- package/dist/commands/review/command.js +0 -26
- package/dist/commands/run/agent-execution.d.ts +0 -19
- package/dist/commands/run/agent-execution.js +0 -63
- package/dist/commands/run/agents/auth-stage.d.ts +0 -23
- package/dist/commands/run/agents/auth-stage.js +0 -108
- package/dist/commands/run/agents/chat-preserver.d.ts +0 -9
- package/dist/commands/run/agents/chat-preserver.js +0 -35
- package/dist/commands/run/agents/eval-runner.d.ts +0 -19
- package/dist/commands/run/agents/eval-runner.js +0 -27
- package/dist/commands/run/agents/failures.js +0 -32
- package/dist/commands/run/agents/preparation.js +0 -123
- package/dist/commands/run/agents.d.ts +0 -14
- package/dist/commands/run/agents.js +0 -47
- package/dist/commands/run/prompts.d.ts +0 -4
- package/dist/commands/run/prompts.js +0 -16
- package/dist/commands/run/sandbox-registry.d.ts +0 -4
- package/dist/commands/run/sandbox-registry.js +0 -54
- package/dist/configs/evals/defaults.d.ts +0 -8
- package/dist/configs/evals/defaults.js +0 -28
- package/dist/configs/evals/detect.d.ts +0 -10
- package/dist/configs/evals/errors.d.ts +0 -16
- package/dist/configs/evals/errors.js +0 -29
- package/dist/configs/evals/loader.d.ts +0 -9
- package/dist/configs/evals/loader.js +0 -46
- package/dist/configs/evals/types.d.ts +0 -42
- package/dist/configs/evals/types.js +0 -74
- package/dist/evals/runner.d.ts +0 -16
- package/dist/evals/runner.js +0 -132
- package/dist/records/persistence.js +0 -469
- package/dist/records/types.d.ts +0 -255
- package/dist/records/types.js +0 -160
- package/dist/render/transcripts/review.d.ts +0 -2
- package/dist/render/transcripts/review.js +0 -36
- /package/dist/{commands/run → agents/runtime}/shim/agent-manifest.d.ts +0 -0
- /package/dist/{commands/run → agents/runtime}/shim/agent-manifest.js +0 -0
- /package/dist/{commands/run → agents/runtime/shim}/argv.d.ts +0 -0
- /package/dist/{commands/run → agents/runtime/shim}/argv.js +0 -0
- /package/dist/{commands/run/agents → agents/runtime}/types.js +0 -0
- /package/dist/{commands/run → domain/run/competition}/agents/preparation.d.ts +0 -0
- /package/dist/{commands/run/phases.js → domain/run/competition/agents/types.js} +0 -0
- /package/dist/{commands/run → domain/run/model}/id.d.ts +0 -0
- /package/dist/{commands/run → domain/run/model}/id.js +0 -0
- /package/dist/{records → persistence}/history-lock.d.ts +0 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { isFileSystemError, pathExists } from "../utils/fs.js";
|
|
5
|
+
import { relativeToRoot } from "../utils/path.js";
|
|
6
|
+
import { SessionOptionValidationError, SessionRecordMutationError, SessionRecordNotFoundError, SessionRecordParseError, } from "./errors.js";
|
|
7
|
+
const BUFFER_FLUSH_DELAY_MS = 250;
|
|
8
|
+
export function createSessionStore(config) {
|
|
9
|
+
const buffer = new Map();
|
|
10
|
+
let readRecordsImpl = readRecordsInternal;
|
|
11
|
+
function setReadRecordsImplementation(implementation) {
|
|
12
|
+
readRecordsImpl = implementation;
|
|
13
|
+
}
|
|
14
|
+
function resetReadRecordsImplementation() {
|
|
15
|
+
readRecordsImpl = readRecordsInternal;
|
|
16
|
+
}
|
|
17
|
+
async function readRecordsInternal(options) {
|
|
18
|
+
const { paths, limit, predicate, onWarning } = options;
|
|
19
|
+
if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {
|
|
20
|
+
throw new SessionOptionValidationError("limit", "must be a positive integer");
|
|
21
|
+
}
|
|
22
|
+
let index;
|
|
23
|
+
try {
|
|
24
|
+
index = await readIndex(paths.indexPath);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error instanceof SessionRecordParseError) {
|
|
28
|
+
const displayPath = relativeToRoot(paths.root, paths.indexPath);
|
|
29
|
+
throw new SessionRecordParseError(displayPath, error.details);
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
const matches = [];
|
|
34
|
+
for (let i = index.sessions.length - 1; i >= 0; i -= 1) {
|
|
35
|
+
const entry = index.sessions[i];
|
|
36
|
+
if (!entry) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const sessionId = config.getIndexEntryId(entry);
|
|
40
|
+
const recordPath = join(paths.sessionsDir, sessionId, config.recordFilename);
|
|
41
|
+
try {
|
|
42
|
+
const record = await readRecordFromDisk(recordPath);
|
|
43
|
+
if (predicate && !predicate(record)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
matches.push(record);
|
|
47
|
+
if (limit !== undefined && matches.length >= limit) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof SessionRecordParseError) {
|
|
53
|
+
const warning = {
|
|
54
|
+
kind: "parse-error",
|
|
55
|
+
sessionId,
|
|
56
|
+
recordPath,
|
|
57
|
+
displayPath: relativeToRoot(paths.root, recordPath),
|
|
58
|
+
details: error.details,
|
|
59
|
+
};
|
|
60
|
+
onWarning?.(warning);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (error instanceof SessionRecordNotFoundError) {
|
|
64
|
+
const warning = {
|
|
65
|
+
kind: "missing-record",
|
|
66
|
+
sessionId,
|
|
67
|
+
recordPath,
|
|
68
|
+
displayPath: relativeToRoot(paths.root, recordPath),
|
|
69
|
+
};
|
|
70
|
+
onWarning?.(warning);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return matches;
|
|
77
|
+
}
|
|
78
|
+
async function readRecords(options) {
|
|
79
|
+
return readRecordsImpl(options);
|
|
80
|
+
}
|
|
81
|
+
async function appendRecord(options) {
|
|
82
|
+
const { paths, record } = options;
|
|
83
|
+
const sessionId = config.getRecordId(record);
|
|
84
|
+
const recordDir = join(paths.sessionsDir, sessionId);
|
|
85
|
+
const recordPath = join(recordDir, config.recordFilename);
|
|
86
|
+
const displayPath = relativeToRoot(paths.root, recordPath);
|
|
87
|
+
await mkdir(recordDir, { recursive: true });
|
|
88
|
+
const releaseLock = await config.acquireLock(paths.lockPath);
|
|
89
|
+
try {
|
|
90
|
+
if (await pathExists(recordPath)) {
|
|
91
|
+
throw new SessionRecordMutationError(`Session ${sessionId} already exists at ${displayPath}.`);
|
|
92
|
+
}
|
|
93
|
+
await atomicWriteRecord(recordPath, record);
|
|
94
|
+
await upsertIndexEntry(paths.indexPath, config.buildIndexEntry(record));
|
|
95
|
+
registerBufferEntry({
|
|
96
|
+
key: recordPath,
|
|
97
|
+
sessionId,
|
|
98
|
+
recordPath,
|
|
99
|
+
lockPath: paths.lockPath,
|
|
100
|
+
sessionsDir: paths.sessionsDir,
|
|
101
|
+
indexPath: paths.indexPath,
|
|
102
|
+
root: paths.root,
|
|
103
|
+
record,
|
|
104
|
+
lastPersistedStatus: config.getRecordStatus(record),
|
|
105
|
+
dirty: false,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof SessionRecordMutationError) {
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
if (isFileSystemError(error)) {
|
|
113
|
+
throw new SessionRecordMutationError(`Failed to initialize session history at ${displayPath}: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
await releaseLock();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function rewriteRecord(options) {
|
|
122
|
+
const { paths, sessionId, mutate, forceFlush = false } = options;
|
|
123
|
+
const recordPath = join(paths.sessionsDir, sessionId, config.recordFilename);
|
|
124
|
+
const entry = await getOrLoadBufferEntry({
|
|
125
|
+
key: recordPath,
|
|
126
|
+
sessionId,
|
|
127
|
+
recordPath,
|
|
128
|
+
lockPath: paths.lockPath,
|
|
129
|
+
sessionsDir: paths.sessionsDir,
|
|
130
|
+
indexPath: paths.indexPath,
|
|
131
|
+
root: paths.root,
|
|
132
|
+
});
|
|
133
|
+
const mutated = mutate(entry.record);
|
|
134
|
+
if (config.getRecordId(mutated) !== sessionId) {
|
|
135
|
+
throw new SessionRecordMutationError(`Refusing to change session identifier while rewriting history for ${sessionId}.`);
|
|
136
|
+
}
|
|
137
|
+
entry.record = mutated;
|
|
138
|
+
entry.dirty = true;
|
|
139
|
+
if (forceFlush || config.shouldForceFlush(entry.record)) {
|
|
140
|
+
await flushBufferEntry(entry, { force: true });
|
|
141
|
+
await disposeBufferEntry(entry);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
scheduleBufferFlush(entry);
|
|
145
|
+
}
|
|
146
|
+
return mutated;
|
|
147
|
+
}
|
|
148
|
+
async function getRecordSnapshot(options) {
|
|
149
|
+
const { paths, sessionId } = options;
|
|
150
|
+
const recordPath = join(paths.sessionsDir, sessionId, config.recordFilename);
|
|
151
|
+
const buffered = buffer.get(recordPath);
|
|
152
|
+
if (buffered) {
|
|
153
|
+
return structuredClone(buffered.record);
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
return await readRecordFromDisk(recordPath);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error instanceof SessionRecordNotFoundError) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function flushAllRecordBuffers() {
|
|
166
|
+
const entries = Array.from(buffer.values());
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
await flushBufferEntry(entry, { force: true });
|
|
169
|
+
await disposeBufferEntry(entry);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function disposeRecordBuffer(options) {
|
|
173
|
+
const { paths, sessionId } = options;
|
|
174
|
+
const recordPath = join(paths.sessionsDir, sessionId, config.recordFilename);
|
|
175
|
+
const entry = buffer.get(recordPath);
|
|
176
|
+
if (!entry) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
await disposeBufferEntry(entry);
|
|
180
|
+
}
|
|
181
|
+
async function flushRecordBuffer(options) {
|
|
182
|
+
const { paths, sessionId } = options;
|
|
183
|
+
const recordPath = join(paths.sessionsDir, sessionId, config.recordFilename);
|
|
184
|
+
const entry = buffer.get(recordPath);
|
|
185
|
+
if (!entry) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
await flushBufferEntry(entry, { force: true });
|
|
189
|
+
await disposeBufferEntry(entry);
|
|
190
|
+
}
|
|
191
|
+
function snapshotRecordBuffers() {
|
|
192
|
+
return Array.from(buffer.values()).map((entry) => ({
|
|
193
|
+
key: entry.key,
|
|
194
|
+
sessionId: entry.sessionId,
|
|
195
|
+
hasFlushTimer: Boolean(entry.flushTimer),
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
function registerBufferEntry(entry) {
|
|
199
|
+
buffer.set(entry.key, entry);
|
|
200
|
+
}
|
|
201
|
+
async function getOrLoadBufferEntry(template) {
|
|
202
|
+
const existing = buffer.get(template.key);
|
|
203
|
+
if (existing) {
|
|
204
|
+
return existing;
|
|
205
|
+
}
|
|
206
|
+
const record = await readRecordFromDisk(template.recordPath);
|
|
207
|
+
const entry = {
|
|
208
|
+
...template,
|
|
209
|
+
record,
|
|
210
|
+
lastPersistedStatus: config.getRecordStatus(record),
|
|
211
|
+
dirty: false,
|
|
212
|
+
};
|
|
213
|
+
buffer.set(template.key, entry);
|
|
214
|
+
return entry;
|
|
215
|
+
}
|
|
216
|
+
function scheduleBufferFlush(entry) {
|
|
217
|
+
if (entry.flushTimer) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const timer = setTimeout(() => {
|
|
221
|
+
entry.flushTimer = undefined;
|
|
222
|
+
void flushBufferEntry(entry).catch((error) => {
|
|
223
|
+
console.warn(`[voratiq] Failed to flush session ${entry.sessionId} history: ${error.message}`);
|
|
224
|
+
});
|
|
225
|
+
}, BUFFER_FLUSH_DELAY_MS);
|
|
226
|
+
if (typeof timer.unref === "function") {
|
|
227
|
+
timer.unref();
|
|
228
|
+
}
|
|
229
|
+
entry.flushTimer = timer;
|
|
230
|
+
}
|
|
231
|
+
async function flushBufferEntry(entry, options = {}) {
|
|
232
|
+
const { force = false } = options;
|
|
233
|
+
if (!entry.dirty && !force) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (entry.flushPromise) {
|
|
237
|
+
await entry.flushPromise;
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
if (entry.flushTimer) {
|
|
241
|
+
clearTimeout(entry.flushTimer);
|
|
242
|
+
entry.flushTimer = undefined;
|
|
243
|
+
}
|
|
244
|
+
await mkdir(entry.sessionsDir, { recursive: true });
|
|
245
|
+
await mkdir(dirname(entry.recordPath), { recursive: true });
|
|
246
|
+
const promise = (async () => {
|
|
247
|
+
const release = await config.acquireLock(entry.lockPath);
|
|
248
|
+
try {
|
|
249
|
+
let recordToPersist = entry.record;
|
|
250
|
+
if (config.mergeRecordOnFlush) {
|
|
251
|
+
const diskRecord = await tryReadRecordForMerge(entry);
|
|
252
|
+
recordToPersist = config.mergeRecordOnFlush(recordToPersist, diskRecord);
|
|
253
|
+
if (config.getRecordId(recordToPersist) !== entry.sessionId) {
|
|
254
|
+
throw new SessionRecordMutationError(`Refusing to change session identifier while flushing history for ${entry.sessionId}.`);
|
|
255
|
+
}
|
|
256
|
+
entry.record = recordToPersist;
|
|
257
|
+
}
|
|
258
|
+
await atomicWriteRecord(entry.recordPath, recordToPersist);
|
|
259
|
+
entry.dirty = false;
|
|
260
|
+
const currentStatus = config.getRecordStatus(recordToPersist);
|
|
261
|
+
if (entry.lastPersistedStatus !== currentStatus) {
|
|
262
|
+
await upsertIndexEntry(entry.indexPath, config.buildIndexEntry(recordToPersist));
|
|
263
|
+
entry.lastPersistedStatus = currentStatus;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
await release();
|
|
268
|
+
}
|
|
269
|
+
})();
|
|
270
|
+
entry.flushPromise = promise;
|
|
271
|
+
try {
|
|
272
|
+
await promise;
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
entry.flushPromise = undefined;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async function disposeBufferEntry(entry) {
|
|
279
|
+
const current = buffer.get(entry.key);
|
|
280
|
+
if (!current || current !== entry) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (entry.flushTimer) {
|
|
284
|
+
clearTimeout(entry.flushTimer);
|
|
285
|
+
entry.flushTimer = undefined;
|
|
286
|
+
}
|
|
287
|
+
if (entry.flushPromise) {
|
|
288
|
+
await entry.flushPromise;
|
|
289
|
+
}
|
|
290
|
+
buffer.delete(entry.key);
|
|
291
|
+
}
|
|
292
|
+
async function readRecordFromDisk(path) {
|
|
293
|
+
try {
|
|
294
|
+
const raw = await readFile(path, "utf8");
|
|
295
|
+
return config.parseRecord({ path, raw });
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
if (isFileSystemError(error) && error.code === "ENOENT") {
|
|
299
|
+
const sessionId = extractIdFromPath(path);
|
|
300
|
+
throw new SessionRecordNotFoundError(sessionId);
|
|
301
|
+
}
|
|
302
|
+
if (error instanceof SyntaxError) {
|
|
303
|
+
throw new SessionRecordParseError(path, error.message);
|
|
304
|
+
}
|
|
305
|
+
throw error;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async function tryReadRecordForMerge(entry) {
|
|
309
|
+
try {
|
|
310
|
+
const raw = await readFile(entry.recordPath, "utf8");
|
|
311
|
+
return config.parseRecord({ path: entry.recordPath, raw });
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
if (isFileSystemError(error) && error.code === "ENOENT") {
|
|
315
|
+
return undefined;
|
|
316
|
+
}
|
|
317
|
+
const displayPath = relativeToRoot(entry.root, entry.recordPath);
|
|
318
|
+
const detail = error instanceof Error
|
|
319
|
+
? error.message
|
|
320
|
+
: typeof error === "string"
|
|
321
|
+
? error
|
|
322
|
+
: "unknown error";
|
|
323
|
+
console.warn(`[voratiq] Failed to read existing session record at ${displayPath} while merging flush for ${entry.sessionId}: ${detail}`);
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function extractIdFromPath(path) {
|
|
328
|
+
if (config.extractIdFromRecordPath) {
|
|
329
|
+
return config.extractIdFromRecordPath(path);
|
|
330
|
+
}
|
|
331
|
+
const segments = path.split(/[/\\]/);
|
|
332
|
+
const sessionIdIndex = segments.length - 2;
|
|
333
|
+
return segments[sessionIdIndex] ?? "unknown";
|
|
334
|
+
}
|
|
335
|
+
async function atomicWriteRecord(path, payload) {
|
|
336
|
+
const dir = dirname(path);
|
|
337
|
+
const tempPath = join(dir, `${randomBytes(8).toString("hex")}.tmp`);
|
|
338
|
+
const serialized = config.serializeRecord
|
|
339
|
+
? config.serializeRecord(payload)
|
|
340
|
+
: `${JSON.stringify(payload, null, 2)}\n`;
|
|
341
|
+
await writeFile(tempPath, serialized, { encoding: "utf8" });
|
|
342
|
+
await rename(tempPath, path);
|
|
343
|
+
}
|
|
344
|
+
async function readIndex(path) {
|
|
345
|
+
try {
|
|
346
|
+
const raw = await readFile(path, "utf8");
|
|
347
|
+
const trimmed = raw.trim();
|
|
348
|
+
if (!trimmed) {
|
|
349
|
+
return { version: config.indexVersion, sessions: [] };
|
|
350
|
+
}
|
|
351
|
+
const parsed = JSON.parse(trimmed);
|
|
352
|
+
const sessions = config.readIndexEntries
|
|
353
|
+
? config.readIndexEntries(parsed)
|
|
354
|
+
: Array.isArray(parsed.sessions)
|
|
355
|
+
? (parsed.sessions ?? [])
|
|
356
|
+
: [];
|
|
357
|
+
return {
|
|
358
|
+
version: typeof parsed.version === "number"
|
|
359
|
+
? parsed.version
|
|
360
|
+
: config.indexVersion,
|
|
361
|
+
sessions,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
if (isFileSystemError(error) && error.code === "ENOENT") {
|
|
366
|
+
return { version: config.indexVersion, sessions: [] };
|
|
367
|
+
}
|
|
368
|
+
if (error instanceof SyntaxError) {
|
|
369
|
+
throw new SessionRecordParseError(path, error.message);
|
|
370
|
+
}
|
|
371
|
+
throw error;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
async function upsertIndexEntry(indexPath, entry) {
|
|
375
|
+
const payload = await readIndex(indexPath);
|
|
376
|
+
const incomingId = config.getIndexEntryId(entry);
|
|
377
|
+
const existingIndex = payload.sessions.findIndex((session) => config.getIndexEntryId(session) === incomingId);
|
|
378
|
+
if (existingIndex >= 0) {
|
|
379
|
+
const existing = payload.sessions[existingIndex];
|
|
380
|
+
payload.sessions[existingIndex] = config.mergeIndexEntry
|
|
381
|
+
? config.mergeIndexEntry(existing, entry)
|
|
382
|
+
: { ...existing, ...entry };
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
payload.sessions.push(entry);
|
|
386
|
+
}
|
|
387
|
+
payload.version = config.indexVersion;
|
|
388
|
+
const serializedPayload = config.buildIndexPayload
|
|
389
|
+
? config.buildIndexPayload(payload.sessions, payload.version)
|
|
390
|
+
: { version: payload.version, sessions: payload.sessions };
|
|
391
|
+
await atomicWriteIndex(indexPath, serializedPayload);
|
|
392
|
+
}
|
|
393
|
+
async function atomicWriteIndex(path, payload) {
|
|
394
|
+
const dir = dirname(path);
|
|
395
|
+
const tempPath = join(dir, `${randomBytes(8).toString("hex")}.tmp`);
|
|
396
|
+
const serialized = `${JSON.stringify(payload, null, 2)}\n`;
|
|
397
|
+
await writeFile(tempPath, serialized, { encoding: "utf8" });
|
|
398
|
+
await rename(tempPath, path);
|
|
399
|
+
}
|
|
400
|
+
return {
|
|
401
|
+
readRecords,
|
|
402
|
+
appendRecord,
|
|
403
|
+
rewriteRecord,
|
|
404
|
+
getRecordSnapshot,
|
|
405
|
+
flushAllRecordBuffers,
|
|
406
|
+
disposeRecordBuffer,
|
|
407
|
+
flushRecordBuffer,
|
|
408
|
+
snapshotRecordBuffers,
|
|
409
|
+
setReadRecordsImplementation,
|
|
410
|
+
resetReadRecordsImplementation,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SelectionDecision } from "./result.js";
|
|
2
|
+
export interface AutoVerificationSelectionProceed {
|
|
3
|
+
kind: "proceed";
|
|
4
|
+
}
|
|
5
|
+
export interface AutoVerificationSelectionActionRequired {
|
|
6
|
+
kind: "action_required";
|
|
7
|
+
detail: string;
|
|
8
|
+
}
|
|
9
|
+
export type AutoVerificationSelectionDisposition = AutoVerificationSelectionProceed | AutoVerificationSelectionActionRequired;
|
|
10
|
+
export declare function classifyAutoVerificationSelection(options: {
|
|
11
|
+
targetKind: "spec" | "run";
|
|
12
|
+
selection?: SelectionDecision;
|
|
13
|
+
}): AutoVerificationSelectionDisposition;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function classifyAutoVerificationSelection(options) {
|
|
2
|
+
const { targetKind, selection } = options;
|
|
3
|
+
if (selection?.state === "resolvable") {
|
|
4
|
+
return { kind: "proceed" };
|
|
5
|
+
}
|
|
6
|
+
return {
|
|
7
|
+
kind: "action_required",
|
|
8
|
+
detail: describeActionRequiredSelection({ targetKind, selection }),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function describeActionRequiredSelection(options) {
|
|
12
|
+
const { targetKind, selection } = options;
|
|
13
|
+
if (selection?.state === "unresolved" &&
|
|
14
|
+
selection.unresolvedReasons.some((reason) => reason.code === "verifier_disagreement")) {
|
|
15
|
+
return targetKind === "spec"
|
|
16
|
+
? "Verifiers disagreed on the preferred draft; manual selection required."
|
|
17
|
+
: "Verifiers disagreed on the preferred candidate; manual selection required.";
|
|
18
|
+
}
|
|
19
|
+
return targetKind === "spec"
|
|
20
|
+
? "Verification did not select a draft; manual selection required."
|
|
21
|
+
: "Verification did not produce a resolvable candidate; manual selection required.";
|
|
22
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { type AutoVerificationSelectionActionRequired, type AutoVerificationSelectionDisposition, type AutoVerificationSelectionProceed, classifyAutoVerificationSelection, } from "./auto.js";
|
|
2
|
+
export { buildResolvableSelectionDecision, buildUnresolvedSelectionDecision, type ResolvableSelectionDecision, type SelectionDecision, type SelectionDecisionUnresolvedReason, type SelectorResolutionMatch, type UnresolvedSelectionDecision, type VerifierAgreementSelection, } from "./result.js";
|
|
3
|
+
export { deriveSelectorSelectionDecision, type SelectorResolutionInput, type SelectorResolutionSourceInput, } from "./selector.js";
|
|
4
|
+
export { buildVerificationSelectorSource, DEFAULT_VERIFICATION_WINNER_POLICY, deriveVerificationSelectionDecision, loadVerificationPolicyInput, loadVerificationSelectionInput, loadVerificationSelectionPolicyOutput, type StageVerificationUnanimityWinnerPolicy, type VerificationPolicyInput, type VerificationPolicyProgrammaticCandidateInput, type VerificationPolicyProgrammaticInput, type VerificationPolicyRubricInput, type VerificationSelectionInput, type VerificationSelectionPolicyOutput, type VerificationSelectionProgrammaticCandidateInput, type VerificationWinnerPolicy, } from "./verification.js";
|
|
5
|
+
export { deriveVerifierSelectionDecision, type VerifierSelectionReviewerInput, } from "./verifier-selection.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { classifyAutoVerificationSelection, } from "./auto.js";
|
|
2
|
+
export { buildResolvableSelectionDecision, buildUnresolvedSelectionDecision, } from "./result.js";
|
|
3
|
+
export { deriveSelectorSelectionDecision, } from "./selector.js";
|
|
4
|
+
export { buildVerificationSelectorSource, DEFAULT_VERIFICATION_WINNER_POLICY, deriveVerificationSelectionDecision, loadVerificationPolicyInput, loadVerificationSelectionInput, loadVerificationSelectionPolicyOutput, } from "./verification.js";
|
|
5
|
+
export { deriveVerifierSelectionDecision, } from "./verifier-selection.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function normalizeCandidateSelector(selector?: string): string | undefined;
|
|
2
|
+
export declare function resolveCanonicalAgentId(options: {
|
|
3
|
+
selectors: readonly (string | undefined)[];
|
|
4
|
+
canonicalAgentIds: readonly string[];
|
|
5
|
+
aliasMap?: Readonly<Record<string, string>>;
|
|
6
|
+
}): string | undefined;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function normalizeCandidateSelector(selector) {
|
|
2
|
+
const normalized = selector?.trim();
|
|
3
|
+
return normalized && normalized.length > 0 ? normalized : undefined;
|
|
4
|
+
}
|
|
5
|
+
export function resolveCanonicalAgentId(options) {
|
|
6
|
+
const { selectors, canonicalAgentIds, aliasMap } = options;
|
|
7
|
+
const canonicalAgentSet = new Set(canonicalAgentIds);
|
|
8
|
+
for (const selector of selectors) {
|
|
9
|
+
const normalizedSelector = normalizeCandidateSelector(selector);
|
|
10
|
+
if (!normalizedSelector) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (canonicalAgentSet.has(normalizedSelector)) {
|
|
14
|
+
return normalizedSelector;
|
|
15
|
+
}
|
|
16
|
+
const aliasedCanonicalAgentId = aliasMap?.[normalizedSelector];
|
|
17
|
+
if (aliasedCanonicalAgentId &&
|
|
18
|
+
canonicalAgentSet.has(aliasedCanonicalAgentId)) {
|
|
19
|
+
return aliasedCanonicalAgentId;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface VerifierAgreementSelection {
|
|
2
|
+
verifierAgentId: string;
|
|
3
|
+
selectedCanonicalAgentId: string;
|
|
4
|
+
}
|
|
5
|
+
export interface SelectorResolutionMatch {
|
|
6
|
+
sourceId: string;
|
|
7
|
+
selectedCanonicalAgentId: string;
|
|
8
|
+
}
|
|
9
|
+
export type SelectionDecisionUnresolvedReason = {
|
|
10
|
+
code: "no_successful_verifiers";
|
|
11
|
+
failedVerifierAgentIds: readonly string[];
|
|
12
|
+
} | {
|
|
13
|
+
code: "verifier_failed";
|
|
14
|
+
failedVerifierAgentIds: readonly string[];
|
|
15
|
+
} | {
|
|
16
|
+
code: "verifier_preference_missing";
|
|
17
|
+
verifierAgentId: string;
|
|
18
|
+
} | {
|
|
19
|
+
code: "verifier_preference_unresolved";
|
|
20
|
+
verifierAgentId: string;
|
|
21
|
+
preferredCandidateId?: string;
|
|
22
|
+
resolvedPreferredCandidateId?: string;
|
|
23
|
+
} | {
|
|
24
|
+
code: "verifier_disagreement";
|
|
25
|
+
selections: readonly VerifierAgreementSelection[];
|
|
26
|
+
} | {
|
|
27
|
+
code: "selector_unresolved";
|
|
28
|
+
selector: string;
|
|
29
|
+
availableCanonicalAgentIds: readonly string[];
|
|
30
|
+
availableAliases: readonly string[];
|
|
31
|
+
} | {
|
|
32
|
+
code: "selector_ambiguous";
|
|
33
|
+
selector: string;
|
|
34
|
+
resolutions: readonly SelectorResolutionMatch[];
|
|
35
|
+
} | {
|
|
36
|
+
code: "selected_candidate_failed_programmatic";
|
|
37
|
+
selectedCanonicalAgentId: string;
|
|
38
|
+
eligibleCanonicalAgentIds: readonly string[];
|
|
39
|
+
};
|
|
40
|
+
export interface ResolvableSelectionDecision {
|
|
41
|
+
state: "resolvable";
|
|
42
|
+
applyable: true;
|
|
43
|
+
selectedCanonicalAgentId: string;
|
|
44
|
+
unresolvedReasons: readonly [];
|
|
45
|
+
}
|
|
46
|
+
export interface UnresolvedSelectionDecision {
|
|
47
|
+
state: "unresolved";
|
|
48
|
+
applyable: false;
|
|
49
|
+
unresolvedReasons: readonly SelectionDecisionUnresolvedReason[];
|
|
50
|
+
}
|
|
51
|
+
export type SelectionDecision = ResolvableSelectionDecision | UnresolvedSelectionDecision;
|
|
52
|
+
export declare function buildResolvableSelectionDecision(selectedCanonicalAgentId: string): ResolvableSelectionDecision;
|
|
53
|
+
export declare function buildUnresolvedSelectionDecision(unresolvedReasons: readonly SelectionDecisionUnresolvedReason[]): UnresolvedSelectionDecision;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function buildResolvableSelectionDecision(selectedCanonicalAgentId) {
|
|
2
|
+
return {
|
|
3
|
+
state: "resolvable",
|
|
4
|
+
applyable: true,
|
|
5
|
+
selectedCanonicalAgentId,
|
|
6
|
+
unresolvedReasons: [],
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function buildUnresolvedSelectionDecision(unresolvedReasons) {
|
|
10
|
+
return {
|
|
11
|
+
state: "unresolved",
|
|
12
|
+
applyable: false,
|
|
13
|
+
unresolvedReasons,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type SelectionDecision } from "./result.js";
|
|
2
|
+
export interface SelectorResolutionSourceInput {
|
|
3
|
+
sourceId: string;
|
|
4
|
+
aliasMap: Readonly<Record<string, string>>;
|
|
5
|
+
}
|
|
6
|
+
export interface SelectorResolutionInput {
|
|
7
|
+
selector: string;
|
|
8
|
+
canonicalAgentIds: readonly string[];
|
|
9
|
+
sources: readonly SelectorResolutionSourceInput[];
|
|
10
|
+
}
|
|
11
|
+
export declare function deriveSelectorSelectionDecision(input: SelectorResolutionInput): SelectionDecision;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { normalizeCandidateSelector, resolveCanonicalAgentId, } from "./resolution.js";
|
|
2
|
+
import { buildResolvableSelectionDecision, buildUnresolvedSelectionDecision, } from "./result.js";
|
|
3
|
+
export function deriveSelectorSelectionDecision(input) {
|
|
4
|
+
const selector = normalizeCandidateSelector(input.selector) ?? "";
|
|
5
|
+
const canonicalMatch = resolveCanonicalAgentId({
|
|
6
|
+
selectors: [selector],
|
|
7
|
+
canonicalAgentIds: input.canonicalAgentIds,
|
|
8
|
+
});
|
|
9
|
+
if (canonicalMatch) {
|
|
10
|
+
return buildResolvableSelectionDecision(canonicalMatch);
|
|
11
|
+
}
|
|
12
|
+
const availableAliases = new Set();
|
|
13
|
+
const matchesByKey = new Map();
|
|
14
|
+
for (const source of input.sources) {
|
|
15
|
+
for (const alias of Object.keys(source.aliasMap)) {
|
|
16
|
+
availableAliases.add(alias);
|
|
17
|
+
}
|
|
18
|
+
const selectedCanonicalAgentId = resolveCanonicalAgentId({
|
|
19
|
+
selectors: [selector],
|
|
20
|
+
canonicalAgentIds: input.canonicalAgentIds,
|
|
21
|
+
aliasMap: source.aliasMap,
|
|
22
|
+
});
|
|
23
|
+
if (!selectedCanonicalAgentId) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const match = {
|
|
27
|
+
sourceId: source.sourceId,
|
|
28
|
+
selectedCanonicalAgentId,
|
|
29
|
+
};
|
|
30
|
+
matchesByKey.set(`${match.sourceId}:${match.selectedCanonicalAgentId}`, match);
|
|
31
|
+
}
|
|
32
|
+
const matches = Array.from(matchesByKey.values()).sort((left, right) => left.sourceId.localeCompare(right.sourceId));
|
|
33
|
+
const uniqueMatches = new Set(matches.map((match) => match.selectedCanonicalAgentId));
|
|
34
|
+
if (uniqueMatches.size === 1) {
|
|
35
|
+
const selectedCanonicalAgentId = matches[0]?.selectedCanonicalAgentId;
|
|
36
|
+
if (selectedCanonicalAgentId) {
|
|
37
|
+
return buildResolvableSelectionDecision(selectedCanonicalAgentId);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (uniqueMatches.size > 1) {
|
|
41
|
+
return buildUnresolvedSelectionDecision([
|
|
42
|
+
{
|
|
43
|
+
code: "selector_ambiguous",
|
|
44
|
+
selector,
|
|
45
|
+
resolutions: matches,
|
|
46
|
+
},
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
return buildUnresolvedSelectionDecision([
|
|
50
|
+
{
|
|
51
|
+
code: "selector_unresolved",
|
|
52
|
+
selector,
|
|
53
|
+
availableCanonicalAgentIds: [...input.canonicalAgentIds],
|
|
54
|
+
availableAliases: Array.from(availableAliases).sort((left, right) => left.localeCompare(right)),
|
|
55
|
+
},
|
|
56
|
+
]);
|
|
57
|
+
}
|