humanish 0.108.0 → 0.109.1
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 +58 -59
- package/CHANGELOG.md +22 -0
- package/CONTEXT.md +44 -44
- package/README.md +3 -3
- package/TELEMETRY.md +2 -2
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/restricted-participant.js +12 -12
- package/dist/actors/codex/restricted-session.d.ts +2 -2
- package/dist/actors/computer-use/actor.d.ts +6 -6
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +2 -2
- package/dist/actors/computer-use/admission-limit.js +3 -3
- 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.js +5 -5
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +1 -1
- package/dist/actors/computer-use/loop/ending.js +12 -11
- package/dist/actors/computer-use/loop/observation.js +6 -5
- package/dist/actors/computer-use/loop/provider-call.js +11 -11
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +2 -2
- package/dist/actors/computer-use/loop/trace.js +3 -2
- package/dist/actors/computer-use/loop/types.d.ts +24 -24
- package/dist/actors/computer-use/loop/usage.d.ts +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-provider.d.ts +2 -2
- package/dist/actors/computer-use/openai-provider.js +8 -8
- 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 +4 -4
- package/dist/actors/contract.js +1 -1
- package/dist/actors/local-agent/claude-session.js +3 -3
- package/dist/actors/local-agent/cli.d.ts +1 -1
- package/dist/actors/local-agent/cli.js +1 -1
- package/dist/actors/reasoning-effort.js +3 -3
- package/dist/actors/registry.d.ts +2 -2
- package/dist/actors/registry.js +3 -3
- package/dist/actors/scripted-browser/actor.d.ts +2 -2
- package/dist/actors/scripted-browser/actor.js +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/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- 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/comms.js +14 -22
- package/dist/cli/commands/migrate.js +15 -4
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +0 -15
- package/dist/cli/commands/run-command.d.ts +2 -2
- package/dist/cli/commands/run-command.js +3 -3
- package/dist/cli/commands/runs.js +9 -7
- package/dist/cli/commands/setup.js +5 -7
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
- 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} +12 -12
- 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} +3 -3
- 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} +7 -7
- 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} +34 -34
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
- package/dist/cli/commands/study.js +13 -49
- package/dist/cli/commands/tui.js +12 -12
- package/dist/cli/commands/watch.js +30 -65
- package/dist/cli/deprecations.d.ts +1 -13
- package/dist/cli/deprecations.js +0 -30
- package/dist/cli/doctor.d.ts +3 -3
- package/dist/cli/doctor.js +16 -16
- package/dist/cli/first-run-path.d.ts +4 -4
- package/dist/cli/first-run-path.js +7 -7
- package/dist/cli/io.d.ts +3 -3
- package/dist/cli/io.js +2 -2
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +2 -2
- package/dist/cli/orientation.d.ts +4 -4
- package/dist/cli/orientation.js +58 -20
- package/dist/cli/program.js +3 -4
- package/dist/cli/telemetry.d.ts +1 -1
- package/dist/cli/telemetry.js +14 -20
- package/dist/comms/catch-host.d.ts +1 -1
- package/dist/comms/catch-host.js +3 -3
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +4 -3
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch.d.ts +2 -2
- package/dist/comms/sandbox-catch.js +2 -2
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +29 -32
- package/dist/evidence/redaction.d.ts +11 -0
- package/dist/evidence/redaction.js +43 -0
- package/dist/feedback/draft.js +2 -2
- package/dist/feedback/export-bundle.js +5 -4
- package/dist/feedback/export.js +3 -2
- 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 +17 -17
- 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.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 +5 -5
- package/dist/index.d.ts +13 -15
- package/dist/index.js +6 -8
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +1 -1
- package/dist/observer/data.d.ts +1 -1
- package/dist/observer/library.d.ts +2 -0
- package/dist/observer/library.js +4 -1
- package/dist/observer/render.js +7 -1
- package/dist/observer/run-routes.d.ts +1 -0
- package/dist/observer/run-routes.js +37 -12
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer-app.html +1 -1
- package/dist/routes/computer-use/bundle-parts.js +3 -2
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +7 -6
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
- package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
- package/dist/routes/computer-use/external-comms.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +11 -10
- package/dist/routes/computer-use/fanout-records.js +2 -2
- package/dist/routes/computer-use/in-process-desktop.js +1 -1
- package/dist/routes/computer-use/live-flush.d.ts +3 -3
- package/dist/routes/computer-use/live-phase.d.ts +2 -3
- package/dist/routes/computer-use/live-phase.js +3 -3
- 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 +2 -2
- package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
- package/dist/routes/computer-use/participant-desktop.js +1 -1
- package/dist/routes/computer-use/participant-execution.js +1 -1
- package/dist/routes/computer-use/participant-model.js +3 -3
- package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
- package/dist/routes/computer-use/participant-prompt.js +3 -3
- package/dist/routes/computer-use/participant-runs.d.ts +10 -10
- package/dist/routes/computer-use/participant-runs.js +14 -13
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +27 -27
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +5 -5
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +3 -2
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +13 -12
- package/dist/routes/computer-use/route.d.ts +12 -12
- package/dist/routes/computer-use/route.js +19 -19
- package/dist/routes/computer-use/self-report.js +1 -1
- package/dist/routes/computer-use/setup.d.ts +22 -22
- package/dist/routes/computer-use/setup.js +15 -15
- package/dist/routes/computer-use/single-bundle.d.ts +4 -4
- package/dist/routes/computer-use/single-bundle.js +14 -13
- package/dist/routes/computer-use/subject-projection.d.ts +3 -3
- package/dist/routes/computer-use/types.d.ts +34 -34
- package/dist/routes/computer-use/types.js +3 -3
- package/dist/routes/preview.d.ts +6 -6
- package/dist/routes/preview.js +5 -5
- package/dist/routes/scripted/bundle.d.ts +6 -6
- package/dist/routes/scripted/bundle.js +10 -9
- package/dist/routes/scripted/plan.d.ts +7 -7
- package/dist/routes/scripted/plan.js +6 -6
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +9 -9
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +11 -11
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +4 -4
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +3 -3
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +2 -2
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +17 -17
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +3 -3
- package/dist/routes/shared-world/bundle.js +15 -14
- package/dist/routes/shared-world/checkpoints.d.ts +3 -3
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +9 -9
- package/dist/routes/shared-world/comms.js +6 -5
- package/dist/routes/shared-world/participant-specs.d.ts +3 -3
- package/dist/routes/shared-world/participant-specs.js +7 -7
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +9 -9
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +4 -4
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +11 -10
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +19 -19
- package/dist/routes/shared-world/setup.d.ts +13 -13
- package/dist/routes/shared-world/setup.js +19 -19
- package/dist/routes/shared-world/types.d.ts +27 -27
- package/dist/routes/terminal/adapter.d.ts +2 -2
- package/dist/routes/terminal/adapter.js +4 -4
- package/dist/routes/terminal/bundle.d.ts +11 -11
- package/dist/routes/terminal/bundle.js +12 -12
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +5 -5
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +9 -9
- package/dist/routes/terminal/ledger.d.ts +2 -2
- 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 +7 -7
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +3 -2
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +2 -2
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +5 -5
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +7 -7
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +14 -14
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +7 -7
- package/dist/routes/terminal/trace.d.ts +2 -2
- package/dist/routes/terminal/types.d.ts +24 -24
- package/dist/routes/terminal/types.js +2 -2
- package/dist/run/bundle.d.ts +7 -7
- package/dist/run/bundle.js +2 -2
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +72 -43
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +2 -2
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.js +2 -2
- package/dist/run/projection.d.ts +32 -32
- package/dist/run/projection.js +44 -44
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +1 -1
- package/dist/run/results.d.ts +2 -2
- 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 +11 -1
- package/dist/run/run-index.js +63 -49
- package/dist/run/run.d.ts +3 -3
- package/dist/run/run.js +2 -2
- package/dist/run/shared-world-evidence.d.ts +1 -1
- package/dist/run/shared-world-shape.js +1 -1
- package/dist/run/stats.d.ts +3 -3
- package/dist/run/stats.js +14 -14
- package/dist/run/status.d.ts +10 -2
- package/dist/run/status.js +6 -3
- package/dist/run/streams.d.ts +2 -2
- package/dist/run/study-provenance.d.ts +4 -2
- package/dist/run/study-provenance.js +7 -4
- package/dist/run/study-result.d.ts +0 -5
- package/dist/run/study-result.js +1 -1
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -45
- package/dist/{lab → study}/adapter-extension.d.ts +8 -20
- package/dist/{lab → study}/adapter-extension.js +2 -14
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
- package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +12 -12
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +37 -20
- package/dist/study/convert.d.ts +1 -1
- package/dist/study/convert.js +15 -15
- package/dist/{lab → study}/device-presets.d.ts +2 -2
- package/dist/{lab → study}/discover.d.ts +29 -23
- package/dist/{lab → study}/discover.js +97 -118
- package/dist/{lab → study}/doctor.d.ts +11 -11
- package/dist/{lab → study}/doctor.js +18 -18
- package/dist/study/files.d.ts +2 -2
- package/dist/study/files.js +6 -5
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/{lab → study}/init-templates.js +16 -11
- package/dist/{lab → study}/init.d.ts +1 -1
- package/dist/{lab → study}/init.js +7 -4
- package/dist/{lab → study}/keys.d.ts +2 -2
- package/dist/{lab → study}/keys.js +10 -10
- package/dist/study/migrate.d.ts +8 -3
- package/dist/study/migrate.js +60 -4
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +5 -5
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
- package/dist/{lab → study}/parse/study-v3.js +3 -3
- package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
- package/dist/{lab → study}/parse/subject-state.js +4 -4
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +8 -8
- package/dist/{lab → study}/parse/values.d.ts +2 -2
- package/dist/{lab → study}/persona-resolve.d.ts +4 -4
- package/dist/{lab → study}/persona-resolve.js +2 -2
- 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 +10 -10
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +28 -28
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/{lab → study}/plan.js +20 -20
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +9 -8
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +3 -3
- package/dist/{lab → study}/preflight.d.ts +31 -31
- package/dist/{lab → study}/preflight.js +8 -8
- 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 +12 -12
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +4 -4
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
- package/dist/study/run-study-homes.js +3 -0
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +16 -15
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +10 -10
- package/dist/{lab → study}/summary.js +15 -15
- package/dist/{lab → study}/tasks.d.ts +3 -3
- package/dist/{lab → study}/tasks.js +1 -1
- package/dist/{lab → study}/types.d.ts +104 -104
- package/dist/{lab → study}/types.js +1 -1
- package/dist/{lab → study}/validation.d.ts +19 -19
- package/dist/{lab → study}/validation.js +13 -13
- package/dist/{lab → study}/warnings.d.ts +4 -4
- package/dist/{lab → study}/warnings.js +1 -1
- package/dist/subject/clone.d.ts +6 -6
- package/dist/subject/clone.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +3 -3
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/runtime.js +2 -2
- package/dist/subject/serve.d.ts +4 -4
- package/dist/subject/state.d.ts +3 -3
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +1 -1
- package/dist/subject/steps.js +1 -1
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +1 -1
- package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
- package/dist/substrates/e2b/desktop-browser.js +1 -1
- package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
- package/dist/substrates/e2b/desktop-cdp.js +1 -1
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +12 -12
- package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
- package/dist/substrates/e2b/desktop-geometry.js +1 -1
- package/dist/substrates/e2b/desktop-media.d.ts +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +3 -3
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +1 -1
- package/dist/substrates/e2b/sdk.js +1 -1
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/contract.d.ts +8 -8
- package/dist/tui/contract.js +2 -2
- package/dist/tui/launch.d.ts +3 -3
- package/dist/tui/launch.js +22 -16
- package/dist/tui-app.js +139 -139
- package/dist/verify/subject.d.ts +1 -1
- package/dist/verify/subject.js +1 -1
- package/dist/verify/verify.js +2 -1
- package/docs/architecture/actor-contract.md +5 -5
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/external-public-shared-world.md +8 -7
- package/docs/architecture/github-feedback-loop.md +1 -1
- package/docs/architecture/task-protocol-support.md +1 -1
- package/docs/architecture/terminal-product-route.md +18 -18
- package/docs/contracts/adapter-fixtures.md +2 -2
- package/docs/contracts/errors.md +8 -8
- package/docs/contracts/run-bundle.md +6 -4
- package/docs/contracts/schemas.md +61 -42
- package/docs/contracts/study-analysis.md +4 -1
- package/docs/contracts/study-costs.md +17 -2
- package/examples/README.md +1 -1
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +2 -1
- package/skills/humanish/SKILL.md +8 -6
- package/skills/humanish/agents/openai.yaml +1 -1
- package/dist/cli/commands/lab-format.d.ts +0 -9
- 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/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/deprecated-fields.d.ts +0 -10
- package/dist/lab/deprecated-fields.js +0 -24
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/plan.d.ts +0 -13
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -8
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-homes.js +0 -7
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/library-aliases.d.ts +0 -56
- package/dist/library-aliases.js +0 -22
- package/dist/run-lab.d.ts +0 -112
- /package/dist/{lab → study}/device-presets.js +0 -0
- /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}/parse/comms.js +0 -0
- /package/dist/{lab → study}/parse/execution.js +0 -0
- /package/dist/{lab → study}/parse/values.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
- /package/dist/{lab → study}/routing.js +0 -0
|
@@ -2,26 +2,26 @@ import { automaticAnalysisBudget, formatAutomaticAnalysisBudget, } from "../../a
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import { deriveRunFacts } from "../telemetry.js";
|
|
5
|
-
import {
|
|
5
|
+
import { resolveStudyManifest } from "../../study/discover.js";
|
|
6
6
|
import { warnAndQueue } from "../deprecations.js";
|
|
7
|
-
import {
|
|
8
|
-
import { keyNamesOf } from "../../
|
|
9
|
-
import { routeOf } from "../../
|
|
10
|
-
import { computerUseRouteRun } from "./
|
|
11
|
-
import { runRoute } from "./
|
|
12
|
-
import { scriptedRouteRun } from "./
|
|
13
|
-
import { sharedWorldRouteRun } from "./
|
|
14
|
-
import { previewRouteRun } from "./
|
|
15
|
-
import { terminalRouteRun } from "./
|
|
16
|
-
import { maybeLoadAdapterScorer } from "./
|
|
7
|
+
import { planStudy, resolveStudyDryRun } from "../../study/plan.js";
|
|
8
|
+
import { keyNamesOf } from "../../study/requirements.js";
|
|
9
|
+
import { routeOf } from "../../study/plan.js";
|
|
10
|
+
import { computerUseRouteRun } from "./study-route-computer-use.js";
|
|
11
|
+
import { runRoute } from "./study-route-run.js";
|
|
12
|
+
import { scriptedRouteRun } from "./study-route-scripted.js";
|
|
13
|
+
import { sharedWorldRouteRun } from "./study-route-shared-world.js";
|
|
14
|
+
import { previewRouteRun } from "./study-route-preview.js";
|
|
15
|
+
import { terminalRouteRun } from "./study-route-terminal.js";
|
|
16
|
+
import { maybeLoadAdapterScorer } from "./study-scorer.js";
|
|
17
17
|
import { discoverCliKeys, formatRunHuman, noteRunFacts, writeResult, } from "../io.js";
|
|
18
18
|
import { watchExposeRequested } from "../observer-follow.js";
|
|
19
19
|
import { beginRunSignalPhase } from "./run-signals.js";
|
|
20
20
|
import { WATCH_SAFE_NOT_APPLICABLE_MESSAGE } from "../../observer/exposure.js";
|
|
21
|
-
export async function
|
|
22
|
-
const resolved = await
|
|
21
|
+
export async function runStudyCommand(args) {
|
|
22
|
+
const resolved = await resolveStudyManifest(args.options.cwd, args.study);
|
|
23
23
|
if (!resolved.ok) {
|
|
24
|
-
writeResult(args.command, args.io, resolved,
|
|
24
|
+
writeResult(args.command, args.io, resolved, formatStudyResolveFailureHuman);
|
|
25
25
|
args.io.setExitCode(2);
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
@@ -33,14 +33,14 @@ export async function runLabCommand(args) {
|
|
|
33
33
|
const config = resolved.config;
|
|
34
34
|
// The run's identity: which manifest, where it lives, and whether it is committed, a
|
|
35
35
|
// local overlay, or an explicit path. Resolved once here (the only place that knows all three)
|
|
36
|
-
// and carried into the run's status record and bundle so the filesystem can answer "which
|
|
36
|
+
// and carried into the run's status record and bundle so the filesystem can answer "which study
|
|
37
37
|
// produced this run" without the old `persona.source = "lab:<id>"` string convention.
|
|
38
|
-
const
|
|
39
|
-
// Named here, once, for every route
|
|
40
|
-
//
|
|
41
|
-
noteRunFacts(args.command, deriveRunFacts({
|
|
38
|
+
const study = { id: config.id, path: resolved.path, origin: resolved.origin };
|
|
39
|
+
// Named here, once, for every route, so the starter study `first-run` is named in telemetry
|
|
40
|
+
// whatever its route's result carries.
|
|
41
|
+
noteRunFacts(args.command, deriveRunFacts({ studyId: config.id }));
|
|
42
42
|
const route = routeOf(config);
|
|
43
|
-
if (route !== "computer-use" &&
|
|
43
|
+
if (route !== "computer-use" && studyRerunFlagsRequested(args.options)) {
|
|
44
44
|
writeUnsupportedRerunFlagsResult(args, route);
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
@@ -54,7 +54,7 @@ export async function runLabCommand(args) {
|
|
|
54
54
|
warnings: [],
|
|
55
55
|
error: {
|
|
56
56
|
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
57
|
-
message: `--expose/--tunnel/--oauth stream a live desktop and apply only to computer-use
|
|
57
|
+
message: `--expose/--tunnel/--oauth stream a live desktop and apply only to computer-use studies; this study runs on the ${route} route.`,
|
|
58
58
|
},
|
|
59
59
|
};
|
|
60
60
|
writeResult(args.command, args.io, result, formatRunHuman);
|
|
@@ -81,8 +81,8 @@ export async function runLabCommand(args) {
|
|
|
81
81
|
// Only a live run reads provider keys, so a dry run looks none up: no `gh auth token`, no e2b
|
|
82
82
|
// login, overlay or key store. A live run fills every key it finds and prints a line only for
|
|
83
83
|
// the keys its plan reads. This comes after the option refusals above, which read no key, and
|
|
84
|
-
// before the route's CLI setup and
|
|
85
|
-
if (
|
|
84
|
+
// before the route's CLI setup and prepareStudy, which do.
|
|
85
|
+
if (resolveStudyDryRun(config, args.options.dryRun, true) === false) {
|
|
86
86
|
const announced = announcedKeyNames(config, args.options);
|
|
87
87
|
await discoverCliKeys({
|
|
88
88
|
io: args.io,
|
|
@@ -90,15 +90,15 @@ export async function runLabCommand(args) {
|
|
|
90
90
|
...(announced === undefined ? {} : { announced }),
|
|
91
91
|
});
|
|
92
92
|
}
|
|
93
|
-
// The route's CLI setup refuses bad options,
|
|
93
|
+
// The route's CLI setup refuses bad options, runStudyWith's plan refuses bad labs, and the route's local
|
|
94
94
|
// checks (keys, runtime auth, subject env, the local agent, caps) refuse this machine, all before
|
|
95
95
|
// the scorer loads, so none imports the scorer's host code. The scripted route's checks and the
|
|
96
96
|
// run-id claim still come after it; the scripted route takes no scorer.
|
|
97
97
|
const routeRun = routeRunFor(route, { ...args, config });
|
|
98
98
|
if (routeRun === undefined)
|
|
99
99
|
return;
|
|
100
|
-
// Every route's
|
|
101
|
-
const run = { ...routeRun, options: { ...routeRun.options,
|
|
100
|
+
// Every route's runStudyWith options carry the study's provenance, from here only.
|
|
101
|
+
const run = { ...routeRun, options: { ...routeRun.options, study } };
|
|
102
102
|
// From here a signal marks the run interrupted and reclaims its sandboxes (run-signals.ts).
|
|
103
103
|
const signals = beginRunSignalPhase(args.io);
|
|
104
104
|
try {
|
|
@@ -126,12 +126,12 @@ export async function runLabCommand(args) {
|
|
|
126
126
|
}
|
|
127
127
|
const scorer = scorerLoad.scorer;
|
|
128
128
|
if (scorer) {
|
|
129
|
-
// Cross-repo guardrail: `humanish
|
|
129
|
+
// Cross-repo guardrail: `humanish run` import()s host JS named in the manifest.
|
|
130
130
|
// Surface it so the invoker (who may not be the manifest author) knows executable code ran.
|
|
131
131
|
args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is code that humanish loaded and ran in this process. Review it as you would any code you run.\n`);
|
|
132
132
|
}
|
|
133
133
|
const analysisBudget = automaticAnalysisBudget(config.review?.analysis, route);
|
|
134
|
-
if (analysisBudget &&
|
|
134
|
+
if (analysisBudget && resolveStudyDryRun(config, args.options.dryRun, true) === false) {
|
|
135
135
|
args.io.writeErr(`${formatAutomaticAnalysisBudget(analysisBudget)}\n`);
|
|
136
136
|
}
|
|
137
137
|
return scorer === undefined ? {} : { scorer };
|
|
@@ -147,12 +147,12 @@ export async function runLabCommand(args) {
|
|
|
147
147
|
/**
|
|
148
148
|
* The filled keys a live run prints a line for: the ones its plan reads. Count and rerun options
|
|
149
149
|
* change who runs, not which keys. Undefined, so every fill is printed, when a scorer is declared,
|
|
150
|
-
* since its host code may read any key, and when the
|
|
150
|
+
* since its host code may read any key, and when the study does not plan.
|
|
151
151
|
*/
|
|
152
152
|
function announcedKeyNames(config, options) {
|
|
153
153
|
if (options.scorer !== undefined || config.review?.scorer !== undefined)
|
|
154
154
|
return undefined;
|
|
155
|
-
const planned =
|
|
155
|
+
const planned = planStudy(config, { cwd: options.cwd, dryRun: false });
|
|
156
156
|
return planned.ok ? keyNamesOf(planned.planned.plan) : undefined;
|
|
157
157
|
}
|
|
158
158
|
/** The route's CLI setup. Undefined when the setup has already written its own result. */
|
|
@@ -170,10 +170,10 @@ function routeRunFor(route, args) {
|
|
|
170
170
|
return sharedWorldRouteRun(args);
|
|
171
171
|
default:
|
|
172
172
|
// Compile-time exhaustiveness: a future route must be handled here, not silently no-op.
|
|
173
|
-
throw new Error(`Unhandled
|
|
173
|
+
throw new Error(`Unhandled study route: ${String(route)}`);
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
|
-
function
|
|
176
|
+
function studyRerunFlagsRequested(options) {
|
|
177
177
|
return options.rerunFailedFrom !== undefined || options.participants !== undefined;
|
|
178
178
|
}
|
|
179
179
|
function writeUnsupportedRerunFlagsResult(args, route) {
|
|
@@ -184,13 +184,13 @@ function writeUnsupportedRerunFlagsResult(args, route) {
|
|
|
184
184
|
warnings: [],
|
|
185
185
|
error: {
|
|
186
186
|
code: "HUMANISH_UNSUPPORTED_RERUN_FLAGS",
|
|
187
|
-
message: `--rerun-failed-from/--participants apply only to computer-use
|
|
187
|
+
message: `--rerun-failed-from/--participants apply only to computer-use studies with more than one participant; this study runs on the ${route} route.`,
|
|
188
188
|
},
|
|
189
189
|
};
|
|
190
190
|
writeResult(args.command, args.io, result, formatRunHuman);
|
|
191
191
|
args.io.setExitCode(2);
|
|
192
192
|
}
|
|
193
|
-
function
|
|
193
|
+
function formatStudyResolveFailureHuman(result) {
|
|
194
194
|
const warnings = result.warnings.map((warning) => `warning: ${warning}\n`).join("");
|
|
195
195
|
return { ...(warnings ? { stdout: warnings } : {}), error: result.error };
|
|
196
196
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type AdapterScorerModule } from "../../
|
|
2
|
-
import type {
|
|
1
|
+
import { type AdapterScorerModule } from "../../study/adapter-scorer-loader.js";
|
|
2
|
+
import type { StudyRoute } from "../../study/plan.js";
|
|
3
3
|
import type { RunScorerProvenance } from "../../run/bundle.js";
|
|
4
|
-
import type {
|
|
4
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
5
5
|
import type { RunResult } from "../../run/results.js";
|
|
6
6
|
/** A config-declared scorer that resolved + loaded fail-closed, ready to thread into a backend. */
|
|
7
7
|
export interface LoadedAdapterScorer {
|
|
@@ -16,8 +16,8 @@ export interface LoadedAdapterScorer {
|
|
|
16
16
|
*/
|
|
17
17
|
export declare function maybeLoadAdapterScorer(args: {
|
|
18
18
|
cwd: string;
|
|
19
|
-
config:
|
|
20
|
-
route:
|
|
19
|
+
config: StudyConfig;
|
|
20
|
+
route: StudyRoute;
|
|
21
21
|
flag: string | undefined;
|
|
22
22
|
}): Promise<{
|
|
23
23
|
ok: true;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { loadAdapterScorer } from "../../
|
|
1
|
+
import { loadAdapterScorer } from "../../study/adapter-scorer-loader.js";
|
|
2
2
|
/**
|
|
3
3
|
* Resolve `review.scorer.ref` (or the `--scorer` override) to a loaded adopter scorer, fail-closed
|
|
4
4
|
* (typed error) pre-spend. Precedence: CLI `--scorer` overrides the manifest; `source` records which
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { formatAutomaticAnalysisBudget } from "../../analysis/automatic-config.js";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { Command, Option } from "commander";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { addRunOptions, handleRun } from "./run-command.js";
|
|
7
|
-
import { deprecationMessage, warnAndQueue } from "../deprecations.js";
|
|
4
|
+
import { inspectStudyManifest, listStudyManifests } from "../../study/discover.js";
|
|
5
|
+
import { runStudyPreflight, } from "../../study/preflight.js";
|
|
8
6
|
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, humanError, } from "../io.js";
|
|
9
7
|
export function registerStudyCommands(parent, io) {
|
|
10
8
|
const study = parent
|
|
@@ -13,51 +11,23 @@ export function registerStudyCommands(parent, io) {
|
|
|
13
11
|
listCommand(study.command("list"), io);
|
|
14
12
|
showCommand(study.command("show"), io);
|
|
15
13
|
checkCommand(study.command("check"), io);
|
|
16
|
-
// Removed in 0.109.0: the `lab` group stays one minor, hidden. Its list, inspect and preflight
|
|
17
|
-
// run as study list, show and check, and `lab run` runs as `run`, each after a warning.
|
|
18
|
-
const lab = parent
|
|
19
|
-
.command("lab", { hidden: true })
|
|
20
|
-
.description("Deprecated: use humanish study.");
|
|
21
|
-
listCommand(lab.command("list"), io, "humanish study list");
|
|
22
|
-
showCommand(lab.command("inspect"), io, "humanish study show <study>");
|
|
23
|
-
checkCommand(lab.command("preflight"), io, "humanish study check <study>");
|
|
24
|
-
addRunOptions(lab.command("run", { hidden: true }).argument("<study>", "Study id or .yaml path.")).action((name, options, command) => {
|
|
25
|
-
warnOldCommand(command, io, "humanish run <study>");
|
|
26
|
-
return handleRun(io, name, options, command);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
/** The warning for a `lab` subcommand, naming its replacement. */
|
|
30
|
-
function warnOldCommand(command, io, replacement) {
|
|
31
|
-
warnAndQueue(command, io, deprecationMessage(`humanish lab ${command.name()}`, replacement));
|
|
32
14
|
}
|
|
33
|
-
function listCommand(command, io
|
|
15
|
+
function listCommand(command, io) {
|
|
34
16
|
command
|
|
35
17
|
.description("List the studies in this project, committed and local.")
|
|
36
18
|
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
37
19
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
38
|
-
.action((options, command) =>
|
|
39
|
-
if (replacement !== undefined)
|
|
40
|
-
warnOldCommand(command, io, replacement);
|
|
41
|
-
return handleStudyList(io, options, command);
|
|
42
|
-
});
|
|
43
|
-
if (replacement !== undefined)
|
|
44
|
-
command.description(`Deprecated: use ${replacement}.`);
|
|
20
|
+
.action((options, command) => handleStudyList(io, options, command));
|
|
45
21
|
}
|
|
46
|
-
function showCommand(command, io
|
|
22
|
+
function showCommand(command, io) {
|
|
47
23
|
command
|
|
48
24
|
.argument("<study>", "Study id or .yaml path.")
|
|
49
25
|
.description("Show a study's parsed file and its warnings without running it.")
|
|
50
26
|
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
51
27
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
52
|
-
.action((name, options, command) =>
|
|
53
|
-
if (replacement !== undefined)
|
|
54
|
-
warnOldCommand(command, io, replacement);
|
|
55
|
-
return handleStudyShow(io, name, options, command);
|
|
56
|
-
});
|
|
57
|
-
if (replacement !== undefined)
|
|
58
|
-
command.description(`Deprecated: use ${replacement}.`);
|
|
28
|
+
.action((name, options, command) => handleStudyShow(io, name, options, command));
|
|
59
29
|
}
|
|
60
|
-
function checkCommand(command, io
|
|
30
|
+
function checkCommand(command, io) {
|
|
61
31
|
command
|
|
62
32
|
.argument("<study>", "Study id or .yaml path.")
|
|
63
33
|
.description("Check the study file and, with --reachability, its named endpoints. humanish doctor --study <study> checks this machine.")
|
|
@@ -68,21 +38,15 @@ function checkCommand(command, io, replacement) {
|
|
|
68
38
|
.option("--timeout-ms <ms>", "Target reachability timeout.", String(30_000))
|
|
69
39
|
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
70
40
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
71
|
-
.action((name, options, command) =>
|
|
72
|
-
if (replacement !== undefined)
|
|
73
|
-
warnOldCommand(command, io, replacement);
|
|
74
|
-
return handleStudyCheck(io, name, options, command);
|
|
75
|
-
});
|
|
76
|
-
if (replacement !== undefined)
|
|
77
|
-
command.description(`Deprecated: use ${replacement}.`);
|
|
41
|
+
.action((name, options, command) => handleStudyCheck(io, name, options, command));
|
|
78
42
|
}
|
|
79
43
|
async function handleStudyList(io, options, command) {
|
|
80
|
-
const result = await
|
|
44
|
+
const result = await listStudyManifests(options.cwd);
|
|
81
45
|
writeResult(command, io, result, formatStudyListHuman);
|
|
82
46
|
io.setExitCode(0);
|
|
83
47
|
}
|
|
84
48
|
async function handleStudyShow(io, name, options, command) {
|
|
85
|
-
const result = await
|
|
49
|
+
const result = await inspectStudyManifest(options.cwd, name);
|
|
86
50
|
writeResult(command, io, result, formatStudyShowHuman);
|
|
87
51
|
io.setExitCode(result.ok ? 0 : 2);
|
|
88
52
|
}
|
|
@@ -117,9 +81,9 @@ async function handleStudyCheck(io, name, options, command) {
|
|
|
117
81
|
io.setExitCode(2);
|
|
118
82
|
return;
|
|
119
83
|
}
|
|
120
|
-
const result = await
|
|
84
|
+
const result = await runStudyPreflight({
|
|
121
85
|
cwd: options.cwd,
|
|
122
|
-
|
|
86
|
+
study: name,
|
|
123
87
|
reachability: options.reachability,
|
|
124
88
|
timeoutMs,
|
|
125
89
|
});
|
|
@@ -136,7 +100,7 @@ function formatStudyListHuman(result) {
|
|
|
136
100
|
}
|
|
137
101
|
return ([
|
|
138
102
|
"humanish studies",
|
|
139
|
-
...result.studies.map((
|
|
103
|
+
...result.studies.map((study) => `- ${study.id} ${study.source} ${study.origin} ${study.path}${study.title ? ` (${study.title})` : ""}`),
|
|
140
104
|
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
141
105
|
].join("\n") + "\n");
|
|
142
106
|
}
|
package/dist/cli/commands/tui.js
CHANGED
|
@@ -4,15 +4,15 @@ import { Command } from "commander";
|
|
|
4
4
|
import { setUserKey } from "../../keys/key-resolution.js";
|
|
5
5
|
import { saveCommsConnection } from "../../comms/connections.js";
|
|
6
6
|
import { readCommsSetup } from "../../comms/setup.js";
|
|
7
|
-
import { checkCommsConnection,
|
|
7
|
+
import { checkCommsConnection, configureCommsStudy, } from "../../comms/setup.js";
|
|
8
8
|
import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
|
|
9
9
|
import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
|
|
10
10
|
import { promptSecret } from "../secret-prompt.js";
|
|
11
|
-
import { runInit } from "../../
|
|
12
|
-
import {
|
|
11
|
+
import { runInit } from "../../study/init.js";
|
|
12
|
+
import { listStudyManifests } from "../../study/discover.js";
|
|
13
13
|
import { reclaimRunSandboxes } from "../../run/reclaim.js";
|
|
14
14
|
import { RunIndexCache, readRunIndex } from "../../run/run-index.js";
|
|
15
|
-
import {
|
|
15
|
+
import { readStudySummary } from "../../study/summary.js";
|
|
16
16
|
import { readProjectState } from "../../tui/project.js";
|
|
17
17
|
import { createTuiObserverSession, stopRun, TUI_ACTION_SCHEMA } from "../../tui/actions.js";
|
|
18
18
|
import { readRunDetail } from "../../run/detail.js";
|
|
@@ -128,7 +128,7 @@ function checkTuiSession(runtime, force) {
|
|
|
128
128
|
ok: false,
|
|
129
129
|
error: {
|
|
130
130
|
code: "HUMANISH_TUI_REQUIRES_TTY",
|
|
131
|
-
message: "humanish tui needs an interactive terminal. For scripted or agent use, `humanish runs --json` lists the same runs and `humanish run <
|
|
131
|
+
message: "humanish tui needs an interactive terminal. For scripted or agent use, `humanish runs --json` lists the same runs and `humanish run <study> --json` starts one.",
|
|
132
132
|
},
|
|
133
133
|
};
|
|
134
134
|
}
|
|
@@ -210,13 +210,13 @@ function tuiCapabilities(session) {
|
|
|
210
210
|
});
|
|
211
211
|
return session.connectionCheck;
|
|
212
212
|
},
|
|
213
|
-
|
|
214
|
-
title:
|
|
215
|
-
path:
|
|
213
|
+
studies: async () => (await listStudyManifests(cwd)).studies.map((study) => ({
|
|
214
|
+
title: study.title ?? study.id,
|
|
215
|
+
path: study.path,
|
|
216
216
|
})),
|
|
217
|
-
configure: (
|
|
217
|
+
configure: (study, apply, planToken) => configureCommsStudy({
|
|
218
218
|
cwd,
|
|
219
|
-
|
|
219
|
+
study,
|
|
220
220
|
connection: "agentmail",
|
|
221
221
|
apply,
|
|
222
222
|
...(planToken ? { planToken } : {}),
|
|
@@ -244,11 +244,11 @@ function tuiCapabilities(session) {
|
|
|
244
244
|
// One cache for the life of the surface: it refreshes on a cadence, and re-walking every
|
|
245
245
|
// run tree each tick is the cost this index exists to avoid.
|
|
246
246
|
readRunIndex: (target, readOptions) => readRunIndex(target, { ...readOptions, cache: runIndexCache }),
|
|
247
|
-
|
|
247
|
+
listStudies: listStudyManifests,
|
|
248
248
|
startRun: (launchOptions) => launchRun({ ...launchOptions, env: sessionEnv }),
|
|
249
249
|
readLaunchLog: readLaunchLogTail,
|
|
250
250
|
readRunDetail,
|
|
251
|
-
|
|
251
|
+
readStudySummary: (target, study, readOptions) => readStudySummary(target, study, { ...readOptions, env: sessionEnv }),
|
|
252
252
|
readProjectState,
|
|
253
253
|
openObserver: (target, observerPath) => observerSession.open(target, observerPath),
|
|
254
254
|
reclaimRun: (target, runId) => reclaimRunSandboxes(target, runId),
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { Command, Option } from "commander";
|
|
2
|
-
import {
|
|
2
|
+
import { serveObserver } from "../../observer/render.js";
|
|
3
3
|
import { WATCH_SAFE_NOT_APPLICABLE_MESSAGE } from "../../observer/exposure.js";
|
|
4
4
|
import { runDryRun } from "../../run/dry-run.js";
|
|
5
|
-
import {
|
|
5
|
+
import { runStudyCommand } from "./study-run.js";
|
|
6
6
|
import { addRunOptions, studyOnlyFlags } from "./run-command.js";
|
|
7
|
-
import { deprecationMessage, oldStudyOption, studyOptionValue, warnAndQueue, } from "../deprecations.js";
|
|
8
7
|
import { applyEnvFileOption, collectRepeated, formatRunHuman, parseObserverPort, parsePositiveInteger, wantsJson, writeResult, } from "../io.js";
|
|
9
8
|
import { followObserver, formatObserverHuman, watchExposeRequested } from "../observer-follow.js";
|
|
10
9
|
export function registerWatchCommand(parent, io) {
|
|
@@ -14,10 +13,7 @@ export function registerWatchCommand(parent, io) {
|
|
|
14
13
|
.argument("[study]", "Study id or .yaml path to run and observe.")
|
|
15
14
|
.description("Run a study, open its Observer and keep the shell attached.")
|
|
16
15
|
.summary("Run a study and follow it in the Observer.")
|
|
17
|
-
.option("--study <id-or-path>", "Study id or .yaml path, in place of the argument.")
|
|
18
|
-
.addOption(oldStudyOption("id-or-path"))
|
|
19
|
-
// Removed in 0.109.0: watch --run stays one minor, hidden; observe --run shows a saved run.
|
|
20
|
-
.addOption(new Option("--run <id>", "Deprecated: use humanish observe --run <id>.").hideHelp()))
|
|
16
|
+
.option("--study <id-or-path>", "Study id or .yaml path, in place of the argument."))
|
|
21
17
|
.option("--expose", "Computer-use studies only: share the live run through an authenticated tunnel, to watch from a phone. Requires --oauth or --public-url.")
|
|
22
18
|
.addOption(new Option("--tunnel <provider>", "Spawn the external tunnel binary against the loopback port.").choices(["ngrok"]))
|
|
23
19
|
.option("--tunnel-domain <domain>", "Reserved domain passed to ngrok as --url (e.g. observer.example.com). Requires --tunnel.")
|
|
@@ -51,10 +47,7 @@ export function registerWatchCommand(parent, io) {
|
|
|
51
47
|
}
|
|
52
48
|
async function handleWatch(io, named, parsed, command) {
|
|
53
49
|
const options = parsed;
|
|
54
|
-
|
|
55
|
-
warnAndQueue(command, io, deprecationMessage("humanish watch --run", "humanish observe --run <id>"));
|
|
56
|
-
}
|
|
57
|
-
const option = studyOptionValue(command, io, options);
|
|
50
|
+
const option = options.study;
|
|
58
51
|
const study = option ?? named;
|
|
59
52
|
if (option !== undefined && named !== undefined) {
|
|
60
53
|
refuseWatch(command, io, options.cwd, {
|
|
@@ -68,7 +61,7 @@ async function handleWatch(io, named, parsed, command) {
|
|
|
68
61
|
cwd: options.cwd,
|
|
69
62
|
envFile: options.envFile,
|
|
70
63
|
io,
|
|
71
|
-
//
|
|
64
|
+
// runStudyCommand discovers keys for a live study; a preview run needs none.
|
|
72
65
|
discoverKeys: false,
|
|
73
66
|
}))) {
|
|
74
67
|
return;
|
|
@@ -85,9 +78,9 @@ async function handleWatch(io, named, parsed, command) {
|
|
|
85
78
|
});
|
|
86
79
|
return;
|
|
87
80
|
}
|
|
88
|
-
// Exposure is only meaningful for a live computer-use study run (it serves the live desktop).
|
|
89
|
-
//
|
|
90
|
-
//
|
|
81
|
+
// Exposure is only meaningful for a live computer-use study run (it serves the live desktop). A
|
|
82
|
+
// watch without a study starts a fresh synthetic run with no live desktop to stream, so exposure
|
|
83
|
+
// flags there are refused rather than silently ignored; use `observe --all`.
|
|
91
84
|
if (watchExposeRequested(options)) {
|
|
92
85
|
refuseWatch(command, io, options.cwd, {
|
|
93
86
|
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
@@ -103,7 +96,7 @@ async function handleWatch(io, named, parsed, command) {
|
|
|
103
96
|
});
|
|
104
97
|
return;
|
|
105
98
|
}
|
|
106
|
-
const target = resolveWatchTarget(options
|
|
99
|
+
const target = resolveWatchTarget(options);
|
|
107
100
|
if ("code" in target) {
|
|
108
101
|
refuseWatch(command, io, options.cwd, target);
|
|
109
102
|
return;
|
|
@@ -136,24 +129,13 @@ function refuseWatch(command, io, cwd, refusal) {
|
|
|
136
129
|
writeResult(command, io, result, formatRunHuman);
|
|
137
130
|
io.setExitCode(2);
|
|
138
131
|
}
|
|
139
|
-
/** A study argument starts that study under watch
|
|
132
|
+
/** A study argument starts that study under watch. */
|
|
140
133
|
async function watchStudy(io, command, study, options) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
144
|
-
message: "Use either a study to start evidence or --run to watch existing evidence, not both.",
|
|
145
|
-
});
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
// Forwarded wholesale, as `run` forwards its options, so a run flag reaches the lab either way.
|
|
149
|
-
await runLabCommand({ command, io, lab: study, mode: "watch", options });
|
|
134
|
+
// Forwarded wholesale, as `run` forwards its options, so a run flag reaches the run either way.
|
|
135
|
+
await runStudyCommand({ command, io, study, mode: "watch", options });
|
|
150
136
|
}
|
|
151
|
-
/** Without a study, watch
|
|
152
|
-
function resolveWatchTarget(options
|
|
153
|
-
const runOptionSource = typeof command.getOptionValueSource === "function"
|
|
154
|
-
? command.getOptionValueSource("run")
|
|
155
|
-
: undefined;
|
|
156
|
-
const runWasOmitted = runOptionSource === undefined || runOptionSource === "default";
|
|
137
|
+
/** Without a study, watch starts a fresh synthetic run of `--count` participants, 4 by default. */
|
|
138
|
+
function resolveWatchTarget(options) {
|
|
157
139
|
const participantCount = options.count === undefined ? undefined : parsePositiveInteger(options.count);
|
|
158
140
|
const port = parseObserverPort(options.port);
|
|
159
141
|
if (participantCount === null) {
|
|
@@ -162,48 +144,31 @@ function resolveWatchTarget(options, command) {
|
|
|
162
144
|
message: "--count must be a positive integer.",
|
|
163
145
|
};
|
|
164
146
|
}
|
|
165
|
-
if (!runWasOmitted && participantCount !== undefined) {
|
|
166
|
-
return {
|
|
167
|
-
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
168
|
-
message: "Use either --run to watch existing evidence or --count to start a fresh run, not both.",
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
if (!runWasOmitted && options.runId !== undefined) {
|
|
172
|
-
return {
|
|
173
|
-
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
174
|
-
message: "--run-id only applies to fresh watch runs; remove --run or remove --run-id.",
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
147
|
if (port === null) {
|
|
178
148
|
return {
|
|
179
149
|
code: "HUMANISH_INVALID_PORT",
|
|
180
150
|
message: "--port must be an integer between 0 and 65535.",
|
|
181
151
|
};
|
|
182
152
|
}
|
|
183
|
-
return { requestedParticipantCount: participantCount ??
|
|
153
|
+
return { requestedParticipantCount: participantCount ?? 4, port };
|
|
184
154
|
}
|
|
185
|
-
/** Render the
|
|
155
|
+
/** Render the fresh run; undefined when it failed and its result was written. */
|
|
186
156
|
async function renderWatchEvidence(io, command, options, requestedParticipantCount, staticOpen) {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
observer: { open: staticOpen },
|
|
196
|
-
});
|
|
197
|
-
if (!runResult.ok || runResult.observer === undefined) {
|
|
198
|
-
writeResult(command, io, runResult, formatRunHuman);
|
|
199
|
-
io.setExitCode(2);
|
|
200
|
-
return undefined;
|
|
201
|
-
}
|
|
202
|
-
return runResult.observer;
|
|
203
|
-
}
|
|
204
|
-
return renderObserver(options.cwd, options.run ?? "latest", {
|
|
205
|
-
open: staticOpen,
|
|
157
|
+
// A fresh run renders through its finished run, so the page shown is the run just written,
|
|
158
|
+
// never a directory swapped in under its id.
|
|
159
|
+
const runResult = await runDryRun({
|
|
160
|
+
cwd: options.cwd,
|
|
161
|
+
dryRun: true,
|
|
162
|
+
participantCount: requestedParticipantCount,
|
|
163
|
+
...(options.runId === undefined ? {} : { runId: options.runId }),
|
|
164
|
+
observer: { open: staticOpen },
|
|
206
165
|
});
|
|
166
|
+
if (!runResult.ok || runResult.observer === undefined) {
|
|
167
|
+
writeResult(command, io, runResult, formatRunHuman);
|
|
168
|
+
io.setExitCode(2);
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
return runResult.observer;
|
|
207
172
|
}
|
|
208
173
|
/** Write the result, then keep a live server attached when following. */
|
|
209
174
|
async function reportWatch(io, command, rendered, serve) {
|
|
@@ -1,18 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Command } from "commander";
|
|
2
2
|
import type { CliIo } from "./io.js";
|
|
3
|
-
/** `<old> is deprecated and is removed in the next minor. Use <replacement>.` */
|
|
4
|
-
export declare function deprecationMessage(old: string, replacement: string): string;
|
|
5
3
|
/** Print `warning: <message>` on stderr, and queue the message for the command's JSON result. */
|
|
6
4
|
export declare function warnAndQueue(command: Command, io: CliIo, message: string): void;
|
|
7
5
|
/** `output` with the command's queued warnings at the front of its `warnings`. */
|
|
8
6
|
export declare function withQueuedWarnings<T>(command: Command, output: T): T;
|
|
9
|
-
/**
|
|
10
|
-
* The 0.107 spelling of `--study`, hidden for one minor. Commander refuses it together with
|
|
11
|
-
* `--study`. Read the value with studyOptionValue.
|
|
12
|
-
*/
|
|
13
|
-
export declare function oldStudyOption(valueName: string): Option;
|
|
14
|
-
/** The `--study` value, or the `--lab` value with its deprecation warning. */
|
|
15
|
-
export declare function studyOptionValue(command: Command, io: CliIo, options: {
|
|
16
|
-
study?: string | undefined;
|
|
17
|
-
lab?: string | undefined;
|
|
18
|
-
}): string | undefined;
|
package/dist/cli/deprecations.js
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
// A warning a command prints, such as a deprecated spelling or a study file 0.109 stops reading,
|
|
2
|
-
// goes to stderr when it happens and into the `warnings` array of the command's JSON result, so a
|
|
3
|
-
// caller that reads only stdout sees it too. writeResult adds the queued warnings.
|
|
4
|
-
import { Option } from "commander";
|
|
5
1
|
const queued = new WeakMap();
|
|
6
|
-
/** `<old> is deprecated and is removed in the next minor. Use <replacement>.` */
|
|
7
|
-
export function deprecationMessage(old, replacement) {
|
|
8
|
-
return `${old} is deprecated and is removed in the next minor. Use ${replacement}.`;
|
|
9
|
-
}
|
|
10
2
|
/** Print `warning: <message>` on stderr, and queue the message for the command's JSON result. */
|
|
11
3
|
export function warnAndQueue(command, io, message) {
|
|
12
4
|
io.writeErr(`warning: ${message}\n`);
|
|
@@ -24,25 +16,3 @@ export function withQueuedWarnings(command, output) {
|
|
|
24
16
|
return output;
|
|
25
17
|
return { ...output, warnings: [...messages, ...(existing ?? [])] };
|
|
26
18
|
}
|
|
27
|
-
/**
|
|
28
|
-
* The 0.107 spelling of `--study`, hidden for one minor. Commander refuses it together with
|
|
29
|
-
* `--study`. Read the value with studyOptionValue.
|
|
30
|
-
*/
|
|
31
|
-
export function oldStudyOption(valueName) {
|
|
32
|
-
return new Option(`--lab <${valueName}>`).hideHelp().conflicts("study");
|
|
33
|
-
}
|
|
34
|
-
/** The `--study` value, or the `--lab` value with its deprecation warning. */
|
|
35
|
-
export function studyOptionValue(command, io, options) {
|
|
36
|
-
if (options.lab === undefined)
|
|
37
|
-
return options.study;
|
|
38
|
-
const path = commandPath(command);
|
|
39
|
-
warnAndQueue(command, io, deprecationMessage(`humanish ${path} --lab`, `humanish ${path} --study <study>`));
|
|
40
|
-
return options.lab;
|
|
41
|
-
}
|
|
42
|
-
/** The command's words after `humanish`, such as `comms check`. */
|
|
43
|
-
function commandPath(command) {
|
|
44
|
-
const words = [];
|
|
45
|
-
for (let at = command; at?.parent; at = at.parent)
|
|
46
|
-
words.unshift(at.name());
|
|
47
|
-
return words.join(" ");
|
|
48
|
-
}
|
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type KeyResolutionDeps } from "../keys/key-resolution.js";
|
|
2
2
|
import { type DetectLocalAgentsOptions } from "../actors/local-agent/cli.js";
|
|
3
|
-
import { type
|
|
3
|
+
import { type StudySetupCheckArgs } from "../study/doctor.js";
|
|
4
4
|
declare const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
|
|
5
5
|
/**
|
|
6
6
|
* A row's verdict, as the human output prints it. A "note" is advisory: it never fails the run, so
|
|
@@ -41,12 +41,12 @@ export type DoctorCheckDraft = Omit<DoctorResult["checks"][number], "status"> &
|
|
|
41
41
|
status?: "note";
|
|
42
42
|
};
|
|
43
43
|
export declare function doctor(cwdInput: string, options?: {
|
|
44
|
-
|
|
44
|
+
study?: string;
|
|
45
45
|
env?: NodeJS.ProcessEnv;
|
|
46
46
|
localAgents?: DetectLocalAgentsOptions;
|
|
47
47
|
/** Where the key probe looks for vendor stores; tests point it at a temp home. */
|
|
48
48
|
keyDeps?: KeyResolutionDeps;
|
|
49
49
|
/** The hosted Codex participant's operator handshake; tests replace it. */
|
|
50
|
-
codexParticipantReadiness?:
|
|
50
|
+
codexParticipantReadiness?: StudySetupCheckArgs["codexParticipantReadiness"];
|
|
51
51
|
}): Promise<DoctorResult>;
|
|
52
52
|
export {};
|