humanish 0.107.0 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- 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.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +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-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- 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 +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- 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/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- 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} +17 -18
- 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} +7 -6
- 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} +10 -10
- 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} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- 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 +19 -19
- 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.d.ts +1 -1
- 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 +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- 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 +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- 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 +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- 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 +19 -7
- package/dist/run/run-index.js +77 -64
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- 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 +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- 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 +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- 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/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /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}/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
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyCommsEmail, StudyCommsExternal } from "../../study/types.js";
|
|
2
2
|
import type { PreparedRunArtifactPaths } from "../../run/paths.js";
|
|
3
3
|
import type { DesktopParticipantRun, ParticipantRunOutcome } from "./types.js";
|
|
4
4
|
/**
|
|
5
|
-
* Adopter-hosted drain
|
|
5
|
+
* Adopter-hosted drain: once per run, after every participant finished, because the catch is one
|
|
6
6
|
* shared external endpoint, not a per-sandbox file. Same routing and digest-only artifact as
|
|
7
7
|
* the in-sandbox drain; the artifact is registered on every participant that declared a recipient
|
|
8
8
|
* address, since the thread carries each inbox's mail. A drain failure never fails the run.
|
|
@@ -10,8 +10,8 @@ import type { DesktopParticipantRun, ParticipantRunOutcome } from "./types.js";
|
|
|
10
10
|
* Returns the warnings the drain produced; participants that received mail get `commsArtifactPath`.
|
|
11
11
|
*/
|
|
12
12
|
export declare function drainExternalComms(args: {
|
|
13
|
-
externalCommsConfig:
|
|
14
|
-
externalCommsEmail:
|
|
13
|
+
externalCommsConfig: StudyCommsExternal;
|
|
14
|
+
externalCommsEmail: StudyCommsEmail;
|
|
15
15
|
env: Record<string, string | undefined>;
|
|
16
16
|
runPaths: PreparedRunArtifactPaths;
|
|
17
17
|
participantRuns: readonly DesktopParticipantRun[];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { collectExternalCommsEvidence } from "../../comms/external-evidence.js";
|
|
2
2
|
import { participantHasInboxRecipient } from "./participant-desktop.js";
|
|
3
3
|
/**
|
|
4
|
-
* Adopter-hosted drain
|
|
4
|
+
* Adopter-hosted drain: once per run, after every participant finished, because the catch is one
|
|
5
5
|
* shared external endpoint, not a per-sandbox file. Same routing and digest-only artifact as
|
|
6
6
|
* the in-sandbox drain; the artifact is registered on every participant that declared a recipient
|
|
7
7
|
* address, since the thread carries each inbox's mail. A drain failure never fails the run.
|
|
@@ -10,6 +10,7 @@ import { participantPassed, participantStatus } from "../../run/judge.js";
|
|
|
10
10
|
import { buildRunCostSummary, desktopSpanToMinutes } from "../../run/cost-summary.js";
|
|
11
11
|
import { formatParticipantPlanEntry } from "./participant-runs.js";
|
|
12
12
|
import { fanoutParticipantRecords } from "./fanout-records.js";
|
|
13
|
+
import { plural } from "../../run/text.js";
|
|
13
14
|
/** The run's first two events: its creation and the fan-out plan. */
|
|
14
15
|
function fanoutPlanEvents(args) {
|
|
15
16
|
const { specs, plan } = args;
|
|
@@ -19,14 +20,14 @@ function fanoutPlanEvents(args) {
|
|
|
19
20
|
at: args.run.createdAt,
|
|
20
21
|
level: "info",
|
|
21
22
|
type: "cua-lab.run.created",
|
|
22
|
-
message: `Created computer-use fan-out run for ${plan.
|
|
23
|
+
message: `Created computer-use fan-out run for ${plan.studyId} (actor ${args.descriptor.id}, ${specs.length} participants, one world each).`,
|
|
23
24
|
});
|
|
24
25
|
events.push({
|
|
25
26
|
id: "event-001-fanout-plan",
|
|
26
27
|
at: args.run.createdAt,
|
|
27
28
|
level: "info",
|
|
28
29
|
type: "cua-lab.fanout.plan",
|
|
29
|
-
message: `Fan-out plan: ${args.participantPlan.laneCount
|
|
30
|
+
message: `Fan-out plan: ${plural(args.participantPlan.laneCount, "participant")} (${args.participantPlan.strategy}), concurrency ${args.participantPlan.concurrency}, ${plural(args.participantPlan.waves, "wave")}; session budget ${Math.round(args.participantPlan.perLaneSessionBudgetMs / 1000)}s per participant; worst-case ~${args.participantPlan.worstCaseSandboxMinutes} sandbox-minutes${args.dryRun ? " (dry-run: $0)" : ""}. Participants: ${args.participantPlan.lanes.map(formatParticipantPlanEntry).join(", ")}.`,
|
|
30
31
|
});
|
|
31
32
|
return events;
|
|
32
33
|
}
|
|
@@ -35,26 +36,26 @@ function fanoutReview(args, streams) {
|
|
|
35
36
|
// The judge's verdict: live fan-out must prove every participant (judgeParticipants).
|
|
36
37
|
const verdict = args.verdict;
|
|
37
38
|
const passedParticipants = (outcomes ?? []).filter((outcome) => participantPassed(participantFactsOf(outcome))).length;
|
|
38
|
-
// What happened to the
|
|
39
|
+
// What happened to the participants, with the denominator attached. The verdict above has to
|
|
39
40
|
// collapse the run to one word; this does not (docs/principles/three-roles.md).
|
|
40
41
|
const terminalOutcomes = (outcomes ?? []).filter((outcome) => outcome?.session?.status !== undefined);
|
|
41
42
|
const participants = terminalOutcomes.length > 0
|
|
42
43
|
? tallyParticipantOutcomes(
|
|
43
|
-
// A
|
|
44
|
+
// A no-engagement participant is not one who reached the goal. It said "done" having
|
|
44
45
|
// taken zero actions and said nothing, and `passedParticipants` above already refuses to
|
|
45
|
-
// count it
|
|
46
|
-
// "not a passed participant"
|
|
46
|
+
// count it, but `reachedGoal` was reading the trace status directly, so one run could be both
|
|
47
|
+
// "not a passed participant" and "1/1 reached the goal". The headline number a researcher reads
|
|
47
48
|
// first was the dishonest one. Found by a provider bug that ended a study on turn one.
|
|
48
49
|
terminalOutcomes.map((outcome) => participantStatus(outcome.session.status, {
|
|
49
50
|
noEngagement: outcome.noEngagement === true,
|
|
50
51
|
selfReportedBlocker: outcome.selfReportedBlocker === true,
|
|
51
52
|
})),
|
|
52
|
-
// A participant who reached the goal
|
|
53
|
+
// A participant who reached the goal and told you the road there was broken is the most
|
|
53
54
|
// useful result a study produces; reporting only the outcome would bury it.
|
|
54
55
|
terminalOutcomes.map((outcome) => outcome.reportedFriction === true))
|
|
55
56
|
: undefined;
|
|
56
57
|
// The study funnel: per-task completion rates across every session that measured one. This is
|
|
57
|
-
// "where did people get stuck" as data, next to
|
|
58
|
+
// "where did people get stuck" as data, next to who got stuck (participants) above.
|
|
58
59
|
const participantFunnels = (outcomes ?? [])
|
|
59
60
|
.map((outcome) => outcome?.session?.trace.taskFunnel)
|
|
60
61
|
.filter((funnel) => funnel !== undefined);
|
|
@@ -74,12 +75,12 @@ function fanoutReview(args, streams) {
|
|
|
74
75
|
summary: args.inProgress === true
|
|
75
76
|
? `Live computer-use fan-out is running (${specs.length} participants, one world each); terminal participant evidence has not been written yet.`
|
|
76
77
|
: args.dryRun
|
|
77
|
-
? `${args.rerun ? `Rerun
|
|
78
|
-
: `${args.rerun ? `Rerun from ${args.rerun.sourceRunId}: ` : ""}Computer-use fan-out (${specs.length} participants, one world each): ${passedParticipants}/${specs.length
|
|
78
|
+
? `${args.rerun ? `Rerun from ${args.rerun.sourceRunId}: ` : ""}Dry-run fan-out: ${specs.length} participants composed for ${args.descriptor.id} against ${args.appUrl}, one world each; no desktops launched, $0 spend.`
|
|
79
|
+
: `${args.rerun ? `Rerun from ${args.rerun.sourceRunId}: ` : ""}Computer-use fan-out (${specs.length} participants, one world each): ${passedParticipants}/${plural(specs.length, "participant")} reached a terminal, engaged verdict${participants ? `: ${formatParticipantOutcomes(participants, participantEndings)}` : ""}${runTasks ? `; tasks: ${formatRunTaskFunnel(runTasks)}` : ""}.`,
|
|
79
80
|
gaps: args.inProgress === true
|
|
80
81
|
? ["Live fan-out session is still running."]
|
|
81
82
|
: args.dryRun
|
|
82
|
-
? ["Live fan-out session not yet run (dry
|
|
83
|
+
? ["Live fan-out session not yet run (dry run only)."]
|
|
83
84
|
: specs
|
|
84
85
|
.map((spec, index) => ({ spec, outcome: outcomes?.[index] }))
|
|
85
86
|
.filter(({ outcome }) => outcome === undefined ||
|
|
@@ -112,7 +113,7 @@ function fanoutDesktopBrowser(args) {
|
|
|
112
113
|
}
|
|
113
114
|
function fanoutCost(args) {
|
|
114
115
|
const { specs, outcomes } = args;
|
|
115
|
-
// Run-level cost
|
|
116
|
+
// Run-level cost estimate: one model-token line per participant that ran a session (from its persisted
|
|
116
117
|
// trace.estimatedCost) + a desktop line per owned allocation, priced at its observed resources.
|
|
117
118
|
// `per-lane-worlds` participants have no shared provisioning to double-count. Omitted on a pure dry-run.
|
|
118
119
|
const costTraces = specs
|
|
@@ -136,8 +137,8 @@ function fanoutFeedbackCandidates(args) {
|
|
|
136
137
|
? []
|
|
137
138
|
: participantFeedbackCandidates({
|
|
138
139
|
runId: args.run.runId,
|
|
139
|
-
scenarioId: `cua-${plan.
|
|
140
|
-
adapterId: plan.
|
|
140
|
+
scenarioId: `cua-${plan.studyId}`,
|
|
141
|
+
adapterId: plan.studyId,
|
|
141
142
|
goal: redactText(specs[0].evidenceInstructions ?? specs[0].instructions),
|
|
142
143
|
substrate: plan.residual.execution?.target === "local" ? "local-desktop" : "e2b-desktop",
|
|
143
144
|
participants: specs.map((spec, index) => {
|
|
@@ -179,7 +180,7 @@ export function buildCuaFanoutBundle(args) {
|
|
|
179
180
|
at: args.run.createdAt,
|
|
180
181
|
level: "info",
|
|
181
182
|
type: "cua-lab.fanout.rerun",
|
|
182
|
-
message: `Rerun selected ${args.rerun.selectedLaneIds.length
|
|
183
|
+
message: `Rerun selected ${plural(args.rerun.selectedLaneIds.length, "participant")} from ${args.rerun.sourceRunId}: ${args.rerun.previous.map((prior) => `${prior.laneId} was ${prior.status}${prior.completionReason ? `/${prior.completionReason}` : ""}`).join(", ")}. This is a new linked run; the source run verdict is unchanged.`,
|
|
183
184
|
});
|
|
184
185
|
}
|
|
185
186
|
specs.forEach((spec, index) => {
|
|
@@ -218,22 +219,22 @@ export function buildCuaFanoutBundle(args) {
|
|
|
218
219
|
persona: {
|
|
219
220
|
id: specs[0].persona.id,
|
|
220
221
|
name: `Computer-use fan-out (${specs.length} participants)`,
|
|
221
|
-
source: `
|
|
222
|
+
source: `study:${plan.studyId}`,
|
|
222
223
|
sourceDigest: specs[0].persona.promptDigest,
|
|
223
224
|
},
|
|
224
225
|
scenario: {
|
|
225
|
-
id: `cua-${plan.
|
|
226
|
-
title: plan.title ?? `Computer-use fan-out: ${plan.
|
|
227
|
-
// Redacted at
|
|
228
|
-
// digest-only by design, but scenario.goal keeps one participant's composed instructions verbatim
|
|
226
|
+
id: `cua-${plan.studyId}`,
|
|
227
|
+
title: plan.title ?? `Computer-use fan-out: ${plan.studyId}`,
|
|
228
|
+
// Redacted at write time, like every other raw-text surface in the bundle. Participant records are
|
|
229
|
+
// digest-only by design, but scenario.goal keeps one participant's composed instructions verbatim,
|
|
229
230
|
// and an adopter whose authored participant text must name a runtime world URL (an inbox on a route
|
|
230
231
|
// where the harness does not inject one) put an *.e2b.app address in it. That landed raw here
|
|
231
232
|
// and in observer-data.json, the sensitive-text scanner matched it, and verify failed a bundle
|
|
232
|
-
// this writer produced. The only adopter-side workaround was scanner evasion
|
|
233
|
+
// this writer produced. The only adopter-side workaround was scanner evasion.
|
|
233
234
|
//
|
|
234
235
|
// The instructions the model actually receives are untouched; only the persisted copy changes.
|
|
235
236
|
goal: redactText(specs[0].evidenceInstructions ?? specs[0].instructions),
|
|
236
|
-
source: `
|
|
237
|
+
source: `study:${plan.studyId}`,
|
|
237
238
|
sourceDigest: specs[0].persona.promptDigest,
|
|
238
239
|
},
|
|
239
240
|
lifecycle: [
|
|
@@ -251,14 +252,14 @@ export function buildCuaFanoutBundle(args) {
|
|
|
251
252
|
status: "passed",
|
|
252
253
|
notes: ranLive
|
|
253
254
|
? anyRaw
|
|
254
|
-
? "Typed text recorded as length only and reasoning
|
|
255
|
+
? "Typed text is recorded as its length only, and reasoning and messages pass through text redaction. Some participants captured unblurred screenshots, kept for local use and not redacted for publishing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share."
|
|
255
256
|
: "Typed text recorded as length only and reasoning/messages pass through text redaction. Screenshots are blurred at capture (policies.redactScreenshots: true) for a share-as-is bundle."
|
|
256
|
-
: "Dry-run fan-out
|
|
257
|
+
: "Dry-run fan-out bundle: no desktops launched and no screenshots captured. Typed text is recorded as length only and reasoning/messages pass through text redaction whenever a session runs.",
|
|
257
258
|
},
|
|
258
259
|
artifacts: bundleArtifacts(),
|
|
259
260
|
review,
|
|
260
|
-
// What the participants reported, when any reported anything
|
|
261
|
-
// bundles carry none
|
|
261
|
+
// What the participants reported, when any reported anything. Dry-run and in-progress
|
|
262
|
+
// bundles carry none: there is no participant yet to quote.
|
|
262
263
|
feedbackCandidates: fanoutFeedbackCandidates(args),
|
|
263
264
|
// Selected hosted image, including the optional speech default; omitted on the stock desktop.
|
|
264
265
|
...(desktopTemplate === undefined ? {} : { desktopTemplate }),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Each participant's records in a computer-use fan-out bundle: its simulation, its stream, its
|
|
2
2
|
// subject provenance event and the events of its outcome (session, geometry warnings, phase trail).
|
|
3
|
-
import { participantAssignment } from "../../
|
|
3
|
+
import { participantAssignment } from "../../study/participant-assignment.js";
|
|
4
4
|
import { participantEvent, participantRecord, participantStream, } from "../../run/participant-records.js";
|
|
5
5
|
import { declaredScreenForRender } from "../../substrates/e2b/desktop-geometry.js";
|
|
6
6
|
import { describeSubjectState, phaseEventIdSuffix, publicSafeAppUrlLabel } from "./bundle-parts.js";
|
|
@@ -41,7 +41,7 @@ function fanoutParticipantView(args, spec, index) {
|
|
|
41
41
|
: (outcome?.skippedReason ??
|
|
42
42
|
session?.reason ??
|
|
43
43
|
outcome?.sessionError ??
|
|
44
|
-
"
|
|
44
|
+
"Dry run: the evidence shape was written without launching a desktop or spending provider tokens.");
|
|
45
45
|
const traceScreenshotMode = session?.trace.redaction.screenshots;
|
|
46
46
|
const screenshotMode = traceScreenshotMode === "raw" || traceScreenshotMode === "blurred"
|
|
47
47
|
? traceScreenshotMode
|
|
@@ -66,7 +66,7 @@ function fanoutParticipantRecord(args, spec, index, view) {
|
|
|
66
66
|
const { outcome, publicTargetUrl, session, status, reason } = view;
|
|
67
67
|
return participantRecord(spec, index + 1, {
|
|
68
68
|
personaId: spec.persona.id,
|
|
69
|
-
scenarioId: `cua-${plan.
|
|
69
|
+
scenarioId: `cua-${plan.studyId}`,
|
|
70
70
|
status,
|
|
71
71
|
streamKind: "browser",
|
|
72
72
|
mode: "browser-sim",
|
|
@@ -80,13 +80,12 @@ function fanoutParticipantRecord(args, spec, index, view) {
|
|
|
80
80
|
? `Participant ${spec.planned.id} ${outcome.skippedReason}.`
|
|
81
81
|
: outcome?.sessionError !== undefined
|
|
82
82
|
? `Participant ${spec.planned.id} failed before a terminal session verdict: ${outcome.sessionError}`
|
|
83
|
-
: `
|
|
83
|
+
: `Participant ${spec.planned.id} (${spec.persona.id}/${spec.planned.device.name}) for ${args.descriptor.id} against ${publicTargetUrl}; no session ran.`,
|
|
84
84
|
startedAt: args.run.createdAt,
|
|
85
85
|
updatedAt: args.run.createdAt,
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
88
|
function fanoutParticipantStream(args, spec, view) {
|
|
89
|
-
const { plan } = args;
|
|
90
89
|
const { outcome, publicTargetUrl, session, desktopGeometry, screenshots } = view;
|
|
91
90
|
const { lastScreenshot, status, reason, screenshotMode } = view;
|
|
92
91
|
const judged = outcome === undefined ? undefined : judgedStatus(participantFactsOf(outcome));
|
|
@@ -104,7 +103,7 @@ function fanoutParticipantStream(args, spec, view) {
|
|
|
104
103
|
? {}
|
|
105
104
|
: { caseGroup: spec.planned.labels.caseGroup }),
|
|
106
105
|
kind: "browser",
|
|
107
|
-
label:
|
|
106
|
+
label: `${spec.planned.id} · browser`,
|
|
108
107
|
status,
|
|
109
108
|
...(judged === undefined ? {} : { judgedStatus: judged }),
|
|
110
109
|
transport: "snapshot",
|
|
@@ -113,9 +112,9 @@ function fanoutParticipantStream(args, spec, view) {
|
|
|
113
112
|
? {
|
|
114
113
|
kind: "screenshot",
|
|
115
114
|
url: lastScreenshot,
|
|
116
|
-
title: `
|
|
115
|
+
title: `Desktop (${screenshotMode})`,
|
|
117
116
|
}
|
|
118
|
-
: { kind: "placeholder", title:
|
|
117
|
+
: { kind: "placeholder", title: "Desktop" },
|
|
119
118
|
...(desktopGeometry.viewport === undefined
|
|
120
119
|
? {}
|
|
121
120
|
: {
|
|
@@ -180,7 +179,7 @@ function fanoutSubjectEvents(ctx, spec, view) {
|
|
|
180
179
|
const { publicTargetUrl, subject, session } = view;
|
|
181
180
|
const events = [];
|
|
182
181
|
const record = (event) => events.push(participantEvent(spec, event));
|
|
183
|
-
// Per-participant subject provenance
|
|
182
|
+
// Per-participant subject provenance.
|
|
184
183
|
if (args.plan.runner.subject.kind === "clone" && args.publicRepo) {
|
|
185
184
|
record({
|
|
186
185
|
id: nextEventId(`subject-${spec.planned.id}`),
|
|
@@ -188,7 +187,7 @@ function fanoutSubjectEvents(ctx, spec, view) {
|
|
|
188
187
|
level: "info",
|
|
189
188
|
type: "cua-lab.subject.provenance",
|
|
190
189
|
message: `Participant ${spec.planned.id}: ${args.dryRun
|
|
191
|
-
? `subject declared: clone of ${args.publicRepo}, served at ${publicTargetUrl} in-sandbox (dry
|
|
190
|
+
? `subject declared: clone of ${args.publicRepo}, served at ${publicTargetUrl} in-sandbox (dry run; nothing cloned)`
|
|
192
191
|
: subject.commit
|
|
193
192
|
? session
|
|
194
193
|
? `subject cloned from ${args.publicRepo}@${subject.commit} and served at ${publicTargetUrl} in-sandbox`
|
|
@@ -203,7 +202,7 @@ function fanoutSubjectEvents(ctx, spec, view) {
|
|
|
203
202
|
level: "info",
|
|
204
203
|
type: "cua-lab.subject.provenance",
|
|
205
204
|
message: `Participant ${spec.planned.id}: ${args.dryRun
|
|
206
|
-
? `subject declared: local working tree, to be packed and served at ${publicTargetUrl} in-sandbox (dry
|
|
205
|
+
? `subject declared: local working tree, to be packed and served at ${publicTargetUrl} in-sandbox (dry run; nothing packed)`
|
|
207
206
|
: subject.archiveSha256
|
|
208
207
|
? session
|
|
209
208
|
? `subject packed (archiveSha256 ${subject.archiveSha256}${subject.dirty === true ? ", dirty working tree" : subject.dirty === false ? ", clean working tree" : ""}) and served at ${publicTargetUrl} in-sandbox`
|
|
@@ -270,7 +269,7 @@ function fanoutOutcomeEvents(ctx, spec, view) {
|
|
|
270
269
|
at: args.run.createdAt,
|
|
271
270
|
level: "info",
|
|
272
271
|
type: "cua-lab.contract.ready",
|
|
273
|
-
message: `Participant ${spec.planned.id}: dry-run
|
|
272
|
+
message: `Participant ${spec.planned.id}: dry-run participant ready; switch scenario.mode to live for a real desktop session.`,
|
|
274
273
|
});
|
|
275
274
|
}
|
|
276
275
|
for (const warning of desktopGeometry.warnings ?? []) {
|
|
@@ -282,7 +281,7 @@ function fanoutOutcomeEvents(ctx, spec, view) {
|
|
|
282
281
|
message: warning,
|
|
283
282
|
});
|
|
284
283
|
}
|
|
285
|
-
// Persisted per-participant phase trail (real boot timing): one RunEvent per
|
|
284
|
+
// Persisted per-participant phase trail (real boot timing): one RunEvent per completed phase
|
|
286
285
|
// boundary this participant recorded (started events never persist here; they carry no durationMs).
|
|
287
286
|
for (const phase of outcome?.phaseRecords ?? []) {
|
|
288
287
|
record({
|
|
@@ -2,7 +2,7 @@ import type { ActorTokenUsage, ActorTraceItem } from "../../actors/contract.js";
|
|
|
2
2
|
import type { CuaLiveMetadata } from "../../actors/computer-use/loop.js";
|
|
3
3
|
import { type ObserverResult } from "../../observer/render.js";
|
|
4
4
|
import type { RunBundle } from "../../run/bundle.js";
|
|
5
|
-
import type {
|
|
5
|
+
import type { RunStudyHomes } from "../../study/run-study-homes.js";
|
|
6
6
|
import type { DesktopParticipantRun } from "./types.js";
|
|
7
7
|
export interface LiveTraceFlush {
|
|
8
8
|
/** Record a participant's recorded-so-far items; the bundle rewrite follows on the flush
|
|
@@ -12,7 +12,7 @@ export interface LiveTraceFlush {
|
|
|
12
12
|
stop: () => Promise<void>;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
|
-
* Incremental live flush
|
|
15
|
+
* Incremental live flush: as each participant's loop reports its recorded-so-far items,
|
|
16
16
|
* rewrite the in-progress bundle with per-stream `liveActor` partials so the attached
|
|
17
17
|
* Observer's 5s poll sees the timeline grow. Throttled (one write per interval, trailing
|
|
18
18
|
* write guaranteed). `write` is the run's `writeSnapshot`, which serializes writes and refuses
|
|
@@ -32,9 +32,9 @@ export declare function startLiveTraceFlush(args: {
|
|
|
32
32
|
* the run. The URLs carry auth, so they live in memory and on the Observer result, never in run
|
|
33
33
|
* artifacts.
|
|
34
34
|
*/
|
|
35
|
-
export declare function trackRuntimeStreams(onStream:
|
|
35
|
+
export declare function trackRuntimeStreams(onStream: RunStudyHomes["onStream"] | undefined): {
|
|
36
36
|
/** Records each stream for the Observer, after the caller's onStream. */
|
|
37
|
-
onStream: NonNullable<
|
|
37
|
+
onStream: NonNullable<RunStudyHomes["onStream"]>;
|
|
38
38
|
/** From now on, keep this live Observer's stream list current. */
|
|
39
39
|
showIn: (observer: ObserverResult & {
|
|
40
40
|
ok: true;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
|
|
2
2
|
import {} from "../../observer/run-routes.js";
|
|
3
3
|
/**
|
|
4
|
-
* Incremental live flush
|
|
4
|
+
* Incremental live flush: as each participant's loop reports its recorded-so-far items,
|
|
5
5
|
* rewrite the in-progress bundle with per-stream `liveActor` partials so the attached
|
|
6
6
|
* Observer's 5s poll sees the timeline grow. Throttled (one write per interval, trailing
|
|
7
7
|
* write guaranteed). `write` is the run's `writeSnapshot`, which serializes writes and refuses
|
|
@@ -42,9 +42,9 @@ export function startLiveTraceFlush(args) {
|
|
|
42
42
|
liveActor: {
|
|
43
43
|
schema: "humanish.live-actor.v1",
|
|
44
44
|
updatedAt,
|
|
45
|
-
//
|
|
46
|
-
// surface watching a live run can only name the participant id
|
|
47
|
-
//
|
|
45
|
+
// Who this participant is, carried while the run is live. Without it a
|
|
46
|
+
// surface watching a live run can only name the participant id and the stream
|
|
47
|
+
// label (`<participant id> · browser`), which describe the harness, not the participant.
|
|
48
48
|
...(personaByStream.get(stream.id) === undefined
|
|
49
49
|
? {}
|
|
50
50
|
: { persona: { id: personaByStream.get(stream.id) } }),
|
|
@@ -125,8 +125,8 @@ export function trackRuntimeStreams(onStream) {
|
|
|
125
125
|
await onStream?.(event);
|
|
126
126
|
if (event.type === "ready")
|
|
127
127
|
urls.push({ streamId: event.streamId, url: event.url });
|
|
128
|
-
// Mark, never remove: the tile needs to
|
|
129
|
-
// have the stream silently vanish from the overlay
|
|
128
|
+
// Mark, never remove: the tile needs to know the live view ended (and say so) rather than
|
|
129
|
+
// have the stream silently vanish from the overlay.
|
|
130
130
|
else
|
|
131
131
|
for (const entry of urls)
|
|
132
132
|
if (entry.streamId === event.streamId)
|
|
@@ -5,15 +5,16 @@ import type { CuaParticipantsSetup, CuaRunSetup } from "./setup.js";
|
|
|
5
5
|
* Runs the participants (a dry run runs none). Returns the refusal when real email setup fails, or
|
|
6
6
|
* the participant outcomes and the warnings the finish records.
|
|
7
7
|
*/
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function runStudyParticipants(setup: CuaRunSetup, participants: CuaParticipantsSetup): Promise<{
|
|
9
9
|
ok: false;
|
|
10
10
|
result: {
|
|
11
11
|
automaticAnalysis?: import("../../analysis/job.js").AutomaticAnalysisOutcome;
|
|
12
12
|
automaticAnalysisTrigger?: "default" | "explicit";
|
|
13
|
-
schema: typeof import("
|
|
13
|
+
schema: typeof import("../../run/study-result.js").STUDY_RESULT_SCHEMA;
|
|
14
|
+
route: "computer-use";
|
|
15
|
+
studyId: string;
|
|
14
16
|
ok: boolean;
|
|
15
17
|
cwd: string;
|
|
16
|
-
labId: string;
|
|
17
18
|
actor: string;
|
|
18
19
|
appUrl: string;
|
|
19
20
|
dryRun: boolean;
|
|
@@ -38,7 +39,7 @@ export declare function runLabParticipants(setup: CuaRunSetup, participants: Cua
|
|
|
38
39
|
diagnostics?: import("./diagnostics.js").CuaDiagnostics;
|
|
39
40
|
warnings: string[];
|
|
40
41
|
error?: {
|
|
41
|
-
code: import("./types.js").
|
|
42
|
+
code: import("./types.js").CuaActorStudyErrorCode;
|
|
42
43
|
message: string;
|
|
43
44
|
};
|
|
44
45
|
runId: string;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// receiving, the participants themselves, and the drain of an operator-hosted inbox.
|
|
3
3
|
import { prepareReceivingRun } from "../../comms/receiving-runtime.js";
|
|
4
4
|
import { liveObserverResult } from "../../observer/live.js";
|
|
5
|
-
import { pricedModel } from "../../
|
|
5
|
+
import { pricedModel } from "../../study/plan-base.js";
|
|
6
6
|
import { runAllCuaParticipants } from "./participant-execution.js";
|
|
7
7
|
import { startLiveTraceFlush } from "./live-flush.js";
|
|
8
8
|
import { drainExternalComms } from "./external-comms.js";
|
|
@@ -12,7 +12,7 @@ import { participantSubjectEnv } from "./types.js";
|
|
|
12
12
|
* Runs the participants (a dry run runs none). Returns the refusal when real email setup fails, or
|
|
13
13
|
* the participant outcomes and the warnings the finish records.
|
|
14
14
|
*/
|
|
15
|
-
export async function
|
|
15
|
+
export async function runStudyParticipants(setup, participants) {
|
|
16
16
|
const { plan, input, cwd, streams, descriptor, run } = setup;
|
|
17
17
|
const { participantRuns, participantPlan, bundleBase } = setup;
|
|
18
18
|
const { env, knownSecretValues, deps, liveTrace, externalComms, inProgress, fail } = participants;
|
|
@@ -20,10 +20,10 @@ export async function runLabParticipants(setup, participants) {
|
|
|
20
20
|
const inProcess = plan.runner.desktop === "in-process";
|
|
21
21
|
const subjectEnvNames = [...participantSubjectEnv(plan.runner.subject)];
|
|
22
22
|
const { runId, paths: runPaths } = run;
|
|
23
|
-
// A live run writes what it is doing
|
|
24
|
-
// This
|
|
25
|
-
// run launched by an agent (`
|
|
26
|
-
// nothing at all until it
|
|
23
|
+
// A live run writes what it is doing as it does it, whether or not anyone is currently watching.
|
|
24
|
+
// This is not gated on `options.onObserverReady` (the interactive Observer callback): gated, a
|
|
25
|
+
// run launched by an agent (`run --json`), detached, or from the terminal surface records
|
|
26
|
+
// nothing at all until it completes, and anything asking "what is this participant doing right
|
|
27
27
|
// now" got silence for the whole run. Who reads the evidence is not the run's business; the
|
|
28
28
|
// callback below stays conditional, the writing does not.
|
|
29
29
|
if (!dryRun) {
|
|
@@ -47,7 +47,7 @@ export async function runLabParticipants(setup, participants) {
|
|
|
47
47
|
streams.showIn(liveObserver);
|
|
48
48
|
if (input.onObserverReady)
|
|
49
49
|
await input.onObserverReady(liveObserver);
|
|
50
|
-
// Incremental live flush
|
|
50
|
+
// Incremental live flush: as each participant's loop reports its recorded-so-far items,
|
|
51
51
|
// rewrite the in-progress bundle with per-stream `liveActor` partials so the attached
|
|
52
52
|
// Observer's 5s poll sees the timeline grow. The run refuses any snapshot once the final
|
|
53
53
|
// write began; the route stops the flush timer on every exit below.
|
|
@@ -91,7 +91,7 @@ export async function runLabParticipants(setup, participants) {
|
|
|
91
91
|
return {
|
|
92
92
|
ok: false,
|
|
93
93
|
result: {
|
|
94
|
-
...fail("
|
|
94
|
+
...fail("HUMANISH_COMPUTER_USE_SUBJECT_INVALID", "Real email setup failed before desktop allocation. Run humanish comms check --online and humanish comms recover to inspect authentication and pending cleanup.", descriptor.id),
|
|
95
95
|
runId,
|
|
96
96
|
},
|
|
97
97
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
2
2
|
import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { StudyDeps } from "../../study/study-deps.js";
|
|
4
4
|
/**
|
|
5
5
|
* Pack the working tree for a local-tree run and report what left the host on stderr, by counts
|
|
6
6
|
* and digest only, never paths or file names.
|
|
7
7
|
*/
|
|
8
|
-
export declare function packRunLocalTree(deps:
|
|
9
|
-
readonly subject: Pick<
|
|
8
|
+
export declare function packRunLocalTree(deps: StudyDeps, config: {
|
|
9
|
+
readonly subject: Pick<StudyConfig["subject"], "localTree">;
|
|
10
10
|
}, cwd: string): Promise<{
|
|
11
11
|
archive: LocalTreeArchive;
|
|
12
12
|
buffer: ArrayBuffer;
|
|
@@ -14,7 +14,7 @@ export declare function packRunLocalTree(deps: LabDeps, config: {
|
|
|
14
14
|
/**
|
|
15
15
|
* Default local-tree packing implementation: createLocalTreeArchive(root, opts) on the host,
|
|
16
16
|
* then a single read of the produced archive file into an ArrayBuffer for upload. The DI seam
|
|
17
|
-
* (
|
|
17
|
+
* (StudyDeps.packLocalTree) overrides this in deterministic tests so they never require
|
|
18
18
|
* tar/git.
|
|
19
19
|
*/
|
|
20
20
|
export declare function defaultPackLocalTree(args: {
|
|
@@ -24,7 +24,7 @@ export async function packRunLocalTree(deps, config, cwd) {
|
|
|
24
24
|
/**
|
|
25
25
|
* Default local-tree packing implementation: createLocalTreeArchive(root, opts) on the host,
|
|
26
26
|
* then a single read of the produced archive file into an ArrayBuffer for upload. The DI seam
|
|
27
|
-
* (
|
|
27
|
+
* (StudyDeps.packLocalTree) overrides this in deterministic tests so they never require
|
|
28
28
|
* tar/git.
|
|
29
29
|
*/
|
|
30
30
|
export async function defaultPackLocalTree(args) {
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { InternalRunStudyOptions } from "../../run-study.js";
|
|
2
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
3
3
|
import type { LocalVmInput } from "./types.js";
|
|
4
4
|
import { type LocalFirecrackerAssets } from "../../substrates/local/firecracker-desktop.js";
|
|
5
|
-
type LocalVmRunOptions =
|
|
6
|
-
config:
|
|
5
|
+
type LocalVmRunOptions = InternalRunStudyOptions & {
|
|
6
|
+
config: StudyConfig;
|
|
7
7
|
assets?: LocalFirecrackerAssets;
|
|
8
8
|
signal?: AbortSignal;
|
|
9
9
|
};
|
|
10
10
|
/** A local browser study's bindings, and the cleanup of what its participants started. */
|
|
11
11
|
export interface LocalVmRun {
|
|
12
|
-
/** The caller's
|
|
13
|
-
readonly options:
|
|
12
|
+
/** The caller's runStudyWith options, with the account provider when the study runs one. */
|
|
13
|
+
readonly options: InternalRunStudyOptions;
|
|
14
14
|
/** The desktop, the analysis gate and the abort signal the computer-use run takes. */
|
|
15
15
|
readonly localVm: LocalVmInput;
|
|
16
16
|
close(): Promise<void>;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Local desktop/provider composition: the options the
|
|
20
|
-
* anything starts on a
|
|
19
|
+
* Local desktop/provider composition: the options the study is planned and run with. It throws before
|
|
20
|
+
* anything starts on a study the local VM cannot run.
|
|
21
21
|
*/
|
|
22
22
|
export declare function prepareLocalVmRun(options: LocalVmRunOptions): LocalVmRun;
|
|
23
23
|
export {};
|
|
@@ -26,7 +26,7 @@ function guestAssets(options, account, needsMedia) {
|
|
|
26
26
|
if (account) {
|
|
27
27
|
const readiness = await checkRestrictedCodexAnalysisReadiness({ timeoutMs: 5000 });
|
|
28
28
|
if (!readiness.ready)
|
|
29
|
-
throw new Error(`Codex account is not ready (${readiness.errorCode}). Run humanish doctor --
|
|
29
|
+
throw new Error(`Codex account is not ready (${readiness.errorCode}). Run humanish doctor --study <study> before starting a local study.`);
|
|
30
30
|
}
|
|
31
31
|
return (options.assets ??
|
|
32
32
|
(await prepareLocalRuntime({
|
|
@@ -152,8 +152,8 @@ function accountProvider(state) {
|
|
|
152
152
|
};
|
|
153
153
|
}
|
|
154
154
|
/**
|
|
155
|
-
* Local desktop/provider composition: the options the
|
|
156
|
-
* anything starts on a
|
|
155
|
+
* Local desktop/provider composition: the options the study is planned and run with. It throws before
|
|
156
|
+
* anything starts on a study the local VM cannot run.
|
|
157
157
|
*/
|
|
158
158
|
export function prepareLocalVmRun(options) {
|
|
159
159
|
const config = localBrowserDefaults(options.config);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CuaExecutor } from "../../actors/computer-use/loop.js";
|
|
2
2
|
import type { DesktopParticipantRun, ParticipantRunOutcome } from "./types.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { StudyCommsEmail, StudyCommsRecipient } from "../../study/types.js";
|
|
4
4
|
import type { PreparedOutputRoot } from "../../run/contained-output.js";
|
|
5
5
|
/** A prepared desktop supplies only participant input/observation and its inbox location. */
|
|
6
6
|
export interface ReadyParticipantDesktop {
|
|
@@ -38,11 +38,11 @@ export interface ParticipantDesktop {
|
|
|
38
38
|
}
|
|
39
39
|
/** Builds one participant's desktop. The factory must not acquire anything; prepare does. */
|
|
40
40
|
export type ParticipantDesktopFactory = (run: DesktopParticipantRun, warnings: string[], artifactRoot: PreparedOutputRoot) => ParticipantDesktop;
|
|
41
|
-
/** The participant's addressed comms recipient, when one exists
|
|
42
|
-
* inbox instruction
|
|
41
|
+
/** The participant's addressed comms recipient, when one exists: the gate and the address source for the
|
|
42
|
+
* inbox instruction. A participant told to check an inbox it can never receive into would stall,
|
|
43
43
|
* so no addressed recipient means no instruction. */
|
|
44
|
-
export declare function inboxRecipientFor(commsEmail:
|
|
45
|
-
/** True when a participant has a declared comms recipient
|
|
44
|
+
export declare function inboxRecipientFor(commsEmail: StudyCommsEmail, participantId: string): StudyCommsRecipient | undefined;
|
|
45
|
+
/** True when a participant has a declared comms recipient with an address, so the drain can actually match the
|
|
46
46
|
* mail the persona will be told to read. Gates the inbox instruction to participants that can receive
|
|
47
|
-
* mail
|
|
48
|
-
export declare function participantHasInboxRecipient(commsEmail:
|
|
47
|
+
* mail; a participant told to check an inbox it can never receive into would just stall. */
|
|
48
|
+
export declare function participantHasInboxRecipient(commsEmail: StudyCommsEmail, participantId: string): boolean;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { recipientParticipantId } from "../../
|
|
2
|
-
/** The participant's addressed comms recipient, when one exists
|
|
3
|
-
* inbox instruction
|
|
1
|
+
import { recipientParticipantId } from "../../study/parse/comms.js";
|
|
2
|
+
/** The participant's addressed comms recipient, when one exists: the gate and the address source for the
|
|
3
|
+
* inbox instruction. A participant told to check an inbox it can never receive into would stall,
|
|
4
4
|
* so no addressed recipient means no instruction. */
|
|
5
5
|
export function inboxRecipientFor(commsEmail, participantId) {
|
|
6
6
|
return (commsEmail.recipients ?? []).find((recipient) => recipientParticipantId(recipient) === participantId && recipient.address !== undefined);
|
|
7
7
|
}
|
|
8
|
-
/** True when a participant has a declared comms recipient
|
|
8
|
+
/** True when a participant has a declared comms recipient with an address, so the drain can actually match the
|
|
9
9
|
* mail the persona will be told to read. Gates the inbox instruction to participants that can receive
|
|
10
|
-
* mail
|
|
10
|
+
* mail; a participant told to check an inbox it can never receive into would just stall. */
|
|
11
11
|
export function participantHasInboxRecipient(commsEmail, participantId) {
|
|
12
12
|
return inboxRecipientFor(commsEmail, participantId) !== undefined;
|
|
13
13
|
}
|
|
@@ -11,12 +11,12 @@ export declare function makeParticipantWriteScreenshot(artifactRoot: PreparedOut
|
|
|
11
11
|
export declare function runCuaParticipant(spec: DesktopParticipantRun, deps: CuaParticipantDeps): Promise<ParticipantRunOutcome>;
|
|
12
12
|
/**
|
|
13
13
|
* Run N>1 E2B participants with bounded concurrency, a pipeline gate (the first provisions
|
|
14
|
-
* before the rest start), and session fail-fast on
|
|
14
|
+
* before the rest start), and session fail-fast on harness errors only (queued participants
|
|
15
15
|
* become `blocked` with a pinned reason + a fail-fast event; mission verdicts never trip it).
|
|
16
|
-
* Each participant tears down
|
|
16
|
+
* Each participant tears down its own sandbox by id; nothing here ever enumerates.
|
|
17
17
|
*
|
|
18
|
-
* Exported for the
|
|
19
|
-
*
|
|
18
|
+
* Exported for the total-runner tests: the injectable runner lets a test make one participant
|
|
19
|
+
* throw (the exact class the guard exists for) without a live sandbox. Production always uses
|
|
20
20
|
* the default.
|
|
21
21
|
*/
|
|
22
22
|
export declare function runCuaParticipants(runs: DesktopParticipantRun[], deps: Omit<CuaParticipantDeps, "signalProvisioned">, concurrency: number, runParticipant?: typeof runCuaParticipant): Promise<{
|