humanish 0.106.1 → 0.107.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -4
- package/ARCHITECTURE.md +17 -16
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +42 -39
- package/CONTRIBUTING.md +8 -8
- package/README.md +8 -3
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/qualified-versions.d.ts +30 -3
- package/dist/actors/codex/qualified-versions.js +50 -5
- package/dist/actors/codex/restricted-executable.d.ts +24 -0
- package/dist/actors/codex/restricted-executable.js +97 -22
- package/dist/actors/codex/restricted-launch.d.ts +7 -1
- package/dist/actors/codex/restricted-launch.js +42 -3
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +60 -2
- package/dist/actors/codex/restricted-policy.d.ts +9 -1
- package/dist/actors/codex/restricted-session.d.ts +14 -1
- package/dist/actors/codex/restricted-session.js +50 -17
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +1 -1
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/loop/backstop.js +1 -1
- package/dist/actors/computer-use/loop/ending.d.ts +2 -2
- package/dist/actors/computer-use/loop/ending.js +2 -2
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +3 -3
- package/dist/actors/computer-use/loop/trace.js +2 -2
- package/dist/actors/computer-use/loop/types.d.ts +14 -5
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-provider.d.ts +1 -1
- package/dist/actors/computer-use/openai-provider.js +2 -2
- package/dist/actors/contract.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +1 -1
- package/dist/actors/scripted-browser/actor.d.ts +2 -2
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +18 -0
- package/dist/actors/scripted-browser/types.d.ts +11 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +31 -12
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +4 -2
- package/dist/cli/commands/comms.js +8 -1
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +26 -14
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +3 -4
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +0 -1
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +76 -45
- package/dist/cli/commands/lab-scorer.d.ts +0 -2
- package/dist/cli/commands/lab.js +12 -6
- package/dist/cli/commands/observe.js +22 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +10 -8
- package/dist/cli/commands/watch.js +12 -10
- package/dist/cli/doctor.d.ts +3 -0
- package/dist/cli/doctor.js +10 -2
- package/dist/cli/io.d.ts +5 -4
- package/dist/cli/io.js +12 -8
- package/dist/cli/program.js +3 -3
- package/dist/cli/renamed-options.d.ts +11 -0
- package/dist/cli/renamed-options.js +18 -0
- package/dist/cli/telemetry.d.ts +2 -2
- package/dist/cli/telemetry.js +1 -1
- package/dist/comms/capture-surface.d.ts +1 -1
- package/dist/comms/catch-host.d.ts +1 -1
- package/dist/comms/connections.js +4 -4
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/types.js +1 -1
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/redaction.js +1 -1
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +7 -9
- package/dist/feedback/export-bundle.js +4 -4
- package/dist/feedback/export.js +9 -9
- package/dist/feedback/feedback.d.ts +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.js +3 -6
- package/dist/keys/key-resolution.d.ts +3 -1
- package/dist/keys/key-resolution.js +18 -16
- package/dist/lab/adapter-extension.d.ts +28 -6
- package/dist/lab/adapter-extension.js +65 -126
- package/dist/lab/adapter-scorer-loader.d.ts +25 -5
- package/dist/lab/adapter-scorer-loader.js +24 -0
- package/dist/lab/composition-rules.js +20 -20
- package/dist/lab/config.js +28 -26
- package/dist/lab/device-presets.d.ts +2 -2
- package/dist/lab/discover.js +1 -3
- package/dist/lab/doctor.d.ts +44 -9
- package/dist/lab/doctor.js +149 -41
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/keys.js +1 -1
- package/dist/lab/lab-deps.d.ts +85 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +8 -7
- package/dist/lab/parse/comms.js +3 -2
- package/dist/lab/parse/execution.js +3 -2
- package/dist/lab/parse/subject-state.js +2 -1
- package/dist/lab/parse/subject.js +2 -1
- package/dist/lab/parse/values.d.ts +0 -1
- package/dist/lab/parse/values.js +0 -3
- package/dist/lab/persona-resolve.d.ts +3 -3
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +5 -5
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +22 -4
- package/dist/lab/plan.d.ts +3 -11
- package/dist/lab/plan.js +18 -42
- package/dist/lab/preflight-result.js +0 -2
- package/dist/lab/preflight.d.ts +0 -3
- package/dist/lab/preflight.js +1 -1
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +19 -24
- package/dist/lab/routing.js +14 -47
- package/dist/lab/run-lab-events.d.ts +6 -11
- package/dist/lab/run-lab-events.js +3 -11
- package/dist/lab/run-lab-homes.d.ts +64 -0
- package/dist/lab/run-lab-homes.js +3 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +45 -275
- package/dist/lab/summary.d.ts +9 -4
- package/dist/lab/summary.js +15 -8
- package/dist/lab/types.d.ts +132 -132
- package/dist/lab/validation.d.ts +15 -15
- package/dist/lab/validation.js +28 -28
- package/dist/lab/warnings.js +20 -19
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +3 -3
- package/dist/observer/data.js +2 -2
- package/dist/observer/render.js +2 -2
- package/dist/observer/run-routes.d.ts +1 -1
- package/dist/observer/run-routes.js +5 -5
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +34 -3
- package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
- package/dist/routes/computer-use/bundle-parts.js +10 -3
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +9 -15
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
- package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +25 -29
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +19 -27
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +12 -11
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +39 -66
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +19 -11
- package/dist/routes/computer-use/participant-model.js +49 -25
- package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
- package/dist/routes/computer-use/participant-prompt.js +4 -4
- package/dist/routes/computer-use/participant-runs.d.ts +6 -6
- package/dist/routes/computer-use/participant-runs.js +8 -8
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +52 -60
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +20 -16
- package/dist/routes/computer-use/rerun-selection.js +10 -6
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +40 -30
- package/dist/routes/computer-use/route.d.ts +3 -4
- package/dist/routes/computer-use/route.js +21 -19
- package/dist/routes/computer-use/self-report.d.ts +2 -2
- package/dist/routes/computer-use/self-report.js +4 -4
- package/dist/routes/computer-use/setup.d.ts +8 -14
- package/dist/routes/computer-use/setup.js +96 -72
- package/dist/routes/computer-use/single-bundle.d.ts +8 -11
- package/dist/routes/computer-use/single-bundle.js +20 -25
- package/dist/routes/computer-use/subject-projection.d.ts +5 -7
- package/dist/routes/computer-use/subject-projection.js +20 -19
- package/dist/routes/computer-use/types.d.ts +169 -210
- package/dist/routes/computer-use/types.js +13 -5
- package/dist/routes/preview.js +0 -1
- package/dist/routes/scripted/bundle.d.ts +3 -6
- package/dist/routes/scripted/bundle.js +11 -16
- package/dist/routes/scripted/plan.d.ts +5 -7
- package/dist/routes/scripted/plan.js +6 -4
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +10 -6
- package/dist/routes/scripted/route.js +10 -11
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +1 -1
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +22 -21
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +9 -5
- package/dist/routes/scripted/surface-records.js +1 -1
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +19 -36
- package/dist/routes/scripted/types.js +1 -2
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
- package/dist/routes/shared-world/bundle.d.ts +2 -2
- package/dist/routes/shared-world/bundle.js +22 -26
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +4 -4
- package/dist/routes/shared-world/comms.d.ts +5 -4
- package/dist/routes/shared-world/comms.js +28 -41
- package/dist/routes/shared-world/external-public.d.ts +5 -5
- package/dist/routes/shared-world/external-public.js +19 -20
- package/dist/routes/shared-world/handoff.d.ts +4 -4
- package/dist/routes/shared-world/handoff.js +50 -50
- package/dist/routes/shared-world/lobby-code.d.ts +5 -5
- package/dist/routes/shared-world/lobby-code.js +13 -13
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +43 -48
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +1 -2
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +46 -40
- package/dist/routes/shared-world/result.js +31 -19
- package/dist/routes/shared-world/route.js +37 -41
- package/dist/routes/shared-world/setup.d.ts +5 -4
- package/dist/routes/shared-world/setup.js +12 -14
- package/dist/routes/shared-world/types.d.ts +53 -126
- package/dist/routes/shared-world/types.js +2 -2
- package/dist/routes/terminal/adapter.d.ts +8 -8
- package/dist/routes/terminal/adapter.js +28 -125
- package/dist/routes/terminal/bundle.d.ts +7 -12
- package/dist/routes/terminal/bundle.js +24 -34
- package/dist/routes/terminal/credentials.d.ts +2 -2
- package/dist/routes/terminal/credentials.js +16 -16
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +9 -11
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +6 -6
- package/dist/routes/terminal/ledger.js +9 -9
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +21 -20
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +20 -20
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +13 -9
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +4 -4
- package/dist/routes/terminal/route.js +26 -26
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +3 -3
- package/dist/routes/terminal/sandbox.js +9 -9
- package/dist/routes/terminal/session.js +16 -14
- package/dist/routes/terminal/token-usage.js +5 -5
- package/dist/routes/terminal/trace.d.ts +5 -8
- package/dist/routes/terminal/trace.js +9 -64
- package/dist/routes/terminal/types.d.ts +85 -93
- package/dist/routes/terminal/types.js +9 -4
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +4 -4
- package/dist/run/bundle.d.ts +63 -56
- package/dist/run/bundle.js +9 -8
- package/dist/run/cost-summary.js +3 -2
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +10 -10
- package/dist/run/detail.d.ts +5 -5
- package/dist/run/detail.js +6 -6
- package/dist/run/dry-run.js +5 -12
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +16 -4
- package/dist/run/judge.js +24 -7
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +19 -9
- package/dist/run/pricing.js +30 -18
- package/dist/run/projection.d.ts +13 -13
- package/dist/run/projection.js +8 -8
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +13 -3
- package/dist/run/results.d.ts +1 -1
- package/dist/run/run-index.d.ts +1 -1
- package/dist/run/run-index.js +11 -11
- package/dist/run/run.d.ts +4 -2
- package/dist/run/run.js +9 -5
- package/dist/run/sandbox-receipts.d.ts +4 -4
- package/dist/run/sandbox-receipts.js +4 -4
- package/dist/run/shared-world-evidence.d.ts +47 -47
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +11 -11
- package/dist/run/stats.d.ts +5 -5
- package/dist/run/stats.js +8 -8
- package/dist/run/status.d.ts +16 -6
- package/dist/run/status.js +31 -8
- package/dist/run/streams.d.ts +26 -19
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +36 -34
- package/dist/run-lab.js +41 -37
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +1 -1
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +2 -2
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +5 -5
- package/dist/subject/serve.js +1 -1
- package/dist/subject/steps.d.ts +4 -4
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
- package/dist/substrates/e2b/cdp-probe.js +1 -1
- package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
- package/dist/substrates/e2b/desktop-browser.js +4 -4
- package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
- package/dist/substrates/e2b/desktop-cdp.js +4 -4
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +3 -3
- package/dist/substrates/e2b/desktop-media.js +2 -2
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.js +2 -2
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +7 -5
- package/dist/tui/actions.js +18 -9
- package/dist/tui-app.js +42 -42
- package/dist/verify/actor.d.ts +10 -10
- package/dist/verify/actor.js +15 -15
- package/dist/verify/artifacts.d.ts +1 -1
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/costs.d.ts +2 -2
- package/dist/verify/costs.js +2 -2
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world.js +2 -2
- package/dist/verify/verify.js +6 -6
- package/docs/README.md +1 -1
- package/docs/architecture/actor-contract.md +60 -22
- package/docs/architecture/desktop-sessions.md +9 -9
- package/docs/architecture/external-public-shared-world.md +5 -0
- package/docs/architecture/observer.md +4 -4
- package/docs/architecture/restricted-codex-analysis.md +36 -2
- package/docs/architecture/state-driven-executor.md +4 -5
- package/docs/architecture/task-protocol-support.md +3 -5
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
- package/docs/contracts/run-bundle.md +10 -8
- package/docs/contracts/schemas.md +109 -53
- package/docs/contracts/study-analysis.md +24 -0
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/product/automatic-analysis.md +1 -0
- package/docs/ramp/README.md +2 -1
- package/package.json +4 -4
- package/skills/humanish/SKILL.md +3 -2
- package/skills/humanish/agents/openai.yaml +1 -1
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
package/dist/analysis/store.js
CHANGED
|
@@ -4,7 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import { physicalCwdOf, runIdOf, validatePreparedRunRootIdentity, } from "../run/paths.js";
|
|
5
5
|
import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile, } from "../run/contained-output.js";
|
|
6
6
|
import { EVIDENCE_LIMITS, validateAnalysisEvidence } from "./evidence.js";
|
|
7
|
-
import { pathMissing,
|
|
7
|
+
import { pathMissing, isEvidencePath, readBoundedFile } from "../run/evidence-files.js";
|
|
8
8
|
import { hashAnalysisValue, validateAnalysisArtifact, validateAnalysisCorrection, } from "./validation.js";
|
|
9
9
|
import { ANALYSIS_ID_PATTERN, } from "./types.js";
|
|
10
10
|
import { RUN_BUNDLE_FILE } from "../run/bundle.js";
|
|
@@ -61,9 +61,9 @@ export async function claimDirectory(parent, id) {
|
|
|
61
61
|
return prepareContainedOutputDirectoryRoot(parent, id);
|
|
62
62
|
}
|
|
63
63
|
/** A claimed version is never reused, including after interruption before publication. */
|
|
64
|
-
export async function
|
|
64
|
+
export async function writeAnalysis(prepared, value) {
|
|
65
65
|
const artifact = validateAnalysisArtifact(value);
|
|
66
|
-
const source = await
|
|
66
|
+
const source = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
|
|
67
67
|
if (!source)
|
|
68
68
|
throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
|
|
69
69
|
await validateAnalysisEvidence(prepared, artifact, source);
|
|
@@ -73,7 +73,7 @@ export async function writeStudyAnalysis(prepared, value) {
|
|
|
73
73
|
const root = await prepareContainedOutputDirectoryRoot(prepared, ANALYSIS_DIRECTORY);
|
|
74
74
|
const claimed = await claimDirectory(root, artifact.id);
|
|
75
75
|
// Recheck source immediately before publishing the immutable record.
|
|
76
|
-
const current = await
|
|
76
|
+
const current = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
|
|
77
77
|
if (!current?.equals(source))
|
|
78
78
|
throw new Error("ANALYSIS_SOURCE_CHANGED");
|
|
79
79
|
await writeContainedOutputFile(claimed, "analysis.json", bytes);
|
|
@@ -100,7 +100,7 @@ export async function directoryIds(root, limit, ignoreLegacyFiles = false) {
|
|
|
100
100
|
if (entry.name.startsWith(".humanish-write-"))
|
|
101
101
|
continue;
|
|
102
102
|
if (ignoreLegacyFiles &&
|
|
103
|
-
|
|
103
|
+
isEvidencePath(entry.name) &&
|
|
104
104
|
!["analysis.json", "correction.json", "receipt.json"].includes(entry.name))
|
|
105
105
|
continue;
|
|
106
106
|
warnings.push("ANALYSIS_UNSAFE_ENTRY_IGNORED");
|
|
@@ -118,7 +118,7 @@ export async function directoryIds(root, limit, ignoreLegacyFiles = false) {
|
|
|
118
118
|
async function readVersion(prepared, root, id, source) {
|
|
119
119
|
if (!safeId(id))
|
|
120
120
|
return { id: "invalid", state: "invalid", analysis: null, warnings: ["ANALYSIS_ID_INVALID"] };
|
|
121
|
-
const bytes = await
|
|
121
|
+
const bytes = await readBoundedFile(root, `${id}/analysis.json`, ANALYSIS_MAX_BYTES);
|
|
122
122
|
// A claimed directory without a published record is an interrupted write, not a report.
|
|
123
123
|
if (bytes === null) {
|
|
124
124
|
if (await pathMissing(path.join(root.physicalPath, id, "analysis.json")).catch(() => false))
|
|
@@ -159,14 +159,14 @@ async function readVersion(prepared, root, id, source) {
|
|
|
159
159
|
return { id, state: "ready", analysis, warnings: [] };
|
|
160
160
|
}
|
|
161
161
|
/** Read one exact result without reading automatic job state or unrelated history. */
|
|
162
|
-
export async function
|
|
162
|
+
export async function readAnalysisVersion(prepared, id) {
|
|
163
163
|
if (!safeId(id))
|
|
164
164
|
return null;
|
|
165
165
|
try {
|
|
166
166
|
const root = await existingRoot(prepared);
|
|
167
167
|
if (!root)
|
|
168
168
|
return null;
|
|
169
|
-
return await readVersion(prepared, root, id, await
|
|
169
|
+
return await readVersion(prepared, root, id, await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes));
|
|
170
170
|
}
|
|
171
171
|
catch {
|
|
172
172
|
return null;
|
|
@@ -179,7 +179,7 @@ export async function listAnalyses(prepared) {
|
|
|
179
179
|
if (!root)
|
|
180
180
|
return [];
|
|
181
181
|
const inventory = await directoryIds(root, MAX_VERSIONS, true);
|
|
182
|
-
const source = await
|
|
182
|
+
const source = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
|
|
183
183
|
const results = [];
|
|
184
184
|
for (const id of inventory.ids) {
|
|
185
185
|
const entry = await readVersion(prepared, root, id, source);
|
|
@@ -219,7 +219,7 @@ async function readCorrections(prepared, root, analysis) {
|
|
|
219
219
|
const inventory = await directoryIds(bound, MAX_CORRECTIONS);
|
|
220
220
|
warnings.push(...inventory.warnings);
|
|
221
221
|
for (const id of inventory.ids) {
|
|
222
|
-
const bytes = await
|
|
222
|
+
const bytes = await readBoundedFile(root, `${analysis.id}/corrections/${id}/correction.json`, MAX_CORRECTION_BYTES);
|
|
223
223
|
if (!bytes) {
|
|
224
224
|
// An unpublished claim directory is harmless; a present record that
|
|
225
225
|
// cannot be checked must not silently erase a prior review decision.
|
|
@@ -246,7 +246,7 @@ async function readCorrections(prepared, root, analysis) {
|
|
|
246
246
|
corrections.sort((a, b) => a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id));
|
|
247
247
|
return { corrections, warnings };
|
|
248
248
|
}
|
|
249
|
-
export async function
|
|
249
|
+
export async function loadAnalysisRecord(prepared, id) {
|
|
250
250
|
if (id !== undefined && !safeId(id))
|
|
251
251
|
return empty("invalid", ["ANALYSIS_ID_INVALID"]);
|
|
252
252
|
try {
|
|
@@ -290,9 +290,9 @@ function assertCorrectionBinding(analysis, correction) {
|
|
|
290
290
|
Date.parse(correction.createdAt) < Date.parse(analysis.completedAt))
|
|
291
291
|
throw new Error("ANALYSIS_CORRECTION_BINDING_INVALID");
|
|
292
292
|
}
|
|
293
|
-
export async function
|
|
293
|
+
export async function appendAnalysisCorrection(prepared, value) {
|
|
294
294
|
const correction = validateAnalysisCorrection(value);
|
|
295
|
-
const loaded = await
|
|
295
|
+
const loaded = await loadAnalysisRecord(prepared, correction.analysisId);
|
|
296
296
|
if (loaded.state !== "ready" || !loaded.analysis)
|
|
297
297
|
throw new Error("ANALYSIS_CORRECTION_SOURCE_UNAVAILABLE");
|
|
298
298
|
assertCorrectionBinding(loaded.analysis, correction);
|
|
@@ -2,6 +2,7 @@ import type { RunLabOptions } from "../../run-lab.js";
|
|
|
2
2
|
import type { CliIo } from "../io.js";
|
|
3
3
|
/**
|
|
4
4
|
* Post-run analysis cancellation for the CLI: while analysis runs, SIGINT, SIGTERM and SIGHUP abort
|
|
5
|
-
* it. The listeners exist only during analysis
|
|
5
|
+
* it. The listeners exist only during analysis; before it, the run's own handlers
|
|
6
|
+
* (run-signals.ts) hold the signals and hand them over here.
|
|
6
7
|
*/
|
|
7
8
|
export declare function cliAnalysisOptions(io: Pick<CliIo, "writeErr">): Pick<RunLabOptions, "onEvent" | "analysisSignal">;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { handOverRunSignals } from "./run-signals.js";
|
|
1
2
|
/**
|
|
2
3
|
* Post-run analysis cancellation for the CLI: while analysis runs, SIGINT, SIGTERM and SIGHUP abort
|
|
3
|
-
* it. The listeners exist only during analysis
|
|
4
|
+
* it. The listeners exist only during analysis; before it, the run's own handlers
|
|
5
|
+
* (run-signals.ts) hold the signals and hand them over here.
|
|
4
6
|
*/
|
|
5
7
|
export function cliAnalysisOptions(io) {
|
|
6
8
|
const controller = new AbortController();
|
|
@@ -13,6 +15,7 @@ export function cliAnalysisOptions(io) {
|
|
|
13
15
|
onEvent: (event) => {
|
|
14
16
|
if (event.type === "analysis-started") {
|
|
15
17
|
io.writeErr("Participants finished; preparing analysis…\n");
|
|
18
|
+
handOverRunSignals();
|
|
16
19
|
for (const signal of signals)
|
|
17
20
|
process.on(signal, cancel);
|
|
18
21
|
}
|
|
@@ -3,7 +3,7 @@ import { Command, Option } from "commander";
|
|
|
3
3
|
import { forTerminal } from "../../routes/terminal/encoding.js";
|
|
4
4
|
import { analyzeRun, correctAnalysis, dryRunBundleRefusal, showAnalysis, } from "../../analysis/service.js";
|
|
5
5
|
import { listAnalyses } from "../../analysis/store.js";
|
|
6
|
-
import {
|
|
6
|
+
import { listAnalysisExecutions } from "../../analysis/store-executions.js";
|
|
7
7
|
import { resolveRunPath } from "../../run/locate.js";
|
|
8
8
|
import { discoverCliKeys, JSON_OPTION_DESCRIPTION, writeResult } from "../io.js";
|
|
9
9
|
import { resolvePhysicalCwd } from "../../run/paths.js";
|
|
@@ -132,6 +132,8 @@ async function handleAnalyze(io, options, command) {
|
|
|
132
132
|
lines.push(`${value.reused ? "Reused" : "Saved"} ${value.status} analysis: ${value.artifactPath}`);
|
|
133
133
|
if (value.executionReceiptPath)
|
|
134
134
|
lines.push(`Execution receipt: ${value.executionReceiptPath}`);
|
|
135
|
+
if (value.rejectedOutputPath)
|
|
136
|
+
lines.push(`Rejected output, kept locally for diagnosis: ${value.rejectedOutputPath}`);
|
|
135
137
|
if (value.usage) {
|
|
136
138
|
lines.push(`Recorded attempt usage${value.usage.usageComplete ? "" : " (incomplete)"}: ${value.usage.inputTokens ?? "unknown"} input tokens, ${value.usage.outputTokens ?? "unknown"} output tokens.`);
|
|
137
139
|
lines.push(`Estimated attempt cost: ${value.usage.estimatedCostUsd === null ? "unknown" : `$${value.usage.estimatedCostUsd}`}.`);
|
|
@@ -152,7 +154,7 @@ async function handleAnalyzeList(io, options, command) {
|
|
|
152
154
|
const prepared = await resolveRunPath(await resolvePhysicalCwd(options.cwd), options.run).catch(() => null);
|
|
153
155
|
const versions = prepared ? await listAnalyses(prepared) : [];
|
|
154
156
|
const executions = prepared
|
|
155
|
-
? await
|
|
157
|
+
? await listAnalysisExecutions(prepared)
|
|
156
158
|
: { receipts: [], warnings: [] };
|
|
157
159
|
const result = {
|
|
158
160
|
schema: "humanish.analysis-history.v1",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { COMMS_PROVIDERS, saveCommsConnection } from "../../comms/connections.js";
|
|
4
|
+
import { catchTokenRefusal } from "../../comms/external-evidence.js";
|
|
4
5
|
import { readCommsSetup } from "../../comms/setup.js";
|
|
5
6
|
import { checkCommsConnection, configureCommsLab } from "../../comms/setup.js";
|
|
6
7
|
import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
|
|
@@ -73,7 +74,7 @@ export function registerCommsCommands(parent, io) {
|
|
|
73
74
|
.summary("Run the adopter-hosted email catch.")
|
|
74
75
|
.option("--port <port>", "Port for capture + inbox (default 8025).", String(DEFAULT_SANDBOX_CATCH_PORT))
|
|
75
76
|
.option("--dir <path>", "Directory for the deliveries log and rendered inbox.", ".humanish/comms-catch")
|
|
76
|
-
.option("--token <value>", "Require this bearer token on GET /deliveries (recommended when reachable off-host).")
|
|
77
|
+
.option("--token <value>", "Require this bearer token, at least 16 characters, on GET /deliveries (recommended when reachable off-host).")
|
|
77
78
|
.option("--smtp-port <port>", "Also capture SMTP mail on 127.0.0.1:<port>. Point your app's SMTP transport here.")
|
|
78
79
|
.option("--inbox-port <port>", "Also serve a READ-ONLY inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
|
|
79
80
|
.option("--recipient <address>", "Only render mail sent to this address (repeatable). Default: render whatever the app actually mailed.", (value, previous) => [...(previous ?? []), value])
|
|
@@ -178,6 +179,12 @@ async function handleCommsRecover(io, options, command) {
|
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
181
|
async function handleCommsCatch(io, options) {
|
|
182
|
+
const tokenRefusal = catchTokenRefusal(options.token);
|
|
183
|
+
if (tokenRefusal !== undefined) {
|
|
184
|
+
io.writeErr(`--token: ${tokenRefusal} The token guards GET /deliveries, and runs scrub it from their warnings.\n`);
|
|
185
|
+
io.setExitCode(2);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
181
188
|
const port = Number.parseInt(options.port, 10);
|
|
182
189
|
if (!Number.isInteger(port) || port <= 0 || port > 65_534) {
|
|
183
190
|
io.writeErr("--port must be an integer between 1 and 65534.\n");
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import type { RunLabProvenance } from "../../run/status.js";
|
|
3
2
|
import type { LabConfig } from "../../lab/types.js";
|
|
4
3
|
import { type CliIo, type LabCommandOptions } from "../io.js";
|
|
5
4
|
import type { RouteRun } from "./lab-route-run.js";
|
|
@@ -7,7 +6,6 @@ interface ComputerUseRouteArgs {
|
|
|
7
6
|
command: Command;
|
|
8
7
|
io: CliIo;
|
|
9
8
|
config: LabConfig;
|
|
10
|
-
labProvenance?: RunLabProvenance;
|
|
11
9
|
mode: "run" | "watch";
|
|
12
10
|
options: LabCommandOptions;
|
|
13
11
|
}
|
|
@@ -7,6 +7,7 @@ import { serveObserver } from "../../observer/render.js";
|
|
|
7
7
|
import { startExposedObserver, validateExposure } from "../../observer/exposure.js";
|
|
8
8
|
import { ServeTunnelError } from "../../observer/tunnel.js";
|
|
9
9
|
import { cliAnalysisOptions } from "./analysis-signals.js";
|
|
10
|
+
import { onRunShutdown } from "./run-signals.js";
|
|
10
11
|
import { parseLabCount, parseParticipantIds, parseObserverPort, wantsJson, writeResult, } from "../io.js";
|
|
11
12
|
import { exposureRequestFromOptions, followObserver, planObserver, showObserver, staticObserverOpen, withObserverServer, } from "../observer-follow.js";
|
|
12
13
|
import { formatCuaLabHuman } from "./lab-format.js";
|
|
@@ -29,6 +30,7 @@ export function computerUseRouteRun(args) {
|
|
|
29
30
|
tunnel: undefined,
|
|
30
31
|
exposeWarnings: [],
|
|
31
32
|
publicTarget: undefined,
|
|
33
|
+
releaseShutdown: undefined,
|
|
32
34
|
};
|
|
33
35
|
return {
|
|
34
36
|
options: cuaRunOptions(args, settings, prepared, live),
|
|
@@ -37,7 +39,12 @@ export function computerUseRouteRun(args) {
|
|
|
37
39
|
if (outcome.route !== "computer-use") {
|
|
38
40
|
throw new Error(`Expected the computer-use route, got ${outcome.route}.`);
|
|
39
41
|
}
|
|
40
|
-
|
|
42
|
+
try {
|
|
43
|
+
await reportCuaRun(args, prepared, outcome.result, live);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
live.releaseShutdown?.();
|
|
47
|
+
}
|
|
41
48
|
},
|
|
42
49
|
};
|
|
43
50
|
}
|
|
@@ -66,15 +73,15 @@ function resolveCuaSettings(args) {
|
|
|
66
73
|
mode: args.mode,
|
|
67
74
|
wantsMachine,
|
|
68
75
|
});
|
|
69
|
-
const participantIds = parseParticipantIds(args.options.
|
|
76
|
+
const participantIds = parseParticipantIds(args.options.participants);
|
|
70
77
|
if (participantIds.length > 0 && !args.options.rerunFailedFrom) {
|
|
71
|
-
args.io.writeErr("error: --
|
|
78
|
+
args.io.writeErr("error: --participants requires --rerun-failed-from.\n");
|
|
72
79
|
args.io.setExitCode(2);
|
|
73
80
|
return undefined;
|
|
74
81
|
}
|
|
75
|
-
const count = parseLabCount(args.options.count
|
|
82
|
+
const count = parseLabCount(args.options.count, args.config.actors[0]?.count ?? 1);
|
|
76
83
|
if (count === null) {
|
|
77
|
-
args.io.writeErr("error: --count
|
|
84
|
+
args.io.writeErr("error: --count must be a positive integer.\n");
|
|
78
85
|
args.io.setExitCode(2);
|
|
79
86
|
return undefined;
|
|
80
87
|
}
|
|
@@ -122,7 +129,6 @@ function cuaRunOptions(args, settings, prepared, live) {
|
|
|
122
129
|
return {
|
|
123
130
|
...cliAnalysisOptions(args.io),
|
|
124
131
|
cwd: args.options.cwd,
|
|
125
|
-
...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
|
|
126
132
|
// A followed watch opens the served Observer (or prints the phone target under --expose), so
|
|
127
133
|
// its static render never opens. A non-follow watch opens what its plan says, once. Run mode
|
|
128
134
|
// keeps the static open.
|
|
@@ -153,20 +159,24 @@ function cuaRunOptions(args, settings, prepared, live) {
|
|
|
153
159
|
}),
|
|
154
160
|
};
|
|
155
161
|
}
|
|
162
|
+
/** Closes the loopback server and any tunnel the watch attached. Safe to call twice. */
|
|
163
|
+
async function closeLiveAttachment(io, live) {
|
|
164
|
+
const { server, tunnel } = live;
|
|
165
|
+
live.server = null;
|
|
166
|
+
live.tunnel = undefined;
|
|
167
|
+
await server?.close().catch((cleanupError) => {
|
|
168
|
+
io.writeErr(`watch cleanup failed: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}\n`);
|
|
169
|
+
});
|
|
170
|
+
await tunnel?.close().catch(() => undefined);
|
|
171
|
+
}
|
|
156
172
|
/**
|
|
157
173
|
* Tears down the loopback server and any tunnel started inside onObserverReady, then reports a
|
|
158
174
|
* tunnel startup failure or rethrows. The sandbox is created after onObserverReady returns, so a
|
|
159
175
|
* tunnel failure cannot orphan one.
|
|
160
176
|
*/
|
|
161
177
|
async function closeLiveAfterRunError(args, settings, live, error) {
|
|
162
|
-
await
|
|
163
|
-
|
|
164
|
-
});
|
|
165
|
-
live.server = null;
|
|
166
|
-
if (live.tunnel) {
|
|
167
|
-
await live.tunnel.close().catch(() => undefined);
|
|
168
|
-
live.tunnel = undefined;
|
|
169
|
-
}
|
|
178
|
+
await closeLiveAttachment(args.io, live);
|
|
179
|
+
live.releaseShutdown?.();
|
|
170
180
|
if (error instanceof ServeTunnelError) {
|
|
171
181
|
refuseCua(args, settings.dryRun, error.code, error.message);
|
|
172
182
|
return;
|
|
@@ -182,6 +192,8 @@ async function attachLiveObserver(io, settings, exposure, live, observer) {
|
|
|
182
192
|
port: settings.port,
|
|
183
193
|
exposed: exposure.exposed,
|
|
184
194
|
});
|
|
195
|
+
// A signal that stops the run closes the server and any tunnel before the process exits.
|
|
196
|
+
live.releaseShutdown ??= onRunShutdown(() => closeLiveAttachment(io, live));
|
|
185
197
|
}
|
|
186
198
|
if (exposure.exposed) {
|
|
187
199
|
const activeServer = live.server;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import type { RunLabProvenance } from "../../run/status.js";
|
|
3
2
|
import type { LabConfig } from "../../lab/types.js";
|
|
4
3
|
import { type CliIo, type LabCommandOptions } from "../io.js";
|
|
5
4
|
import type { RouteRun } from "./lab-route-run.js";
|
|
@@ -8,12 +7,11 @@ interface PreviewRouteArgs {
|
|
|
8
7
|
io: CliIo;
|
|
9
8
|
lab: string;
|
|
10
9
|
config: LabConfig;
|
|
11
|
-
labProvenance?: RunLabProvenance;
|
|
12
10
|
mode: "run" | "watch";
|
|
13
11
|
options: LabCommandOptions;
|
|
14
12
|
}
|
|
15
13
|
/**
|
|
16
|
-
* The preview route's CLI setup: the
|
|
14
|
+
* The preview route's CLI setup: the participant count and Observer plan, its runLab options, and how it
|
|
17
15
|
* presents the outcome. Undefined when setup has already written its own result.
|
|
18
16
|
*/
|
|
19
17
|
export declare function previewRouteRun(args: PreviewRouteArgs): RouteRun | undefined;
|
|
@@ -2,11 +2,11 @@ import { Command } from "commander";
|
|
|
2
2
|
import { formatRunHuman, parseLabCount, writeResult, } from "../io.js";
|
|
3
3
|
import { planObserver, showObserver, staticObserverOpen } from "../observer-follow.js";
|
|
4
4
|
/**
|
|
5
|
-
* The preview route's CLI setup: the
|
|
5
|
+
* The preview route's CLI setup: the participant count and Observer plan, its runLab options, and how it
|
|
6
6
|
* presents the outcome. Undefined when setup has already written its own result.
|
|
7
7
|
*/
|
|
8
8
|
export function previewRouteRun(args) {
|
|
9
|
-
const participantCount = parseLabCount(args.options.
|
|
9
|
+
const participantCount = parseLabCount(args.options.count, args.config.actors[0]?.count ?? 4);
|
|
10
10
|
if (participantCount === null) {
|
|
11
11
|
const result = {
|
|
12
12
|
schema: "humanish.run-result.v1",
|
|
@@ -15,7 +15,7 @@ export function previewRouteRun(args) {
|
|
|
15
15
|
warnings: [],
|
|
16
16
|
error: {
|
|
17
17
|
code: "HUMANISH_INVALID_SIM_COUNT",
|
|
18
|
-
message: "--
|
|
18
|
+
message: "--count must be a positive integer.",
|
|
19
19
|
},
|
|
20
20
|
};
|
|
21
21
|
writeResult(args.command, args.io, result, formatRunHuman);
|
|
@@ -42,7 +42,6 @@ export function previewRouteRun(args) {
|
|
|
42
42
|
return {
|
|
43
43
|
options: {
|
|
44
44
|
cwd: args.options.cwd,
|
|
45
|
-
...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
|
|
46
45
|
count: participantCount,
|
|
47
46
|
...(args.options.dryRun === undefined ? {} : { dryRun: args.options.dryRun }),
|
|
48
47
|
...(args.options.runId === undefined ? {} : { runId: args.options.runId }),
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type InternalRunLabOptions, type LabOutcome } from "../../run-lab.js";
|
|
2
2
|
import type { LabConfig } from "../../lab/types.js";
|
|
3
3
|
import type { LoadedAdapterScorer } from "./lab-scorer.js";
|
|
4
4
|
export interface RouteRun {
|
|
5
|
-
readonly options:
|
|
5
|
+
readonly options: InternalRunLabOptions;
|
|
6
6
|
present(outcome: LabOutcome): Promise<void>;
|
|
7
7
|
/** Handles an error runLab threw, and rethrows any it does not handle. */
|
|
8
8
|
onRunError?(error: unknown): Promise<void>;
|
|
@@ -10,8 +10,10 @@ export interface RouteRun {
|
|
|
10
10
|
/**
|
|
11
11
|
* Plans the lab with a route's options, then presents the refusal or the run. `beforeRun` runs
|
|
12
12
|
* only for a plan that will run: it loads the scorer, or writes its own refusal and returns
|
|
13
|
-
* undefined, so a refused lab never imports the scorer's host code.
|
|
13
|
+
* undefined, so a refused lab never imports the scorer's host code. `afterRun` runs once runLab
|
|
14
|
+
* has returned or thrown, before presentation, which may hold its own signal handlers (watch's
|
|
15
|
+
* Observer and tunnel).
|
|
14
16
|
*/
|
|
15
17
|
export declare function runRoute(config: LabConfig, run: RouteRun, beforeRun?: () => Promise<{
|
|
16
18
|
scorer?: LoadedAdapterScorer;
|
|
17
|
-
} | undefined
|
|
19
|
+
} | undefined>, afterRun?: () => void): Promise<void>;
|
|
@@ -4,9 +4,11 @@ import { prepareLab } from "../../run-lab.js";
|
|
|
4
4
|
/**
|
|
5
5
|
* Plans the lab with a route's options, then presents the refusal or the run. `beforeRun` runs
|
|
6
6
|
* only for a plan that will run: it loads the scorer, or writes its own refusal and returns
|
|
7
|
-
* undefined, so a refused lab never imports the scorer's host code.
|
|
7
|
+
* undefined, so a refused lab never imports the scorer's host code. `afterRun` runs once runLab
|
|
8
|
+
* has returned or thrown, before presentation, which may hold its own signal handlers (watch's
|
|
9
|
+
* Observer and tunnel).
|
|
8
10
|
*/
|
|
9
|
-
export async function runRoute(config, run, beforeRun = () => Promise.resolve({})) {
|
|
11
|
+
export async function runRoute(config, run, beforeRun = () => Promise.resolve({}), afterRun = () => undefined) {
|
|
10
12
|
let outcome;
|
|
11
13
|
try {
|
|
12
14
|
const prepared = await prepareLab(config, run.options);
|
|
@@ -22,10 +24,12 @@ export async function runRoute(config, run, beforeRun = () => Promise.resolve({}
|
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
catch (error) {
|
|
27
|
+
afterRun();
|
|
25
28
|
if (run.onRunError === undefined)
|
|
26
29
|
throw error;
|
|
27
30
|
await run.onRunError(error);
|
|
28
31
|
return;
|
|
29
32
|
}
|
|
33
|
+
afterRun();
|
|
30
34
|
await run.present(outcome);
|
|
31
35
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import type { RunLabProvenance } from "../../run/status.js";
|
|
3
2
|
import type { LabConfig } from "../../lab/types.js";
|
|
4
3
|
import { type CliIo, type LabCommandOptions } from "../io.js";
|
|
5
4
|
import type { RouteRun } from "./lab-route-run.js";
|
|
@@ -7,7 +6,6 @@ interface ScriptedRouteArgs {
|
|
|
7
6
|
command: Command;
|
|
8
7
|
io: CliIo;
|
|
9
8
|
config: LabConfig;
|
|
10
|
-
labProvenance?: RunLabProvenance;
|
|
11
9
|
mode: "run" | "watch";
|
|
12
10
|
options: LabCommandOptions;
|
|
13
11
|
}
|
|
@@ -24,7 +24,6 @@ export function scriptedRouteRun(args) {
|
|
|
24
24
|
options: {
|
|
25
25
|
...cliAnalysisOptions(args.io),
|
|
26
26
|
cwd: args.options.cwd,
|
|
27
|
-
...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
|
|
28
27
|
open: observerOpen(args.mode, finishedPlan, shouldOpen),
|
|
29
28
|
...(args.options.dryRun === undefined ? {} : { dryRun: args.options.dryRun }),
|
|
30
29
|
...(args.options.runId === undefined ? {} : { runId: args.options.runId }),
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import type { RunLabProvenance } from "../../run/status.js";
|
|
3
2
|
import type { LabConfig } from "../../lab/types.js";
|
|
4
3
|
import { type CliIo, type LabCommandOptions } from "../io.js";
|
|
5
4
|
import type { RouteRun } from "./lab-route-run.js";
|
|
@@ -7,7 +6,6 @@ interface SharedWorldRouteArgs {
|
|
|
7
6
|
command: Command;
|
|
8
7
|
io: CliIo;
|
|
9
8
|
config: LabConfig;
|
|
10
|
-
labProvenance?: RunLabProvenance;
|
|
11
9
|
mode: "run" | "watch";
|
|
12
10
|
options: LabCommandOptions;
|
|
13
11
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import type { RunLabProvenance } from "../../run/status.js";
|
|
3
2
|
import type { LabConfig } from "../../lab/types.js";
|
|
4
3
|
import { type CliIo, type LabCommandOptions } from "../io.js";
|
|
5
4
|
import type { RouteRun } from "./lab-route-run.js";
|
|
@@ -7,7 +6,6 @@ interface TerminalRouteArgs {
|
|
|
7
6
|
command: Command;
|
|
8
7
|
io: CliIo;
|
|
9
8
|
config: LabConfig;
|
|
10
|
-
labProvenance?: RunLabProvenance;
|
|
11
9
|
mode: "run" | "watch";
|
|
12
10
|
options: LabCommandOptions;
|
|
13
11
|
}
|
|
@@ -24,7 +24,6 @@ export function terminalRouteRun(args) {
|
|
|
24
24
|
options: {
|
|
25
25
|
...cliAnalysisOptions(args.io),
|
|
26
26
|
cwd: args.options.cwd,
|
|
27
|
-
...(args.labProvenance === undefined ? {} : { lab: args.labProvenance }),
|
|
28
27
|
open: observerOpen(args.mode, finishedPlan, shouldOpen),
|
|
29
28
|
...(args.options.dryRun === undefined ? {} : { dryRun: args.options.dryRun }),
|
|
30
29
|
...(args.options.runId === undefined ? {} : { runId: args.options.runId }),
|