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
package/dist/guest/runtime.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { attachBrowserControlDispatcher } from "../browser-control/dispatcher.js";
|
|
2
2
|
import { encodeGuestBootstrap, GuestBootstrapReader, GUEST_BOOTSTRAP_LIMITS, guestReadyTimeoutMs, } from "./bootstrap.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
|
|
4
4
|
/** One admitted desktop and one dispatcher. The owner retains physical teardown. */
|
|
5
5
|
export async function runGuestRuntime(options) {
|
|
6
6
|
const owner = new AbortController();
|
|
@@ -77,7 +77,7 @@ export async function runGuestRuntime(options) {
|
|
|
77
77
|
reader = new GuestBootstrapReader(options.transport, options.revision, authority, false, terminal);
|
|
78
78
|
const identity = await reader.identity;
|
|
79
79
|
if (authority.aborted)
|
|
80
|
-
throw new
|
|
80
|
+
throw new ComputerUseExecutorError("session_revoked", "not_dispatched");
|
|
81
81
|
clearTimeout(timer);
|
|
82
82
|
timer = setTimeout(() => {
|
|
83
83
|
void close();
|
|
@@ -87,7 +87,7 @@ export async function runGuestRuntime(options) {
|
|
|
87
87
|
desktop = await Promise.race([
|
|
88
88
|
preparing,
|
|
89
89
|
new Promise((_, reject) => {
|
|
90
|
-
const stop = () => reject(new
|
|
90
|
+
const stop = () => reject(new ComputerUseExecutorError("session_revoked", "not_dispatched"));
|
|
91
91
|
authority.addEventListener("abort", stop, { once: true });
|
|
92
92
|
void preparing.finally(() => authority.removeEventListener("abort", stop)).catch(() => { });
|
|
93
93
|
if (authority.aborted)
|
|
@@ -95,7 +95,7 @@ export async function runGuestRuntime(options) {
|
|
|
95
95
|
}),
|
|
96
96
|
]);
|
|
97
97
|
if (authority.aborted)
|
|
98
|
-
throw new
|
|
98
|
+
throw new ComputerUseExecutorError("session_revoked", "not_dispatched");
|
|
99
99
|
reader.handoff();
|
|
100
100
|
dispatcher = attachBrowserControlDispatcher({
|
|
101
101
|
transport: options.transport,
|
|
@@ -105,14 +105,14 @@ export async function runGuestRuntime(options) {
|
|
|
105
105
|
isAuthorized: () => !authority.aborted,
|
|
106
106
|
...(desktop.finishRecording ? { finishRecording: desktop.finishRecording } : {}),
|
|
107
107
|
});
|
|
108
|
-
// No await in this handoff: an immediate
|
|
108
|
+
// No await in this handoff: an immediate hello already has its sole receiver.
|
|
109
109
|
options.transport.write(encodeGuestBootstrap(identity, true), (error) => {
|
|
110
110
|
if (error)
|
|
111
111
|
terminal();
|
|
112
112
|
});
|
|
113
113
|
options.transport.resume();
|
|
114
114
|
if (authority.aborted || options.transport.destroyed)
|
|
115
|
-
throw new
|
|
115
|
+
throw new ComputerUseExecutorError("session_revoked", "not_dispatched");
|
|
116
116
|
options.marker("R");
|
|
117
117
|
clearTimeout(timer);
|
|
118
118
|
return { close, closed };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export type {
|
|
3
|
-
export type {
|
|
4
|
-
export type { ProviderContext } from "./
|
|
5
|
-
export { routeOf } from "./
|
|
6
|
-
export type {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
export type {
|
|
1
|
+
export { runStudy } from "./run-study.js";
|
|
2
|
+
export type { StudyOutcome, StudyResult, RunStudyOptions } from "./run-study.js";
|
|
3
|
+
export type { StudyEvent } from "./study/run-study-events.js";
|
|
4
|
+
export type { ProviderContext } from "./study/run-study-homes.js";
|
|
5
|
+
export { routeOf } from "./study/plan.js";
|
|
6
|
+
export type { StudyRoute } from "./study/plan.js";
|
|
7
|
+
export { parseStudy } from "./study/config.js";
|
|
8
|
+
export { STUDY_SCHEMA } from "./study/types.js";
|
|
9
|
+
export type { StudyConfig } from "./study/types.js";
|
|
10
10
|
export { verifyRun } from "./verify/verify.js";
|
|
11
11
|
export type { VerifyResult } from "./verify/verify.js";
|
|
12
12
|
export { renderObserver } from "./observer/render.js";
|
|
@@ -14,16 +14,16 @@ export type { ObserverResult } from "./observer/render.js";
|
|
|
14
14
|
export type { RunBundle, RunFeedbackCandidate } from "./run/bundle.js";
|
|
15
15
|
export type { ActorTrace } from "./actors/contract.js";
|
|
16
16
|
export { runComputerUseLoop, stableProgressKey } from "./actors/computer-use/loop.js";
|
|
17
|
-
export type { CuaAction, CuaExecutor, CuaLoopOptions, CuaLoopResult, CuaObservation, CuaProvider, CuaSafetyCheck, CuaTurn, CuaTurnRequest, } from "./actors/computer-use/loop.js";
|
|
17
|
+
export type { CuaAction as ComputerUseAction, CuaExecutor as ComputerUseExecutor, CuaLoopOptions as ComputerUseLoopOptions, CuaLoopResult as ComputerUseLoopResult, CuaObservation as ComputerUseObservation, CuaProvider as ComputerUseProvider, CuaSafetyCheck as ComputerUseSafetyCheck, CuaTurn as ComputerUseTurn, CuaTurnRequest as ComputerUseTurnRequest, } from "./actors/computer-use/loop.js";
|
|
18
18
|
export type { ActorCapabilities } from "./actors/contract.js";
|
|
19
19
|
export { createOpenAiResponsesProvider } from "./actors/computer-use/openai-provider.js";
|
|
20
20
|
export type { OpenAiResponsesProviderOptions } from "./actors/computer-use/openai-provider.js";
|
|
21
|
-
export {
|
|
21
|
+
export { ComputerUseAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
|
|
22
22
|
export { defaultRedactionHooks } from "./evidence/redaction.js";
|
|
23
23
|
export type { RedactionHooks } from "./evidence/redaction.js";
|
|
24
24
|
export type { E2BDesktopSandbox } from "./substrates/e2b/sdk.js";
|
|
25
|
-
export { browserScorer, terminalScorer } from "./
|
|
26
|
-
export type { AdapterScorerModule, AdapterScoringContext } from "./
|
|
27
|
-
export type {
|
|
25
|
+
export { browserScorer, terminalScorer } from "./study/adapter-scorer-loader.js";
|
|
26
|
+
export type { AdapterScorerModule, AdapterScoringContext } from "./study/adapter-scorer-loader.js";
|
|
27
|
+
export type { BrowserScoringContext } from "./study/adapter-extension.js";
|
|
28
28
|
export type { TerminalProductScoringContext } from "./routes/terminal/types.js";
|
|
29
29
|
export type { RunAdapterArtifact, RunAdapterScore } from "./run/bundle.js";
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
// The library surface: what an adopter needs to run a
|
|
1
|
+
// The library surface: what an adopter needs to run a study, read a run, bring a participant or
|
|
2
2
|
// score a run. Everything else is internal and reached through the `humanish` bin. See
|
|
3
3
|
// docs/contracts/schemas.md, "Library options", and the site's library page.
|
|
4
|
-
// Run a
|
|
5
|
-
export {
|
|
6
|
-
export { routeOf } from "./
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
4
|
+
// Run a study.
|
|
5
|
+
export { runStudy } from "./run-study.js";
|
|
6
|
+
export { routeOf } from "./study/plan.js";
|
|
7
|
+
export { parseStudy } from "./study/config.js";
|
|
8
|
+
export { STUDY_SCHEMA } from "./study/types.js";
|
|
9
9
|
// Read a run.
|
|
10
10
|
export { verifyRun } from "./verify/verify.js";
|
|
11
11
|
export { renderObserver } from "./observer/render.js";
|
|
12
12
|
// Bring a participant.
|
|
13
13
|
export { runComputerUseLoop, stableProgressKey } from "./actors/computer-use/loop.js";
|
|
14
14
|
export { createOpenAiResponsesProvider } from "./actors/computer-use/openai-provider.js";
|
|
15
|
-
export {
|
|
15
|
+
export { ComputerUseAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
|
|
16
16
|
export { defaultRedactionHooks } from "./evidence/redaction.js";
|
|
17
17
|
// Score a run.
|
|
18
|
-
export { browserScorer, terminalScorer } from "./
|
|
18
|
+
export { browserScorer, terminalScorer } from "./study/adapter-scorer-loader.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export interface ResolvedKeyFill {
|
|
2
2
|
name: string;
|
|
3
|
-
/** Human-readable source label (a path or command name)
|
|
3
|
+
/** Human-readable source label (a path or command name), never a value. */
|
|
4
4
|
source: string;
|
|
5
5
|
}
|
|
6
6
|
export interface KeyResolutionDeps {
|
|
@@ -29,8 +29,8 @@ export interface KeySourceProbe {
|
|
|
29
29
|
/** The command/path that would fill it when missing. */
|
|
30
30
|
hint: string;
|
|
31
31
|
}
|
|
32
|
-
/** The nearest fill instruction for a missing key
|
|
33
|
-
* *_KEYS_MISSING errors so the failure names the fix
|
|
32
|
+
/** The nearest fill instruction for a missing key. Doctor rows use it, and it is appended to
|
|
33
|
+
* *_KEYS_MISSING errors so the failure names the fix. */
|
|
34
34
|
export declare function missingKeyHint(name: string): string;
|
|
35
35
|
/** One shared suffix for *_KEYS_MISSING messages: where discovery looked, and what fills each
|
|
36
36
|
* missing key. Pure text; never values. */
|
|
@@ -47,10 +47,10 @@ export declare function probeKeySources(names: readonly string[], args: {
|
|
|
47
47
|
/** Resolve a `humanish keys set` target: a vendor alias or a raw env name. Null = invalid. */
|
|
48
48
|
export declare function resolveKeyName(vendorOrName: string): string | null;
|
|
49
49
|
/** Write one key into the user store (0700 dir, 0600 file). Only allowlisted provider names
|
|
50
|
-
* are storable (the store feeds implicit discovery
|
|
50
|
+
* are storable (the store feeds implicit discovery, so an arbitrary-name store would be an env
|
|
51
51
|
* injection vector with extra steps). The value must be a single non-empty line that
|
|
52
52
|
* round-trips the store's own parser byte-identically, and the write refuses symlinks at the
|
|
53
|
-
* file and its parent directory
|
|
53
|
+
* file and its parent directory. */
|
|
54
54
|
export declare function setUserKey(name: string, value: string, env: NodeJS.ProcessEnv, deps?: KeyResolutionDeps): {
|
|
55
55
|
path: string;
|
|
56
56
|
};
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
// Provider-key discovery
|
|
1
|
+
// Provider-key discovery: resolve the keys a live run needs through each vendor's
|
|
2
2
|
// native chain instead of demanding a per-repo --env-file that operators hand-copy keys into.
|
|
3
3
|
//
|
|
4
|
-
// The chain, per key,
|
|
5
|
-
// 1. process env
|
|
6
|
-
// 2. `.humanish/local/provider.env
|
|
4
|
+
// The chain, per key, fill-only (a rung never overrides anything already present):
|
|
5
|
+
// 1. process env, including whatever --env-file just loaded (explicit always wins);
|
|
6
|
+
// 2. `.humanish/local/provider.env`, the project-local overlay this CLI's own --help
|
|
7
7
|
// examples document;
|
|
8
8
|
// 3. the owning vendor's native store, where one exists:
|
|
9
9
|
// E2B_API_KEY <- ~/.e2b/config.json (written by `e2b auth login`);
|
|
10
10
|
// GH_TOKEN <- `gh auth token` (the gh CLI's credential chain);
|
|
11
11
|
// 4. the humanish user-level store `$XDG_CONFIG_HOME/humanish/keys.env`, written only by
|
|
12
|
-
// `humanish keys set` (0600, prompted or --stdin)
|
|
12
|
+
// `humanish keys set` (0600, prompted or --stdin), the fallback for vendors that ship
|
|
13
13
|
// no machine chain of their own (OpenAI, Anthropic).
|
|
14
14
|
//
|
|
15
15
|
// Every fill is announced by key name + source, never by value. The subject app's own
|
|
16
16
|
// `.env`/`.env.local` are never read: those hold product credentials, a different class
|
|
17
|
-
//
|
|
18
|
-
// `HUMANISH_STRICT_KEYS=1` disables every rung below process env
|
|
17
|
+
// of secret; this module only reads humanish-owned files and vendor-owned stores.
|
|
18
|
+
// `HUMANISH_STRICT_KEYS=1` disables every rung below process env.
|
|
19
19
|
import { spawn } from "node:child_process";
|
|
20
20
|
import { chmodSync, closeSync, constants as fsConstants, existsSync, ftruncateSync, lstatSync, mkdirSync, openSync, readFileSync, writeSync, } from "node:fs";
|
|
21
21
|
import { homedir } from "node:os";
|
|
@@ -24,7 +24,7 @@ import { loadEnvFile } from "./env-file.js";
|
|
|
24
24
|
/** The only names implicit discovery may fill (and `humanish keys set` may store). Everything
|
|
25
25
|
* else in an overlay/store file is ignored-and-named: a repo-planted NODE_OPTIONS/LD_PRELOAD
|
|
26
26
|
* must never enter process env off a file the operator did not explicitly pass (an explicit
|
|
27
|
-
* --env-file remains the operator's own full-file load).
|
|
27
|
+
* --env-file remains the operator's own full-file load). */
|
|
28
28
|
const KNOWN_PROVIDER_KEYS = [
|
|
29
29
|
"OPENAI_API_KEY",
|
|
30
30
|
"ANTHROPIC_API_KEY",
|
|
@@ -52,7 +52,7 @@ export function userKeyStorePath(env, deps = {}) {
|
|
|
52
52
|
const home = deps.homeDir ?? homedir();
|
|
53
53
|
const declared = env.XDG_CONFIG_HOME?.trim();
|
|
54
54
|
// The XDG spec: a relative XDG_CONFIG_HOME must be ignored. Honoring one would make the
|
|
55
|
-
// key store cwd-relative
|
|
55
|
+
// key store cwd-relative: `humanish keys set` would write a secret into the current repo.
|
|
56
56
|
const configHome = declared !== undefined && declared !== "" && path.isAbsolute(declared)
|
|
57
57
|
? declared
|
|
58
58
|
: path.join(home, ".config");
|
|
@@ -151,16 +151,16 @@ export async function discoverProviderKeys(args) {
|
|
|
151
151
|
const fills = [];
|
|
152
152
|
const ignored = [];
|
|
153
153
|
// Fill-only means presence wins, including an explicitly-set empty value: an operator who
|
|
154
|
-
// exported OPENAI_API_KEY="" said "off", and a rung that "fixes" that has overridden them
|
|
155
|
-
//
|
|
154
|
+
// exported OPENAI_API_KEY="" said "off", and a rung that "fixes" that has overridden them.
|
|
155
|
+
// Only a truly-unset name is fillable.
|
|
156
156
|
const fillable = (name) => env[name] === undefined;
|
|
157
157
|
const fill = (name, value, source) => {
|
|
158
158
|
env[name] = value;
|
|
159
159
|
fills.push({ name, source });
|
|
160
160
|
};
|
|
161
161
|
// Rung 2: the documented project-local overlay. Parsed atomically against a scratch env so a
|
|
162
|
-
// file loadEnvFile rejects can never half-apply
|
|
163
|
-
// in env unannounced
|
|
162
|
+
// file loadEnvFile rejects can never half-apply: otherwise lines before the parse error would
|
|
163
|
+
// land in env unannounced. Only allowlisted provider names cross
|
|
164
164
|
// from the file into the real env.
|
|
165
165
|
const overlayPath = path.resolve(cwd, PROJECT_OVERLAY_RELATIVE);
|
|
166
166
|
if (isRegularFile(overlayPath) && !dirIsSymlink(overlayPath)) {
|
|
@@ -196,7 +196,7 @@ export async function discoverProviderKeys(args) {
|
|
|
196
196
|
}
|
|
197
197
|
// Rung 4: the humanish user-level store, read with the same lenient parser `keys set`/`list`
|
|
198
198
|
// use, so one hand-mangled line degrades to that line alone instead of silently voiding the
|
|
199
|
-
// whole store
|
|
199
|
+
// whole store, as the strict parser would.
|
|
200
200
|
const storePath = userKeyStorePath(env, deps);
|
|
201
201
|
if (isRegularFile(storePath) && !dirIsSymlink(storePath)) {
|
|
202
202
|
for (const [name, value] of readStoreEntries(storePath)) {
|
|
@@ -213,11 +213,11 @@ export async function discoverProviderKeys(args) {
|
|
|
213
213
|
if (announced === undefined || announced.has(fill_.name))
|
|
214
214
|
announce(`humanish keys: ${fill_.name} from ${fill_.source}`);
|
|
215
215
|
for (const name of ignored)
|
|
216
|
-
announce(`humanish keys: ignored
|
|
216
|
+
announce(`humanish keys: ignored ${name}, which is not a provider key. Discovery loads provider keys only; pass the file with --env-file to load every name in it.`);
|
|
217
217
|
return fills;
|
|
218
218
|
}
|
|
219
219
|
/** True when the file's parent directory is (or traverses) a symlink at its last component:
|
|
220
|
-
* the dir-level retarget that defeats a file-level lstat check
|
|
220
|
+
* the dir-level retarget that defeats a file-level lstat check. */
|
|
221
221
|
function dirIsSymlink(filePath) {
|
|
222
222
|
try {
|
|
223
223
|
return lstatSync(path.dirname(filePath)).isSymbolicLink();
|
|
@@ -230,8 +230,8 @@ function storeLabel(env, deps) {
|
|
|
230
230
|
const home = deps.homeDir ?? homedir();
|
|
231
231
|
return userKeyStorePath(env, deps).replace(home, "~");
|
|
232
232
|
}
|
|
233
|
-
/** The nearest fill instruction for a missing key
|
|
234
|
-
* *_KEYS_MISSING errors so the failure names the fix
|
|
233
|
+
/** The nearest fill instruction for a missing key. Doctor rows use it, and it is appended to
|
|
234
|
+
* *_KEYS_MISSING errors so the failure names the fix. */
|
|
235
235
|
export function missingKeyHint(name) {
|
|
236
236
|
switch (name) {
|
|
237
237
|
case "E2B_API_KEY":
|
|
@@ -273,7 +273,7 @@ export async function probeKeySources(names, args) {
|
|
|
273
273
|
return names.map((name) => {
|
|
274
274
|
const inEnv = args.env[name] !== undefined && args.env[name]?.trim() !== "";
|
|
275
275
|
// GH_TOKEN and GITHUB_TOKEN are one credential with two spellings; a doctor row that says
|
|
276
|
-
// "missing" while GITHUB_TOKEN sits in the env would be wrong
|
|
276
|
+
// "missing" while GITHUB_TOKEN sits in the env would be wrong.
|
|
277
277
|
const aliasInEnv = name === "GH_TOKEN" &&
|
|
278
278
|
args.env.GITHUB_TOKEN !== undefined &&
|
|
279
279
|
args.env.GITHUB_TOKEN.trim() !== "";
|
|
@@ -294,10 +294,10 @@ export function resolveKeyName(vendorOrName) {
|
|
|
294
294
|
return ENV_NAME.test(vendorOrName) ? vendorOrName : null;
|
|
295
295
|
}
|
|
296
296
|
/** Write one key into the user store (0700 dir, 0600 file). Only allowlisted provider names
|
|
297
|
-
* are storable (the store feeds implicit discovery
|
|
297
|
+
* are storable (the store feeds implicit discovery, so an arbitrary-name store would be an env
|
|
298
298
|
* injection vector with extra steps). The value must be a single non-empty line that
|
|
299
299
|
* round-trips the store's own parser byte-identically, and the write refuses symlinks at the
|
|
300
|
-
* file and its parent directory
|
|
300
|
+
* file and its parent directory. */
|
|
301
301
|
export function setUserKey(name, value, env, deps = {}) {
|
|
302
302
|
const trimmed = value.trim();
|
|
303
303
|
if (trimmed.length === 0 || /[\u0000-\u001f\u007f]/.test(trimmed)) {
|
|
@@ -363,8 +363,8 @@ function readStoreEntries(storePath) {
|
|
|
363
363
|
function writeStore(storePath, entries) {
|
|
364
364
|
const body = [...entries.entries()].map(([name, value]) => `${name}=${value}`).join("\n");
|
|
365
365
|
const text = body.length > 0 ? `${body}\n` : "";
|
|
366
|
-
// O_NOFOLLOW: a symlinked keys.env must never carry the write to its target
|
|
367
|
-
//
|
|
366
|
+
// O_NOFOLLOW: a symlinked keys.env must never carry the write to its target, which would put a
|
|
367
|
+
// secret into an attacker-chosen file.
|
|
368
368
|
const fd = openSync(storePath, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_NOFOLLOW, 0o600);
|
|
369
369
|
try {
|
|
370
370
|
ftruncateSync(fd, 0);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { LoadedAnalysis } from "../analysis/types.js";
|
|
2
2
|
import { type ObserverData } from "./data.js";
|
|
3
3
|
/**
|
|
4
|
-
* Resolve
|
|
5
|
-
*
|
|
4
|
+
* Resolve (and in a repo checkout, build) the Observer artifact before any run or
|
|
5
|
+
* study work starts. A missing artifact must cost seconds at startup, never a completed
|
|
6
6
|
* session (a live participant spends real money before the render step would have noticed).
|
|
7
7
|
* Unconditional on purpose: the artifact is the only renderer now, so the fail-before-
|
|
8
8
|
* spend property this preflight bought under the flag matters more, not less.
|
|
@@ -11,8 +11,8 @@ const OBSERVER_DATA_PLACEHOLDER = "__HUMANISH_OBSERVER_DATA__";
|
|
|
11
11
|
const OBSERVER_DATA_SLOT = `<script id="observer-data" type="application/json">${OBSERVER_DATA_PLACEHOLDER}</script>`;
|
|
12
12
|
let cachedObserverArtifact = null;
|
|
13
13
|
/**
|
|
14
|
-
* Resolve
|
|
15
|
-
*
|
|
14
|
+
* Resolve (and in a repo checkout, build) the Observer artifact before any run or
|
|
15
|
+
* study work starts. A missing artifact must cost seconds at startup, never a completed
|
|
16
16
|
* session (a live participant spends real money before the render step would have noticed).
|
|
17
17
|
* Unconditional on purpose: the artifact is the only renderer now, so the fail-before-
|
|
18
18
|
* spend property this preflight bought under the flag matters more, not less.
|
|
@@ -42,7 +42,7 @@ function loadObserverArtifact() {
|
|
|
42
42
|
// together) must not race one `vite build` output: a reader can catch the
|
|
43
43
|
// artifact half-written. A mkdir lock serializes builders across processes;
|
|
44
44
|
// whoever loses the race re-checks staleness and usually just reads.
|
|
45
|
-
// The lock lives
|
|
45
|
+
// The lock lives outside dist/ (vite empties dist mid-build) and inside an
|
|
46
46
|
// ignored path so a crashed builder cannot dirty the tree.
|
|
47
47
|
const lockDir = path.join(workspaceDir, "node_modules", ".observer-build-lock");
|
|
48
48
|
mkdirSync(path.dirname(lockDir), { recursive: true });
|
|
@@ -50,7 +50,7 @@ function loadObserverArtifact() {
|
|
|
50
50
|
for (;;) {
|
|
51
51
|
try {
|
|
52
52
|
mkdirSync(lockDir);
|
|
53
|
-
break; // lock acquired
|
|
53
|
+
break; // lock acquired: this process builds
|
|
54
54
|
}
|
|
55
55
|
catch {
|
|
56
56
|
if (Date.now() > deadline)
|
|
@@ -71,7 +71,7 @@ function loadObserverArtifact() {
|
|
|
71
71
|
try {
|
|
72
72
|
// NODE_ENV is forced: Vite respects a preset NODE_ENV (test, development),
|
|
73
73
|
// and a dev-flavored artifact embeds jsxDEV plus the builder's absolute
|
|
74
|
-
// filesystem paths
|
|
74
|
+
// filesystem paths, which the run's public-safety scan then rightly rejects.
|
|
75
75
|
execSync("pnpm --filter humanish-observer build", {
|
|
76
76
|
cwd: repoRoot,
|
|
77
77
|
stdio: ["ignore", "pipe", "inherit"],
|
|
@@ -79,7 +79,7 @@ function loadObserverArtifact() {
|
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
81
|
catch {
|
|
82
|
-
throw new Error("observer workspace build failed
|
|
82
|
+
throw new Error("observer workspace build failed; run `pnpm --filter humanish-observer build` to see the full output.");
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -169,7 +169,7 @@ function renderObserverAppHtml(data, snapshot, analysis, assets) {
|
|
|
169
169
|
.replace(OBSERVER_DATA_SLOT, () => `<script id="observer-data" type="application/json">${escapeJsonScript(data)}</script>`)
|
|
170
170
|
.replace(/<script id="study-analysis" type="application\/json">[\s\S]*?<\/script>/, () => `<script id="study-analysis" type="application/json">${escapeJsonScript(analysis)}</script>`)
|
|
171
171
|
.replace("</body>", () => `${renderExportAssets(assets)}</body>`)
|
|
172
|
-
.replace(/<title>[^<]*<\/title>/, () => `<title>humanish Observer
|
|
172
|
+
.replace(/<title>[^<]*<\/title>/, () => `<title>humanish Observer · ${escapeHtml(data.run.runId)}</title>`);
|
|
173
173
|
}
|
|
174
174
|
/** Render current packaged UI around a validated/projected Observer snapshot. */
|
|
175
175
|
export function renderObserverHtml(data, options = {}) {
|
package/dist/observer/data.d.ts
CHANGED
|
@@ -31,18 +31,18 @@ export interface ObserverData {
|
|
|
31
31
|
lifecycle: RunBundle["lifecycle"];
|
|
32
32
|
knownGaps: string[];
|
|
33
33
|
/**
|
|
34
|
-
* What happened to the
|
|
34
|
+
* What happened to the participants, with the denominator attached. `status` above collapses the
|
|
35
35
|
* run to one word for a gate; this is the study result, and it is what the person watching
|
|
36
36
|
* through the glass actually wants to know. Absent on a bundle with no participants.
|
|
37
37
|
*
|
|
38
|
-
* A viewing room that shows only vivid moments manufactures certainty from n=1
|
|
38
|
+
* A viewing room that shows only vivid moments manufactures certainty from n=1, so the count
|
|
39
39
|
* travels with the outcome here, always (docs/principles/three-roles.md).
|
|
40
40
|
*/
|
|
41
41
|
participants?: RunBundle["review"]["participants"];
|
|
42
42
|
/** The same thing as one readable line, so a renderer cannot accidentally show a number
|
|
43
43
|
* without its denominator. */
|
|
44
44
|
participantsLine?: string;
|
|
45
|
-
/** The study's per-task completion rates
|
|
45
|
+
/** The study's per-task completion rates, when the study declared a protocol. */
|
|
46
46
|
tasks?: RunBundle["review"]["tasks"];
|
|
47
47
|
/** Pre-formatted like participantsLine, denominator on every number. */
|
|
48
48
|
tasksLine?: string;
|
|
@@ -56,8 +56,8 @@ export interface ObserverData {
|
|
|
56
56
|
};
|
|
57
57
|
laneGroups: ObserverLaneGroup[];
|
|
58
58
|
/**
|
|
59
|
-
*
|
|
60
|
-
* (humanish.run-cost-summary.v1). Absent when the bundle carries none. The Observer
|
|
59
|
+
* Optional run-level cost estimate projected straight through from the bundle
|
|
60
|
+
* (humanish.run-cost-summary.v1). Absent when the bundle carries none. The Observer labels every
|
|
61
61
|
* figure as estimated (rates as of <asOf>) and never presents it as an authoritative charge.
|
|
62
62
|
*/
|
|
63
63
|
cost?: RunCostSummary;
|
|
@@ -68,7 +68,7 @@ export interface ObserverData {
|
|
|
68
68
|
publishable: false;
|
|
69
69
|
note: string;
|
|
70
70
|
/**
|
|
71
|
-
*
|
|
71
|
+
* Additive + optional: the result of verification at static render or
|
|
72
72
|
* export time. Unverified projections omit this field. The timestamp records
|
|
73
73
|
* that check; it is not an assertion about subsequent file changes.
|
|
74
74
|
*/
|
package/dist/observer/data.js
CHANGED
|
@@ -33,7 +33,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
|
|
|
33
33
|
const sim = bundle.simulations.find((candidate) => candidate.id === stream.simId) ??
|
|
34
34
|
fallbackSimulation(bundle, stream);
|
|
35
35
|
// A natural session can finish its protocol while the participant explicitly reports a
|
|
36
|
-
// blocker
|
|
36
|
+
// blocker. Match the review's typed-outcome rule without rewriting the raw trace or
|
|
37
37
|
// guessing from prose. Never turn an active or failed harness into a participant outcome.
|
|
38
38
|
const status = (stream.status === "passed" || stream.status === "complete") &&
|
|
39
39
|
stream.actor?.completionReason === "goal_satisfied" &&
|
|
@@ -47,7 +47,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
|
|
|
47
47
|
status,
|
|
48
48
|
sim,
|
|
49
49
|
kindLabel: kindLabel(stream.kind),
|
|
50
|
-
statusLabel: statusLabel(status),
|
|
50
|
+
statusLabel: statusLabel(status, bundle.mode),
|
|
51
51
|
terminalPlain: stripAnsi(stream.terminal?.tail ?? ""),
|
|
52
52
|
timeline: [
|
|
53
53
|
...events.filter((event) => event.simId === sim.id || event.streamId === stream.id),
|
|
@@ -229,10 +229,11 @@ function kindLabel(kind) {
|
|
|
229
229
|
return "Summary";
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
|
-
|
|
232
|
+
/** `contract_proof_only` reads "Dry run" on a dry run; a live participant with it has no result. */
|
|
233
|
+
function statusLabel(status, mode) {
|
|
233
234
|
switch (status) {
|
|
234
235
|
case "contract_proof_only":
|
|
235
|
-
return "
|
|
236
|
+
return mode === "dry-run" ? "Dry run" : "No verdict";
|
|
236
237
|
case "preparing":
|
|
237
238
|
return "Preparing";
|
|
238
239
|
case "queued":
|
|
@@ -47,7 +47,7 @@ export type ExposureValidation = {
|
|
|
47
47
|
};
|
|
48
48
|
};
|
|
49
49
|
/** Why `watch` refuses `--safe`, on every watch path. */
|
|
50
|
-
export declare const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready
|
|
50
|
+
export declare const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready, so --safe (a share_ready library filter for `observe --all`) cannot apply. Restrict viewers with edge auth: --allow-email / --allow-domain.";
|
|
51
51
|
export declare function validateExposure(surface: ExposureSurface, request: ExposureRequest, live?: WatchLiveContext): ExposureValidation;
|
|
52
52
|
export interface ExposableServer {
|
|
53
53
|
readonly port: number;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
// Shared fail-closed exposure validation + tunnel orchestration for
|
|
2
|
-
// finished runs) and `watch` (one live run). Exposure auth is
|
|
1
|
+
// Shared fail-closed exposure validation + tunnel orchestration for both `serve` (a library of
|
|
2
|
+
// finished runs) and `watch` (one live run). Exposure auth is tunnel-edge only: humanish carries no
|
|
3
3
|
// in-process auth. Exposure is admitted only behind edge auth (ngrok --oauth google, or an operator
|
|
4
|
-
// --public-url they secure)
|
|
5
|
-
// is never share_ready (raw, unverified screenshots), so watch --expose
|
|
4
|
+
// --public-url they secure) or, for serve, behind --safe (share_ready runs only). A live watch run
|
|
5
|
+
// is never share_ready (raw, unverified screenshots), so watch --expose always requires edge auth.
|
|
6
6
|
//
|
|
7
7
|
// This module is pure with respect to the fail-closed matrix (validateExposure) and thin over the
|
|
8
8
|
// tunnel launcher (startExposedObserver), so the CLI just maps flags in and results out.
|
|
9
9
|
import { parsePublicOrigin } from "./http.js";
|
|
10
10
|
import { startNgrokTunnel } from "./tunnel.js";
|
|
11
11
|
/** Why `watch` refuses `--safe`, on every watch path. */
|
|
12
|
-
export const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready
|
|
12
|
+
export const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready, so --safe (a share_ready library filter for `observe --all`) cannot apply. Restrict viewers with edge auth: --allow-email / --allow-domain.";
|
|
13
13
|
function code(surface, suffix) {
|
|
14
14
|
return `HUMANISH_${surface.toUpperCase()}_${suffix}`;
|
|
15
15
|
}
|
|
@@ -70,12 +70,12 @@ export function validateExposure(surface, request, live) {
|
|
|
70
70
|
const warnings = [];
|
|
71
71
|
if (surface === "watch") {
|
|
72
72
|
// A live, in-progress run is never share_ready (raw screenshots, unverified), so --safe would
|
|
73
|
-
// admit nothing and expose nothing: watch --expose
|
|
73
|
+
// admit nothing and expose nothing: watch --expose always requires edge auth, and the live-follow
|
|
74
74
|
// preconditions are checked first so `--dry-run`/`--detach`/`--json` fail with the clearer reason.
|
|
75
75
|
if (live && (live.dryRun || live.detach || live.json)) {
|
|
76
76
|
return fail("EXPOSE_REQUIRES_LIVE_FOLLOW", "watch --expose streams a live desktop over an attached follow channel; it cannot combine with --dry-run, --detach, or --json.");
|
|
77
77
|
}
|
|
78
|
-
// --safe is a share_ready
|
|
78
|
+
// --safe is a share_ready library filter for `serve`; watch streams a single live run that is
|
|
79
79
|
// never share_ready, so --safe would silently do nothing here. Reject it rather than ignore it.
|
|
80
80
|
if (request.safe) {
|
|
81
81
|
return fail("SAFE_NOT_APPLICABLE", WATCH_SAFE_NOT_APPLICABLE_MESSAGE);
|
|
@@ -85,18 +85,18 @@ export function validateExposure(surface, request, live) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
else {
|
|
88
|
-
// serve: --expose must
|
|
88
|
+
// serve: --expose must always resolve to a reachable public origin (a tunnel or a --public-url),
|
|
89
89
|
// even under --safe. Without one the exposed server is an unreachable loopback no-op, so fail
|
|
90
|
-
// closed before the origin-less bind. When an origin
|
|
90
|
+
// closed before the origin-less bind. When an origin is present, keep the edge-auth-or-safe gate.
|
|
91
91
|
if (!request.tunnel && !publicOrigin) {
|
|
92
92
|
return fail("EXPOSE_REQUIRES_ORIGIN", "--expose needs a declared public origin: pass --tunnel ngrok or --public-url <origin>.");
|
|
93
93
|
}
|
|
94
94
|
if (!edgeAuthed && !request.safe) {
|
|
95
|
-
return fail("EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE", "--expose opens a public URL to local run bundles
|
|
95
|
+
return fail("EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE", "--expose opens a public URL to local run bundles, so it needs edge auth (--oauth google with --tunnel, or a --public-url you secure) or --safe (share_ready runs only).");
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
if (request.oauth && request.allowEmails.length === 0 && request.allowDomains.length === 0) {
|
|
99
|
-
warnings.push("ngrok --oauth google
|
|
99
|
+
warnings.push("ngrok --oauth google without --allow-email or --allow-domain lets in any Google account that reaches the URL. Add at least one allow rule to choose who can watch.");
|
|
100
100
|
}
|
|
101
101
|
const mode = edgeAuthed ? "exposed" : "share-safe-open";
|
|
102
102
|
return {
|
package/dist/observer/http.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Shared HTTP hardening primitives for the serve surfaces. Extracted here so
|
|
1
|
+
// Shared HTTP hardening primitives for the serve surfaces. Extracted here so both the live
|
|
2
2
|
// Observer server (src/observer/render.ts) and the run-library server
|
|
3
3
|
// (src/observer/serve.ts) can enforce the identical Host allowlist + security-header posture
|
|
4
4
|
// without a module cycle. This file imports nothing from the serve modules.
|
|
@@ -9,10 +9,12 @@ export interface LibraryHistory {
|
|
|
9
9
|
/** Current contained status-record observation, separate from the evidence verdict. */
|
|
10
10
|
runtimeState?: "running" | "finished" | "interrupted" | "unknown";
|
|
11
11
|
streamCount: number;
|
|
12
|
-
/** Labeled run-total cost
|
|
12
|
+
/** Labeled run-total cost estimate (null when the run carries no cost summary). */
|
|
13
13
|
estimatedCostUsd: number | null;
|
|
14
14
|
costRatesAsOf: string | null;
|
|
15
15
|
costPlaceholder: boolean;
|
|
16
|
+
/** The row's cost text: participants and desktops plus the run's analyses (src/run/run-cost.ts). */
|
|
17
|
+
costLabel: string | null;
|
|
16
18
|
}>;
|
|
17
19
|
}
|
|
18
20
|
export interface LibraryRenderOptions {
|
package/dist/observer/library.js
CHANGED
|
@@ -7,8 +7,8 @@ const STATUS_TONES = {
|
|
|
7
7
|
};
|
|
8
8
|
export function renderLibraryHtml(history, opts) {
|
|
9
9
|
const emptyState = opts.safe
|
|
10
|
-
? "No share_ready runs yet
|
|
11
|
-
: "No runs yet
|
|
10
|
+
? "No share_ready runs yet. Run `humanish verify` to see why."
|
|
11
|
+
: "No runs yet. Run `humanish watch` to create one.";
|
|
12
12
|
return `<!doctype html>
|
|
13
13
|
<html lang="en" data-theme="dark">
|
|
14
14
|
<head>
|
|
@@ -39,6 +39,7 @@ function modeLabel(opts) {
|
|
|
39
39
|
const auth = opts.mode === "exposed" ? "edge-authed" : opts.mode === "share-safe-open" ? "open" : "loopback";
|
|
40
40
|
return opts.safe ? `${auth} · share_ready only` : auth;
|
|
41
41
|
}
|
|
42
|
+
// prose-check: script (the library page's CSS)
|
|
42
43
|
function libraryCss() {
|
|
43
44
|
return `
|
|
44
45
|
:root { color-scheme: dark; }
|
|
@@ -80,6 +81,7 @@ main { padding: 1rem 1.1rem 3rem; max-width: 44rem; margin: 0 auto; }
|
|
|
80
81
|
.empty { color: #9aa3b2; font-size: 0.85rem; padding: 2rem 0; text-align: center; }
|
|
81
82
|
`;
|
|
82
83
|
}
|
|
84
|
+
// prose-check: script (the library page's JavaScript)
|
|
83
85
|
function libraryClientJs() {
|
|
84
86
|
const tones = JSON.stringify(STATUS_TONES);
|
|
85
87
|
return `
|
|
@@ -125,7 +127,10 @@ function libraryClientJs() {
|
|
|
125
127
|
var metaBits = [run.mode || "unknown", run.streamCount + " participants", run.createdAt || ""];
|
|
126
128
|
// Labeled cost token: ALWAYS "~$X est." (never a bare "$X"), so the library never implies an
|
|
127
129
|
// authoritative charge. Null = omitted (advisory, fail-open on display).
|
|
128
|
-
if (run.
|
|
130
|
+
if (run.costLabel) {
|
|
131
|
+
metaBits.push(run.costLabel + (run.costPlaceholder ? " (placeholder)" : ""));
|
|
132
|
+
if (run.costRatesAsOf) meta.title = "estimated, rates as of " + run.costRatesAsOf;
|
|
133
|
+
} else if (run.estimatedCostUsd != null) {
|
|
129
134
|
metaBits.push("~$" + Number(run.estimatedCostUsd).toFixed(2) + " est." + (run.costPlaceholder ? " (placeholder)" : ""));
|
|
130
135
|
if (run.costRatesAsOf) meta.title = "estimated, rates as of " + run.costRatesAsOf;
|
|
131
136
|
}
|
package/dist/observer/listen.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// One loopback bind for every humanish server, with the one failure people actually hit named.
|
|
2
2
|
//
|
|
3
|
-
// `listen EADDRINUSE`
|
|
4
|
-
// "a handler threw"
|
|
5
|
-
// a serve command has: a second session, a forgotten background one, someone's
|
|
6
|
-
// bites with an explicit --port, which is exactly when a person is asking for a
|
|
3
|
+
// `listen EADDRINUSE` becomes PortInUseError: HUMANISH_UNEXPECTED, the command-boundary catch-all
|
|
4
|
+
// for "a handler threw", would misname it. Something already serving on the port is the most
|
|
5
|
+
// expected condition a serve command has: a second session, a forgotten background one, someone's
|
|
6
|
+
// dev server. It only bites with an explicit --port, which is exactly when a person is asking for a
|
|
7
|
+
// stable address.
|
|
7
8
|
export class PortInUseError extends Error {
|
|
8
9
|
port;
|
|
9
10
|
holder;
|
|
@@ -48,7 +48,7 @@ export declare function serveObserver(result: ObserverResult, options?: Observer
|
|
|
48
48
|
export interface DesktopOpenerHost {
|
|
49
49
|
platform: NodeJS.Platform;
|
|
50
50
|
env: NodeJS.ProcessEnv;
|
|
51
|
-
/** Whether an executable with this name is on the host's PATH
|
|
51
|
+
/** Whether an executable with this name is on the host's `PATH`. */
|
|
52
52
|
onPath(name: string): boolean;
|
|
53
53
|
}
|
|
54
54
|
/**
|