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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ResolvedPersona } from "../
|
|
1
|
+
import { type ResolvedPersona } from "../study/persona.js";
|
|
2
2
|
import type { PreparedSelectedOutputDirectory } from "./contained-output.js";
|
|
3
3
|
import type { RunBundle } from "./bundle.js";
|
|
4
4
|
export declare function loadDryRunInputs(projectRoot: PreparedSelectedOutputDirectory, humanishSource: "present" | "missing"): Promise<{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parse as parseYaml } from "yaml";
|
|
2
|
-
import { parseResolvedPersona } from "../
|
|
2
|
+
import { parseResolvedPersona } from "../study/persona.js";
|
|
3
3
|
import { digestText } from "../evidence/redaction.js";
|
|
4
4
|
import { readImplicitProjectFile } from "./project.js";
|
|
5
5
|
import { escapeRegExp } from "./text.js";
|
|
@@ -12,7 +12,7 @@ const builtinPersona = {
|
|
|
12
12
|
const builtinScenario = {
|
|
13
13
|
id: "builtin-first-run-smoke",
|
|
14
14
|
title: "Built-in First-Run Smoke",
|
|
15
|
-
goal: "
|
|
15
|
+
goal: "Write a public-safe dry-run bundle from built-in defaults.",
|
|
16
16
|
source: "builtin:first-run-smoke",
|
|
17
17
|
sourceDigest: "builtin",
|
|
18
18
|
};
|
package/dist/run/dry-run.js
CHANGED
|
@@ -9,7 +9,7 @@ import {} from "./streams.js";
|
|
|
9
9
|
import { participantEvent, participantIdsOf, participantRecord, participantStream, } from "./participant-records.js";
|
|
10
10
|
import { implicitProjectDirectoryExists, readPackageName, validateCwd } from "./project.js";
|
|
11
11
|
import { loadDryRunInputs } from "./dry-run-inputs.js";
|
|
12
|
-
import { judgeExecution, judgePreview, OUTCOME_POLICIES, resultOk } from "./judge.js";
|
|
12
|
+
import { judgeExecution, judgePreview, OUTCOME_POLICIES, resultOk, verdictText, } from "./judge.js";
|
|
13
13
|
/**
|
|
14
14
|
* The preview route's run. The run scope closes the run it started on every exit, including
|
|
15
15
|
* the fail-closed ones. It renders an Observer only when `options.observer` asks for one.
|
|
@@ -33,14 +33,14 @@ async function runDryRunInScope(options, scope) {
|
|
|
33
33
|
const warnings = [];
|
|
34
34
|
if (cwdError)
|
|
35
35
|
return refused(requestedCwd, warnings, cwdError);
|
|
36
|
-
const participants = normalizeParticipantCount(options.
|
|
36
|
+
const participants = normalizeParticipantCount(options.participantCount);
|
|
37
37
|
if (participants === null) {
|
|
38
38
|
return refused(requestedCwd, warnings, {
|
|
39
|
-
code: "
|
|
39
|
+
code: "HUMANISH_INVALID_PARTICIPANT_COUNT",
|
|
40
40
|
message: "--count must be a positive integer.",
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
-
// Bind the physical project, as the
|
|
43
|
+
// Bind the physical project, as the routes do: a symlinked cwd retargeted mid-run cannot
|
|
44
44
|
// redirect source reads or run storage into another project.
|
|
45
45
|
const physicalCwd = await realpath(requestedCwd);
|
|
46
46
|
const projectRoot = await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
|
|
@@ -48,7 +48,7 @@ async function runDryRunInScope(options, scope) {
|
|
|
48
48
|
if (!options.dryRun) {
|
|
49
49
|
return refused(requestedCwd, warnings, {
|
|
50
50
|
code: "HUMANISH_LIVE_RUN_UNIMPLEMENTED",
|
|
51
|
-
message: "
|
|
51
|
+
message: "humanish run needs a study. List studies with humanish study list, or run humanish run --dry-run for a sample bundle.",
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
const createdAt = new Date().toISOString();
|
|
@@ -64,7 +64,7 @@ async function runDryRunInScope(options, scope) {
|
|
|
64
64
|
runId: options.runId,
|
|
65
65
|
mintRunId: () => `dryrun-${createdAt.replace(/[:.]/g, "-")}-${randomUUID().slice(0, 8)}`,
|
|
66
66
|
mode: options.dryRun ? "dry-run" : "live",
|
|
67
|
-
|
|
67
|
+
study: options.study,
|
|
68
68
|
renderReview: renderReviewMarkdown,
|
|
69
69
|
// The run starts at the time its id and source were stamped with.
|
|
70
70
|
now: () => Date.parse(createdAt),
|
|
@@ -94,7 +94,7 @@ async function runDryRunInScope(options, scope) {
|
|
|
94
94
|
{
|
|
95
95
|
at: createdAt,
|
|
96
96
|
event: "run.created",
|
|
97
|
-
message: `Synthetic dry-run
|
|
97
|
+
message: `Synthetic dry-run bundle created with ${participants} simulated participant${participants === 1 ? "" : "s"}.`,
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
at: createdAt,
|
|
@@ -117,7 +117,7 @@ async function runDryRunInScope(options, scope) {
|
|
|
117
117
|
events: observerFixtures.events,
|
|
118
118
|
redaction: {
|
|
119
119
|
status: "passed",
|
|
120
|
-
notes: "Dry-run bundle
|
|
120
|
+
notes: "Dry-run bundle: synthetic data only, nothing from a product.",
|
|
121
121
|
},
|
|
122
122
|
artifacts: bundleArtifacts(),
|
|
123
123
|
review: createReviewSummary(judgment.verdict),
|
|
@@ -150,14 +150,14 @@ async function runDryRunInScope(options, scope) {
|
|
|
150
150
|
};
|
|
151
151
|
}
|
|
152
152
|
/**
|
|
153
|
-
* The preview's review, with the verdict judgePreview gave it. It claims
|
|
154
|
-
* never product behavior.
|
|
153
|
+
* The preview's review, with the verdict judgePreview gave it. It claims only that the run's
|
|
154
|
+
* files were written, never product behavior.
|
|
155
155
|
*/
|
|
156
156
|
function createReviewSummary(verdict) {
|
|
157
157
|
return {
|
|
158
158
|
schema: REVIEW_SCHEMA,
|
|
159
159
|
verdict,
|
|
160
|
-
summary: "
|
|
160
|
+
summary: "Dry run: humanish wrote a synthetic run bundle. No product behavior was tested.",
|
|
161
161
|
gaps: [
|
|
162
162
|
"No browser was launched.",
|
|
163
163
|
"No product state was verified.",
|
|
@@ -173,7 +173,7 @@ Run: ${bundle.runId}
|
|
|
173
173
|
|
|
174
174
|
Mode: ${bundle.mode}
|
|
175
175
|
|
|
176
|
-
Verdict: ${bundle.review.verdict}
|
|
176
|
+
Verdict: ${verdictText(bundle.review.verdict, bundle.mode)}
|
|
177
177
|
|
|
178
178
|
${bundle.review.summary}
|
|
179
179
|
|
|
@@ -210,7 +210,7 @@ const SYNTHETIC_STREAM_TEMPLATES = [
|
|
|
210
210
|
kind: "ui",
|
|
211
211
|
mode: "browser-sim",
|
|
212
212
|
label: "UI journey",
|
|
213
|
-
currentStep: "Route and viewport
|
|
213
|
+
currentStep: "Route and viewport recorded",
|
|
214
214
|
summary: "Simulated browser participant reserved for VNC playback, screenshots, route state, and interaction trace.",
|
|
215
215
|
tail: "open target app\nresolve first-run route\ncapture viewport state\nrecord interaction trace",
|
|
216
216
|
viewport: { width: 1440, height: 960, deviceScaleFactor: 1 },
|
|
@@ -219,19 +219,19 @@ const SYNTHETIC_STREAM_TEMPLATES = [
|
|
|
219
219
|
kind: "terminal",
|
|
220
220
|
mode: "cli-sim",
|
|
221
221
|
label: "CLI actor",
|
|
222
|
-
currentStep: "Command transcript
|
|
222
|
+
currentStep: "Command transcript recorded",
|
|
223
223
|
summary: "Simulated CLI participant reserved for command-by-command persona runs with stdout/stderr and artifact links.",
|
|
224
224
|
// Every command in a shipped sample tail must be one the CLI actually accepts: participants
|
|
225
225
|
// read and run them. tests/surface/shipped-command-strings.test.ts checks this against the
|
|
226
226
|
// command table.
|
|
227
|
-
tail: "$ humanish doctor\nok target cwd\nok humanish source\n$ humanish run first-run\
|
|
227
|
+
tail: "$ humanish doctor\nok target cwd\nok humanish source\n$ humanish run first-run\nhumanish run dry-run",
|
|
228
228
|
viewport: undefined,
|
|
229
229
|
},
|
|
230
230
|
{
|
|
231
231
|
kind: "tui",
|
|
232
232
|
mode: "tui-sim",
|
|
233
233
|
label: "TUI actor",
|
|
234
|
-
currentStep: "Terminal UI frame
|
|
234
|
+
currentStep: "Terminal UI frame recorded",
|
|
235
235
|
summary: "Simulated TUI participant reserved for PTY bytes, ANSI rendering, focus replay, and optional assisted attach.",
|
|
236
236
|
tail: "\u001b[2mhumanish TUI frame\u001b[0m\n> persona: skeptical-power-user\n> scenario: onboarding-regression\nstatus: awaiting live PTY transport",
|
|
237
237
|
viewport: undefined,
|
|
@@ -240,9 +240,9 @@ const SYNTHETIC_STREAM_TEMPLATES = [
|
|
|
240
240
|
kind: "codex-ui",
|
|
241
241
|
mode: "codex-app-sim",
|
|
242
242
|
label: "Codex UI",
|
|
243
|
-
currentStep: "App-server embed
|
|
243
|
+
currentStep: "App-server embed recorded",
|
|
244
244
|
summary: "Simulated Codex UI participant reserved for app-server sessions that can be watched beside terminal evidence.",
|
|
245
|
-
tail: "codex-app-server session
|
|
245
|
+
tail: "codex-app-server session (dry run)\nstate: not_connected\nembed: pending provider URL\nreceipts: planned",
|
|
246
246
|
viewport: { width: 1280, height: 900, deviceScaleFactor: 1 },
|
|
247
247
|
},
|
|
248
248
|
];
|
|
@@ -255,7 +255,7 @@ function buildSyntheticObserverFixtures(args) {
|
|
|
255
255
|
at: args.createdAt,
|
|
256
256
|
level: "info",
|
|
257
257
|
type: "observer.contract.created",
|
|
258
|
-
message: "Created public-safe
|
|
258
|
+
message: "Created the public-safe Observer streams.",
|
|
259
259
|
},
|
|
260
260
|
];
|
|
261
261
|
for (let index = 0; index < args.count; index += 1) {
|
|
@@ -324,7 +324,7 @@ function buildSyntheticObserverFixtures(args) {
|
|
|
324
324
|
at: args.createdAt,
|
|
325
325
|
level: "info",
|
|
326
326
|
type: "sim.contract.ready",
|
|
327
|
-
message: `${template.label} stream
|
|
327
|
+
message: `${template.label} stream ready.`,
|
|
328
328
|
}), participantEvent(ids, {
|
|
329
329
|
id: `event-${String(index + 1).padStart(3, "0")}-b`,
|
|
330
330
|
at: args.createdAt,
|
package/dist/run/judge.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface BlockerFacts {
|
|
|
6
6
|
completionReason: ActorCompletionReason;
|
|
7
7
|
/** A harness-owned stop condition ended the session: a matched stopWhen or a completed dwell window. */
|
|
8
8
|
stopConditionMatched: boolean;
|
|
9
|
-
/** What the participant declared in a field, when its provider has one
|
|
9
|
+
/** What the participant declared in a field, when its provider has one. */
|
|
10
10
|
declaredOutcome?: ParticipantDeclaredOutcome;
|
|
11
11
|
/** The route's reading of the closing report: it describes a blocker or asks for instructions. */
|
|
12
12
|
closingReportReadsBlocked: boolean;
|
|
@@ -23,7 +23,7 @@ export interface SessionEnding extends BlockerFacts {
|
|
|
23
23
|
export declare function hollowCompletion(ending: SessionEnding): boolean;
|
|
24
24
|
/**
|
|
25
25
|
* The participant said it reached the goal but reported a blocker. A declared outcome is its own
|
|
26
|
-
* word and wins
|
|
26
|
+
* word and wins. Without one, the closing report is read, unless a stop condition ended the
|
|
27
27
|
* session: a matched stopWhen is structured completion evidence and overrides the text.
|
|
28
28
|
*/
|
|
29
29
|
export declare function selfReportedBlocker(ending: BlockerFacts): boolean;
|
|
@@ -60,12 +60,18 @@ export declare function participantHarnessFailed(participant: ParticipantFacts):
|
|
|
60
60
|
* goal_satisfied claim with zero engagement is a session that ran out before anything happened;
|
|
61
61
|
* one whose final message describes a blocker is a participant who could not proceed and said so.
|
|
62
62
|
* Both keep their trace status (the claim is evidence); neither is a participant who reached the
|
|
63
|
-
* goal. One rule for the single participant and the fan-out roll-up
|
|
63
|
+
* goal. One rule for the single participant and the fan-out roll-up.
|
|
64
64
|
*/
|
|
65
65
|
export declare function participantStatus(status: ActorStatus, judgments: {
|
|
66
66
|
noEngagement: boolean;
|
|
67
67
|
selfReportedBlocker: boolean;
|
|
68
68
|
} | undefined): ActorStatus;
|
|
69
|
+
/**
|
|
70
|
+
* A verdict as review.md prints it. The schema keeps `contract_proof_only`, which a dry run always
|
|
71
|
+
* gets and a live run gets while it is in progress or when no participant result came back, so
|
|
72
|
+
* the reader sees "dry run" or "no verdict" by the run's mode.
|
|
73
|
+
*/
|
|
74
|
+
export declare function verdictText(verdict: Verdict, mode: "dry-run" | "live"): string;
|
|
69
75
|
/** The review verdict for one participant's status. */
|
|
70
76
|
export declare function verdictForStatus(status: ActorStatus): Verdict;
|
|
71
77
|
declare const judged: unique symbol;
|
|
@@ -77,7 +83,7 @@ export interface Judgment {
|
|
|
77
83
|
readonly verdict: Verdict;
|
|
78
84
|
/**
|
|
79
85
|
* The run met its route's pass rule: every expected participant passed and, on shared-world,
|
|
80
|
-
* the
|
|
86
|
+
* the participants showed the concurrency verify requires. A dry run passes as a contract.
|
|
81
87
|
*/
|
|
82
88
|
readonly passed: boolean;
|
|
83
89
|
/** A type-only mark that judgmentOf made this judgment; it does not exist at runtime. */
|
|
@@ -126,13 +132,13 @@ export interface OutcomePolicy {
|
|
|
126
132
|
export type JudgedRoute = "computer-use" | "shared-world" | "terminal" | "scripted" | "preview";
|
|
127
133
|
/** Each route's outcome policy, in one place. */
|
|
128
134
|
export declare const OUTCOME_POLICIES: Readonly<Record<JudgedRoute, OutcomePolicy>>;
|
|
129
|
-
/** What a shared-world run observed about its one world, beside how each
|
|
135
|
+
/** What a shared-world run observed about its one world, beside how each participant ended. */
|
|
130
136
|
export interface SharedWorldFacts {
|
|
131
|
-
/** Two or more
|
|
137
|
+
/** Two or more participants were live at the same time. */
|
|
132
138
|
overlap: boolean;
|
|
133
139
|
/** Provisioned plane only: the shared state changed at or after the first overlap started. */
|
|
134
140
|
stateChangedUnderOverlap?: boolean;
|
|
135
|
-
/** External-public plane only: every
|
|
141
|
+
/** External-public plane only: every participant reached one lobby. */
|
|
136
142
|
lobbyConvergence?: boolean;
|
|
137
143
|
}
|
|
138
144
|
/** A shared-world run's judgment, with the world facts its review and result also report. */
|
|
@@ -162,15 +168,15 @@ export declare function judgeParticipants(args: {
|
|
|
162
168
|
participants: ParticipantFacts[];
|
|
163
169
|
}): Judgment;
|
|
164
170
|
/**
|
|
165
|
-
* Why a shared-world run whose
|
|
166
|
-
* meet what verify's shared-world check requires of a pass: two
|
|
167
|
-
* on the provisioned plane, a shared-state change at or after the first overlap started.
|
|
171
|
+
* Why a shared-world run whose participants all passed still fails, or undefined when its world
|
|
172
|
+
* facts meet what verify's shared-world check requires of a pass: two participants live at the same
|
|
173
|
+
* time and, on the provisioned plane, a shared-state change at or after the first overlap started.
|
|
168
174
|
*/
|
|
169
175
|
export declare function sharedWorldShortfall(world: SharedWorldFacts): string | undefined;
|
|
170
176
|
/**
|
|
171
|
-
* A shared-world run: it passes only when every expected
|
|
172
|
-
* shortfall, and otherwise fails (this route has no timed_out verdict). A dry run and a run
|
|
173
|
-
* in progress are contracts. Lobby convergence is recorded but not read.
|
|
177
|
+
* A shared-world run: it passes only when every expected participant passed and the world facts
|
|
178
|
+
* have no shortfall, and otherwise fails (this route has no timed_out verdict). A dry run and a run
|
|
179
|
+
* still in progress are contracts. Lobby convergence is recorded but not read.
|
|
174
180
|
*/
|
|
175
181
|
export declare function judgeSharedWorld(args: {
|
|
176
182
|
dryRun: boolean;
|
package/dist/run/judge.js
CHANGED
|
@@ -24,7 +24,7 @@ export function hollowCompletion(ending) {
|
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* The participant said it reached the goal but reported a blocker. A declared outcome is its own
|
|
27
|
-
* word and wins
|
|
27
|
+
* word and wins. Without one, the closing report is read, unless a stop condition ended the
|
|
28
28
|
* session: a matched stopWhen is structured completion evidence and overrides the text.
|
|
29
29
|
*/
|
|
30
30
|
export function selfReportedBlocker(ending) {
|
|
@@ -65,7 +65,7 @@ export function participantHarnessFailed(participant) {
|
|
|
65
65
|
* goal_satisfied claim with zero engagement is a session that ran out before anything happened;
|
|
66
66
|
* one whose final message describes a blocker is a participant who could not proceed and said so.
|
|
67
67
|
* Both keep their trace status (the claim is evidence); neither is a participant who reached the
|
|
68
|
-
* goal. One rule for the single participant and the fan-out roll-up
|
|
68
|
+
* goal. One rule for the single participant and the fan-out roll-up.
|
|
69
69
|
*/
|
|
70
70
|
export function participantStatus(status, judgments) {
|
|
71
71
|
if (status !== "passed" || judgments === undefined)
|
|
@@ -76,6 +76,16 @@ export function participantStatus(status, judgments) {
|
|
|
76
76
|
return "blocked";
|
|
77
77
|
return status;
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* A verdict as review.md prints it. The schema keeps `contract_proof_only`, which a dry run always
|
|
81
|
+
* gets and a live run gets while it is in progress or when no participant result came back, so
|
|
82
|
+
* the reader sees "dry run" or "no verdict" by the run's mode.
|
|
83
|
+
*/
|
|
84
|
+
export function verdictText(verdict, mode) {
|
|
85
|
+
if (verdict !== "contract_proof_only")
|
|
86
|
+
return verdict;
|
|
87
|
+
return mode === "dry-run" ? "dry run" : "no verdict";
|
|
88
|
+
}
|
|
79
89
|
/** The review verdict for one participant's status. */
|
|
80
90
|
export function verdictForStatus(status) {
|
|
81
91
|
switch (status) {
|
|
@@ -148,9 +158,9 @@ export function judgeParticipants(args) {
|
|
|
148
158
|
return judgmentOf(verdict, args.dryRun);
|
|
149
159
|
}
|
|
150
160
|
/**
|
|
151
|
-
* Why a shared-world run whose
|
|
152
|
-
* meet what verify's shared-world check requires of a pass: two
|
|
153
|
-
* on the provisioned plane, a shared-state change at or after the first overlap started.
|
|
161
|
+
* Why a shared-world run whose participants all passed still fails, or undefined when its world
|
|
162
|
+
* facts meet what verify's shared-world check requires of a pass: two participants live at the same
|
|
163
|
+
* time and, on the provisioned plane, a shared-state change at or after the first overlap started.
|
|
154
164
|
*/
|
|
155
165
|
export function sharedWorldShortfall(world) {
|
|
156
166
|
if (!world.overlap) {
|
|
@@ -162,9 +172,9 @@ export function sharedWorldShortfall(world) {
|
|
|
162
172
|
return undefined;
|
|
163
173
|
}
|
|
164
174
|
/**
|
|
165
|
-
* A shared-world run: it passes only when every expected
|
|
166
|
-
* shortfall, and otherwise fails (this route has no timed_out verdict). A dry run and a run
|
|
167
|
-
* in progress are contracts. Lobby convergence is recorded but not read.
|
|
175
|
+
* A shared-world run: it passes only when every expected participant passed and the world facts
|
|
176
|
+
* have no shortfall, and otherwise fails (this route has no timed_out verdict). A dry run and a run
|
|
177
|
+
* still in progress are contracts. Lobby convergence is recorded but not read.
|
|
168
178
|
*/
|
|
169
179
|
export function judgeSharedWorld(args) {
|
|
170
180
|
const passed = args.participants.length === args.expected &&
|
package/dist/run/outcomes.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ActorStatus } from "../actors/contract.js";
|
|
2
2
|
import { type CuaGoalSource } from "../actors/goal-source.js";
|
|
3
|
-
import type { TaskFunnel } from "../
|
|
3
|
+
import type { TaskFunnel } from "../study/tasks.js";
|
|
4
4
|
import type { ParticipantOutcomes, ReviewSummary, RunTaskFunnel } from "./bundle.js";
|
|
5
5
|
/** Tally participant outcomes from actor statuses. Statuses this does not recognise are counted in
|
|
6
6
|
* `total` but nowhere else, so the parts can never exceed the whole. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../actors/contract.js";
|
|
2
|
-
import type { Participant } from "../
|
|
2
|
+
import type { Participant } from "../study/plan-participants.js";
|
|
3
3
|
import type { RunParticipantAssignment } from "./streams.js";
|
|
4
4
|
/**
|
|
5
5
|
* A planned participant resolved for one run: the plan's record unchanged, plus what the route
|
package/dist/run/paths.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ export declare function createRunArtifactPaths(cwdInput: string, runId: string):
|
|
|
49
49
|
export declare function validatePreparedRunArtifactPaths(prepared: PreparedRunArtifactPaths): Promise<PreparedRunArtifactPaths>;
|
|
50
50
|
/**
|
|
51
51
|
* The physical project directory for a caller's cwd, bound before a run is resolved so a symlinked
|
|
52
|
-
* cwd retargeted later cannot move reads or writes to another project
|
|
52
|
+
* cwd retargeted later cannot move reads or writes to another project. A cwd that does not
|
|
53
53
|
* resolve is returned as given, so the caller still reports it missing.
|
|
54
54
|
*/
|
|
55
55
|
export declare function resolvePhysicalCwd(cwdInput: string): Promise<string>;
|
package/dist/run/paths.js
CHANGED
|
@@ -107,7 +107,7 @@ export async function validatePreparedRunArtifactPaths(prepared) {
|
|
|
107
107
|
}
|
|
108
108
|
/**
|
|
109
109
|
* The physical project directory for a caller's cwd, bound before a run is resolved so a symlinked
|
|
110
|
-
* cwd retargeted later cannot move reads or writes to another project
|
|
110
|
+
* cwd retargeted later cannot move reads or writes to another project. A cwd that does not
|
|
111
111
|
* resolve is returned as given, so the caller still reports it missing.
|
|
112
112
|
*/
|
|
113
113
|
export async function resolvePhysicalCwd(cwdInput) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Sandbox receipts for `humanish
|
|
1
|
+
// Sandbox receipts for `humanish study check`. A probe has no run directory, so it journals its
|
|
2
2
|
// sandbox under .humanish/preflight/<probe-id>/ before any work runs in it. A confirmed kill
|
|
3
3
|
// removes the journal. A journal that stays means the probe's sandbox may still be running, and
|
|
4
4
|
// `humanish reclaim --preflight` kills it by the recorded id once it is safe to.
|
package/dist/run/pricing.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ export interface ModelRate {
|
|
|
25
25
|
inputMultiplier: number;
|
|
26
26
|
outputMultiplier: number;
|
|
27
27
|
};
|
|
28
|
-
/**
|
|
28
|
+
/** The `YYYY-MM-DD` date the entry was last checked against `source`. */
|
|
29
29
|
asOf: string;
|
|
30
30
|
/** Public pricing page the number came from (a comment/URL, never a secret). */
|
|
31
31
|
source: string;
|
|
@@ -83,7 +83,7 @@ export interface ActorEstimatedCost {
|
|
|
83
83
|
/** Of `inputTokens`, how many were billed at the reduced cached rate. Present only when the
|
|
84
84
|
* provider reported cache hits and the rate sheet models a cached rate. */
|
|
85
85
|
cachedInputTokens?: number;
|
|
86
|
-
/** Of `inputTokens`, how many were billed at the cache-
|
|
86
|
+
/** Of `inputTokens`, how many were billed at the cache-write rate (OpenAI 5.6+). */
|
|
87
87
|
cacheWriteInputTokens?: number;
|
|
88
88
|
/** How many requests crossed the long-context threshold and were re-tiered. Present only
|
|
89
89
|
* when per-request `turns` records made exact tiering possible. */
|
|
@@ -104,6 +104,11 @@ export interface DesktopCostEstimate {
|
|
|
104
104
|
usdPerSecond?: number;
|
|
105
105
|
}
|
|
106
106
|
export declare const MODEL_RATES: Record<string, ModelRate>;
|
|
107
|
+
/**
|
|
108
|
+
* The refusal for a spend cap on a model this table cannot price. It names the priced models,
|
|
109
|
+
* since an npm install cannot edit this file.
|
|
110
|
+
*/
|
|
111
|
+
export declare function unpricedCapMessage(model: string): string;
|
|
107
112
|
export declare const DESKTOP_RATE: DesktopRate;
|
|
108
113
|
export declare function isDesktopResources(value: unknown): value is DesktopResources;
|
|
109
114
|
/** Price one observed allocation. Missing quantities/rates stay unknown, never a stock guess. */
|
|
@@ -113,8 +118,8 @@ export declare function estimateAllocatedDesktopCost(minutes: number | undefined
|
|
|
113
118
|
export declare function round6(n: number): number;
|
|
114
119
|
/**
|
|
115
120
|
* Estimate one actor trace's model-token cost from its trace tokenUsage + model id. Deterministic;
|
|
116
|
-
* the rate table is injectable (tests pass a fake sheet). Returns a
|
|
117
|
-
* (estimatedCostUsd: null + a reason) for a missing rate or missing usage
|
|
121
|
+
* the rate table is injectable (tests pass a fake sheet). Returns a declared-absent estimate
|
|
122
|
+
* (estimatedCostUsd: null + a reason) for a missing rate or missing usage, never a guessed cost.
|
|
118
123
|
*/
|
|
119
124
|
export declare function estimateActorCostForExecution(usage: ActorTokenUsage | undefined, modelId: string | undefined, profile?: {
|
|
120
125
|
billing?: unknown;
|
|
@@ -128,7 +133,7 @@ export declare function estimateAggregatedTurnCost(tokenUsage: ActorTokenUsage |
|
|
|
128
133
|
export declare function estimateActorCost(tokenUsage: ActorTokenUsage | undefined, modelId: string | undefined, rates?: Record<string, ModelRate>): ActorEstimatedCost;
|
|
129
134
|
/**
|
|
130
135
|
* Estimate the E2B desktop-minute cost from a host-side create->teardown span (minutes). The rate
|
|
131
|
-
* is injectable. Returns a
|
|
132
|
-
* measured (no sandbox / unmeasurable span)
|
|
136
|
+
* is injectable. Returns a declared-absent estimate (null + "no_duration") when no duration was
|
|
137
|
+
* measured (no sandbox / unmeasurable span), never a guessed 0.
|
|
133
138
|
*/
|
|
134
139
|
export declare function estimateDesktopCost(minutes: number | undefined, rate?: DesktopRate): DesktopCostEstimate;
|
package/dist/run/pricing.js
CHANGED
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
// This module is pure (node builtins only, no deps) and deterministic: the estimator functions take
|
|
7
7
|
// an optional injected rate table/rate so tests drive assertions with a fake sheet and never depend
|
|
8
8
|
// on the live numbers below. An unknown model/desktop rate yields a declared-absent estimate
|
|
9
|
-
// (estimatedCostUsd: null + a reason) and never a guessed or silent-zero cost
|
|
9
|
+
// (estimatedCostUsd: null + a reason) and never a guessed or silent-zero cost. A bare
|
|
10
10
|
// `costUsd` elsewhere in the contract means a provider actually billed that amount; the
|
|
11
11
|
// token-derived estimate here always lives under `estimatedCostUsd` so a reader can never confuse
|
|
12
|
-
// an estimate for an authoritative charge
|
|
12
|
+
// an estimate for an authoritative charge.
|
|
13
13
|
export const PRICING_SCHEMA = "humanish.pricing.v1";
|
|
14
14
|
export const ACTOR_ESTIMATED_COST_SCHEMA = "humanish.actor-estimated-cost.v1";
|
|
15
15
|
// The gpt-5.6 long-context tier: >272K input tokens re-prices the full request at 2x
|
|
@@ -44,14 +44,14 @@ const GPT6_ASTRA_AS_OF = "2026-09-03";
|
|
|
44
44
|
// case-insensitive on a trimmed id). An id missing here is declared absent, never guessed.
|
|
45
45
|
export const MODEL_RATES = {
|
|
46
46
|
// OpenAI computer-use-preview (the classic CUA model). ~$3 / 1M input, ~$12 / 1M output.
|
|
47
|
-
// source: openai.com/api/pricing (verify
|
|
47
|
+
// source: openai.com/api/pricing (verify: providers change without notice).
|
|
48
48
|
"computer-use-preview": {
|
|
49
49
|
inputUsdPerToken: 3e-6,
|
|
50
50
|
outputUsdPerToken: 12e-6,
|
|
51
51
|
asOf: "2026-08-01",
|
|
52
52
|
source: "openai.com/api/pricing (computer-use-preview)",
|
|
53
53
|
},
|
|
54
|
-
// gpt-5.5: the
|
|
54
|
+
// gpt-5.5: the previous-generation CUA default, kept so pinned labs and old bundles still
|
|
55
55
|
// price. Pre-5.6 models bill no cache-write fee (prompt-caching guide) and no long-context
|
|
56
56
|
// tier was published for it.
|
|
57
57
|
"gpt-5.5": {
|
|
@@ -59,7 +59,7 @@ export const MODEL_RATES = {
|
|
|
59
59
|
outputUsdPerToken: 30e-6,
|
|
60
60
|
cachedInputUsdPerToken: 0.5e-6,
|
|
61
61
|
asOf: "2026-08-05",
|
|
62
|
-
source: "openrouter.ai/openai/gpt-5.5 (gpt-5.5 no longer on openai.com/api/pricing
|
|
62
|
+
source: "openrouter.ai/openai/gpt-5.5 (gpt-5.5 is no longer listed on openai.com/api/pricing)",
|
|
63
63
|
},
|
|
64
64
|
// The gpt-5.6 family (live sheet 2026-08-18, standard tier, short-context base rates;
|
|
65
65
|
// the longContext block prices the >272K re-tier when per-request turns are recorded).
|
|
@@ -67,7 +67,7 @@ export const MODEL_RATES = {
|
|
|
67
67
|
// cyber = the Daybreak frontier tier.
|
|
68
68
|
"gpt-5.6-sol": rateWithLongContextTier(4, 0.4, 5, 20, GPT56_SOL_PROMO_AS_OF),
|
|
69
69
|
// "gpt-5.6" is OpenAI's own alias for gpt-5.6-sol (models index); priced identically so a
|
|
70
|
-
//
|
|
70
|
+
// study configured with the alias never reads as unpriced.
|
|
71
71
|
"gpt-5.6": rateWithLongContextTier(4, 0.4, 5, 20, GPT56_SOL_PROMO_AS_OF),
|
|
72
72
|
"gpt-5.6-terra": rateWithLongContextTier(2, 0.2, 2.5, 12),
|
|
73
73
|
"gpt-5.6-luna": rateWithLongContextTier(0.2, 0.02, 0.25, 1.2),
|
|
@@ -79,7 +79,7 @@ export const MODEL_RATES = {
|
|
|
79
79
|
"daybreak-red-latest": rateWithLongContextTier(12.5, 1.25, 15.625, 75),
|
|
80
80
|
// gpt-6-astra (shipped 2026-09-03; API access announced as rolling out). Same two mechanics
|
|
81
81
|
// as the 5.6 family on the sheet: writes at 1.25x, >272K re-tiers at 2x input-side / 1.5x
|
|
82
|
-
// output ($20 / $2 / $25 / $75 long-context columns). These rates cover explicit
|
|
82
|
+
// output ($20 / $2 / $25 / $75 long-context columns). These rates cover explicit study
|
|
83
83
|
// model choices and the study-analysis default; the computer-use default is separate.
|
|
84
84
|
"gpt-6-astra": rateWithLongContextTier(10, 1, 12.5, 50, GPT6_ASTRA_AS_OF, GPT6_ASTRA_SOURCE),
|
|
85
85
|
};
|
|
@@ -96,6 +96,13 @@ const DESKTOP_RESOURCE_RATE = {
|
|
|
96
96
|
// 2026-09-05 had 8 vCPU / 8 GiB. This is the largest CPU/RAM combination on that public sheet, not
|
|
97
97
|
// a provider billing ceiling or a claim about custom/enterprise templates. Runtime CUA estimates
|
|
98
98
|
// use observed allocation resources through estimateAllocatedDesktopCost instead of this fallback.
|
|
99
|
+
/**
|
|
100
|
+
* The refusal for a spend cap on a model this table cannot price. It names the priced models,
|
|
101
|
+
* since an npm install cannot edit this file.
|
|
102
|
+
*/
|
|
103
|
+
export function unpricedCapMessage(model) {
|
|
104
|
+
return `execution.caps sets a spend cap (maxUsd or maxTotalUsd), but humanish has no rate for model "${model}", so it cannot enforce the cap and refuses to start. Priced models: ${Object.keys(MODEL_RATES).sort().join(", ")}. Use one of them, or remove maxUsd and maxTotalUsd to run without a cap.`;
|
|
105
|
+
}
|
|
99
106
|
export const DESKTOP_RATE = {
|
|
100
107
|
usdPerMinute: 0.00888,
|
|
101
108
|
asOf: "2026-09-05",
|
|
@@ -158,8 +165,8 @@ export function round6(n) {
|
|
|
158
165
|
}
|
|
159
166
|
/**
|
|
160
167
|
* Estimate one actor trace's model-token cost from its trace tokenUsage + model id. Deterministic;
|
|
161
|
-
* the rate table is injectable (tests pass a fake sheet). Returns a
|
|
162
|
-
* (estimatedCostUsd: null + a reason) for a missing rate or missing usage
|
|
168
|
+
* the rate table is injectable (tests pass a fake sheet). Returns a declared-absent estimate
|
|
169
|
+
* (estimatedCostUsd: null + a reason) for a missing rate or missing usage, never a guessed cost.
|
|
163
170
|
*/
|
|
164
171
|
export function estimateActorCostForExecution(usage, modelId, profile) {
|
|
165
172
|
return profile?.billing === "account-unknown"
|
|
@@ -207,7 +214,7 @@ export function estimateActorCost(tokenUsage, modelId, rates = MODEL_RATES) {
|
|
|
207
214
|
const outTok = tokenUsage.output ?? 0;
|
|
208
215
|
// Long-context tiering needs to know each request's input size (the provider re-prices whole
|
|
209
216
|
// requests past the threshold), so it engages only when per-turn usage records exist and their
|
|
210
|
-
// input sums to the reported total
|
|
217
|
+
// input sums to the reported total, because a partial turn ledger must not silently price the missing
|
|
211
218
|
// remainder at the wrong tier. Otherwise totals price on the base (short-context) rate, which is
|
|
212
219
|
// the under-estimate direction and never trips a cap early.
|
|
213
220
|
const turns = tokenUsage.turns ?? [];
|
|
@@ -232,12 +239,12 @@ export function estimateActorCost(tokenUsage, modelId, rates = MODEL_RATES) {
|
|
|
232
239
|
// and on a session that threads provider state it is the majority of input, and pricing it at the
|
|
233
240
|
// full rate overstates real spend by up to ~10x. Cache writes bill at their own rate (1.25x on
|
|
234
241
|
// OpenAI 5.6+) as the total rate for those tokens; a sheet without a write rate prices writes as
|
|
235
|
-
// plain input (pre-5.6: writes are free-of-extra-fee, i.e. plain input).
|
|
236
|
-
// absent: no reported split means no discount and no surcharge assumed.
|
|
242
|
+
// plain input (pre-5.6: writes are free-of-extra-fee, i.e. plain input). An unreported piece
|
|
243
|
+
// stays absent: no reported split means no discount and no surcharge assumed.
|
|
237
244
|
const priceRequest = (usage, tierable) => {
|
|
238
245
|
const reqIn = usage.input ?? 0;
|
|
239
246
|
const reqOut = usage.output ?? 0;
|
|
240
|
-
// Tiering applies only to a real per-
|
|
247
|
+
// Tiering applies only to a real per-request record: session totals crossing the threshold
|
|
241
248
|
// say nothing about any single request, so totals always price on the base tier.
|
|
242
249
|
const long = tierable && rate.longContext !== undefined && reqIn > rate.longContext.thresholdInputTokens;
|
|
243
250
|
const inMul = long ? rate.longContext.inputMultiplier : 1;
|
|
@@ -293,8 +300,8 @@ export function estimateActorCost(tokenUsage, modelId, rates = MODEL_RATES) {
|
|
|
293
300
|
}
|
|
294
301
|
/**
|
|
295
302
|
* Estimate the E2B desktop-minute cost from a host-side create->teardown span (minutes). The rate
|
|
296
|
-
* is injectable. Returns a
|
|
297
|
-
* measured (no sandbox / unmeasurable span)
|
|
303
|
+
* is injectable. Returns a declared-absent estimate (null + "no_duration") when no duration was
|
|
304
|
+
* measured (no sandbox / unmeasurable span), never a guessed 0.
|
|
298
305
|
*/
|
|
299
306
|
export function estimateDesktopCost(minutes, rate = DESKTOP_RATE) {
|
|
300
307
|
if (minutes === undefined || !Number.isFinite(minutes) || minutes < 0) {
|