humanish 0.108.0 → 0.109.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +58 -59
- package/CHANGELOG.md +22 -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/migrate.js +15 -4
- 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 +9 -7
- 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/evidence/redaction.d.ts +11 -0
- package/dist/evidence/redaction.js +43 -0
- package/dist/feedback/draft.js +2 -2
- package/dist/feedback/export-bundle.js +5 -4
- 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/in-process-desktop.js +1 -1
- 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 +27 -27
- 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 +8 -3
- package/dist/study/migrate.js +60 -4
- 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} +4 -4
- 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} +16 -15
- 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 +6 -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 +2 -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,25 +1,25 @@
|
|
|
1
1
|
import type { Brain, ComputerUsePlan, NonEmpty, PlannedAnalysis, ProvisionedSubject, Requirement } from "./plan-types.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { StudyConfig } from "./types.js";
|
|
3
3
|
export type Base = Omit<ComputerUsePlan, "route" | "actor" | "runner" | "concurrency" | "sessionBudgetMs" | "sandboxMs" | "caps" | "rerun">;
|
|
4
4
|
export declare function isNonEmpty<T>(values: readonly T[]): values is NonEmpty<T>;
|
|
5
|
-
export declare function capsOf(config:
|
|
6
|
-
export declare function provisionedSubject(config:
|
|
5
|
+
export declare function capsOf(config: StudyConfig): ComputerUsePlan["caps"];
|
|
6
|
+
export declare function provisionedSubject(config: StudyConfig): ProvisionedSubject | undefined;
|
|
7
7
|
/** Keys, env and local tools a live run checks right before it acquires anything. */
|
|
8
|
-
export declare function desktopRequirements(config:
|
|
8
|
+
export declare function desktopRequirements(config: StudyConfig, args: {
|
|
9
9
|
e2b: boolean;
|
|
10
10
|
brain: Brain;
|
|
11
11
|
localVm: boolean;
|
|
12
12
|
externalCatch: boolean;
|
|
13
13
|
}): Requirement[];
|
|
14
|
-
export declare function brainOf(config:
|
|
14
|
+
export declare function brainOf(config: StudyConfig, callerProvider: boolean): Brain;
|
|
15
15
|
/** The brain of a run whose provider the library caller supplies. */
|
|
16
|
-
export declare function callerBrainOf(config:
|
|
16
|
+
export declare function callerBrainOf(config: StudyConfig): Extract<Brain, {
|
|
17
17
|
kind: "caller";
|
|
18
18
|
}>;
|
|
19
19
|
/** The model a participant's spend is priced at when its provider reports none. */
|
|
20
20
|
export declare function pricedModel(brain: Brain): string;
|
|
21
21
|
/** The fields every plan shares, from a config whose analysis already resolved. */
|
|
22
|
-
export declare function planBase(config:
|
|
22
|
+
export declare function planBase(config: StudyConfig, input: {
|
|
23
23
|
readonly dryRun: boolean;
|
|
24
24
|
readonly analysis?: {
|
|
25
25
|
readonly config?: PlannedAnalysis["config"] | undefined;
|
|
@@ -110,7 +110,7 @@ export function pricedModel(brain) {
|
|
|
110
110
|
export function planBase(config, input) {
|
|
111
111
|
const analysis = input.analysis?.config;
|
|
112
112
|
return {
|
|
113
|
-
|
|
113
|
+
studyId: config.id,
|
|
114
114
|
...(config.title === undefined ? {} : { title: config.title }),
|
|
115
115
|
residual: residualOf(config),
|
|
116
116
|
dryRun: input.dryRun,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { DwellWindow, StopWhen } from "../actors/stop-conditions.js";
|
|
2
2
|
import type { ReasoningEffort } from "../actors/reasoning-effort.js";
|
|
3
3
|
import { type DevicePreset } from "./device-presets.js";
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
4
|
+
import type { StudyTask } from "./tasks.js";
|
|
5
|
+
import type { StudyConfig } from "./types.js";
|
|
6
6
|
/** Who one participant is. Every route with participants carries this record. */
|
|
7
7
|
export interface Participant {
|
|
8
8
|
/** Declared roster id, else `lane-NN` (independent participants) or `role-NN` (shared-world participants). */
|
|
@@ -40,7 +40,7 @@ interface DesktopParticipant extends Participant {
|
|
|
40
40
|
}
|
|
41
41
|
/** Only independent computer-use participants consume a task protocol and their own target. */
|
|
42
42
|
export interface ComputerUseParticipant extends DesktopParticipant {
|
|
43
|
-
readonly tasks?: readonly
|
|
43
|
+
readonly tasks?: readonly StudyTask[];
|
|
44
44
|
/** app-url fan-out only: this participant's own entry URL; absent means the subject URL. */
|
|
45
45
|
readonly targetUrl?: string;
|
|
46
46
|
}
|
|
@@ -68,14 +68,14 @@ export type SharedWorldRoster = {
|
|
|
68
68
|
/** One shared-world participant on either plane. */
|
|
69
69
|
export type SharedWorldParticipant = ProvisionedParticipant | ExternalPublicParticipant;
|
|
70
70
|
/**
|
|
71
|
-
* The participants of a computer-use
|
|
71
|
+
* The participants of a computer-use study: the declared roster, else `count` identical ones. A count
|
|
72
72
|
* override (`--count`) applies only when no roster is declared.
|
|
73
73
|
*/
|
|
74
|
-
export declare function computerUseParticipants(config:
|
|
75
|
-
/** The participants of a shared-world
|
|
76
|
-
export declare function sharedWorldParticipants(config:
|
|
77
|
-
/** The ids of the participants a computer-use or shared-world
|
|
78
|
-
export declare function declaredParticipantIds(config:
|
|
74
|
+
export declare function computerUseParticipants(config: StudyConfig, countOverride?: number): ComputerUseParticipant[];
|
|
75
|
+
/** The participants of a shared-world study, one per roster entry, typed by the plane they share. */
|
|
76
|
+
export declare function sharedWorldParticipants(config: StudyConfig): SharedWorldRoster;
|
|
77
|
+
/** The ids of the participants a computer-use or shared-world study runs, in roster order. */
|
|
78
|
+
export declare function declaredParticipantIds(config: StudyConfig): string[];
|
|
79
79
|
/** The entry URLs roster entries declare in place of the subject URL (computer use, app-url). */
|
|
80
|
-
export declare function declaredTargets(config:
|
|
80
|
+
export declare function declaredTargets(config: StudyConfig): string[];
|
|
81
81
|
export {};
|
|
@@ -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 {};
|