@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
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { realpath } from "node:fs/promises";
|
|
2
|
+
import { agentEnvironment } from "../../core/agent-environment.js";
|
|
3
|
+
import { durationMs } from "../../core/duration.js";
|
|
4
|
+
import {
|
|
5
|
+
type AgentDriver,
|
|
6
|
+
type Answer,
|
|
7
|
+
type Artifact,
|
|
8
|
+
type DriverEventMap,
|
|
9
|
+
defineDriver,
|
|
10
|
+
discoverCliVersion,
|
|
11
|
+
type ReadyState,
|
|
12
|
+
type StartContext,
|
|
13
|
+
selectModelAndReasoningEffort,
|
|
14
|
+
TypedEmitter,
|
|
15
|
+
} from "../../core/index.js";
|
|
16
|
+
import { AcpEvents } from "../shared/acp-events.js";
|
|
17
|
+
import { permissionRequestText, records } from "../shared/acp-interaction.js";
|
|
18
|
+
import { acpModel, selectAcpModel } from "../shared/acp-session.js";
|
|
19
|
+
import { AcpTransport, asRecord, type RpcId, type RpcRecord } from "../shared/acp-transport.js";
|
|
20
|
+
import { walkArtifacts } from "../shared/artifacts.js";
|
|
21
|
+
import { buildCursorArgs, type CursorDriverConfig, CursorDriverConfigSchema } from "./config.js";
|
|
22
|
+
import { cursorAnswer, cursorQuestionText, effortSelector } from "./interaction.js";
|
|
23
|
+
|
|
24
|
+
class CursorDriver implements AgentDriver {
|
|
25
|
+
private readonly emitter = new TypedEmitter<DriverEventMap>();
|
|
26
|
+
private readonly events: AcpEvents;
|
|
27
|
+
private transport: AcpTransport | undefined;
|
|
28
|
+
private sessionId: string | undefined;
|
|
29
|
+
private cwd: string | undefined;
|
|
30
|
+
private artifactsDir: string | undefined;
|
|
31
|
+
private ready = false;
|
|
32
|
+
private runPromise: Promise<void> | undefined;
|
|
33
|
+
private terminal = false;
|
|
34
|
+
private idleTimer: NodeJS.Timeout | undefined;
|
|
35
|
+
private interruptCount = 0;
|
|
36
|
+
private readonly interrupts = new Map<string, { id: RpcId; method: string; params: RpcRecord }>();
|
|
37
|
+
|
|
38
|
+
private readonly config: CursorDriverConfig;
|
|
39
|
+
|
|
40
|
+
constructor(config: CursorDriverConfig) {
|
|
41
|
+
this.config = config;
|
|
42
|
+
this.events = new AcpEvents("cursor", config.maxToolCalls, config.maxQueuedBytes);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
on<K extends keyof DriverEventMap>(
|
|
46
|
+
event: K,
|
|
47
|
+
handler: (e: DriverEventMap[K]) => void | Promise<void>,
|
|
48
|
+
): void {
|
|
49
|
+
this.emitter.on(event, handler);
|
|
50
|
+
}
|
|
51
|
+
off<K extends keyof DriverEventMap>(
|
|
52
|
+
event: K,
|
|
53
|
+
handler: (e: DriverEventMap[K]) => void | Promise<void>,
|
|
54
|
+
): void {
|
|
55
|
+
this.emitter.off(event, handler);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async start(ctx: StartContext): Promise<ReadyState> {
|
|
59
|
+
if (this.transport || this.terminal)
|
|
60
|
+
throw new Error("Cursor driver cannot be started twice or after close");
|
|
61
|
+
this.cwd = await realpath(this.config.cwd ?? ctx.artifactsDir);
|
|
62
|
+
this.artifactsDir = await realpath(ctx.artifactsDir);
|
|
63
|
+
const cliVersion = await discoverCliVersion(this.config.command);
|
|
64
|
+
const transport = new AcpTransport({
|
|
65
|
+
label: "Cursor ACP",
|
|
66
|
+
command: this.config.command,
|
|
67
|
+
args: buildCursorArgs(this.config),
|
|
68
|
+
cwd: this.cwd,
|
|
69
|
+
env: agentEnvironment(process.env, this.config.inheritEnv, this.config.env),
|
|
70
|
+
signal: ctx.abortSignal,
|
|
71
|
+
maxLineBytes: this.config.maxLineBytes,
|
|
72
|
+
maxQueuedBytes: this.config.maxQueuedBytes,
|
|
73
|
+
onMessage: (message) => this.message(message),
|
|
74
|
+
onFailure: (error) => this.fail(error),
|
|
75
|
+
onActivity: () => this.bumpIdleTimer(),
|
|
76
|
+
});
|
|
77
|
+
this.transport = transport;
|
|
78
|
+
try {
|
|
79
|
+
await transport.spawned();
|
|
80
|
+
const initialized = await this.request("initialize", {
|
|
81
|
+
protocolVersion: 1,
|
|
82
|
+
clientInfo: { name: "lux", version: "1" },
|
|
83
|
+
clientCapabilities: { fs: { readTextFile: false, writeTextFile: false }, terminal: false },
|
|
84
|
+
});
|
|
85
|
+
if (initialized.protocolVersion !== 1)
|
|
86
|
+
throw new Error("Cursor ACP returned an unsupported protocol version");
|
|
87
|
+
if (!records(initialized.authMethods).some((method) => method.id === "cursor_login")) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
"Expected Cursor ACP with cursor_login authentication; check the configured command points to Cursor CLI",
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
await this.request("authenticate", { methodId: "cursor_login" });
|
|
93
|
+
let session = await this.request("session/new", { cwd: this.cwd, mcpServers: [] });
|
|
94
|
+
if (typeof session.sessionId !== "string") throw new Error("Cursor ACP omitted sessionId");
|
|
95
|
+
this.sessionId = session.sessionId;
|
|
96
|
+
session = await selectAcpModel("Cursor", session, this.config.model, (method, params) =>
|
|
97
|
+
this.request(method, params),
|
|
98
|
+
);
|
|
99
|
+
if (this.config.reasoningEffort) {
|
|
100
|
+
const selection = effortSelector(session, this.config.reasoningEffort);
|
|
101
|
+
const updated = await this.request("session/set_config_option", {
|
|
102
|
+
sessionId: this.sessionId,
|
|
103
|
+
...selection,
|
|
104
|
+
});
|
|
105
|
+
const applied = records(updated.configOptions).find(
|
|
106
|
+
(option) => option.id === selection.configId,
|
|
107
|
+
);
|
|
108
|
+
if (applied?.currentValue !== this.config.reasoningEffort)
|
|
109
|
+
throw new Error("Cursor ACP did not apply the requested reasoning effort");
|
|
110
|
+
session = { ...session, ...updated };
|
|
111
|
+
}
|
|
112
|
+
const model = acpModel(session);
|
|
113
|
+
if (typeof model === "string" && model !== this.config.model)
|
|
114
|
+
throw new Error(
|
|
115
|
+
`Cursor ACP selected '${model}' instead of requested '${this.config.model}'`,
|
|
116
|
+
);
|
|
117
|
+
this.ready = true;
|
|
118
|
+
this.bumpIdleTimer();
|
|
119
|
+
this.runPromise = this.run(ctx.prompt).catch((error: unknown) => this.fail(error));
|
|
120
|
+
return {
|
|
121
|
+
agentId: "cursor",
|
|
122
|
+
model: this.config.model,
|
|
123
|
+
detail: {
|
|
124
|
+
sessionId: this.sessionId,
|
|
125
|
+
transport: "acp",
|
|
126
|
+
protocolVersion: 1,
|
|
127
|
+
...(cliVersion ? { cliVersion } : {}),
|
|
128
|
+
modelResolution: typeof model === "string" ? "reported" : "requested",
|
|
129
|
+
nativeConfig: session.configOptions ?? [],
|
|
130
|
+
usageAvailability: "unknown",
|
|
131
|
+
isolation: "none",
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
} catch (error) {
|
|
135
|
+
await this.close();
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private request(method: string, params: RpcRecord): Promise<RpcRecord> {
|
|
141
|
+
if (!this.transport) throw new Error("Cursor ACP has not started");
|
|
142
|
+
return this.transport.request(method, params, durationMs(this.config.startupTimeout));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private async run(prompt: string): Promise<void> {
|
|
146
|
+
const result = await this.transport?.request("session/prompt", {
|
|
147
|
+
sessionId: this.sessionId,
|
|
148
|
+
prompt: [{ type: "text", text: prompt }],
|
|
149
|
+
});
|
|
150
|
+
await this.transport?.drained();
|
|
151
|
+
if (this.terminal) return;
|
|
152
|
+
if (result?.stopReason !== "end_turn")
|
|
153
|
+
throw new Error(`Cursor stopped with ${String(result?.stopReason ?? "unknown reason")}`);
|
|
154
|
+
this.terminal = true;
|
|
155
|
+
clearTimeout(this.idleTimer);
|
|
156
|
+
await this.emitter.emit("done", {
|
|
157
|
+
exitReason: "done",
|
|
158
|
+
summary: {
|
|
159
|
+
sessionId: this.sessionId,
|
|
160
|
+
stopReason: result.stopReason,
|
|
161
|
+
usageAvailability: "unknown",
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private async message(message: RpcRecord): Promise<void> {
|
|
167
|
+
if (this.terminal) return;
|
|
168
|
+
const method = String(message.method);
|
|
169
|
+
const params = asRecord(message.params) ?? {};
|
|
170
|
+
const id = message.id;
|
|
171
|
+
if (typeof id === "number" || typeof id === "string") {
|
|
172
|
+
if (typeof params.sessionId === "string" && params.sessionId !== this.sessionId) {
|
|
173
|
+
this.transport?.write({ id, error: { code: -32602, message: "Unknown session" } });
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (
|
|
177
|
+
!["session/request_permission", "cursor/ask_question", "cursor/create_plan"].includes(
|
|
178
|
+
method,
|
|
179
|
+
)
|
|
180
|
+
) {
|
|
181
|
+
this.transport?.write({
|
|
182
|
+
id,
|
|
183
|
+
error: { code: -32601, message: `Unsupported method: ${method}` },
|
|
184
|
+
});
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (++this.interruptCount > this.config.maxInterrupts) {
|
|
188
|
+
this.transport?.write({ id, result: { outcome: { outcome: "cancelled" } } });
|
|
189
|
+
this.fail(new Error("Cursor exceeded maxInterrupts"), "max-interactions");
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const interruptId = `cursor-${id}`;
|
|
193
|
+
if (this.interrupts.has(interruptId)) throw new Error("Cursor reused a pending request ID");
|
|
194
|
+
this.interrupts.set(interruptId, { id, method, params });
|
|
195
|
+
clearTimeout(this.idleTimer);
|
|
196
|
+
if (method === "cursor/ask_question") {
|
|
197
|
+
await this.emitter.emit("interrupt", {
|
|
198
|
+
kind: "ask",
|
|
199
|
+
id: interruptId,
|
|
200
|
+
question: cursorQuestionText(params),
|
|
201
|
+
context: params,
|
|
202
|
+
});
|
|
203
|
+
} else {
|
|
204
|
+
await this.emitter.emit("interrupt", {
|
|
205
|
+
kind: "approve",
|
|
206
|
+
id: interruptId,
|
|
207
|
+
request:
|
|
208
|
+
method === "cursor/create_plan"
|
|
209
|
+
? String(params.plan ?? params.overview ?? "Approve this plan?")
|
|
210
|
+
: permissionRequestText(params),
|
|
211
|
+
context: params,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (method === "session/update") {
|
|
217
|
+
if (params.sessionId !== this.sessionId) return;
|
|
218
|
+
const update = asRecord(params.update);
|
|
219
|
+
if (update)
|
|
220
|
+
for (const event of this.events.update(update)) await this.emitter.emit("progress", event);
|
|
221
|
+
} else if (method.startsWith("cursor/")) {
|
|
222
|
+
await this.emitter.emit("progress", {
|
|
223
|
+
id: `cursor-native-${Date.now()}-${method}`,
|
|
224
|
+
kind: "cursor-event",
|
|
225
|
+
payload: { method, params },
|
|
226
|
+
ts: Date.now(),
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async respond(answer: Answer): Promise<void> {
|
|
232
|
+
const pending = this.interrupts.get(answer.id);
|
|
233
|
+
if (!pending) throw new Error(`Cursor has no pending interrupt '${answer.id}'`);
|
|
234
|
+
const result = cursorAnswer(pending.method, pending.params, answer);
|
|
235
|
+
this.transport?.write({ id: pending.id, result });
|
|
236
|
+
this.interrupts.delete(answer.id);
|
|
237
|
+
this.bumpIdleTimer();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
private bumpIdleTimer(): void {
|
|
241
|
+
clearTimeout(this.idleTimer);
|
|
242
|
+
if (!this.ready || this.terminal || this.interrupts.size > 0) return;
|
|
243
|
+
this.idleTimer = setTimeout(
|
|
244
|
+
() =>
|
|
245
|
+
this.fail(
|
|
246
|
+
new Error(`Cursor emitted no event for ${durationMs(this.config.idleTimeout)}ms`),
|
|
247
|
+
"idle-timeout",
|
|
248
|
+
),
|
|
249
|
+
durationMs(this.config.idleTimeout),
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
private fail(error: unknown, exitReason: DriverEventMap["error"]["exitReason"] = "error"): void {
|
|
254
|
+
if (this.terminal) return;
|
|
255
|
+
this.terminal = true;
|
|
256
|
+
clearTimeout(this.idleTimer);
|
|
257
|
+
if (this.ready)
|
|
258
|
+
void this.transport?.drained().then(() =>
|
|
259
|
+
this.emitter.emit("error", {
|
|
260
|
+
exitReason,
|
|
261
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
262
|
+
}),
|
|
263
|
+
);
|
|
264
|
+
void this.transport?.close();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async quiesce(): Promise<void> {
|
|
268
|
+
clearTimeout(this.idleTimer);
|
|
269
|
+
const cancelling = !this.terminal && this.sessionId !== undefined;
|
|
270
|
+
this.terminal = true;
|
|
271
|
+
if (cancelling) {
|
|
272
|
+
for (const pending of this.interrupts.values())
|
|
273
|
+
this.transport?.write({ id: pending.id, result: { outcome: { outcome: "cancelled" } } });
|
|
274
|
+
this.transport?.write({ method: "session/cancel", params: { sessionId: this.sessionId } });
|
|
275
|
+
let timer: NodeJS.Timeout | undefined;
|
|
276
|
+
try {
|
|
277
|
+
await Promise.race([
|
|
278
|
+
this.runPromise,
|
|
279
|
+
new Promise<void>((resolve) => {
|
|
280
|
+
timer = setTimeout(resolve, 200);
|
|
281
|
+
}),
|
|
282
|
+
]);
|
|
283
|
+
} finally {
|
|
284
|
+
clearTimeout(timer);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
this.interrupts.clear();
|
|
288
|
+
await this.transport?.close();
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
async collect(): Promise<Artifact[]> {
|
|
292
|
+
await this.quiesce();
|
|
293
|
+
if (!this.cwd) return [];
|
|
294
|
+
const artifacts = await walkArtifacts(this.cwd);
|
|
295
|
+
return this.cwd === this.artifactsDir
|
|
296
|
+
? artifacts
|
|
297
|
+
: artifacts.map((artifact) => ({ ...artifact, root: this.cwd as string }));
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async close(): Promise<void> {
|
|
301
|
+
await this.quiesce();
|
|
302
|
+
this.emitter.removeAllListeners();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export const cursorDriver = defineDriver({
|
|
307
|
+
name: "cursor",
|
|
308
|
+
configSchema: CursorDriverConfigSchema,
|
|
309
|
+
runtime: (config) => ({
|
|
310
|
+
commands: [config.command],
|
|
311
|
+
capabilities: {
|
|
312
|
+
interactive: true,
|
|
313
|
+
"tool-calls": true,
|
|
314
|
+
"tool-results": true,
|
|
315
|
+
artifacts: true,
|
|
316
|
+
usage: false,
|
|
317
|
+
cost: false,
|
|
318
|
+
isolation: false,
|
|
319
|
+
},
|
|
320
|
+
}),
|
|
321
|
+
selectHarness: selectModelAndReasoningEffort,
|
|
322
|
+
create: (config) => new CursorDriver(config),
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
export type { CursorDriverConfig };
|
|
326
|
+
export { buildCursorArgs, CursorDriverConfigSchema };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Answer } from "../../core/index.js";
|
|
2
|
+
import { permissionAnswer, records } from "../shared/acp-interaction.js";
|
|
3
|
+
import { asRecord, type RpcRecord } from "../shared/acp-transport.js";
|
|
4
|
+
|
|
5
|
+
export const cursorQuestionText = (params: RpcRecord): string =>
|
|
6
|
+
`Return a JSON object mapping each question ID to its selected option ID. For questions allowing multiple selections, use an array of option IDs.\n\n${records(
|
|
7
|
+
params.questions,
|
|
8
|
+
)
|
|
9
|
+
.map(
|
|
10
|
+
(question) =>
|
|
11
|
+
`Question ID: ${String(question.id)}${question.allowMultiple === true ? " (multiple selections allowed)" : " (select one)"}\n${String(question.prompt ?? question.id)}\n${records(
|
|
12
|
+
question.options,
|
|
13
|
+
)
|
|
14
|
+
.map((option) => `${String(option.id)}: ${String(option.label)}`)
|
|
15
|
+
.join("\n")}`,
|
|
16
|
+
)
|
|
17
|
+
.join("\n\n")}`;
|
|
18
|
+
|
|
19
|
+
export const cursorAnswer = (method: string, params: RpcRecord, answer: Answer): RpcRecord => {
|
|
20
|
+
if (method === "cursor/ask_question") {
|
|
21
|
+
if (answer.kind !== "ask") throw new Error("Cursor questions require a text answer");
|
|
22
|
+
let supplied: RpcRecord = {};
|
|
23
|
+
try {
|
|
24
|
+
supplied = asRecord(JSON.parse(answer.text)) ?? {};
|
|
25
|
+
} catch {
|
|
26
|
+
/* Plain option IDs and labels are accepted too. */
|
|
27
|
+
}
|
|
28
|
+
const answers = records(params.questions).map((question) => {
|
|
29
|
+
const selection = supplied[String(question.id)] ?? answer.text;
|
|
30
|
+
const selections = Array.isArray(selection) ? selection : [selection];
|
|
31
|
+
if (question.allowMultiple !== true && selections.length !== 1)
|
|
32
|
+
throw new Error("Cursor question requires exactly one selection");
|
|
33
|
+
const selectedOptionIds = selections.map((value) => {
|
|
34
|
+
const option = records(question.options).find(
|
|
35
|
+
(entry) => entry.id === value || entry.label === value,
|
|
36
|
+
);
|
|
37
|
+
if (!option || typeof option.id !== "string")
|
|
38
|
+
throw new Error(`Cursor answer does not match an option for '${String(question.id)}'`);
|
|
39
|
+
return option.id;
|
|
40
|
+
});
|
|
41
|
+
return { questionId: question.id, selectedOptionIds };
|
|
42
|
+
});
|
|
43
|
+
return { outcome: { outcome: "answered", answers } };
|
|
44
|
+
}
|
|
45
|
+
if (answer.kind !== "approve") throw new Error("Cursor approval requires an approval answer");
|
|
46
|
+
if (method === "cursor/create_plan") {
|
|
47
|
+
return {
|
|
48
|
+
outcome: answer.approved
|
|
49
|
+
? { outcome: "accepted" }
|
|
50
|
+
: { outcome: "rejected", ...(answer.reason ? { reason: answer.reason } : {}) },
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return permissionAnswer(params, answer);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const optionValues = (options: unknown): string[] =>
|
|
57
|
+
records(options).flatMap((option) =>
|
|
58
|
+
typeof option.value === "string" ? [option.value] : optionValues(option.options),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
export const effortSelector = (session: RpcRecord, effort: string): RpcRecord => {
|
|
62
|
+
const option = records(session.configOptions).find(
|
|
63
|
+
(entry) =>
|
|
64
|
+
entry.category === "thought_level" ||
|
|
65
|
+
entry.id === "reasoning_effort" ||
|
|
66
|
+
entry.id === "effort",
|
|
67
|
+
);
|
|
68
|
+
if (!option || typeof option.id !== "string" || !optionValues(option.options).includes(effort)) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Cursor ACP does not advertise reasoning effort '${effort}'; select an explicit supported model/effort ID or omit reasoningEffort`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return { configId: option.id, value: effort };
|
|
74
|
+
};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Grok.build driver
|
|
2
|
+
|
|
3
|
+
The `grok-build` driver runs the native Grok.build CLI over ACP (`grok agent
|
|
4
|
+
--no-leader stdio`). Install Grok.build and run `grok login` first. This is
|
|
5
|
+
separate from selecting a Grok model in the Copilot driver.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
{
|
|
9
|
+
defaultDriver: {
|
|
10
|
+
name: "grok-build",
|
|
11
|
+
config: {
|
|
12
|
+
model: "grok-4.5",
|
|
13
|
+
reasoningEffort: "low",
|
|
14
|
+
permissionMode: "auto",
|
|
15
|
+
sandbox: "workspace",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
defaultAnswerer: "persona",
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Or scaffold an eval project:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
lux init --driver grok-build --model grok-4.5
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
An explicit model is required; effort defaults to `low`. Lux selects both through
|
|
29
|
+
`session/set_config_option` and verifies the returned values before prompting.
|
|
30
|
+
Grok 1.0.40 can choose a different model on `session/new` despite the CLI model
|
|
31
|
+
flag, so passing that flag alone is insufficient.
|
|
32
|
+
|
|
33
|
+
## Permissions
|
|
34
|
+
|
|
35
|
+
The default `auto` mode uses Grok's native safety checks, including its LLM
|
|
36
|
+
classifier, to approve routine operations. It is not blanket approval. `default`
|
|
37
|
+
(ask) is also supported. Lux does not expose always-approve, arbitrary extra
|
|
38
|
+
arguments, or the CLI `--allow`/`--deny` flags. In Grok 1.0.40, those rule flags
|
|
39
|
+
are ignored by the agent subcommand. Project permission rules require Grok folder trust. Lux leaves
|
|
40
|
+
`trustProject: false` by default; an untrusted fixture's rules are ignored by
|
|
41
|
+
Grok. Enable `trustProject: true` only for reviewed fixtures: it also permits
|
|
42
|
+
project configuration such as hooks and MCP servers. Then put native rules in
|
|
43
|
+
`.grok/config.toml` and assert the expected denial. CLI `dontAsk` is also omitted because the ACP launch path does not propagate that
|
|
44
|
+
policy.
|
|
45
|
+
|
|
46
|
+
For example, this native rule denies the smoke test's command:
|
|
47
|
+
|
|
48
|
+
```toml
|
|
49
|
+
[[permission.rules]]
|
|
50
|
+
action = "deny"
|
|
51
|
+
tool = "bash"
|
|
52
|
+
pattern = "printf *"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Change `action` to `"ask"` to exercise Lux's answerer explicitly. The live
|
|
56
|
+
smoke task opts into trust only for its own generated ask/deny fixtures.
|
|
57
|
+
|
|
58
|
+
ACP permission requests become Lux `approve` interrupts, including the tool
|
|
59
|
+
call details. The configured answerer handles those requests; `persona` uses an
|
|
60
|
+
LLM with the case's task and persona constraints. Lux selects only `allow_once`
|
|
61
|
+
or `reject_once`, never a remembered grant. The persona parser accepts strict
|
|
62
|
+
approval JSON either bare or in one complete JSON Markdown fence; ambiguous
|
|
63
|
+
text and invalid fields still deny the operation. If the agent offers no matching
|
|
64
|
+
one-operation option, Lux cancels and reports an error rather than widening the
|
|
65
|
+
grant. Native auto decisions are handled inside Grok and are not Lux interrupts.
|
|
66
|
+
|
|
67
|
+
Permission reviews have a separate `permissionTimeout` (150 seconds by
|
|
68
|
+
default), while ordinary inactivity uses `idleTimeout` (10 minutes). Startup
|
|
69
|
+
RPCs time out after 30 seconds. Cancelled turns, process failures, unanswered
|
|
70
|
+
reviews, and turns ending with pending approvals cannot count as successful runs.
|
|
71
|
+
A completed turn can still contain denied tool calls: assert the expected files
|
|
72
|
+
or tool results to determine whether the task succeeded.
|
|
73
|
+
|
|
74
|
+
## Scope and limitations
|
|
75
|
+
|
|
76
|
+
Lux requests the native `workspace` sandbox and a private process with
|
|
77
|
+
`--no-leader`. `read-only` and `strict` profiles are available; disabling the
|
|
78
|
+
sandbox is not a driver option. The workspace profile allows filesystem reads,
|
|
79
|
+
network access, and writes to the working directory, Grok state, and temporary
|
|
80
|
+
directories. It is not configuration isolation: Grok still loads user/project
|
|
81
|
+
settings, compatible Claude settings, hooks, skills, and MCP configuration.
|
|
82
|
+
The driver reports configuration isolation, usage, and cost as unavailable;
|
|
83
|
+
controlled experiments requiring those capabilities remain unsupported.
|
|
84
|
+
|
|
85
|
+
The interaction surface currently supports tool permissions. Other ACP client
|
|
86
|
+
requests receive an explicit unsupported-method response. Run evidence includes
|
|
87
|
+
agent messages, reasoning, tool calls/results, and collected files. Use artifact
|
|
88
|
+
assertions alongside `run-succeeded`.
|
|
89
|
+
|
|
90
|
+
## Validation
|
|
91
|
+
|
|
92
|
+
Synthetic tests cover explicit model/effort selection, one-operation approvals
|
|
93
|
+
and rejections, refusal to substitute remembered grants, permission timeouts,
|
|
94
|
+
process exit during review, cancellation, idle timeout, and cleanup.
|
|
95
|
+
|
|
96
|
+
Live smoke validation uses Grok.build 1.0.40 with `grok-4.5` at low effort.
|
|
97
|
+
|
|
98
|
+
The opt-in live smoke task runs three real evals: a local shell write under auto
|
|
99
|
+
review, an explicit ask rule answered by Lux's LLM persona, and an explicit deny
|
|
100
|
+
rule that must produce a failed tool result without creating the file. It
|
|
101
|
+
requires Grok and Claude Code logins and consumes model usage. Evidence stays
|
|
102
|
+
in the temporary directory printed by the task:
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
LUX_GROK_MODEL=grok-4.5 mise run smoke:grok-build
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
References:
|
|
109
|
+
|
|
110
|
+
- [Grok ACP guide](https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/15-agent-mode.md)
|
|
111
|
+
- [Grok permissions](https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/22-permissions-and-safety.md)
|
|
112
|
+
- [Grok sandbox](https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/18-sandbox.md)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { InheritEnvironmentSchema } from "../../core/agent-environment.js";
|
|
3
|
+
import { DurationSchema } from "../../core/duration.js";
|
|
4
|
+
import { applyCatalogEffort, grokBuildCatalog } from "../../core/index.js";
|
|
5
|
+
|
|
6
|
+
export const GrokBuildDriverConfigSchema = z
|
|
7
|
+
.object({
|
|
8
|
+
command: z.string().min(1).default("grok"),
|
|
9
|
+
model: z.string().min(1),
|
|
10
|
+
reasoningEffort: z.enum(grokBuildCatalog.efforts).default("low"),
|
|
11
|
+
permissionMode: z.enum(["auto", "default"]).default("auto"),
|
|
12
|
+
trustProject: z.boolean().default(false),
|
|
13
|
+
sandbox: z.enum(["workspace", "read-only", "strict"]).default("workspace"),
|
|
14
|
+
cwd: z.string().optional(),
|
|
15
|
+
env: z.record(z.string(), z.string()).optional(),
|
|
16
|
+
inheritEnv: InheritEnvironmentSchema.optional(),
|
|
17
|
+
startupTimeout: DurationSchema.default("30 seconds"),
|
|
18
|
+
idleTimeout: DurationSchema.default("10 minutes"),
|
|
19
|
+
permissionTimeout: DurationSchema.default("150 seconds"),
|
|
20
|
+
maxInterrupts: z.number().int().positive().default(20),
|
|
21
|
+
maxLineBytes: z.number().int().positive().default(10_000_000),
|
|
22
|
+
maxQueuedBytes: z.number().int().positive().default(20_000_000),
|
|
23
|
+
maxToolCalls: z.number().int().positive().default(10_000),
|
|
24
|
+
})
|
|
25
|
+
.strict()
|
|
26
|
+
.transform(applyCatalogEffort(grokBuildCatalog));
|
|
27
|
+
|
|
28
|
+
export type GrokBuildDriverConfig = z.infer<typeof GrokBuildDriverConfigSchema>;
|
|
29
|
+
|
|
30
|
+
export const buildGrokBuildArgs = (config: GrokBuildDriverConfig): string[] => [
|
|
31
|
+
"--permission-mode",
|
|
32
|
+
config.permissionMode,
|
|
33
|
+
"--sandbox",
|
|
34
|
+
config.sandbox,
|
|
35
|
+
...(config.trustProject ? ["--trust"] : []),
|
|
36
|
+
"agent",
|
|
37
|
+
"--no-leader",
|
|
38
|
+
"--model",
|
|
39
|
+
config.model,
|
|
40
|
+
"--reasoning-effort",
|
|
41
|
+
config.reasoningEffort,
|
|
42
|
+
"stdio",
|
|
43
|
+
];
|