@prismatic-io/lux 0.0.2-preview.4 → 0.0.2-preview.41
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 +65 -34
- package/lib/answerers/persona/index.js.map +1 -1
- package/lib/answerers/terminal/index.d.ts +9 -3
- package/lib/answerers/terminal/index.d.ts.map +1 -1
- package/lib/answerers/terminal/index.js +6 -4
- package/lib/answerers/terminal/index.js.map +1 -1
- package/lib/assertions/authoring.d.ts +2 -2
- package/lib/assertions/authoring.d.ts.map +1 -1
- package/lib/assertions/authoring.js.map +1 -1
- package/lib/assertions/core/command-exits-zero.d.ts +5 -2
- package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
- package/lib/assertions/core/command-exits-zero.js +59 -14
- package/lib/assertions/core/command-exits-zero.js.map +1 -1
- package/lib/assertions/core/event-checks.d.ts +3 -0
- package/lib/assertions/core/event-checks.d.ts.map +1 -1
- package/lib/assertions/core/event-checks.js +49 -3
- package/lib/assertions/core/event-checks.js.map +1 -1
- package/lib/assertions/core/file-checks.d.ts +6 -0
- package/lib/assertions/core/file-checks.d.ts.map +1 -1
- package/lib/assertions/core/index.d.ts.map +1 -1
- package/lib/assertions/core/index.js +2 -1
- package/lib/assertions/core/index.js.map +1 -1
- package/lib/assertions/core/json-pointer-equals.d.ts +1 -0
- package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -1
- package/lib/assertions/core/output-checks.d.ts +3 -0
- package/lib/assertions/core/output-checks.d.ts.map +1 -1
- package/lib/assertions/core/predicate.d.ts +1 -0
- package/lib/assertions/core/predicate.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.d.ts +25 -0
- package/lib/assertions/core/resource-checks.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.js +35 -5
- package/lib/assertions/core/resource-checks.js.map +1 -1
- package/lib/assertions/core/safe-regex.d.ts.map +1 -1
- package/lib/assertions/core/safe-regex.js +7 -1
- package/lib/assertions/core/safe-regex.js.map +1 -1
- package/lib/assertions/rubric/evidence.d.ts +88 -0
- package/lib/assertions/rubric/evidence.d.ts.map +1 -0
- package/lib/assertions/rubric/evidence.js +75 -0
- package/lib/assertions/rubric/evidence.js.map +1 -0
- package/lib/assertions/rubric/index.d.ts +88 -34
- package/lib/assertions/rubric/index.d.ts.map +1 -1
- package/lib/assertions/rubric/index.js +67 -43
- package/lib/assertions/rubric/index.js.map +1 -1
- package/lib/assertions/rubric/internal.d.ts +30 -5
- package/lib/assertions/rubric/internal.d.ts.map +1 -1
- package/lib/assertions/rubric/internal.js +211 -46
- package/lib/assertions/rubric/internal.js.map +1 -1
- package/lib/authoring.d.ts +37 -2
- package/lib/authoring.d.ts.map +1 -1
- package/lib/authoring.js +36 -1
- package/lib/authoring.js.map +1 -1
- package/lib/cli/bin.js +2 -13
- package/lib/cli/bin.js.map +1 -1
- package/lib/cli/command-runtime.d.ts +3 -3
- package/lib/cli/command-runtime.d.ts.map +1 -1
- package/lib/cli/command-runtime.js +17 -6
- package/lib/cli/command-runtime.js.map +1 -1
- package/lib/cli/doctor.d.ts +55 -0
- package/lib/cli/doctor.d.ts.map +1 -0
- package/lib/cli/doctor.js +14 -0
- package/lib/cli/doctor.js.map +1 -0
- package/lib/cli/harness-plan.d.ts +27 -0
- package/lib/cli/harness-plan.d.ts.map +1 -0
- package/lib/cli/harness-plan.js +75 -0
- package/lib/cli/harness-plan.js.map +1 -0
- package/lib/cli/init-templates.d.ts +11 -0
- package/lib/cli/init-templates.d.ts.map +1 -0
- package/lib/cli/init-templates.js +153 -0
- package/lib/cli/init-templates.js.map +1 -0
- package/lib/cli/init.d.ts +10 -0
- package/lib/cli/init.d.ts.map +1 -1
- package/lib/cli/init.js +34 -173
- package/lib/cli/init.js.map +1 -1
- package/lib/cli/output-schemas.d.ts +1412 -0
- package/lib/cli/output-schemas.d.ts.map +1 -0
- package/lib/cli/output-schemas.js +94 -0
- package/lib/cli/output-schemas.js.map +1 -0
- package/lib/cli/program.d.ts +140 -12
- package/lib/cli/program.d.ts.map +1 -1
- package/lib/cli/program.js +783 -650
- package/lib/cli/program.js.map +1 -1
- package/lib/cli/render/format.d.ts.map +1 -1
- package/lib/cli/render/format.js +1 -1
- package/lib/cli/render/format.js.map +1 -1
- package/lib/cli/render/reporter.d.ts.map +1 -1
- package/lib/cli/render/reporter.js +35 -8
- package/lib/cli/render/reporter.js.map +1 -1
- package/lib/cli/run-options.d.ts +19 -4
- package/lib/cli/run-options.d.ts.map +1 -1
- package/lib/cli/run-options.js +100 -19
- package/lib/cli/run-options.js.map +1 -1
- package/lib/cli/view.d.ts +15 -0
- package/lib/cli/view.d.ts.map +1 -0
- package/lib/cli/view.js +168 -0
- package/lib/cli/view.js.map +1 -0
- package/lib/container/driver.d.ts +27 -0
- package/lib/container/driver.d.ts.map +1 -0
- package/lib/container/driver.js +199 -0
- package/lib/container/driver.js.map +1 -0
- package/lib/container/paths.d.ts +3 -0
- package/lib/container/paths.d.ts.map +1 -0
- package/lib/container/paths.js +27 -0
- package/lib/container/paths.js.map +1 -0
- package/lib/container/protocol.d.ts +12 -0
- package/lib/container/protocol.d.ts.map +1 -0
- package/lib/container/protocol.js +38 -0
- package/lib/container/protocol.js.map +1 -0
- package/lib/container/resources.d.ts +14 -0
- package/lib/container/resources.d.ts.map +1 -0
- package/lib/container/resources.js +141 -0
- package/lib/container/resources.js.map +1 -0
- package/lib/container/worker.d.ts +2 -0
- package/lib/container/worker.d.ts.map +1 -0
- package/lib/container/worker.js +85 -0
- package/lib/container/worker.js.map +1 -0
- package/lib/core/action-events.d.ts +29 -0
- package/lib/core/action-events.d.ts.map +1 -0
- package/lib/core/action-events.js +51 -0
- package/lib/core/action-events.js.map +1 -0
- package/lib/core/agent-activity.d.ts +49 -0
- package/lib/core/agent-activity.d.ts.map +1 -0
- package/lib/core/agent-activity.js +206 -0
- package/lib/core/agent-activity.js.map +1 -0
- package/lib/core/agent-environment.d.ts +5 -0
- package/lib/core/agent-environment.d.ts.map +1 -0
- package/lib/core/agent-environment.js +47 -0
- package/lib/core/agent-environment.js.map +1 -0
- package/lib/core/agent-events.d.ts +26 -0
- package/lib/core/agent-events.d.ts.map +1 -0
- package/lib/core/agent-events.js +13 -0
- package/lib/core/agent-events.js.map +1 -0
- package/lib/core/annotation.d.ts +6 -2
- package/lib/core/annotation.d.ts.map +1 -1
- package/lib/core/annotation.js +2 -1
- package/lib/core/annotation.js.map +1 -1
- package/lib/core/answerer.d.ts +12 -0
- package/lib/core/answerer.d.ts.map +1 -1
- package/lib/core/answerer.js +2 -0
- package/lib/core/answerer.js.map +1 -1
- package/lib/core/artifact-evidence.d.ts +6 -1
- package/lib/core/artifact-evidence.d.ts.map +1 -1
- package/lib/core/artifact-evidence.js +27 -6
- package/lib/core/artifact-evidence.js.map +1 -1
- package/lib/core/assertion.d.ts +10 -4
- package/lib/core/assertion.d.ts.map +1 -1
- package/lib/core/assertion.js +8 -2
- package/lib/core/assertion.js.map +1 -1
- package/lib/core/case-defaults.d.ts +16 -0
- package/lib/core/case-defaults.d.ts.map +1 -0
- package/lib/core/case-defaults.js +42 -0
- package/lib/core/case-defaults.js.map +1 -0
- package/lib/core/case.d.ts +120 -6
- package/lib/core/case.d.ts.map +1 -1
- package/lib/core/case.js +51 -5
- package/lib/core/case.js.map +1 -1
- package/lib/core/command-verification.d.ts +10 -0
- package/lib/core/command-verification.d.ts.map +1 -0
- package/lib/core/command-verification.js +66 -0
- package/lib/core/command-verification.js.map +1 -0
- package/lib/core/driver-execution.d.ts +83 -0
- package/lib/core/driver-execution.d.ts.map +1 -0
- package/lib/core/driver-execution.js +72 -0
- package/lib/core/driver-execution.js.map +1 -0
- package/lib/core/driver-metrics.d.ts +98 -0
- package/lib/core/driver-metrics.d.ts.map +1 -0
- package/lib/core/driver-metrics.js +36 -0
- package/lib/core/driver-metrics.js.map +1 -0
- package/lib/core/driver.d.ts +64 -0
- package/lib/core/driver.d.ts.map +1 -1
- package/lib/core/driver.js +28 -0
- package/lib/core/driver.js.map +1 -1
- package/lib/core/duration.d.ts +5 -0
- package/lib/core/duration.d.ts.map +1 -0
- package/lib/core/duration.js +49 -0
- package/lib/core/duration.js.map +1 -0
- package/lib/core/environment.d.ts +18 -0
- package/lib/core/environment.d.ts.map +1 -0
- package/lib/core/environment.js +21 -0
- package/lib/core/environment.js.map +1 -0
- package/lib/core/evaluation-clusters.d.ts +17 -0
- package/lib/core/evaluation-clusters.d.ts.map +1 -0
- package/lib/core/evaluation-clusters.js +23 -0
- package/lib/core/evaluation-clusters.js.map +1 -0
- package/lib/core/events.d.ts +34 -0
- package/lib/core/events.d.ts.map +1 -1
- package/lib/core/events.js +11 -2
- package/lib/core/events.js.map +1 -1
- package/lib/core/experiment.d.ts +33 -2
- package/lib/core/experiment.d.ts.map +1 -1
- package/lib/core/experiment.js +40 -19
- package/lib/core/experiment.js.map +1 -1
- package/lib/core/file-tree.d.ts +7 -0
- package/lib/core/file-tree.d.ts.map +1 -0
- package/lib/core/file-tree.js +35 -0
- package/lib/core/file-tree.js.map +1 -0
- package/lib/core/global-id.d.ts +6 -0
- package/lib/core/global-id.d.ts.map +1 -0
- package/lib/core/global-id.js +17 -0
- package/lib/core/global-id.js.map +1 -0
- package/lib/core/harness-catalog.d.ts +35 -0
- package/lib/core/harness-catalog.d.ts.map +1 -0
- package/lib/core/harness-catalog.js +45 -0
- package/lib/core/harness-catalog.js.map +1 -0
- package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
- package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
- package/lib/core/harness-catalogs/antigravity.js +23 -0
- package/lib/core/harness-catalogs/antigravity.js.map +1 -0
- package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
- package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
- package/lib/core/harness-catalogs/claude-code.js +24 -0
- package/lib/core/harness-catalogs/claude-code.js.map +1 -0
- package/lib/core/harness-catalogs/codex.d.ts +11 -0
- package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
- package/lib/core/harness-catalogs/codex.js +26 -0
- package/lib/core/harness-catalogs/codex.js.map +1 -0
- package/lib/core/harness-catalogs/copilot.d.ts +29 -0
- package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
- package/lib/core/harness-catalogs/copilot.js +45 -0
- package/lib/core/harness-catalogs/copilot.js.map +1 -0
- package/lib/core/harness-catalogs/cursor.d.ts +2 -0
- package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
- package/lib/core/harness-catalogs/cursor.js +13 -0
- package/lib/core/harness-catalogs/cursor.js.map +1 -0
- package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
- package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
- package/lib/core/harness-catalogs/grok-build.js +18 -0
- package/lib/core/harness-catalogs/grok-build.js.map +1 -0
- package/lib/core/harness-catalogs/index.d.ts +73 -0
- package/lib/core/harness-catalogs/index.d.ts.map +1 -0
- package/lib/core/harness-catalogs/index.js +17 -0
- package/lib/core/harness-catalogs/index.js.map +1 -0
- package/lib/core/harness-matrix.d.ts +154 -0
- package/lib/core/harness-matrix.d.ts.map +1 -0
- package/lib/core/harness-matrix.js +204 -0
- package/lib/core/harness-matrix.js.map +1 -0
- package/lib/core/index.d.ts +12 -0
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +12 -0
- package/lib/core/index.js.map +1 -1
- package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
- package/lib/core/lifecycle-fixtures.js +4 -2
- package/lib/core/lifecycle-fixtures.js.map +1 -1
- package/lib/core/model-cli.d.ts +31 -15
- package/lib/core/model-cli.d.ts.map +1 -1
- package/lib/core/model-cli.js +53 -23
- package/lib/core/model-cli.js.map +1 -1
- package/lib/core/platform-process.d.ts +7 -2
- package/lib/core/platform-process.d.ts.map +1 -1
- package/lib/core/platform-process.js +54 -16
- package/lib/core/platform-process.js.map +1 -1
- package/lib/core/reference-defaults.d.ts +5 -0
- package/lib/core/reference-defaults.d.ts.map +1 -0
- package/lib/core/reference-defaults.js +42 -0
- package/lib/core/reference-defaults.js.map +1 -0
- package/lib/core/rubric.d.ts +1 -0
- package/lib/core/rubric.d.ts.map +1 -1
- package/lib/core/run.d.ts +292 -1
- package/lib/core/run.d.ts.map +1 -1
- package/lib/core/run.js +27 -0
- package/lib/core/run.js.map +1 -1
- package/lib/core/secure-copy.d.ts.map +1 -0
- package/lib/core/secure-copy.js.map +1 -0
- package/lib/core/usage.d.ts +5 -0
- package/lib/core/usage.d.ts.map +1 -1
- package/lib/core/usage.js +3 -0
- package/lib/core/usage.js.map +1 -1
- package/lib/core/wire.d.ts +11 -0
- package/lib/core/wire.d.ts.map +1 -1
- package/lib/drivers/antigravity/artifacts.d.ts +2 -0
- package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
- package/lib/drivers/antigravity/artifacts.js +33 -0
- package/lib/drivers/antigravity/artifacts.js.map +1 -0
- package/lib/drivers/antigravity/config.d.ts +88 -0
- package/lib/drivers/antigravity/config.d.ts.map +1 -0
- package/lib/drivers/antigravity/config.js +87 -0
- package/lib/drivers/antigravity/config.js.map +1 -0
- package/lib/drivers/antigravity/events.d.ts +4 -0
- package/lib/drivers/antigravity/events.d.ts.map +1 -0
- package/lib/drivers/antigravity/events.js +241 -0
- package/lib/drivers/antigravity/events.js.map +1 -0
- package/lib/drivers/antigravity/index.d.ts +114 -0
- package/lib/drivers/antigravity/index.d.ts.map +1 -0
- package/lib/drivers/antigravity/index.js +113 -0
- package/lib/drivers/antigravity/index.js.map +1 -0
- package/lib/drivers/antigravity/runtime.d.ts +7 -0
- package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
- package/lib/drivers/antigravity/runtime.js +83 -0
- package/lib/drivers/antigravity/runtime.js.map +1 -0
- package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
- package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
- package/lib/drivers/claude-code/deferred-process.js +108 -0
- package/lib/drivers/claude-code/deferred-process.js.map +1 -0
- package/lib/drivers/claude-code/index.d.ts +187 -10
- package/lib/drivers/claude-code/index.d.ts.map +1 -1
- package/lib/drivers/claude-code/index.js +198 -253
- package/lib/drivers/claude-code/index.js.map +1 -1
- package/lib/drivers/claude-code/isolation.d.ts +8 -0
- package/lib/drivers/claude-code/isolation.d.ts.map +1 -0
- package/lib/drivers/claude-code/isolation.js +199 -0
- package/lib/drivers/claude-code/isolation.js.map +1 -0
- package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
- package/lib/drivers/claude-code/parse-events.js +73 -8
- package/lib/drivers/claude-code/parse-events.js.map +1 -1
- package/lib/drivers/codex/app-events.d.ts +9 -2
- package/lib/drivers/codex/app-events.d.ts.map +1 -1
- package/lib/drivers/codex/app-events.js +104 -12
- package/lib/drivers/codex/app-events.js.map +1 -1
- package/lib/drivers/codex/config.d.ts +69 -5
- package/lib/drivers/codex/config.d.ts.map +1 -1
- package/lib/drivers/codex/config.js +48 -8
- package/lib/drivers/codex/config.js.map +1 -1
- package/lib/drivers/codex/exec-events.d.ts +4 -0
- package/lib/drivers/codex/exec-events.d.ts.map +1 -0
- package/lib/drivers/codex/exec-events.js +230 -0
- package/lib/drivers/codex/exec-events.js.map +1 -0
- package/lib/drivers/codex/index.d.ts +142 -4
- package/lib/drivers/codex/index.d.ts.map +1 -1
- package/lib/drivers/codex/index.js +114 -276
- package/lib/drivers/codex/index.js.map +1 -1
- package/lib/drivers/copilot/config.d.ts +84 -0
- package/lib/drivers/copilot/config.d.ts.map +1 -0
- package/lib/drivers/copilot/config.js +57 -0
- package/lib/drivers/copilot/config.js.map +1 -0
- package/lib/drivers/copilot/index.d.ts +107 -0
- package/lib/drivers/copilot/index.d.ts.map +1 -0
- package/lib/drivers/copilot/index.js +268 -0
- package/lib/drivers/copilot/index.js.map +1 -0
- package/lib/drivers/cursor/config.d.ts +28 -0
- package/lib/drivers/cursor/config.d.ts.map +1 -0
- package/lib/drivers/cursor/config.js +28 -0
- package/lib/drivers/cursor/config.js.map +1 -0
- package/lib/drivers/cursor/index.d.ts +44 -0
- package/lib/drivers/cursor/index.d.ts.map +1 -0
- package/lib/drivers/cursor/index.js +286 -0
- package/lib/drivers/cursor/index.js.map +1 -0
- package/lib/drivers/cursor/interaction.d.ts +6 -0
- package/lib/drivers/cursor/interaction.d.ts.map +1 -0
- package/lib/drivers/cursor/interaction.js +55 -0
- package/lib/drivers/cursor/interaction.js.map +1 -0
- package/lib/drivers/grok-build/config.d.ts +68 -0
- package/lib/drivers/grok-build/config.d.ts.map +1 -0
- package/lib/drivers/grok-build/config.js +40 -0
- package/lib/drivers/grok-build/config.js.map +1 -0
- package/lib/drivers/grok-build/index.d.ts +87 -0
- package/lib/drivers/grok-build/index.d.ts.map +1 -0
- package/lib/drivers/grok-build/index.js +293 -0
- package/lib/drivers/grok-build/index.js.map +1 -0
- package/lib/drivers/mcp/index.d.ts +37 -4
- package/lib/drivers/mcp/index.d.ts.map +1 -1
- package/lib/drivers/mcp/index.js +25 -11
- package/lib/drivers/mcp/index.js.map +1 -1
- package/lib/drivers/shared/acp-events.d.ts +15 -0
- package/lib/drivers/shared/acp-events.d.ts.map +1 -0
- package/lib/drivers/shared/acp-events.js +83 -0
- package/lib/drivers/shared/acp-events.js.map +1 -0
- package/lib/drivers/shared/acp-interaction.d.ts +7 -0
- package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
- package/lib/drivers/shared/acp-interaction.js +20 -0
- package/lib/drivers/shared/acp-interaction.js.map +1 -0
- package/lib/drivers/shared/acp-session.d.ts +4 -0
- package/lib/drivers/shared/acp-session.d.ts.map +1 -0
- package/lib/drivers/shared/acp-session.js +23 -0
- package/lib/drivers/shared/acp-session.js.map +1 -0
- package/lib/drivers/shared/acp-transport.d.ts +40 -0
- package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
- package/lib/drivers/shared/acp-transport.js +152 -0
- package/lib/drivers/shared/acp-transport.js.map +1 -0
- package/lib/drivers/shared/artifacts.d.ts.map +1 -1
- package/lib/drivers/shared/artifacts.js +3 -2
- package/lib/drivers/shared/artifacts.js.map +1 -1
- package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
- package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-behavior.js +200 -0
- package/lib/drivers/shared/experiment-behavior.js.map +1 -0
- package/lib/drivers/shared/experiment-policy.d.ts +4 -0
- package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-policy.js +149 -0
- package/lib/drivers/shared/experiment-policy.js.map +1 -0
- package/lib/drivers/shared/skills.d.ts +3 -0
- package/lib/drivers/shared/skills.d.ts.map +1 -0
- package/lib/drivers/shared/skills.js +73 -0
- package/lib/drivers/shared/skills.js.map +1 -0
- package/lib/drivers/subprocess/index.d.ts +39 -4
- package/lib/drivers/subprocess/index.d.ts.map +1 -1
- package/lib/drivers/subprocess/index.js +56 -12
- package/lib/drivers/subprocess/index.js.map +1 -1
- package/lib/index.d.ts +24 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +20 -5
- package/lib/index.js.map +1 -1
- package/lib/optimization/reflective.d.ts +3 -1
- package/lib/optimization/reflective.d.ts.map +1 -1
- package/lib/optimization/reflective.js +3 -2
- package/lib/optimization/reflective.js.map +1 -1
- package/lib/orchestrator/annotation-loader.d.ts +6 -2
- package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
- package/lib/orchestrator/annotation-loader.js +8 -0
- package/lib/orchestrator/annotation-loader.js.map +1 -1
- package/lib/orchestrator/annotation-store.d.ts.map +1 -1
- package/lib/orchestrator/annotation-store.js +16 -2
- package/lib/orchestrator/annotation-store.js.map +1 -1
- package/lib/orchestrator/artifact-origin.d.ts +3 -0
- package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
- package/lib/orchestrator/artifact-origin.js +40 -0
- package/lib/orchestrator/artifact-origin.js.map +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/campaign-lifecycle.js +4 -1
- package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
- package/lib/orchestrator/candidates.d.ts.map +1 -1
- package/lib/orchestrator/candidates.js +3 -2
- package/lib/orchestrator/candidates.js.map +1 -1
- package/lib/orchestrator/compare.d.ts +23 -6
- package/lib/orchestrator/compare.d.ts.map +1 -1
- package/lib/orchestrator/compare.js +45 -12
- package/lib/orchestrator/compare.js.map +1 -1
- package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
- package/lib/orchestrator/comparison-identity.js +2 -0
- package/lib/orchestrator/comparison-identity.js.map +1 -1
- package/lib/orchestrator/config.d.ts +231 -10
- package/lib/orchestrator/config.d.ts.map +1 -1
- package/lib/orchestrator/config.js +21 -2
- package/lib/orchestrator/config.js.map +1 -1
- package/lib/orchestrator/discover.d.ts +1 -0
- package/lib/orchestrator/discover.d.ts.map +1 -1
- package/lib/orchestrator/discover.js +7 -1
- package/lib/orchestrator/discover.js.map +1 -1
- package/lib/orchestrator/doctor.d.ts +1 -0
- package/lib/orchestrator/doctor.d.ts.map +1 -1
- package/lib/orchestrator/doctor.js +163 -78
- 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 +52 -4
- package/lib/orchestrator/experiment-context.d.ts.map +1 -1
- package/lib/orchestrator/experiment-context.js +2 -1
- package/lib/orchestrator/experiment-context.js.map +1 -1
- package/lib/orchestrator/experiment-contracts.d.ts +31 -1
- package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.d.ts +2 -1
- package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.js +32 -24
- package/lib/orchestrator/experiment-corpus.js.map +1 -1
- package/lib/orchestrator/experiment-effects.d.ts +33 -0
- package/lib/orchestrator/experiment-effects.d.ts.map +1 -0
- package/lib/orchestrator/experiment-effects.js +46 -0
- package/lib/orchestrator/experiment-effects.js.map +1 -0
- package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
- package/lib/orchestrator/experiment-evaluation.js +70 -5
- package/lib/orchestrator/experiment-evaluation.js.map +1 -1
- package/lib/orchestrator/experiment-identity.d.ts +3 -0
- package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-identity.js +50 -42
- package/lib/orchestrator/experiment-identity.js.map +1 -1
- package/lib/orchestrator/experiment-loader.d.ts +8 -3
- package/lib/orchestrator/experiment-loader.d.ts.map +1 -1
- package/lib/orchestrator/experiment-preflight.d.ts +3 -0
- package/lib/orchestrator/experiment-preflight.d.ts.map +1 -0
- package/lib/orchestrator/experiment-preflight.js +21 -0
- package/lib/orchestrator/experiment-preflight.js.map +1 -0
- package/lib/orchestrator/experiment-report.d.ts +91 -1
- package/lib/orchestrator/experiment-report.d.ts.map +1 -1
- package/lib/orchestrator/experiment-report.js +9 -1
- package/lib/orchestrator/experiment-report.js.map +1 -1
- package/lib/orchestrator/experiment-runs.d.ts +63 -2
- package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runs.js +13 -5
- package/lib/orchestrator/experiment-runs.js.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
- package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.js +5 -220
- package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
- package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
- package/lib/orchestrator/experiment-selection.js +151 -43
- package/lib/orchestrator/experiment-selection.js.map +1 -1
- package/lib/orchestrator/experiment.d.ts +3 -3
- package/lib/orchestrator/experiment.d.ts.map +1 -1
- package/lib/orchestrator/experiment.js +26 -21
- package/lib/orchestrator/experiment.js.map +1 -1
- package/lib/orchestrator/fixture-identity.d.ts +1 -0
- package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
- package/lib/orchestrator/fixture-identity.js +6 -1
- package/lib/orchestrator/fixture-identity.js.map +1 -1
- package/lib/orchestrator/fs-read.d.ts +1 -6
- package/lib/orchestrator/fs-read.d.ts.map +1 -1
- package/lib/orchestrator/fs-read.js +2 -32
- package/lib/orchestrator/fs-read.js.map +1 -1
- package/lib/orchestrator/grader-experiment.d.ts +23 -5
- package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
- package/lib/orchestrator/grader-experiment.js +54 -9
- package/lib/orchestrator/grader-experiment.js.map +1 -1
- package/lib/orchestrator/grading.d.ts +1 -0
- package/lib/orchestrator/grading.d.ts.map +1 -1
- package/lib/orchestrator/grading.js +41 -33
- package/lib/orchestrator/grading.js.map +1 -1
- package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
- package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
- package/lib/orchestrator/harness-catalog-drift.js +90 -0
- package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
- package/lib/orchestrator/harness-registry.d.ts +4 -0
- package/lib/orchestrator/harness-registry.d.ts.map +1 -0
- package/lib/orchestrator/harness-registry.js +5 -0
- package/lib/orchestrator/harness-registry.js.map +1 -0
- package/lib/orchestrator/index.d.ts +1 -1
- package/lib/orchestrator/index.d.ts.map +1 -1
- package/lib/orchestrator/index.js +1 -1
- package/lib/orchestrator/index.js.map +1 -1
- package/lib/orchestrator/list-runs.d.ts +8 -1
- package/lib/orchestrator/list-runs.d.ts.map +1 -1
- package/lib/orchestrator/list-runs.js +83 -18
- package/lib/orchestrator/list-runs.js.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.js +3 -1
- package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
- package/lib/orchestrator/orchestrator.d.ts +17 -2
- package/lib/orchestrator/orchestrator.d.ts.map +1 -1
- package/lib/orchestrator/orchestrator.js +59 -179
- package/lib/orchestrator/orchestrator.js.map +1 -1
- package/lib/orchestrator/paired-effects.d.ts +34 -0
- package/lib/orchestrator/paired-effects.d.ts.map +1 -0
- package/lib/orchestrator/paired-effects.js +164 -0
- package/lib/orchestrator/paired-effects.js.map +1 -0
- package/lib/orchestrator/profile.d.ts +4 -0
- package/lib/orchestrator/profile.d.ts.map +1 -0
- package/lib/orchestrator/profile.js +10 -0
- package/lib/orchestrator/profile.js.map +1 -0
- package/lib/orchestrator/provenance.d.ts +5 -1
- package/lib/orchestrator/provenance.d.ts.map +1 -1
- package/lib/orchestrator/provenance.js +16 -3
- package/lib/orchestrator/provenance.js.map +1 -1
- package/lib/orchestrator/regrade.d.ts +4 -2
- package/lib/orchestrator/regrade.d.ts.map +1 -1
- package/lib/orchestrator/regrade.js +5 -1
- package/lib/orchestrator/regrade.js.map +1 -1
- package/lib/orchestrator/rubric-loader.js +1 -1
- package/lib/orchestrator/rubric-loader.js.map +1 -1
- package/lib/orchestrator/run-dir.d.ts +2 -0
- package/lib/orchestrator/run-dir.d.ts.map +1 -1
- package/lib/orchestrator/run-dir.js +1 -1
- package/lib/orchestrator/run-dir.js.map +1 -1
- package/lib/orchestrator/run-execution.d.ts +3 -0
- package/lib/orchestrator/run-execution.d.ts.map +1 -1
- package/lib/orchestrator/run-execution.js +64 -10
- package/lib/orchestrator/run-execution.js.map +1 -1
- package/lib/orchestrator/run-lifecycle.d.ts +1 -0
- package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/run-lifecycle.js +3 -2
- package/lib/orchestrator/run-lifecycle.js.map +1 -1
- package/lib/orchestrator/run-workspace.d.ts +10 -0
- package/lib/orchestrator/run-workspace.d.ts.map +1 -0
- package/lib/orchestrator/run-workspace.js +58 -0
- package/lib/orchestrator/run-workspace.js.map +1 -0
- package/lib/orchestrator/suite-compare.d.ts +37 -0
- package/lib/orchestrator/suite-compare.d.ts.map +1 -1
- package/lib/orchestrator/suite-compare.js +44 -22
- package/lib/orchestrator/suite-compare.js.map +1 -1
- package/lib/orchestrator/suite-runs.d.ts +6 -1
- package/lib/orchestrator/suite-runs.d.ts.map +1 -1
- package/lib/orchestrator/suite-runs.js +14 -2
- package/lib/orchestrator/suite-runs.js.map +1 -1
- package/lib/orchestrator/suite-summary.d.ts +79 -0
- package/lib/orchestrator/suite-summary.d.ts.map +1 -1
- package/lib/orchestrator/suite-summary.js +67 -14
- package/lib/orchestrator/suite-summary.js.map +1 -1
- package/lib/previewer/artifacts.d.ts +25 -0
- package/lib/previewer/artifacts.d.ts.map +1 -0
- package/lib/previewer/artifacts.js +180 -0
- package/lib/previewer/artifacts.js.map +1 -0
- package/lib/previewer/server.d.ts +111 -0
- package/lib/previewer/server.d.ts.map +1 -0
- package/lib/previewer/server.js +559 -0
- package/lib/previewer/server.js.map +1 -0
- package/package.json +4 -2
- package/skills/lux-answerer/SKILL.md +2 -2
- package/src/answerers/claude-code/index.ts +6 -5
- package/src/answerers/persona/index.ts +80 -34
- package/src/answerers/terminal/index.ts +7 -11
- package/src/assertions/authoring.ts +2 -0
- package/src/assertions/core/command-exits-zero.ts +82 -17
- package/src/assertions/core/event-checks.ts +64 -3
- package/src/assertions/core/index.ts +2 -0
- package/src/assertions/core/resource-checks.ts +38 -5
- package/src/assertions/core/safe-regex.ts +16 -6
- package/src/assertions/rubric/evidence.ts +85 -0
- package/src/assertions/rubric/index.ts +76 -46
- package/src/assertions/rubric/internal.ts +264 -46
- package/src/authoring.ts +346 -2
- package/src/cli/bin.ts +2 -12
- package/src/cli/command-runtime.ts +20 -9
- package/src/cli/doctor.ts +17 -0
- package/src/cli/harness-plan.ts +123 -0
- package/src/cli/init-templates.ts +176 -0
- package/src/cli/init.ts +53 -184
- package/src/cli/output-schemas.ts +109 -0
- package/src/cli/program.ts +697 -730
- package/src/cli/render/format.ts +1 -1
- package/src/cli/render/reporter.ts +36 -8
- package/src/cli/run-options.ts +131 -25
- package/src/cli/view.ts +129 -0
- package/src/container/driver.ts +213 -0
- package/src/container/paths.ts +29 -0
- package/src/container/protocol.ts +48 -0
- package/src/container/resources.ts +165 -0
- package/src/container/worker.ts +107 -0
- package/src/core/action-events.ts +59 -0
- package/src/core/agent-activity.ts +236 -0
- package/src/core/agent-environment.ts +64 -0
- package/src/core/agent-events.ts +17 -0
- package/src/core/annotation.ts +2 -1
- package/src/core/answerer.ts +9 -0
- package/src/core/artifact-evidence.ts +40 -5
- package/src/core/assertion.ts +8 -2
- package/src/core/case-defaults.ts +65 -0
- package/src/core/case.ts +79 -8
- package/src/core/command-verification.ts +74 -0
- package/src/core/driver-execution.ts +84 -0
- package/src/core/driver-metrics.ts +51 -0
- package/src/core/driver.ts +76 -0
- package/src/core/duration.ts +52 -0
- package/src/core/environment.ts +22 -0
- package/src/core/evaluation-clusters.ts +35 -0
- package/src/core/events.ts +13 -2
- package/src/core/experiment.ts +71 -25
- package/src/core/file-tree.ts +35 -0
- package/src/core/global-id.ts +26 -0
- package/src/core/harness-catalog.ts +100 -0
- package/src/core/harness-catalogs/antigravity.ts +24 -0
- package/src/core/harness-catalogs/claude-code.ts +25 -0
- package/src/core/harness-catalogs/codex.ts +27 -0
- package/src/core/harness-catalogs/copilot.ts +46 -0
- package/src/core/harness-catalogs/cursor.ts +13 -0
- package/src/core/harness-catalogs/grok-build.ts +19 -0
- package/src/core/harness-catalogs/index.ts +31 -0
- package/src/core/harness-matrix.ts +316 -0
- package/src/core/index.ts +12 -0
- package/src/core/lifecycle-fixtures.ts +4 -2
- package/src/core/model-cli.ts +78 -28
- package/src/core/platform-process.ts +65 -16
- package/src/core/reference-defaults.ts +47 -0
- package/src/core/run.ts +31 -0
- package/src/core/usage.ts +8 -0
- package/src/drivers/antigravity/README.md +171 -0
- package/src/drivers/antigravity/artifacts.ts +37 -0
- package/src/drivers/antigravity/config.ts +92 -0
- package/src/drivers/antigravity/events.ts +290 -0
- package/src/drivers/antigravity/index.ts +132 -0
- package/src/drivers/antigravity/runtime.ts +94 -0
- package/src/drivers/claude-code/deferred-process.ts +118 -0
- package/src/drivers/claude-code/index.ts +228 -282
- package/src/drivers/claude-code/isolation.ts +228 -0
- package/src/drivers/claude-code/parse-events.ts +98 -12
- package/src/drivers/codex/app-events.ts +126 -16
- package/src/drivers/codex/config.ts +59 -8
- package/src/drivers/codex/exec-events.ts +258 -0
- package/src/drivers/codex/index.ts +146 -312
- package/src/drivers/copilot/README.md +60 -0
- package/src/drivers/copilot/config.ts +61 -0
- package/src/drivers/copilot/index.ts +310 -0
- package/src/drivers/cursor/README.md +66 -0
- package/src/drivers/cursor/config.ts +31 -0
- package/src/drivers/cursor/index.ts +326 -0
- package/src/drivers/cursor/interaction.ts +74 -0
- package/src/drivers/grok-build/README.md +112 -0
- package/src/drivers/grok-build/config.ts +43 -0
- package/src/drivers/grok-build/index.ts +331 -0
- package/src/drivers/mcp/index.ts +25 -11
- package/src/drivers/shared/acp-events.ts +94 -0
- package/src/drivers/shared/acp-interaction.ts +27 -0
- package/src/drivers/shared/acp-session.ts +40 -0
- package/src/drivers/shared/acp-transport.ts +187 -0
- package/src/drivers/shared/artifacts.ts +6 -2
- package/src/drivers/shared/experiment-behavior.ts +217 -0
- package/src/drivers/shared/experiment-policy.ts +201 -0
- package/src/drivers/shared/skills.ts +74 -0
- package/src/drivers/subprocess/index.ts +55 -12
- package/src/index.ts +117 -6
- package/src/optimization/reflective.ts +3 -2
- package/src/orchestrator/annotation-loader.ts +10 -0
- package/src/orchestrator/annotation-store.ts +24 -3
- package/src/orchestrator/artifact-origin.ts +50 -0
- package/src/orchestrator/campaign-lifecycle.ts +5 -1
- package/src/orchestrator/candidates.ts +3 -2
- package/src/orchestrator/compare.ts +62 -13
- package/src/orchestrator/comparison-identity.ts +2 -0
- package/src/orchestrator/config.ts +23 -1
- package/src/orchestrator/discover.ts +8 -1
- package/src/orchestrator/doctor.ts +281 -74
- package/src/orchestrator/driver-capabilities.ts +21 -0
- package/src/orchestrator/driver-identity.ts +69 -0
- package/src/orchestrator/experiment-context.ts +5 -3
- package/src/orchestrator/experiment-corpus.ts +68 -39
- package/src/orchestrator/experiment-effects.ts +63 -0
- package/src/orchestrator/experiment-evaluation.ts +88 -10
- package/src/orchestrator/experiment-identity.ts +98 -61
- package/src/orchestrator/experiment-preflight.ts +27 -0
- package/src/orchestrator/experiment-report.ts +21 -1
- package/src/orchestrator/experiment-runs.ts +11 -4
- package/src/orchestrator/experiment-runtime-identity.ts +5 -243
- package/src/orchestrator/experiment-selection.ts +178 -18
- package/src/orchestrator/experiment.ts +29 -29
- package/src/orchestrator/fixture-identity.ts +9 -1
- package/src/orchestrator/fs-read.ts +2 -32
- package/src/orchestrator/grader-experiment.ts +74 -13
- package/src/orchestrator/grading.ts +60 -31
- package/src/orchestrator/harness-catalog-drift.ts +132 -0
- package/src/orchestrator/harness-registry.ts +12 -0
- package/src/orchestrator/index.ts +1 -0
- package/src/orchestrator/list-runs.ts +102 -18
- package/src/orchestrator/optimization-lifecycle.ts +4 -1
- package/src/orchestrator/orchestrator.ts +104 -226
- package/src/orchestrator/paired-effects.ts +214 -0
- package/src/orchestrator/profile.ts +24 -0
- package/src/orchestrator/provenance.ts +23 -3
- package/src/orchestrator/regrade.ts +5 -1
- package/src/orchestrator/rubric-loader.ts +1 -1
- package/src/orchestrator/run-dir.ts +8 -1
- package/src/orchestrator/run-execution.ts +75 -10
- package/src/orchestrator/run-lifecycle.ts +4 -2
- package/src/orchestrator/run-workspace.ts +62 -0
- package/src/orchestrator/suite-compare.ts +47 -23
- package/src/orchestrator/suite-runs.ts +13 -2
- package/src/orchestrator/suite-summary.ts +129 -15
- package/src/previewer/artifacts.ts +221 -0
- package/src/previewer/server.ts +789 -0
- package/viewer/app.css +2111 -0
- package/viewer/app.js +627 -0
- package/viewer/artifact-view.js +48 -0
- package/viewer/charts.js +98 -0
- package/viewer/detail.js +1266 -0
- package/viewer/format.js +129 -0
- package/viewer/index.html +151 -0
- package/lib/cli/skills.d.ts +0 -38
- package/lib/cli/skills.d.ts.map +0 -1
- package/lib/cli/skills.js +0 -84
- package/lib/cli/skills.js.map +0 -1
- package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
- package/lib/drivers/shared/secure-copy.js.map +0 -1
- package/skills/lux/SKILL.md +0 -89
- package/skills/lux/references/cli.md +0 -125
- package/skills/lux/references/eval-authoring.md +0 -257
- package/src/cli/skills.ts +0 -129
- /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
- /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
- /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { clusterKey } from "../core/evaluation-clusters.js";
|
|
3
|
+
import {
|
|
4
|
+
bootstrapMeanConfidenceInterval,
|
|
5
|
+
type CandidateEvaluation,
|
|
6
|
+
type ConfidenceConfig,
|
|
7
|
+
ConfidenceIntervalSchema,
|
|
8
|
+
} from "../core/index.js";
|
|
9
|
+
|
|
10
|
+
type CaseSamples = NonNullable<CandidateEvaluation["caseSamples"]>;
|
|
11
|
+
type Evaluation = CandidateEvaluation & { repetitions: number };
|
|
12
|
+
|
|
13
|
+
export const clusterCaseSamples = (
|
|
14
|
+
groups: readonly (CaseSamples | undefined)[],
|
|
15
|
+
): CaseSamples | undefined => {
|
|
16
|
+
if (groups.some((group) => group === undefined)) return undefined;
|
|
17
|
+
const result = new Map<string, CaseSamples[string]>();
|
|
18
|
+
for (const group of groups) {
|
|
19
|
+
for (const [id, sample] of Object.entries(group ?? {})) {
|
|
20
|
+
const current = result.get(id);
|
|
21
|
+
if (!current) {
|
|
22
|
+
result.set(id, structuredClone(sample));
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (current.identityHash !== sample.identityHash) current.identityHash = null;
|
|
26
|
+
if (current.clusterId !== sample.clusterId) current.identityHash = null;
|
|
27
|
+
if (current.scoreBasis !== sample.scoreBasis) current.scoreBasis = null;
|
|
28
|
+
const metrics = new Map(Object.entries(current.metrics));
|
|
29
|
+
for (const [metric, value] of Object.entries(sample.metrics)) {
|
|
30
|
+
const before = metrics.get(metric);
|
|
31
|
+
metrics.set(
|
|
32
|
+
metric,
|
|
33
|
+
before
|
|
34
|
+
? {
|
|
35
|
+
mean: (before.mean * before.n + value.mean * value.n) / (before.n + value.n),
|
|
36
|
+
n: before.n + value.n,
|
|
37
|
+
}
|
|
38
|
+
: { ...value },
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
current.metrics = Object.fromEntries(metrics);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return Object.fromEntries(result);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const caseGroups = (samples: CaseSamples): Map<string, string[]> => {
|
|
48
|
+
const groups = new Map<string, string[]>();
|
|
49
|
+
for (const id of Object.keys(samples).sort()) {
|
|
50
|
+
const key = clusterKey(id, samples[id]?.clusterId);
|
|
51
|
+
groups.set(key, [...(groups.get(key) ?? []), id]);
|
|
52
|
+
}
|
|
53
|
+
return groups;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const groupedCaseMetricSamples = (
|
|
57
|
+
samples: CaseSamples | undefined,
|
|
58
|
+
repetitions: number,
|
|
59
|
+
): Record<string, number[]> | undefined => {
|
|
60
|
+
if (!samples || !Object.values(samples).some((sample) => sample.clusterId !== undefined))
|
|
61
|
+
return undefined;
|
|
62
|
+
const groups = caseGroups(samples);
|
|
63
|
+
const metrics = new Set(Object.values(samples).flatMap((sample) => Object.keys(sample.metrics)));
|
|
64
|
+
return Object.fromEntries(
|
|
65
|
+
[...metrics].flatMap((metric) => {
|
|
66
|
+
if (
|
|
67
|
+
Object.values(samples).some(
|
|
68
|
+
(sample) =>
|
|
69
|
+
!Object.hasOwn(sample.metrics, metric) ||
|
|
70
|
+
sample.metrics[metric]?.n !== repetitions ||
|
|
71
|
+
(metric === "score" && !sample.scoreBasis),
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
return [];
|
|
75
|
+
return [
|
|
76
|
+
[
|
|
77
|
+
metric,
|
|
78
|
+
[...groups.values()].map(
|
|
79
|
+
(ids) =>
|
|
80
|
+
ids.reduce((sum, id) => sum + (samples[id]?.metrics[metric]?.mean ?? 0), 0) /
|
|
81
|
+
ids.length,
|
|
82
|
+
),
|
|
83
|
+
],
|
|
84
|
+
];
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const PairedEffectSchema = z.object({
|
|
90
|
+
caseIds: z.array(z.string()),
|
|
91
|
+
n: z.number().int().nonnegative(),
|
|
92
|
+
caseCount: z.number().int().nonnegative().optional(),
|
|
93
|
+
clusters: z.record(z.string(), z.array(z.string())).optional(),
|
|
94
|
+
meanDelta: z.number().finite().nullable(),
|
|
95
|
+
interval: ConfidenceIntervalSchema.nullable(),
|
|
96
|
+
note: z.string().nullable(),
|
|
97
|
+
});
|
|
98
|
+
export type PairedEffect = z.infer<typeof PairedEffectSchema>;
|
|
99
|
+
|
|
100
|
+
export const confidenceGateIssue = (
|
|
101
|
+
interval: z.infer<typeof ConfidenceIntervalSchema>,
|
|
102
|
+
): string | undefined =>
|
|
103
|
+
interval.method === "percentile-bootstrap" && interval.lower === interval.upper
|
|
104
|
+
? "zero-width percentile-bootstrap interval cannot establish promotion confidence; use Hoeffding for bounded means or collect more varied independent evidence"
|
|
105
|
+
: undefined;
|
|
106
|
+
|
|
107
|
+
const pairedDeltas = (
|
|
108
|
+
before: Evaluation | undefined,
|
|
109
|
+
after: Evaluation | undefined,
|
|
110
|
+
metric: string,
|
|
111
|
+
): { caseIds: string[]; values: number[]; clusters: Record<string, string[]> } => {
|
|
112
|
+
if (!before?.caseSamples || !after?.caseSamples)
|
|
113
|
+
throw new Error("keyed case evidence unavailable");
|
|
114
|
+
if (
|
|
115
|
+
before.profileId !== after.profileId ||
|
|
116
|
+
before.split !== after.split ||
|
|
117
|
+
before.repetitions !== after.repetitions
|
|
118
|
+
) {
|
|
119
|
+
throw new Error("paired evidence requires matching profile, split, and repetitions");
|
|
120
|
+
}
|
|
121
|
+
const caseIds = Object.keys(before.caseSamples).sort();
|
|
122
|
+
const afterIds = Object.keys(after.caseSamples).sort();
|
|
123
|
+
const beforeCases = Object.keys(before.casePassRates).sort();
|
|
124
|
+
const afterCases = Object.keys(after.casePassRates).sort();
|
|
125
|
+
if (
|
|
126
|
+
caseIds.length === 0 ||
|
|
127
|
+
[afterIds, beforeCases, afterCases].some(
|
|
128
|
+
(ids) => JSON.stringify(ids) !== JSON.stringify(caseIds),
|
|
129
|
+
)
|
|
130
|
+
) {
|
|
131
|
+
throw new Error("paired evidence requires identical canonical case sets");
|
|
132
|
+
}
|
|
133
|
+
const values = caseIds.map((id) => {
|
|
134
|
+
const a = before.caseSamples?.[id];
|
|
135
|
+
const b = after.caseSamples?.[id];
|
|
136
|
+
if (!a?.identityHash || a.identityHash !== b?.identityHash)
|
|
137
|
+
throw new Error(`paired case '${id}' has incompatible evaluation identity`);
|
|
138
|
+
if (metric === "score" && (!a.scoreBasis || a.scoreBasis !== b.scoreBasis))
|
|
139
|
+
throw new Error(`paired score for case '${id}' has different or unavailable scoring basis`);
|
|
140
|
+
if (a.clusterId !== b.clusterId)
|
|
141
|
+
throw new Error(`paired case '${id}' has incompatible cluster membership`);
|
|
142
|
+
const av = Object.hasOwn(a.metrics, metric) ? a.metrics[metric] : undefined;
|
|
143
|
+
const bv = Object.hasOwn(b.metrics, metric) ? b.metrics[metric] : undefined;
|
|
144
|
+
if (!av || !bv || av.n !== before.repetitions || bv.n !== after.repetitions) {
|
|
145
|
+
throw new Error(
|
|
146
|
+
`paired metric '${metric}' lacks complete repetition coverage for case '${id}'`,
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
return bv.mean - av.mean;
|
|
150
|
+
});
|
|
151
|
+
const byCase = new Map(caseIds.map((id, index) => [id, values[index] ?? 0]));
|
|
152
|
+
const groups = caseGroups(before.caseSamples);
|
|
153
|
+
return {
|
|
154
|
+
caseIds,
|
|
155
|
+
clusters: Object.fromEntries(groups),
|
|
156
|
+
values: [...groups.values()].map(
|
|
157
|
+
(ids) => ids.reduce((sum, id) => sum + (byCase.get(id) ?? 0), 0) / ids.length,
|
|
158
|
+
),
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export const pairedEffect = (
|
|
163
|
+
before: Evaluation | undefined,
|
|
164
|
+
after: Evaluation | undefined,
|
|
165
|
+
metric: string,
|
|
166
|
+
confidence?: ConfidenceConfig,
|
|
167
|
+
): PairedEffect => {
|
|
168
|
+
let paired: ReturnType<typeof pairedDeltas>;
|
|
169
|
+
try {
|
|
170
|
+
paired = pairedDeltas(before, after, metric);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
return {
|
|
173
|
+
caseIds: [],
|
|
174
|
+
n: 0,
|
|
175
|
+
caseCount: 0,
|
|
176
|
+
clusters: {},
|
|
177
|
+
meanDelta: null,
|
|
178
|
+
interval: null,
|
|
179
|
+
note: error instanceof Error ? error.message : String(error),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const result: PairedEffect = {
|
|
183
|
+
caseIds: paired.caseIds,
|
|
184
|
+
n: paired.values.length,
|
|
185
|
+
caseCount: paired.caseIds.length,
|
|
186
|
+
clusters: paired.clusters,
|
|
187
|
+
meanDelta: paired.values.reduce((sum, value) => sum + value, 0) / paired.values.length,
|
|
188
|
+
interval: null,
|
|
189
|
+
note: null,
|
|
190
|
+
};
|
|
191
|
+
if (!confidence) return result;
|
|
192
|
+
try {
|
|
193
|
+
if (confidence.method === "wilson")
|
|
194
|
+
throw new Error("Wilson cannot estimate paired differences");
|
|
195
|
+
if (confidence.method === "hoeffding") {
|
|
196
|
+
const interval = bootstrapMeanConfidenceInterval(
|
|
197
|
+
paired.values.map((value) => (value + 1) / 2),
|
|
198
|
+
confidence,
|
|
199
|
+
);
|
|
200
|
+
result.interval = {
|
|
201
|
+
...interval,
|
|
202
|
+
estimate: 2 * interval.estimate - 1,
|
|
203
|
+
lower: 2 * interval.lower - 1,
|
|
204
|
+
upper: 2 * interval.upper - 1,
|
|
205
|
+
};
|
|
206
|
+
} else {
|
|
207
|
+
result.interval = bootstrapMeanConfidenceInterval(paired.values, confidence);
|
|
208
|
+
}
|
|
209
|
+
result.note = confidenceGateIssue(result.interval) ?? null;
|
|
210
|
+
} catch (error) {
|
|
211
|
+
result.note = error instanceof Error ? error.message : String(error);
|
|
212
|
+
}
|
|
213
|
+
return result;
|
|
214
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
mergeAnswererReference,
|
|
3
|
+
mergeDriverReference,
|
|
4
|
+
withDriverDefaults,
|
|
5
|
+
} from "../core/reference-defaults.js";
|
|
6
|
+
import type { ExperimentProfile, ResolvedLuxConfig } from "./config.js";
|
|
7
|
+
|
|
8
|
+
/** Used by ordinary runs, doctor, and experiment execution and identity alike. */
|
|
9
|
+
export const resolveProfile = (
|
|
10
|
+
config: Pick<
|
|
11
|
+
ResolvedLuxConfig,
|
|
12
|
+
"defaultDriver" | "defaultAnswerer" | "harness" | "environment" | "driverDefaults"
|
|
13
|
+
>,
|
|
14
|
+
profile: ExperimentProfile = {},
|
|
15
|
+
): ExperimentProfile => ({
|
|
16
|
+
...profile,
|
|
17
|
+
driver: withDriverDefaults(
|
|
18
|
+
mergeDriverReference(config.defaultDriver, profile.driver),
|
|
19
|
+
config.driverDefaults,
|
|
20
|
+
),
|
|
21
|
+
answerer: mergeAnswererReference(config.defaultAnswerer, profile.answerer),
|
|
22
|
+
harness: profile.harness ?? config.harness,
|
|
23
|
+
environment: profile.environment ?? config.environment,
|
|
24
|
+
});
|
|
@@ -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 } : {}),
|
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
readRunArtifactBytes,
|
|
34
34
|
valueHash,
|
|
35
35
|
} from "../core/index.js";
|
|
36
|
+
import { HarnessModelConfigSchema, resolveHarnessForDriver } from "../core/model-cli.js";
|
|
36
37
|
import { registryForEvalCase } from "./case-extensions.js";
|
|
37
38
|
import { evaluatorImplementationHash } from "./evaluator-identity.js";
|
|
38
39
|
import { parsePersistedJson, readBoundedHandle, safeReadJson } from "./fs-read.js";
|
|
@@ -539,12 +540,15 @@ export const regradeRun = async (options: {
|
|
|
539
540
|
const validatedAssertionsHash = valueHash(validatedAssertionConfigs);
|
|
540
541
|
const assertionEvaluators = assertionEvaluatorIdentities(run.case.assertions ?? [], registry);
|
|
541
542
|
const assertionPlugins = assertionPluginIdentities(run.case.assertions ?? [], registry);
|
|
543
|
+
const configuredHarness = HarnessModelConfigSchema.safeParse(options.graderContext);
|
|
542
544
|
const graderHash = graderConfigHash({
|
|
543
545
|
luxVersion: LUX_VERSION,
|
|
544
546
|
implementationHash: await currentEvaluatorImplementationHash(),
|
|
545
547
|
assertions: assertionEvaluators,
|
|
546
548
|
validatedAssertionsHash,
|
|
547
|
-
graderContext:
|
|
549
|
+
graderContext: configuredHarness.success
|
|
550
|
+
? configuredHarness.data
|
|
551
|
+
: (options.graderContext ?? resolveHarnessForDriver(undefined, run.metadata.driver)),
|
|
548
552
|
});
|
|
549
553
|
const report: GradingReport = await gradeRun(
|
|
550
554
|
run,
|
|
@@ -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({
|
|
@@ -563,14 +621,17 @@ class RunExecution implements RunLifecycleEffects<RunResult> {
|
|
|
563
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 } : {}),
|
|
@@ -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 };
|