humanish 0.107.0 → 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 +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- 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-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 +8 -6
- 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 +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- 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 +14 -12
- package/dist/actors/computer-use/loop/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- 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 +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- 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 +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- 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 +78 -43
- 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/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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- 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.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- 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 +147 -108
- 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 +137 -138
- 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 +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -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 +41 -6
- package/dist/cli/io.js +97 -22
- 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 +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- 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 +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- 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/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 +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 +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- 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 +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- 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 +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- 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 +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- 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 +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 +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +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 +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- 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 +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- 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.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- 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 +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- 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 +5 -4
- package/dist/run/run.js +1 -1
- 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 +36 -35
- 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 +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- 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/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- 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 +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- 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 +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- 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 +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- 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/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- 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 +82 -82
- 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 +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- 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 +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- 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 +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- 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/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/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 +60 -58
- 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.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/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- 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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { loadAdapterScorer } from "../../lab/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,65 @@
|
|
|
1
|
+
import { migrateStudies } from "../../study/migrate.js";
|
|
2
|
+
import { CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
|
|
3
|
+
function formatValue(value) {
|
|
4
|
+
const text = JSON.stringify(value);
|
|
5
|
+
return text.length > 80 ? `${text.slice(0, 77)}...` : text;
|
|
6
|
+
}
|
|
7
|
+
/** Each file's source, destination, moved keys and dropped keys, printed before any write. */
|
|
8
|
+
function formatMigratePlan(files) {
|
|
9
|
+
const lines = [];
|
|
10
|
+
for (const file of files) {
|
|
11
|
+
if (file.action === "skip") {
|
|
12
|
+
lines.push(`${file.source}: already humanish.study.v3, skipped`);
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const where = file.action === "move" ? `-> ${file.destination}` : "(rewritten in place)";
|
|
16
|
+
lines.push(`${file.source} ${where} (route: ${file.route})`);
|
|
17
|
+
if (file.moved.length > 0)
|
|
18
|
+
lines.push(` moved: ${file.moved.map((key) => `${key.from} -> ${key.to}`).join(", ")}`);
|
|
19
|
+
for (const key of file.dropped) {
|
|
20
|
+
lines.push(` dropped ${key.path}: ${formatValue(key.value)} (the ${file.route} route never reads it)`);
|
|
21
|
+
if (key.comments)
|
|
22
|
+
lines.push(` its comment: ${key.comments.replace(/\n/g, " ")}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return lines.length > 0 ? `${lines.join("\n")}\n` : "No study files to convert.\n";
|
|
26
|
+
}
|
|
27
|
+
function formatMigrateOutcome(result) {
|
|
28
|
+
if (result.error) {
|
|
29
|
+
const where = result.error.file ? ` ${result.error.file}` : "";
|
|
30
|
+
return `${result.error.code} (${result.error.phase})${where}: ${result.error.message}\n`;
|
|
31
|
+
}
|
|
32
|
+
const written = result.files.filter((file) => file.action !== "skip").length;
|
|
33
|
+
const files = written === 1 ? "1 study file" : `${written} study files`;
|
|
34
|
+
if (result.dryRun)
|
|
35
|
+
return `Dry run: nothing was written. ${files} would change.\n`;
|
|
36
|
+
return written === 0 ? "No v2 study files to convert.\n" : `Converted ${files}.\n`;
|
|
37
|
+
}
|
|
38
|
+
/** `humanish migrate`. */
|
|
39
|
+
export function registerMigrateCommand(parent, io) {
|
|
40
|
+
parent
|
|
41
|
+
.command("migrate")
|
|
42
|
+
.description("Convert humanish.lab.v2 study files to humanish.study.v3. A file under a labs/ directory moves to the matching studies/ directory; any other file is rewritten in place. An original that a failure leaves out of place is kept as <name>.v2.bak. Pass the files to convert; without any, the six study directories are scanned. Every destination, moved key and dropped key is printed before anything is written. A file that changes during the run is kept and listed.")
|
|
43
|
+
.summary("Convert v2 study files to v3.")
|
|
44
|
+
// The paths are read from the command's arguments without a declared argument, so the root
|
|
45
|
+
// --help row stays `migrate [options]` and fits its column; this command's own help shows them.
|
|
46
|
+
.usage("[options] [path...]")
|
|
47
|
+
.allowExcessArguments(true)
|
|
48
|
+
.option("--dry-run", "Print what would change and write nothing.")
|
|
49
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
50
|
+
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
51
|
+
.action(async (options, command) => {
|
|
52
|
+
const paths = command.args;
|
|
53
|
+
const json = wantsJson(command);
|
|
54
|
+
const result = await migrateStudies({
|
|
55
|
+
cwd: options.cwd,
|
|
56
|
+
paths,
|
|
57
|
+
dryRun: options.dryRun === true,
|
|
58
|
+
// The plan is printed before anything is written; with --json it goes to stderr, so stdout
|
|
59
|
+
// stays one JSON document.
|
|
60
|
+
onPlan: (files) => (json ? io.writeErr : io.writeOut)(formatMigratePlan(files)),
|
|
61
|
+
});
|
|
62
|
+
writeResult(command, io, result, formatMigrateOutcome);
|
|
63
|
+
io.setExitCode(result.ok ? 0 : 2);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
@@ -3,19 +3,21 @@ import { openTarget, renderObserver, serveObserver } from "../../observer/render
|
|
|
3
3
|
import { SERVE_SCHEMA, serveObserverLibrary } from "../../observer/serve.js";
|
|
4
4
|
import { startExposedObserver, validateExposure } from "../../observer/exposure.js";
|
|
5
5
|
import { ServeTunnelError } from "../../observer/tunnel.js";
|
|
6
|
-
import {
|
|
6
|
+
import { deprecationMessage, warnAndQueue } from "../deprecations.js";
|
|
7
|
+
import { collectRepeated, CWD_OPTION_DESCRIPTION, formatRunHuman, freePortOption, JSON_OPTION_DESCRIPTION, parseObserverPort, RUN_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
|
|
7
8
|
import { exitCodeForSignal, formatObserverHuman, } from "../observer-follow.js";
|
|
8
9
|
export function registerObserveCommand(parent, io) {
|
|
9
|
-
parent
|
|
10
|
+
addLibraryOptions(parent
|
|
10
11
|
.command("observe")
|
|
11
|
-
.description("
|
|
12
|
-
.summary("
|
|
13
|
-
.option("--run <id>",
|
|
14
|
-
.option("--
|
|
15
|
-
.
|
|
16
|
-
.option("--
|
|
12
|
+
.description("Open a saved run in the Observer, served on http://127.0.0.1; without --run, the latest. With --all, serve the run library, opening on --run when given.")
|
|
13
|
+
.summary("Open a saved run in the Observer.")
|
|
14
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION)
|
|
15
|
+
.option("--all", "Serve the whole run library, with optional tunnel-edge exposure.")
|
|
16
|
+
.addOption(freePortOption())
|
|
17
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
18
|
+
.option("--open", "Open the Observer in the default browser.")
|
|
17
19
|
.option("--no-open", "Serve without opening a browser.")
|
|
18
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
20
|
+
.option("--json", JSON_OPTION_DESCRIPTION))
|
|
19
21
|
.addHelpText("after", [
|
|
20
22
|
"",
|
|
21
23
|
"Examples:",
|
|
@@ -23,62 +25,128 @@ export function registerObserveCommand(parent, io) {
|
|
|
23
25
|
" humanish observe --run latest",
|
|
24
26
|
" humanish observe --run <runId> --port 8732",
|
|
25
27
|
" humanish observe --no-open --json",
|
|
28
|
+
" humanish observe --all",
|
|
29
|
+
" humanish observe --all --expose --tunnel ngrok --oauth google --allow-email you@example.com",
|
|
30
|
+
" humanish observe --all --safe --expose --tunnel ngrok",
|
|
31
|
+
" humanish observe --all --expose --public-url https://observer.example.com",
|
|
26
32
|
"",
|
|
27
|
-
"The server binds 127.0.0.1 only
|
|
28
|
-
"It stays attached until Ctrl-C; file:// security policy and live
|
|
29
|
-
"loopback http is preferred over opening the index.html path directly.",
|
|
33
|
+
"The server binds 127.0.0.1 only. One run exposes just that run's bundle directory; --all",
|
|
34
|
+
"serves the run library. It stays attached until Ctrl-C; file:// security policy and live",
|
|
35
|
+
"refresh are why loopback http is preferred over opening the index.html path directly.",
|
|
36
|
+
"",
|
|
37
|
+
"--safe, --expose, --tunnel, --tunnel-domain, --oauth, --allow-email, --allow-domain and",
|
|
38
|
+
"--public-url need --all. Exposure only ever happens through an authenticated edge (ngrok",
|
|
39
|
+
"--oauth google, or an operator --public-url you secure) forwarding to the loopback port;",
|
|
40
|
+
"the server carries no in-process auth. Live desktop stream URLs are never served; remote",
|
|
41
|
+
"viewers see persisted evidence only. --safe composes with any exposure.",
|
|
30
42
|
].join("\n"))
|
|
31
|
-
.action(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
43
|
+
.action((options, command) => handleObserve(io, options, command));
|
|
44
|
+
}
|
|
45
|
+
/** The run library's flags, on `observe --all` and the hidden `serve` alias. */
|
|
46
|
+
function addLibraryOptions(command) {
|
|
47
|
+
return command
|
|
48
|
+
.option("--safe", "Serve only runs whose verify shareSafety is share_ready; other runs are not served at all.")
|
|
49
|
+
.option("--expose", "Share the library beyond this machine. Requires --oauth or --public-url, or --safe.")
|
|
50
|
+
.addOption(new Option("--tunnel <provider>", "Spawn the external tunnel binary against the loopback port.").choices(["ngrok"]))
|
|
51
|
+
.option("--tunnel-domain <domain>", "Reserved domain passed to ngrok as --url (e.g. observer.example.com). Requires --tunnel.")
|
|
52
|
+
.addOption(new Option("--oauth <provider>", "Turn on ngrok edge OAuth. Requires --tunnel.").choices([
|
|
53
|
+
"google",
|
|
54
|
+
]))
|
|
55
|
+
.option("--allow-email <addr>", "Edge OAuth allow rule: permit this email. Repeatable. Requires --oauth.", collectRepeated)
|
|
56
|
+
.option("--allow-domain <domain>", "Edge OAuth allow rule: permit this domain. Repeatable. Requires --oauth.", collectRepeated)
|
|
57
|
+
.option("--public-url <origin>", "Bring-your-own authed edge (e.g. https://observer.example.com). Requires --expose; never affects binding.");
|
|
58
|
+
}
|
|
59
|
+
/** The library flags set on a one-run observe, as typed on the command line. */
|
|
60
|
+
function libraryOnlyFlags(options) {
|
|
61
|
+
return [
|
|
62
|
+
options.safe === true ? ["--safe"] : [],
|
|
63
|
+
options.expose === true ? ["--expose"] : [],
|
|
64
|
+
options.tunnel === undefined ? [] : ["--tunnel"],
|
|
65
|
+
options.tunnelDomain === undefined ? [] : ["--tunnel-domain"],
|
|
66
|
+
options.oauth === undefined ? [] : ["--oauth"],
|
|
67
|
+
(options.allowEmail?.length ?? 0) === 0 ? [] : ["--allow-email"],
|
|
68
|
+
(options.allowDomain?.length ?? 0) === 0 ? [] : ["--allow-domain"],
|
|
69
|
+
options.publicUrl === undefined ? [] : ["--public-url"],
|
|
70
|
+
].flat();
|
|
71
|
+
}
|
|
72
|
+
function refuseObserve(command, io, cwd, error) {
|
|
73
|
+
const result = {
|
|
74
|
+
schema: "humanish.run-result.v1",
|
|
75
|
+
ok: false,
|
|
76
|
+
cwd,
|
|
77
|
+
warnings: [],
|
|
78
|
+
...(error === undefined ? {} : { error }),
|
|
79
|
+
};
|
|
80
|
+
writeResult(command, io, result, formatRunHuman);
|
|
81
|
+
io.setExitCode(2);
|
|
82
|
+
}
|
|
83
|
+
/** `observe` shows one run (default latest); `observe --all` serves the run library. */
|
|
84
|
+
async function handleObserve(io, options, command) {
|
|
85
|
+
if (options.all === true) {
|
|
86
|
+
await handleServe(io, options, command);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const libraryOnly = libraryOnlyFlags(options);
|
|
90
|
+
if (libraryOnly.length > 0) {
|
|
91
|
+
refuseObserve(command, io, options.cwd, {
|
|
92
|
+
code: "HUMANISH_OBSERVE_OPTION_CONFLICT",
|
|
93
|
+
message: `${libraryOnly.join(", ")} ${libraryOnly.length === 1 ? "needs" : "need"} --all: humanish observe --all ${libraryOnly.join(" ")}.`,
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
await observeRun(io, { ...options, run: options.run ?? "latest" }, command);
|
|
98
|
+
}
|
|
99
|
+
/** One run's Observer over loopback, until a signal stops it. */
|
|
100
|
+
async function observeRun(io, options, command) {
|
|
101
|
+
const port = parseObserverPort(options.port);
|
|
102
|
+
if (port === null) {
|
|
66
103
|
const result = {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
...(openResult.warning ? [openResult.warning] : []),
|
|
76
|
-
],
|
|
104
|
+
schema: "humanish.run-result.v1",
|
|
105
|
+
ok: false,
|
|
106
|
+
cwd: options.cwd,
|
|
107
|
+
warnings: [],
|
|
108
|
+
error: {
|
|
109
|
+
code: "HUMANISH_INVALID_PORT",
|
|
110
|
+
message: "--port must be an integer between 0 and 65535.",
|
|
111
|
+
},
|
|
77
112
|
};
|
|
78
|
-
writeResult(command, io, result,
|
|
79
|
-
io.setExitCode(
|
|
80
|
-
|
|
81
|
-
}
|
|
113
|
+
writeResult(command, io, result, formatRunHuman);
|
|
114
|
+
io.setExitCode(2);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const rendered = await renderObserver(options.cwd, options.run, { open: false });
|
|
118
|
+
if (!rendered.ok || !rendered.observerPath) {
|
|
119
|
+
writeResult(command, io, rendered, formatObserverHuman);
|
|
120
|
+
io.setExitCode(2);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Reuse the contained current-data projection, scoped to this run. A raw static
|
|
124
|
+
// server would miss runtime status and could replay stored iframe grants.
|
|
125
|
+
const wantsMachine = wantsJson(command);
|
|
126
|
+
const shouldOpen = options.open === false
|
|
127
|
+
? false
|
|
128
|
+
: options.open === true
|
|
129
|
+
? true
|
|
130
|
+
: !wantsMachine && process.stdout.isTTY === true;
|
|
131
|
+
const server = await serveObserver(rendered, { open: false, port, scope: "run" });
|
|
132
|
+
const openResult = shouldOpen
|
|
133
|
+
? openTarget(server.url)
|
|
134
|
+
: { opened: false };
|
|
135
|
+
const result = {
|
|
136
|
+
...rendered,
|
|
137
|
+
observerUrl: server.url,
|
|
138
|
+
serverUrl: server.url,
|
|
139
|
+
opened: openResult.opened,
|
|
140
|
+
...(openResult.command ? { openCommand: openResult.command } : {}),
|
|
141
|
+
warnings: [
|
|
142
|
+
...rendered.warnings,
|
|
143
|
+
"Observer is served read-only over loopback http on 127.0.0.1; only this run's bundle directory is exposed.",
|
|
144
|
+
...(openResult.warning ? [openResult.warning] : []),
|
|
145
|
+
],
|
|
146
|
+
};
|
|
147
|
+
writeResult(command, io, result, formatObserverHuman);
|
|
148
|
+
io.setExitCode(0);
|
|
149
|
+
await serveObserveUntilSignal(io, server, { json: wantsMachine });
|
|
82
150
|
}
|
|
83
151
|
async function serveObserveUntilSignal(io, server, options) {
|
|
84
152
|
// Keep the JSON envelope on stdout clean: route attach/stop chatter to stderr
|
|
@@ -117,45 +185,19 @@ async function serveObserveUntilSignal(io, server, options) {
|
|
|
117
185
|
}
|
|
118
186
|
});
|
|
119
187
|
}
|
|
188
|
+
// Removed in 0.109.0: `serve` stays one minor as a hidden alias of `observe --all`.
|
|
120
189
|
export function registerServeCommand(parent, io) {
|
|
121
|
-
parent
|
|
122
|
-
.command("serve")
|
|
123
|
-
.
|
|
124
|
-
.
|
|
125
|
-
.option("--
|
|
126
|
-
.option("--port <port>", "Loopback port to bind on 127.0.0.1. Defaults to an ephemeral port.", "0")
|
|
127
|
-
.option("--run <id>", "Land on this run id (or latest) instead of the library index.")
|
|
128
|
-
.option("--safe", "Serve only runs whose verify shareSafety is share_ready; everything else is absent (fail-closed).")
|
|
129
|
-
.option("--expose", "Declare exposure intent. Requires edge auth (--oauth or --public-url) OR --safe.")
|
|
130
|
-
.addOption(new Option("--tunnel <provider>", "Spawn the external tunnel binary against the loopback port.").choices(["ngrok"]))
|
|
131
|
-
.option("--tunnel-domain <domain>", "Reserved domain passed to ngrok as --url (e.g. observer.example.com). Requires --tunnel.")
|
|
132
|
-
.addOption(new Option("--oauth <provider>", "Turn on ngrok edge OAuth. Requires --tunnel.").choices([
|
|
133
|
-
"google",
|
|
134
|
-
]))
|
|
135
|
-
.option("--allow-email <addr>", "Edge OAuth allow rule: permit this email. Repeatable. Requires --oauth.", collectRepeated, [])
|
|
136
|
-
.option("--allow-domain <domain>", "Edge OAuth allow rule: permit this domain. Repeatable. Requires --oauth.", collectRepeated, [])
|
|
137
|
-
.option("--public-url <origin>", "Bring-your-own authed edge (e.g. https://observer.example.com). Requires --expose; never affects binding.")
|
|
190
|
+
addLibraryOptions(parent
|
|
191
|
+
.command("serve", { hidden: true })
|
|
192
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
193
|
+
.addOption(freePortOption())
|
|
194
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION)
|
|
138
195
|
.option("--open", "Open the library in the default browser.")
|
|
139
196
|
.option("--no-open", "Serve without opening a browser.")
|
|
140
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
" humanish serve",
|
|
145
|
-
" humanish serve --expose --tunnel ngrok --oauth google --allow-email you@example.com",
|
|
146
|
-
" humanish serve --safe --expose --tunnel ngrok",
|
|
147
|
-
" humanish serve --expose --public-url https://observer.example.com",
|
|
148
|
-
"",
|
|
149
|
-
"Agent/CI path:",
|
|
150
|
-
" humanish serve --json --no-open",
|
|
151
|
-
"",
|
|
152
|
-
"The server always binds 127.0.0.1; exposure only ever happens through an authenticated",
|
|
153
|
-
"edge (ngrok --oauth google, or an operator --public-url you secure) forwarding to the",
|
|
154
|
-
"loopback port. The server carries no in-process auth; the gate lives at the edge. Live",
|
|
155
|
-
"desktop stream URLs are never served here; remote viewers see persisted evidence only.",
|
|
156
|
-
"--safe composes with any exposure for defense in depth.",
|
|
157
|
-
].join("\n"))
|
|
158
|
-
.action((options, command) => handleServe(io, options, command));
|
|
197
|
+
.option("--json", JSON_OPTION_DESCRIPTION)).action((options, command) => {
|
|
198
|
+
warnAndQueue(command, io, deprecationMessage("humanish serve", "humanish observe --all"));
|
|
199
|
+
return handleServe(io, options, command);
|
|
200
|
+
});
|
|
159
201
|
}
|
|
160
202
|
async function handleServe(io, options, command) {
|
|
161
203
|
const fail = (code, message) => refuseServe(command, io, options, code, message);
|
|
@@ -171,8 +213,8 @@ async function handleServe(io, options, command) {
|
|
|
171
213
|
...(options.tunnel === undefined ? {} : { tunnel: options.tunnel }),
|
|
172
214
|
...(options.tunnelDomain === undefined ? {} : { tunnelDomain: options.tunnelDomain }),
|
|
173
215
|
...(options.oauth === undefined ? {} : { oauth: options.oauth }),
|
|
174
|
-
allowEmails: options.allowEmail,
|
|
175
|
-
allowDomains: options.allowDomain,
|
|
216
|
+
allowEmails: options.allowEmail ?? [],
|
|
217
|
+
allowDomains: options.allowDomain ?? [],
|
|
176
218
|
...(options.publicUrl === undefined ? {} : { publicUrl: options.publicUrl }),
|
|
177
219
|
safe: options.safe === true,
|
|
178
220
|
});
|
|
@@ -257,7 +299,7 @@ async function reportServe(io, command, options, server, plan, edge) {
|
|
|
257
299
|
...serveExposureWarnings(server, options.safe === true, publicUrl),
|
|
258
300
|
];
|
|
259
301
|
// Auto-open is suppressed under --expose so the public URL is not shoved into a local opener's
|
|
260
|
-
// argv unasked
|
|
302
|
+
// argv unasked; the exposure target is a remote device anyway. Explicit --open still honors
|
|
261
303
|
// intent and opens the loopback library.
|
|
262
304
|
const shouldOpen = options.open === false
|
|
263
305
|
? false
|
|
@@ -326,21 +368,18 @@ function hiddenRunLines(groups) {
|
|
|
326
368
|
lines.push(` ${runs(group.runs)} ${group.status}${reasons}`);
|
|
327
369
|
}
|
|
328
370
|
if (groups.some((group) => group.reasons.join(",") === "RAW_SCREENSHOTS"))
|
|
329
|
-
lines.push("share: a run held back only for RAW_SCREENSHOTS can be copied with blurred screenshots: `humanish export --run <id> --format bundle --redact-screenshots --out <dir>`, then `humanish
|
|
371
|
+
lines.push("share: a run held back only for RAW_SCREENSHOTS can be copied with blurred screenshots: `humanish export --run <id> --format bundle --redact-screenshots --out <dir>`, then `humanish observe --all --safe --cwd <dir>`");
|
|
330
372
|
lines.push("why: `humanish verify --run <id>` explains each reason");
|
|
331
373
|
return lines;
|
|
332
374
|
}
|
|
333
375
|
function formatServeHuman(result) {
|
|
334
376
|
if (!result.ok) {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
...(result.error ? [`error: ${result.error.code} ${result.error.message}`] : []),
|
|
338
|
-
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
339
|
-
].join("\n") + "\n");
|
|
377
|
+
const warnings = result.warnings.map((warning) => `warning: ${warning}\n`).join("");
|
|
378
|
+
return { ...(warnings ? { stdout: warnings } : {}), error: result.error };
|
|
340
379
|
}
|
|
341
380
|
const modeSuffix = result.safe ? " (share_ready only)" : "";
|
|
342
381
|
const lines = [
|
|
343
|
-
"humanish
|
|
382
|
+
"humanish observe --all",
|
|
344
383
|
`mode: ${result.mode}${modeSuffix}`,
|
|
345
384
|
`library: ${result.url ?? ""}`,
|
|
346
385
|
`runs: ${result.runsListed}`,
|
|
@@ -354,7 +393,7 @@ function formatServeHuman(result) {
|
|
|
354
393
|
}
|
|
355
394
|
if (result.oauth) {
|
|
356
395
|
const rules = [...result.oauth.allowEmails, ...result.oauth.allowDomains];
|
|
357
|
-
lines.push(`edge auth: ${result.oauth.provider} oauth${rules.length > 0 ? ` (allow: ${rules.join(", ")})` : " (no allow rule
|
|
396
|
+
lines.push(`edge auth: ${result.oauth.provider} oauth${rules.length > 0 ? ` (allow: ${rules.join(", ")})` : " (no allow rule: any Google account can sign in)"}`);
|
|
358
397
|
}
|
|
359
398
|
if (result.entryRunId) {
|
|
360
399
|
lines.push(`entry: ${result.entryRunId}`);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type CliIo, type LabCommandOptions as RunOptions } from "../io.js";
|
|
3
|
+
/** The parsed flags of `run`, `watch` and the `lab run` alias. */
|
|
4
|
+
export type { RunOptions };
|
|
5
|
+
/** The flags a run takes, whichever command starts it. */
|
|
6
|
+
export declare function addRunOptions(command: Command): Command;
|
|
7
|
+
/** The flags that only a study file can use, as typed on the command line, when they are set. */
|
|
8
|
+
export declare function studyOnlyFlags(options: RunOptions): string[];
|
|
9
|
+
/** `humanish run [study]`: the named study, or the synthetic preview when no study is given. */
|
|
10
|
+
export declare function handleRun(io: CliIo, named: string | undefined, options: RunOptions, command: Command): Promise<void>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { runDryRun } from "../../run/dry-run.js";
|
|
2
|
+
import { runLabCommand } from "./lab-run.js";
|
|
3
|
+
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, formatRunHuman, freePortOption, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, } from "../io.js";
|
|
4
|
+
/** The flags a run takes, whichever command starts it. */
|
|
5
|
+
export function addRunOptions(command) {
|
|
6
|
+
return command
|
|
7
|
+
.option("--dry-run", "Do a dry run: a synthetic run with no browser, keys or provider spend.")
|
|
8
|
+
.option("--open", "Open the Observer in the default browser.")
|
|
9
|
+
.option("--no-open", "Render without opening a browser.")
|
|
10
|
+
.option("--detach", "Render/open once and exit without an attached watch server.")
|
|
11
|
+
.addOption(freePortOption())
|
|
12
|
+
.option("--count <count>", "Override the participant count of a preview or computer-use study, or of the synthetic run without a study.")
|
|
13
|
+
.option("--rerun-failed-from <run>", "Computer-use studies only: start a new run for the failed participants of a prior run.")
|
|
14
|
+
.option("--participants <ids>", "With --rerun-failed-from: comma-separated ids of the participants to rerun. The study's participants decide who takes part; ids are their id, or lane-01, lane-02, … by position.")
|
|
15
|
+
.option("--scorer <path>", "Score with this .mjs module, a path inside the repo, in place of review.scorer.ref. It runs as code, so review it first. Terminal, computer-use and shared-world studies only.")
|
|
16
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
17
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
18
|
+
.option("--run-id <id>", "Explicit run id for deterministic fixture tests; refused when that run already exists.")
|
|
19
|
+
.option("--json", JSON_OPTION_DESCRIPTION);
|
|
20
|
+
}
|
|
21
|
+
/** The flags that only a study file can use, as typed on the command line, when they are set. */
|
|
22
|
+
export function studyOnlyFlags(options) {
|
|
23
|
+
return [
|
|
24
|
+
options.scorer === undefined ? [] : ["--scorer"],
|
|
25
|
+
options.rerunFailedFrom === undefined ? [] : ["--rerun-failed-from"],
|
|
26
|
+
options.participants === undefined ? [] : ["--participants"],
|
|
27
|
+
].flat();
|
|
28
|
+
}
|
|
29
|
+
function refuseRun(command, io, cwd, error) {
|
|
30
|
+
const result = {
|
|
31
|
+
schema: "humanish.run-result.v1",
|
|
32
|
+
ok: false,
|
|
33
|
+
cwd,
|
|
34
|
+
warnings: [],
|
|
35
|
+
...(error === undefined ? {} : { error }),
|
|
36
|
+
};
|
|
37
|
+
writeResult(command, io, result, formatRunHuman);
|
|
38
|
+
io.setExitCode(2);
|
|
39
|
+
}
|
|
40
|
+
/** `humanish run [study]`: the named study, or the synthetic preview when no study is given. */
|
|
41
|
+
export async function handleRun(io, named, options, command) {
|
|
42
|
+
// An empty argument, as from a script passing an unset variable, is the synthetic run.
|
|
43
|
+
const study = named === "" ? undefined : named;
|
|
44
|
+
const studyOnly = studyOnlyFlags(options);
|
|
45
|
+
if (study === undefined && studyOnly.length > 0) {
|
|
46
|
+
refuseRun(command, io, options.cwd, {
|
|
47
|
+
code: "HUMANISH_RUN_OPTION_CONFLICT",
|
|
48
|
+
message: `${studyOnly.join(", ")} ${studyOnly.length === 1 ? "needs" : "need"} a study: humanish run <study>.`,
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const loaded = await applyEnvFileOption({
|
|
53
|
+
command,
|
|
54
|
+
cwd: options.cwd,
|
|
55
|
+
envFile: options.envFile,
|
|
56
|
+
io,
|
|
57
|
+
// runLabCommand discovers keys for a live lab; the lab-less preview needs none.
|
|
58
|
+
discoverKeys: false,
|
|
59
|
+
});
|
|
60
|
+
if (!loaded)
|
|
61
|
+
return;
|
|
62
|
+
if (study !== undefined) {
|
|
63
|
+
await runLabCommand({ command, io, lab: study, mode: "run", options });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const participantCount = options.count === undefined ? undefined : parsePositiveInteger(options.count);
|
|
67
|
+
if (participantCount === null) {
|
|
68
|
+
refuseRun(command, io, options.cwd, {
|
|
69
|
+
code: "HUMANISH_INVALID_PARTICIPANT_COUNT",
|
|
70
|
+
message: "--count must be a positive integer.",
|
|
71
|
+
});
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const result = await runDryRun({
|
|
75
|
+
cwd: options.cwd,
|
|
76
|
+
...(options.dryRun === undefined ? {} : { dryRun: options.dryRun }),
|
|
77
|
+
...(options.runId === undefined ? {} : { runId: options.runId }),
|
|
78
|
+
...(participantCount === undefined ? {} : { participantCount }),
|
|
79
|
+
// Rendered the way `watch` renders it, so a bundle is the same bundle whichever command
|
|
80
|
+
// produced it. A render failure is a warning on the result.
|
|
81
|
+
observer: { open: false },
|
|
82
|
+
});
|
|
83
|
+
writeResult(command, io, result, formatRunHuman);
|
|
84
|
+
io.setExitCode(result.ok ? 0 : 2);
|
|
85
|
+
}
|