humanish 0.108.0 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +58 -59
- package/CHANGELOG.md +13 -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/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 +3 -5
- 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/feedback/draft.js +2 -2
- 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/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 +24 -24
- 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 +1 -1
- 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} +3 -3
- 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} +13 -12
- 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 +1 -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 +1 -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
|
@@ -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 {};
|
package/dist/cli/doctor.js
CHANGED
|
@@ -4,7 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import { probeKeySources, } from "../keys/key-resolution.js";
|
|
5
5
|
import { nodeSupportsTui, terminalSurfaceMessage, TUI_BUNDLE_URL } from "../tui/contract.js";
|
|
6
6
|
import { detectLocalAgents, localAgentDoctorMessage, NO_LOCAL_AGENT_MESSAGE, } from "../actors/local-agent/cli.js";
|
|
7
|
-
import {
|
|
7
|
+
import { studySetupChecks, studiesByRequiredKey, } from "../study/doctor.js";
|
|
8
8
|
import { prepareSelectedOutputDirectory, } from "../run/contained-output.js";
|
|
9
9
|
import { implicitProjectDirectoryExists, readImplicitProjectFile, validateCwd, } from "../run/project.js";
|
|
10
10
|
const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
|
|
@@ -65,12 +65,12 @@ export async function doctor(cwdInput, options = {}) {
|
|
|
65
65
|
}
|
|
66
66
|
const env = options.env ?? process.env;
|
|
67
67
|
const agents = await detectLocalAgents({ ...options.localAgents, env });
|
|
68
|
-
const { probes, receivingKey } = await probeDoctorKeys(cwd, env, options.
|
|
68
|
+
const { probes, receivingKey } = await probeDoctorKeys(cwd, env, options.study, options.keyDeps);
|
|
69
69
|
const keyPresent = (name) => probes.some((probe) => probe.name === name && probe.source !== null);
|
|
70
|
-
const setup = options.
|
|
71
|
-
? await
|
|
70
|
+
const setup = options.study
|
|
71
|
+
? await studySetupChecks({
|
|
72
72
|
cwd,
|
|
73
|
-
|
|
73
|
+
study: options.study,
|
|
74
74
|
env,
|
|
75
75
|
agents,
|
|
76
76
|
keyPresent,
|
|
@@ -79,7 +79,7 @@ export async function doctor(cwdInput, options = {}) {
|
|
|
79
79
|
: { codexParticipantReadiness: options.codexParticipantReadiness }),
|
|
80
80
|
})
|
|
81
81
|
: undefined;
|
|
82
|
-
// Without --
|
|
82
|
+
// Without --study, each key row names the studies that need it instead of failing.
|
|
83
83
|
const keyUsers = setup ? undefined : await studiesByRequiredKey(cwd, keyPresent);
|
|
84
84
|
const checks = [
|
|
85
85
|
...(await projectChecks(projectRoot)),
|
|
@@ -195,7 +195,7 @@ async function desktopSdkCheck(setup) {
|
|
|
195
195
|
});
|
|
196
196
|
const version = present ? await installedDesktopSdkVersion() : undefined;
|
|
197
197
|
const advisory = desktopSdkAdvisory(version);
|
|
198
|
-
// Without --
|
|
198
|
+
// Without --study nothing selects a desktop route yet, so an absent SDK is advisory.
|
|
199
199
|
const advisoryOnly = !present && setup === undefined;
|
|
200
200
|
return {
|
|
201
201
|
name: "e2b desktop sdk",
|
|
@@ -236,13 +236,13 @@ function terminalSurfaceCheck() {
|
|
|
236
236
|
}),
|
|
237
237
|
};
|
|
238
238
|
}
|
|
239
|
-
/** Probes the live-run keys, plus the receiving-email key a real-comms
|
|
240
|
-
async function probeDoctorKeys(cwd, env,
|
|
239
|
+
/** Probes the live-run keys, plus the receiving-email key a real-comms study names. */
|
|
240
|
+
async function probeDoctorKeys(cwd, env, study, keyDeps) {
|
|
241
241
|
const keyNames = new Set(["OPENAI_API_KEY", "E2B_API_KEY", "GH_TOKEN", "CODEX_API_KEY"]);
|
|
242
242
|
let receivingKey = null;
|
|
243
|
-
if (
|
|
244
|
-
const {
|
|
245
|
-
const resolved = await
|
|
243
|
+
if (study) {
|
|
244
|
+
const { resolveStudyManifest } = await import("../study/discover.js");
|
|
245
|
+
const resolved = await resolveStudyManifest(cwd, study);
|
|
246
246
|
if (resolved.ok && resolved.config.comms?.email?.kind === "real") {
|
|
247
247
|
const { receivingRequiredKey } = await import("../comms/setup.js");
|
|
248
248
|
receivingKey = await receivingRequiredKey(cwd, resolved.config.comms.email.connection);
|
|
@@ -284,7 +284,7 @@ function studyList(studies) {
|
|
|
284
284
|
* chain a live command resolves (env/--env-file, project overlay, vendor stores, the
|
|
285
285
|
* humanish user store). Values never appear; sources and fill commands do.
|
|
286
286
|
*
|
|
287
|
-
* With --
|
|
287
|
+
* With --study, a key the selected route requires fails when missing. Without it, `keyUsers` maps
|
|
288
288
|
* each key to the project's labs that need it, and a key row never fails: a missing key one of
|
|
289
289
|
* them needs is a note.
|
|
290
290
|
*/
|
|
@@ -303,12 +303,12 @@ function keyChecks(probes, receivingKey, setup, keyUsers) {
|
|
|
303
303
|
...(present || usedBy === undefined ? {} : { status: "note" }),
|
|
304
304
|
message: present
|
|
305
305
|
? `supplied by ${probe.source}; presence only, validity not tested${usedBy ? `; ${usedBy}` : ""}`
|
|
306
|
-
: `missing; ${usedBy ?? "not used by any
|
|
306
|
+
: `missing; ${usedBy ?? "not used by any study in this project"}; ${hint}`,
|
|
307
307
|
};
|
|
308
308
|
}
|
|
309
309
|
// GH_TOKEN is needed only for private clone subjects, so its absence is informational.
|
|
310
310
|
const required = setup.keys.includes(probe.name);
|
|
311
|
-
// A key the
|
|
311
|
+
// A key the study is known not to read says so, so a present but unused key does not read as
|
|
312
312
|
// one the run will use.
|
|
313
313
|
const unused = setup.reads !== undefined && !setup.reads.has(probe.name);
|
|
314
314
|
return {
|
|
@@ -316,7 +316,7 @@ function keyChecks(probes, receivingKey, setup, keyUsers) {
|
|
|
316
316
|
ok: present || !required,
|
|
317
317
|
message: present
|
|
318
318
|
? unused
|
|
319
|
-
? `present (${probe.source}), not used by this
|
|
319
|
+
? `present (${probe.source}), not used by this study`
|
|
320
320
|
: `supplied by ${probe.source}; presence only, validity not tested`
|
|
321
321
|
: required
|
|
322
322
|
? `missing from every source; ${hint}`
|
|
@@ -30,17 +30,17 @@ export interface FirstRunEnvironment {
|
|
|
30
30
|
}
|
|
31
31
|
export type FirstRunActor = "openai-computer-use" | "local-agent";
|
|
32
32
|
/**
|
|
33
|
-
* Which brain the starter live
|
|
34
|
-
* and no provider key can still do a real live run; writing the
|
|
33
|
+
* Which brain the starter live study should be written for. A machine with a signed-in coding agent
|
|
34
|
+
* and no provider key can still do a real live run; writing the study for the credential the
|
|
35
35
|
* operator doesn't have is how a starter file becomes homework.
|
|
36
36
|
*/
|
|
37
37
|
export declare function starterActorFor(env: FirstRunEnvironment): FirstRunActor;
|
|
38
38
|
/**
|
|
39
|
-
* The `localAgent` a local-agent starter
|
|
39
|
+
* The `localAgent` a local-agent starter study names. Left out, the study would default to Codex and
|
|
40
40
|
* refuse to run on a machine where only Claude Code is signed in.
|
|
41
41
|
*/
|
|
42
42
|
export declare function starterLocalAgentFor(env: FirstRunEnvironment): LocalAgentId | undefined;
|
|
43
|
-
/** Hosts
|
|
43
|
+
/** Hosts that run local browser studies: Linux x64 and Apple Silicon Macs. */
|
|
44
44
|
export declare function supportsLocalBrowser(platform: NodeJS.Platform | undefined, arch: string | undefined): boolean;
|
|
45
45
|
export interface FirstRunStep {
|
|
46
46
|
/** The exact command to run. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// What a person, or the coding agent setting humanish up for them, should do next.
|
|
2
2
|
//
|
|
3
|
-
// Why: `humanish init` wrote twenty files and stopped. The only
|
|
3
|
+
// Why: `humanish init` wrote twenty files and stopped. The only study that could actually run was a
|
|
4
4
|
// $0 dry run; the two live ones were templates with `your-org/your-app` in them, so the first live
|
|
5
5
|
// run a newcomer tried could not succeed no matter what credentials they had. Three independent
|
|
6
6
|
// sources reached the same place: a participant in our own TUI study walked to the Start row and
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
// command, and names the one that will actually work on this machine, because a next step that
|
|
14
14
|
// fails is worse than none.
|
|
15
15
|
/**
|
|
16
|
-
* Which brain the starter live
|
|
17
|
-
* and no provider key can still do a real live run; writing the
|
|
16
|
+
* Which brain the starter live study should be written for. A machine with a signed-in coding agent
|
|
17
|
+
* and no provider key can still do a real live run; writing the study for the credential the
|
|
18
18
|
* operator doesn't have is how a starter file becomes homework.
|
|
19
19
|
*/
|
|
20
20
|
export function starterActorFor(env) {
|
|
@@ -27,7 +27,7 @@ function preferredAgent(env) {
|
|
|
27
27
|
return env.localAgents.find((agent) => agent.id === "codex") ?? env.localAgents[0];
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* The `localAgent` a local-agent starter
|
|
30
|
+
* The `localAgent` a local-agent starter study names. Left out, the study would default to Codex and
|
|
31
31
|
* refuse to run on a machine where only Claude Code is signed in.
|
|
32
32
|
*/
|
|
33
33
|
export function starterLocalAgentFor(env) {
|
|
@@ -38,7 +38,7 @@ export function starterLocalAgentFor(env) {
|
|
|
38
38
|
* a dev-dependency install puts no \`humanish\` on \`PATH\`, so a bare name can reach a stale global one.
|
|
39
39
|
*/
|
|
40
40
|
const HUMANISH = "npx humanish";
|
|
41
|
-
/** Hosts
|
|
41
|
+
/** Hosts that run local browser studies: Linux x64 and Apple Silicon Macs. */
|
|
42
42
|
export function supportsLocalBrowser(platform, arch) {
|
|
43
43
|
return (platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64");
|
|
44
44
|
}
|
|
@@ -99,7 +99,7 @@ export function firstRunSteps(env) {
|
|
|
99
99
|
}
|
|
100
100
|
steps.push({
|
|
101
101
|
command: `${HUMANISH} keys set openai`,
|
|
102
|
-
why: "openai-computer-use needs an API key; to use a Codex or Claude Code login instead, sign in and change the
|
|
102
|
+
why: "openai-computer-use needs an API key; to use a Codex or Claude Code login instead, sign in and change the study to actors[0].type: local-agent" +
|
|
103
103
|
localUnavailable,
|
|
104
104
|
});
|
|
105
105
|
return steps;
|
|
@@ -144,7 +144,7 @@ export function agentsSection() {
|
|
|
144
144
|
" bundles into an issue; `humanish feedback issue` writes a redacted, share-safe draft.",
|
|
145
145
|
"- `humanish tui` is for people and refuses to run in an agent session. Use the `--json`",
|
|
146
146
|
" commands above instead, and tell the person you are working for that `humanish tui` exists.",
|
|
147
|
-
"- A live run spends money. `execution.caps.maxUsd` in each
|
|
147
|
+
"- A live run spends money. `execution.caps.maxUsd` in each study caps estimated model spend: the run",
|
|
148
148
|
" stops before its next request once the estimate passes it, so the last request can go over, and",
|
|
149
149
|
" hosted desktop time is billed on top. Do not raise it without asking the person you are working for.",
|
|
150
150
|
"",
|
package/dist/cli/io.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export declare const ENV_FILE_OPTION_DESCRIPTION = "Load unset variables from th
|
|
|
17
17
|
export declare const PORT_OPTION_DESCRIPTION = "Port to listen on at 127.0.0.1.";
|
|
18
18
|
/** `--port` for a loopback server whose default, 0, lets the OS pick a free port. */
|
|
19
19
|
export declare function freePortOption(): Option;
|
|
20
|
-
export interface
|
|
20
|
+
export interface StudyCommandOptions {
|
|
21
21
|
count?: string | undefined;
|
|
22
22
|
cwd: string;
|
|
23
23
|
detach?: boolean | undefined;
|
|
@@ -50,7 +50,7 @@ export declare function applyEnvFileOption(args: {
|
|
|
50
50
|
io: CliIo;
|
|
51
51
|
env?: NodeJS.ProcessEnv;
|
|
52
52
|
onDiscovered?: (names: string[]) => void;
|
|
53
|
-
/** False for the
|
|
53
|
+
/** False for the study-running commands, which discover only once the study resolves to live. */
|
|
54
54
|
discoverKeys?: boolean;
|
|
55
55
|
}): Promise<boolean>;
|
|
56
56
|
/**
|
|
@@ -67,7 +67,7 @@ export declare function discoverCliKeys(args: {
|
|
|
67
67
|
/** Announce only the fills of these names; every key is still filled. Undefined announces all. */
|
|
68
68
|
announced?: ReadonlySet<string>;
|
|
69
69
|
}): Promise<void>;
|
|
70
|
-
export declare function
|
|
70
|
+
export declare function parseStudyCount(value: string | undefined, fallback: number): number | null;
|
|
71
71
|
export declare function parseParticipantIds(value: string | undefined): string[];
|
|
72
72
|
/** An error as a result carries it. A result with only a message, such as keys or comms, has no code. */
|
|
73
73
|
export interface CliError {
|
package/dist/cli/io.js
CHANGED
|
@@ -106,7 +106,7 @@ export async function discoverCliKeys(args) {
|
|
|
106
106
|
// Discovery must never break a command; a rung that fails to read is a miss, not an error.
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
-
export function
|
|
109
|
+
export function parseStudyCount(value, fallback) {
|
|
110
110
|
return value === undefined ? fallback : parsePositiveInteger(value);
|
|
111
111
|
}
|
|
112
112
|
export function parseParticipantIds(value) {
|
|
@@ -126,7 +126,7 @@ export function parseParticipantIds(value) {
|
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
128
|
* The command to run next, by code. A code is listed only when its messages do not already name a
|
|
129
|
-
* command: the run-not-found and
|
|
129
|
+
* command: the run-not-found and missing-study messages do.
|
|
130
130
|
*/
|
|
131
131
|
const NEXT_COMMAND = {
|
|
132
132
|
HUMANISH_STUDY_NOT_FOUND: "humanish study list",
|