@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
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { type ManagedProcess, spawnManagedProcess } from "../../core/index.js";
|
|
2
|
+
|
|
3
|
+
export type RpcRecord = Record<string, unknown>;
|
|
4
|
+
export type RpcId = number | string;
|
|
5
|
+
export const asRecord = (value: unknown): RpcRecord | undefined =>
|
|
6
|
+
value !== null && typeof value === "object" && !Array.isArray(value)
|
|
7
|
+
? (value as RpcRecord)
|
|
8
|
+
: undefined;
|
|
9
|
+
|
|
10
|
+
type TransportOptions = {
|
|
11
|
+
/** Harness name used in failure messages. */
|
|
12
|
+
label: string;
|
|
13
|
+
command: string;
|
|
14
|
+
args: string[];
|
|
15
|
+
cwd: string;
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
signal: AbortSignal;
|
|
18
|
+
maxLineBytes: number;
|
|
19
|
+
maxQueuedBytes: number;
|
|
20
|
+
onMessage: (message: RpcRecord) => Promise<void>;
|
|
21
|
+
onFailure: (error: Error) => void;
|
|
22
|
+
onActivity: () => void;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export class AcpTransport {
|
|
26
|
+
private readonly process: ManagedProcess;
|
|
27
|
+
private readonly pending = new Map<
|
|
28
|
+
RpcId,
|
|
29
|
+
{
|
|
30
|
+
resolve: (result: RpcRecord) => void;
|
|
31
|
+
reject: (error: Error) => void;
|
|
32
|
+
timer: NodeJS.Timeout | undefined;
|
|
33
|
+
}
|
|
34
|
+
>();
|
|
35
|
+
private nextId = 1;
|
|
36
|
+
private buffer = Buffer.alloc(0);
|
|
37
|
+
private queuedBytes = 0;
|
|
38
|
+
private chain: Promise<void> = Promise.resolve();
|
|
39
|
+
private stopped = false;
|
|
40
|
+
private stderrTail = "";
|
|
41
|
+
|
|
42
|
+
private readonly options: TransportOptions;
|
|
43
|
+
|
|
44
|
+
constructor(options: TransportOptions) {
|
|
45
|
+
this.options = options;
|
|
46
|
+
this.process = spawnManagedProcess(options.command, options.args, {
|
|
47
|
+
cwd: options.cwd,
|
|
48
|
+
...(options.env ? { env: options.env } : {}),
|
|
49
|
+
signal: options.signal,
|
|
50
|
+
});
|
|
51
|
+
this.process.child.stdout.on("data", (chunk: Buffer) => this.read(chunk));
|
|
52
|
+
this.process.child.stderr.setEncoding("utf8");
|
|
53
|
+
this.process.child.stderr.on("data", (chunk: string) => {
|
|
54
|
+
this.stderrTail = (this.stderrTail + chunk).slice(-8_192);
|
|
55
|
+
});
|
|
56
|
+
void this.process.exited.then(({ exitCode, signal }) => {
|
|
57
|
+
if (!this.stopped)
|
|
58
|
+
this.fail(
|
|
59
|
+
new Error(
|
|
60
|
+
`${this.options.label} exited before completion (code=${exitCode}, signal=${signal})${this.stderrTail ? `: ${this.stderrTail}` : ""}`,
|
|
61
|
+
),
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async spawned(): Promise<void> {
|
|
67
|
+
await this.process.spawned;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
request(method: string, params: RpcRecord, timeoutMs?: number): Promise<RpcRecord> {
|
|
71
|
+
if (this.stopped) return Promise.reject(new Error(`${this.options.label} is closed`));
|
|
72
|
+
const id = this.nextId++;
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
const timer =
|
|
75
|
+
timeoutMs === undefined
|
|
76
|
+
? undefined
|
|
77
|
+
: setTimeout(() => {
|
|
78
|
+
this.fail(
|
|
79
|
+
new Error(`${this.options.label} ${method} timed out after ${timeoutMs}ms`),
|
|
80
|
+
);
|
|
81
|
+
}, timeoutMs);
|
|
82
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
83
|
+
try {
|
|
84
|
+
this.write({ id, method, params });
|
|
85
|
+
} catch (error) {
|
|
86
|
+
this.fail(error instanceof Error ? error : new Error(String(error)));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
write(message: RpcRecord): void {
|
|
92
|
+
if (this.stopped) throw new Error(`${this.options.label} is closed`);
|
|
93
|
+
const line = `${JSON.stringify({ jsonrpc: "2.0", ...message })}\n`;
|
|
94
|
+
if (Buffer.byteLength(line) > this.options.maxLineBytes)
|
|
95
|
+
throw new Error(`${this.options.label} outgoing message exceeded maxLineBytes`);
|
|
96
|
+
this.process.child.stdin.write(line);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async drained(): Promise<void> {
|
|
100
|
+
await this.chain;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async close(): Promise<void> {
|
|
104
|
+
this.stopped = true;
|
|
105
|
+
this.rejectPending(new Error(`${this.options.label} is closed`));
|
|
106
|
+
this.buffer = Buffer.alloc(0);
|
|
107
|
+
await this.process.terminate();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private rejectPending(error: Error): void {
|
|
111
|
+
for (const pending of this.pending.values()) {
|
|
112
|
+
clearTimeout(pending.timer);
|
|
113
|
+
pending.reject(error);
|
|
114
|
+
}
|
|
115
|
+
this.pending.clear();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private fail(error: Error): void {
|
|
119
|
+
if (this.stopped) return;
|
|
120
|
+
this.stopped = true;
|
|
121
|
+
this.rejectPending(error);
|
|
122
|
+
this.options.onFailure(error);
|
|
123
|
+
void this.process.terminate();
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private read(chunk: Buffer): void {
|
|
127
|
+
let offset = 0;
|
|
128
|
+
while (offset < chunk.length && !this.stopped) {
|
|
129
|
+
const newline = chunk.indexOf(0x0a, offset);
|
|
130
|
+
const end = newline === -1 ? chunk.length : newline;
|
|
131
|
+
const segment = chunk.subarray(offset, end);
|
|
132
|
+
if (this.buffer.length + segment.length > this.options.maxLineBytes) {
|
|
133
|
+
this.fail(new Error(`${this.options.label} stdout line exceeded maxLineBytes`));
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.buffer = Buffer.concat([this.buffer, segment]);
|
|
137
|
+
if (newline === -1) return;
|
|
138
|
+
const line = this.buffer;
|
|
139
|
+
this.buffer = Buffer.alloc(0);
|
|
140
|
+
this.line(line);
|
|
141
|
+
offset = newline + 1;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private line(line: Buffer): void {
|
|
146
|
+
if (!line.toString("utf8").trim()) return;
|
|
147
|
+
let message: RpcRecord | undefined;
|
|
148
|
+
try {
|
|
149
|
+
message = asRecord(JSON.parse(line.toString("utf8")));
|
|
150
|
+
} catch {
|
|
151
|
+
/* Rejected below. */
|
|
152
|
+
}
|
|
153
|
+
if (message?.jsonrpc !== "2.0") {
|
|
154
|
+
this.fail(new Error(`${this.options.label} returned an invalid JSON-RPC message`));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
this.options.onActivity();
|
|
158
|
+
if (message.method === undefined) {
|
|
159
|
+
const pending = this.pending.get(message.id as RpcId);
|
|
160
|
+
if (!pending) return;
|
|
161
|
+
this.pending.delete(message.id as RpcId);
|
|
162
|
+
clearTimeout(pending.timer);
|
|
163
|
+
const error = asRecord(message.error);
|
|
164
|
+
if (error)
|
|
165
|
+
pending.reject(new Error(String(error.message ?? `${this.options.label} request failed`)));
|
|
166
|
+
else pending.resolve(asRecord(message.result) ?? {});
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
this.queuedBytes += line.length;
|
|
170
|
+
if (this.queuedBytes > this.options.maxQueuedBytes) {
|
|
171
|
+
this.fail(new Error(`${this.options.label} pending events exceeded maxQueuedBytes`));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const queued = message;
|
|
175
|
+
this.chain = this.chain
|
|
176
|
+
.then(async () => {
|
|
177
|
+
try {
|
|
178
|
+
if (!this.stopped) await this.options.onMessage(queued);
|
|
179
|
+
} finally {
|
|
180
|
+
this.queuedBytes -= line.length;
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
.catch((error: unknown) =>
|
|
184
|
+
this.fail(error instanceof Error ? error : new Error(String(error))),
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
readArtifactSnapshotManifest,
|
|
7
7
|
} from "../../core/index.js";
|
|
8
8
|
|
|
9
|
-
const IGNORED_DIRS = new Set(["node_modules", "
|
|
9
|
+
const IGNORED_DIRS = new Set(["node_modules", "dist"]);
|
|
10
10
|
|
|
11
11
|
/** Enumerate agent-authored files without following symlinks or build/dependency trees. */
|
|
12
12
|
export const walkArtifacts = async (root: string, max = 500): Promise<Artifact[]> => {
|
|
@@ -71,7 +71,11 @@ export const walkArtifacts = async (root: string, max = 500): Promise<Artifact[]
|
|
|
71
71
|
const full = join(dir, entry.name);
|
|
72
72
|
if (entry.isDirectory()) {
|
|
73
73
|
if (await collectSnapshot(full)) continue;
|
|
74
|
-
if (
|
|
74
|
+
if (
|
|
75
|
+
(entry.name.startsWith(".") && entry.name !== ".spectral") ||
|
|
76
|
+
IGNORED_DIRS.has(entry.name)
|
|
77
|
+
)
|
|
78
|
+
continue;
|
|
75
79
|
await walk(full);
|
|
76
80
|
} else if (entry.isFile()) {
|
|
77
81
|
const metadata = await lstat(full);
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { lstat, readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { walkAuthoredFiles } from "../../core/file-tree.js";
|
|
6
|
+
import { contentHash, valueHash } from "../../core/hash.js";
|
|
7
|
+
import {
|
|
8
|
+
prepareClaudeExperimentConfig,
|
|
9
|
+
prepareCodexExperimentConfig,
|
|
10
|
+
} from "./experiment-policy.js";
|
|
11
|
+
|
|
12
|
+
const ClaudeSettingsFileSchema = z.looseObject({
|
|
13
|
+
enabledPlugins: z.record(z.string(), z.boolean()).optional(),
|
|
14
|
+
});
|
|
15
|
+
const ClaudeInstalledPluginRecordSchema = z.looseObject({
|
|
16
|
+
installPath: z.string(),
|
|
17
|
+
});
|
|
18
|
+
const ClaudeInstalledPluginsFileSchema = z.looseObject({
|
|
19
|
+
plugins: z.record(z.string(), z.array(ClaudeInstalledPluginRecordSchema)),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const optionalRegularFileHash = async (path: string): Promise<string | null> => {
|
|
23
|
+
try {
|
|
24
|
+
const info = await lstat(path);
|
|
25
|
+
if (info.isSymbolicLink() || !info.isFile()) {
|
|
26
|
+
throw new Error(`behavior-affecting settings must be a regular file: ${path}`);
|
|
27
|
+
}
|
|
28
|
+
return contentHash(await readFile(path));
|
|
29
|
+
} catch (error) {
|
|
30
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return null;
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const driverConfigRecord = (driver: unknown): Record<string, unknown> => {
|
|
36
|
+
if (!driver || typeof driver !== "object") return {};
|
|
37
|
+
const config = (driver as { config?: unknown }).config;
|
|
38
|
+
return config && typeof config === "object" ? (config as Record<string, unknown>) : {};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const claudeConfigRoot = (driver: unknown): string => {
|
|
42
|
+
const config = driverConfigRecord(driver);
|
|
43
|
+
const env =
|
|
44
|
+
config.env && typeof config.env === "object"
|
|
45
|
+
? (config.env as Record<string, unknown>)
|
|
46
|
+
: undefined;
|
|
47
|
+
const configured = env?.CLAUDE_CONFIG_DIR;
|
|
48
|
+
const root =
|
|
49
|
+
typeof configured === "string"
|
|
50
|
+
? configured
|
|
51
|
+
: (process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), ".claude"));
|
|
52
|
+
if (!isAbsolute(root)) {
|
|
53
|
+
throw new Error("CLAUDE_CONFIG_DIR must be absolute for reproducible experiment identity");
|
|
54
|
+
}
|
|
55
|
+
return resolve(root);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const hashBehaviorDirectory = async (
|
|
59
|
+
root: string,
|
|
60
|
+
label: string,
|
|
61
|
+
): Promise<Array<{ path: string; hash: string }>> => {
|
|
62
|
+
try {
|
|
63
|
+
const info = await lstat(root);
|
|
64
|
+
if (info.isSymbolicLink() || !info.isDirectory()) {
|
|
65
|
+
throw new Error(`behavior-affecting Claude source must be a real directory: ${root}`);
|
|
66
|
+
}
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
const paths = await walkAuthoredFiles(root);
|
|
72
|
+
if (paths.length > 5_000) {
|
|
73
|
+
throw new Error(`behavior-affecting Claude source '${label}' exceeds 5000 files`);
|
|
74
|
+
}
|
|
75
|
+
let bytes = 0;
|
|
76
|
+
const hashes: Array<{ path: string; hash: string }> = [];
|
|
77
|
+
for (const path of paths) {
|
|
78
|
+
const content = await readFile(join(root, path));
|
|
79
|
+
bytes += content.length;
|
|
80
|
+
if (bytes > 256 * 1024 * 1024) {
|
|
81
|
+
throw new Error(`behavior-affecting Claude source '${label}' exceeds 256 MiB`);
|
|
82
|
+
}
|
|
83
|
+
hashes.push({ path: `${label}/${path}`, hash: contentHash(content) });
|
|
84
|
+
}
|
|
85
|
+
return hashes;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Hash every intentionally loaded user behavior source without persisting its
|
|
90
|
+
* contents. This covers user instructions/rules/output styles and the exact
|
|
91
|
+
* installed contents of plugins enabled by settings.json.
|
|
92
|
+
*/
|
|
93
|
+
export const claudeUserBehaviorHash = async (configRoot: string): Promise<string | null> => {
|
|
94
|
+
const settingsPath = join(configRoot, "settings.json");
|
|
95
|
+
const settingsHash = await optionalRegularFileHash(settingsPath);
|
|
96
|
+
const sources: Array<{ path: string; hash: string }> = [];
|
|
97
|
+
if (settingsHash) sources.push({ path: "settings.json", hash: settingsHash });
|
|
98
|
+
const claudeMdHash = await optionalRegularFileHash(join(configRoot, "CLAUDE.md"));
|
|
99
|
+
if (claudeMdHash) sources.push({ path: "CLAUDE.md", hash: claudeMdHash });
|
|
100
|
+
for (const directory of ["rules", "output-styles", "agents", "commands", "skills"]) {
|
|
101
|
+
sources.push(...(await hashBehaviorDirectory(join(configRoot, directory), directory)));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let settings: unknown;
|
|
105
|
+
try {
|
|
106
|
+
const contents = await readFile(settingsPath, "utf8");
|
|
107
|
+
try {
|
|
108
|
+
settings = JSON.parse(contents);
|
|
109
|
+
} catch {
|
|
110
|
+
throw new Error("Claude settings.json contains invalid JSON");
|
|
111
|
+
}
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") {
|
|
114
|
+
settings = undefined;
|
|
115
|
+
} else {
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const parsedSettings = ClaudeSettingsFileSchema.safeParse(settings);
|
|
120
|
+
if (settings !== undefined && !parsedSettings.success) {
|
|
121
|
+
throw new Error("Claude settings.json has an invalid enabledPlugins map");
|
|
122
|
+
}
|
|
123
|
+
const enabledPlugins = parsedSettings.success ? parsedSettings.data.enabledPlugins : undefined;
|
|
124
|
+
const enabledIds = Object.entries(enabledPlugins ?? {})
|
|
125
|
+
.filter(([, value]) => value === true)
|
|
126
|
+
.map(([id]) => id)
|
|
127
|
+
.sort();
|
|
128
|
+
if (enabledIds.length > 0) {
|
|
129
|
+
const installedPath = join(configRoot, "plugins", "installed_plugins.json");
|
|
130
|
+
const installedHash = await optionalRegularFileHash(installedPath);
|
|
131
|
+
if (installedHash) {
|
|
132
|
+
sources.push({ path: "plugins/installed_plugins.json", hash: installedHash });
|
|
133
|
+
}
|
|
134
|
+
let installed: unknown;
|
|
135
|
+
try {
|
|
136
|
+
installed = JSON.parse(await readFile(installedPath, "utf8"));
|
|
137
|
+
} catch {
|
|
138
|
+
installed = undefined;
|
|
139
|
+
}
|
|
140
|
+
const parsedInstalled = ClaudeInstalledPluginsFileSchema.safeParse(installed);
|
|
141
|
+
if (!parsedInstalled.success) {
|
|
142
|
+
throw new Error("enabled Claude plugins have invalid installed metadata");
|
|
143
|
+
}
|
|
144
|
+
const plugins = parsedInstalled.data.plugins;
|
|
145
|
+
for (const id of enabledIds) {
|
|
146
|
+
const records = plugins[id];
|
|
147
|
+
if (!records || records.length === 0) {
|
|
148
|
+
throw new Error(`enabled Claude plugin '${id}' has no installed content to hash`);
|
|
149
|
+
}
|
|
150
|
+
for (const [index, record] of records.entries()) {
|
|
151
|
+
const installPath = record.installPath;
|
|
152
|
+
sources.push(
|
|
153
|
+
...(await hashBehaviorDirectory(resolve(installPath), `plugins/enabled/${id}/${index}`)),
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return sources.length === 0 ? null : valueHash(sources);
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export const configuredClaudeSourceHashes = async (
|
|
162
|
+
driver: unknown,
|
|
163
|
+
baseRoot: string,
|
|
164
|
+
cache: Map<string, Promise<string>> = new Map(),
|
|
165
|
+
): Promise<Array<{ kind: "plugin" | "read"; path: string; hash: string }>> => {
|
|
166
|
+
const name =
|
|
167
|
+
typeof driver === "string" ? driver : (driver as { name?: unknown } | undefined)?.name;
|
|
168
|
+
const driverCli = name === "claude-code" || name === "codex" ? { name } : undefined;
|
|
169
|
+
if (!driverCli) return [];
|
|
170
|
+
const config = driverConfigRecord(driver);
|
|
171
|
+
// This also rejects path-bearing extraArgs that would evade the source
|
|
172
|
+
// hashes below. Runtime applies the same guard before driver creation.
|
|
173
|
+
if (driverCli.name === "claude-code") prepareClaudeExperimentConfig(config);
|
|
174
|
+
else prepareCodexExperimentConfig(config);
|
|
175
|
+
const isolation =
|
|
176
|
+
config.isolation && typeof config.isolation === "object"
|
|
177
|
+
? (config.isolation as Record<string, unknown>)
|
|
178
|
+
: undefined;
|
|
179
|
+
const configured = [
|
|
180
|
+
...(driverCli.name === "claude-code" && Array.isArray(config.pluginDirs)
|
|
181
|
+
? config.pluginDirs.map((path) => ({ kind: "plugin" as const, path }))
|
|
182
|
+
: []),
|
|
183
|
+
...(Array.isArray(config.addDirs)
|
|
184
|
+
? config.addDirs.map((path) => ({ kind: "read" as const, path }))
|
|
185
|
+
: []),
|
|
186
|
+
...(driverCli.name === "claude-code" && isolation && Array.isArray(isolation.allowRead)
|
|
187
|
+
? isolation.allowRead.map((path) => ({ kind: "read" as const, path }))
|
|
188
|
+
: []),
|
|
189
|
+
].filter(
|
|
190
|
+
(entry): entry is { kind: "plugin" | "read"; path: string } =>
|
|
191
|
+
typeof entry.path === "string" && entry.path.length > 0,
|
|
192
|
+
);
|
|
193
|
+
return Promise.all(
|
|
194
|
+
configured
|
|
195
|
+
.sort((a, b) => `${a.kind}:${a.path}`.localeCompare(`${b.kind}:${b.path}`))
|
|
196
|
+
.map(async ({ kind, path }) => {
|
|
197
|
+
const absolute = resolve(baseRoot, path);
|
|
198
|
+
const key = `${kind}:${absolute}`;
|
|
199
|
+
let hash = cache.get(key);
|
|
200
|
+
if (!hash) {
|
|
201
|
+
hash = hashBehaviorDirectory(
|
|
202
|
+
absolute,
|
|
203
|
+
`driver/${kind}/${contentHash(absolute).slice(0, 12)}`,
|
|
204
|
+
).then(valueHash);
|
|
205
|
+
cache.set(key, hash);
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
kind,
|
|
209
|
+
path: absolute,
|
|
210
|
+
hash: await hash,
|
|
211
|
+
};
|
|
212
|
+
}),
|
|
213
|
+
);
|
|
214
|
+
};
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { isAbsolute } from "node:path";
|
|
2
|
+
|
|
3
|
+
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
4
|
+
Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
5
|
+
|
|
6
|
+
const EXPERIMENT_BEHAVIOR_SOURCE_ARGS = new Set([
|
|
7
|
+
"--continue",
|
|
8
|
+
"-c",
|
|
9
|
+
"--fork-session",
|
|
10
|
+
"--resume",
|
|
11
|
+
"-r",
|
|
12
|
+
"--add-dir",
|
|
13
|
+
"--append-system-prompt-file",
|
|
14
|
+
"--mcp-config",
|
|
15
|
+
"--plugin-dir",
|
|
16
|
+
"--settings",
|
|
17
|
+
"--setting-sources",
|
|
18
|
+
"--system-prompt-file",
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
const CODEX_EXPERIMENT_SOURCE_ARGS = new Set([
|
|
22
|
+
"--add-dir",
|
|
23
|
+
"--cd",
|
|
24
|
+
"-C",
|
|
25
|
+
"--config",
|
|
26
|
+
"-c",
|
|
27
|
+
"--profile",
|
|
28
|
+
"-p",
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
const bindSubprocessExperimentConfig = (config: Record<string, unknown>): unknown => {
|
|
32
|
+
if (typeof config.command !== "string" || !isAbsolute(config.command)) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
"experiment subprocess commands must be absolute direct wrappers so Lux can fingerprint the invoked behavior",
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
if (typeof config.cwd === "string") {
|
|
38
|
+
throw new Error(
|
|
39
|
+
"experiment runs do not allow an explicit subprocess cwd; use the candidate subject and staged fixtures",
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
if (Array.isArray(config.args) && config.args.length > 0) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
"experiment subprocesses do not allow args; put stable behavior in the fingerprinted direct wrapper",
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
if (isRecord(config.env) && Object.keys(config.env).length > 0) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
"experiment subprocesses do not allow custom env; put stable behavior in the fingerprinted direct wrapper",
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
return { ...config, inheritEnv: false };
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
type AgentDriverName = "claude-code" | "codex";
|
|
56
|
+
|
|
57
|
+
const validateAgentExperimentConfig = (
|
|
58
|
+
driverName: AgentDriverName,
|
|
59
|
+
config: Record<string, unknown>,
|
|
60
|
+
): { driverEnv: Record<string, unknown>; extraArgs: string[] } => {
|
|
61
|
+
const driverEnv = isRecord(config.env) ? config.env : {};
|
|
62
|
+
const commandResolutionOverride = Object.keys(driverEnv).find((name) =>
|
|
63
|
+
["PATH", "PATHEXT"].includes(name.toUpperCase()),
|
|
64
|
+
);
|
|
65
|
+
if (commandResolutionOverride) {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`experiment runs do not allow driver env.${commandResolutionOverride}; command resolution must match the fingerprinted host executable`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
if (typeof config.cwd === "string") {
|
|
71
|
+
throw new Error(
|
|
72
|
+
`experiment runs do not allow an explicit ${driverName} cwd; use the candidate subject and staged fixtures`,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const extraArgs = Array.isArray(config.extraArgs)
|
|
77
|
+
? config.extraArgs.filter((value): value is string => typeof value === "string")
|
|
78
|
+
: [];
|
|
79
|
+
const disallowedArgs =
|
|
80
|
+
driverName === "claude-code" ? EXPERIMENT_BEHAVIOR_SOURCE_ARGS : CODEX_EXPERIMENT_SOURCE_ARGS;
|
|
81
|
+
const behaviorSourceArg = extraArgs.find((arg) =>
|
|
82
|
+
[...disallowedArgs].some((name) => arg === name || arg.startsWith(`${name}=`)),
|
|
83
|
+
);
|
|
84
|
+
if (behaviorSourceArg) {
|
|
85
|
+
throw new Error(
|
|
86
|
+
`experiment runs do not allow behavior-bearing extraArgs '${behaviorSourceArg}'; use structured driver fields so Lux can fingerprint the source`,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const isolation = isRecord(config.isolation) ? config.isolation : {};
|
|
91
|
+
const structuredPaths = [
|
|
92
|
+
...(driverName === "claude-code" && Array.isArray(config.pluginDirs) ? config.pluginDirs : []),
|
|
93
|
+
...(Array.isArray(config.addDirs) ? config.addDirs : []),
|
|
94
|
+
...(driverName === "claude-code" && Array.isArray(isolation.allowRead)
|
|
95
|
+
? isolation.allowRead
|
|
96
|
+
: []),
|
|
97
|
+
].filter((value): value is string => typeof value === "string");
|
|
98
|
+
const relativeSource = structuredPaths.find((path) => !isAbsolute(path));
|
|
99
|
+
if (relativeSource) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`experiment driver source paths must be absolute after subjectPath binding: ${relativeSource}`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
return { driverEnv, extraArgs };
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const bindCodexExperimentConfig = (
|
|
108
|
+
config: Record<string, unknown>,
|
|
109
|
+
extraArgs: readonly string[],
|
|
110
|
+
): unknown => {
|
|
111
|
+
if (typeof config.profile === "string") {
|
|
112
|
+
throw new Error(
|
|
113
|
+
"experiment runs do not allow a Codex profile; use inline driver config so Lux can fingerprint it",
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
if (config.ephemeral === false) {
|
|
117
|
+
throw new Error("experiment runs require ephemeral Codex sessions");
|
|
118
|
+
}
|
|
119
|
+
const inlineConfig = isRecord(config.config) ? config.config : {};
|
|
120
|
+
const externalConfigKey = ((): string | undefined => {
|
|
121
|
+
const visit = (value: Record<string, unknown>, parent = ""): string | undefined => {
|
|
122
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
123
|
+
const path = parent ? `${parent}.${key}` : key;
|
|
124
|
+
if (/(?:mcp_servers|instructions_file|notify|project_doc)/i.test(key)) return path;
|
|
125
|
+
if (isRecord(nested)) {
|
|
126
|
+
const found = visit(nested, path);
|
|
127
|
+
if (found) return found;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return undefined;
|
|
131
|
+
};
|
|
132
|
+
return visit(inlineConfig);
|
|
133
|
+
})();
|
|
134
|
+
if (externalConfigKey) {
|
|
135
|
+
throw new Error(
|
|
136
|
+
`experiment runs do not allow path-bearing Codex config '${externalConfigKey}'`,
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
const appServer = config.interactionMode !== "exec";
|
|
140
|
+
return {
|
|
141
|
+
...config,
|
|
142
|
+
ephemeral: true,
|
|
143
|
+
ignoreUserConfig: true,
|
|
144
|
+
ignoreRules: !appServer,
|
|
145
|
+
...(appServer && !config.isolation ? { isolation: { allowRead: [] } } : {}),
|
|
146
|
+
extraArgs,
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const bindClaudeExperimentConfig = (
|
|
151
|
+
config: Record<string, unknown>,
|
|
152
|
+
extraArgs: readonly string[],
|
|
153
|
+
driverEnv: Record<string, unknown>,
|
|
154
|
+
): unknown => {
|
|
155
|
+
if (config.isolation) return config;
|
|
156
|
+
return {
|
|
157
|
+
...config,
|
|
158
|
+
extraArgs: [
|
|
159
|
+
...extraArgs,
|
|
160
|
+
"--setting-sources",
|
|
161
|
+
"user",
|
|
162
|
+
"--strict-mcp-config",
|
|
163
|
+
"--settings",
|
|
164
|
+
JSON.stringify({ disableAllHooks: true }),
|
|
165
|
+
],
|
|
166
|
+
env: {
|
|
167
|
+
...driverEnv,
|
|
168
|
+
CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
|
|
169
|
+
CLAUDE_CODE_DISABLE_CLAUDE_MDS: "1",
|
|
170
|
+
CLAUDE_CODE_SKIP_PROMPT_HISTORY: "1",
|
|
171
|
+
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1",
|
|
172
|
+
CLAUDE_CODE_AUTO_CONNECT_IDE: "false",
|
|
173
|
+
CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL: "1",
|
|
174
|
+
DISABLE_AUTOUPDATER: "1",
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
export const prepareClaudeExperimentConfig = <Cfg extends Record<string, unknown>>(
|
|
180
|
+
config: Cfg,
|
|
181
|
+
): Cfg => {
|
|
182
|
+
const { driverEnv, extraArgs } = validateAgentExperimentConfig("claude-code", config);
|
|
183
|
+
return bindClaudeExperimentConfig(config, extraArgs, driverEnv) as Cfg;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
export const prepareCodexExperimentConfig = <Cfg extends Record<string, unknown>>(
|
|
187
|
+
config: Cfg,
|
|
188
|
+
): Cfg => {
|
|
189
|
+
const { extraArgs } = validateAgentExperimentConfig("codex", config);
|
|
190
|
+
return bindCodexExperimentConfig(config, extraArgs) as Cfg;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
export const prepareSubprocessExperimentConfig = <Cfg extends Record<string, unknown>>(
|
|
194
|
+
config: Cfg,
|
|
195
|
+
): Cfg => bindSubprocessExperimentConfig(config) as Cfg;
|