humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { type KeyResolutionDeps } from "../keys/key-resolution.js";
|
|
2
2
|
import { type DetectLocalAgentsOptions } from "../actors/local-agent/cli.js";
|
|
3
|
+
import { type LabSetupCheckArgs } from "../lab/doctor.js";
|
|
3
4
|
declare const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
|
|
5
|
+
/**
|
|
6
|
+
* A row's verdict, as the human output prints it. A "note" is advisory: it never fails the run, so
|
|
7
|
+
* its `ok` is true. "not_checked" goes with `checked: false`.
|
|
8
|
+
*/
|
|
9
|
+
type DoctorStatus = "ok" | "missing" | "not_checked" | "note";
|
|
4
10
|
export interface DoctorResult {
|
|
5
11
|
schema: typeof DOCTOR_SCHEMA;
|
|
6
12
|
ok: boolean;
|
|
@@ -8,14 +14,15 @@ export interface DoctorResult {
|
|
|
8
14
|
checks: Array<{
|
|
9
15
|
name: string;
|
|
10
16
|
ok: boolean;
|
|
17
|
+
status: DoctorStatus;
|
|
11
18
|
message: string;
|
|
12
19
|
/**
|
|
13
|
-
*
|
|
20
|
+
* Additive + optional. `false` means the check never ran: the directory could not be read, so
|
|
14
21
|
* there is nothing to report about it either way. Absent means it ran and `ok` is its verdict.
|
|
15
22
|
*
|
|
16
|
-
* It exists
|
|
17
|
-
*
|
|
18
|
-
*
|
|
23
|
+
* It exists so a failed check and an unrun one render differently. Without it an unrun row
|
|
24
|
+
* shows the success text, such as `missing package.json: package.json is present and safe to
|
|
25
|
+
* read` (labs/tui-self-study.yaml).
|
|
19
26
|
*/
|
|
20
27
|
checked?: boolean;
|
|
21
28
|
}>;
|
|
@@ -24,16 +31,22 @@ export interface DoctorResult {
|
|
|
24
31
|
* Version 2.3.1 stopped holding a launched background command's event stream open. Version 2.3.2
|
|
25
32
|
* also requires an e2b release whose background command handle supports sendStdin and closeStdin,
|
|
26
33
|
* which the optional speech transport needs. On older releases the CLI could stay alive minutes
|
|
27
|
-
* past a written result (
|
|
34
|
+
* past a written result (measured 2026-09-04 on 2.2.3: twelve minutes).
|
|
28
35
|
*/
|
|
29
36
|
export declare const DESKTOP_SDK_FLOOR = "2.3.2";
|
|
30
37
|
/** The advisory `doctor` attaches to an installed desktop SDK older than the floor, else undefined. */
|
|
31
38
|
export declare function desktopSdkAdvisory(version: string | undefined): string | undefined;
|
|
39
|
+
/** A row as a check writes it. Doctor derives `status`; an advisory row sets "note" itself. */
|
|
40
|
+
export type DoctorCheckDraft = Omit<DoctorResult["checks"][number], "status"> & {
|
|
41
|
+
status?: "note";
|
|
42
|
+
};
|
|
32
43
|
export declare function doctor(cwdInput: string, options?: {
|
|
33
44
|
lab?: string;
|
|
34
45
|
env?: NodeJS.ProcessEnv;
|
|
35
46
|
localAgents?: DetectLocalAgentsOptions;
|
|
36
47
|
/** Where the key probe looks for vendor stores; tests point it at a temp home. */
|
|
37
48
|
keyDeps?: KeyResolutionDeps;
|
|
49
|
+
/** The hosted Codex participant's operator handshake; tests replace it. */
|
|
50
|
+
codexParticipantReadiness?: LabSetupCheckArgs["codexParticipantReadiness"];
|
|
38
51
|
}): Promise<DoctorResult>;
|
|
39
52
|
export {};
|
package/dist/cli/doctor.js
CHANGED
|
@@ -3,8 +3,8 @@ import { existsSync } from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { probeKeySources, } from "../keys/key-resolution.js";
|
|
5
5
|
import { nodeSupportsTui, terminalSurfaceMessage, TUI_BUNDLE_URL } from "../tui/contract.js";
|
|
6
|
-
import { detectLocalAgents, localAgentDoctorMessage, } from "../actors/local-agent/cli.js";
|
|
7
|
-
import { labSetupChecks } from "../lab/doctor.js";
|
|
6
|
+
import { detectLocalAgents, localAgentDoctorMessage, NO_LOCAL_AGENT_MESSAGE, } from "../actors/local-agent/cli.js";
|
|
7
|
+
import { labSetupChecks, studiesByRequiredKey } from "../lab/doctor.js";
|
|
8
8
|
import { prepareSelectedOutputDirectory, } from "../run/contained-output.js";
|
|
9
9
|
import { implicitProjectDirectoryExists, readImplicitProjectFile, validateCwd, } from "../run/project.js";
|
|
10
10
|
const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
|
|
@@ -12,7 +12,7 @@ const DOCTOR_SCHEMA = "humanish.doctor-result.v1";
|
|
|
12
12
|
* Version 2.3.1 stopped holding a launched background command's event stream open. Version 2.3.2
|
|
13
13
|
* also requires an e2b release whose background command handle supports sendStdin and closeStdin,
|
|
14
14
|
* which the optional speech transport needs. On older releases the CLI could stay alive minutes
|
|
15
|
-
* past a written result (
|
|
15
|
+
* past a written result (measured 2026-09-04 on 2.2.3: twelve minutes).
|
|
16
16
|
*/
|
|
17
17
|
export const DESKTOP_SDK_FLOOR = "2.3.2";
|
|
18
18
|
/** The advisory `doctor` attaches to an installed desktop SDK older than the floor, else undefined. */
|
|
@@ -31,7 +31,7 @@ export function desktopSdkAdvisory(version) {
|
|
|
31
31
|
(have[0] === floor[0] &&
|
|
32
32
|
(have[1] < floor[1] || (have[1] === floor[1] && have[2] < floor[2])));
|
|
33
33
|
return older
|
|
34
|
-
? `@e2b/desktop ${version} is older than ${DESKTOP_SDK_FLOOR}, the supported floor for background command cleanup and stdin handles (older releases could keep the CLI alive minutes
|
|
34
|
+
? `@e2b/desktop ${version} is older than ${DESKTOP_SDK_FLOOR}, the supported floor for background command cleanup and stdin handles (older releases could keep the CLI alive for minutes after its result). Update with \`npm i -D @e2b/desktop@latest\`.`
|
|
35
35
|
: undefined;
|
|
36
36
|
}
|
|
37
37
|
/** The version of the @e2b/desktop that `import("@e2b/desktop")` resolves to from here, if readable. */
|
|
@@ -52,44 +52,46 @@ export async function doctor(cwdInput, options = {}) {
|
|
|
52
52
|
.then((error) => error === null)
|
|
53
53
|
.catch(() => false);
|
|
54
54
|
if (!cwdOk) {
|
|
55
|
-
const checks = uncheckedProjectChecks("this directory does not exist, or humanish cannot read it", "not checked
|
|
56
|
-
return { schema: DOCTOR_SCHEMA, ok: false, cwd, checks };
|
|
55
|
+
const checks = uncheckedProjectChecks("this directory does not exist, or humanish cannot read it", "not checked: the target directory could not be read");
|
|
56
|
+
return { schema: DOCTOR_SCHEMA, ok: false, cwd, checks: withStatus(checks) };
|
|
57
57
|
}
|
|
58
58
|
let projectRoot;
|
|
59
59
|
try {
|
|
60
60
|
projectRoot = await prepareSelectedOutputDirectory(path.dirname(cwd), cwd);
|
|
61
61
|
}
|
|
62
62
|
catch {
|
|
63
|
-
const checks = uncheckedProjectChecks("target directory failed containment validation", "not checked
|
|
64
|
-
return { schema: DOCTOR_SCHEMA, ok: false, cwd, checks };
|
|
63
|
+
const checks = uncheckedProjectChecks("target directory failed containment validation", "not checked: the containment check failed first");
|
|
64
|
+
return { schema: DOCTOR_SCHEMA, ok: false, cwd, checks: withStatus(checks) };
|
|
65
65
|
}
|
|
66
66
|
const env = options.env ?? process.env;
|
|
67
67
|
const agents = await detectLocalAgents({ ...options.localAgents, env });
|
|
68
68
|
const { probes, receivingKey } = await probeDoctorKeys(cwd, env, options.lab, options.keyDeps);
|
|
69
|
+
const keyPresent = (name) => probes.some((probe) => probe.name === name && probe.source !== null);
|
|
69
70
|
const setup = options.lab
|
|
70
71
|
? await labSetupChecks({
|
|
71
72
|
cwd,
|
|
72
73
|
lab: options.lab,
|
|
73
74
|
env,
|
|
74
75
|
agents,
|
|
75
|
-
keyPresent
|
|
76
|
+
keyPresent,
|
|
77
|
+
...(options.codexParticipantReadiness === undefined
|
|
78
|
+
? {}
|
|
79
|
+
: { codexParticipantReadiness: options.codexParticipantReadiness }),
|
|
76
80
|
})
|
|
77
81
|
: undefined;
|
|
82
|
+
// Without --lab, each key row names the labs that need it instead of failing.
|
|
83
|
+
const keyUsers = setup ? undefined : await studiesByRequiredKey(cwd, keyPresent);
|
|
78
84
|
const checks = [
|
|
79
85
|
...(await projectChecks(projectRoot)),
|
|
80
86
|
await desktopSdkCheck(setup),
|
|
81
87
|
terminalSurfaceCheck(),
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
// "go make an API key" is where most people trying humanish stop, and a developer very often
|
|
85
|
-
// already has one of these signed in.
|
|
86
|
-
{ name: "local agents", ok: true, message: localAgentDoctorMessage(agents) },
|
|
87
|
-
...keyChecks(probes, receivingKey, setup, agents),
|
|
88
|
+
...localAgentChecks(agents),
|
|
89
|
+
...keyChecks(probes, receivingKey, setup, keyUsers),
|
|
88
90
|
...(setup?.checks ?? [
|
|
89
91
|
{
|
|
90
92
|
name: "setup route",
|
|
91
93
|
ok: true,
|
|
92
|
-
message: "General capabilities only. Use humanish doctor --
|
|
94
|
+
message: "General capabilities only. Use humanish doctor --study <study> for the selected participant's requirements and separate analysis readiness.",
|
|
93
95
|
},
|
|
94
96
|
]),
|
|
95
97
|
];
|
|
@@ -97,9 +99,15 @@ export async function doctor(cwdInput, options = {}) {
|
|
|
97
99
|
schema: DOCTOR_SCHEMA,
|
|
98
100
|
ok: checks.every((check) => check.ok),
|
|
99
101
|
cwd,
|
|
100
|
-
checks,
|
|
102
|
+
checks: withStatus(checks),
|
|
101
103
|
};
|
|
102
104
|
}
|
|
105
|
+
function withStatus(checks) {
|
|
106
|
+
return checks.map((check) => ({
|
|
107
|
+
...check,
|
|
108
|
+
status: check.ok ? (check.status ?? "ok") : check.checked === false ? "not_checked" : "missing",
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
103
111
|
/** The rows for a target directory doctor could not open: the failure, then three unrun checks. */
|
|
104
112
|
function uncheckedProjectChecks(targetMessage, reason) {
|
|
105
113
|
return [
|
|
@@ -144,23 +152,35 @@ async function projectChecks(projectRoot) {
|
|
|
144
152
|
};
|
|
145
153
|
}
|
|
146
154
|
})(),
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
ok: await safeCheck(() => implicitProjectDirectoryExists(projectRoot, "humanish")),
|
|
150
|
-
message: "committed humanish/ source directory is present and safe to read",
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
name: "runtime ignore",
|
|
154
|
-
ok: await safeCheck(async () => (await readImplicitProjectFile(projectRoot, ".gitignore"))?.includes(".humanish/") ??
|
|
155
|
-
false),
|
|
156
|
-
message: ".gitignore safely contains .humanish/",
|
|
157
|
-
},
|
|
155
|
+
await sourceCheck(projectRoot),
|
|
156
|
+
await runtimeIgnoreCheck(projectRoot),
|
|
158
157
|
];
|
|
159
158
|
}
|
|
159
|
+
// Each row says what it found, and a failing one names the command that fixes it.
|
|
160
|
+
async function sourceCheck(projectRoot) {
|
|
161
|
+
const ok = await safeCheck(() => implicitProjectDirectoryExists(projectRoot, "humanish"));
|
|
162
|
+
return {
|
|
163
|
+
name: "humanish source",
|
|
164
|
+
ok,
|
|
165
|
+
message: ok
|
|
166
|
+
? "committed humanish/ source directory is present and safe to read"
|
|
167
|
+
: "no readable humanish/ source directory; run humanish init --yes",
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
async function runtimeIgnoreCheck(projectRoot) {
|
|
171
|
+
const ok = await safeCheck(async () => (await readImplicitProjectFile(projectRoot, ".gitignore"))?.includes(".humanish/") ?? false);
|
|
172
|
+
return {
|
|
173
|
+
name: "runtime ignore",
|
|
174
|
+
ok,
|
|
175
|
+
message: ok
|
|
176
|
+
? ".gitignore lists .humanish/"
|
|
177
|
+
: ".gitignore does not list .humanish/; run humanish init --yes",
|
|
178
|
+
};
|
|
179
|
+
}
|
|
160
180
|
/**
|
|
161
|
-
* The optional peer dep every live browser and terminal
|
|
162
|
-
*
|
|
163
|
-
* but as a burned first impression on the flagship path. Answering it here means the readiness
|
|
181
|
+
* The optional peer dep every live browser and terminal route needs. `npx -y humanish` does not
|
|
182
|
+
* pull optional peers, so without this check an adopter's first live run fails on it, safely and at
|
|
183
|
+
* $0, but as a burned first impression on the flagship path. Answering it here means the readiness
|
|
164
184
|
* command actually answers readiness.
|
|
165
185
|
*/
|
|
166
186
|
async function desktopSdkCheck(setup) {
|
|
@@ -175,27 +195,30 @@ async function desktopSdkCheck(setup) {
|
|
|
175
195
|
});
|
|
176
196
|
const version = present ? await installedDesktopSdkVersion() : undefined;
|
|
177
197
|
const advisory = desktopSdkAdvisory(version);
|
|
198
|
+
// Without --lab nothing selects a desktop route yet, so an absent SDK is advisory.
|
|
199
|
+
const advisoryOnly = !present && setup === undefined;
|
|
178
200
|
return {
|
|
179
201
|
name: "e2b desktop sdk",
|
|
180
|
-
ok: present || setup?.desktop === false,
|
|
202
|
+
ok: present || advisoryOnly || setup?.desktop === false,
|
|
203
|
+
...(advisoryOnly ? { status: "note" } : {}),
|
|
181
204
|
message: present
|
|
182
205
|
? `optional peer @e2b/desktop ${version ?? "(version unread)"} is installed; provider access is not tested${advisory === undefined ? "" : `. ${advisory}`}`
|
|
183
206
|
: setup?.desktop === false
|
|
184
207
|
? "optional peer @e2b/desktop is absent; not required by the selected route"
|
|
185
|
-
: "optional peer @e2b/desktop is
|
|
208
|
+
: "optional peer @e2b/desktop is not installed: dry runs work, but a live run with a desktop participant fails when it starts. Install it with `npm i -D @e2b/desktop`.",
|
|
186
209
|
};
|
|
187
210
|
}
|
|
188
211
|
/**
|
|
189
|
-
* The stakeholder surface
|
|
212
|
+
* The stakeholder surface. Reported as capability, never as a gate: the TUI is optional,
|
|
190
213
|
* and `doctor` is itself mostly run by agents through a pipe, where a TTY requirement says
|
|
191
|
-
* nothing about whether the
|
|
214
|
+
* nothing about whether the project is ready. So this row is always ok.
|
|
192
215
|
*
|
|
193
|
-
*
|
|
216
|
+
* Who is reading decides the wording, and a real first-contact study
|
|
194
217
|
* (labs/first-contact.yaml) is why. An agent evaluating humanish read
|
|
195
218
|
* "`humanish tui` is available in an interactive terminal", correctly concluded it was not in
|
|
196
|
-
* one, and dropped it
|
|
219
|
+
* one, and dropped it, then wrote a report for a human that never mentioned the human
|
|
197
220
|
* surface at all. Discovery worked; handoff did not. A capability described to a reader who
|
|
198
|
-
* cannot use it has to be phrased as something to
|
|
221
|
+
* cannot use it has to be phrased as something to pass on, or it reads as "not for you" and
|
|
199
222
|
* dies there.
|
|
200
223
|
*/
|
|
201
224
|
function terminalSurfaceCheck() {
|
|
@@ -204,6 +227,7 @@ function terminalSurfaceCheck() {
|
|
|
204
227
|
return {
|
|
205
228
|
name: "terminal surface",
|
|
206
229
|
ok: true,
|
|
230
|
+
...(supported && bundlePresent ? {} : { status: "note" }),
|
|
207
231
|
message: terminalSurfaceMessage({
|
|
208
232
|
supported,
|
|
209
233
|
bundlePresent,
|
|
@@ -234,30 +258,69 @@ async function probeDoctorKeys(cwd, env, lab, keyDeps) {
|
|
|
234
258
|
return { probes, receivingKey };
|
|
235
259
|
}
|
|
236
260
|
/**
|
|
237
|
-
*
|
|
261
|
+
* The operator's own coding agents, one row each, reported as a capability and never a gate: a
|
|
262
|
+
* machine with none is not broken, it just needs a provider key. These rows exist because "go make
|
|
263
|
+
* an API key" is where most people trying humanish stop, and a developer very often already has one
|
|
264
|
+
* of these signed in. An agent that is installed but not signed in is a note.
|
|
265
|
+
*/
|
|
266
|
+
function localAgentChecks(agents) {
|
|
267
|
+
if (agents.length === 0)
|
|
268
|
+
return [{ name: "local agents", ok: true, message: NO_LOCAL_AGENT_MESSAGE }];
|
|
269
|
+
return agents.map((agent) => ({
|
|
270
|
+
name: `local agent ${agent.bin}`,
|
|
271
|
+
ok: true,
|
|
272
|
+
...(agent.authStatus === "authenticated" ? {} : { status: "note" }),
|
|
273
|
+
message: localAgentDoctorMessage(agent),
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
/** "try-live", "try-live and local-browser", "a, b and c". */
|
|
277
|
+
function studyList(studies) {
|
|
278
|
+
return studies.length < 2
|
|
279
|
+
? studies.join("")
|
|
280
|
+
: `${studies.slice(0, -1).join(", ")} and ${studies.at(-1)}`;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Provider-key discovery: which source supplies each live-run key, through the same
|
|
238
284
|
* chain a live command resolves (env/--env-file, project overlay, vendor stores, the
|
|
239
285
|
* humanish user store). Values never appear; sources and fill commands do.
|
|
286
|
+
*
|
|
287
|
+
* With --lab, a key the selected route requires fails when missing. Without it, `keyUsers` maps
|
|
288
|
+
* each key to the project's labs that need it, and a key row never fails: a missing key one of
|
|
289
|
+
* them needs is a note.
|
|
240
290
|
*/
|
|
241
|
-
function keyChecks(probes, receivingKey, setup,
|
|
291
|
+
function keyChecks(probes, receivingKey, setup, keyUsers) {
|
|
242
292
|
return probes.map((probe) => {
|
|
243
293
|
const present = probe.source !== null;
|
|
244
294
|
const hint = probe.name === receivingKey
|
|
245
295
|
? `provide ${probe.name} through process env or --env-file`
|
|
246
296
|
: probe.hint;
|
|
297
|
+
if (!setup) {
|
|
298
|
+
const users = keyUsers?.get(probe.name) ?? [];
|
|
299
|
+
const usedBy = users.length > 0 ? `used by ${studyList(users)}` : undefined;
|
|
300
|
+
return {
|
|
301
|
+
name: `key ${probe.name}`,
|
|
302
|
+
ok: true,
|
|
303
|
+
...(present || usedBy === undefined ? {} : { status: "note" }),
|
|
304
|
+
message: present
|
|
305
|
+
? `supplied by ${probe.source}; presence only, validity not tested${usedBy ? `; ${usedBy}` : ""}`
|
|
306
|
+
: `missing; ${usedBy ?? "not used by any lab in this project"}; ${hint}`,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
247
309
|
// GH_TOKEN is needed only for private clone subjects, so its absence is informational.
|
|
248
|
-
const required = setup
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
!agents.some((agent) => agent.authStatus === "authenticated"));
|
|
310
|
+
const required = setup.keys.includes(probe.name);
|
|
311
|
+
// A key the lab is known not to read says so, so a present but unused key does not read as
|
|
312
|
+
// one the run will use.
|
|
313
|
+
const unused = setup.reads !== undefined && !setup.reads.has(probe.name);
|
|
253
314
|
return {
|
|
254
315
|
name: `key ${probe.name}`,
|
|
255
316
|
ok: present || !required,
|
|
256
317
|
message: present
|
|
257
|
-
?
|
|
318
|
+
? unused
|
|
319
|
+
? `present (${probe.source}), not used by this lab`
|
|
320
|
+
: `supplied by ${probe.source}; presence only, validity not tested`
|
|
258
321
|
: required
|
|
259
|
-
? `missing from every source
|
|
260
|
-
: `not required for
|
|
322
|
+
? `missing from every source; ${hint}`
|
|
323
|
+
: `not required for the selected participant route; ${hint}`,
|
|
261
324
|
};
|
|
262
325
|
});
|
|
263
326
|
}
|
|
@@ -8,23 +8,23 @@ export interface FirstRunEnvironment {
|
|
|
8
8
|
/** A sandbox to run the study in. Nothing live happens without it. */
|
|
9
9
|
hasE2bKey: boolean;
|
|
10
10
|
/**
|
|
11
|
-
* Whether `@e2b/desktop` resolves from this project. It is an
|
|
12
|
-
* does not need it
|
|
11
|
+
* Whether `@e2b/desktop` resolves from this project. It is an optional peer: the no-keys path
|
|
12
|
+
* does not need it, so a fresh `npx humanish` install does not have it, and a live run stops
|
|
13
13
|
* with "install this other package first". Found by running the published artifact cold, after
|
|
14
14
|
* two local runs passed because they resolved the peer from the repo's own node_modules.
|
|
15
15
|
*/
|
|
16
16
|
hasDesktopSdk: boolean;
|
|
17
17
|
/**
|
|
18
18
|
* Whether humanish itself is installed in this project rather than running from an npx cache.
|
|
19
|
-
* It changes what advice is
|
|
20
|
-
* to itself, so "install the peer here" cannot work
|
|
19
|
+
* It changes what advice is true: a one-shot `npx humanish` resolves its optional peer relative
|
|
20
|
+
* to itself, so "install the peer here" cannot work; humanish has to be installed alongside it.
|
|
21
21
|
*/
|
|
22
22
|
installedInProject: boolean;
|
|
23
23
|
/** A provider API key for the model. */
|
|
24
24
|
hasProviderKey: boolean;
|
|
25
25
|
/** The coding agents already signed in locally: Codex, Claude Code, or both. */
|
|
26
26
|
localAgents: readonly SignedInAgent[];
|
|
27
|
-
/** Host shape only; `doctor --
|
|
27
|
+
/** Host shape only; `doctor --study local-browser` owns exact read-only readiness. */
|
|
28
28
|
platform?: NodeJS.Platform;
|
|
29
29
|
arch?: string;
|
|
30
30
|
}
|
|
@@ -32,7 +32,7 @@ export type FirstRunActor = "openai-computer-use" | "local-agent";
|
|
|
32
32
|
/**
|
|
33
33
|
* Which brain the starter live lab should be written for. A machine with a signed-in coding agent
|
|
34
34
|
* and no provider key can still do a real live run; writing the lab for the credential the
|
|
35
|
-
* operator
|
|
35
|
+
* operator doesn't have is how a starter file becomes homework.
|
|
36
36
|
*/
|
|
37
37
|
export declare function starterActorFor(env: FirstRunEnvironment): FirstRunActor;
|
|
38
38
|
/**
|
|
@@ -40,6 +40,8 @@ export declare function starterActorFor(env: FirstRunEnvironment): FirstRunActor
|
|
|
40
40
|
* refuse to run on a machine where only Claude Code is signed in.
|
|
41
41
|
*/
|
|
42
42
|
export declare function starterLocalAgentFor(env: FirstRunEnvironment): LocalAgentId | undefined;
|
|
43
|
+
/** Hosts the local browser lab runs on: Linux x64 and Apple Silicon Macs. */
|
|
44
|
+
export declare function supportsLocalBrowser(platform: NodeJS.Platform | undefined, arch: string | undefined): boolean;
|
|
43
45
|
export interface FirstRunStep {
|
|
44
46
|
/** The exact command to run. */
|
|
45
47
|
command: string;
|
|
@@ -47,7 +49,7 @@ export interface FirstRunStep {
|
|
|
47
49
|
why: string;
|
|
48
50
|
}
|
|
49
51
|
/**
|
|
50
|
-
* The next one or two commands, in order. Deliberately
|
|
52
|
+
* The next one or two commands, in order. Deliberately short: a list of twelve options is the same
|
|
51
53
|
* as no guidance, and the reader here has just been handed twenty files.
|
|
52
54
|
*/
|
|
53
55
|
export declare function firstRunSteps(env: FirstRunEnvironment): FirstRunStep[];
|
|
@@ -56,12 +58,12 @@ export declare function firstRunGuidance(env: FirstRunEnvironment): string[];
|
|
|
56
58
|
/** Lets init recognise its own section without rewriting a file someone else wrote. */
|
|
57
59
|
export declare const AGENTS_SECTION_MARKER = "<!-- humanish:agents-guide -->";
|
|
58
60
|
/**
|
|
59
|
-
* What the
|
|
61
|
+
* What the next coding agent needs to know about humanish in this project.
|
|
60
62
|
*
|
|
61
|
-
* AGENTS.md is the cross-vendor convention (agents.md) that Codex, Claude Code, Cursor and others
|
|
63
|
+
* `AGENTS.md` is the cross-vendor convention (agents.md) that Codex, Claude Code, Cursor and others
|
|
62
64
|
* read on arrival. Increasingly the thing that ran `humanish init` was itself an agent working for
|
|
63
65
|
* someone, and the agent that shows up tomorrow finds a `humanish/` directory with no idea what it
|
|
64
|
-
* is for. Deliberately
|
|
66
|
+
* is for. Deliberately short and command-first, because an agent acts on the commands it is given.
|
|
65
67
|
*/
|
|
66
68
|
export declare function agentsSection(): string;
|
|
67
69
|
export {};
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
// What a person
|
|
1
|
+
// What a person, or the coding agent setting humanish up for them, should do next.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// Why: `humanish init` wrote twenty files and stopped. The only lab that could actually run was a
|
|
4
4
|
// $0 dry run; the two live ones were templates with `your-org/your-app` in them, so the first live
|
|
5
5
|
// run a newcomer tried could not succeed no matter what credentials they had. Three independent
|
|
6
|
-
// sources reached the same place
|
|
6
|
+
// sources reached the same place: a participant in our own TUI study walked to the Start row and
|
|
7
7
|
// found a placeholder URL, an adoption review concluded "the funnel is broken at the first live
|
|
8
8
|
// run", and the release-gate participant said, unprompted, "validate one paid live study before
|
|
9
|
-
// committing"
|
|
9
|
+
// committing".
|
|
10
10
|
//
|
|
11
11
|
// The fix is not more surface. Increasingly the thing running `init` is a coding agent acting for
|
|
12
12
|
// someone, and an agent reads stdout and does what it says. So init ends by naming the next
|
|
13
|
-
// command
|
|
13
|
+
// command, and names the one that will actually work on this machine, because a next step that
|
|
14
14
|
// fails is worse than none.
|
|
15
15
|
/**
|
|
16
16
|
* Which brain the starter live lab should be written for. A machine with a signed-in coding agent
|
|
17
17
|
* and no provider key can still do a real live run; writing the lab for the credential the
|
|
18
|
-
* operator
|
|
18
|
+
* operator doesn't have is how a starter file becomes homework.
|
|
19
19
|
*/
|
|
20
20
|
export function starterActorFor(env) {
|
|
21
21
|
if (!env.hasProviderKey && env.localAgents.length > 0)
|
|
@@ -35,29 +35,31 @@ export function starterLocalAgentFor(env) {
|
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
37
|
* How each hint invokes the CLI. \`npx humanish\` works from a project install and from an npx cache;
|
|
38
|
-
* a dev-dependency install puts no \`humanish\` on PATH
|
|
38
|
+
* a dev-dependency install puts no \`humanish\` on \`PATH\`, so a bare name can reach a stale global one.
|
|
39
39
|
*/
|
|
40
40
|
const HUMANISH = "npx humanish";
|
|
41
|
+
/** Hosts the local browser lab runs on: Linux x64 and Apple Silicon Macs. */
|
|
42
|
+
export function supportsLocalBrowser(platform, arch) {
|
|
43
|
+
return (platform === "linux" && arch === "x64") || (platform === "darwin" && arch === "arm64");
|
|
44
|
+
}
|
|
41
45
|
/**
|
|
42
|
-
* The next one or two commands, in order. Deliberately
|
|
46
|
+
* The next one or two commands, in order. Deliberately short: a list of twelve options is the same
|
|
43
47
|
* as no guidance, and the reader here has just been handed twenty files.
|
|
44
48
|
*/
|
|
45
49
|
export function firstRunSteps(env) {
|
|
46
50
|
const steps = [
|
|
47
51
|
{
|
|
48
52
|
command: `${HUMANISH} run first-run`,
|
|
49
|
-
why: "
|
|
53
|
+
why: "a dry run: no browser or model runs, no keys, no spend",
|
|
50
54
|
},
|
|
51
55
|
];
|
|
52
|
-
|
|
53
|
-
(env.platform === "darwin" && env.arch === "arm64");
|
|
54
|
-
if (localPlatform) {
|
|
56
|
+
if (supportsLocalBrowser(env.platform, env.arch)) {
|
|
55
57
|
const prerequisites = env.platform === "darwin"
|
|
56
58
|
? "M3-or-newer Mac, native ARM64 Node, Lima 2.2+, and a supported signed-in Codex CLI"
|
|
57
59
|
: "local rootful Docker, KVM, TUN, and a supported signed-in Codex CLI";
|
|
58
60
|
steps.push({
|
|
59
|
-
command: `${HUMANISH} doctor --
|
|
60
|
-
why: `check the local browser
|
|
61
|
+
command: `${HUMANISH} doctor --study local-browser`,
|
|
62
|
+
why: `check the local browser study (${prerequisites}); no resources or quota used. Run \`${HUMANISH} runtime setup\` to prepare it, then start your app and run \`${HUMANISH} run local-browser\`; no E2B or model API key`,
|
|
61
63
|
});
|
|
62
64
|
return steps;
|
|
63
65
|
}
|
|
@@ -74,7 +76,7 @@ export function firstRunSteps(env) {
|
|
|
74
76
|
if (env.hasProviderKey || env.localAgents.length > 0) {
|
|
75
77
|
const brain = env.hasProviderKey
|
|
76
78
|
? "your provider key"
|
|
77
|
-
: `${preferredAgent(env)?.label} (already signed in
|
|
79
|
+
: `${preferredAgent(env)?.label} (already signed in, so no API key is needed)`;
|
|
78
80
|
// Everything the step needs, in one line. Splitting it across two commands means the second
|
|
79
81
|
// one fails, which is the same dead end this guidance exists to remove.
|
|
80
82
|
const command = env.hasDesktopSdk
|
|
@@ -86,7 +88,7 @@ export function firstRunSteps(env) {
|
|
|
86
88
|
`npm i -D humanish @e2b/desktop && ${HUMANISH} run try-live`;
|
|
87
89
|
steps.push({
|
|
88
90
|
command,
|
|
89
|
-
why: `a
|
|
91
|
+
why: `a live study: one participant drives a real app in a hosted desktop, using ${brain}` +
|
|
90
92
|
(env.hasDesktopSdk ? "" : " (the desktop SDK is an optional peer, so it installs first)") +
|
|
91
93
|
(!env.hasProviderKey
|
|
92
94
|
? "; automatic findings analysis is skipped without OPENAI_API_KEY"
|
|
@@ -110,12 +112,12 @@ export function firstRunGuidance(env) {
|
|
|
110
112
|
/** Lets init recognise its own section without rewriting a file someone else wrote. */
|
|
111
113
|
export const AGENTS_SECTION_MARKER = "<!-- humanish:agents-guide -->";
|
|
112
114
|
/**
|
|
113
|
-
* What the
|
|
115
|
+
* What the next coding agent needs to know about humanish in this project.
|
|
114
116
|
*
|
|
115
|
-
* AGENTS.md is the cross-vendor convention (agents.md) that Codex, Claude Code, Cursor and others
|
|
117
|
+
* `AGENTS.md` is the cross-vendor convention (agents.md) that Codex, Claude Code, Cursor and others
|
|
116
118
|
* read on arrival. Increasingly the thing that ran `humanish init` was itself an agent working for
|
|
117
119
|
* someone, and the agent that shows up tomorrow finds a `humanish/` directory with no idea what it
|
|
118
|
-
* is for. Deliberately
|
|
120
|
+
* is for. Deliberately short and command-first, because an agent acts on the commands it is given.
|
|
119
121
|
*/
|
|
120
122
|
export function agentsSection() {
|
|
121
123
|
return [
|
|
@@ -125,22 +127,22 @@ export function agentsSection() {
|
|
|
125
127
|
"This project uses humanish: synthetic participants use the product and leave evidence.",
|
|
126
128
|
"",
|
|
127
129
|
"```bash",
|
|
128
|
-
"humanish doctor --
|
|
129
|
-
"humanish
|
|
130
|
-
"humanish run first-run #
|
|
131
|
-
"humanish doctor --
|
|
130
|
+
"humanish doctor --study try-live # requirements for the selected participant and analysis",
|
|
131
|
+
"humanish study list --json # the studies in this project",
|
|
132
|
+
"humanish run first-run # dry run: no browser, model, keys, or spend",
|
|
133
|
+
"humanish doctor --study local-browser # local Docker/Firecracker + Codex-account readiness",
|
|
132
134
|
"humanish run local-browser # your loopback app; no E2B or model API key",
|
|
133
135
|
"humanish run try-live # demo app study: E2B plus the selected participant's authentication",
|
|
134
136
|
"humanish verify --run latest --json # is the evidence share-safe",
|
|
135
137
|
"```",
|
|
136
138
|
"",
|
|
137
|
-
"-
|
|
138
|
-
" this project's own app once you have seen a run work.",
|
|
139
|
-
"- Configure the local
|
|
139
|
+
"- Studies are declared in `humanish/studies/*.yaml`. Edit `try-live.yaml`'s `subject` to point",
|
|
140
|
+
" at this project's own app once you have seen a run work.",
|
|
141
|
+
"- Configure the local study without editing YAML: `humanish init --yes --local-browser",
|
|
140
142
|
' http://127.0.0.1:3000 --local-mission "Complete the primary flow"` on first setup.',
|
|
141
143
|
"- Evidence lands in gitignored `.humanish/runs/`. Never commit it, and never paste raw run",
|
|
142
|
-
" bundles into an issue
|
|
143
|
-
"- `humanish tui` is
|
|
144
|
+
" bundles into an issue; `humanish feedback issue` writes a redacted, share-safe draft.",
|
|
145
|
+
"- `humanish tui` is for people and refuses to run in an agent session. Use the `--json`",
|
|
144
146
|
" commands above instead, and tell the person you are working for that `humanish tui` exists.",
|
|
145
147
|
"- A live run spends money. `execution.caps.maxUsd` in each lab caps estimated model spend: the run",
|
|
146
148
|
" stops before its next request once the estimate passes it, so the last request can go over, and",
|
package/dist/cli/io.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
1
|
+
import { Command, Option } from "commander";
|
|
2
2
|
import { discoverProviderKeys } from "../keys/key-resolution.js";
|
|
3
3
|
import { type TelemetryProperties } from "./telemetry.js";
|
|
4
4
|
import type { RunResult } from "../run/results.js";
|
|
@@ -11,6 +11,12 @@ export interface CliIo {
|
|
|
11
11
|
keyDiscovery?: typeof discoverProviderKeys;
|
|
12
12
|
}
|
|
13
13
|
export declare const JSON_OPTION_DESCRIPTION = "Print a machine-readable JSON response.";
|
|
14
|
+
export declare const CWD_OPTION_DESCRIPTION = "Project directory.";
|
|
15
|
+
export declare const RUN_OPTION_DESCRIPTION = "Run id, or latest.";
|
|
16
|
+
export declare const ENV_FILE_OPTION_DESCRIPTION = "Load unset variables from this env file. Values are never printed or saved.";
|
|
17
|
+
export declare const PORT_OPTION_DESCRIPTION = "Port to listen on at 127.0.0.1.";
|
|
18
|
+
/** `--port` for a loopback server whose default, 0, lets the OS pick a free port. */
|
|
19
|
+
export declare function freePortOption(): Option;
|
|
14
20
|
export interface LabCommandOptions {
|
|
15
21
|
count?: string | undefined;
|
|
16
22
|
cwd: string;
|
|
@@ -18,14 +24,13 @@ export interface LabCommandOptions {
|
|
|
18
24
|
dryRun?: boolean | undefined;
|
|
19
25
|
envFile?: string | undefined;
|
|
20
26
|
json?: boolean | undefined;
|
|
21
|
-
lanes?: string | undefined;
|
|
22
27
|
open?: boolean | undefined;
|
|
28
|
+
participants?: string | undefined;
|
|
23
29
|
port?: string | undefined;
|
|
24
30
|
rerunFailedFrom?: string | undefined;
|
|
25
31
|
runId?: string | undefined;
|
|
26
|
-
/**
|
|
32
|
+
/** Repo-relative path to an adopter scorer module; overrides review.scorer.ref when set. */
|
|
27
33
|
scorer?: string | undefined;
|
|
28
|
-
sims?: string | undefined;
|
|
29
34
|
expose?: boolean | undefined;
|
|
30
35
|
tunnel?: "ngrok" | undefined;
|
|
31
36
|
tunnelDomain?: string | undefined;
|
|
@@ -49,7 +54,7 @@ export declare function applyEnvFileOption(args: {
|
|
|
49
54
|
discoverKeys?: boolean;
|
|
50
55
|
}): Promise<boolean>;
|
|
51
56
|
/**
|
|
52
|
-
* Provider-key discovery
|
|
57
|
+
* Provider-key discovery: fill still-missing keys from the documented project overlay, the
|
|
53
58
|
* owning vendors' native stores, and the humanish user store. It is fill-only (an explicit
|
|
54
59
|
* --env-file or process env always wins), and each fill is announced by name and source on
|
|
55
60
|
* stderr, never by value. HUMANISH_STRICT_KEYS=1 restores env-only behavior.
|
|
@@ -59,14 +64,41 @@ export declare function discoverCliKeys(args: {
|
|
|
59
64
|
cwd: string;
|
|
60
65
|
env?: NodeJS.ProcessEnv;
|
|
61
66
|
onDiscovered?: (names: string[]) => void;
|
|
67
|
+
/** Announce only the fills of these names; every key is still filled. Undefined announces all. */
|
|
68
|
+
announced?: ReadonlySet<string>;
|
|
62
69
|
}): Promise<void>;
|
|
63
70
|
export declare function parseLabCount(value: string | undefined, fallback: number): number | null;
|
|
64
71
|
export declare function parseParticipantIds(value: string | undefined): string[];
|
|
65
|
-
|
|
66
|
-
export
|
|
72
|
+
/** An error as a result carries it. A result with only a message, such as keys or comms, has no code. */
|
|
73
|
+
export interface CliError {
|
|
74
|
+
code?: string;
|
|
75
|
+
message: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* What a human formatter prints: text for stdout, or stdout lines plus an error that writeResult
|
|
79
|
+
* prints on stderr through formatCliError. --json output never goes through it.
|
|
80
|
+
*/
|
|
81
|
+
export type HumanOutput = string | {
|
|
82
|
+
stdout?: string;
|
|
83
|
+
error?: CliError | undefined;
|
|
84
|
+
};
|
|
85
|
+
/** `<command> failed: <message>`, then `code: <CODE>`, then `next: <command>` when one is known. */
|
|
86
|
+
export declare function formatCliError(command: string, error: CliError): string;
|
|
87
|
+
/** A result whose human output is its message: stdout when it passed, stderr when it failed. */
|
|
88
|
+
export declare function messageOutput(value: {
|
|
89
|
+
ok: boolean;
|
|
90
|
+
message: string;
|
|
91
|
+
}): HumanOutput;
|
|
92
|
+
/** A failed result's human output: its error on stderr and nothing on stdout. */
|
|
93
|
+
export declare function humanError(error: CliError | undefined): HumanOutput;
|
|
94
|
+
/** Prints a human formatter's output: text to stdout, an error to stderr through formatCliError. */
|
|
95
|
+
export declare function writeHuman(command: Command, io: CliIo, human: HumanOutput): void;
|
|
96
|
+
export declare function writeResult<T>(command: Command, io: CliIo, result: T, formatHuman: (result: T) => HumanOutput): void;
|
|
97
|
+
export declare function noteRunFacts(command: Command, facts: TelemetryProperties): void;
|
|
67
98
|
/** Exported for tests: the facts writeResult read off a command's result document. */
|
|
68
|
-
export declare function
|
|
69
|
-
|
|
99
|
+
export declare function runFactsFor(command: Command): TelemetryProperties;
|
|
100
|
+
/** A run result, or the preview route's study result: they differ only in `schema`. */
|
|
101
|
+
export declare function formatRunHuman(result: Omit<RunResult, "schema">): HumanOutput;
|
|
70
102
|
export declare function parsePositiveInteger(value: string): number | null;
|
|
71
103
|
export declare function parseTimeoutMs(value: string): number | null;
|
|
72
104
|
export declare function parseObserverPort(value: string): number | null;
|
|
@@ -80,6 +112,10 @@ export declare function candidateOption(options: {
|
|
|
80
112
|
analysis?: string;
|
|
81
113
|
finding?: string;
|
|
82
114
|
};
|
|
83
|
-
export declare function collectRepeated(value: string, previous
|
|
115
|
+
export declare function collectRepeated(value: string, previous?: string[]): string[];
|
|
84
116
|
export declare function wantsJson(command: Command): boolean;
|
|
117
|
+
export declare function analysisOutcomeText(analysis: {
|
|
118
|
+
state: string;
|
|
119
|
+
reason: string | null;
|
|
120
|
+
}): string;
|
|
85
121
|
export declare function automaticAnalysisEnvelope<T>(result: T): T;
|