@prismatic-io/lux 0.0.2-preview.3 → 0.0.2-preview.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/answerers/claude-code/index.d.ts +15 -3
- package/lib/answerers/claude-code/index.d.ts.map +1 -1
- package/lib/answerers/claude-code/index.js +6 -5
- package/lib/answerers/claude-code/index.js.map +1 -1
- package/lib/answerers/persona/index.d.ts +44 -5
- package/lib/answerers/persona/index.d.ts.map +1 -1
- package/lib/answerers/persona/index.js +60 -34
- package/lib/answerers/persona/index.js.map +1 -1
- package/lib/answerers/terminal/index.d.ts +9 -3
- package/lib/answerers/terminal/index.d.ts.map +1 -1
- package/lib/answerers/terminal/index.js +7 -5
- package/lib/answerers/terminal/index.js.map +1 -1
- package/lib/assertions/authoring.d.ts +2 -2
- package/lib/assertions/authoring.d.ts.map +1 -1
- package/lib/assertions/authoring.js.map +1 -1
- package/lib/assertions/core/command-exits-zero.d.ts +4 -1
- package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
- package/lib/assertions/core/command-exits-zero.js +50 -7
- package/lib/assertions/core/command-exits-zero.js.map +1 -1
- package/lib/assertions/core/event-checks.d.ts +3 -0
- package/lib/assertions/core/event-checks.d.ts.map +1 -1
- package/lib/assertions/core/event-checks.js +49 -3
- package/lib/assertions/core/event-checks.js.map +1 -1
- package/lib/assertions/core/file-checks.d.ts +6 -0
- package/lib/assertions/core/file-checks.d.ts.map +1 -1
- package/lib/assertions/core/helpers.d.ts +2 -7
- package/lib/assertions/core/helpers.d.ts.map +1 -1
- package/lib/assertions/core/helpers.js +2 -6
- package/lib/assertions/core/helpers.js.map +1 -1
- package/lib/assertions/core/index.d.ts.map +1 -1
- package/lib/assertions/core/index.js +2 -1
- package/lib/assertions/core/index.js.map +1 -1
- package/lib/assertions/core/json-pointer-equals.d.ts +1 -0
- package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -1
- package/lib/assertions/core/output-checks.d.ts +3 -0
- package/lib/assertions/core/output-checks.d.ts.map +1 -1
- package/lib/assertions/core/predicate.d.ts +1 -0
- package/lib/assertions/core/predicate.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.d.ts +25 -0
- package/lib/assertions/core/resource-checks.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.js +35 -5
- package/lib/assertions/core/resource-checks.js.map +1 -1
- package/lib/assertions/rubric/index.d.ts +28 -3
- package/lib/assertions/rubric/index.d.ts.map +1 -1
- package/lib/assertions/rubric/index.js +59 -13
- package/lib/assertions/rubric/index.js.map +1 -1
- package/lib/assertions/rubric/internal.d.ts +30 -5
- package/lib/assertions/rubric/internal.d.ts.map +1 -1
- package/lib/assertions/rubric/internal.js +181 -28
- package/lib/assertions/rubric/internal.js.map +1 -1
- package/lib/authoring.d.ts +36 -2
- package/lib/authoring.d.ts.map +1 -1
- package/lib/authoring.js +36 -1
- package/lib/authoring.js.map +1 -1
- package/lib/cli/bin.js +2 -13
- package/lib/cli/bin.js.map +1 -1
- package/lib/cli/command-runtime.d.ts +3 -3
- package/lib/cli/command-runtime.d.ts.map +1 -1
- package/lib/cli/command-runtime.js +17 -6
- package/lib/cli/command-runtime.js.map +1 -1
- package/lib/cli/doctor.d.ts +55 -0
- package/lib/cli/doctor.d.ts.map +1 -0
- package/lib/cli/doctor.js +14 -0
- package/lib/cli/doctor.js.map +1 -0
- package/lib/cli/harness-plan.d.ts +26 -0
- package/lib/cli/harness-plan.d.ts.map +1 -0
- package/lib/cli/harness-plan.js +75 -0
- package/lib/cli/harness-plan.js.map +1 -0
- package/lib/cli/init-templates.d.ts +11 -0
- package/lib/cli/init-templates.d.ts.map +1 -0
- package/lib/cli/init-templates.js +215 -0
- package/lib/cli/init-templates.js.map +1 -0
- package/lib/cli/init.d.ts +10 -0
- package/lib/cli/init.d.ts.map +1 -1
- package/lib/cli/init.js +34 -173
- package/lib/cli/init.js.map +1 -1
- package/lib/cli/output-schemas.d.ts +1408 -0
- package/lib/cli/output-schemas.d.ts.map +1 -0
- package/lib/cli/output-schemas.js +91 -0
- package/lib/cli/output-schemas.js.map +1 -0
- package/lib/cli/program.d.ts +140 -12
- package/lib/cli/program.d.ts.map +1 -1
- package/lib/cli/program.js +779 -646
- package/lib/cli/program.js.map +1 -1
- package/lib/cli/render/reporter.d.ts.map +1 -1
- package/lib/cli/render/reporter.js +48 -8
- package/lib/cli/render/reporter.js.map +1 -1
- package/lib/cli/run-options.d.ts +20 -4
- package/lib/cli/run-options.d.ts.map +1 -1
- package/lib/cli/run-options.js +100 -19
- package/lib/cli/run-options.js.map +1 -1
- package/lib/cli/view.d.ts +15 -0
- package/lib/cli/view.d.ts.map +1 -0
- package/lib/cli/view.js +168 -0
- package/lib/cli/view.js.map +1 -0
- package/lib/container/driver.d.ts +27 -0
- package/lib/container/driver.d.ts.map +1 -0
- package/lib/container/driver.js +197 -0
- package/lib/container/driver.js.map +1 -0
- package/lib/container/protocol.d.ts +12 -0
- package/lib/container/protocol.d.ts.map +1 -0
- package/lib/container/protocol.js +38 -0
- package/lib/container/protocol.js.map +1 -0
- package/lib/container/resources.d.ts +12 -0
- package/lib/container/resources.d.ts.map +1 -0
- package/lib/container/resources.js +133 -0
- package/lib/container/resources.js.map +1 -0
- package/lib/container/worker.d.ts +2 -0
- package/lib/container/worker.d.ts.map +1 -0
- package/lib/container/worker.js +85 -0
- package/lib/container/worker.js.map +1 -0
- package/lib/core/action-events.d.ts +29 -0
- package/lib/core/action-events.d.ts.map +1 -0
- package/lib/core/action-events.js +51 -0
- package/lib/core/action-events.js.map +1 -0
- package/lib/core/agent-activity.d.ts +49 -0
- package/lib/core/agent-activity.d.ts.map +1 -0
- package/lib/core/agent-activity.js +206 -0
- package/lib/core/agent-activity.js.map +1 -0
- package/lib/core/agent-environment.d.ts +5 -0
- package/lib/core/agent-environment.d.ts.map +1 -0
- package/lib/core/agent-environment.js +47 -0
- package/lib/core/agent-environment.js.map +1 -0
- package/lib/core/agent-events.d.ts +26 -0
- package/lib/core/agent-events.d.ts.map +1 -0
- package/lib/core/agent-events.js +13 -0
- package/lib/core/agent-events.js.map +1 -0
- package/lib/core/annotation.d.ts +6 -2
- package/lib/core/annotation.d.ts.map +1 -1
- package/lib/core/annotation.js +2 -1
- package/lib/core/annotation.js.map +1 -1
- package/lib/core/answerer.d.ts +12 -0
- package/lib/core/answerer.d.ts.map +1 -1
- package/lib/core/answerer.js +2 -0
- package/lib/core/answerer.js.map +1 -1
- package/lib/core/artifact-evidence.d.ts +8 -0
- package/lib/core/artifact-evidence.d.ts.map +1 -1
- package/lib/core/artifact-evidence.js +36 -4
- package/lib/core/artifact-evidence.js.map +1 -1
- package/lib/core/assertion.d.ts +20 -2
- package/lib/core/assertion.d.ts.map +1 -1
- package/lib/core/assertion.js +19 -1
- package/lib/core/assertion.js.map +1 -1
- package/lib/core/case.d.ts +111 -3
- package/lib/core/case.d.ts.map +1 -1
- package/lib/core/case.js +17 -2
- package/lib/core/case.js.map +1 -1
- package/lib/core/command-verification.d.ts +10 -0
- package/lib/core/command-verification.d.ts.map +1 -0
- package/lib/core/command-verification.js +66 -0
- package/lib/core/command-verification.js.map +1 -0
- package/lib/core/driver-execution.d.ts +83 -0
- package/lib/core/driver-execution.d.ts.map +1 -0
- package/lib/core/driver-execution.js +72 -0
- package/lib/core/driver-execution.js.map +1 -0
- package/lib/core/driver-metrics.d.ts +98 -0
- package/lib/core/driver-metrics.d.ts.map +1 -0
- package/lib/core/driver-metrics.js +36 -0
- package/lib/core/driver-metrics.js.map +1 -0
- package/lib/core/driver.d.ts +64 -0
- package/lib/core/driver.d.ts.map +1 -1
- package/lib/core/driver.js +28 -0
- package/lib/core/driver.js.map +1 -1
- package/lib/core/duration.d.ts +5 -0
- package/lib/core/duration.d.ts.map +1 -0
- package/lib/core/duration.js +49 -0
- package/lib/core/duration.js.map +1 -0
- package/lib/core/environment.d.ts +18 -0
- package/lib/core/environment.d.ts.map +1 -0
- package/lib/core/environment.js +21 -0
- package/lib/core/environment.js.map +1 -0
- package/lib/core/evaluation-clusters.d.ts +17 -0
- package/lib/core/evaluation-clusters.d.ts.map +1 -0
- package/lib/core/evaluation-clusters.js +23 -0
- package/lib/core/evaluation-clusters.js.map +1 -0
- package/lib/core/events.d.ts +36 -0
- package/lib/core/events.d.ts.map +1 -1
- package/lib/core/events.js +12 -2
- package/lib/core/events.js.map +1 -1
- package/lib/core/experiment.d.ts +32 -2
- package/lib/core/experiment.d.ts.map +1 -1
- package/lib/core/experiment.js +35 -18
- package/lib/core/experiment.js.map +1 -1
- package/lib/core/file-tree.d.ts +7 -0
- package/lib/core/file-tree.d.ts.map +1 -0
- package/lib/core/file-tree.js +35 -0
- package/lib/core/file-tree.js.map +1 -0
- package/lib/core/global-id.d.ts +6 -0
- package/lib/core/global-id.d.ts.map +1 -0
- package/lib/core/global-id.js +17 -0
- package/lib/core/global-id.js.map +1 -0
- package/lib/core/harness-catalog.d.ts +35 -0
- package/lib/core/harness-catalog.d.ts.map +1 -0
- package/lib/core/harness-catalog.js +45 -0
- package/lib/core/harness-catalog.js.map +1 -0
- package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
- package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
- package/lib/core/harness-catalogs/antigravity.js +23 -0
- package/lib/core/harness-catalogs/antigravity.js.map +1 -0
- package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
- package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
- package/lib/core/harness-catalogs/claude-code.js +24 -0
- package/lib/core/harness-catalogs/claude-code.js.map +1 -0
- package/lib/core/harness-catalogs/codex.d.ts +11 -0
- package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
- package/lib/core/harness-catalogs/codex.js +26 -0
- package/lib/core/harness-catalogs/codex.js.map +1 -0
- package/lib/core/harness-catalogs/copilot.d.ts +29 -0
- package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
- package/lib/core/harness-catalogs/copilot.js +45 -0
- package/lib/core/harness-catalogs/copilot.js.map +1 -0
- package/lib/core/harness-catalogs/cursor.d.ts +2 -0
- package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
- package/lib/core/harness-catalogs/cursor.js +13 -0
- package/lib/core/harness-catalogs/cursor.js.map +1 -0
- package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
- package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
- package/lib/core/harness-catalogs/grok-build.js +18 -0
- package/lib/core/harness-catalogs/grok-build.js.map +1 -0
- package/lib/core/harness-catalogs/index.d.ts +73 -0
- package/lib/core/harness-catalogs/index.d.ts.map +1 -0
- package/lib/core/harness-catalogs/index.js +17 -0
- package/lib/core/harness-catalogs/index.js.map +1 -0
- package/lib/core/harness-matrix.d.ts +154 -0
- package/lib/core/harness-matrix.d.ts.map +1 -0
- package/lib/core/harness-matrix.js +204 -0
- package/lib/core/harness-matrix.js.map +1 -0
- package/lib/core/index.d.ts +12 -0
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +12 -0
- package/lib/core/index.js.map +1 -1
- package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
- package/lib/core/lifecycle-fixtures.js +4 -2
- package/lib/core/lifecycle-fixtures.js.map +1 -1
- package/lib/core/model-cli.d.ts +9 -11
- package/lib/core/model-cli.d.ts.map +1 -1
- package/lib/core/model-cli.js +31 -19
- package/lib/core/model-cli.js.map +1 -1
- package/lib/core/platform-process.d.ts +6 -1
- package/lib/core/platform-process.d.ts.map +1 -1
- package/lib/core/platform-process.js +49 -11
- package/lib/core/platform-process.js.map +1 -1
- package/lib/core/rubric.d.ts +1 -0
- package/lib/core/rubric.d.ts.map +1 -1
- package/lib/core/run.d.ts +293 -1
- package/lib/core/run.d.ts.map +1 -1
- package/lib/core/run.js +27 -0
- package/lib/core/run.js.map +1 -1
- package/lib/core/secure-copy.d.ts.map +1 -0
- package/lib/core/secure-copy.js.map +1 -0
- package/lib/core/usage.d.ts +5 -0
- package/lib/core/usage.d.ts.map +1 -1
- package/lib/core/usage.js +3 -0
- package/lib/core/usage.js.map +1 -1
- package/lib/core/wire.d.ts +12 -0
- package/lib/core/wire.d.ts.map +1 -1
- package/lib/core/wire.js +5 -1
- package/lib/core/wire.js.map +1 -1
- package/lib/drivers/antigravity/artifacts.d.ts +2 -0
- package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
- package/lib/drivers/antigravity/artifacts.js +33 -0
- package/lib/drivers/antigravity/artifacts.js.map +1 -0
- package/lib/drivers/antigravity/config.d.ts +88 -0
- package/lib/drivers/antigravity/config.d.ts.map +1 -0
- package/lib/drivers/antigravity/config.js +87 -0
- package/lib/drivers/antigravity/config.js.map +1 -0
- package/lib/drivers/antigravity/events.d.ts +4 -0
- package/lib/drivers/antigravity/events.d.ts.map +1 -0
- package/lib/drivers/antigravity/events.js +241 -0
- package/lib/drivers/antigravity/events.js.map +1 -0
- package/lib/drivers/antigravity/index.d.ts +114 -0
- package/lib/drivers/antigravity/index.d.ts.map +1 -0
- package/lib/drivers/antigravity/index.js +113 -0
- package/lib/drivers/antigravity/index.js.map +1 -0
- package/lib/drivers/antigravity/runtime.d.ts +7 -0
- package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
- package/lib/drivers/antigravity/runtime.js +83 -0
- package/lib/drivers/antigravity/runtime.js.map +1 -0
- package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
- package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
- package/lib/drivers/claude-code/deferred-process.js +108 -0
- package/lib/drivers/claude-code/deferred-process.js.map +1 -0
- package/lib/drivers/claude-code/index.d.ts +180 -10
- package/lib/drivers/claude-code/index.d.ts.map +1 -1
- package/lib/drivers/claude-code/index.js +186 -252
- package/lib/drivers/claude-code/index.js.map +1 -1
- package/lib/drivers/claude-code/isolation.d.ts +8 -0
- package/lib/drivers/claude-code/isolation.d.ts.map +1 -0
- package/lib/drivers/claude-code/isolation.js +199 -0
- package/lib/drivers/claude-code/isolation.js.map +1 -0
- package/lib/drivers/claude-code/parse-events.d.ts.map +1 -1
- package/lib/drivers/claude-code/parse-events.js +73 -8
- package/lib/drivers/claude-code/parse-events.js.map +1 -1
- package/lib/drivers/codex/app-events.d.ts +9 -2
- package/lib/drivers/codex/app-events.d.ts.map +1 -1
- package/lib/drivers/codex/app-events.js +104 -12
- package/lib/drivers/codex/app-events.js.map +1 -1
- package/lib/drivers/codex/config.d.ts +66 -5
- package/lib/drivers/codex/config.d.ts.map +1 -1
- package/lib/drivers/codex/config.js +39 -8
- package/lib/drivers/codex/config.js.map +1 -1
- package/lib/drivers/codex/exec-events.d.ts +4 -0
- package/lib/drivers/codex/exec-events.d.ts.map +1 -0
- package/lib/drivers/codex/exec-events.js +230 -0
- package/lib/drivers/codex/exec-events.js.map +1 -0
- package/lib/drivers/codex/index.d.ts +138 -4
- package/lib/drivers/codex/index.d.ts.map +1 -1
- package/lib/drivers/codex/index.js +112 -276
- package/lib/drivers/codex/index.js.map +1 -1
- package/lib/drivers/copilot/config.d.ts +84 -0
- package/lib/drivers/copilot/config.d.ts.map +1 -0
- package/lib/drivers/copilot/config.js +57 -0
- package/lib/drivers/copilot/config.js.map +1 -0
- package/lib/drivers/copilot/index.d.ts +107 -0
- package/lib/drivers/copilot/index.d.ts.map +1 -0
- package/lib/drivers/copilot/index.js +268 -0
- package/lib/drivers/copilot/index.js.map +1 -0
- package/lib/drivers/cursor/config.d.ts +28 -0
- package/lib/drivers/cursor/config.d.ts.map +1 -0
- package/lib/drivers/cursor/config.js +28 -0
- package/lib/drivers/cursor/config.js.map +1 -0
- package/lib/drivers/cursor/index.d.ts +44 -0
- package/lib/drivers/cursor/index.d.ts.map +1 -0
- package/lib/drivers/cursor/index.js +286 -0
- package/lib/drivers/cursor/index.js.map +1 -0
- package/lib/drivers/cursor/interaction.d.ts +6 -0
- package/lib/drivers/cursor/interaction.d.ts.map +1 -0
- package/lib/drivers/cursor/interaction.js +55 -0
- package/lib/drivers/cursor/interaction.js.map +1 -0
- package/lib/drivers/grok-build/config.d.ts +68 -0
- package/lib/drivers/grok-build/config.d.ts.map +1 -0
- package/lib/drivers/grok-build/config.js +40 -0
- package/lib/drivers/grok-build/config.js.map +1 -0
- package/lib/drivers/grok-build/index.d.ts +87 -0
- package/lib/drivers/grok-build/index.d.ts.map +1 -0
- package/lib/drivers/grok-build/index.js +293 -0
- package/lib/drivers/grok-build/index.js.map +1 -0
- package/lib/drivers/mcp/index.d.ts +37 -4
- package/lib/drivers/mcp/index.d.ts.map +1 -1
- package/lib/drivers/mcp/index.js +25 -11
- package/lib/drivers/mcp/index.js.map +1 -1
- package/lib/drivers/shared/acp-events.d.ts +15 -0
- package/lib/drivers/shared/acp-events.d.ts.map +1 -0
- package/lib/drivers/shared/acp-events.js +83 -0
- package/lib/drivers/shared/acp-events.js.map +1 -0
- package/lib/drivers/shared/acp-interaction.d.ts +7 -0
- package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
- package/lib/drivers/shared/acp-interaction.js +20 -0
- package/lib/drivers/shared/acp-interaction.js.map +1 -0
- package/lib/drivers/shared/acp-session.d.ts +4 -0
- package/lib/drivers/shared/acp-session.d.ts.map +1 -0
- package/lib/drivers/shared/acp-session.js +23 -0
- package/lib/drivers/shared/acp-session.js.map +1 -0
- package/lib/drivers/shared/acp-transport.d.ts +40 -0
- package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
- package/lib/drivers/shared/acp-transport.js +152 -0
- package/lib/drivers/shared/acp-transport.js.map +1 -0
- package/lib/drivers/shared/artifacts.d.ts.map +1 -1
- package/lib/drivers/shared/artifacts.js +3 -2
- package/lib/drivers/shared/artifacts.js.map +1 -1
- package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
- package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-behavior.js +197 -0
- package/lib/drivers/shared/experiment-behavior.js.map +1 -0
- package/lib/drivers/shared/experiment-policy.d.ts +4 -0
- package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-policy.js +143 -0
- package/lib/drivers/shared/experiment-policy.js.map +1 -0
- package/lib/drivers/subprocess/index.d.ts +39 -4
- package/lib/drivers/subprocess/index.d.ts.map +1 -1
- package/lib/drivers/subprocess/index.js +56 -12
- package/lib/drivers/subprocess/index.js.map +1 -1
- package/lib/index.d.ts +22 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +20 -6
- package/lib/index.js.map +1 -1
- package/lib/optimization/reflective.d.ts +3 -1
- package/lib/optimization/reflective.d.ts.map +1 -1
- package/lib/optimization/reflective.js +3 -2
- package/lib/optimization/reflective.js.map +1 -1
- package/lib/orchestrator/annotation-loader.d.ts +6 -2
- package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
- package/lib/orchestrator/annotation-loader.js +8 -0
- package/lib/orchestrator/annotation-loader.js.map +1 -1
- package/lib/orchestrator/annotation-store.d.ts.map +1 -1
- package/lib/orchestrator/annotation-store.js +16 -2
- package/lib/orchestrator/annotation-store.js.map +1 -1
- package/lib/orchestrator/artifact-origin.d.ts +3 -0
- package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
- package/lib/orchestrator/artifact-origin.js +40 -0
- package/lib/orchestrator/artifact-origin.js.map +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/campaign-lifecycle.js +4 -1
- package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
- package/lib/orchestrator/candidates.d.ts.map +1 -1
- package/lib/orchestrator/candidates.js +3 -2
- package/lib/orchestrator/candidates.js.map +1 -1
- package/lib/orchestrator/compare.d.ts +19 -3
- package/lib/orchestrator/compare.d.ts.map +1 -1
- package/lib/orchestrator/compare.js +32 -6
- package/lib/orchestrator/compare.js.map +1 -1
- package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
- package/lib/orchestrator/comparison-identity.js +2 -0
- package/lib/orchestrator/comparison-identity.js.map +1 -1
- package/lib/orchestrator/config.d.ts +179 -1
- package/lib/orchestrator/config.d.ts.map +1 -1
- package/lib/orchestrator/config.js +18 -4
- package/lib/orchestrator/config.js.map +1 -1
- package/lib/orchestrator/discover.d.ts +1 -0
- package/lib/orchestrator/discover.d.ts.map +1 -1
- package/lib/orchestrator/discover.js +7 -1
- package/lib/orchestrator/discover.js.map +1 -1
- package/lib/orchestrator/doctor.d.ts +1 -0
- package/lib/orchestrator/doctor.d.ts.map +1 -1
- package/lib/orchestrator/doctor.js +121 -33
- package/lib/orchestrator/doctor.js.map +1 -1
- package/lib/orchestrator/driver-capabilities.d.ts +4 -0
- package/lib/orchestrator/driver-capabilities.d.ts.map +1 -0
- package/lib/orchestrator/driver-capabilities.js +13 -0
- package/lib/orchestrator/driver-capabilities.js.map +1 -0
- package/lib/orchestrator/driver-identity.d.ts +5 -0
- package/lib/orchestrator/driver-identity.d.ts.map +1 -0
- package/lib/orchestrator/driver-identity.js +51 -0
- package/lib/orchestrator/driver-identity.js.map +1 -0
- package/lib/orchestrator/experiment-context.d.ts +51 -3
- package/lib/orchestrator/experiment-context.d.ts.map +1 -1
- package/lib/orchestrator/experiment-context.js.map +1 -1
- package/lib/orchestrator/experiment-contracts.d.ts +30 -1
- package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.d.ts +2 -1
- package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.js +28 -22
- package/lib/orchestrator/experiment-corpus.js.map +1 -1
- package/lib/orchestrator/experiment-effects.d.ts +33 -0
- package/lib/orchestrator/experiment-effects.d.ts.map +1 -0
- package/lib/orchestrator/experiment-effects.js +44 -0
- package/lib/orchestrator/experiment-effects.js.map +1 -0
- package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
- package/lib/orchestrator/experiment-evaluation.js +56 -5
- package/lib/orchestrator/experiment-evaluation.js.map +1 -1
- package/lib/orchestrator/experiment-identity.d.ts +3 -0
- package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-identity.js +22 -33
- package/lib/orchestrator/experiment-identity.js.map +1 -1
- package/lib/orchestrator/experiment-loader.d.ts +8 -3
- package/lib/orchestrator/experiment-loader.d.ts.map +1 -1
- package/lib/orchestrator/experiment-preflight.d.ts +3 -0
- package/lib/orchestrator/experiment-preflight.d.ts.map +1 -0
- package/lib/orchestrator/experiment-preflight.js +21 -0
- package/lib/orchestrator/experiment-preflight.js.map +1 -0
- package/lib/orchestrator/experiment-report.d.ts +90 -1
- package/lib/orchestrator/experiment-report.d.ts.map +1 -1
- package/lib/orchestrator/experiment-report.js +9 -1
- package/lib/orchestrator/experiment-report.js.map +1 -1
- package/lib/orchestrator/experiment-runs.d.ts +61 -2
- package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runs.js +13 -5
- package/lib/orchestrator/experiment-runs.js.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
- package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.js +5 -220
- package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
- package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
- package/lib/orchestrator/experiment-selection.js +52 -0
- package/lib/orchestrator/experiment-selection.js.map +1 -1
- package/lib/orchestrator/experiment.d.ts +3 -3
- package/lib/orchestrator/experiment.d.ts.map +1 -1
- package/lib/orchestrator/experiment.js +26 -21
- package/lib/orchestrator/experiment.js.map +1 -1
- package/lib/orchestrator/fixture-identity.d.ts +1 -0
- package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
- package/lib/orchestrator/fixture-identity.js +6 -1
- package/lib/orchestrator/fixture-identity.js.map +1 -1
- package/lib/orchestrator/fs-read.d.ts +1 -6
- package/lib/orchestrator/fs-read.d.ts.map +1 -1
- package/lib/orchestrator/fs-read.js +2 -32
- package/lib/orchestrator/fs-read.js.map +1 -1
- package/lib/orchestrator/grader-experiment.d.ts +33 -3
- package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
- package/lib/orchestrator/grader-experiment.js +54 -9
- package/lib/orchestrator/grader-experiment.js.map +1 -1
- package/lib/orchestrator/grading.d.ts +2 -1
- package/lib/orchestrator/grading.d.ts.map +1 -1
- package/lib/orchestrator/grading.js +46 -31
- package/lib/orchestrator/grading.js.map +1 -1
- package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
- package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
- package/lib/orchestrator/harness-catalog-drift.js +90 -0
- package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
- package/lib/orchestrator/harness-registry.d.ts +4 -0
- package/lib/orchestrator/harness-registry.d.ts.map +1 -0
- package/lib/orchestrator/harness-registry.js +5 -0
- package/lib/orchestrator/harness-registry.js.map +1 -0
- package/lib/orchestrator/index.d.ts +1 -1
- package/lib/orchestrator/index.d.ts.map +1 -1
- package/lib/orchestrator/index.js +1 -1
- package/lib/orchestrator/index.js.map +1 -1
- package/lib/orchestrator/list-runs.d.ts +8 -1
- package/lib/orchestrator/list-runs.d.ts.map +1 -1
- package/lib/orchestrator/list-runs.js +81 -14
- package/lib/orchestrator/list-runs.js.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.js +3 -1
- package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
- package/lib/orchestrator/orchestrator.d.ts +18 -2
- package/lib/orchestrator/orchestrator.d.ts.map +1 -1
- package/lib/orchestrator/orchestrator.js +50 -168
- package/lib/orchestrator/orchestrator.js.map +1 -1
- package/lib/orchestrator/paired-effects.d.ts +34 -0
- package/lib/orchestrator/paired-effects.d.ts.map +1 -0
- package/lib/orchestrator/paired-effects.js +158 -0
- package/lib/orchestrator/paired-effects.js.map +1 -0
- package/lib/orchestrator/provenance.d.ts +5 -1
- package/lib/orchestrator/provenance.d.ts.map +1 -1
- package/lib/orchestrator/provenance.js +16 -3
- package/lib/orchestrator/provenance.js.map +1 -1
- package/lib/orchestrator/regrade.d.ts +9 -1
- package/lib/orchestrator/regrade.d.ts.map +1 -1
- package/lib/orchestrator/rubric-loader.js +1 -1
- package/lib/orchestrator/rubric-loader.js.map +1 -1
- package/lib/orchestrator/run-dir.d.ts +2 -0
- package/lib/orchestrator/run-dir.d.ts.map +1 -1
- package/lib/orchestrator/run-dir.js +1 -1
- package/lib/orchestrator/run-dir.js.map +1 -1
- package/lib/orchestrator/run-execution.d.ts +3 -0
- package/lib/orchestrator/run-execution.d.ts.map +1 -1
- package/lib/orchestrator/run-execution.js +66 -12
- package/lib/orchestrator/run-execution.js.map +1 -1
- package/lib/orchestrator/run-lifecycle.d.ts +1 -0
- package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/run-lifecycle.js +3 -2
- package/lib/orchestrator/run-lifecycle.js.map +1 -1
- package/lib/orchestrator/run-workspace.d.ts +10 -0
- package/lib/orchestrator/run-workspace.d.ts.map +1 -0
- package/lib/orchestrator/run-workspace.js +58 -0
- package/lib/orchestrator/run-workspace.js.map +1 -0
- package/lib/orchestrator/suite-compare.d.ts +37 -0
- package/lib/orchestrator/suite-compare.d.ts.map +1 -1
- package/lib/orchestrator/suite-compare.js +27 -17
- package/lib/orchestrator/suite-compare.js.map +1 -1
- package/lib/orchestrator/suite-runs.d.ts +6 -1
- package/lib/orchestrator/suite-runs.d.ts.map +1 -1
- package/lib/orchestrator/suite-runs.js +14 -2
- package/lib/orchestrator/suite-runs.js.map +1 -1
- package/lib/orchestrator/suite-summary.d.ts +77 -0
- package/lib/orchestrator/suite-summary.d.ts.map +1 -1
- package/lib/orchestrator/suite-summary.js +61 -12
- package/lib/orchestrator/suite-summary.js.map +1 -1
- package/lib/previewer/artifacts.d.ts +25 -0
- package/lib/previewer/artifacts.d.ts.map +1 -0
- package/lib/previewer/artifacts.js +180 -0
- package/lib/previewer/artifacts.js.map +1 -0
- package/lib/previewer/server.d.ts +111 -0
- package/lib/previewer/server.d.ts.map +1 -0
- package/lib/previewer/server.js +558 -0
- package/lib/previewer/server.js.map +1 -0
- package/package.json +3 -3
- package/skills/lux-answerer/SKILL.md +2 -2
- package/src/answerers/claude-code/index.ts +6 -5
- package/src/answerers/persona/index.ts +75 -34
- package/src/answerers/terminal/index.ts +8 -12
- package/src/assertions/authoring.ts +2 -0
- package/src/assertions/core/command-exits-zero.ts +61 -7
- package/src/assertions/core/event-checks.ts +64 -3
- package/src/assertions/core/helpers.ts +3 -6
- package/src/assertions/core/index.ts +2 -0
- package/src/assertions/core/resource-checks.ts +38 -5
- package/src/assertions/rubric/index.ts +68 -13
- package/src/assertions/rubric/internal.ts +227 -27
- package/src/authoring.ts +345 -2
- package/src/cli/bin.ts +2 -12
- package/src/cli/command-runtime.ts +20 -9
- package/src/cli/doctor.ts +17 -0
- package/src/cli/harness-plan.ts +117 -0
- package/src/cli/init-templates.ts +238 -0
- package/src/cli/init.ts +53 -184
- package/src/cli/output-schemas.ts +106 -0
- package/src/cli/program.ts +691 -721
- package/src/cli/render/reporter.ts +50 -8
- package/src/cli/run-options.ts +132 -25
- package/src/cli/view.ts +129 -0
- package/src/container/driver.ts +211 -0
- package/src/container/protocol.ts +48 -0
- package/src/container/resources.ts +153 -0
- package/src/container/worker.ts +107 -0
- package/src/core/action-events.ts +59 -0
- package/src/core/agent-activity.ts +236 -0
- package/src/core/agent-environment.ts +64 -0
- package/src/core/agent-events.ts +17 -0
- package/src/core/annotation.ts +2 -1
- package/src/core/answerer.ts +9 -0
- package/src/core/artifact-evidence.ts +47 -4
- package/src/core/assertion.ts +21 -1
- package/src/core/case.ts +21 -3
- package/src/core/command-verification.ts +74 -0
- package/src/core/driver-execution.ts +84 -0
- package/src/core/driver-metrics.ts +51 -0
- package/src/core/driver.ts +76 -0
- package/src/core/duration.ts +52 -0
- package/src/core/environment.ts +22 -0
- package/src/core/evaluation-clusters.ts +35 -0
- package/src/core/events.ts +14 -2
- package/src/core/experiment.ts +64 -24
- package/src/core/file-tree.ts +35 -0
- package/src/core/global-id.ts +26 -0
- package/src/core/harness-catalog.ts +100 -0
- package/src/core/harness-catalogs/antigravity.ts +24 -0
- package/src/core/harness-catalogs/claude-code.ts +25 -0
- package/src/core/harness-catalogs/codex.ts +27 -0
- package/src/core/harness-catalogs/copilot.ts +46 -0
- package/src/core/harness-catalogs/cursor.ts +13 -0
- package/src/core/harness-catalogs/grok-build.ts +19 -0
- package/src/core/harness-catalogs/index.ts +31 -0
- package/src/core/harness-matrix.ts +316 -0
- package/src/core/index.ts +12 -0
- package/src/core/lifecycle-fixtures.ts +4 -2
- package/src/core/model-cli.ts +52 -23
- package/src/core/platform-process.ts +58 -10
- package/src/core/run.ts +31 -0
- package/src/core/usage.ts +8 -0
- package/src/core/wire.ts +5 -1
- package/src/drivers/antigravity/README.md +171 -0
- package/src/drivers/antigravity/artifacts.ts +37 -0
- package/src/drivers/antigravity/config.ts +92 -0
- package/src/drivers/antigravity/events.ts +290 -0
- package/src/drivers/antigravity/index.ts +132 -0
- package/src/drivers/antigravity/runtime.ts +94 -0
- package/src/drivers/claude-code/deferred-process.ts +118 -0
- package/src/drivers/claude-code/index.ts +216 -281
- package/src/drivers/claude-code/isolation.ts +228 -0
- package/src/drivers/claude-code/parse-events.ts +98 -12
- package/src/drivers/codex/app-events.ts +126 -16
- package/src/drivers/codex/config.ts +50 -8
- package/src/drivers/codex/exec-events.ts +258 -0
- package/src/drivers/codex/index.ts +144 -312
- package/src/drivers/copilot/README.md +60 -0
- package/src/drivers/copilot/config.ts +61 -0
- package/src/drivers/copilot/index.ts +310 -0
- package/src/drivers/cursor/README.md +66 -0
- package/src/drivers/cursor/config.ts +31 -0
- package/src/drivers/cursor/index.ts +326 -0
- package/src/drivers/cursor/interaction.ts +74 -0
- package/src/drivers/grok-build/README.md +112 -0
- package/src/drivers/grok-build/config.ts +43 -0
- package/src/drivers/grok-build/index.ts +331 -0
- package/src/drivers/mcp/index.ts +25 -11
- package/src/drivers/shared/acp-events.ts +94 -0
- package/src/drivers/shared/acp-interaction.ts +27 -0
- package/src/drivers/shared/acp-session.ts +40 -0
- package/src/drivers/shared/acp-transport.ts +187 -0
- package/src/drivers/shared/artifacts.ts +6 -2
- package/src/drivers/shared/experiment-behavior.ts +214 -0
- package/src/drivers/shared/experiment-policy.ts +195 -0
- package/src/drivers/subprocess/index.ts +55 -12
- package/src/index.ts +115 -10
- package/src/optimization/reflective.ts +3 -2
- package/src/orchestrator/annotation-loader.ts +10 -0
- package/src/orchestrator/annotation-store.ts +24 -3
- package/src/orchestrator/artifact-origin.ts +50 -0
- package/src/orchestrator/campaign-lifecycle.ts +5 -1
- package/src/orchestrator/candidates.ts +3 -2
- package/src/orchestrator/compare.ts +41 -6
- package/src/orchestrator/comparison-identity.ts +2 -0
- package/src/orchestrator/config.ts +20 -3
- package/src/orchestrator/discover.ts +8 -1
- package/src/orchestrator/doctor.ts +189 -28
- package/src/orchestrator/driver-capabilities.ts +21 -0
- package/src/orchestrator/driver-identity.ts +69 -0
- package/src/orchestrator/experiment-context.ts +3 -2
- package/src/orchestrator/experiment-corpus.ts +53 -37
- package/src/orchestrator/experiment-effects.ts +61 -0
- package/src/orchestrator/experiment-evaluation.ts +71 -10
- package/src/orchestrator/experiment-identity.ts +42 -48
- package/src/orchestrator/experiment-preflight.ts +27 -0
- package/src/orchestrator/experiment-report.ts +21 -1
- package/src/orchestrator/experiment-runs.ts +11 -4
- package/src/orchestrator/experiment-runtime-identity.ts +5 -243
- package/src/orchestrator/experiment-selection.ts +77 -0
- package/src/orchestrator/experiment.ts +29 -29
- package/src/orchestrator/fixture-identity.ts +9 -1
- package/src/orchestrator/fs-read.ts +2 -32
- package/src/orchestrator/grader-experiment.ts +74 -13
- package/src/orchestrator/grading.ts +67 -28
- package/src/orchestrator/harness-catalog-drift.ts +132 -0
- package/src/orchestrator/harness-registry.ts +12 -0
- package/src/orchestrator/index.ts +1 -0
- package/src/orchestrator/list-runs.ts +98 -13
- package/src/orchestrator/optimization-lifecycle.ts +4 -1
- package/src/orchestrator/orchestrator.ts +92 -216
- package/src/orchestrator/paired-effects.ts +209 -0
- package/src/orchestrator/provenance.ts +23 -3
- package/src/orchestrator/rubric-loader.ts +1 -1
- package/src/orchestrator/run-dir.ts +8 -1
- package/src/orchestrator/run-execution.ts +77 -11
- package/src/orchestrator/run-lifecycle.ts +4 -2
- package/src/orchestrator/run-workspace.ts +62 -0
- package/src/orchestrator/suite-compare.ts +29 -19
- package/src/orchestrator/suite-runs.ts +13 -2
- package/src/orchestrator/suite-summary.ts +122 -13
- package/src/previewer/artifacts.ts +221 -0
- package/src/previewer/server.ts +787 -0
- package/viewer/app.css +2079 -0
- package/viewer/app.js +627 -0
- package/viewer/artifact-view.js +48 -0
- package/viewer/charts.js +86 -0
- package/viewer/detail.js +1237 -0
- package/viewer/format.js +129 -0
- package/viewer/index.html +151 -0
- package/lib/answerers/scripted/index.d.ts +0 -8
- package/lib/answerers/scripted/index.d.ts.map +0 -1
- package/lib/answerers/scripted/index.js +0 -163
- package/lib/answerers/scripted/index.js.map +0 -1
- package/lib/cli/skills.d.ts +0 -38
- package/lib/cli/skills.d.ts.map +0 -1
- package/lib/cli/skills.js +0 -84
- package/lib/cli/skills.js.map +0 -1
- package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
- package/lib/drivers/shared/secure-copy.js.map +0 -1
- package/skills/lux/SKILL.md +0 -85
- package/skills/lux/references/cli.md +0 -102
- package/skills/lux/references/eval-authoring.md +0 -105
- package/src/answerers/scripted/index.ts +0 -186
- package/src/cli/skills.ts +0 -129
- /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
- /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
- /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
|
@@ -1,25 +1,36 @@
|
|
|
1
|
-
import { cp, mkdir,
|
|
2
|
-
import {
|
|
3
|
-
import { dirname, join, resolve, sep } from "node:path";
|
|
1
|
+
import { cp, mkdir, realpath, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
4
3
|
import { temporaryDirectory } from "tempy";
|
|
5
4
|
import { z } from "zod";
|
|
5
|
+
import { agentEnvironment, InheritEnvironmentSchema } from "../../core/agent-environment.js";
|
|
6
|
+
import { DurationSchema, durationMs } from "../../core/duration.js";
|
|
6
7
|
import {
|
|
7
8
|
type AgentDriver,
|
|
8
9
|
type Answer,
|
|
9
10
|
type Artifact,
|
|
11
|
+
applyCatalogEffort,
|
|
12
|
+
claudeCodeCatalog,
|
|
10
13
|
DEFAULT_CLAUDE_MODEL,
|
|
11
14
|
type DriverEventMap,
|
|
12
|
-
|
|
15
|
+
defineDriver,
|
|
13
16
|
discoverCliVersion,
|
|
14
|
-
exec,
|
|
15
17
|
type ParsedDriverEvent,
|
|
16
18
|
type ReadyState,
|
|
17
19
|
type StartContext,
|
|
20
|
+
selectModelAndReasoningEffort,
|
|
18
21
|
TypedEmitter,
|
|
19
22
|
} from "../../core/index.js";
|
|
23
|
+
import { copyRegularFileNoFollow } from "../../core/secure-copy.js";
|
|
20
24
|
import { walkArtifacts } from "../shared/artifacts.js";
|
|
21
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
claudeConfigRoot,
|
|
27
|
+
claudeUserBehaviorHash,
|
|
28
|
+
configuredClaudeSourceHashes,
|
|
29
|
+
} from "../shared/experiment-behavior.js";
|
|
30
|
+
import { prepareClaudeExperimentConfig } from "../shared/experiment-policy.js";
|
|
22
31
|
import { subprocessDriver } from "../subprocess/index.js";
|
|
32
|
+
import { runDeferredProcess } from "./deferred-process.js";
|
|
33
|
+
import { isolatedLaunch } from "./isolation.js";
|
|
23
34
|
import { ClaudeCodeLineSchema, makeParseEvent } from "./parse-events.js";
|
|
24
35
|
|
|
25
36
|
const LUX_BOOKKEEPING_FILES = new Set([
|
|
@@ -33,12 +44,23 @@ const LUX_BOOKKEEPING_FILES = new Set([
|
|
|
33
44
|
const commandName = (command: string): string => command.split(/[\\/]/).at(-1) ?? command;
|
|
34
45
|
const ISOLATION_RESERVED_ARGS = new Set([
|
|
35
46
|
"--add-dir",
|
|
47
|
+
"--dangerously-skip-permissions",
|
|
48
|
+
"--allow-dangerously-skip-permissions",
|
|
49
|
+
"--permission-mode",
|
|
50
|
+
"--teleport",
|
|
51
|
+
"--continue",
|
|
52
|
+
"-c",
|
|
53
|
+
"--resume",
|
|
54
|
+
"-r",
|
|
55
|
+
"--fork-session",
|
|
56
|
+
"--session-id",
|
|
36
57
|
"--agent",
|
|
37
58
|
"--agents",
|
|
38
59
|
"--bare",
|
|
39
60
|
"--mcp-config",
|
|
40
61
|
"--no-session-persistence",
|
|
41
62
|
"--plugin-dir",
|
|
63
|
+
"--plugin-dir-no-mcp",
|
|
42
64
|
"--plugin-url",
|
|
43
65
|
"--safe-mode",
|
|
44
66
|
"--setting-sources",
|
|
@@ -54,6 +76,8 @@ const IsolationSchema = z
|
|
|
54
76
|
* and `addDirs` paths are included automatically.
|
|
55
77
|
*/
|
|
56
78
|
allowRead: z.array(z.string()).default([]),
|
|
79
|
+
/** Additional protected trees and files, including other evaluation runs. */
|
|
80
|
+
denyRead: z.array(z.string()).optional(),
|
|
57
81
|
})
|
|
58
82
|
.strict();
|
|
59
83
|
|
|
@@ -66,15 +90,15 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
66
90
|
cwdMode: z.enum(["artifacts", "runDir"]).default("artifacts"),
|
|
67
91
|
cwd: z.string().optional(),
|
|
68
92
|
env: z.record(z.string(), z.string()).optional(),
|
|
93
|
+
inheritEnv: InheritEnvironmentSchema.default(true),
|
|
69
94
|
/** Low-cost by default; choose a larger model explicitly when needed. */
|
|
70
95
|
model: z.string().min(1).default(DEFAULT_CLAUDE_MODEL),
|
|
71
|
-
|
|
72
|
-
effort: z.enum(["low", "medium", "high", "max"]).default("low"),
|
|
96
|
+
reasoningEffort: z.enum(claudeCodeCatalog.efforts).optional(),
|
|
73
97
|
/** Permission mode passed to claude. */
|
|
74
98
|
permissionMode: z
|
|
75
99
|
.enum(["acceptEdits", "auto", "bypassPermissions", "default", "dontAsk", "manual", "plan"])
|
|
76
100
|
.optional(),
|
|
77
|
-
/** Additional
|
|
101
|
+
/** Additional pre-approvals; auto mode omits the baseline coding-tool grants. */
|
|
78
102
|
allowedTools: z.array(z.string().min(1)).optional(),
|
|
79
103
|
/** Plugin directories to load (`--plugin-dir`): skills, subagents, commands, hooks. */
|
|
80
104
|
pluginDirs: z.array(z.string()).optional(),
|
|
@@ -99,18 +123,33 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
99
123
|
* when a weaker model asks in text instead of calling `askToolName`.
|
|
100
124
|
*/
|
|
101
125
|
textQuestionFallback: z.boolean().default(false),
|
|
102
|
-
/**
|
|
103
|
-
|
|
126
|
+
/** Maximum silence between recognized protocol events; excludes answerer wait time. */
|
|
127
|
+
idleTimeout: DurationSchema.default("10 minutes"),
|
|
128
|
+
/** Optional elapsed-time cap per defer-resume CLI invocation, regardless of activity. */
|
|
129
|
+
turnTimeout: DurationSchema.optional(),
|
|
104
130
|
/** Cap on outstanding interrupts before the driver aborts. */
|
|
105
131
|
maxInterrupts: z.number().positive().default(20),
|
|
106
132
|
})
|
|
107
133
|
.strict()
|
|
108
134
|
.superRefine((config, ctx) => {
|
|
135
|
+
if (config.turnTimeout !== undefined && config.interactionMode !== "defer-resume") {
|
|
136
|
+
ctx.addIssue({
|
|
137
|
+
code: "custom",
|
|
138
|
+
path: ["turnTimeout"],
|
|
139
|
+
message: "turnTimeout requires defer-resume mode",
|
|
140
|
+
});
|
|
141
|
+
}
|
|
109
142
|
if (config.interactionMode === "defer-resume") {
|
|
110
143
|
const reserved = config.extraArgs?.find((arg) =>
|
|
111
|
-
[
|
|
112
|
-
|
|
113
|
-
|
|
144
|
+
[
|
|
145
|
+
"--input-format",
|
|
146
|
+
"--no-session-persistence",
|
|
147
|
+
"--resume",
|
|
148
|
+
"-r",
|
|
149
|
+
"--settings",
|
|
150
|
+
"--permission-prompt-tool",
|
|
151
|
+
"--permission-prompts",
|
|
152
|
+
].some((name) => arg === name || arg.startsWith(`${name}=`)),
|
|
114
153
|
);
|
|
115
154
|
if (reserved) {
|
|
116
155
|
ctx.addIssue({
|
|
@@ -129,11 +168,12 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
129
168
|
"isolation requires permissionMode to be omitted or 'default'; Claude Code forces default mode while subprocess environment scrubbing is enabled",
|
|
130
169
|
});
|
|
131
170
|
}
|
|
132
|
-
if (config.interactionMode === "defer-resume") {
|
|
171
|
+
if (config.interactionMode === "defer-resume" && config.pluginDirs?.length) {
|
|
133
172
|
ctx.addIssue({
|
|
134
173
|
code: "custom",
|
|
135
|
-
path: ["
|
|
136
|
-
message:
|
|
174
|
+
path: ["pluginDirs"],
|
|
175
|
+
message:
|
|
176
|
+
"isolated defer-resume cannot load plugin hooks; use addDirs for read-only skill files",
|
|
137
177
|
});
|
|
138
178
|
}
|
|
139
179
|
if (config.cwd || config.cwdMode !== "artifacts") {
|
|
@@ -153,7 +193,8 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
153
193
|
message: `isolation owns ${reserved}; configure isolation instead`,
|
|
154
194
|
});
|
|
155
195
|
}
|
|
156
|
-
})
|
|
196
|
+
})
|
|
197
|
+
.transform(applyCatalogEffort(claudeCodeCatalog));
|
|
157
198
|
|
|
158
199
|
export type ClaudeCodeDriverConfig = z.infer<typeof ClaudeCodeDriverConfigSchema>;
|
|
159
200
|
|
|
@@ -166,7 +207,7 @@ const buildArgs = (config: ClaudeCodeDriverConfig): string[] => {
|
|
|
166
207
|
"stream-json",
|
|
167
208
|
"--verbose",
|
|
168
209
|
];
|
|
169
|
-
out.push("--model", config.model,
|
|
210
|
+
out.push("--model", config.model, ...effortArgs(config));
|
|
170
211
|
if (config.permissionMode) out.push("--permission-mode", config.permissionMode);
|
|
171
212
|
out.push("--allowed-tools", ...allowedTools(config));
|
|
172
213
|
for (const dir of config.pluginDirs ?? []) out.push("--plugin-dir", dir);
|
|
@@ -197,23 +238,48 @@ const deferredHookSettings = (
|
|
|
197
238
|
},
|
|
198
239
|
});
|
|
199
240
|
|
|
241
|
+
const effortArgs = (config: ClaudeCodeDriverConfig): string[] =>
|
|
242
|
+
config.reasoningEffort ? ["--effort", config.reasoningEffort] : [];
|
|
243
|
+
|
|
200
244
|
const allowedTools = (config: ClaudeCodeDriverConfig): string[] => [
|
|
201
|
-
...new Set([
|
|
245
|
+
...new Set([
|
|
246
|
+
...(config.permissionMode === "auto" ? [] : MINIMAL_ALLOWED_TOOLS),
|
|
247
|
+
config.askToolName,
|
|
248
|
+
...(config.allowedTools ?? []),
|
|
249
|
+
]),
|
|
202
250
|
];
|
|
203
251
|
|
|
204
252
|
const buildDeferredArgs = (
|
|
205
253
|
config: ClaudeCodeDriverConfig,
|
|
206
254
|
hookPath: string,
|
|
207
255
|
sessionId?: string,
|
|
256
|
+
isolation?: Awaited<ReturnType<typeof isolatedLaunch>>,
|
|
208
257
|
): string[] => {
|
|
209
|
-
|
|
210
|
-
|
|
258
|
+
// Native print mode removes AskUserQuestion unless a host permission surface exists.
|
|
259
|
+
// The trusted PreToolUse hook handles the question before that surface is consulted.
|
|
260
|
+
const out = [
|
|
261
|
+
"--print",
|
|
262
|
+
"--output-format",
|
|
263
|
+
"stream-json",
|
|
264
|
+
"--verbose",
|
|
265
|
+
"--permission-prompt-tool",
|
|
266
|
+
"stdio",
|
|
267
|
+
];
|
|
268
|
+
out.push("--model", config.model, ...effortArgs(config));
|
|
211
269
|
if (config.permissionMode) out.push("--permission-mode", config.permissionMode);
|
|
212
270
|
out.push("--allowed-tools", ...allowedTools(config));
|
|
213
271
|
for (const dir of config.pluginDirs ?? []) out.push("--plugin-dir", dir);
|
|
214
272
|
if (config.agent) out.push("--agent", config.agent);
|
|
215
|
-
for (const dir of config.addDirs ?? []) out.push("--add-dir", dir);
|
|
216
|
-
out.push(
|
|
273
|
+
if (!isolation) for (const dir of config.addDirs ?? []) out.push("--add-dir", dir);
|
|
274
|
+
out.push(
|
|
275
|
+
"--settings",
|
|
276
|
+
JSON.stringify({
|
|
277
|
+
...isolation?.settings,
|
|
278
|
+
...deferredHookSettings(config, hookPath),
|
|
279
|
+
...(isolation ? { disableAllHooks: false } : {}),
|
|
280
|
+
}),
|
|
281
|
+
);
|
|
282
|
+
if (isolation) out.push("--strict-mcp-config", "--setting-sources", "");
|
|
217
283
|
if (sessionId) out.push("--resume", sessionId);
|
|
218
284
|
if (config.extraArgs) out.push(...config.extraArgs);
|
|
219
285
|
return out;
|
|
@@ -269,184 +335,6 @@ process.stdin.on("end", () => {
|
|
|
269
335
|
});
|
|
270
336
|
`;
|
|
271
337
|
|
|
272
|
-
const isWithin = (parent: string, child: string): boolean =>
|
|
273
|
-
child === parent || child.startsWith(`${parent}${sep}`);
|
|
274
|
-
|
|
275
|
-
const permissionPath = (tool: "Edit" | "Read", path: string, directory: boolean): string => {
|
|
276
|
-
const absolute = resolve(path).replaceAll("\\", "/");
|
|
277
|
-
return `${tool}(//${absolute.replace(/^\/+/, "")}${directory ? "/**" : ""})`;
|
|
278
|
-
};
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Permission rules have no "allow inside deny" override, so isolate a root by
|
|
282
|
-
* denying every sibling around explicitly allowed descendants.
|
|
283
|
-
*/
|
|
284
|
-
const carvedPermissionDenials = async (
|
|
285
|
-
tool: "Edit" | "Read",
|
|
286
|
-
root: string,
|
|
287
|
-
allowed: readonly string[],
|
|
288
|
-
): Promise<string[]> => {
|
|
289
|
-
const normalizedRoot = resolve(root);
|
|
290
|
-
const inside = allowed
|
|
291
|
-
.map((path) => resolve(path))
|
|
292
|
-
.filter((path) => isWithin(normalizedRoot, path));
|
|
293
|
-
if (inside.some((path) => path === normalizedRoot)) return [];
|
|
294
|
-
if (inside.length === 0) return [permissionPath(tool, normalizedRoot, true)];
|
|
295
|
-
|
|
296
|
-
const out: string[] = [];
|
|
297
|
-
const walk = async (dir: string): Promise<void> => {
|
|
298
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
299
|
-
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
300
|
-
for (const entry of entries) {
|
|
301
|
-
const path = join(dir, entry.name);
|
|
302
|
-
if (inside.some((allowedPath) => allowedPath === path)) continue;
|
|
303
|
-
if (entry.isDirectory() && inside.some((allowedPath) => isWithin(path, allowedPath))) {
|
|
304
|
-
await walk(path);
|
|
305
|
-
} else {
|
|
306
|
-
out.push(permissionPath(tool, path, entry.isDirectory()));
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
};
|
|
310
|
-
await walk(normalizedRoot);
|
|
311
|
-
return out;
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
const carvedReadDenials = (root: string, allowed: readonly string[]): Promise<string[]> =>
|
|
315
|
-
carvedPermissionDenials("Read", root, allowed);
|
|
316
|
-
|
|
317
|
-
const existingRealpaths = async (paths: readonly string[]): Promise<string[]> => {
|
|
318
|
-
const found = await Promise.all(
|
|
319
|
-
paths.map(async (path) => {
|
|
320
|
-
try {
|
|
321
|
-
return await realpath(resolve(path));
|
|
322
|
-
} catch {
|
|
323
|
-
return null;
|
|
324
|
-
}
|
|
325
|
-
}),
|
|
326
|
-
);
|
|
327
|
-
return [...new Set(found.filter((path): path is string => path !== null))];
|
|
328
|
-
};
|
|
329
|
-
|
|
330
|
-
const compactRoots = (paths: readonly string[]): string[] =>
|
|
331
|
-
[...new Set(paths)]
|
|
332
|
-
.sort((a, b) => a.length - b.length || a.localeCompare(b))
|
|
333
|
-
.filter((path, index, roots) => !roots.slice(0, index).some((root) => isWithin(root, path)));
|
|
334
|
-
|
|
335
|
-
const isolatedLaunch = async (
|
|
336
|
-
config: ClaudeCodeDriverConfig,
|
|
337
|
-
ctx: StartContext,
|
|
338
|
-
workspace: string,
|
|
339
|
-
): Promise<{ args: string[]; env: Record<string, string> }> => {
|
|
340
|
-
const homeRoots = await existingRealpaths([
|
|
341
|
-
homedir(),
|
|
342
|
-
...(config.env?.HOME ? [config.env.HOME] : []),
|
|
343
|
-
]);
|
|
344
|
-
const sensitiveHomePaths = homeRoots.flatMap((home) => [
|
|
345
|
-
join(home, ".aws"),
|
|
346
|
-
join(home, ".config", "gcloud"),
|
|
347
|
-
join(home, ".docker", "config.json"),
|
|
348
|
-
join(home, ".git-credentials"),
|
|
349
|
-
join(home, ".gnupg"),
|
|
350
|
-
join(home, ".kube"),
|
|
351
|
-
join(home, ".netrc"),
|
|
352
|
-
join(home, ".npmrc"),
|
|
353
|
-
join(home, ".ssh"),
|
|
354
|
-
]);
|
|
355
|
-
const protectedRoots = await existingRealpaths([
|
|
356
|
-
...(ctx.runsRoot ? [ctx.runsRoot] : [ctx.runDir]),
|
|
357
|
-
...(process.env.CLAUDE_CONFIG_DIR ? [process.env.CLAUDE_CONFIG_DIR] : []),
|
|
358
|
-
...(config.env?.CLAUDE_CONFIG_DIR ? [config.env.CLAUDE_CONFIG_DIR] : []),
|
|
359
|
-
...sensitiveHomePaths,
|
|
360
|
-
...homeRoots.flatMap((home) => [
|
|
361
|
-
join(home, ".claude", "projects"),
|
|
362
|
-
join(home, ".claude", "memory"),
|
|
363
|
-
]),
|
|
364
|
-
]);
|
|
365
|
-
const denyRoots = compactRoots(protectedRoots);
|
|
366
|
-
const allowed = compactRoots(
|
|
367
|
-
await existingRealpaths([
|
|
368
|
-
...(config.pluginDirs ?? []),
|
|
369
|
-
...(config.addDirs ?? []),
|
|
370
|
-
...(config.isolation?.allowRead ?? []),
|
|
371
|
-
]),
|
|
372
|
-
);
|
|
373
|
-
const overlapping = allowed.find(
|
|
374
|
-
(path) =>
|
|
375
|
-
(path !== workspace && isWithin(path, workspace)) ||
|
|
376
|
-
denyRoots.some((root) => isWithin(path, root)) ||
|
|
377
|
-
protectedRoots.some((root) => isWithin(root, path)),
|
|
378
|
-
);
|
|
379
|
-
if (overlapping) {
|
|
380
|
-
throw new Error(`isolation read carve-out overlaps a protected boundary: ${overlapping}`);
|
|
381
|
-
}
|
|
382
|
-
const readOnlyRoots = allowed.filter((path) => !isWithin(workspace, path));
|
|
383
|
-
const editDenyRoots = compactRoots([...denyRoots, ...readOnlyRoots]);
|
|
384
|
-
const [readDenials, writeDenials] = await Promise.all([
|
|
385
|
-
Promise.all(denyRoots.map((root) => carvedPermissionDenials("Read", root, allowed))),
|
|
386
|
-
Promise.all(editDenyRoots.map((root) => carvedPermissionDenials("Edit", root, []))),
|
|
387
|
-
]);
|
|
388
|
-
const denyRules = [...readDenials.flat(), ...writeDenials.flat()];
|
|
389
|
-
const sandboxSettings = {
|
|
390
|
-
disableAllHooks: true,
|
|
391
|
-
permissions: { deny: denyRules },
|
|
392
|
-
sandbox: {
|
|
393
|
-
enabled: true,
|
|
394
|
-
failIfUnavailable: true,
|
|
395
|
-
allowUnsandboxedCommands: false,
|
|
396
|
-
filesystem: {
|
|
397
|
-
denyRead: denyRoots,
|
|
398
|
-
denyWrite: denyRoots,
|
|
399
|
-
allowRead: allowed,
|
|
400
|
-
},
|
|
401
|
-
// Filesystem isolation does not disable the live docs and package
|
|
402
|
-
// registry access that cases are intended to exercise.
|
|
403
|
-
network: { allowedDomains: ["*"] },
|
|
404
|
-
},
|
|
405
|
-
};
|
|
406
|
-
const stateDir = join(workspace, ".lux-claude");
|
|
407
|
-
const tmpDir = join(stateDir, "tmp");
|
|
408
|
-
const cacheDir = join(stateDir, "cache");
|
|
409
|
-
const pluginCacheDir = join(stateDir, "plugins");
|
|
410
|
-
await Promise.all([
|
|
411
|
-
mkdir(tmpDir, { recursive: true }),
|
|
412
|
-
mkdir(cacheDir, { recursive: true }),
|
|
413
|
-
mkdir(pluginCacheDir, { recursive: true }),
|
|
414
|
-
]);
|
|
415
|
-
return {
|
|
416
|
-
args: [
|
|
417
|
-
// --add-dir also discovers skills and agents. Isolation treats addDirs
|
|
418
|
-
// as data-only read grants, so expose them through the filesystem policy
|
|
419
|
-
// above without passing the discovery flag to Claude.
|
|
420
|
-
...buildArgs({ ...config, addDirs: undefined }),
|
|
421
|
-
"--no-session-persistence",
|
|
422
|
-
"--strict-mcp-config",
|
|
423
|
-
// Authentication is independent of filesystem setting sources. Keep
|
|
424
|
-
// these empty instead of using --safe-mode: safe mode would also disable
|
|
425
|
-
// the explicitly requested plugin's skills, commands, and agents.
|
|
426
|
-
"--setting-sources",
|
|
427
|
-
"",
|
|
428
|
-
"--settings",
|
|
429
|
-
JSON.stringify(sandboxSettings),
|
|
430
|
-
],
|
|
431
|
-
env: {
|
|
432
|
-
...(config.env ?? {}),
|
|
433
|
-
CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
|
|
434
|
-
CLAUDE_CODE_DISABLE_CLAUDE_MDS: "1",
|
|
435
|
-
CLAUDE_CODE_SKIP_PROMPT_HISTORY: "1",
|
|
436
|
-
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS: "1",
|
|
437
|
-
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB: "1",
|
|
438
|
-
CLAUDE_CODE_AUTO_CONNECT_IDE: "false",
|
|
439
|
-
CLAUDE_CODE_PLUGIN_CACHE_DIR: pluginCacheDir,
|
|
440
|
-
CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL: "1",
|
|
441
|
-
DISABLE_AUTOUPDATER: "1",
|
|
442
|
-
TMPDIR: tmpDir,
|
|
443
|
-
XDG_CACHE_HOME: cacheDir,
|
|
444
|
-
npm_config_cache: join(cacheDir, "npm"),
|
|
445
|
-
BUN_INSTALL_CACHE_DIR: join(cacheDir, "bun"),
|
|
446
|
-
},
|
|
447
|
-
};
|
|
448
|
-
};
|
|
449
|
-
|
|
450
338
|
const formatPrompt = (text: string): string =>
|
|
451
339
|
`${JSON.stringify({
|
|
452
340
|
type: "user",
|
|
@@ -475,9 +363,7 @@ const formatAnswer = (answer: Answer): string => {
|
|
|
475
363
|
class ClaudeCodeDriverImpl implements AgentDriver {
|
|
476
364
|
private inner: AgentDriver | null = null;
|
|
477
365
|
private readonly emitter = new TypedEmitter<DriverEventMap>();
|
|
478
|
-
//
|
|
479
|
-
// so the queue stays type-safe without per-entry casts; the identity pair
|
|
480
|
-
// rides along so off() can drop a queued attach symmetrically.
|
|
366
|
+
// Typed closures retain handler identity so off() can detach queued listeners.
|
|
481
367
|
private pendingAttach: Array<{
|
|
482
368
|
event: keyof DriverEventMap;
|
|
483
369
|
handler: unknown;
|
|
@@ -488,6 +374,8 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
488
374
|
private artifactsDir: string | null = null;
|
|
489
375
|
private runDir: string | null = null;
|
|
490
376
|
private isolatedWorkspace: string | null = null;
|
|
377
|
+
private isolationControlDir: string | null = null;
|
|
378
|
+
private deferredIsolation: Awaited<ReturnType<typeof isolatedLaunch>> | undefined;
|
|
491
379
|
private deferredContext: StartContext | null = null;
|
|
492
380
|
private deferredCwd: string | null = null;
|
|
493
381
|
private deferredHookPath: string | null = null;
|
|
@@ -506,6 +394,7 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
506
394
|
private deferredInterrupts = 0;
|
|
507
395
|
private deferredTerminal = false;
|
|
508
396
|
private deferredTurn: Promise<void> | null = null;
|
|
397
|
+
private deferredAbort = new AbortController();
|
|
509
398
|
|
|
510
399
|
constructor(config: ClaudeCodeDriverConfig) {
|
|
511
400
|
this.config = config;
|
|
@@ -544,15 +433,20 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
544
433
|
let cwd =
|
|
545
434
|
this.config.cwd ?? (this.config.cwdMode === "artifacts" ? ctx.artifactsDir : ctx.runDir);
|
|
546
435
|
let args = buildArgs(this.config);
|
|
547
|
-
let env = this.config.env;
|
|
436
|
+
let env = agentEnvironment(process.env, this.config.inheritEnv, this.config.env);
|
|
548
437
|
if (this.config.isolation) {
|
|
549
|
-
const
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
438
|
+
const launch = await this.prepareIsolation(ctx);
|
|
439
|
+
cwd = this.isolatedWorkspace as string;
|
|
440
|
+
args = [
|
|
441
|
+
...buildArgs({ ...this.config, addDirs: undefined }),
|
|
442
|
+
"--no-session-persistence",
|
|
443
|
+
"--strict-mcp-config",
|
|
444
|
+
"--setting-sources",
|
|
445
|
+
"",
|
|
446
|
+
"--settings",
|
|
447
|
+
JSON.stringify(launch.settings),
|
|
448
|
+
];
|
|
449
|
+
env = agentEnvironment(process.env, this.config.inheritEnv, launch.env);
|
|
556
450
|
}
|
|
557
451
|
this.collectDir = cwd;
|
|
558
452
|
this.artifactsDir = ctx.artifactsDir;
|
|
@@ -566,11 +460,12 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
566
460
|
args,
|
|
567
461
|
cwd,
|
|
568
462
|
env,
|
|
463
|
+
inheritEnv: false,
|
|
569
464
|
protocol: "custom",
|
|
570
465
|
parseEvent: makeParseEvent(this.config, cliVersion),
|
|
571
466
|
formatAnswer,
|
|
572
467
|
formatPrompt,
|
|
573
|
-
|
|
468
|
+
idleTimeout: this.config.idleTimeout,
|
|
574
469
|
maxInterrupts: this.config.maxInterrupts,
|
|
575
470
|
});
|
|
576
471
|
for (const queued of this.pendingAttach) queued.attach(inner);
|
|
@@ -601,10 +496,8 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
601
496
|
|
|
602
497
|
async collect(): Promise<Artifact[]> {
|
|
603
498
|
if (!this.collectDir) return [];
|
|
604
|
-
//
|
|
605
|
-
|
|
606
|
-
// so it cannot swap a checked regular file into a symlink.
|
|
607
|
-
await this.inner?.close();
|
|
499
|
+
// Stop descendants before collecting: terminal events can precede their exit.
|
|
500
|
+
await this.quiesce();
|
|
608
501
|
const artifacts = await walkArtifacts(this.collectDir);
|
|
609
502
|
if (this.isolatedWorkspace && this.artifactsDir) {
|
|
610
503
|
await Promise.all(
|
|
@@ -621,21 +514,24 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
621
514
|
);
|
|
622
515
|
return artifacts;
|
|
623
516
|
}
|
|
624
|
-
//
|
|
625
|
-
// a walk of any other root must say what its paths are relative to, or
|
|
626
|
-
// the judge and file assertions silently miss every file.
|
|
517
|
+
// Assertions need an explicit root for artifacts collected outside artifactsDir.
|
|
627
518
|
if (this.collectDir === this.artifactsDir) return artifacts;
|
|
628
519
|
const root = this.collectDir;
|
|
629
|
-
//
|
|
630
|
-
// work product; only top-level files can collide with these names.
|
|
520
|
+
// Top-level bookkeeping in runDir is not agent work product.
|
|
631
521
|
const withRoot = artifacts.map((a) => ({ ...a, root }));
|
|
632
522
|
return root === this.runDir
|
|
633
523
|
? withRoot.filter((a) => !LUX_BOOKKEEPING_FILES.has(a.path))
|
|
634
524
|
: withRoot;
|
|
635
525
|
}
|
|
636
526
|
|
|
527
|
+
async verificationWorkspace(): Promise<string | undefined> {
|
|
528
|
+
await this.quiesce();
|
|
529
|
+
return this.isolatedWorkspace ?? undefined;
|
|
530
|
+
}
|
|
531
|
+
|
|
637
532
|
async quiesce(): Promise<void> {
|
|
638
533
|
if (this.config.interactionMode === "defer-resume") {
|
|
534
|
+
this.deferredAbort.abort();
|
|
639
535
|
await this.deferredTurn;
|
|
640
536
|
return;
|
|
641
537
|
}
|
|
@@ -645,6 +541,7 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
645
541
|
async close(): Promise<void> {
|
|
646
542
|
try {
|
|
647
543
|
if (this.config.interactionMode === "defer-resume") {
|
|
544
|
+
await this.quiesce();
|
|
648
545
|
this.emitter.removeAllListeners();
|
|
649
546
|
if (this.deferredHookPath) {
|
|
650
547
|
await rm(this.deferredHookPath, { force: true });
|
|
@@ -654,16 +551,36 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
654
551
|
await this.inner?.close();
|
|
655
552
|
}
|
|
656
553
|
} finally {
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
554
|
+
await Promise.all(
|
|
555
|
+
[this.isolatedWorkspace, this.isolationControlDir]
|
|
556
|
+
.filter((path) => path !== null)
|
|
557
|
+
.map((path) => rm(path, { recursive: true, force: true })),
|
|
558
|
+
);
|
|
559
|
+
this.isolatedWorkspace = null;
|
|
560
|
+
this.isolationControlDir = null;
|
|
661
561
|
}
|
|
662
562
|
}
|
|
663
563
|
|
|
564
|
+
private async prepareIsolation(
|
|
565
|
+
ctx: StartContext,
|
|
566
|
+
): Promise<Awaited<ReturnType<typeof isolatedLaunch>>> {
|
|
567
|
+
this.isolatedWorkspace = await realpath(
|
|
568
|
+
temporaryDirectory({ prefix: "lux-claude-workspace-" }),
|
|
569
|
+
);
|
|
570
|
+
this.isolationControlDir = await realpath(
|
|
571
|
+
temporaryDirectory({ prefix: "lux-claude-control-" }),
|
|
572
|
+
);
|
|
573
|
+
await cp(ctx.artifactsDir, this.isolatedWorkspace, { recursive: true });
|
|
574
|
+
return isolatedLaunch(this.config, ctx, this.isolatedWorkspace, this.isolationControlDir);
|
|
575
|
+
}
|
|
576
|
+
|
|
664
577
|
private async startDeferred(ctx: StartContext): Promise<ReadyState> {
|
|
665
|
-
|
|
578
|
+
let cwd =
|
|
666
579
|
this.config.cwd ?? (this.config.cwdMode === "artifacts" ? ctx.artifactsDir : ctx.runDir);
|
|
580
|
+
if (this.config.isolation) {
|
|
581
|
+
this.deferredIsolation = await this.prepareIsolation(ctx);
|
|
582
|
+
cwd = this.isolatedWorkspace as string;
|
|
583
|
+
}
|
|
667
584
|
this.collectDir = cwd;
|
|
668
585
|
this.artifactsDir = ctx.artifactsDir;
|
|
669
586
|
this.runDir = ctx.runDir;
|
|
@@ -712,58 +629,51 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
712
629
|
} else if (resumeWithAnswer && answer?.kind === "ask") {
|
|
713
630
|
input = { input: answer.text };
|
|
714
631
|
}
|
|
715
|
-
const
|
|
716
|
-
this.config.command,
|
|
717
|
-
buildDeferredArgs(
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
632
|
+
const terminal = await runDeferredProcess({
|
|
633
|
+
command: this.config.command,
|
|
634
|
+
args: buildDeferredArgs(
|
|
635
|
+
this.config,
|
|
636
|
+
hookPath,
|
|
637
|
+
this.deferredSessionId ?? undefined,
|
|
638
|
+
this.deferredIsolation,
|
|
639
|
+
),
|
|
640
|
+
cwd,
|
|
641
|
+
env: agentEnvironment(process.env, this.config.inheritEnv, {
|
|
642
|
+
...(this.deferredIsolation?.env ?? this.config.env),
|
|
643
|
+
LUX_RUN_DIR: ctx.runDir,
|
|
644
|
+
LUX_ARTIFACTS_DIR: ctx.artifactsDir,
|
|
645
|
+
...(answer ? { LUX_CLAUDE_DEFERRED_ANSWER: JSON.stringify(answer) } : {}),
|
|
646
|
+
}),
|
|
647
|
+
...input,
|
|
648
|
+
idleTimeoutMs: durationMs(this.config.idleTimeout),
|
|
649
|
+
...(this.config.turnTimeout === undefined
|
|
650
|
+
? {}
|
|
651
|
+
: { turnTimeoutMs: durationMs(this.config.turnTimeout) }),
|
|
652
|
+
signal: AbortSignal.any([ctx.abortSignal, this.deferredAbort.signal]),
|
|
653
|
+
parse: (line) => {
|
|
654
|
+
try {
|
|
655
|
+
const envelope = ClaudeCodeLineSchema.safeParse(JSON.parse(line));
|
|
656
|
+
if (
|
|
657
|
+
envelope.success &&
|
|
658
|
+
(envelope.data.type === "system" || envelope.data.type === "result") &&
|
|
659
|
+
envelope.data.session_id
|
|
660
|
+
) {
|
|
661
|
+
this.deferredSessionId = envelope.data.session_id;
|
|
662
|
+
}
|
|
663
|
+
} catch {
|
|
664
|
+
// The parser below deliberately ignores unmodeled output.
|
|
747
665
|
}
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
}
|
|
757
|
-
if (result.timedOut) {
|
|
758
|
-
throw new Error(`no event for ${this.config.idleTimeoutMs}ms`);
|
|
759
|
-
}
|
|
760
|
-
if (result.signal) throw new Error(`claude exited from signal ${result.signal}`);
|
|
761
|
-
if (result.exitCode !== 0 && !this.deferredTerminal) {
|
|
762
|
-
throw new Error(`claude exited ${result.exitCode}`);
|
|
763
|
-
}
|
|
764
|
-
if (!resuming && this.deferredReady) {
|
|
765
|
-
throw new Error("claude exited before ready");
|
|
666
|
+
return parse(line);
|
|
667
|
+
},
|
|
668
|
+
onEvent: (event) => this.dispatchDeferred(event),
|
|
669
|
+
});
|
|
670
|
+
if (this.deferredReady) {
|
|
671
|
+
throw new Error(
|
|
672
|
+
terminal?.tag === "error" ? terminal.error.reason : "claude exited before ready",
|
|
673
|
+
);
|
|
766
674
|
}
|
|
675
|
+
if (terminal) await this.dispatchDeferred(terminal);
|
|
676
|
+
if (!terminal) throw new Error("claude exited before a terminal result");
|
|
767
677
|
}
|
|
768
678
|
|
|
769
679
|
private async dispatchDeferred(event: ParsedDriverEvent): Promise<void> {
|
|
@@ -847,17 +757,42 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
847
757
|
}
|
|
848
758
|
}
|
|
849
759
|
|
|
850
|
-
export const claudeCodeDriver
|
|
760
|
+
export const claudeCodeDriver = defineDriver({
|
|
851
761
|
name: "claude-code",
|
|
852
762
|
configSchema: ClaudeCodeDriverConfigSchema,
|
|
763
|
+
runtime: (config) => ({
|
|
764
|
+
commands: [config.command],
|
|
765
|
+
capabilities: {
|
|
766
|
+
interactive: true,
|
|
767
|
+
"tool-calls": true,
|
|
768
|
+
"tool-results": true,
|
|
769
|
+
artifacts: true,
|
|
770
|
+
subagents: true,
|
|
771
|
+
usage: true,
|
|
772
|
+
cost: true,
|
|
773
|
+
isolation: Boolean(config.isolation),
|
|
774
|
+
},
|
|
775
|
+
}),
|
|
776
|
+
experiment: {
|
|
777
|
+
version: "1",
|
|
778
|
+
prepare: prepareClaudeExperimentConfig,
|
|
779
|
+
identity: async (config, { rootDir }) => {
|
|
780
|
+
const configRoot = claudeConfigRoot({ config });
|
|
781
|
+
return {
|
|
782
|
+
configRoot,
|
|
783
|
+
userBehaviorHash: await claudeUserBehaviorHash(configRoot),
|
|
784
|
+
sources: await configuredClaudeSourceHashes({ name: "claude-code", config }, rootDir),
|
|
785
|
+
};
|
|
786
|
+
},
|
|
787
|
+
},
|
|
788
|
+
selectHarness: selectModelAndReasoningEffort,
|
|
853
789
|
create: (config) => new ClaudeCodeDriverImpl(config),
|
|
854
|
-
};
|
|
790
|
+
});
|
|
855
791
|
|
|
856
792
|
// Internal exports for testing
|
|
857
793
|
export {
|
|
858
794
|
buildArgs,
|
|
859
795
|
buildDeferredArgs,
|
|
860
|
-
carvedReadDenials,
|
|
861
796
|
copyRegularFileNoFollow,
|
|
862
797
|
formatAnswer,
|
|
863
798
|
formatPrompt,
|