humanish 0.108.0 → 0.109.0
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/ARCHITECTURE.md +58 -59
- package/CHANGELOG.md +13 -0
- package/CONTEXT.md +44 -44
- package/README.md +3 -3
- package/TELEMETRY.md +2 -2
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/restricted-participant.js +12 -12
- package/dist/actors/codex/restricted-session.d.ts +2 -2
- package/dist/actors/computer-use/actor.d.ts +6 -6
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +2 -2
- package/dist/actors/computer-use/admission-limit.js +3 -3
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.js +5 -5
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +1 -1
- package/dist/actors/computer-use/loop/ending.js +12 -11
- package/dist/actors/computer-use/loop/observation.js +6 -5
- package/dist/actors/computer-use/loop/provider-call.js +11 -11
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +2 -2
- package/dist/actors/computer-use/loop/trace.js +3 -2
- package/dist/actors/computer-use/loop/types.d.ts +24 -24
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-provider.d.ts +2 -2
- package/dist/actors/computer-use/openai-provider.js +8 -8
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +4 -4
- package/dist/actors/contract.js +1 -1
- package/dist/actors/local-agent/claude-session.js +3 -3
- package/dist/actors/local-agent/cli.d.ts +1 -1
- package/dist/actors/local-agent/cli.js +1 -1
- package/dist/actors/reasoning-effort.js +3 -3
- package/dist/actors/registry.d.ts +2 -2
- package/dist/actors/registry.js +3 -3
- package/dist/actors/scripted-browser/actor.d.ts +2 -2
- package/dist/actors/scripted-browser/actor.js +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/comms.js +14 -22
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +0 -15
- package/dist/cli/commands/run-command.d.ts +2 -2
- package/dist/cli/commands/run-command.js +3 -3
- package/dist/cli/commands/runs.js +3 -5
- package/dist/cli/commands/setup.js +5 -7
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
- package/dist/cli/commands/study.js +13 -49
- package/dist/cli/commands/tui.js +12 -12
- package/dist/cli/commands/watch.js +30 -65
- package/dist/cli/deprecations.d.ts +1 -13
- package/dist/cli/deprecations.js +0 -30
- package/dist/cli/doctor.d.ts +3 -3
- package/dist/cli/doctor.js +16 -16
- package/dist/cli/first-run-path.d.ts +4 -4
- package/dist/cli/first-run-path.js +7 -7
- package/dist/cli/io.d.ts +3 -3
- package/dist/cli/io.js +2 -2
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +2 -2
- package/dist/cli/orientation.d.ts +4 -4
- package/dist/cli/orientation.js +58 -20
- package/dist/cli/program.js +3 -4
- package/dist/cli/telemetry.d.ts +1 -1
- package/dist/cli/telemetry.js +14 -20
- package/dist/comms/catch-host.d.ts +1 -1
- package/dist/comms/catch-host.js +3 -3
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +4 -3
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch.d.ts +2 -2
- package/dist/comms/sandbox-catch.js +2 -2
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +29 -32
- package/dist/feedback/draft.js +2 -2
- package/dist/feedback/export.js +3 -2
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +17 -17
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +5 -5
- package/dist/index.d.ts +13 -15
- package/dist/index.js +6 -8
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +1 -1
- package/dist/observer/data.d.ts +1 -1
- package/dist/observer/library.d.ts +2 -0
- package/dist/observer/library.js +4 -1
- package/dist/observer/render.js +7 -1
- package/dist/observer/run-routes.d.ts +1 -0
- package/dist/observer/run-routes.js +37 -12
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer-app.html +1 -1
- package/dist/routes/computer-use/bundle-parts.js +3 -2
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +7 -6
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
- package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
- package/dist/routes/computer-use/external-comms.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +11 -10
- package/dist/routes/computer-use/fanout-records.js +2 -2
- package/dist/routes/computer-use/live-flush.d.ts +3 -3
- package/dist/routes/computer-use/live-phase.d.ts +2 -3
- package/dist/routes/computer-use/live-phase.js +3 -3
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +2 -2
- package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
- package/dist/routes/computer-use/participant-desktop.js +1 -1
- package/dist/routes/computer-use/participant-execution.js +1 -1
- package/dist/routes/computer-use/participant-model.js +3 -3
- package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
- package/dist/routes/computer-use/participant-prompt.js +3 -3
- package/dist/routes/computer-use/participant-runs.d.ts +10 -10
- package/dist/routes/computer-use/participant-runs.js +14 -13
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +24 -24
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +5 -5
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +3 -2
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +13 -12
- package/dist/routes/computer-use/route.d.ts +12 -12
- package/dist/routes/computer-use/route.js +19 -19
- package/dist/routes/computer-use/self-report.js +1 -1
- package/dist/routes/computer-use/setup.d.ts +22 -22
- package/dist/routes/computer-use/setup.js +15 -15
- package/dist/routes/computer-use/single-bundle.d.ts +4 -4
- package/dist/routes/computer-use/single-bundle.js +14 -13
- package/dist/routes/computer-use/subject-projection.d.ts +3 -3
- package/dist/routes/computer-use/types.d.ts +34 -34
- package/dist/routes/computer-use/types.js +3 -3
- package/dist/routes/preview.d.ts +6 -6
- package/dist/routes/preview.js +5 -5
- package/dist/routes/scripted/bundle.d.ts +6 -6
- package/dist/routes/scripted/bundle.js +10 -9
- package/dist/routes/scripted/plan.d.ts +7 -7
- package/dist/routes/scripted/plan.js +6 -6
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +9 -9
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +11 -11
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +4 -4
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +3 -3
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +2 -2
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +17 -17
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +3 -3
- package/dist/routes/shared-world/bundle.js +15 -14
- package/dist/routes/shared-world/checkpoints.d.ts +3 -3
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +9 -9
- package/dist/routes/shared-world/comms.js +6 -5
- package/dist/routes/shared-world/participant-specs.d.ts +3 -3
- package/dist/routes/shared-world/participant-specs.js +7 -7
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +9 -9
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +4 -4
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +11 -10
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +19 -19
- package/dist/routes/shared-world/setup.d.ts +13 -13
- package/dist/routes/shared-world/setup.js +19 -19
- package/dist/routes/shared-world/types.d.ts +27 -27
- package/dist/routes/terminal/adapter.d.ts +2 -2
- package/dist/routes/terminal/adapter.js +4 -4
- package/dist/routes/terminal/bundle.d.ts +11 -11
- package/dist/routes/terminal/bundle.js +12 -12
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +5 -5
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +9 -9
- package/dist/routes/terminal/ledger.d.ts +2 -2
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +7 -7
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +3 -2
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +2 -2
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +5 -5
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +7 -7
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +14 -14
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +7 -7
- package/dist/routes/terminal/trace.d.ts +2 -2
- package/dist/routes/terminal/types.d.ts +24 -24
- package/dist/routes/terminal/types.js +2 -2
- package/dist/run/bundle.d.ts +7 -7
- package/dist/run/bundle.js +2 -2
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +72 -43
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +2 -2
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.js +2 -2
- package/dist/run/projection.d.ts +32 -32
- package/dist/run/projection.js +44 -44
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +1 -1
- package/dist/run/results.d.ts +2 -2
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +11 -1
- package/dist/run/run-index.js +63 -49
- package/dist/run/run.d.ts +3 -3
- package/dist/run/run.js +2 -2
- package/dist/run/shared-world-evidence.d.ts +1 -1
- package/dist/run/shared-world-shape.js +1 -1
- package/dist/run/stats.d.ts +3 -3
- package/dist/run/stats.js +14 -14
- package/dist/run/status.d.ts +10 -2
- package/dist/run/status.js +6 -3
- package/dist/run/streams.d.ts +2 -2
- package/dist/run/study-provenance.d.ts +4 -2
- package/dist/run/study-provenance.js +7 -4
- package/dist/run/study-result.d.ts +0 -5
- package/dist/run/study-result.js +1 -1
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -45
- package/dist/{lab → study}/adapter-extension.d.ts +8 -20
- package/dist/{lab → study}/adapter-extension.js +2 -14
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
- package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +12 -12
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +37 -20
- package/dist/study/convert.d.ts +1 -1
- package/dist/study/convert.js +15 -15
- package/dist/{lab → study}/device-presets.d.ts +2 -2
- package/dist/{lab → study}/discover.d.ts +29 -23
- package/dist/{lab → study}/discover.js +97 -118
- package/dist/{lab → study}/doctor.d.ts +11 -11
- package/dist/{lab → study}/doctor.js +18 -18
- package/dist/study/files.d.ts +2 -2
- package/dist/study/files.js +6 -5
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/{lab → study}/init-templates.js +16 -11
- package/dist/{lab → study}/init.d.ts +1 -1
- package/dist/{lab → study}/init.js +7 -4
- package/dist/{lab → study}/keys.d.ts +2 -2
- package/dist/{lab → study}/keys.js +10 -10
- package/dist/study/migrate.d.ts +1 -1
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +5 -5
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
- package/dist/{lab → study}/parse/study-v3.js +3 -3
- package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
- package/dist/{lab → study}/parse/subject-state.js +4 -4
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +8 -8
- package/dist/{lab → study}/parse/values.d.ts +2 -2
- package/dist/{lab → study}/persona-resolve.d.ts +4 -4
- package/dist/{lab → study}/persona-resolve.js +2 -2
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +10 -10
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +28 -28
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/{lab → study}/plan.js +20 -20
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +9 -8
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +3 -3
- package/dist/{lab → study}/preflight.d.ts +31 -31
- package/dist/{lab → study}/preflight.js +8 -8
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +12 -12
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -3
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
- package/dist/study/run-study-homes.js +3 -0
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +13 -12
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +10 -10
- package/dist/{lab → study}/summary.js +15 -15
- package/dist/{lab → study}/tasks.d.ts +3 -3
- package/dist/{lab → study}/tasks.js +1 -1
- package/dist/{lab → study}/types.d.ts +104 -104
- package/dist/{lab → study}/types.js +1 -1
- package/dist/{lab → study}/validation.d.ts +19 -19
- package/dist/{lab → study}/validation.js +13 -13
- package/dist/{lab → study}/warnings.d.ts +4 -4
- package/dist/{lab → study}/warnings.js +1 -1
- package/dist/subject/clone.d.ts +6 -6
- package/dist/subject/clone.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +3 -3
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/runtime.js +2 -2
- package/dist/subject/serve.d.ts +4 -4
- package/dist/subject/state.d.ts +3 -3
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +1 -1
- package/dist/subject/steps.js +1 -1
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +1 -1
- package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
- package/dist/substrates/e2b/desktop-browser.js +1 -1
- package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
- package/dist/substrates/e2b/desktop-cdp.js +1 -1
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +12 -12
- package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
- package/dist/substrates/e2b/desktop-geometry.js +1 -1
- package/dist/substrates/e2b/desktop-media.d.ts +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +3 -3
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +1 -1
- package/dist/substrates/e2b/sdk.js +1 -1
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/contract.d.ts +8 -8
- package/dist/tui/contract.js +2 -2
- package/dist/tui/launch.d.ts +3 -3
- package/dist/tui/launch.js +22 -16
- package/dist/tui-app.js +139 -139
- package/dist/verify/subject.d.ts +1 -1
- package/dist/verify/subject.js +1 -1
- package/dist/verify/verify.js +2 -1
- package/docs/architecture/actor-contract.md +5 -5
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/external-public-shared-world.md +8 -7
- package/docs/architecture/github-feedback-loop.md +1 -1
- package/docs/architecture/task-protocol-support.md +1 -1
- package/docs/architecture/terminal-product-route.md +18 -18
- package/docs/contracts/adapter-fixtures.md +2 -2
- package/docs/contracts/errors.md +8 -8
- package/docs/contracts/run-bundle.md +1 -4
- package/docs/contracts/schemas.md +61 -42
- package/docs/contracts/study-analysis.md +4 -1
- package/docs/contracts/study-costs.md +17 -2
- package/examples/README.md +1 -1
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +1 -1
- package/skills/humanish/SKILL.md +8 -6
- package/skills/humanish/agents/openai.yaml +1 -1
- package/dist/cli/commands/lab-format.d.ts +0 -9
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/deprecated-fields.d.ts +0 -10
- package/dist/lab/deprecated-fields.js +0 -24
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/plan.d.ts +0 -13
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -8
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-homes.js +0 -7
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/library-aliases.d.ts +0 -56
- package/dist/library-aliases.js +0 -22
- package/dist/run-lab.d.ts +0 -112
- /package/dist/{lab → study}/device-presets.js +0 -0
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/parse/comms.js +0 -0
- /package/dist/{lab → study}/parse/execution.js +0 -0
- /package/dist/{lab → study}/parse/values.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
- /package/dist/{lab → study}/routing.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// The computer-use
|
|
2
|
-
//
|
|
1
|
+
// The computer-use route: a subject (an app-url the caller provisioned, or a repo the
|
|
2
|
+
// humanish clones and serves in the sandbox) driven by a registry-resolved computer-use actor inside a
|
|
3
3
|
// hosted E2B desktop. On this path `actors[].type` selects the actor: the
|
|
4
|
-
// descriptor returned by the registry runs the session; the
|
|
4
|
+
// descriptor returned by the registry runs the session; the route provisions the desktop and
|
|
5
5
|
// subject, composes the prompt from config, persists the evidence bundle, and tears down.
|
|
6
6
|
//
|
|
7
7
|
// Substrate notes:
|
|
@@ -26,24 +26,24 @@ import path from "node:path";
|
|
|
26
26
|
import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
|
|
27
27
|
import { runScope } from "../../run/run.js";
|
|
28
28
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
29
|
-
import { browserRouteScorer } from "../../
|
|
30
|
-
import { withLateScorer } from "../../
|
|
31
|
-
import { callerDrivingOf,
|
|
29
|
+
import { browserRouteScorer } from "../../study/adapter-scorer-loader.js";
|
|
30
|
+
import { withLateScorer } from "../../study/route-inputs.js";
|
|
31
|
+
import { callerDrivingOf, planComputerUseStudy } from "./plan.js";
|
|
32
32
|
import { finishCuaRun } from "./result.js";
|
|
33
|
-
import {
|
|
34
|
-
import { admitCuaRun,
|
|
33
|
+
import { runStudyParticipants } from "./live-phase.js";
|
|
34
|
+
import { admitCuaRun, refuseCuaStudy, startCuaRun } from "./setup.js";
|
|
35
35
|
import {} from "./types.js";
|
|
36
36
|
import { studyResultIdentity } from "../../run/study-result.js";
|
|
37
37
|
/**
|
|
38
|
-
* Plans and runs a computer-use
|
|
39
|
-
* it. It plans the config with
|
|
38
|
+
* Plans and runs a computer-use study in one call. It is not exported from src/index.ts; tests call
|
|
39
|
+
* it. It plans the config with planComputerUseStudy and runs
|
|
40
40
|
* the plan with runComputerUsePlan, whose run scope and withTransientCommsSecrets wrapper cover the
|
|
41
41
|
* run and its analysis.
|
|
42
42
|
*/
|
|
43
|
-
export async function
|
|
43
|
+
export async function runCuaActorStudy(options) {
|
|
44
44
|
const { config, dryRun, ...input } = options;
|
|
45
|
-
//
|
|
46
|
-
const planned =
|
|
45
|
+
// planComputerUseStudy makes every configuration refusal, in the order this route always has.
|
|
46
|
+
const planned = planComputerUseStudy(config, {
|
|
47
47
|
dryRun,
|
|
48
48
|
hasRunSession: input.deps?.runSession !== undefined,
|
|
49
49
|
driving: callerDrivingOf(input),
|
|
@@ -52,14 +52,14 @@ export async function runCuaActorLab(options) {
|
|
|
52
52
|
});
|
|
53
53
|
if (planned.ok)
|
|
54
54
|
return runComputerUsePlan(planned.plan, input, config);
|
|
55
|
-
return
|
|
55
|
+
return computerUseStudyRefusal(options, planned.refusal);
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
|
-
* A refused computer-use
|
|
58
|
+
* A refused computer-use study's result, at the refusal's stage: a before-scope refusal has its own
|
|
59
59
|
* envelope and no analysis record; the others come after the cwd checks, and the participant cap after
|
|
60
60
|
* the personas are read.
|
|
61
61
|
*/
|
|
62
|
-
export async function
|
|
62
|
+
export async function computerUseStudyRefusal(options, refusal) {
|
|
63
63
|
const { config, dryRun } = options;
|
|
64
64
|
if (refusal.stage === "before-scope")
|
|
65
65
|
return {
|
|
@@ -76,10 +76,10 @@ export async function computerUseLabRefusal(options, refusal) {
|
|
|
76
76
|
};
|
|
77
77
|
// The other refusals come after the cwd checks, and the participant cap after the personas are read.
|
|
78
78
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
79
|
-
return completeAutomaticAnalysis(await
|
|
79
|
+
return completeAutomaticAnalysis(await refuseCuaStudy(options, refusal), undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
82
|
-
*
|
|
82
|
+
* runStudyWith's step for a computer-use plan. It runs the plan's local checks (admitCuaRun: the
|
|
83
83
|
* participants, the preflight plan, the keys, the local agent, subject env and caps, and the
|
|
84
84
|
* local-tree archive) before any run scope opens, so the CLI can present their refusal before it
|
|
85
85
|
* loads a declared scorer, and returns the run that continues from them with that scorer.
|
|
@@ -141,7 +141,7 @@ async function runPlanInScope(plan, input, admitted, scope) {
|
|
|
141
141
|
const prepared = await startCuaRun(plan, input, admitted, scope);
|
|
142
142
|
if (!prepared.ok)
|
|
143
143
|
return prepared.result;
|
|
144
|
-
const ran = await
|
|
144
|
+
const ran = await runStudyParticipants(prepared.setup, prepared.participants);
|
|
145
145
|
if (!ran.ok)
|
|
146
146
|
return ran.result;
|
|
147
147
|
return finishCuaRun(prepared.setup, prepared.finish, ran);
|
|
@@ -125,7 +125,7 @@ function stripNegatedNonBlockerPhrases(text) {
|
|
|
125
125
|
.replace(/\bno\s+(?:real\s+|remaining\s+|actual\s+)?(?:blocker|blockers|blocking issue|blocking issues|error|errors|failure|failures)\s+(?:was\s+|were\s+)?(?:encountered|observed|found|hit|seen|reported|detected)\b/g, "")
|
|
126
126
|
.replace(/\bwithout\s+(?:a\s+|any\s+)?(?:real\s+|remaining\s+|actual\s+)?(?:blocker|blockers|blocking issue|blocking issues|error|errors|failure|failures)\b/g, "")
|
|
127
127
|
.replace(/\bnot\s+(?:blocked|a blocker|an error|failed)\b/g, "")
|
|
128
|
-
// "No functional failures blocked me" downgraded a clean passing run to a
|
|
128
|
+
// "No functional failures blocked me" downgraded a clean passing run to a run failure on
|
|
129
129
|
// 2026-09-01. The adjective list above is closed (real|remaining|actual), so an ordinary
|
|
130
130
|
// qualifier like "functional" slipped through and the trailing verb "blocked" tripped the
|
|
131
131
|
// scan. Allow up to two intervening words, and cover the verb form directly.
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import { type RunScope } from "../../run/run.js";
|
|
2
2
|
import type { CuaActorDescriptor } from "../../actors/registry.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { StudyCommsEmail, StudyCommsExternal, StudyConfig } from "../../study/types.js";
|
|
4
4
|
import { type RunRerunLineage } from "../../run/bundle.js";
|
|
5
5
|
import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
6
6
|
import { type ComputerUseRefusal } from "./plan.js";
|
|
7
|
-
import type { ComputerUsePlan } from "../../
|
|
7
|
+
import type { ComputerUsePlan } from "../../study/plan-types.js";
|
|
8
8
|
import { trackRuntimeStreams, type LiveTraceFlush } from "./live-flush.js";
|
|
9
9
|
import { type CuaRunBundleBase } from "./bundle.js";
|
|
10
10
|
import { projectParticipantSubjects } from "./subject-projection.js";
|
|
11
|
-
import { type
|
|
11
|
+
import { type CuaActorStudyErrorCode, type CuaActorStudyResult, type CuaParticipantDeps, type CuaParticipantPlan, type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ComputerUseRunInput, type RunCuaActorStudyOptions } from "./types.js";
|
|
12
12
|
/**
|
|
13
13
|
* The envelope of a refusal the plan left for after the cwd checks. The participant cap and
|
|
14
14
|
* in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
|
|
15
15
|
*/
|
|
16
|
-
export declare function
|
|
16
|
+
export declare function refuseCuaStudy(options: RunCuaActorStudyOptions, refusal: ComputerUseRefusal): Promise<CuaActorStudyResult>;
|
|
17
17
|
export type AdmittedCuaRun = Extract<Awaited<ReturnType<typeof admitCuaRun>>, {
|
|
18
18
|
ok: true;
|
|
19
19
|
}>["admitted"];
|
|
20
20
|
type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
|
|
21
21
|
ok: true;
|
|
22
22
|
}>["run"];
|
|
23
|
-
/** What
|
|
23
|
+
/** What runStudyParticipants and finishCuaRun both read. */
|
|
24
24
|
export interface CuaRunSetup {
|
|
25
25
|
plan: ComputerUsePlan;
|
|
26
26
|
input: ComputerUseRunInput;
|
|
@@ -34,22 +34,22 @@ export interface CuaRunSetup {
|
|
|
34
34
|
scrubKnownValues: (text: string) => string;
|
|
35
35
|
bundleBase: CuaRunBundleBase;
|
|
36
36
|
}
|
|
37
|
-
/** What only
|
|
37
|
+
/** What only runStudyParticipants reads. */
|
|
38
38
|
export interface CuaParticipantsSetup {
|
|
39
39
|
env: Record<string, string | undefined>;
|
|
40
40
|
/** The array scrubKnownValues reads at each call. Email receiving appends the values it
|
|
41
41
|
* provisions before the participants run. */
|
|
42
42
|
knownSecretValues: string[];
|
|
43
43
|
deps: Omit<CuaParticipantDeps, "signalProvisioned">;
|
|
44
|
-
/** Filled by
|
|
44
|
+
/** Filled by runStudyParticipants on a live run; deps.onTrace reads it. */
|
|
45
45
|
liveTrace: {
|
|
46
46
|
flush?: LiveTraceFlush["flush"];
|
|
47
47
|
stop?: LiveTraceFlush["stop"];
|
|
48
48
|
};
|
|
49
49
|
/** The operator-hosted inbox on the app-url route, when declared. */
|
|
50
50
|
externalComms: {
|
|
51
|
-
config:
|
|
52
|
-
email:
|
|
51
|
+
config: StudyCommsExternal;
|
|
52
|
+
email: StudyCommsEmail;
|
|
53
53
|
} | undefined;
|
|
54
54
|
/** The subjects of the in-progress bundle, written before any participant starts. */
|
|
55
55
|
inProgress: {
|
|
@@ -58,7 +58,7 @@ export interface CuaParticipantsSetup {
|
|
|
58
58
|
provenance: CuaSubjectProvenanceArg | undefined;
|
|
59
59
|
};
|
|
60
60
|
/** The refusal envelope, for a run that stops before its bundle. */
|
|
61
|
-
fail: (code:
|
|
61
|
+
fail: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string) => CuaActorStudyResult;
|
|
62
62
|
}
|
|
63
63
|
/** What only finishCuaRun reads besides the participants' outcomes. */
|
|
64
64
|
export interface CuaFinishFacts {
|
|
@@ -68,7 +68,7 @@ export interface CuaFinishFacts {
|
|
|
68
68
|
}
|
|
69
69
|
type PreparedCuaRun = {
|
|
70
70
|
ok: false;
|
|
71
|
-
result:
|
|
71
|
+
result: CuaActorStudyResult;
|
|
72
72
|
} | {
|
|
73
73
|
ok: true;
|
|
74
74
|
setup: CuaRunSetup;
|
|
@@ -78,21 +78,21 @@ type PreparedCuaRun = {
|
|
|
78
78
|
/**
|
|
79
79
|
* Everything before the run starts: the physical project, the route, the participant plan and
|
|
80
80
|
* preflight, the key and subject-env scrubber, the live checks that need no sandbox, and the
|
|
81
|
-
* local-tree archive. These read files, env and the network, which
|
|
81
|
+
* local-tree archive. These read files, env and the network, which planStudy does not. Returns the
|
|
82
82
|
* refusal, or what startCuaRun reads.
|
|
83
83
|
*/
|
|
84
|
-
export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRunInput, config:
|
|
84
|
+
export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRunInput, config: StudyConfig): Promise<{
|
|
85
85
|
ok: false;
|
|
86
|
-
result:
|
|
86
|
+
result: CuaActorStudyResult;
|
|
87
87
|
} | {
|
|
88
88
|
ok: true;
|
|
89
89
|
admitted: {
|
|
90
|
-
config:
|
|
90
|
+
config: StudyConfig;
|
|
91
91
|
dryRun: boolean;
|
|
92
92
|
cwd: string;
|
|
93
|
-
seams: import("../../
|
|
93
|
+
seams: import("../../study/study-deps.js").StudyDeps;
|
|
94
94
|
streams: {
|
|
95
|
-
onStream: NonNullable<import("../../
|
|
95
|
+
onStream: NonNullable<import("../../study/run-study-homes.js").RunStudyHomes["onStream"]>;
|
|
96
96
|
showIn: (observer: import("../../index.js").ObserverResult & {
|
|
97
97
|
ok: true;
|
|
98
98
|
}) => void;
|
|
@@ -100,15 +100,15 @@ export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRun
|
|
|
100
100
|
};
|
|
101
101
|
env: Record<string, string | undefined>;
|
|
102
102
|
appUrl: string;
|
|
103
|
-
fail: (code:
|
|
104
|
-
refuse: (code:
|
|
103
|
+
fail: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string) => CuaActorStudyResult;
|
|
104
|
+
refuse: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string | undefined) => {
|
|
105
105
|
ok: false;
|
|
106
|
-
result:
|
|
106
|
+
result: CuaActorStudyResult;
|
|
107
107
|
};
|
|
108
108
|
descriptor: CuaActorDescriptor;
|
|
109
109
|
runSession: (options: import("../../actors/computer-use/actor.js").CuaActorSessionOptions) => Promise<import("../../index.js").ComputerUseLoopResult>;
|
|
110
|
-
externalCommsConfig:
|
|
111
|
-
externalCommsEmail:
|
|
110
|
+
externalCommsConfig: StudyCommsExternal | undefined;
|
|
111
|
+
externalCommsEmail: StudyCommsEmail | undefined;
|
|
112
112
|
participantRuns: DesktopParticipantRun[];
|
|
113
113
|
participantPlan: CuaParticipantPlan;
|
|
114
114
|
rerunLineage: RunRerunLineage | undefined;
|
|
@@ -17,13 +17,13 @@ import { e2bRequestTimeoutMs } from "../../substrates/e2b/lifetime.js";
|
|
|
17
17
|
import { liveCuaRejection } from "./preflight.js";
|
|
18
18
|
import { cuaDescriptorOf, declaredAppUrl, plannedAppUrl } from "./plan.js";
|
|
19
19
|
import { trackRuntimeStreams } from "./live-flush.js";
|
|
20
|
-
import { phaseEvent, planEvent } from "../../
|
|
20
|
+
import { phaseEvent, planEvent } from "../../study/run-study-events.js";
|
|
21
21
|
import { defaultSubjectPhaseSink } from "../../subject/steps.js";
|
|
22
22
|
import {} from "./bundle.js";
|
|
23
23
|
import { packRunLocalTree } from "./local-tree-pack.js";
|
|
24
24
|
import { projectParticipantSubjects, subjectProvenanceArg } from "./subject-projection.js";
|
|
25
25
|
import { participantSubjectEnv, } from "./types.js";
|
|
26
|
-
import {
|
|
26
|
+
import { studyPersonaIds } from "../../study/persona-resolve.js";
|
|
27
27
|
import { studyResultIdentity } from "../../run/study-result.js";
|
|
28
28
|
/** The physical project, bound before any caller hook runs. */
|
|
29
29
|
async function bindProject(cwd) {
|
|
@@ -37,12 +37,12 @@ async function bindProject(cwd) {
|
|
|
37
37
|
* The envelope of a refusal the plan left for after the cwd checks. The participant cap and
|
|
38
38
|
* in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
|
|
39
39
|
*/
|
|
40
|
-
export async function
|
|
40
|
+
export async function refuseCuaStudy(options, refusal) {
|
|
41
41
|
const { config, dryRun } = options;
|
|
42
42
|
const projectRoot = await bindProject(options.cwd);
|
|
43
43
|
// The committed personas are read before the refusal returns, so a persona-file error wins.
|
|
44
44
|
if (refusal.stage === "after-personas")
|
|
45
|
-
await compileParticipantPersonas(projectRoot,
|
|
45
|
+
await compileParticipantPersonas(projectRoot, studyPersonaIds(config));
|
|
46
46
|
return {
|
|
47
47
|
...studyResultIdentity("computer-use", config.id),
|
|
48
48
|
ok: false,
|
|
@@ -59,7 +59,7 @@ export async function refuseCuaLab(options, refusal) {
|
|
|
59
59
|
/**
|
|
60
60
|
* Everything before the run starts: the physical project, the route, the participant plan and
|
|
61
61
|
* preflight, the key and subject-env scrubber, the live checks that need no sandbox, and the
|
|
62
|
-
* local-tree archive. These read files, env and the network, which
|
|
62
|
+
* local-tree archive. These read files, env and the network, which planStudy does not. Returns the
|
|
63
63
|
* refusal, or what startCuaRun reads.
|
|
64
64
|
*/
|
|
65
65
|
export async function admitCuaRun(plan, input, config) {
|
|
@@ -74,7 +74,7 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
74
74
|
const appUrl = plannedAppUrl(subject);
|
|
75
75
|
const subjectEnvNames = [...participantSubjectEnv(subject)];
|
|
76
76
|
const fail = (code, message, actorLabel) => ({
|
|
77
|
-
...studyResultIdentity("computer-use", plan.
|
|
77
|
+
...studyResultIdentity("computer-use", plan.studyId),
|
|
78
78
|
ok: false,
|
|
79
79
|
cwd,
|
|
80
80
|
actor: actorLabel ?? plan.actor,
|
|
@@ -89,13 +89,13 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
89
89
|
ok: false,
|
|
90
90
|
result: fail(...args),
|
|
91
91
|
});
|
|
92
|
-
//
|
|
93
|
-
// an in-process executor on the same
|
|
92
|
+
// runStudyWith's local VM study supplies a local-target app-url study's desktop; a direct route call or
|
|
93
|
+
// an in-process executor on the same study has none. It reads the declared source, as the planner
|
|
94
94
|
// did: a library config the parser never saw can plan to an app-url subject from another source.
|
|
95
95
|
if (config.subject.source === "app-url" &&
|
|
96
96
|
config.execution?.target === "local" &&
|
|
97
97
|
input.localVm === undefined)
|
|
98
|
-
return refuse("HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING", "An app-url
|
|
98
|
+
return refuse("HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING", "An app-url study with execution.target: local needs a local desktop. runStudy starts one; a direct route call or an in-process executor does not.");
|
|
99
99
|
const descriptor = cuaDescriptorOf(plan.actor);
|
|
100
100
|
const baseRunSession = seams.runSession ?? descriptor.runSession;
|
|
101
101
|
// A local VM study's sessions abort on its signal.
|
|
@@ -123,7 +123,7 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
123
123
|
// every N; the stderr table prints for fan-out (N>1) so single-participant runs stay as quiet as they
|
|
124
124
|
// always were.
|
|
125
125
|
if (participantCount > 1) {
|
|
126
|
-
emitPreflightPlan(participantPlan, plan.
|
|
126
|
+
emitPreflightPlan(participantPlan, plan.studyId);
|
|
127
127
|
}
|
|
128
128
|
input.emit?.(planEvent(participantPlan));
|
|
129
129
|
await assertPreparedSelectedOutputDirectory(projectRoot);
|
|
@@ -205,14 +205,14 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
205
205
|
const { dryRun, cwd, seams, descriptor, participantRuns, participantPlan, publicRepo } = admitted;
|
|
206
206
|
const { appUrl } = admitted;
|
|
207
207
|
// The run's status record exists from here on, so anything watching the runs directory can
|
|
208
|
-
// tell which
|
|
208
|
+
// tell which study this is and that it is alive. The fail-closed returns below leave it finished
|
|
209
209
|
// with no outcome when the scope closes; a crash leaves it stale, which reads as interrupted.
|
|
210
210
|
const started = await scope.startRun({
|
|
211
211
|
cwd,
|
|
212
212
|
runId: input.runId,
|
|
213
213
|
mintRunId: makeCuaRunId,
|
|
214
214
|
mode: dryRun ? "dry-run" : "live",
|
|
215
|
-
|
|
215
|
+
study: plan.study,
|
|
216
216
|
renderReview: renderCuaReviewMarkdown,
|
|
217
217
|
observer: { open: input.open === true, render: seams.renderObserver },
|
|
218
218
|
});
|
|
@@ -228,7 +228,7 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
228
228
|
humanishSource: "present",
|
|
229
229
|
packageName: "humanish",
|
|
230
230
|
});
|
|
231
|
-
// Live-trace flush seam:
|
|
231
|
+
// Live-trace flush seam: runStudyParticipants fills it when a live run has an in-progress bundle
|
|
232
232
|
// to grow; participants call it through deps.onTrace. It exists before deps so deps can reference it as
|
|
233
233
|
// a stable indirection.
|
|
234
234
|
const liveTrace = {};
|
|
@@ -315,7 +315,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
|
|
|
315
315
|
onTrace: (participantId, items, usage, metadata) => liveTrace.flush?.(participantId, items, usage, metadata),
|
|
316
316
|
...callerDriving(input, config),
|
|
317
317
|
residual: plan.residual,
|
|
318
|
-
|
|
318
|
+
studyId: plan.studyId,
|
|
319
319
|
caps: plan.caps,
|
|
320
320
|
appUrl,
|
|
321
321
|
brain: plan.runner.brain,
|
|
@@ -329,7 +329,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
|
|
|
329
329
|
timeoutMs,
|
|
330
330
|
participantCount,
|
|
331
331
|
artifactRoot: runPaths,
|
|
332
|
-
|
|
332
|
+
studyCwd: input.cwd,
|
|
333
333
|
redactScreenshots,
|
|
334
334
|
scrubKnownValues,
|
|
335
335
|
runSession,
|
|
@@ -16,7 +16,7 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
16
16
|
/** The run's verdict, from the judge. */
|
|
17
17
|
verdict: Verdict;
|
|
18
18
|
realEmail?: boolean;
|
|
19
|
-
/** The run this bundle belongs to; the bundle head reads its id, mode, start and
|
|
19
|
+
/** The run this bundle belongs to; the bundle head reads its id, mode, start and study. */
|
|
20
20
|
run: BundleRun;
|
|
21
21
|
actorId: string;
|
|
22
22
|
appUrl: string;
|
|
@@ -26,8 +26,8 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
26
26
|
surface?: string;
|
|
27
27
|
caseGroup?: string;
|
|
28
28
|
dryRun: boolean;
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
studyId: string;
|
|
30
|
+
studyTitle?: string;
|
|
31
31
|
mission: string;
|
|
32
32
|
assignment?: RunStream["assignment"];
|
|
33
33
|
persona: ActorPersonaRef;
|
|
@@ -44,7 +44,7 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
44
44
|
isMobile?: boolean;
|
|
45
45
|
screenshots: string[];
|
|
46
46
|
/** Relative run-dir path of the digest-only comms-thread evidence artifact (humanish.comms-thread.v1),
|
|
47
|
-
* when a comms
|
|
47
|
+
* when a comms study captured mail; registered as a "log" stream artifact. */
|
|
48
48
|
commsArtifactPath?: string;
|
|
49
49
|
/**
|
|
50
50
|
* Capture-time screenshot policy ("blurred" when policies.redactScreenshots, else "raw").
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { participantAssignment } from "../../
|
|
1
|
+
import { participantAssignment } from "../../study/participant-assignment.js";
|
|
2
2
|
import { redactText } from "../../evidence/redaction.js";
|
|
3
3
|
import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
|
|
4
4
|
import {} from "../../run/streams.js";
|
|
@@ -7,6 +7,7 @@ import { describeSubjectState, participantFeedbackCandidates, phaseEventIdSuffix
|
|
|
7
7
|
import { participantStatus as participantStatusFor } from "../../run/judge.js";
|
|
8
8
|
import { buildRunCostSummary } from "../../run/cost-summary.js";
|
|
9
9
|
import { participantEvent, participantIds, participantRecord, participantStream, } from "../../run/participant-records.js";
|
|
10
|
+
import { plural } from "../../run/text.js";
|
|
10
11
|
/** The one participant's record and stream ids: sim-001 and stream-001. */
|
|
11
12
|
const SINGLE = participantIds(0);
|
|
12
13
|
/** The participant's runner: a hosted E2B desktop, a local VM desktop, or the in-process route. */
|
|
@@ -80,7 +81,7 @@ function singleSimulation(args, view) {
|
|
|
80
81
|
const { publicAppUrl, status, reason } = view;
|
|
81
82
|
return participantRecord(SINGLE, 1, {
|
|
82
83
|
personaId: args.persona.id,
|
|
83
|
-
scenarioId: `cua-${args.
|
|
84
|
+
scenarioId: `cua-${args.studyId}`,
|
|
84
85
|
status,
|
|
85
86
|
streamKind: "browser",
|
|
86
87
|
mode: "browser-sim",
|
|
@@ -91,7 +92,7 @@ function singleSimulation(args, view) {
|
|
|
91
92
|
: args.inProgress === true
|
|
92
93
|
? `Computer-use actor (${args.actorId}) is driving the subject app ${browserPlace(args)}.`
|
|
93
94
|
: args.sessionError !== undefined
|
|
94
|
-
? `
|
|
95
|
+
? `The computer-use run failed before a terminal session verdict: ${args.sessionError}`
|
|
95
96
|
: `Computer-use actor (${args.actorId}) against ${publicAppUrl}; no session ran.`,
|
|
96
97
|
startedAt: args.run.createdAt,
|
|
97
98
|
updatedAt: args.run.createdAt,
|
|
@@ -133,7 +134,7 @@ function singleStream(args, view) {
|
|
|
133
134
|
...(args.session ? { actorStatus: args.session.status } : {}),
|
|
134
135
|
...(lastScreenshot ? { screenshotUrl: lastScreenshot } : {}),
|
|
135
136
|
},
|
|
136
|
-
// The seam this
|
|
137
|
+
// The seam this route exists to fill: the provider-neutral actor evidence projection.
|
|
137
138
|
...(args.session ? { actor: args.session.trace } : {}),
|
|
138
139
|
artifacts: [
|
|
139
140
|
{ label: "run bundle", path: "run.json", kind: "bundle" },
|
|
@@ -164,7 +165,7 @@ function singleEvents(args, view) {
|
|
|
164
165
|
at: args.run.createdAt,
|
|
165
166
|
level: "info",
|
|
166
167
|
type: "cua-lab.run.created",
|
|
167
|
-
message: `Created computer-use
|
|
168
|
+
message: `Created a computer-use run for ${args.studyId} (actor ${args.actorId}).`,
|
|
168
169
|
},
|
|
169
170
|
args.subjectProvenance
|
|
170
171
|
? participantEvent(SINGLE, {
|
|
@@ -312,21 +313,21 @@ export function buildSingleParticipantBundle(args) {
|
|
|
312
313
|
persona: {
|
|
313
314
|
id: args.persona.id,
|
|
314
315
|
name: `Computer-use operator (${args.persona.id})`,
|
|
315
|
-
source: `study:${args.
|
|
316
|
+
source: `study:${args.studyId}`,
|
|
316
317
|
sourceDigest: args.persona.promptDigest,
|
|
317
318
|
},
|
|
318
319
|
scenario: {
|
|
319
|
-
id: `cua-${args.
|
|
320
|
-
title: args.
|
|
320
|
+
id: `cua-${args.studyId}`,
|
|
321
|
+
title: args.studyTitle ?? `Computer-use run: ${args.studyId}`,
|
|
321
322
|
goal: redactText(args.mission),
|
|
322
|
-
source: `study:${args.
|
|
323
|
+
source: `study:${args.studyId}`,
|
|
323
324
|
sourceDigest: args.persona.promptDigest,
|
|
324
325
|
},
|
|
325
326
|
lifecycle: [
|
|
326
327
|
{
|
|
327
328
|
at: args.run.createdAt,
|
|
328
329
|
event: "cua-lab.run.created",
|
|
329
|
-
message: `Created computer-use
|
|
330
|
+
message: `Created a computer-use run with one participant in a desktop browser (actor ${args.actorId}).`,
|
|
330
331
|
},
|
|
331
332
|
],
|
|
332
333
|
simulations: [simulation],
|
|
@@ -339,7 +340,7 @@ export function buildSingleParticipantBundle(args) {
|
|
|
339
340
|
: traceScreenshotMode === "blurred"
|
|
340
341
|
? "Typed text recorded as length only and reasoning/messages pass through text redaction. Screenshots are blurred at capture (policies.redactScreenshots: true) for a share-as-is bundle."
|
|
341
342
|
: args.screenshots.length > 0
|
|
342
|
-
? `Session ended before a trace was recorded; ${args.screenshots.length
|
|
343
|
+
? `Session ended before a trace was recorded; ${plural(args.screenshots.length, "already-written frame")} ${args.screenshots.length === 1 ? "follows" : "follow"} the capture policy (${screenshotMode}). Typed text is recorded as length only and reasoning/messages pass through text redaction.`
|
|
343
344
|
: "No screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs.",
|
|
344
345
|
},
|
|
345
346
|
artifacts: bundleArtifacts(),
|
|
@@ -350,8 +351,8 @@ export function buildSingleParticipantBundle(args) {
|
|
|
350
351
|
? []
|
|
351
352
|
: participantFeedbackCandidates({
|
|
352
353
|
runId: args.run.runId,
|
|
353
|
-
scenarioId: `cua-${args.
|
|
354
|
-
adapterId: args.
|
|
354
|
+
scenarioId: `cua-${args.studyId}`,
|
|
355
|
+
adapterId: args.studyId,
|
|
355
356
|
goal: redactText(args.mission),
|
|
356
357
|
substrate: runnerSubstrate(args),
|
|
357
358
|
participants: [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ComputerUsePlan } from "../../
|
|
2
|
-
import type {
|
|
1
|
+
import type { ComputerUsePlan } from "../../study/plan-types.js";
|
|
2
|
+
import type { StudySubjectState } from "../../study/types.js";
|
|
3
3
|
import { type RunSubjectProvenance, type RunSubjectStateStepRecord } from "../../run/bundle.js";
|
|
4
4
|
import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
5
5
|
import { type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./types.js";
|
|
@@ -24,7 +24,7 @@ export declare function projectParticipantSubjects(args: {
|
|
|
24
24
|
* contract bundles and failed live provisioning); no declaration → "undeclared".
|
|
25
25
|
*/
|
|
26
26
|
export declare function resolveSubjectState(args: {
|
|
27
|
-
declared:
|
|
27
|
+
declared: StudySubjectState | undefined;
|
|
28
28
|
dryRun: boolean;
|
|
29
29
|
executed: RunSubjectStateStepRecord[];
|
|
30
30
|
}): RunSubjectProvenance["state"];
|