humanish 0.107.0 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
package/dist/run/projection.d.ts
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import type { RunIndexEntry } from "./run-index.js";
|
|
2
|
-
/** One
|
|
3
|
-
export interface
|
|
4
|
-
|
|
5
|
-
/** Total runs attributed to this
|
|
2
|
+
/** One study as the study list shows it. */
|
|
3
|
+
export interface StudyRollup {
|
|
4
|
+
studyId: string;
|
|
5
|
+
/** Total runs attributed to this study. */
|
|
6
6
|
runs: number;
|
|
7
7
|
/** Runs whose status record is fresh right now. */
|
|
8
8
|
live: number;
|
|
9
|
-
/** The newest run of this
|
|
9
|
+
/** The newest run of this study, 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
|
-
* Group runs by
|
|
16
|
-
* attribution are collected under `unattributed` rather than invented into a
|
|
15
|
+
* Group runs by study, newest-first within each study and by recency between studies. Runs with no study
|
|
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
|
-
export declare function
|
|
20
|
-
|
|
19
|
+
export declare function groupRunsByStudy(entries: readonly RunIndexEntry[]): {
|
|
20
|
+
studies: StudyRollup[];
|
|
21
21
|
unattributed: RunIndexEntry[];
|
|
22
22
|
};
|
|
23
23
|
/**
|
|
24
|
-
* What the launch screen may claim about a
|
|
24
|
+
* What the launch screen may claim about a study, and on what evidence. Every figure carries the
|
|
25
25
|
* number of runs it came from; `sample: 0` means there is nothing to claim and the caller must
|
|
26
26
|
* say so rather than showing an empty number.
|
|
27
27
|
*/
|
|
28
|
-
export interface
|
|
29
|
-
/** How many completed runs of this
|
|
28
|
+
export interface StudyExpectation {
|
|
29
|
+
/** How many completed runs of this study the figures are drawn from. */
|
|
30
30
|
sample: number;
|
|
31
31
|
medianDurationMs?: number;
|
|
32
32
|
/** Range across the sample, so the UI can show a span instead of a false point estimate. */
|
|
@@ -35,41 +35,41 @@ 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
|
|
43
|
+
* Derive what to expect from a study'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
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
|
|
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
|
*/
|
|
52
|
-
export declare function expectationFor(entries: readonly RunIndexEntry[], mode?: "dry-run" | "live"):
|
|
52
|
+
export declare function expectationFor(entries: readonly RunIndexEntry[], mode?: "dry-run" | "live"): StudyExpectation;
|
|
53
53
|
/**
|
|
54
54
|
* The one sentence the launch screen shows about time and money, with its denominator attached.
|
|
55
|
-
* A
|
|
56
|
-
* a range
|
|
55
|
+
* A study with no history says so plainly instead of borrowing another study's numbers or inventing
|
|
56
|
+
* a range. "No runs yet" is information, and the operator can still press Start.
|
|
57
57
|
*/
|
|
58
|
-
export declare function expectationLine(expectation:
|
|
58
|
+
export declare function expectationLine(expectation: StudyExpectation): string;
|
|
59
59
|
/**
|
|
60
|
-
* The one line a
|
|
60
|
+
* The one line a study may say about itself, wherever it is shown.
|
|
61
61
|
*
|
|
62
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
|
-
export declare function
|
|
67
|
+
export declare function studySummaryLine(row: Pick<StudyRow, "runs" | "declared" | "expectation" | "liveExpectation">): string;
|
|
68
68
|
/** Compact duration: seconds under a minute, then m/s, then h/m. */
|
|
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: {
|
|
@@ -101,16 +101,16 @@ export declare function listWindow(args: {
|
|
|
101
101
|
};
|
|
102
102
|
/** The label for a run's state, in the register the surfaces share. */
|
|
103
103
|
export declare function livenessLabel(entry: Pick<RunIndexEntry, "liveness" | "verdict">): string;
|
|
104
|
-
/** A
|
|
105
|
-
export interface
|
|
104
|
+
/** A study as the study list shows it: what is declared, joined to what actually happened. */
|
|
105
|
+
export interface StudyRow {
|
|
106
106
|
/**
|
|
107
|
-
* Stable identity for this row. A manifest's path when it has one, else the
|
|
107
|
+
* Stable identity for this row. A manifest's path when it has one, else the study 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
112
|
/** The declared id. Run history attributes to this, so it is not unique across manifests. */
|
|
113
|
-
|
|
113
|
+
studyId: string;
|
|
114
114
|
/**
|
|
115
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
|
|
@@ -121,25 +121,25 @@ export interface LabRow {
|
|
|
121
121
|
title?: string;
|
|
122
122
|
/**
|
|
123
123
|
* The shortest label that is unique among the rows it is listed with: the title when no other
|
|
124
|
-
*
|
|
125
|
-
* be told from every other one, and a title is not guaranteed to be distinct
|
|
124
|
+
* study 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: two manifests in
|
|
126
126
|
* this repo carry the same title and the same declared id, differing only by filename.
|
|
127
127
|
*/
|
|
128
128
|
label: string;
|
|
129
129
|
/** The manifest's own words, for the list to say what this study is. */
|
|
130
130
|
description?: string;
|
|
131
|
-
/** Repo-relative manifest path, absent for a
|
|
131
|
+
/** Repo-relative manifest path, absent for a study known only from run history. */
|
|
132
132
|
path?: string;
|
|
133
133
|
origin?: "committed" | "ignored" | "explicit";
|
|
134
134
|
/**
|
|
135
|
-
* False for a
|
|
135
|
+
* False for a study 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 other manifests declare this same
|
|
142
|
-
* between them and cannot be attributed to one file
|
|
141
|
+
* How many other manifests declare this same study 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;
|
|
@@ -148,11 +148,11 @@ export interface LabRow {
|
|
|
148
148
|
latest?: RunIndexEntry;
|
|
149
149
|
liveRuns: RunIndexEntry[];
|
|
150
150
|
/** Across every finished run, whatever its mode. A summary, never attached to a spend decision. */
|
|
151
|
-
expectation:
|
|
152
|
-
/** Live runs only
|
|
153
|
-
liveExpectation:
|
|
151
|
+
expectation: StudyExpectation;
|
|
152
|
+
/** Live runs only: the figure that belongs beside anything that spends money. */
|
|
153
|
+
liveExpectation: StudyExpectation;
|
|
154
154
|
}
|
|
155
|
-
export interface
|
|
155
|
+
export interface DeclaredStudy {
|
|
156
156
|
id: string;
|
|
157
157
|
title?: string;
|
|
158
158
|
/** The manifest's own description, so a list of studies can say what each one is. */
|
|
@@ -161,24 +161,24 @@ export interface DeclaredLab {
|
|
|
161
161
|
origin?: "committed" | "ignored" | "explicit";
|
|
162
162
|
}
|
|
163
163
|
/**
|
|
164
|
-
* Join declared
|
|
164
|
+
* Join declared study 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
|
-
* Order puts a
|
|
177
|
+
* Order puts a study someone is working in first, then studies by how recently they ran, then declared
|
|
178
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
|
-
export declare function
|
|
182
|
-
rows:
|
|
181
|
+
export declare function studyRows(declared: readonly DeclaredStudy[], entries: readonly RunIndexEntry[]): {
|
|
182
|
+
rows: StudyRow[];
|
|
183
183
|
unattributed: RunIndexEntry[];
|
|
184
184
|
};
|
package/dist/run/projection.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
// The disk→view-model projection
|
|
2
|
-
//
|
|
1
|
+
// The disk→view-model projection. Pure functions, no I/O, no rendering: this is where
|
|
2
|
+
// study 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
|
|
5
|
+
// The rules these encode, because they are the ones a UI is most tempted to break:
|
|
6
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
|
-
* Group runs by
|
|
12
|
-
* attribution are collected under `unattributed` rather than invented into a
|
|
11
|
+
* Group runs by study, newest-first within each study and by recency between studies. Runs with no study
|
|
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
|
-
export function
|
|
16
|
-
const
|
|
15
|
+
export function groupRunsByStudy(entries) {
|
|
16
|
+
const byStudy = new Map();
|
|
17
17
|
const unattributed = [];
|
|
18
18
|
for (const entry of entries) {
|
|
19
|
-
const
|
|
20
|
-
if (
|
|
19
|
+
const studyId = entry.study?.id;
|
|
20
|
+
if (studyId === undefined) {
|
|
21
21
|
unattributed.push(entry);
|
|
22
22
|
continue;
|
|
23
23
|
}
|
|
24
|
-
const bucket =
|
|
24
|
+
const bucket = byStudy.get(studyId);
|
|
25
25
|
if (bucket === undefined)
|
|
26
|
-
|
|
26
|
+
byStudy.set(studyId, [entry]);
|
|
27
27
|
else
|
|
28
28
|
bucket.push(entry);
|
|
29
29
|
}
|
|
30
|
-
const
|
|
30
|
+
const studies = [...byStudy.entries()].map(([studyId, runs]) => {
|
|
31
31
|
const liveRuns = runs.filter((run) => run.liveness === "running");
|
|
32
32
|
return {
|
|
33
|
-
|
|
33
|
+
studyId,
|
|
34
34
|
runs: runs.length,
|
|
35
35
|
live: liveRuns.length,
|
|
36
36
|
...(runs[0] === undefined ? {} : { latest: runs[0] }),
|
|
37
37
|
liveRuns,
|
|
38
38
|
};
|
|
39
39
|
});
|
|
40
|
-
// A
|
|
41
|
-
|
|
40
|
+
// A study someone is working in sorts first; otherwise most recently used.
|
|
41
|
+
studies.sort((left, right) => {
|
|
42
42
|
if (left.live !== right.live)
|
|
43
43
|
return right.live - left.live;
|
|
44
44
|
return recencyOf(right.latest) - recencyOf(left.latest);
|
|
45
45
|
});
|
|
46
|
-
return {
|
|
46
|
+
return { studies, unattributed };
|
|
47
47
|
}
|
|
48
48
|
function recencyOf(entry) {
|
|
49
49
|
if (entry === undefined)
|
|
@@ -58,12 +58,12 @@ function recencyOf(entry) {
|
|
|
58
58
|
return 0;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
|
-
* Derive what to expect from a
|
|
61
|
+
* Derive what to expect from a study'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
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
|
|
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
|
*/
|
|
@@ -79,7 +79,7 @@ export function expectationFor(entries, mode) {
|
|
|
79
79
|
.filter((value) => typeof value === "number" && Number.isFinite(value))
|
|
80
80
|
.sort((a, b) => a - b);
|
|
81
81
|
// A cost is unknown whether it was declared absent (`null`) or never recorded at all
|
|
82
|
-
// (`undefined
|
|
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;
|
|
@@ -103,8 +103,8 @@ function median(sorted) {
|
|
|
103
103
|
}
|
|
104
104
|
/**
|
|
105
105
|
* The one sentence the launch screen shows about time and money, with its denominator attached.
|
|
106
|
-
* A
|
|
107
|
-
* a range
|
|
106
|
+
* A study with no history says so plainly instead of borrowing another study's numbers or inventing
|
|
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)
|
|
@@ -132,14 +132,14 @@ export function expectationLine(expectation) {
|
|
|
132
132
|
return `${parts.join(" · ")} · ${sample}${unknown}`;
|
|
133
133
|
}
|
|
134
134
|
/**
|
|
135
|
-
* The one line a
|
|
135
|
+
* The one line a study may say about itself, wherever it is shown.
|
|
136
136
|
*
|
|
137
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
|
-
export function
|
|
142
|
+
export function studySummaryLine(row) {
|
|
143
143
|
if (row.runs === 0)
|
|
144
144
|
return row.declared ? "never run" : "no runs";
|
|
145
145
|
if (row.liveExpectation.sample > 0)
|
|
@@ -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) {
|
|
@@ -240,75 +240,75 @@ export function livenessLabel(entry) {
|
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
/** The addressable handle for a manifest: its filename without directory or extension. */
|
|
243
|
-
function
|
|
243
|
+
function studyNameFromPath(manifestPath) {
|
|
244
244
|
const base = manifestPath.split("/").pop() ?? manifestPath;
|
|
245
245
|
return base.replace(/\.(ya?ml)$/i, "");
|
|
246
246
|
}
|
|
247
247
|
/**
|
|
248
|
-
* Join declared
|
|
248
|
+
* Join declared study 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
|
-
* Order puts a
|
|
261
|
+
* Order puts a study someone is working in first, then studies by how recently they ran, then declared
|
|
262
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
|
-
export function
|
|
266
|
-
const {
|
|
267
|
-
const byId = new Map(
|
|
265
|
+
export function studyRows(declared, entries) {
|
|
266
|
+
const { studies, unattributed } = groupRunsByStudy(entries);
|
|
267
|
+
const byId = new Map(studies.map((study) => [study.studyId, study]));
|
|
268
268
|
const runsOf = new Map();
|
|
269
269
|
for (const entry of entries) {
|
|
270
|
-
const
|
|
271
|
-
if (
|
|
270
|
+
const studyId = entry.study?.id;
|
|
271
|
+
if (studyId === undefined)
|
|
272
272
|
continue;
|
|
273
|
-
const bucket = runsOf.get(
|
|
273
|
+
const bucket = runsOf.get(studyId);
|
|
274
274
|
if (bucket === undefined)
|
|
275
|
-
runsOf.set(
|
|
275
|
+
runsOf.set(studyId, [entry]);
|
|
276
276
|
else
|
|
277
277
|
bucket.push(entry);
|
|
278
278
|
}
|
|
279
279
|
const idCounts = new Map();
|
|
280
|
-
for (const
|
|
281
|
-
idCounts.set(
|
|
282
|
-
const build = (
|
|
283
|
-
const rollup = byId.get(
|
|
280
|
+
for (const study of declared)
|
|
281
|
+
idCounts.set(study.id, (idCounts.get(study.id) ?? 0) + 1);
|
|
282
|
+
const build = (studyId, manifest, isDeclared) => {
|
|
283
|
+
const rollup = byId.get(studyId);
|
|
284
284
|
const manifestPath = manifest?.path;
|
|
285
285
|
return {
|
|
286
|
-
key: manifestPath ?? `id:${
|
|
287
|
-
|
|
288
|
-
name: manifestPath === undefined ?
|
|
286
|
+
key: manifestPath ?? `id:${studyId}`,
|
|
287
|
+
studyId,
|
|
288
|
+
name: manifestPath === undefined ? studyId : studyNameFromPath(manifestPath),
|
|
289
289
|
...(manifest?.title === undefined ? {} : { title: manifest.title }),
|
|
290
290
|
...(manifestPath === undefined ? {} : { path: manifestPath }),
|
|
291
291
|
...(manifest?.origin === undefined ? {} : { origin: manifest.origin }),
|
|
292
292
|
declared: isDeclared,
|
|
293
293
|
// Replaced by assignLabels once the whole set is known; a label is only meaningful relative
|
|
294
294
|
// to the rows it sits beside.
|
|
295
|
-
label: manifest?.title ?? (manifestPath === undefined ?
|
|
295
|
+
label: manifest?.title ?? (manifestPath === undefined ? studyId : studyNameFromPath(manifestPath)),
|
|
296
296
|
...(manifest?.description === undefined ? {} : { description: manifest.description }),
|
|
297
|
-
sharesIdWith: Math.max(0, (idCounts.get(
|
|
297
|
+
sharesIdWith: Math.max(0, (idCounts.get(studyId) ?? 0) - 1),
|
|
298
298
|
runs: rollup?.runs ?? 0,
|
|
299
299
|
live: rollup?.live ?? 0,
|
|
300
300
|
...(rollup?.latest === undefined ? {} : { latest: rollup.latest }),
|
|
301
301
|
liveRuns: rollup?.liveRuns ?? [],
|
|
302
|
-
expectation: expectationFor(runsOf.get(
|
|
303
|
-
liveExpectation: expectationFor(runsOf.get(
|
|
302
|
+
expectation: expectationFor(runsOf.get(studyId) ?? []),
|
|
303
|
+
liveExpectation: expectationFor(runsOf.get(studyId) ?? [], "live"),
|
|
304
304
|
};
|
|
305
305
|
};
|
|
306
|
-
const declaredIds = new Set(declared.map((
|
|
306
|
+
const declaredIds = new Set(declared.map((study) => study.id));
|
|
307
307
|
const rows = [
|
|
308
|
-
...declared.map((
|
|
309
|
-
...
|
|
310
|
-
.filter((
|
|
311
|
-
.map((
|
|
308
|
+
...declared.map((study) => build(study.id, study, true)),
|
|
309
|
+
...studies
|
|
310
|
+
.filter((study) => !declaredIds.has(study.studyId))
|
|
311
|
+
.map((study) => build(study.studyId, undefined, false)),
|
|
312
312
|
];
|
|
313
313
|
// Resolve each row's label before sorting, so the list is ordered by what a reader actually sees.
|
|
314
314
|
assignLabels(rows);
|
|
@@ -332,9 +332,9 @@ 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
|
|
337
|
-
* is exactly what `humanish
|
|
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
|
+
* is exactly what `humanish run` takes.
|
|
338
338
|
*/
|
|
339
339
|
function assignLabels(rows) {
|
|
340
340
|
const count = (values) => {
|
package/dist/run/reclaim.d.ts
CHANGED
|
@@ -38,7 +38,7 @@ export declare function reclaimRunSandboxes(cwd: string, runInput: string, hooks
|
|
|
38
38
|
*/
|
|
39
39
|
export declare function reclaimPinnedRunSandboxes(cwd: string, runPaths: PreparedRunArtifactPaths, hooks?: ReclaimHooks): Promise<ReclaimResult>;
|
|
40
40
|
/**
|
|
41
|
-
* Kill the sandboxes left by interrupted `humanish
|
|
41
|
+
* Kill the sandboxes left by interrupted `humanish study check` probes. A probe journals under
|
|
42
42
|
* .humanish/preflight/<probe-id>/ and removes the journal after a confirmed kill, so what is left
|
|
43
43
|
* belongs to a probe that died or could not confirm its teardown. A journal whose probe may still
|
|
44
44
|
* be running is left alone with the reason (see preflightReclaimDecision).
|
package/dist/run/reclaim.js
CHANGED
|
@@ -49,8 +49,8 @@ async function reclaimRun(cwd, runInput, locate, hooks) {
|
|
|
49
49
|
const runId = runIdOf(runPaths);
|
|
50
50
|
const journal = await reclaimJournal(runPaths, hooks);
|
|
51
51
|
if (journal.kind === "empty") {
|
|
52
|
-
//
|
|
53
|
-
// 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
|
|
54
54
|
// is the only backstop for those). Either way there is no id to act on, and saying so beats
|
|
55
55
|
// pretending a scan happened.
|
|
56
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.");
|
|
@@ -80,7 +80,7 @@ async function reclaimRun(cwd, runInput, locate, hooks) {
|
|
|
80
80
|
return result;
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
83
|
-
* Kill the sandboxes left by interrupted `humanish
|
|
83
|
+
* Kill the sandboxes left by interrupted `humanish study check` probes. A probe journals under
|
|
84
84
|
* .humanish/preflight/<probe-id>/ and removes the journal after a confirmed kill, so what is left
|
|
85
85
|
* belongs to a probe that died or could not confirm its teardown. A journal whose probe may still
|
|
86
86
|
* be running is left alone with the reason (see preflightReclaimDecision).
|
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
|
-
|
|
6
|
+
/** Which manifest produced this run. */
|
|
7
|
+
study?: 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_V2_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
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { RunCostSummary } from "./bundle.js";
|
|
2
|
+
import type { AnalysisAccounting } from "./costs.js";
|
|
3
|
+
import type { RunIndexEntry } from "./run-index.js";
|
|
4
|
+
/** The fields of run.json's `cost` that the run cost reads. Completeness is unknown when absent. */
|
|
5
|
+
export type RunCostSubtotal = Pick<RunCostSummary, "estimatedTotalUsd"> & Partial<Pick<RunCostSummary, "fullyEstimated" | "ratesAsOf" | "placeholder">>;
|
|
6
|
+
/** A run's analysis spend, every attempt counted once, as `readAnalysisAccounting` reads it. */
|
|
7
|
+
export interface RunAnalysisCost {
|
|
8
|
+
/** Requests the run's analyses sent, or may have sent. */
|
|
9
|
+
requests: number;
|
|
10
|
+
/** Their known estimated dollars; null when none has a price. */
|
|
11
|
+
estimatedUsd: number | null;
|
|
12
|
+
/** True when every request has a complete price and the history was read whole. */
|
|
13
|
+
complete: boolean;
|
|
14
|
+
/** Who billed the requests that recorded usage. */
|
|
15
|
+
providers: Array<"openai" | "codex">;
|
|
16
|
+
}
|
|
17
|
+
/** Complete, a lower bound, or unknown (`null`) when only the subtotal's dollars are at hand. */
|
|
18
|
+
type Completeness = boolean | null;
|
|
19
|
+
export interface RunCost {
|
|
20
|
+
/** Participants and desktops; null when the run has no cost summary, as in a dry run. */
|
|
21
|
+
run: {
|
|
22
|
+
usd: number | null;
|
|
23
|
+
complete: Completeness;
|
|
24
|
+
ratesAsOf: string | null;
|
|
25
|
+
placeholder: boolean;
|
|
26
|
+
} | null;
|
|
27
|
+
/** The run's analysis requests; null when it sent none. */
|
|
28
|
+
analysis: RunAnalysisCost | null;
|
|
29
|
+
/** The known dollars of both; null when neither has a figure. */
|
|
30
|
+
total: {
|
|
31
|
+
usd: number;
|
|
32
|
+
complete: Completeness;
|
|
33
|
+
} | null;
|
|
34
|
+
}
|
|
35
|
+
/** The accounting's analysis spend, or null when the run sent no analysis request. */
|
|
36
|
+
export declare function analysisCostOf(accounting: Pick<AnalysisAccounting, "dispatched" | "unresolved" | "unpriced" | "estimatedUsd" | "providers" | "warnings">): RunAnalysisCost | null;
|
|
37
|
+
export declare function runCost(subtotal: RunCostSubtotal | null | undefined, analysis?: RunAnalysisCost | null): RunCost;
|
|
38
|
+
/**
|
|
39
|
+
* A run index entry's cost: its participants-and-desktops figure, complete or a lower bound when
|
|
40
|
+
* the status record says which, plus its analyses.
|
|
41
|
+
*/
|
|
42
|
+
export declare function indexedRunCost(entry: Pick<RunIndexEntry, "estimatedCostUsd" | "estimatedCostComplete" | "analysisCost">): RunCost;
|
|
43
|
+
/**
|
|
44
|
+
* The cost as separate parts: participants and desktops, then the analysis and the total when the
|
|
45
|
+
* run sent an analysis request. Empty when the run has no cost summary.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runCostParts(cost: RunCost): string[];
|
|
48
|
+
/**
|
|
49
|
+
* The cost in one short label for a list row: the total, and how many analyses it includes.
|
|
50
|
+
* Undefined when the run has no cost summary.
|
|
51
|
+
*/
|
|
52
|
+
export declare function runCostLabel(cost: RunCost): string | undefined;
|
|
53
|
+
export {};
|