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
|
@@ -132,12 +132,12 @@ export async function runCuaParticipant(spec, deps) {
|
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
134
|
* Run N>1 E2B participants with bounded concurrency, a pipeline gate (the first provisions
|
|
135
|
-
* before the rest start), and session fail-fast on
|
|
135
|
+
* before the rest start), and session fail-fast on harness errors only (queued participants
|
|
136
136
|
* become `blocked` with a pinned reason + a fail-fast event; mission verdicts never trip it).
|
|
137
|
-
* Each participant tears down
|
|
137
|
+
* Each participant tears down its own sandbox by id; nothing here ever enumerates.
|
|
138
138
|
*
|
|
139
|
-
* Exported for the
|
|
140
|
-
*
|
|
139
|
+
* Exported for the total-runner tests: the injectable runner lets a test make one participant
|
|
140
|
+
* throw (the exact class the guard exists for) without a live sandbox. Production always uses
|
|
141
141
|
* the default.
|
|
142
142
|
*/
|
|
143
143
|
export async function runCuaParticipants(runs, deps, concurrency, runParticipant = runCuaParticipant) {
|
|
@@ -164,10 +164,10 @@ export async function runCuaParticipants(runs, deps, concurrency, runParticipant
|
|
|
164
164
|
if (failFast.tripped) {
|
|
165
165
|
return skippedOutcome(spec, `skipped: ${failFast.reason}`);
|
|
166
166
|
}
|
|
167
|
-
// The participant runner is
|
|
167
|
+
// The participant runner is total: every exit path returns a recorded outcome. Without this
|
|
168
168
|
// guard, one participant's late throw (e.g. its trace write hitting ENOSPC after its own sandbox was
|
|
169
169
|
// already torn down) rejected the whole map while sibling workers kept launching sandboxes
|
|
170
|
-
// nobody would ever record
|
|
170
|
+
// nobody would ever record, so the run spent money and then reported nothing.
|
|
171
171
|
let outcome;
|
|
172
172
|
try {
|
|
173
173
|
outcome = await runParticipant(spec, {
|
|
@@ -187,7 +187,7 @@ export async function runCuaParticipants(runs, deps, concurrency, runParticipant
|
|
|
187
187
|
});
|
|
188
188
|
}
|
|
189
189
|
catch (error) {
|
|
190
|
-
// The first participant may have thrown before signaling the provisioning gate
|
|
190
|
+
// The first participant may have thrown before signaling the provisioning gate; release the followers as
|
|
191
191
|
// blocked rather than leaving them awaiting a gate that will never settle.
|
|
192
192
|
if (index === 0)
|
|
193
193
|
rejectGate?.();
|
|
@@ -247,7 +247,7 @@ export function toParticipantResult(spec, outcome, subject, dryRun) {
|
|
|
247
247
|
ok: false,
|
|
248
248
|
diagnostics: cuaParticipantDiagnostics({ dryRun, skipped: true }),
|
|
249
249
|
skippedReason: outcome.skippedReason,
|
|
250
|
-
error: { code: "
|
|
250
|
+
error: { code: "HUMANISH_COMPUTER_USE_FAILED", message: outcome.skippedReason },
|
|
251
251
|
};
|
|
252
252
|
}
|
|
253
253
|
const session = outcome.session;
|
|
@@ -299,7 +299,7 @@ export function toParticipantResult(spec, outcome, subject, dryRun) {
|
|
|
299
299
|
? {}
|
|
300
300
|
: {
|
|
301
301
|
error: {
|
|
302
|
-
code: outcome.failureCode ?? "
|
|
302
|
+
code: outcome.failureCode ?? "HUMANISH_COMPUTER_USE_FAILED",
|
|
303
303
|
message: outcome.sessionError ??
|
|
304
304
|
(outcome.noEngagement
|
|
305
305
|
? "Actor took no actions and produced no message (likely a blank/still-loading screen); not a credible goal_satisfied."
|
|
@@ -309,7 +309,7 @@ export function toParticipantResult(spec, outcome, subject, dryRun) {
|
|
|
309
309
|
? `Computer-use session ended with a harness error: ${session.reason}`
|
|
310
310
|
: session?.status !== "passed"
|
|
311
311
|
? `Computer-use session ended with ${session?.status ?? "unknown"}: ${session?.reason ?? "no terminal reason"}`
|
|
312
|
-
: "
|
|
312
|
+
: "The computer-use run did not produce a terminal session."),
|
|
313
313
|
},
|
|
314
314
|
}),
|
|
315
315
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CuaExecutor, CuaLoopResult, CuaProvider } from "../../actors/computer-use/loop.js";
|
|
2
|
+
import type { ActorConversation } from "../../actors/contract.js";
|
|
2
3
|
import type { CuaActorSessionOptions } from "../../actors/computer-use/actor.js";
|
|
3
4
|
import { startClaudeSession } from "../../actors/local-agent/claude-session.js";
|
|
4
5
|
import { createRestrictedCodexParticipant, type ParticipantProviderCloseResult } from "../../actors/codex/restricted-participant.js";
|
|
@@ -29,6 +30,11 @@ export declare function closeParticipantModel(model: ParticipantModel, warnings:
|
|
|
29
30
|
}>;
|
|
30
31
|
/** Prices the finished session's tokens onto its trace, writes the trace, and warns on raw screenshots. */
|
|
31
32
|
export declare function recordParticipantTrace(spec: DesktopParticipantRun, deps: ParticipantModelDeps, session: CuaLoopResult, warnings: string[]): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* The run warning for a participant whose provider kept no conversation server-side, so humanish
|
|
35
|
+
* carried it on every request. It says why, and how many early turns became a text summary.
|
|
36
|
+
*/
|
|
37
|
+
export declare function explicitContextWarning(conversation: ActorConversation): string;
|
|
32
38
|
/** The checks that keep a goal_satisfied session from counting as a pass, with their warnings. */
|
|
33
39
|
export declare function judgeParticipantSession(session: CuaLoopResult | undefined, deps: ParticipantModelDeps, warnings: string[]): {
|
|
34
40
|
noEngagement: boolean;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// finished session. The desktop side stays with the participant runner.
|
|
4
4
|
import { startClaudeSession } from "../../actors/local-agent/claude-session.js";
|
|
5
5
|
import { createLocalAgentProvider } from "../../actors/local-agent/cli.js";
|
|
6
|
-
import { pricedModel } from "../../
|
|
6
|
+
import { pricedModel } from "../../study/plan-base.js";
|
|
7
7
|
import { estimateActorCostForExecution, round6 } from "../../run/pricing.js";
|
|
8
8
|
import { redactText } from "../../evidence/redaction.js";
|
|
9
9
|
import { createRestrictedCodexParticipant, } from "../../actors/codex/restricted-participant.js";
|
|
@@ -49,12 +49,12 @@ export async function startParticipantModel(spec, deps, executor) {
|
|
|
49
49
|
return { provider: codexParticipant.provider, codexParticipant };
|
|
50
50
|
}
|
|
51
51
|
if (localAgent === "claude") {
|
|
52
|
-
// One session for the whole run, like the codex thread above
|
|
52
|
+
// One session for the whole run, like the codex thread above. The one-shot
|
|
53
53
|
// provider (createLocalAgentProvider) spawned `claude -p` per turn, and every turn
|
|
54
54
|
// started with no memory of the last. HUMANISH_LOCAL_AGENT_ONE_SHOT=1 keeps that path
|
|
55
|
-
// reachable as a
|
|
55
|
+
// reachable as a measurement switch: MemTrapBench (2026-08) reports memory frameworks
|
|
56
56
|
// degrading agent performance by 10-40% on some tasks, so "remembers" has to be measured
|
|
57
|
-
// against "does not" on the same
|
|
57
|
+
// against "does not" on the same study, not assumed. The trace records which one ran.
|
|
58
58
|
const oneShot = env.HUMANISH_LOCAL_AGENT_ONE_SHOT !== undefined &&
|
|
59
59
|
env.HUMANISH_LOCAL_AGENT_ONE_SHOT !== "" &&
|
|
60
60
|
env.HUMANISH_LOCAL_AGENT_ONE_SHOT !== "0";
|
|
@@ -82,7 +82,7 @@ export async function startParticipantModel(spec, deps, executor) {
|
|
|
82
82
|
/** The options the participant's session runs with: prompt, model settings, spend caps and callbacks. */
|
|
83
83
|
export function participantSessionOptions(spec, deps, ready, provider, writeScreenshot) {
|
|
84
84
|
const { executor, inbox } = ready;
|
|
85
|
-
// The
|
|
85
|
+
// The fail-closed spend cap (execution.caps.maxUsd) is wired into the loop as maxUsd + an
|
|
86
86
|
// injected pure per-turn estimator keyed on the resolved model. Preflight already refused a
|
|
87
87
|
// cap on an unpriced model, so the estimate is measurable whenever a cap is in force. The
|
|
88
88
|
// model id here matches provider.version (openai-responses-cu resolves the default when unset).
|
|
@@ -95,7 +95,7 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
|
|
|
95
95
|
persona: spec.persona,
|
|
96
96
|
timeoutMs: deps.timeoutMs,
|
|
97
97
|
// The brain is either a keyed API client or a CLI the operator is already signed in to.
|
|
98
|
-
// Everything below this line
|
|
98
|
+
// Everything below this line (loop, executor, trace, affordances) is identical either
|
|
99
99
|
// way, which is what makes a local-agent run comparable to an API one.
|
|
100
100
|
...(provider === undefined ? {} : { provider: provider }),
|
|
101
101
|
openai: {
|
|
@@ -129,8 +129,8 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
|
|
|
129
129
|
: { stopWhen: spec.planned.limits.stopWhen }),
|
|
130
130
|
...(spec.planned.limits.dwell === undefined ? {} : { dwell: spec.planned.limits.dwell }),
|
|
131
131
|
...(spec.planned.tasks === undefined ? {} : { tasks: spec.planned.tasks }),
|
|
132
|
-
// The
|
|
133
|
-
// ledger and stops when the
|
|
132
|
+
// The study budget: this participant notes its own running estimate on the shared
|
|
133
|
+
// ledger and stops when the run total crosses the cap, independent of the per-participant
|
|
134
134
|
// maxUsd above.
|
|
135
135
|
...(deps.runBudget === undefined
|
|
136
136
|
? {}
|
|
@@ -149,8 +149,8 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
|
|
|
149
149
|
...(deps.onTrace === undefined
|
|
150
150
|
? {}
|
|
151
151
|
: {
|
|
152
|
-
// Forwards the
|
|
153
|
-
// without it never reaches the flush
|
|
152
|
+
// Forwards the running usage as well: the participant runner is where both are known, and usage
|
|
153
|
+
// without it never reaches the flush, which is how the live cost stayed unknown.
|
|
154
154
|
onTrace: (items, usage, metadata) => deps.onTrace?.(spec.planned.id, items, usage, metadata),
|
|
155
155
|
}),
|
|
156
156
|
};
|
|
@@ -207,27 +207,45 @@ export async function closeParticipantModel(model, warnings) {
|
|
|
207
207
|
}
|
|
208
208
|
/** Prices the finished session's tokens onto its trace, writes the trace, and warns on raw screenshots. */
|
|
209
209
|
export async function recordParticipantTrace(spec, deps, session, warnings) {
|
|
210
|
-
// Per-participant model-token cost
|
|
211
|
-
// id is authoritative here
|
|
210
|
+
// Per-participant model-token cost estimate, attached to the trace before it is persisted (the model
|
|
211
|
+
// id is authoritative here: provider.version). Kept at the study boundary so the pure loop
|
|
212
212
|
// never depends on the operator rate table. estimateActorCost declares absent (null) for an
|
|
213
213
|
// unknown rate / missing usage rather than guessing.
|
|
214
214
|
session.trace.estimatedCost = estimateActorCostForExecution(session.trace.tokenUsage, session.trace.ids.model, session.trace.executionProfile);
|
|
215
215
|
await writeContainedOutputFile(deps.artifactRoot, spec.traceArtifactPath, `${JSON.stringify(session.trace, null, 2)}\n`, "utf8");
|
|
216
|
+
const conversation = session.trace.conversation;
|
|
217
|
+
if (conversation?.mode === "explicit_context")
|
|
218
|
+
warnings.push(explicitContextWarning(conversation));
|
|
216
219
|
if (session.trace.redaction.screenshots === "raw") {
|
|
217
|
-
warnings.push("Screenshots are
|
|
220
|
+
warnings.push("Screenshots are unblurred for local use: the bundle stays in the gitignored .humanish/ folder and nothing scans these pixels, so review them before sharing. Set policies.redactScreenshots: true to blur screenshots in a bundle you plan to share.");
|
|
218
221
|
}
|
|
219
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* The run warning for a participant whose provider kept no conversation server-side, so humanish
|
|
225
|
+
* carried it on every request. It says why, and how many early turns became a text summary.
|
|
226
|
+
*/
|
|
227
|
+
export function explicitContextWarning(conversation) {
|
|
228
|
+
const why = conversation.explicitReason === "zdr_rejection"
|
|
229
|
+
? `The OpenAI organization rejected server-side conversation state (zero data retention)${conversation.switchedAtRequest === undefined
|
|
230
|
+
? ""
|
|
231
|
+
: ` on request ${conversation.switchedAtRequest}`}`
|
|
232
|
+
: "zeroDataRetention is set";
|
|
233
|
+
const summarized = conversation.summarizedTurns === 0
|
|
234
|
+
? ""
|
|
235
|
+
: ` To stay within its token budget it summarized the ${conversation.summarizedTurns} oldest turns as text and dropped their screenshots.`;
|
|
236
|
+
return `${why}, so humanish carried this participant's conversation itself (explicit_context).${summarized} The trace's conversation record has each request's carried context.`;
|
|
237
|
+
}
|
|
220
238
|
/** The checks that keep a goal_satisfied session from counting as a pass, with their warnings. */
|
|
221
239
|
export function judgeParticipantSession(session, deps, warnings) {
|
|
222
240
|
const noEngagement = session !== undefined && hollowCompletion(sessionEnding(session));
|
|
223
241
|
if (noEngagement) {
|
|
224
|
-
warnings.push("
|
|
242
|
+
warnings.push("The participant returned goal_satisfied with no actions and no messages, so it likely saw a blank or loading screen and stopped. This does not count as a pass. Check the screenshot, and raise execution.timeoutMs or confirm the app had rendered before the first turn.");
|
|
225
243
|
}
|
|
226
244
|
const blockerReason = resolveSelfReportedBlocker(session);
|
|
227
245
|
const selfReportedBlocker = blockerReason !== undefined;
|
|
228
246
|
const reportedFriction = resolveSelfReportedFriction(session) !== undefined;
|
|
229
247
|
if (selfReportedBlocker) {
|
|
230
|
-
warnings.push(`
|
|
248
|
+
warnings.push(`The participant returned goal_satisfied, but its final message describes a blocker or asks for missing instructions, so this does not count as a pass: ${redactText(deps.scrubKnownValues(blockerReason))}`);
|
|
231
249
|
}
|
|
232
250
|
return { noEngagement, selfReportedBlocker, reportedFriction };
|
|
233
251
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
2
|
-
import type { DevicePreset } from "../../
|
|
3
|
-
import { type ResolvedPersona } from "../../
|
|
4
|
-
import { type
|
|
2
|
+
import type { DevicePreset } from "../../study/device-presets.js";
|
|
3
|
+
import { type ResolvedPersona } from "../../study/persona.js";
|
|
4
|
+
import { type StudyTask } from "../../study/tasks.js";
|
|
5
5
|
import type { DesktopParticipantRun } from "./types.js";
|
|
6
6
|
export declare const DEFAULT_MISSION = "You are testing a web application. The browser is already open at the subject URL. Explore it, accomplish what the scenario asks, and stop when done.";
|
|
7
7
|
/**
|
|
8
|
-
* The participant's outcome as
|
|
8
|
+
* The participant's outcome as one fixed first line of its last message. The
|
|
9
9
|
* free-text computer-use provider has no schema to fill; a fixed line is the next best thing, and
|
|
10
10
|
* the loop reads it into the trace's declaredOutcome. Prompt-only control is weak in general, so
|
|
11
11
|
* adherence is measured (declaredOutcome present or absent on the trace) and the regex over the
|
|
@@ -21,24 +21,24 @@ export declare function composeParticipantInstructions(args: {
|
|
|
21
21
|
mission: string;
|
|
22
22
|
persona?: string;
|
|
23
23
|
instruction?: string;
|
|
24
|
-
/** The
|
|
24
|
+
/** The study's declared protocol. Only the participant-facing `goal` halves are rendered
|
|
25
25
|
* into the prompt; the `success` criteria never appear here. */
|
|
26
|
-
tasks?: readonly
|
|
26
|
+
tasks?: readonly StudyTask[];
|
|
27
27
|
device: {
|
|
28
28
|
name: string;
|
|
29
29
|
preset: DevicePreset;
|
|
30
30
|
};
|
|
31
|
-
/** The
|
|
32
|
-
* makes the persona shape behavior
|
|
33
|
-
* traitsApplied
|
|
34
|
-
* no committed file, unparseable YAML) keeps the
|
|
31
|
+
/** The compiled persona for `args.persona`, when its committed file resolved. Supplying it
|
|
32
|
+
* makes the persona shape behavior: its traits become directives in the prompt and land in
|
|
33
|
+
* traitsApplied, instead of appearing as a bare `Persona: <id>.` label. Absent (unsafe id,
|
|
34
|
+
* no committed file, unparseable YAML) keeps the fallback: the bare line and an empty
|
|
35
35
|
* traitsApplied, never fabricated traits. Resolved by the caller so this stays pure. */
|
|
36
36
|
resolvedPersona?: ResolvedPersona;
|
|
37
37
|
/**
|
|
38
|
-
* desktop-cli
|
|
39
|
-
* because a participant whose every prior world was a browser will look for one
|
|
38
|
+
* desktop-cli: the surface under study is a terminal window, not a page. Said plainly
|
|
39
|
+
* because a participant whose every prior world was a browser will look for one, and because a
|
|
40
40
|
* capability nobody declares is one the recording cannot later be read against. It states that a
|
|
41
|
-
* terminal is open and
|
|
41
|
+
* terminal is open and does not say what to type in it: naming commands would answer the question the
|
|
42
42
|
* study is asking.
|
|
43
43
|
*/
|
|
44
44
|
surface?: "desktop-cli";
|
|
@@ -46,8 +46,8 @@ export declare function composeParticipantInstructions(args: {
|
|
|
46
46
|
instructions: string;
|
|
47
47
|
persona: ActorPersonaRef;
|
|
48
48
|
};
|
|
49
|
-
/** Runtime-inject the persona inbox instruction into a participant's prompt
|
|
50
|
-
* runtime loopback/getHost address (not secret), so
|
|
49
|
+
/** Runtime-inject the persona inbox instruction into a participant's prompt. The inbox URL is a
|
|
50
|
+
* runtime loopback/getHost address (not secret), so, mirroring the lobby-code runtime injection, this
|
|
51
51
|
* augments only the instructions the model receives; the authored prompt + its digest are unchanged.
|
|
52
52
|
* Returns a new spec (never mutates). Shared by the CUA + concurrent shared-world routes. */
|
|
53
53
|
export declare function withInboxMission(spec: DesktopParticipantRun, inboxUrl: string, address?: string, receiving?: boolean): DesktopParticipantRun;
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
// the email inbox at run time. Shared by the computer-use and concurrent shared-world routes.
|
|
4
4
|
import { recipientInboxUrl } from "../../comms/capture-surface.js";
|
|
5
5
|
import { digestText } from "../../evidence/redaction.js";
|
|
6
|
-
import { personaBrief, personaToDirectives, renderPersonaPromptSection, } from "../../
|
|
7
|
-
import { renderTaskPrompt } from "../../
|
|
6
|
+
import { personaBrief, personaToDirectives, renderPersonaPromptSection, } from "../../study/persona.js";
|
|
7
|
+
import { renderTaskPrompt } from "../../study/tasks.js";
|
|
8
8
|
export const DEFAULT_MISSION = "You are testing a web application. The browser is already open at the subject URL. Explore it, accomplish what the scenario asks, and stop when done.";
|
|
9
9
|
/**
|
|
10
|
-
* The participant's outcome as
|
|
10
|
+
* The participant's outcome as one fixed first line of its last message. The
|
|
11
11
|
* free-text computer-use provider has no schema to fill; a fixed line is the next best thing, and
|
|
12
12
|
* the loop reads it into the trace's declaredOutcome. Prompt-only control is weak in general, so
|
|
13
13
|
* adherence is measured (declaredOutcome present or absent on the trace) and the regex over the
|
|
@@ -26,12 +26,12 @@ export function composeParticipantInstructions(args) {
|
|
|
26
26
|
const deviceLine = preset.isMobile
|
|
27
27
|
? `You are a mobile user on a ${name} device (${preset.width}x${preset.height} @${preset.deviceScaleFactor}x). Expect a mobile/touch layout.`
|
|
28
28
|
: `You are a desktop user (${name}, ${preset.width}x${preset.height}).`;
|
|
29
|
-
// The protocol as the
|
|
30
|
-
// are the researcher's instrument and must never reach this prompt
|
|
31
|
-
// be measured optimizes for the measurement instead of using the product (src/
|
|
29
|
+
// The protocol as the participant reads it: numbered goals, nothing else. The success criteria
|
|
30
|
+
// are the researcher's instrument and must never reach this prompt: a persona told how it will
|
|
31
|
+
// be measured optimizes for the measurement instead of using the product (src/study/tasks.ts).
|
|
32
32
|
const taskLines = renderTaskPrompt(args.tasks ?? []);
|
|
33
33
|
// A resolved persona contributes its compiled directives (friction tolerance, skill bias,
|
|
34
|
-
// accessibility behavior, constraints) through the
|
|
34
|
+
// accessibility behavior, constraints) through the same persona.ts compiler the terminal route
|
|
35
35
|
// uses, so one persona file means one behavior across every route.
|
|
36
36
|
const personaLine = args.resolvedPersona
|
|
37
37
|
? renderPersonaPromptSection(args.resolvedPersona)
|
|
@@ -64,8 +64,8 @@ export function composeParticipantInstructions(args) {
|
|
|
64
64
|
},
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
|
-
/** Runtime-inject the persona inbox instruction into a participant's prompt
|
|
68
|
-
* runtime loopback/getHost address (not secret), so
|
|
67
|
+
/** Runtime-inject the persona inbox instruction into a participant's prompt. The inbox URL is a
|
|
68
|
+
* runtime loopback/getHost address (not secret), so, mirroring the lobby-code runtime injection, this
|
|
69
69
|
* augments only the instructions the model receives; the authored prompt + its digest are unchanged.
|
|
70
70
|
* Returns a new spec (never mutates). Shared by the CUA + concurrent shared-world routes. */
|
|
71
71
|
export function withInboxMission(spec, inboxUrl, address, receiving = false) {
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import type { ComputerUsePlan } from "../../
|
|
2
|
-
import { type
|
|
3
|
-
import { type ResolvedPersona } from "../../
|
|
1
|
+
import type { ComputerUsePlan } from "../../study/plan-types.js";
|
|
2
|
+
import { type StudyConfig } from "../../study/types.js";
|
|
3
|
+
import { type ResolvedPersona } from "../../study/persona.js";
|
|
4
4
|
import { type RunRerunLineage } from "../../run/bundle.js";
|
|
5
5
|
import type { PreparedSelectedOutputDirectory } from "../../run/contained-output.js";
|
|
6
|
-
import { type
|
|
7
|
-
export declare function defaultSessionTimeoutMs(config:
|
|
6
|
+
import { type CuaActorStudyErrorCode, type CuaParticipantPlan, type CuaParticipantPlanEntry, type DesktopParticipantRun } from "./types.js";
|
|
7
|
+
export declare function defaultSessionTimeoutMs(config: StudyConfig): number;
|
|
8
8
|
/** Per-participant sandbox deadline (each one owns its own desktop). Mirrors the
|
|
9
9
|
* single-participant formula verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
|
|
10
10
|
* or local-tree: provision budget + Σ state-step budgets) + the server-side
|
|
11
11
|
* reclamation buffer. Local-tree shares the clone route's provisioning budget: it swaps a
|
|
12
12
|
* git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
|
|
13
13
|
* costs the same wall-clock room either way. */
|
|
14
|
-
export declare function resolveParticipantSandboxMs(config:
|
|
14
|
+
export declare function resolveParticipantSandboxMs(config: StudyConfig): number;
|
|
15
15
|
/**
|
|
16
|
-
* The in-flight participant bound a
|
|
16
|
+
* The in-flight participant bound a study declares. Defaults to the participant count: every
|
|
17
17
|
* declared participant runs at once, because a throttle nobody asked for silently turns "N actors
|
|
18
|
-
* live" into waves
|
|
19
|
-
* and simultaneity differ. A declared execution.concurrency is a
|
|
18
|
+
* live" into waves; total session count and spend are the same either way, only wall-clock
|
|
19
|
+
* and simultaneity differ. A declared execution.concurrency is a cap, clamped to [1, participants].
|
|
20
20
|
* The planner records it; the route may only lower it from the environment.
|
|
21
21
|
*/
|
|
22
22
|
export declare function boundedConcurrency(declared: number | undefined, participantCount: number): number;
|
|
23
23
|
/**
|
|
24
|
-
* Pure pre-flight plan resolver (runs in dry-run
|
|
24
|
+
* Pure pre-flight plan resolver (runs in dry-run and live). Returns the participant table, the
|
|
25
25
|
* effective concurrency, the wave count, the per-participant session budget, and the worst-case total
|
|
26
|
-
* sandbox-minutes
|
|
26
|
+
* sandbox-minutes, before any sandbox or provider call. The same plan appears in dry-run,
|
|
27
27
|
* marked $0 (dryRun: true).
|
|
28
28
|
*/
|
|
29
|
-
export declare function resolveCuaParticipantPlan(config:
|
|
29
|
+
export declare function resolveCuaParticipantPlan(config: StudyConfig, opts?: {
|
|
30
30
|
countOverride?: number;
|
|
31
31
|
env?: Record<string, string | undefined>;
|
|
32
32
|
dryRun?: boolean;
|
|
33
33
|
personas?: Map<string, ResolvedPersona>;
|
|
34
34
|
}): CuaParticipantPlan;
|
|
35
|
-
/** Print the participant plan to stderr
|
|
36
|
-
* digests, and budgets only
|
|
37
|
-
export declare function emitPreflightPlan(participantPlan: CuaParticipantPlan,
|
|
35
|
+
/** Print the participant plan to stderr before any sandbox/provider call (public-safe: ids, devices,
|
|
36
|
+
* digests, and budgets only; no prompt text, no secrets). */
|
|
37
|
+
export declare function emitPreflightPlan(participantPlan: CuaParticipantPlan, studyId: string): void;
|
|
38
38
|
export declare function formatParticipantPlanEntry(entry: CuaParticipantPlanEntry): string;
|
|
39
39
|
/**
|
|
40
40
|
* Compile the committed persona files the participants use, printing a warning for each one that
|
|
@@ -60,7 +60,7 @@ export declare function loadCuaParticipants(args: {
|
|
|
60
60
|
rerunLineage?: RunRerunLineage;
|
|
61
61
|
} | {
|
|
62
62
|
ok: false;
|
|
63
|
-
code:
|
|
63
|
+
code: CuaActorStudyErrorCode;
|
|
64
64
|
message: string;
|
|
65
65
|
}>;
|
|
66
66
|
/** Scrub known secret values from each participant's declarative snapshot before any bundle uses it. */
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
// The participant runs a computer-use
|
|
1
|
+
// The participant runs a computer-use study drives, built before anything is created: the sandbox
|
|
2
2
|
// and session budgets, the concurrency bound, each participant's prompt, bundle ids and artifact
|
|
3
3
|
// paths, and the public plan printed before any sandbox or provider call. loadCuaParticipants
|
|
4
4
|
// compiles the committed personas first and narrows a rerun to its selected participants.
|
|
5
|
-
import {
|
|
5
|
+
import { isLocalBrowserStudy, LOCAL_BROWSER_LIFETIME_MS, } from "../../substrates/local/runtime-config.js";
|
|
6
6
|
import { DEFAULT_STATE_STEP_TIMEOUT_MS } from "../../subject/state.js";
|
|
7
|
-
import { computerUseParticipants, } from "../../
|
|
7
|
+
import { computerUseParticipants, } from "../../study/plan-participants.js";
|
|
8
8
|
import { resolveParticipant } from "../../run/participant.js";
|
|
9
|
-
import {} from "../../
|
|
10
|
-
import { scrubPersonaBrief } from "../../
|
|
9
|
+
import {} from "../../study/types.js";
|
|
10
|
+
import { scrubPersonaBrief } from "../../study/persona.js";
|
|
11
11
|
import { redactText } from "../../evidence/redaction.js";
|
|
12
12
|
import {} from "../../run/bundle.js";
|
|
13
|
-
import { participantAssignment } from "../../
|
|
14
|
-
import { resolveCommittedPersonas } from "../../
|
|
13
|
+
import { participantAssignment } from "../../study/participant-assignment.js";
|
|
14
|
+
import { resolveCommittedPersonas } from "../../study/persona-resolve.js";
|
|
15
15
|
import { CUA_FANOUT_STRATEGY, CUA_MAX_CONCURRENCY_ENV, DEFAULT_APP_URL_SESSION_TIMEOUT_MS, MIN_DERIVED_SESSION_TIMEOUT_MS, } from "./types.js";
|
|
16
16
|
import { MAX_SANDBOX_MS, SANDBOX_TIMEOUT_BUFFER_MS, SUBJECT_PROVISION_BUDGET_MS, } from "../../substrates/e2b/lifetime.js";
|
|
17
|
-
import { readPositiveInt } from "../../
|
|
17
|
+
import { readPositiveInt } from "../../study/parse/values.js";
|
|
18
18
|
import { digestUrl } from "./bundle-parts.js";
|
|
19
19
|
import { composeParticipantInstructions, DEFAULT_MISSION } from "./participant-prompt.js";
|
|
20
20
|
import { resolveCuaRerunSelection } from "./rerun-selection.js";
|
|
21
|
+
import { plural } from "../../run/text.js";
|
|
21
22
|
export function defaultSessionTimeoutMs(config) {
|
|
22
23
|
const provisionedRoute = config.subject.source === "clone" || config.subject.source === "local-tree";
|
|
23
24
|
if (!provisionedRoute)
|
|
@@ -33,7 +34,7 @@ export function defaultSessionTimeoutMs(config) {
|
|
|
33
34
|
* git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
|
|
34
35
|
* costs the same wall-clock room either way. */
|
|
35
36
|
export function resolveParticipantSandboxMs(config) {
|
|
36
|
-
if (
|
|
37
|
+
if (isLocalBrowserStudy(config))
|
|
37
38
|
return LOCAL_BROWSER_LIFETIME_MS;
|
|
38
39
|
const timeoutMs = config.execution?.timeoutMs ?? defaultSessionTimeoutMs(config);
|
|
39
40
|
const provisionedRoute = config.subject.source === "clone" || config.subject.source === "local-tree";
|
|
@@ -46,18 +47,18 @@ export function resolveParticipantSandboxMs(config) {
|
|
|
46
47
|
SANDBOX_TIMEOUT_BUFFER_MS);
|
|
47
48
|
}
|
|
48
49
|
/**
|
|
49
|
-
* The in-flight participant bound a
|
|
50
|
+
* The in-flight participant bound a study declares. Defaults to the participant count: every
|
|
50
51
|
* declared participant runs at once, because a throttle nobody asked for silently turns "N actors
|
|
51
|
-
* live" into waves
|
|
52
|
-
* and simultaneity differ. A declared execution.concurrency is a
|
|
52
|
+
* live" into waves; total session count and spend are the same either way, only wall-clock
|
|
53
|
+
* and simultaneity differ. A declared execution.concurrency is a cap, clamped to [1, participants].
|
|
53
54
|
* The planner records it; the route may only lower it from the environment.
|
|
54
55
|
*/
|
|
55
56
|
export function boundedConcurrency(declared, participantCount) {
|
|
56
57
|
return Math.max(1, declared === undefined ? participantCount : Math.min(Math.max(1, declared), participantCount));
|
|
57
58
|
}
|
|
58
59
|
/**
|
|
59
|
-
* The planned bound, lowered by the env override. The override may only
|
|
60
|
-
* concurrent paid desktops
|
|
60
|
+
* The planned bound, lowered by the env override. The override may only lower it (never raise
|
|
61
|
+
* concurrent paid desktops), and a lowering is reported via envLoweredFrom so the
|
|
61
62
|
* plan never silently disagrees with the manifest.
|
|
62
63
|
*/
|
|
63
64
|
function envLoweredConcurrency(planned, participantCount, env) {
|
|
@@ -81,7 +82,7 @@ function plannedParticipantsOf(config, countOverride) {
|
|
|
81
82
|
desktopCli: config.subject.source === "desktop-cli",
|
|
82
83
|
};
|
|
83
84
|
}
|
|
84
|
-
/** Build the participant runs
|
|
85
|
+
/** Build the participant runs and the public plan from the planned participants (pure). */
|
|
85
86
|
function participantRunsAndPlan(planned, opts = {}) {
|
|
86
87
|
const env = opts.env ?? {};
|
|
87
88
|
// Who each participant is (id, persona, focus, device, limits) comes from the plan; this adds
|
|
@@ -162,20 +163,20 @@ function participantRunsAndPlan(planned, opts = {}) {
|
|
|
162
163
|
return { runs, participantPlan };
|
|
163
164
|
}
|
|
164
165
|
/**
|
|
165
|
-
* Pure pre-flight plan resolver (runs in dry-run
|
|
166
|
+
* Pure pre-flight plan resolver (runs in dry-run and live). Returns the participant table, the
|
|
166
167
|
* effective concurrency, the wave count, the per-participant session budget, and the worst-case total
|
|
167
|
-
* sandbox-minutes
|
|
168
|
+
* sandbox-minutes, before any sandbox or provider call. The same plan appears in dry-run,
|
|
168
169
|
* marked $0 (dryRun: true).
|
|
169
170
|
*/
|
|
170
171
|
export function resolveCuaParticipantPlan(config, opts = {}) {
|
|
171
172
|
const { countOverride, ...rest } = opts;
|
|
172
173
|
return participantRunsAndPlan(plannedParticipantsOf(config, countOverride), rest).participantPlan;
|
|
173
174
|
}
|
|
174
|
-
/** Print the participant plan to stderr
|
|
175
|
-
* digests, and budgets only
|
|
176
|
-
export function emitPreflightPlan(participantPlan,
|
|
175
|
+
/** Print the participant plan to stderr before any sandbox/provider call (public-safe: ids, devices,
|
|
176
|
+
* digests, and budgets only; no prompt text, no secrets). */
|
|
177
|
+
export function emitPreflightPlan(participantPlan, studyId) {
|
|
177
178
|
const lines = [];
|
|
178
|
-
lines.push(`humanish computer-use fan-out plan (${
|
|
179
|
+
lines.push(`humanish computer-use fan-out plan (${studyId}): ${plural(participantPlan.laneCount, "participant")}, strategy ${participantPlan.strategy}, concurrency ${participantPlan.concurrency}${participantPlan.envLoweredConcurrencyFrom === undefined ? "" : ` (lowered from ${participantPlan.envLoweredConcurrencyFrom} by ${CUA_MAX_CONCURRENCY_ENV})`}, ${plural(participantPlan.waves, "wave")}.`);
|
|
179
180
|
lines.push(` session budget ${Math.round(participantPlan.perLaneSessionBudgetMs / 1000)}s per participant; worst-case ~${participantPlan.worstCaseSandboxMinutes} sandbox-minutes total${participantPlan.dryRun ? " (dry-run: $0)" : ""}.`);
|
|
180
181
|
for (const entry of participantPlan.lanes) {
|
|
181
182
|
lines.push(` - ${formatParticipantPlanEntry(entry)}`);
|
|
@@ -212,8 +213,8 @@ export async function compileParticipantPersonas(projectRoot, personaIds) {
|
|
|
212
213
|
export async function loadCuaParticipants(args) {
|
|
213
214
|
const { plan } = args;
|
|
214
215
|
const { participants } = plan.runner;
|
|
215
|
-
// Compile any committed personas
|
|
216
|
-
// prompt carries real behavioral directives rather than a bare `Persona: <id>.` label
|
|
216
|
+
// Compile any committed personas before planning, so the plan builder stays pure and each participant's
|
|
217
|
+
// prompt carries real behavioral directives rather than a bare `Persona: <id>.` label.
|
|
217
218
|
const personas = await compileParticipantPersonas(args.projectRoot, participants.map((participant) => participant.personaId));
|
|
218
219
|
const { runs: participantRuns, participantPlan } = participantRunsAndPlan({
|
|
219
220
|
participants,
|
|
@@ -227,7 +228,7 @@ export async function loadCuaParticipants(args) {
|
|
|
227
228
|
return { ok: true, participantRuns, participantPlan };
|
|
228
229
|
const selected = await resolveCuaRerunSelection({
|
|
229
230
|
cwd: args.cwd,
|
|
230
|
-
|
|
231
|
+
studyId: plan.studyId,
|
|
231
232
|
sandboxMs: plan.sandboxMs,
|
|
232
233
|
sourceRunId: rerun.sourceRunId,
|
|
233
234
|
...(rerun.participantIds === undefined ? {} : { participantIds: [...rerun.participantIds] }),
|
|
@@ -235,7 +236,7 @@ export async function loadCuaParticipants(args) {
|
|
|
235
236
|
participantPlan,
|
|
236
237
|
});
|
|
237
238
|
if (!selected.ok) {
|
|
238
|
-
return { ok: false, code: "
|
|
239
|
+
return { ok: false, code: "HUMANISH_COMPUTER_USE_RERUN_INVALID", message: selected.message };
|
|
239
240
|
}
|
|
240
241
|
return {
|
|
241
242
|
ok: true,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type CuaActorDescriptor } from "../../actors/registry.js";
|
|
2
|
-
import type { ComputerUsePlan, ComputerUseRunner, RoutePlanResult, RouteRefusal } from "../../
|
|
3
|
-
import type {
|
|
4
|
-
import { type
|
|
5
|
-
/** The error a computer-use
|
|
6
|
-
export interface ComputerUseRefusal extends RouteRefusal<"computer-use",
|
|
2
|
+
import type { ComputerUsePlan, ComputerUseRunner, RoutePlanResult, RouteRefusal } from "../../study/plan-types.js";
|
|
3
|
+
import type { StudyConfig, StudySubjectState } from "../../study/types.js";
|
|
4
|
+
import { type CuaActorStudyErrorCode, type RunCuaActorStudyOptions } from "./types.js";
|
|
5
|
+
/** The error a computer-use study returns before a run starts. */
|
|
6
|
+
export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActorStudyErrorCode> {
|
|
7
7
|
/**
|
|
8
8
|
* Where the route returns it. "before-scope": analysis and tasks, returned before the run scope
|
|
9
9
|
* with no automatic-analysis record. "in-scope": after the cwd checks. "after-personas": after
|
|
@@ -15,7 +15,7 @@ export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActo
|
|
|
15
15
|
readonly actor?: string;
|
|
16
16
|
}
|
|
17
17
|
export type ComputerUsePlanResult = RoutePlanResult<ComputerUsePlan, ComputerUseRefusal>;
|
|
18
|
-
/** The registered descriptor for a planned actor id;
|
|
18
|
+
/** The registered descriptor for a planned actor id; planComputerUseStudy checked the registry. */
|
|
19
19
|
export declare function cuaDescriptorOf(actor: string): CuaActorDescriptor;
|
|
20
20
|
/** Which of the caller's driving homes, createProvider and inProcess, a run has. */
|
|
21
21
|
export interface CallerDriving {
|
|
@@ -28,21 +28,21 @@ export declare function callerDrivingOf(options: {
|
|
|
28
28
|
readonly createProvider?: unknown;
|
|
29
29
|
}): CallerDriving;
|
|
30
30
|
/** The state a planned run's provisioned subject declares. Other subjects declare none. */
|
|
31
|
-
export declare function cuaDeclaredState(plan: ComputerUsePlan):
|
|
32
|
-
/** The URL a refused
|
|
33
|
-
export declare function declaredAppUrl(config:
|
|
31
|
+
export declare function cuaDeclaredState(plan: ComputerUsePlan): StudySubjectState | undefined;
|
|
32
|
+
/** The URL a refused study's result names, from its declaration: a provisioned subject's serve URL. */
|
|
33
|
+
export declare function declaredAppUrl(config: StudyConfig): string;
|
|
34
34
|
/** The URL a planned run's participants open: a provisioned subject's served URL, else its own. */
|
|
35
35
|
export declare function plannedAppUrl(subject: ComputerUseRunner["subject"]): string;
|
|
36
36
|
/**
|
|
37
|
-
* Plan a computer-use
|
|
37
|
+
* Plan a computer-use study. It is called for any config handed to the computer-use runner, not only
|
|
38
38
|
* one routeOf sends here, so a config for another route gets this route's refusal.
|
|
39
39
|
*/
|
|
40
|
-
export declare function
|
|
40
|
+
export declare function planComputerUseStudy(config: StudyConfig, input: {
|
|
41
41
|
readonly dryRun: boolean;
|
|
42
42
|
/** Whether deps.runSession is set: a caller's session runner cannot enforce maxOutputTokens. */
|
|
43
43
|
readonly hasRunSession?: boolean;
|
|
44
44
|
/** Which of the caller's driving homes are set; neither when absent. */
|
|
45
45
|
readonly driving?: CallerDriving;
|
|
46
46
|
readonly countOverride?: number;
|
|
47
|
-
readonly rerun?:
|
|
47
|
+
readonly rerun?: RunCuaActorStudyOptions["rerun"];
|
|
48
48
|
}): ComputerUsePlanResult;
|