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,47 +1,49 @@
|
|
|
1
|
-
// The computer-use
|
|
2
|
-
//
|
|
3
|
-
// hosted E2B desktop.
|
|
4
|
-
// descriptor returned by the registry runs the session; the
|
|
1
|
+
// The computer-use route: a subject (an app-url the caller provisioned, or a repo the
|
|
2
|
+
// humanish clones and serves in the sandbox) driven by a registry-resolved computer-use actor inside a
|
|
3
|
+
// hosted E2B desktop. On this path `actors[].type` selects the actor: the
|
|
4
|
+
// descriptor returned by the registry runs the session; the route provisions the desktop and
|
|
5
5
|
// subject, composes the prompt from config, persists the evidence bundle, and tears down.
|
|
6
6
|
//
|
|
7
7
|
// Substrate notes:
|
|
8
8
|
// - The desktop is created via the shared loader in src/substrates/e2b/sdk.ts with
|
|
9
9
|
// kill-on-timeout lifecycle, so a dead host process can never orphan a sandbox past its
|
|
10
10
|
// server-side deadline.
|
|
11
|
-
// - Env placement follows the
|
|
12
|
-
//
|
|
13
|
-
// the
|
|
11
|
+
// - Env placement follows the placement rule (docs/principles/invariants-and-defaults.md): the
|
|
12
|
+
// actor's key never enters the sandbox (the model drives from outside via the provider API);
|
|
13
|
+
// the subject's declared env names are provisioned in on the clone route; values come from
|
|
14
14
|
// the caller's environment and are never logged or persisted.
|
|
15
15
|
// - The live stream URL is runtime-only (carries an auth key) and is never persisted into run
|
|
16
|
-
// artifacts
|
|
16
|
+
// artifacts; only its presence is recorded.
|
|
17
17
|
// - Evidence redaction is mode-aware (docs/principles/invariants-and-defaults.md, the
|
|
18
|
-
// capture-vs-publish rule): screenshots persist
|
|
18
|
+
// capture-vs-publish rule): screenshots persist raw (full fidelity) by default into gitignored
|
|
19
19
|
// .humanish/; `policies.redactScreenshots: true` opts into blur-at-capture for a share-as-is
|
|
20
|
-
// bundle. Length-only typed text and text redaction of reasoning/messages are
|
|
21
|
-
// harness errors are redacted at
|
|
20
|
+
// bundle. Length-only typed text and text redaction of reasoning/messages are unconditional;
|
|
21
|
+
// harness errors are redacted at this boundary; the bundle's `stream.actor` carries the
|
|
22
22
|
// conformant humanish.actor-trace.v1 projection, whose `redaction.screenshots` records the
|
|
23
|
-
// run's actual mode ("raw" | "blurred" | "n/a")
|
|
23
|
+
// run's actual mode ("raw" | "blurred" | "n/a"), and every label downstream derives from it.
|
|
24
24
|
import { withTransientCommsSecrets } from "../../run/transient-comms-secrets.js";
|
|
25
25
|
import path from "node:path";
|
|
26
26
|
import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
|
|
27
27
|
import { runScope } from "../../run/run.js";
|
|
28
28
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
29
|
-
import { browserRouteScorer } from "../../
|
|
30
|
-
import { withLateScorer } from "../../
|
|
31
|
-
import { callerDrivingOf,
|
|
29
|
+
import { browserRouteScorer } from "../../study/adapter-scorer-loader.js";
|
|
30
|
+
import { withLateScorer } from "../../study/route-inputs.js";
|
|
31
|
+
import { callerDrivingOf, planComputerUseStudy } from "./plan.js";
|
|
32
32
|
import { finishCuaRun } from "./result.js";
|
|
33
|
-
import {
|
|
34
|
-
import { admitCuaRun,
|
|
35
|
-
import {
|
|
33
|
+
import { runStudyParticipants } from "./live-phase.js";
|
|
34
|
+
import { admitCuaRun, refuseCuaStudy, startCuaRun } from "./setup.js";
|
|
35
|
+
import {} from "./types.js";
|
|
36
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
36
37
|
/**
|
|
37
|
-
*
|
|
38
|
+
* Plans and runs a computer-use study in one call. It is not exported from src/index.ts; tests call
|
|
39
|
+
* it. It plans the config with planComputerUseStudy and runs
|
|
38
40
|
* the plan with runComputerUsePlan, whose run scope and withTransientCommsSecrets wrapper cover the
|
|
39
41
|
* run and its analysis.
|
|
40
42
|
*/
|
|
41
|
-
export async function
|
|
43
|
+
export async function runCuaActorStudy(options) {
|
|
42
44
|
const { config, dryRun, ...input } = options;
|
|
43
|
-
//
|
|
44
|
-
const planned =
|
|
45
|
+
// planComputerUseStudy makes every configuration refusal, in the order this route always has.
|
|
46
|
+
const planned = planComputerUseStudy(config, {
|
|
45
47
|
dryRun,
|
|
46
48
|
hasRunSession: input.deps?.runSession !== undefined,
|
|
47
49
|
driving: callerDrivingOf(input),
|
|
@@ -50,21 +52,20 @@ export async function runCuaActorLab(options) {
|
|
|
50
52
|
});
|
|
51
53
|
if (planned.ok)
|
|
52
54
|
return runComputerUsePlan(planned.plan, input, config);
|
|
53
|
-
return
|
|
55
|
+
return computerUseStudyRefusal(options, planned.refusal);
|
|
54
56
|
}
|
|
55
57
|
/**
|
|
56
|
-
* A refused computer-use
|
|
58
|
+
* A refused computer-use study's result, at the refusal's stage: a before-scope refusal has its own
|
|
57
59
|
* envelope and no analysis record; the others come after the cwd checks, and the participant cap after
|
|
58
60
|
* the personas are read.
|
|
59
61
|
*/
|
|
60
|
-
export async function
|
|
62
|
+
export async function computerUseStudyRefusal(options, refusal) {
|
|
61
63
|
const { config, dryRun } = options;
|
|
62
64
|
if (refusal.stage === "before-scope")
|
|
63
65
|
return {
|
|
64
|
-
|
|
66
|
+
...studyResultIdentity("computer-use", config.id),
|
|
65
67
|
ok: false,
|
|
66
68
|
cwd: path.resolve(options.cwd),
|
|
67
|
-
labId: config.id,
|
|
68
69
|
actor: config.actors[0]?.type ?? "",
|
|
69
70
|
dryRun,
|
|
70
71
|
runId: options.runId ?? "not-created",
|
|
@@ -75,10 +76,10 @@ export async function computerUseLabRefusal(options, refusal) {
|
|
|
75
76
|
};
|
|
76
77
|
// The other refusals come after the cwd checks, and the participant cap after the personas are read.
|
|
77
78
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
78
|
-
return completeAutomaticAnalysis(await
|
|
79
|
+
return completeAutomaticAnalysis(await refuseCuaStudy(options, refusal), undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
|
|
79
80
|
}
|
|
80
81
|
/**
|
|
81
|
-
*
|
|
82
|
+
* runStudyWith's step for a computer-use plan. It runs the plan's local checks (admitCuaRun: the
|
|
82
83
|
* participants, the preflight plan, the keys, the local agent, subject env and caps, and the
|
|
83
84
|
* local-tree archive) before any run scope opens, so the CLI can present their refusal before it
|
|
84
85
|
* loads a declared scorer, and returns the run that continues from them with that scorer.
|
|
@@ -140,7 +141,7 @@ async function runPlanInScope(plan, input, admitted, scope) {
|
|
|
140
141
|
const prepared = await startCuaRun(plan, input, admitted, scope);
|
|
141
142
|
if (!prepared.ok)
|
|
142
143
|
return prepared.result;
|
|
143
|
-
const ran = await
|
|
144
|
+
const ran = await runStudyParticipants(prepared.setup, prepared.participants);
|
|
144
145
|
if (!ran.ok)
|
|
145
146
|
return ran.result;
|
|
146
147
|
return finishCuaRun(prepared.setup, prepared.finish, ran);
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import type { CuaLoopResult } from "../../actors/computer-use/loop.js";
|
|
2
2
|
import { type SessionEnding } from "../../run/judge.js";
|
|
3
3
|
/**
|
|
4
|
-
* A goal_satisfied participant counts as a self-reported blocker
|
|
5
|
-
* the goal
|
|
6
|
-
* structured completion evidence, so it overrides a text scan of the free-form narrative
|
|
7
|
-
* otherwise trip on the subject app's
|
|
8
|
-
* Resolved-arc segments never block the verdict
|
|
4
|
+
* A goal_satisfied participant counts as a self-reported blocker only when its final narrative contradicts
|
|
5
|
+
* the goal and the run's own stop predicate did not fire. A matched stopWhen is independent,
|
|
6
|
+
* structured completion evidence, so it overrides a text scan of the free-form narrative, which can
|
|
7
|
+
* otherwise trip on the subject app's own quoted copy (e.g. a relayed "cannot be undone" banner).
|
|
8
|
+
* Resolved-arc segments never block the verdict. Returns the offending reason, or undefined
|
|
9
9
|
* when the participant is a clean pass. Exported for testing.
|
|
10
10
|
*/
|
|
11
11
|
export declare function resolveSelfReportedBlocker(session: CuaLoopResult | undefined): string | undefined;
|
|
12
12
|
/** A session's ending, reduced to what the judge's engagement and blocker rules read. */
|
|
13
13
|
export declare function sessionEnding(session: CuaLoopResult): SessionEnding;
|
|
14
14
|
/**
|
|
15
|
-
* Friction is independent of how a completed session ended
|
|
15
|
+
* Friction is independent of how a completed session ended. Read the participant's
|
|
16
16
|
* redacted messages, including earlier reports, rather than the harness-owned reason that
|
|
17
17
|
* stopWhen/dwell writes. Reasoning, observations, and notices are not participant reports.
|
|
18
|
-
* Resolved arcs still count
|
|
18
|
+
* Resolved arcs still count; quoted copy and negated reports still do not. This read
|
|
19
19
|
* never changes the verdict. Exported for testing.
|
|
20
20
|
*/
|
|
21
21
|
export declare function resolveSelfReportedFriction(session: CuaLoopResult | undefined): string | undefined;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { selfReportedBlocker } from "../../run/judge.js";
|
|
2
|
-
// "can't" followed by a
|
|
2
|
+
// "can't" followed by a perception verb describes what the screen showed, not an inability to
|
|
3
3
|
// proceed: "the canvas truncates it so you can't even read the whole thing", "I can't tell from
|
|
4
4
|
// the screen whether the rename is persisted", "so I could not read its full description". Five
|
|
5
5
|
// of five completed live runs on 2026-09-01 (two on drawDB, three on the planted benchmark app)
|
|
6
6
|
// were refused as "not a credible pass" on exactly these sentences, every one a defect report
|
|
7
|
-
// written
|
|
8
|
-
// display defect, the more likely the scan was to refuse the run
|
|
9
|
-
//
|
|
7
|
+
// written after the participant reached the goal. The more precisely a participant describes a
|
|
8
|
+
// display defect, the more likely the scan was to refuse the run: the incentive inversion the
|
|
9
|
+
// resolved-arc rule fixed, back in a new shape. "could not complete", "could not connect",
|
|
10
10
|
// "unable to get focus" still count: those name an inability to act.
|
|
11
11
|
const PERCEPTION_AFTER_MODAL = /\b(can'?t|cannot|could ?not|couldn'?t|unable to|wasn'?t able to)\s+(even\s+|quite\s+|really\s+|fully\s+)?(read|see|tell|view|make out|verify|confirm|be sure|be certain|judge|know)\b/g;
|
|
12
12
|
function hasBlockerLanguage(text) {
|
|
@@ -15,17 +15,17 @@ function hasBlockerLanguage(text) {
|
|
|
15
15
|
/\berror[:.]/.test(text) ||
|
|
16
16
|
/what would you like me to do|please tell me|need (the )?(task|credentials|instructions)/.test(text));
|
|
17
17
|
}
|
|
18
|
-
/** The friction scan (inclusive): does the narrative report
|
|
18
|
+
/** The friction scan (inclusive): does the narrative report any blocker-shaped language,
|
|
19
19
|
* resolved or not? Feeds the participants `reportedFriction` tally and feedback candidates. */
|
|
20
|
-
// Report-shaped language: what a participant writes when it finished
|
|
20
|
+
// Report-shaped language: what a participant writes when it finished and has something to say.
|
|
21
21
|
// Every one of the day's eleven drawDB reports (2026-09-01) opened a section "What confused me"
|
|
22
22
|
// or "Accessibility defects:"; none contained a blocker word, so none became a feedback candidate
|
|
23
23
|
// and a participant that had just replicated a keyboard-accessibility defect three times drafted "Live
|
|
24
|
-
// study completed without a participant-reported finding". Friction is the
|
|
24
|
+
// study completed without a participant-reported finding". Friction is the inclusive scan; a
|
|
25
25
|
// false positive here adds a candidate a person then reads, which is the cheap direction.
|
|
26
26
|
const REPORTED_DEFECT_LANGUAGE = /\b(defects?|bugs?|accessibilit(y|ies)|inaccessible|not (keyboard|screen.?reader)[- ]?accessible|confus(ed|ing)|hesitat(ed|ion)|unexpected(ly)?|unclear|hard to (find|tell|see|read|reach)|no (visible )?focus|overlap(ped|ping|s)?|truncat(ed|es|ion)|cut off|did nothing|nothing happened|no effect)\b/;
|
|
27
|
-
// The friction scan's own negations
|
|
28
|
-
// are what a participant writes when it has
|
|
27
|
+
// The friction scan's own negations. "Nothing was confusing", "no defects", "not unclear"
|
|
28
|
+
// are what a participant writes when it has nothing to report, and until 2026-09-03 each of them
|
|
29
29
|
// counted as reported friction and became a feedback candidate whose "actual" was a sentence
|
|
30
30
|
// reporting no problem. Only the report-shaped adjectives are negatable here: "no visible focus",
|
|
31
31
|
// "not keyboard-accessible" and "did nothing" are defects and stay.
|
|
@@ -80,25 +80,25 @@ function interimMessageReportsFriction(message) {
|
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
/** The verdict scan (strict): like the friction scan, but resolved-arc segments are stripped
|
|
83
|
-
* first
|
|
84
|
-
*
|
|
83
|
+
* first: failure narration the participant itself reports as overcome counts as friction and
|
|
84
|
+
* never as a blocker. */
|
|
85
85
|
function completionReasonBlocksVerdict(reason) {
|
|
86
|
-
// Perception phrases are stripped for the
|
|
86
|
+
// Perception phrases are stripped for the verdict only: "I could not read the full description"
|
|
87
87
|
// is friction worth a tally count and a feedback candidate (the friction scan above keeps it),
|
|
88
88
|
// and it is not a reason to refuse the pass.
|
|
89
89
|
return hasBlockerLanguage(stripResolvedArcSegments(stripQuotedSpans(stripNegatedNonBlockerPhrases(reason.toLowerCase()))).replace(PERCEPTION_AFTER_MODAL, ""));
|
|
90
90
|
}
|
|
91
91
|
// A failure segment counts as a resolved arc when the recovery is self-reported either in the
|
|
92
|
-
//
|
|
93
|
-
// immediately
|
|
92
|
+
// same segment ("the import failed but then went through") or, in the common report shape, in the
|
|
93
|
+
// immediately following segment as a retry/alternative that succeeded ("my first import failed
|
|
94
94
|
// with a parser error. A simpler SQL import succeeded."). The lookahead demands the retry flavor
|
|
95
95
|
// on purpose: unrelated praise ("Separately, the search box worked") must never launder an
|
|
96
96
|
// unresolved failure. "Login failed so I gave up" has no recovery anywhere and stays a blocker.
|
|
97
|
-
// (
|
|
97
|
+
// (Without this, a defect report after demonstrated success failed the participant:
|
|
98
98
|
// an incentive inversion against exactly the participant behavior a study wants most.)
|
|
99
99
|
const RESOLUTION_TERMS = /\b(succeed(?:ed|s)?|success(?:ful|fully)?|worked|works around|then worked|now works?|resolved|fixed|recovered|got it working|went through)\b/;
|
|
100
100
|
const RETRY_RESOLUTION = /\b(simpler|simplified|retry(?:ing)?|retried|second (?:attempt|try)|another (?:attempt|try|approach)|different (?:approach|way|route)|instead|then|eventually|after that)\b[^.!?\n]{0,80}\b(succeed(?:ed|s)?|success(?:ful|fully)?|worked|went through|completed|passed)\b/;
|
|
101
|
-
/** Drop sentence/bullet segments whose failure language is part of a self-reported
|
|
101
|
+
/** Drop sentence/bullet segments whose failure language is part of a self-reported resolved arc. */
|
|
102
102
|
function stripResolvedArcSegments(text) {
|
|
103
103
|
const segments = text.split(/(?<=[.!?])\s+|\n+/);
|
|
104
104
|
return segments
|
|
@@ -112,20 +112,20 @@ function stripResolvedArcSegments(text) {
|
|
|
112
112
|
})
|
|
113
113
|
.join(" ");
|
|
114
114
|
}
|
|
115
|
-
// Negations that
|
|
115
|
+
// Negations that describe a defect rather than deny one. Kept out of every clause drop below.
|
|
116
116
|
const DEFECT_SHAPED_NEGATION = /\bno\s+(?:visible\s+)?focus\b|\bno\s+(?:keyboard|screen.?reader)[- ]?(?:access|path|route|way|alternative|equivalent)|\bnot\s+(?:keyboard|screen.?reader)[- ]?accessible\b|\bno\s+(?:effect|feedback|response)\b|\b(?:did|does)\s+nothing\b|\bnothing\s+happened\b/;
|
|
117
117
|
function stripNegatedNonBlockerPhrases(text) {
|
|
118
118
|
return (text
|
|
119
|
-
//
|
|
119
|
+
// First, before the narrower rules eat the "no blockers" and leave "encountered ... error"
|
|
120
120
|
// behind: "I encountered no blockers or unclear error output." refused a clean passing run on
|
|
121
121
|
// 2026-09-01. A verb of encounter followed by "no" negates the whole clause, so drop the clause.
|
|
122
|
-
// ... unless the clause names a
|
|
123
|
-
// finding, and the verb it happens to use must not decide whether it counts
|
|
122
|
+
// ... unless the clause names a defect: "the delete control had no visible focus" is a
|
|
123
|
+
// finding, and the verb it happens to use must not decide whether it counts.
|
|
124
124
|
.replace(/\b(?:encountered|hit|saw|found|met|had|got|ran into)\s+no\s+[^.!?\n]*/g, (clause) => (DEFECT_SHAPED_NEGATION.test(clause) ? clause : " "))
|
|
125
125
|
.replace(/\bno\s+(?:real\s+|remaining\s+|actual\s+)?(?:blocker|blockers|blocking issue|blocking issues|error|errors|failure|failures)\s+(?:was\s+|were\s+)?(?:encountered|observed|found|hit|seen|reported|detected)\b/g, "")
|
|
126
126
|
.replace(/\bwithout\s+(?:a\s+|any\s+)?(?:real\s+|remaining\s+|actual\s+)?(?:blocker|blockers|blocking issue|blocking issues|error|errors|failure|failures)\b/g, "")
|
|
127
127
|
.replace(/\bnot\s+(?:blocked|a blocker|an error|failed)\b/g, "")
|
|
128
|
-
// "No functional failures blocked me" downgraded a clean passing run to a
|
|
128
|
+
// "No functional failures blocked me" downgraded a clean passing run to a run failure on
|
|
129
129
|
// 2026-09-01. The adjective list above is closed (real|remaining|actual), so an ordinary
|
|
130
130
|
// qualifier like "functional" slipped through and the trailing verb "blocked" tripped the
|
|
131
131
|
// scan. Allow up to two intervening words, and cover the verb form directly.
|
|
@@ -134,9 +134,9 @@ function stripNegatedNonBlockerPhrases(text) {
|
|
|
134
134
|
}
|
|
135
135
|
/**
|
|
136
136
|
* Remove double-quoted spans and markdown blockquote lines before the blocker scan, so a persona
|
|
137
|
-
* that faithfully
|
|
138
|
-
* not misread as the actor reporting its
|
|
139
|
-
* `>` blockquotes are stripped
|
|
137
|
+
* that faithfully quotes the subject app's own copy (e.g. a banner reading "cannot be undone") is
|
|
138
|
+
* not misread as the actor reporting its own blocker. Only double quotes (straight and smart) and
|
|
139
|
+
* `>` blockquotes are stripped, never single quotes, which would mangle contractions like `can't`.
|
|
140
140
|
*/
|
|
141
141
|
function stripQuotedSpans(text) {
|
|
142
142
|
return text
|
|
@@ -148,15 +148,15 @@ function traceHasStopWhenMatch(session) {
|
|
|
148
148
|
return session.trace.items.some((item) => item.kind === "notice" &&
|
|
149
149
|
item.status === "matched" &&
|
|
150
150
|
// A dwell window that ended the session (then: stop) is the same class of harness-owned,
|
|
151
|
-
// structured completion as a matched stopWhen
|
|
151
|
+
// structured completion as a matched stopWhen.
|
|
152
152
|
(item.title.startsWith("stopWhen matched") || item.title === "dwell window complete"));
|
|
153
153
|
}
|
|
154
154
|
/**
|
|
155
|
-
* A goal_satisfied participant counts as a self-reported blocker
|
|
156
|
-
* the goal
|
|
157
|
-
* structured completion evidence, so it overrides a text scan of the free-form narrative
|
|
158
|
-
* otherwise trip on the subject app's
|
|
159
|
-
* Resolved-arc segments never block the verdict
|
|
155
|
+
* A goal_satisfied participant counts as a self-reported blocker only when its final narrative contradicts
|
|
156
|
+
* the goal and the run's own stop predicate did not fire. A matched stopWhen is independent,
|
|
157
|
+
* structured completion evidence, so it overrides a text scan of the free-form narrative, which can
|
|
158
|
+
* otherwise trip on the subject app's own quoted copy (e.g. a relayed "cannot be undone" banner).
|
|
159
|
+
* Resolved-arc segments never block the verdict. Returns the offending reason, or undefined
|
|
160
160
|
* when the participant is a clean pass. Exported for testing.
|
|
161
161
|
*/
|
|
162
162
|
export function resolveSelfReportedBlocker(session) {
|
|
@@ -187,10 +187,10 @@ export function sessionEnding(session) {
|
|
|
187
187
|
};
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
|
-
* Friction is independent of how a completed session ended
|
|
190
|
+
* Friction is independent of how a completed session ended. Read the participant's
|
|
191
191
|
* redacted messages, including earlier reports, rather than the harness-owned reason that
|
|
192
192
|
* stopWhen/dwell writes. Reasoning, observations, and notices are not participant reports.
|
|
193
|
-
* Resolved arcs still count
|
|
193
|
+
* Resolved arcs still count; quoted copy and negated reports still do not. This read
|
|
194
194
|
* never changes the verdict. Exported for testing.
|
|
195
195
|
*/
|
|
196
196
|
export function resolveSelfReportedFriction(session) {
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import { type RunScope } from "../../run/run.js";
|
|
2
2
|
import type { CuaActorDescriptor } from "../../actors/registry.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { StudyCommsEmail, StudyCommsExternal, StudyConfig } from "../../study/types.js";
|
|
4
4
|
import { type RunRerunLineage } from "../../run/bundle.js";
|
|
5
5
|
import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
6
6
|
import { type ComputerUseRefusal } from "./plan.js";
|
|
7
|
-
import type { ComputerUsePlan } from "../../
|
|
7
|
+
import type { ComputerUsePlan } from "../../study/plan-types.js";
|
|
8
8
|
import { trackRuntimeStreams, type LiveTraceFlush } from "./live-flush.js";
|
|
9
9
|
import { type CuaRunBundleBase } from "./bundle.js";
|
|
10
10
|
import { projectParticipantSubjects } from "./subject-projection.js";
|
|
11
|
-
import { type
|
|
11
|
+
import { type CuaActorStudyErrorCode, type CuaActorStudyResult, type CuaParticipantDeps, type CuaParticipantPlan, type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ComputerUseRunInput, type RunCuaActorStudyOptions } from "./types.js";
|
|
12
12
|
/**
|
|
13
13
|
* The envelope of a refusal the plan left for after the cwd checks. The participant cap and
|
|
14
14
|
* in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
|
|
15
15
|
*/
|
|
16
|
-
export declare function
|
|
16
|
+
export declare function refuseCuaStudy(options: RunCuaActorStudyOptions, refusal: ComputerUseRefusal): Promise<CuaActorStudyResult>;
|
|
17
17
|
export type AdmittedCuaRun = Extract<Awaited<ReturnType<typeof admitCuaRun>>, {
|
|
18
18
|
ok: true;
|
|
19
19
|
}>["admitted"];
|
|
20
20
|
type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
|
|
21
21
|
ok: true;
|
|
22
22
|
}>["run"];
|
|
23
|
-
/** What
|
|
23
|
+
/** What runStudyParticipants and finishCuaRun both read. */
|
|
24
24
|
export interface CuaRunSetup {
|
|
25
25
|
plan: ComputerUsePlan;
|
|
26
26
|
input: ComputerUseRunInput;
|
|
@@ -34,22 +34,22 @@ export interface CuaRunSetup {
|
|
|
34
34
|
scrubKnownValues: (text: string) => string;
|
|
35
35
|
bundleBase: CuaRunBundleBase;
|
|
36
36
|
}
|
|
37
|
-
/** What only
|
|
37
|
+
/** What only runStudyParticipants reads. */
|
|
38
38
|
export interface CuaParticipantsSetup {
|
|
39
39
|
env: Record<string, string | undefined>;
|
|
40
40
|
/** The array scrubKnownValues reads at each call. Email receiving appends the values it
|
|
41
41
|
* provisions before the participants run. */
|
|
42
42
|
knownSecretValues: string[];
|
|
43
43
|
deps: Omit<CuaParticipantDeps, "signalProvisioned">;
|
|
44
|
-
/** Filled by
|
|
44
|
+
/** Filled by runStudyParticipants on a live run; deps.onTrace reads it. */
|
|
45
45
|
liveTrace: {
|
|
46
46
|
flush?: LiveTraceFlush["flush"];
|
|
47
47
|
stop?: LiveTraceFlush["stop"];
|
|
48
48
|
};
|
|
49
49
|
/** The operator-hosted inbox on the app-url route, when declared. */
|
|
50
50
|
externalComms: {
|
|
51
|
-
config:
|
|
52
|
-
email:
|
|
51
|
+
config: StudyCommsExternal;
|
|
52
|
+
email: StudyCommsEmail;
|
|
53
53
|
} | undefined;
|
|
54
54
|
/** The subjects of the in-progress bundle, written before any participant starts. */
|
|
55
55
|
inProgress: {
|
|
@@ -58,7 +58,7 @@ export interface CuaParticipantsSetup {
|
|
|
58
58
|
provenance: CuaSubjectProvenanceArg | undefined;
|
|
59
59
|
};
|
|
60
60
|
/** The refusal envelope, for a run that stops before its bundle. */
|
|
61
|
-
fail: (code:
|
|
61
|
+
fail: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string) => CuaActorStudyResult;
|
|
62
62
|
}
|
|
63
63
|
/** What only finishCuaRun reads besides the participants' outcomes. */
|
|
64
64
|
export interface CuaFinishFacts {
|
|
@@ -68,7 +68,7 @@ export interface CuaFinishFacts {
|
|
|
68
68
|
}
|
|
69
69
|
type PreparedCuaRun = {
|
|
70
70
|
ok: false;
|
|
71
|
-
result:
|
|
71
|
+
result: CuaActorStudyResult;
|
|
72
72
|
} | {
|
|
73
73
|
ok: true;
|
|
74
74
|
setup: CuaRunSetup;
|
|
@@ -78,21 +78,21 @@ type PreparedCuaRun = {
|
|
|
78
78
|
/**
|
|
79
79
|
* Everything before the run starts: the physical project, the route, the participant plan and
|
|
80
80
|
* preflight, the key and subject-env scrubber, the live checks that need no sandbox, and the
|
|
81
|
-
* local-tree archive. These read files, env and the network, which
|
|
81
|
+
* local-tree archive. These read files, env and the network, which planStudy does not. Returns the
|
|
82
82
|
* refusal, or what startCuaRun reads.
|
|
83
83
|
*/
|
|
84
|
-
export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRunInput, config:
|
|
84
|
+
export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRunInput, config: StudyConfig): Promise<{
|
|
85
85
|
ok: false;
|
|
86
|
-
result:
|
|
86
|
+
result: CuaActorStudyResult;
|
|
87
87
|
} | {
|
|
88
88
|
ok: true;
|
|
89
89
|
admitted: {
|
|
90
|
-
config:
|
|
90
|
+
config: StudyConfig;
|
|
91
91
|
dryRun: boolean;
|
|
92
92
|
cwd: string;
|
|
93
|
-
seams: import("../../
|
|
93
|
+
seams: import("../../study/study-deps.js").StudyDeps;
|
|
94
94
|
streams: {
|
|
95
|
-
onStream: NonNullable<import("../../
|
|
95
|
+
onStream: NonNullable<import("../../study/run-study-homes.js").RunStudyHomes["onStream"]>;
|
|
96
96
|
showIn: (observer: import("../../index.js").ObserverResult & {
|
|
97
97
|
ok: true;
|
|
98
98
|
}) => void;
|
|
@@ -100,15 +100,15 @@ export declare function admitCuaRun(plan: ComputerUsePlan, input: ComputerUseRun
|
|
|
100
100
|
};
|
|
101
101
|
env: Record<string, string | undefined>;
|
|
102
102
|
appUrl: string;
|
|
103
|
-
fail: (code:
|
|
104
|
-
refuse: (code:
|
|
103
|
+
fail: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string) => CuaActorStudyResult;
|
|
104
|
+
refuse: (code: CuaActorStudyErrorCode, message: string, actorLabel?: string | undefined) => {
|
|
105
105
|
ok: false;
|
|
106
|
-
result:
|
|
106
|
+
result: CuaActorStudyResult;
|
|
107
107
|
};
|
|
108
108
|
descriptor: CuaActorDescriptor;
|
|
109
|
-
runSession: (options: import("../../actors/computer-use/actor.js").CuaActorSessionOptions) => Promise<import("../../index.js").
|
|
110
|
-
externalCommsConfig:
|
|
111
|
-
externalCommsEmail:
|
|
109
|
+
runSession: (options: import("../../actors/computer-use/actor.js").CuaActorSessionOptions) => Promise<import("../../index.js").ComputerUseLoopResult>;
|
|
110
|
+
externalCommsConfig: StudyCommsExternal | undefined;
|
|
111
|
+
externalCommsEmail: StudyCommsEmail | undefined;
|
|
112
112
|
participantRuns: DesktopParticipantRun[];
|
|
113
113
|
participantPlan: CuaParticipantPlan;
|
|
114
114
|
rerunLineage: RunRerunLineage | undefined;
|
|
@@ -17,13 +17,14 @@ import { e2bRequestTimeoutMs } from "../../substrates/e2b/lifetime.js";
|
|
|
17
17
|
import { liveCuaRejection } from "./preflight.js";
|
|
18
18
|
import { cuaDescriptorOf, declaredAppUrl, plannedAppUrl } from "./plan.js";
|
|
19
19
|
import { trackRuntimeStreams } from "./live-flush.js";
|
|
20
|
-
import {
|
|
20
|
+
import { phaseEvent, planEvent } from "../../study/run-study-events.js";
|
|
21
21
|
import { defaultSubjectPhaseSink } from "../../subject/steps.js";
|
|
22
22
|
import {} from "./bundle.js";
|
|
23
23
|
import { packRunLocalTree } from "./local-tree-pack.js";
|
|
24
24
|
import { projectParticipantSubjects, subjectProvenanceArg } from "./subject-projection.js";
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
25
|
+
import { participantSubjectEnv, } from "./types.js";
|
|
26
|
+
import { studyPersonaIds } from "../../study/persona-resolve.js";
|
|
27
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
27
28
|
/** The physical project, bound before any caller hook runs. */
|
|
28
29
|
async function bindProject(cwd) {
|
|
29
30
|
// Capture the physical project before reading or invoking any caller hook. A supported
|
|
@@ -36,17 +37,16 @@ async function bindProject(cwd) {
|
|
|
36
37
|
* The envelope of a refusal the plan left for after the cwd checks. The participant cap and
|
|
37
38
|
* in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
|
|
38
39
|
*/
|
|
39
|
-
export async function
|
|
40
|
+
export async function refuseCuaStudy(options, refusal) {
|
|
40
41
|
const { config, dryRun } = options;
|
|
41
42
|
const projectRoot = await bindProject(options.cwd);
|
|
42
43
|
// The committed personas are read before the refusal returns, so a persona-file error wins.
|
|
43
44
|
if (refusal.stage === "after-personas")
|
|
44
|
-
await compileParticipantPersonas(projectRoot,
|
|
45
|
+
await compileParticipantPersonas(projectRoot, studyPersonaIds(config));
|
|
45
46
|
return {
|
|
46
|
-
|
|
47
|
+
...studyResultIdentity("computer-use", config.id),
|
|
47
48
|
ok: false,
|
|
48
49
|
cwd: projectRoot.physicalPath,
|
|
49
|
-
labId: config.id,
|
|
50
50
|
actor: refusal.actor ?? config.actors[0]?.type ?? "",
|
|
51
51
|
appUrl: declaredAppUrl(config),
|
|
52
52
|
dryRun,
|
|
@@ -59,7 +59,7 @@ export async function refuseCuaLab(options, refusal) {
|
|
|
59
59
|
/**
|
|
60
60
|
* Everything before the run starts: the physical project, the route, the participant plan and
|
|
61
61
|
* preflight, the key and subject-env scrubber, the live checks that need no sandbox, and the
|
|
62
|
-
* local-tree archive. These read files, env and the network, which
|
|
62
|
+
* local-tree archive. These read files, env and the network, which planStudy does not. Returns the
|
|
63
63
|
* refusal, or what startCuaRun reads.
|
|
64
64
|
*/
|
|
65
65
|
export async function admitCuaRun(plan, input, config) {
|
|
@@ -74,10 +74,9 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
74
74
|
const appUrl = plannedAppUrl(subject);
|
|
75
75
|
const subjectEnvNames = [...participantSubjectEnv(subject)];
|
|
76
76
|
const fail = (code, message, actorLabel) => ({
|
|
77
|
-
|
|
77
|
+
...studyResultIdentity("computer-use", plan.studyId),
|
|
78
78
|
ok: false,
|
|
79
79
|
cwd,
|
|
80
|
-
labId: plan.labId,
|
|
81
80
|
actor: actorLabel ?? plan.actor,
|
|
82
81
|
appUrl,
|
|
83
82
|
dryRun,
|
|
@@ -90,13 +89,13 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
90
89
|
ok: false,
|
|
91
90
|
result: fail(...args),
|
|
92
91
|
});
|
|
93
|
-
//
|
|
94
|
-
// an in-process executor on the same
|
|
92
|
+
// runStudyWith's local VM study supplies a local-target app-url study's desktop; a direct route call or
|
|
93
|
+
// an in-process executor on the same study has none. It reads the declared source, as the planner
|
|
95
94
|
// did: a library config the parser never saw can plan to an app-url subject from another source.
|
|
96
95
|
if (config.subject.source === "app-url" &&
|
|
97
96
|
config.execution?.target === "local" &&
|
|
98
97
|
input.localVm === undefined)
|
|
99
|
-
return refuse("
|
|
98
|
+
return refuse("HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING", "An app-url study with execution.target: local needs a local desktop. runStudy starts one; a direct route call or an in-process executor does not.");
|
|
100
99
|
const descriptor = cuaDescriptorOf(plan.actor);
|
|
101
100
|
const baseRunSession = seams.runSession ?? descriptor.runSession;
|
|
102
101
|
// A local VM study's sessions abort on its signal.
|
|
@@ -104,11 +103,11 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
104
103
|
const runSession = localVmSignal === undefined
|
|
105
104
|
? baseRunSession
|
|
106
105
|
: (options) => baseRunSession({ ...options, signal: localVmSignal });
|
|
107
|
-
// Adopter-hosted comms plane on the app-url route
|
|
108
|
-
// so it cannot host a catch
|
|
106
|
+
// Adopter-hosted comms plane on the app-url route: humanish provisions no subject here,
|
|
107
|
+
// so it cannot host a catch. The operator runs one, and humanish still does every other part
|
|
109
108
|
// of the funnel: tells each persona its address and inbox URL, drains the catch over HTTP after
|
|
110
109
|
// the participants, and writes the same digest-only evidence. Declaring `external` previously did
|
|
111
|
-
// nothing on this route (
|
|
110
|
+
// nothing on this route (or on any other) while its docs said otherwise.
|
|
112
111
|
const comms = plan.residual.comms;
|
|
113
112
|
const externalCommsConfig = subject.kind !== "clone" && subject.kind !== "local-tree" && !inProcess
|
|
114
113
|
? comms?.email?.external
|
|
@@ -120,11 +119,11 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
120
119
|
}
|
|
121
120
|
const { participantRuns, participantPlan, rerunLineage } = participants;
|
|
122
121
|
const participantCount = participantRuns.length;
|
|
123
|
-
// Pre-flight plan:
|
|
122
|
+
// Pre-flight plan: before any sandbox or provider call (dry-run and live). onEvent gets it for
|
|
124
123
|
// every N; the stderr table prints for fan-out (N>1) so single-participant runs stay as quiet as they
|
|
125
124
|
// always were.
|
|
126
125
|
if (participantCount > 1) {
|
|
127
|
-
emitPreflightPlan(participantPlan, plan.
|
|
126
|
+
emitPreflightPlan(participantPlan, plan.studyId);
|
|
128
127
|
}
|
|
129
128
|
input.emit?.(planEvent(participantPlan));
|
|
130
129
|
await assertPreparedSelectedOutputDirectory(projectRoot);
|
|
@@ -141,7 +140,7 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
141
140
|
sanitizeParticipantRuns(participantRuns, scrubKnownValues);
|
|
142
141
|
const redactRepoLabel = plan.residual.policies?.redactRepos ?? subjectEnvNames.includes("GITHUB_TOKEN");
|
|
143
142
|
const publicRepo = subject.kind === "clone" ? (redactRepoLabel ? "repo-01" : subject.repo) : undefined;
|
|
144
|
-
// Key-gating is route-aware: the in-process route uses the caller's
|
|
143
|
+
// Key-gating is route-aware: the in-process route uses the caller's own model + executor, and
|
|
145
144
|
// the local-agent route uses a CLI the operator has already signed in to.
|
|
146
145
|
if (!dryRun && !inProcess) {
|
|
147
146
|
const rejection = await liveCuaRejection({
|
|
@@ -154,8 +153,8 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
154
153
|
if (rejection)
|
|
155
154
|
return refuse(rejection.code, rejection.message, descriptor.id);
|
|
156
155
|
}
|
|
157
|
-
// Pack the working tree
|
|
158
|
-
// fan-out participant below uploads this
|
|
156
|
+
// Pack the working tree once per run, on the host, before any sandbox or provider call: every
|
|
157
|
+
// fan-out participant below uploads this same archive, so one archiveSha256 describes every
|
|
159
158
|
// participant's digest. Dry-run packs nothing (no fs side effects; the contract bundle carries no
|
|
160
159
|
// archiveSha256). A packing failure fails the run closed here, before any sandbox is
|
|
161
160
|
// created and before the run directory exists.
|
|
@@ -168,7 +167,7 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
168
167
|
localTreeArchiveBuffer = packed.buffer;
|
|
169
168
|
}
|
|
170
169
|
catch (error) {
|
|
171
|
-
return refuse("
|
|
170
|
+
return refuse("HUMANISH_COMPUTER_USE_SUBJECT_INVALID", `local-tree packing failed: ${redactText(scrubKnownValues(toErrorMessage(error)))}`, descriptor.id);
|
|
172
171
|
}
|
|
173
172
|
}
|
|
174
173
|
return {
|
|
@@ -206,14 +205,14 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
206
205
|
const { dryRun, cwd, seams, descriptor, participantRuns, participantPlan, publicRepo } = admitted;
|
|
207
206
|
const { appUrl } = admitted;
|
|
208
207
|
// The run's status record exists from here on, so anything watching the runs directory can
|
|
209
|
-
// tell which
|
|
208
|
+
// tell which study this is and that it is alive. The fail-closed returns below leave it finished
|
|
210
209
|
// with no outcome when the scope closes; a crash leaves it stale, which reads as interrupted.
|
|
211
210
|
const started = await scope.startRun({
|
|
212
211
|
cwd,
|
|
213
212
|
runId: input.runId,
|
|
214
213
|
mintRunId: makeCuaRunId,
|
|
215
214
|
mode: dryRun ? "dry-run" : "live",
|
|
216
|
-
|
|
215
|
+
study: plan.study,
|
|
217
216
|
renderReview: renderCuaReviewMarkdown,
|
|
218
217
|
observer: { open: input.open === true, render: seams.renderObserver },
|
|
219
218
|
});
|
|
@@ -229,7 +228,7 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
229
228
|
humanishSource: "present",
|
|
230
229
|
packageName: "humanish",
|
|
231
230
|
});
|
|
232
|
-
// Live-trace flush seam
|
|
231
|
+
// Live-trace flush seam: runStudyParticipants fills it when a live run has an in-progress bundle
|
|
233
232
|
// to grow; participants call it through deps.onTrace. It exists before deps so deps can reference it as
|
|
234
233
|
// a stable indirection.
|
|
235
234
|
const liveTrace = {};
|
|
@@ -316,7 +315,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
|
|
|
316
315
|
onTrace: (participantId, items, usage, metadata) => liveTrace.flush?.(participantId, items, usage, metadata),
|
|
317
316
|
...callerDriving(input, config),
|
|
318
317
|
residual: plan.residual,
|
|
319
|
-
|
|
318
|
+
studyId: plan.studyId,
|
|
320
319
|
caps: plan.caps,
|
|
321
320
|
appUrl,
|
|
322
321
|
brain: plan.runner.brain,
|
|
@@ -330,11 +329,11 @@ function cuaParticipantDeps(plan, input, admitted, run) {
|
|
|
330
329
|
timeoutMs,
|
|
331
330
|
participantCount,
|
|
332
331
|
artifactRoot: runPaths,
|
|
333
|
-
|
|
332
|
+
studyCwd: input.cwd,
|
|
334
333
|
redactScreenshots,
|
|
335
334
|
scrubKnownValues,
|
|
336
335
|
runSession,
|
|
337
|
-
// The study-level ledger exists once per
|
|
336
|
+
// The study-level ledger exists once per run, shared by every participant. Dry runs never
|
|
338
337
|
// spend, so they carry none.
|
|
339
338
|
...(dryRun || plan.caps.maxTotalUsd === undefined
|
|
340
339
|
? {}
|
|
@@ -374,7 +373,7 @@ function subjectPhaseReporter(input) {
|
|
|
374
373
|
const sink = input.deps?.subjectPhaseSink ?? defaultSubjectPhaseSink;
|
|
375
374
|
return (event, participant) => {
|
|
376
375
|
sink(event, participant);
|
|
377
|
-
input.emit?.(phaseEvent(event, { kind: "participant", participant
|
|
376
|
+
input.emit?.(phaseEvent(event, { kind: "participant", participant }));
|
|
378
377
|
};
|
|
379
378
|
}
|
|
380
379
|
function makeCuaRunId() {
|