@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,148 @@
|
|
|
1
|
+
import { prepareEvaluation } from "./plan.js";
|
|
2
|
+
import { canonicalJson, hashJson } from "../identity.js";
|
|
3
|
+
import { exitCodeFor, summarizeCases } from "../results.js";
|
|
4
|
+
import { runtimePolicySnapshot } from "../runtime/config.js";
|
|
5
|
+
import { cleanupExpiredWorkspaces } from "../fixtures/workspace-state.js";
|
|
6
|
+
import { assertCliResult, assertRunEvidence } from "../schema.js";
|
|
7
|
+
import { atomicWriteJson } from "../storage.js";
|
|
8
|
+
import { allocateRunResources, retainPreparationArtifacts, } from "./resources.js";
|
|
9
|
+
import { ResultCollector } from "./collection.js";
|
|
10
|
+
import { executeEvaluationTrials } from "./trial.js";
|
|
11
|
+
import { evaluationProgress } from "./progress.js";
|
|
12
|
+
function evaluationSignal(options) {
|
|
13
|
+
const reason = options.signal?.aborted
|
|
14
|
+
? options.signal.reason
|
|
15
|
+
: null;
|
|
16
|
+
return reason === "SIGINT" || reason === "SIGTERM" ? reason : undefined;
|
|
17
|
+
}
|
|
18
|
+
function finalCliResult(options, resources, collected) {
|
|
19
|
+
const caseResult = collected.caseSummary;
|
|
20
|
+
const assessment = summarizeCases([caseResult]);
|
|
21
|
+
const diagnostic = collected.diagnostic;
|
|
22
|
+
return {
|
|
23
|
+
format: "sevro.cli-result.v1",
|
|
24
|
+
runId: resources.runId,
|
|
25
|
+
...assessment,
|
|
26
|
+
exitCode: exitCodeFor(assessment, {
|
|
27
|
+
dryRun: options.dry,
|
|
28
|
+
signal: evaluationSignal(options),
|
|
29
|
+
}),
|
|
30
|
+
evidencePath: resources.evidencePath,
|
|
31
|
+
cases: [caseResult],
|
|
32
|
+
...(diagnostic ? { diagnostic } : {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function finalConditionEvidence(options, requestedInstrumentation, trials) {
|
|
36
|
+
const actualConditions = [
|
|
37
|
+
...new Set(trials.map((entry) => entry.condition.actual)),
|
|
38
|
+
];
|
|
39
|
+
const commonAppliedInstrumentation = trials.length === options.trialCount &&
|
|
40
|
+
trials.every((entry) => canonicalJson(entry.condition.appliedInstrumentation) ===
|
|
41
|
+
canonicalJson(requestedInstrumentation))
|
|
42
|
+
? requestedInstrumentation
|
|
43
|
+
: [];
|
|
44
|
+
return {
|
|
45
|
+
requested: options.condition,
|
|
46
|
+
actual: actualConditions.length === 1 ? actualConditions[0] : "unknown",
|
|
47
|
+
requestedInstrumentation,
|
|
48
|
+
appliedInstrumentation: commonAppliedInstrumentation,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function finalExtensionEvidence(options, replacedBuiltinGraders) {
|
|
52
|
+
const extension = options.extension;
|
|
53
|
+
if (!extension)
|
|
54
|
+
return null;
|
|
55
|
+
const identity = extension.session.identity;
|
|
56
|
+
return {
|
|
57
|
+
id: identity.id,
|
|
58
|
+
version: identity.version,
|
|
59
|
+
sourceDigest: identity.sourceDigest,
|
|
60
|
+
configurationDigest: identity.configurationDigest,
|
|
61
|
+
protocol: identity.protocol,
|
|
62
|
+
capabilities: identity.capabilities,
|
|
63
|
+
replacements: {
|
|
64
|
+
graders: replacedBuiltinGraders,
|
|
65
|
+
taskVerdictPolicy: identity.selectedTaskVerdictPolicy,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function finalRunEvidence(options, prepared, resources, collected, result) {
|
|
70
|
+
const condition = finalConditionEvidence(options, prepared.requestedInstrumentation, collected.trials);
|
|
71
|
+
const diagnostic = collected.diagnostic;
|
|
72
|
+
return {
|
|
73
|
+
format: "sevro.run-evidence.v1",
|
|
74
|
+
runId: resources.runId,
|
|
75
|
+
evaluationIdentity: prepared.evaluationIdentity,
|
|
76
|
+
configuration: {
|
|
77
|
+
digest: hashJson(prepared.redactedConfig),
|
|
78
|
+
redacted: prepared.redactedConfig,
|
|
79
|
+
...(options.resolvedRunSettings
|
|
80
|
+
? { resolved: options.resolvedRunSettings }
|
|
81
|
+
: {}),
|
|
82
|
+
},
|
|
83
|
+
runner: prepared.runner,
|
|
84
|
+
project: prepared.project,
|
|
85
|
+
extension: finalExtensionEvidence(options, prepared.checks.replacedBuiltinGraders),
|
|
86
|
+
condition,
|
|
87
|
+
graders: {
|
|
88
|
+
active: prepared.activeGraders,
|
|
89
|
+
replacedDefaults: prepared.checks.replacedBuiltinGraders,
|
|
90
|
+
},
|
|
91
|
+
routes: prepared.routes,
|
|
92
|
+
result,
|
|
93
|
+
trials: collected.trials,
|
|
94
|
+
...(diagnostic ? { diagnostic } : {}),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async function finishEvaluationRun(options, context) {
|
|
98
|
+
const collected = context.results.snapshot({
|
|
99
|
+
caseId: options.case.id,
|
|
100
|
+
passThreshold: options.passThreshold,
|
|
101
|
+
cancelled: Boolean(options.signal?.aborted),
|
|
102
|
+
});
|
|
103
|
+
const result = finalCliResult(options, context.resources, collected);
|
|
104
|
+
const evidence = finalRunEvidence(options, context.prepared, context.resources, collected, result);
|
|
105
|
+
assertCliResult(result);
|
|
106
|
+
assertRunEvidence(evidence);
|
|
107
|
+
evaluationProgress(options, "evidence", "started");
|
|
108
|
+
await atomicWriteJson(context.resources.evidencePath, evidence);
|
|
109
|
+
context.results.checkpoint(options.signal?.aborted ? "interrupted" : "complete");
|
|
110
|
+
evaluationProgress(options, "evidence", "completed");
|
|
111
|
+
return { result };
|
|
112
|
+
}
|
|
113
|
+
/** Execute resolved evaluator data through an injected host and retain every trial. */
|
|
114
|
+
export async function runEvaluation(options) {
|
|
115
|
+
options = {
|
|
116
|
+
...options,
|
|
117
|
+
runtimePolicy: runtimePolicySnapshot(options.runtimePolicy),
|
|
118
|
+
};
|
|
119
|
+
evaluationProgress(options, "preparation", "started");
|
|
120
|
+
await cleanupExpiredWorkspaces();
|
|
121
|
+
const prepared = await prepareEvaluation(options);
|
|
122
|
+
const resources = await allocateRunResources(options, prepared.evaluationIdentity.digest);
|
|
123
|
+
const results = new ResultCollector(resources.owner);
|
|
124
|
+
try {
|
|
125
|
+
const preparationArtifacts = await retainPreparationArtifacts(prepared.fixture.inlineArtifacts, resources.runDir);
|
|
126
|
+
await resources.workspaces.reserve({
|
|
127
|
+
count: options.trialCount,
|
|
128
|
+
semantic: prepared.checks.preparedSemantic.length > 0,
|
|
129
|
+
signal: options.signal,
|
|
130
|
+
});
|
|
131
|
+
const context = {
|
|
132
|
+
prepared,
|
|
133
|
+
resources,
|
|
134
|
+
results,
|
|
135
|
+
preparationArtifacts,
|
|
136
|
+
};
|
|
137
|
+
await executeEvaluationTrials(options, context);
|
|
138
|
+
return await finishEvaluationRun(options, context);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
results.diagnoseFailure();
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
await resources.workspaces.cleanup();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["run.ts"],"names":[],"mappings":"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","sourcesContent":["import { prepareEvaluation, type PreparedEvaluation } from \"./plan\";\nimport { type CliResult, type EvaluationOptions } from \"./types\";\nimport { canonicalJson, hashJson } from \"../identity\";\nimport { exitCodeFor, summarizeCases } from \"../results\";\nimport { runtimePolicySnapshot } from \"../runtime/config\";\nimport { cleanupExpiredWorkspaces } from \"../fixtures/workspace-state\";\nimport { assertCliResult, assertRunEvidence } from \"../schema\";\nimport { atomicWriteJson } from \"../storage\";\nimport {\n allocateRunResources,\n retainPreparationArtifacts,\n type RunResources,\n} from \"./resources\";\nimport type { EvaluationContext } from \"./context\";\nimport { ResultCollector, type CollectedResults } from \"./collection\";\nimport { executeEvaluationTrials } from \"./trial\";\nimport { evaluationProgress } from \"./progress\";\n\nfunction evaluationSignal(\n options: EvaluationOptions,\n): \"SIGINT\" | \"SIGTERM\" | undefined {\n const reason: unknown = options.signal?.aborted\n ? options.signal.reason\n : null;\n return reason === \"SIGINT\" || reason === \"SIGTERM\" ? reason : undefined;\n}\n\nfunction finalCliResult(\n options: EvaluationOptions,\n resources: RunResources,\n collected: CollectedResults,\n): CliResult {\n const caseResult = collected.caseSummary;\n const assessment = summarizeCases([caseResult]);\n const diagnostic = collected.diagnostic;\n return {\n format: \"sevro.cli-result.v1\",\n runId: resources.runId,\n ...assessment,\n exitCode: exitCodeFor(assessment, {\n dryRun: options.dry,\n signal: evaluationSignal(options),\n }),\n evidencePath: resources.evidencePath,\n cases: [caseResult],\n ...(diagnostic ? { diagnostic } : {}),\n };\n}\n\nfunction finalConditionEvidence(\n options: Pick<EvaluationOptions, \"condition\" | \"trialCount\">,\n requestedInstrumentation: PreparedEvaluation[\"requestedInstrumentation\"],\n trials: CollectedResults[\"trials\"],\n) {\n const actualConditions = [\n ...new Set(trials.map((entry) => entry.condition.actual)),\n ];\n const commonAppliedInstrumentation =\n trials.length === options.trialCount &&\n trials.every(\n (entry) =>\n canonicalJson(entry.condition.appliedInstrumentation) ===\n canonicalJson(requestedInstrumentation),\n )\n ? requestedInstrumentation\n : [];\n return {\n requested: options.condition,\n actual: actualConditions.length === 1 ? actualConditions[0] : \"unknown\",\n requestedInstrumentation,\n appliedInstrumentation: commonAppliedInstrumentation,\n };\n}\n\nfunction finalExtensionEvidence(\n options: EvaluationOptions,\n replacedBuiltinGraders: string[],\n) {\n const extension = options.extension;\n if (!extension) return null;\n const identity = extension.session.identity;\n return {\n id: identity.id,\n version: identity.version,\n sourceDigest: identity.sourceDigest,\n configurationDigest: identity.configurationDigest,\n protocol: identity.protocol,\n capabilities: identity.capabilities,\n replacements: {\n graders: replacedBuiltinGraders,\n taskVerdictPolicy: identity.selectedTaskVerdictPolicy,\n },\n };\n}\n\nfunction finalRunEvidence(\n options: EvaluationOptions,\n prepared: PreparedEvaluation,\n resources: RunResources,\n collected: CollectedResults,\n result: CliResult,\n) {\n const condition = finalConditionEvidence(\n options,\n prepared.requestedInstrumentation,\n collected.trials,\n );\n const diagnostic = collected.diagnostic;\n return {\n format: \"sevro.run-evidence.v1\",\n runId: resources.runId,\n evaluationIdentity: prepared.evaluationIdentity,\n configuration: {\n digest: hashJson(prepared.redactedConfig),\n redacted: prepared.redactedConfig,\n ...(options.resolvedRunSettings\n ? { resolved: options.resolvedRunSettings }\n : {}),\n },\n runner: prepared.runner,\n project: prepared.project,\n extension: finalExtensionEvidence(\n options,\n prepared.checks.replacedBuiltinGraders,\n ),\n condition,\n graders: {\n active: prepared.activeGraders,\n replacedDefaults: prepared.checks.replacedBuiltinGraders,\n },\n routes: prepared.routes,\n result,\n trials: collected.trials,\n ...(diagnostic ? { diagnostic } : {}),\n };\n}\n\nasync function finishEvaluationRun(\n options: EvaluationOptions,\n context: EvaluationContext,\n) {\n const collected = context.results.snapshot({\n caseId: options.case.id,\n passThreshold: options.passThreshold,\n cancelled: Boolean(options.signal?.aborted),\n });\n const result = finalCliResult(options, context.resources, collected);\n const evidence = finalRunEvidence(\n options,\n context.prepared,\n context.resources,\n collected,\n result,\n );\n assertCliResult(result);\n assertRunEvidence(evidence);\n evaluationProgress(options, \"evidence\", \"started\");\n await atomicWriteJson(context.resources.evidencePath, evidence);\n context.results.checkpoint(\n options.signal?.aborted ? \"interrupted\" : \"complete\",\n );\n evaluationProgress(options, \"evidence\", \"completed\");\n return { result };\n}\n\n/** Execute resolved evaluator data through an injected host and retain every trial. */\nexport async function runEvaluation(\n options: EvaluationOptions,\n): Promise<{ result: CliResult }> {\n options = {\n ...options,\n runtimePolicy: runtimePolicySnapshot(options.runtimePolicy),\n };\n evaluationProgress(options, \"preparation\", \"started\");\n await cleanupExpiredWorkspaces();\n const prepared = await prepareEvaluation(options);\n const resources = await allocateRunResources(\n options,\n prepared.evaluationIdentity.digest,\n );\n const results = new ResultCollector(resources.owner);\n try {\n const preparationArtifacts = await retainPreparationArtifacts(\n prepared.fixture.inlineArtifacts,\n resources.runDir,\n );\n await resources.workspaces.reserve({\n count: options.trialCount,\n semantic: prepared.checks.preparedSemantic.length > 0,\n signal: options.signal,\n });\n const context: EvaluationContext = {\n prepared,\n resources,\n results,\n preparationArtifacts,\n };\n await executeEvaluationTrials(options, context);\n return await finishEvaluationRun(options, context);\n } catch (error) {\n results.diagnoseFailure();\n throw error;\n } finally {\n await resources.workspaces.cleanup();\n }\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Bound trial admission, stop on errors/cancellation, and drain active work. */
|
|
2
|
+
export async function scheduleTrials(options, run) {
|
|
3
|
+
let nextTrial = 1;
|
|
4
|
+
let stopped = false;
|
|
5
|
+
const stopAdmission = () => {
|
|
6
|
+
stopped = true;
|
|
7
|
+
};
|
|
8
|
+
let failure;
|
|
9
|
+
const admitting = () => !stopped && !options.signal?.aborted && nextTrial <= options.count;
|
|
10
|
+
const worker = async () => {
|
|
11
|
+
while (admitting()) {
|
|
12
|
+
const trial = nextTrial++;
|
|
13
|
+
try {
|
|
14
|
+
if (!(await run(trial, stopAdmission)))
|
|
15
|
+
stopAdmission();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
stopped = true;
|
|
19
|
+
failure ??= { error };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
await Promise.all(Array.from({ length: Math.min(options.jobs, options.count) }, worker));
|
|
24
|
+
if (failure)
|
|
25
|
+
throw failure.error;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["scheduler.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8D,EAC9D,GAAmE;IAEnE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC,CAAC;IACF,IAAI,OAAuC,CAAC;IAC5C,MAAM,SAAS,GAAG,GAAG,EAAE,CACrB,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC;IACrE,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,SAAS,EAAE,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;oBAAE,aAAa,EAAE,CAAC;YAC1D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,KAAK,EAAE,KAAK,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CACtE,CAAC;IACF,IAAI,OAAO;QAAE,MAAM,OAAO,CAAC,KAAK,CAAC;AACnC,CAAC","sourcesContent":["/** Bound trial admission, stop on errors/cancellation, and drain active work. */\nexport async function scheduleTrials(\n options: { count: number; jobs: number; signal?: AbortSignal },\n run: (trial: number, stopAdmission: () => void) => Promise<boolean>,\n): Promise<void> {\n let nextTrial = 1;\n let stopped = false;\n const stopAdmission = () => {\n stopped = true;\n };\n let failure: { error: unknown } | undefined;\n const admitting = () =>\n !stopped && !options.signal?.aborted && nextTrial <= options.count;\n const worker = async () => {\n while (admitting()) {\n const trial = nextTrial++;\n try {\n if (!(await run(trial, stopAdmission))) stopAdmission();\n } catch (error) {\n stopped = true;\n failure ??= { error };\n }\n }\n };\n await Promise.all(\n Array.from({ length: Math.min(options.jobs, options.count) }, worker),\n );\n if (failure) throw failure.error;\n}\n"]}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { clearFixtureContents } from "../fixtures/cleanup.js";
|
|
2
|
+
import { createFixture } from "../fixtures/create.js";
|
|
3
|
+
import { usage } from "../evidence/usage.js";
|
|
4
|
+
import { gradingRuntimePolicy, scopedHostArtifacts } from "./grading-host.js";
|
|
5
|
+
import { HostExecutionFailure, } from "./types.js";
|
|
6
|
+
import { readSemanticArtifact } from "../graders/artifact.js";
|
|
7
|
+
import { parseSemanticVerdicts, semanticCheckGroups, semanticPrompt, } from "../graders/semantic.js";
|
|
8
|
+
import { sha256 } from "../identity.js";
|
|
9
|
+
import { HostDiagnosticPersistenceError } from "../host-diagnostics.js";
|
|
10
|
+
function semanticGroupSuffix(pattern) {
|
|
11
|
+
return pattern === undefined ? "" : "." + sha256(pattern);
|
|
12
|
+
}
|
|
13
|
+
function semanticSource(artifact) {
|
|
14
|
+
return artifact
|
|
15
|
+
? {
|
|
16
|
+
kind: "artifact",
|
|
17
|
+
path: artifact.path,
|
|
18
|
+
sha256: sha256(artifact.content),
|
|
19
|
+
}
|
|
20
|
+
: { kind: "response" };
|
|
21
|
+
}
|
|
22
|
+
function semanticHostPrompt(message, checks, artifact) {
|
|
23
|
+
return semanticPrompt(artifact?.content ?? message, checks, artifact ? "document" : "response");
|
|
24
|
+
}
|
|
25
|
+
class SemanticGrading {
|
|
26
|
+
input;
|
|
27
|
+
effects;
|
|
28
|
+
observations = [];
|
|
29
|
+
checks = [];
|
|
30
|
+
failure = null;
|
|
31
|
+
constructor(input, effects) {
|
|
32
|
+
this.input = input;
|
|
33
|
+
this.effects = effects;
|
|
34
|
+
}
|
|
35
|
+
async run() {
|
|
36
|
+
for (const group of semanticCheckGroups([...this.input.checks]))
|
|
37
|
+
await this.gradeSemanticGroup(group);
|
|
38
|
+
return {
|
|
39
|
+
checks: this.checks,
|
|
40
|
+
observations: this.observations,
|
|
41
|
+
failure: this.failure,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
failGrading(message, cancelable = true) {
|
|
45
|
+
this.failure = { message, cancelable };
|
|
46
|
+
this.effects.onFailure(this.failure);
|
|
47
|
+
}
|
|
48
|
+
async semanticInput(pattern) {
|
|
49
|
+
return pattern === undefined
|
|
50
|
+
? null
|
|
51
|
+
: readSemanticArtifact(this.input.candidateWorkspace, pattern);
|
|
52
|
+
}
|
|
53
|
+
async semanticWorkspace() {
|
|
54
|
+
return createFixture({ kind: "inline", files: {} }, {
|
|
55
|
+
projectRoot: this.input.projectRoot,
|
|
56
|
+
signal: this.input.signal,
|
|
57
|
+
reservedWorkspace: this.input.reservedWorkspace,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async runSemanticHost(group, pattern, suffix, workspace, message) {
|
|
61
|
+
let source = { kind: "response" };
|
|
62
|
+
try {
|
|
63
|
+
const artifact = await this.semanticInput(pattern);
|
|
64
|
+
source = semanticSource(artifact);
|
|
65
|
+
const host = this.input.host;
|
|
66
|
+
if (!host)
|
|
67
|
+
throw new Error("semantic host is unavailable");
|
|
68
|
+
const response = await host
|
|
69
|
+
.run({
|
|
70
|
+
retainHostDiagnostics: (bytes) => this.effects.evidence.retainArtifacts([
|
|
71
|
+
{
|
|
72
|
+
id: `sevro.semantic${suffix}.sevro.host.diagnostics`,
|
|
73
|
+
bytes: Buffer.from(bytes),
|
|
74
|
+
},
|
|
75
|
+
]),
|
|
76
|
+
candidateTranscriptRoot: this.input.candidateTranscriptRoot,
|
|
77
|
+
candidateArtifactRoots: this.input.candidateArtifactRoots,
|
|
78
|
+
prompt: semanticHostPrompt(message, group, artifact),
|
|
79
|
+
runtimePolicy: gradingRuntimePolicy(this.input.runtimePolicy, pattern === undefined),
|
|
80
|
+
runtimeRole: "semantic",
|
|
81
|
+
workspace,
|
|
82
|
+
condition: "passive",
|
|
83
|
+
signal: this.input.signal,
|
|
84
|
+
})
|
|
85
|
+
.catch((cause) => {
|
|
86
|
+
if (cause instanceof HostExecutionFailure)
|
|
87
|
+
return cause.result;
|
|
88
|
+
throw cause;
|
|
89
|
+
});
|
|
90
|
+
const artifacts = scopedHostArtifacts(response, `sevro.semantic${suffix}.`, this.effects.evidence.artifactRefs, this.input.declaredChecks, `sevro.semantic.verdicts${suffix}`);
|
|
91
|
+
return { result: response, artifacts, source, hostId: host.id };
|
|
92
|
+
}
|
|
93
|
+
catch (cause) {
|
|
94
|
+
if (cause instanceof HostDiagnosticPersistenceError)
|
|
95
|
+
throw cause;
|
|
96
|
+
this.failGrading("semantic grading did not complete");
|
|
97
|
+
return { result: null, artifacts: [], source, hostId: null };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
recordSemanticVerdict(verdict, pattern, source, hostId) {
|
|
101
|
+
const id = `sevro.observation.semantic.${sha256(verdict.id)}`;
|
|
102
|
+
this.observations.push({
|
|
103
|
+
id,
|
|
104
|
+
source: hostId,
|
|
105
|
+
completeness: "complete",
|
|
106
|
+
data: {
|
|
107
|
+
verdict: verdict.verdict,
|
|
108
|
+
reason: verdict.reason,
|
|
109
|
+
...(pattern === undefined ? {} : { source }),
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
this.checks.push({
|
|
113
|
+
id: verdict.id,
|
|
114
|
+
grader: "sevro.semantic",
|
|
115
|
+
status: verdict.verdict === "pass" ? "passed" : "failed",
|
|
116
|
+
detail: verdict.reason,
|
|
117
|
+
evidenceRefs: [id],
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
parseSemanticResults(result, group, pattern, source, hostId) {
|
|
121
|
+
try {
|
|
122
|
+
const message = this.completeSemanticGraderMessage(result);
|
|
123
|
+
const verdicts = parseSemanticVerdicts(message, group);
|
|
124
|
+
for (const verdict of verdicts)
|
|
125
|
+
this.recordSemanticVerdict(verdict, pattern, source, hostId);
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
this.failGrading(result.failureMessage ?? "semantic grading did not complete", result.processFailure?.reason === "cancelled");
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
completeSemanticGraderMessage(result) {
|
|
134
|
+
if (result.executionFailed || !result.complete || !result.finalMessage)
|
|
135
|
+
throw new Error("semantic grader result did not complete");
|
|
136
|
+
return result.finalMessage;
|
|
137
|
+
}
|
|
138
|
+
async gradeSemanticGroup(group) {
|
|
139
|
+
const pattern = group[0].artifactPath;
|
|
140
|
+
const suffix = semanticGroupSuffix(pattern);
|
|
141
|
+
if (this.failure)
|
|
142
|
+
return;
|
|
143
|
+
const message = this.input.message;
|
|
144
|
+
if (message === null) {
|
|
145
|
+
this.checks.push(...group.map((check) => ({
|
|
146
|
+
id: check.id,
|
|
147
|
+
grader: "sevro.semantic",
|
|
148
|
+
status: "unavailable",
|
|
149
|
+
evidenceRefs: [],
|
|
150
|
+
})));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const workspace = await this.semanticWorkspace();
|
|
154
|
+
let successful = false;
|
|
155
|
+
try {
|
|
156
|
+
const outcome = await this.runSemanticHost(group, pattern, suffix, workspace, message);
|
|
157
|
+
if (outcome.result === null)
|
|
158
|
+
return;
|
|
159
|
+
await this.effects.evidence.retainArtifacts(outcome.artifacts);
|
|
160
|
+
this.observations.push({
|
|
161
|
+
id: `sevro.observation.semantic.usage${suffix}`,
|
|
162
|
+
source: outcome.hostId,
|
|
163
|
+
completeness: outcome.result.usageComplete ? "complete" : "partial",
|
|
164
|
+
data: usage(outcome.result),
|
|
165
|
+
});
|
|
166
|
+
await this.effects.evidence.retainSemanticVerdicts(outcome.result.finalMessage, suffix);
|
|
167
|
+
successful = this.parseSemanticResults(outcome.result, group, pattern, outcome.source, outcome.hostId);
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
await this.finishWorkspace(workspace, successful);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async finishWorkspace(workspace, successful) {
|
|
174
|
+
if (successful)
|
|
175
|
+
await clearFixtureContents(workspace);
|
|
176
|
+
else
|
|
177
|
+
await this.effects.retainWorkspace(workspace);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
export async function gradeSemanticChecks(input, effects) {
|
|
181
|
+
return new SemanticGrading(input, effects).run();
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["semantic.ts"],"names":[],"mappings":"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","sourcesContent":["import { clearFixtureContents } from \"../fixtures/cleanup\";\nimport type { CandidateArtifactRoots } from \"../candidate-artifacts\";\nimport { createFixture } from \"../fixtures/create\";\nimport { hostArtifacts } from \"../evidence/host-results\";\nimport { usage } from \"../evidence/usage\";\nimport { gradingRuntimePolicy, scopedHostArtifacts } from \"./grading-host\";\nimport {\n HostExecutionFailure,\n type HostAdapter,\n type HostResult,\n} from \"./types\";\nimport { readSemanticArtifact } from \"../graders/artifact\";\nimport {\n parseSemanticVerdicts,\n semanticCheckGroups,\n semanticPrompt,\n type PreparedSemanticCheck,\n type SemanticVerdict,\n} from \"../graders/semantic\";\nimport { sha256 } from \"../identity\";\nimport type { CheckOutcome } from \"../results\";\nimport type {\n TrialEvidenceWriter,\n TrialObservation,\n} from \"../evidence/trial-writer\";\nimport type { GradingFailure, GradingResult } from \"./grading\";\nimport type { RuntimePolicy } from \"../runtime/config\";\nimport { HostDiagnosticPersistenceError } from \"../host-diagnostics\";\n\ninterface SemanticGradingInput {\n readonly checks: readonly PreparedSemanticCheck[];\n readonly declaredChecks: readonly { id: string }[];\n readonly host: HostAdapter | undefined;\n readonly message: string | null;\n readonly candidateWorkspace: string;\n readonly candidateTranscriptRoot?: string;\n readonly candidateArtifactRoots?: CandidateArtifactRoots;\n readonly projectRoot: string;\n readonly reservedWorkspace?: string;\n readonly runtimePolicy?: RuntimePolicy;\n readonly signal?: AbortSignal;\n}\ninterface SemanticGradingEffects {\n readonly evidence: Pick<\n TrialEvidenceWriter,\n \"artifactRefs\" | \"retainArtifacts\" | \"retainSemanticVerdicts\"\n >;\n /** Close admission at detection, before retaining or cleaning auxiliary state. */\n onFailure(failure: GradingFailure): void;\n retainWorkspace(workspace: string): Promise<void>;\n}\ntype SemanticGroup = ReturnType<typeof semanticCheckGroups>[number];\n\ntype SemanticInputArtifact = Awaited<\n ReturnType<typeof readSemanticArtifact>\n> | null;\n\ntype SemanticHostOutcome =\n | {\n result: HostResult;\n artifacts: ReturnType<typeof hostArtifacts>;\n source: Record<string, unknown>;\n hostId: string;\n }\n | {\n result: null;\n artifacts: ReturnType<typeof hostArtifacts>;\n source: Record<string, unknown>;\n hostId: null;\n };\n\nfunction semanticGroupSuffix(pattern: string | undefined): string {\n return pattern === undefined ? \"\" : \".\" + sha256(pattern);\n}\n\nfunction semanticSource(\n artifact: SemanticInputArtifact,\n): Record<string, unknown> {\n return artifact\n ? {\n kind: \"artifact\",\n path: artifact.path,\n sha256: sha256(artifact.content),\n }\n : { kind: \"response\" };\n}\n\nfunction semanticHostPrompt(\n message: string,\n checks: SemanticGroup,\n artifact: SemanticInputArtifact,\n): string {\n return semanticPrompt(\n artifact?.content ?? message,\n checks,\n artifact ? \"document\" : \"response\",\n );\n}\nclass SemanticGrading {\n private observations: TrialObservation[] = [];\n private checks: CheckOutcome[] = [];\n private failure: GradingFailure | null = null;\n constructor(\n private readonly input: SemanticGradingInput,\n private readonly effects: SemanticGradingEffects,\n ) {}\n async run(): Promise<GradingResult> {\n for (const group of semanticCheckGroups([...this.input.checks]))\n await this.gradeSemanticGroup(group);\n return {\n checks: this.checks,\n observations: this.observations,\n failure: this.failure,\n };\n }\n private failGrading(message: string, cancelable = true): void {\n this.failure = { message, cancelable };\n this.effects.onFailure(this.failure);\n }\n private async semanticInput(\n pattern: string | undefined,\n ): Promise<SemanticInputArtifact> {\n return pattern === undefined\n ? null\n : readSemanticArtifact(this.input.candidateWorkspace, pattern);\n }\n\n private async semanticWorkspace(): Promise<string> {\n return createFixture(\n { kind: \"inline\", files: {} },\n {\n projectRoot: this.input.projectRoot,\n signal: this.input.signal,\n reservedWorkspace: this.input.reservedWorkspace,\n },\n );\n }\n\n private async runSemanticHost(\n group: SemanticGroup,\n pattern: string | undefined,\n suffix: string,\n workspace: string,\n message: string,\n ): Promise<SemanticHostOutcome> {\n let source: Record<string, unknown> = { kind: \"response\" };\n try {\n const artifact = await this.semanticInput(pattern);\n source = semanticSource(artifact);\n const host = this.input.host;\n if (!host) throw new Error(\"semantic host is unavailable\");\n const response = await host\n .run({\n retainHostDiagnostics: (bytes) =>\n this.effects.evidence.retainArtifacts([\n {\n id: `sevro.semantic${suffix}.sevro.host.diagnostics`,\n bytes: Buffer.from(bytes),\n },\n ]),\n candidateTranscriptRoot: this.input.candidateTranscriptRoot,\n candidateArtifactRoots: this.input.candidateArtifactRoots,\n prompt: semanticHostPrompt(message, group, artifact),\n runtimePolicy: gradingRuntimePolicy(\n this.input.runtimePolicy,\n pattern === undefined,\n ),\n runtimeRole: \"semantic\",\n workspace,\n condition: \"passive\",\n signal: this.input.signal,\n })\n .catch((cause: unknown) => {\n if (cause instanceof HostExecutionFailure) return cause.result;\n throw cause;\n });\n const artifacts = scopedHostArtifacts(\n response,\n `sevro.semantic${suffix}.`,\n this.effects.evidence.artifactRefs,\n this.input.declaredChecks,\n `sevro.semantic.verdicts${suffix}`,\n );\n return { result: response, artifacts, source, hostId: host.id };\n } catch (cause) {\n if (cause instanceof HostDiagnosticPersistenceError) throw cause;\n this.failGrading(\"semantic grading did not complete\");\n return { result: null, artifacts: [], source, hostId: null };\n }\n }\n\n private recordSemanticVerdict(\n verdict: SemanticVerdict,\n pattern: string | undefined,\n source: Record<string, unknown>,\n hostId: string,\n ): void {\n const id = `sevro.observation.semantic.${sha256(verdict.id)}`;\n this.observations.push({\n id,\n source: hostId,\n completeness: \"complete\",\n data: {\n verdict: verdict.verdict,\n reason: verdict.reason,\n ...(pattern === undefined ? {} : { source }),\n },\n });\n this.checks.push({\n id: verdict.id,\n grader: \"sevro.semantic\",\n status: verdict.verdict === \"pass\" ? \"passed\" : \"failed\",\n detail: verdict.reason,\n evidenceRefs: [id],\n });\n }\n\n private parseSemanticResults(\n result: HostResult,\n group: SemanticGroup,\n pattern: string | undefined,\n source: Record<string, unknown>,\n hostId: string,\n ): boolean {\n try {\n const message = this.completeSemanticGraderMessage(result);\n const verdicts = parseSemanticVerdicts(message, group);\n for (const verdict of verdicts)\n this.recordSemanticVerdict(verdict, pattern, source, hostId);\n return true;\n } catch {\n this.failGrading(\n result.failureMessage ?? \"semantic grading did not complete\",\n result.processFailure?.reason === \"cancelled\",\n );\n return false;\n }\n }\n\n private completeSemanticGraderMessage(result: HostResult): string {\n if (result.executionFailed || !result.complete || !result.finalMessage)\n throw new Error(\"semantic grader result did not complete\");\n return result.finalMessage;\n }\n\n private async gradeSemanticGroup(group: SemanticGroup): Promise<void> {\n const pattern = group[0].artifactPath;\n const suffix = semanticGroupSuffix(pattern);\n if (this.failure) return;\n const message = this.input.message;\n if (message === null) {\n this.checks.push(\n ...group.map((check) => ({\n id: check.id,\n grader: \"sevro.semantic\",\n status: \"unavailable\" as const,\n evidenceRefs: [],\n })),\n );\n return;\n }\n const workspace = await this.semanticWorkspace();\n let successful = false;\n try {\n const outcome = await this.runSemanticHost(\n group,\n pattern,\n suffix,\n workspace,\n message,\n );\n if (outcome.result === null) return;\n await this.effects.evidence.retainArtifacts(outcome.artifacts);\n this.observations.push({\n id: `sevro.observation.semantic.usage${suffix}`,\n source: outcome.hostId,\n completeness: outcome.result.usageComplete ? \"complete\" : \"partial\",\n data: usage(outcome.result),\n });\n await this.effects.evidence.retainSemanticVerdicts(\n outcome.result.finalMessage,\n suffix,\n );\n successful = this.parseSemanticResults(\n outcome.result,\n group,\n pattern,\n outcome.source,\n outcome.hostId,\n );\n } finally {\n await this.finishWorkspace(workspace, successful);\n }\n }\n private async finishWorkspace(\n workspace: string,\n successful: boolean,\n ): Promise<void> {\n if (successful) await clearFixtureContents(workspace);\n else await this.effects.retainWorkspace(workspace);\n }\n}\nexport async function gradeSemanticChecks(\n input: SemanticGradingInput,\n effects: SemanticGradingEffects,\n) {\n return new SemanticGrading(input, effects).run();\n}\n"]}
|