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,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyConfig } from "./types.js";
|
|
2
2
|
export declare const MAX_COMPUTER_USE_PARTICIPANTS = 16;
|
|
3
3
|
export declare function actorResolvesToComputerUse(type: string | undefined): boolean;
|
|
4
4
|
export declare function registeredComputerUseActors(): string[];
|
|
@@ -13,7 +13,7 @@ export declare function registeredTerminalActors(): string[];
|
|
|
13
13
|
* a homogeneous `count`, else 1. The single source of truth shared by the parser, the engine,
|
|
14
14
|
* and the pre-flight plan so the participant count is computed the same way everywhere.
|
|
15
15
|
*/
|
|
16
|
-
export declare function computerUseParticipantCount(config:
|
|
16
|
+
export declare function computerUseParticipantCount(config: StudyConfig): number;
|
|
17
17
|
/**
|
|
18
18
|
* A participant's id: its declared roster id, else `lane-NN` (independent participants) or `role-NN`
|
|
19
19
|
* (shared-world participants) from its 0-based position. The parser's filled email recipients and
|
|
@@ -29,7 +29,7 @@ export declare function participantIdAt(index: number, declared: string | undefi
|
|
|
29
29
|
* bare app-url fallback to the computer-use route so library-API configs with unknown actors still
|
|
30
30
|
* hit its fail-closed ACTOR_UNSUPPORTED.)
|
|
31
31
|
*/
|
|
32
|
-
export declare function isComputerUseComposition(config:
|
|
32
|
+
export declare function isComputerUseComposition(config: StudyConfig): boolean;
|
|
33
33
|
/**
|
|
34
34
|
* True when this config routes to the shared-world route: a clone or local-tree subject
|
|
35
35
|
* on a hosted desktop whose first actor resolves to a computer-use actor and that declares the
|
|
@@ -39,9 +39,9 @@ export declare function isComputerUseComposition(config: LabConfig): boolean;
|
|
|
39
39
|
* clone/local-tree × e2b-desktop × computer-use composition without `topology: shared-world` stays per-lane-worlds
|
|
40
40
|
* (the computer-use route); the topology declaration is the override switch.
|
|
41
41
|
*/
|
|
42
|
-
export declare function isSharedWorldComposition(config:
|
|
42
|
+
export declare function isSharedWorldComposition(config: StudyConfig): boolean;
|
|
43
43
|
/** The getHost provisioned-subject shared-world shape (clone/local-tree served + exposed in-sandbox). */
|
|
44
|
-
export declare function isProvisionedSharedWorldComposition(config:
|
|
44
|
+
export declare function isProvisionedSharedWorldComposition(config: StudyConfig): boolean;
|
|
45
45
|
/**
|
|
46
46
|
* The external-public shared-world shape: a real public deployment used directly as
|
|
47
47
|
* the shared plane: `source: app-url` + `topology: shared-world` + a computer-use actor on
|
|
@@ -51,7 +51,7 @@ export declare function isProvisionedSharedWorldComposition(config: LabConfig):
|
|
|
51
51
|
* half-declared external-public config still routes here to get its precise fail-closed reason
|
|
52
52
|
* rather than silently downgrading to the per-participant computer-use route).
|
|
53
53
|
*/
|
|
54
|
-
export declare function isExternalPublicSharedWorldComposition(config:
|
|
54
|
+
export declare function isExternalPublicSharedWorldComposition(config: StudyConfig): boolean;
|
|
55
55
|
/**
|
|
56
56
|
* Resolve a shared-world participant's entry URL from `serve.url` and its roster entry's `entry`
|
|
57
57
|
* (a relative path or a same-origin absolute URL). Returns null when the result is not a
|
|
@@ -64,19 +64,19 @@ export declare function resolveEntryUrl(serveUrl: string, entry: string | undefi
|
|
|
64
64
|
* absent; the parse layer enforces that pairing). Mirror of isComputerUseComposition; the single
|
|
65
65
|
* source of truth for routeOf and the warning logic.
|
|
66
66
|
*/
|
|
67
|
-
export declare function isScriptedBrowserComposition(config:
|
|
68
|
-
export declare function isProvisionedScriptedBrowserComposition(config:
|
|
67
|
+
export declare function isScriptedBrowserComposition(config: StudyConfig): boolean;
|
|
68
|
+
export declare function isProvisionedScriptedBrowserComposition(config: StudyConfig): boolean;
|
|
69
69
|
/**
|
|
70
70
|
* True when this config routes to the terminal-product backend: a terminal-product subject whose
|
|
71
71
|
* first actor resolves to a registered terminal actor (execution.target e2b-terminal or absent;
|
|
72
72
|
* the parse layer enforces that pairing). Mirror of isComputerUseComposition/isScriptedBrowserComposition;
|
|
73
73
|
* the single source of truth for routeOf and the warning logic.
|
|
74
74
|
*/
|
|
75
|
-
export declare function isTerminalProductComposition(config:
|
|
76
|
-
/** The five execution paths a
|
|
77
|
-
export type
|
|
75
|
+
export declare function isTerminalProductComposition(config: StudyConfig): boolean;
|
|
76
|
+
/** The five execution paths a study can take. */
|
|
77
|
+
export type StudyRoute = "preview" | "computer-use" | "shared-world" | "terminal" | "scripted";
|
|
78
78
|
/**
|
|
79
79
|
* The route a config takes. It never refuses: a config no route can run still gets the route
|
|
80
80
|
* whose own checks refuse it with the most precise reason.
|
|
81
81
|
*/
|
|
82
|
-
export declare function routeOf(config:
|
|
82
|
+
export declare function routeOf(config: StudyConfig): StudyRoute;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { CuaParticipantPlan } from "../routes/computer-use/types.js";
|
|
2
2
|
import type { SubjectPhaseEvent } from "../subject/steps.js";
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
3
|
+
import type { InternalRunStudyOptions } from "../run-study.js";
|
|
4
|
+
import type { StudyRoute } from "./plan.js";
|
|
5
|
+
import type { StudyConfig } from "./types.js";
|
|
6
6
|
/** One participant, as the options' callbacks see it. */
|
|
7
7
|
export interface ParticipantRef {
|
|
8
8
|
readonly id: string;
|
|
@@ -19,12 +19,12 @@ export type SetupTarget = {
|
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
21
|
* What a run reports while it runs. `plan` comes from computer use only; the other routes run from
|
|
22
|
-
* the
|
|
22
|
+
* the study plan but do not emit it. `subject-phase` comes from computer use (participant target)
|
|
23
23
|
* and shared world (subject target).
|
|
24
24
|
*/
|
|
25
|
-
export type
|
|
25
|
+
export type StudyEvent = {
|
|
26
26
|
type: "plan";
|
|
27
|
-
route:
|
|
27
|
+
route: StudyRoute;
|
|
28
28
|
participants: readonly {
|
|
29
29
|
id: string;
|
|
30
30
|
persona: string;
|
|
@@ -50,12 +50,12 @@ export type LabEvent = {
|
|
|
50
50
|
* analysis API key. A callback can hold any of them, and its warning is appended after the route
|
|
51
51
|
* sanitized its own.
|
|
52
52
|
*/
|
|
53
|
-
export declare function knownSecretValues(config:
|
|
53
|
+
export declare function knownSecretValues(config: StudyConfig, options: InternalRunStudyOptions, forwardedEnv: Readonly<Record<string, string | undefined>> | undefined): string[];
|
|
54
54
|
/**
|
|
55
55
|
* The emitter the route hook bags call, or undefined without onEvent. It calls onEvent and never
|
|
56
56
|
* waits for it: a throw or a rejected promise becomes a run warning, scrubbed of `secretValues`.
|
|
57
57
|
*/
|
|
58
|
-
export declare function
|
|
58
|
+
export declare function studyEventEmitter(onEvent: ((event: StudyEvent) => void | Promise<void>) | undefined, warnings: string[], secretValues: () => string[]): ((event: StudyEvent) => void) | undefined;
|
|
59
59
|
/** The computer-use participant plan as a `plan` event: ids, personas, devices and digests. */
|
|
60
|
-
export declare function planEvent(plan: CuaParticipantPlan):
|
|
61
|
-
export declare function phaseEvent(event: SubjectPhaseEvent, target: SetupTarget):
|
|
60
|
+
export declare function planEvent(plan: CuaParticipantPlan): StudyEvent;
|
|
61
|
+
export declare function phaseEvent(event: SubjectPhaseEvent, target: SetupTarget): StudyEvent;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// What a run reports through
|
|
2
|
-
// warning.
|
|
1
|
+
// What a run reports through RunStudyOptions.onEvent, and how a callback failure becomes a run
|
|
2
|
+
// warning. normalizeRunStudyOptions (run-study-options.ts) builds the emitter and hands it to the
|
|
3
3
|
// route hook bags it maps; the event values are built here.
|
|
4
4
|
import { redactText, scrubLiterals, toErrorMessage } from "../evidence/redaction.js";
|
|
5
5
|
/**
|
|
@@ -26,7 +26,7 @@ export function knownSecretValues(config, options, forwardedEnv) {
|
|
|
26
26
|
* The emitter the route hook bags call, or undefined without onEvent. It calls onEvent and never
|
|
27
27
|
* waits for it: a throw or a rejected promise becomes a run warning, scrubbed of `secretValues`.
|
|
28
28
|
*/
|
|
29
|
-
export function
|
|
29
|
+
export function studyEventEmitter(onEvent, warnings, secretValues) {
|
|
30
30
|
if (onEvent === undefined)
|
|
31
31
|
return undefined;
|
|
32
32
|
return (event) => {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { CuaExecutor, CuaProvider } from "../actors/computer-use/loop.js";
|
|
2
2
|
import type { E2BDesktopSandbox } from "../substrates/e2b/sdk.js";
|
|
3
3
|
import type { AdapterScorerModule } from "./adapter-scorer-loader.js";
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
4
|
+
import type { StudyEvent, ParticipantRef, SetupTarget } from "./run-study-events.js";
|
|
5
|
+
import type { StudyConfig } from "./types.js";
|
|
6
6
|
/** What `createProvider` receives for each participant. */
|
|
7
7
|
export interface ProviderContext {
|
|
8
|
-
readonly config:
|
|
8
|
+
readonly config: StudyConfig;
|
|
9
9
|
readonly participant: ParticipantRef;
|
|
10
10
|
readonly executor: CuaExecutor;
|
|
11
11
|
}
|
|
@@ -13,7 +13,7 @@ export type ProviderFactory = (ctx: ProviderContext) => Promise<CuaProvider>;
|
|
|
13
13
|
/** The caller's executor for an in-process run, built once for the run's single participant. */
|
|
14
14
|
export interface InProcessDriver {
|
|
15
15
|
executor: (ctx: {
|
|
16
|
-
config:
|
|
16
|
+
config: StudyConfig;
|
|
17
17
|
appUrl: string;
|
|
18
18
|
}) => Promise<CuaExecutor>;
|
|
19
19
|
}
|
|
@@ -26,7 +26,7 @@ interface StreamEventIds {
|
|
|
26
26
|
recordId: string;
|
|
27
27
|
streamId: string;
|
|
28
28
|
}
|
|
29
|
-
type
|
|
29
|
+
export type StreamEvent = (StreamEventIds & {
|
|
30
30
|
type: "ready";
|
|
31
31
|
sandboxId: string;
|
|
32
32
|
/** Runtime only: carries an auth key and must never be persisted. */
|
|
@@ -34,17 +34,8 @@ type StreamEventFields = (StreamEventIds & {
|
|
|
34
34
|
}) | (StreamEventIds & {
|
|
35
35
|
type: "ended";
|
|
36
36
|
});
|
|
37
|
-
export type StreamEvent = StreamEventFields & {
|
|
38
|
-
/**
|
|
39
|
-
* @deprecated Use `recordId`, which holds the same value. Reading it warns once per process; the
|
|
40
|
-
* next minor removes it.
|
|
41
|
-
*/
|
|
42
|
-
readonly simId: string;
|
|
43
|
-
};
|
|
44
|
-
/** A stream event as the routes report it, with `simId` as a getter over `recordId`. */
|
|
45
|
-
export declare function streamEvent(fields: StreamEventFields): StreamEvent;
|
|
46
37
|
/** The options with a typed home, common to every route. */
|
|
47
|
-
export interface
|
|
38
|
+
export interface RunStudyHomes {
|
|
48
39
|
/** Keys and subject env for the run. Defaults to process.env. */
|
|
49
40
|
env?: Readonly<Record<string, string | undefined>>;
|
|
50
41
|
/**
|
|
@@ -59,14 +50,14 @@ export interface RunLabHomes {
|
|
|
59
50
|
* Passive. Never awaited; a throw or a rejected promise becomes a run warning. It observes and
|
|
60
51
|
* changes no output: subject phases still go to stderr.
|
|
61
52
|
*/
|
|
62
|
-
onEvent?: (event:
|
|
53
|
+
onEvent?: (event: StudyEvent) => void | Promise<void>;
|
|
63
54
|
/** Awaited after a participant's live stream starts, and again after its sandbox is gone. */
|
|
64
55
|
onStream?: (event: StreamEvent) => Promise<void> | void;
|
|
65
56
|
/** Cancels post-run analysis only. */
|
|
66
57
|
analysisSignal?: AbortSignal;
|
|
67
58
|
}
|
|
68
59
|
/** Brain and in-process driving. An in-process executor needs a provider: it returns no frame. */
|
|
69
|
-
export type
|
|
60
|
+
export type RunStudyDriving = {
|
|
70
61
|
inProcess?: undefined;
|
|
71
62
|
createProvider?: ProviderFactory;
|
|
72
63
|
} | {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { InternalRunStudyOptions, StudyOutcome, RunStudyOptions } from "../run-study.js";
|
|
2
|
+
import { type StudyRoute } from "./plan.js";
|
|
3
|
+
import type { StudyConfig } from "./types.js";
|
|
4
|
+
import { type StudyEvent } from "./run-study-events.js";
|
|
5
|
+
type Refusal = {
|
|
6
|
+
ok: false;
|
|
7
|
+
code: "HUMANISH_STUDY_OPTION_UNSUPPORTED" | "HUMANISH_STUDY_V2_UNSUPPORTED";
|
|
8
|
+
message: string;
|
|
9
|
+
};
|
|
10
|
+
type Normalized = {
|
|
11
|
+
ok: true;
|
|
12
|
+
/** The options the route reads: onEvent removed, env copied. */
|
|
13
|
+
options: InternalRunStudyOptions;
|
|
14
|
+
/** Filled by onEvent failures while the run runs; runStudyWith appends them to the result. */
|
|
15
|
+
warnings: string[];
|
|
16
|
+
/** Calls onEvent and never waits for it, or undefined without onEvent. The routes report through it. */
|
|
17
|
+
emit: ((event: StudyEvent) => void) | undefined;
|
|
18
|
+
};
|
|
19
|
+
/** The refusal for a field a JavaScript caller passed that RunStudyOptions no longer has. */
|
|
20
|
+
export declare function removedOptionRefusal(options: RunStudyOptions): Refusal | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Refuse what the route cannot honor, copy env, and build the emitter onEvent receives through.
|
|
23
|
+
* Nothing here touches the filesystem, so a refusal leaves no run directory, receipt or sandbox.
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeRunStudyOptions(config: StudyConfig, route: StudyRoute, options: InternalRunStudyOptions): Normalized | Refusal;
|
|
26
|
+
/** A refusal in the route's own result envelope, before any run exists. */
|
|
27
|
+
export declare function optionRefusalOutcome(config: StudyConfig, route: StudyRoute, options: RunStudyOptions, refusal: Refusal): StudyOutcome;
|
|
28
|
+
export {};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// The typed homes on
|
|
1
|
+
// The typed homes on RunStudyOptions. runStudyWith calls normalizeRunStudyOptions first: it refuses an option
|
|
2
2
|
// the route cannot honor and otherwise passes the typed options to the route, with env copied and
|
|
3
|
-
// onEvent turned into the emitter. The package's
|
|
3
|
+
// onEvent turned into the emitter. The package's runStudy refuses the removed bags
|
|
4
4
|
// (removedOptionRefusal).
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { knownSecretValues,
|
|
6
|
+
import { isLocalBrowserStudy } from "../substrates/local/runtime-config.js";
|
|
7
|
+
import { resolveStudyDryRun } from "./plan.js";
|
|
8
|
+
import { knownSecretValues, studyEventEmitter } from "./run-study-events.js";
|
|
9
9
|
import { rosterOf } from "./parse/actors.js";
|
|
10
10
|
import { studyResultIdentity } from "../run/study-result.js";
|
|
11
11
|
const unsupported = (option, route, reason) => ({
|
|
@@ -13,7 +13,7 @@ const unsupported = (option, route, reason) => ({
|
|
|
13
13
|
code: "HUMANISH_STUDY_OPTION_UNSUPPORTED",
|
|
14
14
|
message: `RunLabOptions.${option} is not supported on the ${route} route: ${reason}`,
|
|
15
15
|
});
|
|
16
|
-
// Fields
|
|
16
|
+
// Fields RunStudyOptions no longer has, and where each one's job went.
|
|
17
17
|
const REMOVED_OPTIONS = {
|
|
18
18
|
cuaHooks: "Use scorer, createProvider, inProcess, prepareDesktop, env, onEvent and onStream.",
|
|
19
19
|
scriptedHooks: "Use prepareDesktop and env.",
|
|
@@ -21,9 +21,10 @@ const REMOVED_OPTIONS = {
|
|
|
21
21
|
sharedWorldHooks: "Use scorer, prepareDesktop, env, onEvent and onStream.",
|
|
22
22
|
automaticAnalysis: "Use onEvent (analysis-started, analysis-finished) and analysisSignal.",
|
|
23
23
|
lab: "The humanish CLI sets it.",
|
|
24
|
+
study: "The humanish CLI sets it.",
|
|
24
25
|
scorerProvenance: "The humanish CLI sets it.",
|
|
25
26
|
};
|
|
26
|
-
/** The refusal for a field a JavaScript caller passed that
|
|
27
|
+
/** The refusal for a field a JavaScript caller passed that RunStudyOptions no longer has. */
|
|
27
28
|
export function removedOptionRefusal(options) {
|
|
28
29
|
// rerun.laneIds, the older name of rerun.participantIds, would otherwise be ignored, so the rerun
|
|
29
30
|
// would select every failed participant instead of the ones the caller named.
|
|
@@ -52,7 +53,7 @@ function unsupportedOption(config, route, options) {
|
|
|
52
53
|
return unsupported("scorer", route, "only computer use, shared world and terminal score runs.");
|
|
53
54
|
if (createProvider !== undefined && route !== "computer-use")
|
|
54
55
|
return unsupported("createProvider", route, route === "shared-world"
|
|
55
|
-
? "shared-world participants run the
|
|
56
|
+
? "shared-world participants run the study's own brain."
|
|
56
57
|
: "only computer use takes a caller brain.");
|
|
57
58
|
if (route === "computer-use") {
|
|
58
59
|
const source = config.subject.source;
|
|
@@ -61,7 +62,7 @@ function unsupportedOption(config, route, options) {
|
|
|
61
62
|
return unsupported("inProcess", route, "it drives an app-url or local-app subject.");
|
|
62
63
|
}
|
|
63
64
|
if (prepareDesktop !== undefined) {
|
|
64
|
-
if (
|
|
65
|
+
if (isLocalBrowserStudy(config))
|
|
65
66
|
return unsupported("prepareDesktop", route, "a local VM study has no E2B desktop.");
|
|
66
67
|
// An in-process run has no desktop to prepare.
|
|
67
68
|
if (inProcess !== undefined || source === "local-app")
|
|
@@ -83,7 +84,7 @@ function unsupportedOption(config, route, options) {
|
|
|
83
84
|
* Refuse what the route cannot honor, copy env, and build the emitter onEvent receives through.
|
|
84
85
|
* Nothing here touches the filesystem, so a refusal leaves no run directory, receipt or sandbox.
|
|
85
86
|
*/
|
|
86
|
-
export function
|
|
87
|
+
export function normalizeRunStudyOptions(config, route, options) {
|
|
87
88
|
const refused = unsupportedOption(config, route, options);
|
|
88
89
|
if (refused)
|
|
89
90
|
return refused;
|
|
@@ -92,7 +93,7 @@ export function normalizeRunLabOptions(config, route, options) {
|
|
|
92
93
|
// The route gets this copy, so it is the env a warning is scrubbed against, whatever the caller
|
|
93
94
|
// does to its own object afterwards.
|
|
94
95
|
const forwardedEnv = env === undefined ? undefined : { ...env };
|
|
95
|
-
const emit =
|
|
96
|
+
const emit = studyEventEmitter(onEvent, warnings, () => knownSecretValues(config, options, forwardedEnv));
|
|
96
97
|
// Every route reads its typed options directly, and onEvent reaches it as `emit`. unsupportedOption
|
|
97
98
|
// already refused an option no route reads; the preview route reads no env.
|
|
98
99
|
const normalized = { ...forwarded };
|
|
@@ -105,7 +106,7 @@ export function optionRefusalOutcome(config, route, options, refusal) {
|
|
|
105
106
|
const cwd = path.resolve(options.cwd);
|
|
106
107
|
const error = { code: refusal.code, message: refusal.message };
|
|
107
108
|
const actor = config.actors[0]?.type ?? "";
|
|
108
|
-
const dryRun =
|
|
109
|
+
const dryRun = resolveStudyDryRun(config, options.dryRun, true) ?? true;
|
|
109
110
|
const runId = options.runId ?? "not-created";
|
|
110
111
|
const common = { ok: false, cwd, actor, dryRun, runId, warnings: [], error };
|
|
111
112
|
switch (route) {
|
|
@@ -9,8 +9,8 @@ import type { DetachedTimers } from "../substrates/detached.js";
|
|
|
9
9
|
import type { E2BDesktopModule } from "../substrates/e2b/sdk.js";
|
|
10
10
|
import type { LocalTreeArchive } from "../subject/local-tree-archive.js";
|
|
11
11
|
import type { SubjectPhaseEvent } from "../subject/steps.js";
|
|
12
|
-
import type { ParticipantRef } from "./run-
|
|
13
|
-
export interface
|
|
12
|
+
import type { ParticipantRef } from "./run-study-events.js";
|
|
13
|
+
export interface StudyDeps {
|
|
14
14
|
/** Loads the E2B SDK. Defaults to loadE2BDesktopModule. */
|
|
15
15
|
readonly desktopModule?: () => Promise<E2BDesktopModule>;
|
|
16
16
|
/** Renders the Observer. Defaults to renderObserver. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Test seams: the implementations a test puts in place of the real ones. The internal
|
|
2
|
-
// them as its third argument and each route runner as `deps`; the package's
|
|
1
|
+
// Test seams: the implementations a test puts in place of the real ones. The internal runStudyWith takes
|
|
2
|
+
// them as its third argument and each route runner as `deps`; the package's runStudy takes none.
|
|
3
3
|
// Each field defaults to the real implementation.
|
|
4
4
|
export {};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
|
|
2
2
|
import { type KeyResolutionDeps } from "../keys/key-resolution.js";
|
|
3
3
|
export declare const STUDY_SUMMARY_SCHEMA = "humanish.study-summary.v1";
|
|
4
|
-
export interface
|
|
4
|
+
export interface StudyCaps {
|
|
5
5
|
/** Per-participant blast-radius budget. */
|
|
6
6
|
laneUsd?: number;
|
|
7
7
|
/** Shared study budget across every participant. */
|
|
8
8
|
studyUsd?: number;
|
|
9
9
|
}
|
|
10
|
-
export interface
|
|
10
|
+
export interface StudySummary {
|
|
11
11
|
runtime?: Pick<LocalRuntimeStatus, "ok" | "installed" | "message">;
|
|
12
12
|
participantReadiness?: {
|
|
13
13
|
ok: boolean;
|
|
@@ -35,11 +35,11 @@ export interface LabSummary {
|
|
|
35
35
|
* The reasoning effort that will actually run, override or default, and `"per-lane"` when the
|
|
36
36
|
* roster declares more than one, because a single value would be a lie about half the participants.
|
|
37
37
|
*
|
|
38
|
-
* Shown because it was a silent constant: unreachable from a
|
|
38
|
+
* Shown because it was a silent constant: unreachable from a study, so every run took the provider
|
|
39
39
|
* default. A study variable you cannot see is one nobody chose.
|
|
40
40
|
*/
|
|
41
41
|
reasoningEffort?: string;
|
|
42
|
-
caps:
|
|
42
|
+
caps: StudyCaps;
|
|
43
43
|
/**
|
|
44
44
|
* Whether the configured route's required keys resolve. Dry runs require none. This checks key
|
|
45
45
|
* presence, not local CLI authentication or provider validity. Undefined when not checked.
|
|
@@ -47,12 +47,12 @@ export interface LabSummary {
|
|
|
47
47
|
keysReady?: boolean;
|
|
48
48
|
missingKeys?: string[];
|
|
49
49
|
/**
|
|
50
|
-
* The planner's refusal message when a live key check finds the
|
|
51
|
-
* `humanish
|
|
50
|
+
* The planner's refusal message when a live key check finds the study will not plan, as
|
|
51
|
+
* `humanish run` would report it. `keysReady` is then unset: a refused plan lists no keys.
|
|
52
52
|
*/
|
|
53
53
|
planRefusal?: string;
|
|
54
54
|
}
|
|
55
|
-
export interface
|
|
55
|
+
export interface ReadStudySummaryOptions {
|
|
56
56
|
/** Skip the key probe (it touches vendor stores); the screen then shows no keys line. */
|
|
57
57
|
checkKeys?: boolean;
|
|
58
58
|
env?: NodeJS.ProcessEnv;
|
|
@@ -60,7 +60,7 @@ export interface ReadLabSummaryOptions {
|
|
|
60
60
|
keyDeps?: KeyResolutionDeps;
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
|
-
* Describe one
|
|
64
|
-
* the
|
|
63
|
+
* Describe one study. Returns null when the manifest cannot be resolved: the caller already knows
|
|
64
|
+
* the study exists from the listing, so this failing means the file changed underneath them.
|
|
65
65
|
*/
|
|
66
|
-
export declare function
|
|
66
|
+
export declare function readStudySummary(cwd: string, study: string, options?: ReadStudySummaryOptions): Promise<StudySummary | null>;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isLocalBrowserStudy } from "../substrates/local/runtime-config.js";
|
|
2
2
|
import { localRuntimeStatus } from "../substrates/local/runtime.js";
|
|
3
|
-
// What a
|
|
3
|
+
// What a study is, for the surface that has to describe it before you spend money.
|
|
4
4
|
//
|
|
5
|
-
// The run index and run detail answer questions about runs. This answers a question about the
|
|
5
|
+
// The run index and run detail answer questions about runs. This answers a question about the study
|
|
6
6
|
// itself (what it drives, who is in it, which model, and what it is allowed to spend), which is
|
|
7
7
|
// what a stakeholder reads on the screen where they decide whether to press Start.
|
|
8
8
|
//
|
|
9
9
|
// Resolved analysis defaults are shown independently of declared participant caps. A cap that is not
|
|
10
10
|
// declared is not "unlimited" and not "$0"; it is a line the screen does not draw.
|
|
11
|
-
import {
|
|
11
|
+
import { resolveStudyDryRun } from "./plan.js";
|
|
12
12
|
import { routeOf } from "./plan.js";
|
|
13
13
|
import { localCodexParticipantCheck, planCliRun } from "./doctor.js";
|
|
14
14
|
import { requiredKeys, requiredSubjectEnv } from "./requirements.js";
|
|
15
15
|
import { automaticAnalysisBudget } from "../analysis/automatic-config.js";
|
|
16
16
|
import { DEFAULT_OPENAI_CU_MODEL, DEFAULT_OPENAI_CU_REASONING_EFFORT, } from "../actors/computer-use/openai-provider.js";
|
|
17
|
-
import {
|
|
17
|
+
import { inspectStudyManifest } from "./discover.js";
|
|
18
18
|
import { isComputerUseComposition } from "./routing.js";
|
|
19
19
|
import { probeKeySources } from "../keys/key-resolution.js";
|
|
20
20
|
import { receivingRequiredKey } from "../comms/setup.js";
|
|
@@ -35,7 +35,7 @@ function reasoningEffortOf(config) {
|
|
|
35
35
|
return "per-lane";
|
|
36
36
|
return resolved.size === 1 ? [...resolved][0] : fallback;
|
|
37
37
|
}
|
|
38
|
-
/** One short phrase for what the
|
|
38
|
+
/** One short phrase for what the study drives. */
|
|
39
39
|
function subjectOf(config) {
|
|
40
40
|
const subject = config.subject;
|
|
41
41
|
if (subject?.source === undefined)
|
|
@@ -76,11 +76,11 @@ function capsOf(config) {
|
|
|
76
76
|
};
|
|
77
77
|
}
|
|
78
78
|
/**
|
|
79
|
-
* Describe one
|
|
80
|
-
* the
|
|
79
|
+
* Describe one study. Returns null when the manifest cannot be resolved: the caller already knows
|
|
80
|
+
* the study exists from the listing, so this failing means the file changed underneath them.
|
|
81
81
|
*/
|
|
82
|
-
export async function
|
|
83
|
-
const inspected = await
|
|
82
|
+
export async function readStudySummary(cwd, study, options = {}) {
|
|
83
|
+
const inspected = await inspectStudyManifest(cwd, study).catch(() => null);
|
|
84
84
|
if (inspected === null || !inspected.ok || inspected.config === undefined)
|
|
85
85
|
return null;
|
|
86
86
|
const config = inspected.config;
|
|
@@ -88,8 +88,8 @@ export async function readLabSummary(cwd, lab, options = {}) {
|
|
|
88
88
|
const route = routeOf(inspected.config);
|
|
89
89
|
let keysReady;
|
|
90
90
|
let missingKeys;
|
|
91
|
-
const dryRun =
|
|
92
|
-
// A live key check reads the plan's requirements. A
|
|
91
|
+
const dryRun = resolveStudyDryRun(inspected.config, undefined, true) === true;
|
|
92
|
+
// A live key check reads the plan's requirements. A study the planner refuses has none to check,
|
|
93
93
|
// so the summary reports the refusal in place of its keys.
|
|
94
94
|
const planned = options.checkKeys === true && !dryRun ? await planCliRun(inspected.config, cwd) : undefined;
|
|
95
95
|
const planRefusal = planned?.ok === false ? planned.refusal.message : undefined;
|
|
@@ -129,7 +129,7 @@ export async function readLabSummary(cwd, lab, options = {}) {
|
|
|
129
129
|
const analysis = automaticAnalysisBudget(inspected.config.review?.analysis, route);
|
|
130
130
|
const subject = subjectOf(config);
|
|
131
131
|
const participants = participantsOf(config);
|
|
132
|
-
const runtime = options.checkKeys === true &&
|
|
132
|
+
const runtime = options.checkKeys === true && isLocalBrowserStudy(inspected.config)
|
|
133
133
|
? await localRuntimeStatus({
|
|
134
134
|
...(options.env ? { env: options.env } : {}),
|
|
135
135
|
media: inspected.config.execution?.desktop?.media !== undefined ||
|
|
@@ -137,7 +137,7 @@ export async function readLabSummary(cwd, lab, options = {}) {
|
|
|
137
137
|
})
|
|
138
138
|
: undefined;
|
|
139
139
|
const participantReadiness = options.checkKeys === true &&
|
|
140
|
-
|
|
140
|
+
isLocalBrowserStudy(inspected.config) &&
|
|
141
141
|
inspected.config.actors[0]?.type === "local-agent"
|
|
142
142
|
? await localCodexParticipantCheck({ env: options.env ?? process.env })
|
|
143
143
|
: undefined;
|
|
@@ -160,7 +160,7 @@ export async function readLabSummary(cwd, lab, options = {}) {
|
|
|
160
160
|
communications: `Real email · ${inspected.config.comms.email.connection} · fresh inbox per participant · hosted processing · local review only`,
|
|
161
161
|
}
|
|
162
162
|
: {}),
|
|
163
|
-
studyId: String(config.id ??
|
|
163
|
+
studyId: String(config.id ?? study),
|
|
164
164
|
...(typeof config.title === "string" ? { title: config.title } : {}),
|
|
165
165
|
...(typeof config.description === "string" ? { description: config.description.trim() } : {}),
|
|
166
166
|
...(subject === undefined ? {} : { subject }),
|
|
@@ -12,7 +12,7 @@ declare const TASK_FUNNEL_SCHEMA: "humanish.task-funnel.v1";
|
|
|
12
12
|
* how they will be judged changes what they do. A persona told "you succeed when the URL contains
|
|
13
13
|
* /dashboard" will go find that URL, which measures the instruction rather than the product.
|
|
14
14
|
*/
|
|
15
|
-
export interface
|
|
15
|
+
export interface StudyTask {
|
|
16
16
|
/** Stable id, used in evidence and in the funnel. Researcher-facing. */
|
|
17
17
|
id: string;
|
|
18
18
|
/** Participant-facing. What they are asked to do. The only half that reaches the prompt. */
|
|
@@ -68,7 +68,7 @@ export declare class TaskTracker {
|
|
|
68
68
|
/** Which observation fields were ever populated this session. A criterion whose field never
|
|
69
69
|
* arrived was never evaluated against anything, however many turns ran. */
|
|
70
70
|
private readonly fieldsSeen;
|
|
71
|
-
constructor(tasks: readonly
|
|
71
|
+
constructor(tasks: readonly StudyTask[]);
|
|
72
72
|
/** Evaluate every still-incomplete task against one observation. Returns newly completed tasks. */
|
|
73
73
|
observe(observation: StopConditionObservation, turn: number): TaskCompletion[];
|
|
74
74
|
/** Which observation fields a task's criteria actually read. A task whose rules need `url` was
|
|
@@ -85,7 +85,7 @@ export declare class TaskTracker {
|
|
|
85
85
|
* and the study stops being about the product. A test pins this, because it is the kind of leak a
|
|
86
86
|
* later convenience change makes without noticing.
|
|
87
87
|
*/
|
|
88
|
-
export declare function renderTaskPrompt(tasks: readonly
|
|
88
|
+
export declare function renderTaskPrompt(tasks: readonly StudyTask[]): string | undefined;
|
|
89
89
|
/** One line a stakeholder can read, with the denominator attached. */
|
|
90
90
|
export declare function formatTaskFunnel(funnel: TaskFunnel): string;
|
|
91
91
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Tasks: the researcher's protocol, expressed as config (docs/principles/three-roles.md).
|
|
2
2
|
//
|
|
3
|
-
// A
|
|
3
|
+
// A study could declare a prose `mission` and nothing else. That is a brief, not a protocol, and it
|
|
4
4
|
// left "where did people get stuck" answerable only from an actor's own narration, which is the one
|
|
5
5
|
// source a study should not have to take on faith.
|
|
6
6
|
//
|