@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
|
@@ -1,26 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { which } from "../executable";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { validQualifiedId } from "../value-guards";
|
|
4
|
+
import { canonicalRuntimeRoot } from "../runtime/paths";
|
|
5
|
+
import {
|
|
6
|
+
PATH_OPTIONS,
|
|
7
|
+
PATH_LIST_OPTIONS,
|
|
8
|
+
EXTENSION_OPTIONS,
|
|
9
|
+
RUN_OPTIONS,
|
|
10
|
+
optionsWith,
|
|
11
|
+
runArguments,
|
|
12
|
+
} from "./run-options";
|
|
13
|
+
import { savedRunValues } from "./run-manifest";
|
|
3
14
|
|
|
4
15
|
export class InvocationError extends Error {}
|
|
5
16
|
|
|
6
17
|
function requiredOption(value: string | undefined, name: string): string {
|
|
7
|
-
if (!value)
|
|
18
|
+
if (!value)
|
|
19
|
+
throw new InvocationError(`missing ${name}; supply ${name} with a value`);
|
|
8
20
|
return value;
|
|
9
21
|
}
|
|
10
22
|
|
|
11
|
-
function absoluteOption(value: string | undefined, name: string): string {
|
|
12
|
-
const path = requiredOption(value, name);
|
|
13
|
-
if (!isAbsolute(path)) throw new InvocationError(`${name} must be absolute`);
|
|
14
|
-
return path;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function optionalAbsolute(
|
|
18
|
-
value: string | undefined,
|
|
19
|
-
name: string,
|
|
20
|
-
): string | undefined {
|
|
21
|
-
return value ? absoluteOption(value, name) : undefined;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
23
|
function optionalDigest(value: string | undefined, name: string) {
|
|
25
24
|
if (value !== undefined && !/^[a-f0-9]{64}$/.test(value))
|
|
26
25
|
throw new InvocationError(`${name} must be a 64-character SHA-256 digest`);
|
|
@@ -30,71 +29,16 @@ function optionalDigest(value: string | undefined, name: string) {
|
|
|
30
29
|
function conditionOption(value: string | undefined): "passive" | "enforced" {
|
|
31
30
|
const condition = requiredOption(value, "--condition");
|
|
32
31
|
if (condition !== "passive" && condition !== "enforced")
|
|
33
|
-
throw new InvocationError("invalid --condition");
|
|
32
|
+
throw new InvocationError("invalid --condition; use passive or enforced");
|
|
34
33
|
return condition;
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
const RUN_OPTIONS = {
|
|
38
|
-
json: { type: "boolean" },
|
|
39
|
-
dry: { type: "boolean" },
|
|
40
|
-
"case-file": { type: "string" },
|
|
41
|
-
"case-id": { type: "string" },
|
|
42
|
-
"extension-command-file": { type: "string" },
|
|
43
|
-
"extension-source-file": { type: "string", multiple: true },
|
|
44
|
-
"extension-configuration-file": { type: "string" },
|
|
45
|
-
"extension-redacted-configuration-file": { type: "string" },
|
|
46
|
-
"task-verdict-policy": { type: "string" },
|
|
47
|
-
"replace-builtin-grader": { type: "string", multiple: true },
|
|
48
|
-
"case-source-root": { type: "string" },
|
|
49
|
-
"case-source-map-file": { type: "string" },
|
|
50
|
-
"adapter-module": { type: "string" },
|
|
51
|
-
"semantic-adapter-module": { type: "string" },
|
|
52
|
-
"semantic-host": { type: "string" },
|
|
53
|
-
"semantic-model": { type: "string" },
|
|
54
|
-
"semantic-effort": { type: "string" },
|
|
55
|
-
"advisory-adapter-module": { type: "string" },
|
|
56
|
-
"advisory-host": { type: "string" },
|
|
57
|
-
"advisory-model": { type: "string" },
|
|
58
|
-
"advisory-effort": { type: "string" },
|
|
59
|
-
"advisory-exclude": { type: "string", multiple: true },
|
|
60
|
-
host: { type: "string" },
|
|
61
|
-
"codex-bin": { type: "string" },
|
|
62
|
-
"codex-entrypoint": { type: "string" },
|
|
63
|
-
"codex-timeout-ms": { type: "string" },
|
|
64
|
-
"codex-auth-file": { type: "string" },
|
|
65
|
-
"claude-bin": { type: "string" },
|
|
66
|
-
"claude-credential-file": { type: "string" },
|
|
67
|
-
"claude-uv-cache-dir": { type: "string" },
|
|
68
|
-
"claude-project-settings": { type: "boolean" },
|
|
69
|
-
"toolchain-bin-dir": { type: "string" },
|
|
70
|
-
model: { type: "string" },
|
|
71
|
-
effort: { type: "string" },
|
|
72
|
-
"shell-isolation": { type: "boolean" },
|
|
73
|
-
"protected-root": { type: "string", multiple: true },
|
|
74
|
-
"project-root": { type: "string" },
|
|
75
|
-
"config-root": { type: "string" },
|
|
76
|
-
"runtime-config-file": { type: "string" },
|
|
77
|
-
"results-root": { type: "string" },
|
|
78
|
-
"run-state-root": { type: "string" },
|
|
79
|
-
"runner-build-digest": { type: "string" },
|
|
80
|
-
"runner-checkout-root": { type: "string" },
|
|
81
|
-
"project-digest": { type: "string" },
|
|
82
|
-
condition: { type: "string" },
|
|
83
|
-
trials: { type: "string" },
|
|
84
|
-
jobs: { type: "string", default: "3" },
|
|
85
|
-
threshold: { type: "string" },
|
|
86
|
-
} as const;
|
|
87
|
-
|
|
88
36
|
function cliArguments(argv: string[]) {
|
|
89
37
|
try {
|
|
90
|
-
return
|
|
91
|
-
args: argv,
|
|
92
|
-
allowPositionals: true,
|
|
93
|
-
strict: true,
|
|
94
|
-
options: RUN_OPTIONS,
|
|
95
|
-
});
|
|
38
|
+
return runArguments(argv);
|
|
96
39
|
} catch (cause) {
|
|
97
|
-
|
|
40
|
+
const detail = cause instanceof Error ? `: ${cause.message}` : "";
|
|
41
|
+
throw new InvocationError(`invalid CLI arguments${detail}`, { cause });
|
|
98
42
|
}
|
|
99
43
|
}
|
|
100
44
|
|
|
@@ -112,24 +56,29 @@ function trialParameters(values: Values) {
|
|
|
112
56
|
passThreshold <= 0 ||
|
|
113
57
|
passThreshold > 1
|
|
114
58
|
)
|
|
115
|
-
throw new InvocationError(
|
|
59
|
+
throw new InvocationError(
|
|
60
|
+
"invalid --threshold; supply a number greater than 0 and at most 1",
|
|
61
|
+
);
|
|
116
62
|
return { condition, trialCount, jobs, passThreshold };
|
|
117
63
|
}
|
|
118
64
|
|
|
119
65
|
function positiveInteger(value: number, option: string): void {
|
|
120
66
|
if (!Number.isSafeInteger(value) || value < 1)
|
|
121
|
-
throw new InvocationError(`invalid ${option}`);
|
|
67
|
+
throw new InvocationError(`invalid ${option}; supply a positive integer`);
|
|
122
68
|
}
|
|
123
69
|
|
|
124
70
|
function hostRoutes(values: Values) {
|
|
125
71
|
const codex = values.host === "codex";
|
|
126
72
|
const claude = values.host === "claude";
|
|
73
|
+
const semanticCodex = values["semantic-host"] === "codex";
|
|
74
|
+
const advisoryCodex = values["advisory-host"] === "codex";
|
|
127
75
|
return {
|
|
128
76
|
codex,
|
|
129
77
|
claude,
|
|
130
78
|
builtinHost: codex || claude,
|
|
131
|
-
semanticCodex
|
|
132
|
-
advisoryCodex
|
|
79
|
+
semanticCodex,
|
|
80
|
+
advisoryCodex,
|
|
81
|
+
anyCodex: codex || semanticCodex || advisoryCodex,
|
|
133
82
|
};
|
|
134
83
|
}
|
|
135
84
|
|
|
@@ -147,15 +96,15 @@ const HOST_COMPATIBILITY: CompatibilityRule[] = [
|
|
|
147
96
|
},
|
|
148
97
|
{
|
|
149
98
|
invalid: (v, r) => v.host && !r.builtinHost,
|
|
150
|
-
message: "unsupported --host",
|
|
99
|
+
message: "unsupported --host; use codex or claude",
|
|
151
100
|
},
|
|
152
101
|
{
|
|
153
102
|
invalid: (v, r) => v["semantic-host"] && !r.semanticCodex,
|
|
154
|
-
message: "unsupported --semantic-host",
|
|
103
|
+
message: "unsupported --semantic-host; use codex",
|
|
155
104
|
},
|
|
156
105
|
{
|
|
157
106
|
invalid: (v, r) => v["advisory-host"] && !r.advisoryCodex,
|
|
158
|
-
message: "unsupported --advisory-host",
|
|
107
|
+
message: "unsupported --advisory-host; use codex",
|
|
159
108
|
},
|
|
160
109
|
{
|
|
161
110
|
invalid: (v, r) => r.semanticCodex && v["semantic-adapter-module"],
|
|
@@ -195,24 +144,11 @@ const HOST_COMPATIBILITY: CompatibilityRule[] = [
|
|
|
195
144
|
message: "--advisory-exclude requires an advisory route",
|
|
196
145
|
},
|
|
197
146
|
{
|
|
198
|
-
invalid: (v, r) =>
|
|
199
|
-
!r.codex &&
|
|
200
|
-
!r.semanticCodex &&
|
|
201
|
-
!r.advisoryCodex &&
|
|
202
|
-
[
|
|
203
|
-
v["codex-bin"],
|
|
204
|
-
v["codex-auth-file"],
|
|
205
|
-
v["codex-timeout-ms"] !== undefined,
|
|
206
|
-
].some(Boolean),
|
|
147
|
+
invalid: (v, r) => !r.anyCodex && hasRouteOptions(v, "codex"),
|
|
207
148
|
message: "Codex options require a Codex host route",
|
|
208
149
|
},
|
|
209
150
|
{
|
|
210
|
-
invalid: (v, r) =>
|
|
211
|
-
!r.claude &&
|
|
212
|
-
(v["claude-bin"] ||
|
|
213
|
-
v["claude-credential-file"] ||
|
|
214
|
-
v["claude-uv-cache-dir"] ||
|
|
215
|
-
v["claude-project-settings"]),
|
|
151
|
+
invalid: (v, r) => !r.claude && hasRouteOptions(v, "claude"),
|
|
216
152
|
message: "Claude options require --host claude",
|
|
217
153
|
},
|
|
218
154
|
{
|
|
@@ -226,6 +162,13 @@ const HOST_COMPATIBILITY: CompatibilityRule[] = [
|
|
|
226
162
|
},
|
|
227
163
|
];
|
|
228
164
|
|
|
165
|
+
function hasRouteOptions(values: Values, route: "codex" | "claude"): boolean {
|
|
166
|
+
return optionsWith("route", route).some((name) => {
|
|
167
|
+
if (RUN_OPTIONS[name].kind === "number") return values[name] !== undefined;
|
|
168
|
+
return Boolean(values[name]);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
229
172
|
function validateHostCompatibility(
|
|
230
173
|
values: Values,
|
|
231
174
|
routes: Routes,
|
|
@@ -237,24 +180,20 @@ function validateHostCompatibility(
|
|
|
237
180
|
}
|
|
238
181
|
|
|
239
182
|
function rootParameters(values: Values) {
|
|
240
|
-
const projectRoot =
|
|
183
|
+
const projectRoot = requiredOption(values["project-root"], "--project-root");
|
|
241
184
|
const configRoot =
|
|
242
185
|
values["config-root"] !== undefined
|
|
243
|
-
?
|
|
186
|
+
? requiredOption(values["config-root"], "--config-root")
|
|
244
187
|
: projectRoot;
|
|
245
|
-
const resultsRoot =
|
|
188
|
+
const resultsRoot = requiredOption(values["results-root"], "--results-root");
|
|
246
189
|
const runStateRoot = values["run-state-root"]
|
|
247
|
-
?
|
|
190
|
+
? requiredOption(values["run-state-root"], "--run-state-root")
|
|
248
191
|
: resultsRoot;
|
|
249
192
|
return { projectRoot, configRoot, resultsRoot, runStateRoot };
|
|
250
193
|
}
|
|
251
194
|
|
|
252
195
|
type Roots = ReturnType<typeof rootParameters>;
|
|
253
196
|
|
|
254
|
-
function validQualifiedId(id: string): boolean {
|
|
255
|
-
return /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)+$/.test(id);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
197
|
function validateExtensionSelection(values: Values): void {
|
|
259
198
|
const policy = values["task-verdict-policy"];
|
|
260
199
|
if (policy !== undefined && !validQualifiedId(policy))
|
|
@@ -280,24 +219,18 @@ function validateReplacements(replacements: string[]): void {
|
|
|
280
219
|
}
|
|
281
220
|
|
|
282
221
|
function hasExtensionArguments(values: Values): boolean {
|
|
283
|
-
return (
|
|
284
|
-
[
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
].some(Boolean) ||
|
|
290
|
-
values["task-verdict-policy"] !== undefined ||
|
|
291
|
-
(values["replace-builtin-grader"] ?? []).length > 0
|
|
292
|
-
);
|
|
222
|
+
return EXTENSION_OPTIONS.some((name) => {
|
|
223
|
+
const value = values[name];
|
|
224
|
+
if (Array.isArray(value)) return value.length > 0;
|
|
225
|
+
if (name === "task-verdict-policy") return value !== undefined;
|
|
226
|
+
return Boolean(value);
|
|
227
|
+
});
|
|
293
228
|
}
|
|
294
229
|
|
|
295
230
|
function extensionSources(values: Values): string[] {
|
|
296
231
|
const sources = values["extension-source-file"];
|
|
297
232
|
if (!sources?.length)
|
|
298
233
|
throw new InvocationError("missing --extension-source-file");
|
|
299
|
-
if (sources.some((path) => !isAbsolute(path)))
|
|
300
|
-
throw new InvocationError("--extension-source-file must be absolute");
|
|
301
234
|
return sources;
|
|
302
235
|
}
|
|
303
236
|
|
|
@@ -334,42 +267,36 @@ function privateRootDeclarations(
|
|
|
334
267
|
return [
|
|
335
268
|
configRoot,
|
|
336
269
|
...protectedRoots,
|
|
337
|
-
values[
|
|
338
|
-
values["codex-auth-file"],
|
|
339
|
-
values["runtime-config-file"],
|
|
340
|
-
values["case-file"],
|
|
341
|
-
values["extension-command-file"],
|
|
342
|
-
...(values["extension-source-file"] ?? []),
|
|
343
|
-
values["extension-configuration-file"],
|
|
344
|
-
values["extension-redacted-configuration-file"],
|
|
345
|
-
values["case-source-root"],
|
|
346
|
-
values["case-source-map-file"],
|
|
347
|
-
values["semantic-adapter-module"],
|
|
348
|
-
values["advisory-adapter-module"],
|
|
270
|
+
...optionsWith("private", true).flatMap((name) => values[name] ?? []),
|
|
349
271
|
].filter((value): value is string => Boolean(value));
|
|
350
272
|
}
|
|
351
273
|
|
|
352
274
|
function commonCodexOptions(
|
|
353
275
|
values: Values,
|
|
354
|
-
routes: Routes,
|
|
355
276
|
roots: Roots,
|
|
356
277
|
privateRoots: string[],
|
|
357
278
|
) {
|
|
358
|
-
if (![routes.codex, routes.semanticCodex, routes.advisoryCodex].some(Boolean))
|
|
359
|
-
return undefined;
|
|
360
279
|
return {
|
|
361
|
-
binary:
|
|
362
|
-
authFile:
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
? undefined
|
|
366
|
-
: Number(values["codex-timeout-ms"]),
|
|
280
|
+
binary: requiredOption(values["codex-bin"], "--codex-bin"),
|
|
281
|
+
authFile: requiredOption(values["codex-auth-file"], "--codex-auth-file"),
|
|
282
|
+
retainHostDiagnostics: values["retain-host-diagnostics"] === true,
|
|
283
|
+
timeoutMs: codexTimeout(values["codex-timeout-ms"]),
|
|
367
284
|
projectRoot: roots.projectRoot,
|
|
368
285
|
resultsRoot: roots.resultsRoot,
|
|
369
286
|
additionalProtectedRoots: [...privateRoots, roots.runStateRoot],
|
|
370
287
|
};
|
|
371
288
|
}
|
|
372
289
|
|
|
290
|
+
function codexTimeout(value: string | undefined): number | undefined {
|
|
291
|
+
if (value === undefined) return undefined;
|
|
292
|
+
const timeout = Number(value);
|
|
293
|
+
if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 30 * 60_000)
|
|
294
|
+
throw new InvocationError(
|
|
295
|
+
"invalid --codex-timeout-ms; supply a positive integer at most 1800000 (30 minutes)",
|
|
296
|
+
);
|
|
297
|
+
return timeout;
|
|
298
|
+
}
|
|
299
|
+
|
|
373
300
|
function claudeHostOptions(
|
|
374
301
|
values: Values,
|
|
375
302
|
routes: Routes,
|
|
@@ -379,10 +306,11 @@ function claudeHostOptions(
|
|
|
379
306
|
) {
|
|
380
307
|
if (!routes.claude) return undefined;
|
|
381
308
|
return {
|
|
382
|
-
|
|
309
|
+
retainHostDiagnostics: values["retain-host-diagnostics"] === true,
|
|
310
|
+
binary: requiredOption(values["claude-bin"], "--claude-bin"),
|
|
383
311
|
...(values["claude-credential-file"]
|
|
384
312
|
? {
|
|
385
|
-
credentialFile:
|
|
313
|
+
credentialFile: requiredOption(
|
|
386
314
|
values["claude-credential-file"],
|
|
387
315
|
"--claude-credential-file",
|
|
388
316
|
),
|
|
@@ -390,7 +318,7 @@ function claudeHostOptions(
|
|
|
390
318
|
: {}),
|
|
391
319
|
...(values["claude-uv-cache-dir"]
|
|
392
320
|
? {
|
|
393
|
-
uvCacheDir:
|
|
321
|
+
uvCacheDir: requiredOption(
|
|
394
322
|
values["claude-uv-cache-dir"],
|
|
395
323
|
"--claude-uv-cache-dir",
|
|
396
324
|
),
|
|
@@ -410,17 +338,11 @@ function extensionInvocation(values: Values) {
|
|
|
410
338
|
const command = values["extension-command-file"];
|
|
411
339
|
if (!command) return undefined;
|
|
412
340
|
return {
|
|
413
|
-
commandFile:
|
|
341
|
+
commandFile: requiredOption(command, "--extension-command-file"),
|
|
414
342
|
sourceFiles: extensionSources(values),
|
|
415
343
|
caseId: requiredOption(values["case-id"], "--case-id"),
|
|
416
|
-
configurationFile:
|
|
417
|
-
|
|
418
|
-
"--extension-configuration-file",
|
|
419
|
-
),
|
|
420
|
-
redactedConfigurationFile: optionalAbsolute(
|
|
421
|
-
values["extension-redacted-configuration-file"],
|
|
422
|
-
"--extension-redacted-configuration-file",
|
|
423
|
-
),
|
|
344
|
+
configurationFile: values["extension-configuration-file"],
|
|
345
|
+
redactedConfigurationFile: values["extension-redacted-configuration-file"],
|
|
424
346
|
taskVerdictPolicy: values["task-verdict-policy"],
|
|
425
347
|
replaceBuiltinGraders: values["replace-builtin-grader"] ?? [],
|
|
426
348
|
};
|
|
@@ -435,16 +357,15 @@ const CODEX_MODEL_KEYS = {
|
|
|
435
357
|
function codexRoleOptions(
|
|
436
358
|
values: Values,
|
|
437
359
|
common: ReturnType<typeof commonCodexOptions>,
|
|
438
|
-
enabled: boolean,
|
|
439
360
|
role: keyof typeof CODEX_MODEL_KEYS,
|
|
440
361
|
) {
|
|
441
|
-
if (!enabled) return undefined;
|
|
442
|
-
if (!common)
|
|
443
|
-
throw new InvocationError("Codex options require a Codex host route");
|
|
444
362
|
const [modelKey, effortKey] = CODEX_MODEL_KEYS[role];
|
|
445
363
|
return {
|
|
446
364
|
...(role === "candidate"
|
|
447
|
-
? {
|
|
365
|
+
? {
|
|
366
|
+
entrypoint: values["codex-entrypoint"] as
|
|
367
|
+
"exec" | "app-server" | undefined,
|
|
368
|
+
}
|
|
448
369
|
: {}),
|
|
449
370
|
...common,
|
|
450
371
|
model: requiredOption(values[modelKey], `--${modelKey}`),
|
|
@@ -452,15 +373,25 @@ function codexRoleOptions(
|
|
|
452
373
|
};
|
|
453
374
|
}
|
|
454
375
|
|
|
455
|
-
function
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
return
|
|
376
|
+
function selectedCodexOptions(
|
|
377
|
+
values: Values,
|
|
378
|
+
routes: Routes,
|
|
379
|
+
roots: Roots,
|
|
380
|
+
privateRoots: string[],
|
|
381
|
+
) {
|
|
382
|
+
if (!routes.anyCodex) return {};
|
|
383
|
+
const common = commonCodexOptions(values, roots, privateRoots);
|
|
384
|
+
return {
|
|
385
|
+
codex: routes.codex
|
|
386
|
+
? codexRoleOptions(values, common, "candidate")
|
|
387
|
+
: undefined,
|
|
388
|
+
semanticCodex: routes.semanticCodex
|
|
389
|
+
? codexRoleOptions(values, common, "semantic")
|
|
390
|
+
: undefined,
|
|
391
|
+
advisoryCodex: routes.advisoryCodex
|
|
392
|
+
? codexRoleOptions(values, common, "advisory")
|
|
393
|
+
: undefined,
|
|
394
|
+
};
|
|
464
395
|
}
|
|
465
396
|
|
|
466
397
|
function invocationInputs(
|
|
@@ -472,55 +403,30 @@ function invocationInputs(
|
|
|
472
403
|
roots,
|
|
473
404
|
privateRoots,
|
|
474
405
|
toolchainBinDir,
|
|
475
|
-
|
|
406
|
+
codexOptions,
|
|
476
407
|
claudeOptions,
|
|
477
408
|
trials,
|
|
478
409
|
} = context;
|
|
479
410
|
return {
|
|
480
411
|
json: values.json ?? false,
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
).filter(
|
|
484
|
-
|
|
485
|
-
runtimeConfigFile: optionalAbsolute(
|
|
486
|
-
values["runtime-config-file"],
|
|
487
|
-
"--runtime-config-file",
|
|
412
|
+
runManifestFile: values["run-manifest-file"],
|
|
413
|
+
protectedRoots: context.protectedRoots,
|
|
414
|
+
deprecatedRuntimeOptions: optionsWith("section", "deprecated").filter(
|
|
415
|
+
(name) => values[name] !== undefined,
|
|
488
416
|
),
|
|
489
|
-
|
|
417
|
+
dry: values.dry ?? false,
|
|
418
|
+
runtimeConfigFile: values["runtime-config-file"],
|
|
419
|
+
caseFile: values["case-file"],
|
|
490
420
|
extension: extensionInvocation(values),
|
|
491
|
-
caseSourceRoot:
|
|
492
|
-
|
|
493
|
-
"--case-source-root",
|
|
494
|
-
),
|
|
495
|
-
caseSourceMapFile: optionalAbsolute(
|
|
496
|
-
values["case-source-map-file"],
|
|
497
|
-
"--case-source-map-file",
|
|
498
|
-
),
|
|
421
|
+
caseSourceRoot: values["case-source-root"],
|
|
422
|
+
caseSourceMapFile: values["case-source-map-file"],
|
|
499
423
|
adapterModule: routes.builtinHost
|
|
500
424
|
? undefined
|
|
501
|
-
:
|
|
502
|
-
semanticAdapterModule:
|
|
503
|
-
|
|
504
|
-
"--semantic-adapter-module",
|
|
505
|
-
),
|
|
506
|
-
semanticCodex: codexRoleOptions(
|
|
507
|
-
values,
|
|
508
|
-
codexCommon,
|
|
509
|
-
routes.semanticCodex,
|
|
510
|
-
"semantic",
|
|
511
|
-
),
|
|
512
|
-
advisoryAdapterModule: optionalAbsolute(
|
|
513
|
-
values["advisory-adapter-module"],
|
|
514
|
-
"--advisory-adapter-module",
|
|
515
|
-
),
|
|
516
|
-
advisoryCodex: codexRoleOptions(
|
|
517
|
-
values,
|
|
518
|
-
codexCommon,
|
|
519
|
-
routes.advisoryCodex,
|
|
520
|
-
"advisory",
|
|
521
|
-
),
|
|
425
|
+
: requiredOption(values["adapter-module"], "--adapter-module"),
|
|
426
|
+
semanticAdapterModule: values["semantic-adapter-module"],
|
|
427
|
+
advisoryAdapterModule: values["advisory-adapter-module"],
|
|
522
428
|
advisoryExcludedPaths: values["advisory-exclude"] ?? [],
|
|
523
|
-
|
|
429
|
+
...codexOptions,
|
|
524
430
|
claude: claudeOptions,
|
|
525
431
|
shellIsolation: shellIsolationOptions(
|
|
526
432
|
values,
|
|
@@ -532,10 +438,7 @@ function invocationInputs(
|
|
|
532
438
|
values["runner-build-digest"],
|
|
533
439
|
"--runner-build-digest",
|
|
534
440
|
),
|
|
535
|
-
runnerCheckoutRoot:
|
|
536
|
-
values["runner-checkout-root"],
|
|
537
|
-
"--runner-checkout-root",
|
|
538
|
-
),
|
|
441
|
+
runnerCheckoutRoot: values["runner-checkout-root"],
|
|
539
442
|
projectDigest: optionalDigest(values["project-digest"], "--project-digest"),
|
|
540
443
|
...trials,
|
|
541
444
|
};
|
|
@@ -558,14 +461,8 @@ function shellIsolationOptions(
|
|
|
558
461
|
function invocationContext(values: Values) {
|
|
559
462
|
const trials = trialParameters(values);
|
|
560
463
|
const protectedRoots = values["protected-root"] ?? [];
|
|
561
|
-
|
|
562
|
-
throw new InvocationError("--protected-root must be absolute");
|
|
563
|
-
const toolchainBinDir = optionalAbsolute(
|
|
564
|
-
values["toolchain-bin-dir"],
|
|
565
|
-
"--toolchain-bin-dir",
|
|
566
|
-
);
|
|
464
|
+
const toolchainBinDir = values["toolchain-bin-dir"];
|
|
567
465
|
const routes = hostRoutes(values);
|
|
568
|
-
validateHostCompatibility(values, routes, protectedRoots);
|
|
569
466
|
const roots = rootParameters(values);
|
|
570
467
|
validateExtensionSelection(values);
|
|
571
468
|
const privateRoots = privateRootDeclarations(
|
|
@@ -573,7 +470,12 @@ function invocationContext(values: Values) {
|
|
|
573
470
|
roots.configRoot,
|
|
574
471
|
protectedRoots,
|
|
575
472
|
);
|
|
576
|
-
const
|
|
473
|
+
const codexOptions = selectedCodexOptions(
|
|
474
|
+
values,
|
|
475
|
+
routes,
|
|
476
|
+
roots,
|
|
477
|
+
privateRoots,
|
|
478
|
+
);
|
|
577
479
|
const claudeOptions = claudeHostOptions(
|
|
578
480
|
values,
|
|
579
481
|
routes,
|
|
@@ -584,18 +486,113 @@ function invocationContext(values: Values) {
|
|
|
584
486
|
return {
|
|
585
487
|
routes,
|
|
586
488
|
roots,
|
|
489
|
+
protectedRoots,
|
|
587
490
|
privateRoots,
|
|
588
491
|
toolchainBinDir,
|
|
589
|
-
|
|
492
|
+
codexOptions,
|
|
590
493
|
claudeOptions,
|
|
591
494
|
trials,
|
|
592
495
|
};
|
|
593
496
|
}
|
|
594
497
|
|
|
595
498
|
/** Decode CLI flags in their documented validation order. */
|
|
596
|
-
export function parseInvocation(argv: string[]) {
|
|
499
|
+
export async function parseInvocation(argv: string[]) {
|
|
500
|
+
if (argv[0] !== "run")
|
|
501
|
+
throw new InvocationError(
|
|
502
|
+
"unknown command; available commands: demo, init, run, report, prune; run sevro --help",
|
|
503
|
+
);
|
|
597
504
|
const parsed = cliArguments(argv);
|
|
598
|
-
if (parsed.positionals.length !== 1
|
|
505
|
+
if (parsed.positionals.length !== 1)
|
|
599
506
|
throw new InvocationError("expected the run command");
|
|
507
|
+
parsed.values = await savedRunValues(parsed.values);
|
|
508
|
+
applyRunDefaults(parsed.values);
|
|
509
|
+
validateHostCompatibility(
|
|
510
|
+
parsed.values,
|
|
511
|
+
hostRoutes(parsed.values),
|
|
512
|
+
parsed.values["protected-root"] ?? [],
|
|
513
|
+
);
|
|
514
|
+
applyRootDefaults(parsed.values);
|
|
515
|
+
resolveNativeBinaries(parsed.values);
|
|
516
|
+
await canonicalizePaths(parsed.values);
|
|
600
517
|
return invocationInputs(parsed.values, invocationContext(parsed.values));
|
|
601
518
|
}
|
|
519
|
+
|
|
520
|
+
function resolveNativeBinaries(values: Values): void {
|
|
521
|
+
const routes = hostRoutes(values);
|
|
522
|
+
if (routes.anyCodex) values["codex-bin"] ??= nativeBinary("codex");
|
|
523
|
+
if (routes.claude) values["claude-bin"] ??= nativeBinary("claude");
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
function nativeBinary(host: "codex" | "claude"): string {
|
|
527
|
+
const binary = which(host);
|
|
528
|
+
if (!binary)
|
|
529
|
+
throw new InvocationError(
|
|
530
|
+
`selected ${host} executable was not found on PATH; install ${host} or supply --${host}-bin <path>`,
|
|
531
|
+
);
|
|
532
|
+
return binary;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
export type Invocation = Awaited<ReturnType<typeof parseInvocation>>;
|
|
536
|
+
|
|
537
|
+
/** Keep all selected native roles visible to protection and evidence callers. */
|
|
538
|
+
export function nativeRoutes(
|
|
539
|
+
invocation: Pick<
|
|
540
|
+
Invocation,
|
|
541
|
+
"codex" | "claude" | "semanticCodex" | "advisoryCodex"
|
|
542
|
+
>,
|
|
543
|
+
) {
|
|
544
|
+
return [
|
|
545
|
+
invocation.codex,
|
|
546
|
+
invocation.claude,
|
|
547
|
+
invocation.semanticCodex,
|
|
548
|
+
invocation.advisoryCodex,
|
|
549
|
+
].filter((host) => host !== undefined);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
function applyRunDefaults(values: Values): void {
|
|
553
|
+
values.condition ??= "passive";
|
|
554
|
+
values.trials ??= "1";
|
|
555
|
+
values.jobs ??= "3";
|
|
556
|
+
values.threshold ??= "1";
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
function applyRootDefaults(values: Values): void {
|
|
560
|
+
values["project-root"] ??= process.cwd();
|
|
561
|
+
values["results-root"] ??= join(
|
|
562
|
+
resolve(values["project-root"]),
|
|
563
|
+
".sevro",
|
|
564
|
+
"results",
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
async function canonicalOption(path: string, option: string): Promise<string> {
|
|
569
|
+
try {
|
|
570
|
+
return await canonicalRuntimeRoot(resolve(path));
|
|
571
|
+
} catch (cause) {
|
|
572
|
+
const error = cause as NodeJS.ErrnoException;
|
|
573
|
+
throw new InvocationError(
|
|
574
|
+
`--${option} cannot be resolved at ${path}: filesystem ${error.syscall ?? "realpath"} failed (${error.code ?? "unknown"}); supply a usable file or directory path`,
|
|
575
|
+
{ cause },
|
|
576
|
+
);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
async function canonicalizePaths(values: Values): Promise<void> {
|
|
581
|
+
for (const name of PATH_OPTIONS) {
|
|
582
|
+
const value = values[name];
|
|
583
|
+
if (value !== undefined)
|
|
584
|
+
values[name] = await canonicalOption(
|
|
585
|
+
requiredOption(value, `--${name}`),
|
|
586
|
+
name,
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
for (const name of PATH_LIST_OPTIONS) {
|
|
590
|
+
const paths = values[name];
|
|
591
|
+
if (paths)
|
|
592
|
+
values[name] = await Promise.all(
|
|
593
|
+
paths.map((path) =>
|
|
594
|
+
canonicalOption(requiredOption(path, `--${name}`), name),
|
|
595
|
+
),
|
|
596
|
+
);
|
|
597
|
+
}
|
|
598
|
+
}
|