@bjoernrochel/sevro 0.1.0-rc.8 → 1.1.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/CONTRIBUTING.md +52 -6
- package/README.md +12 -7
- package/dist/examples/basic/graded.json +13 -0
- package/dist/examples/basic/host.js +9 -0
- package/dist/examples/basic/host.js.map +1 -0
- package/dist/examples/basic/prompt-only.json +7 -0
- package/dist/examples/recipes/candidate.js +23 -0
- package/dist/examples/recipes/candidate.js.map +1 -0
- package/dist/examples/recipes/cases/coding-change.json +21 -0
- package/dist/examples/recipes/cases/host-tools.json +21 -0
- package/dist/examples/recipes/cases/mise.json +21 -0
- package/dist/examples/recipes/cases/node.json +21 -0
- package/dist/examples/recipes/cases/python-uv.json +21 -0
- package/dist/examples/recipes/cases/semantic.json +17 -0
- package/dist/examples/recipes/coding-change/check.js +16 -0
- package/dist/examples/recipes/coding-change/check.js.map +1 -0
- package/dist/examples/recipes/executable.js +20 -0
- package/dist/examples/recipes/executable.js.map +1 -0
- package/dist/examples/recipes/extension-artifacts.js +56 -0
- package/dist/examples/recipes/extension-artifacts.js.map +1 -0
- package/dist/examples/recipes/extension-methods.js +167 -0
- package/dist/examples/recipes/extension-methods.js.map +1 -0
- package/dist/examples/recipes/extension.js +28 -0
- package/dist/examples/recipes/extension.js.map +1 -0
- package/dist/examples/recipes/modules.js +9 -0
- package/dist/examples/recipes/modules.js.map +1 -0
- package/dist/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
- package/dist/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
- package/dist/examples/recipes/repository-skill/README.md +3 -0
- package/dist/examples/recipes/run-inputs.js +144 -0
- package/dist/examples/recipes/run-inputs.js.map +1 -0
- package/dist/examples/recipes/run-options.js +103 -0
- package/dist/examples/recipes/run-options.js.map +1 -0
- package/dist/examples/recipes/run.js +62 -0
- package/dist/examples/recipes/run.js.map +1 -0
- package/dist/examples/recipes/runtime/empty.json +1 -0
- package/dist/examples/recipes/runtime/goals.json +1 -0
- package/dist/examples/recipes/runtime/mise.json +6 -0
- package/dist/examples/recipes/runtime/path.json +1 -0
- package/dist/examples/recipes/runtime/plugins.json +4 -0
- package/dist/examples/recipes/runtime/python-uv.json +10 -0
- package/dist/examples/recipes/semantic-judge.js +27 -0
- package/dist/examples/recipes/semantic-judge.js.map +1 -0
- package/dist/examples/templates/coding/adapter.js +14 -0
- package/dist/examples/templates/coding/adapter.js.map +1 -0
- package/dist/examples/templates/coding/case.json +15 -0
- package/dist/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
- package/dist/examples/templates/repository-skill/extension-data.js +61 -0
- package/dist/examples/templates/repository-skill/extension-data.js.map +1 -0
- package/dist/examples/templates/repository-skill/extension.js +29 -0
- package/dist/examples/templates/repository-skill/extension.js.map +1 -0
- package/dist/examples/templates/response/adapter.js +13 -0
- package/dist/examples/templates/response/adapter.js.map +1 -0
- package/dist/examples/templates/response/case.json +13 -0
- package/dist/src/advisory.js +86 -0
- package/dist/src/advisory.js.map +1 -0
- package/dist/src/candidate-artifacts.js +139 -0
- package/dist/src/candidate-artifacts.js.map +1 -0
- package/dist/src/candidate-codex-state.js +110 -0
- package/dist/src/candidate-codex-state.js.map +1 -0
- package/dist/src/case-validation.js +92 -0
- package/dist/src/case-validation.js.map +1 -0
- package/dist/src/cli/cancellation.js +21 -0
- package/dist/src/cli/cancellation.js.map +1 -0
- package/dist/src/cli/command.js +60 -0
- package/dist/src/cli/command.js.map +1 -0
- package/dist/src/cli/completion.js +14 -0
- package/dist/src/cli/completion.js.map +1 -0
- package/dist/src/cli/demo.js +45 -0
- package/dist/src/cli/demo.js.map +1 -0
- package/dist/src/cli/evaluation.js +40 -0
- package/dist/src/cli/evaluation.js.map +1 -0
- package/dist/src/cli/extension.js +54 -0
- package/dist/src/cli/extension.js.map +1 -0
- package/dist/src/cli/help.js +190 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hosts.js +33 -0
- package/dist/src/cli/hosts.js.map +1 -0
- package/dist/src/cli/init-settings.js +29 -0
- package/dist/src/cli/init-settings.js.map +1 -0
- package/dist/src/cli/init.js +82 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/invocation.js +431 -0
- package/dist/src/cli/invocation.js.map +1 -0
- package/dist/src/cli/loading.js +110 -0
- package/dist/src/cli/loading.js.map +1 -0
- package/dist/src/cli/preparation.js +88 -0
- package/dist/src/cli/preparation.js.map +1 -0
- package/dist/src/cli/presentation.js +61 -0
- package/dist/src/cli/presentation.js.map +1 -0
- package/dist/src/cli/progress.js +5 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/run-manifest.js +108 -0
- package/dist/src/cli/run-manifest.js.map +1 -0
- package/dist/src/cli/run-options.js +367 -0
- package/dist/src/cli/run-options.js.map +1 -0
- package/dist/src/cli/run-overrides.js +51 -0
- package/dist/src/cli/run-overrides.js.map +1 -0
- package/dist/src/cli/settings.js +127 -0
- package/dist/src/cli/settings.js.map +1 -0
- package/dist/src/cli/summary.js +28 -0
- package/dist/src/cli/summary.js.map +1 -0
- package/dist/src/cli.js +20 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/contract-types.js +2 -0
- package/dist/src/contract-types.js.map +1 -0
- package/dist/src/engine.js +4 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/evaluation/advisory.js +85 -0
- package/dist/src/evaluation/advisory.js.map +1 -0
- package/dist/src/evaluation/check-plan.js +292 -0
- package/dist/src/evaluation/check-plan.js.map +1 -0
- package/dist/src/evaluation/collection.js +61 -0
- package/dist/src/evaluation/collection.js.map +1 -0
- package/dist/src/evaluation/context.js +2 -0
- package/dist/src/evaluation/context.js.map +1 -0
- package/dist/src/evaluation/grading-host.js +28 -0
- package/dist/src/evaluation/grading-host.js.map +1 -0
- package/dist/src/evaluation/grading.js +154 -0
- package/dist/src/evaluation/grading.js.map +1 -0
- package/dist/src/evaluation/invocation-plan.js +312 -0
- package/dist/src/evaluation/invocation-plan.js.map +1 -0
- package/dist/src/evaluation/plan.js +376 -0
- package/dist/src/evaluation/plan.js.map +1 -0
- package/dist/src/evaluation/progress.js +14 -0
- package/dist/src/evaluation/progress.js.map +1 -0
- package/dist/src/evaluation/resources.js +159 -0
- package/dist/src/evaluation/resources.js.map +1 -0
- package/dist/src/evaluation/run.js +148 -0
- package/dist/src/evaluation/run.js.map +1 -0
- package/dist/src/evaluation/scheduler.js +27 -0
- package/dist/src/evaluation/scheduler.js.map +1 -0
- package/dist/src/evaluation/semantic.js +183 -0
- package/dist/src/evaluation/semantic.js.map +1 -0
- package/dist/src/evaluation/trial.js +593 -0
- package/dist/src/evaluation/trial.js.map +1 -0
- package/dist/src/evaluation/types.js +20 -0
- package/dist/src/evaluation/types.js.map +1 -0
- package/dist/src/evidence/host-results.js +67 -0
- package/dist/src/evidence/host-results.js.map +1 -0
- package/dist/src/evidence/retained-artifacts.js +17 -0
- package/dist/src/evidence/retained-artifacts.js.map +1 -0
- package/dist/src/evidence/trial-writer.js +131 -0
- package/dist/src/evidence/trial-writer.js.map +1 -0
- package/dist/src/evidence/usage.js +14 -0
- package/dist/src/evidence/usage.js.map +1 -0
- package/dist/src/executable.js +20 -0
- package/dist/src/executable.js.map +1 -0
- package/dist/src/extension-client.js +212 -0
- package/dist/src/extension-client.js.map +1 -0
- package/dist/src/extension-session.js +236 -0
- package/dist/src/extension-session.js.map +1 -0
- package/dist/src/fixtures/advisory.js +206 -0
- package/dist/src/fixtures/advisory.js.map +1 -0
- package/dist/src/fixtures/bin.js +41 -0
- package/dist/src/fixtures/bin.js.map +1 -0
- package/dist/src/fixtures/cleanup.js +43 -0
- package/dist/src/fixtures/cleanup.js.map +1 -0
- package/dist/src/fixtures/create.js +94 -0
- package/dist/src/fixtures/create.js.map +1 -0
- package/dist/src/fixtures/generated.js +181 -0
- package/dist/src/fixtures/generated.js.map +1 -0
- package/dist/src/fixtures/git-hooks.js +16 -0
- package/dist/src/fixtures/git-hooks.js.map +1 -0
- package/dist/src/fixtures/preparation.js +201 -0
- package/dist/src/fixtures/preparation.js.map +1 -0
- package/dist/src/fixtures/repository.js +255 -0
- package/dist/src/fixtures/repository.js.map +1 -0
- package/dist/src/fixtures/setup.js +175 -0
- package/dist/src/fixtures/setup.js.map +1 -0
- package/dist/src/fixtures/tools.js +57 -0
- package/dist/src/fixtures/tools.js.map +1 -0
- package/dist/src/fixtures/workspace-state.js +155 -0
- package/dist/src/fixtures/workspace-state.js.map +1 -0
- package/dist/src/generated/cli-result.cjs +2 -0
- package/dist/src/generated/extension.cjs +2 -0
- package/dist/src/generated/report.cjs +2 -0
- package/dist/src/generated/run-evidence.cjs +2 -0
- package/dist/src/generated/runtime.cjs +2 -0
- package/dist/src/git.js +72 -0
- package/dist/src/git.js.map +1 -0
- package/dist/src/graders/artifact.js +68 -0
- package/dist/src/graders/artifact.js.map +1 -0
- package/dist/src/graders/git-head.js +112 -0
- package/dist/src/graders/git-head.js.map +1 -0
- package/dist/src/graders/output.js +345 -0
- package/dist/src/graders/output.js.map +1 -0
- package/dist/src/graders/semantic.js +132 -0
- package/dist/src/graders/semantic.js.map +1 -0
- package/dist/src/graders/shell.js +321 -0
- package/dist/src/graders/shell.js.map +1 -0
- package/dist/src/host-diagnostic-redaction.js +52 -0
- package/dist/src/host-diagnostic-redaction.js.map +1 -0
- package/dist/src/host-diagnostics.js +248 -0
- package/dist/src/host-diagnostics.js.map +1 -0
- package/dist/src/hosts/claude-continuation.js +89 -0
- package/dist/src/hosts/claude-continuation.js.map +1 -0
- package/dist/src/hosts/claude-credential.js +121 -0
- package/dist/src/hosts/claude-credential.js.map +1 -0
- package/dist/src/hosts/claude-events.js +136 -0
- package/dist/src/hosts/claude-events.js.map +1 -0
- package/dist/src/hosts/claude-keychain.js +100 -0
- package/dist/src/hosts/claude-keychain.js.map +1 -0
- package/dist/src/hosts/claude-login-recovery.js +67 -0
- package/dist/src/hosts/claude-login-recovery.js.map +1 -0
- package/dist/src/hosts/claude-login-refresh.js +146 -0
- package/dist/src/hosts/claude-login-refresh.js.map +1 -0
- package/dist/src/hosts/claude-login-store.js +124 -0
- package/dist/src/hosts/claude-login-store.js.map +1 -0
- package/dist/src/hosts/claude-login.js +74 -0
- package/dist/src/hosts/claude-login.js.map +1 -0
- package/dist/src/hosts/claude-native-goal.js +138 -0
- package/dist/src/hosts/claude-native-goal.js.map +1 -0
- package/dist/src/hosts/claude-process.js +10 -0
- package/dist/src/hosts/claude-process.js.map +1 -0
- package/dist/src/hosts/claude-refresh-lock.js +76 -0
- package/dist/src/hosts/claude-refresh-lock.js.map +1 -0
- package/dist/src/hosts/claude-repository-invocation.js +229 -0
- package/dist/src/hosts/claude-repository-invocation.js.map +1 -0
- package/dist/src/hosts/claude-settings.js +156 -0
- package/dist/src/hosts/claude-settings.js.map +1 -0
- package/dist/src/hosts/claude-skill-activations.js +131 -0
- package/dist/src/hosts/claude-skill-activations.js.map +1 -0
- package/dist/src/hosts/claude-state.js +237 -0
- package/dist/src/hosts/claude-state.js.map +1 -0
- package/dist/src/hosts/claude-tool-calls.js +150 -0
- package/dist/src/hosts/claude-tool-calls.js.map +1 -0
- package/dist/src/hosts/claude.js +373 -0
- package/dist/src/hosts/claude.js.map +1 -0
- package/dist/src/hosts/codex-app-server.js +764 -0
- package/dist/src/hosts/codex-app-server.js.map +1 -0
- package/dist/src/hosts/codex-configuration.js +91 -0
- package/dist/src/hosts/codex-configuration.js.map +1 -0
- package/dist/src/hosts/codex-events.js +104 -0
- package/dist/src/hosts/codex-events.js.map +1 -0
- package/dist/src/hosts/codex-exec-controls.js +434 -0
- package/dist/src/hosts/codex-exec-controls.js.map +1 -0
- package/dist/src/hosts/codex-invocation.js +54 -0
- package/dist/src/hosts/codex-invocation.js.map +1 -0
- package/dist/src/hosts/codex-marketplace.js +185 -0
- package/dist/src/hosts/codex-marketplace.js.map +1 -0
- package/dist/src/hosts/codex-native-calls.js +516 -0
- package/dist/src/hosts/codex-native-calls.js.map +1 -0
- package/dist/src/hosts/codex-process.js +10 -0
- package/dist/src/hosts/codex-process.js.map +1 -0
- package/dist/src/hosts/codex-profile.js +206 -0
- package/dist/src/hosts/codex-profile.js.map +1 -0
- package/dist/src/hosts/codex-session-files.js +89 -0
- package/dist/src/hosts/codex-session-files.js.map +1 -0
- package/dist/src/hosts/codex-state.js +310 -0
- package/dist/src/hosts/codex-state.js.map +1 -0
- package/dist/src/hosts/codex.js +527 -0
- package/dist/src/hosts/codex.js.map +1 -0
- package/dist/src/hosts/isolation-common.js +43 -0
- package/dist/src/hosts/isolation-common.js.map +1 -0
- package/dist/src/hosts/isolation-roots.js +64 -0
- package/dist/src/hosts/isolation-roots.js.map +1 -0
- package/dist/src/hosts/isolation.js +12 -0
- package/dist/src/hosts/isolation.js.map +1 -0
- package/dist/src/hosts/linux-sandbox.js +127 -0
- package/dist/src/hosts/linux-sandbox.js.map +1 -0
- package/dist/src/hosts/mac-sandbox.js +137 -0
- package/dist/src/hosts/mac-sandbox.js.map +1 -0
- package/dist/src/hosts/native-controls.js +151 -0
- package/dist/src/hosts/native-controls.js.map +1 -0
- package/dist/src/hosts/native-request.js +33 -0
- package/dist/src/hosts/native-request.js.map +1 -0
- package/dist/src/hosts/process-lifecycle.js +167 -0
- package/dist/src/hosts/process-lifecycle.js.map +1 -0
- package/dist/src/hosts/protected-worktrees.js +81 -0
- package/dist/src/hosts/protected-worktrees.js.map +1 -0
- package/dist/src/hosts/skill-hook-catalog.js +100 -0
- package/dist/src/hosts/skill-hook-catalog.js.map +1 -0
- package/dist/src/hosts/skill-hook-handler.js +228 -0
- package/dist/src/hosts/skill-hook-handler.js.map +1 -0
- package/dist/src/hosts/skill-hooks.js +423 -0
- package/dist/src/hosts/skill-hooks.js.map +1 -0
- package/dist/src/hosts/workspace-fingerprint.js +72 -0
- package/dist/src/hosts/workspace-fingerprint.js.map +1 -0
- package/dist/src/identity.js +167 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/instrumentation.js +83 -0
- package/dist/src/instrumentation.js.map +1 -0
- package/dist/src/native-transcript-state.js +85 -0
- package/dist/src/native-transcript-state.js.map +1 -0
- package/dist/src/native-transcript-view.js +65 -0
- package/dist/src/native-transcript-view.js.map +1 -0
- package/dist/src/native-transcripts.js +208 -0
- package/dist/src/native-transcripts.js.map +1 -0
- package/dist/src/paths.js +13 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/process-lifecycle.js +101 -0
- package/dist/src/process-lifecycle.js.map +1 -0
- package/dist/src/provenance.js +263 -0
- package/dist/src/provenance.js.map +1 -0
- package/dist/src/prune.js +228 -0
- package/dist/src/prune.js.map +1 -0
- package/dist/src/report.js +276 -0
- package/dist/src/report.js.map +1 -0
- package/dist/src/resolved-case.js +29 -0
- package/dist/src/resolved-case.js.map +1 -0
- package/dist/src/results-lock.js +40 -0
- package/dist/src/results-lock.js.map +1 -0
- package/dist/src/results.js +127 -0
- package/dist/src/results.js.map +1 -0
- package/dist/src/run-owner.js +283 -0
- package/dist/src/run-owner.js.map +1 -0
- package/dist/src/runner-paths.js +11 -0
- package/dist/src/runner-paths.js.map +1 -0
- package/dist/src/runtime/config.js +323 -0
- package/dist/src/runtime/config.js.map +1 -0
- package/dist/src/runtime/discovery-apple.js +65 -0
- package/dist/src/runtime/discovery-apple.js.map +1 -0
- package/dist/src/runtime/discovery-providers.js +37 -0
- package/dist/src/runtime/discovery-providers.js.map +1 -0
- package/dist/src/runtime/discovery.js +40 -0
- package/dist/src/runtime/discovery.js.map +1 -0
- package/dist/src/runtime/hook-processes.js +81 -0
- package/dist/src/runtime/hook-processes.js.map +1 -0
- package/dist/src/runtime/hooks.js +304 -0
- package/dist/src/runtime/hooks.js.map +1 -0
- package/dist/src/runtime/paths.js +244 -0
- package/dist/src/runtime/paths.js.map +1 -0
- package/dist/src/runtime/query.js +76 -0
- package/dist/src/runtime/query.js.map +1 -0
- package/dist/src/runtime/seeds.js +98 -0
- package/dist/src/runtime/seeds.js.map +1 -0
- package/dist/src/runtime/shared-cache.js +81 -0
- package/dist/src/runtime/shared-cache.js.map +1 -0
- package/dist/src/runtime/state.js +106 -0
- package/dist/src/runtime/state.js.map +1 -0
- package/dist/src/runtime-process.js +148 -0
- package/dist/src/runtime-process.js.map +1 -0
- package/dist/src/schema-types.js +2 -0
- package/dist/src/schema-types.js.map +1 -0
- package/dist/src/schema.js +16 -0
- package/dist/src/schema.js.map +1 -0
- package/dist/src/shell.js +5 -0
- package/dist/src/shell.js.map +1 -0
- package/dist/src/sqlite-lock.js +18 -0
- package/dist/src/sqlite-lock.js.map +1 -0
- package/dist/src/storage.js +21 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/transcript-retention.js +109 -0
- package/dist/src/transcript-retention.js.map +1 -0
- package/dist/src/value-guards.js +26 -0
- package/dist/src/value-guards.js.map +1 -0
- package/docs/README.md +19 -15
- package/docs/architecture.md +141 -17
- package/docs/assets/README.md +5 -4
- package/docs/builtin-graders-v1.md +9 -2
- package/docs/codex-host.md +155 -57
- package/docs/contracts.md +2 -1
- package/docs/creating-cases.md +10 -4
- package/docs/development-cli.md +197 -24
- package/docs/documentation-quality.md +16 -5
- package/docs/evaluation-workflow.md +110 -0
- package/docs/extension-protocol-v1.md +26 -3
- package/docs/getting-started.md +29 -7
- package/docs/guide-evaluation.md +34 -2
- package/docs/identity-v1.md +29 -3
- package/docs/installing.md +35 -17
- package/docs/licensing.md +2 -2
- package/docs/native-controls.md +76 -5
- package/docs/native-hosts.md +197 -8
- package/docs/reading-results.md +102 -0
- package/docs/recipes.md +490 -0
- package/docs/releases.md +48 -13
- package/docs/report-v1.md +29 -1
- package/docs/results-v1.md +122 -4
- package/docs/run-settings-v1.md +147 -0
- package/docs/runtime-v1.md +255 -22
- package/docs/specs/repository-guide.md +1 -1
- package/docs/troubleshooting.md +12 -12
- package/docs/typescript-quality.md +106 -26
- package/examples/recipes/candidate.ts +26 -0
- package/examples/recipes/cases/coding-change.json +21 -0
- package/examples/recipes/cases/host-tools.json +21 -0
- package/examples/recipes/cases/mise.json +21 -0
- package/examples/recipes/cases/node.json +21 -0
- package/examples/recipes/cases/python-uv.json +21 -0
- package/examples/recipes/cases/semantic.json +17 -0
- package/examples/recipes/coding-change/check.ts +23 -0
- package/examples/recipes/executable.ts +19 -0
- package/examples/recipes/extension-artifacts.ts +65 -0
- package/examples/recipes/extension-methods.ts +174 -0
- package/examples/recipes/extension.ts +38 -0
- package/examples/recipes/modules.ts +9 -0
- package/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
- package/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
- package/examples/recipes/repository-skill/README.md +3 -0
- package/examples/recipes/run-inputs.ts +183 -0
- package/examples/recipes/run-options.ts +132 -0
- package/examples/recipes/run.ts +77 -0
- package/examples/recipes/runtime/empty.json +1 -0
- package/examples/recipes/runtime/goals.json +1 -0
- package/examples/recipes/runtime/mise.json +6 -0
- package/examples/recipes/runtime/path.json +1 -0
- package/examples/recipes/runtime/plugins.json +4 -0
- package/examples/recipes/runtime/python-uv.json +10 -0
- package/examples/recipes/semantic-judge.ts +29 -0
- package/examples/templates/coding/adapter.ts +17 -0
- package/examples/templates/coding/case.json +15 -0
- package/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
- package/examples/templates/repository-skill/extension-data.ts +64 -0
- package/examples/templates/repository-skill/extension.ts +32 -0
- package/examples/templates/response/adapter.ts +12 -0
- package/examples/templates/response/case.json +13 -0
- package/package.json +23 -9
- package/schemas/report-v1.schema.json +9 -0
- package/schemas/run-evidence-v1.schema.json +2 -1
- package/schemas/runtime-v1.schema.json +43 -7
- package/src/advisory.ts +2 -2
- package/src/candidate-artifacts.ts +42 -11
- package/src/candidate-codex-state.ts +185 -0
- package/src/case-validation.ts +73 -50
- package/src/cli/cancellation.ts +20 -0
- package/src/cli/command.ts +87 -0
- package/src/cli/completion.ts +15 -0
- package/src/cli/demo.ts +61 -0
- package/src/cli/evaluation.ts +55 -0
- package/src/cli/extension.ts +79 -0
- package/src/cli/help.ts +199 -0
- package/src/cli/hosts.ts +55 -0
- package/src/cli/init-settings.ts +31 -0
- package/src/cli/init.ts +112 -0
- package/src/{cli-invocation.ts → cli/invocation.ts} +215 -218
- package/src/cli/loading.ts +151 -0
- package/src/cli/preparation.ts +154 -0
- package/src/cli/presentation.ts +93 -0
- package/src/cli/progress.ts +6 -0
- package/src/cli/run-manifest.ts +128 -0
- package/src/cli/run-options.ts +403 -0
- package/src/cli/run-overrides.ts +69 -0
- package/src/cli/settings.ts +154 -0
- package/src/cli/summary.ts +43 -0
- package/src/cli.ts +14 -592
- package/src/contract-types.ts +94 -0
- package/src/engine.ts +9 -5
- package/src/evaluation/advisory.ts +150 -0
- package/src/{evaluation-check-plan.ts → evaluation/check-plan.ts} +103 -67
- package/src/evaluation/collection.ts +88 -0
- package/src/evaluation/context.ts +10 -0
- package/src/{evaluation-grading-host.ts → evaluation/grading-host.ts} +5 -5
- package/src/evaluation/grading.ts +235 -0
- package/src/{evaluation-invocation-plan.ts → evaluation/invocation-plan.ts} +147 -58
- package/src/{evaluation-plan.ts → evaluation/plan.ts} +208 -141
- package/src/evaluation/progress.ts +19 -0
- package/src/evaluation/resources.ts +241 -0
- package/src/evaluation/run.ts +206 -0
- package/src/{evaluation-semantic.ts → evaluation/semantic.ts} +77 -87
- package/src/evaluation/trial.ts +800 -0
- package/src/{evaluation-types.ts → evaluation/types.ts} +79 -29
- package/src/evidence/host-results.ts +85 -0
- package/src/evidence/retained-artifacts.ts +18 -0
- package/src/evidence/trial-writer.ts +203 -0
- package/src/evidence/usage.ts +17 -0
- package/src/executable.ts +19 -0
- package/src/extension-client.ts +40 -108
- package/src/extension-session.ts +24 -48
- package/src/{advisory-fixture.ts → fixtures/advisory.ts} +12 -72
- package/src/{fixture-bin.ts → fixtures/bin.ts} +1 -1
- package/src/{fixture-cleanup.ts → fixtures/cleanup.ts} +13 -7
- package/src/fixtures/create.ts +183 -0
- package/src/{generated-fixture.ts → fixtures/generated.ts} +10 -53
- package/src/{git-hooks.ts → fixtures/git-hooks.ts} +1 -1
- package/src/{preparation.ts → fixtures/preparation.ts} +6 -16
- package/src/{repository-fixture.ts → fixtures/repository.ts} +30 -64
- package/src/{fixture-setup.ts → fixtures/setup.ts} +36 -53
- package/src/{fixture-tools.ts → fixtures/tools.ts} +1 -1
- package/src/{workspace-state.ts → fixtures/workspace-state.ts} +5 -5
- package/src/generated/cli-result.d.cts +2 -1
- package/src/generated/extension.d.cts +2 -1
- package/src/generated/report.cjs +1 -1
- package/src/generated/report.d.cts +2 -1
- package/src/generated/run-evidence.cjs +1 -1
- package/src/generated/run-evidence.d.cts +2 -1
- package/src/generated/runtime.cjs +1 -1
- package/src/generated/runtime.d.cts +2 -1
- package/src/git.ts +94 -0
- package/src/graders/git-head.ts +31 -85
- package/src/graders/shell.ts +54 -71
- package/src/host-diagnostic-redaction.ts +52 -0
- package/src/host-diagnostics.ts +331 -0
- package/src/hosts/claude-continuation.ts +57 -40
- package/src/hosts/claude-credential.ts +160 -63
- package/src/hosts/claude-events.ts +34 -18
- package/src/hosts/claude-keychain.ts +79 -21
- package/src/hosts/claude-login-recovery.ts +85 -0
- package/src/hosts/claude-login-refresh.ts +179 -0
- package/src/hosts/claude-login-store.ts +162 -0
- package/src/hosts/claude-login.ts +107 -0
- package/src/hosts/claude-native-goal.ts +15 -12
- package/src/hosts/claude-process.ts +10 -50
- package/src/hosts/claude-refresh-lock.ts +82 -0
- package/src/hosts/claude-repository-invocation.ts +9 -34
- package/src/hosts/claude-settings.ts +46 -9
- package/src/hosts/claude-skill-activations.ts +169 -0
- package/src/hosts/claude-state.ts +28 -15
- package/src/hosts/claude-tool-calls.ts +13 -10
- package/src/hosts/claude.ts +121 -81
- package/src/hosts/codex-app-server.ts +78 -52
- package/src/hosts/codex-configuration.ts +5 -10
- package/src/hosts/codex-exec-controls.ts +516 -0
- package/src/hosts/codex-marketplace.ts +12 -10
- package/src/hosts/codex-native-calls.ts +15 -122
- package/src/hosts/codex-process.ts +10 -183
- package/src/hosts/codex-profile.ts +36 -21
- package/src/hosts/codex-session-files.ts +1 -9
- package/src/hosts/codex-state.ts +134 -18
- package/src/hosts/codex.ts +210 -183
- package/src/hosts/isolation-common.ts +8 -11
- package/src/hosts/isolation-roots.ts +5 -4
- package/src/hosts/linux-sandbox.ts +15 -2
- package/src/hosts/mac-sandbox.ts +87 -18
- package/src/hosts/native-controls.ts +72 -22
- package/src/hosts/native-request.ts +55 -0
- package/src/hosts/process-lifecycle.ts +215 -49
- package/src/hosts/protected-worktrees.ts +3 -2
- package/src/hosts/skill-hook-catalog.ts +131 -0
- package/src/hosts/skill-hook-handler.ts +374 -0
- package/src/hosts/skill-hooks.ts +585 -0
- package/src/instrumentation.ts +7 -8
- package/src/native-transcript-state.ts +22 -3
- package/src/native-transcript-view.ts +52 -13
- package/src/native-transcripts.ts +26 -11
- package/src/paths.ts +22 -0
- package/src/process-lifecycle.ts +150 -0
- package/src/provenance.ts +34 -13
- package/src/prune.ts +300 -0
- package/src/report.ts +63 -36
- package/src/resolved-case.ts +1 -1
- package/src/results-lock.ts +42 -0
- package/src/results.ts +14 -18
- package/src/run-owner.ts +15 -9
- package/src/runner-paths.ts +21 -0
- package/src/{runtime-config.ts → runtime/config.ts} +160 -46
- package/src/{runtime-discovery-apple.ts → runtime/discovery-apple.ts} +3 -3
- package/src/{runtime-discovery-providers.ts → runtime/discovery-providers.ts} +3 -9
- package/src/{runtime-discovery.ts → runtime/discovery.ts} +4 -4
- package/src/{runtime-hook-processes.ts → runtime/hook-processes.ts} +3 -2
- package/src/{runtime-hooks.ts → runtime/hooks.ts} +40 -28
- package/src/{runtime-paths.ts → runtime/paths.ts} +5 -19
- package/src/{runtime-query.ts → runtime/query.ts} +5 -5
- package/src/{runtime-seeds.ts → runtime/seeds.ts} +3 -3
- package/src/runtime/shared-cache.ts +130 -0
- package/src/{runtime-state.ts → runtime/state.ts} +28 -11
- package/src/runtime-process.ts +194 -0
- package/src/schema-types.ts +73 -161
- package/src/shell.ts +4 -0
- package/src/sqlite-lock.ts +25 -0
- package/src/transcript-retention.ts +146 -0
- package/src/value-guards.ts +22 -0
- package/docs/assets/sevro-logo.png +0 -0
- package/docs/assets/sevro-symbol.svg +0 -1
- package/docs/assets/sevro-wordmark.svg +0 -1
- package/docs/cache-ownership-validation.md +0 -49
- package/docs/claude-continuation-validation.md +0 -47
- package/docs/concurrency-validation.md +0 -86
- package/docs/configuration-root-validation.md +0 -70
- package/docs/engine-slice.md +0 -114
- package/docs/evidence/runtime-startup-30/README.md +0 -185
- package/docs/evidence/runtime-startup-30/after.json +0 -319
- package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +0 -2
- package/docs/evidence/runtime-startup-30/before.json +0 -403
- package/docs/evidence/runtime-startup-30/consumer-smoke.json +0 -63
- package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +0 -3
- package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +0 -3
- package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +0 -20
- package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +0 -2
- package/docs/evidence.md +0 -17
- package/docs/fixture-cleanup-validation.md +0 -73
- package/docs/guide-verification.json +0 -239
- package/src/evaluation-context.ts +0 -259
- package/src/evaluation-fixture.ts +0 -302
- package/src/evaluation-run.ts +0 -200
- package/src/evaluation-trial.ts +0 -1016
- package/src/hosts/claude-nested-skills.ts +0 -272
- package/src/hosts/codex-command-output.ts +0 -510
- package/src/hosts/codex-executor-command.ts +0 -291
- package/src/hosts/codex-skill-reads.ts +0 -783
- /package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { examplePath, sourceRuntime } from "../runner-paths.js";
|
|
2
|
+
import { cp, mkdir, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { parseArgs } from "node:util";
|
|
5
|
+
import { nativeReadme, templateCommand, templateSettings, } from "./init-settings.js";
|
|
6
|
+
function initOptions(argv) {
|
|
7
|
+
const { values, positionals } = parseArgs({
|
|
8
|
+
args: argv,
|
|
9
|
+
strict: true,
|
|
10
|
+
allowPositionals: true,
|
|
11
|
+
options: {
|
|
12
|
+
template: { type: "string", default: "response" },
|
|
13
|
+
directory: { type: "string", default: "sevro-evaluation" },
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
if (positionals.length ||
|
|
17
|
+
!["response", "coding", "repository-skill"].includes(values.template))
|
|
18
|
+
throw new Error("use --template response, coding or repository-skill; run sevro init --help");
|
|
19
|
+
if (!values.directory.trim())
|
|
20
|
+
throw new Error("--directory must name a new directory");
|
|
21
|
+
return { template: values.template, destination: resolve(values.directory) };
|
|
22
|
+
}
|
|
23
|
+
async function reserveDirectory(destination) {
|
|
24
|
+
await mkdir(dirname(destination), { recursive: true });
|
|
25
|
+
try {
|
|
26
|
+
await mkdir(destination);
|
|
27
|
+
}
|
|
28
|
+
catch (cause) {
|
|
29
|
+
throw new Error(`init destination already exists or cannot be created: ${destination}; choose a new --directory`, { cause });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function starterReadme(template) {
|
|
33
|
+
if (template === "repository-skill")
|
|
34
|
+
return nativeReadme();
|
|
35
|
+
const assertion = template === "coding"
|
|
36
|
+
? "positive, negative and zero addition assertions against edited add.sh"
|
|
37
|
+
: "an exact response assertion";
|
|
38
|
+
const prerequisites = template === "coding"
|
|
39
|
+
? "Node.js 24.13.0 or newer, or Bun 1.3.13, plus sandbox-exec on macOS or bubblewrap/socat on Linux"
|
|
40
|
+
: "Node.js 24.13.0 or newer, or Bun 1.3.13";
|
|
41
|
+
return `# ${template} evaluation\n\nThis deterministic adapter exercises ${assertion}, without model credentials. Prerequisites: ${prerequisites}.\n\n\`\`\`sh\nsevro run --run-manifest-file run.json --dry\nsevro run --run-manifest-file run.json\nsevro report --latest\nSEVRO_TEMPLATE_FAIL=1 sevro run --run-manifest-file run.json\n\`\`\`\n\nThe negative control must report task=failed and exit 1. Dry preparation is not an assessment.\nEdit case.json and ${sourceRuntime ? "adapter.ts" : "adapter.js"}, prepare, then run again. Keep private .sevro evidence out of Git.\nFor a native model, replace the adapter route explicitly with --host, --model and --effort; Codex also requires --codex-auth-file. No model execution or native skill dispatch is established by this adapter.\n`;
|
|
42
|
+
}
|
|
43
|
+
async function initialize(template, destination) {
|
|
44
|
+
await reserveDirectory(destination);
|
|
45
|
+
try {
|
|
46
|
+
await cp(examplePath("templates", template), destination, {
|
|
47
|
+
recursive: true,
|
|
48
|
+
errorOnExist: true,
|
|
49
|
+
force: false,
|
|
50
|
+
});
|
|
51
|
+
await writeFile(join(destination, "run.json"), JSON.stringify({ format: "sevro.run.v1", settings: templateSettings(template) }, null, 2) + "\n", { flag: "wx" });
|
|
52
|
+
if (template === "repository-skill")
|
|
53
|
+
await writeFile(join(destination, "command.json"), JSON.stringify(templateCommand(destination)) + "\n", { flag: "wx" });
|
|
54
|
+
await writeFile(join(destination, ".gitignore"), ".sevro/\n", {
|
|
55
|
+
flag: "wx",
|
|
56
|
+
});
|
|
57
|
+
await writeFile(join(destination, "README.md"), starterReadme(template), {
|
|
58
|
+
flag: "wx",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (cause) {
|
|
62
|
+
await rm(destination, { recursive: true, force: true });
|
|
63
|
+
throw cause;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function initCommand(argv) {
|
|
67
|
+
try {
|
|
68
|
+
const { template, destination } = initOptions(argv);
|
|
69
|
+
await initialize(template, destination);
|
|
70
|
+
const quoted = `'${destination.replaceAll("'", "'\\''")}'`;
|
|
71
|
+
const native = template === "repository-skill"
|
|
72
|
+
? " --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json"
|
|
73
|
+
: "";
|
|
74
|
+
process.stdout.write(`Created ${template} evaluation at ${destination}\nOpen README.md, then:\n cd ${quoted}\n sevro run --run-manifest-file run.json${native} --dry\n sevro run --run-manifest-file run.json${native}\n`);
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
process.stderr.write(`sevro: ${error instanceof Error ? error.message : "initialization failed"}\n`);
|
|
79
|
+
return 64;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"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","sourcesContent":["import { examplePath, sourceRuntime } from \"../runner-paths\";\nimport { cp, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport {\n nativeReadme,\n templateCommand,\n templateSettings,\n} from \"./init-settings\";\n\nfunction initOptions(argv: string[]) {\n const { values, positionals } = parseArgs({\n args: argv,\n strict: true,\n allowPositionals: true,\n options: {\n template: { type: \"string\", default: \"response\" },\n directory: { type: \"string\", default: \"sevro-evaluation\" },\n },\n });\n if (\n positionals.length ||\n ![\"response\", \"coding\", \"repository-skill\"].includes(values.template)\n )\n throw new Error(\n \"use --template response, coding or repository-skill; run sevro init --help\",\n );\n if (!values.directory.trim())\n throw new Error(\"--directory must name a new directory\");\n return { template: values.template, destination: resolve(values.directory) };\n}\n\nasync function reserveDirectory(destination: string): Promise<void> {\n await mkdir(dirname(destination), { recursive: true });\n try {\n await mkdir(destination);\n } catch (cause) {\n throw new Error(\n `init destination already exists or cannot be created: ${destination}; choose a new --directory`,\n { cause },\n );\n }\n}\n\nfunction starterReadme(template: string) {\n if (template === \"repository-skill\") return nativeReadme();\n const assertion =\n template === \"coding\"\n ? \"positive, negative and zero addition assertions against edited add.sh\"\n : \"an exact response assertion\";\n const prerequisites =\n template === \"coding\"\n ? \"Node.js 24.13.0 or newer, or Bun 1.3.13, plus sandbox-exec on macOS or bubblewrap/socat on Linux\"\n : \"Node.js 24.13.0 or newer, or Bun 1.3.13\";\n return `# ${template} evaluation\\n\\nThis deterministic adapter exercises ${assertion}, without model credentials. Prerequisites: ${prerequisites}.\\n\\n\\`\\`\\`sh\\nsevro run --run-manifest-file run.json --dry\\nsevro run --run-manifest-file run.json\\nsevro report --latest\\nSEVRO_TEMPLATE_FAIL=1 sevro run --run-manifest-file run.json\\n\\`\\`\\`\\n\\nThe negative control must report task=failed and exit 1. Dry preparation is not an assessment.\\nEdit case.json and ${sourceRuntime ? \"adapter.ts\" : \"adapter.js\"}, prepare, then run again. Keep private .sevro evidence out of Git.\\nFor a native model, replace the adapter route explicitly with --host, --model and --effort; Codex also requires --codex-auth-file. No model execution or native skill dispatch is established by this adapter.\\n`;\n}\n\nasync function initialize(template: string, destination: string) {\n await reserveDirectory(destination);\n try {\n await cp(examplePath(\"templates\", template), destination, {\n recursive: true,\n errorOnExist: true,\n force: false,\n });\n await writeFile(\n join(destination, \"run.json\"),\n JSON.stringify(\n { format: \"sevro.run.v1\", settings: templateSettings(template) },\n null,\n 2,\n ) + \"\\n\",\n { flag: \"wx\" },\n );\n if (template === \"repository-skill\")\n await writeFile(\n join(destination, \"command.json\"),\n JSON.stringify(templateCommand(destination)) + \"\\n\",\n { flag: \"wx\" },\n );\n await writeFile(join(destination, \".gitignore\"), \".sevro/\\n\", {\n flag: \"wx\",\n });\n await writeFile(join(destination, \"README.md\"), starterReadme(template), {\n flag: \"wx\",\n });\n } catch (cause) {\n await rm(destination, { recursive: true, force: true });\n throw cause;\n }\n}\n\nexport async function initCommand(argv: string[]): Promise<number> {\n try {\n const { template, destination } = initOptions(argv);\n await initialize(template, destination);\n const quoted = `'${destination.replaceAll(\"'\", \"'\\\\''\")}'`;\n const native =\n template === \"repository-skill\"\n ? \" --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json\"\n : \"\";\n process.stdout.write(\n `Created ${template} evaluation at ${destination}\\nOpen README.md, then:\\n cd ${quoted}\\n sevro run --run-manifest-file run.json${native} --dry\\n sevro run --run-manifest-file run.json${native}\\n`,\n );\n return 0;\n } catch (error) {\n process.stderr.write(\n `sevro: ${error instanceof Error ? error.message : \"initialization failed\"}\\n`,\n );\n return 64;\n }\n}\n"]}
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { which } from "../executable.js";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { validQualifiedId } from "../value-guards.js";
|
|
4
|
+
import { canonicalRuntimeRoot } from "../runtime/paths.js";
|
|
5
|
+
import { PATH_OPTIONS, PATH_LIST_OPTIONS, EXTENSION_OPTIONS, RUN_OPTIONS, optionsWith, runArguments, } from "./run-options.js";
|
|
6
|
+
import { savedRunValues } from "./run-manifest.js";
|
|
7
|
+
export class InvocationError extends Error {
|
|
8
|
+
}
|
|
9
|
+
function requiredOption(value, name) {
|
|
10
|
+
if (!value)
|
|
11
|
+
throw new InvocationError(`missing ${name}; supply ${name} with a value`);
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function optionalDigest(value, name) {
|
|
15
|
+
if (value !== undefined && !/^[a-f0-9]{64}$/.test(value))
|
|
16
|
+
throw new InvocationError(`${name} must be a 64-character SHA-256 digest`);
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function conditionOption(value) {
|
|
20
|
+
const condition = requiredOption(value, "--condition");
|
|
21
|
+
if (condition !== "passive" && condition !== "enforced")
|
|
22
|
+
throw new InvocationError("invalid --condition; use passive or enforced");
|
|
23
|
+
return condition;
|
|
24
|
+
}
|
|
25
|
+
function cliArguments(argv) {
|
|
26
|
+
try {
|
|
27
|
+
return runArguments(argv);
|
|
28
|
+
}
|
|
29
|
+
catch (cause) {
|
|
30
|
+
const detail = cause instanceof Error ? `: ${cause.message}` : "";
|
|
31
|
+
throw new InvocationError(`invalid CLI arguments${detail}`, { cause });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function trialParameters(values) {
|
|
35
|
+
const condition = conditionOption(values.condition);
|
|
36
|
+
const trialCount = Number(requiredOption(values.trials, "--trials"));
|
|
37
|
+
const jobs = Number(requiredOption(values.jobs, "--jobs"));
|
|
38
|
+
const passThreshold = Number(requiredOption(values.threshold, "--threshold"));
|
|
39
|
+
positiveInteger(trialCount, "--trials");
|
|
40
|
+
positiveInteger(jobs, "--jobs");
|
|
41
|
+
if (!Number.isFinite(passThreshold) ||
|
|
42
|
+
passThreshold <= 0 ||
|
|
43
|
+
passThreshold > 1)
|
|
44
|
+
throw new InvocationError("invalid --threshold; supply a number greater than 0 and at most 1");
|
|
45
|
+
return { condition, trialCount, jobs, passThreshold };
|
|
46
|
+
}
|
|
47
|
+
function positiveInteger(value, option) {
|
|
48
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
49
|
+
throw new InvocationError(`invalid ${option}; supply a positive integer`);
|
|
50
|
+
}
|
|
51
|
+
function hostRoutes(values) {
|
|
52
|
+
const codex = values.host === "codex";
|
|
53
|
+
const claude = values.host === "claude";
|
|
54
|
+
const semanticCodex = values["semantic-host"] === "codex";
|
|
55
|
+
const advisoryCodex = values["advisory-host"] === "codex";
|
|
56
|
+
return {
|
|
57
|
+
codex,
|
|
58
|
+
claude,
|
|
59
|
+
builtinHost: codex || claude,
|
|
60
|
+
semanticCodex,
|
|
61
|
+
advisoryCodex,
|
|
62
|
+
anyCodex: codex || semanticCodex || advisoryCodex,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const HOST_COMPATIBILITY = [
|
|
66
|
+
{
|
|
67
|
+
invalid: (v, r) => v["codex-entrypoint"] !== undefined &&
|
|
68
|
+
(!r.codex || !["exec", "app-server"].includes(v["codex-entrypoint"])),
|
|
69
|
+
message: "--codex-entrypoint requires --host codex and exec or app-server",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
invalid: (v, r) => v.host && !r.builtinHost,
|
|
73
|
+
message: "unsupported --host; use codex or claude",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
invalid: (v, r) => v["semantic-host"] && !r.semanticCodex,
|
|
77
|
+
message: "unsupported --semantic-host; use codex",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
invalid: (v, r) => v["advisory-host"] && !r.advisoryCodex,
|
|
81
|
+
message: "unsupported --advisory-host; use codex",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
invalid: (v, r) => r.semanticCodex && v["semantic-adapter-module"],
|
|
85
|
+
message: "--semantic-host and --semantic-adapter-module are exclusive",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
invalid: (v, r) => r.advisoryCodex && v["advisory-adapter-module"],
|
|
89
|
+
message: "--advisory-host and --advisory-adapter-module are exclusive",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
invalid: (v, r) => r.builtinHost && v["adapter-module"],
|
|
93
|
+
message: "--host and --adapter-module are exclusive",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
invalid: (v, r) => !r.builtinHost && !v["adapter-module"],
|
|
97
|
+
message: "missing --adapter-module or --host",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
invalid: (v, r) => !r.builtinHost && (v.model || v.effort),
|
|
101
|
+
message: "--model and --effort require a built-in host",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
invalid: (v, r) => !r.semanticCodex && (v["semantic-model"] || v["semantic-effort"]),
|
|
105
|
+
message: "semantic model options require --semantic-host codex",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
invalid: (v, r) => !r.advisoryCodex && (v["advisory-model"] || v["advisory-effort"]),
|
|
109
|
+
message: "advisory model options require --advisory-host codex",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
invalid: (v, r) => v["advisory-exclude"]?.length &&
|
|
113
|
+
!r.advisoryCodex &&
|
|
114
|
+
!v["advisory-adapter-module"],
|
|
115
|
+
message: "--advisory-exclude requires an advisory route",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
invalid: (v, r) => !r.anyCodex && hasRouteOptions(v, "codex"),
|
|
119
|
+
message: "Codex options require a Codex host route",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
invalid: (v, r) => !r.claude && hasRouteOptions(v, "claude"),
|
|
123
|
+
message: "Claude options require --host claude",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
invalid: (v, r, roots) => roots.length &&
|
|
127
|
+
!v["shell-isolation"] &&
|
|
128
|
+
!r.builtinHost &&
|
|
129
|
+
!r.semanticCodex &&
|
|
130
|
+
!r.advisoryCodex,
|
|
131
|
+
message: "--protected-root requires isolation",
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
function hasRouteOptions(values, route) {
|
|
135
|
+
return optionsWith("route", route).some((name) => {
|
|
136
|
+
if (RUN_OPTIONS[name].kind === "number")
|
|
137
|
+
return values[name] !== undefined;
|
|
138
|
+
return Boolean(values[name]);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function validateHostCompatibility(values, routes, roots) {
|
|
142
|
+
for (const rule of HOST_COMPATIBILITY)
|
|
143
|
+
if (rule.invalid(values, routes, roots))
|
|
144
|
+
throw new InvocationError(rule.message);
|
|
145
|
+
}
|
|
146
|
+
function rootParameters(values) {
|
|
147
|
+
const projectRoot = requiredOption(values["project-root"], "--project-root");
|
|
148
|
+
const configRoot = values["config-root"] !== undefined
|
|
149
|
+
? requiredOption(values["config-root"], "--config-root")
|
|
150
|
+
: projectRoot;
|
|
151
|
+
const resultsRoot = requiredOption(values["results-root"], "--results-root");
|
|
152
|
+
const runStateRoot = values["run-state-root"]
|
|
153
|
+
? requiredOption(values["run-state-root"], "--run-state-root")
|
|
154
|
+
: resultsRoot;
|
|
155
|
+
return { projectRoot, configRoot, resultsRoot, runStateRoot };
|
|
156
|
+
}
|
|
157
|
+
function validateExtensionSelection(values) {
|
|
158
|
+
const policy = values["task-verdict-policy"];
|
|
159
|
+
if (policy !== undefined && !validQualifiedId(policy))
|
|
160
|
+
throw new InvocationError("invalid --task-verdict-policy");
|
|
161
|
+
const replacements = values["replace-builtin-grader"] ?? [];
|
|
162
|
+
validateReplacements(replacements);
|
|
163
|
+
if (Boolean(values["case-file"]) === Boolean(values["extension-command-file"]))
|
|
164
|
+
throw new InvocationError("select exactly one of --case-file or --extension-command-file");
|
|
165
|
+
validateExtensionArguments(values);
|
|
166
|
+
validatePairedFiles(values);
|
|
167
|
+
}
|
|
168
|
+
function validateReplacements(replacements) {
|
|
169
|
+
if (new Set(replacements).size !== replacements.length ||
|
|
170
|
+
replacements.some((id) => !validQualifiedId(id)))
|
|
171
|
+
throw new InvocationError("invalid --replace-builtin-grader");
|
|
172
|
+
}
|
|
173
|
+
function hasExtensionArguments(values) {
|
|
174
|
+
return EXTENSION_OPTIONS.some((name) => {
|
|
175
|
+
const value = values[name];
|
|
176
|
+
if (Array.isArray(value))
|
|
177
|
+
return value.length > 0;
|
|
178
|
+
if (name === "task-verdict-policy")
|
|
179
|
+
return value !== undefined;
|
|
180
|
+
return Boolean(value);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
function extensionSources(values) {
|
|
184
|
+
const sources = values["extension-source-file"];
|
|
185
|
+
if (!sources?.length)
|
|
186
|
+
throw new InvocationError("missing --extension-source-file");
|
|
187
|
+
return sources;
|
|
188
|
+
}
|
|
189
|
+
function validateExtensionArguments(values) {
|
|
190
|
+
if (values["extension-command-file"]) {
|
|
191
|
+
requiredOption(values["case-id"], "--case-id");
|
|
192
|
+
extensionSources(values);
|
|
193
|
+
}
|
|
194
|
+
else if (hasExtensionArguments(values))
|
|
195
|
+
throw new InvocationError("extension options require --extension-command-file");
|
|
196
|
+
}
|
|
197
|
+
function validatePairedFiles(values) {
|
|
198
|
+
if (Boolean(values["extension-configuration-file"]) !==
|
|
199
|
+
Boolean(values["extension-redacted-configuration-file"]))
|
|
200
|
+
throw new InvocationError("extension configuration requires a redacted file");
|
|
201
|
+
if (Boolean(values["case-source-root"]) !==
|
|
202
|
+
Boolean(values["case-source-map-file"]))
|
|
203
|
+
throw new InvocationError("case sources require a root and map file");
|
|
204
|
+
}
|
|
205
|
+
function privateRootDeclarations(values, configRoot, protectedRoots) {
|
|
206
|
+
return [
|
|
207
|
+
configRoot,
|
|
208
|
+
...protectedRoots,
|
|
209
|
+
...optionsWith("private", true).flatMap((name) => values[name] ?? []),
|
|
210
|
+
].filter((value) => Boolean(value));
|
|
211
|
+
}
|
|
212
|
+
function commonCodexOptions(values, roots, privateRoots) {
|
|
213
|
+
return {
|
|
214
|
+
binary: requiredOption(values["codex-bin"], "--codex-bin"),
|
|
215
|
+
authFile: requiredOption(values["codex-auth-file"], "--codex-auth-file"),
|
|
216
|
+
retainHostDiagnostics: values["retain-host-diagnostics"] === true,
|
|
217
|
+
timeoutMs: codexTimeout(values["codex-timeout-ms"]),
|
|
218
|
+
projectRoot: roots.projectRoot,
|
|
219
|
+
resultsRoot: roots.resultsRoot,
|
|
220
|
+
additionalProtectedRoots: [...privateRoots, roots.runStateRoot],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function codexTimeout(value) {
|
|
224
|
+
if (value === undefined)
|
|
225
|
+
return undefined;
|
|
226
|
+
const timeout = Number(value);
|
|
227
|
+
if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 30 * 60_000)
|
|
228
|
+
throw new InvocationError("invalid --codex-timeout-ms; supply a positive integer at most 1800000 (30 minutes)");
|
|
229
|
+
return timeout;
|
|
230
|
+
}
|
|
231
|
+
function claudeHostOptions(values, routes, roots, privateRoots, toolchainBinDir) {
|
|
232
|
+
if (!routes.claude)
|
|
233
|
+
return undefined;
|
|
234
|
+
return {
|
|
235
|
+
retainHostDiagnostics: values["retain-host-diagnostics"] === true,
|
|
236
|
+
binary: requiredOption(values["claude-bin"], "--claude-bin"),
|
|
237
|
+
...(values["claude-credential-file"]
|
|
238
|
+
? {
|
|
239
|
+
credentialFile: requiredOption(values["claude-credential-file"], "--claude-credential-file"),
|
|
240
|
+
}
|
|
241
|
+
: {}),
|
|
242
|
+
...(values["claude-uv-cache-dir"]
|
|
243
|
+
? {
|
|
244
|
+
uvCacheDir: requiredOption(values["claude-uv-cache-dir"], "--claude-uv-cache-dir"),
|
|
245
|
+
}
|
|
246
|
+
: {}),
|
|
247
|
+
model: requiredOption(values.model, "--model"),
|
|
248
|
+
effort: requiredOption(values.effort, "--effort"),
|
|
249
|
+
toolchainBinDir,
|
|
250
|
+
projectSettings: values["claude-project-settings"] ?? false,
|
|
251
|
+
projectRoot: roots.projectRoot,
|
|
252
|
+
resultsRoot: roots.resultsRoot,
|
|
253
|
+
additionalProtectedRoots: [...privateRoots, roots.runStateRoot],
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function extensionInvocation(values) {
|
|
257
|
+
const command = values["extension-command-file"];
|
|
258
|
+
if (!command)
|
|
259
|
+
return undefined;
|
|
260
|
+
return {
|
|
261
|
+
commandFile: requiredOption(command, "--extension-command-file"),
|
|
262
|
+
sourceFiles: extensionSources(values),
|
|
263
|
+
caseId: requiredOption(values["case-id"], "--case-id"),
|
|
264
|
+
configurationFile: values["extension-configuration-file"],
|
|
265
|
+
redactedConfigurationFile: values["extension-redacted-configuration-file"],
|
|
266
|
+
taskVerdictPolicy: values["task-verdict-policy"],
|
|
267
|
+
replaceBuiltinGraders: values["replace-builtin-grader"] ?? [],
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const CODEX_MODEL_KEYS = {
|
|
271
|
+
candidate: ["model", "effort"],
|
|
272
|
+
semantic: ["semantic-model", "semantic-effort"],
|
|
273
|
+
advisory: ["advisory-model", "advisory-effort"],
|
|
274
|
+
};
|
|
275
|
+
function codexRoleOptions(values, common, role) {
|
|
276
|
+
const [modelKey, effortKey] = CODEX_MODEL_KEYS[role];
|
|
277
|
+
return {
|
|
278
|
+
...(role === "candidate"
|
|
279
|
+
? {
|
|
280
|
+
entrypoint: values["codex-entrypoint"],
|
|
281
|
+
}
|
|
282
|
+
: {}),
|
|
283
|
+
...common,
|
|
284
|
+
model: requiredOption(values[modelKey], `--${modelKey}`),
|
|
285
|
+
effort: requiredOption(values[effortKey], `--${effortKey}`),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function selectedCodexOptions(values, routes, roots, privateRoots) {
|
|
289
|
+
if (!routes.anyCodex)
|
|
290
|
+
return {};
|
|
291
|
+
const common = commonCodexOptions(values, roots, privateRoots);
|
|
292
|
+
return {
|
|
293
|
+
codex: routes.codex
|
|
294
|
+
? codexRoleOptions(values, common, "candidate")
|
|
295
|
+
: undefined,
|
|
296
|
+
semanticCodex: routes.semanticCodex
|
|
297
|
+
? codexRoleOptions(values, common, "semantic")
|
|
298
|
+
: undefined,
|
|
299
|
+
advisoryCodex: routes.advisoryCodex
|
|
300
|
+
? codexRoleOptions(values, common, "advisory")
|
|
301
|
+
: undefined,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
function invocationInputs(values, context) {
|
|
305
|
+
const { routes, roots, privateRoots, toolchainBinDir, codexOptions, claudeOptions, trials, } = context;
|
|
306
|
+
return {
|
|
307
|
+
json: values.json ?? false,
|
|
308
|
+
runManifestFile: values["run-manifest-file"],
|
|
309
|
+
protectedRoots: context.protectedRoots,
|
|
310
|
+
deprecatedRuntimeOptions: optionsWith("section", "deprecated").filter((name) => values[name] !== undefined),
|
|
311
|
+
dry: values.dry ?? false,
|
|
312
|
+
runtimeConfigFile: values["runtime-config-file"],
|
|
313
|
+
caseFile: values["case-file"],
|
|
314
|
+
extension: extensionInvocation(values),
|
|
315
|
+
caseSourceRoot: values["case-source-root"],
|
|
316
|
+
caseSourceMapFile: values["case-source-map-file"],
|
|
317
|
+
adapterModule: routes.builtinHost
|
|
318
|
+
? undefined
|
|
319
|
+
: requiredOption(values["adapter-module"], "--adapter-module"),
|
|
320
|
+
semanticAdapterModule: values["semantic-adapter-module"],
|
|
321
|
+
advisoryAdapterModule: values["advisory-adapter-module"],
|
|
322
|
+
advisoryExcludedPaths: values["advisory-exclude"] ?? [],
|
|
323
|
+
...codexOptions,
|
|
324
|
+
claude: claudeOptions,
|
|
325
|
+
shellIsolation: shellIsolationOptions(values, privateRoots, toolchainBinDir),
|
|
326
|
+
...roots,
|
|
327
|
+
runnerBuildDigest: optionalDigest(values["runner-build-digest"], "--runner-build-digest"),
|
|
328
|
+
runnerCheckoutRoot: values["runner-checkout-root"],
|
|
329
|
+
projectDigest: optionalDigest(values["project-digest"], "--project-digest"),
|
|
330
|
+
...trials,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function shellIsolationOptions(values, protectedRoots, toolchainBinDir) {
|
|
334
|
+
return values["shell-isolation"]
|
|
335
|
+
? {
|
|
336
|
+
protectedRoots,
|
|
337
|
+
toolchainBinDir,
|
|
338
|
+
uvRuntimeCache: !!values["claude-uv-cache-dir"],
|
|
339
|
+
}
|
|
340
|
+
: undefined;
|
|
341
|
+
}
|
|
342
|
+
function invocationContext(values) {
|
|
343
|
+
const trials = trialParameters(values);
|
|
344
|
+
const protectedRoots = values["protected-root"] ?? [];
|
|
345
|
+
const toolchainBinDir = values["toolchain-bin-dir"];
|
|
346
|
+
const routes = hostRoutes(values);
|
|
347
|
+
const roots = rootParameters(values);
|
|
348
|
+
validateExtensionSelection(values);
|
|
349
|
+
const privateRoots = privateRootDeclarations(values, roots.configRoot, protectedRoots);
|
|
350
|
+
const codexOptions = selectedCodexOptions(values, routes, roots, privateRoots);
|
|
351
|
+
const claudeOptions = claudeHostOptions(values, routes, roots, privateRoots, toolchainBinDir);
|
|
352
|
+
return {
|
|
353
|
+
routes,
|
|
354
|
+
roots,
|
|
355
|
+
protectedRoots,
|
|
356
|
+
privateRoots,
|
|
357
|
+
toolchainBinDir,
|
|
358
|
+
codexOptions,
|
|
359
|
+
claudeOptions,
|
|
360
|
+
trials,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
/** Decode CLI flags in their documented validation order. */
|
|
364
|
+
export async function parseInvocation(argv) {
|
|
365
|
+
if (argv[0] !== "run")
|
|
366
|
+
throw new InvocationError("unknown command; available commands: demo, init, run, report, prune; run sevro --help");
|
|
367
|
+
const parsed = cliArguments(argv);
|
|
368
|
+
if (parsed.positionals.length !== 1)
|
|
369
|
+
throw new InvocationError("expected the run command");
|
|
370
|
+
parsed.values = await savedRunValues(parsed.values);
|
|
371
|
+
applyRunDefaults(parsed.values);
|
|
372
|
+
validateHostCompatibility(parsed.values, hostRoutes(parsed.values), parsed.values["protected-root"] ?? []);
|
|
373
|
+
applyRootDefaults(parsed.values);
|
|
374
|
+
resolveNativeBinaries(parsed.values);
|
|
375
|
+
await canonicalizePaths(parsed.values);
|
|
376
|
+
return invocationInputs(parsed.values, invocationContext(parsed.values));
|
|
377
|
+
}
|
|
378
|
+
function resolveNativeBinaries(values) {
|
|
379
|
+
const routes = hostRoutes(values);
|
|
380
|
+
if (routes.anyCodex)
|
|
381
|
+
values["codex-bin"] ??= nativeBinary("codex");
|
|
382
|
+
if (routes.claude)
|
|
383
|
+
values["claude-bin"] ??= nativeBinary("claude");
|
|
384
|
+
}
|
|
385
|
+
function nativeBinary(host) {
|
|
386
|
+
const binary = which(host);
|
|
387
|
+
if (!binary)
|
|
388
|
+
throw new InvocationError(`selected ${host} executable was not found on PATH; install ${host} or supply --${host}-bin <path>`);
|
|
389
|
+
return binary;
|
|
390
|
+
}
|
|
391
|
+
/** Keep all selected native roles visible to protection and evidence callers. */
|
|
392
|
+
export function nativeRoutes(invocation) {
|
|
393
|
+
return [
|
|
394
|
+
invocation.codex,
|
|
395
|
+
invocation.claude,
|
|
396
|
+
invocation.semanticCodex,
|
|
397
|
+
invocation.advisoryCodex,
|
|
398
|
+
].filter((host) => host !== undefined);
|
|
399
|
+
}
|
|
400
|
+
function applyRunDefaults(values) {
|
|
401
|
+
values.condition ??= "passive";
|
|
402
|
+
values.trials ??= "1";
|
|
403
|
+
values.jobs ??= "3";
|
|
404
|
+
values.threshold ??= "1";
|
|
405
|
+
}
|
|
406
|
+
function applyRootDefaults(values) {
|
|
407
|
+
values["project-root"] ??= process.cwd();
|
|
408
|
+
values["results-root"] ??= join(resolve(values["project-root"]), ".sevro", "results");
|
|
409
|
+
}
|
|
410
|
+
async function canonicalOption(path, option) {
|
|
411
|
+
try {
|
|
412
|
+
return await canonicalRuntimeRoot(resolve(path));
|
|
413
|
+
}
|
|
414
|
+
catch (cause) {
|
|
415
|
+
const error = cause;
|
|
416
|
+
throw new InvocationError(`--${option} cannot be resolved at ${path}: filesystem ${error.syscall ?? "realpath"} failed (${error.code ?? "unknown"}); supply a usable file or directory path`, { cause });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
async function canonicalizePaths(values) {
|
|
420
|
+
for (const name of PATH_OPTIONS) {
|
|
421
|
+
const value = values[name];
|
|
422
|
+
if (value !== undefined)
|
|
423
|
+
values[name] = await canonicalOption(requiredOption(value, `--${name}`), name);
|
|
424
|
+
}
|
|
425
|
+
for (const name of PATH_LIST_OPTIONS) {
|
|
426
|
+
const paths = values[name];
|
|
427
|
+
if (paths)
|
|
428
|
+
values[name] = await Promise.all(paths.map((path) => canonicalOption(requiredOption(path, `--${name}`), name)));
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["invocation.ts"],"names":[],"mappings":"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","sourcesContent":["import { which } from \"../executable\";\nimport { join, resolve } from \"node:path\";\nimport { validQualifiedId } from \"../value-guards\";\nimport { canonicalRuntimeRoot } from \"../runtime/paths\";\nimport {\n PATH_OPTIONS,\n PATH_LIST_OPTIONS,\n EXTENSION_OPTIONS,\n RUN_OPTIONS,\n optionsWith,\n runArguments,\n} from \"./run-options\";\nimport { savedRunValues } from \"./run-manifest\";\n\nexport class InvocationError extends Error {}\n\nfunction requiredOption(value: string | undefined, name: string): string {\n if (!value)\n throw new InvocationError(`missing ${name}; supply ${name} with a value`);\n return value;\n}\n\nfunction optionalDigest(value: string | undefined, name: string) {\n if (value !== undefined && !/^[a-f0-9]{64}$/.test(value))\n throw new InvocationError(`${name} must be a 64-character SHA-256 digest`);\n return value;\n}\n\nfunction conditionOption(value: string | undefined): \"passive\" | \"enforced\" {\n const condition = requiredOption(value, \"--condition\");\n if (condition !== \"passive\" && condition !== \"enforced\")\n throw new InvocationError(\"invalid --condition; use passive or enforced\");\n return condition;\n}\n\nfunction cliArguments(argv: string[]) {\n try {\n return runArguments(argv);\n } catch (cause) {\n const detail = cause instanceof Error ? `: ${cause.message}` : \"\";\n throw new InvocationError(`invalid CLI arguments${detail}`, { cause });\n }\n}\n\ntype Values = ReturnType<typeof cliArguments>[\"values\"];\n\nfunction trialParameters(values: Values) {\n const condition = conditionOption(values.condition);\n const trialCount = Number(requiredOption(values.trials, \"--trials\"));\n const jobs = Number(requiredOption(values.jobs, \"--jobs\"));\n const passThreshold = Number(requiredOption(values.threshold, \"--threshold\"));\n positiveInteger(trialCount, \"--trials\");\n positiveInteger(jobs, \"--jobs\");\n if (\n !Number.isFinite(passThreshold) ||\n passThreshold <= 0 ||\n passThreshold > 1\n )\n throw new InvocationError(\n \"invalid --threshold; supply a number greater than 0 and at most 1\",\n );\n return { condition, trialCount, jobs, passThreshold };\n}\n\nfunction positiveInteger(value: number, option: string): void {\n if (!Number.isSafeInteger(value) || value < 1)\n throw new InvocationError(`invalid ${option}; supply a positive integer`);\n}\n\nfunction hostRoutes(values: Values) {\n const codex = values.host === \"codex\";\n const claude = values.host === \"claude\";\n const semanticCodex = values[\"semantic-host\"] === \"codex\";\n const advisoryCodex = values[\"advisory-host\"] === \"codex\";\n return {\n codex,\n claude,\n builtinHost: codex || claude,\n semanticCodex,\n advisoryCodex,\n anyCodex: codex || semanticCodex || advisoryCodex,\n };\n}\n\ntype Routes = ReturnType<typeof hostRoutes>;\ntype CompatibilityRule = {\n invalid: (values: Values, routes: Routes, roots: string[]) => unknown;\n message: string;\n};\nconst HOST_COMPATIBILITY: CompatibilityRule[] = [\n {\n invalid: (v, r) =>\n v[\"codex-entrypoint\"] !== undefined &&\n (!r.codex || ![\"exec\", \"app-server\"].includes(v[\"codex-entrypoint\"])),\n message: \"--codex-entrypoint requires --host codex and exec or app-server\",\n },\n {\n invalid: (v, r) => v.host && !r.builtinHost,\n message: \"unsupported --host; use codex or claude\",\n },\n {\n invalid: (v, r) => v[\"semantic-host\"] && !r.semanticCodex,\n message: \"unsupported --semantic-host; use codex\",\n },\n {\n invalid: (v, r) => v[\"advisory-host\"] && !r.advisoryCodex,\n message: \"unsupported --advisory-host; use codex\",\n },\n {\n invalid: (v, r) => r.semanticCodex && v[\"semantic-adapter-module\"],\n message: \"--semantic-host and --semantic-adapter-module are exclusive\",\n },\n {\n invalid: (v, r) => r.advisoryCodex && v[\"advisory-adapter-module\"],\n message: \"--advisory-host and --advisory-adapter-module are exclusive\",\n },\n {\n invalid: (v, r) => r.builtinHost && v[\"adapter-module\"],\n message: \"--host and --adapter-module are exclusive\",\n },\n {\n invalid: (v, r) => !r.builtinHost && !v[\"adapter-module\"],\n message: \"missing --adapter-module or --host\",\n },\n {\n invalid: (v, r) => !r.builtinHost && (v.model || v.effort),\n message: \"--model and --effort require a built-in host\",\n },\n {\n invalid: (v, r) =>\n !r.semanticCodex && (v[\"semantic-model\"] || v[\"semantic-effort\"]),\n message: \"semantic model options require --semantic-host codex\",\n },\n {\n invalid: (v, r) =>\n !r.advisoryCodex && (v[\"advisory-model\"] || v[\"advisory-effort\"]),\n message: \"advisory model options require --advisory-host codex\",\n },\n {\n invalid: (v, r) =>\n v[\"advisory-exclude\"]?.length &&\n !r.advisoryCodex &&\n !v[\"advisory-adapter-module\"],\n message: \"--advisory-exclude requires an advisory route\",\n },\n {\n invalid: (v, r) => !r.anyCodex && hasRouteOptions(v, \"codex\"),\n message: \"Codex options require a Codex host route\",\n },\n {\n invalid: (v, r) => !r.claude && hasRouteOptions(v, \"claude\"),\n message: \"Claude options require --host claude\",\n },\n {\n invalid: (v, r, roots) =>\n roots.length &&\n !v[\"shell-isolation\"] &&\n !r.builtinHost &&\n !r.semanticCodex &&\n !r.advisoryCodex,\n message: \"--protected-root requires isolation\",\n },\n];\n\nfunction hasRouteOptions(values: Values, route: \"codex\" | \"claude\"): boolean {\n return optionsWith(\"route\", route).some((name) => {\n if (RUN_OPTIONS[name].kind === \"number\") return values[name] !== undefined;\n return Boolean(values[name]);\n });\n}\n\nfunction validateHostCompatibility(\n values: Values,\n routes: Routes,\n roots: string[],\n): void {\n for (const rule of HOST_COMPATIBILITY)\n if (rule.invalid(values, routes, roots))\n throw new InvocationError(rule.message);\n}\n\nfunction rootParameters(values: Values) {\n const projectRoot = requiredOption(values[\"project-root\"], \"--project-root\");\n const configRoot =\n values[\"config-root\"] !== undefined\n ? requiredOption(values[\"config-root\"], \"--config-root\")\n : projectRoot;\n const resultsRoot = requiredOption(values[\"results-root\"], \"--results-root\");\n const runStateRoot = values[\"run-state-root\"]\n ? requiredOption(values[\"run-state-root\"], \"--run-state-root\")\n : resultsRoot;\n return { projectRoot, configRoot, resultsRoot, runStateRoot };\n}\n\ntype Roots = ReturnType<typeof rootParameters>;\n\nfunction validateExtensionSelection(values: Values): void {\n const policy = values[\"task-verdict-policy\"];\n if (policy !== undefined && !validQualifiedId(policy))\n throw new InvocationError(\"invalid --task-verdict-policy\");\n const replacements = values[\"replace-builtin-grader\"] ?? [];\n validateReplacements(replacements);\n if (\n Boolean(values[\"case-file\"]) === Boolean(values[\"extension-command-file\"])\n )\n throw new InvocationError(\n \"select exactly one of --case-file or --extension-command-file\",\n );\n validateExtensionArguments(values);\n validatePairedFiles(values);\n}\n\nfunction validateReplacements(replacements: string[]): void {\n if (\n new Set(replacements).size !== replacements.length ||\n replacements.some((id) => !validQualifiedId(id))\n )\n throw new InvocationError(\"invalid --replace-builtin-grader\");\n}\n\nfunction hasExtensionArguments(values: Values): boolean {\n return EXTENSION_OPTIONS.some((name) => {\n const value = values[name];\n if (Array.isArray(value)) return value.length > 0;\n if (name === \"task-verdict-policy\") return value !== undefined;\n return Boolean(value);\n });\n}\n\nfunction extensionSources(values: Values): string[] {\n const sources = values[\"extension-source-file\"];\n if (!sources?.length)\n throw new InvocationError(\"missing --extension-source-file\");\n return sources;\n}\n\nfunction validateExtensionArguments(values: Values): void {\n if (values[\"extension-command-file\"]) {\n requiredOption(values[\"case-id\"], \"--case-id\");\n extensionSources(values);\n } else if (hasExtensionArguments(values))\n throw new InvocationError(\n \"extension options require --extension-command-file\",\n );\n}\n\nfunction validatePairedFiles(values: Values): void {\n if (\n Boolean(values[\"extension-configuration-file\"]) !==\n Boolean(values[\"extension-redacted-configuration-file\"])\n )\n throw new InvocationError(\n \"extension configuration requires a redacted file\",\n );\n if (\n Boolean(values[\"case-source-root\"]) !==\n Boolean(values[\"case-source-map-file\"])\n )\n throw new InvocationError(\"case sources require a root and map file\");\n}\n\nfunction privateRootDeclarations(\n values: Values,\n configRoot: string,\n protectedRoots: string[],\n): string[] {\n return [\n configRoot,\n ...protectedRoots,\n ...optionsWith(\"private\", true).flatMap((name) => values[name] ?? []),\n ].filter((value): value is string => Boolean(value));\n}\n\nfunction commonCodexOptions(\n values: Values,\n roots: Roots,\n privateRoots: string[],\n) {\n return {\n binary: requiredOption(values[\"codex-bin\"], \"--codex-bin\"),\n authFile: requiredOption(values[\"codex-auth-file\"], \"--codex-auth-file\"),\n retainHostDiagnostics: values[\"retain-host-diagnostics\"] === true,\n timeoutMs: codexTimeout(values[\"codex-timeout-ms\"]),\n projectRoot: roots.projectRoot,\n resultsRoot: roots.resultsRoot,\n additionalProtectedRoots: [...privateRoots, roots.runStateRoot],\n };\n}\n\nfunction codexTimeout(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const timeout = Number(value);\n if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 30 * 60_000)\n throw new InvocationError(\n \"invalid --codex-timeout-ms; supply a positive integer at most 1800000 (30 minutes)\",\n );\n return timeout;\n}\n\nfunction claudeHostOptions(\n values: Values,\n routes: Routes,\n roots: Roots,\n privateRoots: string[],\n toolchainBinDir: string | undefined,\n) {\n if (!routes.claude) return undefined;\n return {\n retainHostDiagnostics: values[\"retain-host-diagnostics\"] === true,\n binary: requiredOption(values[\"claude-bin\"], \"--claude-bin\"),\n ...(values[\"claude-credential-file\"]\n ? {\n credentialFile: requiredOption(\n values[\"claude-credential-file\"],\n \"--claude-credential-file\",\n ),\n }\n : {}),\n ...(values[\"claude-uv-cache-dir\"]\n ? {\n uvCacheDir: requiredOption(\n values[\"claude-uv-cache-dir\"],\n \"--claude-uv-cache-dir\",\n ),\n }\n : {}),\n model: requiredOption(values.model, \"--model\"),\n effort: requiredOption(values.effort, \"--effort\"),\n toolchainBinDir,\n projectSettings: values[\"claude-project-settings\"] ?? false,\n projectRoot: roots.projectRoot,\n resultsRoot: roots.resultsRoot,\n additionalProtectedRoots: [...privateRoots, roots.runStateRoot],\n };\n}\n\nfunction extensionInvocation(values: Values) {\n const command = values[\"extension-command-file\"];\n if (!command) return undefined;\n return {\n commandFile: requiredOption(command, \"--extension-command-file\"),\n sourceFiles: extensionSources(values),\n caseId: requiredOption(values[\"case-id\"], \"--case-id\"),\n configurationFile: values[\"extension-configuration-file\"],\n redactedConfigurationFile: values[\"extension-redacted-configuration-file\"],\n taskVerdictPolicy: values[\"task-verdict-policy\"],\n replaceBuiltinGraders: values[\"replace-builtin-grader\"] ?? [],\n };\n}\n\nconst CODEX_MODEL_KEYS = {\n candidate: [\"model\", \"effort\"],\n semantic: [\"semantic-model\", \"semantic-effort\"],\n advisory: [\"advisory-model\", \"advisory-effort\"],\n} as const;\n\nfunction codexRoleOptions(\n values: Values,\n common: ReturnType<typeof commonCodexOptions>,\n role: keyof typeof CODEX_MODEL_KEYS,\n) {\n const [modelKey, effortKey] = CODEX_MODEL_KEYS[role];\n return {\n ...(role === \"candidate\"\n ? {\n entrypoint: values[\"codex-entrypoint\"] as\n \"exec\" | \"app-server\" | undefined,\n }\n : {}),\n ...common,\n model: requiredOption(values[modelKey], `--${modelKey}`),\n effort: requiredOption(values[effortKey], `--${effortKey}`),\n };\n}\n\nfunction selectedCodexOptions(\n values: Values,\n routes: Routes,\n roots: Roots,\n privateRoots: string[],\n) {\n if (!routes.anyCodex) return {};\n const common = commonCodexOptions(values, roots, privateRoots);\n return {\n codex: routes.codex\n ? codexRoleOptions(values, common, \"candidate\")\n : undefined,\n semanticCodex: routes.semanticCodex\n ? codexRoleOptions(values, common, \"semantic\")\n : undefined,\n advisoryCodex: routes.advisoryCodex\n ? codexRoleOptions(values, common, \"advisory\")\n : undefined,\n };\n}\n\nfunction invocationInputs(\n values: Values,\n context: ReturnType<typeof invocationContext>,\n) {\n const {\n routes,\n roots,\n privateRoots,\n toolchainBinDir,\n codexOptions,\n claudeOptions,\n trials,\n } = context;\n return {\n json: values.json ?? false,\n runManifestFile: values[\"run-manifest-file\"],\n protectedRoots: context.protectedRoots,\n deprecatedRuntimeOptions: optionsWith(\"section\", \"deprecated\").filter(\n (name) => values[name] !== undefined,\n ),\n dry: values.dry ?? false,\n runtimeConfigFile: values[\"runtime-config-file\"],\n caseFile: values[\"case-file\"],\n extension: extensionInvocation(values),\n caseSourceRoot: values[\"case-source-root\"],\n caseSourceMapFile: values[\"case-source-map-file\"],\n adapterModule: routes.builtinHost\n ? undefined\n : requiredOption(values[\"adapter-module\"], \"--adapter-module\"),\n semanticAdapterModule: values[\"semantic-adapter-module\"],\n advisoryAdapterModule: values[\"advisory-adapter-module\"],\n advisoryExcludedPaths: values[\"advisory-exclude\"] ?? [],\n ...codexOptions,\n claude: claudeOptions,\n shellIsolation: shellIsolationOptions(\n values,\n privateRoots,\n toolchainBinDir,\n ),\n ...roots,\n runnerBuildDigest: optionalDigest(\n values[\"runner-build-digest\"],\n \"--runner-build-digest\",\n ),\n runnerCheckoutRoot: values[\"runner-checkout-root\"],\n projectDigest: optionalDigest(values[\"project-digest\"], \"--project-digest\"),\n ...trials,\n };\n}\n\nfunction shellIsolationOptions(\n values: Values,\n protectedRoots: string[],\n toolchainBinDir: string | undefined,\n) {\n return values[\"shell-isolation\"]\n ? {\n protectedRoots,\n toolchainBinDir,\n uvRuntimeCache: !!values[\"claude-uv-cache-dir\"],\n }\n : undefined;\n}\n\nfunction invocationContext(values: Values) {\n const trials = trialParameters(values);\n const protectedRoots = values[\"protected-root\"] ?? [];\n const toolchainBinDir = values[\"toolchain-bin-dir\"];\n const routes = hostRoutes(values);\n const roots = rootParameters(values);\n validateExtensionSelection(values);\n const privateRoots = privateRootDeclarations(\n values,\n roots.configRoot,\n protectedRoots,\n );\n const codexOptions = selectedCodexOptions(\n values,\n routes,\n roots,\n privateRoots,\n );\n const claudeOptions = claudeHostOptions(\n values,\n routes,\n roots,\n privateRoots,\n toolchainBinDir,\n );\n return {\n routes,\n roots,\n protectedRoots,\n privateRoots,\n toolchainBinDir,\n codexOptions,\n claudeOptions,\n trials,\n };\n}\n\n/** Decode CLI flags in their documented validation order. */\nexport async function parseInvocation(argv: string[]) {\n if (argv[0] !== \"run\")\n throw new InvocationError(\n \"unknown command; available commands: demo, init, run, report, prune; run sevro --help\",\n );\n const parsed = cliArguments(argv);\n if (parsed.positionals.length !== 1)\n throw new InvocationError(\"expected the run command\");\n parsed.values = await savedRunValues(parsed.values);\n applyRunDefaults(parsed.values);\n validateHostCompatibility(\n parsed.values,\n hostRoutes(parsed.values),\n parsed.values[\"protected-root\"] ?? [],\n );\n applyRootDefaults(parsed.values);\n resolveNativeBinaries(parsed.values);\n await canonicalizePaths(parsed.values);\n return invocationInputs(parsed.values, invocationContext(parsed.values));\n}\n\nfunction resolveNativeBinaries(values: Values): void {\n const routes = hostRoutes(values);\n if (routes.anyCodex) values[\"codex-bin\"] ??= nativeBinary(\"codex\");\n if (routes.claude) values[\"claude-bin\"] ??= nativeBinary(\"claude\");\n}\n\nfunction nativeBinary(host: \"codex\" | \"claude\"): string {\n const binary = which(host);\n if (!binary)\n throw new InvocationError(\n `selected ${host} executable was not found on PATH; install ${host} or supply --${host}-bin <path>`,\n );\n return binary;\n}\n\nexport type Invocation = Awaited<ReturnType<typeof parseInvocation>>;\n\n/** Keep all selected native roles visible to protection and evidence callers. */\nexport function nativeRoutes(\n invocation: Pick<\n Invocation,\n \"codex\" | \"claude\" | \"semanticCodex\" | \"advisoryCodex\"\n >,\n) {\n return [\n invocation.codex,\n invocation.claude,\n invocation.semanticCodex,\n invocation.advisoryCodex,\n ].filter((host) => host !== undefined);\n}\n\nfunction applyRunDefaults(values: Values): void {\n values.condition ??= \"passive\";\n values.trials ??= \"1\";\n values.jobs ??= \"3\";\n values.threshold ??= \"1\";\n}\n\nfunction applyRootDefaults(values: Values): void {\n values[\"project-root\"] ??= process.cwd();\n values[\"results-root\"] ??= join(\n resolve(values[\"project-root\"]),\n \".sevro\",\n \"results\",\n );\n}\n\nasync function canonicalOption(path: string, option: string): Promise<string> {\n try {\n return await canonicalRuntimeRoot(resolve(path));\n } catch (cause) {\n const error = cause as NodeJS.ErrnoException;\n throw new InvocationError(\n `--${option} cannot be resolved at ${path}: filesystem ${error.syscall ?? \"realpath\"} failed (${error.code ?? \"unknown\"}); supply a usable file or directory path`,\n { cause },\n );\n }\n}\n\nasync function canonicalizePaths(values: Values): Promise<void> {\n for (const name of PATH_OPTIONS) {\n const value = values[name];\n if (value !== undefined)\n values[name] = await canonicalOption(\n requiredOption(value, `--${name}`),\n name,\n );\n }\n for (const name of PATH_LIST_OPTIONS) {\n const paths = values[name];\n if (paths)\n values[name] = await Promise.all(\n paths.map((path) =>\n canonicalOption(requiredOption(path, `--${name}`), name),\n ),\n );\n }\n}\n"]}
|