@prismatic-io/lux 0.0.1
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/LICENSE +21 -0
- package/lib/answerers/claude-code/index.d.ts +17 -0
- package/lib/answerers/claude-code/index.d.ts.map +1 -0
- package/lib/answerers/claude-code/index.js +280 -0
- package/lib/answerers/claude-code/index.js.map +1 -0
- package/lib/answerers/persona/index.d.ts +40 -0
- package/lib/answerers/persona/index.d.ts.map +1 -0
- package/lib/answerers/persona/index.js +265 -0
- package/lib/answerers/persona/index.js.map +1 -0
- package/lib/answerers/scripted/index.d.ts +8 -0
- package/lib/answerers/scripted/index.d.ts.map +1 -0
- package/lib/answerers/scripted/index.js +163 -0
- package/lib/answerers/scripted/index.js.map +1 -0
- package/lib/answerers/shared.d.ts +13 -0
- package/lib/answerers/shared.d.ts.map +1 -0
- package/lib/answerers/shared.js +17 -0
- package/lib/answerers/shared.js.map +1 -0
- package/lib/answerers/terminal/index.d.ts +9 -0
- package/lib/answerers/terminal/index.d.ts.map +1 -0
- package/lib/answerers/terminal/index.js +97 -0
- package/lib/answerers/terminal/index.js.map +1 -0
- package/lib/assertions/core/command-exits-zero.d.ts +21 -0
- package/lib/assertions/core/command-exits-zero.d.ts.map +1 -0
- package/lib/assertions/core/command-exits-zero.js +87 -0
- package/lib/assertions/core/command-exits-zero.js.map +1 -0
- package/lib/assertions/core/event-checks.d.ts +57 -0
- package/lib/assertions/core/event-checks.d.ts.map +1 -0
- package/lib/assertions/core/event-checks.js +123 -0
- package/lib/assertions/core/event-checks.js.map +1 -0
- package/lib/assertions/core/file-checks.d.ts +103 -0
- package/lib/assertions/core/file-checks.d.ts.map +1 -0
- package/lib/assertions/core/file-checks.js +288 -0
- package/lib/assertions/core/file-checks.js.map +1 -0
- package/lib/assertions/core/helpers.d.ts +66 -0
- package/lib/assertions/core/helpers.d.ts.map +1 -0
- package/lib/assertions/core/helpers.js +170 -0
- package/lib/assertions/core/helpers.js.map +1 -0
- package/lib/assertions/core/index.d.ts +15 -0
- package/lib/assertions/core/index.d.ts.map +1 -0
- package/lib/assertions/core/index.js +56 -0
- package/lib/assertions/core/index.js.map +1 -0
- package/lib/assertions/core/json-pointer-equals.d.ts +19 -0
- package/lib/assertions/core/json-pointer-equals.d.ts.map +1 -0
- package/lib/assertions/core/json-pointer-equals.js +71 -0
- package/lib/assertions/core/json-pointer-equals.js.map +1 -0
- package/lib/assertions/core/output-checks.d.ts +46 -0
- package/lib/assertions/core/output-checks.d.ts.map +1 -0
- package/lib/assertions/core/output-checks.js +121 -0
- package/lib/assertions/core/output-checks.js.map +1 -0
- package/lib/assertions/core/predicate.d.ts +14 -0
- package/lib/assertions/core/predicate.d.ts.map +1 -0
- package/lib/assertions/core/predicate.js +55 -0
- package/lib/assertions/core/predicate.js.map +1 -0
- package/lib/assertions/core/resource-checks.d.ts +71 -0
- package/lib/assertions/core/resource-checks.d.ts.map +1 -0
- package/lib/assertions/core/resource-checks.js +159 -0
- package/lib/assertions/core/resource-checks.js.map +1 -0
- package/lib/assertions/core/safe-regex.d.ts +23 -0
- package/lib/assertions/core/safe-regex.d.ts.map +1 -0
- package/lib/assertions/core/safe-regex.js +102 -0
- package/lib/assertions/core/safe-regex.js.map +1 -0
- package/lib/assertions/core/tool-called-with.d.ts +21 -0
- package/lib/assertions/core/tool-called-with.d.ts.map +1 -0
- package/lib/assertions/core/tool-called-with.js +69 -0
- package/lib/assertions/core/tool-called-with.js.map +1 -0
- package/lib/assertions/core/tool-calls.d.ts +22 -0
- package/lib/assertions/core/tool-calls.d.ts.map +1 -0
- package/lib/assertions/core/tool-calls.js +17 -0
- package/lib/assertions/core/tool-calls.js.map +1 -0
- package/lib/assertions/core/tool-invocation.d.ts +36 -0
- package/lib/assertions/core/tool-invocation.d.ts.map +1 -0
- package/lib/assertions/core/tool-invocation.js +170 -0
- package/lib/assertions/core/tool-invocation.js.map +1 -0
- package/lib/assertions/core/tool-result-checks.d.ts +59 -0
- package/lib/assertions/core/tool-result-checks.d.ts.map +1 -0
- package/lib/assertions/core/tool-result-checks.js +193 -0
- package/lib/assertions/core/tool-result-checks.js.map +1 -0
- package/lib/assertions/mcp/discovery-checks.d.ts +36 -0
- package/lib/assertions/mcp/discovery-checks.d.ts.map +1 -0
- package/lib/assertions/mcp/discovery-checks.js +122 -0
- package/lib/assertions/mcp/discovery-checks.js.map +1 -0
- package/lib/assertions/mcp/index.d.ts +10 -0
- package/lib/assertions/mcp/index.d.ts.map +1 -0
- package/lib/assertions/mcp/index.js +25 -0
- package/lib/assertions/mcp/index.js.map +1 -0
- package/lib/assertions/rubric/index.d.ts +104 -0
- package/lib/assertions/rubric/index.d.ts.map +1 -0
- package/lib/assertions/rubric/index.js +191 -0
- package/lib/assertions/rubric/index.js.map +1 -0
- package/lib/assertions/rubric/internal.d.ts +14 -0
- package/lib/assertions/rubric/internal.d.ts.map +1 -0
- package/lib/assertions/rubric/internal.js +335 -0
- package/lib/assertions/rubric/internal.js.map +1 -0
- package/lib/authoring.d.ts +3 -0
- package/lib/authoring.d.ts.map +1 -0
- package/lib/authoring.js +3 -0
- package/lib/authoring.js.map +1 -0
- package/lib/cli/bin.d.ts +3 -0
- package/lib/cli/bin.d.ts.map +1 -0
- package/lib/cli/bin.js +15 -0
- package/lib/cli/bin.js.map +1 -0
- package/lib/cli/command-runtime.d.ts +5 -0
- package/lib/cli/command-runtime.d.ts.map +1 -0
- package/lib/cli/command-runtime.js +30 -0
- package/lib/cli/command-runtime.js.map +1 -0
- package/lib/cli/init.d.ts +21 -0
- package/lib/cli/init.d.ts.map +1 -0
- package/lib/cli/init.js +340 -0
- package/lib/cli/init.js.map +1 -0
- package/lib/cli/program.d.ts +22 -0
- package/lib/cli/program.d.ts.map +1 -0
- package/lib/cli/program.js +757 -0
- package/lib/cli/program.js.map +1 -0
- package/lib/cli/render/format.d.ts +14 -0
- package/lib/cli/render/format.d.ts.map +1 -0
- package/lib/cli/render/format.js +71 -0
- package/lib/cli/render/format.js.map +1 -0
- package/lib/cli/render/reporter.d.ts +73 -0
- package/lib/cli/render/reporter.d.ts.map +1 -0
- package/lib/cli/render/reporter.js +519 -0
- package/lib/cli/render/reporter.js.map +1 -0
- package/lib/cli/render/tty.d.ts +77 -0
- package/lib/cli/render/tty.d.ts.map +1 -0
- package/lib/cli/render/tty.js +283 -0
- package/lib/cli/render/tty.js.map +1 -0
- package/lib/cli/run-options.d.ts +27 -0
- package/lib/cli/run-options.d.ts.map +1 -0
- package/lib/cli/run-options.js +58 -0
- package/lib/cli/run-options.js.map +1 -0
- package/lib/cli/skills.d.ts +38 -0
- package/lib/cli/skills.d.ts.map +1 -0
- package/lib/cli/skills.js +84 -0
- package/lib/cli/skills.js.map +1 -0
- package/lib/core/annotation.d.ts +56 -0
- package/lib/core/annotation.d.ts.map +1 -0
- package/lib/core/annotation.js +92 -0
- package/lib/core/annotation.js.map +1 -0
- package/lib/core/answerer.d.ts +68 -0
- package/lib/core/answerer.d.ts.map +1 -0
- package/lib/core/answerer.js +17 -0
- package/lib/core/answerer.js.map +1 -0
- package/lib/core/artifact-evidence.d.ts +50 -0
- package/lib/core/artifact-evidence.d.ts.map +1 -0
- package/lib/core/artifact-evidence.js +185 -0
- package/lib/core/artifact-evidence.js.map +1 -0
- package/lib/core/artifact-snapshot.d.ts +37 -0
- package/lib/core/artifact-snapshot.d.ts.map +1 -0
- package/lib/core/artifact-snapshot.js +339 -0
- package/lib/core/artifact-snapshot.js.map +1 -0
- package/lib/core/assertion.d.ts +129 -0
- package/lib/core/assertion.d.ts.map +1 -0
- package/lib/core/assertion.js +75 -0
- package/lib/core/assertion.js.map +1 -0
- package/lib/core/case.d.ts +79 -0
- package/lib/core/case.d.ts.map +1 -0
- package/lib/core/case.js +90 -0
- package/lib/core/case.js.map +1 -0
- package/lib/core/conversation-turn.d.ts +23 -0
- package/lib/core/conversation-turn.d.ts.map +1 -0
- package/lib/core/conversation-turn.js +31 -0
- package/lib/core/conversation-turn.js.map +1 -0
- package/lib/core/driver.d.ts +64 -0
- package/lib/core/driver.d.ts.map +1 -0
- package/lib/core/driver.js +18 -0
- package/lib/core/driver.js.map +1 -0
- package/lib/core/emitter.d.ts +20 -0
- package/lib/core/emitter.d.ts.map +1 -0
- package/lib/core/emitter.js +34 -0
- package/lib/core/emitter.js.map +1 -0
- package/lib/core/events.d.ts +202 -0
- package/lib/core/events.d.ts.map +1 -0
- package/lib/core/events.js +107 -0
- package/lib/core/events.js.map +1 -0
- package/lib/core/exec.d.ts +82 -0
- package/lib/core/exec.d.ts.map +1 -0
- package/lib/core/exec.js +168 -0
- package/lib/core/exec.js.map +1 -0
- package/lib/core/experiment.d.ts +285 -0
- package/lib/core/experiment.d.ts.map +1 -0
- package/lib/core/experiment.js +389 -0
- package/lib/core/experiment.js.map +1 -0
- package/lib/core/glob.d.ts +3 -0
- package/lib/core/glob.d.ts.map +1 -0
- package/lib/core/glob.js +32 -0
- package/lib/core/glob.js.map +1 -0
- package/lib/core/hash.d.ts +8 -0
- package/lib/core/hash.d.ts.map +1 -0
- package/lib/core/hash.js +214 -0
- package/lib/core/hash.js.map +1 -0
- package/lib/core/index.d.ts +29 -0
- package/lib/core/index.d.ts.map +1 -0
- package/lib/core/index.js +29 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/lifecycle-fixtures.d.ts +20 -0
- package/lib/core/lifecycle-fixtures.d.ts.map +1 -0
- package/lib/core/lifecycle-fixtures.js +109 -0
- package/lib/core/lifecycle-fixtures.js.map +1 -0
- package/lib/core/lifecycle-hooks.d.ts +52 -0
- package/lib/core/lifecycle-hooks.d.ts.map +1 -0
- package/lib/core/lifecycle-hooks.js +42 -0
- package/lib/core/lifecycle-hooks.js.map +1 -0
- package/lib/core/mcp-events.d.ts +44 -0
- package/lib/core/mcp-events.d.ts.map +1 -0
- package/lib/core/mcp-events.js +23 -0
- package/lib/core/mcp-events.js.map +1 -0
- package/lib/core/model-cli.d.ts +57 -0
- package/lib/core/model-cli.d.ts.map +1 -0
- package/lib/core/model-cli.js +237 -0
- package/lib/core/model-cli.js.map +1 -0
- package/lib/core/observer.d.ts +31 -0
- package/lib/core/observer.d.ts.map +1 -0
- package/lib/core/observer.js +25 -0
- package/lib/core/observer.js.map +1 -0
- package/lib/core/platform-process.d.ts +33 -0
- package/lib/core/platform-process.d.ts.map +1 -0
- package/lib/core/platform-process.js +214 -0
- package/lib/core/platform-process.js.map +1 -0
- package/lib/core/registry.d.ts +22 -0
- package/lib/core/registry.d.ts.map +1 -0
- package/lib/core/registry.js +45 -0
- package/lib/core/registry.js.map +1 -0
- package/lib/core/rubric.d.ts +18 -0
- package/lib/core/rubric.d.ts.map +1 -0
- package/lib/core/rubric.js +49 -0
- package/lib/core/rubric.js.map +1 -0
- package/lib/core/run.d.ts +419 -0
- package/lib/core/run.d.ts.map +1 -0
- package/lib/core/run.js +126 -0
- package/lib/core/run.js.map +1 -0
- package/lib/core/statistics.d.ts +39 -0
- package/lib/core/statistics.d.ts.map +1 -0
- package/lib/core/statistics.js +163 -0
- package/lib/core/statistics.js.map +1 -0
- package/lib/core/subject.d.ts +4 -0
- package/lib/core/subject.d.ts.map +1 -0
- package/lib/core/subject.js +46 -0
- package/lib/core/subject.js.map +1 -0
- package/lib/core/tool-events.d.ts +69 -0
- package/lib/core/tool-events.d.ts.map +1 -0
- package/lib/core/tool-events.js +242 -0
- package/lib/core/tool-events.js.map +1 -0
- package/lib/core/usage.d.ts +78 -0
- package/lib/core/usage.d.ts.map +1 -0
- package/lib/core/usage.js +104 -0
- package/lib/core/usage.js.map +1 -0
- package/lib/core/wire.d.ts +83 -0
- package/lib/core/wire.d.ts.map +1 -0
- package/lib/core/wire.js +101 -0
- package/lib/core/wire.js.map +1 -0
- package/lib/core/zod.d.ts +10 -0
- package/lib/core/zod.d.ts.map +1 -0
- package/lib/core/zod.js +18 -0
- package/lib/core/zod.js.map +1 -0
- package/lib/drivers/claude-code/index.d.ts +55 -0
- package/lib/drivers/claude-code/index.d.ts.map +1 -0
- package/lib/drivers/claude-code/index.js +779 -0
- package/lib/drivers/claude-code/index.js.map +1 -0
- package/lib/drivers/claude-code/parse-events.d.ts +46 -0
- package/lib/drivers/claude-code/parse-events.d.ts.map +1 -0
- package/lib/drivers/claude-code/parse-events.js +387 -0
- package/lib/drivers/claude-code/parse-events.js.map +1 -0
- package/lib/drivers/codex/app-events.d.ts +16 -0
- package/lib/drivers/codex/app-events.d.ts.map +1 -0
- package/lib/drivers/codex/app-events.js +184 -0
- package/lib/drivers/codex/app-events.js.map +1 -0
- package/lib/drivers/codex/config.d.ts +55 -0
- package/lib/drivers/codex/config.d.ts.map +1 -0
- package/lib/drivers/codex/config.js +125 -0
- package/lib/drivers/codex/config.js.map +1 -0
- package/lib/drivers/codex/index.d.ts +8 -0
- package/lib/drivers/codex/index.d.ts.map +1 -0
- package/lib/drivers/codex/index.js +904 -0
- package/lib/drivers/codex/index.js.map +1 -0
- package/lib/drivers/mcp/index.d.ts +52 -0
- package/lib/drivers/mcp/index.d.ts.map +1 -0
- package/lib/drivers/mcp/index.js +282 -0
- package/lib/drivers/mcp/index.js.map +1 -0
- package/lib/drivers/mcp/transport.d.ts +50 -0
- package/lib/drivers/mcp/transport.d.ts.map +1 -0
- package/lib/drivers/mcp/transport.js +190 -0
- package/lib/drivers/mcp/transport.js.map +1 -0
- package/lib/drivers/shared/artifacts.d.ts +4 -0
- package/lib/drivers/shared/artifacts.d.ts.map +1 -0
- package/lib/drivers/shared/artifacts.js +81 -0
- package/lib/drivers/shared/artifacts.js.map +1 -0
- package/lib/drivers/shared/secure-copy.d.ts +2 -0
- package/lib/drivers/shared/secure-copy.d.ts.map +1 -0
- package/lib/drivers/shared/secure-copy.js +35 -0
- package/lib/drivers/shared/secure-copy.js.map +1 -0
- package/lib/drivers/subprocess/index.d.ts +24 -0
- package/lib/drivers/subprocess/index.d.ts.map +1 -0
- package/lib/drivers/subprocess/index.js +451 -0
- package/lib/drivers/subprocess/index.js.map +1 -0
- package/lib/index.d.ts +40 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +48 -0
- package/lib/index.js.map +1 -0
- package/lib/optimization/reflective.d.ts +27 -0
- package/lib/optimization/reflective.d.ts.map +1 -0
- package/lib/optimization/reflective.js +257 -0
- package/lib/optimization/reflective.js.map +1 -0
- package/lib/orchestrator/annotation-loader.d.ts +65 -0
- package/lib/orchestrator/annotation-loader.d.ts.map +1 -0
- package/lib/orchestrator/annotation-loader.js +73 -0
- package/lib/orchestrator/annotation-loader.js.map +1 -0
- package/lib/orchestrator/annotation-store.d.ts +3 -0
- package/lib/orchestrator/annotation-store.d.ts.map +1 -0
- package/lib/orchestrator/annotation-store.js +100 -0
- package/lib/orchestrator/annotation-store.js.map +1 -0
- package/lib/orchestrator/authored-dependencies.d.ts +3 -0
- package/lib/orchestrator/authored-dependencies.d.ts.map +1 -0
- package/lib/orchestrator/authored-dependencies.js +146 -0
- package/lib/orchestrator/authored-dependencies.js.map +1 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts +105 -0
- package/lib/orchestrator/campaign-lifecycle.d.ts.map +1 -0
- package/lib/orchestrator/campaign-lifecycle.js +141 -0
- package/lib/orchestrator/campaign-lifecycle.js.map +1 -0
- package/lib/orchestrator/candidate-integrity.d.ts +4 -0
- package/lib/orchestrator/candidate-integrity.d.ts.map +1 -0
- package/lib/orchestrator/candidate-integrity.js +14 -0
- package/lib/orchestrator/candidate-integrity.js.map +1 -0
- package/lib/orchestrator/candidates.d.ts +13 -0
- package/lib/orchestrator/candidates.d.ts.map +1 -0
- package/lib/orchestrator/candidates.js +577 -0
- package/lib/orchestrator/candidates.js.map +1 -0
- package/lib/orchestrator/compare.d.ts +80 -0
- package/lib/orchestrator/compare.d.ts.map +1 -0
- package/lib/orchestrator/compare.js +270 -0
- package/lib/orchestrator/compare.js.map +1 -0
- package/lib/orchestrator/comparison-identity.d.ts +10 -0
- package/lib/orchestrator/comparison-identity.d.ts.map +1 -0
- package/lib/orchestrator/comparison-identity.js +39 -0
- package/lib/orchestrator/comparison-identity.js.map +1 -0
- package/lib/orchestrator/config.d.ts +121 -0
- package/lib/orchestrator/config.d.ts.map +1 -0
- package/lib/orchestrator/config.js +176 -0
- package/lib/orchestrator/config.js.map +1 -0
- package/lib/orchestrator/content-bound-json.d.ts +5 -0
- package/lib/orchestrator/content-bound-json.d.ts.map +1 -0
- package/lib/orchestrator/content-bound-json.js +59 -0
- package/lib/orchestrator/content-bound-json.js.map +1 -0
- package/lib/orchestrator/discover.d.ts +45 -0
- package/lib/orchestrator/discover.d.ts.map +1 -0
- package/lib/orchestrator/discover.js +98 -0
- package/lib/orchestrator/discover.js.map +1 -0
- package/lib/orchestrator/doctor.d.ts +141 -0
- package/lib/orchestrator/doctor.d.ts.map +1 -0
- package/lib/orchestrator/doctor.js +525 -0
- package/lib/orchestrator/doctor.js.map +1 -0
- package/lib/orchestrator/driver-session.d.ts +177 -0
- package/lib/orchestrator/driver-session.d.ts.map +1 -0
- package/lib/orchestrator/driver-session.js +396 -0
- package/lib/orchestrator/driver-session.js.map +1 -0
- package/lib/orchestrator/evaluator-identity.d.ts +7 -0
- package/lib/orchestrator/evaluator-identity.d.ts.map +1 -0
- package/lib/orchestrator/evaluator-identity.js +42 -0
- package/lib/orchestrator/evaluator-identity.js.map +1 -0
- package/lib/orchestrator/experiment-budget.d.ts +11 -0
- package/lib/orchestrator/experiment-budget.d.ts.map +1 -0
- package/lib/orchestrator/experiment-budget.js +51 -0
- package/lib/orchestrator/experiment-budget.js.map +1 -0
- package/lib/orchestrator/experiment-context.d.ts +43 -0
- package/lib/orchestrator/experiment-context.d.ts.map +1 -0
- package/lib/orchestrator/experiment-context.js +9 -0
- package/lib/orchestrator/experiment-context.js.map +1 -0
- package/lib/orchestrator/experiment-contracts.d.ts +290 -0
- package/lib/orchestrator/experiment-contracts.d.ts.map +1 -0
- package/lib/orchestrator/experiment-contracts.js +38 -0
- package/lib/orchestrator/experiment-contracts.js.map +1 -0
- package/lib/orchestrator/experiment-corpus.d.ts +21 -0
- package/lib/orchestrator/experiment-corpus.d.ts.map +1 -0
- package/lib/orchestrator/experiment-corpus.js +276 -0
- package/lib/orchestrator/experiment-corpus.js.map +1 -0
- package/lib/orchestrator/experiment-evaluation.d.ts +44 -0
- package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -0
- package/lib/orchestrator/experiment-evaluation.js +542 -0
- package/lib/orchestrator/experiment-evaluation.js.map +1 -0
- package/lib/orchestrator/experiment-finish.d.ts +6 -0
- package/lib/orchestrator/experiment-finish.d.ts.map +1 -0
- package/lib/orchestrator/experiment-finish.js +19 -0
- package/lib/orchestrator/experiment-finish.js.map +1 -0
- package/lib/orchestrator/experiment-identity.d.ts +6 -0
- package/lib/orchestrator/experiment-identity.d.ts.map +1 -0
- package/lib/orchestrator/experiment-identity.js +257 -0
- package/lib/orchestrator/experiment-identity.js.map +1 -0
- package/lib/orchestrator/experiment-loader.d.ts +175 -0
- package/lib/orchestrator/experiment-loader.d.ts.map +1 -0
- package/lib/orchestrator/experiment-loader.js +77 -0
- package/lib/orchestrator/experiment-loader.js.map +1 -0
- package/lib/orchestrator/experiment-report.d.ts +450 -0
- package/lib/orchestrator/experiment-report.d.ts.map +1 -0
- package/lib/orchestrator/experiment-report.js +570 -0
- package/lib/orchestrator/experiment-report.js.map +1 -0
- package/lib/orchestrator/experiment-runs.d.ts +379 -0
- package/lib/orchestrator/experiment-runs.d.ts.map +1 -0
- package/lib/orchestrator/experiment-runs.js +796 -0
- package/lib/orchestrator/experiment-runs.js.map +1 -0
- package/lib/orchestrator/experiment-runtime-identity.d.ts +41 -0
- package/lib/orchestrator/experiment-runtime-identity.d.ts.map +1 -0
- package/lib/orchestrator/experiment-runtime-identity.js +411 -0
- package/lib/orchestrator/experiment-runtime-identity.js.map +1 -0
- package/lib/orchestrator/experiment-selection.d.ts +25 -0
- package/lib/orchestrator/experiment-selection.d.ts.map +1 -0
- package/lib/orchestrator/experiment-selection.js +286 -0
- package/lib/orchestrator/experiment-selection.js.map +1 -0
- package/lib/orchestrator/experiment.d.ts +11 -0
- package/lib/orchestrator/experiment.d.ts.map +1 -0
- package/lib/orchestrator/experiment.js +639 -0
- package/lib/orchestrator/experiment.js.map +1 -0
- package/lib/orchestrator/fixture-identity.d.ts +7 -0
- package/lib/orchestrator/fixture-identity.d.ts.map +1 -0
- package/lib/orchestrator/fixture-identity.js +55 -0
- package/lib/orchestrator/fixture-identity.js.map +1 -0
- package/lib/orchestrator/fs-read.d.ts +19 -0
- package/lib/orchestrator/fs-read.d.ts.map +1 -0
- package/lib/orchestrator/fs-read.js +113 -0
- package/lib/orchestrator/fs-read.js.map +1 -0
- package/lib/orchestrator/grader-experiment.d.ts +190 -0
- package/lib/orchestrator/grader-experiment.d.ts.map +1 -0
- package/lib/orchestrator/grader-experiment.js +579 -0
- package/lib/orchestrator/grader-experiment.js.map +1 -0
- package/lib/orchestrator/grading.d.ts +31 -0
- package/lib/orchestrator/grading.d.ts.map +1 -0
- package/lib/orchestrator/grading.js +186 -0
- package/lib/orchestrator/grading.js.map +1 -0
- package/lib/orchestrator/index.d.ts +22 -0
- package/lib/orchestrator/index.d.ts.map +1 -0
- package/lib/orchestrator/index.js +30 -0
- package/lib/orchestrator/index.js.map +1 -0
- package/lib/orchestrator/lifecycle-hook-execution.d.ts +4 -0
- package/lib/orchestrator/lifecycle-hook-execution.d.ts.map +1 -0
- package/lib/orchestrator/lifecycle-hook-execution.js +67 -0
- package/lib/orchestrator/lifecycle-hook-execution.js.map +1 -0
- package/lib/orchestrator/list-runs.d.ts +33 -0
- package/lib/orchestrator/list-runs.d.ts.map +1 -0
- package/lib/orchestrator/list-runs.js +308 -0
- package/lib/orchestrator/list-runs.js.map +1 -0
- package/lib/orchestrator/loader.d.ts +3 -0
- package/lib/orchestrator/loader.d.ts.map +1 -0
- package/lib/orchestrator/loader.js +17 -0
- package/lib/orchestrator/loader.js.map +1 -0
- package/lib/orchestrator/optimization-lifecycle.d.ts +12 -0
- package/lib/orchestrator/optimization-lifecycle.d.ts.map +1 -0
- package/lib/orchestrator/optimization-lifecycle.js +92 -0
- package/lib/orchestrator/optimization-lifecycle.js.map +1 -0
- package/lib/orchestrator/orchestrator.d.ts +144 -0
- package/lib/orchestrator/orchestrator.d.ts.map +1 -0
- package/lib/orchestrator/orchestrator.js +632 -0
- package/lib/orchestrator/orchestrator.js.map +1 -0
- package/lib/orchestrator/owned-lock.d.ts +17 -0
- package/lib/orchestrator/owned-lock.d.ts.map +1 -0
- package/lib/orchestrator/owned-lock.js +149 -0
- package/lib/orchestrator/owned-lock.js.map +1 -0
- package/lib/orchestrator/package-version.d.ts +2 -0
- package/lib/orchestrator/package-version.d.ts.map +1 -0
- package/lib/orchestrator/package-version.js +4 -0
- package/lib/orchestrator/package-version.js.map +1 -0
- package/lib/orchestrator/provenance.d.ts +5 -0
- package/lib/orchestrator/provenance.d.ts.map +1 -0
- package/lib/orchestrator/provenance.js +137 -0
- package/lib/orchestrator/provenance.js.map +1 -0
- package/lib/orchestrator/regrade.d.ts +80 -0
- package/lib/orchestrator/regrade.d.ts.map +1 -0
- package/lib/orchestrator/regrade.js +433 -0
- package/lib/orchestrator/regrade.js.map +1 -0
- package/lib/orchestrator/rubric-loader.d.ts +7 -0
- package/lib/orchestrator/rubric-loader.d.ts.map +1 -0
- package/lib/orchestrator/rubric-loader.js +65 -0
- package/lib/orchestrator/rubric-loader.js.map +1 -0
- package/lib/orchestrator/run-dir.d.ts +40 -0
- package/lib/orchestrator/run-dir.d.ts.map +1 -0
- package/lib/orchestrator/run-dir.js +161 -0
- package/lib/orchestrator/run-dir.js.map +1 -0
- package/lib/orchestrator/run-execution.d.ts +30 -0
- package/lib/orchestrator/run-execution.d.ts.map +1 -0
- package/lib/orchestrator/run-execution.js +531 -0
- package/lib/orchestrator/run-execution.js.map +1 -0
- package/lib/orchestrator/run-lifecycle.d.ts +115 -0
- package/lib/orchestrator/run-lifecycle.d.ts.map +1 -0
- package/lib/orchestrator/run-lifecycle.js +136 -0
- package/lib/orchestrator/run-lifecycle.js.map +1 -0
- package/lib/orchestrator/suite-compare.d.ts +76 -0
- package/lib/orchestrator/suite-compare.d.ts.map +1 -0
- package/lib/orchestrator/suite-compare.js +159 -0
- package/lib/orchestrator/suite-compare.js.map +1 -0
- package/lib/orchestrator/suite-lifecycle.d.ts +157 -0
- package/lib/orchestrator/suite-lifecycle.d.ts.map +1 -0
- package/lib/orchestrator/suite-lifecycle.js +253 -0
- package/lib/orchestrator/suite-lifecycle.js.map +1 -0
- package/lib/orchestrator/suite-runs.d.ts +91 -0
- package/lib/orchestrator/suite-runs.d.ts.map +1 -0
- package/lib/orchestrator/suite-runs.js +157 -0
- package/lib/orchestrator/suite-runs.js.map +1 -0
- package/lib/orchestrator/suite-summary.d.ts +109 -0
- package/lib/orchestrator/suite-summary.d.ts.map +1 -0
- package/lib/orchestrator/suite-summary.js +213 -0
- package/lib/orchestrator/suite-summary.js.map +1 -0
- package/lib/orchestrator/trace-limits.d.ts +20 -0
- package/lib/orchestrator/trace-limits.d.ts.map +1 -0
- package/lib/orchestrator/trace-limits.js +28 -0
- package/lib/orchestrator/trace-limits.js.map +1 -0
- package/lib/orchestrator/validate-plugin-config.d.ts +10 -0
- package/lib/orchestrator/validate-plugin-config.d.ts.map +1 -0
- package/lib/orchestrator/validate-plugin-config.js +26 -0
- package/lib/orchestrator/validate-plugin-config.js.map +1 -0
- package/package.json +84 -0
- package/skills/lux/SKILL.md +85 -0
- package/skills/lux/references/cli.md +102 -0
- package/skills/lux/references/eval-authoring.md +105 -0
- package/skills/lux-answerer/SKILL.md +169 -0
- package/src/answerers/claude-code/index.ts +342 -0
- package/src/answerers/persona/index.ts +327 -0
- package/src/answerers/scripted/index.ts +186 -0
- package/src/answerers/shared.ts +23 -0
- package/src/answerers/terminal/index.ts +117 -0
- package/src/assertions/core/command-exits-zero.ts +94 -0
- package/src/assertions/core/event-checks.ts +138 -0
- package/src/assertions/core/file-checks.ts +336 -0
- package/src/assertions/core/helpers.ts +203 -0
- package/src/assertions/core/index.ts +80 -0
- package/src/assertions/core/json-pointer-equals.ts +84 -0
- package/src/assertions/core/output-checks.ts +134 -0
- package/src/assertions/core/predicate.ts +67 -0
- package/src/assertions/core/resource-checks.ts +180 -0
- package/src/assertions/core/safe-regex.ts +196 -0
- package/src/assertions/core/tool-called-with.ts +68 -0
- package/src/assertions/core/tool-calls.ts +28 -0
- package/src/assertions/core/tool-invocation.ts +198 -0
- package/src/assertions/core/tool-result-checks.ts +211 -0
- package/src/assertions/mcp/discovery-checks.ts +139 -0
- package/src/assertions/mcp/index.ts +37 -0
- package/src/assertions/rubric/index.ts +258 -0
- package/src/assertions/rubric/internal.ts +367 -0
- package/src/authoring.ts +2 -0
- package/src/cli/bin.ts +14 -0
- package/src/cli/command-runtime.ts +34 -0
- package/src/cli/init.ts +410 -0
- package/src/cli/program.ts +992 -0
- package/src/cli/render/format.ts +69 -0
- package/src/cli/render/reporter.ts +643 -0
- package/src/cli/render/tty.ts +314 -0
- package/src/cli/run-options.ts +82 -0
- package/src/cli/skills.ts +129 -0
- package/src/core/annotation.ts +104 -0
- package/src/core/answerer.ts +75 -0
- package/src/core/artifact-evidence.ts +249 -0
- package/src/core/artifact-snapshot.ts +429 -0
- package/src/core/assertion.ts +156 -0
- package/src/core/case.ts +103 -0
- package/src/core/conversation-turn.ts +47 -0
- package/src/core/driver.ts +75 -0
- package/src/core/emitter.ts +38 -0
- package/src/core/events.ts +135 -0
- package/src/core/exec.ts +263 -0
- package/src/core/experiment.ts +467 -0
- package/src/core/glob.ts +31 -0
- package/src/core/hash.ts +237 -0
- package/src/core/index.ts +28 -0
- package/src/core/lifecycle-fixtures.ts +145 -0
- package/src/core/lifecycle-hooks.ts +101 -0
- package/src/core/mcp-events.ts +57 -0
- package/src/core/model-cli.ts +271 -0
- package/src/core/observer.ts +50 -0
- package/src/core/platform-process.ts +284 -0
- package/src/core/registry.ts +57 -0
- package/src/core/rubric.ts +52 -0
- package/src/core/run.ts +144 -0
- package/src/core/statistics.ts +194 -0
- package/src/core/subject.ts +50 -0
- package/src/core/tool-events.ts +292 -0
- package/src/core/usage.ts +123 -0
- package/src/core/wire.ts +135 -0
- package/src/core/zod.ts +20 -0
- package/src/drivers/claude-code/index.ts +866 -0
- package/src/drivers/claude-code/parse-events.ts +464 -0
- package/src/drivers/codex/app-events.ts +218 -0
- package/src/drivers/codex/config.ts +128 -0
- package/src/drivers/codex/index.ts +995 -0
- package/src/drivers/mcp/index.ts +351 -0
- package/src/drivers/mcp/transport.ts +222 -0
- package/src/drivers/shared/artifacts.ts +86 -0
- package/src/drivers/shared/secure-copy.ts +40 -0
- package/src/drivers/subprocess/index.ts +490 -0
- package/src/index.ts +594 -0
- package/src/optimization/reflective.ts +319 -0
- package/src/orchestrator/annotation-loader.ts +97 -0
- package/src/orchestrator/annotation-store.ts +112 -0
- package/src/orchestrator/authored-dependencies.ts +193 -0
- package/src/orchestrator/campaign-lifecycle.ts +181 -0
- package/src/orchestrator/candidate-integrity.ts +18 -0
- package/src/orchestrator/candidates.ts +683 -0
- package/src/orchestrator/compare.ts +358 -0
- package/src/orchestrator/comparison-identity.ts +45 -0
- package/src/orchestrator/config.ts +205 -0
- package/src/orchestrator/content-bound-json.ts +71 -0
- package/src/orchestrator/discover.ts +132 -0
- package/src/orchestrator/doctor.ts +781 -0
- package/src/orchestrator/driver-session.ts +507 -0
- package/src/orchestrator/evaluator-identity.ts +45 -0
- package/src/orchestrator/experiment-budget.ts +61 -0
- package/src/orchestrator/experiment-context.ts +41 -0
- package/src/orchestrator/experiment-contracts.ts +43 -0
- package/src/orchestrator/experiment-corpus.ts +416 -0
- package/src/orchestrator/experiment-evaluation.ts +749 -0
- package/src/orchestrator/experiment-finish.ts +33 -0
- package/src/orchestrator/experiment-identity.ts +356 -0
- package/src/orchestrator/experiment-loader.ts +105 -0
- package/src/orchestrator/experiment-report.ts +788 -0
- package/src/orchestrator/experiment-runs.ts +960 -0
- package/src/orchestrator/experiment-runtime-identity.ts +465 -0
- package/src/orchestrator/experiment-selection.ts +467 -0
- package/src/orchestrator/experiment.ts +991 -0
- package/src/orchestrator/fixture-identity.ts +67 -0
- package/src/orchestrator/fs-read.ts +126 -0
- package/src/orchestrator/grader-experiment.ts +856 -0
- package/src/orchestrator/grading.ts +260 -0
- package/src/orchestrator/index.ts +186 -0
- package/src/orchestrator/lifecycle-hook-execution.ts +90 -0
- package/src/orchestrator/list-runs.ts +384 -0
- package/src/orchestrator/loader.ts +19 -0
- package/src/orchestrator/optimization-lifecycle.ts +126 -0
- package/src/orchestrator/orchestrator.ts +919 -0
- package/src/orchestrator/owned-lock.ts +147 -0
- package/src/orchestrator/package-version.ts +5 -0
- package/src/orchestrator/provenance.ts +140 -0
- package/src/orchestrator/regrade.ts +580 -0
- package/src/orchestrator/rubric-loader.ts +74 -0
- package/src/orchestrator/run-dir.ts +209 -0
- package/src/orchestrator/run-execution.ts +694 -0
- package/src/orchestrator/run-lifecycle.ts +174 -0
- package/src/orchestrator/suite-compare.ts +195 -0
- package/src/orchestrator/suite-lifecycle.ts +335 -0
- package/src/orchestrator/suite-runs.ts +202 -0
- package/src/orchestrator/suite-summary.ts +276 -0
- package/src/orchestrator/trace-limits.ts +65 -0
- package/src/orchestrator/validate-plugin-config.ts +34 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Progress, RunEvent } from "./events.js";
|
|
3
|
+
import { tryParseJson } from "./zod.js";
|
|
4
|
+
|
|
5
|
+
export const TOOL_CALL_KIND = "tool-call" as const;
|
|
6
|
+
export const TOOL_RESULT_KIND = "tool-result" as const;
|
|
7
|
+
|
|
8
|
+
export const ToolCallPayloadSchema = z
|
|
9
|
+
.object({
|
|
10
|
+
name: z.string().min(1),
|
|
11
|
+
input: z.unknown(),
|
|
12
|
+
toolUseId: z.string().min(1),
|
|
13
|
+
parentToolUseId: z.string().min(1).optional(),
|
|
14
|
+
})
|
|
15
|
+
.loose()
|
|
16
|
+
.superRefine((payload, ctx) => {
|
|
17
|
+
if (!Object.hasOwn(payload, "input")) {
|
|
18
|
+
ctx.addIssue({
|
|
19
|
+
code: "custom",
|
|
20
|
+
path: ["input"],
|
|
21
|
+
message: "input is required",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
export type ToolCallPayload = z.infer<typeof ToolCallPayloadSchema>;
|
|
26
|
+
|
|
27
|
+
export const ToolResultPayloadSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
name: z.string().min(1),
|
|
30
|
+
toolUseId: z.string().min(1),
|
|
31
|
+
content: z.unknown(),
|
|
32
|
+
structuredContent: z.record(z.string(), z.unknown()).optional(),
|
|
33
|
+
isError: z.boolean(),
|
|
34
|
+
text: z.string(),
|
|
35
|
+
durationMs: z.number().nonnegative().optional(),
|
|
36
|
+
parentToolUseId: z.string().min(1).optional(),
|
|
37
|
+
})
|
|
38
|
+
.loose()
|
|
39
|
+
.superRefine((payload, ctx) => {
|
|
40
|
+
if (!Object.hasOwn(payload, "content")) {
|
|
41
|
+
ctx.addIssue({
|
|
42
|
+
code: "custom",
|
|
43
|
+
path: ["content"],
|
|
44
|
+
message: "content is required",
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
export type ToolResultPayload = z.infer<typeof ToolResultPayloadSchema>;
|
|
49
|
+
|
|
50
|
+
export type ToolInvocation = {
|
|
51
|
+
call: ToolCallPayload;
|
|
52
|
+
result?: ToolResultPayload;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export const ToolOutcomeSummarySchema = z
|
|
56
|
+
.object({
|
|
57
|
+
reportedCalls: z.number().int().nonnegative(),
|
|
58
|
+
total: z.number().int().nonnegative(),
|
|
59
|
+
succeeded: z.number().int().nonnegative(),
|
|
60
|
+
failed: z.number().int().nonnegative(),
|
|
61
|
+
unresolved: z.number().int().nonnegative(),
|
|
62
|
+
unmatchedResults: z.number().int().nonnegative(),
|
|
63
|
+
malformedEvents: z.number().int().nonnegative(),
|
|
64
|
+
})
|
|
65
|
+
.superRefine((summary, ctx) => {
|
|
66
|
+
if (summary.reportedCalls < summary.total) {
|
|
67
|
+
ctx.addIssue({
|
|
68
|
+
code: "custom",
|
|
69
|
+
path: ["reportedCalls"],
|
|
70
|
+
message: "reportedCalls cannot be less than total",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (summary.total !== summary.succeeded + summary.failed + summary.unresolved) {
|
|
74
|
+
ctx.addIssue({
|
|
75
|
+
code: "custom",
|
|
76
|
+
path: ["total"],
|
|
77
|
+
message: "total must equal succeeded + failed + unresolved",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
export type ToolOutcomeSummary = z.infer<typeof ToolOutcomeSummarySchema>;
|
|
82
|
+
|
|
83
|
+
export type ToolInvocationOutcome = "succeeded" | "failed" | "unresolved";
|
|
84
|
+
export type ToolEventCorrelation = {
|
|
85
|
+
invocations: ToolInvocation[];
|
|
86
|
+
unmatchedResults: number;
|
|
87
|
+
};
|
|
88
|
+
export type ToolOutcomeAccumulator = {
|
|
89
|
+
add: (event: RunEvent) => void;
|
|
90
|
+
summary: () => ToolOutcomeSummary;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
type ProgressEvent = Extract<RunEvent, { type: "progress" }>;
|
|
94
|
+
type ToolCallEvent = ProgressEvent & { kind: typeof TOOL_CALL_KIND };
|
|
95
|
+
type ToolResultEvent = ProgressEvent & { kind: typeof TOOL_RESULT_KIND };
|
|
96
|
+
|
|
97
|
+
const isProgressKind = <Kind extends string>(
|
|
98
|
+
event: RunEvent,
|
|
99
|
+
kind: Kind,
|
|
100
|
+
): event is ProgressEvent & { kind: Kind } => event.type === "progress" && event.kind === kind;
|
|
101
|
+
|
|
102
|
+
export const isToolCallEvent = (event: RunEvent): event is ToolCallEvent =>
|
|
103
|
+
isProgressKind(event, TOOL_CALL_KIND);
|
|
104
|
+
|
|
105
|
+
export const isToolResultEvent = (event: RunEvent): event is ToolResultEvent =>
|
|
106
|
+
isProgressKind(event, TOOL_RESULT_KIND);
|
|
107
|
+
|
|
108
|
+
export const toolCallProgress = (seq: number, payload: ToolCallPayload, ts: number): Progress => ({
|
|
109
|
+
id: `tc-${payload.toolUseId || seq}`,
|
|
110
|
+
kind: TOOL_CALL_KIND,
|
|
111
|
+
payload,
|
|
112
|
+
ts,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
export const toolResultProgress = (
|
|
116
|
+
seq: number,
|
|
117
|
+
payload: ToolResultPayload,
|
|
118
|
+
ts: number,
|
|
119
|
+
): Progress => ({
|
|
120
|
+
id: `tr-${payload.toolUseId || seq}`,
|
|
121
|
+
kind: TOOL_RESULT_KIND,
|
|
122
|
+
payload,
|
|
123
|
+
ts,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
export const toolEventCalls = (events: RunEvent[], name?: string): ToolCallPayload[] =>
|
|
127
|
+
events
|
|
128
|
+
.filter(isToolCallEvent)
|
|
129
|
+
.map((event) => ToolCallPayloadSchema.safeParse(event.payload).data)
|
|
130
|
+
.filter((payload): payload is ToolCallPayload => payload !== undefined)
|
|
131
|
+
.filter((payload) => name === undefined || payload.name === name);
|
|
132
|
+
|
|
133
|
+
export const toolResults = (events: RunEvent[], name?: string): ToolResultPayload[] =>
|
|
134
|
+
events
|
|
135
|
+
.filter(isToolResultEvent)
|
|
136
|
+
.map((event) => ToolResultPayloadSchema.safeParse(event.payload).data)
|
|
137
|
+
.filter((payload): payload is ToolResultPayload => payload !== undefined)
|
|
138
|
+
.filter((payload) => name === undefined || payload.name === name);
|
|
139
|
+
|
|
140
|
+
export const malformedToolEventCount = (
|
|
141
|
+
events: readonly RunEvent[],
|
|
142
|
+
kinds: readonly (typeof TOOL_CALL_KIND | typeof TOOL_RESULT_KIND)[] = [
|
|
143
|
+
TOOL_CALL_KIND,
|
|
144
|
+
TOOL_RESULT_KIND,
|
|
145
|
+
],
|
|
146
|
+
): number => {
|
|
147
|
+
const selected = new Set<string>(kinds);
|
|
148
|
+
return events.filter((event) => {
|
|
149
|
+
if (event.type !== "progress" || !selected.has(event.kind)) return false;
|
|
150
|
+
const schema = event.kind === TOOL_CALL_KIND ? ToolCallPayloadSchema : ToolResultPayloadSchema;
|
|
151
|
+
return !schema.safeParse(event.payload).success;
|
|
152
|
+
}).length;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export const toolResultValue = (result: ToolResultPayload): unknown => {
|
|
156
|
+
if (result.structuredContent !== undefined) return result.structuredContent;
|
|
157
|
+
const parsedText = tryParseJson(result.text);
|
|
158
|
+
if (Array.isArray(result.content)) {
|
|
159
|
+
return parsedText !== undefined ? parsedText : result.content;
|
|
160
|
+
}
|
|
161
|
+
if (typeof result.content === "string") {
|
|
162
|
+
const parsedContent = tryParseJson(result.content);
|
|
163
|
+
return parsedContent !== undefined ? parsedContent : result.content;
|
|
164
|
+
}
|
|
165
|
+
if (result.content !== null && result.content !== undefined) {
|
|
166
|
+
return result.content;
|
|
167
|
+
}
|
|
168
|
+
return parsedText !== undefined ? parsedText : result.text;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Correlate standardized calls with the first later result in the same agent
|
|
173
|
+
* scope. Evidence without the required correlation fields is ignored.
|
|
174
|
+
*/
|
|
175
|
+
const correlationKey = (toolName: string, toolUseId: string, parentToolUseId?: string): string =>
|
|
176
|
+
JSON.stringify([parentToolUseId ?? null, toolName, toolUseId]);
|
|
177
|
+
|
|
178
|
+
class ToolOutcomeAccumulatorImpl implements ToolOutcomeAccumulator {
|
|
179
|
+
private readonly name: string | undefined;
|
|
180
|
+
private readonly correlatedInvocations: ToolInvocation[] = [];
|
|
181
|
+
private readonly pending = new Map<string, number>();
|
|
182
|
+
private readonly ambiguous = new Map<string, number>();
|
|
183
|
+
private reportedCalls = 0;
|
|
184
|
+
private succeeded = 0;
|
|
185
|
+
private failed = 0;
|
|
186
|
+
private unresolved = 0;
|
|
187
|
+
private unmatchedResults = 0;
|
|
188
|
+
private malformedEvents = 0;
|
|
189
|
+
|
|
190
|
+
constructor(name?: string) {
|
|
191
|
+
this.name = name;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
add = (event: RunEvent): void => {
|
|
195
|
+
if (isToolCallEvent(event)) {
|
|
196
|
+
if (this.name === undefined) this.reportedCalls++;
|
|
197
|
+
const call = ToolCallPayloadSchema.safeParse(event.payload).data;
|
|
198
|
+
if (!call) {
|
|
199
|
+
if (this.name === undefined) this.malformedEvents++;
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (this.name !== undefined && call.name !== this.name) return;
|
|
203
|
+
if (this.name !== undefined) this.reportedCalls++;
|
|
204
|
+
const index = this.correlatedInvocations.push({ call }) - 1;
|
|
205
|
+
this.unresolved++;
|
|
206
|
+
const key = correlationKey(call.name, call.toolUseId, call.parentToolUseId);
|
|
207
|
+
const ambiguousCalls = this.ambiguous.get(key);
|
|
208
|
+
if (ambiguousCalls !== undefined) {
|
|
209
|
+
this.ambiguous.set(key, ambiguousCalls + 1);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (this.pending.has(key)) {
|
|
213
|
+
this.pending.delete(key);
|
|
214
|
+
this.ambiguous.set(key, 2);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
this.pending.set(key, index);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (!isToolResultEvent(event)) return;
|
|
221
|
+
const result = ToolResultPayloadSchema.safeParse(event.payload).data;
|
|
222
|
+
if (!result) {
|
|
223
|
+
if (this.name === undefined) this.malformedEvents++;
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (this.name !== undefined && result.name !== this.name) return;
|
|
227
|
+
const key = correlationKey(result.name, result.toolUseId, result.parentToolUseId);
|
|
228
|
+
const ambiguousCalls = this.ambiguous.get(key);
|
|
229
|
+
if (ambiguousCalls !== undefined) {
|
|
230
|
+
this.unmatchedResults++;
|
|
231
|
+
if (ambiguousCalls === 1) this.ambiguous.delete(key);
|
|
232
|
+
else this.ambiguous.set(key, ambiguousCalls - 1);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const index = this.pending.get(key);
|
|
236
|
+
if (index === undefined) {
|
|
237
|
+
this.unmatchedResults++;
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
this.pending.delete(key);
|
|
241
|
+
const invocation = this.correlatedInvocations[index];
|
|
242
|
+
if (!invocation) {
|
|
243
|
+
this.unmatchedResults++;
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
invocation.result = result;
|
|
247
|
+
this.unresolved--;
|
|
248
|
+
if (result.isError) this.failed++;
|
|
249
|
+
else this.succeeded++;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
summary = (): ToolOutcomeSummary => ({
|
|
253
|
+
reportedCalls: this.reportedCalls,
|
|
254
|
+
total: this.correlatedInvocations.length,
|
|
255
|
+
succeeded: this.succeeded,
|
|
256
|
+
failed: this.failed,
|
|
257
|
+
unresolved: this.unresolved,
|
|
258
|
+
unmatchedResults: this.unmatchedResults,
|
|
259
|
+
malformedEvents: this.malformedEvents,
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
correlation = (): ToolEventCorrelation => ({
|
|
263
|
+
invocations: this.correlatedInvocations,
|
|
264
|
+
unmatchedResults: this.unmatchedResults,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export const createToolOutcomeAccumulator = (): ToolOutcomeAccumulator =>
|
|
269
|
+
new ToolOutcomeAccumulatorImpl();
|
|
270
|
+
|
|
271
|
+
export const correlateToolEvents = (
|
|
272
|
+
events: readonly RunEvent[],
|
|
273
|
+
name?: string,
|
|
274
|
+
): ToolEventCorrelation => {
|
|
275
|
+
const accumulator = new ToolOutcomeAccumulatorImpl(name);
|
|
276
|
+
for (const event of events) accumulator.add(event);
|
|
277
|
+
return accumulator.correlation();
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
export const toolInvocations = (events: readonly RunEvent[], name?: string): ToolInvocation[] =>
|
|
281
|
+
correlateToolEvents(events, name).invocations;
|
|
282
|
+
|
|
283
|
+
export const toolInvocationOutcome = (invocation: ToolInvocation): ToolInvocationOutcome => {
|
|
284
|
+
if (!invocation.result) return "unresolved";
|
|
285
|
+
return invocation.result.isError ? "failed" : "succeeded";
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
export const summarizeToolOutcomes = (events: readonly RunEvent[]): ToolOutcomeSummary => {
|
|
289
|
+
const accumulator = createToolOutcomeAccumulator();
|
|
290
|
+
for (const event of events) accumulator.add(event);
|
|
291
|
+
return accumulator.summary();
|
|
292
|
+
};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Token accounting. A Lux run spends tokens in three places: the agent
|
|
5
|
+
* under test (the driver), the answerer playing the user, and the LLM
|
|
6
|
+
* judge grading the result. Only the first is the thing being measured —
|
|
7
|
+
* the other two are eval overhead — so usage is tracked per source and
|
|
8
|
+
* summed at the edges rather than pooled into one number.
|
|
9
|
+
*/
|
|
10
|
+
export const TokenUsageSchema = z.object({
|
|
11
|
+
input: z.number().int().nonnegative(),
|
|
12
|
+
output: z.number().int().nonnegative(),
|
|
13
|
+
/** Prompt tokens served from the cache. Billed, but far cheaper than `input`. */
|
|
14
|
+
cacheRead: z.number().int().nonnegative(),
|
|
15
|
+
/** Prompt tokens written to the cache on this call. */
|
|
16
|
+
cacheCreation: z.number().int().nonnegative(),
|
|
17
|
+
});
|
|
18
|
+
export type TokenUsage = z.infer<typeof TokenUsageSchema>;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* One API call's usage, tagged with what the agent did on it — a tool name,
|
|
22
|
+
* a snippet of its reply — so a per-turn breakdown reads as more than a number.
|
|
23
|
+
*/
|
|
24
|
+
export const TurnUsageSchema = TokenUsageSchema.extend({
|
|
25
|
+
label: z.exactOptional(z.string()),
|
|
26
|
+
});
|
|
27
|
+
export type TurnUsage = z.infer<typeof TurnUsageSchema>;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The vocabulary a turn label is built from: one glyph per facet an API call
|
|
31
|
+
* exercised. Kept beside the turn model — not in the driver that stamps them
|
|
32
|
+
* onto labels nor the reporter that documents them in its legend — so the two
|
|
33
|
+
* cannot drift out of agreement.
|
|
34
|
+
*/
|
|
35
|
+
export const TURN_GLYPHS = {
|
|
36
|
+
thinking: "✻",
|
|
37
|
+
ask: "?",
|
|
38
|
+
tool: "⚙",
|
|
39
|
+
reply: "¶",
|
|
40
|
+
} as const;
|
|
41
|
+
|
|
42
|
+
export const emptyUsage = (): TokenUsage => ({
|
|
43
|
+
input: 0,
|
|
44
|
+
output: 0,
|
|
45
|
+
cacheRead: 0,
|
|
46
|
+
cacheCreation: 0,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export const addUsage = (a: TokenUsage, b: TokenUsage): TokenUsage => ({
|
|
50
|
+
input: a.input + b.input,
|
|
51
|
+
output: a.output + b.output,
|
|
52
|
+
cacheRead: a.cacheRead + b.cacheRead,
|
|
53
|
+
cacheCreation: a.cacheCreation + b.cacheCreation,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export const sumUsage = (usages: readonly TokenUsage[]): TokenUsage =>
|
|
57
|
+
usages.reduce(addUsage, emptyUsage());
|
|
58
|
+
|
|
59
|
+
/** Every token the call touched, cached or not. */
|
|
60
|
+
export const totalTokens = (u: TokenUsage): number =>
|
|
61
|
+
u.input + u.output + u.cacheRead + u.cacheCreation;
|
|
62
|
+
|
|
63
|
+
export const isUsageEmpty = (u: TokenUsage): boolean => totalTokens(u) === 0;
|
|
64
|
+
|
|
65
|
+
/** Usage split by who spent it. `agent` is the subject; the rest is harness. */
|
|
66
|
+
export const RunUsageSchema = z.object({
|
|
67
|
+
agent: TokenUsageSchema,
|
|
68
|
+
answerer: TokenUsageSchema,
|
|
69
|
+
grading: TokenUsageSchema,
|
|
70
|
+
});
|
|
71
|
+
export type RunUsage = z.infer<typeof RunUsageSchema>;
|
|
72
|
+
|
|
73
|
+
export const emptyRunUsage = (): RunUsage => ({
|
|
74
|
+
agent: emptyUsage(),
|
|
75
|
+
answerer: emptyUsage(),
|
|
76
|
+
grading: emptyUsage(),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
/** What Lux spent to run the eval, as opposed to what the agent spent. */
|
|
80
|
+
export const harnessUsage = (u: RunUsage): TokenUsage => addUsage(u.answerer, u.grading);
|
|
81
|
+
|
|
82
|
+
// Token accounting must never be the reason a run fails to grade.
|
|
83
|
+
const AgentTokenCountSchema = z.number().int().nonnegative().catch(0);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The snake_case `usage` object the Claude CLI reports (on the
|
|
87
|
+
* `--output-format json` envelope, and on the final `result` line of a
|
|
88
|
+
* `stream-json` stream).
|
|
89
|
+
*/
|
|
90
|
+
const AgentUsageSchema = z
|
|
91
|
+
.object({
|
|
92
|
+
input_tokens: AgentTokenCountSchema,
|
|
93
|
+
output_tokens: AgentTokenCountSchema,
|
|
94
|
+
cache_read_input_tokens: AgentTokenCountSchema,
|
|
95
|
+
cache_creation_input_tokens: AgentTokenCountSchema,
|
|
96
|
+
})
|
|
97
|
+
.transform(
|
|
98
|
+
(usage): TokenUsage => ({
|
|
99
|
+
input: usage.input_tokens,
|
|
100
|
+
output: usage.output_tokens,
|
|
101
|
+
cacheRead: usage.cache_read_input_tokens,
|
|
102
|
+
cacheCreation: usage.cache_creation_input_tokens,
|
|
103
|
+
}),
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const AGENT_USAGE_KEYS = [
|
|
107
|
+
"input_tokens",
|
|
108
|
+
"output_tokens",
|
|
109
|
+
"cache_read_input_tokens",
|
|
110
|
+
"cache_creation_input_tokens",
|
|
111
|
+
] as const;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Returns null when the object is absent or carries none of the recognized
|
|
115
|
+
* usage keys, so a driver can distinguish "reported zero" from "reported
|
|
116
|
+
* nothing". A partial or malformed report still parses — unrecognized or
|
|
117
|
+
* missing counts read as 0, per `AgentTokenCountSchema`'s never-fail rule.
|
|
118
|
+
*/
|
|
119
|
+
export const parseAgentUsage = (raw: unknown): TokenUsage | null => {
|
|
120
|
+
if (typeof raw !== "object" || raw === null) return null;
|
|
121
|
+
if (!AGENT_USAGE_KEYS.some((key) => key in raw)) return null;
|
|
122
|
+
return AgentUsageSchema.safeParse(raw).data ?? null;
|
|
123
|
+
};
|
package/src/core/wire.ts
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import {
|
|
3
|
+
type Answer,
|
|
4
|
+
ApproveInterruptSchema,
|
|
5
|
+
AskInterruptSchema,
|
|
6
|
+
CustomInterruptSchema,
|
|
7
|
+
type Done,
|
|
8
|
+
type ErrorEvent,
|
|
9
|
+
ErrorEventReasonSchema,
|
|
10
|
+
type Interrupt,
|
|
11
|
+
type Progress,
|
|
12
|
+
ProgressSchema,
|
|
13
|
+
type ReadyState,
|
|
14
|
+
ReadyStateSchema,
|
|
15
|
+
} from "./events.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The `lux-jsonl` wire protocol. Drivers that talk to a subprocess agent
|
|
19
|
+
* over stdio (or any line-delimited transport) parse incoming lines with
|
|
20
|
+
* {@link parseWireEvent} and serialize outgoing answers with
|
|
21
|
+
* {@link formatWireAnswer}. Drivers that speak a foreign protocol can
|
|
22
|
+
* import {@link ParsedDriverEvent} and emit it directly.
|
|
23
|
+
*
|
|
24
|
+
* Each arm is the internal event schema plus a `type` discriminator. The wire
|
|
25
|
+
* is looser in two places — `progress.ts` and `error.exitReason` may be omitted
|
|
26
|
+
* — and those two `z.default()`s are the whole difference.
|
|
27
|
+
*/
|
|
28
|
+
const ReadyEventSchema = ReadyStateSchema.extend({ type: z.literal("ready") });
|
|
29
|
+
|
|
30
|
+
const InterruptEventSchema = z.discriminatedUnion("kind", [
|
|
31
|
+
AskInterruptSchema.extend({ type: z.literal("interrupt") }),
|
|
32
|
+
ApproveInterruptSchema.extend({ type: z.literal("interrupt") }),
|
|
33
|
+
CustomInterruptSchema.extend({ type: z.literal("interrupt") }),
|
|
34
|
+
]);
|
|
35
|
+
|
|
36
|
+
const ProgressEventSchema = ProgressSchema.extend({
|
|
37
|
+
type: z.literal("progress"),
|
|
38
|
+
ts: z.number().default(() => Date.now()),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const DoneEventSchema = z.object({
|
|
42
|
+
type: z.literal("done"),
|
|
43
|
+
summary: z.unknown().optional(),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const ErrorEventSchema = z.object({
|
|
47
|
+
type: z.literal("error"),
|
|
48
|
+
exitReason: ErrorEventReasonSchema.default("error"),
|
|
49
|
+
reason: z.string(),
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
export const WireEventSchema = z.discriminatedUnion("type", [
|
|
53
|
+
ReadyEventSchema,
|
|
54
|
+
InterruptEventSchema,
|
|
55
|
+
ProgressEventSchema,
|
|
56
|
+
DoneEventSchema,
|
|
57
|
+
ErrorEventSchema,
|
|
58
|
+
]);
|
|
59
|
+
|
|
60
|
+
export type WireEvent = z.infer<typeof WireEventSchema>;
|
|
61
|
+
|
|
62
|
+
export type ParsedDriverEvent =
|
|
63
|
+
| { tag: "ready"; ready: ReadyState }
|
|
64
|
+
| { tag: "interrupt"; interrupt: Interrupt }
|
|
65
|
+
| { tag: "progress"; progress: Progress }
|
|
66
|
+
| { tag: "done"; done: Done }
|
|
67
|
+
| { tag: "error"; error: ErrorEvent };
|
|
68
|
+
|
|
69
|
+
// Rebuilding (never re-parsing) drops the wire's `type` key; a re-parse
|
|
70
|
+
// against an internal schema would start throwing if that schema gained a
|
|
71
|
+
// required field the wire arm defaults.
|
|
72
|
+
const wireEventToParsed = (event: WireEvent): ParsedDriverEvent => {
|
|
73
|
+
if (event.type === "ready") {
|
|
74
|
+
const { type: _type, ...ready } = event;
|
|
75
|
+
return { tag: "ready", ready };
|
|
76
|
+
}
|
|
77
|
+
if (event.type === "interrupt") {
|
|
78
|
+
const { type: _type, ...interrupt } = event;
|
|
79
|
+
return { tag: "interrupt", interrupt };
|
|
80
|
+
}
|
|
81
|
+
if (event.type === "progress") {
|
|
82
|
+
const { type: _type, ...progress } = event;
|
|
83
|
+
return { tag: "progress", progress };
|
|
84
|
+
}
|
|
85
|
+
if (event.type === "done") {
|
|
86
|
+
return { tag: "done", done: { exitReason: "done", summary: event.summary } };
|
|
87
|
+
}
|
|
88
|
+
return { tag: "error", error: { exitReason: event.exitReason, reason: event.reason } };
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Parse a single line from a `lux-jsonl` agent. Returns null for empty
|
|
93
|
+
* lines, malformed JSON, or events that don't match the wire schema.
|
|
94
|
+
* Validation failures are silent by design — drivers may interleave
|
|
95
|
+
* non-protocol log lines on stdout.
|
|
96
|
+
*/
|
|
97
|
+
export const parseWireEvent = (line: string): ParsedDriverEvent | null => {
|
|
98
|
+
const trimmed = line.trim();
|
|
99
|
+
if (!trimmed) return null;
|
|
100
|
+
let raw: unknown;
|
|
101
|
+
try {
|
|
102
|
+
raw = JSON.parse(trimmed);
|
|
103
|
+
} catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const parsed = WireEventSchema.safeParse(raw);
|
|
107
|
+
if (!parsed.success) return null;
|
|
108
|
+
return wireEventToParsed(parsed.data);
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Serialize an Answer to a `lux-jsonl` line (newline-terminated). The
|
|
113
|
+
* inverse of an agent reading its stdin and dispatching to whatever
|
|
114
|
+
* pending interrupt the answer is for.
|
|
115
|
+
*/
|
|
116
|
+
export const formatWireAnswer = (answer: Answer): string => {
|
|
117
|
+
let message: Record<string, unknown>;
|
|
118
|
+
if (answer.kind === "ask") {
|
|
119
|
+
message = { type: "answer", id: answer.id, text: answer.text };
|
|
120
|
+
} else if (answer.kind === "approve") {
|
|
121
|
+
message = { type: answer.approved ? "approve" : "deny", id: answer.id, reason: answer.reason };
|
|
122
|
+
} else {
|
|
123
|
+
message = { type: "customToolResponse", id: answer.id, payload: answer.payload };
|
|
124
|
+
}
|
|
125
|
+
return `${JSON.stringify(message)}\n`;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Parse one stdout line into zero, one, or many Lux driver events. A single
|
|
130
|
+
* line can carry multiple events — e.g. a Claude Code assistant message with
|
|
131
|
+
* a text block followed by a tool_use block — so returning an array lets a
|
|
132
|
+
* driver surface all of them rather than dropping every block after the first.
|
|
133
|
+
*/
|
|
134
|
+
export type ParseEventFn = (line: string) => ParsedDriverEvent | ParsedDriverEvent[] | null;
|
|
135
|
+
export type FormatAnswerFn = (answer: Answer) => string;
|
package/src/core/zod.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Render a failed parse's issues as one `path: message; path: message` line.
|
|
5
|
+
* The one place that decides how Lux surfaces schema errors, so every
|
|
6
|
+
* `Invalid …: <issues>` message the loaders and validators throw reads the
|
|
7
|
+
* same. `<root>` stands in for an issue at the top level (empty path).
|
|
8
|
+
*/
|
|
9
|
+
export const formatZodIssues = (error: z.ZodError): string =>
|
|
10
|
+
error.issues.map((i) => `${i.path.join(".") || "<root>"}: ${i.message}`).join("; ");
|
|
11
|
+
|
|
12
|
+
// `JSON.parse` that yields `undefined` instead of throwing, so malformed and
|
|
13
|
+
// off-schema text both fail as one `safeParse` of `undefined`.
|
|
14
|
+
export const tryParseJson = (text: string): unknown => {
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(text);
|
|
17
|
+
} catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
};
|