@prismatic-io/lux 0.0.2-preview.4 → 0.0.2-preview.40
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 +6 -4
- package/lib/answerers/terminal/index.js.map +1 -1
- package/lib/assertions/authoring.d.ts +2 -2
- package/lib/assertions/authoring.d.ts.map +1 -1
- package/lib/assertions/authoring.js.map +1 -1
- package/lib/assertions/core/command-exits-zero.d.ts +5 -2
- package/lib/assertions/core/command-exits-zero.d.ts.map +1 -1
- package/lib/assertions/core/command-exits-zero.js +59 -14
- package/lib/assertions/core/command-exits-zero.js.map +1 -1
- package/lib/assertions/core/event-checks.d.ts +3 -0
- package/lib/assertions/core/event-checks.d.ts.map +1 -1
- package/lib/assertions/core/event-checks.js +49 -3
- package/lib/assertions/core/event-checks.js.map +1 -1
- package/lib/assertions/core/file-checks.d.ts +6 -0
- package/lib/assertions/core/file-checks.d.ts.map +1 -1
- package/lib/assertions/core/index.d.ts.map +1 -1
- package/lib/assertions/core/index.js +2 -1
- package/lib/assertions/core/index.js.map +1 -1
- package/lib/assertions/core/json-pointer-equals.d.ts +1 -0
- package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -1
- package/lib/assertions/core/output-checks.d.ts +3 -0
- package/lib/assertions/core/output-checks.d.ts.map +1 -1
- package/lib/assertions/core/predicate.d.ts +1 -0
- package/lib/assertions/core/predicate.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.d.ts +25 -0
- package/lib/assertions/core/resource-checks.d.ts.map +1 -1
- package/lib/assertions/core/resource-checks.js +35 -5
- package/lib/assertions/core/resource-checks.js.map +1 -1
- package/lib/assertions/core/safe-regex.d.ts.map +1 -1
- package/lib/assertions/core/safe-regex.js +7 -1
- package/lib/assertions/core/safe-regex.js.map +1 -1
- package/lib/assertions/rubric/evidence.d.ts +88 -0
- package/lib/assertions/rubric/evidence.d.ts.map +1 -0
- package/lib/assertions/rubric/evidence.js +75 -0
- package/lib/assertions/rubric/evidence.js.map +1 -0
- package/lib/assertions/rubric/index.d.ts +88 -34
- package/lib/assertions/rubric/index.d.ts.map +1 -1
- package/lib/assertions/rubric/index.js +59 -43
- package/lib/assertions/rubric/index.js.map +1 -1
- package/lib/assertions/rubric/internal.d.ts +30 -5
- package/lib/assertions/rubric/internal.d.ts.map +1 -1
- package/lib/assertions/rubric/internal.js +203 -41
- package/lib/assertions/rubric/internal.js.map +1 -1
- package/lib/authoring.d.ts +37 -2
- package/lib/authoring.d.ts.map +1 -1
- package/lib/authoring.js +36 -1
- package/lib/authoring.js.map +1 -1
- package/lib/cli/bin.js +2 -13
- package/lib/cli/bin.js.map +1 -1
- package/lib/cli/command-runtime.d.ts +3 -3
- package/lib/cli/command-runtime.d.ts.map +1 -1
- package/lib/cli/command-runtime.js +17 -6
- package/lib/cli/command-runtime.js.map +1 -1
- package/lib/cli/doctor.d.ts +55 -0
- package/lib/cli/doctor.d.ts.map +1 -0
- package/lib/cli/doctor.js +14 -0
- package/lib/cli/doctor.js.map +1 -0
- package/lib/cli/harness-plan.d.ts +27 -0
- package/lib/cli/harness-plan.d.ts.map +1 -0
- package/lib/cli/harness-plan.js +75 -0
- package/lib/cli/harness-plan.js.map +1 -0
- package/lib/cli/init-templates.d.ts +11 -0
- package/lib/cli/init-templates.d.ts.map +1 -0
- package/lib/cli/init-templates.js +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 +1412 -0
- package/lib/cli/output-schemas.d.ts.map +1 -0
- package/lib/cli/output-schemas.js +94 -0
- package/lib/cli/output-schemas.js.map +1 -0
- package/lib/cli/program.d.ts +140 -12
- package/lib/cli/program.d.ts.map +1 -1
- package/lib/cli/program.js +783 -650
- package/lib/cli/program.js.map +1 -1
- package/lib/cli/render/format.d.ts.map +1 -1
- package/lib/cli/render/format.js +1 -1
- package/lib/cli/render/format.js.map +1 -1
- package/lib/cli/render/reporter.d.ts.map +1 -1
- package/lib/cli/render/reporter.js +35 -8
- package/lib/cli/render/reporter.js.map +1 -1
- package/lib/cli/run-options.d.ts +19 -4
- package/lib/cli/run-options.d.ts.map +1 -1
- package/lib/cli/run-options.js +100 -19
- package/lib/cli/run-options.js.map +1 -1
- package/lib/cli/view.d.ts +15 -0
- package/lib/cli/view.d.ts.map +1 -0
- package/lib/cli/view.js +168 -0
- package/lib/cli/view.js.map +1 -0
- package/lib/container/driver.d.ts +27 -0
- package/lib/container/driver.d.ts.map +1 -0
- package/lib/container/driver.js +199 -0
- package/lib/container/driver.js.map +1 -0
- package/lib/container/paths.d.ts +3 -0
- package/lib/container/paths.d.ts.map +1 -0
- package/lib/container/paths.js +27 -0
- package/lib/container/paths.js.map +1 -0
- package/lib/container/protocol.d.ts +12 -0
- package/lib/container/protocol.d.ts.map +1 -0
- package/lib/container/protocol.js +38 -0
- package/lib/container/protocol.js.map +1 -0
- package/lib/container/resources.d.ts +14 -0
- package/lib/container/resources.d.ts.map +1 -0
- package/lib/container/resources.js +141 -0
- package/lib/container/resources.js.map +1 -0
- package/lib/container/worker.d.ts +2 -0
- package/lib/container/worker.d.ts.map +1 -0
- package/lib/container/worker.js +85 -0
- package/lib/container/worker.js.map +1 -0
- package/lib/core/action-events.d.ts +29 -0
- package/lib/core/action-events.d.ts.map +1 -0
- package/lib/core/action-events.js +51 -0
- package/lib/core/action-events.js.map +1 -0
- package/lib/core/agent-activity.d.ts +49 -0
- package/lib/core/agent-activity.d.ts.map +1 -0
- package/lib/core/agent-activity.js +206 -0
- package/lib/core/agent-activity.js.map +1 -0
- package/lib/core/agent-environment.d.ts +5 -0
- package/lib/core/agent-environment.d.ts.map +1 -0
- package/lib/core/agent-environment.js +47 -0
- package/lib/core/agent-environment.js.map +1 -0
- package/lib/core/agent-events.d.ts +26 -0
- package/lib/core/agent-events.d.ts.map +1 -0
- package/lib/core/agent-events.js +13 -0
- package/lib/core/agent-events.js.map +1 -0
- package/lib/core/annotation.d.ts +6 -2
- package/lib/core/annotation.d.ts.map +1 -1
- package/lib/core/annotation.js +2 -1
- package/lib/core/annotation.js.map +1 -1
- package/lib/core/answerer.d.ts +12 -0
- package/lib/core/answerer.d.ts.map +1 -1
- package/lib/core/answerer.js +2 -0
- package/lib/core/answerer.js.map +1 -1
- package/lib/core/artifact-evidence.d.ts +6 -1
- package/lib/core/artifact-evidence.d.ts.map +1 -1
- package/lib/core/artifact-evidence.js +27 -6
- package/lib/core/artifact-evidence.js.map +1 -1
- package/lib/core/assertion.d.ts +10 -4
- package/lib/core/assertion.d.ts.map +1 -1
- package/lib/core/assertion.js +8 -2
- package/lib/core/assertion.js.map +1 -1
- package/lib/core/case-defaults.d.ts +16 -0
- package/lib/core/case-defaults.d.ts.map +1 -0
- package/lib/core/case-defaults.js +42 -0
- package/lib/core/case-defaults.js.map +1 -0
- package/lib/core/case.d.ts +120 -6
- package/lib/core/case.d.ts.map +1 -1
- package/lib/core/case.js +51 -5
- package/lib/core/case.js.map +1 -1
- package/lib/core/command-verification.d.ts +10 -0
- package/lib/core/command-verification.d.ts.map +1 -0
- package/lib/core/command-verification.js +66 -0
- package/lib/core/command-verification.js.map +1 -0
- package/lib/core/driver-execution.d.ts +83 -0
- package/lib/core/driver-execution.d.ts.map +1 -0
- package/lib/core/driver-execution.js +72 -0
- package/lib/core/driver-execution.js.map +1 -0
- package/lib/core/driver-metrics.d.ts +98 -0
- package/lib/core/driver-metrics.d.ts.map +1 -0
- package/lib/core/driver-metrics.js +36 -0
- package/lib/core/driver-metrics.js.map +1 -0
- package/lib/core/driver.d.ts +64 -0
- package/lib/core/driver.d.ts.map +1 -1
- package/lib/core/driver.js +28 -0
- package/lib/core/driver.js.map +1 -1
- package/lib/core/duration.d.ts +5 -0
- package/lib/core/duration.d.ts.map +1 -0
- package/lib/core/duration.js +49 -0
- package/lib/core/duration.js.map +1 -0
- package/lib/core/environment.d.ts +18 -0
- package/lib/core/environment.d.ts.map +1 -0
- package/lib/core/environment.js +21 -0
- package/lib/core/environment.js.map +1 -0
- package/lib/core/evaluation-clusters.d.ts +17 -0
- package/lib/core/evaluation-clusters.d.ts.map +1 -0
- package/lib/core/evaluation-clusters.js +23 -0
- package/lib/core/evaluation-clusters.js.map +1 -0
- package/lib/core/events.d.ts +34 -0
- package/lib/core/events.d.ts.map +1 -1
- package/lib/core/events.js +11 -2
- package/lib/core/events.js.map +1 -1
- package/lib/core/experiment.d.ts +33 -2
- package/lib/core/experiment.d.ts.map +1 -1
- package/lib/core/experiment.js +40 -19
- package/lib/core/experiment.js.map +1 -1
- package/lib/core/file-tree.d.ts +7 -0
- package/lib/core/file-tree.d.ts.map +1 -0
- package/lib/core/file-tree.js +35 -0
- package/lib/core/file-tree.js.map +1 -0
- package/lib/core/global-id.d.ts +6 -0
- package/lib/core/global-id.d.ts.map +1 -0
- package/lib/core/global-id.js +17 -0
- package/lib/core/global-id.js.map +1 -0
- package/lib/core/harness-catalog.d.ts +35 -0
- package/lib/core/harness-catalog.d.ts.map +1 -0
- package/lib/core/harness-catalog.js +45 -0
- package/lib/core/harness-catalog.js.map +1 -0
- package/lib/core/harness-catalogs/antigravity.d.ts +11 -0
- package/lib/core/harness-catalogs/antigravity.d.ts.map +1 -0
- package/lib/core/harness-catalogs/antigravity.js +23 -0
- package/lib/core/harness-catalogs/antigravity.js.map +1 -0
- package/lib/core/harness-catalogs/claude-code.d.ts +12 -0
- package/lib/core/harness-catalogs/claude-code.d.ts.map +1 -0
- package/lib/core/harness-catalogs/claude-code.js +24 -0
- package/lib/core/harness-catalogs/claude-code.js.map +1 -0
- package/lib/core/harness-catalogs/codex.d.ts +11 -0
- package/lib/core/harness-catalogs/codex.d.ts.map +1 -0
- package/lib/core/harness-catalogs/codex.js +26 -0
- package/lib/core/harness-catalogs/codex.js.map +1 -0
- package/lib/core/harness-catalogs/copilot.d.ts +29 -0
- package/lib/core/harness-catalogs/copilot.d.ts.map +1 -0
- package/lib/core/harness-catalogs/copilot.js +45 -0
- package/lib/core/harness-catalogs/copilot.js.map +1 -0
- package/lib/core/harness-catalogs/cursor.d.ts +2 -0
- package/lib/core/harness-catalogs/cursor.d.ts.map +1 -0
- package/lib/core/harness-catalogs/cursor.js +13 -0
- package/lib/core/harness-catalogs/cursor.js.map +1 -0
- package/lib/core/harness-catalogs/grok-build.d.ts +7 -0
- package/lib/core/harness-catalogs/grok-build.d.ts.map +1 -0
- package/lib/core/harness-catalogs/grok-build.js +18 -0
- package/lib/core/harness-catalogs/grok-build.js.map +1 -0
- package/lib/core/harness-catalogs/index.d.ts +73 -0
- package/lib/core/harness-catalogs/index.d.ts.map +1 -0
- package/lib/core/harness-catalogs/index.js +17 -0
- package/lib/core/harness-catalogs/index.js.map +1 -0
- package/lib/core/harness-matrix.d.ts +154 -0
- package/lib/core/harness-matrix.d.ts.map +1 -0
- package/lib/core/harness-matrix.js +204 -0
- package/lib/core/harness-matrix.js.map +1 -0
- package/lib/core/index.d.ts +12 -0
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +12 -0
- package/lib/core/index.js.map +1 -1
- package/lib/core/lifecycle-fixtures.d.ts.map +1 -1
- package/lib/core/lifecycle-fixtures.js +4 -2
- package/lib/core/lifecycle-fixtures.js.map +1 -1
- package/lib/core/model-cli.d.ts +9 -11
- package/lib/core/model-cli.d.ts.map +1 -1
- package/lib/core/model-cli.js +39 -22
- package/lib/core/model-cli.js.map +1 -1
- package/lib/core/platform-process.d.ts +7 -2
- package/lib/core/platform-process.d.ts.map +1 -1
- package/lib/core/platform-process.js +54 -16
- package/lib/core/platform-process.js.map +1 -1
- package/lib/core/reference-defaults.d.ts +5 -0
- package/lib/core/reference-defaults.d.ts.map +1 -0
- package/lib/core/reference-defaults.js +42 -0
- package/lib/core/reference-defaults.js.map +1 -0
- package/lib/core/rubric.d.ts +1 -0
- package/lib/core/rubric.d.ts.map +1 -1
- package/lib/core/run.d.ts +292 -1
- package/lib/core/run.d.ts.map +1 -1
- package/lib/core/run.js +27 -0
- package/lib/core/run.js.map +1 -1
- package/lib/core/secure-copy.d.ts.map +1 -0
- package/lib/core/secure-copy.js.map +1 -0
- package/lib/core/usage.d.ts +5 -0
- package/lib/core/usage.d.ts.map +1 -1
- package/lib/core/usage.js +3 -0
- package/lib/core/usage.js.map +1 -1
- package/lib/core/wire.d.ts +11 -0
- package/lib/core/wire.d.ts.map +1 -1
- package/lib/drivers/antigravity/artifacts.d.ts +2 -0
- package/lib/drivers/antigravity/artifacts.d.ts.map +1 -0
- package/lib/drivers/antigravity/artifacts.js +33 -0
- package/lib/drivers/antigravity/artifacts.js.map +1 -0
- package/lib/drivers/antigravity/config.d.ts +88 -0
- package/lib/drivers/antigravity/config.d.ts.map +1 -0
- package/lib/drivers/antigravity/config.js +87 -0
- package/lib/drivers/antigravity/config.js.map +1 -0
- package/lib/drivers/antigravity/events.d.ts +4 -0
- package/lib/drivers/antigravity/events.d.ts.map +1 -0
- package/lib/drivers/antigravity/events.js +241 -0
- package/lib/drivers/antigravity/events.js.map +1 -0
- package/lib/drivers/antigravity/index.d.ts +114 -0
- package/lib/drivers/antigravity/index.d.ts.map +1 -0
- package/lib/drivers/antigravity/index.js +113 -0
- package/lib/drivers/antigravity/index.js.map +1 -0
- package/lib/drivers/antigravity/runtime.d.ts +7 -0
- package/lib/drivers/antigravity/runtime.d.ts.map +1 -0
- package/lib/drivers/antigravity/runtime.js +83 -0
- package/lib/drivers/antigravity/runtime.js.map +1 -0
- package/lib/drivers/claude-code/deferred-process.d.ts +17 -0
- package/lib/drivers/claude-code/deferred-process.d.ts.map +1 -0
- package/lib/drivers/claude-code/deferred-process.js +108 -0
- package/lib/drivers/claude-code/deferred-process.js.map +1 -0
- package/lib/drivers/claude-code/index.d.ts +187 -10
- package/lib/drivers/claude-code/index.d.ts.map +1 -1
- package/lib/drivers/claude-code/index.js +197 -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 +69 -5
- package/lib/drivers/codex/config.d.ts.map +1 -1
- package/lib/drivers/codex/config.js +48 -8
- package/lib/drivers/codex/config.js.map +1 -1
- package/lib/drivers/codex/exec-events.d.ts +4 -0
- package/lib/drivers/codex/exec-events.d.ts.map +1 -0
- package/lib/drivers/codex/exec-events.js +230 -0
- package/lib/drivers/codex/exec-events.js.map +1 -0
- package/lib/drivers/codex/index.d.ts +142 -4
- package/lib/drivers/codex/index.d.ts.map +1 -1
- package/lib/drivers/codex/index.js +114 -276
- package/lib/drivers/codex/index.js.map +1 -1
- package/lib/drivers/copilot/config.d.ts +84 -0
- package/lib/drivers/copilot/config.d.ts.map +1 -0
- package/lib/drivers/copilot/config.js +57 -0
- package/lib/drivers/copilot/config.js.map +1 -0
- package/lib/drivers/copilot/index.d.ts +107 -0
- package/lib/drivers/copilot/index.d.ts.map +1 -0
- package/lib/drivers/copilot/index.js +268 -0
- package/lib/drivers/copilot/index.js.map +1 -0
- package/lib/drivers/cursor/config.d.ts +28 -0
- package/lib/drivers/cursor/config.d.ts.map +1 -0
- package/lib/drivers/cursor/config.js +28 -0
- package/lib/drivers/cursor/config.js.map +1 -0
- package/lib/drivers/cursor/index.d.ts +44 -0
- package/lib/drivers/cursor/index.d.ts.map +1 -0
- package/lib/drivers/cursor/index.js +286 -0
- package/lib/drivers/cursor/index.js.map +1 -0
- package/lib/drivers/cursor/interaction.d.ts +6 -0
- package/lib/drivers/cursor/interaction.d.ts.map +1 -0
- package/lib/drivers/cursor/interaction.js +55 -0
- package/lib/drivers/cursor/interaction.js.map +1 -0
- package/lib/drivers/grok-build/config.d.ts +68 -0
- package/lib/drivers/grok-build/config.d.ts.map +1 -0
- package/lib/drivers/grok-build/config.js +40 -0
- package/lib/drivers/grok-build/config.js.map +1 -0
- package/lib/drivers/grok-build/index.d.ts +87 -0
- package/lib/drivers/grok-build/index.d.ts.map +1 -0
- package/lib/drivers/grok-build/index.js +293 -0
- package/lib/drivers/grok-build/index.js.map +1 -0
- package/lib/drivers/mcp/index.d.ts +37 -4
- package/lib/drivers/mcp/index.d.ts.map +1 -1
- package/lib/drivers/mcp/index.js +25 -11
- package/lib/drivers/mcp/index.js.map +1 -1
- package/lib/drivers/shared/acp-events.d.ts +15 -0
- package/lib/drivers/shared/acp-events.d.ts.map +1 -0
- package/lib/drivers/shared/acp-events.js +83 -0
- package/lib/drivers/shared/acp-events.js.map +1 -0
- package/lib/drivers/shared/acp-interaction.d.ts +7 -0
- package/lib/drivers/shared/acp-interaction.d.ts.map +1 -0
- package/lib/drivers/shared/acp-interaction.js +20 -0
- package/lib/drivers/shared/acp-interaction.js.map +1 -0
- package/lib/drivers/shared/acp-session.d.ts +4 -0
- package/lib/drivers/shared/acp-session.d.ts.map +1 -0
- package/lib/drivers/shared/acp-session.js +23 -0
- package/lib/drivers/shared/acp-session.js.map +1 -0
- package/lib/drivers/shared/acp-transport.d.ts +40 -0
- package/lib/drivers/shared/acp-transport.d.ts.map +1 -0
- package/lib/drivers/shared/acp-transport.js +152 -0
- package/lib/drivers/shared/acp-transport.js.map +1 -0
- package/lib/drivers/shared/artifacts.d.ts.map +1 -1
- package/lib/drivers/shared/artifacts.js +3 -2
- package/lib/drivers/shared/artifacts.js.map +1 -1
- package/lib/drivers/shared/experiment-behavior.d.ts +13 -0
- package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-behavior.js +200 -0
- package/lib/drivers/shared/experiment-behavior.js.map +1 -0
- package/lib/drivers/shared/experiment-policy.d.ts +4 -0
- package/lib/drivers/shared/experiment-policy.d.ts.map +1 -0
- package/lib/drivers/shared/experiment-policy.js +144 -0
- package/lib/drivers/shared/experiment-policy.js.map +1 -0
- package/lib/drivers/shared/skills.d.ts +3 -0
- package/lib/drivers/shared/skills.d.ts.map +1 -0
- package/lib/drivers/shared/skills.js +73 -0
- package/lib/drivers/shared/skills.js.map +1 -0
- package/lib/drivers/subprocess/index.d.ts +39 -4
- package/lib/drivers/subprocess/index.d.ts.map +1 -1
- package/lib/drivers/subprocess/index.js +56 -12
- package/lib/drivers/subprocess/index.js.map +1 -1
- package/lib/index.d.ts +24 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +20 -5
- package/lib/index.js.map +1 -1
- package/lib/optimization/reflective.d.ts +3 -1
- package/lib/optimization/reflective.d.ts.map +1 -1
- package/lib/optimization/reflective.js +3 -2
- package/lib/optimization/reflective.js.map +1 -1
- package/lib/orchestrator/annotation-loader.d.ts +6 -2
- package/lib/orchestrator/annotation-loader.d.ts.map +1 -1
- package/lib/orchestrator/annotation-loader.js +8 -0
- package/lib/orchestrator/annotation-loader.js.map +1 -1
- package/lib/orchestrator/annotation-store.d.ts.map +1 -1
- package/lib/orchestrator/annotation-store.js +16 -2
- package/lib/orchestrator/annotation-store.js.map +1 -1
- package/lib/orchestrator/artifact-origin.d.ts +3 -0
- package/lib/orchestrator/artifact-origin.d.ts.map +1 -0
- package/lib/orchestrator/artifact-origin.js +40 -0
- package/lib/orchestrator/artifact-origin.js.map +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/campaign-lifecycle.js +4 -1
- package/lib/orchestrator/campaign-lifecycle.js.map +1 -1
- package/lib/orchestrator/candidates.d.ts.map +1 -1
- package/lib/orchestrator/candidates.js +3 -2
- package/lib/orchestrator/candidates.js.map +1 -1
- package/lib/orchestrator/compare.d.ts +23 -6
- package/lib/orchestrator/compare.d.ts.map +1 -1
- package/lib/orchestrator/compare.js +45 -12
- package/lib/orchestrator/compare.js.map +1 -1
- package/lib/orchestrator/comparison-identity.d.ts.map +1 -1
- package/lib/orchestrator/comparison-identity.js +2 -0
- package/lib/orchestrator/comparison-identity.js.map +1 -1
- package/lib/orchestrator/config.d.ts +180 -1
- package/lib/orchestrator/config.d.ts.map +1 -1
- package/lib/orchestrator/config.js +21 -2
- package/lib/orchestrator/config.js.map +1 -1
- package/lib/orchestrator/discover.d.ts +1 -0
- package/lib/orchestrator/discover.d.ts.map +1 -1
- package/lib/orchestrator/discover.js +7 -1
- package/lib/orchestrator/discover.js.map +1 -1
- package/lib/orchestrator/doctor.d.ts +1 -0
- package/lib/orchestrator/doctor.d.ts.map +1 -1
- package/lib/orchestrator/doctor.js +134 -69
- 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 +2 -1
- package/lib/orchestrator/experiment-context.js.map +1 -1
- package/lib/orchestrator/experiment-contracts.d.ts +31 -1
- package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.d.ts +2 -1
- package/lib/orchestrator/experiment-corpus.d.ts.map +1 -1
- package/lib/orchestrator/experiment-corpus.js +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 +46 -0
- package/lib/orchestrator/experiment-effects.js.map +1 -0
- package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
- package/lib/orchestrator/experiment-evaluation.js +70 -5
- package/lib/orchestrator/experiment-evaluation.js.map +1 -1
- package/lib/orchestrator/experiment-identity.d.ts +3 -0
- package/lib/orchestrator/experiment-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-identity.js +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 +91 -1
- package/lib/orchestrator/experiment-report.d.ts.map +1 -1
- package/lib/orchestrator/experiment-report.js +9 -1
- package/lib/orchestrator/experiment-report.js.map +1 -1
- package/lib/orchestrator/experiment-runs.d.ts +63 -2
- package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runs.js +13 -5
- package/lib/orchestrator/experiment-runs.js.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.d.ts +0 -16
- package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -1
- package/lib/orchestrator/experiment-runtime-identity.js +5 -220
- package/lib/orchestrator/experiment-runtime-identity.js.map +1 -1
- package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
- package/lib/orchestrator/experiment-selection.js +151 -43
- package/lib/orchestrator/experiment-selection.js.map +1 -1
- package/lib/orchestrator/experiment.d.ts +3 -3
- package/lib/orchestrator/experiment.d.ts.map +1 -1
- package/lib/orchestrator/experiment.js +26 -21
- package/lib/orchestrator/experiment.js.map +1 -1
- package/lib/orchestrator/fixture-identity.d.ts +1 -0
- package/lib/orchestrator/fixture-identity.d.ts.map +1 -1
- package/lib/orchestrator/fixture-identity.js +6 -1
- package/lib/orchestrator/fixture-identity.js.map +1 -1
- package/lib/orchestrator/fs-read.d.ts +1 -6
- package/lib/orchestrator/fs-read.d.ts.map +1 -1
- package/lib/orchestrator/fs-read.js +2 -32
- package/lib/orchestrator/fs-read.js.map +1 -1
- package/lib/orchestrator/grader-experiment.d.ts +23 -5
- package/lib/orchestrator/grader-experiment.d.ts.map +1 -1
- package/lib/orchestrator/grader-experiment.js +54 -9
- package/lib/orchestrator/grader-experiment.js.map +1 -1
- package/lib/orchestrator/grading.d.ts +1 -0
- package/lib/orchestrator/grading.d.ts.map +1 -1
- package/lib/orchestrator/grading.js +41 -33
- package/lib/orchestrator/grading.js.map +1 -1
- package/lib/orchestrator/harness-catalog-drift.d.ts +22 -0
- package/lib/orchestrator/harness-catalog-drift.d.ts.map +1 -0
- package/lib/orchestrator/harness-catalog-drift.js +90 -0
- package/lib/orchestrator/harness-catalog-drift.js.map +1 -0
- package/lib/orchestrator/harness-registry.d.ts +4 -0
- package/lib/orchestrator/harness-registry.d.ts.map +1 -0
- package/lib/orchestrator/harness-registry.js +5 -0
- package/lib/orchestrator/harness-registry.js.map +1 -0
- package/lib/orchestrator/index.d.ts +1 -1
- package/lib/orchestrator/index.d.ts.map +1 -1
- package/lib/orchestrator/index.js +1 -1
- package/lib/orchestrator/index.js.map +1 -1
- package/lib/orchestrator/list-runs.d.ts +8 -1
- package/lib/orchestrator/list-runs.d.ts.map +1 -1
- package/lib/orchestrator/list-runs.js +83 -18
- package/lib/orchestrator/list-runs.js.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/optimization-lifecycle.js +3 -1
- package/lib/orchestrator/optimization-lifecycle.js.map +1 -1
- package/lib/orchestrator/orchestrator.d.ts +17 -2
- package/lib/orchestrator/orchestrator.d.ts.map +1 -1
- package/lib/orchestrator/orchestrator.js +55 -177
- package/lib/orchestrator/orchestrator.js.map +1 -1
- package/lib/orchestrator/paired-effects.d.ts +34 -0
- package/lib/orchestrator/paired-effects.d.ts.map +1 -0
- package/lib/orchestrator/paired-effects.js +164 -0
- package/lib/orchestrator/paired-effects.js.map +1 -0
- package/lib/orchestrator/profile.d.ts +4 -0
- package/lib/orchestrator/profile.d.ts.map +1 -0
- package/lib/orchestrator/profile.js +10 -0
- package/lib/orchestrator/profile.js.map +1 -0
- package/lib/orchestrator/provenance.d.ts +5 -1
- package/lib/orchestrator/provenance.d.ts.map +1 -1
- package/lib/orchestrator/provenance.js +16 -3
- package/lib/orchestrator/provenance.js.map +1 -1
- package/lib/orchestrator/regrade.d.ts +4 -2
- package/lib/orchestrator/regrade.d.ts.map +1 -1
- package/lib/orchestrator/rubric-loader.js +1 -1
- package/lib/orchestrator/rubric-loader.js.map +1 -1
- package/lib/orchestrator/run-dir.d.ts +2 -0
- package/lib/orchestrator/run-dir.d.ts.map +1 -1
- package/lib/orchestrator/run-dir.js +1 -1
- package/lib/orchestrator/run-dir.js.map +1 -1
- package/lib/orchestrator/run-execution.d.ts +3 -0
- package/lib/orchestrator/run-execution.d.ts.map +1 -1
- package/lib/orchestrator/run-execution.js +64 -10
- package/lib/orchestrator/run-execution.js.map +1 -1
- package/lib/orchestrator/run-lifecycle.d.ts +1 -0
- package/lib/orchestrator/run-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/run-lifecycle.js +3 -2
- package/lib/orchestrator/run-lifecycle.js.map +1 -1
- package/lib/orchestrator/run-workspace.d.ts +10 -0
- package/lib/orchestrator/run-workspace.d.ts.map +1 -0
- package/lib/orchestrator/run-workspace.js +58 -0
- package/lib/orchestrator/run-workspace.js.map +1 -0
- package/lib/orchestrator/suite-compare.d.ts +37 -0
- package/lib/orchestrator/suite-compare.d.ts.map +1 -1
- package/lib/orchestrator/suite-compare.js +44 -22
- package/lib/orchestrator/suite-compare.js.map +1 -1
- package/lib/orchestrator/suite-runs.d.ts +6 -1
- package/lib/orchestrator/suite-runs.d.ts.map +1 -1
- package/lib/orchestrator/suite-runs.js +14 -2
- package/lib/orchestrator/suite-runs.js.map +1 -1
- package/lib/orchestrator/suite-summary.d.ts +79 -0
- package/lib/orchestrator/suite-summary.d.ts.map +1 -1
- package/lib/orchestrator/suite-summary.js +67 -14
- package/lib/orchestrator/suite-summary.js.map +1 -1
- package/lib/previewer/artifacts.d.ts +25 -0
- package/lib/previewer/artifacts.d.ts.map +1 -0
- package/lib/previewer/artifacts.js +180 -0
- package/lib/previewer/artifacts.js.map +1 -0
- package/lib/previewer/server.d.ts +111 -0
- package/lib/previewer/server.d.ts.map +1 -0
- package/lib/previewer/server.js +559 -0
- package/lib/previewer/server.js.map +1 -0
- package/package.json +4 -2
- package/skills/lux-answerer/SKILL.md +2 -2
- package/src/answerers/claude-code/index.ts +6 -5
- package/src/answerers/persona/index.ts +75 -34
- package/src/answerers/terminal/index.ts +7 -11
- package/src/assertions/authoring.ts +2 -0
- package/src/assertions/core/command-exits-zero.ts +82 -17
- package/src/assertions/core/event-checks.ts +64 -3
- package/src/assertions/core/index.ts +2 -0
- package/src/assertions/core/resource-checks.ts +38 -5
- package/src/assertions/core/safe-regex.ts +16 -6
- package/src/assertions/rubric/evidence.ts +85 -0
- package/src/assertions/rubric/index.ts +63 -46
- package/src/assertions/rubric/internal.ts +256 -41
- package/src/authoring.ts +346 -2
- package/src/cli/bin.ts +2 -12
- package/src/cli/command-runtime.ts +20 -9
- package/src/cli/doctor.ts +17 -0
- package/src/cli/harness-plan.ts +123 -0
- package/src/cli/init-templates.ts +238 -0
- package/src/cli/init.ts +53 -184
- package/src/cli/output-schemas.ts +109 -0
- package/src/cli/program.ts +697 -730
- package/src/cli/render/format.ts +1 -1
- package/src/cli/render/reporter.ts +36 -8
- package/src/cli/run-options.ts +131 -25
- package/src/cli/view.ts +129 -0
- package/src/container/driver.ts +213 -0
- package/src/container/paths.ts +29 -0
- package/src/container/protocol.ts +48 -0
- package/src/container/resources.ts +165 -0
- package/src/container/worker.ts +107 -0
- package/src/core/action-events.ts +59 -0
- package/src/core/agent-activity.ts +236 -0
- package/src/core/agent-environment.ts +64 -0
- package/src/core/agent-events.ts +17 -0
- package/src/core/annotation.ts +2 -1
- package/src/core/answerer.ts +9 -0
- package/src/core/artifact-evidence.ts +40 -5
- package/src/core/assertion.ts +8 -2
- package/src/core/case-defaults.ts +65 -0
- package/src/core/case.ts +79 -8
- package/src/core/command-verification.ts +74 -0
- package/src/core/driver-execution.ts +84 -0
- package/src/core/driver-metrics.ts +51 -0
- package/src/core/driver.ts +76 -0
- package/src/core/duration.ts +52 -0
- package/src/core/environment.ts +22 -0
- package/src/core/evaluation-clusters.ts +35 -0
- package/src/core/events.ts +13 -2
- package/src/core/experiment.ts +71 -25
- package/src/core/file-tree.ts +35 -0
- package/src/core/global-id.ts +26 -0
- package/src/core/harness-catalog.ts +100 -0
- package/src/core/harness-catalogs/antigravity.ts +24 -0
- package/src/core/harness-catalogs/claude-code.ts +25 -0
- package/src/core/harness-catalogs/codex.ts +27 -0
- package/src/core/harness-catalogs/copilot.ts +46 -0
- package/src/core/harness-catalogs/cursor.ts +13 -0
- package/src/core/harness-catalogs/grok-build.ts +19 -0
- package/src/core/harness-catalogs/index.ts +31 -0
- package/src/core/harness-matrix.ts +316 -0
- package/src/core/index.ts +12 -0
- package/src/core/lifecycle-fixtures.ts +4 -2
- package/src/core/model-cli.ts +60 -26
- package/src/core/platform-process.ts +65 -16
- package/src/core/reference-defaults.ts +47 -0
- package/src/core/run.ts +31 -0
- package/src/core/usage.ts +8 -0
- package/src/drivers/antigravity/README.md +171 -0
- package/src/drivers/antigravity/artifacts.ts +37 -0
- package/src/drivers/antigravity/config.ts +92 -0
- package/src/drivers/antigravity/events.ts +290 -0
- package/src/drivers/antigravity/index.ts +132 -0
- package/src/drivers/antigravity/runtime.ts +94 -0
- package/src/drivers/claude-code/deferred-process.ts +118 -0
- package/src/drivers/claude-code/index.ts +227 -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 +59 -8
- package/src/drivers/codex/exec-events.ts +258 -0
- package/src/drivers/codex/index.ts +146 -312
- package/src/drivers/copilot/README.md +60 -0
- package/src/drivers/copilot/config.ts +61 -0
- package/src/drivers/copilot/index.ts +310 -0
- package/src/drivers/cursor/README.md +66 -0
- package/src/drivers/cursor/config.ts +31 -0
- package/src/drivers/cursor/index.ts +326 -0
- package/src/drivers/cursor/interaction.ts +74 -0
- package/src/drivers/grok-build/README.md +112 -0
- package/src/drivers/grok-build/config.ts +43 -0
- package/src/drivers/grok-build/index.ts +331 -0
- package/src/drivers/mcp/index.ts +25 -11
- package/src/drivers/shared/acp-events.ts +94 -0
- package/src/drivers/shared/acp-interaction.ts +27 -0
- package/src/drivers/shared/acp-session.ts +40 -0
- package/src/drivers/shared/acp-transport.ts +187 -0
- package/src/drivers/shared/artifacts.ts +6 -2
- package/src/drivers/shared/experiment-behavior.ts +217 -0
- package/src/drivers/shared/experiment-policy.ts +196 -0
- package/src/drivers/shared/skills.ts +74 -0
- package/src/drivers/subprocess/index.ts +55 -12
- package/src/index.ts +117 -6
- package/src/optimization/reflective.ts +3 -2
- package/src/orchestrator/annotation-loader.ts +10 -0
- package/src/orchestrator/annotation-store.ts +24 -3
- package/src/orchestrator/artifact-origin.ts +50 -0
- package/src/orchestrator/campaign-lifecycle.ts +5 -1
- package/src/orchestrator/candidates.ts +3 -2
- package/src/orchestrator/compare.ts +62 -13
- package/src/orchestrator/comparison-identity.ts +2 -0
- package/src/orchestrator/config.ts +23 -1
- package/src/orchestrator/discover.ts +8 -1
- package/src/orchestrator/doctor.ts +211 -65
- package/src/orchestrator/driver-capabilities.ts +21 -0
- package/src/orchestrator/driver-identity.ts +69 -0
- package/src/orchestrator/experiment-context.ts +5 -3
- package/src/orchestrator/experiment-corpus.ts +58 -37
- package/src/orchestrator/experiment-effects.ts +63 -0
- package/src/orchestrator/experiment-evaluation.ts +88 -10
- package/src/orchestrator/experiment-identity.ts +57 -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 +178 -18
- package/src/orchestrator/experiment.ts +29 -29
- package/src/orchestrator/fixture-identity.ts +9 -1
- package/src/orchestrator/fs-read.ts +2 -32
- package/src/orchestrator/grader-experiment.ts +74 -13
- package/src/orchestrator/grading.ts +60 -31
- package/src/orchestrator/harness-catalog-drift.ts +132 -0
- package/src/orchestrator/harness-registry.ts +12 -0
- package/src/orchestrator/index.ts +1 -0
- package/src/orchestrator/list-runs.ts +102 -18
- package/src/orchestrator/optimization-lifecycle.ts +4 -1
- package/src/orchestrator/orchestrator.ts +105 -224
- package/src/orchestrator/paired-effects.ts +214 -0
- package/src/orchestrator/profile.ts +24 -0
- package/src/orchestrator/provenance.ts +23 -3
- package/src/orchestrator/rubric-loader.ts +1 -1
- package/src/orchestrator/run-dir.ts +8 -1
- package/src/orchestrator/run-execution.ts +75 -10
- package/src/orchestrator/run-lifecycle.ts +4 -2
- package/src/orchestrator/run-workspace.ts +62 -0
- package/src/orchestrator/suite-compare.ts +47 -23
- package/src/orchestrator/suite-runs.ts +13 -2
- package/src/orchestrator/suite-summary.ts +129 -15
- package/src/previewer/artifacts.ts +221 -0
- package/src/previewer/server.ts +789 -0
- package/viewer/app.css +2111 -0
- package/viewer/app.js +627 -0
- package/viewer/artifact-view.js +48 -0
- package/viewer/charts.js +98 -0
- package/viewer/detail.js +1266 -0
- package/viewer/format.js +129 -0
- package/viewer/index.html +151 -0
- package/lib/cli/skills.d.ts +0 -38
- package/lib/cli/skills.d.ts.map +0 -1
- package/lib/cli/skills.js +0 -84
- package/lib/cli/skills.js.map +0 -1
- package/lib/drivers/shared/secure-copy.d.ts.map +0 -1
- package/lib/drivers/shared/secure-copy.js.map +0 -1
- package/skills/lux/SKILL.md +0 -89
- package/skills/lux/references/cli.md +0 -125
- package/skills/lux/references/eval-authoring.md +0 -257
- package/src/cli/skills.ts +0 -129
- /package/lib/{drivers/shared → core}/secure-copy.d.ts +0 -0
- /package/lib/{drivers/shared → core}/secure-copy.js +0 -0
- /package/src/{drivers/shared → core}/secure-copy.ts +0 -0
|
@@ -1,25 +1,37 @@
|
|
|
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";
|
|
31
|
+
import { stageSkills } from "../shared/skills.js";
|
|
22
32
|
import { subprocessDriver } from "../subprocess/index.js";
|
|
33
|
+
import { runDeferredProcess } from "./deferred-process.js";
|
|
34
|
+
import { isolatedLaunch } from "./isolation.js";
|
|
23
35
|
import { ClaudeCodeLineSchema, makeParseEvent } from "./parse-events.js";
|
|
24
36
|
|
|
25
37
|
const LUX_BOOKKEEPING_FILES = new Set([
|
|
@@ -33,12 +45,23 @@ const LUX_BOOKKEEPING_FILES = new Set([
|
|
|
33
45
|
const commandName = (command: string): string => command.split(/[\\/]/).at(-1) ?? command;
|
|
34
46
|
const ISOLATION_RESERVED_ARGS = new Set([
|
|
35
47
|
"--add-dir",
|
|
48
|
+
"--dangerously-skip-permissions",
|
|
49
|
+
"--allow-dangerously-skip-permissions",
|
|
50
|
+
"--permission-mode",
|
|
51
|
+
"--teleport",
|
|
52
|
+
"--continue",
|
|
53
|
+
"-c",
|
|
54
|
+
"--resume",
|
|
55
|
+
"-r",
|
|
56
|
+
"--fork-session",
|
|
57
|
+
"--session-id",
|
|
36
58
|
"--agent",
|
|
37
59
|
"--agents",
|
|
38
60
|
"--bare",
|
|
39
61
|
"--mcp-config",
|
|
40
62
|
"--no-session-persistence",
|
|
41
63
|
"--plugin-dir",
|
|
64
|
+
"--plugin-dir-no-mcp",
|
|
42
65
|
"--plugin-url",
|
|
43
66
|
"--safe-mode",
|
|
44
67
|
"--setting-sources",
|
|
@@ -54,6 +77,8 @@ const IsolationSchema = z
|
|
|
54
77
|
* and `addDirs` paths are included automatically.
|
|
55
78
|
*/
|
|
56
79
|
allowRead: z.array(z.string()).default([]),
|
|
80
|
+
/** Additional protected trees and files, including other evaluation runs. */
|
|
81
|
+
denyRead: z.array(z.string()).optional(),
|
|
57
82
|
})
|
|
58
83
|
.strict();
|
|
59
84
|
|
|
@@ -66,15 +91,15 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
66
91
|
cwdMode: z.enum(["artifacts", "runDir"]).default("artifacts"),
|
|
67
92
|
cwd: z.string().optional(),
|
|
68
93
|
env: z.record(z.string(), z.string()).optional(),
|
|
94
|
+
inheritEnv: InheritEnvironmentSchema.default(true),
|
|
69
95
|
/** Low-cost by default; choose a larger model explicitly when needed. */
|
|
70
96
|
model: z.string().min(1).default(DEFAULT_CLAUDE_MODEL),
|
|
71
|
-
|
|
72
|
-
effort: z.enum(["low", "medium", "high", "max"]).default("low"),
|
|
97
|
+
reasoningEffort: z.enum(claudeCodeCatalog.efforts).optional(),
|
|
73
98
|
/** Permission mode passed to claude. */
|
|
74
99
|
permissionMode: z
|
|
75
100
|
.enum(["acceptEdits", "auto", "bypassPermissions", "default", "dontAsk", "manual", "plan"])
|
|
76
101
|
.optional(),
|
|
77
|
-
/** Additional
|
|
102
|
+
/** Additional pre-approvals; auto mode omits the baseline coding-tool grants. */
|
|
78
103
|
allowedTools: z.array(z.string().min(1)).optional(),
|
|
79
104
|
/** Plugin directories to load (`--plugin-dir`): skills, subagents, commands, hooks. */
|
|
80
105
|
pluginDirs: z.array(z.string()).optional(),
|
|
@@ -82,6 +107,8 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
82
107
|
agent: z.string().optional(),
|
|
83
108
|
/** Extra readable directories (`--add-dir`). Grant the narrowest tree the case needs. */
|
|
84
109
|
addDirs: z.array(z.string()).optional(),
|
|
110
|
+
/** Standalone skill directories registered through native discovery in an isolated workspace. */
|
|
111
|
+
skillDirs: z.array(z.string().min(1)).optional(),
|
|
85
112
|
/**
|
|
86
113
|
* Run in a disposable workspace with local memory, persisted runs, and
|
|
87
114
|
* standard credential stores denied. Live network access is retained.
|
|
@@ -99,18 +126,40 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
99
126
|
* when a weaker model asks in text instead of calling `askToolName`.
|
|
100
127
|
*/
|
|
101
128
|
textQuestionFallback: z.boolean().default(false),
|
|
102
|
-
/**
|
|
103
|
-
|
|
129
|
+
/** Maximum silence between recognized protocol events; excludes answerer wait time. */
|
|
130
|
+
idleTimeout: DurationSchema.default("10 minutes"),
|
|
131
|
+
/** Optional elapsed-time cap per defer-resume CLI invocation, regardless of activity. */
|
|
132
|
+
turnTimeout: DurationSchema.optional(),
|
|
104
133
|
/** Cap on outstanding interrupts before the driver aborts. */
|
|
105
134
|
maxInterrupts: z.number().positive().default(20),
|
|
106
135
|
})
|
|
107
136
|
.strict()
|
|
108
137
|
.superRefine((config, ctx) => {
|
|
138
|
+
if (config.skillDirs?.length && !config.isolation) {
|
|
139
|
+
ctx.addIssue({
|
|
140
|
+
code: "custom",
|
|
141
|
+
path: ["skillDirs"],
|
|
142
|
+
message: "skillDirs requires isolation",
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
if (config.turnTimeout !== undefined && config.interactionMode !== "defer-resume") {
|
|
146
|
+
ctx.addIssue({
|
|
147
|
+
code: "custom",
|
|
148
|
+
path: ["turnTimeout"],
|
|
149
|
+
message: "turnTimeout requires defer-resume mode",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
109
152
|
if (config.interactionMode === "defer-resume") {
|
|
110
153
|
const reserved = config.extraArgs?.find((arg) =>
|
|
111
|
-
[
|
|
112
|
-
|
|
113
|
-
|
|
154
|
+
[
|
|
155
|
+
"--input-format",
|
|
156
|
+
"--no-session-persistence",
|
|
157
|
+
"--resume",
|
|
158
|
+
"-r",
|
|
159
|
+
"--settings",
|
|
160
|
+
"--permission-prompt-tool",
|
|
161
|
+
"--permission-prompts",
|
|
162
|
+
].some((name) => arg === name || arg.startsWith(`${name}=`)),
|
|
114
163
|
);
|
|
115
164
|
if (reserved) {
|
|
116
165
|
ctx.addIssue({
|
|
@@ -129,11 +178,12 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
129
178
|
"isolation requires permissionMode to be omitted or 'default'; Claude Code forces default mode while subprocess environment scrubbing is enabled",
|
|
130
179
|
});
|
|
131
180
|
}
|
|
132
|
-
if (config.interactionMode === "defer-resume") {
|
|
181
|
+
if (config.interactionMode === "defer-resume" && config.pluginDirs?.length) {
|
|
133
182
|
ctx.addIssue({
|
|
134
183
|
code: "custom",
|
|
135
|
-
path: ["
|
|
136
|
-
message:
|
|
184
|
+
path: ["pluginDirs"],
|
|
185
|
+
message:
|
|
186
|
+
"isolated defer-resume cannot load plugin hooks; use skillDirs for standalone skills",
|
|
137
187
|
});
|
|
138
188
|
}
|
|
139
189
|
if (config.cwd || config.cwdMode !== "artifacts") {
|
|
@@ -153,7 +203,8 @@ export const ClaudeCodeDriverConfigSchema = z
|
|
|
153
203
|
message: `isolation owns ${reserved}; configure isolation instead`,
|
|
154
204
|
});
|
|
155
205
|
}
|
|
156
|
-
})
|
|
206
|
+
})
|
|
207
|
+
.transform(applyCatalogEffort(claudeCodeCatalog));
|
|
157
208
|
|
|
158
209
|
export type ClaudeCodeDriverConfig = z.infer<typeof ClaudeCodeDriverConfigSchema>;
|
|
159
210
|
|
|
@@ -166,7 +217,7 @@ const buildArgs = (config: ClaudeCodeDriverConfig): string[] => {
|
|
|
166
217
|
"stream-json",
|
|
167
218
|
"--verbose",
|
|
168
219
|
];
|
|
169
|
-
out.push("--model", config.model,
|
|
220
|
+
out.push("--model", config.model, ...effortArgs(config));
|
|
170
221
|
if (config.permissionMode) out.push("--permission-mode", config.permissionMode);
|
|
171
222
|
out.push("--allowed-tools", ...allowedTools(config));
|
|
172
223
|
for (const dir of config.pluginDirs ?? []) out.push("--plugin-dir", dir);
|
|
@@ -197,23 +248,48 @@ const deferredHookSettings = (
|
|
|
197
248
|
},
|
|
198
249
|
});
|
|
199
250
|
|
|
251
|
+
const effortArgs = (config: ClaudeCodeDriverConfig): string[] =>
|
|
252
|
+
config.reasoningEffort ? ["--effort", config.reasoningEffort] : [];
|
|
253
|
+
|
|
200
254
|
const allowedTools = (config: ClaudeCodeDriverConfig): string[] => [
|
|
201
|
-
...new Set([
|
|
255
|
+
...new Set([
|
|
256
|
+
...(config.permissionMode === "auto" ? [] : MINIMAL_ALLOWED_TOOLS),
|
|
257
|
+
config.askToolName,
|
|
258
|
+
...(config.allowedTools ?? []),
|
|
259
|
+
]),
|
|
202
260
|
];
|
|
203
261
|
|
|
204
262
|
const buildDeferredArgs = (
|
|
205
263
|
config: ClaudeCodeDriverConfig,
|
|
206
264
|
hookPath: string,
|
|
207
265
|
sessionId?: string,
|
|
266
|
+
isolation?: Awaited<ReturnType<typeof isolatedLaunch>>,
|
|
208
267
|
): string[] => {
|
|
209
|
-
|
|
210
|
-
|
|
268
|
+
// Native print mode removes AskUserQuestion unless a host permission surface exists.
|
|
269
|
+
// The trusted PreToolUse hook handles the question before that surface is consulted.
|
|
270
|
+
const out = [
|
|
271
|
+
"--print",
|
|
272
|
+
"--output-format",
|
|
273
|
+
"stream-json",
|
|
274
|
+
"--verbose",
|
|
275
|
+
"--permission-prompt-tool",
|
|
276
|
+
"stdio",
|
|
277
|
+
];
|
|
278
|
+
out.push("--model", config.model, ...effortArgs(config));
|
|
211
279
|
if (config.permissionMode) out.push("--permission-mode", config.permissionMode);
|
|
212
280
|
out.push("--allowed-tools", ...allowedTools(config));
|
|
213
281
|
for (const dir of config.pluginDirs ?? []) out.push("--plugin-dir", dir);
|
|
214
282
|
if (config.agent) out.push("--agent", config.agent);
|
|
215
|
-
for (const dir of config.addDirs ?? []) out.push("--add-dir", dir);
|
|
216
|
-
out.push(
|
|
283
|
+
if (!isolation) for (const dir of config.addDirs ?? []) out.push("--add-dir", dir);
|
|
284
|
+
out.push(
|
|
285
|
+
"--settings",
|
|
286
|
+
JSON.stringify({
|
|
287
|
+
...isolation?.settings,
|
|
288
|
+
...deferredHookSettings(config, hookPath),
|
|
289
|
+
...(isolation ? { disableAllHooks: false } : {}),
|
|
290
|
+
}),
|
|
291
|
+
);
|
|
292
|
+
if (isolation) out.push("--strict-mcp-config", "--setting-sources", "");
|
|
217
293
|
if (sessionId) out.push("--resume", sessionId);
|
|
218
294
|
if (config.extraArgs) out.push(...config.extraArgs);
|
|
219
295
|
return out;
|
|
@@ -269,184 +345,6 @@ process.stdin.on("end", () => {
|
|
|
269
345
|
});
|
|
270
346
|
`;
|
|
271
347
|
|
|
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
348
|
const formatPrompt = (text: string): string =>
|
|
451
349
|
`${JSON.stringify({
|
|
452
350
|
type: "user",
|
|
@@ -475,9 +373,7 @@ const formatAnswer = (answer: Answer): string => {
|
|
|
475
373
|
class ClaudeCodeDriverImpl implements AgentDriver {
|
|
476
374
|
private inner: AgentDriver | null = null;
|
|
477
375
|
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.
|
|
376
|
+
// Typed closures retain handler identity so off() can detach queued listeners.
|
|
481
377
|
private pendingAttach: Array<{
|
|
482
378
|
event: keyof DriverEventMap;
|
|
483
379
|
handler: unknown;
|
|
@@ -488,6 +384,8 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
488
384
|
private artifactsDir: string | null = null;
|
|
489
385
|
private runDir: string | null = null;
|
|
490
386
|
private isolatedWorkspace: string | null = null;
|
|
387
|
+
private isolationControlDir: string | null = null;
|
|
388
|
+
private deferredIsolation: Awaited<ReturnType<typeof isolatedLaunch>> | undefined;
|
|
491
389
|
private deferredContext: StartContext | null = null;
|
|
492
390
|
private deferredCwd: string | null = null;
|
|
493
391
|
private deferredHookPath: string | null = null;
|
|
@@ -506,6 +404,7 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
506
404
|
private deferredInterrupts = 0;
|
|
507
405
|
private deferredTerminal = false;
|
|
508
406
|
private deferredTurn: Promise<void> | null = null;
|
|
407
|
+
private deferredAbort = new AbortController();
|
|
509
408
|
|
|
510
409
|
constructor(config: ClaudeCodeDriverConfig) {
|
|
511
410
|
this.config = config;
|
|
@@ -544,15 +443,20 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
544
443
|
let cwd =
|
|
545
444
|
this.config.cwd ?? (this.config.cwdMode === "artifacts" ? ctx.artifactsDir : ctx.runDir);
|
|
546
445
|
let args = buildArgs(this.config);
|
|
547
|
-
let env = this.config.env;
|
|
446
|
+
let env = agentEnvironment(process.env, this.config.inheritEnv, this.config.env);
|
|
548
447
|
if (this.config.isolation) {
|
|
549
|
-
const
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
448
|
+
const launch = await this.prepareIsolation(ctx);
|
|
449
|
+
cwd = this.isolatedWorkspace as string;
|
|
450
|
+
args = [
|
|
451
|
+
...buildArgs({ ...this.config, addDirs: undefined }),
|
|
452
|
+
"--no-session-persistence",
|
|
453
|
+
"--strict-mcp-config",
|
|
454
|
+
"--setting-sources",
|
|
455
|
+
"",
|
|
456
|
+
"--settings",
|
|
457
|
+
JSON.stringify(launch.settings),
|
|
458
|
+
];
|
|
459
|
+
env = agentEnvironment(process.env, this.config.inheritEnv, launch.env);
|
|
556
460
|
}
|
|
557
461
|
this.collectDir = cwd;
|
|
558
462
|
this.artifactsDir = ctx.artifactsDir;
|
|
@@ -566,11 +470,12 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
566
470
|
args,
|
|
567
471
|
cwd,
|
|
568
472
|
env,
|
|
473
|
+
inheritEnv: false,
|
|
569
474
|
protocol: "custom",
|
|
570
475
|
parseEvent: makeParseEvent(this.config, cliVersion),
|
|
571
476
|
formatAnswer,
|
|
572
477
|
formatPrompt,
|
|
573
|
-
|
|
478
|
+
idleTimeout: this.config.idleTimeout,
|
|
574
479
|
maxInterrupts: this.config.maxInterrupts,
|
|
575
480
|
});
|
|
576
481
|
for (const queued of this.pendingAttach) queued.attach(inner);
|
|
@@ -601,10 +506,8 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
601
506
|
|
|
602
507
|
async collect(): Promise<Artifact[]> {
|
|
603
508
|
if (!this.collectDir) return [];
|
|
604
|
-
//
|
|
605
|
-
|
|
606
|
-
// so it cannot swap a checked regular file into a symlink.
|
|
607
|
-
await this.inner?.close();
|
|
509
|
+
// Stop descendants before collecting: terminal events can precede their exit.
|
|
510
|
+
await this.quiesce();
|
|
608
511
|
const artifacts = await walkArtifacts(this.collectDir);
|
|
609
512
|
if (this.isolatedWorkspace && this.artifactsDir) {
|
|
610
513
|
await Promise.all(
|
|
@@ -621,21 +524,24 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
621
524
|
);
|
|
622
525
|
return artifacts;
|
|
623
526
|
}
|
|
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.
|
|
527
|
+
// Assertions need an explicit root for artifacts collected outside artifactsDir.
|
|
627
528
|
if (this.collectDir === this.artifactsDir) return artifacts;
|
|
628
529
|
const root = this.collectDir;
|
|
629
|
-
//
|
|
630
|
-
// work product; only top-level files can collide with these names.
|
|
530
|
+
// Top-level bookkeeping in runDir is not agent work product.
|
|
631
531
|
const withRoot = artifacts.map((a) => ({ ...a, root }));
|
|
632
532
|
return root === this.runDir
|
|
633
533
|
? withRoot.filter((a) => !LUX_BOOKKEEPING_FILES.has(a.path))
|
|
634
534
|
: withRoot;
|
|
635
535
|
}
|
|
636
536
|
|
|
537
|
+
async verificationWorkspace(): Promise<string | undefined> {
|
|
538
|
+
await this.quiesce();
|
|
539
|
+
return this.isolatedWorkspace ?? undefined;
|
|
540
|
+
}
|
|
541
|
+
|
|
637
542
|
async quiesce(): Promise<void> {
|
|
638
543
|
if (this.config.interactionMode === "defer-resume") {
|
|
544
|
+
this.deferredAbort.abort();
|
|
639
545
|
await this.deferredTurn;
|
|
640
546
|
return;
|
|
641
547
|
}
|
|
@@ -645,6 +551,7 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
645
551
|
async close(): Promise<void> {
|
|
646
552
|
try {
|
|
647
553
|
if (this.config.interactionMode === "defer-resume") {
|
|
554
|
+
await this.quiesce();
|
|
648
555
|
this.emitter.removeAllListeners();
|
|
649
556
|
if (this.deferredHookPath) {
|
|
650
557
|
await rm(this.deferredHookPath, { force: true });
|
|
@@ -654,16 +561,37 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
654
561
|
await this.inner?.close();
|
|
655
562
|
}
|
|
656
563
|
} finally {
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
564
|
+
await Promise.all(
|
|
565
|
+
[this.isolatedWorkspace, this.isolationControlDir]
|
|
566
|
+
.filter((path) => path !== null)
|
|
567
|
+
.map((path) => rm(path, { recursive: true, force: true })),
|
|
568
|
+
);
|
|
569
|
+
this.isolatedWorkspace = null;
|
|
570
|
+
this.isolationControlDir = null;
|
|
661
571
|
}
|
|
662
572
|
}
|
|
663
573
|
|
|
574
|
+
private async prepareIsolation(
|
|
575
|
+
ctx: StartContext,
|
|
576
|
+
): Promise<Awaited<ReturnType<typeof isolatedLaunch>>> {
|
|
577
|
+
this.isolatedWorkspace = await realpath(
|
|
578
|
+
temporaryDirectory({ prefix: "lux-claude-workspace-" }),
|
|
579
|
+
);
|
|
580
|
+
this.isolationControlDir = await realpath(
|
|
581
|
+
temporaryDirectory({ prefix: "lux-claude-control-" }),
|
|
582
|
+
);
|
|
583
|
+
await cp(ctx.artifactsDir, this.isolatedWorkspace, { recursive: true });
|
|
584
|
+
await stageSkills(this.config.skillDirs ?? [], this.isolatedWorkspace, ".claude");
|
|
585
|
+
return isolatedLaunch(this.config, ctx, this.isolatedWorkspace, this.isolationControlDir);
|
|
586
|
+
}
|
|
587
|
+
|
|
664
588
|
private async startDeferred(ctx: StartContext): Promise<ReadyState> {
|
|
665
|
-
|
|
589
|
+
let cwd =
|
|
666
590
|
this.config.cwd ?? (this.config.cwdMode === "artifacts" ? ctx.artifactsDir : ctx.runDir);
|
|
591
|
+
if (this.config.isolation) {
|
|
592
|
+
this.deferredIsolation = await this.prepareIsolation(ctx);
|
|
593
|
+
cwd = this.isolatedWorkspace as string;
|
|
594
|
+
}
|
|
667
595
|
this.collectDir = cwd;
|
|
668
596
|
this.artifactsDir = ctx.artifactsDir;
|
|
669
597
|
this.runDir = ctx.runDir;
|
|
@@ -712,58 +640,51 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
712
640
|
} else if (resumeWithAnswer && answer?.kind === "ask") {
|
|
713
641
|
input = { input: answer.text };
|
|
714
642
|
}
|
|
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
|
-
|
|
643
|
+
const terminal = await runDeferredProcess({
|
|
644
|
+
command: this.config.command,
|
|
645
|
+
args: buildDeferredArgs(
|
|
646
|
+
this.config,
|
|
647
|
+
hookPath,
|
|
648
|
+
this.deferredSessionId ?? undefined,
|
|
649
|
+
this.deferredIsolation,
|
|
650
|
+
),
|
|
651
|
+
cwd,
|
|
652
|
+
env: agentEnvironment(process.env, this.config.inheritEnv, {
|
|
653
|
+
...(this.deferredIsolation?.env ?? this.config.env),
|
|
654
|
+
LUX_RUN_DIR: ctx.runDir,
|
|
655
|
+
LUX_ARTIFACTS_DIR: ctx.artifactsDir,
|
|
656
|
+
...(answer ? { LUX_CLAUDE_DEFERRED_ANSWER: JSON.stringify(answer) } : {}),
|
|
657
|
+
}),
|
|
658
|
+
...input,
|
|
659
|
+
idleTimeoutMs: durationMs(this.config.idleTimeout),
|
|
660
|
+
...(this.config.turnTimeout === undefined
|
|
661
|
+
? {}
|
|
662
|
+
: { turnTimeoutMs: durationMs(this.config.turnTimeout) }),
|
|
663
|
+
signal: AbortSignal.any([ctx.abortSignal, this.deferredAbort.signal]),
|
|
664
|
+
parse: (line) => {
|
|
665
|
+
try {
|
|
666
|
+
const envelope = ClaudeCodeLineSchema.safeParse(JSON.parse(line));
|
|
667
|
+
if (
|
|
668
|
+
envelope.success &&
|
|
669
|
+
(envelope.data.type === "system" || envelope.data.type === "result") &&
|
|
670
|
+
envelope.data.session_id
|
|
671
|
+
) {
|
|
672
|
+
this.deferredSessionId = envelope.data.session_id;
|
|
673
|
+
}
|
|
674
|
+
} catch {
|
|
675
|
+
// The parser below deliberately ignores unmodeled output.
|
|
747
676
|
}
|
|
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");
|
|
677
|
+
return parse(line);
|
|
678
|
+
},
|
|
679
|
+
onEvent: (event) => this.dispatchDeferred(event),
|
|
680
|
+
});
|
|
681
|
+
if (this.deferredReady) {
|
|
682
|
+
throw new Error(
|
|
683
|
+
terminal?.tag === "error" ? terminal.error.reason : "claude exited before ready",
|
|
684
|
+
);
|
|
766
685
|
}
|
|
686
|
+
if (terminal) await this.dispatchDeferred(terminal);
|
|
687
|
+
if (!terminal) throw new Error("claude exited before a terminal result");
|
|
767
688
|
}
|
|
768
689
|
|
|
769
690
|
private async dispatchDeferred(event: ParsedDriverEvent): Promise<void> {
|
|
@@ -847,17 +768,42 @@ class ClaudeCodeDriverImpl implements AgentDriver {
|
|
|
847
768
|
}
|
|
848
769
|
}
|
|
849
770
|
|
|
850
|
-
export const claudeCodeDriver
|
|
771
|
+
export const claudeCodeDriver = defineDriver({
|
|
851
772
|
name: "claude-code",
|
|
852
773
|
configSchema: ClaudeCodeDriverConfigSchema,
|
|
774
|
+
runtime: (config) => ({
|
|
775
|
+
commands: [config.command],
|
|
776
|
+
capabilities: {
|
|
777
|
+
interactive: true,
|
|
778
|
+
"tool-calls": true,
|
|
779
|
+
"tool-results": true,
|
|
780
|
+
artifacts: true,
|
|
781
|
+
subagents: true,
|
|
782
|
+
usage: true,
|
|
783
|
+
cost: true,
|
|
784
|
+
isolation: Boolean(config.isolation),
|
|
785
|
+
},
|
|
786
|
+
}),
|
|
787
|
+
experiment: {
|
|
788
|
+
version: "1",
|
|
789
|
+
prepare: prepareClaudeExperimentConfig,
|
|
790
|
+
identity: async (config, { rootDir }) => {
|
|
791
|
+
const configRoot = claudeConfigRoot({ config });
|
|
792
|
+
return {
|
|
793
|
+
configRoot,
|
|
794
|
+
userBehaviorHash: await claudeUserBehaviorHash(configRoot),
|
|
795
|
+
sources: await configuredClaudeSourceHashes({ name: "claude-code", config }, rootDir),
|
|
796
|
+
};
|
|
797
|
+
},
|
|
798
|
+
},
|
|
799
|
+
selectHarness: selectModelAndReasoningEffort,
|
|
853
800
|
create: (config) => new ClaudeCodeDriverImpl(config),
|
|
854
|
-
};
|
|
801
|
+
});
|
|
855
802
|
|
|
856
803
|
// Internal exports for testing
|
|
857
804
|
export {
|
|
858
805
|
buildArgs,
|
|
859
806
|
buildDeferredArgs,
|
|
860
|
-
carvedReadDenials,
|
|
861
807
|
copyRegularFileNoFollow,
|
|
862
808
|
formatAnswer,
|
|
863
809
|
formatPrompt,
|