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
|
-
// Who takes part in a
|
|
1
|
+
// Who takes part in a study: one record per participant, built from the declared roster or a count.
|
|
2
2
|
// Computer-use and shared-world participants share the desktop fields; each kind adds its own.
|
|
3
3
|
import { resolveParticipantDevice } from "./device-presets.js";
|
|
4
4
|
import { isSharedWorldComposition, participantIdAt } from "./routing.js";
|
|
@@ -35,7 +35,7 @@ function desktopParticipant(config, entry, index, kind, focus) {
|
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* The participants of a computer-use
|
|
38
|
+
* The participants of a computer-use study: the declared roster, else `count` identical ones. A count
|
|
39
39
|
* override (`--count`) applies only when no roster is declared.
|
|
40
40
|
*/
|
|
41
41
|
export function computerUseParticipants(config, countOverride) {
|
|
@@ -52,7 +52,7 @@ export function computerUseParticipants(config, countOverride) {
|
|
|
52
52
|
};
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
|
-
/** The participants of a shared-world
|
|
55
|
+
/** The participants of a shared-world study, one per roster entry, typed by the plane they share. */
|
|
56
56
|
export function sharedWorldParticipants(config) {
|
|
57
57
|
const roster = rosterOf(config.actors[0]) ?? [];
|
|
58
58
|
const participantAt = (entry, index) => desktopParticipant(config, entry, index, "seat", entry.instruction);
|
|
@@ -73,7 +73,7 @@ export function sharedWorldParticipants(config) {
|
|
|
73
73
|
})),
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
|
-
/** The ids of the participants a computer-use or shared-world
|
|
76
|
+
/** The ids of the participants a computer-use or shared-world study runs, in roster order. */
|
|
77
77
|
export function declaredParticipantIds(config) {
|
|
78
78
|
const actor = config.actors[0];
|
|
79
79
|
const roster = rosterOf(actor);
|
|
@@ -8,12 +8,12 @@ import type { RunStudyProvenance } from "../run/study-provenance.js";
|
|
|
8
8
|
import type { ComputerUseRefusal } from "../routes/computer-use/plan.js";
|
|
9
9
|
import type { SharedWorldRefusal } from "../routes/shared-world/plan.js";
|
|
10
10
|
import type { ComputerUseParticipant, ExternalPublicParticipant, ProvisionedParticipant } from "./plan-participants.js";
|
|
11
|
-
import type {
|
|
11
|
+
import type { StudyConfig, StudyExecutionTerminal, StudyRuntimeAuth, StudyScenarioCaps, StudySubjectProduct, StudySubjectServe, StudySubjectState, StudySubjectStateCheckpoint } from "./types.js";
|
|
12
12
|
export type NonEmpty<T> = readonly [T, ...T[]];
|
|
13
13
|
type AtLeastTwo<T> = readonly [T, T, ...T[]];
|
|
14
14
|
/**
|
|
15
15
|
* Something a route checks right before acquisition. Preflight refuses on, and doctor and the TUI
|
|
16
|
-
* report, the keys and subject env listed here, through src/
|
|
16
|
+
* report, the keys and subject env listed here, through src/study/requirements.ts.
|
|
17
17
|
*/
|
|
18
18
|
export type Requirement = {
|
|
19
19
|
readonly kind: "key";
|
|
@@ -48,21 +48,21 @@ export type Requirement = {
|
|
|
48
48
|
* VM study read it before a plan exists. Shared world, terminal and scripted still read some config
|
|
49
49
|
* fields at run time.
|
|
50
50
|
*/
|
|
51
|
-
export type ResidualConfig = Pick<
|
|
52
|
-
readonly execution?: Pick<NonNullable<
|
|
53
|
-
readonly subject: Pick<
|
|
51
|
+
export type ResidualConfig = Pick<StudyConfig, "comms" | "policies" | "personas" | "defaults" | "review"> & {
|
|
52
|
+
readonly execution?: Pick<NonNullable<StudyConfig["execution"]>, "desktop" | "target">;
|
|
53
|
+
readonly subject: Pick<StudyConfig["subject"], "clone" | "localTree" | "repos" | "envValues">;
|
|
54
54
|
};
|
|
55
55
|
export interface PlannedAnalysis {
|
|
56
56
|
readonly config: AnalysisConfig;
|
|
57
|
-
/** "default" when the
|
|
57
|
+
/** "default" when the study declared no review.analysis. */
|
|
58
58
|
readonly trigger: "default" | "explicit";
|
|
59
59
|
readonly preferLargerOutput: boolean;
|
|
60
60
|
}
|
|
61
61
|
interface PlanBase {
|
|
62
|
-
readonly
|
|
63
|
-
/** The
|
|
62
|
+
readonly studyId: string;
|
|
63
|
+
/** The study's declared title, which bundles record. */
|
|
64
64
|
readonly title?: string;
|
|
65
|
-
readonly
|
|
65
|
+
readonly study?: RunStudyProvenance;
|
|
66
66
|
/** A frozen copy owned by the plan. */
|
|
67
67
|
readonly residual: Readonly<ResidualConfig>;
|
|
68
68
|
readonly dryRun: boolean;
|
|
@@ -83,7 +83,7 @@ interface PreviewPlan extends PlanBase {
|
|
|
83
83
|
}
|
|
84
84
|
/**
|
|
85
85
|
* The model driving a desktop participant. `caller` is the library caller's createProvider.
|
|
86
|
-
* `declaredModel` is actors[0].model as the
|
|
86
|
+
* `declaredModel` is actors[0].model as the study wrote it, absent when undeclared: the providers
|
|
87
87
|
* take it as written, and spend is priced at it, else the default (pricedModel). An openai
|
|
88
88
|
* brain's `model` is the one its provider runs, with that default applied.
|
|
89
89
|
*/
|
|
@@ -102,14 +102,14 @@ export type Brain = {
|
|
|
102
102
|
export type ProvisionedSubject = {
|
|
103
103
|
readonly kind: "clone";
|
|
104
104
|
readonly repo: string;
|
|
105
|
-
readonly serve:
|
|
105
|
+
readonly serve: StudySubjectServe;
|
|
106
106
|
readonly env: readonly string[];
|
|
107
|
-
readonly state?:
|
|
107
|
+
readonly state?: StudySubjectState;
|
|
108
108
|
} | {
|
|
109
109
|
readonly kind: "local-tree";
|
|
110
|
-
readonly serve:
|
|
110
|
+
readonly serve: StudySubjectServe;
|
|
111
111
|
readonly env: readonly string[];
|
|
112
|
-
readonly state?:
|
|
112
|
+
readonly state?: StudySubjectState;
|
|
113
113
|
};
|
|
114
114
|
export interface AppUrlSubject {
|
|
115
115
|
readonly kind: "app-url";
|
|
@@ -131,7 +131,7 @@ export type ComputerUseRunner = {
|
|
|
131
131
|
readonly participants: NonEmpty<ComputerUseParticipant>;
|
|
132
132
|
readonly subject: AppUrlSubject | ProvisionedSubject | {
|
|
133
133
|
readonly kind: "desktop-cli";
|
|
134
|
-
readonly product:
|
|
134
|
+
readonly product: StudySubjectProduct;
|
|
135
135
|
/** As on AppUrlSubject: a library config's declared `subject.serve.url`. */
|
|
136
136
|
readonly serveUrl?: string;
|
|
137
137
|
};
|
|
@@ -172,8 +172,8 @@ export interface ComputerUsePlan extends PlanBase {
|
|
|
172
172
|
readonly participantIds?: readonly string[];
|
|
173
173
|
};
|
|
174
174
|
}
|
|
175
|
-
type CheckpointedState =
|
|
176
|
-
readonly checkpoint: NonEmpty<
|
|
175
|
+
type CheckpointedState = StudySubjectState & {
|
|
176
|
+
readonly checkpoint: NonEmpty<StudySubjectStateCheckpoint>;
|
|
177
177
|
};
|
|
178
178
|
export type SharedWorldPlane = {
|
|
179
179
|
readonly kind: "provisioned";
|
|
@@ -208,7 +208,7 @@ export type TerminalPlan = PlanBase & {
|
|
|
208
208
|
readonly route: "terminal";
|
|
209
209
|
/** The registered terminal actor that runs. */
|
|
210
210
|
readonly actor: string;
|
|
211
|
-
readonly product:
|
|
211
|
+
readonly product: StudySubjectProduct & {
|
|
212
212
|
readonly publicSurfaces: NonEmpty<string>;
|
|
213
213
|
};
|
|
214
214
|
/** The declared persona and mission; the route supplies its defaults. */
|
|
@@ -218,21 +218,21 @@ export type TerminalPlan = PlanBase & {
|
|
|
218
218
|
readonly version?: string;
|
|
219
219
|
/** Passed to Codex as `--model` on every run, so the bundle can name and price it. */
|
|
220
220
|
readonly model: string;
|
|
221
|
-
/** `declared` by the
|
|
221
|
+
/** `declared` by the study's actor, or humanish's participant default. */
|
|
222
222
|
readonly modelSource: "declared" | "humanish_default";
|
|
223
223
|
readonly reasoningEffort?: ReasoningEffort;
|
|
224
|
-
readonly auth?:
|
|
224
|
+
readonly auth?: StudyRuntimeAuth;
|
|
225
225
|
};
|
|
226
226
|
/** The declared egress routing allowlist; without one the sandbox egress is unrestricted. */
|
|
227
227
|
readonly egressAllow?: readonly string[];
|
|
228
228
|
/** The declared operator stdin posture; the route defaults to "disabled". */
|
|
229
|
-
readonly stdin?: NonNullable<
|
|
229
|
+
readonly stdin?: NonNullable<StudyExecutionTerminal["stdin"]>;
|
|
230
230
|
} & ({
|
|
231
231
|
readonly dryRun: true;
|
|
232
|
-
readonly caps?:
|
|
232
|
+
readonly caps?: StudyScenarioCaps;
|
|
233
233
|
} | {
|
|
234
234
|
readonly dryRun: false;
|
|
235
|
-
readonly caps:
|
|
235
|
+
readonly caps: StudyScenarioCaps & {
|
|
236
236
|
readonly maxUsd: number;
|
|
237
237
|
readonly maxMinutes: number;
|
|
238
238
|
};
|
|
@@ -259,9 +259,9 @@ export interface ScriptedPlan extends PlanBase {
|
|
|
259
259
|
readonly personaId?: string;
|
|
260
260
|
readonly sessionTimeoutMs?: number;
|
|
261
261
|
}
|
|
262
|
-
export type
|
|
263
|
-
interface
|
|
264
|
-
readonly plan:
|
|
262
|
+
export type StudyPlan = PreviewPlan | ComputerUsePlan | SharedWorldPlan | TerminalPlan | ScriptedPlan;
|
|
263
|
+
interface PlannedStudy {
|
|
264
|
+
readonly plan: StudyPlan;
|
|
265
265
|
}
|
|
266
266
|
/**
|
|
267
267
|
* The error a route returns before a run starts: the route, its error code and a message. Each
|
|
@@ -283,11 +283,11 @@ export type RoutePlanResult<Plan, Refusal> = {
|
|
|
283
283
|
};
|
|
284
284
|
/** The error codes the preview route returns before a run starts. */
|
|
285
285
|
export type PreviewRefusalCode = "HUMANISH_STUDY_COMMS_UNSUPPORTED" | "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_ANALYSIS_UNSUPPORTED" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_INVALID_PARTICIPANT_COUNT" | "HUMANISH_LIVE_RUN_UNIMPLEMENTED";
|
|
286
|
-
/** Why
|
|
286
|
+
/** Why planStudy refused: the route's own code and message, as its runner returns them. */
|
|
287
287
|
export type PlanRefusal = RouteRefusal<"preview", PreviewRefusalCode> | TerminalRefusal | ScriptedRefusal | ComputerUseRefusal | SharedWorldRefusal;
|
|
288
288
|
export type PlanResult = {
|
|
289
289
|
readonly ok: true;
|
|
290
|
-
readonly planned:
|
|
290
|
+
readonly planned: PlannedStudy;
|
|
291
291
|
} | {
|
|
292
292
|
readonly ok: false;
|
|
293
293
|
readonly refusal: PlanRefusal;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// The
|
|
1
|
+
// The StudyPlan union: what planStudy decides about a study before anything runs. Each route has its own
|
|
2
2
|
// variant, and each supported subject and substrate pairing is its own case, so a combination the
|
|
3
3
|
// routes refuse cannot be written down. Numeric bounds, unique ids, safe URLs and "exactly one
|
|
4
|
-
// host" stay checks in
|
|
4
|
+
// host" stay checks in planStudy.
|
|
5
5
|
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { InternalRunStudyOptions } from "../run-study.js";
|
|
2
|
+
import type { StudyDeps } from "./study-deps.js";
|
|
3
|
+
import type { PlanResult } from "./plan-types.js";
|
|
4
|
+
import type { StudyConfig } from "./types.js";
|
|
5
|
+
export { routeOf, type StudyRoute } from "./routing.js";
|
|
6
|
+
/** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
|
|
7
|
+
export declare function resolveStudyDryRun(config: StudyConfig, override: boolean | undefined, fallback: boolean | undefined): boolean | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* The plan a study runs under, built without reading files, env or the network. Each route's planner
|
|
10
|
+
* makes every refusal that route makes, in the route's order and with its codes and messages; the
|
|
11
|
+
* route's exported runner calls the same planner.
|
|
12
|
+
*/
|
|
13
|
+
export declare function planStudy(config: StudyConfig, options: InternalRunStudyOptions, deps?: StudyDeps): PlanResult;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// The route decision. A
|
|
1
|
+
// The route decision. A study's route follows from its composition (subject.source,
|
|
2
2
|
// execution.target, the first actor's registered run kind, subject.topology), never from a
|
|
3
3
|
// declared kind. This is the only function that decides it.
|
|
4
4
|
import { resolveAutomaticAnalysis } from "../analysis/automatic-config.js";
|
|
5
|
-
import { callerDrivingOf,
|
|
6
|
-
import { injectedBrowser,
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { callerDrivingOf, planComputerUseStudy } from "../routes/computer-use/plan.js";
|
|
6
|
+
import { injectedBrowser, planScriptedStudy } from "../routes/scripted/plan.js";
|
|
7
|
+
import { planSharedWorldStudy } from "../routes/shared-world/plan.js";
|
|
8
|
+
import { planTerminalStudy } from "../routes/terminal/plan.js";
|
|
9
9
|
import { localBrowserDefaults } from "../substrates/local/runtime-config.js";
|
|
10
10
|
import { THIS_REPO_DRY_RUN_ONLY } from "./composition-rules.js";
|
|
11
11
|
import { planBase } from "./plan-base.js";
|
|
@@ -13,7 +13,7 @@ import { routeOf } from "./routing.js";
|
|
|
13
13
|
import { automaticAnalysisRouteReason, taskProtocolValidationReason } from "./validation.js";
|
|
14
14
|
export { routeOf } from "./routing.js";
|
|
15
15
|
/** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
|
|
16
|
-
export function
|
|
16
|
+
export function resolveStudyDryRun(config, override, fallback) {
|
|
17
17
|
if (override !== undefined) {
|
|
18
18
|
return override;
|
|
19
19
|
}
|
|
@@ -35,7 +35,7 @@ function planPreview(config, options, input) {
|
|
|
35
35
|
refusal: { route: "preview", code, message },
|
|
36
36
|
});
|
|
37
37
|
if (String(config.comms?.email?.kind) === "real")
|
|
38
|
-
return refuse("HUMANISH_STUDY_COMMS_UNSUPPORTED", "Real email receiving is unsupported on the preview route. Use a supported hosted computer-use
|
|
38
|
+
return refuse("HUMANISH_STUDY_COMMS_UNSUPPORTED", "Real email receiving is unsupported on the preview route. Use a supported hosted computer-use study.");
|
|
39
39
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
40
40
|
if (!analysis.ok)
|
|
41
41
|
return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
|
|
@@ -61,27 +61,27 @@ function planPreview(config, options, input) {
|
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* The plan a
|
|
64
|
+
* The plan a study runs under, built without reading files, env or the network. Each route's planner
|
|
65
65
|
* makes every refusal that route makes, in the route's order and with its codes and messages; the
|
|
66
66
|
* route's exported runner calls the same planner.
|
|
67
67
|
*/
|
|
68
|
-
export function
|
|
69
|
-
const
|
|
70
|
-
const input = { dryRun:
|
|
71
|
-
const result = planRoute(routeOf(config),
|
|
68
|
+
export function planStudy(config, options, deps = {}) {
|
|
69
|
+
const study = localBrowserDefaults(config);
|
|
70
|
+
const input = { dryRun: resolveStudyDryRun(study, options.dryRun, true) ?? true };
|
|
71
|
+
const result = planRoute(routeOf(config), study, options, input, deps);
|
|
72
72
|
if (!result.ok)
|
|
73
73
|
return result;
|
|
74
74
|
// The manifest the CLI resolved enters the plan here and nowhere else; the routes read
|
|
75
|
-
// plan.
|
|
76
|
-
const plan = options.
|
|
75
|
+
// plan.study for the run's status record and bundle.
|
|
76
|
+
const plan = options.study === undefined ? result.plan : { ...result.plan, study: options.study };
|
|
77
77
|
return { ok: true, planned: { plan } };
|
|
78
78
|
}
|
|
79
|
-
function planRoute(route,
|
|
79
|
+
function planRoute(route, study, options, input, deps) {
|
|
80
80
|
switch (route) {
|
|
81
81
|
case "preview":
|
|
82
|
-
return planPreview(
|
|
82
|
+
return planPreview(study, options, input);
|
|
83
83
|
case "computer-use":
|
|
84
|
-
return
|
|
84
|
+
return planComputerUseStudy(study, {
|
|
85
85
|
...input,
|
|
86
86
|
hasRunSession: deps.runSession !== undefined,
|
|
87
87
|
driving: callerDrivingOf(options),
|
|
@@ -89,13 +89,13 @@ function planRoute(route, lab, options, input, deps) {
|
|
|
89
89
|
...(options.rerun === undefined ? {} : { rerun: options.rerun }),
|
|
90
90
|
});
|
|
91
91
|
case "shared-world":
|
|
92
|
-
return
|
|
92
|
+
return planSharedWorldStudy(study, {
|
|
93
93
|
...input,
|
|
94
94
|
hasRunSession: deps.runSession !== undefined,
|
|
95
95
|
});
|
|
96
96
|
case "terminal":
|
|
97
|
-
return
|
|
97
|
+
return planTerminalStudy(study, { ...input, hasCostProbe: deps.costProbe !== undefined });
|
|
98
98
|
case "scripted":
|
|
99
|
-
return
|
|
99
|
+
return planScriptedStudy(study, { ...input, injectedBrowser: injectedBrowser(deps) });
|
|
100
100
|
}
|
|
101
101
|
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { StudyPreflightResult, PreflightContext } from "./preflight.js";
|
|
2
|
+
export declare function runPublicPreviewPreflight(ctx: PreflightContext): Promise<StudyPreflightResult>;
|
|
3
|
+
export declare function runSandboxLoopbackPreflight(ctx: PreflightContext): Promise<StudyPreflightResult>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// The two reachability probes `humanish
|
|
1
|
+
// The two reachability probes `humanish study check` can run: public-preview checks a public
|
|
2
2
|
// target from an E2B desktop, and sandbox-loopback serves a clone subject inside one. Each leases one
|
|
3
3
|
// sandbox, journals it for `humanish reclaim --preflight`, and tears it down. preflight.ts resolves
|
|
4
|
-
// the
|
|
4
|
+
// the study and dispatches here.
|
|
5
5
|
import { cloneProvisioningBudgetMs, provisionCloneSubject } from "../subject/clone.js";
|
|
6
|
-
import {
|
|
6
|
+
import { CUA_ACTOR_STUDY_PROVIDER_METADATA } from "../routes/computer-use/e2b-desktop/prepare.js";
|
|
7
7
|
import { MAX_SANDBOX_MS } from "../substrates/e2b/lifetime.js";
|
|
8
8
|
import { abandonPreflightJournal, discardPreflightJournal, openPreflightJournal, } from "../run/preflight-receipts.js";
|
|
9
9
|
import { probeUrl } from "../substrates/detached.js";
|
|
@@ -13,6 +13,7 @@ import { e2bShell } from "../substrates/e2b/shell.js";
|
|
|
13
13
|
import { redactText } from "../evidence/redaction.js";
|
|
14
14
|
import { digest, fail, finalize } from "./preflight-result.js";
|
|
15
15
|
import { rosterOf } from "./parse/actors.js";
|
|
16
|
+
import { plural } from "../run/text.js";
|
|
16
17
|
const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
|
|
17
18
|
// Room on the probe's lease for desktop boot and teardown around the work it does.
|
|
18
19
|
const PREFLIGHT_LEASE_BUFFER_MS = 5 * 60_000;
|
|
@@ -92,7 +93,7 @@ export async function runSandboxLoopbackPreflight(ctx) {
|
|
|
92
93
|
{
|
|
93
94
|
name: "subject env",
|
|
94
95
|
ok: false,
|
|
95
|
-
message: `${missingEnv.length
|
|
96
|
+
message: `${plural(missingEnv.length, "declared env var value")} missing`,
|
|
96
97
|
},
|
|
97
98
|
]);
|
|
98
99
|
}
|
|
@@ -106,7 +107,7 @@ export async function runSandboxLoopbackPreflight(ctx) {
|
|
|
106
107
|
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", "sandbox-loopback preflight requires one clone repo and subject.serve.", [{ name: "clone subject", ok: false, message: "missing repo or serve block" }]);
|
|
107
108
|
}
|
|
108
109
|
let subjectCommitDigest;
|
|
109
|
-
// The longest the clone and serve steps can take with the
|
|
110
|
+
// The longest the clone and serve steps can take with the study's own budgets, so the probe is
|
|
110
111
|
// never cut off where the run's provisioning would still be allowed to finish.
|
|
111
112
|
const leaseMs = cloneProvisioningBudgetMs(serve, ctx.config.subject.state) + PREFLIGHT_LEASE_BUFFER_MS;
|
|
112
113
|
const probe = await withPreflightSandbox(ctx, { e2bApiKey, leaseMs }, async (shell) => {
|
|
@@ -167,7 +168,7 @@ async function withPreflightSandbox(ctx, args, callback) {
|
|
|
167
168
|
timeoutMs,
|
|
168
169
|
lifecycle: { onTimeout: "kill" },
|
|
169
170
|
metadata: {
|
|
170
|
-
...
|
|
171
|
+
...CUA_ACTOR_STUDY_PROVIDER_METADATA,
|
|
171
172
|
mode: "lab-preflight",
|
|
172
173
|
labId: ctx.config.id,
|
|
173
174
|
reachability: ctx.reachability,
|
|
@@ -282,7 +283,7 @@ function publicPreviewRouteError(config, route) {
|
|
|
282
283
|
if (route !== "computer-use" ||
|
|
283
284
|
config.subject.source !== "app-url" ||
|
|
284
285
|
config.execution?.target !== "e2b-desktop") {
|
|
285
|
-
return "public-preview preflight supports app-url × e2b-desktop computer-use
|
|
286
|
+
return "public-preview preflight supports app-url × e2b-desktop computer-use studies.";
|
|
286
287
|
}
|
|
287
288
|
if (config.policies?.allowPublicTargets !== true) {
|
|
288
289
|
return "public-preview preflight requires policies.allowPublicTargets: true so the owner explicitly declares the public/preview target.";
|
|
@@ -293,7 +294,7 @@ function sandboxLoopbackRouteError(config, route) {
|
|
|
293
294
|
if (route !== "computer-use" ||
|
|
294
295
|
config.subject.source !== "clone" ||
|
|
295
296
|
config.execution?.target !== "e2b-desktop") {
|
|
296
|
-
return "sandbox-loopback preflight supports clone × e2b-desktop computer-use
|
|
297
|
+
return "sandbox-loopback preflight supports clone × e2b-desktop computer-use studies. Local-tree studies cannot be preflighted yet; a dry run of the study is the current no-spend check.";
|
|
297
298
|
}
|
|
298
299
|
if (!config.subject.serve) {
|
|
299
300
|
return "sandbox-loopback preflight requires subject.serve.";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { StudyPreflightCheck, StudyPreflightResult, PreflightContext } from "./preflight.js";
|
|
2
|
+
/** The schema of `study check` results: whether a study is ready to run on this machine. */
|
|
3
|
+
export declare const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
|
|
4
|
+
export declare function finalize(ctx: PreflightContext, args?: {
|
|
5
|
+
check?: StudyPreflightCheck;
|
|
6
|
+
}): StudyPreflightResult;
|
|
7
|
+
export declare function fail(ctx: PreflightContext, code: NonNullable<StudyPreflightResult["error"]>["code"], message: string, checks: StudyPreflightCheck[]): StudyPreflightResult;
|
|
8
|
+
export declare function digest(value: string): string;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// preflight-probes.ts both finish through these, so they live below both.
|
|
3
3
|
import { automaticAnalysisBudget } from "../analysis/automatic-config.js";
|
|
4
4
|
import { digestText } from "../evidence/redaction.js";
|
|
5
|
-
/** The schema of `
|
|
5
|
+
/** The schema of `study check` results: whether a study is ready to run on this machine. */
|
|
6
6
|
export const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
|
|
7
7
|
export function finalize(ctx, args) {
|
|
8
8
|
const checks = args?.check ? [...ctx.checks, args.check] : ctx.checks;
|
|
@@ -13,8 +13,8 @@ export function finalize(ctx, args) {
|
|
|
13
13
|
ok: checks.every((check) => check.ok) &&
|
|
14
14
|
ctx.targets.every((target) => target.status !== "failed" && target.status !== "blocked"),
|
|
15
15
|
cwd: ctx.cwd,
|
|
16
|
-
study: ctx.
|
|
17
|
-
studyId: ctx.
|
|
16
|
+
study: ctx.study,
|
|
17
|
+
studyId: ctx.studyId,
|
|
18
18
|
origin: ctx.origin,
|
|
19
19
|
path: ctx.path,
|
|
20
20
|
route: ctx.route,
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import type { AutomaticAnalysisBudget } from "../analysis/automatic-config.js";
|
|
2
2
|
import type { E2BDesktopModule } from "../substrates/e2b/sdk.js";
|
|
3
|
-
import { type
|
|
3
|
+
import { type StudyConfig } from "./types.js";
|
|
4
4
|
import { STUDY_CHECK_SCHEMA } from "./preflight-result.js";
|
|
5
|
-
import { type
|
|
6
|
-
import { type
|
|
7
|
-
export type
|
|
8
|
-
export interface
|
|
5
|
+
import { type StudyRoute } from "./plan.js";
|
|
6
|
+
import { type StudyResolveFailure } from "./discover.js";
|
|
7
|
+
export type StudyPreflightReachabilityMode = "metadata" | "public-preview" | "sandbox-loopback" | "prepared-host";
|
|
8
|
+
export interface StudyPreflightCheck {
|
|
9
9
|
name: string;
|
|
10
10
|
ok: boolean;
|
|
11
11
|
message: string;
|
|
12
12
|
}
|
|
13
|
-
export interface
|
|
13
|
+
export interface StudyPreflightTarget {
|
|
14
14
|
label: string;
|
|
15
15
|
kind: "subject.appUrl" | "actors[0].lanes[].target" | "subject.serve.url" | "subject.product.publicSurface";
|
|
16
16
|
targetDigest: string;
|
|
@@ -23,7 +23,7 @@ export interface LabPreflightTarget {
|
|
|
23
23
|
errorCode?: "HUMANISH_PREFLIGHT_TARGET_BLOCKED" | "HUMANISH_PREFLIGHT_TARGET_UNREACHABLE";
|
|
24
24
|
message: string;
|
|
25
25
|
}
|
|
26
|
-
interface
|
|
26
|
+
interface StudyPreflightSandbox {
|
|
27
27
|
created: boolean;
|
|
28
28
|
killed?: boolean;
|
|
29
29
|
/** The probe's server-side timeout, after which the provider kills it. */
|
|
@@ -31,11 +31,11 @@ interface LabPreflightSandbox {
|
|
|
31
31
|
sandboxIdDigest?: string;
|
|
32
32
|
template?: string;
|
|
33
33
|
}
|
|
34
|
-
interface
|
|
34
|
+
interface StudyPreflightSpend {
|
|
35
35
|
e2bDesktop: boolean;
|
|
36
36
|
model: false;
|
|
37
37
|
}
|
|
38
|
-
export interface
|
|
38
|
+
export interface StudyPreflightResult {
|
|
39
39
|
/** The separate budget for a future live run, never spend by preflight itself. */
|
|
40
40
|
analysis?: AutomaticAnalysisBudget;
|
|
41
41
|
schema: typeof STUDY_CHECK_SCHEMA;
|
|
@@ -47,48 +47,48 @@ export interface LabPreflightResult {
|
|
|
47
47
|
studyId?: string;
|
|
48
48
|
origin?: string;
|
|
49
49
|
path?: string;
|
|
50
|
-
route?:
|
|
51
|
-
reachability:
|
|
52
|
-
checks:
|
|
53
|
-
targets:
|
|
54
|
-
sandbox:
|
|
55
|
-
spend:
|
|
50
|
+
route?: StudyRoute;
|
|
51
|
+
reachability: StudyPreflightReachabilityMode;
|
|
52
|
+
checks: StudyPreflightCheck[];
|
|
53
|
+
targets: StudyPreflightTarget[];
|
|
54
|
+
sandbox: StudyPreflightSandbox;
|
|
55
|
+
spend: StudyPreflightSpend;
|
|
56
56
|
warnings: string[];
|
|
57
57
|
error?: {
|
|
58
|
-
code:
|
|
58
|
+
code: StudyResolveFailure["error"]["code"] | "HUMANISH_STUDY_PREFLIGHT_INVALID_OPTION" | "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE" | "HUMANISH_STUDY_PREFLIGHT_TARGET_POLICY" | "HUMANISH_STUDY_PREFLIGHT_ENV_MISSING" | "HUMANISH_STUDY_PREFLIGHT_E2B_REQUIRED" | "HUMANISH_STUDY_PREFLIGHT_TARGET_UNREACHABLE" | "HUMANISH_STUDY_PREFLIGHT_PROVISION_FAILED" | "HUMANISH_STUDY_PREFLIGHT_TEARDOWN_FAILED";
|
|
59
59
|
message: string;
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
|
-
interface
|
|
62
|
+
interface StudyPreflightHooks {
|
|
63
63
|
loadDesktopModule?: () => Promise<E2BDesktopModule>;
|
|
64
64
|
now?: () => number;
|
|
65
65
|
sleep?: (ms: number) => Promise<void>;
|
|
66
66
|
}
|
|
67
|
-
export interface
|
|
67
|
+
export interface RunStudyPreflightOptions {
|
|
68
68
|
cwd: string;
|
|
69
|
-
|
|
70
|
-
reachability?:
|
|
69
|
+
study: string;
|
|
70
|
+
reachability?: StudyPreflightReachabilityMode;
|
|
71
71
|
timeoutMs?: number;
|
|
72
72
|
env?: NodeJS.ProcessEnv;
|
|
73
|
-
hooks?:
|
|
73
|
+
hooks?: StudyPreflightHooks;
|
|
74
74
|
}
|
|
75
75
|
/** A preflight run's state; the probes in preflight-probes.ts read and extend it. */
|
|
76
76
|
export interface PreflightContext {
|
|
77
77
|
cwd: string;
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
study: string;
|
|
79
|
+
studyId: string;
|
|
80
80
|
origin: string;
|
|
81
81
|
path: string;
|
|
82
|
-
config:
|
|
83
|
-
route:
|
|
84
|
-
reachability:
|
|
82
|
+
config: StudyConfig;
|
|
83
|
+
route: StudyRoute;
|
|
84
|
+
reachability: StudyPreflightReachabilityMode;
|
|
85
85
|
timeoutMs: number;
|
|
86
86
|
env: NodeJS.ProcessEnv;
|
|
87
|
-
hooks:
|
|
88
|
-
checks:
|
|
89
|
-
targets:
|
|
90
|
-
sandbox:
|
|
87
|
+
hooks: StudyPreflightHooks;
|
|
88
|
+
checks: StudyPreflightCheck[];
|
|
89
|
+
targets: StudyPreflightTarget[];
|
|
90
|
+
sandbox: StudyPreflightSandbox;
|
|
91
91
|
warnings: string[];
|
|
92
92
|
}
|
|
93
|
-
export declare function
|
|
93
|
+
export declare function runStudyPreflight(options: RunStudyPreflightOptions): Promise<StudyPreflightResult>;
|
|
94
94
|
export {};
|
|
@@ -4,24 +4,24 @@ import {} from "./types.js";
|
|
|
4
4
|
import { runPublicPreviewPreflight, runSandboxLoopbackPreflight } from "./preflight-probes.js";
|
|
5
5
|
import { digest, fail, finalize, STUDY_CHECK_SCHEMA } from "./preflight-result.js";
|
|
6
6
|
import { routeOf } from "./plan.js";
|
|
7
|
-
import {
|
|
7
|
+
import { resolveStudyManifest } from "./discover.js";
|
|
8
8
|
import { rosterOf } from "./parse/actors.js";
|
|
9
9
|
const DEFAULT_PREFLIGHT_TIMEOUT_MS = 30_000;
|
|
10
|
-
export async function
|
|
10
|
+
export async function runStudyPreflight(options) {
|
|
11
11
|
const cwd = path.resolve(options.cwd);
|
|
12
12
|
const reachability = options.reachability ?? "metadata";
|
|
13
13
|
const timeoutMs = options.timeoutMs ?? DEFAULT_PREFLIGHT_TIMEOUT_MS;
|
|
14
|
-
const resolved = await
|
|
14
|
+
const resolved = await resolveStudyManifest(cwd, options.study);
|
|
15
15
|
if (!resolved.ok) {
|
|
16
16
|
return {
|
|
17
17
|
schema: STUDY_CHECK_SCHEMA,
|
|
18
18
|
ok: false,
|
|
19
19
|
cwd,
|
|
20
|
-
study: options.
|
|
20
|
+
study: options.study,
|
|
21
21
|
reachability,
|
|
22
22
|
checks: [
|
|
23
23
|
{
|
|
24
|
-
name: "
|
|
24
|
+
name: "study file",
|
|
25
25
|
ok: false,
|
|
26
26
|
message: resolved.error.message,
|
|
27
27
|
},
|
|
@@ -36,8 +36,8 @@ export async function runLabPreflight(options) {
|
|
|
36
36
|
const route = routeOf(resolved.config);
|
|
37
37
|
const ctx = {
|
|
38
38
|
cwd,
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
study: options.study,
|
|
40
|
+
studyId: resolved.config.id,
|
|
41
41
|
origin: resolved.origin,
|
|
42
42
|
path: resolved.path,
|
|
43
43
|
config: resolved.config,
|
|
@@ -47,7 +47,7 @@ export async function runLabPreflight(options) {
|
|
|
47
47
|
env: options.env ?? process.env,
|
|
48
48
|
hooks: options.hooks ?? {},
|
|
49
49
|
checks: [
|
|
50
|
-
{ name: "
|
|
50
|
+
{ name: "study file", ok: true, message: `resolved ${resolved.origin} study file` },
|
|
51
51
|
{ name: "route", ok: true, message: `selected the ${route} route` },
|
|
52
52
|
],
|
|
53
53
|
targets: collectTargets(resolved.config),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyPlan, Requirement } from "./plan-types.js";
|
|
2
2
|
/** The `key` requirements whose value `env` lacks, OPENAI_API_KEY before E2B_API_KEY. */
|
|
3
3
|
export declare function missingKeys(requirements: readonly Requirement[], env: Record<string, string | undefined>): string[];
|
|
4
4
|
/** The subject env names the requirements list and `env` lacks, in declaration order. */
|
|
@@ -13,8 +13,8 @@ export declare function requiredSubjectEnv(requirements: readonly Requirement[])
|
|
|
13
13
|
/**
|
|
14
14
|
* The provider keys a live run of `plan` is known to read: its `key` and `key-one-of` names, its
|
|
15
15
|
* subject env, the external catch's token variable, ANTHROPIC_API_KEY for a Claude Code
|
|
16
|
-
* participant, and OPENAI_API_KEY when automatic analysis runs on OpenAI. `
|
|
16
|
+
* participant, and OPENAI_API_KEY when automatic analysis runs on OpenAI. `run` prints a
|
|
17
17
|
* key-source line for these only. Discovery still fills every key it finds: other readers, such as
|
|
18
18
|
* a declared scorer's host code, are not in the plan.
|
|
19
19
|
*/
|
|
20
|
-
export declare function keyNamesOf(plan:
|
|
20
|
+
export declare function keyNamesOf(plan: StudyPlan): ReadonlySet<string>;
|
|
@@ -30,7 +30,7 @@ export function requiredSubjectEnv(requirements) {
|
|
|
30
30
|
/**
|
|
31
31
|
* The provider keys a live run of `plan` is known to read: its `key` and `key-one-of` names, its
|
|
32
32
|
* subject env, the external catch's token variable, ANTHROPIC_API_KEY for a Claude Code
|
|
33
|
-
* participant, and OPENAI_API_KEY when automatic analysis runs on OpenAI. `
|
|
33
|
+
* participant, and OPENAI_API_KEY when automatic analysis runs on OpenAI. `run` prints a
|
|
34
34
|
* key-source line for these only. Discovery still fills every key it finds: other readers, such as
|
|
35
35
|
* a declared scorer's host code, are not in the plan.
|
|
36
36
|
*/
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { InternalRunStudyOptions } from "../run-study.js";
|
|
2
|
+
import type { RunScorerProvenance } from "../run/bundle.js";
|
|
3
|
+
import { type AdapterScorerModule } from "./adapter-scorer-loader.js";
|
|
4
|
+
import type { StudyDeps } from "./study-deps.js";
|
|
5
|
+
import type { StudyEvent } from "./run-study-events.js";
|
|
6
|
+
import type { ComputerUseRunInput } from "../routes/computer-use/types.js";
|
|
7
|
+
import type { ScriptedRunInput } from "../routes/scripted/types.js";
|
|
8
|
+
import type { SharedWorldRunInput } from "../routes/shared-world/types.js";
|
|
9
|
+
import type { TerminalRunInput } from "../routes/terminal/types.js";
|
|
10
|
+
export declare function computerUseInput(options: InternalRunStudyOptions, deps: StudyDeps, emit: StudyEmit | undefined): ComputerUseRunInput;
|
|
11
|
+
export declare function scriptedInput(options: InternalRunStudyOptions, deps: StudyDeps, emit: StudyEmit | undefined): ScriptedRunInput;
|
|
12
|
+
export declare function terminalInput(options: InternalRunStudyOptions, deps: StudyDeps, emit: StudyEmit | undefined): TerminalRunInput;
|
|
13
|
+
export declare function sharedWorldInput(options: InternalRunStudyOptions, deps: StudyDeps, emit: StudyEmit | undefined): SharedWorldRunInput;
|
|
14
|
+
/** A scorer the CLI loads after the route's local checks, and the provenance it stamps on the run. */
|
|
15
|
+
export type LateScorer = Pick<InternalRunStudyOptions, "scorer" | "scorerProvenance">;
|
|
16
|
+
/** Narrows RunStudyOptions.scorer to the context the route passes (adapter-scorer-loader.ts). */
|
|
17
|
+
type NarrowScorer<S> = (scorer: AdapterScorerModule) => S;
|
|
18
|
+
/**
|
|
19
|
+
* A route's input with a scorer loaded after admission, and the scorer's provenance, as if the
|
|
20
|
+
* caller had passed them up front. The rest of the input is the one the route's checks admitted.
|
|
21
|
+
*/
|
|
22
|
+
export declare function withLateScorer<S, I extends {
|
|
23
|
+
scorer?: S;
|
|
24
|
+
scorerProvenance?: RunScorerProvenance;
|
|
25
|
+
}>(input: I, late: LateScorer | undefined, narrow: NarrowScorer<S>): I;
|
|
26
|
+
/** Reports a StudyEvent to onEvent without waiting (normalizeRunStudyOptions builds it). */
|
|
27
|
+
type StudyEmit = (event: StudyEvent) => void;
|
|
28
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// What each route's run takes from
|
|
1
|
+
// What each route's run takes from runStudyWith's options: the shared run settings, the typed options
|
|
2
2
|
// the route reads, the event emitter, the test seams and the declared scorer's provenance.
|
|
3
3
|
import { browserRouteScorer, terminalRouteScorer, } from "./adapter-scorer-loader.js";
|
|
4
4
|
export function computerUseInput(options, deps, emit) {
|