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
|
@@ -3,7 +3,7 @@ import { type AnalysisFetch, type AnalysisProvider } from "./provider.js";
|
|
|
3
3
|
import type { RejectedAnalysisOutput } from "./diagnostics.js";
|
|
4
4
|
export declare const ANALYSIS_PROMPT_VERSION = "study-evidence-6";
|
|
5
5
|
export declare const isSupportedAnalysisModel: (model: string) => boolean;
|
|
6
|
-
/** The OpenAI output limit when a
|
|
6
|
+
/** The OpenAI output limit when a study omits maxOutputTokens, and the most it may ask for. */
|
|
7
7
|
export declare const DEFAULT_ANALYSIS_MAX_OUTPUT_TOKENS = 16384;
|
|
8
8
|
export declare const MAX_ANALYSIS_OUTPUT_TOKENS = 32768;
|
|
9
9
|
export interface AnalysisAdmission {
|
package/dist/analysis/execute.js
CHANGED
|
@@ -21,7 +21,7 @@ const SUPPORTED_ANALYSIS_MODELS = Object.freeze([
|
|
|
21
21
|
]);
|
|
22
22
|
const SUPPORTED_MODELS = new Set(SUPPORTED_ANALYSIS_MODELS);
|
|
23
23
|
export const isSupportedAnalysisModel = (model) => SUPPORTED_MODELS.has(model);
|
|
24
|
-
/** The OpenAI output limit when a
|
|
24
|
+
/** The OpenAI output limit when a study omits maxOutputTokens, and the most it may ask for. */
|
|
25
25
|
export const DEFAULT_ANALYSIS_MAX_OUTPUT_TOKENS = 16_384;
|
|
26
26
|
export const MAX_ANALYSIS_OUTPUT_TOKENS = 32_768;
|
|
27
27
|
const MAX_EVIDENCE_BYTES = 1024 * 1024;
|
package/dist/analysis/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ActorStatus, ActorCompletionReason, ActorStopCause, ParticipantDeclaredOutcome } from "../actors/contract.js";
|
|
2
2
|
import type { CuaGoalSource } from "../actors/goal-source.js";
|
|
3
3
|
import type { AutomaticAnalysisView } from "./job.js";
|
|
4
|
+
import type { RunAnalysisCost } from "../run/run-cost.js";
|
|
4
5
|
/** Independent interpretation of retained evidence; never a participant or harness verdict. */
|
|
5
6
|
export declare const ANALYSIS_SCHEMA: "humanish.study-analysis.v1";
|
|
6
7
|
export declare const ANALYSIS_CORRECTION_SCHEMA: "humanish.study-analysis-correction.v1";
|
|
@@ -213,5 +214,10 @@ export interface LoadedAnalysis {
|
|
|
213
214
|
warnings: string[];
|
|
214
215
|
/** Independent post-run execution metadata; never changes evidence sharing grades. */
|
|
215
216
|
automatic?: AutomaticAnalysisView;
|
|
217
|
+
/**
|
|
218
|
+
* What the run's analysis requests cost, every attempt counted once (src/run/costs.ts
|
|
219
|
+
* readAnalysisAccounting, the reader stats uses). Absent when the run sent none.
|
|
220
|
+
*/
|
|
221
|
+
spend?: RunAnalysisCost;
|
|
216
222
|
}
|
|
217
223
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
|
|
2
2
|
import { BROWSER_CONTROL_LIMITS, BROWSER_CONTROL_VERSION, decodeBrowserControlObservation, parseBrowserControlReply, sameBrowserControlIdentity, validateBrowserControlAction, validateBrowserControlIdentity, } from "./protocol.js";
|
|
3
3
|
import { BrowserControlTransport } from "./transport.js";
|
|
4
4
|
import { receiveBrowserControlRecording } from "./recording-transfer.js";
|
|
@@ -8,7 +8,7 @@ export function createBrowserControlClient(options) {
|
|
|
8
8
|
if (!Number.isFinite(timeoutMs) ||
|
|
9
9
|
timeoutMs < 1 ||
|
|
10
10
|
timeoutMs > BROWSER_CONTROL_LIMITS.maxRequestTimeoutMs)
|
|
11
|
-
throw new
|
|
11
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
12
12
|
const state = {
|
|
13
13
|
identity,
|
|
14
14
|
timeoutMs,
|
|
@@ -47,7 +47,7 @@ function closeClient(state, code) {
|
|
|
47
47
|
state.pending = undefined;
|
|
48
48
|
if (operation) {
|
|
49
49
|
operation.dispose();
|
|
50
|
-
operation.reject(new
|
|
50
|
+
operation.reject(new ComputerUseExecutorError(code, operation.written ? "outcome_uncertain" : "not_dispatched"));
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
/** Settles the pending exchange once both its reply has arrived and its request write finished. */
|
|
@@ -68,7 +68,7 @@ function finishExchange(session) {
|
|
|
68
68
|
code !== "action_rejected" ||
|
|
69
69
|
disposition !== "not_dispatched")
|
|
70
70
|
session.transport.close(code);
|
|
71
|
-
operation.reject(new
|
|
71
|
+
operation.reject(new ComputerUseExecutorError(code, disposition));
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
/** Matches a reply frame to the pending request; any mismatch closes the channel. */
|
|
@@ -120,12 +120,12 @@ function acceptReply(session, value) {
|
|
|
120
120
|
function exchange(session, operation, action, signal, destination) {
|
|
121
121
|
const { transport } = session;
|
|
122
122
|
if (session.closed)
|
|
123
|
-
return Promise.reject(new
|
|
123
|
+
return Promise.reject(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
|
|
124
124
|
if (signal?.aborted)
|
|
125
|
-
return Promise.reject(new
|
|
125
|
+
return Promise.reject(new ComputerUseExecutorError("cancelled", "not_dispatched"));
|
|
126
126
|
if (session.seq >= Number.MAX_SAFE_INTEGER) {
|
|
127
127
|
transport.close("protocol_mismatch");
|
|
128
|
-
return Promise.reject(new
|
|
128
|
+
return Promise.reject(new ComputerUseExecutorError("protocol_mismatch", "not_dispatched"));
|
|
129
129
|
}
|
|
130
130
|
session.seq += 1;
|
|
131
131
|
const seq = session.seq;
|
|
@@ -174,9 +174,9 @@ function exchange(session, operation, action, signal, destination) {
|
|
|
174
174
|
/** Runs one public operation at a time on an open client. */
|
|
175
175
|
async function withOperation(session, work) {
|
|
176
176
|
if (session.closed)
|
|
177
|
-
throw new
|
|
177
|
+
throw new ComputerUseExecutorError("executor_closed", "not_dispatched");
|
|
178
178
|
if (session.busy)
|
|
179
|
-
throw new
|
|
179
|
+
throw new ComputerUseExecutorError("executor_busy", "not_dispatched");
|
|
180
180
|
session.busy = true;
|
|
181
181
|
try {
|
|
182
182
|
return await work();
|
|
@@ -202,34 +202,34 @@ async function observe(session) {
|
|
|
202
202
|
}
|
|
203
203
|
catch {
|
|
204
204
|
session.transport.close("invalid_response");
|
|
205
|
-
throw new
|
|
205
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
206
206
|
}
|
|
207
207
|
}
|
|
208
208
|
async function execute(session, action, signal) {
|
|
209
209
|
const validAction = validateBrowserControlAction(action);
|
|
210
210
|
if (validAction.kind === "speak" && !session.speechEnabled) {
|
|
211
|
-
throw new
|
|
211
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
212
212
|
}
|
|
213
213
|
if (signal?.aborted)
|
|
214
|
-
throw new
|
|
214
|
+
throw new ComputerUseExecutorError("cancelled", "not_dispatched");
|
|
215
215
|
try {
|
|
216
216
|
await hello(session, signal);
|
|
217
217
|
}
|
|
218
218
|
catch (error) {
|
|
219
|
-
if (error instanceof
|
|
220
|
-
throw new
|
|
219
|
+
if (error instanceof ComputerUseExecutorError)
|
|
220
|
+
throw new ComputerUseExecutorError(error.code, "not_dispatched");
|
|
221
221
|
throw error;
|
|
222
222
|
}
|
|
223
223
|
await exchange(session, "EXECUTE", validAction, signal);
|
|
224
224
|
}
|
|
225
225
|
async function finishRecording(session, destination) {
|
|
226
226
|
if (!destination || destination.destroyed)
|
|
227
|
-
throw new
|
|
227
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
228
228
|
try {
|
|
229
229
|
await hello(session);
|
|
230
230
|
const reply = await exchange(session, "FINISH_RECORDING", undefined, undefined, destination);
|
|
231
231
|
if (!reply.ok || !reply.recording)
|
|
232
|
-
throw new
|
|
232
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
233
233
|
return reply.recording;
|
|
234
234
|
}
|
|
235
235
|
catch (error) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
|
|
2
2
|
import { BROWSER_CONTROL_LIMITS, BROWSER_CONTROL_VERSION, encodeBrowserControlObservation, parseBrowserControlRequest, safeBrowserControlFailure, sameBrowserControlIdentity, validateBrowserControlIdentity, } from "./protocol.js";
|
|
3
3
|
import { BrowserControlTransport } from "./transport.js";
|
|
4
4
|
import { sendBrowserControlRecording } from "./recording-transfer.js";
|
|
@@ -103,7 +103,7 @@ function failure(common, error, invoked) {
|
|
|
103
103
|
async function dispatch(session, request, signal) {
|
|
104
104
|
const common = replyCommon(session.identity, request);
|
|
105
105
|
if (!authorized(session.options) || signal.aborted) {
|
|
106
|
-
const refusal = new
|
|
106
|
+
const refusal = new ComputerUseExecutorError("session_revoked", "not_dispatched");
|
|
107
107
|
await sendReply(session, request, failure(common, refusal, false));
|
|
108
108
|
return;
|
|
109
109
|
}
|
|
@@ -160,7 +160,7 @@ async function execute(session, request, common, signal) {
|
|
|
160
160
|
let invoked = false, reply;
|
|
161
161
|
try {
|
|
162
162
|
if (request.action.kind === "speak" && session.options.executor.speechEnabled !== true) {
|
|
163
|
-
throw new
|
|
163
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
164
164
|
}
|
|
165
165
|
// No await between the owner gate in dispatch and invocation. The physical driver must
|
|
166
166
|
// check this signal again immediately before each actual input after preparation.
|
|
@@ -183,7 +183,7 @@ async function finishRecording(session, request, common, signal) {
|
|
|
183
183
|
let reply;
|
|
184
184
|
try {
|
|
185
185
|
if (!options.finishRecording)
|
|
186
|
-
throw new
|
|
186
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
187
187
|
const recording = await options.finishRecording();
|
|
188
188
|
let metadata;
|
|
189
189
|
try {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PNG } from "pngjs";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { CUA_SPEECH_LIMITS } from "../actors/computer-use/speech.js";
|
|
4
|
-
import {
|
|
4
|
+
import { ComputerUseExecutorError, isComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
|
|
5
5
|
import { desktopRecordingMetadataSchema } from "../evidence/desktop-recording-types.js";
|
|
6
6
|
export const BROWSER_CONTROL_VERSION = 1;
|
|
7
7
|
export const BROWSER_CONTROL_LIMITS = Object.freeze({
|
|
@@ -219,7 +219,7 @@ const replySchema = z.discriminatedUnion("ok", [
|
|
|
219
219
|
export function validateBrowserControlIdentity(value) {
|
|
220
220
|
const parsed = identitySchema.safeParse(value);
|
|
221
221
|
if (!parsed.success)
|
|
222
|
-
throw new
|
|
222
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
223
223
|
return parsed.data;
|
|
224
224
|
}
|
|
225
225
|
export function sameBrowserControlIdentity(a, b) {
|
|
@@ -230,41 +230,41 @@ export function sameBrowserControlIdentity(a, b) {
|
|
|
230
230
|
export function parseBrowserControlRequest(value) {
|
|
231
231
|
const parsed = requestSchema.safeParse(value);
|
|
232
232
|
if (!parsed.success)
|
|
233
|
-
throw new
|
|
233
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
234
234
|
const request = parsed.data;
|
|
235
235
|
if (request.requestId !== `request-${request.seq}` ||
|
|
236
236
|
(request.operation === "EXECUTE" && request.actionId !== `action-${request.seq}`))
|
|
237
|
-
throw new
|
|
237
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
238
238
|
return request;
|
|
239
239
|
}
|
|
240
240
|
export function parseBrowserControlReply(value) {
|
|
241
241
|
const parsed = replySchema.safeParse(value);
|
|
242
242
|
if (!parsed.success)
|
|
243
|
-
throw new
|
|
243
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
244
244
|
const reply = parsed.data;
|
|
245
245
|
if ((reply.operation === "EXECUTE") !== (reply.actionId !== undefined) ||
|
|
246
246
|
(reply.ok &&
|
|
247
247
|
((reply.operation === "OBSERVE") !== (reply.observation !== undefined) ||
|
|
248
248
|
(reply.operation === "FINISH_RECORDING") !== (reply.recording !== undefined))))
|
|
249
|
-
throw new
|
|
249
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
250
250
|
return reply;
|
|
251
251
|
}
|
|
252
252
|
export function validateBrowserControlAction(value) {
|
|
253
253
|
const parsed = wireActionSchema.safeParse(value);
|
|
254
254
|
if (!parsed.success)
|
|
255
|
-
throw new
|
|
255
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
256
256
|
return parsed.data;
|
|
257
257
|
}
|
|
258
258
|
export function validateHeardSpeech(value) {
|
|
259
259
|
const parsed = heardSpeechListSchema.safeParse(value);
|
|
260
260
|
if (!parsed.success)
|
|
261
|
-
throw new
|
|
261
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
262
262
|
return parsed.data;
|
|
263
263
|
}
|
|
264
264
|
/** Check dimensions before allocating decoder output; v1 accepts browser-style 8-bit, noninterlaced PNG. */
|
|
265
265
|
export function validateBrowserControlPng(bytes) {
|
|
266
266
|
const fail = () => {
|
|
267
|
-
throw new
|
|
267
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
268
268
|
};
|
|
269
269
|
if (bytes.length < 45 ||
|
|
270
270
|
bytes.length > BROWSER_CONTROL_LIMITS.pngBytes ||
|
|
@@ -316,7 +316,7 @@ export function encodeBrowserControlObservation(observation) {
|
|
|
316
316
|
if (!observation ||
|
|
317
317
|
observation.appState !== undefined ||
|
|
318
318
|
!Buffer.isBuffer(observation.screenshot))
|
|
319
|
-
throw new
|
|
319
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
320
320
|
validateBrowserControlPng(observation.screenshot);
|
|
321
321
|
const parsed = observationSchema.safeParse({
|
|
322
322
|
png: observation.screenshot.toString("base64"),
|
|
@@ -328,17 +328,17 @@ export function encodeBrowserControlObservation(observation) {
|
|
|
328
328
|
...(observation.heardSpeech !== undefined ? { heardSpeech: observation.heardSpeech } : {}),
|
|
329
329
|
});
|
|
330
330
|
if (!parsed.success)
|
|
331
|
-
throw new
|
|
331
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
332
332
|
return parsed.data;
|
|
333
333
|
}
|
|
334
334
|
export function decodeBrowserControlObservation(value) {
|
|
335
335
|
const parsed = observationSchema.safeParse(value);
|
|
336
336
|
if (!parsed.success)
|
|
337
|
-
throw new
|
|
337
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
338
338
|
const { png, ...state } = parsed.data;
|
|
339
339
|
const screenshot = Buffer.from(png, "base64");
|
|
340
340
|
if (screenshot.toString("base64") !== png)
|
|
341
|
-
throw new
|
|
341
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
342
342
|
validateBrowserControlPng(screenshot);
|
|
343
343
|
return {
|
|
344
344
|
screenshot,
|
|
@@ -351,7 +351,7 @@ export function decodeBrowserControlObservation(value) {
|
|
|
351
351
|
};
|
|
352
352
|
}
|
|
353
353
|
export function safeBrowserControlFailure(error, dispatched) {
|
|
354
|
-
if (
|
|
354
|
+
if (isComputerUseExecutorError(error))
|
|
355
355
|
return { code: error.code, disposition: error.disposition };
|
|
356
356
|
return {
|
|
357
357
|
code: "action_rejected",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Transform } from "node:stream";
|
|
2
2
|
import { pipeline } from "node:stream/promises";
|
|
3
|
-
import {
|
|
3
|
+
import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
|
|
4
4
|
import { DESKTOP_RECORDING_MAX_BYTES } from "../evidence/desktop-recording-types.js";
|
|
5
5
|
const BROWSER_CONTROL_RECORDING_TRANSFER_TIMEOUT_MS = 120_000;
|
|
6
6
|
function exactBytes(expected) {
|
|
@@ -17,7 +17,7 @@ function exactBytes(expected) {
|
|
|
17
17
|
}
|
|
18
18
|
function validLength(bytes) {
|
|
19
19
|
if (!Number.isSafeInteger(bytes) || bytes < 1 || bytes > DESKTOP_RECORDING_MAX_BYTES) {
|
|
20
|
-
throw new
|
|
20
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
export async function receiveBrowserControlRecording(source, destination, bytes) {
|
|
@@ -28,7 +28,7 @@ export async function receiveBrowserControlRecording(source, destination, bytes)
|
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
catch {
|
|
31
|
-
throw new
|
|
31
|
+
throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
export async function sendBrowserControlRecording(source, destination, bytes) {
|
|
@@ -43,6 +43,6 @@ export async function sendBrowserControlRecording(source, destination, bytes) {
|
|
|
43
43
|
}
|
|
44
44
|
catch {
|
|
45
45
|
destination.destroy();
|
|
46
|
-
throw new
|
|
46
|
+
throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
|
|
47
47
|
}
|
|
48
48
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TextDecoder } from "node:util";
|
|
2
2
|
import { BROWSER_CONTROL_LIMITS } from "./protocol.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
|
|
4
4
|
/** Owned byte channel only. This module never discovers endpoints or reconnects. */
|
|
5
5
|
export class BrowserControlTransport {
|
|
6
6
|
stream;
|
|
@@ -92,7 +92,7 @@ export class BrowserControlTransport {
|
|
|
92
92
|
/** Relinquish the live byte stream synchronously after a complete frame. */
|
|
93
93
|
handoff() {
|
|
94
94
|
if (this.ended || this.handedOff || this.payload !== undefined || this.headerUsed !== 0) {
|
|
95
|
-
throw new
|
|
95
|
+
throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
|
|
96
96
|
}
|
|
97
97
|
this.handedOff = true;
|
|
98
98
|
clearTimeout(this.frameTimer);
|
|
@@ -112,9 +112,9 @@ export class BrowserControlTransport {
|
|
|
112
112
|
};
|
|
113
113
|
send(value, beforeWrite = () => { }) {
|
|
114
114
|
if (this.ended || this.handedOff)
|
|
115
|
-
return Promise.reject(new
|
|
115
|
+
return Promise.reject(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
|
|
116
116
|
if (this.sending)
|
|
117
|
-
return Promise.reject(new
|
|
117
|
+
return Promise.reject(new ComputerUseExecutorError("executor_busy", "not_dispatched"));
|
|
118
118
|
let payload;
|
|
119
119
|
try {
|
|
120
120
|
const json = JSON.stringify(value);
|
|
@@ -123,7 +123,7 @@ export class BrowserControlTransport {
|
|
|
123
123
|
payload = Buffer.from(json);
|
|
124
124
|
}
|
|
125
125
|
catch {
|
|
126
|
-
return Promise.reject(new
|
|
126
|
+
return Promise.reject(new ComputerUseExecutorError("invalid_request", "not_dispatched"));
|
|
127
127
|
}
|
|
128
128
|
const frame = Buffer.allocUnsafe(4 + payload.length);
|
|
129
129
|
frame.writeUInt32BE(payload.length);
|
|
@@ -144,7 +144,7 @@ export class BrowserControlTransport {
|
|
|
144
144
|
try {
|
|
145
145
|
beforeWrite();
|
|
146
146
|
if (this.ended) {
|
|
147
|
-
done(new
|
|
147
|
+
done(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
|
|
148
148
|
return;
|
|
149
149
|
}
|
|
150
150
|
this.stream.write(frame, (error) => {
|
|
@@ -178,7 +178,7 @@ export class BrowserControlTransport {
|
|
|
178
178
|
this.stream.off("close", releaseListeners);
|
|
179
179
|
};
|
|
180
180
|
this.stream.once("close", releaseListeners);
|
|
181
|
-
this.pendingWrite?.(new
|
|
181
|
+
this.pendingWrite?.(new ComputerUseExecutorError(code, "outcome_uncertain"));
|
|
182
182
|
this.stream.destroy();
|
|
183
183
|
// A stream whose close event already happened will not emit it again. `closed`
|
|
184
184
|
// can also precede queued error/close events, so defer removal past native ticks.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { RunStudyOptions } from "../../run-study.js";
|
|
2
2
|
import type { CliIo } from "../io.js";
|
|
3
3
|
/**
|
|
4
4
|
* Post-run analysis cancellation for the CLI: while analysis runs, SIGINT, SIGTERM and SIGHUP abort
|
|
5
5
|
* it. The listeners exist only during analysis; before it, the run's own handlers
|
|
6
6
|
* (run-signals.ts) hold the signals and hand them over here.
|
|
7
7
|
*/
|
|
8
|
-
export declare function cliAnalysisOptions(io: Pick<CliIo, "writeErr">): Pick<
|
|
8
|
+
export declare function cliAnalysisOptions(io: Pick<CliIo, "writeErr">): Pick<RunStudyOptions, "onEvent" | "analysisSignal">;
|
|
@@ -3,11 +3,10 @@ import { Command } from "commander";
|
|
|
3
3
|
import { COMMS_PROVIDERS, saveCommsConnection } from "../../comms/connections.js";
|
|
4
4
|
import { catchTokenRefusal } from "../../comms/external-evidence.js";
|
|
5
5
|
import { readCommsSetup } from "../../comms/setup.js";
|
|
6
|
-
import { checkCommsConnection,
|
|
6
|
+
import { checkCommsConnection, configureCommsStudy } from "../../comms/setup.js";
|
|
7
7
|
import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
|
|
8
8
|
import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
|
|
9
|
-
import {
|
|
10
|
-
import { oldStudyOption, studyOptionValue } from "../deprecations.js";
|
|
9
|
+
import { resolveStudyManifest } from "../../study/discover.js";
|
|
11
10
|
import { runCommsCatchHost } from "../../comms/catch-host.js";
|
|
12
11
|
import { DEFAULT_SANDBOX_CATCH_PORT } from "../../comms/sandbox-catch.js";
|
|
13
12
|
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, PORT_OPTION_DESCRIPTION, writeResult, messageOutput, } from "../io.js";
|
|
@@ -46,7 +45,6 @@ export function registerCommsCommands(parent, io) {
|
|
|
46
45
|
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
47
46
|
.option("--connection <name>", "Saved connection name.", "agentmail")
|
|
48
47
|
.option("--study <path>", "Check the connection this study selects.")
|
|
49
|
-
.addOption(oldStudyOption("path"))
|
|
50
48
|
.option("--online", "Make a read-only provider authentication request.")
|
|
51
49
|
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
52
50
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
@@ -54,20 +52,12 @@ export function registerCommsCommands(parent, io) {
|
|
|
54
52
|
comms
|
|
55
53
|
.command("configure")
|
|
56
54
|
.description("Preview or save a local receiving-enabled copy of a supported study. No provider requests.")
|
|
57
|
-
|
|
58
|
-
.option("--study <path>", "Source study path or name. Required.")
|
|
59
|
-
.addOption(oldStudyOption("path"))
|
|
55
|
+
.requiredOption("--study <path>", "Source study path or name. Required.")
|
|
60
56
|
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
61
57
|
.option("--connection <name>", "Saved connection name.", "agentmail")
|
|
62
58
|
.option("--apply", "Save the local copy; the source study stays unchanged.")
|
|
63
59
|
.option("--plan-token <digest>", "Require the source and destination to match a previous preview.")
|
|
64
60
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
65
|
-
.hook("preAction", (command) => {
|
|
66
|
-
const options = command.opts();
|
|
67
|
-
// The message commander gives a missing required option.
|
|
68
|
-
if (options.study === undefined && options.lab === undefined)
|
|
69
|
-
command.error("error: required option '--study <path>' not specified");
|
|
70
|
-
})
|
|
71
61
|
.action((options, command) => handleCommsConfigure(io, options, command));
|
|
72
62
|
comms
|
|
73
63
|
.command("recover")
|
|
@@ -119,13 +109,19 @@ async function handleCommsCheck(io, options, command) {
|
|
|
119
109
|
if (!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
|
|
120
110
|
return;
|
|
121
111
|
let connection = options.connection;
|
|
122
|
-
const study =
|
|
112
|
+
const study = options.study;
|
|
123
113
|
if (study) {
|
|
124
|
-
const resolved = await
|
|
114
|
+
const resolved = await resolveStudyManifest(options.cwd, study);
|
|
125
115
|
if (!resolved.ok || resolved.config.comms?.email?.kind !== "real") {
|
|
116
|
+
// A file humanish no longer reads gets discovery's message, which names the fix.
|
|
117
|
+
const named = !resolved.ok &&
|
|
118
|
+
(resolved.error.code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
|
|
119
|
+
resolved.error.code === "HUMANISH_STUDY_RETIRED_DIRECTORY");
|
|
126
120
|
const result = {
|
|
127
121
|
ok: false,
|
|
128
|
-
message:
|
|
122
|
+
message: named
|
|
123
|
+
? resolved.error.message
|
|
124
|
+
: "This study does not select a real email connection.",
|
|
129
125
|
};
|
|
130
126
|
writeResult(command, io, result, messageOutput);
|
|
131
127
|
io.setExitCode(2);
|
|
@@ -143,13 +139,9 @@ async function handleCommsCheck(io, options, command) {
|
|
|
143
139
|
io.setExitCode(result.ok ? 0 : 2);
|
|
144
140
|
}
|
|
145
141
|
async function handleCommsConfigure(io, options, command) {
|
|
146
|
-
const
|
|
147
|
-
// The preAction hook refuses a call without either option.
|
|
148
|
-
if (study === undefined)
|
|
149
|
-
return;
|
|
150
|
-
const result = await configureCommsLab({
|
|
142
|
+
const result = await configureCommsStudy({
|
|
151
143
|
cwd: resolve(options.cwd),
|
|
152
|
-
|
|
144
|
+
study: options.study,
|
|
153
145
|
connection: options.connection,
|
|
154
146
|
...(options.apply === undefined ? {} : { apply: options.apply }),
|
|
155
147
|
...(options.planToken === undefined ? {} : { planToken: options.planToken }),
|
|
@@ -4,8 +4,11 @@ function formatValue(value) {
|
|
|
4
4
|
const text = JSON.stringify(value);
|
|
5
5
|
return text.length > 80 ? `${text.slice(0, 77)}...` : text;
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Each file's source, destination, moved keys and dropped keys, and each labs/ directory the moves
|
|
9
|
+
* empty, printed before any write.
|
|
10
|
+
*/
|
|
11
|
+
function formatMigratePlan(files, emptied) {
|
|
9
12
|
const lines = [];
|
|
10
13
|
for (const file of files) {
|
|
11
14
|
if (file.action === "skip") {
|
|
@@ -22,6 +25,9 @@ function formatMigratePlan(files) {
|
|
|
22
25
|
lines.push(` its comment: ${key.comments.replace(/\n/g, " ")}`);
|
|
23
26
|
}
|
|
24
27
|
}
|
|
28
|
+
for (const directory of emptied) {
|
|
29
|
+
lines.push(`${directory}/: removed after the move, since nothing else is in it`);
|
|
30
|
+
}
|
|
25
31
|
return lines.length > 0 ? `${lines.join("\n")}\n` : "No study files to convert.\n";
|
|
26
32
|
}
|
|
27
33
|
function formatMigrateOutcome(result) {
|
|
@@ -33,7 +39,12 @@ function formatMigrateOutcome(result) {
|
|
|
33
39
|
const files = written === 1 ? "1 study file" : `${written} study files`;
|
|
34
40
|
if (result.dryRun)
|
|
35
41
|
return `Dry run: nothing was written. ${files} would change.\n`;
|
|
36
|
-
|
|
42
|
+
if (written === 0)
|
|
43
|
+
return "No v2 study files to convert.\n";
|
|
44
|
+
const removed = result.removedDirectories ?? [];
|
|
45
|
+
return removed.length === 0
|
|
46
|
+
? `Converted ${files}.\n`
|
|
47
|
+
: `Converted ${files}. Removed ${removed.map((directory) => `${directory}/`).join(", ")}, which the move emptied.\n`;
|
|
37
48
|
}
|
|
38
49
|
/** `humanish migrate`. */
|
|
39
50
|
export function registerMigrateCommand(parent, io) {
|
|
@@ -57,7 +68,7 @@ export function registerMigrateCommand(parent, io) {
|
|
|
57
68
|
dryRun: options.dryRun === true,
|
|
58
69
|
// The plan is printed before anything is written; with --json it goes to stderr, so stdout
|
|
59
70
|
// stays one JSON document.
|
|
60
|
-
onPlan: (files) => (json ? io.writeErr : io.writeOut)(formatMigratePlan(files)),
|
|
71
|
+
onPlan: (files, emptied) => (json ? io.writeErr : io.writeOut)(formatMigratePlan(files, emptied)),
|
|
61
72
|
});
|
|
62
73
|
writeResult(command, io, result, formatMigrateOutcome);
|
|
63
74
|
io.setExitCode(result.ok ? 0 : 2);
|
|
@@ -3,7 +3,6 @@ import { openTarget, renderObserver, serveObserver } from "../../observer/render
|
|
|
3
3
|
import { SERVE_SCHEMA, serveObserverLibrary } from "../../observer/serve.js";
|
|
4
4
|
import { startExposedObserver, validateExposure } from "../../observer/exposure.js";
|
|
5
5
|
import { ServeTunnelError } from "../../observer/tunnel.js";
|
|
6
|
-
import { deprecationMessage, warnAndQueue } from "../deprecations.js";
|
|
7
6
|
import { collectRepeated, CWD_OPTION_DESCRIPTION, formatRunHuman, freePortOption, JSON_OPTION_DESCRIPTION, parseObserverPort, RUN_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
|
|
8
7
|
import { exitCodeForSignal, formatObserverHuman, } from "../observer-follow.js";
|
|
9
8
|
export function registerObserveCommand(parent, io) {
|
|
@@ -185,20 +184,6 @@ async function serveObserveUntilSignal(io, server, options) {
|
|
|
185
184
|
}
|
|
186
185
|
});
|
|
187
186
|
}
|
|
188
|
-
// Removed in 0.109.0: `serve` stays one minor as a hidden alias of `observe --all`.
|
|
189
|
-
export function registerServeCommand(parent, io) {
|
|
190
|
-
addLibraryOptions(parent
|
|
191
|
-
.command("serve", { hidden: true })
|
|
192
|
-
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
193
|
-
.addOption(freePortOption())
|
|
194
|
-
.option("--run <id>", RUN_OPTION_DESCRIPTION)
|
|
195
|
-
.option("--open", "Open the library in the default browser.")
|
|
196
|
-
.option("--no-open", "Serve without opening a browser.")
|
|
197
|
-
.option("--json", JSON_OPTION_DESCRIPTION)).action((options, command) => {
|
|
198
|
-
warnAndQueue(command, io, deprecationMessage("humanish serve", "humanish observe --all"));
|
|
199
|
-
return handleServe(io, options, command);
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
187
|
async function handleServe(io, options, command) {
|
|
203
188
|
const fail = (code, message) => refuseServe(command, io, options, code, message);
|
|
204
189
|
const port = parseObserverPort(options.port);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
|
-
import { type CliIo, type
|
|
3
|
-
/** The parsed flags of `run
|
|
2
|
+
import { type CliIo, type StudyCommandOptions as RunOptions } from "../io.js";
|
|
3
|
+
/** The parsed flags of `run` and `watch`. */
|
|
4
4
|
export type { RunOptions };
|
|
5
5
|
/** The flags a run takes, whichever command starts it. */
|
|
6
6
|
export declare function addRunOptions(command: Command): Command;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { runDryRun } from "../../run/dry-run.js";
|
|
2
|
-
import {
|
|
2
|
+
import { runStudyCommand } from "./study-run.js";
|
|
3
3
|
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, formatRunHuman, freePortOption, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, } from "../io.js";
|
|
4
4
|
/** The flags a run takes, whichever command starts it. */
|
|
5
5
|
export function addRunOptions(command) {
|
|
@@ -54,13 +54,13 @@ export async function handleRun(io, named, options, command) {
|
|
|
54
54
|
cwd: options.cwd,
|
|
55
55
|
envFile: options.envFile,
|
|
56
56
|
io,
|
|
57
|
-
//
|
|
57
|
+
// runStudyCommand discovers keys for a live study; a preview without a study needs none.
|
|
58
58
|
discoverKeys: false,
|
|
59
59
|
});
|
|
60
60
|
if (!loaded)
|
|
61
61
|
return;
|
|
62
62
|
if (study !== undefined) {
|
|
63
|
-
await
|
|
63
|
+
await runStudyCommand({ command, io, study, mode: "run", options });
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
const participantCount = options.count === undefined ? undefined : parsePositiveInteger(options.count);
|
|
@@ -7,8 +7,8 @@ import { cleanupRun, listRuns, readReview } from "../../run/stored-runs.js";
|
|
|
7
7
|
import { verifyRun } from "../../verify/verify.js";
|
|
8
8
|
import { reclaimPreflightSandboxes, reclaimRunSandboxes, } from "../../run/reclaim.js";
|
|
9
9
|
import { addRunOptions, handleRun } from "./run-command.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, writeResult, humanError, } from "../io.js";
|
|
11
|
+
import { plural } from "../../run/text.js";
|
|
12
12
|
export function registerRunCommand(parent, io) {
|
|
13
13
|
addRunOptions(parent
|
|
14
14
|
.command("run")
|
|
@@ -98,14 +98,12 @@ export function registerStatsCommand(parent, io) {
|
|
|
98
98
|
.description("Cost, outcome, and duration roll-ups across run history. Estimates stay labelled; unknown costs count as unknown.")
|
|
99
99
|
.summary("Show cost, outcomes and durations across runs.")
|
|
100
100
|
.option("--study <id>", "Only runs of this study id.")
|
|
101
|
-
.addOption(oldStudyOption("id"))
|
|
102
101
|
.option("--since <date>", "Only runs that started on or after this ISO date or datetime.")
|
|
103
102
|
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
104
103
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
105
104
|
.action(async (options, command) => {
|
|
106
|
-
const study = studyOptionValue(command, io, options);
|
|
107
105
|
const result = await computeStats(options.cwd, {
|
|
108
|
-
...(study === undefined ? {} : {
|
|
106
|
+
...(options.study === undefined ? {} : { study: options.study }),
|
|
109
107
|
...(options.since === undefined ? {} : { since: options.since }),
|
|
110
108
|
});
|
|
111
109
|
writeResult(command, io, result, formatStatsHuman);
|
|
@@ -167,13 +165,17 @@ export function registerRuntimeCommands(parent, io) {
|
|
|
167
165
|
export function registerReclaimCommand(parent, io) {
|
|
168
166
|
parent
|
|
169
167
|
.command("reclaim")
|
|
170
|
-
.description("Kill an interrupted run's sandboxes by the exact ids journaled in its sandbox-receipts.ndjson; never enumerates the E2B account. Needs E2B_API_KEY in the environment.")
|
|
168
|
+
.description("Kill an interrupted run's sandboxes by the exact ids journaled in its sandbox-receipts.ndjson; never enumerates the E2B account. Needs E2B_API_KEY in the environment or in --env-file.")
|
|
171
169
|
.summary("Stop an interrupted run's leftover sandboxes.")
|
|
172
170
|
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
173
171
|
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
174
172
|
.addOption(new Option("--preflight", "Reclaim sandboxes left by interrupted `humanish study check` probes (journaled in .humanish/preflight) instead of a run's.").conflicts("run"))
|
|
173
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
175
174
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
176
175
|
.action(async (options, command) => {
|
|
176
|
+
// The kill calls read E2B_API_KEY from the environment: the env file, then discovered keys.
|
|
177
|
+
if (!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
|
|
178
|
+
return;
|
|
177
179
|
const result = options.preflight
|
|
178
180
|
? await reclaimPreflightSandboxes(options.cwd)
|
|
179
181
|
: await reclaimRunSandboxes(options.cwd, options.run);
|
|
@@ -183,7 +185,7 @@ export function registerReclaimCommand(parent, io) {
|
|
|
183
185
|
}
|
|
184
186
|
function formatReclaimHuman(result) {
|
|
185
187
|
const lines = [];
|
|
186
|
-
lines.push(`Reclaim ${result.runId}: ${result.ok ? "ok" : "
|
|
188
|
+
lines.push(`Reclaim ${result.runId}: ${result.ok ? "ok" : "failed"}, ${plural(result.receiptCount, "sandbox receipt")}.`);
|
|
187
189
|
for (const outcome of result.outcomes) {
|
|
188
190
|
lines.push(` ${outcome.sandboxId} (${outcome.laneId}): ${outcome.state}${outcome.detail ? ` — ${outcome.detail}` : ""}`);
|
|
189
191
|
}
|