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/run.js
CHANGED
|
@@ -7,8 +7,9 @@ import { renderObserver } from "../observer/render.js";
|
|
|
7
7
|
import { RUN_BUNDLE_FILE, PUBLIC_TARGET_CWD } from "./bundle.js";
|
|
8
8
|
import {} from "./results.js";
|
|
9
9
|
import { createRunArtifactPaths, validatePreparedRunArtifactPaths, } from "./paths.js";
|
|
10
|
+
import { registerActiveRun } from "./active-runs.js";
|
|
10
11
|
import { writeContainedOutputFile, writePreparedRunLatestPointer } from "./contained-output.js";
|
|
11
|
-
import { beginRunStatus, runStatusOutcome
|
|
12
|
+
import { beginRunStatus, runStatusOutcome } from "./status.js";
|
|
12
13
|
/** An entry point called in a state that does not admit it. */
|
|
13
14
|
class RunLifecycleError extends Error {
|
|
14
15
|
name = "RunLifecycleError";
|
|
@@ -66,6 +67,7 @@ export async function runScope(fn) {
|
|
|
66
67
|
let closed = false;
|
|
67
68
|
let started = false;
|
|
68
69
|
let status;
|
|
70
|
+
let unregister;
|
|
69
71
|
let finished;
|
|
70
72
|
const admitted = new Set();
|
|
71
73
|
const admit = (operation) => {
|
|
@@ -86,11 +88,11 @@ export async function runScope(fn) {
|
|
|
86
88
|
const created = await createRunArtifactPaths(options.cwd, runId);
|
|
87
89
|
if (!created.ok)
|
|
88
90
|
return created;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
});
|
|
91
|
+
// beginRunStatus reads only the mode and the lab provenance from the run's options.
|
|
92
|
+
status = beginRunStatus(created.paths, { ...options, runId });
|
|
93
|
+
// Registered before the first write lands: a signal while it is still settling reaches
|
|
94
|
+
// the handle, whose interrupt queues behind that write.
|
|
95
|
+
unregister = registerActiveRun({ cwd: options.cwd, runId, paths: created.paths, status });
|
|
94
96
|
await status.started;
|
|
95
97
|
return { ok: true, run: openRun(options, runId, created.paths, status) };
|
|
96
98
|
})());
|
|
@@ -154,6 +156,7 @@ export async function runScope(fn) {
|
|
|
154
156
|
runId,
|
|
155
157
|
createdAt,
|
|
156
158
|
mode: options.mode,
|
|
159
|
+
...(options.lab === undefined ? {} : { lab: options.lab }),
|
|
157
160
|
paths,
|
|
158
161
|
writeSnapshot(bundle) {
|
|
159
162
|
if (closed)
|
|
@@ -193,6 +196,7 @@ export async function runScope(fn) {
|
|
|
193
196
|
finally {
|
|
194
197
|
if (finished === undefined)
|
|
195
198
|
await status?.finish();
|
|
199
|
+
unregister?.();
|
|
196
200
|
}
|
|
197
201
|
}
|
|
198
202
|
return { result: outcome.result, finished };
|
|
@@ -4,12 +4,12 @@ export declare const SANDBOX_RECEIPTS_ARTIFACT = "sandbox-receipts.ndjson";
|
|
|
4
4
|
export type SandboxProviderId = "e2b";
|
|
5
5
|
export interface SandboxReceipt {
|
|
6
6
|
at: string;
|
|
7
|
-
/** The
|
|
7
|
+
/** The participant or subject label the sandbox belongs to (public-safe token). */
|
|
8
8
|
laneId: string;
|
|
9
9
|
/** Who allocated the sandbox. Receipts written before this field existed have none. */
|
|
10
10
|
provider?: SandboxProviderId;
|
|
11
11
|
sandboxId: string;
|
|
12
|
-
/** The create-time sandbox TTL (ms), when known
|
|
12
|
+
/** The create-time sandbox TTL (ms), when known: how long the server-side backstop runs. */
|
|
13
13
|
timeoutMs?: number;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
@@ -21,10 +21,10 @@ export interface ParsedSandboxReceipt extends Omit<SandboxReceipt, "provider"> {
|
|
|
21
21
|
provider: string;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Append one receipt. Best-effort
|
|
25
|
-
* receipt write must never fail the
|
|
24
|
+
* Append one receipt. Best-effort by design: the receipt exists to protect the run, so a failed
|
|
25
|
+
* receipt write must never fail the participant. The only cost of a miss is that `reclaim` cannot see
|
|
26
26
|
* this id and the TTL backstop covers it instead. Containment is the same prepare step every
|
|
27
|
-
* artifact write uses; append (not atomic-replace) keeps racing
|
|
27
|
+
* artifact write uses; append (not atomic-replace) keeps racing participants' receipts intact.
|
|
28
28
|
*/
|
|
29
29
|
export declare function appendSandboxReceipt(root: PreparedOutputRoot, receipt: SandboxReceipt): Promise<void>;
|
|
30
30
|
/** Parse a receipts file leniently: a torn final line (crash mid-append) drops, valid lines keep. */
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// Every created sandbox id is journaled to the run dir the moment create returns, before any work
|
|
2
|
-
// happens in it. The
|
|
2
|
+
// happens in it. The participant loop lives in the caller's local process, so a sleeping laptop, crash or
|
|
3
3
|
// kill loses every in-memory id; this append-only file keeps them for `humanish reclaim`.
|
|
4
4
|
import { appendFile } from "node:fs/promises";
|
|
5
5
|
import { prepareContainedOutputFile } from "./contained-output.js";
|
|
6
6
|
export const SANDBOX_RECEIPTS_ARTIFACT = "sandbox-receipts.ndjson";
|
|
7
7
|
/**
|
|
8
|
-
* Append one receipt. Best-effort
|
|
9
|
-
* receipt write must never fail the
|
|
8
|
+
* Append one receipt. Best-effort by design: the receipt exists to protect the run, so a failed
|
|
9
|
+
* receipt write must never fail the participant. The only cost of a miss is that `reclaim` cannot see
|
|
10
10
|
* this id and the TTL backstop covers it instead. Containment is the same prepare step every
|
|
11
|
-
* artifact write uses; append (not atomic-replace) keeps racing
|
|
11
|
+
* artifact write uses; append (not atomic-replace) keeps racing participants' receipts intact.
|
|
12
12
|
*/
|
|
13
13
|
export async function appendSandboxReceipt(root, receipt) {
|
|
14
14
|
try {
|
|
@@ -16,7 +16,7 @@ export async function appendSandboxReceipt(root, receipt) {
|
|
|
16
16
|
await appendFile(filePath, `${JSON.stringify(receipt)}\n`, "utf8");
|
|
17
17
|
}
|
|
18
18
|
catch {
|
|
19
|
-
// Swallowed on purpose
|
|
19
|
+
// Swallowed on purpose; see the contract above.
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
/** Parse a receipts file leniently: a torn final line (crash mid-append) drops, valid lines keep. */
|
|
@@ -42,7 +42,7 @@ export function parseSandboxReceipts(text) {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
catch {
|
|
45
|
-
// torn line
|
|
45
|
+
// A torn line: skip it.
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
return receipts;
|
|
@@ -1,58 +1,58 @@
|
|
|
1
1
|
import type { ParticipantIds } from "./participant-records.js";
|
|
2
2
|
export declare const SHARED_WORLD_SCHEMA = "humanish.shared-world.v1";
|
|
3
|
-
/** The
|
|
4
|
-
* seed-recipe digest + the provisioned env
|
|
3
|
+
/** The shared service-plane provenance for a shared-world run: single commit + a
|
|
4
|
+
* seed-recipe digest + the provisioned env names (never values). */
|
|
5
5
|
export interface SharedWorldPlane {
|
|
6
6
|
/** The cloned commit SHA of the shared plane (when the clone resolved one). */
|
|
7
7
|
commit?: string;
|
|
8
|
-
/** sha256-16 over the ordered seed-step command digests
|
|
8
|
+
/** sha256-16 over the ordered seed-step command digests: the seeded-state recipe identity
|
|
9
9
|
* (not the runtime state). Pins "same seed recipe" across bundles. */
|
|
10
10
|
seedDigest: string;
|
|
11
|
-
/** Declared env
|
|
11
|
+
/** Declared env names provisioned for the shared plane (values never surface). */
|
|
12
12
|
envNames: string[];
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
* (the first-class provisioned-subject target every actor drove
|
|
14
|
+
* Concurrent route only: sha256-16 of the harness-minted `getHost` URL's origin
|
|
15
|
+
* (the first-class provisioned-subject target every actor drove). A digest replaces the
|
|
16
16
|
* raw URL: a getHost URL embeds the (live) sandbox id and matches the publish-safety e2b-URL
|
|
17
|
-
* redaction, so
|
|
17
|
+
* redaction, so, like the stream URL and sandbox ids, it never lands raw in a published
|
|
18
18
|
* bundle (the raw tokenless URL is surfaced only on the ephemeral lab result). The orchestrator
|
|
19
|
-
* confirms the URL is
|
|
20
|
-
* actor drove this host by digest equality. Absent on the sequential route.
|
|
19
|
+
* confirms the URL is tokenless (no authKey, so no secret reaches the bundle) before digesting.
|
|
20
|
+
* verify proves every actor drove this host by digest equality. Absent on the sequential route.
|
|
21
21
|
*/
|
|
22
22
|
hostDigest?: string;
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
25
|
-
* internet-reachable getHost URL is synthetic seeded data
|
|
26
|
-
* provenance gate
|
|
24
|
+
* Concurrent route only: the author's required attestation that the subject behind the
|
|
25
|
+
* internet-reachable getHost URL is synthetic seeded data. This is author-trust + a
|
|
26
|
+
* provenance gate; it does not guarantee the data is synthetic. Verify fails closed if absent on the concurrent route.
|
|
27
27
|
*
|
|
28
|
-
*
|
|
29
|
-
* harness neither provisioned nor exposed would be
|
|
28
|
+
* Forbidden on the external-public plane class: claiming synthetic on a real public site the
|
|
29
|
+
* harness neither provisioned nor exposed would be false (verify asserts it is absent there).
|
|
30
30
|
*/
|
|
31
31
|
exposure?: "synthetic";
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* (that
|
|
38
|
-
* origin, not harness control of the plane. A
|
|
39
|
-
* hostDigest hygiene). Absent on getHost.
|
|
33
|
+
* External-public plane class only: sha256-16 of the observed origin the participants
|
|
34
|
+
* converged on. It is the counterpart of hostDigest with a weaker, disclosed claim: the harness only
|
|
35
|
+
* observes that each participant reached this origin and never minted it. It is derived from what
|
|
36
|
+
* the participants actually reached; the declared appUrl does not feed it. verify proves every
|
|
37
|
+
* laneWindow.routeHostDigest (that participant's CDP-observed final URL origin) equals it, which
|
|
38
|
+
* shows cross-participant convergence on one observed origin, not harness control of the plane. A
|
|
39
|
+
* digest, not the raw origin (kept consistent with hostDigest hygiene). Absent on getHost.
|
|
40
40
|
*/
|
|
41
41
|
publicOriginDigest?: string;
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
44
|
-
* recorded for reference/evidence
|
|
45
|
-
* cross-origin redirect (apex->www, http->https) makes the
|
|
46
|
-
* one, which is expected. Operator
|
|
47
|
-
* + the declared appUrl
|
|
43
|
+
* External-public plane class only: sha256-16 of the operator-declared origin (from subject.appUrl),
|
|
44
|
+
* recorded for reference/evidence only. It is never asserted equal to publicOriginDigest: a normal
|
|
45
|
+
* cross-origin redirect (apex->www, http->https) makes the observed origin differ from the declared
|
|
46
|
+
* one, which is expected. Operator ownership rests on the subject.publicTarget.authorized attestation
|
|
47
|
+
* + the declared appUrl; digest equality plays no part. Only the digest is stored. Absent on getHost.
|
|
48
48
|
*/
|
|
49
49
|
declaredOriginDigest?: string;
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
53
|
-
* shared plane.
|
|
54
|
-
* `laneWindows` and `stateSeries` are
|
|
55
|
-
* field
|
|
52
|
+
* Concurrent shape: one actor's harness-clocked activity window against the one
|
|
53
|
+
* shared plane. Overlapping windows mechanically prove ≥2 personas were active simultaneously.
|
|
54
|
+
* `laneWindows` and `stateSeries` are independent series. There is deliberately no per-delta→actor
|
|
55
|
+
* field, because under concurrency the evidence cannot say which actor caused a state change.
|
|
56
56
|
*/
|
|
57
57
|
export interface SharedWorldParticipantWindow {
|
|
58
58
|
roleId: string;
|
|
@@ -63,29 +63,29 @@ export interface SharedWorldParticipantWindow {
|
|
|
63
63
|
simId: string;
|
|
64
64
|
/** Resolves to a real RunStream (the actor's trace) in this bundle. */
|
|
65
65
|
streamId: string;
|
|
66
|
-
/** ms on the
|
|
66
|
+
/** ms on the one harness clock: the wrapped [start,end] the orchestrator measured. */
|
|
67
67
|
startedAt: number;
|
|
68
68
|
endedAt: number;
|
|
69
69
|
/** The actor's terminal session verdict (per-persona). */
|
|
70
70
|
verdict: string;
|
|
71
|
-
/** sha256-16 of the
|
|
72
|
-
* plane.hostDigest
|
|
73
|
-
*
|
|
71
|
+
/** sha256-16 of the origin of the getHost participant URL this actor drove. verify confirms it
|
|
72
|
+
* equals plane.hostDigest, so the actor drove exactly the harness-minted host. A digest, not the
|
|
73
|
+
* raw URL (a getHost URL is not publish-safe; see SharedWorldPlane.hostDigest). */
|
|
74
74
|
routeHostDigest: string;
|
|
75
75
|
/** The shared plane's commit this actor observed (omitted when unresolved). */
|
|
76
76
|
commit?: string;
|
|
77
77
|
/** The shared plane's seed-recipe digest this actor observed. */
|
|
78
78
|
seedDigest: string;
|
|
79
79
|
}
|
|
80
|
-
/**
|
|
81
|
-
* allowed-keys tripwire (SHARED_WORLD_STATESERIES_KEYS) permits
|
|
80
|
+
/** Concurrent shape: one cadence checkpoint of the shared world under load. Digest-only: the
|
|
81
|
+
* allowed-keys tripwire (SHARED_WORLD_STATESERIES_KEYS) permits only {timestamp, digest}. */
|
|
82
82
|
export interface SharedWorldStateSnapshot {
|
|
83
|
-
/** ms on the
|
|
83
|
+
/** ms on the one harness clock. */
|
|
84
84
|
timestamp: number;
|
|
85
85
|
/** sha256-16 of the (scrubbed, redacted) combined probe output at this snapshot. */
|
|
86
86
|
digest: string;
|
|
87
87
|
}
|
|
88
|
-
/**
|
|
88
|
+
/** Concurrent shape: one persona's outcome against the contended world (the "M of N" headline). */
|
|
89
89
|
export interface SharedWorldOutcome {
|
|
90
90
|
roleId: string;
|
|
91
91
|
actorType?: string;
|
|
@@ -109,19 +109,19 @@ export declare function sharedWorldParticipantKeys(ids: ParticipantIds, particip
|
|
|
109
109
|
readonly caseGroup?: string;
|
|
110
110
|
}): Pick<SharedWorldOutcome, "roleId" | "actorType" | "surface" | "caseGroup" | "simId" | "streamId">;
|
|
111
111
|
/** A timeline checkpoint: a read-only digest probe of the shared plane at one moment. Persisted
|
|
112
|
-
*
|
|
112
|
+
* digest-only: `digest` is sha256-16(scrub+redact(stdout)); no raw value ever lands. */
|
|
113
113
|
export interface SharedWorldCheckpoint {
|
|
114
114
|
kind: "checkpoint";
|
|
115
115
|
/** "cp-baseline" for the baseline snapshot; "cp-after-<roleId>" after each role's turn. */
|
|
116
116
|
name: string;
|
|
117
117
|
/** sha256-16 of the (scrubbed, redacted) combined probe output at this snapshot. */
|
|
118
118
|
digest: string;
|
|
119
|
-
/** True when this snapshot's digest differs from the previous checkpoint's
|
|
120
|
-
* state changed across the intervening turn (delta attributed to the
|
|
119
|
+
/** True when this snapshot's digest differs from the previous checkpoint's, meaning the observed
|
|
120
|
+
* state changed across the intervening turn (the delta is attributed to the whole turn). */
|
|
121
121
|
deltaFromPrev: boolean;
|
|
122
122
|
}
|
|
123
|
-
/** A timeline turn: one
|
|
124
|
-
* provenance it observed (identical across turns by construction
|
|
123
|
+
/** A timeline turn: one participant's session against the shared plane. Carries the plane
|
|
124
|
+
* provenance it observed (identical across turns by construction: the single-plane proof). */
|
|
125
125
|
interface SharedWorldTurn {
|
|
126
126
|
kind: "turn";
|
|
127
127
|
roleId: string;
|
|
@@ -135,8 +135,8 @@ interface SharedWorldTurn {
|
|
|
135
135
|
seedDigest: string;
|
|
136
136
|
}
|
|
137
137
|
type SharedWorldTimelineEntry = SharedWorldCheckpoint | SharedWorldTurn;
|
|
138
|
-
/** Declared
|
|
139
|
-
* The executed timeline plus this ordered tail must account for every declared sim/stream. */
|
|
138
|
+
/** Declared participants that were never started after one executed sequential role stopped the
|
|
139
|
+
* run. The executed timeline plus this ordered tail must account for every declared sim/stream. */
|
|
140
140
|
interface SharedWorldSkippedTail {
|
|
141
141
|
afterRoleId: string;
|
|
142
142
|
roles: Array<{
|
|
@@ -150,45 +150,46 @@ interface SharedWorldSkippedTail {
|
|
|
150
150
|
estimatedTotalUsd?: number;
|
|
151
151
|
}
|
|
152
152
|
/**
|
|
153
|
-
* The shared-world evidence block (`humanish.shared-world.v1`).
|
|
154
|
-
* `topologyMode
|
|
153
|
+
* The shared-world evidence block (`humanish.shared-world.v1`). Two variants discriminated by
|
|
154
|
+
* `topologyMode`, which is named so it does not collide with `RunBundle.mode` (dry-run|live):
|
|
155
155
|
*
|
|
156
|
-
* -
|
|
156
|
+
* - Sequential (`topologyMode: "sequential"`): `sequence` + an alternating `timeline`
|
|
157
157
|
* (cp-baseline → turn → cp → … → cp); limits `sequential-only` etc. No route writes it since
|
|
158
158
|
* 0.106.0; verify still reads it so older bundles keep verifying.
|
|
159
|
-
* -
|
|
160
|
-
* `outcomes`; limits `concurrent` etc.
|
|
159
|
+
* - Concurrent (`topologyMode: "concurrent"`): `laneWindows` + `stateSeries` +
|
|
160
|
+
* `outcomes`; limits `concurrent` etc. No `timeline`.
|
|
161
161
|
*
|
|
162
|
-
* Additive + optional on `humanish.run-bundle.v1
|
|
163
|
-
* The mandatory `attributionLimits` are verify-enforced (
|
|
162
|
+
* Additive + optional on `humanish.run-bundle.v1`: absent on every non-shared-world bundle.
|
|
163
|
+
* The mandatory `attributionLimits` are verify-enforced (fail closed on a missing required or a
|
|
164
164
|
* present forbidden limit).
|
|
165
165
|
*/
|
|
166
166
|
export interface SharedWorldEvidence {
|
|
167
167
|
schema: typeof SHARED_WORLD_SCHEMA;
|
|
168
168
|
topology: "shared-world";
|
|
169
|
-
/** The substrate discriminator
|
|
169
|
+
/** The substrate discriminator. Branched on first by sharedWorldEvidenceFindings. */
|
|
170
170
|
topologyMode: "sequential" | "concurrent";
|
|
171
171
|
/**
|
|
172
|
-
*
|
|
173
|
-
* "provisioned-getHost" plane (a clone/local-tree subject served + getHost-exposed in-sandbox
|
|
174
|
-
* harness
|
|
172
|
+
* Concurrent route only: the plane-class discriminator. Absent == the historical
|
|
173
|
+
* "provisioned-getHost" plane (a clone/local-tree subject served + getHost-exposed in-sandbox; the
|
|
174
|
+
* harness minted the host; synthetic-seeded attestation + authoritative in-sandbox checkpoint
|
|
175
175
|
* stateSeries). "external-public" == a real operator-owned public deployment used directly as the
|
|
176
|
-
* plane (
|
|
177
|
-
* shared-state proof
|
|
178
|
-
* verify gates
|
|
176
|
+
* plane (no getHost/clone/seed; the operator attests it and the harness does not control it; no authoritative
|
|
177
|
+
* shared-state proof: concurrency evidenced by temporal co-occupancy + observed lobby convergence).
|
|
178
|
+
* verify gates every getHost-specific assertion on this discriminator; existing bundles omit it and
|
|
179
179
|
* default to provisioned-getHost, byte-stable.
|
|
180
180
|
*/
|
|
181
181
|
planeClass?: "provisioned-getHost" | "external-public";
|
|
182
|
-
/** The
|
|
182
|
+
/** The declared number of participants. */
|
|
183
183
|
roleCount: number;
|
|
184
184
|
plane: SharedWorldPlane;
|
|
185
185
|
/** The pinned, verify-enforced attribution ceiling (the set differs per topologyMode/planeClass). */
|
|
186
186
|
attributionLimits: string[];
|
|
187
187
|
/**
|
|
188
|
-
*
|
|
189
|
-
* `/lobby/CODE`
|
|
190
|
-
* shared world" proof, observation-derived and needing no subject change. Digest-only (the
|
|
191
|
-
* 6-char
|
|
188
|
+
* External-public plane class only (optional-but-strong): sha256-16 of the shared
|
|
189
|
+
* `/lobby/CODE` path every participant's CDP-observed URL converged on: the concrete "they were
|
|
190
|
+
* in one shared world" proof, observation-derived and needing no subject change. Digest-only (the
|
|
191
|
+
* raw 6-char lobby code and full URLs are runtime-only and never land). Absent when participants
|
|
192
|
+
* did not converge.
|
|
192
193
|
*/
|
|
193
194
|
lobbyConvergenceDigest?: string;
|
|
194
195
|
/** The role ids that actually took a turn, in declared order. */
|
|
@@ -210,8 +211,8 @@ interface ParticipantWindow {
|
|
|
210
211
|
}
|
|
211
212
|
/**
|
|
212
213
|
* What a shared-world run shows about concurrency, as verify's pass gate and the judge both read
|
|
213
|
-
* it: whether two or more
|
|
214
|
-
* provisioned plane), whether the state changed at or after the first overlap started.
|
|
214
|
+
* it: whether two or more participants were live at once, and, when the plane keeps a state series
|
|
215
|
+
* (the provisioned plane), whether the state changed at or after the first overlap started.
|
|
215
216
|
*/
|
|
216
217
|
export declare function concurrencyFacts(windows: readonly ParticipantWindow[], stateSeries: readonly SharedWorldStateSnapshot[] | undefined): {
|
|
217
218
|
overlap: boolean;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// The sharedWorld block of run.json (humanish.shared-world.v1): the one shared plane, each
|
|
2
|
-
// window, state snapshots and the interleaved timeline of checkpoints and turns.
|
|
1
|
+
// The sharedWorld block of run.json (humanish.shared-world.v1): the one shared plane, each
|
|
2
|
+
// participant's window, state snapshots and the interleaved timeline of checkpoints and turns.
|
|
3
3
|
export const SHARED_WORLD_SCHEMA = "humanish.shared-world.v1";
|
|
4
4
|
/**
|
|
5
5
|
* The fields a window and an outcome start with, in the saved order: the participant id saved as
|
|
@@ -30,8 +30,8 @@ function overlapStarts(windows) {
|
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* What a shared-world run shows about concurrency, as verify's pass gate and the judge both read
|
|
33
|
-
* it: whether two or more
|
|
34
|
-
* provisioned plane), whether the state changed at or after the first overlap started.
|
|
33
|
+
* it: whether two or more participants were live at once, and, when the plane keeps a state series
|
|
34
|
+
* (the provisioned plane), whether the state changed at or after the first overlap started.
|
|
35
35
|
*/
|
|
36
36
|
export function concurrencyFacts(windows, stateSeries) {
|
|
37
37
|
const starts = overlapStarts(windows);
|
|
@@ -6,7 +6,7 @@ export declare const MANDATORY_ATTRIBUTION_LIMITS: readonly ["sequential-only",
|
|
|
6
6
|
export declare const SHARED_WORLD_CHECKPOINT_KEYS: Set<string>;
|
|
7
7
|
export declare const SHARED_WORLD_STATESERIES_KEYS: Set<string>;
|
|
8
8
|
/**
|
|
9
|
-
* Single-plane provenance: every item shares
|
|
9
|
+
* Single-plane provenance: every item shares one (commit, seedDigest), and that pair matches
|
|
10
10
|
* sharedWorld.plane. Only the first item that diverges from the plane is reported. The shape guard
|
|
11
11
|
* has already typed both fields as strings (commit may be absent).
|
|
12
12
|
*/
|
|
@@ -18,8 +18,8 @@ export declare function planeProvenanceFindings(items: readonly Record<string, u
|
|
|
18
18
|
/** Common shape findings shared by both topologyMode branches. */
|
|
19
19
|
export declare function sharedWorldCommonFindings(bundle: RunBundle, sw: SharedWorldEvidence): string[];
|
|
20
20
|
/**
|
|
21
|
-
* Tolerant
|
|
22
|
-
* types
|
|
21
|
+
* Tolerant shape guard for the shared-world evidence block. Validates required fields +
|
|
22
|
+
* types and tolerates extra keys (additive): the strict value-shape/timeline checks are
|
|
23
23
|
* sharedWorldEvidenceFindings' job (an injected value-shaped checkpoint field must pass the shape
|
|
24
24
|
* guard so verify can catch it fail-closed, not silently bounce off isRunBundle).
|
|
25
25
|
*/
|
|
@@ -4,24 +4,24 @@ import { isNonNegativeSafeInteger, isRecord } from "./type-guards.js";
|
|
|
4
4
|
// The promptDigest convention: sha256 hex, first 16 chars. A "seeded" record without a real
|
|
5
5
|
// digest cannot pin "same recipe" across bundles, so verify treats it as a hollow claim.
|
|
6
6
|
export const COMMAND_DIGEST_PATTERN = /^[0-9a-f]{16}$/;
|
|
7
|
-
// Env var
|
|
8
|
-
// must hold
|
|
7
|
+
// Env var name shape (mirrors ENV_NAME_PATTERN in src/lab/parse/values.ts). externalEnvNames
|
|
8
|
+
// must hold names only: a value sneaking into the list trips this check (a free secret tripwire).
|
|
9
9
|
export const SUBJECT_ENV_NAME_PATTERN = /^[A-Z][A-Z0-9_]*$/;
|
|
10
|
-
//
|
|
11
|
-
// if any is absent
|
|
12
|
-
// a checkpoint delta is attributed to the
|
|
10
|
+
// Sequential: the three disclosures a sequential shared-world bundle must pin (verify fails closed
|
|
11
|
+
// if any is absent, because omission overclaims): sequential turns only, no concurrency/races handled, and
|
|
12
|
+
// a checkpoint delta is attributed to the turn it followed, never a specific action (correlation).
|
|
13
13
|
export const MANDATORY_ATTRIBUTION_LIMITS = [
|
|
14
14
|
"sequential-only",
|
|
15
15
|
"no-concurrent-races",
|
|
16
16
|
"delta-attributed-to-turn-not-action",
|
|
17
17
|
];
|
|
18
|
-
// A shared-world checkpoint record persists
|
|
18
|
+
// A shared-world checkpoint record persists digest-only: exactly these keys, nothing value-shaped.
|
|
19
19
|
export const SHARED_WORLD_CHECKPOINT_KEYS = new Set(["kind", "name", "digest", "deltaFromPrev"]);
|
|
20
|
-
//
|
|
20
|
+
// A concurrent stateSeries record is digest-only too: it permits a numeric timestamp + the
|
|
21
21
|
// sha256-16 digest; any other key is a value-shaped leak / a smuggled per-delta→actor field.
|
|
22
22
|
export const SHARED_WORLD_STATESERIES_KEYS = new Set(["timestamp", "digest"]);
|
|
23
23
|
/**
|
|
24
|
-
* Single-plane provenance: every item shares
|
|
24
|
+
* Single-plane provenance: every item shares one (commit, seedDigest), and that pair matches
|
|
25
25
|
* sharedWorld.plane. Only the first item that diverges from the plane is reported. The shape guard
|
|
26
26
|
* has already typed both fields as strings (commit may be absent).
|
|
27
27
|
*/
|
|
@@ -30,7 +30,7 @@ export function planeProvenanceFindings(items, plane, labels) {
|
|
|
30
30
|
const findings = [];
|
|
31
31
|
const keys = new Set(items.map((item) => `${text(item.commit)}::${text(item.seedDigest)}`));
|
|
32
32
|
if (keys.size > 1) {
|
|
33
|
-
findings.push(`${labels.items} reference
|
|
33
|
+
findings.push(`${labels.items} reference different plane provenance (commit or seedDigest), but a ${labels.run} run uses one plane`);
|
|
34
34
|
}
|
|
35
35
|
if (!isRecord(plane))
|
|
36
36
|
return findings;
|
|
@@ -62,16 +62,16 @@ export function sharedWorldCommonFindings(bundle, sw) {
|
|
|
62
62
|
if (isRecord(plane) && Array.isArray(plane.envNames)) {
|
|
63
63
|
for (const name of plane.envNames) {
|
|
64
64
|
if (typeof name !== "string" || !SUBJECT_ENV_NAME_PATTERN.test(name)) {
|
|
65
|
-
//
|
|
66
|
-
findings.push("sharedWorld.plane.envNames
|
|
65
|
+
// Never echoes the entry: a malformed entry may be a value.
|
|
66
|
+
findings.push("sharedWorld.plane.envNames has an entry that is not an environment variable name; evidence may hold names only, never values");
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
return findings;
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
|
-
* Tolerant
|
|
74
|
-
* types
|
|
73
|
+
* Tolerant shape guard for the shared-world evidence block. Validates required fields +
|
|
74
|
+
* types and tolerates extra keys (additive): the strict value-shape/timeline checks are
|
|
75
75
|
* sharedWorldEvidenceFindings' job (an injected value-shaped checkpoint field must pass the shape
|
|
76
76
|
* guard so verify can catch it fail-closed, not silently bounce off isRunBundle).
|
|
77
77
|
*/
|
|
@@ -109,8 +109,8 @@ export function isSharedWorldEvidence(value) {
|
|
|
109
109
|
if (!(Array.isArray(value.attributionLimits) &&
|
|
110
110
|
value.attributionLimits.every((limit) => typeof limit === "string")))
|
|
111
111
|
return false;
|
|
112
|
-
// Tolerant: validate the
|
|
113
|
-
// are the job of sharedWorldEvidenceFindings
|
|
112
|
+
// Tolerant: validate the type of each present field only (the coherence + topologyMode dispatch
|
|
113
|
+
// are the job of sharedWorldEvidenceFindings; an injected value-shaped field must pass this
|
|
114
114
|
// guard so verify catches it fail-closed). A bundle must carry at least one of the two shapes.
|
|
115
115
|
if (value.sequence !== undefined &&
|
|
116
116
|
!(Array.isArray(value.sequence) && value.sequence.every((id) => typeof id === "string")))
|
|
@@ -148,7 +148,7 @@ function isSharedWorldTimelineEntry(value) {
|
|
|
148
148
|
}
|
|
149
149
|
return false;
|
|
150
150
|
}
|
|
151
|
-
// Tolerant shape guards for the
|
|
151
|
+
// Tolerant shape guards for the concurrent series (extra keys tolerated; the digest-only /
|
|
152
152
|
// allowed-keys tripwires are the strict job of sharedWorldEvidenceFindings).
|
|
153
153
|
function isSharedWorldLaneWindow(value) {
|
|
154
154
|
return (isRecord(value) &&
|
package/dist/run/stats.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
declare const STATS_SCHEMA = "humanish.stats.
|
|
1
|
+
import { type CostTotals, type CostRow } from "./costs.js";
|
|
2
|
+
declare const STATS_SCHEMA = "humanish.stats.v2";
|
|
3
3
|
interface StatsParticipants {
|
|
4
4
|
total: number;
|
|
5
5
|
reachedGoal: number;
|
|
6
6
|
reportedFriction: number;
|
|
7
7
|
}
|
|
8
8
|
interface StatsLabRow {
|
|
9
|
-
|
|
9
|
+
/** The study's `id`. */
|
|
10
|
+
study: string;
|
|
10
11
|
runs: number;
|
|
11
12
|
live: number;
|
|
12
13
|
dryRun: number;
|
|
@@ -24,7 +25,7 @@ interface StatsLabRow {
|
|
|
24
25
|
/** Runs with no estimate: a subscription brain, an interrupted run, an old bundle. Never zero. */
|
|
25
26
|
unpricedRuns: number;
|
|
26
27
|
participants: StatsParticipants;
|
|
27
|
-
costs:
|
|
28
|
+
costs: CostTotals;
|
|
28
29
|
}
|
|
29
30
|
interface StatsDayRow {
|
|
30
31
|
day: string;
|
|
@@ -33,14 +34,15 @@ interface StatsDayRow {
|
|
|
33
34
|
/** Participant and desktop subtotal; `costs` also includes retained analysis. */
|
|
34
35
|
estimatedSpendUsd: number;
|
|
35
36
|
unpricedRuns: number;
|
|
36
|
-
costs:
|
|
37
|
+
costs: CostTotals;
|
|
37
38
|
}
|
|
38
39
|
export interface StatsResult {
|
|
39
40
|
schema: typeof STATS_SCHEMA;
|
|
40
41
|
ok: true;
|
|
41
42
|
cwd: string;
|
|
42
43
|
since?: string;
|
|
43
|
-
|
|
44
|
+
/** The study the stats are limited to, when one was given. */
|
|
45
|
+
study?: string;
|
|
44
46
|
totals: {
|
|
45
47
|
runs: number;
|
|
46
48
|
live: number;
|
|
@@ -51,13 +53,13 @@ export interface StatsResult {
|
|
|
51
53
|
unpricedRuns: number;
|
|
52
54
|
participants: StatsParticipants;
|
|
53
55
|
verdicts: Record<string, number>;
|
|
54
|
-
costs:
|
|
56
|
+
costs: CostTotals;
|
|
55
57
|
};
|
|
56
|
-
|
|
58
|
+
studies: StatsLabRow[];
|
|
57
59
|
days: StatsDayRow[];
|
|
58
60
|
/** Same selected runs; individual accounting gaps are inspectable without reading private evidence. */
|
|
59
|
-
costsByRun:
|
|
60
|
-
/** Directories that could not be read, by name
|
|
61
|
+
costsByRun: CostRow[];
|
|
62
|
+
/** Directories that could not be read, by name: surfaced, never silently dropped. */
|
|
61
63
|
unreadable: string[];
|
|
62
64
|
note: string;
|
|
63
65
|
}
|
|
@@ -78,5 +80,9 @@ export interface StatsFailure {
|
|
|
78
80
|
};
|
|
79
81
|
}
|
|
80
82
|
export declare function computeStats(cwdInput: string, options?: StatsOptions): Promise<StatsResult | StatsFailure>;
|
|
81
|
-
|
|
83
|
+
/** Human output; a failure is an error the CLI prints on stderr (HumanOutput in src/cli/io.ts). */
|
|
84
|
+
export declare function formatStatsHuman(result: StatsResult): string;
|
|
85
|
+
export declare function formatStatsHuman(result: StatsResult | StatsFailure): string | {
|
|
86
|
+
error: StatsFailure["error"];
|
|
87
|
+
};
|
|
82
88
|
export {};
|