@prismatic-io/lux 0.0.2-preview.3 → 0.0.2-preview.32
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 +4 -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/file-checks.d.ts +6 -0
- package/lib/assertions/core/file-checks.d.ts.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/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/rubric/index.d.ts +28 -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 +1408 -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 +779 -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 +48 -8
- 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 +20 -2
- package/lib/core/assertion.d.ts.map +1 -1
- package/lib/core/assertion.js +19 -1
- package/lib/core/assertion.js.map +1 -1
- package/lib/core/case.d.ts +111 -3
- package/lib/core/case.d.ts.map +1 -1
- package/lib/core/case.js +17 -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/rubric.d.ts +1 -0
- package/lib/core/rubric.d.ts.map +1 -1
- package/lib/core/run.d.ts +293 -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 +19 -3
- package/lib/orchestrator/compare.d.ts.map +1 -1
- package/lib/orchestrator/compare.js +32 -6
- 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 +179 -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 +33 -3
- 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 +46 -31
- 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 +81 -14
- 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 +9 -1
- 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 +691 -721
- package/src/cli/render/reporter.ts +50 -8
- 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 +21 -1
- package/src/core/case.ts +21 -3
- 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 +41 -6
- 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 +67 -28
- 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 +98 -13
- 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 +2079 -0
- package/viewer/app.js +627 -0
- package/viewer/artifact-view.js +48 -0
- package/viewer/charts.js +86 -0
- package/viewer/detail.js +1237 -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
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { lstat, readFile, readlink } from "node:fs/promises";
|
|
3
|
+
import { availableParallelism, cpus, release, totalmem } from "node:os";
|
|
3
4
|
import { dirname, join, parse, relative, resolve, sep } from "node:path";
|
|
5
|
+
import type { EnvironmentDeclaration } from "../core/environment.js";
|
|
4
6
|
import type { RunProvenance } from "../core/index.js";
|
|
5
7
|
import { contentHash, exec, valueHash } from "../core/index.js";
|
|
6
8
|
|
|
@@ -113,13 +115,30 @@ export const runtimeIdentity = (): RunProvenance["runtime"] => ({
|
|
|
113
115
|
arch: process.arch,
|
|
114
116
|
node: process.version,
|
|
115
117
|
...(process.versions.bun ? { bun: process.versions.bun } : {}),
|
|
118
|
+
host: {
|
|
119
|
+
osRelease: release(),
|
|
120
|
+
cpuModels: [...new Set(cpus().map((cpu) => cpu.model))].sort(),
|
|
121
|
+
logicalCpuCount: cpus().length,
|
|
122
|
+
availableParallelism: availableParallelism(),
|
|
123
|
+
totalMemoryBytes: totalmem(),
|
|
124
|
+
},
|
|
116
125
|
});
|
|
117
126
|
|
|
118
|
-
export const runProvenance = async (
|
|
127
|
+
export const runProvenance = async (
|
|
128
|
+
casePath: string | null,
|
|
129
|
+
options: {
|
|
130
|
+
environment?: EnvironmentDeclaration | undefined;
|
|
131
|
+
concurrency?: number | undefined;
|
|
132
|
+
} = {},
|
|
133
|
+
): Promise<RunProvenance> => {
|
|
119
134
|
const runtime = runtimeIdentity();
|
|
120
|
-
|
|
135
|
+
const environment = {
|
|
136
|
+
...(options.environment ? { declared: options.environment } : {}),
|
|
137
|
+
concurrency: options.concurrency ?? 1,
|
|
138
|
+
};
|
|
139
|
+
if (!casePath) return { runtime, environment };
|
|
121
140
|
const root = gitRootAbove(casePath);
|
|
122
|
-
if (!root) return { runtime, source: { casePath: resolve(casePath) } };
|
|
141
|
+
if (!root) return { runtime, environment, source: { casePath: resolve(casePath) } };
|
|
123
142
|
let git = repositories.get(root);
|
|
124
143
|
if (!git) {
|
|
125
144
|
git = inspectRepository(root);
|
|
@@ -128,6 +147,7 @@ export const runProvenance = async (casePath: string | null): Promise<RunProvena
|
|
|
128
147
|
const state = await git;
|
|
129
148
|
return {
|
|
130
149
|
runtime,
|
|
150
|
+
environment,
|
|
131
151
|
source: {
|
|
132
152
|
casePath: portablePath(relative(root, resolve(casePath))),
|
|
133
153
|
...(state ? { git: state } : {}),
|
|
@@ -154,6 +154,8 @@ export type OpenRunDirOptions = {
|
|
|
154
154
|
runsRoot: string;
|
|
155
155
|
caseId: string;
|
|
156
156
|
driverName: string;
|
|
157
|
+
/** Files the run under the permutation instead of the bare driver name. */
|
|
158
|
+
permutationId?: string | undefined;
|
|
157
159
|
startedAt?: Date | undefined;
|
|
158
160
|
/** Tap on the event stream, called for every appended event. Must not throw. */
|
|
159
161
|
onEvent?: ((event: RunEvent) => void) | undefined;
|
|
@@ -164,7 +166,12 @@ export type OpenRunDirOptions = {
|
|
|
164
166
|
export const openRunDir = async (options: OpenRunDirOptions): Promise<OpenedRunDir> => {
|
|
165
167
|
const ts = isoTimestampSafe(options.startedAt ?? new Date());
|
|
166
168
|
const slug = slugifyCaseId(options.caseId);
|
|
167
|
-
const basePath = join(
|
|
169
|
+
const basePath = join(
|
|
170
|
+
options.runsRoot,
|
|
171
|
+
slug,
|
|
172
|
+
slugifyCaseId(options.permutationId ?? options.driverName),
|
|
173
|
+
ts,
|
|
174
|
+
);
|
|
168
175
|
await mkdir(dirname(basePath), { recursive: true });
|
|
169
176
|
// Same case+driver+millisecond must not share a dir — their events.jsonl
|
|
170
177
|
// streams (opened with flags "a") would interleave silently. A bare mkdir
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { cp } from "node:fs/promises";
|
|
2
2
|
import { dirname, isAbsolute, resolve } from "node:path";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import type { EnvironmentDeclaration } from "../core/environment.js";
|
|
4
5
|
import {
|
|
5
6
|
type AgentDriver,
|
|
6
7
|
type Answerer,
|
|
@@ -10,6 +11,8 @@ import {
|
|
|
10
11
|
AnswererModelCallAccountingSchema,
|
|
11
12
|
type AnswerHistoryEntry,
|
|
12
13
|
type Artifact,
|
|
14
|
+
actionTiming,
|
|
15
|
+
bindRunExecutionWorkspace,
|
|
13
16
|
type EvalCase,
|
|
14
17
|
emptyUsage,
|
|
15
18
|
type FixturesRef,
|
|
@@ -18,6 +21,7 @@ import {
|
|
|
18
21
|
guardRunObserver,
|
|
19
22
|
inspectRunArtifact,
|
|
20
23
|
type LifecycleStage,
|
|
24
|
+
normalizeDriverMetrics,
|
|
21
25
|
type OperationalFailure,
|
|
22
26
|
type PhaseDurations,
|
|
23
27
|
type ReadyState,
|
|
@@ -28,12 +32,14 @@ import {
|
|
|
28
32
|
type RunMetadata,
|
|
29
33
|
type RunProvenance,
|
|
30
34
|
type RunUsage,
|
|
35
|
+
summarizeAgentActivity,
|
|
31
36
|
summarizeToolOutcomes,
|
|
32
37
|
sumUsage,
|
|
33
38
|
type TokenUsage,
|
|
34
39
|
TokenUsageSchema,
|
|
35
40
|
valueHash,
|
|
36
41
|
} from "../core/index.js";
|
|
42
|
+
import { identifyArtifactOrigins } from "./artifact-origin.js";
|
|
37
43
|
import {
|
|
38
44
|
createDriverSession,
|
|
39
45
|
type DriverSession,
|
|
@@ -49,6 +55,7 @@ import {
|
|
|
49
55
|
type RunFailurePhase,
|
|
50
56
|
type RunLifecycleEffects,
|
|
51
57
|
} from "./run-lifecycle.js";
|
|
58
|
+
import { RunWorkspace } from "./run-workspace.js";
|
|
52
59
|
import { isRunTraceLimit, type RunTraceLimitFailure } from "./trace-limits.js";
|
|
53
60
|
|
|
54
61
|
/** Sentinel `casePath` for a pre-loaded case that has no file behind it. */
|
|
@@ -57,6 +64,7 @@ export const INLINE_CASE_PATH = "<inline>";
|
|
|
57
64
|
type RunDirCarrier = { luxRunDir?: string };
|
|
58
65
|
type InterruptCounts = { ask: number; approve: number; custom: number };
|
|
59
66
|
export type RunWithPluginsArgs = {
|
|
67
|
+
environment?: EnvironmentDeclaration | undefined;
|
|
60
68
|
request: RunRequest;
|
|
61
69
|
casePath: string;
|
|
62
70
|
authoredCase: EvalCase;
|
|
@@ -64,6 +72,7 @@ export type RunWithPluginsArgs = {
|
|
|
64
72
|
validatedAssertionConfigs: readonly unknown[];
|
|
65
73
|
caseId: string;
|
|
66
74
|
driverName: string;
|
|
75
|
+
permutationId?: string | undefined;
|
|
67
76
|
answererName: string;
|
|
68
77
|
answererConfig: unknown;
|
|
69
78
|
driverConfigHash: string;
|
|
@@ -108,7 +117,9 @@ const readAnswererUsage = (answerer: Answerer): TokenUsage =>
|
|
|
108
117
|
const stageFixtures = async (
|
|
109
118
|
ref: FixturesRef | undefined,
|
|
110
119
|
options: { fixturesRoot?: string; casePath: string; artifactsDir: string },
|
|
111
|
-
): Promise<
|
|
120
|
+
): Promise<
|
|
121
|
+
{ fixtures: ResolvedFixtures; hash: string; fileHashes: ReadonlyMap<string, string> } | undefined
|
|
122
|
+
> => {
|
|
112
123
|
if (!ref) return undefined;
|
|
113
124
|
const path = typeof ref === "string" ? ref : ref.path;
|
|
114
125
|
if (!isAbsolute(path) && !options.fixturesRoot && options.casePath === INLINE_CASE_PATH) {
|
|
@@ -123,7 +134,11 @@ const stageFixtures = async (
|
|
|
123
134
|
if (staged.hash !== source.hash) {
|
|
124
135
|
throw new Error(`fixtures: tree changed while staging: ${source.rootDir}`);
|
|
125
136
|
}
|
|
126
|
-
return {
|
|
137
|
+
return {
|
|
138
|
+
fixtures: { rootDir: source.rootDir },
|
|
139
|
+
hash: staged.hash,
|
|
140
|
+
fileHashes: staged.fileHashes,
|
|
141
|
+
};
|
|
127
142
|
};
|
|
128
143
|
|
|
129
144
|
export const runDirOfError = (error: unknown): string | null =>
|
|
@@ -170,8 +185,17 @@ const SummaryModelAccountingSchema = z.object({
|
|
|
170
185
|
unpricedModelCalls: z.number().int().nonnegative().optional(),
|
|
171
186
|
});
|
|
172
187
|
|
|
173
|
-
const usageFromSummary = (summary: unknown): TokenUsage | null =>
|
|
174
|
-
|
|
188
|
+
const usageFromSummary = (summary: unknown): TokenUsage | null => {
|
|
189
|
+
if (!summary || typeof summary !== "object") return null;
|
|
190
|
+
const raw = (summary as { usage?: unknown }).usage;
|
|
191
|
+
if (!raw || typeof raw !== "object") return null;
|
|
192
|
+
const counts = raw as Record<string, unknown>;
|
|
193
|
+
const hasCount = ["input", "output", "cacheRead", "cacheCreation"].some((key) => {
|
|
194
|
+
const value = counts[key];
|
|
195
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0;
|
|
196
|
+
});
|
|
197
|
+
return hasCount ? (SummaryUsageSchema.safeParse(summary).data?.usage ?? null) : null;
|
|
198
|
+
};
|
|
175
199
|
|
|
176
200
|
const costFromSummary = (summary: unknown): number | undefined => {
|
|
177
201
|
if (!summary || typeof summary !== "object") return undefined;
|
|
@@ -183,6 +207,11 @@ const modelAccountingFromSummary = (
|
|
|
183
207
|
): { modelCalls: number; unpricedModelCalls?: number | undefined } | null =>
|
|
184
208
|
SummaryModelAccountingSchema.safeParse(summary).data ?? null;
|
|
185
209
|
|
|
210
|
+
const metricsFromSummary = (summary: unknown) => {
|
|
211
|
+
if (!summary || typeof summary !== "object") return {};
|
|
212
|
+
return normalizeDriverMetrics((summary as { metrics?: unknown }).metrics);
|
|
213
|
+
};
|
|
214
|
+
|
|
186
215
|
const artifactMeasurements = async (
|
|
187
216
|
artifacts: readonly Artifact[],
|
|
188
217
|
runDir: string,
|
|
@@ -287,12 +316,14 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
287
316
|
private loop: DriverSession | undefined;
|
|
288
317
|
private ready: ReadyState | undefined;
|
|
289
318
|
private fixturesHash: string | undefined;
|
|
319
|
+
private fixtureFileHashes: ReadonlyMap<string, string> = new Map();
|
|
290
320
|
private startAttempted = false;
|
|
291
321
|
private loopOutcome: DriverSessionOutcome | undefined;
|
|
292
322
|
private collection: Collection = { artifacts: [] };
|
|
293
323
|
private metadata: RunMetadata | undefined;
|
|
294
324
|
private usage: RunUsage | undefined;
|
|
295
325
|
private run: Run | undefined;
|
|
326
|
+
private workspace: RunWorkspace | undefined;
|
|
296
327
|
|
|
297
328
|
private constructor(
|
|
298
329
|
args: RunWithPluginsArgs,
|
|
@@ -312,12 +343,14 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
312
343
|
const startedAt = args.request.startedAt ?? new Date();
|
|
313
344
|
const provenance = await runProvenance(
|
|
314
345
|
args.casePath === INLINE_CASE_PATH ? null : args.casePath,
|
|
346
|
+
{ environment: args.environment, concurrency: args.request.suiteConcurrency },
|
|
315
347
|
);
|
|
316
348
|
const observer = guardRunObserver(args.request.observer);
|
|
317
349
|
const runDir = await openRunDir({
|
|
318
350
|
runsRoot: resolve(args.request.runsRoot),
|
|
319
351
|
caseId: args.caseId,
|
|
320
352
|
driverName: args.driverName,
|
|
353
|
+
permutationId: args.permutationId,
|
|
321
354
|
startedAt,
|
|
322
355
|
onEvent: observer?.event,
|
|
323
356
|
});
|
|
@@ -347,12 +380,14 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
347
380
|
const { request, evalCase, casePath, driver } = this.args;
|
|
348
381
|
this.lifecycle("run-loop");
|
|
349
382
|
if (request.abortSignal?.aborted) return;
|
|
383
|
+
this.workspace = await RunWorkspace.create();
|
|
350
384
|
const staged = await stageFixtures(evalCase.fixtures, {
|
|
351
385
|
...(request.fixturesRoot ? { fixturesRoot: request.fixturesRoot } : {}),
|
|
352
386
|
casePath,
|
|
353
|
-
artifactsDir: this.
|
|
387
|
+
artifactsDir: this.workspace.path,
|
|
354
388
|
});
|
|
355
389
|
this.fixturesHash = staged?.hash;
|
|
390
|
+
this.fixtureFileHashes = staged?.fileHashes ?? new Map();
|
|
356
391
|
if (request.abortSignal?.aborted) return;
|
|
357
392
|
|
|
358
393
|
this.lifecycle("start-driver");
|
|
@@ -365,7 +400,7 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
365
400
|
...(this.args.fixtureValues.length > 0 ? { fixtureValues: this.args.fixtureValues } : {}),
|
|
366
401
|
runsRoot: resolve(request.runsRoot),
|
|
367
402
|
runDir: this.runDir.path,
|
|
368
|
-
artifactsDir: this.
|
|
403
|
+
artifactsDir: this.workspace.path,
|
|
369
404
|
abortSignal: request.abortSignal ?? new AbortController().signal,
|
|
370
405
|
});
|
|
371
406
|
this.append({ type: "ready", ...this.ready });
|
|
@@ -390,6 +425,7 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
390
425
|
metadata.exitReason = "error";
|
|
391
426
|
metadata.operationalFailure = { phase: operationalPhase, reason };
|
|
392
427
|
metadata.phaseDurationMs = phaseDurations(this.runDir.recorded);
|
|
428
|
+
metadata.actionTiming = actionTiming(this.runDir.recorded);
|
|
393
429
|
await this.runDir.writeJson("run.json", metadata);
|
|
394
430
|
await this.args.request.recordPreGradingAccounting?.(metadata);
|
|
395
431
|
await this.args.request.recordModelAttemptsComplete?.(this.subjectAttemptIds);
|
|
@@ -407,9 +443,12 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
407
443
|
this.lifecycle("collect-end");
|
|
408
444
|
await this.runDir.events.drain();
|
|
409
445
|
const completed = await this.completedAgentRun();
|
|
446
|
+
completed.metadata.actionTiming = actionTiming(this.runDir.recorded);
|
|
410
447
|
this.metadata = completed.metadata;
|
|
411
448
|
this.usage = completed.usage;
|
|
412
449
|
this.run = completed.run;
|
|
450
|
+
const executionWorkspace = await this.args.driver.verificationWorkspace?.();
|
|
451
|
+
if (executionWorkspace) bindRunExecutionWorkspace(this.run, executionWorkspace);
|
|
413
452
|
await writeFrozenCase(this.runDir.path, this.args.authoredCase, this.args.casePath);
|
|
414
453
|
await this.runDir.writeJson("run.json", completed.metadata);
|
|
415
454
|
await this.runDir.writeJson("artifacts.json", this.collection.artifacts);
|
|
@@ -430,6 +469,7 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
430
469
|
grading.assertions.flatMap((assertion) => (assertion.usage ? [assertion.usage] : [])),
|
|
431
470
|
);
|
|
432
471
|
metadata.phaseDurationMs = phaseDurations(this.runDir.recorded);
|
|
472
|
+
metadata.actionTiming = actionTiming(this.runDir.recorded);
|
|
433
473
|
await this.runDir.events.drain();
|
|
434
474
|
await this.runDir.writeJson("run.json", metadata);
|
|
435
475
|
await this.runDir.writeJson("artifacts.json", this.collection.artifacts);
|
|
@@ -438,6 +478,12 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
438
478
|
}
|
|
439
479
|
|
|
440
480
|
async close(primaryError: unknown | null): Promise<void> {
|
|
481
|
+
if (this.workspace) {
|
|
482
|
+
await closeQuietly(async () => {
|
|
483
|
+
await this.args.driver.close();
|
|
484
|
+
await this.workspace?.archive(this.runDir.artifactsDir);
|
|
485
|
+
}, `run workspace ${this.workspace.path}`);
|
|
486
|
+
}
|
|
441
487
|
if (primaryError instanceof Error) {
|
|
442
488
|
(primaryError as Error & RunDirCarrier).luxRunDir = this.runDir.path;
|
|
443
489
|
}
|
|
@@ -506,6 +552,7 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
506
552
|
private fallbackFailureMetadata(): RunMetadata {
|
|
507
553
|
const failedAt = new Date();
|
|
508
554
|
const answererAccounting = readAnswererModelAccounting(this.args.answerer);
|
|
555
|
+
const ready = this.ready ?? { agentId: "start-failed" };
|
|
509
556
|
return {
|
|
510
557
|
schemaVersion: 1,
|
|
511
558
|
luxVersion: this.args.luxVersion,
|
|
@@ -514,8 +561,9 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
514
561
|
agentEndedAt: failedAt.toISOString(),
|
|
515
562
|
endedAt: failedAt.toISOString(),
|
|
516
563
|
exitReason: "error",
|
|
517
|
-
driver: { name: this.args.driverName, ...
|
|
564
|
+
driver: { name: this.args.driverName, ...ready },
|
|
518
565
|
answerer: answererMetadata(this.args.answererName, this.args.answererConfig),
|
|
566
|
+
agentUsageAvailability: "unavailable",
|
|
519
567
|
usage: {
|
|
520
568
|
agent: emptyUsage(),
|
|
521
569
|
answerer: readAnswererUsage(this.args.answerer),
|
|
@@ -530,6 +578,7 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
530
578
|
interruptCounts: this.interruptCounts,
|
|
531
579
|
toolCallCount: this.toolCallCount,
|
|
532
580
|
toolOutcomes: summarizeToolOutcomes(this.runDir.recorded),
|
|
581
|
+
agentActivity: summarizeAgentActivity(this.runDir.recorded, ready),
|
|
533
582
|
artifacts: { count: this.collection.artifacts.length },
|
|
534
583
|
provenance: this.runProvenance(),
|
|
535
584
|
};
|
|
@@ -539,7 +588,16 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
539
588
|
if (!this.ready) return { artifacts: [] };
|
|
540
589
|
try {
|
|
541
590
|
await this.args.driver.quiesce?.();
|
|
542
|
-
|
|
591
|
+
const artifacts = await this.args.driver.collect();
|
|
592
|
+
const archived =
|
|
593
|
+
(await this.workspace?.archive(this.runDir.artifactsDir, artifacts)) ?? artifacts;
|
|
594
|
+
return {
|
|
595
|
+
artifacts: await identifyArtifactOrigins(
|
|
596
|
+
this.runDir.path,
|
|
597
|
+
archived,
|
|
598
|
+
this.fixtureFileHashes,
|
|
599
|
+
),
|
|
600
|
+
};
|
|
543
601
|
} catch (error) {
|
|
544
602
|
const reason = errorMessage(error);
|
|
545
603
|
this.runDir.events.append({
|
|
@@ -560,17 +618,20 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
560
618
|
const outcome = this.require(this.loopOutcome, "driver outcome");
|
|
561
619
|
const agentEndedAt = new Date();
|
|
562
620
|
const exitReason = agentExitReason(outcome, this.collection.error);
|
|
563
|
-
const summary = outcome.kind === "done" ? outcome.done.summary :
|
|
621
|
+
const summary = outcome.kind === "done" ? outcome.done.summary : outcome.error.summary;
|
|
564
622
|
const driverCost = costFromSummary(summary);
|
|
565
623
|
const reportedModelAccounting = modelAccountingFromSummary(summary);
|
|
624
|
+
const driverMetrics = metricsFromSummary(summary);
|
|
566
625
|
const answererAccounting = readAnswererModelAccounting(this.args.answerer);
|
|
567
626
|
const agentCalls = this.ready ? (reportedModelAccounting?.modelCalls ?? 1) : 0;
|
|
568
627
|
const operationalFailure = loopFailure(outcome, this.collection.error);
|
|
628
|
+
const agentUsage = usageFromSummary(summary);
|
|
569
629
|
const usage: RunUsage = {
|
|
570
|
-
agent:
|
|
630
|
+
agent: agentUsage ?? emptyUsage(),
|
|
571
631
|
answerer: readAnswererUsage(this.args.answerer),
|
|
572
632
|
grading: emptyUsage(),
|
|
573
633
|
};
|
|
634
|
+
const ready = this.ready ?? { agentId: "not-started" };
|
|
574
635
|
const metadata: RunMetadata = {
|
|
575
636
|
schemaVersion: 1,
|
|
576
637
|
luxVersion: this.args.luxVersion,
|
|
@@ -579,9 +640,10 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
579
640
|
agentEndedAt: agentEndedAt.toISOString(),
|
|
580
641
|
endedAt: agentEndedAt.toISOString(),
|
|
581
642
|
exitReason,
|
|
582
|
-
driver: { name: this.args.driverName, ...
|
|
643
|
+
driver: { name: this.args.driverName, ...ready },
|
|
583
644
|
answerer: answererMetadata(this.args.answererName, this.args.answererConfig),
|
|
584
645
|
usage,
|
|
646
|
+
agentUsageAvailability: agentUsage === null ? "unavailable" : "reported",
|
|
585
647
|
modelAccounting: {
|
|
586
648
|
agentCalls,
|
|
587
649
|
answererCalls: answererAccounting.calls,
|
|
@@ -593,10 +655,12 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
593
655
|
interruptCounts: this.interruptCounts,
|
|
594
656
|
toolCallCount: this.toolCallCount,
|
|
595
657
|
toolOutcomes: summarizeToolOutcomes(this.runDir.recorded),
|
|
658
|
+
agentActivity: summarizeAgentActivity(this.runDir.recorded, ready),
|
|
596
659
|
artifacts: await artifactMeasurements(this.collection.artifacts, this.runDir.path),
|
|
597
660
|
...(operationalFailure ? { operationalFailure } : {}),
|
|
598
661
|
provenance: this.runProvenance(),
|
|
599
662
|
...(driverCost !== undefined ? { cost: { usd: driverCost } } : {}),
|
|
663
|
+
...(Object.keys(driverMetrics).length > 0 ? { driverMetrics } : {}),
|
|
600
664
|
};
|
|
601
665
|
return {
|
|
602
666
|
metadata,
|
|
@@ -621,6 +685,7 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
621
685
|
...(this.fixturesHash ? { fixturesHash: this.fixturesHash } : {}),
|
|
622
686
|
...(request.subjectHash ? { subjectHash: request.subjectHash } : {}),
|
|
623
687
|
...(request.profileId ? { profileId: request.profileId } : {}),
|
|
688
|
+
...(this.args.permutationId ? { permutationId: this.args.permutationId } : {}),
|
|
624
689
|
...(request.experimentId ? { experimentId: request.experimentId } : {}),
|
|
625
690
|
...(request.variantId ? { variantId: request.variantId } : {}),
|
|
626
691
|
...(request.candidateId ? { candidateId: request.candidateId } : {}),
|
|
@@ -657,6 +722,7 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
657
722
|
request.recordGradingAssertion,
|
|
658
723
|
modelAttempts,
|
|
659
724
|
this.args.validatedAssertionConfigs,
|
|
725
|
+
request.skipJudge ?? false,
|
|
660
726
|
);
|
|
661
727
|
}
|
|
662
728
|
|
|
@@ -23,6 +23,7 @@ type RunLifecycleContext = {
|
|
|
23
23
|
phase: RunFailurePhase;
|
|
24
24
|
result: unknown;
|
|
25
25
|
error: unknown;
|
|
26
|
+
failed: boolean;
|
|
26
27
|
};
|
|
27
28
|
type RunLifecycleInput = { effects: ErasedEffects };
|
|
28
29
|
type RunLifecycleOutcome =
|
|
@@ -56,7 +57,7 @@ const runLifecycleMachine = setup({
|
|
|
56
57
|
actions: {
|
|
57
58
|
captureError: assign(({ context, event }) => {
|
|
58
59
|
const error = "error" in event ? event.error : new Error("run lifecycle failed");
|
|
59
|
-
return { error, phase: isRunTraceLimit(error) ? "trace" : context.phase };
|
|
60
|
+
return { error, failed: true, phase: isRunTraceLimit(error) ? "trace" : context.phase };
|
|
60
61
|
}),
|
|
61
62
|
captureResult: assign({
|
|
62
63
|
result: ({ event }) => ("output" in event ? event.output : undefined),
|
|
@@ -73,6 +74,7 @@ const runLifecycleMachine = setup({
|
|
|
73
74
|
phase: "setup",
|
|
74
75
|
result: undefined,
|
|
75
76
|
error: undefined,
|
|
77
|
+
failed: false,
|
|
76
78
|
}),
|
|
77
79
|
initial: "preparing",
|
|
78
80
|
states: {
|
|
@@ -153,7 +155,7 @@ const runLifecycleMachine = setup({
|
|
|
153
155
|
failed: { type: "final" },
|
|
154
156
|
},
|
|
155
157
|
output: ({ context }) => {
|
|
156
|
-
if (context.
|
|
158
|
+
if (context.failed) {
|
|
157
159
|
return { status: "failed", error: context.error };
|
|
158
160
|
}
|
|
159
161
|
return { status: "succeeded", result: context.result };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { cp, lstat, mkdir, mkdtemp, realpath, rename, rm, rmdir } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import type { Artifact } from "../core/index.js";
|
|
5
|
+
|
|
6
|
+
/** Keep package-manager discovery and repository ignore rules outside subject workspaces. */
|
|
7
|
+
export class RunWorkspace {
|
|
8
|
+
private archived = false;
|
|
9
|
+
readonly path: string;
|
|
10
|
+
|
|
11
|
+
private constructor(path: string) {
|
|
12
|
+
this.path = path;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static async create(): Promise<RunWorkspace> {
|
|
16
|
+
const root = join(tmpdir(), `lux-workspaces-${process.getuid?.() ?? "user"}`);
|
|
17
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
18
|
+
const metadata = await lstat(root);
|
|
19
|
+
if (
|
|
20
|
+
!metadata.isDirectory() ||
|
|
21
|
+
metadata.isSymbolicLink() ||
|
|
22
|
+
(process.getuid && metadata.uid !== process.getuid())
|
|
23
|
+
) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
`Lux workspace root must be a real directory owned by the current user: ${root}`,
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
return new RunWorkspace(await realpath(await mkdtemp(join(root, "run-"))));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async archive(destination: string, artifacts: Artifact[] = []): Promise<Artifact[]> {
|
|
32
|
+
if (!this.archived) {
|
|
33
|
+
const metadata = await lstat(this.path);
|
|
34
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink()) {
|
|
35
|
+
throw new Error(`run workspace must remain a real directory: ${this.path}`);
|
|
36
|
+
}
|
|
37
|
+
await rmdir(destination).catch((error: NodeJS.ErrnoException) => {
|
|
38
|
+
if (error.code !== "ENOENT") throw error;
|
|
39
|
+
});
|
|
40
|
+
try {
|
|
41
|
+
await rename(this.path, destination);
|
|
42
|
+
} catch (error) {
|
|
43
|
+
if ((error as NodeJS.ErrnoException).code !== "EXDEV") throw error;
|
|
44
|
+
await cp(this.path, destination, { recursive: true, verbatimSymlinks: true });
|
|
45
|
+
await rm(this.path, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
this.archived = true;
|
|
48
|
+
}
|
|
49
|
+
return artifacts.map((artifact) => {
|
|
50
|
+
if (!artifact.root) return artifact;
|
|
51
|
+
const path = relative(this.path, resolve(artifact.root));
|
|
52
|
+
if (path === "") {
|
|
53
|
+
const { root: _root, ...captured } = artifact;
|
|
54
|
+
return captured;
|
|
55
|
+
}
|
|
56
|
+
if (path === ".." || path.startsWith(`..${sep}`) || isAbsolute(path)) {
|
|
57
|
+
return artifact;
|
|
58
|
+
}
|
|
59
|
+
return { ...artifact, root: join(destination, path) };
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
MetricSummarySchema,
|
|
6
6
|
type SuiteSample,
|
|
7
7
|
type SuiteSummary,
|
|
8
|
+
suiteGroupKey,
|
|
8
9
|
summarizeNumbers,
|
|
9
10
|
} from "./suite-summary.js";
|
|
10
11
|
|
|
@@ -18,6 +19,7 @@ const ComparedOutcomeSchema = z
|
|
|
18
19
|
export const SuiteCaseComparisonSchema = z
|
|
19
20
|
.object({
|
|
20
21
|
canonicalCaseId: z.string(),
|
|
22
|
+
permutationId: z.exactOptional(z.string()),
|
|
21
23
|
before: ComparedOutcomeSchema.nullable(),
|
|
22
24
|
after: ComparedOutcomeSchema.nullable(),
|
|
23
25
|
passRateDelta: z.number().nullable(),
|
|
@@ -40,6 +42,7 @@ export const SuiteComparisonSchema = z
|
|
|
40
42
|
z
|
|
41
43
|
.object({
|
|
42
44
|
canonicalCaseId: z.string(),
|
|
45
|
+
permutationId: z.exactOptional(z.string()),
|
|
43
46
|
repetition: z.number().int().positive(),
|
|
44
47
|
before: z.string().nullable(),
|
|
45
48
|
after: z.string().nullable(),
|
|
@@ -54,9 +57,10 @@ export type SuiteComparison = z.infer<typeof SuiteComparisonSchema>;
|
|
|
54
57
|
const samplesByCase = (summary: SuiteSummary): Map<string, SuiteSample[]> => {
|
|
55
58
|
const out = new Map<string, SuiteSample[]>();
|
|
56
59
|
for (const sample of summary.samples) {
|
|
57
|
-
const
|
|
60
|
+
const key = suiteGroupKey(sample);
|
|
61
|
+
const entries = out.get(key) ?? [];
|
|
58
62
|
entries.push(sample);
|
|
59
|
-
out.set(
|
|
63
|
+
out.set(key, entries);
|
|
60
64
|
}
|
|
61
65
|
return out;
|
|
62
66
|
};
|
|
@@ -95,14 +99,23 @@ export const compareSuiteSummaries = (
|
|
|
95
99
|
options: { passRateTolerance?: number } = {},
|
|
96
100
|
): SuiteComparison => {
|
|
97
101
|
const passRateTolerance = options.passRateTolerance ?? 0;
|
|
98
|
-
const aCases = new Map(a.cases.map((entry) => [entry
|
|
99
|
-
const bCases = new Map(b.cases.map((entry) => [entry
|
|
102
|
+
const aCases = new Map(a.cases.map((entry) => [suiteGroupKey(entry), entry]));
|
|
103
|
+
const bCases = new Map(b.cases.map((entry) => [suiteGroupKey(entry), entry]));
|
|
100
104
|
const aSamples = samplesByCase(a);
|
|
101
105
|
const bSamples = samplesByCase(b);
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
const groups = new Map(
|
|
107
|
+
[...a.cases, ...b.cases].map((entry) => [
|
|
108
|
+
suiteGroupKey(entry),
|
|
109
|
+
{
|
|
110
|
+
canonicalCaseId: entry.canonicalCaseId,
|
|
111
|
+
...(entry.permutationId ? { permutationId: entry.permutationId } : {}),
|
|
112
|
+
},
|
|
113
|
+
]),
|
|
114
|
+
);
|
|
115
|
+
const keys = [...groups.keys()].sort();
|
|
116
|
+
const identityMismatches = keys.flatMap((key) => {
|
|
117
|
+
const before = aSamples.get(key) ?? [];
|
|
118
|
+
const after = bSamples.get(key) ?? [];
|
|
106
119
|
return Array.from({ length: Math.max(before.length, after.length) }, (_, index) => {
|
|
107
120
|
const beforeHash = before[index]?.identityHash ?? null;
|
|
108
121
|
const afterHash = after[index]?.identityHash ?? null;
|
|
@@ -110,7 +123,7 @@ export const compareSuiteSummaries = (
|
|
|
110
123
|
? []
|
|
111
124
|
: [
|
|
112
125
|
{
|
|
113
|
-
|
|
126
|
+
...groups.get(key),
|
|
114
127
|
repetition: index + 1,
|
|
115
128
|
before: beforeHash,
|
|
116
129
|
after: afterHash,
|
|
@@ -118,9 +131,9 @@ export const compareSuiteSummaries = (
|
|
|
118
131
|
];
|
|
119
132
|
}).flat();
|
|
120
133
|
});
|
|
121
|
-
const cases =
|
|
122
|
-
const before = aCases.get(
|
|
123
|
-
const after = bCases.get(
|
|
134
|
+
const cases = keys.map((key) => {
|
|
135
|
+
const before = aCases.get(key);
|
|
136
|
+
const after = bCases.get(key);
|
|
124
137
|
let passRateDelta: number | null = null;
|
|
125
138
|
if (before && after) {
|
|
126
139
|
passRateDelta = after.passRate - before.passRate;
|
|
@@ -128,16 +141,13 @@ export const compareSuiteSummaries = (
|
|
|
128
141
|
passRateDelta = -before.passRate;
|
|
129
142
|
}
|
|
130
143
|
return {
|
|
131
|
-
|
|
144
|
+
...groups.get(key),
|
|
132
145
|
before: before ? { attempts: before.attempts, passRate: before.passRate } : null,
|
|
133
146
|
after: after ? { attempts: after.attempts, passRate: after.passRate } : null,
|
|
134
147
|
passRateDelta,
|
|
135
148
|
regressed:
|
|
136
149
|
Boolean(before) && (!after || after.passRate + passRateTolerance < (before?.passRate ?? 0)),
|
|
137
|
-
pairedMetricDeltas: pairedMetricDeltas(
|
|
138
|
-
aSamples.get(canonicalCaseId) ?? [],
|
|
139
|
-
bSamples.get(canonicalCaseId) ?? [],
|
|
140
|
-
),
|
|
150
|
+
pairedMetricDeltas: pairedMetricDeltas(aSamples.get(key) ?? [], bSamples.get(key) ?? []),
|
|
141
151
|
};
|
|
142
152
|
});
|
|
143
153
|
return SuiteComparisonSchema.parse({
|
|
@@ -182,13 +192,13 @@ export const formatSuiteComparisonText = (comparison: SuiteComparison): string =
|
|
|
182
192
|
if (comparison.identityMismatches.length > 0) {
|
|
183
193
|
lines.push(` identity mismatches: ${comparison.identityMismatches.length}`);
|
|
184
194
|
for (const mismatch of comparison.identityMismatches) {
|
|
185
|
-
lines.push(` ! ${mismatch
|
|
195
|
+
lines.push(` ! ${suiteGroupKey(mismatch)} repetition ${mismatch.repetition}`);
|
|
186
196
|
}
|
|
187
197
|
}
|
|
188
198
|
for (const entry of comparison.cases) {
|
|
189
199
|
if (!entry.regressed) continue;
|
|
190
200
|
lines.push(
|
|
191
|
-
` ↓ ${entry
|
|
201
|
+
` ↓ ${suiteGroupKey(entry)}: ${entry.before ? percent(entry.before.passRate) : "—"} → ${entry.after ? percent(entry.after.passRate) : "missing"}`,
|
|
192
202
|
);
|
|
193
203
|
}
|
|
194
204
|
return lines.join("\n");
|
|
@@ -10,6 +10,7 @@ const SUITE_FILE = "suite.json";
|
|
|
10
10
|
const SuiteItemSchema = z.object({
|
|
11
11
|
caseId: z.string(),
|
|
12
12
|
canonicalCaseId: z.string(),
|
|
13
|
+
permutationId: z.exactOptional(z.string()),
|
|
13
14
|
status: z.enum(["pending", "running", "completed"]),
|
|
14
15
|
runDir: z.string().nullable(),
|
|
15
16
|
exitReason: z.union([z.literal("done"), z.string()]).nullable(),
|
|
@@ -64,7 +65,7 @@ export type OpenedSuiteRun = {
|
|
|
64
65
|
export const openSuiteRun = async (options: {
|
|
65
66
|
runsRoot: string;
|
|
66
67
|
concurrency: number;
|
|
67
|
-
items: { id: string; caseId?: string | undefined }[];
|
|
68
|
+
items: { id: string; caseId?: string | undefined; permutationId?: string | undefined }[];
|
|
68
69
|
startedAt?: Date | undefined;
|
|
69
70
|
profileId?: string | undefined;
|
|
70
71
|
experimentId?: string | undefined;
|
|
@@ -110,6 +111,7 @@ export const openSuiteRun = async (options: {
|
|
|
110
111
|
items: options.items.map((item) => ({
|
|
111
112
|
caseId: item.id,
|
|
112
113
|
canonicalCaseId: item.caseId ?? item.id,
|
|
114
|
+
...(item.permutationId ? { permutationId: item.permutationId } : {}),
|
|
113
115
|
status: "pending",
|
|
114
116
|
runDir: null,
|
|
115
117
|
exitReason: null,
|
|
@@ -126,6 +128,7 @@ export const loadSuiteRun = async (path: string): Promise<SuiteRun | null> =>
|
|
|
126
128
|
|
|
127
129
|
export const listSuiteRuns = async (
|
|
128
130
|
runsRoot: string,
|
|
131
|
+
options: { onReadError?: (path: string, error: unknown) => void } = {},
|
|
129
132
|
): Promise<Array<SuiteRun & { suiteDir: string }>> => {
|
|
130
133
|
const root = join(runsRoot, SUITES_DIR);
|
|
131
134
|
if (!existsSync(root)) return [];
|
|
@@ -133,7 +136,15 @@ export const listSuiteRuns = async (
|
|
|
133
136
|
.filter((entry) => entry.isDirectory())
|
|
134
137
|
.map((entry) => join(root, entry.name));
|
|
135
138
|
const manifests = await Promise.all(
|
|
136
|
-
dirs.map(async (suiteDir) =>
|
|
139
|
+
dirs.map(async (suiteDir) => {
|
|
140
|
+
try {
|
|
141
|
+
return { suiteDir, suite: await loadSuiteRun(suiteDir) };
|
|
142
|
+
} catch (error) {
|
|
143
|
+
if (!options.onReadError) throw error;
|
|
144
|
+
options.onReadError(suiteDir, error);
|
|
145
|
+
return { suiteDir, suite: null };
|
|
146
|
+
}
|
|
147
|
+
}),
|
|
137
148
|
);
|
|
138
149
|
return manifests
|
|
139
150
|
.flatMap(({ suiteDir, suite }) => (suite ? [{ ...suite, suiteDir }] : []))
|