@bjoernrochel/sevro 1.0.0 → 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 +34 -4
- package/README.md +7 -6
- 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/architecture.md +5 -2
- package/docs/creating-cases.md +2 -3
- package/docs/development-cli.md +12 -7
- package/docs/documentation-quality.md +4 -3
- package/docs/evaluation-workflow.md +8 -8
- package/docs/getting-started.md +7 -6
- package/docs/guide-evaluation.md +1 -1
- package/docs/identity-v1.md +4 -1
- package/docs/installing.md +31 -13
- package/docs/licensing.md +2 -2
- package/docs/native-hosts.md +1 -1
- package/docs/recipes.md +41 -40
- package/docs/releases.md +20 -4
- package/docs/run-settings-v1.md +3 -3
- package/docs/specs/repository-guide.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/typescript-quality.md +18 -1
- package/examples/recipes/executable.ts +19 -0
- package/examples/recipes/extension-artifacts.ts +1 -1
- package/examples/recipes/extension.ts +2 -1
- package/examples/recipes/modules.ts +9 -0
- package/examples/recipes/run-inputs.ts +14 -19
- package/examples/recipes/run-options.ts +9 -8
- package/examples/recipes/run.ts +21 -7
- package/examples/templates/repository-skill/extension-data.ts +1 -1
- package/examples/templates/repository-skill/extension.ts +2 -1
- package/package.json +14 -6
- package/src/cli/demo.ts +3 -2
- package/src/cli/help.ts +4 -3
- package/src/cli/init-settings.ts +5 -4
- package/src/cli/init.ts +9 -8
- package/src/cli/invocation.ts +2 -1
- package/src/cli/preparation.ts +2 -2
- package/src/cli.ts +1 -1
- package/src/executable.ts +19 -0
- package/src/extension-client.ts +6 -12
- package/src/fixtures/setup.ts +3 -2
- package/src/git.ts +2 -1
- package/src/graders/git-head.ts +3 -2
- package/src/graders/shell.ts +4 -3
- package/src/hosts/claude-keychain.ts +3 -2
- package/src/hosts/claude-login-refresh.ts +3 -2
- package/src/hosts/claude-refresh-lock.ts +2 -1
- package/src/hosts/isolation-roots.ts +3 -2
- package/src/hosts/process-lifecycle.ts +4 -6
- package/src/hosts/protected-worktrees.ts +2 -1
- package/src/hosts/skill-hook-handler.ts +1 -1
- package/src/hosts/skill-hooks.ts +10 -2
- package/src/provenance.ts +7 -6
- package/src/results-lock.ts +4 -4
- package/src/run-owner.ts +15 -9
- package/src/runner-paths.ts +21 -0
- package/src/runtime/hook-processes.ts +2 -1
- package/src/runtime/hooks.ts +9 -7
- package/src/runtime-process.ts +194 -0
- package/src/sqlite-lock.ts +25 -0
|
@@ -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"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { isResolvedCase, resolvedCaseIssue } from "../case-validation.js";
|
|
5
|
+
import { prepareInstrumentation } from "../instrumentation.js";
|
|
6
|
+
import { isRecord, isStringArray, validQualifiedId } from "../value-guards.js";
|
|
7
|
+
import { InvocationError } from "./invocation.js";
|
|
8
|
+
export function parseCase(value) {
|
|
9
|
+
if (!isResolvedCase(value))
|
|
10
|
+
throw new InvocationError(`invalid resolved case file: ${resolvedCaseIssue(value) ?? "invalid case"}`);
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
export async function loadCase(path) {
|
|
14
|
+
try {
|
|
15
|
+
return parseCase(JSON.parse(await readFile(path, "utf8")));
|
|
16
|
+
}
|
|
17
|
+
catch (cause) {
|
|
18
|
+
const detail = cause instanceof InvocationError ? `: ${cause.message}` : "";
|
|
19
|
+
throw new InvocationError(`resolved case file is unreadable or invalid at ${path}${detail}; supply --case-file with readable JSON and correct the named field`, {
|
|
20
|
+
cause,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function loadJson(path, label) {
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
27
|
+
}
|
|
28
|
+
catch (cause) {
|
|
29
|
+
throw new InvocationError(`${label} is unreadable or invalid`, { cause });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function validExtensionCommand(value) {
|
|
33
|
+
return (isStringArray(value) &&
|
|
34
|
+
value.length > 0 &&
|
|
35
|
+
value.every((part) => part.length > 0) &&
|
|
36
|
+
isAbsolute(value[0] ?? ""));
|
|
37
|
+
}
|
|
38
|
+
async function loadExtensionCommand(path) {
|
|
39
|
+
const command = await loadJson(path, "extension command file");
|
|
40
|
+
if (!validExtensionCommand(command))
|
|
41
|
+
throw new InvocationError("extension command must be an absolute argv array");
|
|
42
|
+
return command;
|
|
43
|
+
}
|
|
44
|
+
export async function loadExtensionOptions(selected) {
|
|
45
|
+
const command = await loadExtensionCommand(selected.commandFile);
|
|
46
|
+
const configuration = selected.configurationFile
|
|
47
|
+
? await loadJson(selected.configurationFile, "extension configuration file")
|
|
48
|
+
: {};
|
|
49
|
+
const redactedConfiguration = selected.redactedConfigurationFile
|
|
50
|
+
? await loadJson(selected.redactedConfigurationFile, "redacted extension configuration file")
|
|
51
|
+
: {};
|
|
52
|
+
if (!isRecord(configuration) || !isRecord(redactedConfiguration))
|
|
53
|
+
throw new InvocationError("extension configuration must be JSON objects");
|
|
54
|
+
return { command, configuration, redactedConfiguration };
|
|
55
|
+
}
|
|
56
|
+
export async function loadPreparationSources(selected) {
|
|
57
|
+
if (!selected.caseSourceRoot || !selected.caseSourceMapFile)
|
|
58
|
+
return undefined;
|
|
59
|
+
const refs = await loadJson(selected.caseSourceMapFile, "case source map file");
|
|
60
|
+
if (!isRecord(refs) ||
|
|
61
|
+
!Object.values(refs).every((value) => typeof value === "string" && value.startsWith("file:///")))
|
|
62
|
+
throw new InvocationError("case source map must contain file URLs");
|
|
63
|
+
return {
|
|
64
|
+
root: selected.caseSourceRoot,
|
|
65
|
+
refs: refs,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function adapterModule(path) {
|
|
69
|
+
try {
|
|
70
|
+
return await import(pathToFileURL(path).href);
|
|
71
|
+
}
|
|
72
|
+
catch (cause) {
|
|
73
|
+
throw new InvocationError(`host adapter module could not be loaded at ${path}; check that the module exists and imports successfully, then correct --adapter-module or the selected grading adapter option`, { cause });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function loadHost(path) {
|
|
77
|
+
const module = await adapterModule(path);
|
|
78
|
+
const host = isRecord(module) ? module.default : null;
|
|
79
|
+
if (!validHostAdapter(host))
|
|
80
|
+
throw new InvocationError(`host adapter module has no valid default adapter at ${path}; export a default adapter with string id, model, effort and a run function`);
|
|
81
|
+
validateHostInstrumentation(host);
|
|
82
|
+
validateHostCapabilities(host.hostCapabilities);
|
|
83
|
+
return host;
|
|
84
|
+
}
|
|
85
|
+
function validateHostInstrumentation(host) {
|
|
86
|
+
try {
|
|
87
|
+
prepareInstrumentation([], host.instrumentation ?? [], [], "passive");
|
|
88
|
+
}
|
|
89
|
+
catch (cause) {
|
|
90
|
+
throw new InvocationError("host adapter instrumentation is invalid", {
|
|
91
|
+
cause,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function validHostAdapter(value) {
|
|
96
|
+
return (isRecord(value) &&
|
|
97
|
+
typeof value.id === "string" &&
|
|
98
|
+
typeof value.model === "string" &&
|
|
99
|
+
typeof value.effort === "string" &&
|
|
100
|
+
typeof value.run === "function");
|
|
101
|
+
}
|
|
102
|
+
function validateHostCapabilities(value) {
|
|
103
|
+
if (value === undefined)
|
|
104
|
+
return;
|
|
105
|
+
if (!isStringArray(value) ||
|
|
106
|
+
value.some((id) => !validQualifiedId(id)) ||
|
|
107
|
+
new Set(value).size !== value.length)
|
|
108
|
+
throw new InvocationError("host adapter capabilities are invalid");
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=loading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.js","sourceRoot":"","sources":["loading.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { isAbsolute } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { isResolvedCase, resolvedCaseIssue } from \"../case-validation\";\nimport type { HostAdapter, ResolvedCase } from \"../engine\";\nimport { prepareInstrumentation } from \"../instrumentation\";\nimport { isRecord, isStringArray, validQualifiedId } from \"../value-guards\";\nimport { InvocationError, type Invocation } from \"./invocation\";\n\nexport function parseCase(value: unknown): ResolvedCase {\n if (!isResolvedCase(value))\n throw new InvocationError(\n `invalid resolved case file: ${resolvedCaseIssue(value) ?? \"invalid case\"}`,\n );\n return value;\n}\n\nexport async function loadCase(path: string): Promise<ResolvedCase> {\n try {\n return parseCase(JSON.parse(await readFile(path, \"utf8\")));\n } catch (cause) {\n const detail = cause instanceof InvocationError ? `: ${cause.message}` : \"\";\n throw new InvocationError(\n `resolved case file is unreadable or invalid at ${path}${detail}; supply --case-file with readable JSON and correct the named field`,\n {\n cause,\n },\n );\n }\n}\n\nasync function loadJson(path: string, label: string): Promise<unknown> {\n try {\n return JSON.parse(await readFile(path, \"utf8\"));\n } catch (cause) {\n throw new InvocationError(`${label} is unreadable or invalid`, { cause });\n }\n}\n\nfunction validExtensionCommand(value: unknown): value is string[] {\n return (\n isStringArray(value) &&\n value.length > 0 &&\n value.every((part) => part.length > 0) &&\n isAbsolute(value[0] ?? \"\")\n );\n}\n\nasync function loadExtensionCommand(path: string): Promise<string[]> {\n const command = await loadJson(path, \"extension command file\");\n if (!validExtensionCommand(command))\n throw new InvocationError(\n \"extension command must be an absolute argv array\",\n );\n return command;\n}\n\nexport async function loadExtensionOptions(\n selected: NonNullable<Invocation[\"extension\"]>,\n) {\n const command = await loadExtensionCommand(selected.commandFile);\n const configuration = selected.configurationFile\n ? await loadJson(selected.configurationFile, \"extension configuration file\")\n : {};\n const redactedConfiguration = selected.redactedConfigurationFile\n ? await loadJson(\n selected.redactedConfigurationFile,\n \"redacted extension configuration file\",\n )\n : {};\n if (!isRecord(configuration) || !isRecord(redactedConfiguration))\n throw new InvocationError(\"extension configuration must be JSON objects\");\n return { command, configuration, redactedConfiguration };\n}\n\nexport async function loadPreparationSources(selected: Invocation) {\n if (!selected.caseSourceRoot || !selected.caseSourceMapFile) return undefined;\n const refs = await loadJson(\n selected.caseSourceMapFile,\n \"case source map file\",\n );\n if (\n !isRecord(refs) ||\n !Object.values(refs).every(\n (value) => typeof value === \"string\" && value.startsWith(\"file:///\"),\n )\n )\n throw new InvocationError(\"case source map must contain file URLs\");\n return {\n root: selected.caseSourceRoot,\n refs: refs as Record<string, string>,\n };\n}\n\nasync function adapterModule(path: string): Promise<unknown> {\n try {\n return await import(pathToFileURL(path).href);\n } catch (cause) {\n throw new InvocationError(\n `host adapter module could not be loaded at ${path}; check that the module exists and imports successfully, then correct --adapter-module or the selected grading adapter option`,\n { cause },\n );\n }\n}\n\nexport async function loadHost(path: string): Promise<HostAdapter> {\n const module = await adapterModule(path);\n const host = isRecord(module) ? module.default : null;\n if (!validHostAdapter(host))\n throw new InvocationError(\n `host adapter module has no valid default adapter at ${path}; export a default adapter with string id, model, effort and a run function`,\n );\n validateHostInstrumentation(host);\n validateHostCapabilities(host.hostCapabilities);\n return host as unknown as HostAdapter;\n}\n\nfunction validateHostInstrumentation(host: Record<string, unknown>): void {\n try {\n prepareInstrumentation(\n [],\n (host.instrumentation as HostAdapter[\"instrumentation\"]) ?? [],\n [],\n \"passive\",\n );\n } catch (cause) {\n throw new InvocationError(\"host adapter instrumentation is invalid\", {\n cause,\n });\n }\n}\n\nfunction validHostAdapter(value: unknown): value is Record<string, unknown> {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.model === \"string\" &&\n typeof value.effort === \"string\" &&\n typeof value.run === \"function\"\n );\n}\n\nfunction validateHostCapabilities(value: unknown): void {\n if (value === undefined) return;\n if (\n !isStringArray(value) ||\n value.some((id) => !validQualifiedId(id)) ||\n new Set(value).size !== value.length\n )\n throw new InvocationError(\"host adapter capabilities are invalid\");\n}\n"]}
|