@bjoernrochel/sevro 1.0.0 → 1.1.1
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 +158 -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/claude-settings.ts +3 -1
- package/src/hosts/claude.ts +1 -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,154 @@
|
|
|
1
|
+
import { assessGitHeadCheck, gitHeadState, } from "../graders/git-head.js";
|
|
2
|
+
import { gradeOutput } from "../graders/output.js";
|
|
3
|
+
import { assessShellCheck, runShellCheck, } from "../graders/shell.js";
|
|
4
|
+
import { evaluationProtectedRoots } from "../hosts/isolation-roots.js";
|
|
5
|
+
import { sha256 } from "../identity.js";
|
|
6
|
+
import { ExtensionSourceChangedError, } from "../extension-session.js";
|
|
7
|
+
function failedGrading(checks, observations, message) {
|
|
8
|
+
const failure = { message, cancelable: true };
|
|
9
|
+
return { checks, observations, failure };
|
|
10
|
+
}
|
|
11
|
+
export function gradeCandidateOutput(input) {
|
|
12
|
+
try {
|
|
13
|
+
if (!input.result)
|
|
14
|
+
throw new Error("host result is unavailable");
|
|
15
|
+
const checks = gradeOutput(input.result.finalMessage, input.result.complete, [...input.checks]).map((check) => ({ ...check, evidenceRefs: [...input.evidenceRefs] }));
|
|
16
|
+
return { checks, observations: [], failure: null };
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return {
|
|
20
|
+
checks: [],
|
|
21
|
+
observations: [],
|
|
22
|
+
failure: {
|
|
23
|
+
message: "output grading did not complete",
|
|
24
|
+
cancelable: false,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function gradeShellCheck(check, execution) {
|
|
30
|
+
const result = await runShellCheck(check, execution);
|
|
31
|
+
const graded = assessShellCheck(check, result);
|
|
32
|
+
const id = `sevro.observation.shell.${check.id}`;
|
|
33
|
+
return {
|
|
34
|
+
observation: {
|
|
35
|
+
id,
|
|
36
|
+
source: "sevro.shell",
|
|
37
|
+
completeness: "complete",
|
|
38
|
+
data: {
|
|
39
|
+
exitCode: result.exitCode,
|
|
40
|
+
expectedExitCode: check.expectedExitCode,
|
|
41
|
+
...(result.stdout === null
|
|
42
|
+
? {}
|
|
43
|
+
: {
|
|
44
|
+
stdoutSha256: sha256(result.stdout),
|
|
45
|
+
stdoutByteLength: Buffer.byteLength(result.stdout, "utf8"),
|
|
46
|
+
}),
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
check: {
|
|
50
|
+
id: check.id,
|
|
51
|
+
grader: "sevro.shell",
|
|
52
|
+
status: graded.passed ? "passed" : "failed",
|
|
53
|
+
detail: graded.detail,
|
|
54
|
+
evidenceRefs: [id],
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export async function gradeShellChecks(input) {
|
|
59
|
+
const checks = [];
|
|
60
|
+
const observations = [];
|
|
61
|
+
try {
|
|
62
|
+
if (!input.protectedRoots)
|
|
63
|
+
throw new Error("shell checks require explicit protected source roots");
|
|
64
|
+
const protectedRoots = await evaluationProtectedRoots(input.protectedRoots);
|
|
65
|
+
for (const check of input.checks) {
|
|
66
|
+
const graded = await gradeShellCheck(check, {
|
|
67
|
+
...input.execution,
|
|
68
|
+
protectedRoots,
|
|
69
|
+
protectedRootsCanonical: true,
|
|
70
|
+
});
|
|
71
|
+
checks.push(graded.check);
|
|
72
|
+
observations.push(graded.observation);
|
|
73
|
+
}
|
|
74
|
+
return { checks, observations, failure: null };
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return failedGrading(checks, observations, "shell grading did not complete");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function gradeGitHeadChecks(input) {
|
|
81
|
+
const observations = [];
|
|
82
|
+
try {
|
|
83
|
+
const base = input.base;
|
|
84
|
+
if (base === null)
|
|
85
|
+
throw new Error("Git HEAD base revision is unavailable");
|
|
86
|
+
const state = await gitHeadState(input.workspace, base, input.signal);
|
|
87
|
+
const id = "sevro.observation.git-head";
|
|
88
|
+
observations.push({
|
|
89
|
+
id,
|
|
90
|
+
source: "sevro.git-head",
|
|
91
|
+
completeness: "complete",
|
|
92
|
+
data: {
|
|
93
|
+
baseRevision: base,
|
|
94
|
+
currentRevision: state.currentRevision,
|
|
95
|
+
baseAncestor: state.baseAncestor,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
const checks = input.checks.map((check) => {
|
|
99
|
+
const graded = assessGitHeadCheck(check, base, state);
|
|
100
|
+
return {
|
|
101
|
+
id: check.id,
|
|
102
|
+
grader: "sevro.git-head",
|
|
103
|
+
status: graded.passed ? "passed" : "failed",
|
|
104
|
+
detail: graded.detail,
|
|
105
|
+
evidenceRefs: [id],
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
return { checks, observations, failure: null };
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return failedGrading([], observations, "Git HEAD grading did not complete");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function extensionCheckResult(check, declared) {
|
|
115
|
+
const grader = declared.get(check.id);
|
|
116
|
+
if (grader === undefined)
|
|
117
|
+
throw new Error("extension returned an undeclared check");
|
|
118
|
+
return {
|
|
119
|
+
id: check.id,
|
|
120
|
+
grader,
|
|
121
|
+
status: check.status,
|
|
122
|
+
...(check.detail ? { detail: check.detail } : {}),
|
|
123
|
+
evidenceRefs: check.evidenceRefs,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export async function gradeExtensionChecks(input) {
|
|
127
|
+
try {
|
|
128
|
+
const result = await input.evaluate(input.request);
|
|
129
|
+
const declared = new Map(input.declarations.map((check) => [check.id, check.grader]));
|
|
130
|
+
return {
|
|
131
|
+
checks: result.checks.map((check) => extensionCheckResult(check, declared)),
|
|
132
|
+
metrics: result.metrics,
|
|
133
|
+
domainOutcomes: result.domainOutcomes ?? [],
|
|
134
|
+
recommendation: result.taskVerdictRecommendation ?? null,
|
|
135
|
+
failure: null,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const failure = {
|
|
140
|
+
message: error instanceof ExtensionSourceChangedError
|
|
141
|
+
? "extension source inputs changed during evaluation; assessment was refused. Finish changing evaluator inputs, then start a fresh evaluation with inputs held stable."
|
|
142
|
+
: "extension grading did not complete",
|
|
143
|
+
cancelable: true,
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
checks: [],
|
|
147
|
+
metrics: [],
|
|
148
|
+
domainOutcomes: [],
|
|
149
|
+
recommendation: null,
|
|
150
|
+
failure,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=grading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grading.js","sourceRoot":"","sources":["grading.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n assessGitHeadCheck,\n gitHeadState,\n type PreparedGitHeadCheck,\n} from \"../graders/git-head\";\nimport { gradeOutput, type PreparedOutputCheck } from \"../graders/output\";\nimport {\n assessShellCheck,\n runShellCheck,\n type PreparedShellCheck,\n} from \"../graders/shell\";\nimport { evaluationProtectedRoots } from \"../hosts/isolation-roots\";\nimport { sha256 } from \"../identity\";\nimport type { TrialObservation } from \"../evidence/trial-writer\";\nimport {\n ExtensionSourceChangedError,\n type EvaluationRequest,\n type EvaluationResult,\n} from \"../extension-session\";\nimport type { CheckOutcome } from \"../results\";\n\nexport interface GradingFailure {\n readonly message: string;\n readonly cancelable: boolean;\n}\n\nexport interface GradingResult {\n checks: CheckOutcome[];\n observations: TrialObservation[];\n failure: GradingFailure | null;\n}\n\nfunction failedGrading(\n checks: CheckOutcome[],\n observations: TrialObservation[],\n message: string,\n): GradingResult {\n const failure = { message, cancelable: true };\n return { checks, observations, failure };\n}\n\nexport function gradeCandidateOutput(input: {\n readonly result: { finalMessage: string | null; complete: boolean } | null;\n readonly checks: readonly PreparedOutputCheck[];\n readonly evidenceRefs: string[];\n}): GradingResult {\n try {\n if (!input.result) throw new Error(\"host result is unavailable\");\n const checks = gradeOutput(\n input.result.finalMessage,\n input.result.complete,\n [...input.checks],\n ).map((check) => ({ ...check, evidenceRefs: [...input.evidenceRefs] }));\n return { checks, observations: [], failure: null };\n } catch {\n return {\n checks: [],\n observations: [],\n failure: {\n message: \"output grading did not complete\",\n cancelable: false,\n },\n };\n }\n}\n\ninterface ShellGradingInput {\n readonly checks: readonly PreparedShellCheck[];\n readonly protectedRoots:\n Parameters<typeof evaluationProtectedRoots>[0] | null;\n readonly execution: Omit<\n Parameters<typeof runShellCheck>[1],\n \"protectedRoots\"\n >;\n}\n\nasync function gradeShellCheck(\n check: PreparedShellCheck,\n execution: Parameters<typeof runShellCheck>[1],\n): Promise<{ check: CheckOutcome; observation: TrialObservation }> {\n const result = await runShellCheck(check, execution);\n const graded = assessShellCheck(check, result);\n const id = `sevro.observation.shell.${check.id}`;\n return {\n observation: {\n id,\n source: \"sevro.shell\",\n completeness: \"complete\",\n data: {\n exitCode: result.exitCode,\n expectedExitCode: check.expectedExitCode,\n ...(result.stdout === null\n ? {}\n : {\n stdoutSha256: sha256(result.stdout),\n stdoutByteLength: Buffer.byteLength(result.stdout, \"utf8\"),\n }),\n },\n },\n check: {\n id: check.id,\n grader: \"sevro.shell\",\n status: graded.passed ? \"passed\" : \"failed\",\n detail: graded.detail,\n evidenceRefs: [id],\n },\n };\n}\n\nexport async function gradeShellChecks(\n input: ShellGradingInput,\n): Promise<GradingResult> {\n const checks: CheckOutcome[] = [];\n const observations: TrialObservation[] = [];\n try {\n if (!input.protectedRoots)\n throw new Error(\"shell checks require explicit protected source roots\");\n const protectedRoots = await evaluationProtectedRoots(input.protectedRoots);\n for (const check of input.checks) {\n const graded = await gradeShellCheck(check, {\n ...input.execution,\n protectedRoots,\n protectedRootsCanonical: true,\n });\n checks.push(graded.check);\n observations.push(graded.observation);\n }\n return { checks, observations, failure: null };\n } catch {\n return failedGrading(\n checks,\n observations,\n \"shell grading did not complete\",\n );\n }\n}\n\nexport async function gradeGitHeadChecks(input: {\n readonly checks: readonly PreparedGitHeadCheck[];\n readonly base: string | null;\n readonly workspace: string;\n readonly signal?: AbortSignal;\n}): Promise<GradingResult> {\n const observations: TrialObservation[] = [];\n try {\n const base = input.base;\n if (base === null) throw new Error(\"Git HEAD base revision is unavailable\");\n const state = await gitHeadState(input.workspace, base, input.signal);\n const id = \"sevro.observation.git-head\";\n observations.push({\n id,\n source: \"sevro.git-head\",\n completeness: \"complete\",\n data: {\n baseRevision: base,\n currentRevision: state.currentRevision,\n baseAncestor: state.baseAncestor,\n },\n });\n const checks = input.checks.map((check): CheckOutcome => {\n const graded = assessGitHeadCheck(check, base, state);\n return {\n id: check.id,\n grader: \"sevro.git-head\",\n status: graded.passed ? \"passed\" : \"failed\",\n detail: graded.detail,\n evidenceRefs: [id],\n };\n });\n return { checks, observations, failure: null };\n } catch {\n return failedGrading([], observations, \"Git HEAD grading did not complete\");\n }\n}\n\nfunction extensionCheckResult(\n check: EvaluationResult[\"checks\"][number],\n declared: ReadonlyMap<string, string>,\n): CheckOutcome {\n const grader = declared.get(check.id);\n if (grader === undefined)\n throw new Error(\"extension returned an undeclared check\");\n return {\n id: check.id,\n grader,\n status: check.status,\n ...(check.detail ? { detail: check.detail } : {}),\n evidenceRefs: check.evidenceRefs,\n };\n}\n\nexport interface ExtensionGradingResult {\n checks: CheckOutcome[];\n metrics: EvaluationResult[\"metrics\"];\n domainOutcomes: NonNullable<EvaluationResult[\"domainOutcomes\"]>;\n recommendation: \"passed\" | \"failed\" | \"not_assessed\" | null;\n failure: GradingFailure | null;\n}\n\nexport async function gradeExtensionChecks(input: {\n readonly evaluate: (request: EvaluationRequest) => Promise<EvaluationResult>;\n readonly request: EvaluationRequest;\n readonly declarations: readonly { id: string; grader: string }[];\n}): Promise<ExtensionGradingResult> {\n try {\n const result = await input.evaluate(input.request);\n const declared = new Map(\n input.declarations.map((check) => [check.id, check.grader]),\n );\n return {\n checks: result.checks.map((check) =>\n extensionCheckResult(check, declared),\n ),\n metrics: result.metrics,\n domainOutcomes: result.domainOutcomes ?? [],\n recommendation: result.taskVerdictRecommendation ?? null,\n failure: null,\n };\n } catch (error) {\n const failure = {\n message:\n error instanceof ExtensionSourceChangedError\n ? \"extension source inputs changed during evaluation; assessment was refused. Finish changing evaluator inputs, then start a fresh evaluation with inputs held stable.\"\n : \"extension grading did not complete\",\n cancelable: true,\n };\n return {\n checks: [],\n metrics: [],\n domainOutcomes: [],\n recommendation: null,\n failure,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { EvaluationConfigurationError, } from "./types.js";
|
|
2
|
+
import { fixtureParts } from "../fixtures/preparation.js";
|
|
3
|
+
import { isStringArray } from "../value-guards.js";
|
|
4
|
+
export const INVOCATION_PLACEHOLDER = "{{sevro.skill_invocation}}";
|
|
5
|
+
export const LEGACY_CODEX_PLACEHOLDER = "{{sevro.codex.skill_invocation}}";
|
|
6
|
+
function uniquePluginRoots(value) {
|
|
7
|
+
return (isStringArray(value) &&
|
|
8
|
+
value.length > 0 &&
|
|
9
|
+
new Set(value).size === value.length);
|
|
10
|
+
}
|
|
11
|
+
function validateClaudePluginRoots(roots) {
|
|
12
|
+
try {
|
|
13
|
+
if (!uniquePluginRoots(roots))
|
|
14
|
+
throw new Error("invalid plugin roots");
|
|
15
|
+
for (const root of roots)
|
|
16
|
+
fixtureParts(root);
|
|
17
|
+
if (roots.some((root) => roots.some((other) => root !== other && root.startsWith(`${other}/`))))
|
|
18
|
+
throw new Error("overlapping plugin roots");
|
|
19
|
+
}
|
|
20
|
+
catch (cause) {
|
|
21
|
+
throw new EvaluationConfigurationError("invalid Claude plugin directory declaration", { cause });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function requireNegotiatedCapability(options, capability, message) {
|
|
25
|
+
if (!options.extension?.session.identity.capabilities.includes(capability) ||
|
|
26
|
+
!options.host.hostCapabilities?.includes(capability))
|
|
27
|
+
throw new EvaluationConfigurationError(message);
|
|
28
|
+
}
|
|
29
|
+
function validatePackageManifest(files, manifest, message) {
|
|
30
|
+
if (!files.length ||
|
|
31
|
+
!files.every((artifact) => artifact.gitExclude) ||
|
|
32
|
+
!files.some((artifact) => artifact.relativePath === manifest))
|
|
33
|
+
throw new EvaluationConfigurationError(message);
|
|
34
|
+
}
|
|
35
|
+
function validateClaudePluginPackage(options, directories, artifacts) {
|
|
36
|
+
if (!directories)
|
|
37
|
+
return;
|
|
38
|
+
const roots = directories.artifactRoots;
|
|
39
|
+
validateClaudePluginRoots(roots);
|
|
40
|
+
requireNegotiatedCapability(options, "sevro.claude.plugin-dirs", "Claude plugin directory capability was not negotiated");
|
|
41
|
+
for (const root of roots) {
|
|
42
|
+
const files = artifacts.filter((artifact) => artifact.relativePath.startsWith(`${root}/`));
|
|
43
|
+
validatePackageManifest(files, `${root}/.claude-plugin/plugin.json`, "Claude plugin directory requires Git-excluded package artifacts and a manifest");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function marketplaceNamesValid(name, plugins) {
|
|
47
|
+
return (/^[a-z][a-z0-9-]*$/.test(name) &&
|
|
48
|
+
plugins.length > 0 &&
|
|
49
|
+
!plugins.some((plugin) => !/^[a-z][a-z0-9-]*$/.test(plugin)) &&
|
|
50
|
+
new Set(plugins).size === plugins.length);
|
|
51
|
+
}
|
|
52
|
+
function validateMarketplaceDeclaration(marketplace) {
|
|
53
|
+
try {
|
|
54
|
+
fixtureParts(marketplace.artifactRoot);
|
|
55
|
+
if (!marketplaceNamesValid(marketplace.marketplaceName, marketplace.pluginNames))
|
|
56
|
+
throw new Error("invalid marketplace or plugin name");
|
|
57
|
+
}
|
|
58
|
+
catch (cause) {
|
|
59
|
+
throw new EvaluationConfigurationError("invalid Codex marketplace declaration", { cause });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function validateCodexMarketplacePackage(options, marketplace, artifacts) {
|
|
63
|
+
if (!marketplace)
|
|
64
|
+
return;
|
|
65
|
+
validateMarketplaceDeclaration(marketplace);
|
|
66
|
+
requireNegotiatedCapability(options, "sevro.codex.plugin-marketplace", "Codex marketplace capability was not negotiated");
|
|
67
|
+
const files = artifacts.filter((artifact) => artifact.relativePath.startsWith(`${marketplace.artifactRoot}/`));
|
|
68
|
+
validatePackageManifest(files, `${marketplace.artifactRoot}/.claude-plugin/marketplace.json`, "Codex marketplace requires Git-excluded package artifacts and a manifest");
|
|
69
|
+
}
|
|
70
|
+
function preparePackageArtifacts(options, state) {
|
|
71
|
+
const codexMarketplace = state.extensionPreparation?.codexMarketplace;
|
|
72
|
+
const claudePluginDirs = state.extensionPreparation?.claudePluginDirs;
|
|
73
|
+
validateClaudePluginPackage(options, claudePluginDirs, state.inlineArtifacts);
|
|
74
|
+
validateCodexMarketplacePackage(options, codexMarketplace, state.inlineArtifacts);
|
|
75
|
+
return { ...state, codexMarketplace, claudePluginDirs };
|
|
76
|
+
}
|
|
77
|
+
function skillInvocationDeclarations(preparation) {
|
|
78
|
+
return {
|
|
79
|
+
codexSkillInvocation: preparation?.codexSkillInvocation,
|
|
80
|
+
codexRepositorySkillInvocation: preparation?.codexRepositorySkillInvocation,
|
|
81
|
+
claudeSkillInvocation: preparation?.claudeSkillInvocation,
|
|
82
|
+
claudeRepositorySkillInvocation: preparation?.claudeRepositorySkillInvocation,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function selectedSkillInvocation(declarations) {
|
|
86
|
+
if (declarations.codexSkillInvocation)
|
|
87
|
+
return { kind: "codex-plugin", value: declarations.codexSkillInvocation };
|
|
88
|
+
if (declarations.codexRepositorySkillInvocation)
|
|
89
|
+
return {
|
|
90
|
+
kind: "codex-repository",
|
|
91
|
+
value: declarations.codexRepositorySkillInvocation,
|
|
92
|
+
};
|
|
93
|
+
if (declarations.claudeRepositorySkillInvocation)
|
|
94
|
+
return {
|
|
95
|
+
kind: "claude-repository",
|
|
96
|
+
value: declarations.claudeRepositorySkillInvocation,
|
|
97
|
+
};
|
|
98
|
+
if (declarations.claudeSkillInvocation)
|
|
99
|
+
return { kind: "claude-plugin", value: declarations.claudeSkillInvocation };
|
|
100
|
+
return { kind: "none" };
|
|
101
|
+
}
|
|
102
|
+
function skillInvocationConfiguration(selected) {
|
|
103
|
+
switch (selected.kind) {
|
|
104
|
+
case "codex-plugin":
|
|
105
|
+
return { codexSkillInvocation: selected.value };
|
|
106
|
+
case "codex-repository":
|
|
107
|
+
return { codexRepositorySkillInvocation: selected.value };
|
|
108
|
+
case "claude-plugin":
|
|
109
|
+
return { claudeSkillInvocation: selected.value };
|
|
110
|
+
case "claude-repository":
|
|
111
|
+
return { claudeRepositorySkillInvocation: selected.value };
|
|
112
|
+
case "none":
|
|
113
|
+
return {};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function candidateInvocationRequest(selected) {
|
|
117
|
+
switch (selected.kind) {
|
|
118
|
+
case "codex-plugin":
|
|
119
|
+
return {
|
|
120
|
+
explicitSkillInvocation: {
|
|
121
|
+
...selected.value,
|
|
122
|
+
token: `$${selected.value.pluginName}:${selected.value.skillName}`,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
case "claude-plugin":
|
|
126
|
+
return {
|
|
127
|
+
explicitSkillInvocation: {
|
|
128
|
+
...selected.value,
|
|
129
|
+
token: `/${selected.value.pluginName}:${selected.value.skillName}`,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
case "codex-repository":
|
|
133
|
+
return {
|
|
134
|
+
explicitSkillInvocation: {
|
|
135
|
+
...selected.value,
|
|
136
|
+
scope: "repository",
|
|
137
|
+
token: `$${selected.value.skillName}`,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
case "claude-repository":
|
|
141
|
+
return {
|
|
142
|
+
explicitSkillInvocation: {
|
|
143
|
+
...selected.value,
|
|
144
|
+
scope: "repository",
|
|
145
|
+
token: `/${selected.value.skillName}`,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
case "none":
|
|
149
|
+
return {};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function candidateMarketplaceRequest(context) {
|
|
153
|
+
const marketplace = context.codexMarketplace;
|
|
154
|
+
if (!marketplace)
|
|
155
|
+
return {};
|
|
156
|
+
return {
|
|
157
|
+
codexMarketplace: {
|
|
158
|
+
...marketplace,
|
|
159
|
+
artifactPaths: context.inlineArtifacts
|
|
160
|
+
.filter((artifact) => artifact.relativePath.startsWith(`${marketplace.artifactRoot}/`))
|
|
161
|
+
.map((artifact) => artifact.relativePath),
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function candidatePluginDirectoriesRequest(context) {
|
|
166
|
+
const directories = context.claudePluginDirs;
|
|
167
|
+
if (!directories)
|
|
168
|
+
return {};
|
|
169
|
+
return {
|
|
170
|
+
claudePluginDirs: {
|
|
171
|
+
...directories,
|
|
172
|
+
artifactPaths: context.inlineArtifacts
|
|
173
|
+
.filter((artifact) => directories.artifactRoots.some((root) => artifact.relativePath.startsWith(`${root}/`)))
|
|
174
|
+
.map((artifact) => artifact.relativePath),
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function promptPlaceholderCount(caseData, placeholder) {
|
|
179
|
+
return (caseData.prompt.split(placeholder).length -
|
|
180
|
+
1 +
|
|
181
|
+
(caseData.followUpPrompt?.split(placeholder).length ?? 1) -
|
|
182
|
+
1);
|
|
183
|
+
}
|
|
184
|
+
function validateOnlyOneInvocation(declarations) {
|
|
185
|
+
if ([
|
|
186
|
+
declarations.codexSkillInvocation,
|
|
187
|
+
declarations.codexRepositorySkillInvocation,
|
|
188
|
+
declarations.claudeSkillInvocation,
|
|
189
|
+
declarations.claudeRepositorySkillInvocation,
|
|
190
|
+
].filter(Boolean).length > 1)
|
|
191
|
+
throw new EvaluationConfigurationError("only one explicit skill invocation may be declared");
|
|
192
|
+
}
|
|
193
|
+
function validateCodexInvocationMembership(marketplace, pluginName) {
|
|
194
|
+
if (!marketplace ||
|
|
195
|
+
!marketplace.pluginNames.includes(pluginName) ||
|
|
196
|
+
!/^[a-z][a-z0-9-]*$/.test(pluginName))
|
|
197
|
+
throw new EvaluationConfigurationError("invalid Codex skill invocation declaration");
|
|
198
|
+
}
|
|
199
|
+
function validateCodexInvocationBody(marketplace, skillName, artifacts, placeholders) {
|
|
200
|
+
if (!/^[A-Za-z0-9._-]+$/.test(skillName) ||
|
|
201
|
+
placeholders !== 1 ||
|
|
202
|
+
!artifacts.some((artifact) => artifact.relativePath ===
|
|
203
|
+
`${marketplace.artifactRoot}/plugin/skills/${skillName}/SKILL.md`))
|
|
204
|
+
throw new EvaluationConfigurationError("invalid Codex skill invocation declaration");
|
|
205
|
+
}
|
|
206
|
+
function validateCodexPluginInvocation(options, context, invocation, placeholders) {
|
|
207
|
+
const marketplace = context.codexMarketplace;
|
|
208
|
+
validateCodexInvocationMembership(marketplace, invocation.pluginName);
|
|
209
|
+
validateCodexInvocationBody(marketplace, invocation.skillName, context.inlineArtifacts, placeholders);
|
|
210
|
+
requireNegotiatedCapability(options, "sevro.codex.explicit-invocation", "Codex explicit invocation capability was not negotiated");
|
|
211
|
+
}
|
|
212
|
+
function validRepositoryInvocationIdentity(skillName, placeholders) {
|
|
213
|
+
return (/^[A-Za-z0-9._-]+$/.test(skillName) &&
|
|
214
|
+
skillName !== "." &&
|
|
215
|
+
skillName !== ".." &&
|
|
216
|
+
placeholders === 1);
|
|
217
|
+
}
|
|
218
|
+
function validateRepositoryInvocationBody(artifacts, path, message) {
|
|
219
|
+
if (!artifacts.some((artifact) => artifact.gitExclude && artifact.relativePath === path))
|
|
220
|
+
throw new EvaluationConfigurationError(message);
|
|
221
|
+
}
|
|
222
|
+
function validateCodexRepositoryInvocation(options, context, invocation, placeholders) {
|
|
223
|
+
const message = "invalid Codex repository skill invocation declaration";
|
|
224
|
+
if (!validRepositoryInvocationIdentity(invocation.skillName, placeholders))
|
|
225
|
+
throw new EvaluationConfigurationError(message);
|
|
226
|
+
validateRepositoryInvocationBody(context.inlineArtifacts, `.agents/skills/${invocation.skillName}/SKILL.md`, message);
|
|
227
|
+
requireNegotiatedCapability(options, "sevro.codex.repository-invocation", "Codex repository invocation capability was not negotiated");
|
|
228
|
+
}
|
|
229
|
+
function validateClaudeRepositoryPrompt(prompt) {
|
|
230
|
+
if (!prompt.startsWith(INVOCATION_PLACEHOLDER) ||
|
|
231
|
+
prompt.includes(LEGACY_CODEX_PLACEHOLDER))
|
|
232
|
+
throw new EvaluationConfigurationError("invalid Claude repository skill invocation declaration");
|
|
233
|
+
}
|
|
234
|
+
function validateClaudeRepositoryInvocation(options, context, invocation, placeholders) {
|
|
235
|
+
const message = "invalid Claude repository skill invocation declaration";
|
|
236
|
+
if (!validRepositoryInvocationIdentity(invocation.skillName, placeholders))
|
|
237
|
+
throw new EvaluationConfigurationError(message);
|
|
238
|
+
validateClaudeRepositoryPrompt(options.case.prompt);
|
|
239
|
+
validateRepositoryInvocationBody(context.inlineArtifacts, `.claude/skills/${invocation.skillName}/SKILL.md`, message);
|
|
240
|
+
requireNegotiatedCapability(options, "sevro.claude.repository-invocation", "Claude repository invocation capability was not negotiated");
|
|
241
|
+
}
|
|
242
|
+
function validateClaudeInvocationIdentity(directories, invocation, placeholders) {
|
|
243
|
+
if (!directories ||
|
|
244
|
+
!/^[a-z][a-z0-9-]*$/.test(invocation.pluginName) ||
|
|
245
|
+
!/^[A-Za-z0-9._-]+$/.test(invocation.skillName) ||
|
|
246
|
+
placeholders !== 1)
|
|
247
|
+
throw new EvaluationConfigurationError("invalid Claude skill invocation declaration");
|
|
248
|
+
}
|
|
249
|
+
function validateClaudePluginPrompt(caseData) {
|
|
250
|
+
if (caseData.prompt.includes(LEGACY_CODEX_PLACEHOLDER) ||
|
|
251
|
+
caseData.followUpPrompt?.includes(LEGACY_CODEX_PLACEHOLDER))
|
|
252
|
+
throw new EvaluationConfigurationError("invalid Claude skill invocation declaration");
|
|
253
|
+
}
|
|
254
|
+
function validateClaudeInvocationBody(directories, skillName, artifacts) {
|
|
255
|
+
if (!directories.artifactRoots.some((root) => artifacts.some((artifact) => artifact.relativePath === `${root}/skills/${skillName}/SKILL.md`)))
|
|
256
|
+
throw new EvaluationConfigurationError("invalid Claude skill invocation declaration");
|
|
257
|
+
}
|
|
258
|
+
function validateClaudePluginInvocation(options, context, invocation, placeholders) {
|
|
259
|
+
const directories = context.claudePluginDirs;
|
|
260
|
+
validateClaudeInvocationIdentity(directories, invocation, placeholders);
|
|
261
|
+
validateClaudePluginPrompt(options.case);
|
|
262
|
+
validateClaudeInvocationBody(directories, invocation.skillName, context.inlineArtifacts);
|
|
263
|
+
requireNegotiatedCapability(options, "sevro.claude.explicit-invocation", "Claude explicit invocation capability was not negotiated");
|
|
264
|
+
}
|
|
265
|
+
function validateUndeclaredPlaceholder(placeholders) {
|
|
266
|
+
if (placeholders)
|
|
267
|
+
throw new EvaluationConfigurationError("skill invocation placeholder requires a declaration");
|
|
268
|
+
}
|
|
269
|
+
function validateSelectedSkillInvocation(options, context, selected, placeholders) {
|
|
270
|
+
switch (selected.kind) {
|
|
271
|
+
case "codex-plugin":
|
|
272
|
+
validateCodexPluginInvocation(options, context, selected.value, placeholders);
|
|
273
|
+
break;
|
|
274
|
+
case "codex-repository":
|
|
275
|
+
validateCodexRepositoryInvocation(options, context, selected.value, placeholders);
|
|
276
|
+
break;
|
|
277
|
+
case "claude-repository":
|
|
278
|
+
validateClaudeRepositoryInvocation(options, context, selected.value, placeholders);
|
|
279
|
+
break;
|
|
280
|
+
case "claude-plugin":
|
|
281
|
+
validateClaudePluginInvocation(options, context, selected.value, placeholders);
|
|
282
|
+
break;
|
|
283
|
+
case "none":
|
|
284
|
+
validateUndeclaredPlaceholder(placeholders);
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function prepareSkillInvocation(options, state) {
|
|
289
|
+
const declarations = skillInvocationDeclarations(state.extensionPreparation);
|
|
290
|
+
const placeholderCount = promptPlaceholderCount(options.case, INVOCATION_PLACEHOLDER) +
|
|
291
|
+
promptPlaceholderCount(options.case, LEGACY_CODEX_PLACEHOLDER);
|
|
292
|
+
validateOnlyOneInvocation(declarations);
|
|
293
|
+
const selected = selectedSkillInvocation(declarations);
|
|
294
|
+
validateSelectedSkillInvocation(options, state, selected, placeholderCount);
|
|
295
|
+
const hostRequest = {
|
|
296
|
+
...candidateMarketplaceRequest(state),
|
|
297
|
+
...candidatePluginDirectoriesRequest(state),
|
|
298
|
+
...candidateInvocationRequest(selected),
|
|
299
|
+
};
|
|
300
|
+
return {
|
|
301
|
+
codexMarketplace: state.codexMarketplace,
|
|
302
|
+
claudePluginDirs: state.claudePluginDirs,
|
|
303
|
+
selected,
|
|
304
|
+
invocationToken: hostRequest.explicitSkillInvocation?.token ?? null,
|
|
305
|
+
configuration: skillInvocationConfiguration(selected),
|
|
306
|
+
hostRequest,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
export function prepareInvocationPlan(options, state) {
|
|
310
|
+
return prepareSkillInvocation(options, preparePackageArtifacts(options, state));
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=invocation-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation-plan.js","sourceRoot":"","sources":["invocation-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,GAI7B,mBAAgB;AACjB,OAAO,EAAE,YAAY,EAAuB,mCAAgC;AAC5E,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAuChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,wBAAwB,GAAG,kCAAkC,CAAC;AAE3E,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,CACL,aAAa,CAAC,KAAK,CAAC;QACpB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CACrC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAe;IAChD,IAAI,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACvE,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7C,IACE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAClB,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CACtE;YAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,4BAA4B,CACpC,6CAA6C,EAC7C,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,OAA0B,EAC1B,UAAkB,EAClB,OAAe;IAEf,IACE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;QACtE,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,UAAU,CAAC;QAEpD,MAAM,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAuB,EACvB,QAAgB,EAChB,OAAe;IAEf,IACE,CAAC,KAAK,CAAC,MAAM;QACb,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/C,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC;QAE7D,MAAM,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,2BAA2B,CAClC,OAA0B,EAC1B,WAAgD,EAChD,SAA2B;IAE3B,IAAI,CAAC,WAAW;QAAE,OAAO;IACzB,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC;IACxC,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjC,2BAA2B,CACzB,OAAO,EACP,0BAA0B,EAC1B,uDAAuD,CACxD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1C,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAC7C,CAAC;QACF,uBAAuB,CACrB,KAAK,EACL,GAAG,IAAI,6BAA6B,EACpC,gFAAgF,CACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,OAAiB;IAC5D,OAAO,CACL,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CACzC,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,WAA6B;IACnE,IAAI,CAAC;QACH,YAAY,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACvC,IACE,CAAC,qBAAqB,CACpB,WAAW,CAAC,eAAe,EAC3B,WAAW,CAAC,WAAW,CACxB;YAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,4BAA4B,CACpC,uCAAuC,EACvC,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B,CACtC,OAA0B,EAC1B,WAAyC,EACzC,SAA2B;IAE3B,IAAI,CAAC,WAAW;QAAE,OAAO;IACzB,8BAA8B,CAAC,WAAW,CAAC,CAAC;IAC5C,2BAA2B,CACzB,OAAO,EACP,gCAAgC,EAChC,iDAAiD,CAClD,CAAC;IACF,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1C,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,YAAY,GAAG,CAAC,CACjE,CAAC;IACF,uBAAuB,CACrB,KAAK,EACL,GAAG,WAAW,CAAC,YAAY,kCAAkC,EAC7D,0EAA0E,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAA0B,EAC1B,KAA0B;IAE1B,MAAM,gBAAgB,GAAG,KAAK,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;IACtE,MAAM,gBAAgB,GAAG,KAAK,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;IACtE,2BAA2B,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAC9E,+BAA+B,CAC7B,OAAO,EACP,gBAAgB,EAChB,KAAK,CAAC,eAAe,CACtB,CAAC;IACF,OAAO,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,2BAA2B,CAClC,WAAqC;IAErC,OAAO;QACL,oBAAoB,EAAE,WAAW,EAAE,oBAAoB;QACvD,8BAA8B,EAAE,WAAW,EAAE,8BAA8B;QAC3E,qBAAqB,EAAE,WAAW,EAAE,qBAAqB;QACzD,+BAA+B,EAC7B,WAAW,EAAE,+BAA+B;KAC/C,CAAC;AACJ,CAAC;AAeD,SAAS,uBAAuB,CAC9B,YAA+B;IAE/B,IAAI,YAAY,CAAC,oBAAoB;QACnC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,CAAC,oBAAoB,EAAE,CAAC;IAC5E,IAAI,YAAY,CAAC,8BAA8B;QAC7C,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,YAAY,CAAC,8BAA8B;SACnD,CAAC;IACJ,IAAI,YAAY,CAAC,+BAA+B;QAC9C,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,YAAY,CAAC,+BAA+B;SACpD,CAAC;IACJ,IAAI,YAAY,CAAC,qBAAqB;QACpC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,CAAC,qBAAqB,EAAE,CAAC;IAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,4BAA4B,CACnC,QAAiC;IAEjC,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,cAAc;YACjB,OAAO,EAAE,oBAAoB,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClD,KAAK,kBAAkB;YACrB,OAAO,EAAE,8BAA8B,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5D,KAAK,eAAe;YAClB,OAAO,EAAE,qBAAqB,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnD,KAAK,mBAAmB;YACtB,OAAO,EAAE,+BAA+B,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7D,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CACjC,QAAiC;IAEjC,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,cAAc;YACjB,OAAO;gBACL,uBAAuB,EAAE;oBACvB,GAAG,QAAQ,CAAC,KAAK;oBACjB,KAAK,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;iBACnE;aACF,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO;gBACL,uBAAuB,EAAE;oBACvB,GAAG,QAAQ,CAAC,KAAK;oBACjB,KAAK,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;iBACnE;aACF,CAAC;QACJ,KAAK,kBAAkB;YACrB,OAAO;gBACL,uBAAuB,EAAE;oBACvB,GAAG,QAAQ,CAAC,KAAK;oBACjB,KAAK,EAAE,YAAY;oBACnB,KAAK,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;iBACtC;aACF,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO;gBACL,uBAAuB,EAAE;oBACvB,GAAG,QAAQ,CAAC,KAAK;oBACjB,KAAK,EAAE,YAAY;oBACnB,KAAK,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;iBACtC;aACF,CAAC;QACJ,KAAK,MAAM;YACT,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,OAAoB;IAEpB,MAAM,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAC7C,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAC5B,OAAO;QACL,gBAAgB,EAAE;YAChB,GAAG,WAAW;YACd,aAAa,EAAE,OAAO,CAAC,eAAe;iBACnC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnB,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,YAAY,GAAG,CAAC,CACjE;iBACA,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;SAC5C;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iCAAiC,CACxC,OAAoB;IAEpB,MAAM,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAC7C,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAC5B,OAAO;QACL,gBAAgB,EAAE;YAChB,GAAG,WAAW;YACd,aAAa,EAAE,OAAO,CAAC,eAAe;iBACnC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnB,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACtC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAC7C,CACF;iBACA,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;SAC5C;KACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,QAAsB,EACtB,WAAmB;IAEnB,OAAO,CACL,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM;QACzC,CAAC;QACD,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACzD,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,YAA+B;IAChE,IACE;QACE,YAAY,CAAC,oBAAoB;QACjC,YAAY,CAAC,8BAA8B;QAC3C,YAAY,CAAC,qBAAqB;QAClC,YAAY,CAAC,+BAA+B;KAC7C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;QAE5B,MAAM,IAAI,4BAA4B,CACpC,oDAAoD,CACrD,CAAC;AACN,CAAC;AAED,SAAS,iCAAiC,CACxC,WAAyC,EACzC,UAAkB;IAElB,IACE,CAAC,WAAW;QACZ,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC7C,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC;QAErC,MAAM,IAAI,4BAA4B,CACpC,4CAA4C,CAC7C,CAAC;AACN,CAAC;AAED,SAAS,2BAA2B,CAClC,WAA6B,EAC7B,SAAiB,EACjB,SAA2B,EAC3B,YAAoB;IAEpB,IACE,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,YAAY,KAAK,CAAC;QAClB,CAAC,SAAS,CAAC,IAAI,CACb,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,YAAY;YACrB,GAAG,WAAW,CAAC,YAAY,kBAAkB,SAAS,WAAW,CACpE;QAED,MAAM,IAAI,4BAA4B,CACpC,4CAA4C,CAC7C,CAAC;AACN,CAAC;AAED,SAAS,6BAA6B,CACpC,OAA0B,EAC1B,OAAoB,EACpB,UAAiC,EACjC,YAAoB;IAEpB,MAAM,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAC7C,iCAAiC,CAAC,WAAW,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IACtE,2BAA2B,CACzB,WAAW,EACX,UAAU,CAAC,SAAS,EACpB,OAAO,CAAC,eAAe,EACvB,YAAY,CACb,CAAC;IACF,2BAA2B,CACzB,OAAO,EACP,iCAAiC,EACjC,yDAAyD,CAC1D,CAAC;AACJ,CAAC;AAED,SAAS,iCAAiC,CACxC,SAAiB,EACjB,YAAoB;IAEpB,OAAO,CACL,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;QACnC,SAAS,KAAK,GAAG;QACjB,SAAS,KAAK,IAAI;QAClB,YAAY,KAAK,CAAC,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CACvC,SAA2B,EAC3B,IAAY,EACZ,OAAe;IAEf,IACE,CAAC,SAAS,CAAC,IAAI,CACb,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,YAAY,KAAK,IAAI,CACpE;QAED,MAAM,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,iCAAiC,CACxC,OAA0B,EAC1B,OAAoB,EACpB,UAAqC,EACrC,YAAoB;IAEpB,MAAM,OAAO,GAAG,uDAAuD,CAAC;IACxE,IAAI,CAAC,iCAAiC,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC;QACxE,MAAM,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAClD,gCAAgC,CAC9B,OAAO,CAAC,eAAe,EACvB,kBAAkB,UAAU,CAAC,SAAS,WAAW,EACjD,OAAO,CACR,CAAC;IACF,2BAA2B,CACzB,OAAO,EACP,mCAAmC,EACnC,2DAA2D,CAC5D,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,MAAc;IACpD,IACE,CAAC,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAEzC,MAAM,IAAI,4BAA4B,CACpC,wDAAwD,CACzD,CAAC;AACN,CAAC;AAED,SAAS,kCAAkC,CACzC,OAA0B,EAC1B,OAAoB,EACpB,UAAqC,EACrC,YAAoB;IAEpB,MAAM,OAAO,GAAG,wDAAwD,CAAC;IACzE,IAAI,CAAC,iCAAiC,CAAC,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC;QACxE,MAAM,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAClD,8BAA8B,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,gCAAgC,CAC9B,OAAO,CAAC,eAAe,EACvB,kBAAkB,UAAU,CAAC,SAAS,WAAW,EACjD,OAAO,CACR,CAAC;IACF,2BAA2B,CACzB,OAAO,EACP,oCAAoC,EACpC,4DAA4D,CAC7D,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CACvC,WAAgD,EAChD,UAAiC,EACjC,YAAoB;IAEpB,IACE,CAAC,WAAW;QACZ,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAChD,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC/C,YAAY,KAAK,CAAC;QAElB,MAAM,IAAI,4BAA4B,CACpC,6CAA6C,CAC9C,CAAC;AACN,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAsB;IACxD,IACE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAClD,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,wBAAwB,CAAC;QAE3D,MAAM,IAAI,4BAA4B,CACpC,6CAA6C,CAC9C,CAAC;AACN,CAAC;AAED,SAAS,4BAA4B,CACnC,WAAoC,EACpC,SAAiB,EACjB,SAA2B;IAE3B,IACE,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACvC,SAAS,CAAC,IAAI,CACZ,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,YAAY,KAAK,GAAG,IAAI,WAAW,SAAS,WAAW,CACnE,CACF;QAED,MAAM,IAAI,4BAA4B,CACpC,6CAA6C,CAC9C,CAAC;AACN,CAAC;AAED,SAAS,8BAA8B,CACrC,OAA0B,EAC1B,OAAoB,EACpB,UAAiC,EACjC,YAAoB;IAEpB,MAAM,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAC7C,gCAAgC,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACxE,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,4BAA4B,CAC1B,WAAW,EACX,UAAU,CAAC,SAAS,EACpB,OAAO,CAAC,eAAe,CACxB,CAAC;IACF,2BAA2B,CACzB,OAAO,EACP,kCAAkC,EAClC,0DAA0D,CAC3D,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,YAAoB;IACzD,IAAI,YAAY;QACd,MAAM,IAAI,4BAA4B,CACpC,qDAAqD,CACtD,CAAC;AACN,CAAC;AAED,SAAS,+BAA+B,CACtC,OAA0B,EAC1B,OAAoB,EACpB,QAAiC,EACjC,YAAoB;IAEpB,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,cAAc;YACjB,6BAA6B,CAC3B,OAAO,EACP,OAAO,EACP,QAAQ,CAAC,KAAK,EACd,YAAY,CACb,CAAC;YACF,MAAM;QACR,KAAK,kBAAkB;YACrB,iCAAiC,CAC/B,OAAO,EACP,OAAO,EACP,QAAQ,CAAC,KAAK,EACd,YAAY,CACb,CAAC;YACF,MAAM;QACR,KAAK,mBAAmB;YACtB,kCAAkC,CAChC,OAAO,EACP,OAAO,EACP,QAAQ,CAAC,KAAK,EACd,YAAY,CACb,CAAC;YACF,MAAM;QACR,KAAK,eAAe;YAClB,8BAA8B,CAC5B,OAAO,EACP,OAAO,EACP,QAAQ,CAAC,KAAK,EACd,YAAY,CACb,CAAC;YACF,MAAM;QACR,KAAK,MAAM;YACT,6BAA6B,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM;IACV,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAA0B,EAC1B,KAAkB;IAElB,MAAM,YAAY,GAAG,2BAA2B,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC7E,MAAM,gBAAgB,GACpB,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,sBAAsB,CAAC;QAC5D,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IACjE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACvD,+BAA+B,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG;QAClB,GAAG,2BAA2B,CAAC,KAAK,CAAC;QACrC,GAAG,iCAAiC,CAAC,KAAK,CAAC;QAC3C,GAAG,0BAA0B,CAAC,QAAQ,CAAC;KACxC,CAAC;IACF,OAAO;QACL,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,QAAQ;QACR,eAAe,EAAE,WAAW,CAAC,uBAAuB,EAAE,KAAK,IAAI,IAAI;QACnE,aAAa,EAAE,4BAA4B,CAAC,QAAQ,CAAC;QACrD,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAA0B,EAC1B,KAA0B;IAE1B,OAAO,sBAAsB,CAC3B,OAAO,EACP,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CACxC,CAAC;AACJ,CAAC","sourcesContent":["import {\n EvaluationConfigurationError,\n type EvaluationOptions,\n type HostAdapter,\n type ResolvedCase,\n} from \"./types\";\nimport { fixtureParts, type InlineArtifact } from \"../fixtures/preparation\";\nimport { isStringArray } from \"../value-guards\";\nimport type { PreparationResult } from \"../extension-session\";\n\ninterface InvocationArtifacts {\n extensionPreparation: PreparationResult | null;\n inlineArtifacts: InlineArtifact[];\n}\n\ntype ClaudePluginDirectories = NonNullable<\n PreparationResult[\"claudePluginDirs\"]\n>;\ntype CodexMarketplace = NonNullable<PreparationResult[\"codexMarketplace\"]>;\n\ninterface PackageDeclarations {\n readonly codexMarketplace: PreparationResult[\"codexMarketplace\"];\n readonly claudePluginDirs: PreparationResult[\"claudePluginDirs\"];\n}\n\ninterface PackagePlan extends InvocationArtifacts, PackageDeclarations {}\n\ninterface SkillDeclarations {\n readonly codexSkillInvocation: PreparationResult[\"codexSkillInvocation\"];\n readonly codexRepositorySkillInvocation: PreparationResult[\"codexRepositorySkillInvocation\"];\n readonly claudeSkillInvocation: PreparationResult[\"claudeSkillInvocation\"];\n readonly claudeRepositorySkillInvocation: PreparationResult[\"claudeRepositorySkillInvocation\"];\n}\n\ntype CandidatePackageRequest = Pick<\n Parameters<HostAdapter[\"run\"]>[0],\n \"codexMarketplace\" | \"claudePluginDirs\" | \"explicitSkillInvocation\"\n>;\n\nexport interface PreparedInvocation extends PackageDeclarations {\n readonly selected: SelectedSkillInvocation;\n readonly invocationToken: string | null;\n readonly configuration: Partial<SkillDeclarations>;\n readonly hostRequest: CandidatePackageRequest;\n}\n\nexport const INVOCATION_PLACEHOLDER = \"{{sevro.skill_invocation}}\";\nexport const LEGACY_CODEX_PLACEHOLDER = \"{{sevro.codex.skill_invocation}}\";\n\nfunction uniquePluginRoots(value: unknown): value is string[] {\n return (\n isStringArray(value) &&\n value.length > 0 &&\n new Set(value).size === value.length\n );\n}\n\nfunction validateClaudePluginRoots(roots: string[]): void {\n try {\n if (!uniquePluginRoots(roots)) throw new Error(\"invalid plugin roots\");\n for (const root of roots) fixtureParts(root);\n if (\n roots.some((root) =>\n roots.some((other) => root !== other && root.startsWith(`${other}/`)),\n )\n )\n throw new Error(\"overlapping plugin roots\");\n } catch (cause) {\n throw new EvaluationConfigurationError(\n \"invalid Claude plugin directory declaration\",\n { cause },\n );\n }\n}\n\nfunction requireNegotiatedCapability(\n options: EvaluationOptions,\n capability: string,\n message: string,\n): void {\n if (\n !options.extension?.session.identity.capabilities.includes(capability) ||\n !options.host.hostCapabilities?.includes(capability)\n )\n throw new EvaluationConfigurationError(message);\n}\n\nfunction validatePackageManifest(\n files: InlineArtifact[],\n manifest: string,\n message: string,\n): void {\n if (\n !files.length ||\n !files.every((artifact) => artifact.gitExclude) ||\n !files.some((artifact) => artifact.relativePath === manifest)\n )\n throw new EvaluationConfigurationError(message);\n}\n\nfunction validateClaudePluginPackage(\n options: EvaluationOptions,\n directories: ClaudePluginDirectories | undefined,\n artifacts: InlineArtifact[],\n): void {\n if (!directories) return;\n const roots = directories.artifactRoots;\n validateClaudePluginRoots(roots);\n requireNegotiatedCapability(\n options,\n \"sevro.claude.plugin-dirs\",\n \"Claude plugin directory capability was not negotiated\",\n );\n for (const root of roots) {\n const files = artifacts.filter((artifact) =>\n artifact.relativePath.startsWith(`${root}/`),\n );\n validatePackageManifest(\n files,\n `${root}/.claude-plugin/plugin.json`,\n \"Claude plugin directory requires Git-excluded package artifacts and a manifest\",\n );\n }\n}\n\nfunction marketplaceNamesValid(name: string, plugins: string[]): boolean {\n return (\n /^[a-z][a-z0-9-]*$/.test(name) &&\n plugins.length > 0 &&\n !plugins.some((plugin) => !/^[a-z][a-z0-9-]*$/.test(plugin)) &&\n new Set(plugins).size === plugins.length\n );\n}\n\nfunction validateMarketplaceDeclaration(marketplace: CodexMarketplace): void {\n try {\n fixtureParts(marketplace.artifactRoot);\n if (\n !marketplaceNamesValid(\n marketplace.marketplaceName,\n marketplace.pluginNames,\n )\n )\n throw new Error(\"invalid marketplace or plugin name\");\n } catch (cause) {\n throw new EvaluationConfigurationError(\n \"invalid Codex marketplace declaration\",\n { cause },\n );\n }\n}\n\nfunction validateCodexMarketplacePackage(\n options: EvaluationOptions,\n marketplace: CodexMarketplace | undefined,\n artifacts: InlineArtifact[],\n): void {\n if (!marketplace) return;\n validateMarketplaceDeclaration(marketplace);\n requireNegotiatedCapability(\n options,\n \"sevro.codex.plugin-marketplace\",\n \"Codex marketplace capability was not negotiated\",\n );\n const files = artifacts.filter((artifact) =>\n artifact.relativePath.startsWith(`${marketplace.artifactRoot}/`),\n );\n validatePackageManifest(\n files,\n `${marketplace.artifactRoot}/.claude-plugin/marketplace.json`,\n \"Codex marketplace requires Git-excluded package artifacts and a manifest\",\n );\n}\n\nfunction preparePackageArtifacts(\n options: EvaluationOptions,\n state: InvocationArtifacts,\n): PackagePlan {\n const codexMarketplace = state.extensionPreparation?.codexMarketplace;\n const claudePluginDirs = state.extensionPreparation?.claudePluginDirs;\n validateClaudePluginPackage(options, claudePluginDirs, state.inlineArtifacts);\n validateCodexMarketplacePackage(\n options,\n codexMarketplace,\n state.inlineArtifacts,\n );\n return { ...state, codexMarketplace, claudePluginDirs };\n}\n\nfunction skillInvocationDeclarations(\n preparation: PreparationResult | null,\n): SkillDeclarations {\n return {\n codexSkillInvocation: preparation?.codexSkillInvocation,\n codexRepositorySkillInvocation: preparation?.codexRepositorySkillInvocation,\n claudeSkillInvocation: preparation?.claudeSkillInvocation,\n claudeRepositorySkillInvocation:\n preparation?.claudeRepositorySkillInvocation,\n };\n}\n\ntype PluginSkillInvocation = NonNullable<\n SkillDeclarations[\"codexSkillInvocation\"]\n>;\ntype RepositorySkillInvocation = NonNullable<\n SkillDeclarations[\"codexRepositorySkillInvocation\"]\n>;\ntype SelectedSkillInvocation =\n | { kind: \"codex-plugin\"; value: PluginSkillInvocation }\n | { kind: \"codex-repository\"; value: RepositorySkillInvocation }\n | { kind: \"claude-plugin\"; value: PluginSkillInvocation }\n | { kind: \"claude-repository\"; value: RepositorySkillInvocation }\n | { kind: \"none\" };\n\nfunction selectedSkillInvocation(\n declarations: SkillDeclarations,\n): SelectedSkillInvocation {\n if (declarations.codexSkillInvocation)\n return { kind: \"codex-plugin\", value: declarations.codexSkillInvocation };\n if (declarations.codexRepositorySkillInvocation)\n return {\n kind: \"codex-repository\",\n value: declarations.codexRepositorySkillInvocation,\n };\n if (declarations.claudeRepositorySkillInvocation)\n return {\n kind: \"claude-repository\",\n value: declarations.claudeRepositorySkillInvocation,\n };\n if (declarations.claudeSkillInvocation)\n return { kind: \"claude-plugin\", value: declarations.claudeSkillInvocation };\n return { kind: \"none\" };\n}\n\nfunction skillInvocationConfiguration(\n selected: SelectedSkillInvocation,\n): Partial<SkillDeclarations> {\n switch (selected.kind) {\n case \"codex-plugin\":\n return { codexSkillInvocation: selected.value };\n case \"codex-repository\":\n return { codexRepositorySkillInvocation: selected.value };\n case \"claude-plugin\":\n return { claudeSkillInvocation: selected.value };\n case \"claude-repository\":\n return { claudeRepositorySkillInvocation: selected.value };\n case \"none\":\n return {};\n }\n}\n\nfunction candidateInvocationRequest(\n selected: SelectedSkillInvocation,\n): CandidatePackageRequest {\n switch (selected.kind) {\n case \"codex-plugin\":\n return {\n explicitSkillInvocation: {\n ...selected.value,\n token: `$${selected.value.pluginName}:${selected.value.skillName}`,\n },\n };\n case \"claude-plugin\":\n return {\n explicitSkillInvocation: {\n ...selected.value,\n token: `/${selected.value.pluginName}:${selected.value.skillName}`,\n },\n };\n case \"codex-repository\":\n return {\n explicitSkillInvocation: {\n ...selected.value,\n scope: \"repository\",\n token: `$${selected.value.skillName}`,\n },\n };\n case \"claude-repository\":\n return {\n explicitSkillInvocation: {\n ...selected.value,\n scope: \"repository\",\n token: `/${selected.value.skillName}`,\n },\n };\n case \"none\":\n return {};\n }\n}\n\nfunction candidateMarketplaceRequest(\n context: PackagePlan,\n): CandidatePackageRequest {\n const marketplace = context.codexMarketplace;\n if (!marketplace) return {};\n return {\n codexMarketplace: {\n ...marketplace,\n artifactPaths: context.inlineArtifacts\n .filter((artifact) =>\n artifact.relativePath.startsWith(`${marketplace.artifactRoot}/`),\n )\n .map((artifact) => artifact.relativePath),\n },\n };\n}\n\nfunction candidatePluginDirectoriesRequest(\n context: PackagePlan,\n): CandidatePackageRequest {\n const directories = context.claudePluginDirs;\n if (!directories) return {};\n return {\n claudePluginDirs: {\n ...directories,\n artifactPaths: context.inlineArtifacts\n .filter((artifact) =>\n directories.artifactRoots.some((root) =>\n artifact.relativePath.startsWith(`${root}/`),\n ),\n )\n .map((artifact) => artifact.relativePath),\n },\n };\n}\n\nfunction promptPlaceholderCount(\n caseData: ResolvedCase,\n placeholder: string,\n): number {\n return (\n caseData.prompt.split(placeholder).length -\n 1 +\n (caseData.followUpPrompt?.split(placeholder).length ?? 1) -\n 1\n );\n}\n\nfunction validateOnlyOneInvocation(declarations: SkillDeclarations): void {\n if (\n [\n declarations.codexSkillInvocation,\n declarations.codexRepositorySkillInvocation,\n declarations.claudeSkillInvocation,\n declarations.claudeRepositorySkillInvocation,\n ].filter(Boolean).length > 1\n )\n throw new EvaluationConfigurationError(\n \"only one explicit skill invocation may be declared\",\n );\n}\n\nfunction validateCodexInvocationMembership(\n marketplace: CodexMarketplace | undefined,\n pluginName: string,\n): asserts marketplace is CodexMarketplace {\n if (\n !marketplace ||\n !marketplace.pluginNames.includes(pluginName) ||\n !/^[a-z][a-z0-9-]*$/.test(pluginName)\n )\n throw new EvaluationConfigurationError(\n \"invalid Codex skill invocation declaration\",\n );\n}\n\nfunction validateCodexInvocationBody(\n marketplace: CodexMarketplace,\n skillName: string,\n artifacts: InlineArtifact[],\n placeholders: number,\n): void {\n if (\n !/^[A-Za-z0-9._-]+$/.test(skillName) ||\n placeholders !== 1 ||\n !artifacts.some(\n (artifact) =>\n artifact.relativePath ===\n `${marketplace.artifactRoot}/plugin/skills/${skillName}/SKILL.md`,\n )\n )\n throw new EvaluationConfigurationError(\n \"invalid Codex skill invocation declaration\",\n );\n}\n\nfunction validateCodexPluginInvocation(\n options: EvaluationOptions,\n context: PackagePlan,\n invocation: PluginSkillInvocation,\n placeholders: number,\n): void {\n const marketplace = context.codexMarketplace;\n validateCodexInvocationMembership(marketplace, invocation.pluginName);\n validateCodexInvocationBody(\n marketplace,\n invocation.skillName,\n context.inlineArtifacts,\n placeholders,\n );\n requireNegotiatedCapability(\n options,\n \"sevro.codex.explicit-invocation\",\n \"Codex explicit invocation capability was not negotiated\",\n );\n}\n\nfunction validRepositoryInvocationIdentity(\n skillName: string,\n placeholders: number,\n): boolean {\n return (\n /^[A-Za-z0-9._-]+$/.test(skillName) &&\n skillName !== \".\" &&\n skillName !== \"..\" &&\n placeholders === 1\n );\n}\n\nfunction validateRepositoryInvocationBody(\n artifacts: InlineArtifact[],\n path: string,\n message: string,\n): void {\n if (\n !artifacts.some(\n (artifact) => artifact.gitExclude && artifact.relativePath === path,\n )\n )\n throw new EvaluationConfigurationError(message);\n}\n\nfunction validateCodexRepositoryInvocation(\n options: EvaluationOptions,\n context: PackagePlan,\n invocation: RepositorySkillInvocation,\n placeholders: number,\n): void {\n const message = \"invalid Codex repository skill invocation declaration\";\n if (!validRepositoryInvocationIdentity(invocation.skillName, placeholders))\n throw new EvaluationConfigurationError(message);\n validateRepositoryInvocationBody(\n context.inlineArtifacts,\n `.agents/skills/${invocation.skillName}/SKILL.md`,\n message,\n );\n requireNegotiatedCapability(\n options,\n \"sevro.codex.repository-invocation\",\n \"Codex repository invocation capability was not negotiated\",\n );\n}\n\nfunction validateClaudeRepositoryPrompt(prompt: string): void {\n if (\n !prompt.startsWith(INVOCATION_PLACEHOLDER) ||\n prompt.includes(LEGACY_CODEX_PLACEHOLDER)\n )\n throw new EvaluationConfigurationError(\n \"invalid Claude repository skill invocation declaration\",\n );\n}\n\nfunction validateClaudeRepositoryInvocation(\n options: EvaluationOptions,\n context: PackagePlan,\n invocation: RepositorySkillInvocation,\n placeholders: number,\n): void {\n const message = \"invalid Claude repository skill invocation declaration\";\n if (!validRepositoryInvocationIdentity(invocation.skillName, placeholders))\n throw new EvaluationConfigurationError(message);\n validateClaudeRepositoryPrompt(options.case.prompt);\n validateRepositoryInvocationBody(\n context.inlineArtifacts,\n `.claude/skills/${invocation.skillName}/SKILL.md`,\n message,\n );\n requireNegotiatedCapability(\n options,\n \"sevro.claude.repository-invocation\",\n \"Claude repository invocation capability was not negotiated\",\n );\n}\n\nfunction validateClaudeInvocationIdentity(\n directories: ClaudePluginDirectories | undefined,\n invocation: PluginSkillInvocation,\n placeholders: number,\n): asserts directories is ClaudePluginDirectories {\n if (\n !directories ||\n !/^[a-z][a-z0-9-]*$/.test(invocation.pluginName) ||\n !/^[A-Za-z0-9._-]+$/.test(invocation.skillName) ||\n placeholders !== 1\n )\n throw new EvaluationConfigurationError(\n \"invalid Claude skill invocation declaration\",\n );\n}\n\nfunction validateClaudePluginPrompt(caseData: ResolvedCase): void {\n if (\n caseData.prompt.includes(LEGACY_CODEX_PLACEHOLDER) ||\n caseData.followUpPrompt?.includes(LEGACY_CODEX_PLACEHOLDER)\n )\n throw new EvaluationConfigurationError(\n \"invalid Claude skill invocation declaration\",\n );\n}\n\nfunction validateClaudeInvocationBody(\n directories: ClaudePluginDirectories,\n skillName: string,\n artifacts: InlineArtifact[],\n): void {\n if (\n !directories.artifactRoots.some((root) =>\n artifacts.some(\n (artifact) =>\n artifact.relativePath === `${root}/skills/${skillName}/SKILL.md`,\n ),\n )\n )\n throw new EvaluationConfigurationError(\n \"invalid Claude skill invocation declaration\",\n );\n}\n\nfunction validateClaudePluginInvocation(\n options: EvaluationOptions,\n context: PackagePlan,\n invocation: PluginSkillInvocation,\n placeholders: number,\n): void {\n const directories = context.claudePluginDirs;\n validateClaudeInvocationIdentity(directories, invocation, placeholders);\n validateClaudePluginPrompt(options.case);\n validateClaudeInvocationBody(\n directories,\n invocation.skillName,\n context.inlineArtifacts,\n );\n requireNegotiatedCapability(\n options,\n \"sevro.claude.explicit-invocation\",\n \"Claude explicit invocation capability was not negotiated\",\n );\n}\n\nfunction validateUndeclaredPlaceholder(placeholders: number): void {\n if (placeholders)\n throw new EvaluationConfigurationError(\n \"skill invocation placeholder requires a declaration\",\n );\n}\n\nfunction validateSelectedSkillInvocation(\n options: EvaluationOptions,\n context: PackagePlan,\n selected: SelectedSkillInvocation,\n placeholders: number,\n): void {\n switch (selected.kind) {\n case \"codex-plugin\":\n validateCodexPluginInvocation(\n options,\n context,\n selected.value,\n placeholders,\n );\n break;\n case \"codex-repository\":\n validateCodexRepositoryInvocation(\n options,\n context,\n selected.value,\n placeholders,\n );\n break;\n case \"claude-repository\":\n validateClaudeRepositoryInvocation(\n options,\n context,\n selected.value,\n placeholders,\n );\n break;\n case \"claude-plugin\":\n validateClaudePluginInvocation(\n options,\n context,\n selected.value,\n placeholders,\n );\n break;\n case \"none\":\n validateUndeclaredPlaceholder(placeholders);\n break;\n }\n}\n\nfunction prepareSkillInvocation(\n options: EvaluationOptions,\n state: PackagePlan,\n): PreparedInvocation {\n const declarations = skillInvocationDeclarations(state.extensionPreparation);\n const placeholderCount =\n promptPlaceholderCount(options.case, INVOCATION_PLACEHOLDER) +\n promptPlaceholderCount(options.case, LEGACY_CODEX_PLACEHOLDER);\n validateOnlyOneInvocation(declarations);\n const selected = selectedSkillInvocation(declarations);\n validateSelectedSkillInvocation(options, state, selected, placeholderCount);\n const hostRequest = {\n ...candidateMarketplaceRequest(state),\n ...candidatePluginDirectoriesRequest(state),\n ...candidateInvocationRequest(selected),\n };\n return {\n codexMarketplace: state.codexMarketplace,\n claudePluginDirs: state.claudePluginDirs,\n selected,\n invocationToken: hostRequest.explicitSkillInvocation?.token ?? null,\n configuration: skillInvocationConfiguration(selected),\n hostRequest,\n };\n}\n\nexport function prepareInvocationPlan(\n options: EvaluationOptions,\n state: InvocationArtifacts,\n): PreparedInvocation {\n return prepareSkillInvocation(\n options,\n preparePackageArtifacts(options, state),\n );\n}\n"]}
|