humanish 0.107.0 → 0.109.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 +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- 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-trace.js +2 -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 +20 -18
- 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 +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- 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/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- 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 +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -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 +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- 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/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- 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 +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- 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/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- 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 +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- 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 +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- 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 +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- 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 +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- 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 +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- 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 +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +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 +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- 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 +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- 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.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- 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 +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- 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 +6 -5
- package/dist/run/run.js +3 -3
- 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 +37 -36
- 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 +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -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-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- 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 +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- 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/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- 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 +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- 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/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- 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 +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- 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 +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- 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 +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- 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/README.md +1 -1
- 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/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -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 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- 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/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- 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
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
// Assemble the scripted-browser
|
|
1
|
+
// Assemble the scripted-browser study'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";
|
|
6
7
|
import {} from "../../run/streams.js";
|
|
7
8
|
import { participantEvent, recordIdOf } from "../../run/participant-records.js";
|
|
8
9
|
import { scriptedSurfaceIds, scriptedSurfaceRecords } from "./surface-records.js";
|
|
10
|
+
import { plural } from "../../run/text.js";
|
|
9
11
|
/**
|
|
10
|
-
* Project the scripted
|
|
11
|
-
* producer only). The
|
|
12
|
+
* Project the scripted run into a humanish.run-bundle.v1 (no schema change: a new
|
|
13
|
+
* producer only). The key line is `stream.actor = result.trace`: the provider-neutral
|
|
12
14
|
* ActorTrace seam the Observer renders and verifyRun's engagement check reads. Exported for
|
|
13
15
|
* the bundle-builder tests.
|
|
14
16
|
*/
|
|
15
|
-
export function
|
|
17
|
+
export function buildScriptedStudyBundle(args) {
|
|
16
18
|
const resultBySurface = new Map(args.sessionResults.map((result) => [result.capture.surface.id, result]));
|
|
17
19
|
// Each surface's records are stamped with the run's start.
|
|
18
20
|
const context = { ...args, createdAt: args.run.createdAt };
|
|
@@ -26,7 +28,7 @@ export function buildScriptedLabBundle(args) {
|
|
|
26
28
|
persona: {
|
|
27
29
|
id: args.persona.id,
|
|
28
30
|
name: `Scripted journey persona (${args.persona.id})`,
|
|
29
|
-
source: `
|
|
31
|
+
source: `study:${args.studyId}`,
|
|
30
32
|
sourceDigest: args.persona.promptDigest,
|
|
31
33
|
},
|
|
32
34
|
scenario: {
|
|
@@ -40,7 +42,7 @@ export function buildScriptedLabBundle(args) {
|
|
|
40
42
|
{
|
|
41
43
|
at: args.run.createdAt,
|
|
42
44
|
event: "scripted-lab.run.created",
|
|
43
|
-
message: `Created scripted-browser
|
|
45
|
+
message: `Created a scripted-browser run with ${args.surfaces.length} surface${args.surfaces.length === 1 ? "" : "s"} (actor ${args.actorId}).`,
|
|
44
46
|
},
|
|
45
47
|
],
|
|
46
48
|
simulations: records.map((record) => record.simulation),
|
|
@@ -49,8 +51,8 @@ export function buildScriptedLabBundle(args) {
|
|
|
49
51
|
redaction: {
|
|
50
52
|
status: "passed",
|
|
51
53
|
notes: ranLive
|
|
52
|
-
? "Scripted step URLs are
|
|
53
|
-
: "Dry-run
|
|
54
|
+
? "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."
|
|
55
|
+
: "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
56
|
},
|
|
55
57
|
artifacts: bundleArtifacts(),
|
|
56
58
|
review,
|
|
@@ -68,18 +70,18 @@ function scriptedEvents(args) {
|
|
|
68
70
|
at: args.run.createdAt,
|
|
69
71
|
level: "info",
|
|
70
72
|
type: "scripted-lab.run.created",
|
|
71
|
-
message: `Created scripted-browser
|
|
73
|
+
message: `Created a scripted-browser run for ${args.studyId} (actor ${args.actorId}, ${args.surfaces.length} surface${args.surfaces.length === 1 ? "" : "s"}).`,
|
|
72
74
|
},
|
|
73
75
|
{
|
|
74
76
|
id: "event-001-subject",
|
|
75
77
|
at: args.run.createdAt,
|
|
76
78
|
level: "info",
|
|
77
79
|
type: "scripted-lab.subject.declared",
|
|
78
|
-
//
|
|
80
|
+
// Provenance is recorded or its absence declared. humanish did not provision
|
|
79
81
|
// this subject on app-url routes; clone routes carry structured subject provenance below.
|
|
80
82
|
message: args.subject
|
|
81
83
|
? `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};
|
|
84
|
+
: `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
85
|
},
|
|
84
86
|
{
|
|
85
87
|
id: "event-002-spend",
|
|
@@ -98,7 +100,7 @@ function scriptedEvents(args) {
|
|
|
98
100
|
at: result.capture.capturedAt,
|
|
99
101
|
level: result.status === "passed" ? "info" : "warn",
|
|
100
102
|
type: `scripted-lab.session.${result.completionReason}`,
|
|
101
|
-
message: `${result.capture.surface.id}: ${result.status}
|
|
103
|
+
message: `${result.capture.surface.id}: ${result.status} (${result.reason})`,
|
|
102
104
|
}));
|
|
103
105
|
}
|
|
104
106
|
}
|
|
@@ -117,7 +119,7 @@ function scriptedEvents(args) {
|
|
|
117
119
|
at: args.run.createdAt,
|
|
118
120
|
level: "info",
|
|
119
121
|
type: "scripted-lab.contract.ready",
|
|
120
|
-
message: `Dry-run
|
|
122
|
+
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
123
|
});
|
|
122
124
|
}
|
|
123
125
|
return events;
|
|
@@ -143,7 +145,7 @@ function buildScriptedReview(args) {
|
|
|
143
145
|
return {
|
|
144
146
|
schema: REVIEW_SCHEMA,
|
|
145
147
|
verdict: args.verdict,
|
|
146
|
-
summary: `
|
|
148
|
+
summary: `The scripted run failed before a terminal session verdict: ${args.sessionError}`,
|
|
147
149
|
gaps: [],
|
|
148
150
|
};
|
|
149
151
|
}
|
|
@@ -151,8 +153,8 @@ function buildScriptedReview(args) {
|
|
|
151
153
|
return {
|
|
152
154
|
schema: REVIEW_SCHEMA,
|
|
153
155
|
verdict: args.verdict,
|
|
154
|
-
summary: `Dry
|
|
155
|
-
gaps: ["Live scripted session not yet run (dry
|
|
156
|
+
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.`,
|
|
157
|
+
gaps: ["Live scripted session not yet run (dry run only)."],
|
|
156
158
|
};
|
|
157
159
|
}
|
|
158
160
|
const passed = args.sessionResults.filter((result) => result.status === "passed").length;
|
|
@@ -176,12 +178,12 @@ export function renderScriptedReviewMarkdown(bundle) {
|
|
|
176
178
|
"",
|
|
177
179
|
`- run: ${bundle.runId}`,
|
|
178
180
|
`- mode: ${bundle.mode}`,
|
|
179
|
-
`- verdict: ${bundle.review.verdict}`,
|
|
181
|
+
`- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
|
|
180
182
|
`- summary: ${bundle.review.summary}`,
|
|
181
183
|
`- scenario: ${bundle.scenario.id} @ ${bundle.scenario.sourceDigest} (${bundle.scenario.source})`,
|
|
182
184
|
...(subject ? [`- subject: ${subject.message}`] : []),
|
|
183
185
|
...(spend ? [`- spend: ${spend.message}`] : []),
|
|
184
|
-
...traces.map(({ stream, trace }) => `- ${recordIdOf(stream)}: ${trace.provider} (${trace.lane}/${trace.protocol}) ${trace.status} (${trace.completionReason}); ${trace.counts.actions ?? 0
|
|
186
|
+
...traces.map(({ stream, trace }) => `- ${recordIdOf(stream)}: ${trace.provider} (${trace.lane}/${trace.protocol}) ${trace.status} (${trace.completionReason}); ${plural(trace.counts.actions ?? 0, "step action")}, ${plural(trace.counts.screenshots ?? 0, "raw screenshot")}`),
|
|
185
187
|
...(bundle.review.gaps.length > 0
|
|
186
188
|
? ["", "## Gaps", ...bundle.review.gaps.map((gap) => `- ${gap}`)]
|
|
187
189
|
: []),
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { RoutePlanResult, RouteRefusal, ScriptedPlan } from "../../
|
|
3
|
-
import type {
|
|
4
|
-
/** The error a scripted
|
|
5
|
-
export interface ScriptedRefusal extends RouteRefusal<"scripted", "
|
|
1
|
+
import type { StudyDeps } from "../../study/study-deps.js";
|
|
2
|
+
import type { RoutePlanResult, RouteRefusal, ScriptedPlan } from "../../study/plan-types.js";
|
|
3
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
4
|
+
/** The error a scripted study returns before a run starts. */
|
|
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.
|
|
@@ -16,12 +16,12 @@ export type ScriptedPlanResult = RoutePlanResult<ScriptedPlan, ScriptedRefusal>;
|
|
|
16
16
|
/** The app URL a run's evidence names: a provisioned subject's getHost URL is never persisted. */
|
|
17
17
|
export declare function evidenceAppUrlOf(subject: ScriptedPlan["subject"]): string;
|
|
18
18
|
/** Whether a test injected the browser, so a live run needs no host browser. */
|
|
19
|
-
export declare function injectedBrowser(deps:
|
|
19
|
+
export declare function injectedBrowser(deps: StudyDeps | undefined): boolean;
|
|
20
20
|
/**
|
|
21
|
-
* Plan a scripted-browser
|
|
21
|
+
* Plan a scripted-browser study. It is called for any config handed to the scripted runner, not only
|
|
22
22
|
* one routeOf sends here, so a config for another route gets this route's refusal.
|
|
23
23
|
*/
|
|
24
|
-
export declare function
|
|
24
|
+
export declare function planScriptedStudy(config: StudyConfig, input: {
|
|
25
25
|
readonly dryRun: boolean;
|
|
26
26
|
/** A test's injected browser means a live run needs no host browser. */
|
|
27
27
|
readonly injectedBrowser?: boolean;
|
|
@@ -5,8 +5,8 @@ import { actorRegistry, isScriptedBrowserActorDescriptor } from "../../actors/re
|
|
|
5
5
|
import { normalizeLocalAppUrl } from "../../actors/scripted-browser/steps.js";
|
|
6
6
|
import { browserSurfaces } from "../../actors/scripted-browser/types.js";
|
|
7
7
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
8
|
-
import { isNonEmpty, planBase, provisionedSubject } from "../../
|
|
9
|
-
import { cloneTargetValidationReason, desktopMediaValidationReason, taskProtocolValidationReason, } from "../../
|
|
8
|
+
import { isNonEmpty, planBase, provisionedSubject } from "../../study/plan-base.js";
|
|
9
|
+
import { cloneTargetValidationReason, desktopMediaValidationReason, taskProtocolValidationReason, } from "../../study/validation.js";
|
|
10
10
|
// Default surface roster is 1 (desktop only): the defaults-table single-participant row governs;
|
|
11
11
|
// `count: 2` is the declared override that adds the mobile surface.
|
|
12
12
|
const DEFAULT_SURFACE_COUNT = 1;
|
|
@@ -19,33 +19,33 @@ export function injectedBrowser(deps) {
|
|
|
19
19
|
return Boolean(deps?.launchBrowser || deps?.browserCommand);
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
* Plan a scripted-browser
|
|
22
|
+
* Plan a scripted-browser study. It is called for any config handed to the scripted runner, not only
|
|
23
23
|
* one routeOf sends here, so a config for another route gets this route's refusal.
|
|
24
24
|
*/
|
|
25
|
-
export function
|
|
25
|
+
export function planScriptedStudy(config, input) {
|
|
26
26
|
const refuse = (code, message, extras = {}) => ({
|
|
27
27
|
ok: false,
|
|
28
28
|
refusal: { route: "scripted", code, message, ...extras },
|
|
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 study.", 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 studies require one subject repo plus subject.serve; parseStudy 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" });
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
2
2
|
import type { ScriptedBrowserSessionResult } from "../../actors/scripted-browser/actor.js";
|
|
3
3
|
import type { BrowserPersonaJourney } from "../../actors/scripted-browser/types.js";
|
|
4
|
-
import type { ScriptedPlan } from "../../
|
|
4
|
+
import type { ScriptedPlan } from "../../study/plan-types.js";
|
|
5
5
|
import type { RunBundle } from "../../run/bundle.js";
|
|
6
6
|
import type { RunScope } from "../../run/run.js";
|
|
7
7
|
import { type ExecutionFailure } from "../../run/judge.js";
|
|
8
8
|
import type { ObserverResult } from "../../observer/render.js";
|
|
9
9
|
import type { ScriptedSubject } from "./subject.js";
|
|
10
|
-
import { type
|
|
10
|
+
import { type ScriptedBrowserStudyResult } from "./types.js";
|
|
11
11
|
/** What the finish reads from the run. */
|
|
12
12
|
export interface ScriptedFinishInputs {
|
|
13
13
|
plan: ScriptedPlan;
|
|
@@ -48,4 +48,4 @@ export declare function scriptedExecutionFailures(args: {
|
|
|
48
48
|
subject: Pick<ScriptedSubject, "sandboxId" | "killed" | "releaseWarning"> | undefined;
|
|
49
49
|
observer: Pick<ObserverResult, "ok" | "error">;
|
|
50
50
|
}): ExecutionFailure[];
|
|
51
|
-
export declare function finishScriptedRun(inputs: ScriptedFinishInputs): Promise<
|
|
51
|
+
export declare function finishScriptedRun(inputs: ScriptedFinishInputs): Promise<ScriptedBrowserStudyResult>;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { judgeExecution, sandboxCleanupFailure, judgeScripted, OUTCOME_POLICIES, resultOk, } from "../../run/judge.js";
|
|
2
2
|
import { validatePreparedRunArtifactPaths } from "../../run/paths.js";
|
|
3
3
|
import { resolveSubjectState } from "../computer-use/subject-projection.js";
|
|
4
|
-
import {
|
|
4
|
+
import { buildScriptedStudyBundle } 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 {
|
|
@@ -36,7 +37,7 @@ export function scriptedExecutionFailures(args) {
|
|
|
36
37
|
? [
|
|
37
38
|
{
|
|
38
39
|
kind: "harness",
|
|
39
|
-
message: "
|
|
40
|
+
message: "The scripted run did not produce terminal sessions for every surface.",
|
|
40
41
|
},
|
|
41
42
|
]
|
|
42
43
|
: []),
|
|
@@ -48,7 +49,7 @@ export function scriptedExecutionFailures(args) {
|
|
|
48
49
|
: [
|
|
49
50
|
{
|
|
50
51
|
kind: "evidence",
|
|
51
|
-
message: observer.error?.message ?? "Observer failed for the scripted
|
|
52
|
+
message: observer.error?.message ?? "Observer failed for the scripted run.",
|
|
52
53
|
},
|
|
53
54
|
]),
|
|
54
55
|
];
|
|
@@ -89,14 +90,14 @@ export async function finishScriptedRun(inputs) {
|
|
|
89
90
|
expected: surfaces.length,
|
|
90
91
|
surfaces: sessionResults.map(scriptedSurfaceFacts),
|
|
91
92
|
});
|
|
92
|
-
const bundle =
|
|
93
|
+
const bundle = buildScriptedStudyBundle({
|
|
93
94
|
run,
|
|
94
95
|
actorId: actor,
|
|
95
96
|
appUrl: evidenceAppUrl,
|
|
96
97
|
dryRun,
|
|
97
98
|
journey,
|
|
98
|
-
|
|
99
|
-
...(plan.title ? {
|
|
99
|
+
studyId: plan.studyId,
|
|
100
|
+
...(plan.title ? { studyTitle: plan.title } : {}),
|
|
100
101
|
persona,
|
|
101
102
|
scenarioSource: scenario.source,
|
|
102
103
|
scenarioSourceDigest: scenario.sourceDigest,
|
|
@@ -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.studyId),
|
|
139
140
|
ok,
|
|
140
141
|
cwd,
|
|
141
|
-
labId: plan.labId,
|
|
142
142
|
actor,
|
|
143
143
|
appUrl: evidenceAppUrl,
|
|
144
144
|
dryRun,
|
|
@@ -167,13 +167,13 @@ 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
|
|
174
174
|
? `Scripted session ended with a harness error: ${harnessErrorSession.reason}`
|
|
175
|
-
: "
|
|
176
|
-
: (observer.error?.message ?? "Observer failed for the scripted
|
|
175
|
+
: "The scripted run did not produce terminal sessions for every surface."
|
|
176
|
+
: (observer.error?.message ?? "Observer failed for the scripted run.")),
|
|
177
177
|
},
|
|
178
178
|
}),
|
|
179
179
|
};
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import type { ScriptedPlan } from "../../
|
|
2
|
-
import type { AdmittedPlan } from "../../run-
|
|
1
|
+
import type { ScriptedPlan } from "../../study/plan-types.js";
|
|
2
|
+
import type { AdmittedPlan } from "../../run-study.js";
|
|
3
3
|
import { type ScriptedRefusal } from "./plan.js";
|
|
4
|
-
import { type
|
|
4
|
+
import { type RunScriptedBrowserStudyOptions, type ScriptedBrowserStudyResult, type ScriptedRunInput } from "./types.js";
|
|
5
5
|
/**
|
|
6
6
|
* The config-taking entry point. It plans, returns a refusal with the envelope the route has always
|
|
7
7
|
* returned at that refusal's stage, and otherwise runs the plan.
|
|
8
8
|
*/
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function runScriptedBrowserStudy(options: RunScriptedBrowserStudyOptions): Promise<ScriptedBrowserStudyResult>;
|
|
10
10
|
/**
|
|
11
|
-
* A refused scripted
|
|
11
|
+
* A refused scripted study's result, at the refusal's stage: a before-scope refusal has its own field
|
|
12
12
|
* order and no analysis record; the others come after the output directory checks.
|
|
13
13
|
*/
|
|
14
|
-
export declare function
|
|
14
|
+
export declare function scriptedStudyRefusal(options: RunScriptedBrowserStudyOptions, refusal: ScriptedRefusal): Promise<ScriptedBrowserStudyResult>;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* runStudyWith's step for a scripted plan. It takes no scorer, and its local checks (keys, a browser)
|
|
17
17
|
* run inside the run, so it returns the run.
|
|
18
18
|
*/
|
|
19
19
|
export declare function admitScriptedPlan(plan: ScriptedPlan, input: ScriptedRunInput): AdmittedPlan<"scripted">;
|
|
20
20
|
/**
|
|
21
21
|
* Run a scripted plan. The run scope gives a direct library caller the same status-record lifetime
|
|
22
22
|
* the CLI gets: returning from this function finalizes any record the run opened, whichever of its
|
|
23
|
-
* fail-closed exits it took. Each route opens its own scope; `
|
|
23
|
+
* fail-closed exits it took. Each route opens its own scope; `runStudyWith` opens none. Without this a
|
|
24
24
|
* test or an adopter calling the route directly leaves
|
|
25
25
|
* the 5s cadence ticking into a directory something else is deleting, which surfaces as an
|
|
26
26
|
* unrelated ENOTEMPTY.
|
|
27
27
|
*/
|
|
28
|
-
export declare function runScriptedPlan(plan: ScriptedPlan, input: ScriptedRunInput): Promise<
|
|
28
|
+
export declare function runScriptedPlan(plan: ScriptedPlan, input: ScriptedRunInput): Promise<ScriptedBrowserStudyResult>;
|
|
@@ -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 humanish 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,42 +24,42 @@ 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 { injectedBrowser,
|
|
27
|
+
import { injectedBrowser, planScriptedStudy } 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
|
-
export async function
|
|
39
|
+
export async function runScriptedBrowserStudy(options) {
|
|
39
40
|
const { config, dryRun, ...input } = options;
|
|
40
|
-
//
|
|
41
|
-
const planned =
|
|
41
|
+
// planScriptedStudy makes every configuration refusal, in the order this route always has.
|
|
42
|
+
const planned = planScriptedStudy(config, {
|
|
42
43
|
dryRun,
|
|
43
44
|
injectedBrowser: injectedBrowser(input.deps),
|
|
44
45
|
});
|
|
45
46
|
if (planned.ok)
|
|
46
47
|
return runScriptedPlan(planned.plan, input);
|
|
47
|
-
return
|
|
48
|
+
return scriptedStudyRefusal(options, planned.refusal);
|
|
48
49
|
}
|
|
49
50
|
/**
|
|
50
|
-
* A refused scripted
|
|
51
|
+
* A refused scripted study's result, at the refusal's stage: a before-scope refusal has its own field
|
|
51
52
|
* order and no analysis record; the others come after the output directory checks.
|
|
52
53
|
*/
|
|
53
|
-
export async function
|
|
54
|
+
export async function scriptedStudyRefusal(options, refusal) {
|
|
54
55
|
const { config, dryRun } = options;
|
|
55
56
|
const cwd = path.resolve(options.cwd);
|
|
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,
|
|
@@ -88,7 +87,7 @@ export async function scriptedLabRefusal(options, refusal) {
|
|
|
88
87
|
return completeAutomaticAnalysis(refused, undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
|
|
89
88
|
}
|
|
90
89
|
/**
|
|
91
|
-
*
|
|
90
|
+
* runStudyWith's step for a scripted plan. It takes no scorer, and its local checks (keys, a browser)
|
|
92
91
|
* run inside the run, so it returns the run.
|
|
93
92
|
*/
|
|
94
93
|
export function admitScriptedPlan(plan, input) {
|
|
@@ -103,7 +102,7 @@ export function admitScriptedPlan(plan, input) {
|
|
|
103
102
|
/**
|
|
104
103
|
* Run a scripted plan. The run scope gives a direct library caller the same status-record lifetime
|
|
105
104
|
* the CLI gets: returning from this function finalizes any record the run opened, whichever of its
|
|
106
|
-
* fail-closed exits it took. Each route opens its own scope; `
|
|
105
|
+
* fail-closed exits it took. Each route opens its own scope; `runStudyWith` opens none. Without this a
|
|
107
106
|
* test or an adopter calling the route directly leaves
|
|
108
107
|
* the 5s cadence ticking into a directory something else is deleting, which surfaces as an
|
|
109
108
|
* unrelated ENOTEMPTY.
|
|
@@ -126,7 +125,7 @@ async function runScriptedPlanInScope(plan, input, scope) {
|
|
|
126
125
|
runId: input.runId,
|
|
127
126
|
mintRunId: makeScriptedRunId,
|
|
128
127
|
mode: dryRun ? "dry-run" : "live",
|
|
129
|
-
|
|
128
|
+
study: plan.study,
|
|
130
129
|
renderReview: renderScriptedReviewMarkdown,
|
|
131
130
|
observer: { open: input.open === true, render: setup.deps.renderObserver },
|
|
132
131
|
});
|
|
@@ -11,7 +11,7 @@ interface ResolvedScriptedScenario {
|
|
|
11
11
|
* Resolve and consume `scenario.ref`. Path-style refs (contain a separator or end .yaml/.yml)
|
|
12
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
|
-
* humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed.
|
|
14
|
+
* humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedStudy
|
|
15
15
|
* has already refused a missing or blank ref.
|
|
16
16
|
*/
|
|
17
17
|
export declare function resolveScriptedScenario(projectRoot: PreparedSelectedOutputDirectory, ref: string): Promise<ResolvedScriptedScenario | {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Resolve a scripted-browser
|
|
1
|
+
// Resolve a scripted-browser study's `scenario.ref` to a committed scenario file and parse its
|
|
2
2
|
// `browser.steps` into the journey the actor runs. The ref is an id or a repo-relative path that must
|
|
3
3
|
// stay inside the project; provenance records it repo-relative with the scenario's digest.
|
|
4
4
|
import { parse as parseYaml } from "yaml";
|
|
@@ -6,14 +6,14 @@ import path from "node:path";
|
|
|
6
6
|
import { parseBrowserPersonaJourneyFromScenario } from "../../actors/scripted-browser/journey.js";
|
|
7
7
|
import { digestText } from "../../evidence/redaction.js";
|
|
8
8
|
import { readContainedRegularFile, } from "../../run/contained-output.js";
|
|
9
|
-
// Same public-safe token shape the
|
|
9
|
+
// Same public-safe token shape the study id uses; an id-style scenario.ref must match it before
|
|
10
10
|
// it is interpolated into a repo path.
|
|
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
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
|
-
* humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed.
|
|
16
|
+
* humanish/scenarios/<ref>.yaml (then .yml). Every failure mode is fail-closed. planScriptedStudy
|
|
17
17
|
* has already refused a missing or blank ref.
|
|
18
18
|
*/
|
|
19
19
|
export async function resolveScriptedScenario(projectRoot, 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,15 +1,15 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
2
2
|
import type { BrowserPersonaJourney, ScriptedBrowserEvidenceUrlPolicy } from "../../actors/scripted-browser/types.js";
|
|
3
|
-
import type { ScriptedPlan } from "../../
|
|
4
|
-
import { type
|
|
5
|
-
import type {
|
|
3
|
+
import type { ScriptedPlan } from "../../study/plan-types.js";
|
|
4
|
+
import { type ScriptedBrowserStudyResult, type ScriptedRunInput } from "./types.js";
|
|
5
|
+
import type { StudyDeps } from "../../study/study-deps.js";
|
|
6
6
|
/** What setup hands the run: the plan's subject and scenario, keys and the browser to launch. */
|
|
7
7
|
export interface ScriptedRunSetup {
|
|
8
8
|
cwd: string;
|
|
9
9
|
physicalCwd: string;
|
|
10
|
-
deps:
|
|
10
|
+
deps: StudyDeps;
|
|
11
11
|
warnings: string[];
|
|
12
|
-
failed: (code: NonNullable<
|
|
12
|
+
failed: (code: NonNullable<ScriptedBrowserStudyResult["error"]>["code"], message: string) => ScriptedBrowserStudyResult;
|
|
13
13
|
clone: Extract<ScriptedPlan["subject"], {
|
|
14
14
|
readonly kind: "clone";
|
|
15
15
|
}> | undefined;
|
|
@@ -39,7 +39,7 @@ export interface ScriptedRunSetup {
|
|
|
39
39
|
*/
|
|
40
40
|
export declare function prepareScriptedRun(plan: ScriptedPlan, input: ScriptedRunInput): Promise<{
|
|
41
41
|
ok: false;
|
|
42
|
-
result:
|
|
42
|
+
result: ScriptedBrowserStudyResult;
|
|
43
43
|
} | {
|
|
44
44
|
ok: true;
|
|
45
45
|
setup: ScriptedRunSetup;
|