humanish 0.107.0 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
|
@@ -1,148 +1,60 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import { Command, Option } from "commander";
|
|
3
|
+
import { shellQuote } from "../../substrates/shell.js";
|
|
2
4
|
import { computeStats, formatStatsHuman } from "../../run/stats.js";
|
|
3
5
|
import { DEFAULT_EXPORT_MAX_BYTES, exportRun, formatExportHuman } from "../../feedback/export.js";
|
|
4
6
|
import { cleanupRun, listRuns, readReview } from "../../run/stored-runs.js";
|
|
5
|
-
import { runDryRun } from "../../run/dry-run.js";
|
|
6
7
|
import { verifyRun } from "../../verify/verify.js";
|
|
7
8
|
import { reclaimPreflightSandboxes, reclaimRunSandboxes, } from "../../run/reclaim.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
const SCRIPTED_BROWSER_DOCS_URL = "https://humanish.dev/docs/lab-manifests#scripted-browser-scenarios";
|
|
9
|
+
import { addRunOptions, handleRun } from "./run-command.js";
|
|
10
|
+
import { CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, writeResult, humanError, } from "../io.js";
|
|
11
|
+
import { plural } from "../../run/text.js";
|
|
12
12
|
export function registerRunCommand(parent, io) {
|
|
13
|
-
parent
|
|
13
|
+
addRunOptions(parent
|
|
14
14
|
.command("run")
|
|
15
|
-
.argument("[
|
|
16
|
-
.description("Run a
|
|
17
|
-
.summary("Run a
|
|
18
|
-
.option("--dry-run", "Generate contract proof without browser, keys, or provider spend.")
|
|
19
|
-
// `humanish run <lab>` and `humanish lab run <lab>` are the SAME operation on the same
|
|
20
|
-
// dispatcher, but this one used to forward four options while its sibling forwarded all of
|
|
21
|
-
// them — so `humanish run first-run --no-open` failed while `lab run` accepted it. A
|
|
22
|
-
// participant hit exactly that and filed it as a documentation mismatch. Same command, same
|
|
23
|
-
// flags (CLIG: "be consistent across subcommands").
|
|
24
|
-
.option("--open", "Open the observer in the default browser.")
|
|
25
|
-
.option("--no-open", "Render without opening a browser.")
|
|
26
|
-
.option("--detach", "Render/open once and exit without an attached watch server.")
|
|
27
|
-
.option("--port <port>", "Local observer server port when following.", "0")
|
|
28
|
-
.option("--count <count>", "Override the participant count of a preview or computer-use lab, or of the synthetic run without a lab.")
|
|
29
|
-
// The older spelling of --count, hidden and noted on stderr (renamed-options.ts).
|
|
30
|
-
.addOption(new Option("--sims <count>").hideHelp())
|
|
31
|
-
// Agents with an older installed skill still send --app-url. Accepting it hidden lets the
|
|
32
|
-
// refusal name the replacement; commander's bare unknown-option error names nothing. Delete
|
|
33
|
-
// after 0.106.x.
|
|
34
|
-
.addOption(new Option("--app-url <url>").hideHelp())
|
|
35
|
-
.option("--cwd <path>", "Target project directory.", ".")
|
|
36
|
-
.option("--env-file <path>", "Load a local env file for this run without persisting values.")
|
|
37
|
-
.option("--run-id <id>", "Explicit run id for deterministic fixture tests; refused when that run already exists.")
|
|
38
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
39
|
-
.action(async (lab, options, command) => {
|
|
40
|
-
const count = countOption(io, options);
|
|
41
|
-
if (options.appUrl !== undefined) {
|
|
42
|
-
const result = {
|
|
43
|
-
schema: "humanish.run-result.v1",
|
|
44
|
-
ok: false,
|
|
45
|
-
cwd: options.cwd,
|
|
46
|
-
warnings: [],
|
|
47
|
-
error: {
|
|
48
|
-
code: "HUMANISH_APP_URL_REMOVED",
|
|
49
|
-
message: `--app-url was removed. To drive an app on a loopback URL, write a scripted-browser lab and run \`humanish run <lab>\`: ${SCRIPTED_BROWSER_DOCS_URL}`,
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
writeResult(command, io, result, formatRunHuman);
|
|
53
|
-
io.setExitCode(2);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
if (!(await applyEnvFileOption({
|
|
57
|
-
command,
|
|
58
|
-
cwd: options.cwd,
|
|
59
|
-
envFile: options.envFile,
|
|
60
|
-
io,
|
|
61
|
-
// runLabCommand discovers keys for a live lab; the lab-less preview needs none.
|
|
62
|
-
discoverKeys: false,
|
|
63
|
-
}))) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (lab) {
|
|
67
|
-
await runLabCommand({
|
|
68
|
-
command,
|
|
69
|
-
io,
|
|
70
|
-
lab,
|
|
71
|
-
mode: "run",
|
|
72
|
-
// Forwarded wholesale, exactly as `lab run` does. Cherry-picking a subset here is what
|
|
73
|
-
// made the two commands disagree in the first place.
|
|
74
|
-
options: { ...options, count },
|
|
75
|
-
});
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const participantCount = count === undefined ? undefined : parsePositiveInteger(count);
|
|
79
|
-
if (participantCount === null) {
|
|
80
|
-
const result = {
|
|
81
|
-
schema: "humanish.run-result.v1",
|
|
82
|
-
ok: false,
|
|
83
|
-
cwd: options.cwd,
|
|
84
|
-
warnings: [],
|
|
85
|
-
error: {
|
|
86
|
-
code: "HUMANISH_INVALID_SIM_COUNT",
|
|
87
|
-
message: "--count must be a positive integer.",
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
writeResult(command, io, result, formatRunHuman);
|
|
91
|
-
io.setExitCode(2);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const result = await runDryRun({
|
|
95
|
-
cwd: options.cwd,
|
|
96
|
-
...(options.dryRun === undefined ? {} : { dryRun: options.dryRun }),
|
|
97
|
-
...(options.runId === undefined ? {} : { runId: options.runId }),
|
|
98
|
-
...(participantCount === undefined ? {} : { simCount: participantCount }),
|
|
99
|
-
// Rendered the way `watch` renders it, so a bundle is the same bundle whichever command
|
|
100
|
-
// produced it (#597). A render failure is a warning on the result.
|
|
101
|
-
observer: { open: false },
|
|
102
|
-
});
|
|
103
|
-
writeResult(command, io, result, formatRunHuman);
|
|
104
|
-
io.setExitCode(result.ok ? 0 : 2);
|
|
105
|
-
});
|
|
15
|
+
.argument("[study]", "Optional study id or .yaml path.")
|
|
16
|
+
.description("Run a study, as a dry run or with live participants. This is the everyday command.")
|
|
17
|
+
.summary("Run a study, as a dry run or with live participants.")).action((study, options, command) => handleRun(io, study, options, command));
|
|
106
18
|
}
|
|
107
19
|
export function registerVerifyCommand(parent, io) {
|
|
108
20
|
parent
|
|
109
21
|
.command("verify")
|
|
110
|
-
.description("
|
|
111
|
-
.
|
|
112
|
-
.option("--
|
|
113
|
-
.option("--
|
|
22
|
+
.description("Check a run's evidence and share safety.")
|
|
23
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
24
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
25
|
+
.option("--verbose", "Print every check, passing ones included.")
|
|
114
26
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
115
27
|
.action(async (options, command) => {
|
|
116
28
|
const result = await verifyRun(options.cwd, options.run);
|
|
117
|
-
writeResult(command, io, result, formatVerifyHuman);
|
|
29
|
+
writeResult(command, io, result, (value) => options.verbose ? formatVerifyVerbose(value) : formatVerifyHuman(value));
|
|
118
30
|
io.setExitCode(result.ok ? 0 : 2);
|
|
119
31
|
});
|
|
120
32
|
}
|
|
121
33
|
export function registerCleanupCommand(parent, io) {
|
|
122
34
|
parent
|
|
123
35
|
.command("cleanup")
|
|
124
|
-
.description("
|
|
125
|
-
.summary("
|
|
126
|
-
.option("--run <id>",
|
|
127
|
-
.option("--cwd <path>",
|
|
36
|
+
.description("Check a run's recorded resources and write cleanup.json. It stops nothing; humanish reclaim stops leftover sandboxes.")
|
|
37
|
+
.summary("Check that a run's resources were stopped.")
|
|
38
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
39
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
128
40
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
129
41
|
.action(async (options, command) => {
|
|
130
42
|
const result = await cleanupRun(options.cwd, options.run);
|
|
131
|
-
writeResult(command, io, result, formatCleanupHuman);
|
|
43
|
+
writeResult(command, io, result, (value) => formatCleanupHuman(value, options.cwd));
|
|
132
44
|
io.setExitCode(result.ok ? 0 : 2);
|
|
133
45
|
});
|
|
134
46
|
}
|
|
135
47
|
export function registerReviewCommand(parent, io) {
|
|
136
48
|
parent
|
|
137
49
|
.command("review")
|
|
138
|
-
.description("
|
|
50
|
+
.description("Show a run's review: verdict, summary and gaps.")
|
|
139
51
|
.summary("Build a review packet from verified run evidence.")
|
|
140
|
-
.option("--run <id>",
|
|
141
|
-
.option("--cwd <path>",
|
|
52
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
53
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
142
54
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
143
55
|
.action(async (options, command) => {
|
|
144
56
|
const result = await readReview(options.cwd, options.run);
|
|
145
|
-
writeResult(command, io, result,
|
|
57
|
+
writeResult(command, io, result, formatReviewHuman);
|
|
146
58
|
io.setExitCode("ok" in result && result.ok === false ? 2 : 0);
|
|
147
59
|
});
|
|
148
60
|
}
|
|
@@ -150,16 +62,16 @@ export function registerExportCommand(parent, io) {
|
|
|
150
62
|
parent
|
|
151
63
|
.command("export")
|
|
152
64
|
.description("Export a run as self-contained Observer HTML, or a separately verified redacted bundle workspace. HTML requires share_ready unless --local-only; bundle format requires --redact-screenshots and preserves the original.")
|
|
153
|
-
.summary("Export Observer
|
|
154
|
-
.option("--run <id>",
|
|
65
|
+
.summary("Export a run as an Observer page or redacted bundle.")
|
|
66
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
155
67
|
.addOption(new Option("--format <format>", "Output format; bundle creates a new standalone workspace.")
|
|
156
68
|
.choices(["html", "bundle"])
|
|
157
69
|
.default("html"))
|
|
158
70
|
.option("--redact-screenshots", "Bundle only: blur PNG screenshots in a verified copy; keep original evidence unchanged.")
|
|
159
71
|
.option("--out <path>", "HTML file or new bundle workspace. Default: .humanish/exports/<runId>.html or <runId>-redacted/.")
|
|
160
|
-
.option("--local-only",
|
|
161
|
-
.
|
|
162
|
-
.option("--cwd <path>",
|
|
72
|
+
.option("--local-only", 'Export a bundle that is not share_ready, with a "Local only" banner in the file.')
|
|
73
|
+
.addOption(new Option("--max-bytes <n>", "Refuse an export larger than this many bytes.").default(String(DEFAULT_EXPORT_MAX_BYTES), `${DEFAULT_EXPORT_MAX_BYTES / 1024 / 1024} MB`))
|
|
74
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
163
75
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
164
76
|
.action(async (options, command) => {
|
|
165
77
|
const maxBytes = options.format === "bundle"
|
|
@@ -184,14 +96,14 @@ export function registerStatsCommand(parent, io) {
|
|
|
184
96
|
parent
|
|
185
97
|
.command("stats")
|
|
186
98
|
.description("Cost, outcome, and duration roll-ups across run history. Estimates stay labelled; unknown costs count as unknown.")
|
|
187
|
-
.summary("
|
|
188
|
-
.option("--
|
|
99
|
+
.summary("Show cost, outcomes and durations across runs.")
|
|
100
|
+
.option("--study <id>", "Only runs of this study id.")
|
|
189
101
|
.option("--since <date>", "Only runs that started on or after this ISO date or datetime.")
|
|
190
|
-
.option("--cwd <path>",
|
|
102
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
191
103
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
192
104
|
.action(async (options, command) => {
|
|
193
105
|
const result = await computeStats(options.cwd, {
|
|
194
|
-
...(options.
|
|
106
|
+
...(options.study === undefined ? {} : { study: options.study }),
|
|
195
107
|
...(options.since === undefined ? {} : { since: options.since }),
|
|
196
108
|
});
|
|
197
109
|
writeResult(command, io, result, formatStatsHuman);
|
|
@@ -201,9 +113,8 @@ export function registerStatsCommand(parent, io) {
|
|
|
201
113
|
export function registerRunsCommand(parent, io) {
|
|
202
114
|
parent
|
|
203
115
|
.command("runs")
|
|
204
|
-
.description("List
|
|
205
|
-
.
|
|
206
|
-
.option("--cwd <path>", "Target project directory.", ".")
|
|
116
|
+
.description("List this project's runs and which one is latest.")
|
|
117
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
207
118
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
208
119
|
.action(async (options, command) => {
|
|
209
120
|
const result = await listRuns(options.cwd);
|
|
@@ -255,10 +166,10 @@ export function registerReclaimCommand(parent, io) {
|
|
|
255
166
|
parent
|
|
256
167
|
.command("reclaim")
|
|
257
168
|
.description("Kill an interrupted run's sandboxes by the exact ids journaled in its sandbox-receipts.ndjson; never enumerates the E2B account. Needs E2B_API_KEY in the environment.")
|
|
258
|
-
.summary("
|
|
259
|
-
.option("--cwd <path>",
|
|
260
|
-
.option("--run <id>",
|
|
261
|
-
.addOption(new Option("--preflight", "Reclaim sandboxes left by interrupted `humanish
|
|
169
|
+
.summary("Stop an interrupted run's leftover sandboxes.")
|
|
170
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
171
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
172
|
+
.addOption(new Option("--preflight", "Reclaim sandboxes left by interrupted `humanish study check` probes (journaled in .humanish/preflight) instead of a run's.").conflicts("run"))
|
|
262
173
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
263
174
|
.action(async (options, command) => {
|
|
264
175
|
const result = options.preflight
|
|
@@ -270,42 +181,128 @@ export function registerReclaimCommand(parent, io) {
|
|
|
270
181
|
}
|
|
271
182
|
function formatReclaimHuman(result) {
|
|
272
183
|
const lines = [];
|
|
273
|
-
lines.push(`Reclaim ${result.runId}: ${result.ok ? "ok" : "
|
|
184
|
+
lines.push(`Reclaim ${result.runId}: ${result.ok ? "ok" : "failed"}, ${plural(result.receiptCount, "sandbox receipt")}.`);
|
|
274
185
|
for (const outcome of result.outcomes) {
|
|
275
186
|
lines.push(` ${outcome.sandboxId} (${outcome.laneId}): ${outcome.state}${outcome.detail ? ` — ${outcome.detail}` : ""}`);
|
|
276
187
|
}
|
|
277
188
|
for (const warning of result.warnings)
|
|
278
189
|
lines.push(` warning: ${warning}`);
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
return lines.join("\n");
|
|
190
|
+
const stdout = lines.join("\n");
|
|
191
|
+
return result.error === undefined ? stdout : { stdout: `${stdout}\n`, error: result.error };
|
|
282
192
|
}
|
|
193
|
+
const REVIEW_VERDICTS = {
|
|
194
|
+
// A dry run, or a live run with no participant result; review's result does not carry the mode.
|
|
195
|
+
contract_proof_only: "no verdict; no product behavior was tested",
|
|
196
|
+
pass: "pass",
|
|
197
|
+
fail: "fail",
|
|
198
|
+
blocked: "blocked",
|
|
199
|
+
timed_out: "timed out",
|
|
200
|
+
};
|
|
201
|
+
/** A run's review: its verdict, summary and gaps, and where review.json is. */
|
|
202
|
+
function formatReviewHuman(result) {
|
|
203
|
+
if (!("verdict" in result)) {
|
|
204
|
+
// A run that did not pass verify has no review to show; verify says why.
|
|
205
|
+
const error = result.error ?? {
|
|
206
|
+
code: "HUMANISH_INVALID_RUN_BUNDLE",
|
|
207
|
+
message: "Run bundle failed verification.",
|
|
208
|
+
};
|
|
209
|
+
return error.code === "HUMANISH_INVALID_RUN_BUNDLE"
|
|
210
|
+
? {
|
|
211
|
+
error: {
|
|
212
|
+
...error,
|
|
213
|
+
message: `${error.message} humanish verify --run ${result.run} shows why.`,
|
|
214
|
+
},
|
|
215
|
+
}
|
|
216
|
+
: humanError(error);
|
|
217
|
+
}
|
|
218
|
+
return ([
|
|
219
|
+
`humanish review ${result.runId}: ${REVIEW_VERDICTS[result.verdict]}`,
|
|
220
|
+
"",
|
|
221
|
+
result.summary,
|
|
222
|
+
...(result.gaps.length === 0 ? [] : ["", "gaps:", ...result.gaps.map((gap) => `- ${gap}`)]),
|
|
223
|
+
"",
|
|
224
|
+
`review: ${result.path}`,
|
|
225
|
+
].join("\n") + "\n");
|
|
226
|
+
}
|
|
227
|
+
/** The run id verify read, from the bundle path, so `latest` prints as the id it points at. */
|
|
228
|
+
function verifiedRunId(result) {
|
|
229
|
+
return result.bundlePath === undefined
|
|
230
|
+
? result.run
|
|
231
|
+
: path.basename(path.dirname(result.bundlePath));
|
|
232
|
+
}
|
|
233
|
+
/** Share-safety reasons, except VERIFY_FAILED, which the failing checks above it already say. */
|
|
234
|
+
function shareSafetyLines(result) {
|
|
235
|
+
return result.shareSafety.reasons
|
|
236
|
+
.filter((reason) => reason.code !== "VERIFY_FAILED")
|
|
237
|
+
.map((reason) => `share-safety: ${reason.code}: ${reason.message}`);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* One line for a pass. A failure lists only the failing checks. `--verbose` prints every check.
|
|
241
|
+
* A run that does not exist prints only that.
|
|
242
|
+
*/
|
|
283
243
|
function formatVerifyHuman(result) {
|
|
244
|
+
if (result.error?.code === "HUMANISH_RUN_NOT_FOUND")
|
|
245
|
+
return humanError(result.error);
|
|
246
|
+
const runId = verifiedRunId(result);
|
|
247
|
+
const total = result.checks.length;
|
|
248
|
+
const failed = result.checks.filter((check) => !check.ok);
|
|
249
|
+
const lines = result.ok
|
|
250
|
+
? [`verified ${runId} · ${result.shareSafety.status} · ${total} checks passed`]
|
|
251
|
+
: [
|
|
252
|
+
`verify failed: ${runId} · ${result.shareSafety.status} · ${failed.length} of ${total} checks failed`,
|
|
253
|
+
...failed.map((check) => `- ${check.message}`),
|
|
254
|
+
];
|
|
255
|
+
lines.push(...shareSafetyLines(result), ...result.warnings.map((warning) => `warning: ${warning}`));
|
|
256
|
+
const cwdFlag = result.cwd === process.cwd() ? "" : ` --cwd ${result.cwd}`;
|
|
257
|
+
if (!result.ok)
|
|
258
|
+
lines.push(`every check: humanish verify --run ${runId}${cwdFlag} --verbose`);
|
|
259
|
+
return `${lines.join("\n")}\n`;
|
|
260
|
+
}
|
|
261
|
+
function formatVerifyVerbose(result) {
|
|
262
|
+
if (result.error?.code === "HUMANISH_RUN_NOT_FOUND")
|
|
263
|
+
return humanError(result.error);
|
|
284
264
|
return ([
|
|
285
265
|
`humanish verify ${result.ok ? "passed" : "failed"}`,
|
|
286
|
-
`run: ${result
|
|
266
|
+
`run: ${verifiedRunId(result)}`,
|
|
287
267
|
`share-safety: ${result.shareSafety.status}`,
|
|
288
268
|
...result.shareSafety.reasons.map((reason) => `share-safety reason: ${reason.code}: ${reason.message}`),
|
|
289
269
|
...result.checks.map((check) => `- ${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`),
|
|
290
270
|
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
291
271
|
].join("\n") + "\n");
|
|
292
272
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
273
|
+
/** A command-line argument, single-quoted only when the shell would split or expand it. */
|
|
274
|
+
function shellArg(value) {
|
|
275
|
+
return /^[\w@%+=:,./-]+$/.test(value) ? value : shellQuote(value);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Cleanup only reads evidence and never stops a sandbox. A failed resource is an E2B sandbox not
|
|
279
|
+
* recorded as stopped, which reclaim can stop from the run's sandbox receipts, so the last line
|
|
280
|
+
* names it. A skipped resource is a provider reclaim does not handle, so it gets no line. `cwd` is
|
|
281
|
+
* the --cwd the command was given, since cleanup's result masks it.
|
|
282
|
+
*/
|
|
283
|
+
function reclaimPointer(result, cwd) {
|
|
284
|
+
if (result.runId === undefined || result.summary.failed === 0)
|
|
285
|
+
return [];
|
|
286
|
+
const cwdFlag = cwd === "." ? "" : ` --cwd ${shellArg(cwd)}`;
|
|
287
|
+
return [
|
|
288
|
+
`To stop leftover sandboxes, run humanish reclaim --run ${shellArg(result.runId)}${cwdFlag}.`,
|
|
289
|
+
];
|
|
290
|
+
}
|
|
291
|
+
function formatCleanupHuman(result, cwd) {
|
|
292
|
+
if (!result.ok && result.error)
|
|
293
|
+
return humanError(result.error);
|
|
297
294
|
return ([
|
|
298
295
|
`humanish cleanup ${result.ok ? "passed" : "failed"}`,
|
|
299
296
|
`run: ${result.runId ?? result.run}`,
|
|
300
297
|
`resources: already-clean ${result.summary.alreadyClean}, skipped ${result.summary.skipped}, failed ${result.summary.failed}`,
|
|
301
298
|
...(result.cleanupPath ? [`cleanup: ${result.cleanupPath}`] : []),
|
|
302
299
|
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
300
|
+
...reclaimPointer(result, cwd),
|
|
303
301
|
].join("\n") + "\n");
|
|
304
302
|
}
|
|
305
303
|
function formatRunsHuman(result) {
|
|
306
|
-
if (!result.ok)
|
|
307
|
-
return
|
|
308
|
-
}
|
|
304
|
+
if (!result.ok)
|
|
305
|
+
return humanError(result.error);
|
|
309
306
|
if (result.runs.length === 0) {
|
|
310
307
|
return `No humanish runs found in ${result.cwd}\n`;
|
|
311
308
|
}
|
|
@@ -3,9 +3,9 @@ import { type CliIo } from "../io.js";
|
|
|
3
3
|
export declare function registerInitCommand(parent: Command, io: CliIo): void;
|
|
4
4
|
export declare function registerDoctorCommand(parent: Command, io: CliIo): void;
|
|
5
5
|
/**
|
|
6
|
-
* `humanish telemetry status|enable|disable
|
|
6
|
+
* `humanish telemetry status|enable|disable`: the opt-out the convention requires, plus a `status`
|
|
7
7
|
* that prints the exact document that would be sent. "You can read what we collect" is what makes
|
|
8
|
-
* default-on
|
|
8
|
+
* default-on collection checkable by the person it describes.
|
|
9
9
|
*/
|
|
10
10
|
export declare function registerTelemetryCommand(parent: Command, io: CliIo): void;
|
|
11
11
|
export declare function registerKeysCommand(parent: Command, io: CliIo): void;
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { listUserKeys, resolveKeyName, setUserKey, unsetUserKey, userKeyStorePath, } from "../../keys/key-resolution.js";
|
|
3
3
|
import { promptSecret } from "../secret-prompt.js";
|
|
4
|
-
import { runInit } from "../../
|
|
4
|
+
import { runInit } from "../../study/init.js";
|
|
5
5
|
import { buildPayload, disabledByEnvironment, readTelemetryState, telemetryStatePath, writeTelemetryState, } from "../telemetry.js";
|
|
6
6
|
import { doctor } from "../doctor.js";
|
|
7
|
-
import { applyEnvFileOption, CLI_VERSION, JSON_OPTION_DESCRIPTION, markInvocationEnvelopeWritten, wantsJson, writeResult, } from "../io.js";
|
|
7
|
+
import { applyEnvFileOption, CLI_VERSION, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, markInvocationEnvelopeWritten, wantsJson, writeResult, formatCliError, } from "../io.js";
|
|
8
|
+
import { plural } from "../../run/text.js";
|
|
8
9
|
export function registerInitCommand(parent, io) {
|
|
9
10
|
parent
|
|
10
11
|
.command("init")
|
|
11
12
|
.description("Set up committed humanish/ source files and ignored .humanish/ runtime state.")
|
|
12
|
-
.summary("Set up
|
|
13
|
+
.summary("Set up starter studies and personas in this project.")
|
|
13
14
|
.option("--dry-run", "Print planned changes without writing files.")
|
|
14
15
|
.option("--yes", "Apply safe generated changes without prompting.")
|
|
15
16
|
.option("--local-browser <url>", "Set the local-browser starter to this loopback app URL (explicit port above 1023).")
|
|
16
17
|
.option("--local-mission <text>", "Set the local-browser participant mission.")
|
|
17
|
-
.option("--cwd <path>",
|
|
18
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
18
19
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
19
20
|
.action(async (options, command) => {
|
|
20
21
|
const initOptions = {
|
|
@@ -47,25 +48,25 @@ export function registerDoctorCommand(parent, io) {
|
|
|
47
48
|
parent
|
|
48
49
|
.command("doctor")
|
|
49
50
|
.description("Explain project readiness and missing humanish setup.")
|
|
50
|
-
.summary("
|
|
51
|
-
.option("--cwd <path>",
|
|
52
|
-
.option("--
|
|
53
|
-
.option("--env-file <path>",
|
|
51
|
+
.summary("Check what this project and machine need for a run.")
|
|
52
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
53
|
+
.option("--study <study>", "Check the study's desktop, participant authentication and separate analysis requirements; no provider calls.")
|
|
54
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
54
55
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
55
56
|
.action(async (options, command) => {
|
|
56
57
|
if (options.envFile &&
|
|
57
58
|
!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
|
|
58
59
|
return;
|
|
59
|
-
const result = await doctor(options.cwd, options.
|
|
60
|
+
const result = await doctor(options.cwd, options.study ? { study: options.study } : {});
|
|
60
61
|
writeResult(command, io, result, formatDoctorHuman);
|
|
61
62
|
// Behavioral change: was exit 1, every other structured command uses 2.
|
|
62
63
|
io.setExitCode(result.ok ? 0 : 2);
|
|
63
64
|
});
|
|
64
65
|
}
|
|
65
66
|
/**
|
|
66
|
-
* `humanish telemetry status|enable|disable
|
|
67
|
+
* `humanish telemetry status|enable|disable`: the opt-out the convention requires, plus a `status`
|
|
67
68
|
* that prints the exact document that would be sent. "You can read what we collect" is what makes
|
|
68
|
-
* default-on
|
|
69
|
+
* default-on collection checkable by the person it describes.
|
|
69
70
|
*/
|
|
70
71
|
export function registerTelemetryCommand(parent, io) {
|
|
71
72
|
const telemetry = parent
|
|
@@ -83,8 +84,8 @@ export function registerTelemetryCommand(parent, io) {
|
|
|
83
84
|
anonymousId: state.anonymousId,
|
|
84
85
|
version: CLI_VERSION,
|
|
85
86
|
properties: {
|
|
86
|
-
command: "
|
|
87
|
-
|
|
87
|
+
command: "run",
|
|
88
|
+
study: "try-live",
|
|
88
89
|
mode: "live",
|
|
89
90
|
outcome: "incomplete",
|
|
90
91
|
brain: "provider-key",
|
|
@@ -110,10 +111,10 @@ export function registerTelemetryCommand(parent, io) {
|
|
|
110
111
|
`telemetry: ${result.enabled ? "on" : "off"}${envOff ? " (DO_NOT_TRACK / HUMANISH_TELEMETRY_DISABLED)" : ""}`,
|
|
111
112
|
`state: ${result.statePath}`,
|
|
112
113
|
"",
|
|
113
|
-
"
|
|
114
|
+
"every field that is sent, with example values:",
|
|
114
115
|
JSON.stringify(sample, null, 2),
|
|
115
116
|
"",
|
|
116
|
-
"never sent:
|
|
117
|
+
"never sent: studies you wrote, subjects, personas, missions, paths, run evidence, key names or values.",
|
|
117
118
|
"",
|
|
118
119
|
"humanish telemetry disable turns it off",
|
|
119
120
|
].join("\n") + "\n");
|
|
@@ -139,6 +140,8 @@ export function registerTelemetryCommand(parent, io) {
|
|
|
139
140
|
}
|
|
140
141
|
const KEYS_RESULT_SCHEMA = "humanish.keys-result.v1";
|
|
141
142
|
function formatKeysHuman(result) {
|
|
143
|
+
if (!result.ok)
|
|
144
|
+
return { error: { message: result.message } };
|
|
142
145
|
const lines = [
|
|
143
146
|
`humanish keys ${result.ok ? "ok" : "failed"}`,
|
|
144
147
|
`store: ${result.store}`,
|
|
@@ -165,7 +168,7 @@ export function registerKeysCommand(parent, io) {
|
|
|
165
168
|
const keys = parent
|
|
166
169
|
.command("keys")
|
|
167
170
|
.description("Manage the humanish user-level key store used by provider-key discovery.")
|
|
168
|
-
.summary("
|
|
171
|
+
.summary("Store and manage your provider keys.");
|
|
169
172
|
keys
|
|
170
173
|
.command("set")
|
|
171
174
|
.argument("<vendor-or-name>", "A vendor alias (openai, e2b, anthropic, github, agentmail) or a raw ENV_NAME.")
|
|
@@ -254,7 +257,7 @@ export function registerKeysCommand(parent, io) {
|
|
|
254
257
|
});
|
|
255
258
|
keys
|
|
256
259
|
.command("list")
|
|
257
|
-
.description("List the
|
|
260
|
+
.description("List the key names in the user store. Values are never printed.")
|
|
258
261
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
259
262
|
.action(async (_options, command) => {
|
|
260
263
|
const storePath = userKeyStorePath(process.env);
|
|
@@ -267,7 +270,7 @@ export function registerKeysCommand(parent, io) {
|
|
|
267
270
|
names,
|
|
268
271
|
message: names.length === 0
|
|
269
272
|
? "The store is empty. Add a key with `humanish keys set <vendor>`."
|
|
270
|
-
: `${names.length
|
|
273
|
+
: `${plural(names.length, "key name")} stored. Values are never printed.`,
|
|
271
274
|
};
|
|
272
275
|
writeResult(command, io, result, formatKeysHuman);
|
|
273
276
|
io.setExitCode(0);
|
|
@@ -277,10 +280,10 @@ function formatDoctorHuman(result) {
|
|
|
277
280
|
return ([
|
|
278
281
|
`humanish doctor ${result.ok ? "ok" : "needs setup"}`,
|
|
279
282
|
`cwd: ${result.cwd}`,
|
|
280
|
-
// "missing" is a
|
|
283
|
+
// "missing" is a verdict, and a row that never ran has none. A participant reading doctor on a
|
|
281
284
|
// fresh desktop got `- missing package.json: package.json is present and safe to read`, which
|
|
282
285
|
// contradicts itself in eleven words (labs/tui-self-study.yaml).
|
|
283
|
-
...result.checks.map((check) => `- ${check.
|
|
286
|
+
...result.checks.map((check) => `- ${check.status.replace("_", " ")} ${check.name}: ${check.message}`),
|
|
284
287
|
].join("\n") + "\n");
|
|
285
288
|
}
|
|
286
289
|
function formatInitHuman(result) {
|
|
@@ -307,14 +310,14 @@ function formatInitHuman(result) {
|
|
|
307
310
|
if (result.warnings.length > 0) {
|
|
308
311
|
lines.push("", "warnings:", ...result.warnings.map((warning) => `- ${warning}`));
|
|
309
312
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
+
// init writes a refused plan to stderr, so the error goes there in the shared shape.
|
|
314
|
+
if (result.error)
|
|
315
|
+
lines.push("", formatCliError("humanish init", result.error).trimEnd());
|
|
313
316
|
if (result.mode === "needs-confirmation") {
|
|
314
317
|
lines.push("", "Run with --dry-run --json to inspect or --yes to apply.");
|
|
315
318
|
}
|
|
316
319
|
else if (result.ok && result.nextSteps !== undefined) {
|
|
317
|
-
// Twenty files and no next step is where the funnel died
|
|
320
|
+
// Twenty files and no next step is where the funnel died. Increasingly the reader here
|
|
318
321
|
// is a coding agent doing setup for someone, and an agent does what stdout tells it to.
|
|
319
322
|
lines.push(...result.nextSteps);
|
|
320
323
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HumanOutput } from "../io.js";
|
|
2
|
+
import type { CuaActorStudyResult } from "../../routes/computer-use/types.js";
|
|
3
|
+
import type { ScriptedBrowserStudyResult } from "../../routes/scripted/types.js";
|
|
4
|
+
import type { TerminalProductStudyResult } from "../../routes/terminal/types.js";
|
|
5
|
+
import type { ConcurrentSharedWorldStudyResult } from "../../routes/shared-world/types.js";
|
|
6
|
+
export declare function formatConcurrentSharedWorldStudyHuman(result: ConcurrentSharedWorldStudyResult): HumanOutput;
|
|
7
|
+
export declare function formatTerminalStudyHuman(result: TerminalProductStudyResult): HumanOutput;
|
|
8
|
+
export declare function formatScriptedStudyHuman(result: ScriptedBrowserStudyResult): HumanOutput;
|
|
9
|
+
export declare function formatCuaStudyHuman(result: CuaActorStudyResult): HumanOutput;
|