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/run/projection.d.ts
CHANGED
|
@@ -8,12 +8,12 @@ export interface LabRollup {
|
|
|
8
8
|
live: number;
|
|
9
9
|
/** The newest run of this lab, whatever its state. */
|
|
10
10
|
latest?: RunIndexEntry;
|
|
11
|
-
/** Live runs, newest first
|
|
11
|
+
/** Live runs, newest first; the labs list shows the first one inline. */
|
|
12
12
|
liveRuns: RunIndexEntry[];
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Group runs by lab, newest-first within each lab and by recency between labs. Runs with no lab
|
|
16
|
-
* attribution are collected under `unattributed` rather than invented into a
|
|
16
|
+
* attribution are collected under `unattributed` rather than invented into a study. That is the
|
|
17
17
|
* home for pre-contract runs and library callers.
|
|
18
18
|
*/
|
|
19
19
|
export declare function groupRunsByLab(entries: readonly RunIndexEntry[]): {
|
|
@@ -35,17 +35,17 @@ export interface LabExpectation {
|
|
|
35
35
|
max: number;
|
|
36
36
|
};
|
|
37
37
|
medianCostUsd?: number;
|
|
38
|
-
/** Completed runs whose cost was declared absent
|
|
38
|
+
/** Completed runs whose cost was declared absent: excluded from the median, reported here so
|
|
39
39
|
* a partial sample can never masquerade as a full one. */
|
|
40
40
|
costUnknown: number;
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
|
-
* Derive what to expect from a lab's own history. Only
|
|
43
|
+
* Derive what to expect from a lab's own history. Only finished runs count: an interrupted run's
|
|
44
44
|
* duration is the length of an accident, not of a study, and including it would quietly bias the
|
|
45
45
|
* estimate the operator uses to decide whether to press Start.
|
|
46
46
|
*
|
|
47
|
-
*
|
|
48
|
-
* takes no time, so a median over nine dry runs and one live one reports that a live run is free
|
|
47
|
+
* The mode matters: mixing modes produces a false figure. A dry run spends nothing and
|
|
48
|
+
* takes no time, so a median over nine dry runs and one live one reports that a live run is free,
|
|
49
49
|
* next to a control that spends money. Pass the mode the figure is about; omit it only for a
|
|
50
50
|
* summary that is not attached to an action.
|
|
51
51
|
*/
|
|
@@ -53,15 +53,15 @@ export declare function expectationFor(entries: readonly RunIndexEntry[], mode?:
|
|
|
53
53
|
/**
|
|
54
54
|
* The one sentence the launch screen shows about time and money, with its denominator attached.
|
|
55
55
|
* A lab with no history says so plainly instead of borrowing another lab's numbers or inventing
|
|
56
|
-
* a range
|
|
56
|
+
* a range. "No runs yet" is information, and the operator can still press Start.
|
|
57
57
|
*/
|
|
58
58
|
export declare function expectationLine(expectation: LabExpectation): string;
|
|
59
59
|
/**
|
|
60
60
|
* The one line a lab may say about itself, wherever it is shown.
|
|
61
61
|
*
|
|
62
|
-
* Prefers
|
|
62
|
+
* Prefers live figures: cost and duration are what someone reads before spending, and a median
|
|
63
63
|
* diluted by dry runs reports a live study as cheaper and faster than it has ever been. With no
|
|
64
|
-
* live history it reports the count and claims nothing about time or money
|
|
64
|
+
* live history it reports the count and claims nothing about time or money. That is why this is
|
|
65
65
|
* shared rather than reimplemented per surface, since the two disagreeing is the whole failure.
|
|
66
66
|
*/
|
|
67
67
|
export declare function labSummaryLine(row: Pick<LabRow, "runs" | "declared" | "expectation" | "liveExpectation">): string;
|
|
@@ -69,7 +69,7 @@ export declare function labSummaryLine(row: Pick<LabRow, "runs" | "declared" | "
|
|
|
69
69
|
export declare function formatDuration(ms: number): string;
|
|
70
70
|
export interface NormalizedThought {
|
|
71
71
|
lines: string[];
|
|
72
|
-
/** True when the source text did not fit and was cut
|
|
72
|
+
/** True when the source text did not fit and was cut; shown, never silent. */
|
|
73
73
|
truncated: boolean;
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
@@ -77,7 +77,7 @@ export interface NormalizedThought {
|
|
|
77
77
|
* arrive with markdown section leads (`**Thinking through setup**`) and hard newlines; a terminal
|
|
78
78
|
* needs plain text wrapped to a line budget.
|
|
79
79
|
*
|
|
80
|
-
* The text is never paraphrased or shortened by meaning
|
|
80
|
+
* The text is never paraphrased or shortened by meaning. It is only wrapped, and cut at a word boundary
|
|
81
81
|
* with an ellipsis when it does not fit. `truncated` is how the surface says so.
|
|
82
82
|
*/
|
|
83
83
|
export declare function normalizeThought(text: string, options: {
|
|
@@ -104,15 +104,15 @@ export declare function livenessLabel(entry: Pick<RunIndexEntry, "liveness" | "v
|
|
|
104
104
|
/** A lab as the labs list shows it: what is declared, joined to what actually happened. */
|
|
105
105
|
export interface LabRow {
|
|
106
106
|
/**
|
|
107
|
-
* Stable identity for
|
|
107
|
+
* Stable identity for this row. A manifest's path when it has one, else the lab id, because two
|
|
108
108
|
* manifests can declare the same id, and keying rows by id makes them collapse into a pair of
|
|
109
109
|
* indistinguishable duplicates.
|
|
110
110
|
*/
|
|
111
111
|
key: string;
|
|
112
|
-
/** The declared id. Run history attributes to this, so it is
|
|
112
|
+
/** The declared id. Run history attributes to this, so it is not unique across manifests. */
|
|
113
113
|
labId: string;
|
|
114
114
|
/**
|
|
115
|
-
* The handle an operator would actually type. Lab resolution is by
|
|
115
|
+
* The handle an operator would actually type. Lab resolution is by filename, so the manifest
|
|
116
116
|
* `\`.humanish/labs/persona-contrast-live.yaml\`` is reached as `persona-contrast-live` even when
|
|
117
117
|
* the id inside it says something else.
|
|
118
118
|
*/
|
|
@@ -120,26 +120,26 @@ export interface LabRow {
|
|
|
120
120
|
/** The manifest's own title, when it has one. */
|
|
121
121
|
title?: string;
|
|
122
122
|
/**
|
|
123
|
-
* The shortest label that is
|
|
123
|
+
* The shortest label that is unique among the rows it is listed with: the title when no other
|
|
124
124
|
* lab shares it, else the filename, else the full path. A list is only navigable if every row can
|
|
125
|
-
* be told from every other one, and a title is not guaranteed to be distinct
|
|
126
|
-
* this repo carry the same title
|
|
125
|
+
* be told from every other one, and a title is not guaranteed to be distinct: two manifests in
|
|
126
|
+
* this repo carry the same title and the same declared id, differing only by filename.
|
|
127
127
|
*/
|
|
128
128
|
label: string;
|
|
129
|
-
/** The manifest's own words, for the list to say what this study
|
|
129
|
+
/** The manifest's own words, for the list to say what this study is. */
|
|
130
130
|
description?: string;
|
|
131
131
|
/** Repo-relative manifest path, absent for a lab known only from run history. */
|
|
132
132
|
path?: string;
|
|
133
133
|
origin?: "committed" | "ignored" | "explicit";
|
|
134
134
|
/**
|
|
135
|
-
* False for a lab that has runs but
|
|
135
|
+
* False for a lab that has runs but no manifest here: renamed, deleted, or run from a path that
|
|
136
136
|
* is gone. Its runs are still evidence and must stay reachable, so it is listed and marked rather
|
|
137
137
|
* than dropped.
|
|
138
138
|
*/
|
|
139
139
|
declared: boolean;
|
|
140
140
|
/**
|
|
141
|
-
* How many
|
|
142
|
-
* between them and cannot be attributed to one file
|
|
141
|
+
* How many other manifests declare this same lab id. Above zero, the run history below is shared
|
|
142
|
+
* between them and cannot be attributed to one file. That is worth saying, because it is a
|
|
143
143
|
* misconfiguration the operator almost certainly does not know about.
|
|
144
144
|
*/
|
|
145
145
|
sharesIdWith: number;
|
|
@@ -149,7 +149,7 @@ export interface LabRow {
|
|
|
149
149
|
liveRuns: RunIndexEntry[];
|
|
150
150
|
/** Across every finished run, whatever its mode. A summary, never attached to a spend decision. */
|
|
151
151
|
expectation: LabExpectation;
|
|
152
|
-
/** Live runs only
|
|
152
|
+
/** Live runs only: the figure that belongs beside anything that spends money. */
|
|
153
153
|
liveExpectation: LabExpectation;
|
|
154
154
|
}
|
|
155
155
|
export interface DeclaredLab {
|
|
@@ -163,19 +163,19 @@ export interface DeclaredLab {
|
|
|
163
163
|
/**
|
|
164
164
|
* Join declared lab manifests to run history.
|
|
165
165
|
*
|
|
166
|
-
* Neither side alone is the truth. A fresh project has manifests and no runs
|
|
166
|
+
* Neither side alone is the truth. A fresh project has manifests and no runs, and those labs are the
|
|
167
167
|
* whole screen, and a list built only from history would be empty on exactly the first visit that
|
|
168
168
|
* matters. A long-lived project accumulates runs from labs whose manifest has since been renamed or
|
|
169
|
-
* deleted
|
|
169
|
+
* deleted. That evidence still exists on disk, so dropping those rows would make real runs
|
|
170
170
|
* unreachable from the surface that is supposed to list them.
|
|
171
171
|
*
|
|
172
|
-
*
|
|
172
|
+
* One row per manifest, not per id. The two are not the same thing: a manifest is addressed by its
|
|
173
173
|
* filename while its runs attribute to the id declared inside it, so several files can legitimately
|
|
174
174
|
* share an id. Collapsing them hides a real file; keying by id duplicates a row with no way to tell
|
|
175
|
-
* the copies apart. Both happen in practice
|
|
175
|
+
* the copies apart. Both happen in practice: this repo has exactly that pair.
|
|
176
176
|
*
|
|
177
177
|
* Order puts a lab someone is working in first, then labs by how recently they ran, then declared
|
|
178
|
-
* labs that have never run (alphabetically
|
|
178
|
+
* labs that have never run (alphabetically by the displayed label, so the order on screen is the
|
|
179
179
|
* order a reader can predict), then labs known only from history.
|
|
180
180
|
*/
|
|
181
181
|
export declare function labRows(declared: readonly DeclaredLab[], entries: readonly RunIndexEntry[]): {
|
package/dist/run/projection.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
// The disk→view-model projection
|
|
1
|
+
// The disk→view-model projection. Pure functions, no I/O, no rendering: this is where
|
|
2
2
|
// lab grouping, the trust line's arithmetic, thought normalization and list-window math live, so
|
|
3
3
|
// the parts most likely to be wrong are testable without a terminal.
|
|
4
4
|
//
|
|
5
|
-
// The
|
|
6
|
-
// - a statistic
|
|
5
|
+
// The rules these encode, because they are the ones a UI is most tempted to break:
|
|
6
|
+
// - a statistic always carries its denominator, and says when it has none;
|
|
7
7
|
// - an unknown cost is `null` (declared absent), never 0;
|
|
8
8
|
// - truncation is reported, never silent;
|
|
9
9
|
// - a participant's reported thinking is quoted, never paraphrased or summarized.
|
|
10
10
|
/**
|
|
11
11
|
* Group runs by lab, newest-first within each lab and by recency between labs. Runs with no lab
|
|
12
|
-
* attribution are collected under `unattributed` rather than invented into a
|
|
12
|
+
* attribution are collected under `unattributed` rather than invented into a study. That is the
|
|
13
13
|
* home for pre-contract runs and library callers.
|
|
14
14
|
*/
|
|
15
15
|
export function groupRunsByLab(entries) {
|
|
16
16
|
const byLab = new Map();
|
|
17
17
|
const unattributed = [];
|
|
18
18
|
for (const entry of entries) {
|
|
19
|
-
const labId = entry.
|
|
19
|
+
const labId = entry.study?.id;
|
|
20
20
|
if (labId === undefined) {
|
|
21
21
|
unattributed.push(entry);
|
|
22
22
|
continue;
|
|
@@ -58,12 +58,12 @@ function recencyOf(entry) {
|
|
|
58
58
|
return 0;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
|
-
* Derive what to expect from a lab's own history. Only
|
|
61
|
+
* Derive what to expect from a lab's own history. Only finished runs count: an interrupted run's
|
|
62
62
|
* duration is the length of an accident, not of a study, and including it would quietly bias the
|
|
63
63
|
* estimate the operator uses to decide whether to press Start.
|
|
64
64
|
*
|
|
65
|
-
*
|
|
66
|
-
* takes no time, so a median over nine dry runs and one live one reports that a live run is free
|
|
65
|
+
* The mode matters: mixing modes produces a false figure. A dry run spends nothing and
|
|
66
|
+
* takes no time, so a median over nine dry runs and one live one reports that a live run is free,
|
|
67
67
|
* next to a control that spends money. Pass the mode the figure is about; omit it only for a
|
|
68
68
|
* summary that is not attached to an action.
|
|
69
69
|
*/
|
|
@@ -78,8 +78,8 @@ export function expectationFor(entries, mode) {
|
|
|
78
78
|
.map((entry) => entry.estimatedCostUsd)
|
|
79
79
|
.filter((value) => typeof value === "number" && Number.isFinite(value))
|
|
80
80
|
.sort((a, b) => a - b);
|
|
81
|
-
// A cost is unknown whether it was
|
|
82
|
-
// (`undefined
|
|
81
|
+
// A cost is unknown whether it was declared absent (`null`) or never recorded at all
|
|
82
|
+
// (`undefined`: every fail-closed exit finalized with no outcome). Counting only the first
|
|
83
83
|
// reports "~$1.20 median · 3 runs" for a sample where two runs were never priced, which claims a
|
|
84
84
|
// denominator the figure does not have.
|
|
85
85
|
const costUnknown = finished.filter((entry) => entry.estimatedCostUsd === null || entry.estimatedCostUsd === undefined).length;
|
|
@@ -104,7 +104,7 @@ function median(sorted) {
|
|
|
104
104
|
/**
|
|
105
105
|
* The one sentence the launch screen shows about time and money, with its denominator attached.
|
|
106
106
|
* A lab with no history says so plainly instead of borrowing another lab's numbers or inventing
|
|
107
|
-
* a range
|
|
107
|
+
* a range. "No runs yet" is information, and the operator can still press Start.
|
|
108
108
|
*/
|
|
109
109
|
export function expectationLine(expectation) {
|
|
110
110
|
if (expectation.sample === 0)
|
|
@@ -134,9 +134,9 @@ export function expectationLine(expectation) {
|
|
|
134
134
|
/**
|
|
135
135
|
* The one line a lab may say about itself, wherever it is shown.
|
|
136
136
|
*
|
|
137
|
-
* Prefers
|
|
137
|
+
* Prefers live figures: cost and duration are what someone reads before spending, and a median
|
|
138
138
|
* diluted by dry runs reports a live study as cheaper and faster than it has ever been. With no
|
|
139
|
-
* live history it reports the count and claims nothing about time or money
|
|
139
|
+
* live history it reports the count and claims nothing about time or money. That is why this is
|
|
140
140
|
* shared rather than reimplemented per surface, since the two disagreeing is the whole failure.
|
|
141
141
|
*/
|
|
142
142
|
export function labSummaryLine(row) {
|
|
@@ -162,7 +162,7 @@ export function formatDuration(ms) {
|
|
|
162
162
|
* arrive with markdown section leads (`**Thinking through setup**`) and hard newlines; a terminal
|
|
163
163
|
* needs plain text wrapped to a line budget.
|
|
164
164
|
*
|
|
165
|
-
* The text is never paraphrased or shortened by meaning
|
|
165
|
+
* The text is never paraphrased or shortened by meaning. It is only wrapped, and cut at a word boundary
|
|
166
166
|
* with an ellipsis when it does not fit. `truncated` is how the surface says so.
|
|
167
167
|
*/
|
|
168
168
|
export function normalizeThought(text, options) {
|
|
@@ -247,19 +247,19 @@ function labNameFromPath(manifestPath) {
|
|
|
247
247
|
/**
|
|
248
248
|
* Join declared lab manifests to run history.
|
|
249
249
|
*
|
|
250
|
-
* Neither side alone is the truth. A fresh project has manifests and no runs
|
|
250
|
+
* Neither side alone is the truth. A fresh project has manifests and no runs, and those labs are the
|
|
251
251
|
* whole screen, and a list built only from history would be empty on exactly the first visit that
|
|
252
252
|
* matters. A long-lived project accumulates runs from labs whose manifest has since been renamed or
|
|
253
|
-
* deleted
|
|
253
|
+
* deleted. That evidence still exists on disk, so dropping those rows would make real runs
|
|
254
254
|
* unreachable from the surface that is supposed to list them.
|
|
255
255
|
*
|
|
256
|
-
*
|
|
256
|
+
* One row per manifest, not per id. The two are not the same thing: a manifest is addressed by its
|
|
257
257
|
* filename while its runs attribute to the id declared inside it, so several files can legitimately
|
|
258
258
|
* share an id. Collapsing them hides a real file; keying by id duplicates a row with no way to tell
|
|
259
|
-
* the copies apart. Both happen in practice
|
|
259
|
+
* the copies apart. Both happen in practice: this repo has exactly that pair.
|
|
260
260
|
*
|
|
261
261
|
* Order puts a lab someone is working in first, then labs by how recently they ran, then declared
|
|
262
|
-
* labs that have never run (alphabetically
|
|
262
|
+
* labs that have never run (alphabetically by the displayed label, so the order on screen is the
|
|
263
263
|
* order a reader can predict), then labs known only from history.
|
|
264
264
|
*/
|
|
265
265
|
export function labRows(declared, entries) {
|
|
@@ -267,7 +267,7 @@ export function labRows(declared, entries) {
|
|
|
267
267
|
const byId = new Map(labs.map((lab) => [lab.labId, lab]));
|
|
268
268
|
const runsOf = new Map();
|
|
269
269
|
for (const entry of entries) {
|
|
270
|
-
const labId = entry.
|
|
270
|
+
const labId = entry.study?.id;
|
|
271
271
|
if (labId === undefined)
|
|
272
272
|
continue;
|
|
273
273
|
const bucket = runsOf.get(labId);
|
|
@@ -310,7 +310,7 @@ export function labRows(declared, entries) {
|
|
|
310
310
|
.filter((lab) => !declaredIds.has(lab.labId))
|
|
311
311
|
.map((lab) => build(lab.labId, undefined, false)),
|
|
312
312
|
];
|
|
313
|
-
// Resolve each row's label
|
|
313
|
+
// Resolve each row's label before sorting, so the list is ordered by what a reader actually sees.
|
|
314
314
|
assignLabels(rows);
|
|
315
315
|
const label = (row) => row.label;
|
|
316
316
|
rows.sort((left, right) => {
|
|
@@ -332,8 +332,8 @@ export function labRows(declared, entries) {
|
|
|
332
332
|
/**
|
|
333
333
|
* Give every row the shortest label that distinguishes it: title, else filename, else path.
|
|
334
334
|
*
|
|
335
|
-
* Falling straight back to the filename whenever a title repeats
|
|
336
|
-
* duplicate with a suffix
|
|
335
|
+
* Falling straight back to the filename whenever a title repeats, instead of decorating the
|
|
336
|
+
* duplicate with a suffix, keeps the label something the operator can act on, because the filename
|
|
337
337
|
* is exactly what `humanish lab run` takes.
|
|
338
338
|
*/
|
|
339
339
|
function assignLabels(rows) {
|
package/dist/run/reclaim.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type E2BDesktopModule } from "../substrates/e2b/sdk.js";
|
|
2
|
+
import { type PreparedRunArtifactPaths } from "./paths.js";
|
|
2
3
|
declare const RECLAIM_RESULT_SCHEMA = "humanish.reclaim-result.v1";
|
|
3
4
|
export declare const RECLAIM_RECEIPT_ARTIFACT = "reclaim-receipt.json";
|
|
4
5
|
interface ReclaimOutcome {
|
|
@@ -31,6 +32,11 @@ export interface ReclaimHooks {
|
|
|
31
32
|
requestTimeoutMs?: number;
|
|
32
33
|
}
|
|
33
34
|
export declare function reclaimRunSandboxes(cwd: string, runInput: string, hooks?: ReclaimHooks): Promise<ReclaimResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Reclaim the run whose directory the caller already holds. Nothing is resolved, so an id that is
|
|
37
|
+
* also an alias (a run named `latest`) cannot reach another run's receipts.
|
|
38
|
+
*/
|
|
39
|
+
export declare function reclaimPinnedRunSandboxes(cwd: string, runPaths: PreparedRunArtifactPaths, hooks?: ReclaimHooks): Promise<ReclaimResult>;
|
|
34
40
|
/**
|
|
35
41
|
* Kill the sandboxes left by interrupted `humanish lab preflight` probes. A probe journals under
|
|
36
42
|
* .humanish/preflight/<probe-id>/ and removes the journal after a confirmed kill, so what is left
|
package/dist/run/reclaim.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// `humanish reclaim`: kill an interrupted run's sandboxes by the
|
|
1
|
+
// `humanish reclaim`: kill an interrupted run's sandboxes by the exact ids the run journaled at
|
|
2
2
|
// create time (sandbox-receipts.ndjson), and report what happened to each. It reads one file inside
|
|
3
3
|
// the managed run dir, kills by id, and never lists the account: an account-wide operation once
|
|
4
4
|
// destroyed unrelated infrastructure. Without it, orphaned sandboxes run until the server-side
|
|
@@ -13,7 +13,17 @@ import { redactText, toErrorMessage } from "../evidence/redaction.js";
|
|
|
13
13
|
import { runIdOf } from "./paths.js";
|
|
14
14
|
const RECLAIM_RESULT_SCHEMA = "humanish.reclaim-result.v1";
|
|
15
15
|
export const RECLAIM_RECEIPT_ARTIFACT = "reclaim-receipt.json";
|
|
16
|
-
export
|
|
16
|
+
export function reclaimRunSandboxes(cwd, runInput, hooks = {}) {
|
|
17
|
+
return reclaimRun(cwd, runInput, () => resolveRunPath(cwd, runInput), hooks);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Reclaim the run whose directory the caller already holds. Nothing is resolved, so an id that is
|
|
21
|
+
* also an alias (a run named `latest`) cannot reach another run's receipts.
|
|
22
|
+
*/
|
|
23
|
+
export function reclaimPinnedRunSandboxes(cwd, runPaths, hooks = {}) {
|
|
24
|
+
return reclaimRun(cwd, runIdOf(runPaths), () => Promise.resolve(runPaths), hooks);
|
|
25
|
+
}
|
|
26
|
+
async function reclaimRun(cwd, runInput, locate, hooks) {
|
|
17
27
|
const warnings = [];
|
|
18
28
|
const base = {
|
|
19
29
|
schema: RECLAIM_RESULT_SCHEMA,
|
|
@@ -25,7 +35,7 @@ export async function reclaimRunSandboxes(cwd, runInput, hooks = {}) {
|
|
|
25
35
|
};
|
|
26
36
|
if (e2bDebugMode())
|
|
27
37
|
return { ...base, ok: false, error: E2B_DEBUG_REFUSAL };
|
|
28
|
-
const runPaths = await
|
|
38
|
+
const runPaths = await locate();
|
|
29
39
|
if (!runPaths) {
|
|
30
40
|
return {
|
|
31
41
|
...base,
|
|
@@ -39,8 +49,8 @@ export async function reclaimRunSandboxes(cwd, runInput, hooks = {}) {
|
|
|
39
49
|
const runId = runIdOf(runPaths);
|
|
40
50
|
const journal = await reclaimJournal(runPaths, hooks);
|
|
41
51
|
if (journal.kind === "empty") {
|
|
42
|
-
//
|
|
43
|
-
// nothing to reclaim) or the run predates receipts (0.35.x and earlier
|
|
52
|
+
// Empty: nothing journaled means either no sandbox was ever created (cheap interrupt:
|
|
53
|
+
// nothing to reclaim) or the run predates receipts (0.35.x and earlier, where the create-time TTL
|
|
44
54
|
// is the only backstop for those). Either way there is no id to act on, and saying so beats
|
|
45
55
|
// pretending a scan happened.
|
|
46
56
|
warnings.push("No sandbox-receipts.ndjson in this run dir: either no sandbox was created before the interrupt, or the run predates create-time receipts. Nothing to reclaim by id; server-side kill-on-timeout covers anything that did exist.");
|
package/dist/run/results.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { ObserverResult } from "../observer/render.js";
|
|
2
2
|
import type { RunProviderResource } from "./bundle.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { RunStudyProvenance } from "./study-provenance.js";
|
|
4
4
|
export declare const CLEANUP_SCHEMA = "humanish.cleanup-result.v1";
|
|
5
5
|
export interface RunOptions {
|
|
6
|
-
/** Which manifest produced this run
|
|
7
|
-
lab?:
|
|
6
|
+
/** Which manifest produced this run. */
|
|
7
|
+
lab?: RunStudyProvenance;
|
|
8
8
|
cwd: string;
|
|
9
9
|
dryRun?: boolean;
|
|
10
10
|
runId?: string;
|
|
11
|
-
|
|
11
|
+
participantCount?: number;
|
|
12
12
|
/** Render the run's Observer through the finished run, opening the page when `open` is true.
|
|
13
13
|
* Without it the preview writes no observer/index.html. */
|
|
14
14
|
observer?: {
|
|
@@ -30,7 +30,7 @@ export interface RunResult {
|
|
|
30
30
|
observer?: ObserverResult;
|
|
31
31
|
warnings: string[];
|
|
32
32
|
error?: {
|
|
33
|
-
code: "
|
|
33
|
+
code: "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_ANALYSIS_UNSUPPORTED" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_STUDY_OPTION_UNSUPPORTED" | "HUMANISH_STUDY_COMMS_UNSUPPORTED" | "HUMANISH_LIVE_RUN_UNIMPLEMENTED" | "HUMANISH_INVALID_CWD" | "HUMANISH_RUN_ID_IN_USE" | "HUMANISH_INVALID_PARTICIPANT_COUNT" | "HUMANISH_INVALID_PORT" | "HUMANISH_UNSUPPORTED_RERUN_FLAGS" | "HUMANISH_WATCH_OPTION_CONFLICT" | "HUMANISH_WATCH_SAFE_NOT_APPLICABLE" | "HUMANISH_RUN_OPTION_CONFLICT" | "HUMANISH_OBSERVE_OPTION_CONFLICT" | "HUMANISH_STUDY_SCORER_BAD_REF" | "HUMANISH_STUDY_SCORER_NOT_FOUND" | "HUMANISH_STUDY_SCORER_LOAD_FAILED" | "HUMANISH_STUDY_SCORER_NO_HOOKS" | "HUMANISH_STUDY_SCORER_UNSUPPORTED_BACKEND";
|
|
34
34
|
message: string;
|
|
35
35
|
};
|
|
36
36
|
}
|
package/dist/run/run-index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type RunLiveness, type RunStatusRecord } from "./status.js";
|
|
2
|
+
import { type RunStudyProvenance } from "./study-provenance.js";
|
|
2
3
|
declare const RUN_INDEX_SCHEMA = "humanish.run-index.v1";
|
|
3
4
|
export interface RunIndexEntry {
|
|
4
5
|
runId: string;
|
|
@@ -7,12 +8,12 @@ export interface RunIndexEntry {
|
|
|
7
8
|
liveness: RunLiveness;
|
|
8
9
|
mode?: "dry-run" | "live";
|
|
9
10
|
/**
|
|
10
|
-
* The pid that owns a run, when it recorded one. This is how a surface identifies the run
|
|
11
|
+
* The pid that owns a run, when it recorded one. This is how a surface identifies the run it just
|
|
11
12
|
* started without minting an id or guessing at a new directory: it spawned a process, and exactly
|
|
12
13
|
* one run's record carries that pid.
|
|
13
14
|
*/
|
|
14
15
|
pid?: number;
|
|
15
|
-
|
|
16
|
+
study?: RunStudyProvenance;
|
|
16
17
|
startedAt?: string;
|
|
17
18
|
updatedAt?: string;
|
|
18
19
|
completedAt?: string;
|
|
@@ -31,7 +32,7 @@ export interface RunIndexResult {
|
|
|
31
32
|
cwd: string;
|
|
32
33
|
/** Newest first, by the best timestamp each entry has. */
|
|
33
34
|
runs: RunIndexEntry[];
|
|
34
|
-
/** Directories that could not be read at all, by name
|
|
35
|
+
/** Directories that could not be read at all, by name: surfaced, never silently dropped. */
|
|
35
36
|
unreadable: string[];
|
|
36
37
|
}
|
|
37
38
|
/** What a cached entry was derived from, so a changed file invalidates exactly that entry. */
|
|
@@ -59,7 +60,8 @@ interface BundleFacts {
|
|
|
59
60
|
runId?: string;
|
|
60
61
|
mode?: string;
|
|
61
62
|
createdAt?: string;
|
|
62
|
-
|
|
63
|
+
study?: unknown;
|
|
64
|
+
lab?: unknown;
|
|
63
65
|
persona?: {
|
|
64
66
|
source?: string;
|
|
65
67
|
};
|
|
@@ -95,8 +97,8 @@ export interface ReadRunIndexOptions {
|
|
|
95
97
|
cache?: RunIndexCache;
|
|
96
98
|
/** Injectable clock, so liveness classification is reproducible in tests. */
|
|
97
99
|
nowMs?: number;
|
|
98
|
-
/** Cap the number of runs returned (newest first). The full directory is still enumerated
|
|
99
|
-
*
|
|
100
|
+
/** Cap the number of runs returned (newest first). The full directory is still enumerated;
|
|
101
|
+
* the cap limits reads, and the count reflects what was read. */
|
|
100
102
|
limit?: number;
|
|
101
103
|
}
|
|
102
104
|
/**
|
package/dist/run/run-index.js
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
// The run index
|
|
1
|
+
// The run index: list and classify every run in a project without parsing bundles.
|
|
2
2
|
//
|
|
3
|
-
// The existing `listRuns` walks each run tree
|
|
3
|
+
// The existing `listRuns` walks each run tree, screenshots included, validating symlinks and
|
|
4
4
|
// then parses each `run.json`: measured 197ms cold / 152ms warm at 25 runs. That is fine for a
|
|
5
5
|
// command that prints once and exits, and much too hot for a surface that refreshes on a cadence
|
|
6
6
|
// over SSH. This module reads the small `status.json` record each run now writes (586 bytes beside
|
|
7
7
|
// a 92KB bundle) and caches per-run entries keyed on the stat of the file each was derived from.
|
|
8
8
|
//
|
|
9
|
-
//
|
|
9
|
+
// Rules, unchanged from the record itself:
|
|
10
10
|
// - `run.json` is the evidence-of-record. Every field here is a projection for listing and
|
|
11
11
|
// classification; nothing here is a claim about what a participant did.
|
|
12
|
-
// - A run with no status record is
|
|
13
|
-
// a bundle means finished, receipts without a bundle mean interrupted. That is the
|
|
14
|
-
// reading of a run whose process died
|
|
12
|
+
// - A run with no status record is not assumed finished. It is classified from what is on disk:
|
|
13
|
+
// a bundle means finished, receipts without a bundle mean interrupted. That is the
|
|
14
|
+
// reading of a run whose process died (and, before this contract existed, of every run).
|
|
15
15
|
// - One unreadable run directory degrades that run, never the listing.
|
|
16
16
|
import { readdir, readFile, stat } from "node:fs/promises";
|
|
17
17
|
import path from "node:path";
|
|
18
|
-
import { RUN_STATUS_FILE, classifyRunStatus,
|
|
18
|
+
import { RUN_STATUS_FILE, classifyRunStatus, isRunStatusRecord, } from "./status.js";
|
|
19
|
+
import { studyProvenanceOf } from "./study-provenance.js";
|
|
19
20
|
import { RUN_BUNDLE_FILE } from "./bundle.js";
|
|
20
21
|
const RUN_INDEX_SCHEMA = "humanish.run-index.v1";
|
|
21
22
|
/**
|
|
@@ -78,7 +79,7 @@ function entryFromStatus(record, nowMs) {
|
|
|
78
79
|
liveness: classifyRunStatus(record, nowMs),
|
|
79
80
|
mode: record.mode,
|
|
80
81
|
...(typeof record.pid === "number" ? { pid: record.pid } : {}),
|
|
81
|
-
...(record
|
|
82
|
+
...studyEntry(studyProvenanceOf(record)),
|
|
82
83
|
startedAt: record.startedAt,
|
|
83
84
|
updatedAt: record.updatedAt,
|
|
84
85
|
...(record.completedAt === undefined ? {} : { completedAt: record.completedAt }),
|
|
@@ -97,10 +98,10 @@ function usableStatusRecord(raw, runId) {
|
|
|
97
98
|
return isRunStatusRecord(raw) && raw.runId === runId;
|
|
98
99
|
}
|
|
99
100
|
/**
|
|
100
|
-
* The bundle-only reading, for a run with no usable status record. A bundle on disk
|
|
101
|
-
* the run reached its final write. But a live run now flushes an
|
|
101
|
+
* The bundle-only reading, for a run with no usable status record. A bundle on disk usually means
|
|
102
|
+
* the run reached its final write. But a live run now flushes an in-progress bundle as it goes (so
|
|
102
103
|
* anything asking what a participant is doing has something to read), and that bundle marks its
|
|
103
|
-
* simulations `running`. With no status record there is no freshness to judge, and the
|
|
104
|
+
* simulations `running`. With no status record there is no freshness to judge, and the
|
|
104
105
|
* reading of "it started, and nothing here says it finished" is interrupted, not finished.
|
|
105
106
|
*/
|
|
106
107
|
function bundleLiveness(bundle) {
|
|
@@ -117,18 +118,16 @@ export function runLiveness(runId, status, bundle, nowMs) {
|
|
|
117
118
|
? { liveness: classifyRunStatus(status, nowMs), record: status }
|
|
118
119
|
: { liveness: bundleLiveness(bundle) };
|
|
119
120
|
}
|
|
121
|
+
function studyEntry(study) {
|
|
122
|
+
return study === undefined ? {} : { study };
|
|
123
|
+
}
|
|
120
124
|
function entryFromBundle(runId, bundle) {
|
|
121
|
-
const legacyLabId = bundle.lab === undefined ? inferLegacyLabId(bundle) : undefined;
|
|
122
125
|
return {
|
|
123
126
|
runId,
|
|
124
127
|
derivedFrom: "bundle",
|
|
125
128
|
liveness: bundleLiveness(bundle),
|
|
126
129
|
...(bundle.mode === "dry-run" || bundle.mode === "live" ? { mode: bundle.mode } : {}),
|
|
127
|
-
...(bundle
|
|
128
|
-
? { lab: bundle.lab }
|
|
129
|
-
: legacyLabId === undefined
|
|
130
|
-
? {}
|
|
131
|
-
: { lab: { id: legacyLabId } }),
|
|
130
|
+
...studyEntry(studyProvenanceOf(bundle)),
|
|
132
131
|
...(bundle.createdAt === undefined ? {} : { startedAt: bundle.createdAt }),
|
|
133
132
|
...(bundle.review?.verdict === undefined ? {} : { verdict: bundle.review.verdict }),
|
|
134
133
|
...(bundle.review?.participants === undefined
|
|
@@ -169,15 +168,15 @@ export async function readRunIndex(cwdInput, options = {}) {
|
|
|
169
168
|
if (statusKey !== null) {
|
|
170
169
|
const cached = cache?.get(runId, statusKey);
|
|
171
170
|
if (cached !== undefined) {
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
|
|
171
|
+
// A running record's liveness is time-dependent, so it is recomputed even on a cache hit:
|
|
172
|
+
// an unchanged record can still have gone stale. An ended record (finished or
|
|
173
|
+
// interrupted, both with completedAt) keeps the liveness it was cached with.
|
|
174
|
+
runs.push(cached.derivedFrom === "status" &&
|
|
175
|
+
cached.updatedAt !== undefined &&
|
|
176
|
+
cached.completedAt === undefined
|
|
175
177
|
? {
|
|
176
178
|
...cached,
|
|
177
|
-
liveness: classifyRunStatus({
|
|
178
|
-
state: cached.completedAt === undefined ? "running" : "finished",
|
|
179
|
-
updatedAt: cached.updatedAt,
|
|
180
|
-
}, nowMs),
|
|
179
|
+
liveness: classifyRunStatus({ state: "running", updatedAt: cached.updatedAt }, nowMs),
|
|
181
180
|
}
|
|
182
181
|
: cached);
|
|
183
182
|
continue;
|
|
@@ -210,7 +209,7 @@ export async function readRunIndex(cwdInput, options = {}) {
|
|
|
210
209
|
continue;
|
|
211
210
|
}
|
|
212
211
|
// Neither record nor bundle: receipts without an outcome. That is precisely an interrupted
|
|
213
|
-
// run
|
|
212
|
+
// run (the shape a dropped connection leaves), and saying so is more useful than hiding it.
|
|
214
213
|
runs.push({ runId, derivedFrom: "directory", liveness: "interrupted" });
|
|
215
214
|
}
|
|
216
215
|
cache?.retain(runIds);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The message for a run that is not there: how to start one when the project has no runs, or how
|
|
3
|
+
* to list them when it has. Only the runs directory's entry names are read.
|
|
4
|
+
*/
|
|
5
|
+
export declare function runNotFoundMessage(cwdInput: string, runInput: string): Promise<string>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveRunsRoot } from "./paths.js";
|
|
4
|
+
/**
|
|
5
|
+
* The message for a run that is not there: how to start one when the project has no runs, or how
|
|
6
|
+
* to list them when it has. Only the runs directory's entry names are read.
|
|
7
|
+
*/
|
|
8
|
+
export async function runNotFoundMessage(cwdInput, runInput) {
|
|
9
|
+
const cwd = path.resolve(cwdInput);
|
|
10
|
+
const entries = await readdir(resolveRunsRoot(cwd)).catch(() => []);
|
|
11
|
+
const hasRun = entries.some((name) => !name.startsWith(".") && !name.endsWith(".json"));
|
|
12
|
+
return hasRun
|
|
13
|
+
? `No run ${runInput}; humanish runs lists them.`
|
|
14
|
+
: `No runs in ${cwd} yet; start one with humanish run first-run.`;
|
|
15
|
+
}
|
package/dist/run/run.d.ts
CHANGED
|
@@ -2,7 +2,8 @@ import { renderObserver, type ObserverResult } from "../observer/render.js";
|
|
|
2
2
|
import { type RunBundle } from "./bundle.js";
|
|
3
3
|
import type { ExecutionOutcome } from "./judge.js";
|
|
4
4
|
import { type PreparedRunArtifactPaths, type RunIdInUse } from "./paths.js";
|
|
5
|
-
import { type
|
|
5
|
+
import { type RunStatusHandle } from "./status.js";
|
|
6
|
+
import type { RunStudyProvenance } from "./study-provenance.js";
|
|
6
7
|
interface StartRunOptions {
|
|
7
8
|
/** Project directory, in the form the route resolved it. */
|
|
8
9
|
cwd: string;
|
|
@@ -10,10 +11,10 @@ interface StartRunOptions {
|
|
|
10
11
|
runId?: string | undefined;
|
|
11
12
|
mintRunId: () => string;
|
|
12
13
|
mode: "dry-run" | "live";
|
|
13
|
-
lab?:
|
|
14
|
+
lab?: RunStudyProvenance | undefined;
|
|
14
15
|
/** review.md for the published bundle. */
|
|
15
16
|
renderReview: (bundle: RunBundle) => string;
|
|
16
|
-
/** Used by `FinishedRun.renderObserver`; `render` is the
|
|
17
|
+
/** Used by `FinishedRun.renderObserver`; `render` is the `LabDeps.renderObserver` seam. */
|
|
17
18
|
observer?: {
|
|
18
19
|
open: boolean;
|
|
19
20
|
render?: typeof renderObserver | undefined;
|
|
@@ -25,7 +26,9 @@ interface Run {
|
|
|
25
26
|
readonly runId: string;
|
|
26
27
|
readonly createdAt: string;
|
|
27
28
|
readonly mode: "dry-run" | "live";
|
|
28
|
-
/**
|
|
29
|
+
/** The manifest the run came from; bundleHead copies it into the bundle. */
|
|
30
|
+
readonly lab?: RunStudyProvenance;
|
|
31
|
+
/** Routes write their evidence files through these and hand them to participants. */
|
|
29
32
|
readonly paths: PreparedRunArtifactPaths;
|
|
30
33
|
/**
|
|
31
34
|
* Publish an in-progress bundle: run.json, review.json, review.md, events.ndjson and
|