@prismatic-io/lux 0.0.2-preview.3 → 0.0.2-preview.30
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 +7 -5
- 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 +3 -1
- package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
- package/lib/assertions/core/command-exits-zero.js +50 -7
- 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/helpers.d.ts +2 -7
- package/lib/assertions/core/helpers.d.ts.map +1 -1
- package/lib/assertions/core/helpers.js +2 -6
- package/lib/assertions/core/helpers.js.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/resource-checks.d.ts +19 -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/rubric/index.d.ts +26 -3
- package/lib/assertions/rubric/index.d.ts.map +1 -1
- package/lib/assertions/rubric/index.js +59 -13
- 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 +181 -28
- package/lib/assertions/rubric/internal.js.map +1 -1
- package/lib/authoring.d.ts +36 -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 +26 -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 +1406 -0
- package/lib/cli/output-schemas.d.ts.map +1 -0
- package/lib/cli/output-schemas.js +91 -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 +778 -646
- package/lib/cli/program.js.map +1 -1
- package/lib/cli/render/reporter.d.ts.map +1 -1
- package/lib/cli/render/reporter.js +40 -7
- package/lib/cli/render/reporter.js.map +1 -1
- package/lib/cli/run-options.d.ts +20 -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 +197 -0
- package/lib/container/driver.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 +12 -0
- package/lib/container/resources.d.ts.map +1 -0
- package/lib/container/resources.js +133 -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 +8 -0
- package/lib/core/artifact-evidence.d.ts.map +1 -1
- package/lib/core/artifact-evidence.js +36 -4
- package/lib/core/artifact-evidence.js.map +1 -1
- package/lib/core/assertion.d.ts +15 -0
- package/lib/core/assertion.d.ts.map +1 -1
- package/lib/core/assertion.js +16 -0
- package/lib/core/assertion.js.map +1 -1
- package/lib/core/case.d.ts +106 -2
- package/lib/core/case.d.ts.map +1 -1
- package/lib/core/case.js +16 -2
- 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 +36 -0
- package/lib/core/events.d.ts.map +1 -1
- package/lib/core/events.js +12 -2
- package/lib/core/events.js.map +1 -1
- package/lib/core/experiment.d.ts +32 -2
- package/lib/core/experiment.d.ts.map +1 -1
- package/lib/core/experiment.js +35 -18
- 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 +31 -19
- package/lib/core/model-cli.js.map +1 -1
- package/lib/core/platform-process.d.ts +6 -1
- package/lib/core/platform-process.d.ts.map +1 -1
- package/lib/core/platform-process.js +49 -11
- package/lib/core/platform-process.js.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 +12 -0
- package/lib/core/wire.d.ts.map +1 -1
- package/lib/core/wire.js +5 -1
- package/lib/core/wire.js.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 +180 -10
- package/lib/drivers/claude-code/index.d.ts.map +1 -1
- package/lib/drivers/claude-code/index.js +186 -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 +66 -5
- package/lib/drivers/codex/config.d.ts.map +1 -1
- package/lib/drivers/codex/config.js +39 -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 +138 -4
- package/lib/drivers/codex/index.d.ts.map +1 -1
- package/lib/drivers/codex/index.js +112 -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 +197 -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 +143 -0
- package/lib/drivers/shared/experiment-policy.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 +22 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +20 -6
- 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 +17 -1
- package/lib/orchestrator/compare.d.ts.map +1 -1
- package/lib/orchestrator/compare.js +25 -1
- 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 +177 -1
- package/lib/orchestrator/config.d.ts.map +1 -1
- package/lib/orchestrator/config.js +18 -4
- 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 +121 -33
- 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.map +1 -1
- package/lib/orchestrator/experiment-contracts.d.ts +30 -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 +44 -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 +56 -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 +90 -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 +61 -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 +52 -0
- 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 +29 -1
- 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 +2 -1
- package/lib/orchestrator/grading.d.ts.map +1 -1
- package/lib/orchestrator/grading.js +27 -8
- 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 +77 -12
- 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 +18 -2
- package/lib/orchestrator/orchestrator.d.ts.map +1 -1
- package/lib/orchestrator/orchestrator.js +50 -168
- 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 +158 -0
- package/lib/orchestrator/paired-effects.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 +7 -0
- 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 +66 -12
- 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 +27 -17
- 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 +77 -0
- package/lib/orchestrator/suite-summary.d.ts.map +1 -1
- package/lib/orchestrator/suite-summary.js +61 -12
- 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 +558 -0
- package/lib/previewer/server.js.map +1 -0
- package/package.json +3 -3
- 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 +8 -12
- package/src/assertions/authoring.ts +2 -0
- package/src/assertions/core/command-exits-zero.ts +61 -7
- package/src/assertions/core/event-checks.ts +64 -3
- package/src/assertions/core/helpers.ts +3 -6
- package/src/assertions/core/index.ts +2 -0
- package/src/assertions/core/resource-checks.ts +38 -5
- package/src/assertions/rubric/index.ts +68 -13
- package/src/assertions/rubric/internal.ts +227 -27
- package/src/authoring.ts +345 -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 +117 -0
- package/src/cli/init-templates.ts +238 -0
- package/src/cli/init.ts +53 -184
- package/src/cli/output-schemas.ts +106 -0
- package/src/cli/program.ts +689 -721
- package/src/cli/render/reporter.ts +43 -7
- package/src/cli/run-options.ts +132 -25
- package/src/cli/view.ts +129 -0
- package/src/container/driver.ts +211 -0
- package/src/container/protocol.ts +48 -0
- package/src/container/resources.ts +153 -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 +47 -4
- package/src/core/assertion.ts +18 -0
- package/src/core/case.ts +16 -2
- 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 +14 -2
- package/src/core/experiment.ts +64 -24
- 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 +52 -23
- package/src/core/platform-process.ts +58 -10
- package/src/core/run.ts +31 -0
- package/src/core/usage.ts +8 -0
- package/src/core/wire.ts +5 -1
- 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 +216 -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 +50 -8
- package/src/drivers/codex/exec-events.ts +258 -0
- package/src/drivers/codex/index.ts +144 -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 +214 -0
- package/src/drivers/shared/experiment-policy.ts +195 -0
- package/src/drivers/subprocess/index.ts +55 -12
- package/src/index.ts +115 -10
- 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 +34 -1
- package/src/orchestrator/comparison-identity.ts +2 -0
- package/src/orchestrator/config.ts +20 -3
- package/src/orchestrator/discover.ts +8 -1
- package/src/orchestrator/doctor.ts +189 -28
- package/src/orchestrator/driver-capabilities.ts +21 -0
- package/src/orchestrator/driver-identity.ts +69 -0
- package/src/orchestrator/experiment-context.ts +3 -2
- package/src/orchestrator/experiment-corpus.ts +53 -37
- package/src/orchestrator/experiment-effects.ts +61 -0
- package/src/orchestrator/experiment-evaluation.ts +71 -10
- package/src/orchestrator/experiment-identity.ts +42 -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 +77 -0
- 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 +35 -7
- 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 +95 -11
- package/src/orchestrator/optimization-lifecycle.ts +4 -1
- package/src/orchestrator/orchestrator.ts +92 -216
- package/src/orchestrator/paired-effects.ts +209 -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 +77 -11
- package/src/orchestrator/run-lifecycle.ts +4 -2
- package/src/orchestrator/run-workspace.ts +62 -0
- package/src/orchestrator/suite-compare.ts +29 -19
- package/src/orchestrator/suite-runs.ts +13 -2
- package/src/orchestrator/suite-summary.ts +122 -13
- package/src/previewer/artifacts.ts +221 -0
- package/src/previewer/server.ts +787 -0
- package/viewer/app.css +2075 -0
- package/viewer/app.js +627 -0
- package/viewer/artifact-view.js +48 -0
- package/viewer/charts.js +86 -0
- package/viewer/detail.js +1231 -0
- package/viewer/format.js +129 -0
- package/viewer/index.html +151 -0
- package/lib/answerers/scripted/index.d.ts +0 -8
- package/lib/answerers/scripted/index.d.ts.map +0 -1
- package/lib/answerers/scripted/index.js +0 -163
- package/lib/answerers/scripted/index.js.map +0 -1
- 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 -85
- package/skills/lux/references/cli.md +0 -102
- package/skills/lux/references/eval-authoring.md +0 -105
- package/src/answerers/scripted/index.ts +0 -186
- 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
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 });
|
|
@@ -7,12 +7,15 @@ import type { Run } from "./run.js";
|
|
|
7
7
|
const DEFAULT_ARTIFACT_READ_BYTES = 5 * 1024 * 1024;
|
|
8
8
|
const MAX_ARTIFACT_READ_BYTES = 10 * 1024 * 1024;
|
|
9
9
|
|
|
10
|
+
export type RunArtifactIssueReason = "absent" | "unreadable";
|
|
11
|
+
|
|
10
12
|
export type RunArtifactInspection = {
|
|
11
13
|
target: string;
|
|
12
14
|
root: string;
|
|
13
15
|
artifact?: Artifact;
|
|
14
16
|
stats?: Stats;
|
|
15
17
|
issue?: string;
|
|
18
|
+
reason?: RunArtifactIssueReason;
|
|
16
19
|
};
|
|
17
20
|
|
|
18
21
|
type RunArtifactEvidence = {
|
|
@@ -82,6 +85,7 @@ export const inspectRunArtifact = async (
|
|
|
82
85
|
target: authoredPath,
|
|
83
86
|
root: runArtifactsRoot(run),
|
|
84
87
|
issue: `${authoredPath} contains a null byte`,
|
|
88
|
+
reason: "unreadable",
|
|
85
89
|
};
|
|
86
90
|
}
|
|
87
91
|
const matching = run.artifacts.filter((candidate) => candidate.path === authoredPath);
|
|
@@ -91,6 +95,7 @@ export const inspectRunArtifact = async (
|
|
|
91
95
|
target: resolve(root, authoredPath),
|
|
92
96
|
root,
|
|
93
97
|
issue: `${authoredPath} was not captured in the frozen artifact index`,
|
|
98
|
+
reason: "absent",
|
|
94
99
|
};
|
|
95
100
|
}
|
|
96
101
|
if (matching.some((candidate) => candidate.root !== undefined && !isAbsolute(candidate.root))) {
|
|
@@ -98,6 +103,7 @@ export const inspectRunArtifact = async (
|
|
|
98
103
|
target: authoredPath,
|
|
99
104
|
root: defaultArtifactsRoot(run),
|
|
100
105
|
issue: `${authoredPath} declares a non-absolute artifact root`,
|
|
106
|
+
reason: "unreadable",
|
|
101
107
|
};
|
|
102
108
|
}
|
|
103
109
|
const artifact = matching[0];
|
|
@@ -108,6 +114,7 @@ export const inspectRunArtifact = async (
|
|
|
108
114
|
target: authoredPath,
|
|
109
115
|
root: defaultArtifactsRoot(run),
|
|
110
116
|
issue: `${authoredPath} is ambiguous across multiple artifact roots`,
|
|
117
|
+
reason: "unreadable",
|
|
111
118
|
};
|
|
112
119
|
}
|
|
113
120
|
// A non-default root is trusted only for an exact artifact-index entry.
|
|
@@ -116,7 +123,12 @@ export const inspectRunArtifact = async (
|
|
|
116
123
|
const root = matchingRoots[0] ?? defaultArtifactsRoot(run);
|
|
117
124
|
const target = resolve(root, authoredPath);
|
|
118
125
|
if (pathEscapesRoot(root, target)) {
|
|
119
|
-
return {
|
|
126
|
+
return {
|
|
127
|
+
target,
|
|
128
|
+
root,
|
|
129
|
+
issue: `${authoredPath} escapes the captured artifact root`,
|
|
130
|
+
reason: "unreadable",
|
|
131
|
+
};
|
|
120
132
|
}
|
|
121
133
|
|
|
122
134
|
const path = relative(root, target);
|
|
@@ -134,7 +146,13 @@ export const inspectRunArtifact = async (
|
|
|
134
146
|
} catch (error) {
|
|
135
147
|
const code = (error as NodeJS.ErrnoException).code;
|
|
136
148
|
if (code === "ENOENT" || code === "ENOTDIR") {
|
|
137
|
-
return {
|
|
149
|
+
return {
|
|
150
|
+
target,
|
|
151
|
+
root,
|
|
152
|
+
...identified,
|
|
153
|
+
issue: `${authoredPath} not found`,
|
|
154
|
+
reason: "absent",
|
|
155
|
+
};
|
|
138
156
|
}
|
|
139
157
|
throw error;
|
|
140
158
|
}
|
|
@@ -144,16 +162,17 @@ export const inspectRunArtifact = async (
|
|
|
144
162
|
root,
|
|
145
163
|
...identified,
|
|
146
164
|
issue: `${authoredPath} resolves through a symlink`,
|
|
165
|
+
reason: "unreadable",
|
|
147
166
|
};
|
|
148
167
|
}
|
|
149
168
|
if (index < components.length - 1 && !stats.isDirectory()) {
|
|
150
|
-
return { target, root, ...identified, issue: `${authoredPath} not found
|
|
169
|
+
return { target, root, ...identified, issue: `${authoredPath} not found`, reason: "absent" };
|
|
151
170
|
}
|
|
152
171
|
if (index === components.length - 1) {
|
|
153
172
|
return { target, root, ...identified, stats };
|
|
154
173
|
}
|
|
155
174
|
}
|
|
156
|
-
return { target, root, ...identified, issue: `${authoredPath} not found
|
|
175
|
+
return { target, root, ...identified, issue: `${authoredPath} not found`, reason: "absent" };
|
|
157
176
|
};
|
|
158
177
|
|
|
159
178
|
export type ReadRunArtifactTextOptions = {
|
|
@@ -247,3 +266,27 @@ export const readRunArtifactText = async (
|
|
|
247
266
|
): Promise<string> => {
|
|
248
267
|
return (await readRunArtifactBytes(run, authoredPath, options)).toString("utf8");
|
|
249
268
|
};
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Read optional artifact evidence. Returns null when the artifact was never
|
|
272
|
+
* captured, and still throws when one exists but is unsafe to consume, so a
|
|
273
|
+
* traversal or symlink violation is never mistaken for missing evidence.
|
|
274
|
+
*/
|
|
275
|
+
export const readRunArtifactTextIfPresent = async (
|
|
276
|
+
run: RunArtifactEvidence,
|
|
277
|
+
authoredPath: string,
|
|
278
|
+
options: ReadRunArtifactTextOptions = {},
|
|
279
|
+
): Promise<string | null> => {
|
|
280
|
+
const inspected = await inspectRunArtifact(run, authoredPath);
|
|
281
|
+
if (inspected.reason === "absent") return null;
|
|
282
|
+
if (!inspected.stats?.isFile()) {
|
|
283
|
+
throw new Error(
|
|
284
|
+
inspected.issue ??
|
|
285
|
+
(inspected.stats ? `${authoredPath} is not a file` : `${authoredPath} not found`),
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
const maxBytes = options.maxBytes ?? DEFAULT_ARTIFACT_READ_BYTES;
|
|
289
|
+
return (
|
|
290
|
+
await readInspectedFileBytes(inspected.target, inspected.stats, maxBytes, authoredPath)
|
|
291
|
+
).toString("utf8");
|
|
292
|
+
};
|
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. */
|
|
@@ -100,6 +102,13 @@ export const assertionPluginIssue = (definition: {
|
|
|
100
102
|
* Define a schema-validated assertion plugin while inferring the config passed
|
|
101
103
|
* to `evaluate` from the schema.
|
|
102
104
|
*/
|
|
105
|
+
export const baseAssertionFields = {
|
|
106
|
+
id: z.string().min(1).optional(),
|
|
107
|
+
weight: z.number().positive().optional(),
|
|
108
|
+
threshold: z.number().min(0).max(1).optional(),
|
|
109
|
+
name: z.string().optional(),
|
|
110
|
+
} as const;
|
|
111
|
+
|
|
103
112
|
export const defineAssertion = <S extends z.ZodObject>(
|
|
104
113
|
definition: AssertionPluginDefinition<S>,
|
|
105
114
|
): AssertionPlugin<SchemaAssertion<S>, SchemaAssertionInput<S>> => {
|
|
@@ -136,16 +145,25 @@ export const GradingAssertionEntrySchema = z.object({
|
|
|
136
145
|
durationMs: z.number(),
|
|
137
146
|
comment: z.exactOptional(z.string()),
|
|
138
147
|
detail: z.unknown().optional(),
|
|
148
|
+
abstention: z.exactOptional(z.literal("insufficient-evidence")),
|
|
139
149
|
errorMessage: z.exactOptional(z.string()),
|
|
140
150
|
usage: z.exactOptional(TokenUsageSchema),
|
|
141
151
|
});
|
|
142
152
|
export type GradingAssertionEntry = z.infer<typeof GradingAssertionEntrySchema>;
|
|
143
153
|
|
|
154
|
+
const SkippedGradingAssertionSchema = z.object({
|
|
155
|
+
id: z.string(),
|
|
156
|
+
type: z.string(),
|
|
157
|
+
name: z.string(),
|
|
158
|
+
reason: z.literal("judge-disabled"),
|
|
159
|
+
});
|
|
160
|
+
|
|
144
161
|
export const GradingReportSchema = z.object({
|
|
145
162
|
schemaVersion: z.literal(1),
|
|
146
163
|
casePassed: z.boolean().nullable(),
|
|
147
164
|
caseScore: z.number().nullable(),
|
|
148
165
|
assertions: z.array(GradingAssertionEntrySchema),
|
|
166
|
+
skippedAssertions: z.array(SkippedGradingAssertionSchema).optional(),
|
|
149
167
|
/**
|
|
150
168
|
* Present when the subject run or grading did not complete. Assertions may
|
|
151
169
|
* still contain partial diagnostics, but the report is not a clean verdict.
|
package/src/core/case.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
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 { DriverCapabilitySchema } from "./driver.js";
|
|
5
|
+
import { DriverExecutionSchema } from "./driver-execution.js";
|
|
6
|
+
import { EvaluationMetadataSchema } from "./evaluation-clusters.js";
|
|
7
|
+
import { HarnessMatrixSchema } from "./harness-matrix.js";
|
|
4
8
|
import type { LifecycleHooksPlugin } from "./lifecycle-hooks.js";
|
|
5
9
|
import { formatZodIssues } from "./zod.js";
|
|
6
10
|
|
|
@@ -17,7 +21,13 @@ export type FixturesRef = z.infer<typeof FixturesRefSchema>;
|
|
|
17
21
|
// `defineEvalCase` discriminate the config type on `name`.
|
|
18
22
|
export const DriverRefSchema = z.union([
|
|
19
23
|
z.string(),
|
|
20
|
-
z
|
|
24
|
+
z
|
|
25
|
+
.object({
|
|
26
|
+
name: z.string(),
|
|
27
|
+
config: z.unknown().optional(),
|
|
28
|
+
execution: DriverExecutionSchema.optional(),
|
|
29
|
+
})
|
|
30
|
+
.strict(),
|
|
21
31
|
]);
|
|
22
32
|
export type DriverRef = z.infer<typeof DriverRefSchema>;
|
|
23
33
|
|
|
@@ -44,10 +54,13 @@ const EvalCaseObjectSchema = z.object({
|
|
|
44
54
|
prompt: z.string().min(1, "prompt is required"),
|
|
45
55
|
persona: z.string().min(1).optional(),
|
|
46
56
|
driver: DriverRefSchema.optional(),
|
|
57
|
+
/** Harness permutations this case runs through instead of the project matrix. */
|
|
58
|
+
matrix: HarnessMatrixSchema.optional(),
|
|
47
59
|
answerer: AnswererRefSchema.optional(),
|
|
48
60
|
fixtures: FixturesRefSchema.optional(),
|
|
61
|
+
requires: z.array(DriverCapabilitySchema).optional(),
|
|
49
62
|
assertions: z.array(AssertionSchema).optional(),
|
|
50
|
-
meta:
|
|
63
|
+
meta: EvaluationMetadataSchema.optional(),
|
|
51
64
|
});
|
|
52
65
|
|
|
53
66
|
export const EvalCaseSchema = EvalCaseObjectSchema
|
|
@@ -149,6 +162,7 @@ export const PersistedCaseSchema = EvalCaseObjectSchema.partial()
|
|
|
149
162
|
driver: PersistedDriverRefSchema.optional(),
|
|
150
163
|
answerer: PersistedAnswererRefSchema.optional(),
|
|
151
164
|
fixtures: PersistedFixturesRefSchema.optional(),
|
|
165
|
+
meta: z.record(z.string(), z.unknown()).optional(),
|
|
152
166
|
})
|
|
153
167
|
.loose();
|
|
154
168
|
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
|
+
};
|
package/src/core/driver.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import type { DriverExecution } from "./driver-execution.js";
|
|
2
3
|
import type { EventHandler } from "./emitter.js";
|
|
3
4
|
import type { Answer, Done, ErrorEvent, Interrupt, Progress, ReadyState } from "./events.js";
|
|
5
|
+
import type { ReasoningEffort } from "./harness-catalog.js";
|
|
4
6
|
import type { FixtureValueBinding } from "./lifecycle-hooks.js";
|
|
5
7
|
|
|
6
8
|
export const ArtifactSchema = z.object({
|
|
@@ -11,6 +13,8 @@ export const ArtifactSchema = z.object({
|
|
|
11
13
|
* Consumers resolve `path` against this before falling back to the default.
|
|
12
14
|
*/
|
|
13
15
|
root: z.exactOptional(z.string()),
|
|
16
|
+
/** Assigned by Lux against fixture bytes frozen before the subject starts. */
|
|
17
|
+
origin: z.exactOptional(z.enum(["generated", "modified", "fixture"])),
|
|
14
18
|
contentType: z.exactOptional(z.string()),
|
|
15
19
|
size: z.exactOptional(z.number()),
|
|
16
20
|
meta: z.exactOptional(z.record(z.string(), z.unknown())),
|
|
@@ -27,6 +31,8 @@ export type ResolvedFixtures = z.infer<typeof ResolvedFixturesSchema>;
|
|
|
27
31
|
export type StartContext = {
|
|
28
32
|
/** Stable selected case id, available to drivers that multiplex scenarios. */
|
|
29
33
|
caseId?: string;
|
|
34
|
+
/** Private home owned by an outer execution boundary; never the caller’s home. */
|
|
35
|
+
isolatedHome?: string;
|
|
30
36
|
prompt: string;
|
|
31
37
|
fixtures?: ResolvedFixtures | undefined;
|
|
32
38
|
/** Authored fixture values selected for this case. */
|
|
@@ -68,11 +74,81 @@ export interface AgentDriver {
|
|
|
68
74
|
* responsible for stopping background writers before this promise resolves.
|
|
69
75
|
*/
|
|
70
76
|
collect(): Promise<Artifact[]>;
|
|
77
|
+
/** Optional quiesced full execution tree for private command verification, until close. */
|
|
78
|
+
verificationWorkspace?(): Promise<string | undefined>;
|
|
71
79
|
close(): Promise<void>;
|
|
72
80
|
}
|
|
73
81
|
|
|
82
|
+
export const DriverCapabilitySchema = z.enum([
|
|
83
|
+
"interactive",
|
|
84
|
+
"tool-calls",
|
|
85
|
+
"tool-results",
|
|
86
|
+
"artifacts",
|
|
87
|
+
"subagents",
|
|
88
|
+
"usage",
|
|
89
|
+
"cost",
|
|
90
|
+
"isolation",
|
|
91
|
+
]);
|
|
92
|
+
export type DriverCapability = z.infer<typeof DriverCapabilitySchema>;
|
|
93
|
+
|
|
94
|
+
export type DriverRuntime = {
|
|
95
|
+
commands: string[];
|
|
96
|
+
/** Missing keys mean unknown; false means the adapter cannot provide the capability. */
|
|
97
|
+
capabilities: Partial<Record<DriverCapability, boolean>>;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export type DriverExperiment<Cfg> = {
|
|
101
|
+
version: string;
|
|
102
|
+
/** Bind a configuration to the experiment environment; Lux validates the returned config. */
|
|
103
|
+
prepare(config: Cfg): unknown;
|
|
104
|
+
/** Fingerprint behavior outside authored cases/configuration and the reported executables. */
|
|
105
|
+
identity(config: Cfg, context: { rootDir: string }): unknown | Promise<unknown>;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/** Model and reasoning effort chosen by a harness matrix permutation. */
|
|
109
|
+
export type HarnessSelection = {
|
|
110
|
+
model?: string | undefined;
|
|
111
|
+
effort?: ReasoningEffort | undefined;
|
|
112
|
+
};
|
|
113
|
+
|
|
74
114
|
export type DriverPlugin<Cfg = unknown> = {
|
|
75
115
|
name: string;
|
|
76
116
|
configSchema?: z.ZodTypeAny;
|
|
77
117
|
create: (config: Cfg) => AgentDriver | Promise<AgentDriver>;
|
|
118
|
+
runtime?: (config: Cfg) => DriverRuntime;
|
|
119
|
+
/** Ordinary runs remain supported when controlled experiments are not declared. */
|
|
120
|
+
experiment?: DriverExperiment<Cfg>;
|
|
121
|
+
/**
|
|
122
|
+
* Apply a matrix selection to raw (unvalidated) configuration. Drivers
|
|
123
|
+
* without a model concept leave this undefined and reject selection.
|
|
124
|
+
*/
|
|
125
|
+
selectHarness?: (config: unknown, selection: HarnessSelection) => unknown;
|
|
78
126
|
};
|
|
127
|
+
|
|
128
|
+
/** Selection for drivers whose configuration uses `model` and `reasoningEffort`. */
|
|
129
|
+
export const selectModelAndReasoningEffort = (
|
|
130
|
+
config: unknown,
|
|
131
|
+
selection: HarnessSelection,
|
|
132
|
+
): unknown => ({
|
|
133
|
+
...(config && typeof config === "object" && !Array.isArray(config)
|
|
134
|
+
? (config as Record<string, unknown>)
|
|
135
|
+
: {}),
|
|
136
|
+
...(selection.model !== undefined ? { model: selection.model } : {}),
|
|
137
|
+
...(selection.effort !== undefined || selection.model !== undefined
|
|
138
|
+
? { reasoningEffort: selection.effort }
|
|
139
|
+
: {}),
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
export const defineDriver = <S extends z.ZodType>(
|
|
143
|
+
definition: Omit<DriverPlugin<z.output<S>>, "configSchema"> & { configSchema: S },
|
|
144
|
+
): Omit<DriverPlugin<z.output<S>>, "configSchema"> & { configSchema: S } => definition;
|
|
145
|
+
|
|
146
|
+
export const driverRef = <S extends z.ZodType>(
|
|
147
|
+
plugin: { name: string; configSchema: S },
|
|
148
|
+
config: z.input<S>,
|
|
149
|
+
execution?: DriverExecution,
|
|
150
|
+
): { name: string; config: z.input<S>; execution?: DriverExecution } => ({
|
|
151
|
+
name: plugin.name,
|
|
152
|
+
config,
|
|
153
|
+
...(execution ? { execution } : {}),
|
|
154
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
const UNITS: Record<string, number> = {
|
|
4
|
+
ms: 1,
|
|
5
|
+
millisecond: 1,
|
|
6
|
+
milliseconds: 1,
|
|
7
|
+
s: 1000,
|
|
8
|
+
second: 1000,
|
|
9
|
+
seconds: 1000,
|
|
10
|
+
m: 60_000,
|
|
11
|
+
minute: 60_000,
|
|
12
|
+
minutes: 60_000,
|
|
13
|
+
h: 3_600_000,
|
|
14
|
+
hour: 3_600_000,
|
|
15
|
+
hours: 3_600_000,
|
|
16
|
+
d: 86_400_000,
|
|
17
|
+
day: 86_400_000,
|
|
18
|
+
days: 86_400_000,
|
|
19
|
+
};
|
|
20
|
+
const MAX_TIMER_MS = 2_147_483_647;
|
|
21
|
+
const INVALID_DURATION =
|
|
22
|
+
'Expected a positive duration such as "20 minutes", "1.5 hours", or "500 ms", up to 2147483647 milliseconds';
|
|
23
|
+
|
|
24
|
+
/** Explicit units prevent ambiguous numeric configuration and Node timer overflow. */
|
|
25
|
+
export const durationMs = (value: string): number => {
|
|
26
|
+
if (value.length > 80) throw new Error(INVALID_DURATION);
|
|
27
|
+
const match =
|
|
28
|
+
/^(\d+(?:\.\d+)?)\s*(ms|milliseconds?|s|seconds?|m|minutes?|h|hours?|d|days?)$/i.exec(
|
|
29
|
+
value.trim(),
|
|
30
|
+
);
|
|
31
|
+
const amount = match?.[1];
|
|
32
|
+
const multiplier = match?.[2] ? UNITS[match[2].toLowerCase()] : undefined;
|
|
33
|
+
if (!amount || !multiplier) throw new Error(INVALID_DURATION);
|
|
34
|
+
const [whole, fraction = ""] = amount.split(".");
|
|
35
|
+
const scale = 10n ** BigInt(fraction.length);
|
|
36
|
+
const numerator = BigInt(`${whole}${fraction}`) * BigInt(multiplier);
|
|
37
|
+
const milliseconds = numerator / scale;
|
|
38
|
+
if (numerator % scale !== 0n || milliseconds <= 0n || milliseconds > BigInt(MAX_TIMER_MS)) {
|
|
39
|
+
throw new Error(INVALID_DURATION);
|
|
40
|
+
}
|
|
41
|
+
return Number(milliseconds);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Keep strings in validated configs: schema validation may run again during
|
|
45
|
+
// experiment preparation or replay. Conversion belongs at the timer boundary.
|
|
46
|
+
export const DurationSchema = z.string().superRefine((value, ctx) => {
|
|
47
|
+
try {
|
|
48
|
+
durationMs(value);
|
|
49
|
+
} catch {
|
|
50
|
+
ctx.addIssue({ code: "custom", message: INVALID_DURATION });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/** Author-declared execution conditions. Lux records these without enforcing or verifying them. */
|
|
4
|
+
export const EnvironmentDeclarationSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
imageDigest: z
|
|
7
|
+
.string()
|
|
8
|
+
.regex(/^(?:[^@\s]+@)?sha256:[a-f0-9]{64}$/)
|
|
9
|
+
.optional(),
|
|
10
|
+
toolchains: z.record(z.string().min(1), z.string().min(1)).optional(),
|
|
11
|
+
network: z.enum(["disabled", "restricted", "unrestricted"]).optional(),
|
|
12
|
+
resources: z
|
|
13
|
+
.object({
|
|
14
|
+
cpuCount: z.number().positive().optional(),
|
|
15
|
+
memoryBytes: z.number().int().positive().optional(),
|
|
16
|
+
diskBytes: z.number().int().positive().optional(),
|
|
17
|
+
})
|
|
18
|
+
.strict()
|
|
19
|
+
.optional(),
|
|
20
|
+
})
|
|
21
|
+
.strict();
|
|
22
|
+
export type EnvironmentDeclaration = z.infer<typeof EnvironmentDeclarationSchema>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const EvaluationMetadataSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
/** Related perturbations share one independent statistical unit. */
|
|
6
|
+
cluster: z.string().trim().min(1).optional(),
|
|
7
|
+
})
|
|
8
|
+
.catchall(z.unknown());
|
|
9
|
+
|
|
10
|
+
export const clusterKey = (id: string, cluster: string | undefined): string =>
|
|
11
|
+
JSON.stringify(cluster === undefined ? ["case", id] : ["cluster", cluster]);
|
|
12
|
+
|
|
13
|
+
export const independentClusterCount = (
|
|
14
|
+
items: readonly { id: string; cluster?: string | undefined }[],
|
|
15
|
+
): number => new Set(items.map((item) => clusterKey(item.id, item.cluster))).size;
|
|
16
|
+
|
|
17
|
+
export const assertDisjointClusters = (
|
|
18
|
+
splits: readonly {
|
|
19
|
+
name: string;
|
|
20
|
+
items: readonly { id: string; cluster?: string | undefined }[];
|
|
21
|
+
}[],
|
|
22
|
+
): void => {
|
|
23
|
+
const owners = new Map<string, string>();
|
|
24
|
+
for (const split of splits) {
|
|
25
|
+
for (const item of split.items) {
|
|
26
|
+
if (item.cluster === undefined) continue;
|
|
27
|
+
const owner = owners.get(item.cluster);
|
|
28
|
+
if (owner !== undefined && owner !== split.name)
|
|
29
|
+
throw new Error(
|
|
30
|
+
`evaluation cluster '${item.cluster}' appears in both ${owner} and ${split.name} splits`,
|
|
31
|
+
);
|
|
32
|
+
owners.set(item.cluster, split.name);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|