humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
package/dist/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
|
/**
|
package/dist/observer/render.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { runNotFoundMessage } from "../run/run-not-found.js";
|
|
2
3
|
import { accessSync, constants } from "node:fs";
|
|
3
4
|
import { realpath } from "node:fs/promises";
|
|
4
5
|
import { createServer } from "node:http";
|
|
5
6
|
import path from "node:path";
|
|
6
7
|
import { pathToFileURL } from "node:url";
|
|
7
8
|
import { projectShareCheckedAnalysis } from "../analysis/sharing.js";
|
|
8
|
-
import {
|
|
9
|
+
import { loadAnalysis } from "../analysis/load.js";
|
|
9
10
|
import { physicalCwdOf, runIdOf, bindExistingRunArtifactPaths, isSafeRunIdSegment, resolveLatestRunDirectory, validatePreparedRunArtifactPaths, } from "../run/paths.js";
|
|
10
11
|
import { writeContainedOutputFile } from "../run/contained-output.js";
|
|
11
12
|
import { loadRunBundlePrepared } from "../run/locate.js";
|
|
@@ -22,6 +23,10 @@ const observerPreparedRunPaths = new WeakMap();
|
|
|
22
23
|
export function attachObserverRuntimeStreamUrls(result, streams) {
|
|
23
24
|
observerRuntimeStreamUrls.set(result, streams.filter((stream) => stream.streamId && stream.url));
|
|
24
25
|
}
|
|
26
|
+
async function runNotFound(cwd, runInput) {
|
|
27
|
+
const message = await runNotFoundMessage(cwd, runInput);
|
|
28
|
+
return observerRunError(cwd, runInput, "HUMANISH_RUN_NOT_FOUND", message);
|
|
29
|
+
}
|
|
25
30
|
export async function renderObserver(cwdInput, runInput, options = {}) {
|
|
26
31
|
const cwd = path.resolve(cwdInput);
|
|
27
32
|
let selection;
|
|
@@ -46,7 +51,7 @@ export async function renderObserver(cwdInput, runInput, options = {}) {
|
|
|
46
51
|
selection = null;
|
|
47
52
|
}
|
|
48
53
|
if (!selection) {
|
|
49
|
-
return
|
|
54
|
+
return runNotFound(cwd, runInput);
|
|
50
55
|
}
|
|
51
56
|
let preparedRunPaths;
|
|
52
57
|
try {
|
|
@@ -80,14 +85,14 @@ export async function renderObserver(cwdInput, runInput, options = {}) {
|
|
|
80
85
|
const loaded = await loadRunBundlePrepared(selectedPhysicalCwd, preparedRunPaths);
|
|
81
86
|
await validatePreparedRunArtifactPaths(preparedRunPaths);
|
|
82
87
|
if (!loaded) {
|
|
83
|
-
return
|
|
88
|
+
return runNotFound(cwd, runInput);
|
|
84
89
|
}
|
|
85
90
|
if (loaded.bundle.runId !== selection.runId ||
|
|
86
91
|
(await realpath(loaded.runDir)) !== preparedRunPaths.physicalRunRoot) {
|
|
87
92
|
throw new Error("Observer output directory does not match the selected run.");
|
|
88
93
|
}
|
|
89
94
|
const observerPath = path.join(preparedRunPaths.physicalRunRoot, "observer", "index.html");
|
|
90
|
-
const analysis = projectShareCheckedAnalysis(await
|
|
95
|
+
const analysis = projectShareCheckedAnalysis(await loadAnalysis(preparedRunPaths));
|
|
91
96
|
const observerData = buildObserverData(loaded.bundle);
|
|
92
97
|
observerData.publicSafety.share = {
|
|
93
98
|
status: verified.shareSafety.status,
|
|
@@ -118,7 +123,7 @@ export async function renderObserver(cwdInput, runInput, options = {}) {
|
|
|
118
123
|
warnings: [
|
|
119
124
|
loaded.bundle.mode === "live"
|
|
120
125
|
? "Observer renders verified local evidence artifacts; runtime stream auth URLs are not persisted."
|
|
121
|
-
: "
|
|
126
|
+
: "This is a dry run: its participants are synthetic and no product behavior was tested.",
|
|
122
127
|
"Before filing public feedback, use `humanish feedback issue` so redaction and public-safety checks gate the payload.",
|
|
123
128
|
...(openResult.warning ? [openResult.warning] : []),
|
|
124
129
|
],
|
|
@@ -290,7 +295,7 @@ export function desktopOpener(target, host) {
|
|
|
290
295
|
if (host.platform === "win32")
|
|
291
296
|
return { command: "cmd", args: ["/c", "start", "", target] };
|
|
292
297
|
if (!host.env.DISPLAY && !host.env.WAYLAND_DISPLAY)
|
|
293
|
-
return { reason: "no display is available (DISPLAY and WAYLAND_DISPLAY are unset)" };
|
|
298
|
+
return { reason: "no display is available (`DISPLAY` and `WAYLAND_DISPLAY` are unset)" };
|
|
294
299
|
if (!host.onPath("xdg-open"))
|
|
295
300
|
return { reason: "xdg-open is not installed" };
|
|
296
301
|
return { command: "xdg-open", args: [target] };
|
|
@@ -322,7 +327,7 @@ export function openTarget(target, host = { platform: process.platform, env: pro
|
|
|
322
327
|
detached: true,
|
|
323
328
|
stdio: "ignore",
|
|
324
329
|
});
|
|
325
|
-
// An opener that disappears after the PATH check still fails asynchronously (ENOENT). The
|
|
330
|
+
// An opener that disappears after the `PATH` check still fails asynchronously (ENOENT). The
|
|
326
331
|
// served URL remains usable; an opener must never crash its server.
|
|
327
332
|
child.on("error", () => { });
|
|
328
333
|
child.unref();
|
|
@@ -4,14 +4,14 @@ import { type PinnedDirectory } from "./pinned-files.js";
|
|
|
4
4
|
export interface ObserverRuntimeStreamUrl {
|
|
5
5
|
streamId: string;
|
|
6
6
|
url: string;
|
|
7
|
-
/** Set when the
|
|
8
|
-
* dead noVNC page
|
|
9
|
-
* evidence (keyframe replay/screenshot) instead of rendering "sandbox not found"
|
|
7
|
+
/** Set when the participant's sandbox is gone (finished or torn down). An ended stream's live URL is a
|
|
8
|
+
* dead noVNC page; the overlay stops injecting it so the tile falls back to the recorded
|
|
9
|
+
* evidence (keyframe replay/screenshot) instead of rendering "sandbox not found". */
|
|
10
10
|
ended?: boolean;
|
|
11
11
|
}
|
|
12
12
|
/** internal: consumed by src/observer/serve.ts */
|
|
13
13
|
export declare function serveRunPath(runRoot: PinnedDirectory, relativePath: string, response: ServerResponse, runtimeStreamUrls?: ObserverRuntimeStreamUrl[], request?: Pick<IncomingMessage, "method" | "headers">): Promise<void>;
|
|
14
|
-
/** internal: exported for the
|
|
14
|
+
/** internal: exported for the stream lifecycle tests. */
|
|
15
15
|
export declare function withRuntimeStreamUrls(data: ObserverData, runtimeStreamUrls: ObserverRuntimeStreamUrl[]): ObserverData;
|
|
16
16
|
/** internal: consumed by src/observer/serve.ts */
|
|
17
17
|
export declare function buildHistoryIndex(proofRoot: PinnedDirectory, admitRun?: (runId: string, pinned: PinnedDirectory) => Promise<PinnedDirectory | null>): Promise<{
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// URLs, its analysis, and its media with byte ranges. serveObserver (render.ts) and the library
|
|
3
3
|
// server (serve.ts) both route requests through them.
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { isAnalysisRecordPath, projectShareCheckedAnalysis } from "../analysis/sharing.js";
|
|
6
|
+
import { loadAnalysis } from "../analysis/load.js";
|
|
7
7
|
import { listRuns } from "../run/stored-runs.js";
|
|
8
8
|
import { bindExistingRunArtifactPaths, isPathInside, isSafeRunIdSegment } from "../run/paths.js";
|
|
9
9
|
import { RUN_STATUS_FILE, RUN_STATUS_STALE_MS, isRunStatusRecord } from "../run/status.js";
|
|
@@ -23,7 +23,7 @@ async function readObserverAnalysis(runRoot) {
|
|
|
23
23
|
prepared.runRootIdentity.ino !== runRoot.ino) {
|
|
24
24
|
throw new Error("ANALYSIS_STORAGE_CHANGED");
|
|
25
25
|
}
|
|
26
|
-
return projectShareCheckedAnalysis(await
|
|
26
|
+
return projectShareCheckedAnalysis(await loadAnalysis(prepared));
|
|
27
27
|
}
|
|
28
28
|
catch {
|
|
29
29
|
return {
|
|
@@ -51,7 +51,7 @@ export async function serveRunPath(runRoot, relativePath, response, runtimeStrea
|
|
|
51
51
|
const derivedLeaf = path.posix.basename(cleanedRelativePath);
|
|
52
52
|
if (derivedRoot === ".analysis-lock" ||
|
|
53
53
|
derivedLeaf.startsWith(".humanish-write-") ||
|
|
54
|
-
|
|
54
|
+
isAnalysisRecordPath(cleanedRelativePath)) {
|
|
55
55
|
writeResponse(response, 404, "Not found", "text/plain; charset=utf-8");
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
@@ -148,7 +148,7 @@ async function withLocalRunStatus(runRoot, input) {
|
|
|
148
148
|
if (record.state === "finished") {
|
|
149
149
|
state = "finished";
|
|
150
150
|
}
|
|
151
|
-
else if (now - updated <= RUN_STATUS_STALE_MS) {
|
|
151
|
+
else if (record.state === "running" && now - updated <= RUN_STATUS_STALE_MS) {
|
|
152
152
|
state = "running";
|
|
153
153
|
}
|
|
154
154
|
}
|
|
@@ -161,7 +161,7 @@ async function withLocalRunStatus(runRoot, input) {
|
|
|
161
161
|
return data;
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
|
-
/** internal: exported for the
|
|
164
|
+
/** internal: exported for the stream lifecycle tests. */
|
|
165
165
|
export function withRuntimeStreamUrls(data, runtimeStreamUrls) {
|
|
166
166
|
const byStream = new Map(runtimeStreamUrls.map((stream) => [stream.streamId, stream]));
|
|
167
167
|
return {
|
package/dist/observer/serve.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export interface ServeResult {
|
|
|
28
28
|
};
|
|
29
29
|
runsListed: number;
|
|
30
30
|
shareReadyCount?: number;
|
|
31
|
+
/** With --safe: the runs left out, grouped by grade and reasons. */
|
|
32
|
+
hiddenRuns?: HiddenRunGroup[];
|
|
31
33
|
entryRunId?: string;
|
|
32
34
|
opened?: boolean;
|
|
33
35
|
openCommand?: string;
|
|
@@ -46,9 +48,22 @@ interface ServeControlPlane {
|
|
|
46
48
|
runId?: string;
|
|
47
49
|
}>;
|
|
48
50
|
}
|
|
51
|
+
/** Why verify kept a run out of a share-safe library: its grade and reason codes. */
|
|
52
|
+
interface ShareRefusal {
|
|
53
|
+
status: string;
|
|
54
|
+
reasons: string[];
|
|
55
|
+
}
|
|
56
|
+
/** Runs a share-safe library left out for the same grade and reasons. */
|
|
57
|
+
export interface HiddenRunGroup {
|
|
58
|
+
status: string;
|
|
59
|
+
reasons: string[];
|
|
60
|
+
runs: number;
|
|
61
|
+
}
|
|
49
62
|
export interface ShareSafetyAdmission {
|
|
50
63
|
/** The files verify found share_ready, or null when the run is not admitted. */
|
|
51
64
|
admit(runId: string): Promise<AdmittedRun | null>;
|
|
65
|
+
/** Why verify refused the run, after admit returned null for it; undefined otherwise. */
|
|
66
|
+
refusal(runId: string): ShareRefusal | undefined;
|
|
52
67
|
}
|
|
53
68
|
export declare function createShareSafetyAdmission(cwd: string, options?: {
|
|
54
69
|
verifyImpl?: typeof verifyRun;
|
|
@@ -79,6 +94,8 @@ export interface ServeLibraryServer {
|
|
|
79
94
|
mode: ServeMode;
|
|
80
95
|
runsListed: number;
|
|
81
96
|
shareReadyCount?: number;
|
|
97
|
+
/** With safe: the runs left out, grouped by grade and reasons. */
|
|
98
|
+
hiddenRuns?: HiddenRunGroup[];
|
|
82
99
|
entryRunId?: string;
|
|
83
100
|
addPublicOrigin(origin: string): void;
|
|
84
101
|
close(): Promise<void>;
|
package/dist/observer/serve.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { listenOnLoopback, PortInUseError } from "./listen.js";
|
|
2
|
+
import { runNotFoundMessage } from "../run/run-not-found.js";
|
|
2
3
|
import { createServer } from "node:http";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
import { pinDirectChildDirectory, pinDirectory } from "./pinned-files.js";
|
|
@@ -19,11 +20,17 @@ export function createShareSafetyAdmission(cwd, options = {}) {
|
|
|
19
20
|
// content hash at read time, which drops the entry.
|
|
20
21
|
const cache = new Map();
|
|
21
22
|
const shareReady = (verified) => verified.ok === true && verified.shareSafety.status === "share_ready";
|
|
22
|
-
const verifyAdmission = async (runId, runDirectory, before, forget) => {
|
|
23
|
+
const verifyAdmission = async (runId, runDirectory, before, entry, forget) => {
|
|
23
24
|
// A run verify refuses is never served, so its bytes are never hashed. Hashing reads every
|
|
24
25
|
// byte, and one large file in a refused run would otherwise cost startup time for nothing.
|
|
25
|
-
|
|
26
|
+
const verified = await verifyImpl(cwd, runId);
|
|
27
|
+
if (!shareReady(verified)) {
|
|
28
|
+
entry.refusal = {
|
|
29
|
+
status: verified.shareSafety.status === "share_ready" ? "blocked" : verified.shareSafety.status,
|
|
30
|
+
reasons: verified.shareSafety.reasons.map((reason) => reason.code),
|
|
31
|
+
};
|
|
26
32
|
return null;
|
|
33
|
+
}
|
|
27
34
|
// Admitted: hash, verify again, and hash after, so the served bytes are the ones verify scanned.
|
|
28
35
|
const hashesBefore = await hashRunInventory(runDirectory, before);
|
|
29
36
|
if (!hashesBefore)
|
|
@@ -62,12 +69,31 @@ export function createShareSafetyAdmission(cwd, options = {}) {
|
|
|
62
69
|
if (cache.get(runId) === entry)
|
|
63
70
|
cache.delete(runId);
|
|
64
71
|
};
|
|
65
|
-
entry.admitted = verifyAdmission(runId, runDirectory, before, forget).catch(() =>
|
|
72
|
+
entry.admitted = verifyAdmission(runId, runDirectory, before, entry, forget).catch(() => {
|
|
73
|
+
entry.refusal = { status: "unverifiable", reasons: ["VERIFY_FAILED"] };
|
|
74
|
+
return null;
|
|
75
|
+
});
|
|
66
76
|
cache.set(runId, entry);
|
|
67
77
|
return entry.admitted;
|
|
68
78
|
},
|
|
79
|
+
refusal(runId) {
|
|
80
|
+
return cache.get(runId)?.refusal;
|
|
81
|
+
},
|
|
69
82
|
};
|
|
70
83
|
}
|
|
84
|
+
/** The refused runs grouped by grade and reasons, the largest group first. */
|
|
85
|
+
function hiddenRunGroups(refusals) {
|
|
86
|
+
const groups = new Map();
|
|
87
|
+
for (const refusal of refusals) {
|
|
88
|
+
const key = `${refusal.status}\0${refusal.reasons.join(",")}`;
|
|
89
|
+
const group = groups.get(key);
|
|
90
|
+
if (group)
|
|
91
|
+
group.runs += 1;
|
|
92
|
+
else
|
|
93
|
+
groups.set(key, { ...refusal, runs: 1 });
|
|
94
|
+
}
|
|
95
|
+
return [...groups.values()].sort((left, right) => right.runs - left.runs);
|
|
96
|
+
}
|
|
71
97
|
function sameHashes(left, right) {
|
|
72
98
|
return left.size === right.size && [...left].every(([key, hash]) => right.get(key) === hash);
|
|
73
99
|
}
|
|
@@ -190,7 +216,10 @@ export async function serveObserverLibrary(cwdInput, options) {
|
|
|
190
216
|
if (!resolved || !pinned) {
|
|
191
217
|
return {
|
|
192
218
|
ok: false,
|
|
193
|
-
error: {
|
|
219
|
+
error: {
|
|
220
|
+
code: "HUMANISH_RUN_NOT_FOUND",
|
|
221
|
+
message: await runNotFoundMessage(cwd, options.entryRunId),
|
|
222
|
+
},
|
|
194
223
|
};
|
|
195
224
|
}
|
|
196
225
|
if (options.safe && (await admission.admit(resolved)) === null) {
|
|
@@ -207,7 +236,7 @@ export async function serveObserverLibrary(cwdInput, options) {
|
|
|
207
236
|
}
|
|
208
237
|
entryRunId = resolved;
|
|
209
238
|
}
|
|
210
|
-
// Counts are computed over the
|
|
239
|
+
// Counts are computed over the uncapped run list, not the 80-item history
|
|
211
240
|
// index: an edge-authed surface (non-safe) grants access to every run by direct
|
|
212
241
|
// URL, and share-safe modes admit every share_ready run per request, so a
|
|
213
242
|
// count capped at 80 would understate exactly what the exposure warning
|
|
@@ -215,10 +244,15 @@ export async function serveObserverLibrary(cwdInput, options) {
|
|
|
215
244
|
const allRuns = (await listRuns(cwd)).runs;
|
|
216
245
|
let runsListed;
|
|
217
246
|
let shareReadyCount;
|
|
247
|
+
let hiddenRuns;
|
|
218
248
|
if (options.safe) {
|
|
219
249
|
const admitted = await Promise.all(allRuns.map((run) => admission.admit(run.runId)));
|
|
220
250
|
shareReadyCount = admitted.filter((run) => run !== null).length;
|
|
221
251
|
runsListed = shareReadyCount;
|
|
252
|
+
// A run refused before verify ran, such as one whose files cannot be listed, is unverifiable.
|
|
253
|
+
hiddenRuns = hiddenRunGroups(allRuns
|
|
254
|
+
.filter((_run, index) => admitted[index] === null)
|
|
255
|
+
.map((run) => admission.refusal(run.runId) ?? { status: "unverifiable", reasons: ["VERIFY_FAILED"] }));
|
|
222
256
|
}
|
|
223
257
|
else {
|
|
224
258
|
runsListed = allRuns.length;
|
|
@@ -247,7 +281,7 @@ export async function serveObserverLibrary(cwdInput, options) {
|
|
|
247
281
|
}
|
|
248
282
|
catch (error) {
|
|
249
283
|
if (error instanceof PortInUseError) {
|
|
250
|
-
// The most expected failure a serve command has, named instead of HUMANISH_UNEXPECTED
|
|
284
|
+
// The most expected failure a serve command has, named instead of HUMANISH_UNEXPECTED.
|
|
251
285
|
return { ok: false, error: { code: "HUMANISH_SERVE_PORT_IN_USE", message: error.message } };
|
|
252
286
|
}
|
|
253
287
|
throw error;
|
|
@@ -266,6 +300,7 @@ export async function serveObserverLibrary(cwdInput, options) {
|
|
|
266
300
|
mode,
|
|
267
301
|
runsListed,
|
|
268
302
|
...(shareReadyCount !== undefined ? { shareReadyCount } : {}),
|
|
303
|
+
...(hiddenRuns !== undefined ? { hiddenRuns } : {}),
|
|
269
304
|
...(entryRunId ? { entryRunId } : {}),
|
|
270
305
|
// A tunnel's public origin is only known after the tunnel starts (post bind); this lets the
|
|
271
306
|
// caller declare it, extending the Host allowlist so the authenticated edge forwarding under
|
package/dist/observer/tunnel.js
CHANGED
|
@@ -54,7 +54,7 @@ export async function startNgrokTunnel(options) {
|
|
|
54
54
|
child.once("error", (error) => {
|
|
55
55
|
settle({
|
|
56
56
|
error: error.code === "ENOENT"
|
|
57
|
-
? new ServeTunnelError("HUMANISH_SERVE_TUNNEL_NOT_FOUND", "ngrok binary not found on PATH
|
|
57
|
+
? new ServeTunnelError("HUMANISH_SERVE_TUNNEL_NOT_FOUND", "ngrok binary not found on `PATH`. Install ngrok, or run your own tunnel and pass --public-url <origin>.")
|
|
58
58
|
: new ServeTunnelError("HUMANISH_SERVE_TUNNEL_START_FAILED", `ngrok failed to start: ${error.message}`),
|
|
59
59
|
});
|
|
60
60
|
});
|