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
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// against a real app (it fills forms and clicks buttons). A dry run parses and digest-pins the
|
|
11
11
|
// scenario and writes the contract bundle without touching anything.
|
|
12
12
|
//
|
|
13
|
-
// Subject provenance
|
|
13
|
+
// Subject provenance: an app-url run declares that the lab did not provision the
|
|
14
14
|
// subject, so its build provenance is unpinned and the evidence binds to the scenario digest. A
|
|
15
15
|
// clone run records commit, env names, state provenance and a host digest, never the raw getHost
|
|
16
16
|
// URL or a secret value.
|
|
@@ -24,24 +24,24 @@ import { buildRunSource } from "../../run/bundle.js";
|
|
|
24
24
|
import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
|
|
25
25
|
import { runScope } from "../../run/run.js";
|
|
26
26
|
import { renderScriptedReviewMarkdown } from "./bundle.js";
|
|
27
|
-
import { planScriptedLab } from "./plan.js";
|
|
27
|
+
import { injectedBrowser, planScriptedLab } from "./plan.js";
|
|
28
28
|
import { finishScriptedRun } from "./result.js";
|
|
29
29
|
import { UnsafeScriptedSessionResultError } from "./session-result.js";
|
|
30
30
|
import { prepareScriptedRun } from "./setup.js";
|
|
31
31
|
import { ScriptedSubject } from "./subject.js";
|
|
32
32
|
import { runScriptedSessions, writeSurfaceTraces } from "./surface-sessions.js";
|
|
33
|
-
import {
|
|
33
|
+
import {} from "./types.js";
|
|
34
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
34
35
|
/**
|
|
35
36
|
* The config-taking entry point. It plans, returns a refusal with the envelope the route has always
|
|
36
37
|
* returned at that refusal's stage, and otherwise runs the plan.
|
|
37
38
|
*/
|
|
38
39
|
export async function runScriptedBrowserLab(options) {
|
|
39
|
-
const { config, dryRun,
|
|
40
|
+
const { config, dryRun, ...input } = options;
|
|
40
41
|
// planScriptedLab makes every configuration refusal, in the order this route always has.
|
|
41
42
|
const planned = planScriptedLab(config, {
|
|
42
43
|
dryRun,
|
|
43
|
-
|
|
44
|
-
...(input.hooks === undefined ? {} : { hooks: input.hooks }),
|
|
44
|
+
injectedBrowser: injectedBrowser(input.deps),
|
|
45
45
|
});
|
|
46
46
|
if (planned.ok)
|
|
47
47
|
return runScriptedPlan(planned.plan, input);
|
|
@@ -57,10 +57,9 @@ export async function scriptedLabRefusal(options, refusal) {
|
|
|
57
57
|
const actorType = config.actors[0]?.type ?? "";
|
|
58
58
|
if (refusal.beforeScope)
|
|
59
59
|
return {
|
|
60
|
-
|
|
60
|
+
...studyResultIdentity("scripted", config.id),
|
|
61
61
|
ok: false,
|
|
62
62
|
cwd,
|
|
63
|
-
labId: config.id,
|
|
64
63
|
actor: actorType,
|
|
65
64
|
dryRun,
|
|
66
65
|
runId: options.runId ?? "not-created",
|
|
@@ -73,10 +72,9 @@ export async function scriptedLabRefusal(options, refusal) {
|
|
|
73
72
|
const physicalCwd = await realpath(cwd);
|
|
74
73
|
await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
|
|
75
74
|
const refused = {
|
|
76
|
-
|
|
75
|
+
...studyResultIdentity("scripted", config.id),
|
|
77
76
|
ok: false,
|
|
78
77
|
cwd,
|
|
79
|
-
labId: config.id,
|
|
80
78
|
actor: refusal.actor ?? actorType,
|
|
81
79
|
appUrl: refusal.appUrl ?? config.subject.appUrl ?? "",
|
|
82
80
|
dryRun,
|
|
@@ -86,7 +84,7 @@ export async function scriptedLabRefusal(options, refusal) {
|
|
|
86
84
|
error: { code: refusal.code, message: refusal.message },
|
|
87
85
|
};
|
|
88
86
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
89
|
-
return completeAutomaticAnalysis(refused, undefined, analysis.ok ? analysis.config : undefined, options
|
|
87
|
+
return completeAutomaticAnalysis(refused, undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
|
|
90
88
|
}
|
|
91
89
|
/**
|
|
92
90
|
* runLab's step for a scripted plan. It takes no scorer, and its local checks (keys, a browser)
|
|
@@ -97,7 +95,6 @@ export function admitScriptedPlan(plan, input) {
|
|
|
97
95
|
ok: true,
|
|
98
96
|
run: async () => ({
|
|
99
97
|
route: "scripted",
|
|
100
|
-
backend: "scripted",
|
|
101
98
|
result: await runScriptedPlan(plan, input),
|
|
102
99
|
}),
|
|
103
100
|
};
|
|
@@ -112,7 +109,7 @@ export function admitScriptedPlan(plan, input) {
|
|
|
112
109
|
*/
|
|
113
110
|
export async function runScriptedPlan(plan, input) {
|
|
114
111
|
const { result, finished } = await runScope((scope) => runScriptedPlanInScope(plan, input, scope));
|
|
115
|
-
return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input
|
|
112
|
+
return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input, {
|
|
116
113
|
...(plan.analysis === undefined ? {} : { trigger: plan.analysis.trigger }),
|
|
117
114
|
preferLargerOutput: plan.analysis?.preferLargerOutput === true,
|
|
118
115
|
});
|
|
@@ -130,7 +127,7 @@ async function runScriptedPlanInScope(plan, input, scope) {
|
|
|
130
127
|
mode: dryRun ? "dry-run" : "live",
|
|
131
128
|
lab: plan.lab,
|
|
132
129
|
renderReview: renderScriptedReviewMarkdown,
|
|
133
|
-
observer: { open: input.open === true, render: setup.
|
|
130
|
+
observer: { open: input.open === true, render: setup.deps.renderObserver },
|
|
134
131
|
});
|
|
135
132
|
if (!started.ok) {
|
|
136
133
|
return setup.failed(started.code, started.message);
|
|
@@ -148,7 +145,8 @@ async function runScriptedPlanInScope(plan, input, scope) {
|
|
|
148
145
|
? new ScriptedSubject({
|
|
149
146
|
plan,
|
|
150
147
|
clone: setup.clone,
|
|
151
|
-
|
|
148
|
+
deps: setup.deps,
|
|
149
|
+
...(input.prepareDesktop === undefined ? {} : { prepareDesktop: input.prepareDesktop }),
|
|
152
150
|
env: setup.env,
|
|
153
151
|
e2bApiKey: setup.e2bApiKey,
|
|
154
152
|
runPaths,
|
|
@@ -156,7 +154,7 @@ async function runScriptedPlanInScope(plan, input, scope) {
|
|
|
156
154
|
subjectEnvNames: setup.subjectEnvNames,
|
|
157
155
|
hasGithubToken: setup.hasGithubToken,
|
|
158
156
|
scrubKnownValues: setup.scrubKnownValues,
|
|
159
|
-
now: setup.
|
|
157
|
+
now: setup.deps.now ?? Date.now,
|
|
160
158
|
warnings: setup.warnings,
|
|
161
159
|
})
|
|
162
160
|
: undefined;
|
|
@@ -175,7 +173,7 @@ async function runScriptedPlanInScope(plan, input, scope) {
|
|
|
175
173
|
artifactRoot,
|
|
176
174
|
}, {
|
|
177
175
|
surfaces: setup.surfaces,
|
|
178
|
-
|
|
176
|
+
deps: setup.deps,
|
|
179
177
|
browserCommand: setup.browserCommand,
|
|
180
178
|
runPaths,
|
|
181
179
|
});
|
|
@@ -9,7 +9,7 @@ interface ResolvedScriptedScenario {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Resolve and consume `scenario.ref`. Path-style refs (contain a separator or end .yaml/.yml)
|
|
12
|
-
* resolve against cwd and are
|
|
12
|
+
* resolve against cwd and are clamped inside it: a ../../ escape is rejected, never recorded
|
|
13
13
|
* as repo-relative provenance. Id-style refs must be public-safe tokens and resolve to
|
|
14
14
|
* humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedLab
|
|
15
15
|
* has already refused a missing or blank ref.
|
|
@@ -11,7 +11,7 @@ import { readContainedRegularFile, } from "../../run/contained-output.js";
|
|
|
11
11
|
const SCENARIO_REF_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
|
|
12
12
|
/**
|
|
13
13
|
* Resolve and consume `scenario.ref`. Path-style refs (contain a separator or end .yaml/.yml)
|
|
14
|
-
* resolve against cwd and are
|
|
14
|
+
* resolve against cwd and are clamped inside it: a ../../ escape is rejected, never recorded
|
|
15
15
|
* as repo-relative provenance. Id-style refs must be public-safe tokens and resolve to
|
|
16
16
|
* humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedLab
|
|
17
17
|
* has already refused a missing or blank ref.
|
|
@@ -26,7 +26,7 @@ export async function resolveScriptedScenario(projectRoot, ref) {
|
|
|
26
26
|
if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
27
27
|
return {
|
|
28
28
|
ok: false,
|
|
29
|
-
message: `scenario.ref
|
|
29
|
+
message: `scenario.ref must stay inside the project directory, and "${trimmed}" does not: the run records it relative to the project.`,
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
source = relative.split(path.sep).join("/");
|
|
@@ -80,7 +80,7 @@ export async function resolveScriptedScenario(projectRoot, ref) {
|
|
|
80
80
|
if (!parsed.journey) {
|
|
81
81
|
return {
|
|
82
82
|
ok: false,
|
|
83
|
-
message: `${source} declares no
|
|
83
|
+
message: `${source} declares no browser steps, and the scripted-browser actor needs a scenario with browser.steps.`,
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
return { ok: true, journey: parsed.journey, source, sourceDigest };
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
2
2
|
import type { BrowserPersonaJourney, ScriptedBrowserEvidenceUrlPolicy } from "../../actors/scripted-browser/types.js";
|
|
3
3
|
import type { ScriptedPlan } from "../../lab/plan-types.js";
|
|
4
|
-
import { type
|
|
4
|
+
import { type ScriptedBrowserLabResult, type ScriptedRunInput } from "./types.js";
|
|
5
|
+
import type { LabDeps } from "../../lab/lab-deps.js";
|
|
5
6
|
/** What setup hands the run: the plan's subject and scenario, keys and the browser to launch. */
|
|
6
7
|
export interface ScriptedRunSetup {
|
|
7
8
|
cwd: string;
|
|
8
9
|
physicalCwd: string;
|
|
9
|
-
|
|
10
|
+
deps: LabDeps;
|
|
10
11
|
warnings: string[];
|
|
11
12
|
failed: (code: NonNullable<ScriptedBrowserLabResult["error"]>["code"], message: string) => ScriptedBrowserLabResult;
|
|
12
13
|
clone: Extract<ScriptedPlan["subject"], {
|
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
// the E2B key and subject env of a live clone, a browser to launch) and the values the run reads
|
|
3
3
|
// (the evidence URL policy, the scrubber for clone values, the persona and the session budget).
|
|
4
4
|
import { realpath } from "node:fs/promises";
|
|
5
|
+
import { missingKeys, missingSubjectEnv } from "../../lab/requirements.js";
|
|
5
6
|
import path from "node:path";
|
|
6
7
|
import { resolveBrowserCommand } from "../../actors/scripted-browser/browser-command.js";
|
|
7
8
|
import { describeMissingKeys } from "../../keys/key-resolution.js";
|
|
8
9
|
import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
|
|
9
10
|
import { evidenceAppUrlOf } from "./plan.js";
|
|
10
11
|
import { resolveScriptedScenario } from "./scenario.js";
|
|
11
|
-
import {
|
|
12
|
+
import {} from "./types.js";
|
|
13
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
12
14
|
// Journey wall-clock budget per surface: 5 minutes. A scripted surface has zero model cost and
|
|
13
15
|
// sandbox-seconds are pennies; a short default only truncated slow-loading subjects.
|
|
14
16
|
const DEFAULT_SESSION_TIMEOUT_MS = 300_000;
|
|
@@ -21,15 +23,14 @@ export async function prepareScriptedRun(plan, input) {
|
|
|
21
23
|
const cwd = path.resolve(input.cwd);
|
|
22
24
|
const physicalCwd = await realpath(cwd);
|
|
23
25
|
const projectRoot = await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
|
|
24
|
-
const
|
|
26
|
+
const deps = input.deps ?? {};
|
|
25
27
|
const warnings = [];
|
|
26
28
|
const clone = plan.subject.kind === "clone" ? plan.subject : undefined;
|
|
27
29
|
const evidenceAppUrl = evidenceAppUrlOf(plan.subject);
|
|
28
30
|
const failed = (code, message) => ({
|
|
29
|
-
|
|
31
|
+
...studyResultIdentity("scripted", plan.labId),
|
|
30
32
|
ok: false,
|
|
31
33
|
cwd,
|
|
32
|
-
labId: plan.labId,
|
|
33
34
|
actor: plan.actor,
|
|
34
35
|
appUrl: evidenceAppUrl,
|
|
35
36
|
dryRun,
|
|
@@ -42,7 +43,7 @@ export async function prepareScriptedRun(plan, input) {
|
|
|
42
43
|
? { kind: "provisioned-subject", evidenceOrigin: evidenceAppUrl }
|
|
43
44
|
: { kind: "loopback" };
|
|
44
45
|
const subjectEnvNames = [...(clone?.env ?? [])];
|
|
45
|
-
const env =
|
|
46
|
+
const env = input.env ?? process.env;
|
|
46
47
|
const e2bApiKey = env.E2B_API_KEY?.trim() ?? "";
|
|
47
48
|
const hasGithubToken = subjectEnvNames.includes("GITHUB_TOKEN");
|
|
48
49
|
const redactRepoLabel = plan.residual.policies?.redactRepos ?? hasGithubToken;
|
|
@@ -57,42 +58,42 @@ export async function prepareScriptedRun(plan, input) {
|
|
|
57
58
|
if (!scenario.ok) {
|
|
58
59
|
return {
|
|
59
60
|
ok: false,
|
|
60
|
-
result: failed("
|
|
61
|
+
result: failed("HUMANISH_SCRIPTED_SCENARIO_INVALID", scenario.message),
|
|
61
62
|
};
|
|
62
63
|
}
|
|
63
64
|
const journey = scenario.journey;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
}
|
|
65
|
+
// The plan lists E2B_API_KEY and the subject env only for a live clone.
|
|
66
|
+
const missing = missingKeys(plan.requirements, env);
|
|
67
|
+
if (missing.length > 0) {
|
|
68
|
+
return {
|
|
69
|
+
ok: false,
|
|
70
|
+
result: failed("HUMANISH_SCRIPTED_KEYS_MISSING", `Live clone scripted-browser labs require ${missing.join(" and ")} (dry-run remains $0 and does not provision a subject). ${describeMissingKeys(missing, env)}`),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const unsetSubjectEnv = missingSubjectEnv(plan.requirements, env);
|
|
74
|
+
if (unsetSubjectEnv.length > 0) {
|
|
75
|
+
return {
|
|
76
|
+
ok: false,
|
|
77
|
+
result: failed("HUMANISH_SCRIPTED_SUBJECT_ENV_MISSING", `Subject env values missing for live clone scripted-browser lab: ${unsetSubjectEnv.join(", ")}.`),
|
|
78
|
+
};
|
|
78
79
|
}
|
|
79
80
|
const surfaces = plan.surfaces;
|
|
80
81
|
const timeoutMs = plan.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS;
|
|
81
82
|
const persona = {
|
|
82
83
|
id: plan.personaId ?? "scripted-journey",
|
|
83
84
|
traitsApplied: [],
|
|
84
|
-
// The step manifest
|
|
85
|
+
// The step manifest is the "prompt" on this route; the digest binds the trace to the
|
|
85
86
|
// committed scenario text.
|
|
86
87
|
promptDigest: journey.sourceDigest.slice(0, 16),
|
|
87
88
|
};
|
|
88
|
-
// Live runs need a browser
|
|
89
|
-
let browserCommand =
|
|
90
|
-
if (!dryRun && !
|
|
89
|
+
// Live runs need a browser before any actuation (unless one is injected).
|
|
90
|
+
let browserCommand = deps.browserCommand;
|
|
91
|
+
if (!dryRun && !deps.launchBrowser && !browserCommand) {
|
|
91
92
|
const resolved = await resolveBrowserCommand();
|
|
92
93
|
if (!resolved) {
|
|
93
94
|
return {
|
|
94
95
|
ok: false,
|
|
95
|
-
result: failed("
|
|
96
|
+
result: failed("HUMANISH_SCRIPTED_BROWSER_MISSING", "No Chrome/Chromium browser command was found for the scripted-browser actor. Set HUMANISH_BROWSER_COMMAND to a browser binary playwright-core can launch."),
|
|
96
97
|
};
|
|
97
98
|
}
|
|
98
99
|
browserCommand = resolved;
|
|
@@ -102,7 +103,7 @@ export async function prepareScriptedRun(plan, input) {
|
|
|
102
103
|
setup: {
|
|
103
104
|
cwd,
|
|
104
105
|
physicalCwd,
|
|
105
|
-
|
|
106
|
+
deps,
|
|
106
107
|
warnings,
|
|
107
108
|
failed,
|
|
108
109
|
clone,
|
|
@@ -2,7 +2,8 @@ import type { ScriptedPlan } from "../../lab/plan-types.js";
|
|
|
2
2
|
import { type PreparedRunArtifactPaths } from "../../run/paths.js";
|
|
3
3
|
import type { RunSubjectStateStepRecord } from "../../run/bundle.js";
|
|
4
4
|
import { type DesktopResourceObservation } from "../../substrates/e2b/desktop-resources.js";
|
|
5
|
-
import type {
|
|
5
|
+
import type { LabDeps } from "../../lab/lab-deps.js";
|
|
6
|
+
import type { RunLabHomes } from "../../lab/run-lab-homes.js";
|
|
6
7
|
type ScriptedCloneSubject = Extract<ScriptedPlan["subject"], {
|
|
7
8
|
readonly kind: "clone";
|
|
8
9
|
}>;
|
|
@@ -10,8 +11,10 @@ type ScriptedCloneSubject = Extract<ScriptedPlan["subject"], {
|
|
|
10
11
|
export interface ScriptedSubjectInputs {
|
|
11
12
|
plan: ScriptedPlan;
|
|
12
13
|
clone: ScriptedCloneSubject;
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
deps: LabDeps;
|
|
15
|
+
/** Runs after the subject sandbox exists and before provisioning. */
|
|
16
|
+
prepareDesktop?: NonNullable<RunLabHomes["prepareDesktop"]>;
|
|
17
|
+
env: Readonly<Record<string, string | undefined>>;
|
|
15
18
|
e2bApiKey: string;
|
|
16
19
|
runPaths: PreparedRunArtifactPaths;
|
|
17
20
|
timeoutMs: number;
|
|
@@ -26,6 +29,8 @@ export interface ScriptedSubjectInputs {
|
|
|
26
29
|
export declare class ScriptedSubject {
|
|
27
30
|
sandboxId: string | undefined;
|
|
28
31
|
killed: boolean;
|
|
32
|
+
/** The scrubbed release warning when the subject's release is unconfirmed. */
|
|
33
|
+
releaseWarning: string | undefined;
|
|
29
34
|
commit: string | undefined;
|
|
30
35
|
hostDigest: string | undefined;
|
|
31
36
|
readonly stateStepRecords: RunSubjectStateStepRecord[];
|
|
@@ -37,6 +37,8 @@ function hostOriginDigest(url) {
|
|
|
37
37
|
export class ScriptedSubject {
|
|
38
38
|
sandboxId;
|
|
39
39
|
killed = false;
|
|
40
|
+
/** The scrubbed release warning when the subject's release is unconfirmed. */
|
|
41
|
+
releaseWarning;
|
|
40
42
|
commit;
|
|
41
43
|
hostDigest;
|
|
42
44
|
stateStepRecords = [];
|
|
@@ -50,15 +52,15 @@ export class ScriptedSubject {
|
|
|
50
52
|
}
|
|
51
53
|
/** Acquires, provisions and serves the subject. Returns the tokenless getHost URL to drive. */
|
|
52
54
|
async provision() {
|
|
53
|
-
const { plan, clone,
|
|
55
|
+
const { plan, clone, deps, prepareDesktop, env, e2bApiKey, runPaths, timeoutMs } = this.inputs;
|
|
54
56
|
const { subjectEnvNames, hasGithubToken, scrubKnownValues, now } = this.inputs;
|
|
55
57
|
const requestTimeoutMs = e2bRequestTimeoutMs(env);
|
|
56
|
-
const timers =
|
|
58
|
+
const timers = deps.detachedTimers ?? {};
|
|
57
59
|
const subjectSandboxTimeoutMs = timeoutMs +
|
|
58
60
|
SUBJECT_PROVISION_BUDGET_MS +
|
|
59
61
|
(clone.state?.seed ?? []).reduce((sum, step) => sum + (step.timeoutMs ?? DEFAULT_STATE_STEP_TIMEOUT_MS), 0) +
|
|
60
62
|
SANDBOX_TIMEOUT_BUFFER_MS;
|
|
61
|
-
const subjectModule = await (
|
|
63
|
+
const subjectModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
|
|
62
64
|
await validatePreparedRunArtifactPaths(runPaths);
|
|
63
65
|
// The receipt is on disk before any work on the sandbox, so `humanish reclaim` can kill
|
|
64
66
|
// it by exact id when this process dies mid-run; the finally block below only runs while
|
|
@@ -73,7 +75,7 @@ export class ScriptedSubject {
|
|
|
73
75
|
mode: "scripted-browser-lab",
|
|
74
76
|
tool: "humanish",
|
|
75
77
|
labId: plan.labId,
|
|
76
|
-
|
|
78
|
+
kind: "subject",
|
|
77
79
|
actor: plan.actor,
|
|
78
80
|
},
|
|
79
81
|
...(subjectEnvNames.length > 0
|
|
@@ -92,8 +94,8 @@ export class ScriptedSubject {
|
|
|
92
94
|
this.sandboxId = subject.allocation.resourceId;
|
|
93
95
|
this.createdAtMs = now();
|
|
94
96
|
this.resources = await observeDesktopResources(subjectDesktop);
|
|
95
|
-
if (
|
|
96
|
-
await
|
|
97
|
+
if (prepareDesktop) {
|
|
98
|
+
await prepareDesktop(subjectDesktop, { kind: "subject" });
|
|
97
99
|
await validatePreparedRunArtifactPaths(runPaths);
|
|
98
100
|
}
|
|
99
101
|
this.commit = await provisionCloneSubject(e2bShell(subjectDesktop), {
|
|
@@ -137,6 +139,8 @@ export class ScriptedSubject {
|
|
|
137
139
|
this.killed = reading.released;
|
|
138
140
|
if (reading.warning)
|
|
139
141
|
warnings.push(reading.warning);
|
|
142
|
+
if (!reading.released)
|
|
143
|
+
this.releaseWarning = reading.warning ?? "Subject sandbox release is unconfirmed.";
|
|
140
144
|
// Without a kill method, or in E2B debug mode, no kill reached E2B, so there is no teardown
|
|
141
145
|
// time to record.
|
|
142
146
|
if (released.status !== "unconfirmed" || released.reason !== "release_unavailable")
|
|
@@ -18,7 +18,7 @@ export function scriptedSurfaceRecords(context, surface, index, result, screensh
|
|
|
18
18
|
: "contract_proof_only";
|
|
19
19
|
const reason = result?.reason ??
|
|
20
20
|
context.sessionError ??
|
|
21
|
-
"
|
|
21
|
+
"Dry run: the scenario was pinned without launching a browser or touching the subject app.";
|
|
22
22
|
const simulation = participantRecord(ids, index + 1, {
|
|
23
23
|
personaId: context.persona.id,
|
|
24
24
|
scenarioId: context.journey.scenarioId,
|
|
@@ -31,20 +31,20 @@ export function scriptedSurfaceRecords(context, surface, index, result, screensh
|
|
|
31
31
|
? `Scripted-browser actor (${context.actorId}) replayed ${context.journey.scenarioId} on the ${surface.id} surface; ${result.completionReason}.`
|
|
32
32
|
: context.sessionError !== undefined
|
|
33
33
|
? `Scripted lab failed before a terminal session verdict: ${context.sessionError}`
|
|
34
|
-
: `
|
|
34
|
+
: `Scripted-browser actor (${context.actorId}) against ${context.appUrl}; no session ran.`,
|
|
35
35
|
startedAt: context.createdAt,
|
|
36
36
|
updatedAt: result?.capture.capturedAt ?? context.createdAt,
|
|
37
37
|
});
|
|
38
38
|
const stream = participantStream(ids, {
|
|
39
39
|
kind: "browser",
|
|
40
|
-
label: `${surface.label}
|
|
40
|
+
label: `${surface.label} · ${context.labId}`,
|
|
41
41
|
status,
|
|
42
42
|
transport: "snapshot",
|
|
43
43
|
updatedAt: result?.capture.capturedAt ?? context.createdAt,
|
|
44
44
|
embed: lastScreenshot
|
|
45
45
|
? { kind: "screenshot", url: `../${lastScreenshot}`, title: `${surface.label} (raw)` }
|
|
46
46
|
: { kind: "placeholder", title: surface.label },
|
|
47
|
-
//
|
|
47
|
+
// Real emulated viewport: isMobile/deviceScaleFactor genuinely render on this route
|
|
48
48
|
// (playwright emulation), unlike the e2b-desktop route's prompt-signal-only fidelity.
|
|
49
49
|
viewport: surface.viewport,
|
|
50
50
|
ui: {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { type ScriptedBrowserSessionOptions, type ScriptedBrowserSessionResult } from "../../actors/scripted-browser/actor.js";
|
|
2
2
|
import type { ScriptedPlan } from "../../lab/plan-types.js";
|
|
3
3
|
import { type PreparedRunArtifactPaths } from "../../run/paths.js";
|
|
4
|
-
import type {
|
|
4
|
+
import type { LabDeps } from "../../lab/lab-deps.js";
|
|
5
5
|
/** One session per surface, in parallel. */
|
|
6
6
|
export declare function runScriptedSessions(session: Required<Pick<ScriptedBrowserSessionOptions, "appUrl" | "evidenceAppUrl" | "urlPolicy" | "journey" | "persona" | "timeoutMs" | "artifactRoot">>, run: {
|
|
7
7
|
surfaces: ScriptedPlan["surfaces"];
|
|
8
|
-
|
|
8
|
+
deps: LabDeps;
|
|
9
9
|
browserCommand: string | undefined;
|
|
10
10
|
runPaths: PreparedRunArtifactPaths;
|
|
11
11
|
}): Promise<ScriptedBrowserSessionResult[]>;
|
|
@@ -7,8 +7,8 @@ import { validateScriptedSessionResult } from "./session-result.js";
|
|
|
7
7
|
/** One session per surface, in parallel. */
|
|
8
8
|
export function runScriptedSessions(session, run) {
|
|
9
9
|
const { appUrl, evidenceAppUrl, urlPolicy, journey, persona, timeoutMs, artifactRoot } = session;
|
|
10
|
-
const { surfaces,
|
|
11
|
-
const runSession =
|
|
10
|
+
const { surfaces, deps, browserCommand, runPaths } = run;
|
|
11
|
+
const runSession = deps.runScriptedSession;
|
|
12
12
|
return Promise.all(surfaces.map((surface) => {
|
|
13
13
|
const sessionOptions = {
|
|
14
14
|
appUrl,
|
|
@@ -20,8 +20,8 @@ export function runScriptedSessions(session, run) {
|
|
|
20
20
|
timeoutMs,
|
|
21
21
|
artifactRoot,
|
|
22
22
|
...(browserCommand === undefined ? {} : { browserCommand }),
|
|
23
|
-
...(
|
|
24
|
-
...(
|
|
23
|
+
...(deps.launchBrowser === undefined ? {} : { launchBrowser: deps.launchBrowser }),
|
|
24
|
+
...(deps.now === undefined ? {} : { now: deps.now }),
|
|
25
25
|
};
|
|
26
26
|
return runSession
|
|
27
27
|
? runSession(sessionOptions).then(async (result) => {
|
|
@@ -1,48 +1,31 @@
|
|
|
1
1
|
import type { ActorCompletionReason, ActorStatus } from "../../actors/contract.js";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type { AutomaticAnalysisHooks, AutomaticAnalysisResult } from "../../analysis/automatic-completion.js";
|
|
2
|
+
import type { LabEvent } from "../../lab/run-lab-events.js";
|
|
3
|
+
import type { AutomaticAnalysisResult } from "../../analysis/automatic-completion.js";
|
|
5
4
|
import type { LabConfig } from "../../lab/types.js";
|
|
6
|
-
import {
|
|
5
|
+
import type { ObserverResult } from "../../observer/render.js";
|
|
7
6
|
import type { RunSubjectProvenance } from "../../run/bundle.js";
|
|
8
|
-
import type {
|
|
9
|
-
import type {
|
|
10
|
-
import
|
|
11
|
-
export declare const SCRIPTED_BROWSER_LAB_SCHEMA = "humanish.scripted-lab-result.v1";
|
|
12
|
-
/**
|
|
13
|
-
* Library-level hooks: DI seams so CI drives the full path (real engine, real projection)
|
|
14
|
-
* with a fake browser at zero spend, plus the production browser resolution override.
|
|
15
|
-
*/
|
|
16
|
-
export interface ScriptedBrowserLabHooks {
|
|
17
|
-
runSession?: (options: ScriptedBrowserSessionOptions) => Promise<ScriptedBrowserSessionResult>;
|
|
18
|
-
/** Injected browser factory — forwarded to every session; skips browser-binary resolution. */
|
|
19
|
-
launchBrowser?: (args: ScriptedBrowserLaunchArgs) => Promise<ScriptedBrowserLike>;
|
|
20
|
-
/** Test/library env seam; CLI passes process.env. Values are scrubbed, names only persist. */
|
|
21
|
-
env?: Record<string, string | undefined>;
|
|
22
|
-
/** E2B DI seam for clone × e2b-desktop × scripted-browser. */
|
|
23
|
-
loadDesktopModule?: () => Promise<E2BDesktopModule>;
|
|
24
|
-
/** Optional adopter hook after subject sandbox creation, before clone provisioning. */
|
|
25
|
-
prepareDesktop?: (desktop: E2BDesktopSandbox) => Promise<void>;
|
|
26
|
-
/** Detached-step timers for deterministic tests around clone/seed/start provisioning. */
|
|
27
|
-
detachedTimers?: DetachedTimers;
|
|
28
|
-
/** Override the resolved browser binary (tests; operators use HUMANISH_BROWSER_COMMAND). */
|
|
29
|
-
browserCommand?: string;
|
|
30
|
-
renderObserverFn?: typeof renderObserver;
|
|
31
|
-
now?: () => number;
|
|
32
|
-
}
|
|
7
|
+
import type { LabDeps } from "../../lab/lab-deps.js";
|
|
8
|
+
import type { RunLabHomes } from "../../lab/run-lab-homes.js";
|
|
9
|
+
import { type StudyResultIdentity } from "../../run/study-result.js";
|
|
33
10
|
/** What a scripted run takes besides its plan. The plan carries the config, dry run and lab. */
|
|
34
11
|
export type ScriptedRunInput = Omit<RunScriptedBrowserLabOptions, "config" | "dryRun" | "lab">;
|
|
35
12
|
export interface RunScriptedBrowserLabOptions {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
13
|
+
/** Cancels post-run analysis only. */
|
|
14
|
+
analysisSignal?: AbortSignal;
|
|
15
|
+
/** Reports the analysis window to onEvent; built by normalizeRunLabOptions. */
|
|
16
|
+
emit?: (event: LabEvent) => void;
|
|
39
17
|
cwd: string;
|
|
40
18
|
config: LabConfig;
|
|
41
19
|
/** Resolved upstream (scenario.mode + CLI override); defaults safe (dry-run). */
|
|
42
20
|
dryRun: boolean;
|
|
43
21
|
open?: boolean;
|
|
44
22
|
runId?: string;
|
|
45
|
-
|
|
23
|
+
/** Keys and subject env for the run. Defaults to process.env. Values are scrubbed; names persist. */
|
|
24
|
+
env?: Readonly<Record<string, string | undefined>>;
|
|
25
|
+
/** Runs after a clone subject's sandbox exists and before provisioning. */
|
|
26
|
+
prepareDesktop?: NonNullable<RunLabHomes["prepareDesktop"]>;
|
|
27
|
+
/** Test seams: the browser, the session, the E2B module, timers, the renderer and the clock. */
|
|
28
|
+
deps?: LabDeps;
|
|
46
29
|
}
|
|
47
30
|
interface ScriptedBrowserLabSession {
|
|
48
31
|
surface: string;
|
|
@@ -51,14 +34,12 @@ interface ScriptedBrowserLabSession {
|
|
|
51
34
|
reason: string;
|
|
52
35
|
screenshots: number;
|
|
53
36
|
}
|
|
54
|
-
export interface ScriptedBrowserLabResult extends AutomaticAnalysisResult {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
*
|
|
58
|
-
* failure. */
|
|
37
|
+
export interface ScriptedBrowserLabResult extends AutomaticAnalysisResult, StudyResultIdentity<"scripted"> {
|
|
38
|
+
/** True when the bundle verified and (dry-run, or every session reached a terminal verdict
|
|
39
|
+
* without a harness error). The subject failing the script is successful evidence, and the lab
|
|
40
|
+
* does not fail for it. */
|
|
59
41
|
ok: boolean;
|
|
60
42
|
cwd: string;
|
|
61
|
-
labId: string;
|
|
62
43
|
/** The registry-resolved actor id that ran (or would run) the sessions. */
|
|
63
44
|
actor: string;
|
|
64
45
|
appUrl: string;
|
|
@@ -81,7 +62,7 @@ export interface ScriptedBrowserLabResult extends AutomaticAnalysisResult {
|
|
|
81
62
|
observer?: ObserverResult;
|
|
82
63
|
warnings: string[];
|
|
83
64
|
error?: {
|
|
84
|
-
code: "
|
|
65
|
+
code: "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_STUDY_OPTION_UNSUPPORTED" | "HUMANISH_SCRIPTED_FAILED" | "HUMANISH_SCRIPTED_ACTOR_UNSUPPORTED" | "HUMANISH_SCRIPTED_SCENARIO_INVALID" | "HUMANISH_SCRIPTED_SUBJECT_UNSAFE" | "HUMANISH_SCRIPTED_BROWSER_MISSING" | "HUMANISH_SCRIPTED_KEYS_MISSING" | "HUMANISH_SCRIPTED_SUBJECT_ENV_MISSING" | "HUMANISH_SCRIPTED_GETHOST_UNAVAILABLE" | "HUMANISH_RUN_ID_IN_USE";
|
|
85
66
|
message: string;
|
|
86
67
|
};
|
|
87
68
|
}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
// The scripted-browser lab's schema constant,
|
|
2
|
-
import {
|
|
3
|
-
export const SCRIPTED_BROWSER_LAB_SCHEMA = "humanish.scripted-lab-result.v1";
|
|
1
|
+
// The scripted-browser lab's schema constant, options and result types.
|
|
2
|
+
import {} from "../../run/study-result.js";
|