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,16 +5,16 @@ import { type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./type
|
|
|
5
5
|
/** The human-readable state story appended to the provenance event (and review.md via it). */
|
|
6
6
|
export declare function describeSubjectState(state: RunSubjectProvenance["state"], dryRun: boolean): string;
|
|
7
7
|
/**
|
|
8
|
-
* Feedback candidates derived from what
|
|
8
|
+
* Feedback candidates derived from what live participants actually reported.
|
|
9
9
|
*
|
|
10
|
-
* A live run's feedback draft
|
|
11
|
-
*
|
|
10
|
+
* A live run's feedback draft comes from these candidates, never from a dry-run template. The
|
|
11
|
+
* candidate worth filing is the one the study produced: a participant
|
|
12
12
|
* who reported friction on the way (the most valuable thing a run captures), or one who stopped
|
|
13
|
-
* trying. A clean pass files nothing here
|
|
14
|
-
* any falls back to
|
|
13
|
+
* trying. A clean pass files nothing here: feedback exists to carry findings, and a run without
|
|
14
|
+
* any falls back to a live summary in the draft layer instead of a template.
|
|
15
15
|
*
|
|
16
|
-
* Everything quoted is already scrub+redacted
|
|
17
|
-
* through redactNarration in the loop
|
|
16
|
+
* Everything quoted is already scrub+redacted (participant messages and `session.reason` pass
|
|
17
|
+
* through redactNarration in the loop) and passes redactText again here as defense-in-depth.
|
|
18
18
|
*/
|
|
19
19
|
export declare function participantFeedbackCandidates(args: {
|
|
20
20
|
runId: string;
|
|
@@ -34,8 +34,8 @@ export declare function participantFeedbackCandidates(args: {
|
|
|
34
34
|
commsArtifactPath?: string;
|
|
35
35
|
}>;
|
|
36
36
|
}): RunFeedbackCandidate[];
|
|
37
|
-
/** Human-readable provenance line for the single-
|
|
38
|
-
* claims "cloned/packed and served"
|
|
37
|
+
/** Human-readable provenance line for the single-participant subject.provenance event:
|
|
38
|
+
* claims "cloned/packed and served" only when it actually happened. */
|
|
39
39
|
export declare function subjectProvenanceMessage(provenance: CuaSubjectProvenanceArg, publicAppUrl: string, dryRun: boolean, hasSession: boolean): string;
|
|
40
40
|
export declare function providerResourcesForOutcome(args: {
|
|
41
41
|
outcome: ParticipantRunOutcome | undefined;
|
|
@@ -14,9 +14,9 @@ export function describeSubjectState(state, dryRun) {
|
|
|
14
14
|
case "seeded":
|
|
15
15
|
return `seeded (${state.seed?.length ?? 0} step(s): ${(state.seed ?? []).map((record) => record.name).join(", ")})`;
|
|
16
16
|
case "unpinned":
|
|
17
|
-
return `
|
|
17
|
+
return `unpinned (external: ${(state.externalEnvNames ?? []).join(", ")})`;
|
|
18
18
|
case "declared-not-run":
|
|
19
|
-
return `declared, not run (${dryRun ? "dry
|
|
19
|
+
return `declared, not run (${dryRun ? "dry run" : "provisioning did not complete"})`;
|
|
20
20
|
case "undeclared":
|
|
21
21
|
return "undeclared";
|
|
22
22
|
case "external-public":
|
|
@@ -24,16 +24,16 @@ export function describeSubjectState(state, dryRun) {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
|
-
* Feedback candidates derived from what
|
|
27
|
+
* Feedback candidates derived from what live participants actually reported.
|
|
28
28
|
*
|
|
29
|
-
* A live run's feedback draft
|
|
30
|
-
*
|
|
29
|
+
* A live run's feedback draft comes from these candidates, never from a dry-run template. The
|
|
30
|
+
* candidate worth filing is the one the study produced: a participant
|
|
31
31
|
* who reported friction on the way (the most valuable thing a run captures), or one who stopped
|
|
32
|
-
* trying. A clean pass files nothing here
|
|
33
|
-
* any falls back to
|
|
32
|
+
* trying. A clean pass files nothing here: feedback exists to carry findings, and a run without
|
|
33
|
+
* any falls back to a live summary in the draft layer instead of a template.
|
|
34
34
|
*
|
|
35
|
-
* Everything quoted is already scrub+redacted
|
|
36
|
-
* through redactNarration in the loop
|
|
35
|
+
* Everything quoted is already scrub+redacted (participant messages and `session.reason` pass
|
|
36
|
+
* through redactNarration in the loop) and passes redactText again here as defense-in-depth.
|
|
37
37
|
*/
|
|
38
38
|
export function participantFeedbackCandidates(args) {
|
|
39
39
|
const candidates = [];
|
|
@@ -59,8 +59,8 @@ export function participantFeedbackCandidates(args) {
|
|
|
59
59
|
persona_id: participant.personaId,
|
|
60
60
|
actor: "computer-use",
|
|
61
61
|
substrate: args.substrate,
|
|
62
|
-
// The participant is reporting on the
|
|
63
|
-
// findings by the three-roles rule. A harness failure never reaches this builder
|
|
62
|
+
// The participant is reporting on the product: friction and abandonment are target-app
|
|
63
|
+
// findings by the three-roles rule. A harness failure never reaches this builder; it is
|
|
64
64
|
// not a participant report.
|
|
65
65
|
failure_owner: "target-app",
|
|
66
66
|
summary,
|
|
@@ -109,12 +109,12 @@ export function participantFeedbackCandidates(args) {
|
|
|
109
109
|
}
|
|
110
110
|
return candidates;
|
|
111
111
|
}
|
|
112
|
-
/** Human-readable provenance line for the single-
|
|
113
|
-
* claims "cloned/packed and served"
|
|
112
|
+
/** Human-readable provenance line for the single-participant subject.provenance event:
|
|
113
|
+
* claims "cloned/packed and served" only when it actually happened. */
|
|
114
114
|
export function subjectProvenanceMessage(provenance, publicAppUrl, dryRun, hasSession) {
|
|
115
115
|
if (provenance.source === "clone") {
|
|
116
116
|
if (dryRun) {
|
|
117
|
-
return `Subject declared: clone of ${provenance.repo}, to be served at ${publicAppUrl} in-sandbox (dry
|
|
117
|
+
return `Subject declared: clone of ${provenance.repo}, to be served at ${publicAppUrl} in-sandbox (dry run; nothing cloned)`;
|
|
118
118
|
}
|
|
119
119
|
if (provenance.commit) {
|
|
120
120
|
return hasSession
|
|
@@ -124,7 +124,7 @@ export function subjectProvenanceMessage(provenance, publicAppUrl, dryRun, hasSe
|
|
|
124
124
|
return `Subject clone attempted from ${provenance.repo}; commit unresolved (provisioning failed before resolution)`;
|
|
125
125
|
}
|
|
126
126
|
if (dryRun) {
|
|
127
|
-
return `Subject declared: local working tree, to be packed and served at ${publicAppUrl} in-sandbox (dry
|
|
127
|
+
return `Subject declared: local working tree, to be packed and served at ${publicAppUrl} in-sandbox (dry run; nothing packed)`;
|
|
128
128
|
}
|
|
129
129
|
if (provenance.archiveSha256) {
|
|
130
130
|
const dirtyLabel = provenance.dirty === true
|
|
@@ -149,14 +149,21 @@ export function providerResourcesForOutcome(args) {
|
|
|
149
149
|
kind: "sandbox",
|
|
150
150
|
id: args.outcome.sandboxId,
|
|
151
151
|
owner: "humanish",
|
|
152
|
-
|
|
152
|
+
// Only a sandbox kept on purpose is known to be running; an unconfirmed release may or may
|
|
153
|
+
// not have stopped it.
|
|
154
|
+
status: args.outcome.killed
|
|
155
|
+
? "killed"
|
|
156
|
+
: args.outcome.sandboxRelease?.state === "retained"
|
|
157
|
+
? "running"
|
|
158
|
+
: "unknown",
|
|
153
159
|
...participantResourceIds(args.ids, args.participantId),
|
|
154
160
|
createdAt: args.createdAt,
|
|
155
161
|
cleanup: {
|
|
156
162
|
killed: args.outcome.killed,
|
|
157
163
|
reason: args.outcome.killed
|
|
158
164
|
? "killed during normal participant teardown"
|
|
159
|
-
:
|
|
165
|
+
: (args.outcome.sandboxRelease?.warning ??
|
|
166
|
+
"not killed during normal participant teardown; cleanup may reclaim by exact recorded id"),
|
|
160
167
|
},
|
|
161
168
|
},
|
|
162
169
|
];
|
|
@@ -1,32 +1,25 @@
|
|
|
1
1
|
import type { CuaActorDescriptor } from "../../actors/registry.js";
|
|
2
2
|
import type { ComputerUsePlan } from "../../lab/plan-types.js";
|
|
3
|
-
import type { RunBundle, RunRerunLineage } from "../../run/bundle.js";
|
|
4
|
-
import type { RunLabProvenance } from "../../run/status.js";
|
|
3
|
+
import type { BundleRun, RunBundle, RunRerunLineage } from "../../run/bundle.js";
|
|
5
4
|
import { type Judgment } from "../../run/judge.js";
|
|
6
5
|
import type { CuaParticipantPlan, DesktopParticipantRun, CuaSubjectProjection, CuaSubjectProvenanceArg, ParticipantRunOutcome } from "./types.js";
|
|
7
6
|
/** What every bundle of one run shares, in progress or final. */
|
|
8
7
|
export interface CuaRunBundleBase {
|
|
9
|
-
|
|
8
|
+
/** The run every bundle of it belongs to. */
|
|
9
|
+
run: BundleRun;
|
|
10
10
|
participantRuns: DesktopParticipantRun[];
|
|
11
11
|
descriptor: CuaActorDescriptor;
|
|
12
12
|
appUrl: string;
|
|
13
|
-
createdAt: string;
|
|
14
13
|
plan: ComputerUsePlan;
|
|
15
|
-
runId: string;
|
|
16
14
|
source: RunBundle["source"];
|
|
17
15
|
participantPlan: CuaParticipantPlan;
|
|
18
16
|
rerun?: RunRerunLineage;
|
|
19
17
|
redactScreenshots: boolean;
|
|
20
|
-
inProcessRoute: boolean;
|
|
21
|
-
localAppSubject: boolean;
|
|
22
|
-
cloneRoute: boolean;
|
|
23
|
-
localTreeRoute: boolean;
|
|
24
18
|
publicRepo?: string;
|
|
25
|
-
subjectEnvNames: string[];
|
|
26
19
|
}
|
|
27
20
|
/**
|
|
28
21
|
* The judgment for the current state of a computer-use run, by the rule for its shape: one
|
|
29
|
-
* participant (its tallied status is the verdict) or several (every
|
|
22
|
+
* participant (its tallied status is the verdict) or several (every participant must pass). The bundle's
|
|
30
23
|
* verdict and the lab result's ok both come from it.
|
|
31
24
|
*/
|
|
32
25
|
export declare function judgeComputerUseRun(base: Pick<CuaRunBundleBase, "participantRuns" | "rerun">, state: {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// and buildCuaRunBundle sends it to the single-participant or the fan-out builder with that
|
|
3
3
|
// shape's arguments. renderCuaReviewMarkdown writes review.md. shared-world/bundle.ts holds the
|
|
4
4
|
// same for that route.
|
|
5
|
-
import { judgeOneParticipant, judgeParticipants } from "../../run/judge.js";
|
|
5
|
+
import { judgeOneParticipant, judgeParticipants, verdictText, } from "../../run/judge.js";
|
|
6
6
|
import { desktopSpanToMinutes } from "../../run/cost-summary.js";
|
|
7
7
|
import { e2bDesktopTemplate } from "../../substrates/e2b/sandbox.js";
|
|
8
8
|
import { providerResourcesForOutcome } from "./bundle-parts.js";
|
|
@@ -15,7 +15,7 @@ function isOneParticipantRun(base) {
|
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* The judgment for the current state of a computer-use run, by the rule for its shape: one
|
|
18
|
-
* participant (its tallied status is the verdict) or several (every
|
|
18
|
+
* participant (its tallied status is the verdict) or several (every participant must pass). The bundle's
|
|
19
19
|
* verdict and the lab result's ok both come from it.
|
|
20
20
|
*/
|
|
21
21
|
export function judgeComputerUseRun(base, state) {
|
|
@@ -41,31 +41,25 @@ export function judgeComputerUseRun(base, state) {
|
|
|
41
41
|
* the participant plan and each participant's subject. Both argument mappings are here.
|
|
42
42
|
*/
|
|
43
43
|
export function buildCuaRunBundle(base, state) {
|
|
44
|
-
const lab = base.lab === undefined ? {} : { lab: base.lab };
|
|
45
44
|
const inProgress = state.inProgress === undefined ? {} : { inProgress: true };
|
|
46
45
|
if (isOneParticipantRun(base))
|
|
47
46
|
return buildSingleParticipantBundle(singleParticipantArgs(base, state));
|
|
48
47
|
return buildCuaFanoutBundle({
|
|
49
48
|
verdict: state.judgment.verdict,
|
|
50
|
-
|
|
49
|
+
run: base.run,
|
|
51
50
|
specs: base.participantRuns,
|
|
52
51
|
...(state.outcomes === undefined ? {} : { outcomes: state.outcomes }),
|
|
53
52
|
subjects: state.subjects,
|
|
54
53
|
aggregateSubject: state.aggregateSubject,
|
|
55
54
|
descriptor: base.descriptor,
|
|
56
55
|
appUrl: base.appUrl,
|
|
57
|
-
createdAt: base.createdAt,
|
|
58
56
|
dryRun: state.dryRun,
|
|
59
57
|
plan: base.plan,
|
|
60
|
-
runId: base.runId,
|
|
61
58
|
source: base.source,
|
|
62
59
|
participantPlan: base.participantPlan,
|
|
63
60
|
...(base.rerun === undefined ? {} : { rerun: base.rerun }),
|
|
64
61
|
...(state.failFastReason === undefined ? {} : { failFastReason: state.failFastReason }),
|
|
65
|
-
cloneRoute: base.cloneRoute,
|
|
66
|
-
localTreeRoute: base.localTreeRoute,
|
|
67
62
|
...(base.publicRepo === undefined ? {} : { publicRepo: base.publicRepo }),
|
|
68
|
-
subjectEnvNames: base.subjectEnvNames,
|
|
69
63
|
...inProgress,
|
|
70
64
|
});
|
|
71
65
|
}
|
|
@@ -78,7 +72,7 @@ function singleParticipantArgs(base, state) {
|
|
|
78
72
|
return {
|
|
79
73
|
verdict: state.judgment.verdict,
|
|
80
74
|
realEmail: plan.residual.comms?.email?.kind === "real",
|
|
81
|
-
|
|
75
|
+
run: base.run,
|
|
82
76
|
actorId: base.descriptor.id,
|
|
83
77
|
appUrl: spec.planned.targetUrl ?? base.appUrl,
|
|
84
78
|
participantId: spec.planned.id,
|
|
@@ -89,7 +83,6 @@ function singleParticipantArgs(base, state) {
|
|
|
89
83
|
...(spec.planned.labels.caseGroup === undefined
|
|
90
84
|
? {}
|
|
91
85
|
: { caseGroup: spec.planned.labels.caseGroup }),
|
|
92
|
-
createdAt: base.createdAt,
|
|
93
86
|
dryRun: state.dryRun,
|
|
94
87
|
labId: plan.labId,
|
|
95
88
|
...(plan.title ? { labTitle: plan.title } : {}),
|
|
@@ -97,8 +90,8 @@ function singleParticipantArgs(base, state) {
|
|
|
97
90
|
...(spec.evidenceAssignment === undefined ? {} : { assignment: spec.evidenceAssignment }),
|
|
98
91
|
persona: spec.persona,
|
|
99
92
|
resolution: spec.planned.device.resolution,
|
|
100
|
-
desktopRoute:
|
|
101
|
-
substrate: base.
|
|
93
|
+
desktopRoute: base.plan.runner.desktop !== "in-process",
|
|
94
|
+
substrate: base.plan.runner.desktop === "in-process"
|
|
102
95
|
? "local-filesystem"
|
|
103
96
|
: plan.residual.execution?.target === "local"
|
|
104
97
|
? "local-desktop"
|
|
@@ -106,7 +99,6 @@ function singleParticipantArgs(base, state) {
|
|
|
106
99
|
...(outcome?.desktopGeometry === undefined ? {} : { desktopGeometry: outcome.desktopGeometry }),
|
|
107
100
|
...(outcome?.recording === undefined ? {} : { recording: outcome.recording }),
|
|
108
101
|
isMobile: spec.planned.device.preset.isMobile,
|
|
109
|
-
runId: base.runId,
|
|
110
102
|
screenshots: outcome?.screenshots ?? [],
|
|
111
103
|
captureRedaction: base.redactScreenshots ? "blurred" : "raw",
|
|
112
104
|
...(outcome?.session ? { session: outcome.session } : {}),
|
|
@@ -129,11 +121,13 @@ function singleParticipantArgs(base, state) {
|
|
|
129
121
|
...(outcome?.desktopBrowser === undefined ? {} : { desktopBrowser: outcome.desktopBrowser }),
|
|
130
122
|
providerResources: providerResourcesForOutcome({
|
|
131
123
|
outcome,
|
|
132
|
-
createdAt: base.createdAt,
|
|
124
|
+
createdAt: base.run.createdAt,
|
|
133
125
|
ids: spec,
|
|
134
126
|
participantId: spec.planned.id,
|
|
135
127
|
}),
|
|
136
|
-
...(base.
|
|
128
|
+
...(base.plan.runner.subject.kind === "local-app" || base.plan.runner.desktop === "in-process"
|
|
129
|
+
? { entryKind: "local-app" }
|
|
130
|
+
: {}),
|
|
137
131
|
...(outcome?.session ? { traceArtifactPath: spec.traceArtifactPath } : {}),
|
|
138
132
|
...(outcome?.commsArtifactPath === undefined
|
|
139
133
|
? {}
|
|
@@ -163,13 +157,13 @@ export function renderCuaReviewMarkdown(bundle) {
|
|
|
163
157
|
"",
|
|
164
158
|
`- run: ${bundle.runId}`,
|
|
165
159
|
`- mode: ${bundle.mode}`,
|
|
166
|
-
`- run gate: ${bundle.review.verdict}`,
|
|
160
|
+
`- run gate: ${verdictText(bundle.review.verdict, bundle.mode)}`,
|
|
167
161
|
`- summary: ${bundle.review.summary}`,
|
|
168
162
|
...(provenance ? [`- subject: ${provenance.message}`] : []),
|
|
169
163
|
...(trace
|
|
170
164
|
? [
|
|
171
165
|
`- actor: ${trace.provider} (${trace.lane}/${trace.protocol})`,
|
|
172
|
-
//
|
|
166
|
+
// Name the trace's actual screenshot mode ("raw" | "blurred"); say
|
|
173
167
|
// nothing when no frames exist ("n/a") rather than claim a redaction that never ran.
|
|
174
168
|
`- evidence: ${trace.items.length} trace item(s), ${trace.counts.screenshots ?? 0} ${trace.redaction.screenshots === "raw" || trace.redaction.screenshots === "blurred"
|
|
175
169
|
? `${trace.redaction.screenshots} screenshot(s)`
|
|
@@ -23,7 +23,7 @@ export declare function cuaParticipantDiagnostics(input: {
|
|
|
23
23
|
noEngagement?: boolean;
|
|
24
24
|
session?: SessionEnding;
|
|
25
25
|
}): CuaDiagnostics;
|
|
26
|
-
/** Each
|
|
26
|
+
/** Each participant retains its details. The summary never borrows the first one's ending for the others. */
|
|
27
27
|
export declare function summarizeCuaDiagnostics(input: {
|
|
28
28
|
dryRun: boolean;
|
|
29
29
|
evidenceInvalid: boolean;
|
|
@@ -54,7 +54,7 @@ export function cuaParticipantDiagnostics(input) {
|
|
|
54
54
|
? { category: "participant_outcome" }
|
|
55
55
|
: { category: "unknown" };
|
|
56
56
|
}
|
|
57
|
-
/** Each
|
|
57
|
+
/** Each participant retains its details. The summary never borrows the first one's ending for the others. */
|
|
58
58
|
export function summarizeCuaDiagnostics(input) {
|
|
59
59
|
if (input.evidenceInvalid)
|
|
60
60
|
return { category: "evidence_invalid" };
|
|
@@ -3,8 +3,8 @@ import { type DeployedCommsCatch } from "../../../comms/sandbox-catch.js";
|
|
|
3
3
|
import type { LabCommsEmail, LabConfig } from "../../../lab/types.js";
|
|
4
4
|
import type { Shell } from "../../../substrates/shell.js";
|
|
5
5
|
import type { ReadyParticipantDesktop } from "../participant-desktop.js";
|
|
6
|
-
import type
|
|
7
|
-
/** A
|
|
6
|
+
import { type E2BDesktopDeps, type DesktopParticipantRun } from "../types.js";
|
|
7
|
+
/** A participant's captured-email wiring, decided from config before the sandbox exists. */
|
|
8
8
|
export interface ParticipantComms {
|
|
9
9
|
readonly email: LabCommsEmail;
|
|
10
10
|
readonly port: number;
|
|
@@ -19,10 +19,10 @@ export interface ParticipantComms {
|
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* On an in-sandbox subject route, redirect the app's email-API sends into an in-sandbox catch
|
|
22
|
-
* (loopback) so its verification mail is
|
|
23
|
-
* lab declares no fake email, which leaves the
|
|
22
|
+
* (loopback) so its verification mail is captured instead of sent to the internet. Undefined when the
|
|
23
|
+
* lab declares no fake email, which leaves the participant unchanged.
|
|
24
24
|
*/
|
|
25
|
-
export declare function planParticipantComms(
|
|
25
|
+
export declare function planParticipantComms(comms: LabConfig["comms"], serveUrl: string | undefined, targetUrl: string, inSandboxSubject: boolean): ParticipantComms | undefined;
|
|
26
26
|
/** The env the subject app reads to reach the catch, injected at sandbox create so it boots with it. */
|
|
27
27
|
export declare function participantCommsEnv(comms: ParticipantComms | undefined): Record<string, string>;
|
|
28
28
|
/** A started catch and the stop for its inbox-surface loop. */
|
|
@@ -37,20 +37,20 @@ export interface RunningCommsCatch {
|
|
|
37
37
|
* rather than silently sending real mail.
|
|
38
38
|
*/
|
|
39
39
|
export declare function startCommsCatch(shell: Shell, comms: ParticipantComms, requestTimeoutMs: number): Promise<RunningCommsCatch>;
|
|
40
|
-
/** Stand up the real-email receiving surface and attach it to the
|
|
41
|
-
export declare function attachReceivingInbox(shell: Shell, spec: DesktopParticipantRun, deps:
|
|
42
|
-
receiving: NonNullable<
|
|
40
|
+
/** Stand up the real-email receiving surface and attach it to the participant; returns the inbox URL. */
|
|
41
|
+
export declare function attachReceivingInbox(shell: Shell, spec: DesktopParticipantRun, deps: E2BDesktopDeps & {
|
|
42
|
+
receiving: NonNullable<E2BDesktopDeps["receiving"]>;
|
|
43
43
|
}, targetUrl: string): Promise<string>;
|
|
44
44
|
/** The inbox the persona is told about: real receiving, the captured catch, or an external inbox. */
|
|
45
45
|
export declare function participantInbox(args: {
|
|
46
46
|
spec: DesktopParticipantRun;
|
|
47
|
-
deps:
|
|
47
|
+
deps: E2BDesktopDeps;
|
|
48
48
|
receivingInboxUrl: string | undefined;
|
|
49
49
|
comms: ParticipantComms | undefined;
|
|
50
50
|
catchReady: boolean;
|
|
51
51
|
}): ReadyParticipantDesktop["inbox"];
|
|
52
52
|
/**
|
|
53
|
-
* Before this
|
|
53
|
+
* Before this participant's sandbox is torn down, drain everything the in-sandbox catch captured, route it
|
|
54
54
|
* into a host fake inbox addressed to the declared recipients, and write the digest-only thread
|
|
55
55
|
* artifact. Returns the artifact path when one was written. A drain failure is a warning and never
|
|
56
56
|
* breaks teardown: the sandbox must still be killed either way.
|
|
@@ -60,6 +60,6 @@ export declare function drainCommsEvidence(args: {
|
|
|
60
60
|
comms: ParticipantComms;
|
|
61
61
|
deployed: DeployedCommsCatch;
|
|
62
62
|
spec: DesktopParticipantRun;
|
|
63
|
-
deps:
|
|
63
|
+
deps: E2BDesktopDeps;
|
|
64
64
|
warnings: string[];
|
|
65
65
|
}): Promise<string | undefined>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Off-app email for one E2B desktop
|
|
1
|
+
// Off-app email for one E2B desktop participant: the in-sandbox catch the subject app sends to, the
|
|
2
2
|
// persona's inbox surface, the real-email receiving surface, and the evidence drained at teardown.
|
|
3
3
|
import { setTimeout as delay } from "node:timers/promises";
|
|
4
4
|
import { buildOriginMap } from "../../../comms/capture-surface.js";
|
|
@@ -8,17 +8,18 @@ import { DEFAULT_SANDBOX_CATCH_PORT, collectCommsThread, deployCommsCatch, refre
|
|
|
8
8
|
import { redactText, toErrorMessage } from "../../../evidence/redaction.js";
|
|
9
9
|
import { writeContainedOutputFile } from "../../../run/contained-output.js";
|
|
10
10
|
import { inboxRecipientFor, participantHasInboxRecipient } from "../participant-desktop.js";
|
|
11
|
+
import { participantServeUrl } from "../types.js";
|
|
11
12
|
import { addressedRecipients } from "../../../lab/parse/comms.js";
|
|
12
13
|
/** Mid-run inbox-surface render cadence (ms). Coarse enough that the per-tick `cat` + file writes stay
|
|
13
14
|
* cheap; fine enough that a verification email is visible seconds after the app sends it. */
|
|
14
15
|
const INBOX_SURFACE_CADENCE_MS = 2500;
|
|
15
16
|
/**
|
|
16
17
|
* On an in-sandbox subject route, redirect the app's email-API sends into an in-sandbox catch
|
|
17
|
-
* (loopback) so its verification mail is
|
|
18
|
-
* lab declares no fake email, which leaves the
|
|
18
|
+
* (loopback) so its verification mail is captured instead of sent to the internet. Undefined when the
|
|
19
|
+
* lab declares no fake email, which leaves the participant unchanged.
|
|
19
20
|
*/
|
|
20
|
-
export function planParticipantComms(
|
|
21
|
-
const email = inSandboxSubject &&
|
|
21
|
+
export function planParticipantComms(comms, serveUrl, targetUrl, inSandboxSubject) {
|
|
22
|
+
const email = inSandboxSubject && comms?.email?.kind === "fake" ? comms.email : undefined;
|
|
22
23
|
if (email === undefined)
|
|
23
24
|
return undefined;
|
|
24
25
|
const port = email.port ?? DEFAULT_SANDBOX_CATCH_PORT;
|
|
@@ -30,9 +31,7 @@ export function planParticipantComms(config, targetUrl, inSandboxSubject) {
|
|
|
30
31
|
smtpPort: email.smtp?.port,
|
|
31
32
|
inboxUrl: `http://127.0.0.1:${port}/inbox`,
|
|
32
33
|
originMap: buildOriginMap({
|
|
33
|
-
...(
|
|
34
|
-
? {}
|
|
35
|
-
: { internalServeUrl: config.subject.serve.url }),
|
|
34
|
+
...(serveUrl === undefined ? {} : { internalServeUrl: serveUrl }),
|
|
36
35
|
reachableBaseUrl: targetUrl,
|
|
37
36
|
...(email.linkOrigin === undefined ? {} : { linkOrigin: email.linkOrigin }),
|
|
38
37
|
}),
|
|
@@ -43,7 +42,7 @@ export function planParticipantComms(config, targetUrl, inSandboxSubject) {
|
|
|
43
42
|
export function participantCommsEnv(comms) {
|
|
44
43
|
if (comms === undefined)
|
|
45
44
|
return {};
|
|
46
|
-
// injectEnv is absent on an adopter-hosted plane
|
|
45
|
+
// injectEnv is absent on an adopter-hosted plane: there is no subject env to inject
|
|
47
46
|
// because the operator points their own app at their own catch.
|
|
48
47
|
const env = comms.email.injectEnv === undefined
|
|
49
48
|
? {}
|
|
@@ -76,23 +75,23 @@ export async function startCommsCatch(shell, comms, requestTimeoutMs) {
|
|
|
76
75
|
if (!deployed.ready) {
|
|
77
76
|
throw new Error(`comms email catch did not become ready on 127.0.0.1:${comms.port} in the subject sandbox`);
|
|
78
77
|
}
|
|
79
|
-
// Write the
|
|
80
|
-
// yet." page
|
|
78
|
+
// Write the empty inbox once up front so the persona's /inbox always resolves to the "No messages
|
|
79
|
+
// yet." page (never a bare 404) the instant it navigates there, even before any mail arrives or if
|
|
81
80
|
// the app sends to an address no declared recipient matches (the loop only re-renders on new mail).
|
|
82
81
|
await writeInboxSurface(shell, deployed.surfaceDir, [], {
|
|
83
82
|
originMap: comms.originMap,
|
|
84
83
|
requestTimeoutMs,
|
|
85
84
|
});
|
|
86
|
-
// The surface uses its
|
|
87
|
-
// readers of the append-only NDJSON
|
|
85
|
+
// The surface uses its own FakeInbox + cursor, independent of the teardown evidence drain (two
|
|
86
|
+
// readers of the append-only NDJSON, so no double-count).
|
|
88
87
|
const stop = new AbortController();
|
|
89
88
|
let renderedCount = 0;
|
|
90
89
|
const loop = (async () => {
|
|
91
90
|
// Render-first (so even a short session gets a populated inbox), then refresh on a cadence. The
|
|
92
|
-
// cadence uses a
|
|
91
|
+
// cadence uses a real timer instead of the injected instant clock: this loop is unbounded, so an instant
|
|
93
92
|
// sleep would busy-spin and starve the session's own timers. `stop` interrupts the wait
|
|
94
93
|
// (and clears the timer) so teardown never blocks for a full cadence. Each refresh
|
|
95
|
-
// is a full, idempotent rebuild; `renderedCount` only advances on a
|
|
94
|
+
// is a full, idempotent rebuild; `renderedCount` only advances on a successful render so a
|
|
96
95
|
// transient failure retries cleanly (no duplicate emails).
|
|
97
96
|
for (;;) {
|
|
98
97
|
try {
|
|
@@ -125,22 +124,20 @@ export async function startCommsCatch(shell, comms, requestTimeoutMs) {
|
|
|
125
124
|
},
|
|
126
125
|
};
|
|
127
126
|
}
|
|
128
|
-
/** Stand up the real-email receiving surface and attach it to the
|
|
127
|
+
/** Stand up the real-email receiving surface and attach it to the participant; returns the inbox URL. */
|
|
129
128
|
export async function attachReceivingInbox(shell, spec, deps, targetUrl) {
|
|
130
|
-
const
|
|
129
|
+
const serveUrl = participantServeUrl(deps.subject);
|
|
131
130
|
const surface = await deployReceivingInbox(shell, {
|
|
132
131
|
leaseId: spec.streamId,
|
|
133
132
|
requestTimeoutMs: Math.min(deps.requestTimeoutMs, 30_000),
|
|
134
133
|
});
|
|
135
|
-
const email =
|
|
134
|
+
const email = deps.residual.comms?.email;
|
|
136
135
|
try {
|
|
137
136
|
await deps.receiving.attach(spec.planned.id, {
|
|
138
137
|
surface,
|
|
139
138
|
allowedOrigins: [...new Set([new URL(targetUrl).origin, ...(email?.allowedOrigins ?? [])])],
|
|
140
139
|
originMap: buildOriginMap({
|
|
141
|
-
...(
|
|
142
|
-
? {}
|
|
143
|
-
: { internalServeUrl: config.subject.serve.url }),
|
|
140
|
+
...(serveUrl === undefined ? {} : { internalServeUrl: serveUrl }),
|
|
144
141
|
reachableBaseUrl: targetUrl,
|
|
145
142
|
...(email?.linkOrigin === undefined ? {} : { linkOrigin: email.linkOrigin }),
|
|
146
143
|
}),
|
|
@@ -177,7 +174,7 @@ export function participantInbox(args) {
|
|
|
177
174
|
return undefined;
|
|
178
175
|
}
|
|
179
176
|
/**
|
|
180
|
-
* Before this
|
|
177
|
+
* Before this participant's sandbox is torn down, drain everything the in-sandbox catch captured, route it
|
|
181
178
|
* into a host fake inbox addressed to the declared recipients, and write the digest-only thread
|
|
182
179
|
* artifact. Returns the artifact path when one was written. A drain failure is a warning and never
|
|
183
180
|
* breaks teardown: the sandbox must still be killed either way.
|
|
@@ -203,19 +200,19 @@ export async function drainCommsEvidence(args) {
|
|
|
203
200
|
return path;
|
|
204
201
|
}
|
|
205
202
|
if (collected.captured > 0) {
|
|
206
|
-
// Captured mail that matched no declared recipient must not vanish silently
|
|
207
|
-
//
|
|
203
|
+
// Captured mail that matched no declared recipient must not vanish silently: tell the
|
|
204
|
+
// operator to declare comms.email.recipients[].address to match
|
|
208
205
|
// the address the app actually sends to (e.g. the one the persona surface will sign up with).
|
|
209
|
-
warnings.push(`
|
|
206
|
+
warnings.push(`The email catch captured ${collected.captured} email send(s), but none matched a declared recipient inbox, so no email evidence was written. Set comms.email.recipients[].address to the address the app sends to.`);
|
|
210
207
|
}
|
|
211
208
|
else {
|
|
212
|
-
// Zero captures is the silent-broken shape
|
|
209
|
+
// Zero captures is the silent-broken shape: the app never posted to the catch at
|
|
213
210
|
// all, so the personas stared at an empty inbox. Most common cause: the app does not
|
|
214
211
|
// actually read the declared injectEnv var for its email API base URL.
|
|
215
212
|
const transportHint = comms.email.smtp
|
|
216
213
|
? `Verify the app reads ${comms.email.smtp.hostEnv}/${comms.email.smtp.portEnv} for its SMTP host and port`
|
|
217
214
|
: `Verify the app reads ${comms.email.injectEnv} for its email API base URL (an SDK that ignores it sends real mail or throws)`;
|
|
218
|
-
warnings.push(`
|
|
215
|
+
warnings.push(`The email catch captured no email sends: the app never delivered mail through it. ${transportHint} and that the flow reached an email step.`);
|
|
219
216
|
}
|
|
220
217
|
}
|
|
221
218
|
catch (error) {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { ParticipantDesktop } from "../participant-desktop.js";
|
|
2
|
-
import type
|
|
3
|
-
export declare function createE2BParticipantDesktop(spec: DesktopParticipantRun, deps:
|
|
2
|
+
import { type E2BDesktopDeps, type DesktopParticipantRun } from "../types.js";
|
|
3
|
+
export declare function createE2BParticipantDesktop(spec: DesktopParticipantRun, deps: E2BDesktopDeps, warnings: string[]): ParticipantDesktop;
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
// E2B owns provisioning and final evidence; the participant runner only uses the ready port. The
|
|
2
|
-
// lane's steps live in prepare.ts, start.ts and teardown.ts beside this file, and fill the state
|
|
3
|
-
// record in state.ts in the order below.
|
|
4
|
-
import { defaultSubjectPhaseSink } from "../../../subject/steps.js";
|
|
5
1
|
import { createE2BDesktopExecutor } from "../../../substrates/e2b/desktop-executor.js";
|
|
6
2
|
import { participantInbox, planParticipantComms } from "./comms.js";
|
|
7
3
|
import { participantBrowserStateObserver } from "./fidelity.js";
|
|
@@ -9,6 +5,7 @@ import { acquireParticipantDesktop, provisionParticipantSubject, verifyParticipa
|
|
|
9
5
|
import { openParticipantSurface, startParticipantMedia, startParticipantStream } from "./start.js";
|
|
10
6
|
import { desktopEvidenceOf, newParticipantState } from "./state.js";
|
|
11
7
|
import { finishE2BDesktop } from "./teardown.js";
|
|
8
|
+
import { participantServeUrl } from "../types.js";
|
|
12
9
|
export function createE2BParticipantDesktop(spec, deps, warnings) {
|
|
13
10
|
const targetUrl = spec.planned.targetUrl ?? deps.appUrl;
|
|
14
11
|
const state = newParticipantState(spec);
|
|
@@ -17,18 +14,18 @@ export function createE2BParticipantDesktop(spec, deps, warnings) {
|
|
|
17
14
|
deps,
|
|
18
15
|
warnings,
|
|
19
16
|
targetUrl,
|
|
20
|
-
desktopCliRoute: deps.
|
|
21
|
-
// Off-app comms
|
|
22
|
-
comms: planParticipantComms(deps.
|
|
17
|
+
desktopCliRoute: deps.subject.kind === "desktop-cli",
|
|
18
|
+
// Off-app comms: gated entirely on config.comms; no comms declared, no change.
|
|
19
|
+
comms: planParticipantComms(deps.residual.comms, participantServeUrl(deps.subject), targetUrl, deps.subject.kind === "clone" || deps.subject.kind === "local-tree"),
|
|
23
20
|
// The default or injected sink sees every event, started and completed alike, so an operator
|
|
24
21
|
// watching stderr sees both halves of each phase; the state keeps only completed ones.
|
|
25
22
|
onSubjectPhase: (event) => {
|
|
26
23
|
if (event.ok !== undefined)
|
|
27
24
|
state.phaseRecords.push(event);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
deps.reportSubjectPhase(event, {
|
|
26
|
+
id: spec.planned.id,
|
|
27
|
+
index: spec.planned.index,
|
|
28
|
+
count: deps.participantCount,
|
|
32
29
|
});
|
|
33
30
|
},
|
|
34
31
|
};
|
|
@@ -1,30 +1,31 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ResidualConfig } from "../../../lab/plan-types.js";
|
|
2
2
|
import type { RunDesktopGeometry } from "../../../run/streams.js";
|
|
3
3
|
import type { DesktopBrowserFamily, DesktopBrowserLaunchIdentity } from "../../../substrates/e2b/desktop-browser.js";
|
|
4
4
|
import { makeChromeBrowserStateObserver } from "../../../substrates/e2b/desktop-cdp.js";
|
|
5
5
|
import { captureDesktopBrowserGeometry } from "../../../substrates/e2b/desktop-geometry.js";
|
|
6
6
|
import type { E2BDesktopSandbox } from "../../../substrates/e2b/sdk.js";
|
|
7
|
-
import type {
|
|
7
|
+
import type { E2BDesktopDeps, DesktopParticipantRun } from "../types.js";
|
|
8
8
|
type BrowserGeometry = Awaited<ReturnType<typeof captureDesktopBrowserGeometry>>;
|
|
9
|
-
/** The mobile emulation a
|
|
9
|
+
/** The mobile emulation a participant applied, updated as later tabs are covered and at teardown. */
|
|
10
10
|
export interface ParticipantFidelity {
|
|
11
11
|
applied: RunDesktopGeometry["fidelity"] | undefined;
|
|
12
12
|
emulatedTargetId: string | undefined;
|
|
13
13
|
holderName: string | undefined;
|
|
14
14
|
}
|
|
15
|
-
/** Only
|
|
16
|
-
export declare function mobileLaunchFlags(
|
|
15
|
+
/** Only participants on a mobile preset are emulated; the flags go on the browser command line. */
|
|
16
|
+
export declare function mobileLaunchFlags(residual: Readonly<ResidualConfig>, spec: DesktopParticipantRun): string[];
|
|
17
17
|
/**
|
|
18
18
|
* Apply mobile fidelity to the launch page before the geometry capture and the participant's first
|
|
19
|
-
* observation. A request that cannot be applied fails the
|
|
20
|
-
* a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet
|
|
21
|
-
* user agent (the first live proof did exactly that to the desktop newcomer
|
|
22
|
-
* Those
|
|
19
|
+
* observation. A request that cannot be applied fails the participant closed with the reason. Only
|
|
20
|
+
* participants on a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet
|
|
21
|
+
* participant an iPhone user agent (the first live proof did exactly that to the desktop newcomer
|
|
22
|
+
* beside the phone participant). Those participants carry no fidelity block, since nothing was
|
|
23
|
+
* emulated.
|
|
23
24
|
*/
|
|
24
25
|
export declare function applyParticipantMobileFidelity(args: {
|
|
25
26
|
desktop: E2BDesktopSandbox;
|
|
26
27
|
spec: DesktopParticipantRun;
|
|
27
|
-
deps:
|
|
28
|
+
deps: E2BDesktopDeps;
|
|
28
29
|
targetUrl: string;
|
|
29
30
|
browserFamily: DesktopBrowserFamily;
|
|
30
31
|
launchIdentity: DesktopBrowserLaunchIdentity | undefined;
|
|
@@ -35,7 +36,7 @@ export declare function applyParticipantMobileFidelity(args: {
|
|
|
35
36
|
export declare function participantBrowserStateObserver(args: {
|
|
36
37
|
desktop: E2BDesktopSandbox;
|
|
37
38
|
spec: DesktopParticipantRun;
|
|
38
|
-
deps:
|
|
39
|
+
deps: E2BDesktopDeps;
|
|
39
40
|
targetUrl: string;
|
|
40
41
|
launchIdentity: DesktopBrowserLaunchIdentity | undefined;
|
|
41
42
|
targetId: string | undefined;
|
|
@@ -43,15 +44,15 @@ export declare function participantBrowserStateObserver(args: {
|
|
|
43
44
|
warnings: string[];
|
|
44
45
|
}): ReturnType<typeof makeChromeBrowserStateObserver>;
|
|
45
46
|
/**
|
|
46
|
-
* The
|
|
47
|
-
* measured
|
|
48
|
-
* had
|
|
47
|
+
* The participant's final browser geometry, measured while the sandbox is alive. A final capture that
|
|
48
|
+
* measured either field wins whole, so a partial final capture omits fields the launch-time capture
|
|
49
|
+
* had; only a final capture that measured nothing falls back to the launch-time
|
|
49
50
|
* capture. Also reads the emulation holder's log into the fidelity block.
|
|
50
51
|
*/
|
|
51
52
|
export declare function finalParticipantGeometry(args: {
|
|
52
53
|
desktop: E2BDesktopSandbox;
|
|
53
54
|
spec: DesktopParticipantRun;
|
|
54
|
-
deps:
|
|
55
|
+
deps: E2BDesktopDeps;
|
|
55
56
|
targetUrl: string;
|
|
56
57
|
browserFamily: DesktopBrowserFamily;
|
|
57
58
|
launchIdentity: DesktopBrowserLaunchIdentity | undefined;
|