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,5 +1,5 @@
|
|
|
1
|
-
import type { SharedWorldPlan } from "../../
|
|
2
|
-
import type { Participant, SharedWorldParticipant } from "../../
|
|
1
|
+
import type { SharedWorldPlan } from "../../study/plan-types.js";
|
|
2
|
+
import type { Participant, SharedWorldParticipant } from "../../study/plan-participants.js";
|
|
3
3
|
import type { RunBundle } from "../../run/bundle.js";
|
|
4
4
|
import type { CuaParticipantDeps, DesktopParticipantRun, ParticipantRunOutcome } from "../computer-use/types.js";
|
|
5
5
|
import type { LiveParticipants, PlaneContext } from "./types.js";
|
|
@@ -10,7 +10,7 @@ export declare function resolveActorEntryUrl(baseUrl: string, entry: string | un
|
|
|
10
10
|
export declare function participantTaxonomyLabel(labels: Participant["labels"]): string;
|
|
11
11
|
/** Thread the host-yielded lobby code into a follower's mission at runtime (external-public route).
|
|
12
12
|
* The code flows into the follower's join instruction; it is persisted only as the composed prompt
|
|
13
|
-
* the model reads (never a raw bundle field), and
|
|
13
|
+
* the model reads (never a raw bundle field), and humanish scrubs the code from all narration. The
|
|
14
14
|
* follower joins through the real UI (a direct /lobby/CODE visit does not auto-join a non-member). */
|
|
15
15
|
export declare function withLobbyCodeMission(spec: DesktopParticipantRun, code: string): DesktopParticipantRun;
|
|
16
16
|
/** A follower blocked by an expired deadline or an ended host. It never opened a browser;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// Builds each participant's actor spec and mission, resolves its entry URL, derives the session
|
|
2
2
|
// and sandbox time budgets, and records a follower that never received the host's lobby code.
|
|
3
3
|
import { defaultSubjectPhaseSink } from "../../subject/steps.js";
|
|
4
|
-
import { pricedModel } from "../../
|
|
5
|
-
import { scrubPersonaBrief } from "../../
|
|
4
|
+
import { pricedModel } from "../../study/plan-base.js";
|
|
5
|
+
import { scrubPersonaBrief } from "../../study/persona.js";
|
|
6
6
|
import { resolveParticipant } from "../../run/participant.js";
|
|
7
7
|
import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
|
|
8
8
|
import { composeParticipantInstructions } from "../computer-use/participant-prompt.js";
|
|
9
9
|
import { startLiveTraceFlush } from "../computer-use/live-flush.js";
|
|
10
|
-
import { resolveCommittedPersonasForCwd } from "../../
|
|
11
|
-
import { participantAssignment } from "../../
|
|
10
|
+
import { resolveCommittedPersonasForCwd } from "../../study/persona-resolve.js";
|
|
11
|
+
import { participantAssignment } from "../../study/participant-assignment.js";
|
|
12
12
|
import { redactText } from "../../evidence/redaction.js";
|
|
13
13
|
import { MAX_SANDBOX_MS, SANDBOX_TIMEOUT_BUFFER_MS, SUBJECT_PROVISION_BUDGET_MS, } from "../../substrates/e2b/lifetime.js";
|
|
14
14
|
import { DEFAULT_STATE_STEP_TIMEOUT_MS } from "../../subject/state.js";
|
|
@@ -79,7 +79,7 @@ function buildActorSpec(participant, personas) {
|
|
|
79
79
|
}
|
|
80
80
|
/** Thread the host-yielded lobby code into a follower's mission at runtime (external-public route).
|
|
81
81
|
* The code flows into the follower's join instruction; it is persisted only as the composed prompt
|
|
82
|
-
* the model reads (never a raw bundle field), and
|
|
82
|
+
* the model reads (never a raw bundle field), and humanish scrubs the code from all narration. The
|
|
83
83
|
* follower joins through the real UI (a direct /lobby/CODE visit does not auto-join a non-member). */
|
|
84
84
|
export function withLobbyCodeMission(spec, code) {
|
|
85
85
|
// prose-check: model prompt (the participant model reads this, not a person)
|
|
@@ -150,7 +150,7 @@ export function participantRunDeps(ctx, live, scrubKnownValues) {
|
|
|
150
150
|
return {
|
|
151
151
|
onTrace: (participantId, items, usage, metadata) => live.flush?.flush(participantId, items, usage, metadata),
|
|
152
152
|
residual: ctx.plan.residual,
|
|
153
|
-
|
|
153
|
+
studyId: ctx.plan.studyId,
|
|
154
154
|
caps: ctx.plan.caps,
|
|
155
155
|
subject: {
|
|
156
156
|
kind: "shared-app",
|
|
@@ -164,7 +164,7 @@ export function participantRunDeps(ctx, live, scrubKnownValues) {
|
|
|
164
164
|
timeoutMs: ctx.timeoutMs,
|
|
165
165
|
participantCount: ctx.plan.plane.participants.length,
|
|
166
166
|
artifactRoot: ctx.runPaths,
|
|
167
|
-
|
|
167
|
+
studyCwd: ctx.cwd,
|
|
168
168
|
redactScreenshots: ctx.redactScreenshots,
|
|
169
169
|
scrubKnownValues,
|
|
170
170
|
runSession: ctx.runSession,
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { type CuaActorDescriptor } from "../../actors/registry.js";
|
|
2
|
-
import type { RoutePlanResult, RouteRefusal, SharedWorldPlan } from "../../
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
/** The error a shared-world
|
|
6
|
-
export interface SharedWorldRefusal extends RouteRefusal<"shared-world",
|
|
2
|
+
import type { RoutePlanResult, RouteRefusal, SharedWorldPlan } from "../../study/plan-types.js";
|
|
3
|
+
import type { StudyConfig, StudySubjectState } from "../../study/types.js";
|
|
4
|
+
import type { ConcurrentSharedWorldStudyErrorCode } from "./types.js";
|
|
5
|
+
/** The error a shared-world study returns before a run starts. */
|
|
6
|
+
export interface SharedWorldRefusal extends RouteRefusal<"shared-world", ConcurrentSharedWorldStudyErrorCode> {
|
|
7
7
|
/** The registered actor id, once the registry check has passed. */
|
|
8
8
|
readonly actor?: string;
|
|
9
9
|
}
|
|
10
10
|
export type SharedWorldPlanResult = RoutePlanResult<SharedWorldPlan, SharedWorldRefusal>;
|
|
11
|
-
/** The registered descriptor for a planned actor;
|
|
11
|
+
/** The registered descriptor for a planned actor; planSharedWorldStudy checked the registry. */
|
|
12
12
|
export declare function sharedWorldDescriptorOf(actorType: string): CuaActorDescriptor;
|
|
13
13
|
/**
|
|
14
|
-
* Plan a shared-world
|
|
14
|
+
* Plan a shared-world study. It is called for any config handed to the shared-world runner, not only
|
|
15
15
|
* one routeOf sends here, so a config for another route gets this route's refusal.
|
|
16
16
|
*/
|
|
17
|
-
export declare function
|
|
17
|
+
export declare function planSharedWorldStudy(config: StudyConfig, input: {
|
|
18
18
|
readonly dryRun: boolean;
|
|
19
19
|
/** Whether deps.runSession is set: a caller's session runner cannot enforce maxOutputTokens. */
|
|
20
20
|
readonly hasRunSession?: boolean;
|
|
21
21
|
}): SharedWorldPlanResult;
|
|
22
22
|
/** The provisioned plane's declared subject state. The external-public plane declares none. */
|
|
23
|
-
export declare function planeStateOf(plan: SharedWorldPlan):
|
|
23
|
+
export declare function planeStateOf(plan: SharedWorldPlan): StudySubjectState | undefined;
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
import { DEFAULT_OPENAI_CU_MODEL } from "../../actors/computer-use/openai-provider.js";
|
|
6
6
|
import { actorRegistry, isCuaActorDescriptor, } from "../../actors/registry.js";
|
|
7
7
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
8
|
-
import { brainOf, capsOf, desktopRequirements, isNonEmpty, planBase } from "../../
|
|
9
|
-
import { sharedWorldParticipants } from "../../
|
|
10
|
-
import { PUBLIC_TARGET_OWNER_PATTERN } from "../../
|
|
11
|
-
import { REPO_SLUG_PATTERN } from "../../
|
|
12
|
-
import { concurrentSharedWorldValidationReason, desktopMediaValidationReason, externalPublicSharedWorldValidationReason, outputTokenLimitValidationReason, receivingEmailValidationReason, scenarioCapsValidationReason, taskProtocolValidationReason, } from "../../
|
|
8
|
+
import { brainOf, capsOf, desktopRequirements, isNonEmpty, planBase, } from "../../study/plan-base.js";
|
|
9
|
+
import { sharedWorldParticipants } from "../../study/plan-participants.js";
|
|
10
|
+
import { PUBLIC_TARGET_OWNER_PATTERN } from "../../study/parse/subject.js";
|
|
11
|
+
import { REPO_SLUG_PATTERN } from "../../study/parse/values.js";
|
|
12
|
+
import { concurrentSharedWorldValidationReason, desktopMediaValidationReason, externalPublicSharedWorldValidationReason, outputTokenLimitValidationReason, receivingEmailValidationReason, scenarioCapsValidationReason, taskProtocolValidationReason, } from "../../study/validation.js";
|
|
13
13
|
import { MODEL_RATES, unpricedCapMessage } from "../../run/pricing.js";
|
|
14
|
-
/** The registered descriptor for a planned actor;
|
|
14
|
+
/** The registered descriptor for a planned actor; planSharedWorldStudy checked the registry. */
|
|
15
15
|
export function sharedWorldDescriptorOf(actorType) {
|
|
16
16
|
const descriptor = actorRegistry[actorType];
|
|
17
17
|
if (!descriptor || !isCuaActorDescriptor(descriptor))
|
|
@@ -19,10 +19,10 @@ export function sharedWorldDescriptorOf(actorType) {
|
|
|
19
19
|
return descriptor;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
* Plan a shared-world
|
|
22
|
+
* Plan a shared-world study. It is called for any config handed to the shared-world runner, not only
|
|
23
23
|
* one routeOf sends here, so a config for another route gets this route's refusal.
|
|
24
24
|
*/
|
|
25
|
-
export function
|
|
25
|
+
export function planSharedWorldStudy(config, input) {
|
|
26
26
|
const refuse = (code, message, actor) => ({
|
|
27
27
|
ok: false,
|
|
28
28
|
refusal: { route: "shared-world", code, message, ...(actor === undefined ? {} : { actor }) },
|
|
@@ -162,7 +162,7 @@ function planeOf(config) {
|
|
|
162
162
|
? { kind: "local-tree", serve, env, state: checkpointed }
|
|
163
163
|
: {
|
|
164
164
|
kind: "clone",
|
|
165
|
-
//
|
|
165
|
+
// planSharedWorldStudy refused a clone without an owner/repo slug.
|
|
166
166
|
repo: config.subject.repos?.[0] ?? "",
|
|
167
167
|
serve,
|
|
168
168
|
env,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyCommsEmail, StudyConfig, StudySubjectServe, StudySubjectStateCheckpoint } from "../../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../../run/bundle.js";
|
|
3
3
|
import type { SharedWorldStateSnapshot } from "../../run/shared-world-evidence.js";
|
|
4
4
|
import type { LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
5
5
|
import type { DetachedTimers } from "../../substrates/detached.js";
|
|
6
|
-
import type {
|
|
6
|
+
import type { StudyDeps } from "../../study/study-deps.js";
|
|
7
7
|
import { type ActorRunResult, type SubjectDesktopUsage, type LiveParticipants, type PlaneContext } from "./types.js";
|
|
8
8
|
/** What the provisioned plane needs besides the shared plane context. */
|
|
9
9
|
export interface ProvisionedPlaneSetup {
|
|
10
|
-
serve:
|
|
10
|
+
serve: StudySubjectServe;
|
|
11
11
|
localTreeRoute: boolean;
|
|
12
12
|
localTreeArchive: LocalTreeArchive | undefined;
|
|
13
13
|
localTreeArchiveBuffer: ArrayBuffer | undefined;
|
|
@@ -15,9 +15,9 @@ export interface ProvisionedPlaneSetup {
|
|
|
15
15
|
publicRepo: string;
|
|
16
16
|
subjectEnvNames: string[];
|
|
17
17
|
hasGithubToken: boolean;
|
|
18
|
-
checkpoints:
|
|
19
|
-
/** The in-sandbox email catch, when a comms
|
|
20
|
-
commsEmail:
|
|
18
|
+
checkpoints: StudySubjectStateCheckpoint[];
|
|
19
|
+
/** The in-sandbox email catch, when a comms study declared one. */
|
|
20
|
+
commsEmail: StudyCommsEmail | undefined;
|
|
21
21
|
commsPort: number | undefined;
|
|
22
22
|
/** The catch's base URL, injected into the subject's env at create. */
|
|
23
23
|
commsEnv: Record<string, string>;
|
|
@@ -47,8 +47,8 @@ export declare function runProvisionedPlane(ctx: PlaneContext, live: LivePartici
|
|
|
47
47
|
* or the message the run fails with.
|
|
48
48
|
*/
|
|
49
49
|
export declare function packSubjectTree(cwd: string, config: {
|
|
50
|
-
readonly subject: Pick<
|
|
51
|
-
}, deps:
|
|
50
|
+
readonly subject: Pick<StudyConfig["subject"], "localTree">;
|
|
51
|
+
}, deps: StudyDeps, scrubKnownValues: (text: string) => string): Promise<{
|
|
52
52
|
ok: true;
|
|
53
53
|
archive: LocalTreeArchive;
|
|
54
54
|
buffer: ArrayBuffer;
|
|
@@ -10,7 +10,7 @@ import { mapWithConcurrency } from "../../run/concurrency.js";
|
|
|
10
10
|
import { provisionCloneSubject } from "../../subject/clone.js";
|
|
11
11
|
import { provisionLocalTreeSubject } from "../../subject/local-tree.js";
|
|
12
12
|
import { defaultSharedWorldPhaseSink } from "../../subject/steps.js";
|
|
13
|
-
import { phaseEvent } from "../../
|
|
13
|
+
import { phaseEvent } from "../../study/run-study-events.js";
|
|
14
14
|
import { loadE2BDesktopModule } from "../../substrates/e2b/sdk.js";
|
|
15
15
|
import { observeDesktopResources, } from "../../substrates/e2b/desktop-resources.js";
|
|
16
16
|
import { acquireE2BDesktopSandbox, readE2BRelease } from "../../substrates/e2b/sandbox.js";
|
|
@@ -29,7 +29,7 @@ import { SANDBOX_TIMEOUT_BUFFER_MS, SUBJECT_PROVISION_BUDGET_MS, } from "../../s
|
|
|
29
29
|
import { DEFAULT_STATE_STEP_TIMEOUT_MS } from "../../subject/state.js";
|
|
30
30
|
import { resolveActorEntryUrl, participantRunDeps, startParticipantFlush, } from "./participant-specs.js";
|
|
31
31
|
import { CONCURRENT_SHARED_WORLD_PROVIDER_METADATA, } from "./types.js";
|
|
32
|
-
import { addressedRecipients } from "../../
|
|
32
|
+
import { addressedRecipients } from "../../study/parse/comms.js";
|
|
33
33
|
/**
|
|
34
34
|
* A failure of the caller's `onObserverReady` gate on the provisioned plane. The gate runs inside
|
|
35
35
|
* the try that records participant failures, so it is wrapped to be told apart and rethrown: a gate
|
|
@@ -60,7 +60,7 @@ class SubjectPlane {
|
|
|
60
60
|
subjectDesktop;
|
|
61
61
|
subjectShell;
|
|
62
62
|
// The in-sandbox email catch on the one subject sandbox; drained at teardown. Undefined
|
|
63
|
-
// unless a comms
|
|
63
|
+
// unless a comms study declared it.
|
|
64
64
|
deployedComms;
|
|
65
65
|
// Background prober dispose signal, cleared in teardown.
|
|
66
66
|
proberDisposed = false;
|
|
@@ -119,7 +119,7 @@ class SubjectPlane {
|
|
|
119
119
|
SANDBOX_TIMEOUT_BUFFER_MS,
|
|
120
120
|
metadata: {
|
|
121
121
|
...CONCURRENT_SHARED_WORLD_PROVIDER_METADATA,
|
|
122
|
-
labId: plan.
|
|
122
|
+
labId: plan.studyId,
|
|
123
123
|
topology: "shared-world",
|
|
124
124
|
topologyMode: "concurrent",
|
|
125
125
|
kind: "subject",
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type ConcurrentSharedWorldStudyErrorCode, type ConcurrentSharedWorldStudyResult, type FinishFacts, type LiveParticipants, type PlaneContext, type PlaneResults } from "./types.js";
|
|
2
2
|
/** The results of a run whose plane did not run (a dry run) or has not reported yet. */
|
|
3
3
|
export declare function emptyPlaneResults(): PlaneResults;
|
|
4
4
|
/**
|
|
5
5
|
* The refusal envelope for a run that stops before it has results: the requested cwd, no roles,
|
|
6
6
|
* and the run id the caller asked for, if any. `actor` is the label when a refusal names none.
|
|
7
7
|
*/
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function concurrentStudyFailure(envelope: {
|
|
9
9
|
cwd: string;
|
|
10
|
-
|
|
10
|
+
studyId: string;
|
|
11
11
|
actor: string;
|
|
12
12
|
participantCount: number;
|
|
13
13
|
concurrency: number;
|
|
14
14
|
dryRun: boolean;
|
|
15
15
|
runId: string | undefined;
|
|
16
|
-
}): (code:
|
|
17
|
-
/** Builds and publishes the bundle, renders the Observer and returns the
|
|
18
|
-
export declare function finishConcurrentRun(ctx: PlaneContext, live: LiveParticipants, results: PlaneResults, plane: FinishFacts): Promise<
|
|
16
|
+
}): (code: ConcurrentSharedWorldStudyErrorCode, message: string, actorLabel?: string) => ConcurrentSharedWorldStudyResult;
|
|
17
|
+
/** Builds and publishes the bundle, renders the Observer and returns the study result. */
|
|
18
|
+
export declare function finishConcurrentRun(ctx: PlaneContext, live: LiveParticipants, results: PlaneResults, plane: FinishFacts): Promise<ConcurrentSharedWorldStudyResult>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Finishing a concurrent shared-world run: publishing its bundle, rendering the Observer, and the
|
|
2
|
-
//
|
|
2
|
+
// study result with each role's outcome and the one error a run that did not pass reports.
|
|
3
3
|
import { redactText } from "../../evidence/redaction.js";
|
|
4
|
-
import { adapterScoreFailureMessage, applyBrowserScorer } from "../../
|
|
4
|
+
import { adapterScoreFailureMessage, applyBrowserScorer } from "../../study/adapter-extension.js";
|
|
5
5
|
import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
|
|
6
6
|
import { foldScorerFailures, judgeExecution, sandboxCleanupFailure, OUTCOME_POLICIES, participantHarnessFailed, resultOk, sharedWorldShortfall, } from "../../run/judge.js";
|
|
7
7
|
import { participantFactsOf, unreleasedSandboxFailures, } from "../computer-use/participant-facts.js";
|
|
@@ -11,6 +11,7 @@ import { planeStateOf } from "./plan.js";
|
|
|
11
11
|
import { buildSubjectProvenance, hostOriginDigest } from "./provenance.js";
|
|
12
12
|
import {} from "./types.js";
|
|
13
13
|
import { studyResultIdentity } from "../../run/study-result.js";
|
|
14
|
+
import { plural } from "../../run/text.js";
|
|
14
15
|
/** The results of a run whose plane did not run (a dry run) or has not reported yet. */
|
|
15
16
|
export function emptyPlaneResults() {
|
|
16
17
|
return {
|
|
@@ -81,7 +82,7 @@ function concurrentParticipantResults(actorSpecs, actorResults, dryRun) {
|
|
|
81
82
|
});
|
|
82
83
|
}
|
|
83
84
|
/** The error a run that did not pass reports, most specific cause first. */
|
|
84
|
-
function
|
|
85
|
+
function concurrentStudyError(args) {
|
|
85
86
|
const { ok, handoffTimedOut, hostHandoffFailure, observer, runError, adapterFailure } = args;
|
|
86
87
|
const { participantResults, participantCount } = args;
|
|
87
88
|
if (ok)
|
|
@@ -134,16 +135,16 @@ function concurrentLabError(args) {
|
|
|
134
135
|
}
|
|
135
136
|
return {
|
|
136
137
|
code: "HUMANISH_SHARED_WORLD_FAILED",
|
|
137
|
-
message: `Concurrent shared-world run did not run coherently: ${passed}/${participantCount
|
|
138
|
+
message: `Concurrent shared-world run did not run coherently: ${passed}/${plural(participantCount, "actor")} reached a terminal, engaged passed session.`,
|
|
138
139
|
};
|
|
139
140
|
}
|
|
140
141
|
/**
|
|
141
142
|
* The refusal envelope for a run that stops before it has results: the requested cwd, no roles,
|
|
142
143
|
* and the run id the caller asked for, if any. `actor` is the label when a refusal names none.
|
|
143
144
|
*/
|
|
144
|
-
export function
|
|
145
|
+
export function concurrentStudyFailure(envelope) {
|
|
145
146
|
return (code, message, actorLabel) => ({
|
|
146
|
-
...studyResultIdentity("shared-world", envelope.
|
|
147
|
+
...studyResultIdentity("shared-world", envelope.studyId),
|
|
147
148
|
ok: false,
|
|
148
149
|
cwd: envelope.cwd,
|
|
149
150
|
actor: actorLabel ?? envelope.actor,
|
|
@@ -204,7 +205,7 @@ function sharedWorldExecutionFailures(args) {
|
|
|
204
205
|
]),
|
|
205
206
|
];
|
|
206
207
|
}
|
|
207
|
-
/** Builds and publishes the bundle, renders the Observer and returns the
|
|
208
|
+
/** Builds and publishes the bundle, renders the Observer and returns the study result. */
|
|
208
209
|
export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
209
210
|
const { plan, input, descriptor, actorSpecs, run, runId } = ctx;
|
|
210
211
|
const participantCount = plan.plane.participants.length;
|
|
@@ -268,7 +269,7 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
268
269
|
context: {
|
|
269
270
|
bundle,
|
|
270
271
|
runDir: physicalArtifactRoot,
|
|
271
|
-
|
|
272
|
+
studyId: plan.studyId,
|
|
272
273
|
runId,
|
|
273
274
|
actor: descriptor.id,
|
|
274
275
|
route: "shared-world",
|
|
@@ -298,7 +299,7 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
298
299
|
const ok = resultOk({ judgment, execution, scorerFailures: scorerResult.failures, policy });
|
|
299
300
|
const overlapProven = !dryRun && judgment.world.overlap;
|
|
300
301
|
const participantResults = concurrentParticipantResults(actorSpecs, actorResults, dryRun);
|
|
301
|
-
const errorResult =
|
|
302
|
+
const errorResult = concurrentStudyError({
|
|
302
303
|
ok,
|
|
303
304
|
handoffTimedOut,
|
|
304
305
|
hostHandoffFailure,
|
|
@@ -311,7 +312,7 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
311
312
|
executionFailure: execution.failures[0]?.message,
|
|
312
313
|
});
|
|
313
314
|
const result = {
|
|
314
|
-
...studyResultIdentity("shared-world", plan.
|
|
315
|
+
...studyResultIdentity("shared-world", plan.studyId),
|
|
315
316
|
ok,
|
|
316
317
|
cwd,
|
|
317
318
|
actor: descriptor.id,
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { type SharedWorldRefusal } from "./plan.js";
|
|
2
|
-
import type { SharedWorldPlan } from "../../
|
|
3
|
-
import type { AdmittedPlan } from "../../run-
|
|
4
|
-
import type {
|
|
5
|
-
import { type
|
|
2
|
+
import type { SharedWorldPlan } from "../../study/plan-types.js";
|
|
3
|
+
import type { AdmittedPlan } from "../../run-study.js";
|
|
4
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
5
|
+
import { type ConcurrentSharedWorldStudyResult, type SharedWorldRunInput, type RunConcurrentSharedWorldStudyOptions } from "./types.js";
|
|
6
6
|
/**
|
|
7
|
-
* The library entry for a shared-world
|
|
7
|
+
* The library entry for a shared-world study. It plans the config with planSharedWorldStudy and runs
|
|
8
8
|
* the plan with runSharedWorldPlan, whose run scope and withTransientCommsSecrets wrapper cover the
|
|
9
9
|
* run and its analysis.
|
|
10
10
|
*/
|
|
11
|
-
export declare function runConcurrentSharedWorld(options:
|
|
12
|
-
/** A refused shared-world
|
|
13
|
-
export declare function
|
|
11
|
+
export declare function runConcurrentSharedWorld(options: RunConcurrentSharedWorldStudyOptions): Promise<ConcurrentSharedWorldStudyResult>;
|
|
12
|
+
/** A refused shared-world study's result: the route's envelope, and a refusal's analysis record. */
|
|
13
|
+
export declare function sharedWorldStudyRefusal(options: RunConcurrentSharedWorldStudyOptions, refusal: SharedWorldRefusal): Promise<ConcurrentSharedWorldStudyResult>;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* runStudyWith's step for a shared-world plan. It runs a live plan's local checks (the keys, a local
|
|
16
16
|
* agent's sign-in and the subject env) before any run scope opens, so the CLI can present their refusal before it loads a
|
|
17
17
|
* declared scorer, and returns the run that continues from them with that scorer.
|
|
18
18
|
*/
|
|
19
|
-
export declare function admitSharedWorldPlan(plan: SharedWorldPlan, input: SharedWorldRunInput, config:
|
|
19
|
+
export declare function admitSharedWorldPlan(plan: SharedWorldPlan, input: SharedWorldRunInput, config: StudyConfig): Promise<AdmittedPlan<"shared-world">>;
|
|
20
20
|
/** Run a shared-world plan: its local checks, then the run. */
|
|
21
|
-
export declare function runSharedWorldPlan(plan: SharedWorldPlan, input: SharedWorldRunInput, config:
|
|
21
|
+
export declare function runSharedWorldPlan(plan: SharedWorldPlan, input: SharedWorldRunInput, config: StudyConfig): Promise<ConcurrentSharedWorldStudyResult>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// The concurrent shared-world
|
|
1
|
+
// The concurrent shared-world route: N persona participants drive one shared,
|
|
2
2
|
// mutable service plane at the same time. A recomposition of shipped
|
|
3
3
|
// pieces + the getHost wrapper:
|
|
4
4
|
//
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
// requires the author attestation subject.exposure: synthetic. This is author-trust + a provenance
|
|
34
34
|
// gate; humanish cannot tell synthetic from real data, so it makes no claim about real data.
|
|
35
35
|
import path from "node:path";
|
|
36
|
-
import { missingKeys, missingSubjectEnv } from "../../
|
|
36
|
+
import { missingKeys, missingSubjectEnv } from "../../study/requirements.js";
|
|
37
37
|
import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
|
|
38
38
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
39
39
|
import { scrubLiterals } from "../../evidence/redaction.js";
|
|
@@ -42,15 +42,15 @@ import { withTransientCommsSecrets } from "../../run/transient-comms-secrets.js"
|
|
|
42
42
|
import { runScope } from "../../run/run.js";
|
|
43
43
|
import { makeCuaRunBudget } from "../computer-use/participant-model.js";
|
|
44
44
|
import { runExternalPublicPlane } from "./external-public.js";
|
|
45
|
-
import {
|
|
45
|
+
import { planSharedWorldStudy, sharedWorldDescriptorOf } from "./plan.js";
|
|
46
46
|
import { localAgentRefusal } from "../../actors/local-agent/readiness.js";
|
|
47
47
|
import { runProvisionedPlane } from "./provisioned.js";
|
|
48
|
-
import {
|
|
48
|
+
import { concurrentStudyFailure, finishConcurrentRun } from "./result.js";
|
|
49
49
|
import { prepareConcurrentRun } from "./setup.js";
|
|
50
|
-
import { browserRouteScorer } from "../../
|
|
51
|
-
import { withLateScorer } from "../../
|
|
50
|
+
import { browserRouteScorer } from "../../study/adapter-scorer-loader.js";
|
|
51
|
+
import { withLateScorer } from "../../study/route-inputs.js";
|
|
52
52
|
import {} from "./types.js";
|
|
53
|
-
import { rosterOf } from "../../
|
|
53
|
+
import { rosterOf } from "../../study/parse/actors.js";
|
|
54
54
|
/** The shared-world code for each local-agent refusal, kind for kind with computer-use. */
|
|
55
55
|
const LOCAL_AGENT_REFUSAL_CODES = {
|
|
56
56
|
"agent-missing": "HUMANISH_SHARED_WORLD_AGENT_MISSING",
|
|
@@ -59,28 +59,28 @@ const LOCAL_AGENT_REFUSAL_CODES = {
|
|
|
59
59
|
"unpriced-cap": "HUMANISH_SHARED_WORLD_UNPRICED_CAP",
|
|
60
60
|
};
|
|
61
61
|
/**
|
|
62
|
-
* The library entry for a shared-world
|
|
62
|
+
* The library entry for a shared-world study. It plans the config with planSharedWorldStudy and runs
|
|
63
63
|
* the plan with runSharedWorldPlan, whose run scope and withTransientCommsSecrets wrapper cover the
|
|
64
64
|
* run and its analysis.
|
|
65
65
|
*/
|
|
66
66
|
export async function runConcurrentSharedWorld(options) {
|
|
67
67
|
const { config, dryRun, ...input } = options;
|
|
68
|
-
//
|
|
69
|
-
const planned =
|
|
68
|
+
// planSharedWorldStudy makes every configuration refusal, in the order this route always has.
|
|
69
|
+
const planned = planSharedWorldStudy(config, {
|
|
70
70
|
dryRun,
|
|
71
71
|
hasRunSession: input.deps?.runSession !== undefined,
|
|
72
72
|
});
|
|
73
73
|
if (planned.ok)
|
|
74
74
|
return runSharedWorldPlan(planned.plan, input, config);
|
|
75
|
-
return
|
|
75
|
+
return sharedWorldStudyRefusal(options, planned.refusal);
|
|
76
76
|
}
|
|
77
|
-
/** A refused shared-world
|
|
78
|
-
export function
|
|
77
|
+
/** A refused shared-world study's result: the route's envelope, and a refusal's analysis record. */
|
|
78
|
+
export function sharedWorldStudyRefusal(options, refusal) {
|
|
79
79
|
const { config, dryRun } = options;
|
|
80
80
|
const declared = rosterOf(config.actors[0]) ?? [];
|
|
81
|
-
const fail =
|
|
81
|
+
const fail = concurrentStudyFailure({
|
|
82
82
|
cwd: path.resolve(options.cwd),
|
|
83
|
-
|
|
83
|
+
studyId: config.id,
|
|
84
84
|
actor: config.actors[0]?.type ?? "",
|
|
85
85
|
participantCount: declared.length,
|
|
86
86
|
// The parser fills concurrency for multi-participant studies, so this fallback serves only
|
|
@@ -94,7 +94,7 @@ export function sharedWorldLabRefusal(options, refusal) {
|
|
|
94
94
|
return completeAutomaticAnalysis(fail(refusal.code, refusal.message, refusal.actor), undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
|
-
*
|
|
97
|
+
* runStudyWith's step for a shared-world plan. It runs a live plan's local checks (the keys, a local
|
|
98
98
|
* agent's sign-in and the subject env) before any run scope opens, so the CLI can present their refusal before it loads a
|
|
99
99
|
* declared scorer, and returns the run that continues from them with that scorer.
|
|
100
100
|
*/
|
|
@@ -130,7 +130,7 @@ async function admitSharedWorldRun(plan, input) {
|
|
|
130
130
|
// agent instead.
|
|
131
131
|
const missing = missingKeys(plan.requirements, env);
|
|
132
132
|
if (missing.length > 0) {
|
|
133
|
-
return fail("HUMANISH_SHARED_WORLD_KEYS_MISSING", `Live concurrent shared-world
|
|
133
|
+
return fail("HUMANISH_SHARED_WORLD_KEYS_MISSING", `Live concurrent shared-world studies need ${missing.join(" and ")} in the environment (values are never persisted). ${describeMissingKeys(missing, env)}`);
|
|
134
134
|
}
|
|
135
135
|
if (plan.brain.kind === "local-agent") {
|
|
136
136
|
// A missing or signed-out agent found after the participants' desktops are paid for is the same
|
|
@@ -164,9 +164,9 @@ function completeSharedWorldAnalysis(plan, input, result, finished) {
|
|
|
164
164
|
}
|
|
165
165
|
/** The route's envelope for a run that stops before its bundle. */
|
|
166
166
|
function sharedWorldFailure(plan, input) {
|
|
167
|
-
return
|
|
167
|
+
return concurrentStudyFailure({
|
|
168
168
|
cwd: path.resolve(input.cwd),
|
|
169
|
-
|
|
169
|
+
studyId: plan.studyId,
|
|
170
170
|
actor: plan.actor,
|
|
171
171
|
participantCount: plan.plane.participants.length,
|
|
172
172
|
concurrency: plan.concurrency,
|
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
import type { CuaActorDescriptor } from "../../actors/registry.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { StudyConfig, StudySubjectServe, StudySubjectStateCheckpoint } from "../../study/types.js";
|
|
3
3
|
import type { RunScope } from "../../run/run.js";
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
6
|
-
import type { SharedWorldPlan } from "../../
|
|
7
|
-
/** What validation derived from the
|
|
8
|
-
interface
|
|
4
|
+
import type { ConcurrentSharedWorldStudyErrorCode, ConcurrentSharedWorldStudyResult, ConcurrentSharedWorldPlaneClass, FinishFacts, LiveParticipants, PlaneContext, PlaneResults, PlaneSelection, SharedWorldRunInput } from "./types.js";
|
|
5
|
+
import type { StudyDeps } from "../../study/study-deps.js";
|
|
6
|
+
import type { SharedWorldPlan } from "../../study/plan-types.js";
|
|
7
|
+
/** What validation derived from the study, which setup reads. */
|
|
8
|
+
interface AdmittedStudy {
|
|
9
9
|
plan: SharedWorldPlan;
|
|
10
10
|
input: SharedWorldRunInput;
|
|
11
11
|
/** Read for the subject's serve URL, which each participant's subject names. Participants, their
|
|
12
12
|
* count and their host and entry come from the plan's participants. */
|
|
13
|
-
config:
|
|
13
|
+
config: StudyConfig;
|
|
14
14
|
requestedCwd: string;
|
|
15
|
-
deps:
|
|
15
|
+
deps: StudyDeps;
|
|
16
16
|
env: Record<string, string | undefined>;
|
|
17
17
|
descriptor: CuaActorDescriptor;
|
|
18
18
|
planeClass: ConcurrentSharedWorldPlaneClass;
|
|
19
19
|
runBudget: PlaneContext["runBudget"];
|
|
20
20
|
runSession: PlaneContext["runSession"];
|
|
21
|
-
serve:
|
|
21
|
+
serve: StudySubjectServe | undefined;
|
|
22
22
|
localTreeRoute: boolean;
|
|
23
23
|
subjectRepo: string;
|
|
24
24
|
subjectEnvNames: string[];
|
|
25
|
-
checkpoints:
|
|
25
|
+
checkpoints: StudySubjectStateCheckpoint[];
|
|
26
26
|
openaiApiKey: string;
|
|
27
27
|
e2bApiKey: string;
|
|
28
28
|
knownSecretValues: string[];
|
|
29
29
|
scrubKnownValues: (text: string) => string;
|
|
30
30
|
publicRepo: string;
|
|
31
31
|
hasGithubToken: boolean;
|
|
32
|
-
fail: (code:
|
|
32
|
+
fail: (code: ConcurrentSharedWorldStudyErrorCode, message: string, actorLabel?: string) => ConcurrentSharedWorldStudyResult;
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
35
|
* Starts the run and prepares what the planes read: the physical project, the run, the participant
|
|
36
36
|
* specs, comms, the packed tree and email receiving. Returns the refusal when one of them fails.
|
|
37
37
|
*/
|
|
38
|
-
export declare function prepareConcurrentRun(
|
|
38
|
+
export declare function prepareConcurrentRun(study: AdmittedStudy, scope: RunScope): Promise<{
|
|
39
39
|
ok: false;
|
|
40
|
-
result:
|
|
40
|
+
result: ConcurrentSharedWorldStudyResult;
|
|
41
41
|
} | {
|
|
42
42
|
ok: true;
|
|
43
43
|
ctx: PlaneContext;
|
|
@@ -19,19 +19,19 @@ function makeRunId() {
|
|
|
19
19
|
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
20
20
|
return `concurrent-shared-world-${stamp}-${randomBytes(4).toString("hex")}`;
|
|
21
21
|
}
|
|
22
|
-
/** The provisioned plane's setup, or undefined when the
|
|
23
|
-
function provisionedSetup(
|
|
24
|
-
if (!
|
|
22
|
+
/** The provisioned plane's setup, or undefined when the study declares no `subject.serve`. */
|
|
23
|
+
function provisionedSetup(study, prepared) {
|
|
24
|
+
if (!study.serve)
|
|
25
25
|
return undefined;
|
|
26
26
|
const { subjectComms, ...rest } = prepared;
|
|
27
27
|
return {
|
|
28
|
-
serve:
|
|
29
|
-
localTreeRoute:
|
|
30
|
-
subjectRepo:
|
|
31
|
-
publicRepo:
|
|
32
|
-
subjectEnvNames:
|
|
33
|
-
hasGithubToken:
|
|
34
|
-
checkpoints:
|
|
28
|
+
serve: study.serve,
|
|
29
|
+
localTreeRoute: study.localTreeRoute,
|
|
30
|
+
subjectRepo: study.subjectRepo,
|
|
31
|
+
publicRepo: study.publicRepo,
|
|
32
|
+
subjectEnvNames: study.subjectEnvNames,
|
|
33
|
+
hasGithubToken: study.hasGithubToken,
|
|
34
|
+
checkpoints: study.checkpoints,
|
|
35
35
|
commsEmail: subjectComms.email,
|
|
36
36
|
commsPort: subjectComms.port,
|
|
37
37
|
commsEnv: subjectComms.env,
|
|
@@ -48,14 +48,14 @@ async function bindPhysicalProject(requestedCwd) {
|
|
|
48
48
|
return (await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd))
|
|
49
49
|
.physicalPath;
|
|
50
50
|
}
|
|
51
|
-
function startConcurrentRun(
|
|
52
|
-
const { plan, input, deps } =
|
|
51
|
+
function startConcurrentRun(study, cwd, scope) {
|
|
52
|
+
const { plan, input, deps } = study;
|
|
53
53
|
return scope.startRun({
|
|
54
54
|
cwd,
|
|
55
55
|
runId: input.runId,
|
|
56
56
|
mintRunId: makeRunId,
|
|
57
57
|
mode: plan.dryRun ? "dry-run" : "live",
|
|
58
|
-
|
|
58
|
+
study: plan.study,
|
|
59
59
|
renderReview: renderConcurrentReviewMarkdown,
|
|
60
60
|
observer: { open: input.open === true, render: deps.renderObserver },
|
|
61
61
|
});
|
|
@@ -64,10 +64,10 @@ function startConcurrentRun(lab, cwd, scope) {
|
|
|
64
64
|
* Starts the run and prepares what the planes read: the physical project, the run, the participant
|
|
65
65
|
* specs, comms, the packed tree and email receiving. Returns the refusal when one of them fails.
|
|
66
66
|
*/
|
|
67
|
-
export async function prepareConcurrentRun(
|
|
68
|
-
const { plan, input, config, requestedCwd, deps, env, descriptor, planeClass, fail } =
|
|
69
|
-
const { runBudget, runSession, localTreeRoute, subjectEnvNames, publicRepo } =
|
|
70
|
-
const { openaiApiKey, e2bApiKey, knownSecretValues, scrubKnownValues } =
|
|
67
|
+
export async function prepareConcurrentRun(study, scope) {
|
|
68
|
+
const { plan, input, config, requestedCwd, deps, env, descriptor, planeClass, fail } = study;
|
|
69
|
+
const { runBudget, runSession, localTreeRoute, subjectEnvNames, publicRepo } = study;
|
|
70
|
+
const { openaiApiKey, e2bApiKey, knownSecretValues, scrubKnownValues } = study;
|
|
71
71
|
const { dryRun, concurrency } = plan;
|
|
72
72
|
const cwd = await bindPhysicalProject(requestedCwd);
|
|
73
73
|
const warnings = [];
|
|
@@ -90,7 +90,7 @@ export async function prepareConcurrentRun(lab, scope) {
|
|
|
90
90
|
}
|
|
91
91
|
const localTreeArchive = packed.archive;
|
|
92
92
|
const localTreeArchiveBuffer = packed.buffer;
|
|
93
|
-
const started = await startConcurrentRun(
|
|
93
|
+
const started = await startConcurrentRun(study, cwd, scope);
|
|
94
94
|
if (!started.ok)
|
|
95
95
|
return { ok: false, result: fail(started.code, started.message, descriptor.id) };
|
|
96
96
|
const { run } = started;
|
|
@@ -169,7 +169,7 @@ export async function prepareConcurrentRun(lab, scope) {
|
|
|
169
169
|
receiving,
|
|
170
170
|
warnings,
|
|
171
171
|
};
|
|
172
|
-
const provisioned = provisionedSetup(
|
|
172
|
+
const provisioned = provisionedSetup(study, {
|
|
173
173
|
localTreeArchive,
|
|
174
174
|
localTreeArchiveBuffer,
|
|
175
175
|
subjectComms,
|