humanish 0.106.1 → 0.108.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 +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- 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-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -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 +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- 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/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- 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 +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- 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 +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- 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 +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- 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 +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- 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 +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- 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 +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- 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 +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- 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 +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- 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 +43 -0
- 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/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- 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/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- 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 +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- 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 +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- 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/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- 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 +8 -7
- 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/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -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 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- 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 -294
- 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/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -5,25 +5,25 @@ import { type RunRerunLineage } from "../../run/bundle.js";
|
|
|
5
5
|
import type { PreparedSelectedOutputDirectory } from "../../run/contained-output.js";
|
|
6
6
|
import { type CuaActorLabErrorCode, type CuaParticipantPlan, type CuaParticipantPlanEntry, type DesktopParticipantRun } from "./types.js";
|
|
7
7
|
export declare function defaultSessionTimeoutMs(config: LabConfig): number;
|
|
8
|
-
/** Per-
|
|
9
|
-
* verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
|
|
8
|
+
/** Per-participant sandbox deadline (each one owns its own desktop). Mirrors the
|
|
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
14
|
export declare function resolveParticipantSandboxMs(config: LabConfig): number;
|
|
15
15
|
/**
|
|
16
|
-
* The in-flight participant bound a lab declares. Defaults to the participant count
|
|
16
|
+
* The in-flight participant bound a lab 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
|
|
25
|
-
* effective concurrency, the wave count, the per-
|
|
26
|
-
* sandbox-minutes
|
|
24
|
+
* Pure pre-flight plan resolver (runs in dry-run and live). Returns the participant table, the
|
|
25
|
+
* effective concurrency, the wave count, the per-participant session budget, and the worst-case total
|
|
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
29
|
export declare function resolveCuaParticipantPlan(config: LabConfig, opts?: {
|
|
@@ -32,8 +32,8 @@ export declare function resolveCuaParticipantPlan(config: LabConfig, opts?: {
|
|
|
32
32
|
dryRun?: boolean;
|
|
33
33
|
personas?: Map<string, ResolvedPersona>;
|
|
34
34
|
}): CuaParticipantPlan;
|
|
35
|
-
/** Print the
|
|
36
|
-
* digests, and budgets only
|
|
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
37
|
export declare function emitPreflightPlan(participantPlan: CuaParticipantPlan, labId: string): void;
|
|
38
38
|
export declare function formatParticipantPlanEntry(entry: CuaParticipantPlanEntry): string;
|
|
39
39
|
/**
|
|
@@ -63,5 +63,5 @@ export declare function loadCuaParticipants(args: {
|
|
|
63
63
|
code: CuaActorLabErrorCode;
|
|
64
64
|
message: string;
|
|
65
65
|
}>;
|
|
66
|
-
/** Scrub known secret values from each
|
|
66
|
+
/** Scrub known secret values from each participant's declarative snapshot before any bundle uses it. */
|
|
67
67
|
export declare function sanitizeParticipantRuns(runs: readonly DesktopParticipantRun[], scrub: (text: string) => string): void;
|
|
@@ -26,8 +26,8 @@ export function defaultSessionTimeoutMs(config) {
|
|
|
26
26
|
const room = MAX_SANDBOX_MS - SUBJECT_PROVISION_BUDGET_MS - stateBudgetMs - SANDBOX_TIMEOUT_BUFFER_MS;
|
|
27
27
|
return Math.max(MIN_DERIVED_SESSION_TIMEOUT_MS, Math.min(DEFAULT_APP_URL_SESSION_TIMEOUT_MS, room));
|
|
28
28
|
}
|
|
29
|
-
/** Per-
|
|
30
|
-
* verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
|
|
29
|
+
/** Per-participant sandbox deadline (each one owns its own desktop). Mirrors the
|
|
30
|
+
* single-participant formula verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
|
|
31
31
|
* or local-tree: provision budget + Σ state-step budgets) + the server-side
|
|
32
32
|
* reclamation buffer. Local-tree shares the clone route's provisioning budget: it swaps a
|
|
33
33
|
* git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
|
|
@@ -46,18 +46,18 @@ export function resolveParticipantSandboxMs(config) {
|
|
|
46
46
|
SANDBOX_TIMEOUT_BUFFER_MS);
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
|
-
* The in-flight participant bound a lab declares. Defaults to the participant count
|
|
49
|
+
* The in-flight participant bound a lab declares. Defaults to the participant count: every
|
|
50
50
|
* 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
|
|
51
|
+
* live" into waves; total session count and spend are the same either way, only wall-clock
|
|
52
|
+
* and simultaneity differ. A declared execution.concurrency is a cap, clamped to [1, participants].
|
|
53
53
|
* The planner records it; the route may only lower it from the environment.
|
|
54
54
|
*/
|
|
55
55
|
export function boundedConcurrency(declared, participantCount) {
|
|
56
56
|
return Math.max(1, declared === undefined ? participantCount : Math.min(Math.max(1, declared), participantCount));
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
|
-
* The planned bound, lowered by the env override. The override may only
|
|
60
|
-
* concurrent paid desktops
|
|
59
|
+
* The planned bound, lowered by the env override. The override may only lower it (never raise
|
|
60
|
+
* concurrent paid desktops), and a lowering is reported via envLoweredFrom so the
|
|
61
61
|
* plan never silently disagrees with the manifest.
|
|
62
62
|
*/
|
|
63
63
|
function envLoweredConcurrency(planned, participantCount, env) {
|
|
@@ -81,7 +81,7 @@ function plannedParticipantsOf(config, countOverride) {
|
|
|
81
81
|
desktopCli: config.subject.source === "desktop-cli",
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
-
/** Build the participant runs
|
|
84
|
+
/** Build the participant runs and the public plan from the planned participants (pure). */
|
|
85
85
|
function participantRunsAndPlan(planned, opts = {}) {
|
|
86
86
|
const env = opts.env ?? {};
|
|
87
87
|
// Who each participant is (id, persona, focus, device, limits) comes from the plan; this adds
|
|
@@ -162,20 +162,20 @@ function participantRunsAndPlan(planned, opts = {}) {
|
|
|
162
162
|
return { runs, participantPlan };
|
|
163
163
|
}
|
|
164
164
|
/**
|
|
165
|
-
* Pure pre-flight plan resolver (runs in dry-run
|
|
166
|
-
* effective concurrency, the wave count, the per-
|
|
167
|
-
* sandbox-minutes
|
|
165
|
+
* Pure pre-flight plan resolver (runs in dry-run and live). Returns the participant table, the
|
|
166
|
+
* effective concurrency, the wave count, the per-participant session budget, and the worst-case total
|
|
167
|
+
* sandbox-minutes, before any sandbox or provider call. The same plan appears in dry-run,
|
|
168
168
|
* marked $0 (dryRun: true).
|
|
169
169
|
*/
|
|
170
170
|
export function resolveCuaParticipantPlan(config, opts = {}) {
|
|
171
171
|
const { countOverride, ...rest } = opts;
|
|
172
172
|
return participantRunsAndPlan(plannedParticipantsOf(config, countOverride), rest).participantPlan;
|
|
173
173
|
}
|
|
174
|
-
/** Print the
|
|
175
|
-
* digests, and budgets only
|
|
174
|
+
/** Print the participant plan to stderr before any sandbox/provider call (public-safe: ids, devices,
|
|
175
|
+
* digests, and budgets only; no prompt text, no secrets). */
|
|
176
176
|
export function emitPreflightPlan(participantPlan, labId) {
|
|
177
177
|
const lines = [];
|
|
178
|
-
lines.push(`humanish
|
|
178
|
+
lines.push(`humanish computer-use fan-out plan (${labId}): ${participantPlan.laneCount} participant(s), strategy ${participantPlan.strategy}, concurrency ${participantPlan.concurrency}${participantPlan.envLoweredConcurrencyFrom === undefined ? "" : ` (lowered from ${participantPlan.envLoweredConcurrencyFrom} by ${CUA_MAX_CONCURRENCY_ENV})`}, ${participantPlan.waves} wave(s).`);
|
|
179
179
|
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
180
|
for (const entry of participantPlan.lanes) {
|
|
181
181
|
lines.push(` - ${formatParticipantPlanEntry(entry)}`);
|
|
@@ -212,8 +212,8 @@ export async function compileParticipantPersonas(projectRoot, personaIds) {
|
|
|
212
212
|
export async function loadCuaParticipants(args) {
|
|
213
213
|
const { plan } = args;
|
|
214
214
|
const { participants } = plan.runner;
|
|
215
|
-
// Compile any committed personas
|
|
216
|
-
// prompt carries real behavioral directives rather than a bare `Persona: <id>.` label
|
|
215
|
+
// Compile any committed personas before planning, so the plan builder stays pure and each participant's
|
|
216
|
+
// prompt carries real behavioral directives rather than a bare `Persona: <id>.` label.
|
|
217
217
|
const personas = await compileParticipantPersonas(args.projectRoot, participants.map((participant) => participant.personaId));
|
|
218
218
|
const { runs: participantRuns, participantPlan } = participantRunsAndPlan({
|
|
219
219
|
participants,
|
|
@@ -235,7 +235,7 @@ export async function loadCuaParticipants(args) {
|
|
|
235
235
|
participantPlan,
|
|
236
236
|
});
|
|
237
237
|
if (!selected.ok) {
|
|
238
|
-
return { ok: false, code: "
|
|
238
|
+
return { ok: false, code: "HUMANISH_COMPUTER_USE_RERUN_INVALID", message: selected.message };
|
|
239
239
|
}
|
|
240
240
|
return {
|
|
241
241
|
ok: true,
|
|
@@ -244,7 +244,7 @@ export async function loadCuaParticipants(args) {
|
|
|
244
244
|
rerunLineage: selected.rerun,
|
|
245
245
|
};
|
|
246
246
|
}
|
|
247
|
-
/** Scrub known secret values from each
|
|
247
|
+
/** Scrub known secret values from each participant's declarative snapshot before any bundle uses it. */
|
|
248
248
|
export function sanitizeParticipantRuns(runs, scrub) {
|
|
249
249
|
for (const spec of runs) {
|
|
250
250
|
if (spec.evidenceAssignment)
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { type CuaActorDescriptor } from "../../actors/registry.js";
|
|
2
|
-
import type { ComputerUsePlan, RoutePlanResult, RouteRefusal } from "../../lab/plan-types.js";
|
|
3
|
-
import type { LabConfig,
|
|
4
|
-
import type
|
|
5
|
-
import { type CuaActorLabErrorCode, type CuaActorLabHooks, type RunCuaActorLabOptions } from "./types.js";
|
|
2
|
+
import type { ComputerUsePlan, ComputerUseRunner, RoutePlanResult, RouteRefusal } from "../../lab/plan-types.js";
|
|
3
|
+
import type { LabConfig, LabSubjectState } from "../../lab/types.js";
|
|
4
|
+
import { type CuaActorLabErrorCode, type RunCuaActorLabOptions } from "./types.js";
|
|
6
5
|
/** The error a computer-use lab returns before a run starts. */
|
|
7
6
|
export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActorLabErrorCode> {
|
|
8
7
|
/**
|
|
9
8
|
* Where the route returns it. "before-scope": analysis and tasks, returned before the run scope
|
|
10
9
|
* with no automatic-analysis record. "in-scope": after the cwd checks. "after-personas": after
|
|
11
|
-
* the route reads committed persona files, so a persona-file error still wins over the
|
|
10
|
+
* the route reads committed persona files, so a persona-file error still wins over the participant cap
|
|
12
11
|
* and in-process fan-out.
|
|
13
12
|
*/
|
|
14
13
|
readonly stage: "before-scope" | "in-scope" | "after-personas";
|
|
@@ -18,39 +17,32 @@ export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActo
|
|
|
18
17
|
export type ComputerUsePlanResult = RoutePlanResult<ComputerUsePlan, ComputerUseRefusal>;
|
|
19
18
|
/** The registered descriptor for a planned actor id; planComputerUseLab checked the registry. */
|
|
20
19
|
export declare function cuaDescriptorOf(actor: string): CuaActorDescriptor;
|
|
21
|
-
/** Which
|
|
22
|
-
export interface
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
desktopCliRoute: boolean;
|
|
26
|
-
localTreeRoute: boolean;
|
|
27
|
-
/**
|
|
28
|
-
* Clone and local-tree both provision the subject in-sandbox (clone via git, local-tree via
|
|
29
|
-
* pack+upload) and share the install/build/state/start/probe pipeline, so every seam that gates
|
|
30
|
-
* on "does this route provision a subject" is keyed on this union.
|
|
31
|
-
*/
|
|
32
|
-
provisionedRoute: boolean;
|
|
33
|
-
localAppSubject: boolean;
|
|
34
|
-
/** A caller-supplied executor drives the subject in-process; no desktop is created. */
|
|
35
|
-
inProcessRoute: boolean;
|
|
36
|
-
serve: LabSubjectServe | undefined;
|
|
37
|
-
appUrl: string;
|
|
38
|
-
subjectRepo: string | undefined;
|
|
39
|
-
subjectEnvNames: string[];
|
|
20
|
+
/** Which of the caller's driving homes, createProvider and inProcess, a run has. */
|
|
21
|
+
export interface CallerDriving {
|
|
22
|
+
readonly inProcess: boolean;
|
|
23
|
+
readonly createProvider: boolean;
|
|
40
24
|
}
|
|
41
|
-
|
|
25
|
+
/** The driving a computer-use run's options carry. */
|
|
26
|
+
export declare function callerDrivingOf(options: {
|
|
27
|
+
readonly inProcess?: unknown;
|
|
28
|
+
readonly createProvider?: unknown;
|
|
29
|
+
}): CallerDriving;
|
|
42
30
|
/** The state a planned run's provisioned subject declares. Other subjects declare none. */
|
|
43
31
|
export declare function cuaDeclaredState(plan: ComputerUsePlan): LabSubjectState | undefined;
|
|
44
|
-
/** The
|
|
45
|
-
export declare function
|
|
32
|
+
/** The URL a refused lab's result names, from its declaration: a provisioned subject's serve URL. */
|
|
33
|
+
export declare function declaredAppUrl(config: LabConfig): string;
|
|
34
|
+
/** The URL a planned run's participants open: a provisioned subject's served URL, else its own. */
|
|
35
|
+
export declare function plannedAppUrl(subject: ComputerUseRunner["subject"]): string;
|
|
46
36
|
/**
|
|
47
37
|
* Plan a computer-use lab. It is called for any config handed to the computer-use runner, not only
|
|
48
38
|
* one routeOf sends here, so a config for another route gets this route's refusal.
|
|
49
39
|
*/
|
|
50
40
|
export declare function planComputerUseLab(config: LabConfig, input: {
|
|
51
41
|
readonly dryRun: boolean;
|
|
52
|
-
|
|
53
|
-
readonly
|
|
42
|
+
/** Whether deps.runSession is set: a caller's session runner cannot enforce maxOutputTokens. */
|
|
43
|
+
readonly hasRunSession?: boolean;
|
|
44
|
+
/** Which of the caller's driving homes are set; neither when absent. */
|
|
45
|
+
readonly driving?: CallerDriving;
|
|
54
46
|
readonly countOverride?: number;
|
|
55
47
|
readonly rerun?: RunCuaActorLabOptions["rerun"];
|
|
56
48
|
}): ComputerUsePlanResult;
|
|
@@ -8,14 +8,13 @@ import { isHttpUrl, isLoopbackUrl } from "../../lab/parse/subject.js";
|
|
|
8
8
|
import { subjectStateInvalidReason } from "../../lab/parse/subject-state.js";
|
|
9
9
|
import { brainOf, callerBrainOf, capsOf, desktopRequirements, planBase, provisionedSubject, } from "../../lab/plan-base.js";
|
|
10
10
|
import { computerUseParticipants, declaredTargets } from "../../lab/plan-participants.js";
|
|
11
|
-
import {
|
|
12
|
-
import { cloneTargetValidationReason,
|
|
11
|
+
import { MAX_COMPUTER_USE_PARTICIPANTS } from "../../lab/routing.js";
|
|
12
|
+
import { cloneTargetValidationReason, computerUseValidationReason, desktopMediaValidationReason, outputTokenLimitValidationReason, receivingEmailValidationReason, scenarioCapsValidationReason, taskProtocolValidationReason, } from "../../lab/validation.js";
|
|
13
13
|
import { desktopCliProductReason } from "../../lab/composition-rules.js";
|
|
14
14
|
import { isLocalBrowserLab } from "../../substrates/local/runtime-config.js";
|
|
15
15
|
import { boundedConcurrency, defaultSessionTimeoutMs, resolveParticipantSandboxMs, } from "./participant-runs.js";
|
|
16
16
|
import { MAX_SANDBOX_MS } from "../../substrates/e2b/lifetime.js";
|
|
17
17
|
import {} from "./types.js";
|
|
18
|
-
import { participantDesktopOf } from "./participant-desktop.js";
|
|
19
18
|
/** The registered descriptor for a planned actor id; planComputerUseLab checked the registry. */
|
|
20
19
|
export function cuaDescriptorOf(actor) {
|
|
21
20
|
const descriptor = actorRegistry[actor];
|
|
@@ -23,7 +22,7 @@ export function cuaDescriptorOf(actor) {
|
|
|
23
22
|
throw new Error(`planned actor "${actor}" is not a registered computer-use actor`);
|
|
24
23
|
return descriptor;
|
|
25
24
|
}
|
|
26
|
-
|
|
25
|
+
function declaredSubjectRoute(config, driving) {
|
|
27
26
|
const cloneRoute = config.subject.source === "clone";
|
|
28
27
|
const localTreeRoute = config.subject.source === "local-tree";
|
|
29
28
|
const provisionedRoute = cloneRoute || localTreeRoute;
|
|
@@ -34,37 +33,39 @@ export function cuaSubjectRoute(config, hooks) {
|
|
|
34
33
|
localTreeRoute,
|
|
35
34
|
provisionedRoute,
|
|
36
35
|
localAppSubject: config.subject.source === "local-app",
|
|
37
|
-
inProcessRoute:
|
|
36
|
+
inProcessRoute: driving.inProcess,
|
|
38
37
|
serve,
|
|
39
38
|
appUrl: (provisionedRoute ? serve?.url : config.subject.appUrl) ?? "",
|
|
40
39
|
subjectRepo: cloneRoute ? (config.subject.repos?.[0] ?? "") : undefined,
|
|
41
40
|
subjectEnvNames: provisionedRoute ? (config.subject.env ?? []) : [],
|
|
42
41
|
};
|
|
43
42
|
}
|
|
43
|
+
/** The driving a computer-use run's options carry. */
|
|
44
|
+
export function callerDrivingOf(options) {
|
|
45
|
+
return {
|
|
46
|
+
inProcess: options.inProcess !== undefined,
|
|
47
|
+
createProvider: options.createProvider !== undefined,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
44
50
|
/** The state a planned run's provisioned subject declares. Other subjects declare none. */
|
|
45
51
|
export function cuaDeclaredState(plan) {
|
|
46
52
|
const { subject } = plan.runner;
|
|
47
53
|
return subject.kind === "clone" || subject.kind === "local-tree" ? subject.state : undefined;
|
|
48
54
|
}
|
|
49
|
-
/** The
|
|
50
|
-
export function
|
|
51
|
-
const {
|
|
52
|
-
const provisioned = subject.
|
|
53
|
-
return
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
serve: provisioned?.serve,
|
|
61
|
-
appUrl: provisioned?.serve.url ?? ("appUrl" in subject ? subject.appUrl : ""),
|
|
62
|
-
subjectRepo: subject.kind === "clone" ? subject.repo : undefined,
|
|
63
|
-
subjectEnvNames: [...(provisioned?.env ?? [])],
|
|
64
|
-
};
|
|
55
|
+
/** The URL a refused lab's result names, from its declaration: a provisioned subject's serve URL. */
|
|
56
|
+
export function declaredAppUrl(config) {
|
|
57
|
+
const { subject } = config;
|
|
58
|
+
const provisioned = subject.source === "clone" || subject.source === "local-tree";
|
|
59
|
+
return (provisioned ? subject.serve?.url : subject.appUrl) ?? "";
|
|
60
|
+
}
|
|
61
|
+
/** The URL a planned run's participants open: a provisioned subject's served URL, else its own. */
|
|
62
|
+
export function plannedAppUrl(subject) {
|
|
63
|
+
if (subject.kind === "clone" || subject.kind === "local-tree")
|
|
64
|
+
return subject.serve.url;
|
|
65
|
+
return "appUrl" in subject ? subject.appUrl : "";
|
|
65
66
|
}
|
|
66
67
|
const invalid = (message) => ({
|
|
67
|
-
code: "
|
|
68
|
+
code: "HUMANISH_COMPUTER_USE_SUBJECT_INVALID",
|
|
68
69
|
message,
|
|
69
70
|
});
|
|
70
71
|
/**
|
|
@@ -72,22 +73,22 @@ const invalid = (message) => ({
|
|
|
72
73
|
* is touched. The parser enforces most of these too; the engine repeats them for library callers
|
|
73
74
|
* that hand it a config directly. The groups run in this order, and each returns its first reason.
|
|
74
75
|
*/
|
|
75
|
-
function cuaLabRejection(config,
|
|
76
|
-
return (unsupportedDeclarationReason(config,
|
|
76
|
+
function cuaLabRejection(config, hasRunSession, driving, subjectRoute) {
|
|
77
|
+
return (unsupportedDeclarationReason(config, hasRunSession, driving, subjectRoute) ??
|
|
77
78
|
subjectStructureReason(config, subjectRoute) ??
|
|
78
79
|
entryTargetReason(config, subjectRoute) ??
|
|
79
|
-
driverReason(
|
|
80
|
+
driverReason(driving, subjectRoute) ??
|
|
80
81
|
rosterShapeReason(config));
|
|
81
82
|
}
|
|
82
83
|
/** A declaration this route cannot honor, for any subject or with the caller's own driver. */
|
|
83
|
-
function unsupportedDeclarationReason(config,
|
|
84
|
+
function unsupportedDeclarationReason(config, hasRunSession, driving, { inProcessRoute }) {
|
|
84
85
|
const reason = desktopMediaValidationReason(config) ||
|
|
85
86
|
outputTokenLimitValidationReason(config) ||
|
|
86
87
|
scenarioCapsValidationReason(config);
|
|
87
88
|
if (reason)
|
|
88
89
|
return invalid(reason);
|
|
89
90
|
if (config.actors[0]?.maxOutputTokens !== undefined &&
|
|
90
|
-
(
|
|
91
|
+
(hasRunSession || driving.createProvider || driving.inProcess))
|
|
91
92
|
return invalid("maxOutputTokens cannot be enforced by a custom runSession/provider/executor route.");
|
|
92
93
|
const receivingReason = receivingEmailValidationReason(config);
|
|
93
94
|
if (receivingReason)
|
|
@@ -109,7 +110,7 @@ function subjectStructureReason(config, subjectRoute) {
|
|
|
109
110
|
if (cloneRoute &&
|
|
110
111
|
(!serve || !subjectRepo || !/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(subjectRepo)))
|
|
111
112
|
return invalid(!serve
|
|
112
|
-
? "clone
|
|
113
|
+
? "A clone subject on the computer-use route needs `subject.serve` (start and url): humanish starts the app in the sandbox before the participant opens it."
|
|
113
114
|
: `subject.repos[0] must be an owner/repo slug (got "${subjectRepo ?? ""}").`);
|
|
114
115
|
// A library caller that skips parseLabConfig gets the same fail-closed shape the parser
|
|
115
116
|
// enforces, naming which requirement is missing.
|
|
@@ -145,45 +146,36 @@ function entryTargetReason(config, subjectRoute) {
|
|
|
145
146
|
if (entryTargetSafe)
|
|
146
147
|
return undefined;
|
|
147
148
|
return {
|
|
148
|
-
code: "
|
|
149
|
+
code: "HUMANISH_COMPUTER_USE_SUBJECT_UNSAFE",
|
|
149
150
|
message: provisionedRoute || localAppSubject || !allowPublicTargets
|
|
150
151
|
? "subject.appUrl and any actors[0].lanes[].target entries must be loopback (127.0.0.1 or localhost) unless policies.allowPublicTargets is set for an app-url subject."
|
|
151
152
|
: "subject.appUrl and actors[0].lanes[].target entries must be valid http(s) URLs.",
|
|
152
153
|
};
|
|
153
154
|
}
|
|
154
|
-
/** Something to drive the subject: the caller's executor with its provider
|
|
155
|
-
function driverReason(
|
|
155
|
+
/** Something to drive the subject: the caller's executor with its provider. */
|
|
156
|
+
function driverReason(driving, { localAppSubject, inProcessRoute }) {
|
|
156
157
|
// A custom executor needs a custom provider too: the default OpenAI provider is vision-based
|
|
157
158
|
// and would fail closed against an executor that returns no screenshot.
|
|
158
|
-
if (
|
|
159
|
+
if (driving.inProcess && !driving.createProvider)
|
|
159
160
|
return {
|
|
160
|
-
code: "
|
|
161
|
-
message: "
|
|
161
|
+
code: "HUMANISH_COMPUTER_USE_EXECUTOR_NO_PROVIDER",
|
|
162
|
+
message: "RunLabOptions.inProcess needs RunLabOptions.createProvider: an in-process executor returns no screenshot, so it needs a provider that does not read images. The default OpenAI computer-use provider reads screenshots and would stop the session.",
|
|
162
163
|
};
|
|
163
164
|
// There is no built-in in-process driver for a local app.
|
|
164
165
|
if (localAppSubject && !inProcessRoute)
|
|
165
166
|
return {
|
|
166
|
-
code: "
|
|
167
|
+
code: "HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR",
|
|
167
168
|
message: "subject.source: local-app has no built-in driver. Supply one through runLab(config, { inProcess: { executor }, createProvider }); a state-driven executor needs a non-vision provider.",
|
|
168
169
|
};
|
|
169
|
-
// runLab gives a local browser study its desktop lane; a direct route call or an in-process
|
|
170
|
-
// executor on the same lab has none.
|
|
171
|
-
if (config.subject.source === "app-url" &&
|
|
172
|
-
config.execution?.target === "local" &&
|
|
173
|
-
participantDesktopOf(hooks) === undefined)
|
|
174
|
-
return {
|
|
175
|
-
code: "HUMANISH_CUA_LAB_LOCAL_DESKTOP_MISSING",
|
|
176
|
-
message: "An app-url lab with execution.target: local needs a local desktop. runLab starts one; a direct route call or an in-process executor does not.",
|
|
177
|
-
};
|
|
178
170
|
return undefined;
|
|
179
171
|
}
|
|
180
|
-
/** The
|
|
172
|
+
/** The participant roster, then the sandbox deadline its session budget derives. */
|
|
181
173
|
function rosterShapeReason(config) {
|
|
182
|
-
//
|
|
183
|
-
// allowPublicTargets with more than one
|
|
184
|
-
const fanoutReason =
|
|
174
|
+
// `lanes` XOR `count`/`laneFocus`, device XOR raw resolution, cap, unique ids,
|
|
175
|
+
// allowPublicTargets with more than one participant, clone.fanout.
|
|
176
|
+
const fanoutReason = computerUseValidationReason(config);
|
|
185
177
|
if (fanoutReason)
|
|
186
|
-
return { code: "
|
|
178
|
+
return { code: "HUMANISH_COMPUTER_USE_FANOUT_INVALID", message: fanoutReason };
|
|
187
179
|
// The sandbox deadline is derived from the session budget, so a lab can ask for a session that
|
|
188
180
|
// cannot legally be provisioned. Show the arithmetic: the provider's own error names a limit
|
|
189
181
|
// but not which knob produced it.
|
|
@@ -195,12 +187,17 @@ function rosterShapeReason(config) {
|
|
|
195
187
|
const headroomMs = derivedSandboxMs - sessionMs;
|
|
196
188
|
return invalid(`execution.timeoutMs ${Math.round(sessionMs / 60_000)}m derives a ${Math.round(derivedSandboxMs / 60_000)}m sandbox deadline, and a sandbox may not live longer than ${MAX_SANDBOX_MS / 60_000}m. The deadline is the session budget plus ${Math.round(headroomMs / 60_000)}m of provisioning and teardown headroom${provisionedRoute ? " (this route clones, installs, builds and serves the subject before the actor starts)" : ""}. Lower execution.timeoutMs to at most ${Math.round((MAX_SANDBOX_MS - headroomMs) / 60_000)}m, or set execution.desktop.sandboxTimeoutMs explicitly.`);
|
|
197
189
|
}
|
|
190
|
+
/** The plan's rerun: the source run and, when given, the participants to rerun. */
|
|
191
|
+
function rerunPlan({ sourceRunId, participantIds, }) {
|
|
192
|
+
return { sourceRunId, ...(participantIds === undefined ? {} : { participantIds }) };
|
|
193
|
+
}
|
|
198
194
|
/**
|
|
199
195
|
* Plan a computer-use lab. It is called for any config handed to the computer-use runner, not only
|
|
200
196
|
* one routeOf sends here, so a config for another route gets this route's refusal.
|
|
201
197
|
*/
|
|
202
198
|
export function planComputerUseLab(config, input) {
|
|
203
|
-
const
|
|
199
|
+
const hasRunSession = input.hasRunSession === true;
|
|
200
|
+
const driving = input.driving ?? { inProcess: false, createProvider: false };
|
|
204
201
|
const refuse = (stage, code, message, actor) => ({
|
|
205
202
|
ok: false,
|
|
206
203
|
refusal: {
|
|
@@ -213,54 +210,57 @@ export function planComputerUseLab(config, input) {
|
|
|
213
210
|
});
|
|
214
211
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
215
212
|
if (!analysis.ok)
|
|
216
|
-
return refuse("before-scope", "
|
|
213
|
+
return refuse("before-scope", "HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
|
|
217
214
|
const tasksReason = taskProtocolValidationReason(config, true);
|
|
218
215
|
if (tasksReason)
|
|
219
|
-
return refuse("before-scope", "
|
|
216
|
+
return refuse("before-scope", "HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason);
|
|
220
217
|
// The parser checks the actor too; a library caller skips the parser.
|
|
221
218
|
const actorType = config.actors[0]?.type ?? "";
|
|
222
219
|
const descriptor = actorRegistry[actorType];
|
|
223
220
|
if (!descriptor || !isCuaActorDescriptor(descriptor))
|
|
224
|
-
return refuse("in-scope", "
|
|
221
|
+
return refuse("in-scope", "HUMANISH_COMPUTER_USE_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered computer-use actor.`);
|
|
225
222
|
const actor = descriptor.id;
|
|
226
|
-
const rejection = cuaLabRejection(config,
|
|
223
|
+
const rejection = cuaLabRejection(config, hasRunSession, driving, declaredSubjectRoute(config, driving));
|
|
227
224
|
if (rejection)
|
|
228
225
|
return refuse("in-scope", rejection.code, rejection.message, actor);
|
|
229
|
-
// A shared world runs every
|
|
230
|
-
// It comes after the rules above, so a shared-world config that breaks one of them,
|
|
231
|
-
// sends here, still gets that rule's message.
|
|
226
|
+
// A shared world runs every participant against one app; this route would run them as separate
|
|
227
|
+
// participants. It comes after the rules above, so a shared-world config that breaks one of them,
|
|
228
|
+
// which runLab sends here, still gets that rule's message.
|
|
232
229
|
if (config.subject.topology === "shared-world")
|
|
233
|
-
return refuse("in-scope", "
|
|
230
|
+
return refuse("in-scope", "HUMANISH_COMPUTER_USE_SUBJECT_INVALID", "subject.topology: shared-world labs run every participant against one shared app on the shared-world route; runCuaActorLab runs independent participants. Run the lab with runLab or runConcurrentSharedWorld.", actor);
|
|
234
231
|
// The in-process route drives subject.appUrl on this machine and creates no desktop, so it would
|
|
235
232
|
// skip the subject a clone, local-tree or desktop-cli lab declares.
|
|
236
233
|
const source = config.subject.source;
|
|
237
|
-
if (
|
|
234
|
+
if (driving.inProcess &&
|
|
238
235
|
(source === "clone" || source === "local-tree" || source === "desktop-cli"))
|
|
239
|
-
return refuse("in-scope", "
|
|
236
|
+
return refuse("in-scope", "HUMANISH_COMPUTER_USE_SUBJECT_INVALID", `RunLabOptions.inProcess drives subject.appUrl in this process, and a ${source} subject needs the hosted desktop the in-process route never creates. Use an app-url or local-app subject with inProcess, or remove inProcess to run on a hosted desktop.`, actor);
|
|
240
237
|
// The parser's rule; without a product the desktop study fails later.
|
|
241
238
|
const productReason = desktopCliProductReason(config);
|
|
242
239
|
if (productReason)
|
|
243
|
-
return refuse("in-scope", "
|
|
240
|
+
return refuse("in-scope", "HUMANISH_COMPUTER_USE_SUBJECT_INVALID", productReason, actor);
|
|
244
241
|
const participants = computerUseParticipants(config, input.countOverride);
|
|
245
|
-
if (participants.length >
|
|
246
|
-
return refuse("after-personas", "
|
|
242
|
+
if (participants.length > MAX_COMPUTER_USE_PARTICIPANTS)
|
|
243
|
+
return refuse("after-personas", "HUMANISH_COMPUTER_USE_FANOUT_INVALID", `Computer-use fan-out is capped at ${MAX_COMPUTER_USE_PARTICIPANTS} participants (resolved ${participants.length}); N concurrent paid desktops is real spend.`, actor);
|
|
247
244
|
const [first, ...rest] = participants;
|
|
248
|
-
if (
|
|
249
|
-
return refuse("after-personas", "
|
|
245
|
+
if (driving.inProcess && rest.length > 0)
|
|
246
|
+
return refuse("after-personas", "HUMANISH_COMPUTER_USE_FANOUT_INVALID", "Fan-out to more than one participant is not supported on the in-process route (RunLabOptions.inProcess): fan-out provisions one independent E2B desktop per participant, which the in-process route deliberately skips. Run a single in-process participant, or fan out on the E2B route.", actor);
|
|
250
247
|
if (first === undefined)
|
|
251
248
|
throw new Error("computerUseParticipants returned no participant");
|
|
252
249
|
const appUrl = config.subject.appUrl ?? "";
|
|
250
|
+
const declaredServeUrl = config.subject.serve?.url;
|
|
251
|
+
const serveUrl = declaredServeUrl === undefined ? {} : { serveUrl: declaredServeUrl };
|
|
253
252
|
const appUrlSubject = {
|
|
254
253
|
kind: "app-url",
|
|
255
254
|
appUrl,
|
|
256
255
|
publicTargets: config.policies?.allowPublicTargets === true,
|
|
256
|
+
...serveUrl,
|
|
257
257
|
};
|
|
258
258
|
const product = config.subject.product;
|
|
259
259
|
const hosted = source === "desktop-cli" && product !== undefined
|
|
260
|
-
? { kind: "desktop-cli", product }
|
|
260
|
+
? { kind: "desktop-cli", product, ...serveUrl }
|
|
261
261
|
: (provisionedSubject(config) ?? appUrlSubject);
|
|
262
|
-
const brain = brainOf(config,
|
|
263
|
-
const runner =
|
|
262
|
+
const brain = brainOf(config, driving.createProvider);
|
|
263
|
+
const runner = driving.inProcess
|
|
264
264
|
? {
|
|
265
265
|
desktop: "in-process",
|
|
266
266
|
brain: callerBrainOf(config),
|
|
@@ -275,7 +275,6 @@ export function planComputerUseLab(config, input) {
|
|
|
275
275
|
const provisioned = source === "clone" || source === "local-tree";
|
|
276
276
|
const base = planBase(config, {
|
|
277
277
|
dryRun: input.dryRun,
|
|
278
|
-
...(input.lab === undefined ? {} : { lab: input.lab }),
|
|
279
278
|
analysis,
|
|
280
279
|
});
|
|
281
280
|
return {
|
|
@@ -289,18 +288,11 @@ export function planComputerUseLab(config, input) {
|
|
|
289
288
|
sessionBudgetMs: config.execution?.timeoutMs ?? defaultSessionTimeoutMs(config),
|
|
290
289
|
sandboxMs: resolveParticipantSandboxMs(config),
|
|
291
290
|
caps: capsOf(config),
|
|
292
|
-
...(input.rerun === undefined
|
|
293
|
-
? {}
|
|
294
|
-
: {
|
|
295
|
-
rerun: {
|
|
296
|
-
sourceRunId: input.rerun.sourceRunId,
|
|
297
|
-
...(input.rerun.laneIds === undefined ? {} : { participantIds: input.rerun.laneIds }),
|
|
298
|
-
},
|
|
299
|
-
}),
|
|
291
|
+
...(input.rerun === undefined ? {} : { rerun: rerunPlan(input.rerun) }),
|
|
300
292
|
requirements: base.dryRun || runner.desktop === "in-process"
|
|
301
293
|
? []
|
|
302
294
|
: desktopRequirements(config, {
|
|
303
|
-
e2b: runner.desktop === "e2b-desktop"
|
|
295
|
+
e2b: runner.desktop === "e2b-desktop",
|
|
304
296
|
brain,
|
|
305
297
|
localVm: runner.desktop === "local-vm",
|
|
306
298
|
externalCatch: !provisioned,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Brain, ComputerUsePlan } from "../../lab/plan-types.js";
|
|
2
2
|
import type { LabCommsExternal } from "../../lab/types.js";
|
|
3
|
-
import type { CuaActorLabErrorCode
|
|
3
|
+
import type { CuaActorLabErrorCode } from "./types.js";
|
|
4
4
|
/**
|
|
5
5
|
* The first reason a live computer-use run cannot start on this machine: missing keys, a missing
|
|
6
6
|
* or signed-out local agent, missing subject env, a spend cap with no price, or an unreachable
|
|
@@ -11,11 +11,9 @@ export declare function liveCuaRejection(args: {
|
|
|
11
11
|
caps: ComputerUsePlan["caps"];
|
|
12
12
|
/** The plan's brain: whether a local agent drives the participant, and the model a cap prices. */
|
|
13
13
|
brain: Brain;
|
|
14
|
-
hooks: CuaActorLabHooks;
|
|
15
14
|
env: Record<string, string | undefined>;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
subjectEnvNames: string[];
|
|
15
|
+
/** The plan's requirements: which keys and subject env names this run needs. */
|
|
16
|
+
requirements: ComputerUsePlan["requirements"];
|
|
19
17
|
externalCommsConfig: LabCommsExternal | undefined;
|
|
20
18
|
}): Promise<{
|
|
21
19
|
code: CuaActorLabErrorCode;
|