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
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
|
|
2
2
|
import {} from "../../observer/run-routes.js";
|
|
3
|
-
import { HOOK_MEMBERS, withHookOverrides } from "../../lab/bag-overrides.js";
|
|
4
3
|
/**
|
|
5
|
-
* Incremental live flush
|
|
4
|
+
* Incremental live flush: as each participant's loop reports its recorded-so-far items,
|
|
6
5
|
* rewrite the in-progress bundle with per-stream `liveActor` partials so the attached
|
|
7
6
|
* Observer's 5s poll sees the timeline grow. Throttled (one write per interval, trailing
|
|
8
7
|
* write guaranteed). `write` is the run's `writeSnapshot`, which serializes writes and refuses
|
|
@@ -12,12 +11,12 @@ import { HOOK_MEMBERS, withHookOverrides } from "../../lab/bag-overrides.js";
|
|
|
12
11
|
export function startLiveTraceFlush(args) {
|
|
13
12
|
const { bundle, participantRuns, model, write } = args;
|
|
14
13
|
const streamIdByParticipant = new Map(participantRuns.map((spec) => [spec.planned.id, spec.streamId]));
|
|
15
|
-
// The persona each
|
|
14
|
+
// The persona each participant is running, so the live flush can say who is in it.
|
|
16
15
|
const personaByStream = new Map(participantRuns
|
|
17
16
|
.map((spec) => [spec.streamId, spec.persona?.id])
|
|
18
17
|
.filter((entry) => typeof entry[1] === "string"));
|
|
19
18
|
const liveItemsByStream = new Map();
|
|
20
|
-
// Running token usage per
|
|
19
|
+
// Running token usage per participant, so a run in flight can price itself instead of reporting the
|
|
21
20
|
// cost as unknown until the moment it ends.
|
|
22
21
|
const liveUsageByStream = new Map();
|
|
23
22
|
const liveMetadataByStream = new Map();
|
|
@@ -43,9 +42,9 @@ export function startLiveTraceFlush(args) {
|
|
|
43
42
|
liveActor: {
|
|
44
43
|
schema: "humanish.live-actor.v1",
|
|
45
44
|
updatedAt,
|
|
46
|
-
//
|
|
47
|
-
// watching a live run can only name the
|
|
48
|
-
//
|
|
45
|
+
// Who this participant is, carried while the run is live. Without it a
|
|
46
|
+
// surface watching a live run can only name the participant id and the stream
|
|
47
|
+
// label (`<participant id> · browser`), which describe the harness, not the participant.
|
|
49
48
|
...(personaByStream.get(stream.id) === undefined
|
|
50
49
|
? {}
|
|
51
50
|
: { persona: { id: personaByStream.get(stream.id) } }),
|
|
@@ -114,34 +113,27 @@ export function startLiveTraceFlush(args) {
|
|
|
114
113
|
return { flush, stop };
|
|
115
114
|
}
|
|
116
115
|
/**
|
|
117
|
-
* The live desktop views (runtime stream URLs)
|
|
116
|
+
* The live desktop views (runtime stream URLs) participants report, attached to whichever Observer shows
|
|
118
117
|
* the run. The URLs carry auth, so they live in memory and on the Observer result, never in run
|
|
119
118
|
* artifacts.
|
|
120
119
|
*/
|
|
121
|
-
export function trackRuntimeStreams(
|
|
120
|
+
export function trackRuntimeStreams(onStream) {
|
|
122
121
|
let liveObserver;
|
|
123
122
|
const urls = [];
|
|
124
123
|
return {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
await hooks.onRuntimeStreamEnded?.(stream);
|
|
135
|
-
// Mark, never remove: the tile needs to KNOW the live view ended (and say so) rather than
|
|
136
|
-
// have the stream silently vanish from the overlay (#357).
|
|
137
|
-
for (const entry of urls) {
|
|
138
|
-
if (entry.streamId === stream.streamId)
|
|
124
|
+
onStream: async (event) => {
|
|
125
|
+
await onStream?.(event);
|
|
126
|
+
if (event.type === "ready")
|
|
127
|
+
urls.push({ streamId: event.streamId, url: event.url });
|
|
128
|
+
// Mark, never remove: the tile needs to know the live view ended (and say so) rather than
|
|
129
|
+
// have the stream silently vanish from the overlay.
|
|
130
|
+
else
|
|
131
|
+
for (const entry of urls)
|
|
132
|
+
if (entry.streamId === event.streamId)
|
|
139
133
|
entry.ended = true;
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
},
|
|
144
|
-
}),
|
|
134
|
+
if (liveObserver)
|
|
135
|
+
attachObserverRuntimeStreamUrls(liveObserver, urls);
|
|
136
|
+
},
|
|
145
137
|
showIn: (observer) => {
|
|
146
138
|
liveObserver = observer;
|
|
147
139
|
},
|
|
@@ -10,10 +10,12 @@ export declare function runLabParticipants(setup: CuaRunSetup, participants: Cua
|
|
|
10
10
|
result: {
|
|
11
11
|
automaticAnalysis?: import("../../analysis/job.js").AutomaticAnalysisOutcome;
|
|
12
12
|
automaticAnalysisTrigger?: "default" | "explicit";
|
|
13
|
-
schema: typeof import("
|
|
13
|
+
schema: typeof import("../../run/study-result.js").STUDY_RESULT_SCHEMA;
|
|
14
|
+
route: "computer-use";
|
|
15
|
+
studyId: string;
|
|
16
|
+
labId: string;
|
|
14
17
|
ok: boolean;
|
|
15
18
|
cwd: string;
|
|
16
|
-
labId: string;
|
|
17
19
|
actor: string;
|
|
18
20
|
appUrl: string;
|
|
19
21
|
dryRun: boolean;
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
// The computer-use run's live phase: the in-progress bundle and its live-trace flush, email
|
|
2
|
-
// receiving, the
|
|
2
|
+
// receiving, the participants themselves, and the drain of an operator-hosted inbox.
|
|
3
3
|
import { prepareReceivingRun } from "../../comms/receiving-runtime.js";
|
|
4
4
|
import { liveObserverResult } from "../../observer/live.js";
|
|
5
5
|
import { pricedModel } from "../../lab/plan-base.js";
|
|
6
|
-
import { runAllCuaParticipants } from "./
|
|
6
|
+
import { runAllCuaParticipants } from "./participant-execution.js";
|
|
7
7
|
import { startLiveTraceFlush } from "./live-flush.js";
|
|
8
8
|
import { drainExternalComms } from "./external-comms.js";
|
|
9
9
|
import { buildCuaRunBundle, judgeComputerUseRun } from "./bundle.js";
|
|
10
|
-
import {} from "./types.js";
|
|
10
|
+
import { participantSubjectEnv } from "./types.js";
|
|
11
11
|
/**
|
|
12
12
|
* Runs the participants (a dry run runs none). Returns the refusal when real email setup fails, or
|
|
13
13
|
* the participant outcomes and the warnings the finish records.
|
|
14
14
|
*/
|
|
15
15
|
export async function runLabParticipants(setup, participants) {
|
|
16
|
-
const { plan, input, cwd, streams, descriptor,
|
|
17
|
-
const { participantRuns, participantPlan,
|
|
16
|
+
const { plan, input, cwd, streams, descriptor, run } = setup;
|
|
17
|
+
const { participantRuns, participantPlan, bundleBase } = setup;
|
|
18
18
|
const { env, knownSecretValues, deps, liveTrace, externalComms, inProgress, fail } = participants;
|
|
19
19
|
const { dryRun } = plan;
|
|
20
|
-
const
|
|
20
|
+
const inProcess = plan.runner.desktop === "in-process";
|
|
21
|
+
const subjectEnvNames = [...participantSubjectEnv(plan.runner.subject)];
|
|
21
22
|
const { runId, paths: runPaths } = run;
|
|
22
|
-
// A live run writes what it is doing
|
|
23
|
-
// This
|
|
24
|
-
// run launched by an agent (`lab run --json`), detached, or from the terminal surface
|
|
25
|
-
// nothing at all until it
|
|
23
|
+
// A live run writes what it is doing as it does it, whether or not anyone is currently watching.
|
|
24
|
+
// This is not gated on `options.onObserverReady` (the interactive Observer callback): gated, a
|
|
25
|
+
// run launched by an agent (`lab run --json`), detached, or from the terminal surface records
|
|
26
|
+
// nothing at all until it completes, and anything asking "what is this participant doing right
|
|
26
27
|
// now" got silence for the whole run. Who reads the evidence is not the run's business; the
|
|
27
28
|
// callback below stays conditional, the writing does not.
|
|
28
29
|
if (!dryRun) {
|
|
@@ -46,7 +47,7 @@ export async function runLabParticipants(setup, participants) {
|
|
|
46
47
|
streams.showIn(liveObserver);
|
|
47
48
|
if (input.onObserverReady)
|
|
48
49
|
await input.onObserverReady(liveObserver);
|
|
49
|
-
// Incremental live flush
|
|
50
|
+
// Incremental live flush: as each participant's loop reports its recorded-so-far items,
|
|
50
51
|
// rewrite the in-progress bundle with per-stream `liveActor` partials so the attached
|
|
51
52
|
// Observer's 5s poll sees the timeline grow. The run refuses any snapshot once the final
|
|
52
53
|
// write began; the route stops the flush timer on every exit below.
|
|
@@ -90,18 +91,18 @@ export async function runLabParticipants(setup, participants) {
|
|
|
90
91
|
return {
|
|
91
92
|
ok: false,
|
|
92
93
|
result: {
|
|
93
|
-
...fail("
|
|
94
|
+
...fail("HUMANISH_COMPUTER_USE_SUBJECT_INVALID", "Real email setup failed before desktop allocation. Run humanish comms check --online and humanish comms recover to inspect authentication and pending cleanup.", descriptor.id),
|
|
94
95
|
runId,
|
|
95
96
|
},
|
|
96
97
|
};
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
|
-
// Run
|
|
100
|
+
// Run the participants (dry-run runs none). In-process is always one.
|
|
100
101
|
let outcomes;
|
|
101
102
|
let failFastReason;
|
|
102
103
|
try {
|
|
103
104
|
if (!dryRun)
|
|
104
|
-
({ outcomes, failFastReason } = await runAllCuaParticipants(participantRuns, deps, participantPlan,
|
|
105
|
+
({ outcomes, failFastReason } = await runAllCuaParticipants(participantRuns, deps, participantPlan, inProcess));
|
|
105
106
|
}
|
|
106
107
|
finally {
|
|
107
108
|
try {
|
|
@@ -110,7 +111,7 @@ export async function runLabParticipants(setup, participants) {
|
|
|
110
111
|
catch {
|
|
111
112
|
receivingWarnings.push("Email finalization could not complete. Inspect humanish comms recover; provider cleanup remains unresolved.");
|
|
112
113
|
}
|
|
113
|
-
// Stop the flush timer on every exit, including a throw from the
|
|
114
|
+
// Stop the flush timer on every exit, including a throw from the participants.
|
|
114
115
|
await liveTrace.stop?.();
|
|
115
116
|
}
|
|
116
117
|
const externalCommsWarnings = !dryRun && externalComms && outcomes !== undefined
|
|
@@ -121,7 +122,7 @@ export async function runLabParticipants(setup, participants) {
|
|
|
121
122
|
runPaths,
|
|
122
123
|
participantRuns: participantRuns,
|
|
123
124
|
outcomes,
|
|
124
|
-
|
|
125
|
+
knownSecretValues,
|
|
125
126
|
})
|
|
126
127
|
: [];
|
|
127
128
|
return {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { LabConfig } from "../../lab/types.js";
|
|
2
2
|
import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
3
|
-
import {
|
|
3
|
+
import type { LabDeps } from "../../lab/lab-deps.js";
|
|
4
4
|
/**
|
|
5
5
|
* Pack the working tree for a local-tree run and report what left the host on stderr, by counts
|
|
6
6
|
* and digest only, never paths or file names.
|
|
7
7
|
*/
|
|
8
|
-
export declare function packRunLocalTree(
|
|
8
|
+
export declare function packRunLocalTree(deps: LabDeps, config: {
|
|
9
9
|
readonly subject: Pick<LabConfig["subject"], "localTree">;
|
|
10
10
|
}, cwd: string): Promise<{
|
|
11
11
|
archive: LocalTreeArchive;
|
|
@@ -14,7 +14,7 @@ export declare function packRunLocalTree(hooks: CuaActorLabHooks, config: {
|
|
|
14
14
|
/**
|
|
15
15
|
* Default local-tree packing implementation: createLocalTreeArchive(root, opts) on the host,
|
|
16
16
|
* then a single read of the produced archive file into an ArrayBuffer for upload. The DI seam
|
|
17
|
-
* (
|
|
17
|
+
* (LabDeps.packLocalTree) overrides this in deterministic tests so they never require
|
|
18
18
|
* tar/git.
|
|
19
19
|
*/
|
|
20
20
|
export declare function defaultPackLocalTree(args: {
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
// Packing the project's working tree once per local-tree run, on the host, for every
|
|
1
|
+
// Packing the project's working tree once per local-tree run, on the host, for every participant to upload.
|
|
2
2
|
import { readFile, rm } from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { createLocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
5
|
-
import {} from "./types.js";
|
|
6
5
|
/**
|
|
7
6
|
* Pack the working tree for a local-tree run and report what left the host on stderr, by counts
|
|
8
7
|
* and digest only, never paths or file names.
|
|
9
8
|
*/
|
|
10
|
-
export async function packRunLocalTree(
|
|
11
|
-
const packLocalTree =
|
|
9
|
+
export async function packRunLocalTree(deps, config, cwd) {
|
|
10
|
+
const packLocalTree = deps.packLocalTree ?? defaultPackLocalTree;
|
|
12
11
|
const packed = await packLocalTree({
|
|
13
12
|
root: cwd,
|
|
14
13
|
...(config.subject.localTree?.exclude === undefined
|
|
@@ -25,7 +24,7 @@ export async function packRunLocalTree(hooks, config, cwd) {
|
|
|
25
24
|
/**
|
|
26
25
|
* Default local-tree packing implementation: createLocalTreeArchive(root, opts) on the host,
|
|
27
26
|
* then a single read of the produced archive file into an ArrayBuffer for upload. The DI seam
|
|
28
|
-
* (
|
|
27
|
+
* (LabDeps.packLocalTree) overrides this in deterministic tests so they never require
|
|
29
28
|
* tar/git.
|
|
30
29
|
*/
|
|
31
30
|
export async function defaultPackLocalTree(args) {
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { InternalRunLabOptions } from "../../run-lab.js";
|
|
2
2
|
import type { LabConfig } from "../../lab/types.js";
|
|
3
|
+
import type { LocalVmInput } from "./types.js";
|
|
3
4
|
import { type LocalFirecrackerAssets } from "../../substrates/local/firecracker-desktop.js";
|
|
4
|
-
type
|
|
5
|
+
type LocalVmRunOptions = InternalRunLabOptions & {
|
|
5
6
|
config: LabConfig;
|
|
6
7
|
assets?: LocalFirecrackerAssets;
|
|
7
8
|
signal?: AbortSignal;
|
|
8
9
|
};
|
|
9
|
-
/** A local browser study's bindings, and the cleanup of what its
|
|
10
|
-
export interface
|
|
11
|
-
/** The caller's runLab options with
|
|
12
|
-
readonly options:
|
|
10
|
+
/** A local browser study's bindings, and the cleanup of what its participants started. */
|
|
11
|
+
export interface LocalVmRun {
|
|
12
|
+
/** The caller's runLab options, with the account provider when the study runs one. */
|
|
13
|
+
readonly options: InternalRunLabOptions;
|
|
14
|
+
/** The desktop, the analysis gate and the abort signal the computer-use run takes. */
|
|
15
|
+
readonly localVm: LocalVmInput;
|
|
13
16
|
close(): Promise<void>;
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* Local desktop/provider composition: the options the lab is planned and run with. It throws before
|
|
17
|
-
* anything starts on a lab the local study cannot run
|
|
20
|
+
* anything starts on a lab the local study cannot run.
|
|
18
21
|
*/
|
|
19
|
-
export declare function
|
|
22
|
+
export declare function prepareLocalVmRun(options: LocalVmRunOptions): LocalVmRun;
|
|
20
23
|
export {};
|
|
@@ -1,30 +1,16 @@
|
|
|
1
1
|
import { collectDesktopRecording } from "../../evidence/desktop-recording-artifact.js";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { inboxRecipientFor,
|
|
4
|
-
import { HOOK_MEMBERS, withHookOverrides } from "../../lab/bag-overrides.js";
|
|
5
|
-
import { runCuaActorSession } from "../../actors/computer-use/actor.js";
|
|
3
|
+
import { inboxRecipientFor, } from "./participant-desktop.js";
|
|
6
4
|
import { createLocalFirecrackerDesktop, } from "../../substrates/local/firecracker-desktop.js";
|
|
7
5
|
import { localBrowserDefaults, localBrowserUnsupportedReason, } from "../../substrates/local/runtime-config.js";
|
|
8
6
|
import { prepareLocalRuntime } from "../../substrates/local/runtime.js";
|
|
7
|
+
import { dockerCommandLine } from "../../substrates/local/runtime-host.js";
|
|
9
8
|
import { checkRestrictedCodexAnalysisReadiness } from "../../analysis/restricted-codex.js";
|
|
10
9
|
import { createRestrictedCodexParticipant } from "../../actors/codex/restricted-participant.js";
|
|
10
|
+
import { withCloseReport } from "./participant-model.js";
|
|
11
11
|
import { guestMediaConfigSchema } from "../../guest/media-config.js";
|
|
12
12
|
import { startLocalCapturedInbox } from "../../substrates/local/captured-inbox.js";
|
|
13
|
-
|
|
14
|
-
// Firecracker desktop and never calls them, so a caller relying on one gets an error up front.
|
|
15
|
-
const e2bDesktopHooks = [
|
|
16
|
-
"prepareDesktop",
|
|
17
|
-
"loadDesktopModule",
|
|
18
|
-
"onRuntimeStreamReady",
|
|
19
|
-
"packLocalTree",
|
|
20
|
-
];
|
|
21
|
-
function refuseE2BDesktopHooks(hooks) {
|
|
22
|
-
const present = e2bDesktopHooks.filter((name) => hooks?.[name] !== undefined);
|
|
23
|
-
if (present.length === 0)
|
|
24
|
-
return;
|
|
25
|
-
throw new Error(`A local browser study runs on a Firecracker desktop and does not call ${present.map((name) => `cuaHooks.${name}`).join(", ")}. These hooks apply only to E2B desktops.`);
|
|
26
|
-
}
|
|
27
|
-
function studyMedia(config) {
|
|
13
|
+
function guestMedia(config) {
|
|
28
14
|
const declaredMedia = config.execution?.desktop?.media;
|
|
29
15
|
return declaredMedia === undefined
|
|
30
16
|
? undefined
|
|
@@ -34,13 +20,13 @@ function studyMedia(config) {
|
|
|
34
20
|
});
|
|
35
21
|
}
|
|
36
22
|
/** The runtime image, prepared once per study on first use, after the account check. */
|
|
37
|
-
function
|
|
23
|
+
function guestAssets(options, account, needsMedia) {
|
|
38
24
|
let preparing;
|
|
39
25
|
return () => (preparing ??= (async () => {
|
|
40
26
|
if (account) {
|
|
41
27
|
const readiness = await checkRestrictedCodexAnalysisReadiness({ timeoutMs: 5000 });
|
|
42
28
|
if (!readiness.ready)
|
|
43
|
-
throw new Error(`Codex account is not ready (${readiness.errorCode}). Run humanish doctor --
|
|
29
|
+
throw new Error(`Codex account is not ready (${readiness.errorCode}). Run humanish doctor --study <study> before starting a local study.`);
|
|
44
30
|
}
|
|
45
31
|
return (options.assets ??
|
|
46
32
|
(await prepareLocalRuntime({
|
|
@@ -64,7 +50,7 @@ function mediaEvidence(media) {
|
|
|
64
50
|
},
|
|
65
51
|
};
|
|
66
52
|
}
|
|
67
|
-
/** One
|
|
53
|
+
/** One participant's Firecracker desktop and optional captured inbox, released in finalize. */
|
|
68
54
|
function createLocalParticipantDesktop(context, run, warnings, artifactRoot) {
|
|
69
55
|
const { config, media, recording, state } = context;
|
|
70
56
|
let session;
|
|
@@ -132,7 +118,14 @@ function createLocalParticipantDesktop(context, run, warnings, artifactRoot) {
|
|
|
132
118
|
}
|
|
133
119
|
if (!evidence.released) {
|
|
134
120
|
state.cleanupUnconfirmed = true;
|
|
135
|
-
|
|
121
|
+
const warning = "Local desktop cleanup is unconfirmed.";
|
|
122
|
+
warnings.push(warning);
|
|
123
|
+
// No receipt names a local VM, so the record carries the command that removes it.
|
|
124
|
+
evidence.sandboxRelease = {
|
|
125
|
+
state: "unconfirmed",
|
|
126
|
+
warning,
|
|
127
|
+
recovery: `If container ${session.resourceId} is still listed by \`${dockerCommandLine(["ps"])}\`, remove it with \`${dockerCommandLine(["rm", "--force", "--volumes", session.resourceId])}\`.`,
|
|
128
|
+
};
|
|
136
129
|
}
|
|
137
130
|
})());
|
|
138
131
|
},
|
|
@@ -141,40 +134,37 @@ function createLocalParticipantDesktop(context, run, warnings, artifactRoot) {
|
|
|
141
134
|
}
|
|
142
135
|
/** The Codex account participant, whose unconfirmed cleanup blocks the study's analysis. */
|
|
143
136
|
function accountProvider(state) {
|
|
144
|
-
return {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
137
|
+
return async ({ executor }) => {
|
|
138
|
+
const participant = createRestrictedCodexParticipant({
|
|
139
|
+
speechEnabled: executor.speechEnabled === true,
|
|
140
|
+
});
|
|
141
|
+
state.participants.push(participant);
|
|
142
|
+
const provider = Object.assign(participant.provider, {
|
|
143
|
+
async close() {
|
|
144
|
+
if ((await participant.close()).status !== "confirmed") {
|
|
145
|
+
state.cleanupUnconfirmed = true;
|
|
146
|
+
throw new Error("Local participant cleanup is unconfirmed.");
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
// The participant runner reads the session's warnings and late refusal from the same, idempotent close.
|
|
151
|
+
return withCloseReport(provider, () => participant.close());
|
|
159
152
|
};
|
|
160
153
|
}
|
|
161
154
|
/**
|
|
162
155
|
* Local desktop/provider composition: the options the lab is planned and run with. It throws before
|
|
163
|
-
* anything starts on a lab the local study cannot run
|
|
156
|
+
* anything starts on a lab the local study cannot run.
|
|
164
157
|
*/
|
|
165
|
-
export function
|
|
158
|
+
export function prepareLocalVmRun(options) {
|
|
166
159
|
const config = localBrowserDefaults(options.config);
|
|
167
160
|
const unsupported = localBrowserUnsupportedReason(config);
|
|
168
161
|
if (unsupported)
|
|
169
162
|
throw new Error(unsupported);
|
|
170
|
-
refuseE2BDesktopHooks(options.cuaHooks);
|
|
171
163
|
const recording = config.execution?.desktop?.recording;
|
|
172
|
-
const media =
|
|
173
|
-
const callerHooks = options.cuaHooks;
|
|
164
|
+
const media = guestMedia(config);
|
|
174
165
|
// A caller-supplied provider replaces the Codex account participant, so the account is
|
|
175
166
|
// neither checked nor used.
|
|
176
|
-
const account = config.actors[0]?.type === "local-agent" &&
|
|
177
|
-
const baseRunSession = callerHooks?.runSession ?? runCuaActorSession;
|
|
167
|
+
const account = config.actors[0]?.type === "local-agent" && options.createProvider === undefined;
|
|
178
168
|
const state = { sessions: [], participants: [], cleanupUnconfirmed: false };
|
|
179
169
|
const context = {
|
|
180
170
|
config,
|
|
@@ -182,33 +172,16 @@ export function prepareLocalVmStudy(options) {
|
|
|
182
172
|
signal: options.signal,
|
|
183
173
|
media,
|
|
184
174
|
recording,
|
|
185
|
-
assets:
|
|
175
|
+
assets: guestAssets(options, account, media !== undefined || recording !== undefined),
|
|
186
176
|
state,
|
|
187
177
|
};
|
|
188
178
|
const { config: _config, assets: _assets, signal: _signal, ...runOptions } = options;
|
|
189
179
|
return {
|
|
190
|
-
options: {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (state.cleanupUnconfirmed)
|
|
196
|
-
throw new Error("Local study cleanup is unconfirmed.");
|
|
197
|
-
return options.automaticAnalysis?.onStart?.();
|
|
198
|
-
},
|
|
199
|
-
}),
|
|
200
|
-
// These overrides go over the caller's hooks so this study's desktop always wins:
|
|
201
|
-
// participantDesktopOf takes [PARTICIPANT_DESKTOP] before a caller's createDesktopLane.
|
|
202
|
-
// The caller's bag may be a class instance, so it is wrapped rather than spread.
|
|
203
|
-
cuaHooks: withHookOverrides(callerHooks, HOOK_MEMBERS.cua, {
|
|
204
|
-
[PARTICIPANT_DESKTOP]: (run, warnings, artifactRoot) => createLocalParticipantDesktop(context, run, warnings, artifactRoot),
|
|
205
|
-
...(account ? accountProvider(state) : {}),
|
|
206
|
-
...(options.signal
|
|
207
|
-
? {
|
|
208
|
-
runSession: (input) => baseRunSession({ ...input, signal: options.signal }),
|
|
209
|
-
}
|
|
210
|
-
: {}),
|
|
211
|
-
}),
|
|
180
|
+
options: account ? { ...runOptions, createProvider: accountProvider(state) } : runOptions,
|
|
181
|
+
localVm: {
|
|
182
|
+
desktop: (run, warnings, artifactRoot) => createLocalParticipantDesktop(context, run, warnings, artifactRoot),
|
|
183
|
+
analysisRefusal: () => state.cleanupUnconfirmed ? "AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED" : undefined,
|
|
184
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
212
185
|
},
|
|
213
186
|
async close() {
|
|
214
187
|
await Promise.allSettled(state.participants.map((participant) => participant.close()));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CuaExecutor } from "../../actors/computer-use/loop.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { DesktopParticipantRun, ParticipantRunOutcome } from "./types.js";
|
|
3
3
|
import type { LabCommsEmail, LabCommsRecipient } from "../../lab/types.js";
|
|
4
4
|
import type { PreparedOutputRoot } from "../../run/contained-output.js";
|
|
5
5
|
/** A prepared desktop supplies only participant input/observation and its inbox location. */
|
|
@@ -13,10 +13,10 @@ export interface ReadyParticipantDesktop {
|
|
|
13
13
|
}
|
|
14
14
|
/** Existing bundle fields. Provider-specific facts remain optional and must be measured. */
|
|
15
15
|
export type ParticipantDesktopEvidence = {
|
|
16
|
-
/** The substrate confirmed the desktop was released (an E2B kill or a local VM shutdown). The
|
|
16
|
+
/** The substrate confirmed the desktop was released (an E2B kill or a local VM shutdown). The participant
|
|
17
17
|
* outcome records it as `killed`. */
|
|
18
18
|
released: boolean;
|
|
19
|
-
} & Pick<ParticipantRunOutcome, "sandboxId" | "desktopDurationMs" | "desktopResources" | "streamUrlPresent" | "subjectCommit" | "desktopBrowser" | "desktopGeometry" | "stateStepRecords" | "phaseRecords" | "failureCode" | "commsArtifactPath" | "recording">;
|
|
19
|
+
} & Pick<ParticipantRunOutcome, "sandboxId" | "sandboxRelease" | "desktopDurationMs" | "desktopResources" | "streamUrlPresent" | "subjectCommit" | "desktopBrowser" | "desktopGeometry" | "stateStepRecords" | "phaseRecords" | "failureCode" | "commsArtifactPath" | "recording">;
|
|
20
20
|
/**
|
|
21
21
|
* The desktop one participant runs on, owned from preparation through final evidence collection.
|
|
22
22
|
* Call methods sequentially: prepare, openSession, then finalize in a finally block.
|
|
@@ -38,26 +38,11 @@ export interface ParticipantDesktop {
|
|
|
38
38
|
}
|
|
39
39
|
/** Builds one participant's desktop. The factory must not acquire anything; prepare does. */
|
|
40
40
|
export type ParticipantDesktopFactory = (run: DesktopParticipantRun, warnings: string[], artifactRoot: PreparedOutputRoot) => ParticipantDesktop;
|
|
41
|
-
/**
|
|
42
|
-
*
|
|
43
|
-
* symbol keeps it out of the public CuaActorLabHooks, whose deprecated createDesktopLane takes the
|
|
44
|
-
* flat lane record; withHookOverrides forwards it like any other member of the bag.
|
|
45
|
-
*/
|
|
46
|
-
export declare const PARTICIPANT_DESKTOP: unique symbol;
|
|
47
|
-
/** A hook bag that may carry a study's own desktop factory. */
|
|
48
|
-
export type HooksWithParticipantDesktop = CuaActorLabHooks & {
|
|
49
|
-
readonly [PARTICIPANT_DESKTOP]?: ParticipantDesktopFactory;
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* The desktop factory a run uses: the study's own, else the caller's deprecated createDesktopLane,
|
|
53
|
-
* given the flat view of each run. Undefined means the route provisions its own desktop.
|
|
54
|
-
*/
|
|
55
|
-
export declare function participantDesktopOf(hooks: CuaActorLabHooks): ParticipantDesktopFactory | undefined;
|
|
56
|
-
/** The lane's addressed comms recipient, when one exists — the gate AND the address source for the
|
|
57
|
-
* inbox instruction (#351). A lane told to check an inbox it can never receive into would stall,
|
|
41
|
+
/** The participant's addressed comms recipient, when one exists: the gate and the address source for the
|
|
42
|
+
* inbox instruction. A participant told to check an inbox it can never receive into would stall,
|
|
58
43
|
* so no addressed recipient means no instruction. */
|
|
59
44
|
export declare function inboxRecipientFor(commsEmail: LabCommsEmail, participantId: string): LabCommsRecipient | undefined;
|
|
60
|
-
/** True when a
|
|
61
|
-
* mail the persona will be told to read. Gates the inbox instruction to
|
|
62
|
-
* a
|
|
45
|
+
/** True when a participant has a declared comms recipient with an address, so the drain can actually match the
|
|
46
|
+
* mail the persona will be told to read. Gates the inbox instruction to participants that can receive
|
|
47
|
+
* mail; a participant told to check an inbox it can never receive into would just stall. */
|
|
63
48
|
export declare function participantHasInboxRecipient(commsEmail: LabCommsEmail, participantId: string): boolean;
|
|
@@ -1,33 +1,13 @@
|
|
|
1
|
-
import { legacyHookSpecOf } from "./legacy-lane-spec.js";
|
|
2
1
|
import { recipientParticipantId } from "../../lab/parse/comms.js";
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
* symbol keeps it out of the public CuaActorLabHooks, whose deprecated createDesktopLane takes the
|
|
6
|
-
* flat lane record; withHookOverrides forwards it like any other member of the bag.
|
|
7
|
-
*/
|
|
8
|
-
export const PARTICIPANT_DESKTOP = Symbol("humanish.participantDesktop");
|
|
9
|
-
/**
|
|
10
|
-
* The desktop factory a run uses: the study's own, else the caller's deprecated createDesktopLane,
|
|
11
|
-
* given the flat view of each run. Undefined means the route provisions its own desktop.
|
|
12
|
-
*/
|
|
13
|
-
export function participantDesktopOf(hooks) {
|
|
14
|
-
const own = hooks[PARTICIPANT_DESKTOP];
|
|
15
|
-
if (own !== undefined)
|
|
16
|
-
return own;
|
|
17
|
-
const caller = hooks.createDesktopLane;
|
|
18
|
-
return caller === undefined
|
|
19
|
-
? undefined
|
|
20
|
-
: (run, warnings, artifactRoot) => caller(legacyHookSpecOf(run), warnings, artifactRoot);
|
|
21
|
-
}
|
|
22
|
-
/** The lane's addressed comms recipient, when one exists — the gate AND the address source for the
|
|
23
|
-
* inbox instruction (#351). A lane told to check an inbox it can never receive into would stall,
|
|
2
|
+
/** The participant's addressed comms recipient, when one exists: the gate and the address source for the
|
|
3
|
+
* inbox instruction. A participant told to check an inbox it can never receive into would stall,
|
|
24
4
|
* so no addressed recipient means no instruction. */
|
|
25
5
|
export function inboxRecipientFor(commsEmail, participantId) {
|
|
26
6
|
return (commsEmail.recipients ?? []).find((recipient) => recipientParticipantId(recipient) === participantId && recipient.address !== undefined);
|
|
27
7
|
}
|
|
28
|
-
/** True when a
|
|
29
|
-
* mail the persona will be told to read. Gates the inbox instruction to
|
|
30
|
-
* a
|
|
8
|
+
/** True when a participant has a declared comms recipient with an address, so the drain can actually match the
|
|
9
|
+
* mail the persona will be told to read. Gates the inbox instruction to participants that can receive
|
|
10
|
+
* mail; a participant told to check an inbox it can never receive into would just stall. */
|
|
31
11
|
export function participantHasInboxRecipient(commsEmail, participantId) {
|
|
32
12
|
return inboxRecipientFor(commsEmail, participantId) !== undefined;
|
|
33
13
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type PreparedOutputRoot } from "../../run/contained-output.js";
|
|
2
2
|
import type { CuaParticipantDeps, CuaParticipantPlan, CuaParticipantResult, DesktopParticipantRun, CuaSubjectProjection, ParticipantRunOutcome } from "./types.js";
|
|
3
|
-
/** Build a
|
|
3
|
+
/** Build a participant's writeScreenshot closure: writes under screenshots/<screenshotDir>/ and records
|
|
4
4
|
* the relative path the trace references (screenshots/<name> at N=1; screenshots/<laneId>/<name>
|
|
5
5
|
* at N>1). */
|
|
6
6
|
export declare function makeParticipantWriteScreenshot(artifactRoot: PreparedOutputRoot, spec: {
|
|
@@ -10,26 +10,26 @@ export declare function makeParticipantWriteScreenshot(artifactRoot: PreparedOut
|
|
|
10
10
|
* evidence and cleanup; this runner owns the model, trace and participant outcome. */
|
|
11
11
|
export declare function runCuaParticipant(spec: DesktopParticipantRun, deps: CuaParticipantDeps): Promise<ParticipantRunOutcome>;
|
|
12
12
|
/**
|
|
13
|
-
* Run N>1 E2B
|
|
14
|
-
* start), and session fail-fast on
|
|
15
|
-
* pinned reason + a fail-fast event; mission verdicts never trip it).
|
|
16
|
-
*
|
|
13
|
+
* Run N>1 E2B participants with bounded concurrency, a pipeline gate (the first provisions
|
|
14
|
+
* before the rest start), and session fail-fast on harness errors only (queued participants
|
|
15
|
+
* become `blocked` with a pinned reason + a fail-fast event; mission verdicts never trip it).
|
|
16
|
+
* Each participant tears down its own sandbox by id; nothing here ever enumerates.
|
|
17
17
|
*
|
|
18
|
-
* Exported for the
|
|
19
|
-
*
|
|
18
|
+
* Exported for the total-runner tests: the injectable runner lets a test make one participant
|
|
19
|
+
* throw (the exact class the guard exists for) without a live sandbox. Production always uses
|
|
20
20
|
* the default.
|
|
21
21
|
*/
|
|
22
22
|
export declare function runCuaParticipants(runs: DesktopParticipantRun[], deps: Omit<CuaParticipantDeps, "signalProvisioned">, concurrency: number, runParticipant?: typeof runCuaParticipant): Promise<{
|
|
23
23
|
outcomes: ParticipantRunOutcome[];
|
|
24
24
|
failFastReason?: string;
|
|
25
25
|
}>;
|
|
26
|
-
/** Project one
|
|
26
|
+
/** Project one participant outcome (or a dry-run contract spec) into the public CuaParticipantResult. */
|
|
27
27
|
export declare function toParticipantResult(spec: DesktopParticipantRun, outcome: ParticipantRunOutcome | undefined, subject: CuaSubjectProjection, dryRun: boolean): CuaParticipantResult;
|
|
28
28
|
/**
|
|
29
|
-
* Run every
|
|
30
|
-
* hosted
|
|
29
|
+
* Run every participant of a live run. The in-process route drives its single participant in this
|
|
30
|
+
* process; one hosted participant runs alone; a fan-out runs at the plan's concurrency and may stop early.
|
|
31
31
|
*/
|
|
32
|
-
export declare function runAllCuaParticipants(runs: readonly DesktopParticipantRun[], deps: Omit<CuaParticipantDeps, "signalProvisioned">, participantPlan: CuaParticipantPlan,
|
|
32
|
+
export declare function runAllCuaParticipants(runs: readonly DesktopParticipantRun[], deps: Omit<CuaParticipantDeps, "signalProvisioned">, participantPlan: CuaParticipantPlan, inProcess: boolean): Promise<{
|
|
33
33
|
outcomes: ParticipantRunOutcome[];
|
|
34
34
|
failFastReason: string | undefined;
|
|
35
35
|
}>;
|