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
|
@@ -2,44 +2,45 @@ import { automaticAnalysisBudget, formatAutomaticAnalysisBudget, } from "../../a
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import { deriveRunFacts } from "../telemetry.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
5
|
+
import { resolveStudyManifest } from "../../study/discover.js";
|
|
6
|
+
import { warnAndQueue } from "../deprecations.js";
|
|
7
|
+
import { planStudy, resolveStudyDryRun } from "../../study/plan.js";
|
|
8
|
+
import { keyNamesOf } from "../../study/requirements.js";
|
|
9
|
+
import { routeOf } from "../../study/plan.js";
|
|
10
|
+
import { computerUseRouteRun } from "./study-route-computer-use.js";
|
|
11
|
+
import { runRoute } from "./study-route-run.js";
|
|
12
|
+
import { scriptedRouteRun } from "./study-route-scripted.js";
|
|
13
|
+
import { sharedWorldRouteRun } from "./study-route-shared-world.js";
|
|
14
|
+
import { previewRouteRun } from "./study-route-preview.js";
|
|
15
|
+
import { terminalRouteRun } from "./study-route-terminal.js";
|
|
16
|
+
import { maybeLoadAdapterScorer } from "./study-scorer.js";
|
|
16
17
|
import { discoverCliKeys, formatRunHuman, noteRunFacts, writeResult, } from "../io.js";
|
|
17
18
|
import { watchExposeRequested } from "../observer-follow.js";
|
|
18
19
|
import { beginRunSignalPhase } from "./run-signals.js";
|
|
19
20
|
import { WATCH_SAFE_NOT_APPLICABLE_MESSAGE } from "../../observer/exposure.js";
|
|
20
|
-
export async function
|
|
21
|
-
const resolved = await
|
|
21
|
+
export async function runStudyCommand(args) {
|
|
22
|
+
const resolved = await resolveStudyManifest(args.options.cwd, args.study);
|
|
22
23
|
if (!resolved.ok) {
|
|
23
|
-
writeResult(args.command, args.io, resolved,
|
|
24
|
+
writeResult(args.command, args.io, resolved, formatStudyResolveFailureHuman);
|
|
24
25
|
args.io.setExitCode(2);
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
27
28
|
// Surface forward-declared-field + .yml warnings on run/watch too, not only on inspect.
|
|
28
29
|
// Otherwise a setting that does nothing is silently swallowed on the path users actually run.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// Each also goes into the JSON result's warnings[], so a --json caller sees it.
|
|
31
|
+
for (const warning of resolved.warnings)
|
|
32
|
+
warnAndQueue(args.command, args.io, warning);
|
|
32
33
|
const config = resolved.config;
|
|
33
|
-
// The run's identity
|
|
34
|
-
// local overlay, or an explicit path. Resolved once here
|
|
35
|
-
// and carried into the run's status record and bundle so the filesystem can answer "which
|
|
34
|
+
// The run's identity: which manifest, where it lives, and whether it is committed, a
|
|
35
|
+
// local overlay, or an explicit path. Resolved once here (the only place that knows all three)
|
|
36
|
+
// and carried into the run's status record and bundle so the filesystem can answer "which study
|
|
36
37
|
// produced this run" without the old `persona.source = "lab:<id>"` string convention.
|
|
37
|
-
const
|
|
38
|
-
// Named here, once, for every route
|
|
39
|
-
//
|
|
40
|
-
noteRunFacts(args.command, deriveRunFacts({
|
|
38
|
+
const study = { id: config.id, path: resolved.path, origin: resolved.origin };
|
|
39
|
+
// Named here, once, for every route, so the starter study `first-run` is named in telemetry
|
|
40
|
+
// whatever its route's result carries.
|
|
41
|
+
noteRunFacts(args.command, deriveRunFacts({ studyId: config.id }));
|
|
41
42
|
const route = routeOf(config);
|
|
42
|
-
if (route !== "computer-use" &&
|
|
43
|
+
if (route !== "computer-use" && studyRerunFlagsRequested(args.options)) {
|
|
43
44
|
writeUnsupportedRerunFlagsResult(args, route);
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
@@ -53,7 +54,7 @@ export async function runLabCommand(args) {
|
|
|
53
54
|
warnings: [],
|
|
54
55
|
error: {
|
|
55
56
|
code: "HUMANISH_WATCH_OPTION_CONFLICT",
|
|
56
|
-
message: `--expose/--tunnel/--oauth stream a live desktop and apply only to computer-use
|
|
57
|
+
message: `--expose/--tunnel/--oauth stream a live desktop and apply only to computer-use studies; this study runs on the ${route} route.`,
|
|
57
58
|
},
|
|
58
59
|
};
|
|
59
60
|
writeResult(args.command, args.io, result, formatRunHuman);
|
|
@@ -80,8 +81,8 @@ export async function runLabCommand(args) {
|
|
|
80
81
|
// Only a live run reads provider keys, so a dry run looks none up: no `gh auth token`, no e2b
|
|
81
82
|
// login, overlay or key store. A live run fills every key it finds and prints a line only for
|
|
82
83
|
// the keys its plan reads. This comes after the option refusals above, which read no key, and
|
|
83
|
-
// before the route's CLI setup and
|
|
84
|
-
if (
|
|
84
|
+
// before the route's CLI setup and prepareStudy, which do.
|
|
85
|
+
if (resolveStudyDryRun(config, args.options.dryRun, true) === false) {
|
|
85
86
|
const announced = announcedKeyNames(config, args.options);
|
|
86
87
|
await discoverCliKeys({
|
|
87
88
|
io: args.io,
|
|
@@ -89,19 +90,19 @@ export async function runLabCommand(args) {
|
|
|
89
90
|
...(announced === undefined ? {} : { announced }),
|
|
90
91
|
});
|
|
91
92
|
}
|
|
92
|
-
// The route's CLI setup refuses bad options,
|
|
93
|
+
// The route's CLI setup refuses bad options, runStudyWith's plan refuses bad labs, and the route's local
|
|
93
94
|
// checks (keys, runtime auth, subject env, the local agent, caps) refuse this machine, all before
|
|
94
95
|
// the scorer loads, so none imports the scorer's host code. The scripted route's checks and the
|
|
95
96
|
// run-id claim still come after it; the scripted route takes no scorer.
|
|
96
97
|
const routeRun = routeRunFor(route, { ...args, config });
|
|
97
98
|
if (routeRun === undefined)
|
|
98
99
|
return;
|
|
99
|
-
// Every route's
|
|
100
|
-
const run = { ...routeRun, options: { ...routeRun.options,
|
|
100
|
+
// Every route's runStudyWith options carry the study's provenance, from here only.
|
|
101
|
+
const run = { ...routeRun, options: { ...routeRun.options, study } };
|
|
101
102
|
// From here a signal marks the run interrupted and reclaims its sandboxes (run-signals.ts).
|
|
102
103
|
const signals = beginRunSignalPhase(args.io);
|
|
103
104
|
try {
|
|
104
|
-
//
|
|
105
|
+
// Resolve + load a config-declared/CLI-flagged adopter scorer fail-closed, before any
|
|
105
106
|
// spend, and only for a plan that will run. A declared gate that cannot load (bad ref, not
|
|
106
107
|
// found, load failure, no hooks, unsupported route) aborts with exit 2 rather than green-passing.
|
|
107
108
|
await runRoute(config, run, async () => {
|
|
@@ -125,12 +126,12 @@ export async function runLabCommand(args) {
|
|
|
125
126
|
}
|
|
126
127
|
const scorer = scorerLoad.scorer;
|
|
127
128
|
if (scorer) {
|
|
128
|
-
// Cross-repo guardrail: `humanish
|
|
129
|
+
// Cross-repo guardrail: `humanish run` import()s host JS named in the manifest.
|
|
129
130
|
// Surface it so the invoker (who may not be the manifest author) knows executable code ran.
|
|
130
|
-
args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is
|
|
131
|
+
args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is code that humanish loaded and ran in this process. Review it as you would any code you run.\n`);
|
|
131
132
|
}
|
|
132
133
|
const analysisBudget = automaticAnalysisBudget(config.review?.analysis, route);
|
|
133
|
-
if (analysisBudget &&
|
|
134
|
+
if (analysisBudget && resolveStudyDryRun(config, args.options.dryRun, true) === false) {
|
|
134
135
|
args.io.writeErr(`${formatAutomaticAnalysisBudget(analysisBudget)}\n`);
|
|
135
136
|
}
|
|
136
137
|
return scorer === undefined ? {} : { scorer };
|
|
@@ -146,12 +147,12 @@ export async function runLabCommand(args) {
|
|
|
146
147
|
/**
|
|
147
148
|
* The filled keys a live run prints a line for: the ones its plan reads. Count and rerun options
|
|
148
149
|
* change who runs, not which keys. Undefined, so every fill is printed, when a scorer is declared,
|
|
149
|
-
* since its host code may read any key, and when the
|
|
150
|
+
* since its host code may read any key, and when the study does not plan.
|
|
150
151
|
*/
|
|
151
152
|
function announcedKeyNames(config, options) {
|
|
152
153
|
if (options.scorer !== undefined || config.review?.scorer !== undefined)
|
|
153
154
|
return undefined;
|
|
154
|
-
const planned =
|
|
155
|
+
const planned = planStudy(config, { cwd: options.cwd, dryRun: false });
|
|
155
156
|
return planned.ok ? keyNamesOf(planned.planned.plan) : undefined;
|
|
156
157
|
}
|
|
157
158
|
/** The route's CLI setup. Undefined when the setup has already written its own result. */
|
|
@@ -169,10 +170,10 @@ function routeRunFor(route, args) {
|
|
|
169
170
|
return sharedWorldRouteRun(args);
|
|
170
171
|
default:
|
|
171
172
|
// Compile-time exhaustiveness: a future route must be handled here, not silently no-op.
|
|
172
|
-
throw new Error(`Unhandled
|
|
173
|
+
throw new Error(`Unhandled study route: ${String(route)}`);
|
|
173
174
|
}
|
|
174
175
|
}
|
|
175
|
-
function
|
|
176
|
+
function studyRerunFlagsRequested(options) {
|
|
176
177
|
return options.rerunFailedFrom !== undefined || options.participants !== undefined;
|
|
177
178
|
}
|
|
178
179
|
function writeUnsupportedRerunFlagsResult(args, route) {
|
|
@@ -183,15 +184,13 @@ function writeUnsupportedRerunFlagsResult(args, route) {
|
|
|
183
184
|
warnings: [],
|
|
184
185
|
error: {
|
|
185
186
|
code: "HUMANISH_UNSUPPORTED_RERUN_FLAGS",
|
|
186
|
-
message: `--rerun-failed-from/--participants apply only to computer-use
|
|
187
|
+
message: `--rerun-failed-from/--participants apply only to computer-use studies with more than one participant; this study runs on the ${route} route.`,
|
|
187
188
|
},
|
|
188
189
|
};
|
|
189
190
|
writeResult(args.command, args.io, result, formatRunHuman);
|
|
190
191
|
args.io.setExitCode(2);
|
|
191
192
|
}
|
|
192
|
-
function
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
196
|
-
].join("\n") + "\n");
|
|
193
|
+
function formatStudyResolveFailureHuman(result) {
|
|
194
|
+
const warnings = result.warnings.map((warning) => `warning: ${warning}\n`).join("");
|
|
195
|
+
return { ...(warnings ? { stdout: warnings } : {}), error: result.error };
|
|
197
196
|
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { type AdapterScorerModule } from "../../
|
|
2
|
-
import type {
|
|
1
|
+
import { type AdapterScorerModule } from "../../study/adapter-scorer-loader.js";
|
|
2
|
+
import type { StudyRoute } from "../../study/plan.js";
|
|
3
3
|
import type { RunScorerProvenance } from "../../run/bundle.js";
|
|
4
|
-
import type {
|
|
4
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
5
5
|
import type { RunResult } from "../../run/results.js";
|
|
6
|
-
/** A
|
|
6
|
+
/** A config-declared scorer that resolved + loaded fail-closed, ready to thread into a backend. */
|
|
7
7
|
export interface LoadedAdapterScorer {
|
|
8
8
|
hooks: AdapterScorerModule;
|
|
9
9
|
provenance: RunScorerProvenance;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
12
|
* Resolve `review.scorer.ref` (or the `--scorer` override) to a loaded adopter scorer, fail-closed
|
|
13
|
-
* (typed error)
|
|
13
|
+
* (typed error) pre-spend. Precedence: CLI `--scorer` overrides the manifest; `source` records which
|
|
14
14
|
* won. No scorer declared → `{ ok: true }` with no scorer. A declared scorer on an unsupported
|
|
15
15
|
* backend, or a bad/unreadable/broken ref, → `{ ok: false }` so the caller aborts with exit 2.
|
|
16
16
|
*/
|
|
17
17
|
export declare function maybeLoadAdapterScorer(args: {
|
|
18
18
|
cwd: string;
|
|
19
|
-
config:
|
|
20
|
-
route:
|
|
19
|
+
config: StudyConfig;
|
|
20
|
+
route: StudyRoute;
|
|
21
21
|
flag: string | undefined;
|
|
22
22
|
}): Promise<{
|
|
23
23
|
ok: true;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { loadAdapterScorer } from "../../
|
|
1
|
+
import { loadAdapterScorer } from "../../study/adapter-scorer-loader.js";
|
|
2
2
|
/**
|
|
3
3
|
* Resolve `review.scorer.ref` (or the `--scorer` override) to a loaded adopter scorer, fail-closed
|
|
4
|
-
* (typed error)
|
|
4
|
+
* (typed error) pre-spend. Precedence: CLI `--scorer` overrides the manifest; `source` records which
|
|
5
5
|
* won. No scorer declared → `{ ok: true }` with no scorer. A declared scorer on an unsupported
|
|
6
6
|
* backend, or a bad/unreadable/broken ref, → `{ ok: false }` so the caller aborts with exit 2.
|
|
7
7
|
*/
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { formatAutomaticAnalysisBudget } from "../../analysis/automatic-config.js";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { Command, Option } from "commander";
|
|
4
|
+
import { inspectStudyManifest, listStudyManifests } from "../../study/discover.js";
|
|
5
|
+
import { runStudyPreflight, } from "../../study/preflight.js";
|
|
6
|
+
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, humanError, } from "../io.js";
|
|
7
|
+
export function registerStudyCommands(parent, io) {
|
|
8
|
+
const study = parent
|
|
9
|
+
.command("study")
|
|
10
|
+
.description("List, show and check studies in humanish/studies/.");
|
|
11
|
+
listCommand(study.command("list"), io);
|
|
12
|
+
showCommand(study.command("show"), io);
|
|
13
|
+
checkCommand(study.command("check"), io);
|
|
14
|
+
}
|
|
15
|
+
function listCommand(command, io) {
|
|
16
|
+
command
|
|
17
|
+
.description("List the studies in this project, committed and local.")
|
|
18
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
19
|
+
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
20
|
+
.action((options, command) => handleStudyList(io, options, command));
|
|
21
|
+
}
|
|
22
|
+
function showCommand(command, io) {
|
|
23
|
+
command
|
|
24
|
+
.argument("<study>", "Study id or .yaml path.")
|
|
25
|
+
.description("Show a study's parsed file and its warnings without running it.")
|
|
26
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
27
|
+
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
28
|
+
.action((name, options, command) => handleStudyShow(io, name, options, command));
|
|
29
|
+
}
|
|
30
|
+
function checkCommand(command, io) {
|
|
31
|
+
command
|
|
32
|
+
.argument("<study>", "Study id or .yaml path.")
|
|
33
|
+
.description("Check the study file and, with --reachability, its named endpoints. humanish doctor --study <study> checks this machine.")
|
|
34
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
35
|
+
.addOption(new Option("--reachability <mode>", "Reachability mode.")
|
|
36
|
+
.choices(["metadata", "public-preview", "sandbox-loopback", "prepared-host"])
|
|
37
|
+
.default("metadata"))
|
|
38
|
+
.option("--timeout-ms <ms>", "Target reachability timeout.", String(30_000))
|
|
39
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
40
|
+
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
41
|
+
.action((name, options, command) => handleStudyCheck(io, name, options, command));
|
|
42
|
+
}
|
|
43
|
+
async function handleStudyList(io, options, command) {
|
|
44
|
+
const result = await listStudyManifests(options.cwd);
|
|
45
|
+
writeResult(command, io, result, formatStudyListHuman);
|
|
46
|
+
io.setExitCode(0);
|
|
47
|
+
}
|
|
48
|
+
async function handleStudyShow(io, name, options, command) {
|
|
49
|
+
const result = await inspectStudyManifest(options.cwd, name);
|
|
50
|
+
writeResult(command, io, result, formatStudyShowHuman);
|
|
51
|
+
io.setExitCode(result.ok ? 0 : 2);
|
|
52
|
+
}
|
|
53
|
+
async function handleStudyCheck(io, name, options, command) {
|
|
54
|
+
if (!(await applyEnvFileOption({
|
|
55
|
+
command,
|
|
56
|
+
cwd: options.cwd,
|
|
57
|
+
envFile: options.envFile,
|
|
58
|
+
io,
|
|
59
|
+
}))) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const timeoutMs = parsePositiveInteger(options.timeoutMs);
|
|
63
|
+
if (timeoutMs === null) {
|
|
64
|
+
const result = {
|
|
65
|
+
schema: "humanish.study-check.v1",
|
|
66
|
+
ok: false,
|
|
67
|
+
cwd: resolve(options.cwd),
|
|
68
|
+
study: name,
|
|
69
|
+
reachability: options.reachability,
|
|
70
|
+
checks: [{ name: "timeout", ok: false, message: "--timeout-ms must be a positive integer." }],
|
|
71
|
+
targets: [],
|
|
72
|
+
sandbox: { created: false },
|
|
73
|
+
spend: { e2bDesktop: false, model: false },
|
|
74
|
+
warnings: [],
|
|
75
|
+
error: {
|
|
76
|
+
code: "HUMANISH_STUDY_PREFLIGHT_INVALID_OPTION",
|
|
77
|
+
message: "--timeout-ms must be a positive integer.",
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
writeResult(command, io, result, formatStudyCheckHuman);
|
|
81
|
+
io.setExitCode(2);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const result = await runStudyPreflight({
|
|
85
|
+
cwd: options.cwd,
|
|
86
|
+
study: name,
|
|
87
|
+
reachability: options.reachability,
|
|
88
|
+
timeoutMs,
|
|
89
|
+
});
|
|
90
|
+
writeResult(command, io, result, formatStudyCheckHuman);
|
|
91
|
+
io.setExitCode(result.ok ? 0 : 2);
|
|
92
|
+
}
|
|
93
|
+
function formatStudyListHuman(result) {
|
|
94
|
+
if (result.studies.length === 0) {
|
|
95
|
+
return ([
|
|
96
|
+
`No studies found in ${result.cwd}`,
|
|
97
|
+
"Create one under humanish/studies/*.yaml, or pass a .yaml path.",
|
|
98
|
+
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
99
|
+
].join("\n") + "\n");
|
|
100
|
+
}
|
|
101
|
+
return ([
|
|
102
|
+
"humanish studies",
|
|
103
|
+
...result.studies.map((study) => `- ${study.id} ${study.source} ${study.origin} ${study.path}${study.title ? ` (${study.title})` : ""}`),
|
|
104
|
+
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
105
|
+
].join("\n") + "\n");
|
|
106
|
+
}
|
|
107
|
+
function formatStudyShowHuman(result) {
|
|
108
|
+
if (!result.ok || !result.config)
|
|
109
|
+
return humanError(result.error);
|
|
110
|
+
const config = result.config;
|
|
111
|
+
return ([
|
|
112
|
+
"humanish study",
|
|
113
|
+
`id: ${config.id}`,
|
|
114
|
+
`subject: ${config.subject.source}`,
|
|
115
|
+
...(config.execution?.target ? [`execution: ${config.execution.target}`] : []),
|
|
116
|
+
`actors: ${config.actors.map((actor) => actor.type).join(", ")}`,
|
|
117
|
+
...(config.title ? [`title: ${config.title}`] : []),
|
|
118
|
+
...(config.description ? [`description: ${config.description}`] : []),
|
|
119
|
+
...(result.path ? [`path: ${result.path}`] : []),
|
|
120
|
+
...(result.origin ? [`origin: ${result.origin}`] : []),
|
|
121
|
+
...(config.subject.repos?.length ? [`repos: ${config.subject.repos.join(", ")}`] : []),
|
|
122
|
+
...(result.personas ?? []).map((persona) => `persona ${persona.id}: ${persona.brief ? `authored context (before runtime additions)\n${persona.brief.text}` : "unresolved; id only"}`),
|
|
123
|
+
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
124
|
+
].join("\n") + "\n");
|
|
125
|
+
}
|
|
126
|
+
function formatStudyCheckHuman(result) {
|
|
127
|
+
const checkedTargets = result.targets.filter((target) => target.checked);
|
|
128
|
+
const reachableTargets = checkedTargets.filter((target) => target.reachable === true);
|
|
129
|
+
const blockedTargets = result.targets.filter((target) => target.status === "blocked");
|
|
130
|
+
const stdout = [
|
|
131
|
+
`humanish study check ${result.ok ? "passed" : "failed"}`,
|
|
132
|
+
`study: ${result.studyId ?? result.study}`,
|
|
133
|
+
...(result.route ? [`route: ${result.route}`] : []),
|
|
134
|
+
`reachability: ${result.reachability}`,
|
|
135
|
+
`targets: ${checkedTargets.length ? `${reachableTargets.length}/${checkedTargets.length} reachable` : `${result.targets.length} declared, not checked`}`,
|
|
136
|
+
...(blockedTargets.length ? [`blocked-targets: ${blockedTargets.length}`] : []),
|
|
137
|
+
`spend: ${result.spend.e2bDesktop ? "one e2b desktop, no model calls" : "none"}`,
|
|
138
|
+
...(result.analysis ? [formatAutomaticAnalysisBudget(result.analysis)] : []),
|
|
139
|
+
...(result.sandbox.created
|
|
140
|
+
? [`sandbox: created=yes killed=${result.sandbox.killed === true ? "yes" : "no"}`]
|
|
141
|
+
: []),
|
|
142
|
+
...result.checks.map((check) => `- ${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`),
|
|
143
|
+
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
144
|
+
].join("\n") + "\n";
|
|
145
|
+
return result.error === undefined ? stdout : { stdout, error: result.error };
|
|
146
|
+
}
|
|
@@ -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
|
@@ -4,22 +4,22 @@ import { Command } from "commander";
|
|
|
4
4
|
import { setUserKey } from "../../keys/key-resolution.js";
|
|
5
5
|
import { saveCommsConnection } from "../../comms/connections.js";
|
|
6
6
|
import { readCommsSetup } from "../../comms/setup.js";
|
|
7
|
-
import { checkCommsConnection,
|
|
7
|
+
import { checkCommsConnection, configureCommsStudy, } from "../../comms/setup.js";
|
|
8
8
|
import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
|
|
9
9
|
import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
|
|
10
10
|
import { promptSecret } from "../secret-prompt.js";
|
|
11
|
-
import { runInit } from "../../
|
|
12
|
-
import {
|
|
11
|
+
import { runInit } from "../../study/init.js";
|
|
12
|
+
import { listStudyManifests } from "../../study/discover.js";
|
|
13
13
|
import { reclaimRunSandboxes } from "../../run/reclaim.js";
|
|
14
14
|
import { RunIndexCache, readRunIndex } from "../../run/run-index.js";
|
|
15
|
-
import {
|
|
15
|
+
import { readStudySummary } from "../../study/summary.js";
|
|
16
16
|
import { readProjectState } from "../../tui/project.js";
|
|
17
17
|
import { createTuiObserverSession, stopRun, TUI_ACTION_SCHEMA } from "../../tui/actions.js";
|
|
18
18
|
import { readRunDetail } from "../../run/detail.js";
|
|
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
|
|
131
|
+
message: "humanish tui needs an interactive terminal. For scripted or agent use, `humanish runs --json` lists the same runs and `humanish run <study> --json` starts one.",
|
|
132
132
|
},
|
|
133
133
|
};
|
|
134
134
|
}
|
|
@@ -210,13 +210,13 @@ function tuiCapabilities(session) {
|
|
|
210
210
|
});
|
|
211
211
|
return session.connectionCheck;
|
|
212
212
|
},
|
|
213
|
-
|
|
214
|
-
title:
|
|
215
|
-
path:
|
|
213
|
+
studies: async () => (await listStudyManifests(cwd)).studies.map((study) => ({
|
|
214
|
+
title: study.title ?? study.id,
|
|
215
|
+
path: study.path,
|
|
216
216
|
})),
|
|
217
|
-
configure: (
|
|
217
|
+
configure: (study, apply, planToken) => configureCommsStudy({
|
|
218
218
|
cwd,
|
|
219
|
-
|
|
219
|
+
study,
|
|
220
220
|
connection: "agentmail",
|
|
221
221
|
apply,
|
|
222
222
|
...(planToken ? { planToken } : {}),
|
|
@@ -244,11 +244,11 @@ function tuiCapabilities(session) {
|
|
|
244
244
|
// One cache for the life of the surface: it refreshes on a cadence, and re-walking every
|
|
245
245
|
// run tree each tick is the cost this index exists to avoid.
|
|
246
246
|
readRunIndex: (target, readOptions) => readRunIndex(target, { ...readOptions, cache: runIndexCache }),
|
|
247
|
-
|
|
247
|
+
listStudies: listStudyManifests,
|
|
248
248
|
startRun: (launchOptions) => launchRun({ ...launchOptions, env: sessionEnv }),
|
|
249
249
|
readLaunchLog: readLaunchLogTail,
|
|
250
250
|
readRunDetail,
|
|
251
|
-
|
|
251
|
+
readStudySummary: (target, study, readOptions) => readStudySummary(target, study, { ...readOptions, env: sessionEnv }),
|
|
252
252
|
readProjectState,
|
|
253
253
|
openObserver: (target, observerPath) => observerSession.open(target, observerPath),
|
|
254
254
|
reclaimRun: (target, runId) => reclaimRunSandboxes(target, runId),
|
|
@@ -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,
|