@prismatic-io/lux 0.0.2-preview.4 → 0.0.2-preview.40
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/lib/answerers/claude-code/index.d.ts +15 -3
- package/lib/answerers/claude-code/index.d.ts.map +1 -1
- package/lib/answerers/claude-code/index.js +6 -5
- package/lib/answerers/claude-code/index.js.map +1 -1
- package/lib/answerers/persona/index.d.ts +44 -5
- package/lib/answerers/persona/index.d.ts.map +1 -1
- package/lib/answerers/persona/index.js +60 -34
- package/lib/answerers/persona/index.js.map +1 -1
- package/lib/answerers/terminal/index.d.ts +9 -3
- package/lib/answerers/terminal/index.d.ts.map +1 -1
- package/lib/answerers/terminal/index.js +6 -4
- package/lib/answerers/terminal/index.js.map +1 -1
- package/lib/assertions/authoring.d.ts +2 -2
- package/lib/assertions/authoring.d.ts.map +1 -1
- package/lib/assertions/authoring.js.map +1 -1
- package/lib/assertions/core/command-exits-zero.d.ts +5 -2
- package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
- package/lib/assertions/core/command-exits-zero.js +59 -14
- package/lib/assertions/core/command-exits-zero.js.map +1 -1
- package/lib/assertions/core/event-checks.d.ts +3 -0
- package/lib/assertions/core/event-checks.d.ts.map +1 -1
- package/lib/assertions/core/event-checks.js +49 -3
- package/lib/assertions/core/event-checks.js.map +1 -1
- package/lib/assertions/core/file-checks.d.ts +6 -0
- package/lib/assertions/core/file-checks.d.ts.map +1 -1
- package/lib/assertions/core/index.d.ts.map +1 -1
- package/lib/assertions/core/index.js +2 -1
- package/lib/assertions/core/index.js.map +1 -1
- package/lib/assertions/core/json-pointer-equals.d.ts +1 -0
- package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -1
- package/lib/assertions/core/output-checks.d.ts +3 -0
- package/lib/assertions/core/output-checks.d.ts.map +1 -1
- package/lib/assertions/core/predicate.d.ts +1 -0
- package/lib/assertions/core/predicate.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.d.ts +25 -0
- package/lib/assertions/core/resource-checks.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.js +35 -5
- package/lib/assertions/core/resource-checks.js.map +1 -1
- package/lib/assertions/core/safe-regex.d.ts.map +1 -1
- package/lib/assertions/core/safe-regex.js +7 -1
- package/lib/assertions/core/safe-regex.js.map +1 -1
- package/lib/assertions/rubric/evidence.d.ts +88 -0
- package/lib/assertions/rubric/evidence.d.ts.map +1 -0
- package/lib/assertions/rubric/evidence.js +75 -0
- package/lib/assertions/rubric/evidence.js.map +1 -0
- package/lib/assertions/rubric/index.d.ts +88 -34
- package/lib/assertions/rubric/index.d.ts.map +1 -1
- package/lib/assertions/rubric/index.js +59 -43
- package/lib/assertions/rubric/index.js.map +1 -1
- package/lib/assertions/rubric/internal.d.ts +30 -5
- package/lib/assertions/rubric/internal.d.ts.map +1 -1
- package/lib/assertions/rubric/internal.js +203 -41
- package/lib/assertions/rubric/internal.js.map +1 -1
- package/lib/authoring.d.ts +37 -2
- package/lib/authoring.d.ts.map +1 -1
- package/lib/authoring.js +36 -1
- package/lib/authoring.js.map +1 -1
- package/lib/cli/bin.js +2 -13
- package/lib/cli/bin.js.map +1 -1
- package/lib/cli/command-runtime.d.ts +3 -3
- package/lib/cli/command-runtime.d.ts.map +1 -1
- package/lib/cli/command-runtime.js +17 -6
- package/lib/cli/command-runtime.js.map +1 -1
- package/lib/cli/doctor.d.ts +55 -0
- package/lib/cli/doctor.d.ts.map +1 -0
- package/lib/cli/doctor.js +14 -0
- package/lib/cli/doctor.js.map +1 -0
- package/lib/cli/harness-plan.d.ts +27 -0
- package/lib/cli/harness-plan.d.ts.map +1 -0
- package/lib/cli/harness-plan.js +75 -0
- package/lib/cli/harness-plan.js.map +1 -0
- package/lib/cli/init-templates.d.ts +11 -0
- package/lib/cli/init-templates.d.ts.map +1 -0
- package/lib/cli/init-templates.js +215 -0
- package/lib/cli/init-templates.js.map +1 -0
- package/lib/cli/init.d.ts +10 -0
- package/lib/cli/init.d.ts.map +1 -1
- package/lib/cli/init.js +34 -173
- package/lib/cli/init.js.map +1 -1
- package/lib/cli/output-schemas.d.ts +1412 -0
- package/lib/cli/output-schemas.d.ts.map +1 -0
- package/lib/cli/output-schemas.js +94 -0
- package/lib/cli/output-schemas.js.map +1 -0
- package/lib/cli/program.d.ts +140 -12
- package/lib/cli/program.d.ts.map +1 -1
- package/lib/cli/program.js +783 -650
- package/lib/cli/program.js.map +1 -1
- package/lib/cli/render/format.d.ts.map +1 -1
- package/lib/cli/render/format.js +1 -1
- package/lib/cli/render/format.js.map +1 -1
- package/lib/cli/render/reporter.d.ts.map +1 -1
- package/lib/cli/render/reporter.js +35 -8
- package/lib/cli/render/reporter.js.map +1 -1
- package/lib/cli/run-options.d.ts +19 -4
- package/lib/cli/run-options.d.ts.map +1 -1
- package/lib/cli/run-options.js +100 -19
- package/lib/cli/run-options.js.map +1 -1
- package/lib/cli/view.d.ts +15 -0
- package/lib/cli/view.d.ts.map +1 -0
- package/lib/cli/view.js +168 -0
- package/lib/cli/view.js.map +1 -0
- package/lib/container/driver.d.ts +27 -0
- package/lib/container/driver.d.ts.map +1 -0
- package/lib/container/driver.js +199 -0
- package/lib/container/driver.js.map +1 -0
- package/lib/container/paths.d.ts +3 -0
- package/lib/container/paths.d.ts.map +1 -0
- package/lib/container/paths.js +27 -0
- package/lib/container/paths.js.map +1 -0
- package/lib/container/protocol.d.ts +12 -0
- package/lib/container/protocol.d.ts.map +1 -0
- package/lib/container/protocol.js +38 -0
- package/lib/container/protocol.js.map +1 -0
- package/lib/container/resources.d.ts +14 -0
- package/lib/container/resources.d.ts.map +1 -0
- package/lib/container/resources.js +141 -0
- package/lib/container/resources.js.map +1 -0
- package/lib/container/worker.d.ts +2 -0
- package/lib/container/worker.d.ts.map +1 -0
- package/lib/container/worker.js +85 -0
- package/lib/container/worker.js.map +1 -0
- package/lib/core/action-events.d.ts +29 -0
- package/lib/core/action-events.d.ts.map +1 -0
- package/lib/core/action-events.js +51 -0
- package/lib/core/action-events.js.map +1 -0
- package/lib/core/agent-activity.d.ts +49 -0
- package/lib/core/agent-activity.d.ts.map +1 -0
- package/lib/core/agent-activity.js +206 -0
- package/lib/core/agent-activity.js.map +1 -0
- package/lib/core/agent-environment.d.ts +5 -0
- package/lib/core/agent-environment.d.ts.map +1 -0
- package/lib/core/agent-environment.js +47 -0
- package/lib/core/agent-environment.js.map +1 -0
- package/lib/core/agent-events.d.ts +26 -0
- package/lib/core/agent-events.d.ts.map +1 -0
- package/lib/core/agent-events.js +13 -0
- package/lib/core/agent-events.js.map +1 -0
- package/lib/core/annotation.d.ts +6 -2
- package/lib/core/annotation.d.ts.map +1 -1
- package/lib/core/annotation.js +2 -1
- package/lib/core/annotation.js.map +1 -1
- package/lib/core/answerer.d.ts +12 -0
- package/lib/core/answerer.d.ts.map +1 -1
- package/lib/core/answerer.js +2 -0
- package/lib/core/answerer.js.map +1 -1
- package/lib/core/artifact-evidence.d.ts +6 -1
- package/lib/core/artifact-evidence.d.ts.map +1 -1
- package/lib/core/artifact-evidence.js +27 -6
- package/lib/core/artifact-evidence.js.map +1 -1
- package/lib/core/assertion.d.ts +10 -4
- package/lib/core/assertion.d.ts.map +1 -1
- package/lib/core/assertion.js +8 -2
- package/lib/core/assertion.js.map +1 -1
- package/lib/core/case-defaults.d.ts +16 -0
- package/lib/core/case-defaults.d.ts.map +1 -0
- package/lib/core/case-defaults.js +42 -0
- package/lib/core/case-defaults.js.map +1 -0
- package/lib/core/case.d.ts +120 -6
- package/lib/core/case.d.ts.map +1 -1
- package/lib/core/case.js +51 -5
- package/lib/core/case.js.map +1 -1
- package/lib/core/command-verification.d.ts +10 -0
- package/lib/core/command-verification.d.ts.map +1 -0
- package/lib/core/command-verification.js +66 -0
- package/lib/core/command-verification.js.map +1 -0
- package/lib/core/driver-execution.d.ts +83 -0
- package/lib/core/driver-execution.d.ts.map +1 -0
- package/lib/core/driver-execution.js +72 -0
- package/lib/core/driver-execution.js.map +1 -0
- package/lib/core/driver-metrics.d.ts +98 -0
- package/lib/core/driver-metrics.d.ts.map +1 -0
- package/lib/core/driver-metrics.js +36 -0
- package/lib/core/driver-metrics.js.map +1 -0
- package/lib/core/driver.d.ts +64 -0
- package/lib/core/driver.d.ts.map +1 -1
- package/lib/core/driver.js +28 -0
- package/lib/core/driver.js.map +1 -1
- package/lib/core/duration.d.ts +5 -0
- package/lib/core/duration.d.ts.map +1 -0
- package/lib/core/duration.js +49 -0
- package/lib/core/duration.js.map +1 -0
- package/lib/core/environment.d.ts +18 -0
- package/lib/core/environment.d.ts.map +1 -0
- package/lib/core/environment.js +21 -0
- package/lib/core/environment.js.map +1 -0
- package/lib/core/evaluation-clusters.d.ts +17 -0
- package/lib/core/evaluation-clusters.d.ts.map +1 -0
- package/lib/core/evaluation-clusters.js +23 -0
- package/lib/core/evaluation-clusters.js.map +1 -0
- package/lib/core/events.d.ts +34 -0
- package/lib/core/events.d.ts.map +1 -1
- package/lib/core/events.js +11 -2
- package/lib/core/events.js.map +1 -1
- package/lib/core/experiment.d.ts +33 -2
- package/lib/core/experiment.d.ts.map +1 -1
- package/lib/core/experiment.js +40 -19
- package/lib/core/experiment.js.map +1 -1
- package/lib/core/file-tree.d.ts +7 -0
- package/lib/core/file-tree.d.ts.map +1 -0
- package/lib/core/file-tree.js +35 -0
- package/lib/core/file-tree.js.map +1 -0
- package/lib/core/global-id.d.ts +6 -0
- package/lib/core/global-id.d.ts.map +1 -0
- package/lib/core/global-id.js +17 -0
- package/lib/core/global-id.js.map +1 -0
- package/lib/core/harness-catalog.d.ts +35 -0
- package/lib/core/harness-catalog.d.ts.map +1 -0
- package/lib/core/harness-catalog.js +45 -0
- package/lib/core/harness-catalog.js.map +1 -0
- package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
- package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
- package/lib/core/harness-catalogs/antigravity.js +23 -0
- package/lib/core/harness-catalogs/antigravity.js.map +1 -0
- package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
- package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
- package/lib/core/harness-catalogs/claude-code.js +24 -0
- package/lib/core/harness-catalogs/claude-code.js.map +1 -0
- package/lib/core/harness-catalogs/codex.d.ts +11 -0
- package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
- package/lib/core/harness-catalogs/codex.js +26 -0
- package/lib/core/harness-catalogs/codex.js.map +1 -0
- package/lib/core/harness-catalogs/copilot.d.ts +29 -0
- package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
- package/lib/core/harness-catalogs/copilot.js +45 -0
- package/lib/core/harness-catalogs/copilot.js.map +1 -0
- package/lib/core/harness-catalogs/cursor.d.ts +2 -0
- package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
- package/lib/core/harness-catalogs/cursor.js +13 -0
- package/lib/core/harness-catalogs/cursor.js.map +1 -0
- package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
- package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
- package/lib/core/harness-catalogs/grok-build.js +18 -0
- package/lib/core/harness-catalogs/grok-build.js.map +1 -0
- package/lib/core/harness-catalogs/index.d.ts +73 -0
- package/lib/core/harness-catalogs/index.d.ts.map +1 -0
- package/lib/core/harness-catalogs/index.js +17 -0
- package/lib/core/harness-catalogs/index.js.map +1 -0
- package/lib/core/harness-matrix.d.ts +154 -0
- package/lib/core/harness-matrix.d.ts.map +1 -0
- package/lib/core/harness-matrix.js +204 -0
- package/lib/core/harness-matrix.js.map +1 -0
- package/lib/core/index.d.ts +12 -0
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +12 -0
- package/lib/core/index.js.map +1 -1
- package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
- package/lib/core/lifecycle-fixtures.js +4 -2
- package/lib/core/lifecycle-fixtures.js.map +1 -1
- package/lib/core/model-cli.d.ts +9 -11
- package/lib/core/model-cli.d.ts.map +1 -1
- package/lib/core/model-cli.js +39 -22
- package/lib/core/model-cli.js.map +1 -1
- package/lib/core/platform-process.d.ts +7 -2
- package/lib/core/platform-process.d.ts.map +1 -1
- package/lib/core/platform-process.js +54 -16
- package/lib/core/platform-process.js.map +1 -1
- package/lib/core/reference-defaults.d.ts +5 -0
- package/lib/core/reference-defaults.d.ts.map +1 -0
- package/lib/core/reference-defaults.js +42 -0
- package/lib/core/reference-defaults.js.map +1 -0
- package/lib/core/rubric.d.ts +1 -0
- package/lib/core/rubric.d.ts.map +1 -1
- package/lib/core/run.d.ts +292 -1
- package/lib/core/run.d.ts.map +1 -1
- package/lib/core/run.js +27 -0
- package/lib/core/run.js.map +1 -1
- package/lib/core/secure-copy.d.ts.map +1 -0
- package/lib/core/secure-copy.js.map +1 -0
- package/lib/core/usage.d.ts +5 -0
- package/lib/core/usage.d.ts.map +1 -1
- package/lib/core/usage.js +3 -0
- package/lib/core/usage.js.map +1 -1
- package/lib/core/wire.d.ts +11 -0
- package/lib/core/wire.d.ts.map +1 -1
- package/lib/drivers/antigravity/artifacts.d.ts +2 -0
- package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
- package/lib/drivers/antigravity/artifacts.js +33 -0
- package/lib/drivers/antigravity/artifacts.js.map +1 -0
- package/lib/drivers/antigravity/config.d.ts +88 -0
- package/lib/drivers/antigravity/config.d.ts.map +1 -0
- package/lib/drivers/antigravity/config.js +87 -0
- package/lib/drivers/antigravity/config.js.map +1 -0
- package/lib/drivers/antigravity/events.d.ts +4 -0
- package/lib/drivers/antigravity/events.d.ts.map +1 -0
- package/lib/drivers/antigravity/events.js +241 -0
- package/lib/drivers/antigravity/events.js.map +1 -0
- package/lib/drivers/antigravity/index.d.ts +114 -0
- package/lib/drivers/antigravity/index.d.ts.map +1 -0
- package/lib/drivers/antigravity/index.js +113 -0
- package/lib/drivers/antigravity/index.js.map +1 -0
- package/lib/drivers/antigravity/runtime.d.ts +7 -0
- package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
- package/lib/drivers/antigravity/runtime.js +83 -0
- package/lib/drivers/antigravity/runtime.js.map +1 -0
- package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
- package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
- package/lib/drivers/claude-code/deferred-process.js +108 -0
- package/lib/drivers/claude-code/deferred-process.js.map +1 -0
- package/lib/drivers/claude-code/index.d.ts +187 -10
- package/lib/drivers/claude-code/index.d.ts.map +1 -1
- package/lib/drivers/claude-code/index.js +197 -252
- package/lib/drivers/claude-code/index.js.map +1 -1
- package/lib/drivers/claude-code/isolation.d.ts +8 -0
- package/lib/drivers/claude-code/isolation.d.ts.map +1 -0
- package/lib/drivers/claude-code/isolation.js +199 -0
- package/lib/drivers/claude-code/isolation.js.map +1 -0
- package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
- package/lib/drivers/claude-code/parse-events.js +73 -8
- package/lib/drivers/claude-code/parse-events.js.map +1 -1
- package/lib/drivers/codex/app-events.d.ts +9 -2
- package/lib/drivers/codex/app-events.d.ts.map +1 -1
- package/lib/drivers/codex/app-events.js +104 -12
- package/lib/drivers/codex/app-events.js.map +1 -1
- package/lib/drivers/codex/config.d.ts +69 -5
- package/lib/drivers/codex/config.d.ts.map +1 -1
- package/lib/drivers/codex/config.js +48 -8
- package/lib/drivers/codex/config.js.map +1 -1
- package/lib/drivers/codex/exec-events.d.ts +4 -0
- package/lib/drivers/codex/exec-events.d.ts.map +1 -0
- package/lib/drivers/codex/exec-events.js +230 -0
- package/lib/drivers/codex/exec-events.js.map +1 -0
- package/lib/drivers/codex/index.d.ts +142 -4
- package/lib/drivers/codex/index.d.ts.map +1 -1
- package/lib/drivers/codex/index.js +114 -276
- package/lib/drivers/codex/index.js.map +1 -1
- package/lib/drivers/copilot/config.d.ts +84 -0
- package/lib/drivers/copilot/config.d.ts.map +1 -0
- package/lib/drivers/copilot/config.js +57 -0
- package/lib/drivers/copilot/config.js.map +1 -0
- package/lib/drivers/copilot/index.d.ts +107 -0
- package/lib/drivers/copilot/index.d.ts.map +1 -0
- package/lib/drivers/copilot/index.js +268 -0
- package/lib/drivers/copilot/index.js.map +1 -0
- package/lib/drivers/cursor/config.d.ts +28 -0
- package/lib/drivers/cursor/config.d.ts.map +1 -0
- package/lib/drivers/cursor/config.js +28 -0
- package/lib/drivers/cursor/config.js.map +1 -0
- package/lib/drivers/cursor/index.d.ts +44 -0
- package/lib/drivers/cursor/index.d.ts.map +1 -0
- package/lib/drivers/cursor/index.js +286 -0
- package/lib/drivers/cursor/index.js.map +1 -0
- package/lib/drivers/cursor/interaction.d.ts +6 -0
- package/lib/drivers/cursor/interaction.d.ts.map +1 -0
- package/lib/drivers/cursor/interaction.js +55 -0
- package/lib/drivers/cursor/interaction.js.map +1 -0
- package/lib/drivers/grok-build/config.d.ts +68 -0
- package/lib/drivers/grok-build/config.d.ts.map +1 -0
- package/lib/drivers/grok-build/config.js +40 -0
- package/lib/drivers/grok-build/config.js.map +1 -0
- package/lib/drivers/grok-build/index.d.ts +87 -0
- package/lib/drivers/grok-build/index.d.ts.map +1 -0
- package/lib/drivers/grok-build/index.js +293 -0
- package/lib/drivers/grok-build/index.js.map +1 -0
- package/lib/drivers/mcp/index.d.ts +37 -4
- package/lib/drivers/mcp/index.d.ts.map +1 -1
- package/lib/drivers/mcp/index.js +25 -11
- package/lib/drivers/mcp/index.js.map +1 -1
- package/lib/drivers/shared/acp-events.d.ts +15 -0
- package/lib/drivers/shared/acp-events.d.ts.map +1 -0
- package/lib/drivers/shared/acp-events.js +83 -0
- package/lib/drivers/shared/acp-events.js.map +1 -0
- package/lib/drivers/shared/acp-interaction.d.ts +7 -0
- package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
- package/lib/drivers/shared/acp-interaction.js +20 -0
- package/lib/drivers/shared/acp-interaction.js.map +1 -0
- package/lib/drivers/shared/acp-session.d.ts +4 -0
- package/lib/drivers/shared/acp-session.d.ts.map +1 -0
- package/lib/drivers/shared/acp-session.js +23 -0
- package/lib/drivers/shared/acp-session.js.map +1 -0
- package/lib/drivers/shared/acp-transport.d.ts +40 -0
- package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
- package/lib/drivers/shared/acp-transport.js +152 -0
- package/lib/drivers/shared/acp-transport.js.map +1 -0
- package/lib/drivers/shared/artifacts.d.ts.map +1 -1
- package/lib/drivers/shared/artifacts.js +3 -2
- package/lib/drivers/shared/artifacts.js.map +1 -1
- package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
- package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-behavior.js +200 -0
- package/lib/drivers/shared/experiment-behavior.js.map +1 -0
- package/lib/drivers/shared/experiment-policy.d.ts +4 -0
- package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-policy.js +144 -0
- package/lib/drivers/shared/experiment-policy.js.map +1 -0
- package/lib/drivers/shared/skills.d.ts +3 -0
- package/lib/drivers/shared/skills.d.ts.map +1 -0
- package/lib/drivers/shared/skills.js +73 -0
- package/lib/drivers/shared/skills.js.map +1 -0
- package/lib/drivers/subprocess/index.d.ts +39 -4
- package/lib/drivers/subprocess/index.d.ts.map +1 -1
- package/lib/drivers/subprocess/index.js +56 -12
- package/lib/drivers/subprocess/index.js.map +1 -1
- package/lib/index.d.ts +24 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +20 -5
- package/lib/index.js.map +1 -1
- package/lib/optimization/reflective.d.ts +3 -1
- package/lib/optimization/reflective.d.ts.map +1 -1
- package/lib/optimization/reflective.js +3 -2
- package/lib/optimization/reflective.js.map +1 -1
- package/lib/orchestrator/annotation-loader.d.ts +6 -2
- package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
- package/lib/orchestrator/annotation-loader.js +8 -0
- package/lib/orchestrator/annotation-loader.js.map +1 -1
- package/lib/orchestrator/annotation-store.d.ts.map +1 -1
- package/lib/orchestrator/annotation-store.js +16 -2
- package/lib/orchestrator/annotation-store.js.map +1 -1
- package/lib/orchestrator/artifact-origin.d.ts +3 -0
- package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
- package/lib/orchestrator/artifact-origin.js +40 -0
- package/lib/orchestrator/artifact-origin.js.map +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/campaign-lifecycle.js +4 -1
- package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
- package/lib/orchestrator/candidates.d.ts.map +1 -1
- package/lib/orchestrator/candidates.js +3 -2
- package/lib/orchestrator/candidates.js.map +1 -1
- package/lib/orchestrator/compare.d.ts +23 -6
- package/lib/orchestrator/compare.d.ts.map +1 -1
- package/lib/orchestrator/compare.js +45 -12
- package/lib/orchestrator/compare.js.map +1 -1
- package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
- package/lib/orchestrator/comparison-identity.js +2 -0
- package/lib/orchestrator/comparison-identity.js.map +1 -1
- package/lib/orchestrator/config.d.ts +180 -1
- package/lib/orchestrator/config.d.ts.map +1 -1
- package/lib/orchestrator/config.js +21 -2
- package/lib/orchestrator/config.js.map +1 -1
- package/lib/orchestrator/discover.d.ts +1 -0
- package/lib/orchestrator/discover.d.ts.map +1 -1
- package/lib/orchestrator/discover.js +7 -1
- package/lib/orchestrator/discover.js.map +1 -1
- package/lib/orchestrator/doctor.d.ts +1 -0
- package/lib/orchestrator/doctor.d.ts.map +1 -1
- package/lib/orchestrator/doctor.js +134 -69
- package/lib/orchestrator/doctor.js.map +1 -1
- package/lib/orchestrator/driver-capabilities.d.ts +4 -0
- package/lib/orchestrator/driver-capabilities.d.ts.map +1 -0
- package/lib/orchestrator/driver-capabilities.js +13 -0
- package/lib/orchestrator/driver-capabilities.js.map +1 -0
- package/lib/orchestrator/driver-identity.d.ts +5 -0
- package/lib/orchestrator/driver-identity.d.ts.map +1 -0
- package/lib/orchestrator/driver-identity.js +51 -0
- package/lib/orchestrator/driver-identity.js.map +1 -0
- package/lib/orchestrator/experiment-context.d.ts +51 -3
- package/lib/orchestrator/experiment-context.d.ts.map +1 -1
- package/lib/orchestrator/experiment-context.js +2 -1
- package/lib/orchestrator/experiment-context.js.map +1 -1
- package/lib/orchestrator/experiment-contracts.d.ts +31 -1
- package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.d.ts +2 -1
- package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.js +28 -22
- package/lib/orchestrator/experiment-corpus.js.map +1 -1
- package/lib/orchestrator/experiment-effects.d.ts +33 -0
- package/lib/orchestrator/experiment-effects.d.ts.map +1 -0
- package/lib/orchestrator/experiment-effects.js +46 -0
- package/lib/orchestrator/experiment-effects.js.map +1 -0
- package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
- package/lib/orchestrator/experiment-evaluation.js +70 -5
- package/lib/orchestrator/experiment-evaluation.js.map +1 -1
- package/lib/orchestrator/experiment-identity.d.ts +3 -0
- package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-identity.js +22 -33
- package/lib/orchestrator/experiment-identity.js.map +1 -1
- package/lib/orchestrator/experiment-loader.d.ts +8 -3
- package/lib/orchestrator/experiment-loader.d.ts.map +1 -1
- package/lib/orchestrator/experiment-preflight.d.ts +3 -0
- package/lib/orchestrator/experiment-preflight.d.ts.map +1 -0
- package/lib/orchestrator/experiment-preflight.js +21 -0
- package/lib/orchestrator/experiment-preflight.js.map +1 -0
- package/lib/orchestrator/experiment-report.d.ts +91 -1
- package/lib/orchestrator/experiment-report.d.ts.map +1 -1
- package/lib/orchestrator/experiment-report.js +9 -1
- package/lib/orchestrator/experiment-report.js.map +1 -1
- package/lib/orchestrator/experiment-runs.d.ts +63 -2
- package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runs.js +13 -5
- package/lib/orchestrator/experiment-runs.js.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
- package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.js +5 -220
- package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
- package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
- package/lib/orchestrator/experiment-selection.js +151 -43
- package/lib/orchestrator/experiment-selection.js.map +1 -1
- package/lib/orchestrator/experiment.d.ts +3 -3
- package/lib/orchestrator/experiment.d.ts.map +1 -1
- package/lib/orchestrator/experiment.js +26 -21
- package/lib/orchestrator/experiment.js.map +1 -1
- package/lib/orchestrator/fixture-identity.d.ts +1 -0
- package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
- package/lib/orchestrator/fixture-identity.js +6 -1
- package/lib/orchestrator/fixture-identity.js.map +1 -1
- package/lib/orchestrator/fs-read.d.ts +1 -6
- package/lib/orchestrator/fs-read.d.ts.map +1 -1
- package/lib/orchestrator/fs-read.js +2 -32
- package/lib/orchestrator/fs-read.js.map +1 -1
- package/lib/orchestrator/grader-experiment.d.ts +23 -5
- package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
- package/lib/orchestrator/grader-experiment.js +54 -9
- package/lib/orchestrator/grader-experiment.js.map +1 -1
- package/lib/orchestrator/grading.d.ts +1 -0
- package/lib/orchestrator/grading.d.ts.map +1 -1
- package/lib/orchestrator/grading.js +41 -33
- package/lib/orchestrator/grading.js.map +1 -1
- package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
- package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
- package/lib/orchestrator/harness-catalog-drift.js +90 -0
- package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
- package/lib/orchestrator/harness-registry.d.ts +4 -0
- package/lib/orchestrator/harness-registry.d.ts.map +1 -0
- package/lib/orchestrator/harness-registry.js +5 -0
- package/lib/orchestrator/harness-registry.js.map +1 -0
- package/lib/orchestrator/index.d.ts +1 -1
- package/lib/orchestrator/index.d.ts.map +1 -1
- package/lib/orchestrator/index.js +1 -1
- package/lib/orchestrator/index.js.map +1 -1
- package/lib/orchestrator/list-runs.d.ts +8 -1
- package/lib/orchestrator/list-runs.d.ts.map +1 -1
- package/lib/orchestrator/list-runs.js +83 -18
- package/lib/orchestrator/list-runs.js.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.js +3 -1
- package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
- package/lib/orchestrator/orchestrator.d.ts +17 -2
- package/lib/orchestrator/orchestrator.d.ts.map +1 -1
- package/lib/orchestrator/orchestrator.js +55 -177
- package/lib/orchestrator/orchestrator.js.map +1 -1
- package/lib/orchestrator/paired-effects.d.ts +34 -0
- package/lib/orchestrator/paired-effects.d.ts.map +1 -0
- package/lib/orchestrator/paired-effects.js +164 -0
- package/lib/orchestrator/paired-effects.js.map +1 -0
- package/lib/orchestrator/profile.d.ts +4 -0
- package/lib/orchestrator/profile.d.ts.map +1 -0
- package/lib/orchestrator/profile.js +10 -0
- package/lib/orchestrator/profile.js.map +1 -0
- package/lib/orchestrator/provenance.d.ts +5 -1
- package/lib/orchestrator/provenance.d.ts.map +1 -1
- package/lib/orchestrator/provenance.js +16 -3
- package/lib/orchestrator/provenance.js.map +1 -1
- package/lib/orchestrator/regrade.d.ts +4 -2
- package/lib/orchestrator/regrade.d.ts.map +1 -1
- package/lib/orchestrator/rubric-loader.js +1 -1
- package/lib/orchestrator/rubric-loader.js.map +1 -1
- package/lib/orchestrator/run-dir.d.ts +2 -0
- package/lib/orchestrator/run-dir.d.ts.map +1 -1
- package/lib/orchestrator/run-dir.js +1 -1
- package/lib/orchestrator/run-dir.js.map +1 -1
- package/lib/orchestrator/run-execution.d.ts +3 -0
- package/lib/orchestrator/run-execution.d.ts.map +1 -1
- package/lib/orchestrator/run-execution.js +64 -10
- package/lib/orchestrator/run-execution.js.map +1 -1
- package/lib/orchestrator/run-lifecycle.d.ts +1 -0
- package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/run-lifecycle.js +3 -2
- package/lib/orchestrator/run-lifecycle.js.map +1 -1
- package/lib/orchestrator/run-workspace.d.ts +10 -0
- package/lib/orchestrator/run-workspace.d.ts.map +1 -0
- package/lib/orchestrator/run-workspace.js +58 -0
- package/lib/orchestrator/run-workspace.js.map +1 -0
- package/lib/orchestrator/suite-compare.d.ts +37 -0
- package/lib/orchestrator/suite-compare.d.ts.map +1 -1
- package/lib/orchestrator/suite-compare.js +44 -22
- package/lib/orchestrator/suite-compare.js.map +1 -1
- package/lib/orchestrator/suite-runs.d.ts +6 -1
- package/lib/orchestrator/suite-runs.d.ts.map +1 -1
- package/lib/orchestrator/suite-runs.js +14 -2
- package/lib/orchestrator/suite-runs.js.map +1 -1
- package/lib/orchestrator/suite-summary.d.ts +79 -0
- package/lib/orchestrator/suite-summary.d.ts.map +1 -1
- package/lib/orchestrator/suite-summary.js +67 -14
- package/lib/orchestrator/suite-summary.js.map +1 -1
- package/lib/previewer/artifacts.d.ts +25 -0
- package/lib/previewer/artifacts.d.ts.map +1 -0
- package/lib/previewer/artifacts.js +180 -0
- package/lib/previewer/artifacts.js.map +1 -0
- package/lib/previewer/server.d.ts +111 -0
- package/lib/previewer/server.d.ts.map +1 -0
- package/lib/previewer/server.js +559 -0
- package/lib/previewer/server.js.map +1 -0
- package/package.json +4 -2
- package/skills/lux-answerer/SKILL.md +2 -2
- package/src/answerers/claude-code/index.ts +6 -5
- package/src/answerers/persona/index.ts +75 -34
- package/src/answerers/terminal/index.ts +7 -11
- package/src/assertions/authoring.ts +2 -0
- package/src/assertions/core/command-exits-zero.ts +82 -17
- package/src/assertions/core/event-checks.ts +64 -3
- package/src/assertions/core/index.ts +2 -0
- package/src/assertions/core/resource-checks.ts +38 -5
- package/src/assertions/core/safe-regex.ts +16 -6
- package/src/assertions/rubric/evidence.ts +85 -0
- package/src/assertions/rubric/index.ts +63 -46
- package/src/assertions/rubric/internal.ts +256 -41
- package/src/authoring.ts +346 -2
- package/src/cli/bin.ts +2 -12
- package/src/cli/command-runtime.ts +20 -9
- package/src/cli/doctor.ts +17 -0
- package/src/cli/harness-plan.ts +123 -0
- package/src/cli/init-templates.ts +238 -0
- package/src/cli/init.ts +53 -184
- package/src/cli/output-schemas.ts +109 -0
- package/src/cli/program.ts +697 -730
- package/src/cli/render/format.ts +1 -1
- package/src/cli/render/reporter.ts +36 -8
- package/src/cli/run-options.ts +131 -25
- package/src/cli/view.ts +129 -0
- package/src/container/driver.ts +213 -0
- package/src/container/paths.ts +29 -0
- package/src/container/protocol.ts +48 -0
- package/src/container/resources.ts +165 -0
- package/src/container/worker.ts +107 -0
- package/src/core/action-events.ts +59 -0
- package/src/core/agent-activity.ts +236 -0
- package/src/core/agent-environment.ts +64 -0
- package/src/core/agent-events.ts +17 -0
- package/src/core/annotation.ts +2 -1
- package/src/core/answerer.ts +9 -0
- package/src/core/artifact-evidence.ts +40 -5
- package/src/core/assertion.ts +8 -2
- package/src/core/case-defaults.ts +65 -0
- package/src/core/case.ts +79 -8
- package/src/core/command-verification.ts +74 -0
- package/src/core/driver-execution.ts +84 -0
- package/src/core/driver-metrics.ts +51 -0
- package/src/core/driver.ts +76 -0
- package/src/core/duration.ts +52 -0
- package/src/core/environment.ts +22 -0
- package/src/core/evaluation-clusters.ts +35 -0
- package/src/core/events.ts +13 -2
- package/src/core/experiment.ts +71 -25
- package/src/core/file-tree.ts +35 -0
- package/src/core/global-id.ts +26 -0
- package/src/core/harness-catalog.ts +100 -0
- package/src/core/harness-catalogs/antigravity.ts +24 -0
- package/src/core/harness-catalogs/claude-code.ts +25 -0
- package/src/core/harness-catalogs/codex.ts +27 -0
- package/src/core/harness-catalogs/copilot.ts +46 -0
- package/src/core/harness-catalogs/cursor.ts +13 -0
- package/src/core/harness-catalogs/grok-build.ts +19 -0
- package/src/core/harness-catalogs/index.ts +31 -0
- package/src/core/harness-matrix.ts +316 -0
- package/src/core/index.ts +12 -0
- package/src/core/lifecycle-fixtures.ts +4 -2
- package/src/core/model-cli.ts +60 -26
- package/src/core/platform-process.ts +65 -16
- package/src/core/reference-defaults.ts +47 -0
- package/src/core/run.ts +31 -0
- package/src/core/usage.ts +8 -0
- package/src/drivers/antigravity/README.md +171 -0
- package/src/drivers/antigravity/artifacts.ts +37 -0
- package/src/drivers/antigravity/config.ts +92 -0
- package/src/drivers/antigravity/events.ts +290 -0
- package/src/drivers/antigravity/index.ts +132 -0
- package/src/drivers/antigravity/runtime.ts +94 -0
- package/src/drivers/claude-code/deferred-process.ts +118 -0
- package/src/drivers/claude-code/index.ts +227 -281
- package/src/drivers/claude-code/isolation.ts +228 -0
- package/src/drivers/claude-code/parse-events.ts +98 -12
- package/src/drivers/codex/app-events.ts +126 -16
- package/src/drivers/codex/config.ts +59 -8
- package/src/drivers/codex/exec-events.ts +258 -0
- package/src/drivers/codex/index.ts +146 -312
- package/src/drivers/copilot/README.md +60 -0
- package/src/drivers/copilot/config.ts +61 -0
- package/src/drivers/copilot/index.ts +310 -0
- package/src/drivers/cursor/README.md +66 -0
- package/src/drivers/cursor/config.ts +31 -0
- package/src/drivers/cursor/index.ts +326 -0
- package/src/drivers/cursor/interaction.ts +74 -0
- package/src/drivers/grok-build/README.md +112 -0
- package/src/drivers/grok-build/config.ts +43 -0
- package/src/drivers/grok-build/index.ts +331 -0
- package/src/drivers/mcp/index.ts +25 -11
- package/src/drivers/shared/acp-events.ts +94 -0
- package/src/drivers/shared/acp-interaction.ts +27 -0
- package/src/drivers/shared/acp-session.ts +40 -0
- package/src/drivers/shared/acp-transport.ts +187 -0
- package/src/drivers/shared/artifacts.ts +6 -2
- package/src/drivers/shared/experiment-behavior.ts +217 -0
- package/src/drivers/shared/experiment-policy.ts +196 -0
- package/src/drivers/shared/skills.ts +74 -0
- package/src/drivers/subprocess/index.ts +55 -12
- package/src/index.ts +117 -6
- package/src/optimization/reflective.ts +3 -2
- package/src/orchestrator/annotation-loader.ts +10 -0
- package/src/orchestrator/annotation-store.ts +24 -3
- package/src/orchestrator/artifact-origin.ts +50 -0
- package/src/orchestrator/campaign-lifecycle.ts +5 -1
- package/src/orchestrator/candidates.ts +3 -2
- package/src/orchestrator/compare.ts +62 -13
- package/src/orchestrator/comparison-identity.ts +2 -0
- package/src/orchestrator/config.ts +23 -1
- package/src/orchestrator/discover.ts +8 -1
- package/src/orchestrator/doctor.ts +211 -65
- package/src/orchestrator/driver-capabilities.ts +21 -0
- package/src/orchestrator/driver-identity.ts +69 -0
- package/src/orchestrator/experiment-context.ts +5 -3
- package/src/orchestrator/experiment-corpus.ts +58 -37
- package/src/orchestrator/experiment-effects.ts +63 -0
- package/src/orchestrator/experiment-evaluation.ts +88 -10
- package/src/orchestrator/experiment-identity.ts +57 -48
- package/src/orchestrator/experiment-preflight.ts +27 -0
- package/src/orchestrator/experiment-report.ts +21 -1
- package/src/orchestrator/experiment-runs.ts +11 -4
- package/src/orchestrator/experiment-runtime-identity.ts +5 -243
- package/src/orchestrator/experiment-selection.ts +178 -18
- package/src/orchestrator/experiment.ts +29 -29
- package/src/orchestrator/fixture-identity.ts +9 -1
- package/src/orchestrator/fs-read.ts +2 -32
- package/src/orchestrator/grader-experiment.ts +74 -13
- package/src/orchestrator/grading.ts +60 -31
- package/src/orchestrator/harness-catalog-drift.ts +132 -0
- package/src/orchestrator/harness-registry.ts +12 -0
- package/src/orchestrator/index.ts +1 -0
- package/src/orchestrator/list-runs.ts +102 -18
- package/src/orchestrator/optimization-lifecycle.ts +4 -1
- package/src/orchestrator/orchestrator.ts +105 -224
- package/src/orchestrator/paired-effects.ts +214 -0
- package/src/orchestrator/profile.ts +24 -0
- package/src/orchestrator/provenance.ts +23 -3
- package/src/orchestrator/rubric-loader.ts +1 -1
- package/src/orchestrator/run-dir.ts +8 -1
- package/src/orchestrator/run-execution.ts +75 -10
- package/src/orchestrator/run-lifecycle.ts +4 -2
- package/src/orchestrator/run-workspace.ts +62 -0
- package/src/orchestrator/suite-compare.ts +47 -23
- package/src/orchestrator/suite-runs.ts +13 -2
- package/src/orchestrator/suite-summary.ts +129 -15
- package/src/previewer/artifacts.ts +221 -0
- package/src/previewer/server.ts +789 -0
- package/viewer/app.css +2111 -0
- package/viewer/app.js +627 -0
- package/viewer/artifact-view.js +48 -0
- package/viewer/charts.js +98 -0
- package/viewer/detail.js +1266 -0
- package/viewer/format.js +129 -0
- package/viewer/index.html +151 -0
- package/lib/cli/skills.d.ts +0 -38
- package/lib/cli/skills.d.ts.map +0 -1
- package/lib/cli/skills.js +0 -84
- package/lib/cli/skills.js.map +0 -1
- package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
- package/lib/drivers/shared/secure-copy.js.map +0 -1
- package/skills/lux/SKILL.md +0 -89
- package/skills/lux/references/cli.md +0 -125
- package/skills/lux/references/eval-authoring.md +0 -257
- package/src/cli/skills.ts +0 -129
- /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
- /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
- /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AgentAttributionSchema } from "./events.js";
|
|
3
|
+
|
|
4
|
+
export const AGENT_SPAWN_KIND = "agent-spawn" as const;
|
|
5
|
+
export const AGENT_COMPLETED_KIND = "agent-completed" as const;
|
|
6
|
+
|
|
7
|
+
export const AgentSpawnPayloadSchema = z.object({
|
|
8
|
+
agent: AgentAttributionSchema.extend({ role: z.literal("subagent") }),
|
|
9
|
+
prompt: z.exactOptional(z.string()),
|
|
10
|
+
});
|
|
11
|
+
export type AgentSpawnPayload = z.infer<typeof AgentSpawnPayloadSchema>;
|
|
12
|
+
|
|
13
|
+
export const AgentCompletedPayloadSchema = z.object({
|
|
14
|
+
agentId: z.string().min(1),
|
|
15
|
+
status: z.enum(["completed", "failed", "cancelled", "unknown"]),
|
|
16
|
+
});
|
|
17
|
+
export type AgentCompletedPayload = z.infer<typeof AgentCompletedPayloadSchema>;
|
package/src/core/annotation.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { EvaluationMetadataSchema } from "./evaluation-clusters.js";
|
|
2
3
|
import { formatZodIssues } from "./zod.js";
|
|
3
4
|
|
|
4
5
|
const ExpectedBooleanLabelSchema = z
|
|
@@ -35,7 +36,7 @@ export const GraderAnnotationSchema = z
|
|
|
35
36
|
reviewer: z.string().min(1).optional(),
|
|
36
37
|
/** Human rationale supplied to the rubric optimizer on mismatches. */
|
|
37
38
|
feedback: z.string().optional(),
|
|
38
|
-
meta:
|
|
39
|
+
meta: EvaluationMetadataSchema.optional(),
|
|
39
40
|
})
|
|
40
41
|
.strict()
|
|
41
42
|
.superRefine((annotation, ctx) => {
|
package/src/core/answerer.ts
CHANGED
|
@@ -73,3 +73,12 @@ export type AnswererPlugin<Cfg = unknown> = {
|
|
|
73
73
|
configSchema?: z.ZodTypeAny;
|
|
74
74
|
create: (config: Cfg) => Answerer | Promise<Answerer>;
|
|
75
75
|
};
|
|
76
|
+
|
|
77
|
+
export const defineAnswerer = <S extends z.ZodType>(
|
|
78
|
+
definition: Omit<AnswererPlugin<z.output<S>>, "configSchema"> & { configSchema: S },
|
|
79
|
+
): Omit<AnswererPlugin<z.output<S>>, "configSchema"> & { configSchema: S } => definition;
|
|
80
|
+
|
|
81
|
+
export const answererRef = <S extends z.ZodType>(
|
|
82
|
+
plugin: { name: string; configSchema: S },
|
|
83
|
+
config: z.input<S>,
|
|
84
|
+
): { name: string; config: z.input<S> } => ({ name: plugin.name, config });
|
|
@@ -188,6 +188,7 @@ export const readInspectedFileBytes = async (
|
|
|
188
188
|
expected: Stats,
|
|
189
189
|
maxBytes: number,
|
|
190
190
|
label: string,
|
|
191
|
+
prefixOnly = false,
|
|
191
192
|
): Promise<Buffer> => {
|
|
192
193
|
if (!Number.isSafeInteger(maxBytes) || maxBytes < 0 || maxBytes > MAX_ARTIFACT_READ_BYTES) {
|
|
193
194
|
throw new RangeError(
|
|
@@ -195,7 +196,7 @@ export const readInspectedFileBytes = async (
|
|
|
195
196
|
);
|
|
196
197
|
}
|
|
197
198
|
if (!expected.isFile()) throw new Error(`${label} is not a file`);
|
|
198
|
-
if (expected.size > maxBytes) {
|
|
199
|
+
if (!prefixOnly && expected.size > maxBytes) {
|
|
199
200
|
throw new Error(`${label} exceeds the ${maxBytes}-byte artifact read limit`);
|
|
200
201
|
}
|
|
201
202
|
|
|
@@ -210,23 +211,24 @@ export const readInspectedFileBytes = async (
|
|
|
210
211
|
if (opened.size !== expected.size) {
|
|
211
212
|
throw new Error(`${label} changed while it was being inspected`);
|
|
212
213
|
}
|
|
213
|
-
if (opened.size > maxBytes) {
|
|
214
|
+
if (!prefixOnly && opened.size > maxBytes) {
|
|
214
215
|
throw new Error(`${label} exceeds the ${maxBytes}-byte artifact read limit`);
|
|
215
216
|
}
|
|
216
217
|
// Allocate for the inspected file, not the caller's ceiling. Reading one
|
|
217
218
|
// extra byte detects same-inode growth after fstat without making many
|
|
218
219
|
// tiny artifact reads reserve the maximum concurrently.
|
|
219
|
-
const
|
|
220
|
+
const size = Math.min(expected.size, maxBytes);
|
|
221
|
+
const bytes = Buffer.alloc(size + 1);
|
|
220
222
|
let offset = 0;
|
|
221
223
|
while (offset < bytes.length) {
|
|
222
224
|
const read = await handle.read(bytes, offset, bytes.length - offset, offset);
|
|
223
225
|
if (read.bytesRead === 0) break;
|
|
224
226
|
offset += read.bytesRead;
|
|
225
227
|
}
|
|
226
|
-
if (offset !== expected.size) {
|
|
228
|
+
if (offset !== Math.min(expected.size, bytes.length)) {
|
|
227
229
|
throw new Error(`${label} changed while it was being inspected`);
|
|
228
230
|
}
|
|
229
|
-
return bytes.subarray(0, offset);
|
|
231
|
+
return bytes.subarray(0, Math.min(offset, size));
|
|
230
232
|
} finally {
|
|
231
233
|
await handle.close();
|
|
232
234
|
}
|
|
@@ -238,6 +240,39 @@ export const readInspectedFileBytes = async (
|
|
|
238
240
|
}
|
|
239
241
|
};
|
|
240
242
|
|
|
243
|
+
/** Read a bounded prefix for presentation without weakening full-evidence reads. */
|
|
244
|
+
export const readRunArtifactExcerpt = async (
|
|
245
|
+
run: RunArtifactEvidence,
|
|
246
|
+
authoredPath: string,
|
|
247
|
+
maxChars: number,
|
|
248
|
+
): Promise<{ text: string; truncated: boolean }> => {
|
|
249
|
+
if (!Number.isSafeInteger(maxChars) || maxChars < 0 || maxChars > 80_000) {
|
|
250
|
+
throw new RangeError("artifact excerpt maxChars must be an integer from 0 to 80000");
|
|
251
|
+
}
|
|
252
|
+
const inspected = await inspectRunArtifact(run, authoredPath);
|
|
253
|
+
if (!inspected.stats?.isFile()) {
|
|
254
|
+
throw new Error(inspected.issue ?? `${authoredPath} is not a file`);
|
|
255
|
+
}
|
|
256
|
+
// An extra character distinguishes an exact fit from an omitted suffix.
|
|
257
|
+
const bytes = await readInspectedFileBytes(
|
|
258
|
+
inspected.target,
|
|
259
|
+
inspected.stats,
|
|
260
|
+
(maxChars + 1) * 4,
|
|
261
|
+
authoredPath,
|
|
262
|
+
true,
|
|
263
|
+
);
|
|
264
|
+
const text = bytes.toString("utf8");
|
|
265
|
+
let end = Math.min(maxChars, text.length);
|
|
266
|
+
if (
|
|
267
|
+
end > 0 &&
|
|
268
|
+
end < text.length &&
|
|
269
|
+
/[\uD800-\uDBFF]/.test(text[end - 1] ?? "") &&
|
|
270
|
+
/[\uDC00-\uDFFF]/.test(text[end] ?? "")
|
|
271
|
+
)
|
|
272
|
+
end--;
|
|
273
|
+
return { text: text.slice(0, end), truncated: text.length > end };
|
|
274
|
+
};
|
|
275
|
+
|
|
241
276
|
export const readRunArtifactBytes = async (
|
|
242
277
|
run: RunArtifactEvidence,
|
|
243
278
|
authoredPath: string,
|
package/src/core/assertion.ts
CHANGED
|
@@ -9,6 +9,8 @@ export const AssertionResultSchema = z.object({
|
|
|
9
9
|
score: z.number().min(0).max(1),
|
|
10
10
|
comment: z.exactOptional(z.string()),
|
|
11
11
|
detail: z.unknown().optional(),
|
|
12
|
+
/** The evaluator ran successfully but lacked evidence for a verdict. */
|
|
13
|
+
abstention: z.exactOptional(z.literal("insufficient-evidence")),
|
|
12
14
|
/** Present when the assertion could not produce a judgment. */
|
|
13
15
|
errorMessage: z.exactOptional(z.string()),
|
|
14
16
|
/** Tokens the assertion itself spent. Only LLM-judge assertions report this. */
|
|
@@ -105,6 +107,7 @@ export const baseAssertionFields = {
|
|
|
105
107
|
weight: z.number().positive().optional(),
|
|
106
108
|
threshold: z.number().min(0).max(1).optional(),
|
|
107
109
|
name: z.string().optional(),
|
|
110
|
+
informational: z.boolean().optional(),
|
|
108
111
|
} as const;
|
|
109
112
|
|
|
110
113
|
export const defineAssertion = <S extends z.ZodObject>(
|
|
@@ -135,14 +138,17 @@ export const GradingAssertionEntrySchema = z.object({
|
|
|
135
138
|
id: z.exactOptional(z.string()),
|
|
136
139
|
type: z.string(),
|
|
137
140
|
name: z.string(),
|
|
138
|
-
passed: z.boolean(),
|
|
141
|
+
passed: z.boolean().nullable(),
|
|
142
|
+
informational: z.exactOptional(z.boolean()),
|
|
139
143
|
score: z.number(),
|
|
140
144
|
weight: z.number(),
|
|
141
|
-
|
|
145
|
+
/** Acceptance floor; absent for informational measurements. */
|
|
146
|
+
threshold: z.exactOptional(z.number()),
|
|
142
147
|
/** Wall-clock the assertion took to evaluate. A `rubric` costs seconds; a file check, none. */
|
|
143
148
|
durationMs: z.number(),
|
|
144
149
|
comment: z.exactOptional(z.string()),
|
|
145
150
|
detail: z.unknown().optional(),
|
|
151
|
+
abstention: z.exactOptional(z.literal("insufficient-evidence")),
|
|
146
152
|
errorMessage: z.exactOptional(z.string()),
|
|
147
153
|
usage: z.exactOptional(TokenUsageSchema),
|
|
148
154
|
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Assertion, EvalCase } from "./case.js";
|
|
2
|
+
import { mergePluginConfig } from "./harness-matrix.js";
|
|
3
|
+
import { mergeAnswererReference, mergeDriverReference } from "./reference-defaults.js";
|
|
4
|
+
|
|
5
|
+
type DeepPartial<T> = T extends readonly unknown[]
|
|
6
|
+
? T
|
|
7
|
+
: T extends (...args: never[]) => unknown
|
|
8
|
+
? T
|
|
9
|
+
: T extends object
|
|
10
|
+
? { [K in keyof T]?: DeepPartial<T[K]> }
|
|
11
|
+
: T;
|
|
12
|
+
|
|
13
|
+
export type AssertionDefaults<A extends Assertion = Assertion> = {
|
|
14
|
+
[Type in A["type"]]?: DeepPartial<Omit<Extract<A, { type: Type }>, "type" | "id">>;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type EvalCaseDefaults<A extends Assertion = Assertion> = Omit<
|
|
18
|
+
Partial<EvalCase>,
|
|
19
|
+
"id" | "prompt" | "assertions"
|
|
20
|
+
> & { assertions?: A[] | undefined };
|
|
21
|
+
|
|
22
|
+
/** Named assertions replace inherited checks; unnamed checks append in declaration order. */
|
|
23
|
+
const mergeAssertions = (base: Assertion[], local: Assertion[]): Assertion[] => {
|
|
24
|
+
const seen = new Set<string>();
|
|
25
|
+
for (const assertion of local) {
|
|
26
|
+
if (!assertion.id) continue;
|
|
27
|
+
if (seen.has(assertion.id)) throw new Error(`duplicate assertion id '${assertion.id}'`);
|
|
28
|
+
seen.add(assertion.id);
|
|
29
|
+
}
|
|
30
|
+
const result = [...base];
|
|
31
|
+
for (const assertion of local) {
|
|
32
|
+
const index = assertion.id ? result.findIndex((entry) => entry.id === assertion.id) : -1;
|
|
33
|
+
if (index < 0) result.push(assertion);
|
|
34
|
+
else result[index] = assertion;
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const mergeCaseDefaults = (
|
|
40
|
+
base: EvalCaseDefaults,
|
|
41
|
+
local: EvalCaseDefaults,
|
|
42
|
+
): EvalCaseDefaults => ({
|
|
43
|
+
...base,
|
|
44
|
+
...local,
|
|
45
|
+
...(base.driver || local.driver
|
|
46
|
+
? { driver: mergeDriverReference(base.driver, local.driver) }
|
|
47
|
+
: {}),
|
|
48
|
+
...(base.answerer || local.answerer
|
|
49
|
+
? { answerer: mergeAnswererReference(base.answerer, local.answerer) }
|
|
50
|
+
: {}),
|
|
51
|
+
...(base.meta || local.meta
|
|
52
|
+
? { meta: mergePluginConfig(base.meta, local.meta) as EvalCase["meta"] }
|
|
53
|
+
: {}),
|
|
54
|
+
...(base.assertions || local.assertions
|
|
55
|
+
? { assertions: mergeAssertions(base.assertions ?? [], local.assertions ?? []) }
|
|
56
|
+
: {}),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
export const applyAssertionDefaults = (
|
|
60
|
+
assertions: Assertion[],
|
|
61
|
+
defaults: AssertionDefaults,
|
|
62
|
+
): Assertion[] =>
|
|
63
|
+
assertions.map((assertion) => ({
|
|
64
|
+
...(mergePluginConfig(defaults[assertion.type], assertion) as Assertion),
|
|
65
|
+
}));
|
package/src/core/case.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { AssertionPlugin } from "./assertion.js";
|
|
3
3
|
import { collectEvalCaseExtensions, setEvalCaseExtensions } from "./case-authoring-state.js";
|
|
4
|
+
import {
|
|
5
|
+
type AssertionDefaults,
|
|
6
|
+
applyAssertionDefaults,
|
|
7
|
+
type EvalCaseDefaults,
|
|
8
|
+
mergeCaseDefaults,
|
|
9
|
+
} from "./case-defaults.js";
|
|
10
|
+
import { DriverCapabilitySchema } from "./driver.js";
|
|
11
|
+
import { DriverExecutionSchema } from "./driver-execution.js";
|
|
12
|
+
import { EvaluationMetadataSchema } from "./evaluation-clusters.js";
|
|
13
|
+
import { HarnessMatrixSchema, mergePluginConfig } from "./harness-matrix.js";
|
|
4
14
|
import type { LifecycleHooksPlugin } from "./lifecycle-hooks.js";
|
|
5
15
|
import { formatZodIssues } from "./zod.js";
|
|
6
16
|
|
|
@@ -17,7 +27,13 @@ export type FixturesRef = z.infer<typeof FixturesRefSchema>;
|
|
|
17
27
|
// `defineEvalCase` discriminate the config type on `name`.
|
|
18
28
|
export const DriverRefSchema = z.union([
|
|
19
29
|
z.string(),
|
|
20
|
-
z
|
|
30
|
+
z
|
|
31
|
+
.object({
|
|
32
|
+
name: z.string(),
|
|
33
|
+
config: z.unknown().optional(),
|
|
34
|
+
execution: DriverExecutionSchema.optional(),
|
|
35
|
+
})
|
|
36
|
+
.strict(),
|
|
21
37
|
]);
|
|
22
38
|
export type DriverRef = z.infer<typeof DriverRefSchema>;
|
|
23
39
|
|
|
@@ -35,6 +51,7 @@ export const AssertionSchema = z
|
|
|
35
51
|
name: z.string().optional(),
|
|
36
52
|
weight: z.number().positive().optional(),
|
|
37
53
|
threshold: z.number().min(0).max(1).optional(),
|
|
54
|
+
informational: z.boolean().optional(),
|
|
38
55
|
})
|
|
39
56
|
.loose();
|
|
40
57
|
export type Assertion = z.infer<typeof AssertionSchema>;
|
|
@@ -44,10 +61,13 @@ const EvalCaseObjectSchema = z.object({
|
|
|
44
61
|
prompt: z.string().min(1, "prompt is required"),
|
|
45
62
|
persona: z.string().min(1).optional(),
|
|
46
63
|
driver: DriverRefSchema.optional(),
|
|
64
|
+
/** Harness permutations this case runs through instead of the project matrix. */
|
|
65
|
+
matrix: HarnessMatrixSchema.optional(),
|
|
47
66
|
answerer: AnswererRefSchema.optional(),
|
|
48
67
|
fixtures: FixturesRefSchema.optional(),
|
|
68
|
+
requires: z.array(DriverCapabilitySchema).optional(),
|
|
49
69
|
assertions: z.array(AssertionSchema).optional(),
|
|
50
|
-
meta:
|
|
70
|
+
meta: EvaluationMetadataSchema.optional(),
|
|
51
71
|
});
|
|
52
72
|
|
|
53
73
|
export const EvalCaseSchema = EvalCaseObjectSchema
|
|
@@ -70,7 +90,10 @@ export const EvalCaseSchema = EvalCaseObjectSchema
|
|
|
70
90
|
});
|
|
71
91
|
export type EvalCase = z.infer<typeof EvalCaseSchema>;
|
|
72
92
|
|
|
73
|
-
type AssertionPlanFields = Pick<
|
|
93
|
+
type AssertionPlanFields = Pick<
|
|
94
|
+
Assertion,
|
|
95
|
+
"id" | "name" | "threshold" | "weight" | "informational"
|
|
96
|
+
>;
|
|
74
97
|
type AssertionInputOf<Plugin> =
|
|
75
98
|
Plugin extends AssertionPlugin<Assertion, infer Input> ? Input & AssertionPlanFields : never;
|
|
76
99
|
|
|
@@ -79,13 +102,19 @@ export type EvalCaseInput<AllowedAssertion extends Assertion = Assertion> = Omit
|
|
|
79
102
|
"assertions"
|
|
80
103
|
> & {
|
|
81
104
|
assertions?: AllowedAssertion[];
|
|
105
|
+
assertionDefaults?: AssertionDefaults<AllowedAssertion>;
|
|
106
|
+
/** Remove named inherited checks without replacing the rest of the suite plan. */
|
|
107
|
+
omitAssertions?: string[];
|
|
82
108
|
};
|
|
83
109
|
|
|
84
110
|
export type EvalCaseAuthoringOptions<
|
|
85
111
|
Plugins extends readonly AssertionPlugin[] = readonly AssertionPlugin[],
|
|
112
|
+
AllowedAssertion extends Assertion = Assertion,
|
|
86
113
|
> = {
|
|
87
114
|
assertions?: Plugins;
|
|
88
115
|
fixtures?: readonly LifecycleHooksPlugin[];
|
|
116
|
+
defaults?: EvalCaseDefaults<AllowedAssertion | AssertionInputOf<Plugins[number]>>;
|
|
117
|
+
assertionDefaults?: AssertionDefaults<AllowedAssertion | AssertionInputOf<Plugins[number]>>;
|
|
89
118
|
};
|
|
90
119
|
|
|
91
120
|
export type EvalCaseDefinition<AllowedAssertion extends Assertion = Assertion> = {
|
|
@@ -95,16 +124,49 @@ export type EvalCaseDefinition<AllowedAssertion extends Assertion = Assertion> =
|
|
|
95
124
|
* Further calls to `extend` append fixtures in setup order.
|
|
96
125
|
*/
|
|
97
126
|
extend<const Plugins extends readonly AssertionPlugin[] = readonly []>(
|
|
98
|
-
options: EvalCaseAuthoringOptions<Plugins>,
|
|
127
|
+
options: EvalCaseAuthoringOptions<Plugins, AllowedAssertion>,
|
|
99
128
|
): EvalCaseDefinition<AllowedAssertion | AssertionInputOf<Plugins[number]>>;
|
|
100
129
|
};
|
|
101
130
|
|
|
102
131
|
export const createEvalCaseDefinition = <AllowedAssertion extends Assertion = Assertion>(
|
|
103
132
|
inheritedAssertions: readonly AssertionPlugin[] = [],
|
|
104
133
|
inheritedFixtures: readonly LifecycleHooksPlugin[] = [],
|
|
134
|
+
defaults: EvalCaseDefaults = {},
|
|
135
|
+
assertionDefaults: AssertionDefaults = {},
|
|
105
136
|
): EvalCaseDefinition<AllowedAssertion> => {
|
|
106
137
|
const define = ((input: EvalCaseInput<AllowedAssertion>): EvalCase => {
|
|
107
|
-
const
|
|
138
|
+
const { omitAssertions = [], assertionDefaults: localAssertionDefaults = {}, ...local } = input;
|
|
139
|
+
for (const id of omitAssertions) {
|
|
140
|
+
if (!defaults.assertions?.some((assertion) => assertion.id === id)) {
|
|
141
|
+
throw new Error(`cannot omit unknown inherited assertion '${id}'`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const resolved = mergeCaseDefaults(
|
|
145
|
+
{
|
|
146
|
+
...defaults,
|
|
147
|
+
...(defaults.assertions
|
|
148
|
+
? {
|
|
149
|
+
assertions: defaults.assertions.filter(
|
|
150
|
+
(assertion) => !omitAssertions.includes(assertion.id ?? ""),
|
|
151
|
+
),
|
|
152
|
+
}
|
|
153
|
+
: {}),
|
|
154
|
+
},
|
|
155
|
+
local,
|
|
156
|
+
);
|
|
157
|
+
const parsed = EvalCaseSchema.safeParse({
|
|
158
|
+
...resolved,
|
|
159
|
+
...("id" in local ? { id: local.id } : {}),
|
|
160
|
+
prompt: local.prompt,
|
|
161
|
+
...(resolved.assertions
|
|
162
|
+
? {
|
|
163
|
+
assertions: applyAssertionDefaults(
|
|
164
|
+
resolved.assertions,
|
|
165
|
+
mergePluginConfig(assertionDefaults, localAssertionDefaults) as AssertionDefaults,
|
|
166
|
+
),
|
|
167
|
+
}
|
|
168
|
+
: {}),
|
|
169
|
+
});
|
|
108
170
|
if (!parsed.success) {
|
|
109
171
|
throw new Error(`Invalid eval case: ${formatZodIssues(parsed.error)}`);
|
|
110
172
|
}
|
|
@@ -116,11 +178,19 @@ export const createEvalCaseDefinition = <AllowedAssertion extends Assertion = As
|
|
|
116
178
|
setEvalCaseExtensions(parsed.data, extensions);
|
|
117
179
|
return parsed.data;
|
|
118
180
|
}) as EvalCaseDefinition<AllowedAssertion>;
|
|
119
|
-
define.extend = ((
|
|
120
|
-
|
|
181
|
+
define.extend = ((options: EvalCaseAuthoringOptions) => {
|
|
182
|
+
const { assertions = [], fixtures = [] } = options;
|
|
183
|
+
const inherited = EvalCaseObjectSchema.omit({ id: true, prompt: true })
|
|
184
|
+
.partial()
|
|
185
|
+
.strict()
|
|
186
|
+
.parse(options.defaults ?? {});
|
|
187
|
+
return createEvalCaseDefinition(
|
|
121
188
|
[...inheritedAssertions, ...assertions],
|
|
122
189
|
[...inheritedFixtures, ...fixtures],
|
|
123
|
-
|
|
190
|
+
mergeCaseDefaults(defaults, inherited),
|
|
191
|
+
mergePluginConfig(assertionDefaults, options.assertionDefaults ?? {}) as AssertionDefaults,
|
|
192
|
+
);
|
|
193
|
+
}) as EvalCaseDefinition<AllowedAssertion>["extend"];
|
|
124
194
|
return define;
|
|
125
195
|
};
|
|
126
196
|
|
|
@@ -149,6 +219,7 @@ export const PersistedCaseSchema = EvalCaseObjectSchema.partial()
|
|
|
149
219
|
driver: PersistedDriverRefSchema.optional(),
|
|
150
220
|
answerer: PersistedAnswererRefSchema.optional(),
|
|
151
221
|
fixtures: PersistedFixturesRefSchema.optional(),
|
|
222
|
+
meta: z.record(z.string(), z.unknown()).optional(),
|
|
152
223
|
})
|
|
153
224
|
.loose();
|
|
154
225
|
export type PersistedCase = z.infer<typeof PersistedCaseSchema>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { chmod, lstat, mkdir, mkdtemp, readdir, realpath, rm, symlink } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import type { Run } from "./run.js";
|
|
5
|
+
import { copyRegularFileNoFollow } from "./secure-copy.js";
|
|
6
|
+
|
|
7
|
+
const executionWorkspaces = new WeakMap<Run, string>();
|
|
8
|
+
|
|
9
|
+
/** Internal: live execution state is deliberately absent from persisted run evidence. */
|
|
10
|
+
export const bindRunExecutionWorkspace = (run: Run, root: string): void => {
|
|
11
|
+
executionWorkspaces.set(run, resolve(root));
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const runExecutionWorkspace = (run: Run): string | undefined => executionWorkspaces.get(run);
|
|
15
|
+
|
|
16
|
+
const within = (root: string, path: string): boolean => {
|
|
17
|
+
const rel = relative(root, path);
|
|
18
|
+
return rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** A disposable command tree preserves dependencies without exposing host symlink targets. */
|
|
22
|
+
export const copyCommandWorkspace = async (
|
|
23
|
+
source: string,
|
|
24
|
+
signal?: AbortSignal,
|
|
25
|
+
): Promise<{
|
|
26
|
+
root: string;
|
|
27
|
+
close: () => Promise<void>;
|
|
28
|
+
}> => {
|
|
29
|
+
const sourceRoot = await realpath(source);
|
|
30
|
+
if (!(await lstat(source)).isDirectory() || (await lstat(source)).isSymbolicLink()) {
|
|
31
|
+
throw new Error(`verification workspace must be a real directory: ${source}`);
|
|
32
|
+
}
|
|
33
|
+
const root = await mkdtemp(join(tmpdir(), "lux-command-verification-"));
|
|
34
|
+
const close = () => rm(root, { recursive: true, force: true });
|
|
35
|
+
let entries = 0;
|
|
36
|
+
const copy = async (directory: string): Promise<void> => {
|
|
37
|
+
if (!within(sourceRoot, await realpath(directory))) {
|
|
38
|
+
throw new Error(`verification directory escapes its workspace: ${directory}`);
|
|
39
|
+
}
|
|
40
|
+
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
41
|
+
signal?.throwIfAborted();
|
|
42
|
+
if (++entries > 100_000) throw new Error("verification workspace exceeds 100000 entries");
|
|
43
|
+
if (directory === sourceRoot && entry.name === ".lux-claude") continue;
|
|
44
|
+
const path = join(directory, entry.name);
|
|
45
|
+
const target = join(root, relative(sourceRoot, path));
|
|
46
|
+
const metadata = await lstat(path);
|
|
47
|
+
if (metadata.isSymbolicLink()) {
|
|
48
|
+
const resolved = await realpath(path);
|
|
49
|
+
if (!within(sourceRoot, resolved)) {
|
|
50
|
+
throw new Error(`verification symlink escapes its workspace: ${path}`);
|
|
51
|
+
}
|
|
52
|
+
await symlink(
|
|
53
|
+
relative(dirname(target), join(root, relative(sourceRoot, resolved))),
|
|
54
|
+
target,
|
|
55
|
+
);
|
|
56
|
+
} else if (metadata.isDirectory()) {
|
|
57
|
+
await mkdir(target, { mode: (metadata.mode & 0o777) | 0o700 });
|
|
58
|
+
await copy(path);
|
|
59
|
+
await chmod(target, metadata.mode & 0o777);
|
|
60
|
+
} else if (metadata.isFile()) {
|
|
61
|
+
await copyRegularFileNoFollow(sourceRoot, path, target);
|
|
62
|
+
} else {
|
|
63
|
+
throw new Error(`verification workspace contains an unsupported entry: ${path}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
try {
|
|
68
|
+
await copy(sourceRoot);
|
|
69
|
+
return { root, close };
|
|
70
|
+
} catch (error) {
|
|
71
|
+
await close();
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
const homePath = z
|
|
4
|
+
.string()
|
|
5
|
+
.min(1)
|
|
6
|
+
.refine(
|
|
7
|
+
(value) =>
|
|
8
|
+
!value.startsWith("/") &&
|
|
9
|
+
!value.includes("\\") &&
|
|
10
|
+
value.split("/").every((part) => part !== ".." && part !== "." && part !== ""),
|
|
11
|
+
"must be a relative path within the container home",
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
export const ContainerExecutionSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
kind: z.literal("container"),
|
|
17
|
+
/** A locally available image containing Lux and the selected Linux harness. */
|
|
18
|
+
image: z.string().min(1),
|
|
19
|
+
command: z.string().min(1).optional(),
|
|
20
|
+
/** The worker shipped with the same Lux build as the host. */
|
|
21
|
+
worker: z.string().min(1).optional(),
|
|
22
|
+
/** Optional module in the image exporting a custom DriverPlugin as default. */
|
|
23
|
+
driverModule: z.string().min(1).optional(),
|
|
24
|
+
mounts: z
|
|
25
|
+
.array(
|
|
26
|
+
z
|
|
27
|
+
.object({
|
|
28
|
+
source: z.string().min(1),
|
|
29
|
+
target: z.string().min(1).optional(),
|
|
30
|
+
readOnly: z.boolean().optional(),
|
|
31
|
+
})
|
|
32
|
+
.strict(),
|
|
33
|
+
)
|
|
34
|
+
.optional(),
|
|
35
|
+
/** Only these host environment variables enter the container. */
|
|
36
|
+
passEnv: z.array(z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/)).optional(),
|
|
37
|
+
env: z.record(z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/), z.string()).optional(),
|
|
38
|
+
/** Private copies, never host-home mounts; deleted after the run. */
|
|
39
|
+
homeFiles: z
|
|
40
|
+
.array(
|
|
41
|
+
z
|
|
42
|
+
.object({
|
|
43
|
+
destination: homePath,
|
|
44
|
+
source: z.discriminatedUnion("kind", [
|
|
45
|
+
z.object({ kind: z.literal("file"), path: z.string().min(1) }).strict(),
|
|
46
|
+
z
|
|
47
|
+
.object({
|
|
48
|
+
kind: z.literal("keychain"),
|
|
49
|
+
service: z.string().min(1),
|
|
50
|
+
account: z.string().min(1),
|
|
51
|
+
encoding: z.enum(["utf8", "go-keyring-base64"]).optional(),
|
|
52
|
+
})
|
|
53
|
+
.strict(),
|
|
54
|
+
]),
|
|
55
|
+
})
|
|
56
|
+
.strict(),
|
|
57
|
+
)
|
|
58
|
+
.max(32)
|
|
59
|
+
.optional(),
|
|
60
|
+
network: z.enum(["bridge", "none"]).optional(),
|
|
61
|
+
user: z.string().min(1).optional(),
|
|
62
|
+
memory: z
|
|
63
|
+
.string()
|
|
64
|
+
.regex(/^[1-9][0-9]*[bkmgt]?$/i)
|
|
65
|
+
.optional(),
|
|
66
|
+
cpus: z.number().positive().optional(),
|
|
67
|
+
pidsLimit: z.number().int().positive().optional(),
|
|
68
|
+
startupTimeoutMs: z.number().int().positive().optional(),
|
|
69
|
+
})
|
|
70
|
+
.strict();
|
|
71
|
+
|
|
72
|
+
export const DriverExecutionSchema = z.discriminatedUnion("kind", [
|
|
73
|
+
z.object({ kind: z.literal("host") }).strict(),
|
|
74
|
+
ContainerExecutionSchema,
|
|
75
|
+
]);
|
|
76
|
+
export type DriverExecution = z.infer<typeof DriverExecutionSchema>;
|
|
77
|
+
export type ContainerExecution = z.infer<typeof ContainerExecutionSchema>;
|
|
78
|
+
|
|
79
|
+
export const driverExecutionOf = (reference: unknown): DriverExecution | undefined => {
|
|
80
|
+
if (!reference || typeof reference !== "object" || !("execution" in reference)) return undefined;
|
|
81
|
+
return reference.execution === undefined
|
|
82
|
+
? undefined
|
|
83
|
+
: DriverExecutionSchema.parse(reference.execution);
|
|
84
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const DriverMetricUnitSchema = z.enum([
|
|
4
|
+
"number",
|
|
5
|
+
"count",
|
|
6
|
+
"milliseconds",
|
|
7
|
+
"bytes",
|
|
8
|
+
"tokens",
|
|
9
|
+
"usd",
|
|
10
|
+
"ratio",
|
|
11
|
+
"percent",
|
|
12
|
+
"score",
|
|
13
|
+
]);
|
|
14
|
+
export type DriverMetricUnit = z.infer<typeof DriverMetricUnitSchema>;
|
|
15
|
+
|
|
16
|
+
export const DriverMetricDescriptorSchema = z
|
|
17
|
+
.object({
|
|
18
|
+
unit: DriverMetricUnitSchema.default("number"),
|
|
19
|
+
label: z.string().min(1).max(120).optional(),
|
|
20
|
+
better: z.enum(["lower", "higher", "neutral"]).default("neutral"),
|
|
21
|
+
})
|
|
22
|
+
.strict();
|
|
23
|
+
export type DriverMetricDescriptor = z.infer<typeof DriverMetricDescriptorSchema>;
|
|
24
|
+
|
|
25
|
+
export const DriverMetricSchema = DriverMetricDescriptorSchema.extend({
|
|
26
|
+
value: z.number().finite(),
|
|
27
|
+
}).strict();
|
|
28
|
+
export type DriverMetric = z.infer<typeof DriverMetricSchema>;
|
|
29
|
+
|
|
30
|
+
export const DriverMetricsSchema = z.record(z.string().min(1).max(120), DriverMetricSchema);
|
|
31
|
+
export type DriverMetrics = z.infer<typeof DriverMetricsSchema>;
|
|
32
|
+
|
|
33
|
+
const ReportedDriverMetricSchema = z.union([z.number().finite(), DriverMetricSchema]);
|
|
34
|
+
export const ReportedDriverMetricsSchema = z.record(
|
|
35
|
+
z.string().min(1).max(120),
|
|
36
|
+
ReportedDriverMetricSchema,
|
|
37
|
+
);
|
|
38
|
+
export type ReportedDriverMetrics = z.input<typeof ReportedDriverMetricsSchema>;
|
|
39
|
+
|
|
40
|
+
export const normalizeDriverMetrics = (value: unknown): DriverMetrics => {
|
|
41
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
42
|
+
return Object.fromEntries(
|
|
43
|
+
Object.entries(value).flatMap(([name, metric]) => {
|
|
44
|
+
if (name.length === 0 || name.length > 120) return [];
|
|
45
|
+
const parsed = DriverMetricSchema.safeParse(
|
|
46
|
+
typeof metric === "number" ? { value: metric } : metric,
|
|
47
|
+
).data;
|
|
48
|
+
return parsed ? [[name, parsed]] : [];
|
|
49
|
+
}),
|
|
50
|
+
);
|
|
51
|
+
};
|