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,56 +1,56 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyConfig } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Cross-validate the computer-use fan-out declaration (`per-lane-worlds`). Returns the failure
|
|
4
|
-
* message, or null when valid. The parser enforces it, and
|
|
4
|
+
* message, or null when valid. The parser enforces it, and runStudyWith checks it again for a config
|
|
5
5
|
* that skipped the parser. It runs rosterStructuralValidationReason (id and device
|
|
6
6
|
* validity, unique ids) first, then the route-scoped XOR, cap and policy checks.
|
|
7
7
|
*/
|
|
8
|
-
export declare function computerUseValidationReason(config:
|
|
8
|
+
export declare function computerUseValidationReason(config: StudyConfig): string | null;
|
|
9
9
|
/**
|
|
10
10
|
* Cross-validate a `topology: shared-world` declaration. Returns the failure message, or
|
|
11
11
|
* null when the one shared-world route can run it: the external-public checks for an app-url
|
|
12
12
|
* subject, the provisioned checks otherwise. Enforced at parse and again by the route, since
|
|
13
|
-
*
|
|
13
|
+
* runStudyWith takes a config that skipped the parser.
|
|
14
14
|
*/
|
|
15
|
-
export declare function sharedWorldValidationReason(config:
|
|
15
|
+
export declare function sharedWorldValidationReason(config: StudyConfig): string | null;
|
|
16
16
|
/**
|
|
17
17
|
* Declared capture devices must be implemented by the selected execution route.
|
|
18
18
|
* Unsupported backends pass false when called directly, where the declared
|
|
19
19
|
* topology may not identify the backend that is actually executing.
|
|
20
20
|
*/
|
|
21
|
-
export declare function desktopMediaValidationReason(config:
|
|
21
|
+
export declare function desktopMediaValidationReason(config: StudyConfig, supportsMedia?: boolean): string | undefined;
|
|
22
22
|
/** Reused by direct library runners so unsupported receiving never becomes inert configuration. */
|
|
23
|
-
export declare function receivingEmailValidationReason(config:
|
|
23
|
+
export declare function receivingEmailValidationReason(config: StudyConfig): string | undefined;
|
|
24
24
|
/** Refuse task declarations that the selected execution path would discard.
|
|
25
25
|
* Direct runners pass their actual support rather than trusting the config's dispatch shape. */
|
|
26
|
-
export declare function taskProtocolValidationReason(config:
|
|
26
|
+
export declare function taskProtocolValidationReason(config: StudyConfig, supportsTasks?: boolean): string | null;
|
|
27
27
|
/**
|
|
28
28
|
* Refuse a clone subject whose target is not an explicit e2b-desktop. Every clone route clones and
|
|
29
|
-
* serves the repo inside a hosted desktop sandbox, and routeOf sends every clone
|
|
29
|
+
* serves the repo inside a hosted desktop sandbox, and routeOf sends every clone study to
|
|
30
30
|
* one, so any other target, or none, would still run on an E2B desktop. Requiring it explicitly
|
|
31
31
|
* also means the parser's clone checks, which run only on e2b-desktop, cannot be skipped. Enforced
|
|
32
32
|
* at parse and again on the computer-use and scripted-browser routes for library callers.
|
|
33
33
|
*/
|
|
34
|
-
export declare function cloneTargetValidationReason(config:
|
|
34
|
+
export declare function cloneTargetValidationReason(config: StudyConfig): string | null;
|
|
35
35
|
/**
|
|
36
|
-
* Refuse a positive `scenario.caps.maxUsd` or `maxTotalUsd` on a computer-use
|
|
36
|
+
* Refuse a positive `scenario.caps.maxUsd` or `maxTotalUsd` on a computer-use study.
|
|
37
37
|
* `scenario.caps` belongs to the terminal route; the computer-use route stops on `execution.caps`,
|
|
38
|
-
* so a dollar figure here would read as a cap while the
|
|
38
|
+
* so a dollar figure here would read as a cap while the study ran uncapped. Zero spends nothing
|
|
39
39
|
* either way and stays a warning. Enforced at parse and again on the computer-use routes for
|
|
40
40
|
* library callers.
|
|
41
41
|
*/
|
|
42
|
-
export declare function scenarioCapsValidationReason(config:
|
|
42
|
+
export declare function scenarioCapsValidationReason(config: StudyConfig): string | null;
|
|
43
43
|
/** Refuse a claimed output bound when the route cannot pass it to the first-party provider. */
|
|
44
|
-
export declare function outputTokenLimitValidationReason(config:
|
|
44
|
+
export declare function outputTokenLimitValidationReason(config: StudyConfig): string | null;
|
|
45
45
|
/**
|
|
46
46
|
* Cross-validate a concurrent shared-world declaration. Returns the failure message,
|
|
47
47
|
* or null when valid. Includes the base shared-world checks plus the concurrent extras: a synthetic
|
|
48
48
|
* subject attestation, a 0.0.0.0 serve bind (getHost only routes to a port bound on
|
|
49
49
|
* all interfaces), and no `subject.clone.keep`/`subject.localTree.keep` (either would
|
|
50
|
-
* orphan actor sandboxes). Enforced at parse and re-enforced in the engine (
|
|
50
|
+
* orphan actor sandboxes). Enforced at parse and re-enforced in the engine (runStudyWith
|
|
51
51
|
* takes a config that skipped the parser).
|
|
52
52
|
*/
|
|
53
|
-
export declare function concurrentSharedWorldValidationReason(config:
|
|
53
|
+
export declare function concurrentSharedWorldValidationReason(config: StudyConfig): string | null;
|
|
54
54
|
/**
|
|
55
55
|
* Cross-validate the external-public shared-world declaration: a real public
|
|
56
56
|
* deployment used directly as the shared plane (no getHost, no clone, no subject sandbox, no seed).
|
|
@@ -60,8 +60,8 @@ export declare function concurrentSharedWorldValidationReason(config: LabConfig)
|
|
|
60
60
|
* non-loopback appUrl + allowPublicTargets + the operator-ownership attestation subject.publicTarget +
|
|
61
61
|
* concurrency >= 2 + an actors[0].lanes roster of ≥2 with exactly one host participant. The getHost synthetic
|
|
62
62
|
* gate is deliberately unreachable here (there is no internet-reachable harness-owned URL to attest).
|
|
63
|
-
* Enforced at parse and re-enforced in the engine (
|
|
63
|
+
* Enforced at parse and re-enforced in the engine (runStudyWith takes a config that skipped the parser).
|
|
64
64
|
*/
|
|
65
|
-
export declare function externalPublicSharedWorldValidationReason(config:
|
|
65
|
+
export declare function externalPublicSharedWorldValidationReason(config: StudyConfig): string | null;
|
|
66
66
|
/** Analysis requires a live recording producer, including supported dry-run previews. */
|
|
67
|
-
export declare function automaticAnalysisRouteReason(config:
|
|
67
|
+
export declare function automaticAnalysisRouteReason(config: StudyConfig): string | undefined;
|
|
@@ -5,7 +5,7 @@ import { declaredTargets } from "./plan-participants.js";
|
|
|
5
5
|
import { actorResolvesToComputerUse, computerUseParticipantCount, MAX_COMPUTER_USE_PARTICIPANTS, registeredComputerUseActors, resolveEntryUrl, isComputerUseComposition, isScriptedBrowserComposition, isSharedWorldComposition, isTerminalProductComposition, } from "./routing.js";
|
|
6
6
|
/**
|
|
7
7
|
* Cross-validate the computer-use fan-out declaration (`per-lane-worlds`). Returns the failure
|
|
8
|
-
* message, or null when valid. The parser enforces it, and
|
|
8
|
+
* message, or null when valid. The parser enforces it, and runStudyWith checks it again for a config
|
|
9
9
|
* that skipped the parser. It runs rosterStructuralValidationReason (id and device
|
|
10
10
|
* validity, unique ids) first, then the route-scoped XOR, cap and policy checks.
|
|
11
11
|
*/
|
|
@@ -66,7 +66,7 @@ export function computerUseValidationReason(config) {
|
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Engine-level path-token validation for configs supplied directly through the
|
|
69
|
-
* public TypeScript/JavaScript API instead of
|
|
69
|
+
* public TypeScript/JavaScript API instead of parseStudy.
|
|
70
70
|
*/
|
|
71
71
|
function rosterStructuralValidationReason(config) {
|
|
72
72
|
const roster = rosterOf(config.actors[0]);
|
|
@@ -100,7 +100,7 @@ function rosterStructuralValidationReason(config) {
|
|
|
100
100
|
* Cross-validate a `topology: shared-world` declaration. Returns the failure message, or
|
|
101
101
|
* null when the one shared-world route can run it: the external-public checks for an app-url
|
|
102
102
|
* subject, the provisioned checks otherwise. Enforced at parse and again by the route, since
|
|
103
|
-
*
|
|
103
|
+
* runStudyWith takes a config that skipped the parser.
|
|
104
104
|
*/
|
|
105
105
|
export function sharedWorldValidationReason(config) {
|
|
106
106
|
return config.subject.source === "app-url"
|
|
@@ -192,7 +192,7 @@ export function receivingEmailValidationReason(config) {
|
|
|
192
192
|
return undefined;
|
|
193
193
|
if (!isComputerUseComposition(config) ||
|
|
194
194
|
!["app-url", "clone", "local-tree"].includes(config.subject.source)) {
|
|
195
|
-
return "Real email receiving requires a hosted computer-use browser
|
|
195
|
+
return "Real email receiving requires a hosted computer-use browser study with an app-url, clone, or local-tree subject. Scripted, terminal, desktop-cli and local-app routes are unsupported.";
|
|
196
196
|
}
|
|
197
197
|
if (config.actors.some((actor) => actor.type === "local-agent")) {
|
|
198
198
|
return "Real email receiving is unavailable for local-agent: its host process does not isolate the inbox management credential. Use a hosted first-party computer-use actor.";
|
|
@@ -216,7 +216,7 @@ export function taskProtocolValidationReason(config, supportsTasks = isComputerU
|
|
|
216
216
|
}
|
|
217
217
|
/**
|
|
218
218
|
* Refuse a clone subject whose target is not an explicit e2b-desktop. Every clone route clones and
|
|
219
|
-
* serves the repo inside a hosted desktop sandbox, and routeOf sends every clone
|
|
219
|
+
* serves the repo inside a hosted desktop sandbox, and routeOf sends every clone study to
|
|
220
220
|
* one, so any other target, or none, would still run on an E2B desktop. Requiring it explicitly
|
|
221
221
|
* also means the parser's clone checks, which run only on e2b-desktop, cannot be skipped. Enforced
|
|
222
222
|
* at parse and again on the computer-use and scripted-browser routes for library callers.
|
|
@@ -226,12 +226,12 @@ export function cloneTargetValidationReason(config) {
|
|
|
226
226
|
if (config.subject.source !== "clone" || target === "e2b-desktop")
|
|
227
227
|
return null;
|
|
228
228
|
const got = target === undefined ? "it is absent" : `got "${target}"`;
|
|
229
|
-
return `clone subjects require \`execution.target: e2b-desktop\` (${got}):
|
|
229
|
+
return `clone subjects require \`execution.target: e2b-desktop\` (${got}): humanish clones and serves the repo inside a hosted desktop sandbox. \`execution.target: local\` applies to app-url and local-app subjects.`;
|
|
230
230
|
}
|
|
231
231
|
/**
|
|
232
|
-
* Refuse a positive `scenario.caps.maxUsd` or `maxTotalUsd` on a computer-use
|
|
232
|
+
* Refuse a positive `scenario.caps.maxUsd` or `maxTotalUsd` on a computer-use study.
|
|
233
233
|
* `scenario.caps` belongs to the terminal route; the computer-use route stops on `execution.caps`,
|
|
234
|
-
* so a dollar figure here would read as a cap while the
|
|
234
|
+
* so a dollar figure here would read as a cap while the study ran uncapped. Zero spends nothing
|
|
235
235
|
* either way and stays a warning. Enforced at parse and again on the computer-use routes for
|
|
236
236
|
* library callers.
|
|
237
237
|
*/
|
|
@@ -242,7 +242,7 @@ export function scenarioCapsValidationReason(config) {
|
|
|
242
242
|
const value = config.scenario?.caps?.[key];
|
|
243
243
|
if (value === undefined || value <= 0)
|
|
244
244
|
continue;
|
|
245
|
-
return `scenario.caps.${key} (${value}) does not cap a computer-use
|
|
245
|
+
return `scenario.caps.${key} (${value}) does not cap a computer-use study: this route stops on execution.caps.${key}. Move the value to execution.caps.${key}; scenario.caps applies only to terminal-product studies.`;
|
|
246
246
|
}
|
|
247
247
|
return null;
|
|
248
248
|
}
|
|
@@ -274,14 +274,14 @@ function sharedWorldConcurrencyReason(config) {
|
|
|
274
274
|
const concurrency = config.execution?.concurrency ?? participants;
|
|
275
275
|
if (concurrency >= 2)
|
|
276
276
|
return null;
|
|
277
|
-
return `shared-world
|
|
277
|
+
return `shared-world studies need \`execution.concurrency\` of at least 2 (got ${concurrency}). Sequential shared-world turns (concurrency 1) were removed in 0.106.0: omit execution.concurrency to run every participant at once, or set it to 2 or more. A provisioned subject also needs \`subject.exposure: synthetic\` and a \`serve.start\` that binds 0.0.0.0.`;
|
|
278
278
|
}
|
|
279
279
|
/**
|
|
280
280
|
* Cross-validate a concurrent shared-world declaration. Returns the failure message,
|
|
281
281
|
* or null when valid. Includes the base shared-world checks plus the concurrent extras: a synthetic
|
|
282
282
|
* subject attestation, a 0.0.0.0 serve bind (getHost only routes to a port bound on
|
|
283
283
|
* all interfaces), and no `subject.clone.keep`/`subject.localTree.keep` (either would
|
|
284
|
-
* orphan actor sandboxes). Enforced at parse and re-enforced in the engine (
|
|
284
|
+
* orphan actor sandboxes). Enforced at parse and re-enforced in the engine (runStudyWith
|
|
285
285
|
* takes a config that skipped the parser).
|
|
286
286
|
*/
|
|
287
287
|
export function concurrentSharedWorldValidationReason(config) {
|
|
@@ -314,7 +314,7 @@ export function concurrentSharedWorldValidationReason(config) {
|
|
|
314
314
|
* non-loopback appUrl + allowPublicTargets + the operator-ownership attestation subject.publicTarget +
|
|
315
315
|
* concurrency >= 2 + an actors[0].lanes roster of ≥2 with exactly one host participant. The getHost synthetic
|
|
316
316
|
* gate is deliberately unreachable here (there is no internet-reachable harness-owned URL to attest).
|
|
317
|
-
* Enforced at parse and re-enforced in the engine (
|
|
317
|
+
* Enforced at parse and re-enforced in the engine (runStudyWith takes a config that skipped the parser).
|
|
318
318
|
*/
|
|
319
319
|
export function externalPublicSharedWorldValidationReason(config) {
|
|
320
320
|
const structuralReason = rosterStructuralValidationReason(config);
|
|
@@ -385,5 +385,5 @@ export function automaticAnalysisRouteReason(config) {
|
|
|
385
385
|
isSharedWorldComposition(config) ||
|
|
386
386
|
["app-url", "local-app", "local-tree", "desktop-cli", "terminal-product"].includes(config.subject.source))
|
|
387
387
|
return undefined;
|
|
388
|
-
return "review.analysis requires a computer-use, scripted-browser, terminal-product or shared-world
|
|
388
|
+
return "review.analysis requires a computer-use, scripted-browser, terminal-product or shared-world study; this study's route does not produce an eligible live recording.";
|
|
389
389
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyConfig } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* The fields a config sets that its route does not read, each as `field` or `field (reason)`. A v2
|
|
4
4
|
* file gets them as one warning; a v3 study is refused for any of them.
|
|
5
5
|
*/
|
|
6
|
-
export declare function inertFieldLabels(config:
|
|
6
|
+
export declare function inertFieldLabels(config: StudyConfig): string[];
|
|
7
7
|
/**
|
|
8
8
|
* The same fields as `inertFieldLabels`, as paths without their reasons, such as
|
|
9
9
|
* `actors[0].lanes[].entry` or `execution.timeoutMs`. `humanish migrate` drops each one.
|
|
10
10
|
*/
|
|
11
|
-
export declare function inertFieldPaths(config:
|
|
12
|
-
export declare function forwardDeclaredWarnings(config:
|
|
11
|
+
export declare function inertFieldPaths(config: StudyConfig): string[];
|
|
12
|
+
export declare function forwardDeclaredWarnings(config: StudyConfig): string[];
|
|
@@ -136,7 +136,7 @@ const CONFIG_ROWS = [
|
|
|
136
136
|
// declared external one would silently collect nothing.
|
|
137
137
|
{
|
|
138
138
|
field: "comms.email.external",
|
|
139
|
-
reason: "this subject is harness-provisioned, so humanish hosts the catch itself and injects its URL; an adopter-hosted catch would receive nothing. Drop `external` here, or move the
|
|
139
|
+
reason: "this subject is harness-provisioned, so humanish hosts the catch itself and injects its URL; an adopter-hosted catch would receive nothing. Drop `external` here, or move the study to an app-url or operator-provisioned subject",
|
|
140
140
|
applies: (config) => Boolean(config.comms?.email?.external) &&
|
|
141
141
|
(config.subject.source === "clone" || config.subject.source === "local-tree"),
|
|
142
142
|
},
|
package/dist/subject/clone.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../run/bundle.js";
|
|
3
3
|
import { type DetachedTimers } from "../substrates/detached.js";
|
|
4
4
|
import { type Shell } from "../substrates/shell.js";
|
|
5
5
|
import { type SubjectPhaseEvent } from "./steps.js";
|
|
6
|
-
/** The longest provisionCloneSubject can take with the
|
|
7
|
-
export declare function cloneProvisioningBudgetMs(serve:
|
|
6
|
+
/** The longest provisionCloneSubject can take with the study's budgets: the clone, then serving. */
|
|
7
|
+
export declare function cloneProvisioningBudgetMs(serve: StudySubjectServe, state: StudySubjectState | undefined): number;
|
|
8
8
|
/**
|
|
9
9
|
* Provision a clone subject inside the sandbox: clone, then the shared serve pipeline (install,
|
|
10
10
|
* state before-build, build, state before-start, start, readiness probe, state after-ready).
|
|
11
11
|
* Returns the latest subject HEAD after successful provisioning. Throws (with a capped log tail
|
|
12
|
-
* for the caller to redact) on any failing step; the
|
|
12
|
+
* for the caller to redact) on any failing step; the route persists that as a failed-evidence
|
|
13
13
|
* bundle.
|
|
14
14
|
*
|
|
15
15
|
* Auth: when GITHUB_TOKEN is among the declared subject env names, the clone authenticates via an
|
|
@@ -20,9 +20,9 @@ export declare function cloneProvisioningBudgetMs(serve: LabSubjectServe, state:
|
|
|
20
20
|
export declare function provisionCloneSubject(shell: Shell, args: {
|
|
21
21
|
repo: string;
|
|
22
22
|
depth: number;
|
|
23
|
-
serve:
|
|
23
|
+
serve: StudySubjectServe;
|
|
24
24
|
/** Declared subject state (seed steps; external declaration is provenance-only). */
|
|
25
|
-
state?:
|
|
25
|
+
state?: StudySubjectState;
|
|
26
26
|
hasGithubToken: boolean;
|
|
27
27
|
requestTimeoutMs: number;
|
|
28
28
|
/** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
|
package/dist/subject/clone.js
CHANGED
|
@@ -3,7 +3,7 @@ import { detachedTimersOf, runDetachedStep } from "../substrates/detached.js";
|
|
|
3
3
|
import { runOrThrow } from "../substrates/shell.js";
|
|
4
4
|
import { runSubjectServePipeline, serveProvisioningBudgetMs } from "./serve.js";
|
|
5
5
|
import { SOURCE_TIMEOUT_MS, emitPhaseCompleted, emitPhaseStarted, SUBJECT_DIR, } from "./steps.js";
|
|
6
|
-
/** The longest provisionCloneSubject can take with the
|
|
6
|
+
/** The longest provisionCloneSubject can take with the study's budgets: the clone, then serving. */
|
|
7
7
|
export function cloneProvisioningBudgetMs(serve, state) {
|
|
8
8
|
return SOURCE_TIMEOUT_MS + serveProvisioningBudgetMs(serve, state);
|
|
9
9
|
}
|
|
@@ -11,7 +11,7 @@ export function cloneProvisioningBudgetMs(serve, state) {
|
|
|
11
11
|
* Provision a clone subject inside the sandbox: clone, then the shared serve pipeline (install,
|
|
12
12
|
* state before-build, build, state before-start, start, readiness probe, state after-ready).
|
|
13
13
|
* Returns the latest subject HEAD after successful provisioning. Throws (with a capped log tail
|
|
14
|
-
* for the caller to redact) on any failing step; the
|
|
14
|
+
* for the caller to redact) on any failing step; the route persists that as a failed-evidence
|
|
15
15
|
* bundle.
|
|
16
16
|
*
|
|
17
17
|
* Auth: when GITHUB_TOKEN is among the declared subject env names, the clone authenticates via an
|
|
@@ -76,7 +76,7 @@ export declare function createLocalTreeArchive(root: string, options?: CreateLoc
|
|
|
76
76
|
* produces (no leading "./", no trailing "/"). Absolute paths and glob syntax
|
|
77
77
|
* are rejected instead of silently ignored: an exclude the author believed in but
|
|
78
78
|
* that never matches anything is a leak vector, so unusable shapes fail
|
|
79
|
-
* closed at the packing boundary (and, for
|
|
80
|
-
* time in src/
|
|
79
|
+
* closed at the packing boundary (and, for study manifests, already at parse
|
|
80
|
+
* time in src/study/parse/subject.ts).
|
|
81
81
|
*/
|
|
82
82
|
export declare function normalizeExtraExcludeEntry(entry: string): string;
|
|
@@ -111,7 +111,7 @@ export function createLocalTreeArchive(root, options = {}) {
|
|
|
111
111
|
if (entries.length === 0) {
|
|
112
112
|
throw new Error(`Local tree root "${path.basename(resolvedRoot)}" produced zero packable entries after the always-on denylist` +
|
|
113
113
|
(extraExclude.length > 0 ? " and extraExclude" : "") +
|
|
114
|
-
"; local-tree packing requires at least one non-denylisted file or symlink. (Paths in this message are basenames only; the packed root is the
|
|
114
|
+
"; local-tree packing requires at least one non-denylisted file or symlink. (Paths in this message are basenames only; the packed root is the study's working directory.)");
|
|
115
115
|
}
|
|
116
116
|
// Check the cap from enumerated sizes before reading/hashing file bytes, so
|
|
117
117
|
// an oversized tree fails closed without the cost of hashing all of it.
|
|
@@ -292,8 +292,8 @@ function isDenylistedSegment(relPath) {
|
|
|
292
292
|
* produces (no leading "./", no trailing "/"). Absolute paths and glob syntax
|
|
293
293
|
* are rejected instead of silently ignored: an exclude the author believed in but
|
|
294
294
|
* that never matches anything is a leak vector, so unusable shapes fail
|
|
295
|
-
* closed at the packing boundary (and, for
|
|
296
|
-
* time in src/
|
|
295
|
+
* closed at the packing boundary (and, for study manifests, already at parse
|
|
296
|
+
* time in src/study/parse/subject.ts).
|
|
297
297
|
*/
|
|
298
298
|
export function normalizeExtraExcludeEntry(entry) {
|
|
299
299
|
const trimmed = entry.trim();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../run/bundle.js";
|
|
3
3
|
import { type DetachedTimers } from "../substrates/detached.js";
|
|
4
4
|
import type { Shell } from "../substrates/shell.js";
|
|
@@ -14,9 +14,9 @@ import { type SubjectPhaseEvent } from "./steps.js";
|
|
|
14
14
|
export declare function provisionLocalTreeSubject(shell: Shell, args: {
|
|
15
15
|
/** The once-per-run packed archive bytes (shared byte-identically across every participant). */
|
|
16
16
|
archiveBuffer: ArrayBuffer;
|
|
17
|
-
serve:
|
|
17
|
+
serve: StudySubjectServe;
|
|
18
18
|
/** Declared subject state (seed steps; external declaration is provenance-only). */
|
|
19
|
-
state?:
|
|
19
|
+
state?: StudySubjectState;
|
|
20
20
|
requestTimeoutMs: number;
|
|
21
21
|
/** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
|
|
22
22
|
scrub: (text: string) => string;
|
package/dist/subject/runtime.js
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
// Node for the computer-use clone/local-tree route. Without it, any study whose `serve.install`
|
|
6
6
|
// runs npm or pnpm dies with `pnpm: command not found` after its sandbox is created and paid for.
|
|
7
7
|
//
|
|
8
|
-
// That failure is invisible up front: `
|
|
8
|
+
// That failure is invisible up front: `study show` is clean, the plan prints normally, the sandbox
|
|
9
9
|
// provisions, and the first signal is a shell exit code attributed to "subject install failed".
|
|
10
10
|
// Nobody can debug that from the outside.
|
|
11
11
|
//
|
|
12
|
-
// The harness provides the runtime instead of warning about it. An adopter writing a
|
|
12
|
+
// The harness provides the runtime instead of warning about it. An adopter writing a study for a Node app should not have to
|
|
13
13
|
// know which binaries the template happens to carry. That is the harness's job, and the terminal
|
|
14
14
|
// route already treats it that way. Detection is conservative and the bootstrap is skipped whenever
|
|
15
15
|
// a runtime is already present, so a custom template that ships Node pays nothing.
|
package/dist/subject/serve.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../run/bundle.js";
|
|
3
3
|
import { type DetachedTimers } from "../substrates/detached.js";
|
|
4
4
|
import type { Shell } from "../substrates/shell.js";
|
|
@@ -8,7 +8,7 @@ import { type SubjectPhaseEvent } from "./steps.js";
|
|
|
8
8
|
* with their one retry, the package-manager step, every seed step, the build and the readiness
|
|
9
9
|
* wait. Detached-step polling adds seconds on top.
|
|
10
10
|
*/
|
|
11
|
-
export declare function serveProvisioningBudgetMs(serve:
|
|
11
|
+
export declare function serveProvisioningBudgetMs(serve: StudySubjectServe, state: StudySubjectState | undefined): number;
|
|
12
12
|
/**
|
|
13
13
|
* The provisioning pipeline the clone and local-tree routes share once SUBJECT_DIR is populated
|
|
14
14
|
* (by git clone, or by upload and extract): install, state before-build, build, state
|
|
@@ -21,9 +21,9 @@ export declare function serveProvisioningBudgetMs(serve: LabSubjectServe, state:
|
|
|
21
21
|
* eats the session budget.
|
|
22
22
|
*/
|
|
23
23
|
export declare function runSubjectServePipeline(shell: Shell, args: {
|
|
24
|
-
serve:
|
|
24
|
+
serve: StudySubjectServe;
|
|
25
25
|
/** Declared subject state (seed steps; external declaration is provenance-only). */
|
|
26
|
-
state?:
|
|
26
|
+
state?: StudySubjectState;
|
|
27
27
|
requestTimeoutMs: number;
|
|
28
28
|
/** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
|
|
29
29
|
scrub: (text: string) => string;
|
package/dist/subject/state.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyStateStepWhen, StudySubjectState } from "../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../run/bundle.js";
|
|
3
3
|
import { type DetachedTimers } from "../substrates/detached.js";
|
|
4
4
|
import type { Shell } from "../substrates/shell.js";
|
|
@@ -11,8 +11,8 @@ export declare function commandDigestOf(command: string): string;
|
|
|
11
11
|
* `subject-state-<name>` so a step can never collide with a serve step. Each step's record goes
|
|
12
12
|
* to `onStateStep` as it finishes; the first failure throws with its scrubbed log tail.
|
|
13
13
|
*/
|
|
14
|
-
export declare function runStateSteps(shell: Shell, when:
|
|
15
|
-
state?:
|
|
14
|
+
export declare function runStateSteps(shell: Shell, when: StudyStateStepWhen, args: {
|
|
15
|
+
state?: StudySubjectState;
|
|
16
16
|
requestTimeoutMs: number;
|
|
17
17
|
/** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
|
|
18
18
|
scrub: (text: string) => string;
|
package/dist/subject/state.js
CHANGED
|
@@ -39,7 +39,7 @@ export async function runStateSteps(shell, when, args) {
|
|
|
39
39
|
args.onStateStep?.({
|
|
40
40
|
name: step.name,
|
|
41
41
|
when,
|
|
42
|
-
// Digest only (sha256-16): the command text never persists: the
|
|
42
|
+
// Digest only (sha256-16): the command text never persists: the study YAML in the
|
|
43
43
|
// consumer's repo is the plaintext source of truth.
|
|
44
44
|
commandDigest: commandDigestOf(step.command),
|
|
45
45
|
ok: result.ok,
|
package/dist/subject/steps.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export declare function emitPhaseCompleted(onPhase: ((event: SubjectPhaseEvent)
|
|
|
27
27
|
/** Default phase-boundary sink (stderr): one line per event, prefixed with the participant id
|
|
28
28
|
* only when the run has more than one participant. A single participant still gets every line:
|
|
29
29
|
* a silent clone, install, build and ready boot is the bug this event stream exists to close.
|
|
30
|
-
* Overridable via
|
|
30
|
+
* Overridable via StudyDeps.subjectPhaseSink so deterministic tests capture instead of writing to
|
|
31
31
|
* the real stderr. */
|
|
32
32
|
export declare function defaultSubjectPhaseSink(event: SubjectPhaseEvent, participant: {
|
|
33
33
|
readonly id: string;
|
package/dist/subject/steps.js
CHANGED
|
@@ -25,7 +25,7 @@ export function emitPhaseCompleted(onPhase, now, startedAt, phase, ok, message)
|
|
|
25
25
|
/** Default phase-boundary sink (stderr): one line per event, prefixed with the participant id
|
|
26
26
|
* only when the run has more than one participant. A single participant still gets every line:
|
|
27
27
|
* a silent clone, install, build and ready boot is the bug this event stream exists to close.
|
|
28
|
-
* Overridable via
|
|
28
|
+
* Overridable via StudyDeps.subjectPhaseSink so deterministic tests capture instead of writing to
|
|
29
29
|
* the real stderr. */
|
|
30
30
|
export function defaultSubjectPhaseSink(event, participant) {
|
|
31
31
|
const durationSuffix = event.durationMs === undefined ? "" : ` (${event.durationMs}ms)`;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
|
|
2
2
|
/**
|
|
3
3
|
* Wrap an already-acquired resource. The adapter supplies release authority as a closure;
|
|
4
4
|
* this layer never reconstructs it from a saved ID or enumerates provider resources.
|
|
@@ -12,7 +12,7 @@ export function ownDesktopAllocation(options) {
|
|
|
12
12
|
let closing;
|
|
13
13
|
const assertOpen = () => {
|
|
14
14
|
if (closing !== undefined)
|
|
15
|
-
throw new
|
|
15
|
+
throw new ComputerUseExecutorError("executor_closed", "not_dispatched");
|
|
16
16
|
};
|
|
17
17
|
const close = (policy = {}) => {
|
|
18
18
|
// Install the promise before invoking release: concurrent/reentrant callers share it.
|
|
@@ -10,7 +10,7 @@ export declare function detachedTimersOf(options: DetachedTimers): DetachedTimer
|
|
|
10
10
|
export interface DetachedStepOptions extends DetachedTimers {
|
|
11
11
|
/** Short [a-z0-9-] label; names the script/status/log files under /tmp. */
|
|
12
12
|
name: string;
|
|
13
|
-
/** The shell command to run (the
|
|
13
|
+
/** The shell command to run (the study author's own command: package.json-script trust). */
|
|
14
14
|
command: string;
|
|
15
15
|
cwd?: string;
|
|
16
16
|
/** Wall-clock budget for the step. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyDesktopBrowser } from "../../study/types.js";
|
|
2
2
|
import type { E2BDesktopSandbox } from "./sdk.js";
|
|
3
3
|
import type { DesktopMediaEvidence } from "./desktop-media.js";
|
|
4
4
|
export declare const DESKTOP_SETTLE_MS = 8000;
|
|
@@ -27,7 +27,7 @@ export type ChromeDevToolsReadiness = {
|
|
|
27
27
|
/** Reads the readiness markers from a launch command's stdout. */
|
|
28
28
|
export declare function parseChromeDevToolsReadiness(stdout: string): ChromeDevToolsReadiness | undefined;
|
|
29
29
|
export interface DesktopBrowserEvidence {
|
|
30
|
-
requested:
|
|
30
|
+
requested: StudyDesktopBrowser;
|
|
31
31
|
resolved?: string;
|
|
32
32
|
/** Synthetic media devices the browser was launched with, and how permission is answered. */
|
|
33
33
|
media?: DesktopMediaEvidence;
|
|
@@ -42,7 +42,7 @@ export interface DesktopBrowserLaunchIdentity {
|
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
44
|
* Runtime-only launch result. `evidence` is what the bundle records: the requested browser and the
|
|
45
|
-
* one that launched, and only when the
|
|
45
|
+
* one that launched, and only when the study declared a browser.
|
|
46
46
|
*/
|
|
47
47
|
export interface DesktopBrowserLaunchResult {
|
|
48
48
|
family: DesktopBrowserFamily;
|
|
@@ -65,7 +65,7 @@ export declare function buildFillDesktopWindowCommand(windowId: string, width: n
|
|
|
65
65
|
* below checks for clipping and refuses an uncorrectable window before the actor runs.
|
|
66
66
|
*/
|
|
67
67
|
export declare function fillDesktopBrowserWindow(desktop: E2BDesktopSandbox, windowId: string, resolution: readonly [number, number], requestTimeoutMs: number): Promise<void>;
|
|
68
|
-
export declare function openDesktopBrowserTarget(desktop: E2BDesktopSandbox, targetUrl: string, requestTimeoutMs: number, browserPreference:
|
|
68
|
+
export declare function openDesktopBrowserTarget(desktop: E2BDesktopSandbox, targetUrl: string, requestTimeoutMs: number, browserPreference: StudyDesktopBrowser | undefined,
|
|
69
69
|
/** Launch-time flags that make mobile fidelity hold across every tab: the user agent and
|
|
70
70
|
* touch events are browser-wide here, where the CDP holder covers only the launch page. */
|
|
71
71
|
extraChromiumFlags?: readonly string[], environment?: Readonly<Record<string, string>>): Promise<DesktopBrowserLaunchResult>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// window a desktop-CLI study starts in.
|
|
3
3
|
import { CHROMIUM_EVIDENCE_HYGIENE_FLAGS, chromiumEvidenceProfilePreferencesJson, } from "../../evidence/browser-hygiene.js";
|
|
4
4
|
import { failureTail } from "../../evidence/redaction.js";
|
|
5
|
-
import { isHttpUrl } from "../../
|
|
5
|
+
import { isHttpUrl } from "../../study/parse/subject.js";
|
|
6
6
|
import { runDetachedStep } from "../detached.js";
|
|
7
7
|
import { shellQuote } from "../shell.js";
|
|
8
8
|
import { e2bShell } from "./shell.js";
|
|
@@ -59,7 +59,7 @@ export declare function makeChromeBrowserStateObserver(desktop: E2BDesktopSandbo
|
|
|
59
59
|
text?: string;
|
|
60
60
|
scrollY?: number;
|
|
61
61
|
}>;
|
|
62
|
-
/** The user agent a mobile-emulated participant presents unless the
|
|
62
|
+
/** The user agent a mobile-emulated participant presents unless the study sets its own. */
|
|
63
63
|
export declare const DEFAULT_MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
64
64
|
/**
|
|
65
65
|
* Apply mobile emulation to the participant's launch page and read back what the page reports.
|
|
@@ -97,7 +97,7 @@ export function makeChromeBrowserStateObserver(desktop, requestTimeoutMs, endpoi
|
|
|
97
97
|
};
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
-
/** The user agent a mobile-emulated participant presents unless the
|
|
100
|
+
/** The user agent a mobile-emulated participant presents unless the study sets its own. */
|
|
101
101
|
export const DEFAULT_MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
102
102
|
/**
|
|
103
103
|
* Apply mobile emulation to the participant's launch page and read back what the page reports.
|
|
@@ -77,7 +77,7 @@ export type CuaTypePhase = "desktop-write" | "text-tempfile" | "text-command";
|
|
|
77
77
|
* password), so the message names the phase and, for xdotool, its exit code only: no text, no
|
|
78
78
|
* temp-file path, no substrate output. The loop records `.name` + `.message` into the actor trace.
|
|
79
79
|
*/
|
|
80
|
-
export declare class
|
|
80
|
+
export declare class ComputerUseTypeError extends Error {
|
|
81
81
|
readonly phase: CuaTypePhase;
|
|
82
82
|
readonly exitCode?: number;
|
|
83
83
|
constructor(phase: CuaTypePhase, exitCode?: number);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { shellQuote } from "../shell.js";
|
|
2
2
|
import { perceptualSignature } from "../../evidence/frame-signature.js";
|
|
3
3
|
import { commandFailureInfo } from "../command-failure.js";
|
|
4
|
-
import {
|
|
4
|
+
import { ComputerUseExecutorError } from "../../actors/computer-use/executor-error.js";
|
|
5
5
|
import { xdotoolHeldModifiers } from "../../guest/desktop-keys.js";
|
|
6
6
|
const DEFAULT_WAIT_MS = 500;
|
|
7
7
|
const DEFAULT_SCROLL_AMOUNT_PER_TICK = 100;
|
|
@@ -72,12 +72,12 @@ function toBuffer(bytes) {
|
|
|
72
72
|
* password), so the message names the phase and, for xdotool, its exit code only: no text, no
|
|
73
73
|
* temp-file path, no substrate output. The loop records `.name` + `.message` into the actor trace.
|
|
74
74
|
*/
|
|
75
|
-
export class
|
|
75
|
+
export class ComputerUseTypeError extends Error {
|
|
76
76
|
phase;
|
|
77
77
|
exitCode;
|
|
78
78
|
constructor(phase, exitCode) {
|
|
79
79
|
super(`type failed at ${phase}${exitCode === undefined ? "" : ` (exit ${exitCode})`}`);
|
|
80
|
-
this.name = "
|
|
80
|
+
this.name = "ComputerUseTypeError";
|
|
81
81
|
this.phase = phase;
|
|
82
82
|
if (exitCode !== undefined)
|
|
83
83
|
this.exitCode = exitCode;
|
|
@@ -107,17 +107,17 @@ async function typeText(desktop, text) {
|
|
|
107
107
|
directory = made.stdout?.trim();
|
|
108
108
|
}
|
|
109
109
|
catch {
|
|
110
|
-
throw new
|
|
110
|
+
throw new ComputerUseTypeError("text-tempfile");
|
|
111
111
|
}
|
|
112
112
|
if (directory === undefined || !TYPE_DIRECTORY.test(directory))
|
|
113
|
-
throw new
|
|
113
|
+
throw new ComputerUseTypeError("text-tempfile");
|
|
114
114
|
const file = `${directory}/text`;
|
|
115
115
|
try {
|
|
116
116
|
try {
|
|
117
117
|
await files.write(file, text, { requestTimeoutMs: TYPE_COMMAND_TIMEOUT_MS });
|
|
118
118
|
}
|
|
119
119
|
catch {
|
|
120
|
-
throw new
|
|
120
|
+
throw new ComputerUseTypeError("text-tempfile");
|
|
121
121
|
}
|
|
122
122
|
// xdotool waits the delay after every character, so a long text needs a longer budget.
|
|
123
123
|
const timeoutMs = TYPE_COMMAND_TIMEOUT_MS + [...text].length * XDOTOOL_TYPE_DELAY_MS;
|
|
@@ -127,11 +127,11 @@ async function typeText(desktop, text) {
|
|
|
127
127
|
}
|
|
128
128
|
catch (error) {
|
|
129
129
|
// The SDK throws on a non-zero exit; only its exit code is kept.
|
|
130
|
-
throw new
|
|
130
|
+
throw new ComputerUseTypeError("text-command", commandFailureInfo(error).exitCode);
|
|
131
131
|
}
|
|
132
132
|
// A structural fake may return a non-zero exit instead of throwing, as the SDK does.
|
|
133
133
|
if (result?.exitCode !== undefined && result.exitCode !== 0)
|
|
134
|
-
throw new
|
|
134
|
+
throw new ComputerUseTypeError("text-command", result.exitCode);
|
|
135
135
|
}
|
|
136
136
|
finally {
|
|
137
137
|
await commands.run(`rm -rf -- ${shellQuote(directory)}`, quick).catch(() => undefined);
|
|
@@ -230,7 +230,7 @@ export function createE2BDesktopExecutor(desktop, options = {}) {
|
|
|
230
230
|
await desktop.write(action.text);
|
|
231
231
|
}
|
|
232
232
|
catch {
|
|
233
|
-
throw new
|
|
233
|
+
throw new ComputerUseTypeError("desktop-write");
|
|
234
234
|
}
|
|
235
235
|
return;
|
|
236
236
|
}
|
|
@@ -261,7 +261,7 @@ export function createE2BDesktopExecutor(desktop, options = {}) {
|
|
|
261
261
|
// capturing here would double-capture. Leave the desktop untouched.
|
|
262
262
|
return;
|
|
263
263
|
case "speak":
|
|
264
|
-
throw new
|
|
264
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
265
265
|
}
|
|
266
266
|
}
|
|
267
267
|
}
|
|
@@ -278,7 +278,7 @@ function sendsNoInput(action) {
|
|
|
278
278
|
async function withHeldModifiers(desktop, chord, run) {
|
|
279
279
|
const commands = desktop.commands;
|
|
280
280
|
if (!commands)
|
|
281
|
-
throw new
|
|
281
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
282
282
|
const options = { requestTimeoutMs: HELD_KEYS_TIMEOUT_MS, timeoutMs: HELD_KEYS_TIMEOUT_MS };
|
|
283
283
|
let failed = false;
|
|
284
284
|
let failure;
|
|
@@ -295,7 +295,7 @@ async function withHeldModifiers(desktop, chord, run) {
|
|
|
295
295
|
await commands.run(`xdotool keyup ${chord}`, options);
|
|
296
296
|
}
|
|
297
297
|
catch {
|
|
298
|
-
throw new
|
|
298
|
+
throw new ComputerUseExecutorError("execution_failed", "outcome_uncertain");
|
|
299
299
|
}
|
|
300
300
|
if (failed)
|
|
301
301
|
throw failure;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DevicePreset } from "../../
|
|
1
|
+
import { type DevicePreset } from "../../study/device-presets.js";
|
|
2
2
|
import { type RunDesktopGeometry } from "../../run/streams.js";
|
|
3
3
|
import { type ChromeCdpPagePreference } from "./cdp-probe.js";
|
|
4
4
|
import { type DesktopBrowserFamily, type DesktopBrowserLaunchIdentity } from "./desktop-browser.js";
|