humanish 0.106.0 → 0.107.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/AGENTS.md +4 -2
- package/ARCHITECTURE.md +17 -16
- package/CHANGELOG.md +24 -0
- package/CONTEXT.md +42 -39
- package/CONTRIBUTING.md +8 -6
- package/README.md +8 -3
- 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.js +2 -1
- 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/qualified-versions.d.ts +31 -4
- package/dist/actors/codex/qualified-versions.js +51 -6
- package/dist/actors/codex/restricted-executable.d.ts +24 -0
- package/dist/actors/codex/restricted-executable.js +97 -22
- package/dist/actors/codex/restricted-launch.d.ts +7 -1
- package/dist/actors/codex/restricted-launch.js +42 -3
- 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 +60 -2
- package/dist/actors/codex/restricted-policy.d.ts +9 -1
- package/dist/actors/codex/restricted-session.d.ts +14 -1
- package/dist/actors/codex/restricted-session.js +50 -17
- 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 +1 -1
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/loop/backstop.js +1 -1
- package/dist/actors/computer-use/loop/ending.d.ts +2 -2
- package/dist/actors/computer-use/loop/ending.js +2 -2
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +3 -3
- package/dist/actors/computer-use/loop/trace.js +2 -2
- package/dist/actors/computer-use/loop/types.d.ts +14 -5
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-provider.d.ts +1 -1
- package/dist/actors/computer-use/openai-provider.js +2 -2
- package/dist/actors/contract.d.ts +10 -8
- package/dist/actors/contract.js +7 -1
- package/dist/actors/local-agent/cli.js +1 -1
- package/dist/actors/scripted-browser/actor.d.ts +2 -2
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +18 -0
- package/dist/actors/scripted-browser/types.d.ts +11 -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/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 +31 -12
- 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 +4 -2
- package/dist/cli/commands/comms.js +8 -1
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +26 -14
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +3 -4
- 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 +0 -1
- 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 +76 -45
- package/dist/cli/commands/lab-scorer.d.ts +0 -2
- package/dist/cli/commands/lab.js +12 -6
- package/dist/cli/commands/observe.js +22 -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 +10 -8
- package/dist/cli/commands/watch.js +12 -10
- package/dist/cli/doctor.d.ts +3 -0
- package/dist/cli/doctor.js +10 -2
- package/dist/cli/io.d.ts +5 -4
- package/dist/cli/io.js +12 -8
- package/dist/cli/program.js +3 -3
- package/dist/cli/renamed-options.d.ts +11 -0
- package/dist/cli/renamed-options.js +18 -0
- package/dist/cli/telemetry.d.ts +2 -2
- package/dist/cli/telemetry.js +1 -1
- package/dist/comms/capture-surface.d.ts +1 -1
- package/dist/comms/catch-host.d.ts +1 -1
- package/dist/comms/connections.js +4 -4
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/types.js +1 -1
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/redaction.js +1 -1
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +7 -9
- package/dist/feedback/export-bundle.js +4 -4
- package/dist/feedback/export.js +9 -9
- package/dist/feedback/feedback.d.ts +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.js +3 -6
- package/dist/keys/key-resolution.d.ts +3 -1
- package/dist/keys/key-resolution.js +18 -16
- package/dist/lab/adapter-extension.d.ts +28 -6
- package/dist/lab/adapter-extension.js +65 -126
- package/dist/lab/adapter-scorer-loader.d.ts +25 -5
- package/dist/lab/adapter-scorer-loader.js +24 -0
- package/dist/lab/composition-rules.d.ts +2 -0
- package/dist/lab/composition-rules.js +35 -26
- package/dist/lab/config.js +28 -26
- package/dist/lab/device-presets.d.ts +2 -2
- package/dist/lab/discover.js +1 -3
- package/dist/lab/doctor.d.ts +44 -9
- package/dist/lab/doctor.js +149 -41
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/keys.js +1 -1
- package/dist/lab/lab-deps.d.ts +85 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +8 -7
- package/dist/lab/parse/comms.js +3 -2
- package/dist/lab/parse/execution.js +3 -2
- package/dist/lab/parse/subject-state.js +2 -1
- package/dist/lab/parse/subject.js +2 -1
- package/dist/lab/parse/values.d.ts +0 -1
- package/dist/lab/parse/values.js +0 -3
- package/dist/lab/persona-resolve.d.ts +3 -3
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +6 -2
- package/dist/lab/plan-base.js +22 -7
- package/dist/lab/plan-participants.d.ts +5 -5
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +33 -7
- package/dist/lab/plan.d.ts +3 -11
- package/dist/lab/plan.js +18 -42
- package/dist/lab/preflight-result.js +0 -2
- package/dist/lab/preflight.d.ts +0 -3
- package/dist/lab/preflight.js +1 -1
- 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 +19 -24
- package/dist/lab/routing.js +14 -47
- package/dist/lab/run-lab-events.d.ts +6 -11
- package/dist/lab/run-lab-events.js +3 -11
- package/dist/lab/run-lab-homes.d.ts +64 -0
- package/dist/lab/run-lab-homes.js +3 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +45 -275
- package/dist/lab/summary.d.ts +9 -4
- package/dist/lab/summary.js +15 -8
- package/dist/lab/types.d.ts +132 -132
- package/dist/lab/validation.d.ts +15 -15
- package/dist/lab/validation.js +28 -28
- package/dist/lab/warnings.js +20 -19
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +3 -3
- package/dist/observer/data.js +2 -2
- package/dist/observer/render.js +2 -2
- package/dist/observer/run-routes.d.ts +1 -1
- package/dist/observer/run-routes.js +5 -5
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +34 -3
- package/dist/observer-app.html +1 -1
- package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
- package/dist/routes/computer-use/bundle-parts.js +10 -3
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +9 -15
- 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 +10 -10
- package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
- 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 +29 -17
- 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 +25 -29
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
- 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 +19 -27
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +14 -13
- 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 +39 -66
- 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} +10 -10
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
- 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 +19 -11
- package/dist/routes/computer-use/participant-model.js +58 -33
- package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
- package/dist/routes/computer-use/participant-prompt.js +4 -4
- package/dist/routes/computer-use/participant-runs.d.ts +6 -6
- package/dist/routes/computer-use/participant-runs.js +8 -8
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +59 -65
- package/dist/routes/computer-use/preflight.d.ts +6 -11
- package/dist/routes/computer-use/preflight.js +26 -18
- package/dist/routes/computer-use/rerun-selection.js +10 -6
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +40 -30
- package/dist/routes/computer-use/route.d.ts +3 -4
- package/dist/routes/computer-use/route.js +21 -19
- package/dist/routes/computer-use/self-report.d.ts +2 -2
- package/dist/routes/computer-use/self-report.js +4 -4
- package/dist/routes/computer-use/setup.d.ts +8 -17
- package/dist/routes/computer-use/setup.js +98 -86
- package/dist/routes/computer-use/single-bundle.d.ts +8 -11
- package/dist/routes/computer-use/single-bundle.js +20 -25
- package/dist/routes/computer-use/subject-projection.d.ts +5 -7
- package/dist/routes/computer-use/subject-projection.js +20 -19
- package/dist/routes/computer-use/types.d.ts +169 -211
- package/dist/routes/computer-use/types.js +13 -6
- package/dist/routes/preview.js +0 -1
- package/dist/routes/scripted/bundle.d.ts +3 -6
- package/dist/routes/scripted/bundle.js +11 -16
- package/dist/routes/scripted/plan.d.ts +5 -7
- package/dist/routes/scripted/plan.js +6 -4
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +10 -6
- package/dist/routes/scripted/route.js +10 -11
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +1 -1
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +22 -21
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +11 -6
- package/dist/routes/scripted/surface-records.js +1 -1
- 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 +19 -36
- package/dist/routes/scripted/types.js +1 -2
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
- package/dist/routes/shared-world/bundle.d.ts +2 -2
- package/dist/routes/shared-world/bundle.js +22 -26
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +4 -4
- package/dist/routes/shared-world/comms.d.ts +5 -4
- package/dist/routes/shared-world/comms.js +28 -41
- package/dist/routes/shared-world/external-public.d.ts +5 -5
- package/dist/routes/shared-world/external-public.js +19 -20
- package/dist/routes/shared-world/handoff.d.ts +4 -4
- package/dist/routes/shared-world/handoff.js +50 -50
- package/dist/routes/shared-world/lobby-code.d.ts +5 -5
- package/dist/routes/shared-world/lobby-code.js +13 -13
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +46 -51
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +1 -2
- 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 +48 -41
- package/dist/routes/shared-world/result.js +31 -19
- package/dist/routes/shared-world/route.js +37 -41
- package/dist/routes/shared-world/setup.d.ts +5 -4
- package/dist/routes/shared-world/setup.js +12 -14
- package/dist/routes/shared-world/types.d.ts +53 -126
- package/dist/routes/shared-world/types.js +2 -2
- package/dist/routes/terminal/adapter.d.ts +8 -8
- package/dist/routes/terminal/adapter.js +28 -125
- package/dist/routes/terminal/bundle.d.ts +7 -12
- package/dist/routes/terminal/bundle.js +24 -34
- package/dist/routes/terminal/credentials.d.ts +2 -2
- package/dist/routes/terminal/credentials.js +16 -16
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +9 -11
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +6 -6
- package/dist/routes/terminal/ledger.js +9 -9
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +21 -20
- package/dist/routes/terminal/live-sandbox.d.ts +4 -2
- package/dist/routes/terminal/live-sandbox.js +25 -21
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +13 -9
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +4 -4
- package/dist/routes/terminal/route.js +26 -26
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +5 -3
- package/dist/routes/terminal/sandbox.js +13 -16
- package/dist/routes/terminal/session.js +16 -14
- package/dist/routes/terminal/token-usage.js +5 -5
- package/dist/routes/terminal/trace.d.ts +5 -8
- package/dist/routes/terminal/trace.js +9 -64
- package/dist/routes/terminal/types.d.ts +85 -93
- package/dist/routes/terminal/types.js +9 -4
- 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 +4 -4
- package/dist/run/bundle.d.ts +63 -56
- package/dist/run/bundle.js +9 -8
- package/dist/run/cost-summary.js +3 -2
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +10 -10
- package/dist/run/detail.d.ts +5 -5
- package/dist/run/detail.js +6 -6
- package/dist/run/dry-run.js +5 -12
- 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 +16 -4
- package/dist/run/judge.js +24 -7
- 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.js +1 -1
- package/dist/run/pricing.d.ts +19 -9
- package/dist/run/pricing.js +30 -18
- package/dist/run/projection.d.ts +13 -13
- package/dist/run/projection.js +8 -8
- package/dist/run/reclaim.d.ts +7 -1
- package/dist/run/reclaim.js +24 -4
- package/dist/run/results.d.ts +1 -1
- package/dist/run/run-index.d.ts +1 -1
- package/dist/run/run-index.js +11 -11
- package/dist/run/run.d.ts +4 -2
- package/dist/run/run.js +9 -5
- package/dist/run/sandbox-receipts.d.ts +4 -4
- package/dist/run/sandbox-receipts.js +4 -4
- package/dist/run/shared-world-evidence.d.ts +47 -47
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +11 -11
- package/dist/run/stats.d.ts +5 -5
- package/dist/run/stats.js +8 -8
- package/dist/run/status.d.ts +16 -6
- package/dist/run/status.js +31 -8
- package/dist/run/streams.d.ts +26 -19
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- 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 +36 -34
- package/dist/run-lab.js +41 -37
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +1 -1
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +2 -2
- 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 +5 -5
- package/dist/subject/serve.js +1 -1
- package/dist/subject/steps.d.ts +4 -4
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/desktop-session.d.ts +2 -0
- package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
- package/dist/substrates/e2b/cdp-probe.js +1 -1
- package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
- package/dist/substrates/e2b/desktop-browser.js +4 -4
- package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
- package/dist/substrates/e2b/desktop-cdp.js +4 -4
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +3 -3
- package/dist/substrates/e2b/desktop-media.js +2 -2
- package/dist/substrates/e2b/sandbox.d.ts +2 -0
- package/dist/substrates/e2b/sandbox.js +22 -8
- package/dist/substrates/e2b/sdk.d.ts +12 -1
- package/dist/substrates/e2b/sdk.js +30 -9
- 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 +7 -5
- package/dist/tui/actions.js +18 -9
- package/dist/tui-app.js +42 -42
- package/dist/verify/actor.d.ts +10 -10
- package/dist/verify/actor.js +15 -15
- package/dist/verify/artifacts.d.ts +1 -1
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/costs.d.ts +2 -2
- package/dist/verify/costs.js +2 -2
- 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.js +2 -2
- package/dist/verify/verify.js +6 -6
- package/docs/README.md +1 -1
- package/docs/architecture/actor-contract.md +60 -22
- package/docs/architecture/desktop-sessions.md +9 -9
- package/docs/architecture/external-public-shared-world.md +5 -0
- package/docs/architecture/observer.md +4 -4
- package/docs/architecture/restricted-codex-analysis.md +40 -4
- package/docs/architecture/state-driven-executor.md +4 -5
- package/docs/architecture/task-protocol-support.md +3 -5
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
- package/docs/contracts/run-bundle.md +10 -8
- package/docs/contracts/schemas.md +109 -53
- package/docs/contracts/study-analysis.md +24 -0
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/product/automatic-analysis.md +1 -0
- package/docs/ramp/README.md +2 -1
- package/package.json +4 -4
- package/skills/humanish/SKILL.md +3 -2
- package/skills/humanish/agents/openai.yaml +1 -1
- 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/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -34,7 +34,7 @@ export declare function participantFeedbackCandidates(args: {
|
|
|
34
34
|
commsArtifactPath?: string;
|
|
35
35
|
}>;
|
|
36
36
|
}): RunFeedbackCandidate[];
|
|
37
|
-
/** Human-readable provenance line for the single-
|
|
37
|
+
/** Human-readable provenance line for the single-participant subject.provenance event (invariant 5):
|
|
38
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: {
|
|
@@ -109,7 +109,7 @@ export function participantFeedbackCandidates(args) {
|
|
|
109
109
|
}
|
|
110
110
|
return candidates;
|
|
111
111
|
}
|
|
112
|
-
/** Human-readable provenance line for the single-
|
|
112
|
+
/** Human-readable provenance line for the single-participant subject.provenance event (invariant 5):
|
|
113
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") {
|
|
@@ -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: {
|
|
@@ -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
|
? {}
|
|
@@ -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;
|
|
@@ -20,9 +20,9 @@ export interface ParticipantComms {
|
|
|
20
20
|
/**
|
|
21
21
|
* On an in-sandbox subject route, redirect the app's email-API sends into an in-sandbox catch
|
|
22
22
|
* (loopback) so its verification mail is CAPTURED, not sent to the internet. Undefined when the
|
|
23
|
-
* lab declares no fake email, which leaves 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 (#297): 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,6 +8,7 @@ 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. */
|
|
@@ -15,10 +16,10 @@ 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
18
|
* (loopback) so its verification mail is CAPTURED, not sent to the internet. Undefined when the
|
|
18
|
-
* lab declares no fake email, which leaves 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
|
}),
|
|
@@ -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.
|
|
@@ -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,15 +14,15 @@ export function createE2BParticipantDesktop(spec, deps, warnings) {
|
|
|
17
14
|
deps,
|
|
18
15
|
warnings,
|
|
19
16
|
targetUrl,
|
|
20
|
-
desktopCliRoute: deps.
|
|
17
|
+
desktopCliRoute: deps.subject.kind === "desktop-cli",
|
|
21
18
|
// Off-app comms (#297): gated entirely on config.comms; no comms declared, no change.
|
|
22
|
-
comms: planParticipantComms(deps.
|
|
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
|
-
|
|
25
|
+
deps.reportSubjectPhase(event, {
|
|
29
26
|
laneId: spec.planned.id,
|
|
30
27
|
laneIndex: spec.planned.index,
|
|
31
28
|
laneCount: deps.participantCount,
|
|
@@ -1,30 +1,30 @@
|
|
|
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, which is honest.
|
|
23
23
|
*/
|
|
24
24
|
export declare function applyParticipantMobileFidelity(args: {
|
|
25
25
|
desktop: E2BDesktopSandbox;
|
|
26
26
|
spec: DesktopParticipantRun;
|
|
27
|
-
deps:
|
|
27
|
+
deps: E2BDesktopDeps;
|
|
28
28
|
targetUrl: string;
|
|
29
29
|
browserFamily: DesktopBrowserFamily;
|
|
30
30
|
launchIdentity: DesktopBrowserLaunchIdentity | undefined;
|
|
@@ -35,7 +35,7 @@ export declare function applyParticipantMobileFidelity(args: {
|
|
|
35
35
|
export declare function participantBrowserStateObserver(args: {
|
|
36
36
|
desktop: E2BDesktopSandbox;
|
|
37
37
|
spec: DesktopParticipantRun;
|
|
38
|
-
deps:
|
|
38
|
+
deps: E2BDesktopDeps;
|
|
39
39
|
targetUrl: string;
|
|
40
40
|
launchIdentity: DesktopBrowserLaunchIdentity | undefined;
|
|
41
41
|
targetId: string | undefined;
|
|
@@ -43,7 +43,7 @@ export declare function participantBrowserStateObserver(args: {
|
|
|
43
43
|
warnings: string[];
|
|
44
44
|
}): ReturnType<typeof makeChromeBrowserStateObserver>;
|
|
45
45
|
/**
|
|
46
|
-
* The
|
|
46
|
+
* The participant's final browser geometry, measured while the sandbox is alive. A final capture that
|
|
47
47
|
* measured EITHER field wins whole, so a partial final capture omits fields the launch-time capture
|
|
48
48
|
* had (honest omission); only a final capture that measured NOTHING falls back to the launch-time
|
|
49
49
|
* capture. Also reads the emulation holder's log into the fidelity block.
|
|
@@ -51,7 +51,7 @@ export declare function participantBrowserStateObserver(args: {
|
|
|
51
51
|
export declare function finalParticipantGeometry(args: {
|
|
52
52
|
desktop: E2BDesktopSandbox;
|
|
53
53
|
spec: DesktopParticipantRun;
|
|
54
|
-
deps:
|
|
54
|
+
deps: E2BDesktopDeps;
|
|
55
55
|
targetUrl: string;
|
|
56
56
|
browserFamily: DesktopBrowserFamily;
|
|
57
57
|
launchIdentity: DesktopBrowserLaunchIdentity | undefined;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
// Device fidelity for one E2B desktop
|
|
1
|
+
// Device fidelity for one E2B desktop participant: mobile emulation beyond viewport size (#221), the
|
|
2
2
|
// browser-state observer that watches it for drift (#623), and the final browser geometry.
|
|
3
3
|
import { redactText, toErrorMessage } from "../../../evidence/redaction.js";
|
|
4
4
|
import { readDetachedLog } from "../../../substrates/detached.js";
|
|
5
5
|
import { applyMobileEmulation, DEFAULT_MOBILE_USER_AGENT, makeChromeBrowserStateObserver, } from "../../../substrates/e2b/desktop-cdp.js";
|
|
6
6
|
import { captureDesktopBrowserGeometry } from "../../../substrates/e2b/desktop-geometry.js";
|
|
7
7
|
import { e2bShell } from "../../../substrates/e2b/shell.js";
|
|
8
|
-
/** Only
|
|
9
|
-
export function mobileLaunchFlags(
|
|
10
|
-
const requested =
|
|
8
|
+
/** Only participants on a mobile preset are emulated; the flags go on the browser command line. */
|
|
9
|
+
export function mobileLaunchFlags(residual, spec) {
|
|
10
|
+
const requested = residual.execution?.desktop?.fidelity;
|
|
11
11
|
if (!requested?.mobileEmulation || !spec.planned.device.preset.isMobile)
|
|
12
12
|
return [];
|
|
13
13
|
return [
|
|
@@ -25,14 +25,14 @@ function cdpEndpoint(identity, targetUrl) {
|
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* Apply mobile fidelity to the launch page before the geometry capture and the participant's first
|
|
28
|
-
* observation. A request that cannot be applied fails the
|
|
29
|
-
* a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet
|
|
30
|
-
* user agent (the first live proof did exactly that to the desktop newcomer
|
|
31
|
-
* Those
|
|
28
|
+
* observation. A request that cannot be applied fails the participant closed with the reason. Only
|
|
29
|
+
* participants on a mobile preset are emulated: a run-wide flag must not hand a desktop or tablet
|
|
30
|
+
* participant an iPhone user agent (the first live proof did exactly that to the desktop newcomer
|
|
31
|
+
* beside the phone participant). Those participants carry no fidelity block, which is honest.
|
|
32
32
|
*/
|
|
33
33
|
export async function applyParticipantMobileFidelity(args) {
|
|
34
34
|
const { spec, deps } = args;
|
|
35
|
-
const request = deps.
|
|
35
|
+
const request = deps.residual.execution?.desktop?.fidelity;
|
|
36
36
|
const none = {
|
|
37
37
|
applied: undefined,
|
|
38
38
|
emulatedTargetId: undefined,
|
|
@@ -62,7 +62,7 @@ export function participantBrowserStateObserver(args) {
|
|
|
62
62
|
const { spec, deps, fidelity, warnings } = args;
|
|
63
63
|
return makeChromeBrowserStateObserver(args.desktop, deps.requestTimeoutMs, cdpEndpoint(args.launchIdentity, args.targetUrl), {
|
|
64
64
|
targetId: args.targetId,
|
|
65
|
-
// Once per
|
|
65
|
+
// Once per participant: a dark observation channel is a gap in the instrument, and the
|
|
66
66
|
// funnel's NEVER MEASURED count needs this line to explain itself (#514).
|
|
67
67
|
onUnavailable: (reason) => {
|
|
68
68
|
warnings.push(`Browser-state observer unavailable for participant ${spec.planned.id} (${redactText(deps.scrubKnownValues(reason))}); ` +
|
|
@@ -94,7 +94,7 @@ export function participantBrowserStateObserver(args) {
|
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
|
-
* The
|
|
97
|
+
* The participant's final browser geometry, measured while the sandbox is alive. A final capture that
|
|
98
98
|
* measured EITHER field wins whole, so a partial final capture omits fields the launch-time capture
|
|
99
99
|
* had (honest omission); only a final capture that measured NOTHING falls back to the launch-time
|
|
100
100
|
* capture. Also reads the emulation holder's log into the fidelity block.
|
|
@@ -5,12 +5,12 @@ export declare const CUA_ACTOR_LAB_PROVIDER_METADATA: {
|
|
|
5
5
|
readonly tool: "humanish";
|
|
6
6
|
};
|
|
7
7
|
/**
|
|
8
|
-
* Create the
|
|
9
|
-
*
|
|
8
|
+
* Create the participant's sandbox, record its resources, run the adopter's prepare hook, and attach the
|
|
9
|
+
* participant's inbox and comms catch. Returns the sandbox, which the later steps drive.
|
|
10
10
|
*/
|
|
11
11
|
export declare function acquireParticipantDesktop(ctx: E2BParticipantContext, state: E2BParticipantState): Promise<E2BDesktopSandbox>;
|
|
12
12
|
/**
|
|
13
|
-
* Verify the
|
|
13
|
+
* Verify the participant's screen in the sandbox. A mismatch fails the participant closed unless the run records
|
|
14
14
|
* requested and verified geometry side by side.
|
|
15
15
|
*/
|
|
16
16
|
export declare function verifyParticipantScreen(ctx: E2BParticipantContext, state: E2BParticipantState, desktop: E2BDesktopSandbox): Promise<void>;
|