humanish 0.107.0 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
|
@@ -3,19 +3,20 @@ 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 { collectRepeated, formatRunHuman, JSON_OPTION_DESCRIPTION, parseObserverPort, wantsJson, writeResult, } from "../io.js";
|
|
6
|
+
import { collectRepeated, CWD_OPTION_DESCRIPTION, formatRunHuman, freePortOption, JSON_OPTION_DESCRIPTION, parseObserverPort, RUN_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
|
|
7
7
|
import { exitCodeForSignal, formatObserverHuman, } from "../observer-follow.js";
|
|
8
8
|
export function registerObserveCommand(parent, io) {
|
|
9
|
-
parent
|
|
9
|
+
addLibraryOptions(parent
|
|
10
10
|
.command("observe")
|
|
11
|
-
.description("
|
|
12
|
-
.summary("
|
|
13
|
-
.option("--run <id>",
|
|
14
|
-
.option("--
|
|
15
|
-
.
|
|
16
|
-
.option("--
|
|
11
|
+
.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.")
|
|
12
|
+
.summary("Open a saved run in the Observer.")
|
|
13
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION)
|
|
14
|
+
.option("--all", "Serve the whole run library, with optional tunnel-edge exposure.")
|
|
15
|
+
.addOption(freePortOption())
|
|
16
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
17
|
+
.option("--open", "Open the Observer in the default browser.")
|
|
17
18
|
.option("--no-open", "Serve without opening a browser.")
|
|
18
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
19
|
+
.option("--json", JSON_OPTION_DESCRIPTION))
|
|
19
20
|
.addHelpText("after", [
|
|
20
21
|
"",
|
|
21
22
|
"Examples:",
|
|
@@ -23,62 +24,128 @@ export function registerObserveCommand(parent, io) {
|
|
|
23
24
|
" humanish observe --run latest",
|
|
24
25
|
" humanish observe --run <runId> --port 8732",
|
|
25
26
|
" humanish observe --no-open --json",
|
|
27
|
+
" humanish observe --all",
|
|
28
|
+
" humanish observe --all --expose --tunnel ngrok --oauth google --allow-email you@example.com",
|
|
29
|
+
" humanish observe --all --safe --expose --tunnel ngrok",
|
|
30
|
+
" humanish observe --all --expose --public-url https://observer.example.com",
|
|
26
31
|
"",
|
|
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.",
|
|
32
|
+
"The server binds 127.0.0.1 only. One run exposes just that run's bundle directory; --all",
|
|
33
|
+
"serves the run library. It stays attached until Ctrl-C; file:// security policy and live",
|
|
34
|
+
"refresh are why loopback http is preferred over opening the index.html path directly.",
|
|
35
|
+
"",
|
|
36
|
+
"--safe, --expose, --tunnel, --tunnel-domain, --oauth, --allow-email, --allow-domain and",
|
|
37
|
+
"--public-url need --all. Exposure only ever happens through an authenticated edge (ngrok",
|
|
38
|
+
"--oauth google, or an operator --public-url you secure) forwarding to the loopback port;",
|
|
39
|
+
"the server carries no in-process auth. Live desktop stream URLs are never served; remote",
|
|
40
|
+
"viewers see persisted evidence only. --safe composes with any exposure.",
|
|
30
41
|
].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
|
-
|
|
42
|
+
.action((options, command) => handleObserve(io, options, command));
|
|
43
|
+
}
|
|
44
|
+
/** The run library's flags, on `observe --all` and the hidden `serve` alias. */
|
|
45
|
+
function addLibraryOptions(command) {
|
|
46
|
+
return command
|
|
47
|
+
.option("--safe", "Serve only runs whose verify shareSafety is share_ready; other runs are not served at all.")
|
|
48
|
+
.option("--expose", "Share the library beyond this machine. Requires --oauth or --public-url, or --safe.")
|
|
49
|
+
.addOption(new Option("--tunnel <provider>", "Spawn the external tunnel binary against the loopback port.").choices(["ngrok"]))
|
|
50
|
+
.option("--tunnel-domain <domain>", "Reserved domain passed to ngrok as --url (e.g. observer.example.com). Requires --tunnel.")
|
|
51
|
+
.addOption(new Option("--oauth <provider>", "Turn on ngrok edge OAuth. Requires --tunnel.").choices([
|
|
52
|
+
"google",
|
|
53
|
+
]))
|
|
54
|
+
.option("--allow-email <addr>", "Edge OAuth allow rule: permit this email. Repeatable. Requires --oauth.", collectRepeated)
|
|
55
|
+
.option("--allow-domain <domain>", "Edge OAuth allow rule: permit this domain. Repeatable. Requires --oauth.", collectRepeated)
|
|
56
|
+
.option("--public-url <origin>", "Bring-your-own authed edge (e.g. https://observer.example.com). Requires --expose; never affects binding.");
|
|
57
|
+
}
|
|
58
|
+
/** The library flags set on a one-run observe, as typed on the command line. */
|
|
59
|
+
function libraryOnlyFlags(options) {
|
|
60
|
+
return [
|
|
61
|
+
options.safe === true ? ["--safe"] : [],
|
|
62
|
+
options.expose === true ? ["--expose"] : [],
|
|
63
|
+
options.tunnel === undefined ? [] : ["--tunnel"],
|
|
64
|
+
options.tunnelDomain === undefined ? [] : ["--tunnel-domain"],
|
|
65
|
+
options.oauth === undefined ? [] : ["--oauth"],
|
|
66
|
+
(options.allowEmail?.length ?? 0) === 0 ? [] : ["--allow-email"],
|
|
67
|
+
(options.allowDomain?.length ?? 0) === 0 ? [] : ["--allow-domain"],
|
|
68
|
+
options.publicUrl === undefined ? [] : ["--public-url"],
|
|
69
|
+
].flat();
|
|
70
|
+
}
|
|
71
|
+
function refuseObserve(command, io, cwd, error) {
|
|
72
|
+
const result = {
|
|
73
|
+
schema: "humanish.run-result.v1",
|
|
74
|
+
ok: false,
|
|
75
|
+
cwd,
|
|
76
|
+
warnings: [],
|
|
77
|
+
...(error === undefined ? {} : { error }),
|
|
78
|
+
};
|
|
79
|
+
writeResult(command, io, result, formatRunHuman);
|
|
80
|
+
io.setExitCode(2);
|
|
81
|
+
}
|
|
82
|
+
/** `observe` shows one run (default latest); `observe --all` serves the run library. */
|
|
83
|
+
async function handleObserve(io, options, command) {
|
|
84
|
+
if (options.all === true) {
|
|
85
|
+
await handleServe(io, options, command);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const libraryOnly = libraryOnlyFlags(options);
|
|
89
|
+
if (libraryOnly.length > 0) {
|
|
90
|
+
refuseObserve(command, io, options.cwd, {
|
|
91
|
+
code: "HUMANISH_OBSERVE_OPTION_CONFLICT",
|
|
92
|
+
message: `${libraryOnly.join(", ")} ${libraryOnly.length === 1 ? "needs" : "need"} --all: humanish observe --all ${libraryOnly.join(" ")}.`,
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
await observeRun(io, { ...options, run: options.run ?? "latest" }, command);
|
|
97
|
+
}
|
|
98
|
+
/** One run's Observer over loopback, until a signal stops it. */
|
|
99
|
+
async function observeRun(io, options, command) {
|
|
100
|
+
const port = parseObserverPort(options.port);
|
|
101
|
+
if (port === null) {
|
|
66
102
|
const result = {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
...(openResult.warning ? [openResult.warning] : []),
|
|
76
|
-
],
|
|
103
|
+
schema: "humanish.run-result.v1",
|
|
104
|
+
ok: false,
|
|
105
|
+
cwd: options.cwd,
|
|
106
|
+
warnings: [],
|
|
107
|
+
error: {
|
|
108
|
+
code: "HUMANISH_INVALID_PORT",
|
|
109
|
+
message: "--port must be an integer between 0 and 65535.",
|
|
110
|
+
},
|
|
77
111
|
};
|
|
78
|
-
writeResult(command, io, result,
|
|
79
|
-
io.setExitCode(
|
|
80
|
-
|
|
81
|
-
}
|
|
112
|
+
writeResult(command, io, result, formatRunHuman);
|
|
113
|
+
io.setExitCode(2);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const rendered = await renderObserver(options.cwd, options.run, { open: false });
|
|
117
|
+
if (!rendered.ok || !rendered.observerPath) {
|
|
118
|
+
writeResult(command, io, rendered, formatObserverHuman);
|
|
119
|
+
io.setExitCode(2);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// Reuse the contained current-data projection, scoped to this run. A raw static
|
|
123
|
+
// server would miss runtime status and could replay stored iframe grants.
|
|
124
|
+
const wantsMachine = wantsJson(command);
|
|
125
|
+
const shouldOpen = options.open === false
|
|
126
|
+
? false
|
|
127
|
+
: options.open === true
|
|
128
|
+
? true
|
|
129
|
+
: !wantsMachine && process.stdout.isTTY === true;
|
|
130
|
+
const server = await serveObserver(rendered, { open: false, port, scope: "run" });
|
|
131
|
+
const openResult = shouldOpen
|
|
132
|
+
? openTarget(server.url)
|
|
133
|
+
: { opened: false };
|
|
134
|
+
const result = {
|
|
135
|
+
...rendered,
|
|
136
|
+
observerUrl: server.url,
|
|
137
|
+
serverUrl: server.url,
|
|
138
|
+
opened: openResult.opened,
|
|
139
|
+
...(openResult.command ? { openCommand: openResult.command } : {}),
|
|
140
|
+
warnings: [
|
|
141
|
+
...rendered.warnings,
|
|
142
|
+
"Observer is served read-only over loopback http on 127.0.0.1; only this run's bundle directory is exposed.",
|
|
143
|
+
...(openResult.warning ? [openResult.warning] : []),
|
|
144
|
+
],
|
|
145
|
+
};
|
|
146
|
+
writeResult(command, io, result, formatObserverHuman);
|
|
147
|
+
io.setExitCode(0);
|
|
148
|
+
await serveObserveUntilSignal(io, server, { json: wantsMachine });
|
|
82
149
|
}
|
|
83
150
|
async function serveObserveUntilSignal(io, server, options) {
|
|
84
151
|
// Keep the JSON envelope on stdout clean: route attach/stop chatter to stderr
|
|
@@ -117,46 +184,6 @@ async function serveObserveUntilSignal(io, server, options) {
|
|
|
117
184
|
}
|
|
118
185
|
});
|
|
119
186
|
}
|
|
120
|
-
export function registerServeCommand(parent, io) {
|
|
121
|
-
parent
|
|
122
|
-
.command("serve")
|
|
123
|
-
.description("Serve the local run library over loopback http, with optional tunnel-edge authenticated exposure.")
|
|
124
|
-
.summary("Serve the run library; optional tunnel-edge exposure.")
|
|
125
|
-
.option("--cwd <path>", "Target project directory.", ".")
|
|
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.")
|
|
138
|
-
.option("--open", "Open the library in the default browser.")
|
|
139
|
-
.option("--no-open", "Serve without opening a browser.")
|
|
140
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
141
|
-
.addHelpText("after", [
|
|
142
|
-
"",
|
|
143
|
-
"Happy path:",
|
|
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));
|
|
159
|
-
}
|
|
160
187
|
async function handleServe(io, options, command) {
|
|
161
188
|
const fail = (code, message) => refuseServe(command, io, options, code, message);
|
|
162
189
|
const port = parseObserverPort(options.port);
|
|
@@ -171,8 +198,8 @@ async function handleServe(io, options, command) {
|
|
|
171
198
|
...(options.tunnel === undefined ? {} : { tunnel: options.tunnel }),
|
|
172
199
|
...(options.tunnelDomain === undefined ? {} : { tunnelDomain: options.tunnelDomain }),
|
|
173
200
|
...(options.oauth === undefined ? {} : { oauth: options.oauth }),
|
|
174
|
-
allowEmails: options.allowEmail,
|
|
175
|
-
allowDomains: options.allowDomain,
|
|
201
|
+
allowEmails: options.allowEmail ?? [],
|
|
202
|
+
allowDomains: options.allowDomain ?? [],
|
|
176
203
|
...(options.publicUrl === undefined ? {} : { publicUrl: options.publicUrl }),
|
|
177
204
|
safe: options.safe === true,
|
|
178
205
|
});
|
|
@@ -257,7 +284,7 @@ async function reportServe(io, command, options, server, plan, edge) {
|
|
|
257
284
|
...serveExposureWarnings(server, options.safe === true, publicUrl),
|
|
258
285
|
];
|
|
259
286
|
// Auto-open is suppressed under --expose so the public URL is not shoved into a local opener's
|
|
260
|
-
// argv unasked
|
|
287
|
+
// argv unasked; the exposure target is a remote device anyway. Explicit --open still honors
|
|
261
288
|
// intent and opens the loopback library.
|
|
262
289
|
const shouldOpen = options.open === false
|
|
263
290
|
? false
|
|
@@ -326,21 +353,18 @@ function hiddenRunLines(groups) {
|
|
|
326
353
|
lines.push(` ${runs(group.runs)} ${group.status}${reasons}`);
|
|
327
354
|
}
|
|
328
355
|
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
|
|
356
|
+
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
357
|
lines.push("why: `humanish verify --run <id>` explains each reason");
|
|
331
358
|
return lines;
|
|
332
359
|
}
|
|
333
360
|
function formatServeHuman(result) {
|
|
334
361
|
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");
|
|
362
|
+
const warnings = result.warnings.map((warning) => `warning: ${warning}\n`).join("");
|
|
363
|
+
return { ...(warnings ? { stdout: warnings } : {}), error: result.error };
|
|
340
364
|
}
|
|
341
365
|
const modeSuffix = result.safe ? " (share_ready only)" : "";
|
|
342
366
|
const lines = [
|
|
343
|
-
"humanish
|
|
367
|
+
"humanish observe --all",
|
|
344
368
|
`mode: ${result.mode}${modeSuffix}`,
|
|
345
369
|
`library: ${result.url ?? ""}`,
|
|
346
370
|
`runs: ${result.runsListed}`,
|
|
@@ -354,7 +378,7 @@ function formatServeHuman(result) {
|
|
|
354
378
|
}
|
|
355
379
|
if (result.oauth) {
|
|
356
380
|
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
|
|
381
|
+
lines.push(`edge auth: ${result.oauth.provider} oauth${rules.length > 0 ? ` (allow: ${rules.join(", ")})` : " (no allow rule: any Google account can sign in)"}`);
|
|
358
382
|
}
|
|
359
383
|
if (result.entryRunId) {
|
|
360
384
|
lines.push(`entry: ${result.entryRunId}`);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type CliIo, type StudyCommandOptions as RunOptions } from "../io.js";
|
|
3
|
+
/** The parsed flags of `run` and `watch`. */
|
|
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 { runStudyCommand } from "./study-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
|
+
// runStudyCommand discovers keys for a live study; a preview without a study needs none.
|
|
58
|
+
discoverKeys: false,
|
|
59
|
+
});
|
|
60
|
+
if (!loaded)
|
|
61
|
+
return;
|
|
62
|
+
if (study !== undefined) {
|
|
63
|
+
await runStudyCommand({ command, io, 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
|
+
}
|