humanish 0.107.0 → 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 +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- 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-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +8 -6
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- 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 +14 -12
- package/dist/actors/computer-use/loop/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- 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 +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- 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 +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- 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 +78 -43
- 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/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- 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.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- 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 +147 -108
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +137 -138
- 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 +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -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 +41 -6
- package/dist/cli/io.js +97 -22
- 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 +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- 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/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 +3 -3
- 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 +4 -4
- package/dist/feedback/draft.js +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- 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 +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- 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 +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- 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 +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- 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 +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +1 -1
- package/dist/observer/serve.js +7 -3
- 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 +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- 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 +5 -4
- package/dist/run/run.js +1 -1
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +36 -35
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- 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/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- 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 +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- 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 +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- 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 +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +1 -1
- 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 +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- 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 +82 -82
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- 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 +16 -16
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- 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 +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- 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/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 +7 -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 +60 -58
- 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 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- 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 -295
- 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
|
@@ -10,7 +10,7 @@ import type { AutomaticAnalysisRefusal } from "../../analysis/job.js";
|
|
|
10
10
|
import { type CuaDiagnostics } from "./diagnostics.js";
|
|
11
11
|
import type { ActorCompletionReason, ActorStatus, ActorStopCause, ActorTokenUsage, ActorTraceItem } from "../../actors/contract.js";
|
|
12
12
|
import { type CuaActorDescriptor } from "../../actors/registry.js";
|
|
13
|
-
import type { LabDeps
|
|
13
|
+
import type { LabDeps } from "../../lab/lab-deps.js";
|
|
14
14
|
import type { LabEvent, ParticipantRef } from "../../lab/run-lab-events.js";
|
|
15
15
|
import type { InProcessDriver, ProviderFactory, RunLabHomes } from "../../lab/run-lab-homes.js";
|
|
16
16
|
import { type BrowserScorer } from "../../lab/adapter-extension.js";
|
|
@@ -26,7 +26,7 @@ import { type RunDesktopGeometry } from "../../run/streams.js";
|
|
|
26
26
|
import { type PreparedOutputRoot } from "../../run/contained-output.js";
|
|
27
27
|
import type { ComputerUseParticipant, SharedWorldParticipant } from "../../lab/plan-participants.js";
|
|
28
28
|
import type { ResolvedParticipant } from "../../run/participant.js";
|
|
29
|
-
|
|
29
|
+
import { type StudyResultIdentity } from "../../run/study-result.js";
|
|
30
30
|
export declare const CUA_FANOUT_STRATEGY: "per-lane-worlds";
|
|
31
31
|
export declare const CUA_MAX_CONCURRENCY_ENV = "HUMANISH_CUA_MAX_CONCURRENCY";
|
|
32
32
|
export declare const DEFAULT_APP_URL_SESSION_TIMEOUT_MS: number;
|
|
@@ -57,7 +57,7 @@ export interface RunCuaActorLabOptions {
|
|
|
57
57
|
open?: boolean;
|
|
58
58
|
runId?: string;
|
|
59
59
|
/** CLI `--count` override for the homogeneous fan-out participant count (ignored when a `lanes`
|
|
60
|
-
* roster is declared
|
|
60
|
+
* roster is declared; a roster's length is authoritative). */
|
|
61
61
|
countOverride?: number;
|
|
62
62
|
/** Explicitly create a new run containing failed or selected participants from a prior fan-out run. */
|
|
63
63
|
rerun?: {
|
|
@@ -85,12 +85,12 @@ export interface RunCuaActorLabOptions {
|
|
|
85
85
|
deps?: LabDeps;
|
|
86
86
|
/** Scores the assembled evidence: `RunLabOptions.scorer`, or the scorer the CLI loads. */
|
|
87
87
|
scorer?: BrowserScorer;
|
|
88
|
-
/** Present only when the scorer was
|
|
88
|
+
/** Present only when the scorer was config-declared and loaded by the CLI;
|
|
89
89
|
* core-stamped onto the bundle as evidence. Absent for library callers. */
|
|
90
90
|
scorerProvenance?: RunScorerProvenance;
|
|
91
91
|
}
|
|
92
92
|
/** A participant's row in the pre-flight plan: identity + the device/persona it will drive. The prompt
|
|
93
|
-
* text never leaks
|
|
93
|
+
* text never leaks: only a sha256-16 digest of the composed instructions. */
|
|
94
94
|
export interface CuaParticipantPlanEntry {
|
|
95
95
|
id: string;
|
|
96
96
|
actorType?: string;
|
|
@@ -104,7 +104,7 @@ export interface CuaParticipantPlanEntry {
|
|
|
104
104
|
resolution: [number, number];
|
|
105
105
|
instructionDigest: string;
|
|
106
106
|
/** The declared reasoning effort for this participant, when the lab declared one. The plan line is what
|
|
107
|
-
* you read
|
|
107
|
+
* you read before spending money, so a declared per-participant difference has to be visible there. */
|
|
108
108
|
reasoningEffort?: string;
|
|
109
109
|
maxOutputTokens?: number;
|
|
110
110
|
/** Present only when a participant overrides subject.appUrl; digest avoids leaking preview hosts in plan logs. */
|
|
@@ -115,23 +115,23 @@ export interface CuaParticipantPlanEntry {
|
|
|
115
115
|
export interface CuaParticipantPlan {
|
|
116
116
|
strategy: typeof CUA_FANOUT_STRATEGY;
|
|
117
117
|
laneCount: number;
|
|
118
|
-
/** Effective in-flight bound (defaults to laneCount
|
|
119
|
-
* execution.concurrency is a cap; the env override may only
|
|
118
|
+
/** Effective in-flight bound (defaults to laneCount, all participants live; a declared
|
|
119
|
+
* execution.concurrency is a cap; the env override may only lower it). */
|
|
120
120
|
concurrency: number;
|
|
121
|
-
/** Present when the env override lowered the bound below the config's value
|
|
121
|
+
/** Present when the env override lowered the bound below the config's value, recorded so the
|
|
122
122
|
* plan never silently disagrees with the manifest. */
|
|
123
123
|
envLoweredConcurrencyFrom?: number;
|
|
124
124
|
/** ceil(laneCount / concurrency). */
|
|
125
125
|
waves: number;
|
|
126
126
|
/** Per-participant session wall-clock budget (execution.timeoutMs); there is no run-level wall clock. */
|
|
127
127
|
perLaneSessionBudgetMs: number;
|
|
128
|
-
/** Worst-case
|
|
128
|
+
/** Worst-case total sandbox-minutes across all participants (each one's full sandbox deadline). */
|
|
129
129
|
worstCaseSandboxMinutes: number;
|
|
130
130
|
/** True for a dry-run plan (no spend); the same table appears live. */
|
|
131
131
|
dryRun: boolean;
|
|
132
132
|
lanes: CuaParticipantPlanEntry[];
|
|
133
133
|
}
|
|
134
|
-
/** One participant's outcome in the result projection.
|
|
134
|
+
/** One participant's outcome in the result projection. Always present in `result.lanes` (length
|
|
135
135
|
* 1 at N=1). A `blocked` participant is one the pipeline-gate / fail-fast skipped before it ran. */
|
|
136
136
|
export interface CuaParticipantResult {
|
|
137
137
|
id: string;
|
|
@@ -183,8 +183,8 @@ export interface CuaParticipantSummary {
|
|
|
183
183
|
concurrency: number;
|
|
184
184
|
waves: number;
|
|
185
185
|
}
|
|
186
|
-
export type CuaActorLabErrorCode = "
|
|
187
|
-
/** Subject provenance projection
|
|
186
|
+
export type CuaActorLabErrorCode = "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_STUDY_OPTION_UNSUPPORTED" | "HUMANISH_COMPUTER_USE_FAILED" | "HUMANISH_COMPUTER_USE_KEYS_MISSING" | "HUMANISH_COMPUTER_USE_AGENT_MISSING" | "HUMANISH_COMPUTER_USE_AGENT_SIGNIN_REQUIRED" | "HUMANISH_COMPUTER_USE_SUBJECT_ENV_MISSING" | "HUMANISH_COMPUTER_USE_ACTOR_UNSUPPORTED" | "HUMANISH_COMPUTER_USE_SUBJECT_INVALID" | "HUMANISH_COMPUTER_USE_SUBJECT_UNSAFE" | "HUMANISH_COMPUTER_USE_EXECUTOR_NO_PROVIDER" | "HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR" | "HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING" | "HUMANISH_COMPUTER_USE_FANOUT_INVALID" | "HUMANISH_COMPUTER_USE_RERUN_INVALID" | "HUMANISH_COMPUTER_USE_DEVICE_GEOMETRY" | "HUMANISH_RUN_ID_IN_USE" | "HUMANISH_COMPUTER_USE_UNPRICED_CAP" | "HUMANISH_COMPUTER_USE_COMMS_CATCH_UNREACHABLE" | "HUMANISH_COMPUTER_USE_COMMS_TOKEN_INVALID" | "HUMANISH_WATCH_ALLOW_REQUIRES_OAUTH" | "HUMANISH_WATCH_OAUTH_REQUIRES_TUNNEL" | "HUMANISH_WATCH_OPTION_CONFLICT" | "HUMANISH_WATCH_TUNNEL_REQUIRES_EXPOSE" | "HUMANISH_WATCH_EXPOSE_REQUIRES_EDGE_AUTH" | "HUMANISH_WATCH_EXPOSE_REQUIRES_LIVE_FOLLOW" | "HUMANISH_WATCH_SAFE_NOT_APPLICABLE" | "HUMANISH_SERVE_TUNNEL_NOT_FOUND" | "HUMANISH_SERVE_TUNNEL_START_FAILED";
|
|
187
|
+
/** Subject provenance projection: what the actor actually drove. */
|
|
188
188
|
export interface CuaSubjectProjection {
|
|
189
189
|
source: "app-url" | "clone" | "local-tree";
|
|
190
190
|
/** Clone-route only: the (possibly redacted) owner/repo slug. */
|
|
@@ -198,9 +198,9 @@ export interface CuaSubjectProjection {
|
|
|
198
198
|
/** Local-tree-route only: host-side porcelain status at pack time (true when the working
|
|
199
199
|
* tree had uncommitted changes). Absent when the packed root was not a git work tree. */
|
|
200
200
|
dirty?: boolean;
|
|
201
|
-
/** Declared env
|
|
201
|
+
/** Declared env names provisioned for the subject (values never surface anywhere). */
|
|
202
202
|
envNames?: string[];
|
|
203
|
-
/** The subject's state story (seeded digests /
|
|
203
|
+
/** The subject's state story (seeded digests / unpinned external / declared-not-run /
|
|
204
204
|
* undeclared): the same block the run bundle records. */
|
|
205
205
|
state: RunSubjectProvenance["state"];
|
|
206
206
|
}
|
|
@@ -221,13 +221,11 @@ export type CuaSubjectProvenanceArg = {
|
|
|
221
221
|
envNames: string[];
|
|
222
222
|
state: RunSubjectProvenance["state"];
|
|
223
223
|
};
|
|
224
|
-
export interface CuaActorLabResult extends AutomaticAnalysisResult {
|
|
225
|
-
schema: typeof CUA_ACTOR_LAB_SCHEMA;
|
|
224
|
+
export interface CuaActorLabResult extends AutomaticAnalysisResult, StudyResultIdentity<"computer-use"> {
|
|
226
225
|
/** True when the Observer verified the bundle, all live participants passed credibility checks
|
|
227
226
|
* (or this is a dry-run), and no declared adapter/scorer verdict failed. */
|
|
228
227
|
ok: boolean;
|
|
229
228
|
cwd: string;
|
|
230
|
-
labId: string;
|
|
231
229
|
/** The registry-resolved actor id that ran (or would run) the session. */
|
|
232
230
|
actor: string;
|
|
233
231
|
appUrl: string;
|
|
@@ -244,16 +242,16 @@ export interface CuaActorLabResult extends AutomaticAnalysisResult {
|
|
|
244
242
|
sandbox?: {
|
|
245
243
|
sandboxId: string;
|
|
246
244
|
killed: boolean;
|
|
247
|
-
/** The stream URL itself (carries an auth key) is runtime-only and is deliberately
|
|
248
|
-
* surfaced on the result
|
|
245
|
+
/** The stream URL itself (carries an auth key) is runtime-only and is deliberately not
|
|
246
|
+
* surfaced on the result; the sandbox is already dead by the time the result exists. */
|
|
249
247
|
streamUrlPresent: boolean;
|
|
250
248
|
};
|
|
251
|
-
/** Subject provenance
|
|
249
|
+
/** Subject provenance: what the actor actually drove. At N>1 this is the
|
|
252
250
|
* unanimity-gated aggregate (top-level `commit` only when every participant resolved the same one). */
|
|
253
251
|
subject?: CuaSubjectProjection;
|
|
254
252
|
/** The pre-flight participant plan (present once participants resolve; absent on early validation errors). */
|
|
255
253
|
plan?: CuaParticipantPlan;
|
|
256
|
-
/** Per-participant results
|
|
254
|
+
/** Per-participant results, always present once participants resolve (length 1 at N=1). */
|
|
257
255
|
lanes?: CuaParticipantResult[];
|
|
258
256
|
/** Aggregate participant counts. */
|
|
259
257
|
laneSummary?: CuaParticipantSummary;
|
|
@@ -293,8 +291,8 @@ export interface ParticipantRunsAndPlan {
|
|
|
293
291
|
participantPlan: CuaParticipantPlan;
|
|
294
292
|
}
|
|
295
293
|
/**
|
|
296
|
-
* The
|
|
297
|
-
* own latest running
|
|
294
|
+
* The study's shared spend ledger: one counter across every participant. Each one notes its
|
|
295
|
+
* own latest running model-spend estimate (monotone per participant: an estimate can only grow)
|
|
298
296
|
* and reads back the run total; the loop stops the participant the moment the total crosses the study budget.
|
|
299
297
|
* Estimated model spend only: desktop-minutes ride the cost summary, not this ledger.
|
|
300
298
|
*/
|
|
@@ -308,8 +306,8 @@ export interface CuaRunBudget {
|
|
|
308
306
|
* The subject as a participant's desktop meets it. A computer-use participant gets the plan's
|
|
309
307
|
* subject: a clone or local tree is provisioned in its own sandbox with the declared env, a
|
|
310
308
|
* desktop-cli product is set up there, and an app-url or local-app subject is only opened. A
|
|
311
|
-
* shared-world
|
|
312
|
-
* names forwarded, no GitHub token and no provisioning in its sandbox.
|
|
309
|
+
* shared-world participant gets `shared-app`: it opens the one app the plane serves, with no
|
|
310
|
+
* subject env names forwarded, no GitHub token and no provisioning in its sandbox.
|
|
313
311
|
*/
|
|
314
312
|
export type ParticipantSubject = ComputerUseRunner["subject"] | {
|
|
315
313
|
readonly kind: "shared-app";
|
|
@@ -341,14 +339,14 @@ export interface E2BDesktopDeps {
|
|
|
341
339
|
labCwd: string;
|
|
342
340
|
scrubKnownValues: (text: string) => string;
|
|
343
341
|
receiving?: CommsReceivingRun;
|
|
344
|
-
/** Adopter-hosted comms plane
|
|
342
|
+
/** Adopter-hosted comms plane: present on the app-url route when comms.email.external is
|
|
345
343
|
* declared. Carries the parsed comms block (recipients drive the per-participant inbox instruction)
|
|
346
344
|
* and the inbox URL the persona opens. The drain runs once at run level, not per participant. */
|
|
347
345
|
externalComms?: {
|
|
348
346
|
email: LabCommsEmail;
|
|
349
347
|
inboxUrl: string;
|
|
350
348
|
};
|
|
351
|
-
/** Injected clock (ms).
|
|
349
|
+
/** Injected clock (ms). It measures the host-side E2B desktop create->teardown span so the
|
|
352
350
|
* desktop-minute cost estimate is deterministic in tests. Defaults to Date.now. */
|
|
353
351
|
now: () => number;
|
|
354
352
|
/** Loads the E2B SDK for the participant's desktop. Defaults to loadE2BDesktopModule. */
|
|
@@ -360,9 +358,9 @@ export interface E2BDesktopDeps {
|
|
|
360
358
|
/** Receives each live stream's ready and ended: the Observer's tracker, then the caller's onStream. */
|
|
361
359
|
onStream: NonNullable<RunLabHomes["onStream"]>;
|
|
362
360
|
/** Reports a subject phase to the phase sink (stderr by default) and to onEvent. */
|
|
363
|
-
reportSubjectPhase: (event: SubjectPhaseEvent, participant:
|
|
361
|
+
reportSubjectPhase: (event: SubjectPhaseEvent, participant: ParticipantRef) => void;
|
|
364
362
|
/**
|
|
365
|
-
* How a
|
|
363
|
+
* How a parseable requested-vs-verified screen mismatch is treated. Default ("fail-closed"):
|
|
366
364
|
* the participant's device claim is falsified, so it fails with DEVICE_GEOMETRY (the
|
|
367
365
|
* single-participant/fan-out contract). "record-evidence" (the concurrent shared-world route):
|
|
368
366
|
* requested and verified stay recorded as separate facts plus an explicit warning, and the
|
|
@@ -386,22 +384,22 @@ export interface ParticipantModelDeps {
|
|
|
386
384
|
redactScreenshots: boolean;
|
|
387
385
|
scrubKnownValues: (text: string) => string;
|
|
388
386
|
/** The study's shared spend ledger, present exactly when execution.caps.maxTotalUsd is set on a
|
|
389
|
-
* live run
|
|
387
|
+
* live run. Preflight already refused the cap on an unpriced model. */
|
|
390
388
|
runBudget?: CuaRunBudget;
|
|
391
389
|
/**
|
|
392
|
-
*
|
|
393
|
-
* orchestrator watches this
|
|
394
|
-
* CuaLoopOptions.onObservedUrl). The concurrent shared-world barrier passes a host
|
|
390
|
+
* runtime-only observed-URL callback (the shared-world handoff): threaded into the participant's session so the
|
|
391
|
+
* orchestrator watches this participant's live location.href mid-run. Never persisted (see
|
|
392
|
+
* CuaLoopOptions.onObservedUrl). The concurrent shared-world barrier passes a host latch here
|
|
395
393
|
* to extract a /lobby/CODE; on ordinary routes it is undefined (no-op).
|
|
396
394
|
*/
|
|
397
395
|
onObservedUrl?: (url: string | undefined) => void;
|
|
398
|
-
/**
|
|
399
|
-
* shared-world barrier passes a host
|
|
396
|
+
/** runtime-only per-turn narration callback; see CuaLoopOptions.onMessage. The concurrent
|
|
397
|
+
* shared-world barrier passes a host message scanner here to latch the lobby code. */
|
|
400
398
|
onMessage?: (text: string) => void;
|
|
401
|
-
/**
|
|
402
|
-
* shared-world barrier passes a host
|
|
399
|
+
/** runtime-only per-turn raw-frame callback; see CuaLoopOptions.onScreenshot. The concurrent
|
|
400
|
+
* shared-world barrier passes a host vision reader here to latch the lobby code off-screen. */
|
|
403
401
|
onScreenshot?: (frame: Buffer) => void;
|
|
404
|
-
/** Per-turn trace snapshot from a participant's loop
|
|
402
|
+
/** Per-turn trace snapshot from a participant's loop, keyed by participant. The live path
|
|
405
403
|
* wires the incremental in-progress flush here so the attached Observer's timeline grows mid-run. */
|
|
406
404
|
onTrace?: (participantId: string, items: readonly ActorTraceItem[], usage?: ActorTokenUsage, metadata?: CuaLiveMetadata) => void;
|
|
407
405
|
}
|
|
@@ -438,8 +436,8 @@ export interface ParticipantRunOutcome {
|
|
|
438
436
|
* the session's evidence does not show. An execution failure, scrubbed, like the cleanup one. */
|
|
439
437
|
providerPolicyError?: string;
|
|
440
438
|
sandboxId?: string;
|
|
441
|
-
/** Host-side E2B desktop create->teardown span (ms). An
|
|
442
|
-
* billed lifetime (server-side kill-on-timeout can extend it)
|
|
439
|
+
/** Host-side E2B desktop create->teardown span (ms). An approximation of E2B's server-side
|
|
440
|
+
* billed lifetime (server-side kill-on-timeout can extend it), so the derived dollar figure is
|
|
443
441
|
* doubly an estimate. Absent on the in-process route (no sandbox) and on dry-run. */
|
|
444
442
|
desktopDurationMs?: number;
|
|
445
443
|
desktopResources?: DesktopResourceObservation;
|
|
@@ -463,7 +461,7 @@ export interface ParticipantRunOutcome {
|
|
|
463
461
|
skippedReason?: string;
|
|
464
462
|
noEngagement: boolean;
|
|
465
463
|
selfReportedBlocker: boolean;
|
|
466
|
-
/** The inclusive friction read
|
|
464
|
+
/** The inclusive friction read: blocker-shaped narration incl. self-resolved arcs.
|
|
467
465
|
* Feeds the participants tally and feedback candidates; never the participant verdict. Optional so
|
|
468
466
|
* external outcome constructors (shared-world, test fakes) stay valid; absent counts as false. */
|
|
469
467
|
reportedFriction?: boolean;
|
|
@@ -11,24 +11,24 @@ import {} from "../../observer/render.js";
|
|
|
11
11
|
import {} from "../../run/bundle.js";
|
|
12
12
|
import {} from "../../run/streams.js";
|
|
13
13
|
import {} from "../../run/contained-output.js";
|
|
14
|
-
|
|
15
|
-
// The
|
|
16
|
-
//
|
|
14
|
+
import {} from "../../run/study-result.js";
|
|
15
|
+
// The fan-out topology of this route: N participants = N independent E2B desktop sandboxes,
|
|
16
|
+
// each its own world (clone/serve + subject.state per participant). Shared-world has its own route.
|
|
17
17
|
export const CUA_FANOUT_STRATEGY = "per-lane-worlds";
|
|
18
|
-
// Env override that may only
|
|
19
|
-
// desktops
|
|
18
|
+
// Env override that may only lower the effective concurrency (never raise concurrent paid
|
|
19
|
+
// desktops). Read names-only into a local; the value never persists.
|
|
20
20
|
export const CUA_MAX_CONCURRENCY_ENV = "HUMANISH_CUA_MAX_CONCURRENCY";
|
|
21
|
-
// The
|
|
22
|
-
// session ends because the participant is done, not because a timer fired
|
|
21
|
+
// The default session budget, sized so a study can finish (docs/principles/three-roles.md: a
|
|
22
|
+
// session ends because the participant is done, not because a timer fired; the time-box is a
|
|
23
23
|
// session-level cap a researcher sets generously; spend protection is the dollar caps' job).
|
|
24
24
|
// The old 300s default ended real signup studies mid-flow: observed studies run 16-40 turns at
|
|
25
|
-
// ~5-6s per turn
|
|
25
|
+
// ~5-6s per turn before any email wait, so five minutes was the biggest single source of
|
|
26
26
|
// budget_reached endings that read as participant failures.
|
|
27
27
|
//
|
|
28
28
|
// App-url and in-process routes default to 30 minutes. Provisioned routes (clone/local-tree)
|
|
29
29
|
// default to whatever the 1-hour sandbox cap leaves after provisioning, declared state seeding,
|
|
30
|
-
// and the teardown buffer
|
|
31
|
-
// a state-heavy lab still gets a session at all. An
|
|
30
|
+
// and the teardown buffer (20 minutes on a stateless clone), floored at the old five minutes so
|
|
31
|
+
// a state-heavy lab still gets a session at all. An explicit execution.timeoutMs is never
|
|
32
32
|
// adjusted: when it cannot be provisioned, the plan-time cap refusal shows the arithmetic.
|
|
33
33
|
export const DEFAULT_APP_URL_SESSION_TIMEOUT_MS = 30 * 60_000;
|
|
34
34
|
export const MIN_DERIVED_SESSION_TIMEOUT_MS = 5 * 60_000;
|
package/dist/routes/preview.d.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import type { AdmittedPlan, RunLabOptions } from "../run-lab.js";
|
|
2
2
|
import type { LabPlan, PlanRefusal } from "../lab/plan-types.js";
|
|
3
3
|
import type { RunResult } from "../run/results.js";
|
|
4
|
+
import { type StudyResultIdentity } from "../run/study-result.js";
|
|
4
5
|
type PreviewPlan = Extract<LabPlan, {
|
|
5
6
|
readonly route: "preview";
|
|
6
7
|
}>;
|
|
8
|
+
/**
|
|
9
|
+
* The preview route's result when a study runs: the synthetic run's result, named as a study
|
|
10
|
+
* result. `humanish run` with no study returns the plain `RunResult`.
|
|
11
|
+
*/
|
|
12
|
+
export type PreviewStudyResult = Omit<RunResult, "schema"> & StudyResultIdentity<"preview">;
|
|
7
13
|
/** A refused preview's result. */
|
|
8
|
-
export declare function previewLabRefusal(cwd: string, refusal: Extract<PlanRefusal, {
|
|
14
|
+
export declare function previewLabRefusal(cwd: string, studyId: string, refusal: Extract<PlanRefusal, {
|
|
9
15
|
readonly route: "preview";
|
|
10
|
-
}>):
|
|
16
|
+
}>): PreviewStudyResult;
|
|
11
17
|
/** runLab's step for a preview plan: it has no local checks and takes no scorer, so it returns its run. */
|
|
12
18
|
export declare function admitPreviewPlan(plan: PreviewPlan, input: Pick<RunLabOptions, "cwd" | "runId" | "open">): AdmittedPlan<"preview">;
|
|
13
19
|
export {};
|
package/dist/routes/preview.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// The preview route: a lab whose subject is this repo runs the synthetic dry run. planLab decides
|
|
2
2
|
// the sim count and refuses what a synthetic run would ignore; runPreviewPlan does the rest.
|
|
3
|
+
import { studyResultIdentity } from "../run/study-result.js";
|
|
3
4
|
import { runDryRun } from "../run/dry-run.js";
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
/** A refused preview's result. */
|
|
6
|
-
export function previewLabRefusal(cwd, refusal) {
|
|
7
|
+
export function previewLabRefusal(cwd, studyId, refusal) {
|
|
7
8
|
return {
|
|
8
|
-
|
|
9
|
+
...studyResultIdentity("preview", studyId),
|
|
9
10
|
ok: false,
|
|
10
11
|
cwd: path.resolve(cwd),
|
|
11
12
|
warnings: [],
|
|
@@ -18,7 +19,10 @@ export function admitPreviewPlan(plan, input) {
|
|
|
18
19
|
ok: true,
|
|
19
20
|
run: async () => ({
|
|
20
21
|
route: "preview",
|
|
21
|
-
result:
|
|
22
|
+
result: {
|
|
23
|
+
...(await runPreviewPlan(plan, input)),
|
|
24
|
+
...studyResultIdentity("preview", plan.labId),
|
|
25
|
+
},
|
|
22
26
|
}),
|
|
23
27
|
};
|
|
24
28
|
}
|
|
@@ -28,7 +32,7 @@ function runPreviewPlan(plan, input) {
|
|
|
28
32
|
...(plan.lab === undefined ? {} : { lab: plan.lab }),
|
|
29
33
|
cwd: input.cwd,
|
|
30
34
|
dryRun: true,
|
|
31
|
-
|
|
35
|
+
participantCount: plan.participantCount,
|
|
32
36
|
...(input.runId === undefined ? {} : { runId: input.runId }),
|
|
33
37
|
...(input.open === undefined ? {} : { observer: { open: input.open } }),
|
|
34
38
|
});
|
|
@@ -34,8 +34,8 @@ interface ScriptedBundleArgs {
|
|
|
34
34
|
verdict: ReviewSummary["verdict"];
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Project the scripted lab run into a humanish.run-bundle.v1 (no schema change
|
|
38
|
-
* producer only). The
|
|
37
|
+
* Project the scripted lab run into a humanish.run-bundle.v1 (no schema change: a new
|
|
38
|
+
* producer only). The key line is `stream.actor = result.trace`: the provider-neutral
|
|
39
39
|
* ActorTrace seam the Observer renders and verifyRun's engagement check reads. Exported for
|
|
40
40
|
* the bundle-builder tests.
|
|
41
41
|
*/
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Assemble the scripted-browser lab's run bundle from its sessions, and the review summary and
|
|
2
2
|
// markdown that ship with it.
|
|
3
|
+
import { verdictText } from "../../run/judge.js";
|
|
3
4
|
import { redactText } from "../../evidence/redaction.js";
|
|
4
5
|
import { buildRunCostSummary, desktopSpanToMinutes, spendFreeCostSummary, } from "../../run/cost-summary.js";
|
|
5
6
|
import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
|
|
@@ -7,8 +8,8 @@ import {} from "../../run/streams.js";
|
|
|
7
8
|
import { participantEvent, recordIdOf } from "../../run/participant-records.js";
|
|
8
9
|
import { scriptedSurfaceIds, scriptedSurfaceRecords } from "./surface-records.js";
|
|
9
10
|
/**
|
|
10
|
-
* Project the scripted lab run into a humanish.run-bundle.v1 (no schema change
|
|
11
|
-
* producer only). The
|
|
11
|
+
* Project the scripted lab run into a humanish.run-bundle.v1 (no schema change: a new
|
|
12
|
+
* producer only). The key line is `stream.actor = result.trace`: the provider-neutral
|
|
12
13
|
* ActorTrace seam the Observer renders and verifyRun's engagement check reads. Exported for
|
|
13
14
|
* the bundle-builder tests.
|
|
14
15
|
*/
|
|
@@ -26,7 +27,7 @@ export function buildScriptedLabBundle(args) {
|
|
|
26
27
|
persona: {
|
|
27
28
|
id: args.persona.id,
|
|
28
29
|
name: `Scripted journey persona (${args.persona.id})`,
|
|
29
|
-
source: `
|
|
30
|
+
source: `study:${args.labId}`,
|
|
30
31
|
sourceDigest: args.persona.promptDigest,
|
|
31
32
|
},
|
|
32
33
|
scenario: {
|
|
@@ -49,8 +50,8 @@ export function buildScriptedLabBundle(args) {
|
|
|
49
50
|
redaction: {
|
|
50
51
|
status: "passed",
|
|
51
52
|
notes: ranLive
|
|
52
|
-
? "Scripted step URLs are
|
|
53
|
-
: "Dry-run
|
|
53
|
+
? "Scripted step URLs are reduced to loopback origin and path (query and hash removed), and step text passes text redaction. Screenshots are unblurred and kept for local use in the gitignored .humanish/ folder; they are not redacted for publishing, and policies.redactScreenshots is not supported on this route yet."
|
|
54
|
+
: "Dry-run bundle: no browser ran and no screenshots were captured. The scenario is digest-pinned; live step text passes text redaction when a session runs.",
|
|
54
55
|
},
|
|
55
56
|
artifacts: bundleArtifacts(),
|
|
56
57
|
review,
|
|
@@ -75,11 +76,11 @@ function scriptedEvents(args) {
|
|
|
75
76
|
at: args.run.createdAt,
|
|
76
77
|
level: "info",
|
|
77
78
|
type: "scripted-lab.subject.declared",
|
|
78
|
-
//
|
|
79
|
+
// Provenance is recorded or its absence declared. The lab did not provision
|
|
79
80
|
// this subject on app-url routes; clone routes carry structured subject provenance below.
|
|
80
81
|
message: args.subject
|
|
81
82
|
? `Provisioned synthetic subject: clone of ${args.subject.repo}${args.subject.commit ? `@${args.subject.commit}` : ""}, served + getHost-exposed in-sandbox; env names: ${args.subject.envNames?.join(", ") || "none"} (values never persisted); state provenance: ${args.subject.state.provenance}; evidence host digest: ${args.hostDigest ?? "dry-run"}.`
|
|
82
|
-
: `Subject app declared at ${args.appUrl};
|
|
83
|
+
: `Subject app declared at ${args.appUrl}; humanish did not provision it, so its build and commit are unpinned. The evidence is tied to the scenario digest ${args.scenarioSourceDigest}.`,
|
|
83
84
|
},
|
|
84
85
|
{
|
|
85
86
|
id: "event-002-spend",
|
|
@@ -98,7 +99,7 @@ function scriptedEvents(args) {
|
|
|
98
99
|
at: result.capture.capturedAt,
|
|
99
100
|
level: result.status === "passed" ? "info" : "warn",
|
|
100
101
|
type: `scripted-lab.session.${result.completionReason}`,
|
|
101
|
-
message: `${result.capture.surface.id}: ${result.status}
|
|
102
|
+
message: `${result.capture.surface.id}: ${result.status} (${result.reason})`,
|
|
102
103
|
}));
|
|
103
104
|
}
|
|
104
105
|
}
|
|
@@ -117,7 +118,7 @@ function scriptedEvents(args) {
|
|
|
117
118
|
at: args.run.createdAt,
|
|
118
119
|
level: "info",
|
|
119
120
|
type: "scripted-lab.contract.ready",
|
|
120
|
-
message: `Dry-run
|
|
121
|
+
message: `Dry-run bundle ready: scenario ${args.journey.scenarioId} @ ${args.scenarioSourceDigest} (${args.scenarioSource}, ${args.journey.steps.length} step${args.journey.steps.length === 1 ? "" : "s"}) parsed and digest-pinned; switch scenario.mode to live to actuate a real browser.`,
|
|
121
122
|
});
|
|
122
123
|
}
|
|
123
124
|
return events;
|
|
@@ -151,8 +152,8 @@ function buildScriptedReview(args) {
|
|
|
151
152
|
return {
|
|
152
153
|
schema: REVIEW_SCHEMA,
|
|
153
154
|
verdict: args.verdict,
|
|
154
|
-
summary: `Dry
|
|
155
|
-
gaps: ["Live scripted session not yet run (dry
|
|
155
|
+
summary: `Dry run of scenario ${args.journey.scenarioId} (${args.scenarioSource}, ${args.journey.steps.length} steps) against ${args.appUrl}: composition and scenario checked at $0; no browser ran.`,
|
|
156
|
+
gaps: ["Live scripted session not yet run (dry run only)."],
|
|
156
157
|
};
|
|
157
158
|
}
|
|
158
159
|
const passed = args.sessionResults.filter((result) => result.status === "passed").length;
|
|
@@ -176,7 +177,7 @@ export function renderScriptedReviewMarkdown(bundle) {
|
|
|
176
177
|
"",
|
|
177
178
|
`- run: ${bundle.runId}`,
|
|
178
179
|
`- mode: ${bundle.mode}`,
|
|
179
|
-
`- verdict: ${bundle.review.verdict}`,
|
|
180
|
+
`- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
|
|
180
181
|
`- summary: ${bundle.review.summary}`,
|
|
181
182
|
`- scenario: ${bundle.scenario.id} @ ${bundle.scenario.sourceDigest} (${bundle.scenario.source})`,
|
|
182
183
|
...(subject ? [`- subject: ${subject.message}`] : []),
|
|
@@ -2,7 +2,7 @@ import type { LabDeps } from "../../lab/lab-deps.js";
|
|
|
2
2
|
import type { RoutePlanResult, RouteRefusal, ScriptedPlan } from "../../lab/plan-types.js";
|
|
3
3
|
import type { LabConfig } from "../../lab/types.js";
|
|
4
4
|
/** The error a scripted lab returns before a run starts. */
|
|
5
|
-
export interface ScriptedRefusal extends RouteRefusal<"scripted", "
|
|
5
|
+
export interface ScriptedRefusal extends RouteRefusal<"scripted", "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_SCRIPTED_ACTOR_UNSUPPORTED" | "HUMANISH_SCRIPTED_SCENARIO_INVALID" | "HUMANISH_SCRIPTED_SUBJECT_UNSAFE"> {
|
|
6
6
|
/**
|
|
7
7
|
* Set on the receiving, analysis and tasks refusals. The route returns those before it opens its
|
|
8
8
|
* run scope, so their result has its own field order and no automatic-analysis record.
|
|
@@ -29,23 +29,23 @@ export function planScriptedLab(config, input) {
|
|
|
29
29
|
});
|
|
30
30
|
const beforeScope = { beforeScope: true };
|
|
31
31
|
if (String(config.comms?.email?.kind) === "real")
|
|
32
|
-
return refuse("
|
|
32
|
+
return refuse("HUMANISH_SCRIPTED_SCENARIO_INVALID", "Real email receiving is unsupported on the scripted route. Use a supported hosted computer-use browser lab.", beforeScope);
|
|
33
33
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
34
34
|
if (!analysis.ok)
|
|
35
|
-
return refuse("
|
|
35
|
+
return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message, beforeScope);
|
|
36
36
|
const tasksReason = taskProtocolValidationReason(config, false);
|
|
37
37
|
if (tasksReason)
|
|
38
|
-
return refuse("
|
|
38
|
+
return refuse("HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason, beforeScope);
|
|
39
39
|
const mediaReason = desktopMediaValidationReason(config);
|
|
40
40
|
if (mediaReason)
|
|
41
|
-
return refuse("
|
|
41
|
+
return refuse("HUMANISH_SCRIPTED_SCENARIO_INVALID", mediaReason);
|
|
42
42
|
const cloneTargetReason = cloneTargetValidationReason(config);
|
|
43
43
|
if (cloneTargetReason)
|
|
44
|
-
return refuse("
|
|
44
|
+
return refuse("HUMANISH_SCRIPTED_SUBJECT_UNSAFE", cloneTargetReason);
|
|
45
45
|
const actorType = config.actors[0]?.type ?? "";
|
|
46
46
|
const descriptor = actorRegistry[actorType];
|
|
47
47
|
if (!descriptor || !isScriptedBrowserActorDescriptor(descriptor))
|
|
48
|
-
return refuse("
|
|
48
|
+
return refuse("HUMANISH_SCRIPTED_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered scripted-browser actor.`);
|
|
49
49
|
const actor = descriptor.id;
|
|
50
50
|
// The parser checks the loopback entry too; a library caller skips the parser. A clone's URL is
|
|
51
51
|
// minted by getHost during the run, and its evidence names only the placeholder.
|
|
@@ -53,19 +53,19 @@ export function planScriptedLab(config, input) {
|
|
|
53
53
|
if (config.subject.source === "clone") {
|
|
54
54
|
const provisioned = provisionedSubject(config);
|
|
55
55
|
if (provisioned?.kind !== "clone" || !provisioned.repo)
|
|
56
|
-
return refuse("
|
|
56
|
+
return refuse("HUMANISH_SCRIPTED_SUBJECT_UNSAFE", "clone scripted-browser labs require one subject repo plus subject.serve; parseLabConfig should have rejected this config.", { actor, appUrl: "[provisioned-subject]" });
|
|
57
57
|
subject = provisioned;
|
|
58
58
|
}
|
|
59
59
|
else {
|
|
60
60
|
const appUrl = normalizeLocalAppUrl(config.subject.appUrl ?? "");
|
|
61
61
|
if (!appUrl)
|
|
62
|
-
return refuse("
|
|
62
|
+
return refuse("HUMANISH_SCRIPTED_SUBJECT_UNSAFE", "subject.appUrl must be a loopback http(s) URL (127.0.0.1 or localhost) on the scripted-browser route.", { actor });
|
|
63
63
|
subject = { kind: "loopback", appUrl };
|
|
64
64
|
}
|
|
65
65
|
// The steps are the actor, so there is no built-in journey to fall back on.
|
|
66
66
|
const scenarioRef = config.scenario?.ref;
|
|
67
67
|
if (!scenarioRef?.trim())
|
|
68
|
-
return refuse("
|
|
68
|
+
return refuse("HUMANISH_SCRIPTED_SCENARIO_INVALID", "A scripted-browser study needs `scenario.ref`: the actor runs the browser steps in that scenario file.", { actor, appUrl: evidenceAppUrlOf(subject) });
|
|
69
69
|
const requirements = [];
|
|
70
70
|
if (!input.dryRun && subject.kind === "clone") {
|
|
71
71
|
requirements.push({ kind: "key", name: "E2B_API_KEY" });
|
|
@@ -3,7 +3,8 @@ import { validatePreparedRunArtifactPaths } from "../../run/paths.js";
|
|
|
3
3
|
import { resolveSubjectState } from "../computer-use/subject-projection.js";
|
|
4
4
|
import { buildScriptedLabBundle } from "./bundle.js";
|
|
5
5
|
import { existingScreenshots } from "./session-result.js";
|
|
6
|
-
import {
|
|
6
|
+
import {} from "./types.js";
|
|
7
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
7
8
|
/** What judgeScripted reads from one surface's session. Scripted has no engagement or blocker rule. */
|
|
8
9
|
function scriptedSurfaceFacts(result) {
|
|
9
10
|
return {
|
|
@@ -116,7 +117,7 @@ export async function finishScriptedRun(inputs) {
|
|
|
116
117
|
const finished = await run.finish(bundle);
|
|
117
118
|
// Surface the local-fidelity posture so the operator knows the bundle is not publish-safe as-is.
|
|
118
119
|
if (sessionResults.some((result) => result.trace.redaction.screenshots === "raw")) {
|
|
119
|
-
warnings.push("Screenshots are
|
|
120
|
+
warnings.push("Screenshots are unblurred for local use: the bundle stays in the gitignored .humanish/ folder and nothing scans these pixels, so review them before sharing. policies.redactScreenshots is not supported on the scripted route yet.");
|
|
120
121
|
}
|
|
121
122
|
const observer = await finished.renderObserver();
|
|
122
123
|
await validatePreparedRunArtifactPaths(runPaths);
|
|
@@ -135,10 +136,9 @@ export async function finishScriptedRun(inputs) {
|
|
|
135
136
|
await finished.recordOutcome({ ok, execution });
|
|
136
137
|
const harnessErrorSession = sessionResults.find((result) => result.completionReason === "harness_error");
|
|
137
138
|
return {
|
|
138
|
-
|
|
139
|
+
...studyResultIdentity("scripted", plan.labId),
|
|
139
140
|
ok,
|
|
140
141
|
cwd,
|
|
141
|
-
labId: plan.labId,
|
|
142
142
|
actor,
|
|
143
143
|
appUrl: evidenceAppUrl,
|
|
144
144
|
dryRun,
|
|
@@ -167,7 +167,7 @@ export async function finishScriptedRun(inputs) {
|
|
|
167
167
|
? {}
|
|
168
168
|
: {
|
|
169
169
|
error: {
|
|
170
|
-
code: "
|
|
170
|
+
code: "HUMANISH_SCRIPTED_FAILED",
|
|
171
171
|
message: sessionError ??
|
|
172
172
|
(observer.ok
|
|
173
173
|
? harnessErrorSession
|
|
@@ -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.
|
|
@@ -30,7 +30,8 @@ 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.
|
|
@@ -56,10 +57,9 @@ export async function scriptedLabRefusal(options, refusal) {
|
|
|
56
57
|
const actorType = config.actors[0]?.type ?? "";
|
|
57
58
|
if (refusal.beforeScope)
|
|
58
59
|
return {
|
|
59
|
-
|
|
60
|
+
...studyResultIdentity("scripted", config.id),
|
|
60
61
|
ok: false,
|
|
61
62
|
cwd,
|
|
62
|
-
labId: config.id,
|
|
63
63
|
actor: actorType,
|
|
64
64
|
dryRun,
|
|
65
65
|
runId: options.runId ?? "not-created",
|
|
@@ -72,10 +72,9 @@ export async function scriptedLabRefusal(options, refusal) {
|
|
|
72
72
|
const physicalCwd = await realpath(cwd);
|
|
73
73
|
await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
|
|
74
74
|
const refused = {
|
|
75
|
-
|
|
75
|
+
...studyResultIdentity("scripted", config.id),
|
|
76
76
|
ok: false,
|
|
77
77
|
cwd,
|
|
78
|
-
labId: config.id,
|
|
79
78
|
actor: refusal.actor ?? actorType,
|
|
80
79
|
appUrl: refusal.appUrl ?? config.subject.appUrl ?? "",
|
|
81
80
|
dryRun,
|
|
@@ -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 };
|