humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { formatAutomaticAnalysisBudget } from "../../analysis/automatic-config.js";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { Command, Option } from "commander";
|
|
4
|
+
import { inspectLabManifest, listLabManifests } from "../../lab/discover.js";
|
|
5
|
+
import { runLabPreflight, } from "../../lab/preflight.js";
|
|
6
|
+
import { addRunOptions, handleRun } from "./run-command.js";
|
|
7
|
+
import { deprecationMessage, warnAndQueue } from "../deprecations.js";
|
|
8
|
+
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, humanError, } from "../io.js";
|
|
9
|
+
export function registerStudyCommands(parent, io) {
|
|
10
|
+
const study = parent
|
|
11
|
+
.command("study")
|
|
12
|
+
.description("List, show and check studies in humanish/studies/.");
|
|
13
|
+
listCommand(study.command("list"), io);
|
|
14
|
+
showCommand(study.command("show"), io);
|
|
15
|
+
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
|
+
}
|
|
33
|
+
function listCommand(command, io, replacement) {
|
|
34
|
+
command
|
|
35
|
+
.description("List the studies in this project, committed and local.")
|
|
36
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
37
|
+
.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}.`);
|
|
45
|
+
}
|
|
46
|
+
function showCommand(command, io, replacement) {
|
|
47
|
+
command
|
|
48
|
+
.argument("<study>", "Study id or .yaml path.")
|
|
49
|
+
.description("Show a study's parsed file and its warnings without running it.")
|
|
50
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
51
|
+
.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}.`);
|
|
59
|
+
}
|
|
60
|
+
function checkCommand(command, io, replacement) {
|
|
61
|
+
command
|
|
62
|
+
.argument("<study>", "Study id or .yaml path.")
|
|
63
|
+
.description("Check the study file and, with --reachability, its named endpoints. humanish doctor --study <study> checks this machine.")
|
|
64
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
65
|
+
.addOption(new Option("--reachability <mode>", "Reachability mode.")
|
|
66
|
+
.choices(["metadata", "public-preview", "sandbox-loopback", "prepared-host"])
|
|
67
|
+
.default("metadata"))
|
|
68
|
+
.option("--timeout-ms <ms>", "Target reachability timeout.", String(30_000))
|
|
69
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
70
|
+
.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}.`);
|
|
78
|
+
}
|
|
79
|
+
async function handleStudyList(io, options, command) {
|
|
80
|
+
const result = await listLabManifests(options.cwd);
|
|
81
|
+
writeResult(command, io, result, formatStudyListHuman);
|
|
82
|
+
io.setExitCode(0);
|
|
83
|
+
}
|
|
84
|
+
async function handleStudyShow(io, name, options, command) {
|
|
85
|
+
const result = await inspectLabManifest(options.cwd, name);
|
|
86
|
+
writeResult(command, io, result, formatStudyShowHuman);
|
|
87
|
+
io.setExitCode(result.ok ? 0 : 2);
|
|
88
|
+
}
|
|
89
|
+
async function handleStudyCheck(io, name, options, command) {
|
|
90
|
+
if (!(await applyEnvFileOption({
|
|
91
|
+
command,
|
|
92
|
+
cwd: options.cwd,
|
|
93
|
+
envFile: options.envFile,
|
|
94
|
+
io,
|
|
95
|
+
}))) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const timeoutMs = parsePositiveInteger(options.timeoutMs);
|
|
99
|
+
if (timeoutMs === null) {
|
|
100
|
+
const result = {
|
|
101
|
+
schema: "humanish.study-check.v1",
|
|
102
|
+
ok: false,
|
|
103
|
+
cwd: resolve(options.cwd),
|
|
104
|
+
study: name,
|
|
105
|
+
reachability: options.reachability,
|
|
106
|
+
checks: [{ name: "timeout", ok: false, message: "--timeout-ms must be a positive integer." }],
|
|
107
|
+
targets: [],
|
|
108
|
+
sandbox: { created: false },
|
|
109
|
+
spend: { e2bDesktop: false, model: false },
|
|
110
|
+
warnings: [],
|
|
111
|
+
error: {
|
|
112
|
+
code: "HUMANISH_STUDY_PREFLIGHT_INVALID_OPTION",
|
|
113
|
+
message: "--timeout-ms must be a positive integer.",
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
writeResult(command, io, result, formatStudyCheckHuman);
|
|
117
|
+
io.setExitCode(2);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const result = await runLabPreflight({
|
|
121
|
+
cwd: options.cwd,
|
|
122
|
+
lab: name,
|
|
123
|
+
reachability: options.reachability,
|
|
124
|
+
timeoutMs,
|
|
125
|
+
});
|
|
126
|
+
writeResult(command, io, result, formatStudyCheckHuman);
|
|
127
|
+
io.setExitCode(result.ok ? 0 : 2);
|
|
128
|
+
}
|
|
129
|
+
function formatStudyListHuman(result) {
|
|
130
|
+
if (result.studies.length === 0) {
|
|
131
|
+
return ([
|
|
132
|
+
`No studies found in ${result.cwd}`,
|
|
133
|
+
"Create one under humanish/studies/*.yaml, or pass a .yaml path.",
|
|
134
|
+
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
135
|
+
].join("\n") + "\n");
|
|
136
|
+
}
|
|
137
|
+
return ([
|
|
138
|
+
"humanish studies",
|
|
139
|
+
...result.studies.map((lab) => `- ${lab.id} ${lab.source} ${lab.origin} ${lab.path}${lab.title ? ` (${lab.title})` : ""}${lab.error ? `\n error: ${lab.error}` : ""}`),
|
|
140
|
+
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
141
|
+
].join("\n") + "\n");
|
|
142
|
+
}
|
|
143
|
+
function formatStudyShowHuman(result) {
|
|
144
|
+
if (!result.ok || !result.config)
|
|
145
|
+
return humanError(result.error);
|
|
146
|
+
const config = result.config;
|
|
147
|
+
return ([
|
|
148
|
+
"humanish study",
|
|
149
|
+
`id: ${config.id}`,
|
|
150
|
+
`subject: ${config.subject.source}`,
|
|
151
|
+
...(config.execution?.target ? [`execution: ${config.execution.target}`] : []),
|
|
152
|
+
`actors: ${config.actors.map((actor) => actor.type).join(", ")}`,
|
|
153
|
+
...(config.title ? [`title: ${config.title}`] : []),
|
|
154
|
+
...(config.description ? [`description: ${config.description}`] : []),
|
|
155
|
+
...(result.path ? [`path: ${result.path}`] : []),
|
|
156
|
+
...(result.origin ? [`origin: ${result.origin}`] : []),
|
|
157
|
+
...(config.subject.repos?.length ? [`repos: ${config.subject.repos.join(", ")}`] : []),
|
|
158
|
+
...(result.personas ?? []).map((persona) => `persona ${persona.id}: ${persona.brief ? `authored context (before runtime additions)\n${persona.brief.text}` : "unresolved; id only"}`),
|
|
159
|
+
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
160
|
+
].join("\n") + "\n");
|
|
161
|
+
}
|
|
162
|
+
function formatStudyCheckHuman(result) {
|
|
163
|
+
const checkedTargets = result.targets.filter((target) => target.checked);
|
|
164
|
+
const reachableTargets = checkedTargets.filter((target) => target.reachable === true);
|
|
165
|
+
const blockedTargets = result.targets.filter((target) => target.status === "blocked");
|
|
166
|
+
const stdout = [
|
|
167
|
+
`humanish study check ${result.ok ? "passed" : "failed"}`,
|
|
168
|
+
`study: ${result.studyId ?? result.study}`,
|
|
169
|
+
...(result.route ? [`route: ${result.route}`] : []),
|
|
170
|
+
`reachability: ${result.reachability}`,
|
|
171
|
+
`targets: ${checkedTargets.length ? `${reachableTargets.length}/${checkedTargets.length} reachable` : `${result.targets.length} declared, not checked`}`,
|
|
172
|
+
...(blockedTargets.length ? [`blocked-targets: ${blockedTargets.length}`] : []),
|
|
173
|
+
`spend: ${result.spend.e2bDesktop ? "one e2b desktop, no model calls" : "none"}`,
|
|
174
|
+
...(result.analysis ? [formatAutomaticAnalysisBudget(result.analysis)] : []),
|
|
175
|
+
...(result.sandbox.created
|
|
176
|
+
? [`sandbox: created=yes killed=${result.sandbox.killed === true ? "yes" : "no"}`]
|
|
177
|
+
: []),
|
|
178
|
+
...result.checks.map((check) => `- ${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`),
|
|
179
|
+
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
180
|
+
].join("\n") + "\n";
|
|
181
|
+
return result.error === undefined ? stdout : { stdout, error: result.error };
|
|
182
|
+
}
|
|
@@ -5,7 +5,7 @@ import { type TuiModule } from "../../tui/contract.js";
|
|
|
5
5
|
import { type CliIo } from "../io.js";
|
|
6
6
|
/**
|
|
7
7
|
* The pieces of the outside world the `tui` command touches. Injectable for the same reason
|
|
8
|
-
* `keyDiscovery` is: the refusals
|
|
8
|
+
* `keyDiscovery` is: the refusals are the behavior worth testing, and a test cannot make a real
|
|
9
9
|
* TTY, an old Node, or a missing bundle appear.
|
|
10
10
|
*/
|
|
11
11
|
export interface TuiRuntime {
|
|
@@ -21,12 +21,12 @@ export interface TuiRuntime {
|
|
|
21
21
|
}
|
|
22
22
|
export declare const defaultTuiRuntime: TuiRuntime;
|
|
23
23
|
/**
|
|
24
|
-
* The stakeholder surface
|
|
25
|
-
* is the opposite
|
|
24
|
+
* The stakeholder surface. Every other command is written so an agent can drive it; this one
|
|
25
|
+
* is the opposite: it takes the screen and waits for a person.
|
|
26
26
|
*
|
|
27
27
|
* That inversion is why it refuses rather than degrades. An agent that runs `humanish tui` with a
|
|
28
28
|
* piped stdout has asked for something that cannot exist, and the useful answer is a structured
|
|
29
|
-
* error naming the command that
|
|
29
|
+
* error naming the command that would have answered the question. A TUI that quietly rendered
|
|
30
30
|
* frames into a pipe would poison a transcript with escape codes and look like a hang.
|
|
31
31
|
*/
|
|
32
32
|
export declare function registerTuiCommand(parent: Command, io: CliIo, runtime?: TuiRuntime): void;
|
package/dist/cli/commands/tui.js
CHANGED
|
@@ -19,7 +19,7 @@ import { readRunDetail } from "../../run/detail.js";
|
|
|
19
19
|
import { launchRun, readLaunchLogTail } from "../../tui/launch.js";
|
|
20
20
|
import { TUI_MIN_NODE_MAJOR, nodeSupportsTui, TUI_BUNDLE_URL, } from "../../tui/contract.js";
|
|
21
21
|
import { detectAgentSession } from "../../actors/agent-session.js";
|
|
22
|
-
import { applyEnvFileOption, CLI_VERSION, JSON_OPTION_DESCRIPTION, markInvocationEnvelopeWritten, wantsJson, } from "../io.js";
|
|
22
|
+
import { applyEnvFileOption, CLI_VERSION, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, markInvocationEnvelopeWritten, wantsJson, } from "../io.js";
|
|
23
23
|
export const defaultTuiRuntime = {
|
|
24
24
|
checkComms: checkCommsConnection,
|
|
25
25
|
promptSecret,
|
|
@@ -45,21 +45,21 @@ function refuseTui(command, io, refusal) {
|
|
|
45
45
|
io.setExitCode(2);
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
|
-
* The stakeholder surface
|
|
49
|
-
* is the opposite
|
|
48
|
+
* The stakeholder surface. Every other command is written so an agent can drive it; this one
|
|
49
|
+
* is the opposite: it takes the screen and waits for a person.
|
|
50
50
|
*
|
|
51
51
|
* That inversion is why it refuses rather than degrades. An agent that runs `humanish tui` with a
|
|
52
52
|
* piped stdout has asked for something that cannot exist, and the useful answer is a structured
|
|
53
|
-
* error naming the command that
|
|
53
|
+
* error naming the command that would have answered the question. A TUI that quietly rendered
|
|
54
54
|
* frames into a pipe would poison a transcript with escape codes and look like a hang.
|
|
55
55
|
*/
|
|
56
56
|
export function registerTuiCommand(parent, io, runtime = defaultTuiRuntime) {
|
|
57
57
|
parent
|
|
58
58
|
.command("tui")
|
|
59
|
-
.description("
|
|
60
|
-
.summary("
|
|
61
|
-
.option("--cwd <path>",
|
|
62
|
-
.option("--env-file <path>",
|
|
59
|
+
.description("Browse studies and runs in an interactive terminal UI. It refuses detected agent sessions and non-TTY input or output; agents use humanish study list --json, humanish study show <study> --json and humanish runs --json.")
|
|
60
|
+
.summary("Browse studies and runs in a terminal UI for people.")
|
|
61
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
62
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
63
63
|
.option("--force", "Open it anyway in a session that looks like an agent's.")
|
|
64
64
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
65
65
|
.action((options, command) => handleTui(io, runtime, options, command));
|
|
@@ -70,7 +70,7 @@ async function handleTui(io, runtime, options, command) {
|
|
|
70
70
|
refuseTui(command, io, refusal);
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
|
-
// The Ink app ships as a pre-built bundle beside the compiled CLI and is loaded
|
|
73
|
+
// The Ink app ships as a pre-built bundle beside the compiled CLI and is loaded only here, so
|
|
74
74
|
// no agent-facing command pays its parse cost.
|
|
75
75
|
const bundle = TUI_BUNDLE_URL;
|
|
76
76
|
const loaded = await runtime.loadTui(bundle);
|
|
@@ -80,7 +80,7 @@ async function handleTui(io, runtime, options, command) {
|
|
|
80
80
|
ok: false,
|
|
81
81
|
error: {
|
|
82
82
|
code: "HUMANISH_TUI_BUNDLE_MISSING",
|
|
83
|
-
message: `The terminal surface bundle is missing at ${bundle.pathname}. In a checkout, run \`pnpm build\`;
|
|
83
|
+
message: `The terminal surface bundle is missing at ${bundle.pathname}. In a checkout, run \`pnpm build\`; an installed package always ships it, so please report this as a bug.`,
|
|
84
84
|
},
|
|
85
85
|
});
|
|
86
86
|
return;
|
|
@@ -102,12 +102,12 @@ async function handleTui(io, runtime, options, command) {
|
|
|
102
102
|
}
|
|
103
103
|
/** The refusal for a session the surface cannot serve, or undefined when it may open. */
|
|
104
104
|
function checkTuiSession(runtime, force) {
|
|
105
|
-
// An agent runner, even with a real terminal. `codex exec` allocates a PTY for the commands
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
//
|
|
110
|
-
//
|
|
105
|
+
// An agent runner, even with a real terminal. `codex exec` allocates a PTY for the commands it
|
|
106
|
+
// runs, so the TTY check below passes for an agent too, and an agent in the surface can start a
|
|
107
|
+
// run it did not mean to start (humanish/studies/handed-a-human-surface.yaml records one). A TTY
|
|
108
|
+
// says a terminal exists, not that anyone is reading it. `--force` is the escape for the person
|
|
109
|
+
// who really is at this keyboard, and capturing frames from inside an agent session is exactly
|
|
110
|
+
// that case.
|
|
111
111
|
const agent = force ? undefined : detectAgentSession(runtime.env);
|
|
112
112
|
if (agent !== undefined) {
|
|
113
113
|
return {
|
|
@@ -117,8 +117,8 @@ function checkTuiSession(runtime, force) {
|
|
|
117
117
|
code: "HUMANISH_TUI_AGENT_SESSION",
|
|
118
118
|
message: `humanish tui is a surface for a person, and ${agent.marker} says this session belongs to ${agent.runner}. ` +
|
|
119
119
|
"It renders frames of escape codes into a transcript, and its keys can start runs. " +
|
|
120
|
-
"`humanish runs --json` lists runs, `humanish
|
|
121
|
-
"and `humanish
|
|
120
|
+
"`humanish runs --json` lists runs, `humanish study list --json` lists the studies in this project, " +
|
|
121
|
+
"and `humanish run <study> --json` starts one. If you are a person at this keyboard, add --force.",
|
|
122
122
|
},
|
|
123
123
|
};
|
|
124
124
|
}
|
|
@@ -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 lab
|
|
131
|
+
message: "humanish tui needs an interactive terminal. For scripted or agent use, `humanish runs --json` lists the same runs and `humanish run <lab> --json` starts one.",
|
|
132
132
|
},
|
|
133
133
|
};
|
|
134
134
|
}
|
|
@@ -210,7 +210,7 @@ function tuiCapabilities(session) {
|
|
|
210
210
|
});
|
|
211
211
|
return session.connectionCheck;
|
|
212
212
|
},
|
|
213
|
-
labs: async () => (await listLabManifests(cwd)).
|
|
213
|
+
labs: async () => (await listLabManifests(cwd)).studies.map((lab) => ({
|
|
214
214
|
title: lab.title ?? lab.id,
|
|
215
215
|
path: lab.path,
|
|
216
216
|
})),
|
|
@@ -259,7 +259,7 @@ function tuiCapabilities(session) {
|
|
|
259
259
|
? {
|
|
260
260
|
schema: TUI_ACTION_SCHEMA,
|
|
261
261
|
ok: true,
|
|
262
|
-
message: `set up humanish here
|
|
262
|
+
message: `set up humanish here: ${result.changes.filter((change) => change.action !== "skip").length} files written`,
|
|
263
263
|
}
|
|
264
264
|
: {
|
|
265
265
|
schema: TUI_ACTION_SCHEMA,
|
|
@@ -3,63 +3,63 @@ import { renderObserver, 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
5
|
import { runLabCommand } from "./lab-run.js";
|
|
6
|
-
import {
|
|
6
|
+
import { addRunOptions, studyOnlyFlags } from "./run-command.js";
|
|
7
|
+
import { deprecationMessage, oldStudyOption, studyOptionValue, warnAndQueue, } from "../deprecations.js";
|
|
8
|
+
import { applyEnvFileOption, collectRepeated, formatRunHuman, parseObserverPort, parsePositiveInteger, wantsJson, writeResult, } from "../io.js";
|
|
7
9
|
import { followObserver, formatObserverHuman, watchExposeRequested } from "../observer-follow.js";
|
|
8
10
|
export function registerWatchCommand(parent, io) {
|
|
9
|
-
|
|
11
|
+
// A run's flags come from addRunOptions, the helper `run` uses, so the two cannot drift.
|
|
12
|
+
addRunOptions(parent
|
|
10
13
|
.command("watch")
|
|
11
|
-
.argument("[
|
|
12
|
-
.description("Run
|
|
13
|
-
.summary("Run
|
|
14
|
-
.option("--
|
|
15
|
-
.
|
|
16
|
-
.
|
|
17
|
-
.
|
|
18
|
-
.option("--
|
|
19
|
-
.option("--scorer <path>", "Terminal/computer-use/shared-world labs only: repo-relative adopter scorer module (.mjs). Overrides review.scorer.ref. Executable code: review it as code.")
|
|
20
|
-
.option("--run-id <id>", "Explicit run id for deterministic fixture tests; refused when that run already exists.")
|
|
21
|
-
.option("--cwd <path>", "Target project directory.", ".")
|
|
22
|
-
.option("--env-file <path>", "Load a local env file for this watch without persisting values.")
|
|
23
|
-
.option("--open", "Open the observer in the default browser.")
|
|
24
|
-
.option("--no-open", "Render without opening a browser.")
|
|
25
|
-
.addOption(new Option("--follow", "Deprecated; human output follows by default.").hideHelp())
|
|
26
|
-
.option("--detach", "Render/open once and exit without attached watch server.")
|
|
27
|
-
.option("--port <port>", "Local observer server port when following.", "0")
|
|
28
|
-
.option("--expose", "CUA lab only: expose the live run through an authenticated edge so you can watch from a phone. Requires edge auth.")
|
|
14
|
+
.argument("[study]", "Study id or .yaml path to run and observe.")
|
|
15
|
+
.description("Run a study, open its Observer and keep the shell attached.")
|
|
16
|
+
.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()))
|
|
21
|
+
.option("--expose", "Computer-use studies only: share the live run through an authenticated tunnel, to watch from a phone. Requires --oauth or --public-url.")
|
|
29
22
|
.addOption(new Option("--tunnel <provider>", "Spawn the external tunnel binary against the loopback port.").choices(["ngrok"]))
|
|
30
23
|
.option("--tunnel-domain <domain>", "Reserved domain passed to ngrok as --url (e.g. observer.example.com). Requires --tunnel.")
|
|
31
24
|
.addOption(new Option("--oauth <provider>", "Turn on ngrok edge OAuth. Requires --tunnel.").choices([
|
|
32
25
|
"google",
|
|
33
26
|
]))
|
|
34
|
-
.option("--allow-email <addr>", "Edge OAuth allow rule: permit this email. Repeatable. Requires --oauth.", collectRepeated
|
|
35
|
-
.option("--allow-domain <domain>", "Edge OAuth allow rule: permit this domain. Repeatable. Requires --oauth.", collectRepeated
|
|
27
|
+
.option("--allow-email <addr>", "Edge OAuth allow rule: permit this email. Repeatable. Requires --oauth.", collectRepeated)
|
|
28
|
+
.option("--allow-domain <domain>", "Edge OAuth allow rule: permit this domain. Repeatable. Requires --oauth.", collectRepeated)
|
|
36
29
|
.option("--public-url <origin>", "Bring-your-own authed edge (Cloudflare Access/Tailscale/manual). Binds loopback and trusts your edge. Requires --expose.")
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
// Hidden: watch rejects --safe with a pointer to the library filter and to edge auth, which
|
|
31
|
+
// a bare "unknown option" would lose.
|
|
32
|
+
.addOption(new Option("--safe").hideHelp())
|
|
39
33
|
.addHelpText("after", [
|
|
40
34
|
"",
|
|
35
|
+
"Without a study or --run, watch starts a synthetic run of 4 participants; --count changes it.",
|
|
36
|
+
"",
|
|
41
37
|
"Happy path:",
|
|
42
38
|
" humanish watch",
|
|
43
39
|
" humanish watch first-run",
|
|
44
|
-
" humanish watch --lab .humanish/labs/local.yaml",
|
|
45
40
|
"",
|
|
46
|
-
"Watch a live
|
|
47
|
-
" humanish watch my-
|
|
41
|
+
"Watch a live computer-use run from your phone through an authenticated tunnel:",
|
|
42
|
+
" humanish watch my-browser-study --expose --tunnel ngrok --oauth google --allow-email you@example.com",
|
|
48
43
|
"",
|
|
49
44
|
"Agent/CI path:",
|
|
50
45
|
" humanish watch --json --no-open",
|
|
51
46
|
"",
|
|
52
|
-
"
|
|
53
|
-
" humanish
|
|
47
|
+
"Saved runs:",
|
|
48
|
+
" humanish observe --run latest",
|
|
54
49
|
].join("\n"))
|
|
55
|
-
.action((
|
|
50
|
+
.action((named, options, command) => handleWatch(io, named, options, command));
|
|
56
51
|
}
|
|
57
|
-
async function handleWatch(io,
|
|
58
|
-
const
|
|
59
|
-
if (options.
|
|
52
|
+
async function handleWatch(io, named, parsed, command) {
|
|
53
|
+
const options = parsed;
|
|
54
|
+
if (options.run !== undefined) {
|
|
55
|
+
warnAndQueue(command, io, deprecationMessage("humanish watch --run", "humanish observe --run <id>"));
|
|
56
|
+
}
|
|
57
|
+
const option = studyOptionValue(command, io, options);
|
|
58
|
+
const study = option ?? named;
|
|
59
|
+
if (option !== undefined && named !== undefined) {
|
|
60
60
|
refuseWatch(command, io, options.cwd, {
|
|
61
61
|
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
62
|
-
message: "Use either
|
|
62
|
+
message: "Use either a study argument or --study, not both.",
|
|
63
63
|
});
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
@@ -73,21 +73,29 @@ async function handleWatch(io, labArg, options, command) {
|
|
|
73
73
|
}))) {
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
|
-
if (
|
|
77
|
-
await
|
|
76
|
+
if (study) {
|
|
77
|
+
await watchStudy(io, command, study, options);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const studyOnly = studyOnlyFlags(options);
|
|
81
|
+
if (studyOnly.length > 0) {
|
|
82
|
+
refuseWatch(command, io, options.cwd, {
|
|
83
|
+
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
84
|
+
message: `${studyOnly.join(", ")} ${studyOnly.length === 1 ? "needs" : "need"} a study: humanish watch <study>.`,
|
|
85
|
+
});
|
|
78
86
|
return;
|
|
79
87
|
}
|
|
80
|
-
// Exposure is only meaningful for a live
|
|
88
|
+
// Exposure is only meaningful for a live computer-use study run (it serves the live desktop). The
|
|
81
89
|
// non-lab watch path (existing evidence, or a fresh synthetic run) has no live desktop to
|
|
82
|
-
// stream, so exposure flags there are refused rather than silently ignored
|
|
90
|
+
// stream, so exposure flags there are refused rather than silently ignored; use `observe --all`.
|
|
83
91
|
if (watchExposeRequested(options)) {
|
|
84
92
|
refuseWatch(command, io, options.cwd, {
|
|
85
93
|
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
86
|
-
message: "--expose/--tunnel/--oauth apply only to a live
|
|
94
|
+
message: "--expose/--tunnel/--oauth apply only to a live computer-use run; to expose finished evidence use `humanish observe --all --expose`.",
|
|
87
95
|
});
|
|
88
96
|
return;
|
|
89
97
|
}
|
|
90
|
-
// --safe is
|
|
98
|
+
// --safe is an `observe --all` library filter; watch shows one run and has nothing to filter.
|
|
91
99
|
if (options.safe === true) {
|
|
92
100
|
refuseWatch(command, io, options.cwd, {
|
|
93
101
|
code: "HUMANISH_WATCH_SAFE_NOT_APPLICABLE",
|
|
@@ -106,7 +114,7 @@ async function handleWatch(io, labArg, options, command) {
|
|
|
106
114
|
: options.open === true
|
|
107
115
|
? true
|
|
108
116
|
: !wantsMachine && process.stdout.isTTY === true;
|
|
109
|
-
const wantsFollow = !wantsMachine && options.detach !== true
|
|
117
|
+
const wantsFollow = !wantsMachine && options.detach !== true;
|
|
110
118
|
const staticOpen = wantsFollow ? false : shouldOpen;
|
|
111
119
|
const rendered = await renderWatchEvidence(io, command, options, target.requestedParticipantCount, staticOpen);
|
|
112
120
|
if (rendered === undefined)
|
|
@@ -128,57 +136,36 @@ function refuseWatch(command, io, cwd, refusal) {
|
|
|
128
136
|
writeResult(command, io, result, formatRunHuman);
|
|
129
137
|
io.setExitCode(2);
|
|
130
138
|
}
|
|
131
|
-
/** A
|
|
132
|
-
async function
|
|
139
|
+
/** A study argument starts that study under watch; `--run` would name other evidence. */
|
|
140
|
+
async function watchStudy(io, command, study, options) {
|
|
133
141
|
if (options.run !== undefined) {
|
|
134
142
|
refuseWatch(command, io, options.cwd, {
|
|
135
143
|
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
136
|
-
message: "Use either a
|
|
144
|
+
message: "Use either a study to start evidence or --run to watch existing evidence, not both.",
|
|
137
145
|
});
|
|
138
146
|
return;
|
|
139
147
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
io,
|
|
143
|
-
lab,
|
|
144
|
-
mode: "watch",
|
|
145
|
-
options: {
|
|
146
|
-
cwd: options.cwd,
|
|
147
|
-
...(options.count === undefined ? {} : { count: options.count }),
|
|
148
|
-
...(options.detach === undefined ? {} : { detach: options.detach }),
|
|
149
|
-
...(options.dryRun === undefined ? {} : { dryRun: options.dryRun }),
|
|
150
|
-
...(options.open === undefined ? {} : { open: options.open }),
|
|
151
|
-
port: options.port,
|
|
152
|
-
...(options.runId === undefined ? {} : { runId: options.runId }),
|
|
153
|
-
...(options.scorer === undefined ? {} : { scorer: options.scorer }),
|
|
154
|
-
...(options.sims === undefined ? {} : { sims: options.sims }),
|
|
155
|
-
...(options.expose === undefined ? {} : { expose: options.expose }),
|
|
156
|
-
...(options.tunnel === undefined ? {} : { tunnel: options.tunnel }),
|
|
157
|
-
...(options.tunnelDomain === undefined ? {} : { tunnelDomain: options.tunnelDomain }),
|
|
158
|
-
...(options.oauth === undefined ? {} : { oauth: options.oauth }),
|
|
159
|
-
allowEmail: options.allowEmail,
|
|
160
|
-
allowDomain: options.allowDomain,
|
|
161
|
-
...(options.publicUrl === undefined ? {} : { publicUrl: options.publicUrl }),
|
|
162
|
-
...(options.safe === undefined ? {} : { safe: options.safe }),
|
|
163
|
-
...(options.json === undefined ? {} : { json: options.json }),
|
|
164
|
-
},
|
|
165
|
-
});
|
|
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 });
|
|
166
150
|
}
|
|
167
|
-
/** Without a
|
|
151
|
+
/** Without a study, watch shows existing evidence (`--run`) or a fresh synthetic run (`--count`). */
|
|
168
152
|
function resolveWatchTarget(options, command) {
|
|
169
153
|
const runOptionSource = typeof command.getOptionValueSource === "function"
|
|
170
154
|
? command.getOptionValueSource("run")
|
|
171
155
|
: undefined;
|
|
172
156
|
const runWasOmitted = runOptionSource === undefined || runOptionSource === "default";
|
|
173
|
-
const participantCount = options.
|
|
157
|
+
const participantCount = options.count === undefined ? undefined : parsePositiveInteger(options.count);
|
|
174
158
|
const port = parseObserverPort(options.port);
|
|
175
|
-
if (
|
|
176
|
-
return {
|
|
159
|
+
if (participantCount === null) {
|
|
160
|
+
return {
|
|
161
|
+
code: "HUMANISH_INVALID_PARTICIPANT_COUNT",
|
|
162
|
+
message: "--count must be a positive integer.",
|
|
163
|
+
};
|
|
177
164
|
}
|
|
178
|
-
if (!runWasOmitted &&
|
|
165
|
+
if (!runWasOmitted && participantCount !== undefined) {
|
|
179
166
|
return {
|
|
180
167
|
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
181
|
-
message: "Use either --run to watch existing evidence or --
|
|
168
|
+
message: "Use either --run to watch existing evidence or --count to start a fresh run, not both.",
|
|
182
169
|
};
|
|
183
170
|
}
|
|
184
171
|
if (!runWasOmitted && options.runId !== undefined) {
|
|
@@ -203,7 +190,7 @@ async function renderWatchEvidence(io, command, options, requestedParticipantCou
|
|
|
203
190
|
const runResult = await runDryRun({
|
|
204
191
|
cwd: options.cwd,
|
|
205
192
|
dryRun: true,
|
|
206
|
-
|
|
193
|
+
participantCount: requestedParticipantCount,
|
|
207
194
|
...(options.runId === undefined ? {} : { runId: options.runId }),
|
|
208
195
|
observer: { open: staticOpen },
|
|
209
196
|
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Option, type Command } from "commander";
|
|
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
|
+
/** Print `warning: <message>` on stderr, and queue the message for the command's JSON result. */
|
|
6
|
+
export declare function warnAndQueue(command: Command, io: CliIo, message: string): void;
|
|
7
|
+
/** `output` with the command's queued warnings at the front of its `warnings`. */
|
|
8
|
+
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;
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
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
|
+
/** Print `warning: <message>` on stderr, and queue the message for the command's JSON result. */
|
|
11
|
+
export function warnAndQueue(command, io, message) {
|
|
12
|
+
io.writeErr(`warning: ${message}\n`);
|
|
13
|
+
queued.set(command, [...(queued.get(command) ?? []), message]);
|
|
14
|
+
}
|
|
15
|
+
/** `output` with the command's queued warnings at the front of its `warnings`. */
|
|
16
|
+
export function withQueuedWarnings(command, output) {
|
|
17
|
+
const messages = queued.get(command);
|
|
18
|
+
if (messages === undefined || output === null || typeof output !== "object")
|
|
19
|
+
return output;
|
|
20
|
+
if (Array.isArray(output))
|
|
21
|
+
return output;
|
|
22
|
+
const existing = output.warnings;
|
|
23
|
+
if (existing !== undefined && !Array.isArray(existing))
|
|
24
|
+
return output;
|
|
25
|
+
return { ...output, warnings: [...messages, ...(existing ?? [])] };
|
|
26
|
+
}
|
|
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
|
+
}
|