humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -7,29 +7,29 @@ import { TERMINAL_PRODUCT_LAB_PROVIDER_METADATA } from "./types.js";
|
|
|
7
7
|
* credential is forwarded. The real value must never be logged or persisted in either mode.
|
|
8
8
|
*/
|
|
9
9
|
export function buildRuntimeAuth(args) {
|
|
10
|
-
// The "openai-env" channel accepts CODEX_API_KEY or OPENAI_API_KEY as the runtime key
|
|
10
|
+
// The "openai-env" channel accepts CODEX_API_KEY or OPENAI_API_KEY as the runtime key source
|
|
11
11
|
// name, read in this preference order. CODEX_API_KEY is preferred: the official Codex docs
|
|
12
|
-
// (developers.openai.com/codex/noninteractive) document it as the channel for a
|
|
13
|
-
// invocation, which is exactly this
|
|
12
|
+
// (developers.openai.com/codex/noninteractive) document it as the channel for a single codex exec
|
|
13
|
+
// invocation, which is exactly this route's shape (no persisted auth.json/CODEX_HOME, per-command
|
|
14
14
|
// envs only). A dated in-repo receipt
|
|
15
|
-
// (docs/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
|
|
15
|
+
// (docs/history/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
|
|
16
16
|
// job-wide OPENAI_API_KEY alone failing bearer auth for this same pinned-exec pattern. When the
|
|
17
|
-
// operator only exported OPENAI_API_KEY, its value is
|
|
17
|
+
// operator only exported OPENAI_API_KEY, its value is also injected under CODEX_API_KEY below, so
|
|
18
18
|
// the documented exec auth channel is always populated regardless of which name the operator
|
|
19
|
-
// used. The
|
|
19
|
+
// used. The allowlist is exactly these two names; everything else is denied by construction.
|
|
20
20
|
const ALLOWED_RUNTIME_KEY_NAMES = ["CODEX_API_KEY", "OPENAI_API_KEY"];
|
|
21
|
-
// Tripwire (
|
|
21
|
+
// Tripwire (deny-by-default credentials): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
|
|
22
22
|
// added a clearly-non-runtime credential (a GitHub/payment/deploy/db secret), fail closed. The
|
|
23
|
-
// generic `*_KEY` shape is deliberately
|
|
23
|
+
// generic `*_KEY` shape is deliberately left out of the tripwire, since a runtime key legitimately
|
|
24
24
|
// ends in _KEY (CODEX_API_KEY/OPENAI_API_KEY), so testing it against the generic shape would
|
|
25
|
-
// false-positive on the very key this
|
|
25
|
+
// false-positive on the very key this route exists to inject. The positive allowlist itself is
|
|
26
26
|
// the real boundary: the command env is built from exactly these names and nothing else (so
|
|
27
27
|
// GITHUB_TOKEN/payment/db keys present in the operator env are never forwarded, proven by the
|
|
28
28
|
// deterministic test).
|
|
29
29
|
if (ALLOWED_RUNTIME_KEY_NAMES.some((name) => isNonRuntimeCredentialName(name))) {
|
|
30
30
|
return {
|
|
31
31
|
ok: false,
|
|
32
|
-
code: "
|
|
32
|
+
code: "HUMANISH_TERMINAL_CREDENTIAL_DENIED",
|
|
33
33
|
message: "Internal invariant violated: a runtime-key allowlist entry is a non-runtime credential (GitHub/payment/deploy/db).",
|
|
34
34
|
};
|
|
35
35
|
}
|
|
@@ -37,14 +37,14 @@ export function buildRuntimeAuth(args) {
|
|
|
37
37
|
if (!keyName) {
|
|
38
38
|
return {
|
|
39
39
|
ok: false,
|
|
40
|
-
code: "
|
|
40
|
+
code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING",
|
|
41
41
|
message: `Live terminal-product labs declare runtimeAuth "${String(args.runtimeAuth)}" and need ${ALLOWED_RUNTIME_KEY_NAMES.join(" or ")} in the environment (pass via --env-file; the selected auth mode places the value in command-scoped env or an external E2B header transform; the value is never persisted).`,
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
const keyValue = args.env[keyName];
|
|
45
|
-
// The command-scoped env is the
|
|
45
|
+
// The command-scoped env is the allowlist: exactly the runtime key name(s). No
|
|
46
46
|
// GITHUB_TOKEN/GH_TOKEN, no payment/deploy/db/media key, excluded by construction. When the
|
|
47
|
-
//
|
|
47
|
+
// source was OPENAI_API_KEY, the same value is also injected as CODEX_API_KEY so codex exec's
|
|
48
48
|
// documented single-invocation auth channel is populated either way (see the comment above).
|
|
49
49
|
const mode = args.runtimeAuth ?? "openai-env";
|
|
50
50
|
const envs = mode === "openai-egress"
|
|
@@ -62,11 +62,11 @@ export function buildRuntimeAuth(args) {
|
|
|
62
62
|
keyValue,
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
|
-
// Clearly-non-runtime credential
|
|
66
|
-
// runtime key must never be one of these). Deliberately
|
|
67
|
-
// runtime key this
|
|
65
|
+
// Clearly-non-runtime credential name shapes. Used as the runtime-key allowlist tripwire (a
|
|
66
|
+
// runtime key must never be one of these). Deliberately excludes the generic `*_KEY` shape: the
|
|
67
|
+
// runtime key this route injects (CODEX_API_KEY/OPENAI_API_KEY) legitimately ends in _KEY, so the
|
|
68
68
|
// generic shape would false-positive on it. The positive allowlist, not a denylist, is what
|
|
69
|
-
// keeps every
|
|
69
|
+
// keeps every other operator-env credential (GitHub/payment/deploy/db/media keys) out of the
|
|
70
70
|
// sandbox: the command env is built from exactly the allowlisted runtime key and nothing else.
|
|
71
71
|
const NON_RUNTIME_CREDENTIAL_NAME_PATTERNS = [
|
|
72
72
|
/^GITHUB_TOKEN$/i,
|
|
@@ -84,8 +84,8 @@ function isNonRuntimeCredentialName(name) {
|
|
|
84
84
|
return NON_RUNTIME_CREDENTIAL_NAME_PATTERNS.some((pattern) => pattern.test(name));
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
|
-
* Build the sandbox metadata from a
|
|
88
|
-
* way metadata is set on the terminal
|
|
87
|
+
* Build the sandbox metadata from a positive allowlist. This is the only
|
|
88
|
+
* way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
|
|
89
89
|
* value that is not a plain short label. A verifier check asserts the persisted metadata has no
|
|
90
90
|
* prompt/token/secret shapes; this builder makes that true by construction.
|
|
91
91
|
*/
|
|
@@ -95,7 +95,7 @@ export function buildSandboxMetadata(allowlist) {
|
|
|
95
95
|
tool: TERMINAL_PRODUCT_LAB_PROVIDER_METADATA.tool,
|
|
96
96
|
provider: "codex",
|
|
97
97
|
labId: allowlist.labId,
|
|
98
|
-
|
|
98
|
+
recordId: allowlist.recordId,
|
|
99
99
|
// The run id is a harness-minted token (terminal-<ts>-<hex>), not user data.
|
|
100
100
|
runId: allowlist.runId,
|
|
101
101
|
};
|
|
@@ -15,7 +15,7 @@ export declare function runDryTerminalLab(args: {
|
|
|
15
15
|
failed: RunLiveTerminalSessionArgs["failed"];
|
|
16
16
|
scope: RunScope;
|
|
17
17
|
}): Promise<TerminalProductLabResult>;
|
|
18
|
-
/** Compose the full prompt the agent would run. Bound to evidence by
|
|
18
|
+
/** Compose the full prompt the agent would run. Bound to evidence by digest only. */
|
|
19
19
|
export declare function composePrompt(args: {
|
|
20
20
|
mission: string;
|
|
21
21
|
personaLine: string;
|
|
@@ -9,7 +9,8 @@ import { buildTerminalProductBundle, renderTerminalReviewMarkdown } from "./bund
|
|
|
9
9
|
import { resolveTerminalPersona, terminalPersonaRef } from "./persona.js";
|
|
10
10
|
import { declaredRuntimeProvenance } from "./runtime.js";
|
|
11
11
|
import { defaultMission, makeTerminalRunId } from "./session.js";
|
|
12
|
-
import {
|
|
12
|
+
import {} from "./types.js";
|
|
13
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
13
14
|
/**
|
|
14
15
|
* The dry-run path: a contract bundle with the persona and prompt digest bound, published through
|
|
15
16
|
* the run scope with no sandbox, key or spend.
|
|
@@ -17,11 +18,10 @@ import { TERMINAL_PRODUCT_LAB_SCHEMA, } from "./types.js";
|
|
|
17
18
|
export async function runDryTerminalLab(args) {
|
|
18
19
|
const { plan, input, cwd, warnings, failed, scope } = args;
|
|
19
20
|
const { product } = plan;
|
|
20
|
-
const hooks = input.hooks ?? {};
|
|
21
21
|
const { evidenceMission, physicalCwd, persona } = await prepareDryPersona({
|
|
22
22
|
plan,
|
|
23
23
|
cwd,
|
|
24
|
-
env:
|
|
24
|
+
env: input.env ?? process.env,
|
|
25
25
|
warnings,
|
|
26
26
|
});
|
|
27
27
|
const started = await scope.startRun({
|
|
@@ -31,7 +31,7 @@ export async function runDryTerminalLab(args) {
|
|
|
31
31
|
mode: "dry-run",
|
|
32
32
|
lab: plan.lab,
|
|
33
33
|
renderReview: renderTerminalReviewMarkdown,
|
|
34
|
-
observer: { open: input.open === true, render:
|
|
34
|
+
observer: { open: input.open === true, render: input.deps?.renderObserver },
|
|
35
35
|
});
|
|
36
36
|
if (!started.ok)
|
|
37
37
|
return failed(started.code, started.message);
|
|
@@ -46,9 +46,8 @@ export async function runDryTerminalLab(args) {
|
|
|
46
46
|
const policies = plan.residual.policies;
|
|
47
47
|
const judgment = judgeTerminal({ dryRun: true, participant: undefined });
|
|
48
48
|
const bundle = buildTerminalProductBundle({
|
|
49
|
-
|
|
49
|
+
run,
|
|
50
50
|
actorId: plan.actor,
|
|
51
|
-
createdAt,
|
|
52
51
|
dryRun: true,
|
|
53
52
|
labId: plan.labId,
|
|
54
53
|
...(plan.title ? { labTitle: plan.title } : {}),
|
|
@@ -65,7 +64,6 @@ export async function runDryTerminalLab(args) {
|
|
|
65
64
|
allowPaymentCredentials: policies?.allowPaymentCredentials ?? false,
|
|
66
65
|
allowGitHubMutation: policies?.allowGitHubMutation ?? false,
|
|
67
66
|
},
|
|
68
|
-
runId,
|
|
69
67
|
source,
|
|
70
68
|
verdict: judgment.verdict,
|
|
71
69
|
});
|
|
@@ -85,10 +83,9 @@ export async function runDryTerminalLab(args) {
|
|
|
85
83
|
const ok = resultOk({ judgment, execution, scorerFailures: [], policy });
|
|
86
84
|
await finished.recordOutcome({ ok, execution });
|
|
87
85
|
return {
|
|
88
|
-
|
|
86
|
+
...studyResultIdentity("terminal", plan.labId),
|
|
89
87
|
ok,
|
|
90
88
|
cwd,
|
|
91
|
-
labId: plan.labId,
|
|
92
89
|
actor: plan.actor,
|
|
93
90
|
product: product.name,
|
|
94
91
|
dryRun: true,
|
|
@@ -99,7 +96,7 @@ export async function runDryTerminalLab(args) {
|
|
|
99
96
|
? {}
|
|
100
97
|
: {
|
|
101
98
|
error: {
|
|
102
|
-
code: "
|
|
99
|
+
code: "HUMANISH_TERMINAL_FAILED",
|
|
103
100
|
message: observer.error?.message ?? "Observer failed for the terminal-product lab run.",
|
|
104
101
|
},
|
|
105
102
|
}),
|
|
@@ -118,9 +115,9 @@ async function prepareDryPersona(args) {
|
|
|
118
115
|
.filter((value) => value.length >= 4);
|
|
119
116
|
const evidenceMission = participantAssignment({ mission }, scrubLiterals(knownSecretValues)).mission;
|
|
120
117
|
const terminalPersona = await resolveTerminalPersona({ plan, cwd, warnings });
|
|
121
|
-
// The composed prompt = mission + persona + public-surface manifest. Only the
|
|
118
|
+
// The composed prompt = mission + persona + public-surface manifest. Only the author mission
|
|
122
119
|
// goes plaintext into evidence (it is public-safe committed lab text); the full composed prompt
|
|
123
|
-
// is recorded as a
|
|
120
|
+
// is recorded as a digest (the safety contract's mission ruling).
|
|
124
121
|
const composedPrompt = composePrompt({
|
|
125
122
|
mission,
|
|
126
123
|
personaLine: terminalPersona.personaLine,
|
|
@@ -133,7 +130,7 @@ async function prepareDryPersona(args) {
|
|
|
133
130
|
}
|
|
134
131
|
/** The declared runtime provenance as a dry-run event; nothing is observed without a sandbox. */
|
|
135
132
|
function runtimeDeclaredEvent(runtime, createdAt) {
|
|
136
|
-
const { version, model, reasoningEffort } = runtime;
|
|
133
|
+
const { version, model, modelSource, reasoningEffort } = runtime;
|
|
137
134
|
return {
|
|
138
135
|
id: "event-terminal-runtime-declared",
|
|
139
136
|
at: createdAt,
|
|
@@ -141,12 +138,13 @@ function runtimeDeclaredEvent(runtime, createdAt) {
|
|
|
141
138
|
type: "terminal-lab.runtime.declared",
|
|
142
139
|
message: redactText(JSON.stringify(declaredRuntimeProvenance({
|
|
143
140
|
...(version === undefined ? {} : { version }),
|
|
144
|
-
|
|
141
|
+
model,
|
|
142
|
+
modelSource,
|
|
145
143
|
...(reasoningEffort === undefined ? {} : { reasoningEffort }),
|
|
146
144
|
}))),
|
|
147
145
|
};
|
|
148
146
|
}
|
|
149
|
-
/** Compose the full prompt the agent would run. Bound to evidence by
|
|
147
|
+
/** Compose the full prompt the agent would run. Bound to evidence by digest only. */
|
|
150
148
|
export function composePrompt(args) {
|
|
151
149
|
return [
|
|
152
150
|
args.personaLine,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Does this environment declare a UTF-8 locale? The POSIX variables are checked in the order the C
|
|
3
|
-
* library resolves them (LC_ALL overrides LC_CTYPE overrides LANG).
|
|
3
|
+
* library resolves them (`LC_ALL` overrides `LC_CTYPE` overrides `LANG`).
|
|
4
4
|
*
|
|
5
5
|
* Windows terminals declare none of these and are handled as UTF-8: modern Windows Terminal and
|
|
6
6
|
* PowerShell render it, and the failure this guards against is a Unix locale that says C/POSIX.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
// Whether this terminal can render the characters we write to it.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// A participant found this (labs/tui-self-study.yaml): a computer-use participant sitting
|
|
4
4
|
// at a stock desktop ran `humanish` and read back `humanish ��� run realistic synthetic personas`.
|
|
5
5
|
// The em dash is three bytes of UTF-8, and a terminal whose locale is not UTF-8 renders each byte
|
|
6
6
|
// as a replacement glyph. Every ASCII character on the same screen was fine, which is exactly the
|
|
7
7
|
// signature.
|
|
8
8
|
//
|
|
9
|
-
// The
|
|
9
|
+
// The fix is not "stop using em dashes". It is to ask what the terminal can render and mean
|
|
10
10
|
// it. A surface that emits characters its own terminal cannot decode is not being expressive, it is
|
|
11
11
|
// producing garbage that reads as a bug in the tool.
|
|
12
12
|
const UTF8 = /utf-?8/i;
|
|
13
13
|
/**
|
|
14
14
|
* Does this environment declare a UTF-8 locale? The POSIX variables are checked in the order the C
|
|
15
|
-
* library resolves them (LC_ALL overrides LC_CTYPE overrides LANG).
|
|
15
|
+
* library resolves them (`LC_ALL` overrides `LC_CTYPE` overrides `LANG`).
|
|
16
16
|
*
|
|
17
17
|
* Windows terminals declare none of these and are handled as UTF-8: modern Windows Terminal and
|
|
18
18
|
* PowerShell render it, and the failure this guards against is a Unix locale that says C/POSIX.
|
|
@@ -23,7 +23,7 @@ export function terminalRendersUnicode(env = process.env) {
|
|
|
23
23
|
const declared = env.LC_ALL ?? env.LC_CTYPE ?? env.LANG;
|
|
24
24
|
if (declared === undefined || declared.trim().length === 0) {
|
|
25
25
|
// Nothing declared at all. A bare login shell on a stock image lands here, and that is the
|
|
26
|
-
// case the participant hit
|
|
26
|
+
// case the participant hit. Assume it cannot, because the failure is silent and ugly while
|
|
27
27
|
// the fallback is merely plainer.
|
|
28
28
|
return false;
|
|
29
29
|
}
|
|
@@ -3,10 +3,10 @@ import type { LabScenarioCaps } from "../../lab/types.js";
|
|
|
3
3
|
import { type CostCategory } from "../../run/terminal-contract.js";
|
|
4
4
|
import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
|
|
5
5
|
/**
|
|
6
|
-
* Build the spend ledger from the captured session.
|
|
6
|
+
* Build the spend ledger from the captured session. The null discipline:
|
|
7
7
|
* - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
|
|
8
|
-
*
|
|
9
|
-
* provider line is `null` =
|
|
8
|
+
* carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
|
|
9
|
+
* provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
|
|
10
10
|
* - product/media/payment are `null` by default: core has no signal for those categories; an
|
|
11
11
|
* adapter may provide one through the shipped costProbe seam.
|
|
12
12
|
* `injectedLines` lets a test or adapter supply known spend for a category,
|
|
@@ -14,7 +14,7 @@ import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
|
|
|
14
14
|
*/
|
|
15
15
|
export declare function buildCostLedger(args: {
|
|
16
16
|
tokenCostUsd?: number;
|
|
17
|
-
/** Measured token counts, when the run produced them but no rate could price them
|
|
17
|
+
/** Measured token counts, when the run produced them but no rate could price them. */
|
|
18
18
|
tokenUsage?: ActorTokenUsage;
|
|
19
19
|
injectedLines?: Partial<Record<CostCategory, CostLine>>;
|
|
20
20
|
}): TerminalCostLedger;
|
|
@@ -31,13 +31,13 @@ export declare function noSpendNotEstablished(maxUsd: number): string;
|
|
|
31
31
|
* an all-null ledger for a proven $0.
|
|
32
32
|
*/
|
|
33
33
|
export declare function describeMeasuredSpend(ledger: TerminalCostLedger, tokenUsage?: ActorTokenUsage): string;
|
|
34
|
-
/** Derive the no-spend proof from the ledger. It
|
|
35
|
-
* explicitly lists the unmeasured (null) lines it cannot vouch for
|
|
34
|
+
/** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
|
|
35
|
+
* explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
|
|
36
36
|
export declare function buildNoSpendProof(ledger: TerminalCostLedger, maxUsd: number | null, tokenUsage?: ActorTokenUsage): NoSpendProof;
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Fail-closed caps enforcement. Returns a structured violation when a known
|
|
39
39
|
* (measured) spend line exceeds maxUsd, or a known billable-job count exceeds maxJobs. Unknowns
|
|
40
|
-
* (`null`)
|
|
40
|
+
* (`null`) never trip the cap (we cannot claim a violation we did not measure), and they also never
|
|
41
41
|
* grant a green pass: the no-spend proof reports them as unmeasured. maxMinutes is wall-clock and is
|
|
42
42
|
* enforced separately (runWithWallClock); it is not a ledger-derived cap.
|
|
43
43
|
*/
|
|
@@ -2,10 +2,10 @@ import { describeTokenUsage } from "./token-usage.js";
|
|
|
2
2
|
import { round6 } from "../../run/pricing.js";
|
|
3
3
|
import { COST_CATEGORIES } from "../../run/terminal-contract.js";
|
|
4
4
|
/**
|
|
5
|
-
* Build the spend ledger from the captured session.
|
|
5
|
+
* Build the spend ledger from the captured session. The null discipline:
|
|
6
6
|
* - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
|
|
7
|
-
*
|
|
8
|
-
* provider line is `null` =
|
|
7
|
+
* carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
|
|
8
|
+
* provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
|
|
9
9
|
* - product/media/payment are `null` by default: core has no signal for those categories; an
|
|
10
10
|
* adapter may provide one through the shipped costProbe seam.
|
|
11
11
|
* `injectedLines` lets a test or adapter supply known spend for a category,
|
|
@@ -22,24 +22,24 @@ export function buildCostLedger(args) {
|
|
|
22
22
|
? {
|
|
23
23
|
// Tokens counted, no rate to price them. This stays `usd: null` because a guessed
|
|
24
24
|
// dollar figure would be worse than none, but the note carries the measured fact so a
|
|
25
|
-
// reader never mistakes "no charge recorded" for "nothing was consumed"
|
|
25
|
+
// reader never mistakes "no charge recorded" for "nothing was consumed".
|
|
26
26
|
usd: null,
|
|
27
27
|
source: "unpriced-token-usage",
|
|
28
|
-
note: `Provider spend
|
|
29
|
-
"but the terminal participant records the model as `codex` and
|
|
30
|
-
"
|
|
31
|
-
"
|
|
28
|
+
note: `Provider spend unpriced: the run consumed ${describeTokenUsage(args.tokenUsage)}, ` +
|
|
29
|
+
"but the terminal participant records the model as `codex` and humanish has no rate " +
|
|
30
|
+
"for it, so no dollar figure is given. The token count is measured; the price is " +
|
|
31
|
+
"not known. Recorded as null, never guessed as 0.",
|
|
32
32
|
}
|
|
33
33
|
: {
|
|
34
34
|
usd: null,
|
|
35
35
|
source: "unmeasured",
|
|
36
|
-
note: "Provider spend
|
|
36
|
+
note: "Provider spend not measured: the actor trace carried no tokenUsage.costUsd in this run, so it is recorded as null and not guessed as 0.",
|
|
37
37
|
};
|
|
38
38
|
const unmeasured = (category) => ({
|
|
39
39
|
usd: null,
|
|
40
40
|
count: null,
|
|
41
41
|
source: "unmeasured",
|
|
42
|
-
note: `${category} spend
|
|
42
|
+
note: `${category} spend not measured: humanish has no ${category} spend signal for this run, and an adapter may supply one through costProbe. Recorded as null, never guessed as 0.`,
|
|
43
43
|
});
|
|
44
44
|
const lines = {
|
|
45
45
|
product: args.injectedLines?.product ?? unmeasured("product"),
|
|
@@ -47,7 +47,7 @@ export function buildCostLedger(args) {
|
|
|
47
47
|
payment: args.injectedLines?.payment ?? unmeasured("payment"),
|
|
48
48
|
provider: args.injectedLines?.provider ?? providerLine,
|
|
49
49
|
};
|
|
50
|
-
// knownTotalUsd sums
|
|
50
|
+
// knownTotalUsd sums only the non-null lines. A null line contributes nothing and is never
|
|
51
51
|
// coerced to 0 (that would let an unmeasured category masquerade as a measured zero).
|
|
52
52
|
let knownTotalUsd = 0;
|
|
53
53
|
let fullyMeasured = true;
|
|
@@ -98,8 +98,8 @@ export function describeMeasuredSpend(ledger, tokenUsage) {
|
|
|
98
98
|
.filter((part) => part.length > 0)
|
|
99
99
|
.join(" ");
|
|
100
100
|
}
|
|
101
|
-
/** Derive the no-spend proof from the ledger. It
|
|
102
|
-
* explicitly lists the unmeasured (null) lines it cannot vouch for
|
|
101
|
+
/** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
|
|
102
|
+
* explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
|
|
103
103
|
export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
|
|
104
104
|
const knownZeroLines = [];
|
|
105
105
|
const knownNonZeroLines = [];
|
|
@@ -113,16 +113,16 @@ export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
|
|
|
113
113
|
else
|
|
114
114
|
knownNonZeroLines.push(category);
|
|
115
115
|
}
|
|
116
|
-
// satisfied only when every
|
|
117
|
-
// known line must be exactly 0). Unmeasured lines
|
|
118
|
-
// separately as the proof's
|
|
116
|
+
// satisfied only when every known line is within the cap (for a no-spend run, maxUsd 0 => every
|
|
117
|
+
// known line must be exactly 0). Unmeasured lines never make it satisfied; they are reported
|
|
118
|
+
// separately as the proof's blind spot.
|
|
119
119
|
const cap = maxUsd ?? 0;
|
|
120
120
|
const satisfied = knownNonZeroLines.length === 0 && ledger.knownTotalUsd <= cap;
|
|
121
121
|
const verdict = !satisfied
|
|
122
|
-
? `No-spend proof
|
|
122
|
+
? `No-spend proof not satisfied for maxUsd=${cap}: known spend total ${ledger.knownTotalUsd} USD${knownNonZeroLines.length > 0 ? ` (non-zero: ${knownNonZeroLines.join(", ")})` : ""}.`
|
|
123
123
|
: noSpendLineMeasured({ knownZeroLines, knownNonZeroLines })
|
|
124
124
|
? noSpendNotEstablished(cap)
|
|
125
|
-
: `No-spend proof
|
|
125
|
+
: `No-spend proof satisfied for maxUsd=${cap} on the measured lines (known total ${ledger.knownTotalUsd} USD).`;
|
|
126
126
|
const statement = [verdict, describeMeasuredSpend(ledger, tokenUsage)]
|
|
127
127
|
.filter((part) => part.length > 0)
|
|
128
128
|
.join(" ");
|
|
@@ -138,9 +138,9 @@ export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
|
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
140
|
/**
|
|
141
|
-
*
|
|
141
|
+
* Fail-closed caps enforcement. Returns a structured violation when a known
|
|
142
142
|
* (measured) spend line exceeds maxUsd, or a known billable-job count exceeds maxJobs. Unknowns
|
|
143
|
-
* (`null`)
|
|
143
|
+
* (`null`) never trip the cap (we cannot claim a violation we did not measure), and they also never
|
|
144
144
|
* grant a green pass: the no-spend proof reports them as unmeasured. maxMinutes is wall-clock and is
|
|
145
145
|
* enforced separately (runWithWallClock); it is not a ledger-derived cap.
|
|
146
146
|
*/
|
|
@@ -149,7 +149,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
|
|
|
149
149
|
const overLines = COST_CATEGORIES.filter((c) => ledger.lines[c].usd !== null && ledger.lines[c].usd > 0);
|
|
150
150
|
return {
|
|
151
151
|
ok: false,
|
|
152
|
-
message: `
|
|
152
|
+
message: `Stopped: measured spend ${ledger.knownTotalUsd} USD passed scenario.caps.maxUsd=${caps.maxUsd}${overLines.length > 0 ? ` (non-zero lines: ${overLines.join(", ")})` : ""}. The cap stops the run; it is not a warning.`,
|
|
153
153
|
};
|
|
154
154
|
}
|
|
155
155
|
if (caps.maxJobs !== undefined) {
|
|
@@ -162,7 +162,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
|
|
|
162
162
|
if (knownJobs > caps.maxJobs) {
|
|
163
163
|
return {
|
|
164
164
|
ok: false,
|
|
165
|
-
message: `
|
|
165
|
+
message: `Stopped: ${knownJobs} measured billable jobs passed scenario.caps.maxJobs=${caps.maxJobs}.`,
|
|
166
166
|
};
|
|
167
167
|
}
|
|
168
168
|
}
|
|
@@ -2,7 +2,7 @@ import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
|
2
2
|
import type { RunBundle } from "../../run/bundle.js";
|
|
3
3
|
import type { RunScope } from "../../run/run.js";
|
|
4
4
|
import type { LiveSandboxInputs, LiveTerminalSandbox } from "./live-sandbox.js";
|
|
5
|
-
import type { RunLiveTerminalSessionArgs,
|
|
5
|
+
import type { RunLiveTerminalSessionArgs, TerminalProductLabResult } from "./types.js";
|
|
6
6
|
type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
|
|
7
7
|
ok: true;
|
|
8
8
|
}>["run"];
|
|
@@ -11,7 +11,6 @@ export interface LiveFinishInputs {
|
|
|
11
11
|
plan: RunLiveTerminalSessionArgs["plan"];
|
|
12
12
|
input: RunLiveTerminalSessionArgs["input"];
|
|
13
13
|
cwd: string;
|
|
14
|
-
hooks: TerminalProductLabHooks;
|
|
15
14
|
sanitize: (text: string) => string;
|
|
16
15
|
nowIso: () => string;
|
|
17
16
|
knownSecretValues: string[];
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { buildRunCostSummary } from "../../run/cost-summary.js";
|
|
4
4
|
import { writeContainedOutputFile } from "../../run/contained-output.js";
|
|
5
5
|
import { validatePreparedRunArtifactPaths, } from "../../run/paths.js";
|
|
6
|
-
import {
|
|
6
|
+
import { estimateAggregatedTurnCost } from "../../run/pricing.js";
|
|
7
7
|
import { normalizeLocalActorTranscript, TERMINAL_EVENTS_ARTIFACT, TERMINAL_LEDGERS_ARTIFACT, TERMINAL_TRANSCRIPT_ARTIFACT, } from "../../run/terminal-contract.js";
|
|
8
8
|
import { applyAdapterExtensionSeam } from "./adapter.js";
|
|
9
9
|
import { buildLiveTerminalProductBundle } from "./bundle.js";
|
|
@@ -22,10 +22,10 @@ function buildLiveTrace(inputs) {
|
|
|
22
22
|
// chunks before any transcript/trace/event artifact is persisted. Check both each stream and
|
|
23
23
|
// the combined event order that the transcript uses; either view can assemble a split value.
|
|
24
24
|
scrubSplitKnownValues(terminalEvents, knownSecretValues, discardedPrefixes);
|
|
25
|
-
// Build the actor trace
|
|
25
|
+
// Build the actor trace first (the cost ledger reads its tokenUsage).
|
|
26
26
|
const normalizedTranscript = normalizeLocalActorTranscript(terminalEvents.map((e) => e.chunk).join(""));
|
|
27
|
-
// Parsed from the
|
|
28
|
-
// would drop all but the last
|
|
27
|
+
// Parsed from the full stream: usage records arrive once per turn, and the tail
|
|
28
|
+
// would drop all but the last.
|
|
29
29
|
const terminalTokenUsage = parseTerminalTokenUsage(normalizedTranscript);
|
|
30
30
|
const trace = buildTerminalActorTrace({
|
|
31
31
|
persona,
|
|
@@ -39,27 +39,30 @@ function buildLiveTrace(inputs) {
|
|
|
39
39
|
terminalEvents,
|
|
40
40
|
commandLog,
|
|
41
41
|
transcriptTail: tailOf(normalizedTranscript),
|
|
42
|
+
participant: inputs.recorder.participantText.finish(),
|
|
42
43
|
runtimeAuth: runtimeEnv.mode,
|
|
43
44
|
runtime,
|
|
44
45
|
...(terminalTokenUsage === undefined ? {} : { tokenUsage: terminalTokenUsage }),
|
|
45
46
|
});
|
|
46
|
-
//
|
|
47
|
-
|
|
47
|
+
// Priced from the model the route passed to Codex. turn.completed sums a turn's requests, so the
|
|
48
|
+
// estimate uses base rates and says so.
|
|
49
|
+
trace.estimatedCost = estimateAggregatedTurnCost(trace.tokenUsage, runtime.requestedModel);
|
|
48
50
|
return { normalizedTranscript, trace };
|
|
49
51
|
}
|
|
50
52
|
async function settleLiveLedgers(inputs, trace, normalizedTranscript) {
|
|
51
|
-
const {
|
|
53
|
+
const { runtime, session } = inputs;
|
|
54
|
+
const costProbe = inputs.input.deps?.costProbe;
|
|
52
55
|
const { caps } = inputs.plan;
|
|
53
56
|
const { maxUsd } = caps;
|
|
54
57
|
const runPaths = inputs.run.paths;
|
|
55
58
|
const { recordLifecycle, lifecycle, commandLog, interventions, terminalEvents } = inputs.recorder;
|
|
56
59
|
// --- Spend ledger + no-spend proof + full caps enforcement (fail-closed). ---
|
|
57
|
-
// The cost ledger is
|
|
58
|
-
// tokenUsage.costUsd when present (else null =
|
|
59
|
-
// default (core has no signal). The costProbe hook lets tests or adapters inject
|
|
60
|
+
// The cost ledger is derived, with the null discipline: provider spend from the trace's
|
|
61
|
+
// tokenUsage.costUsd when present (else null = not measured), product/media/payment null by
|
|
62
|
+
// default (core has no signal). The costProbe hook lets tests or adapters inject known
|
|
60
63
|
// spend to exercise the fail-closed cap without a real billable run.
|
|
61
|
-
const injectedLines =
|
|
62
|
-
if (
|
|
64
|
+
const injectedLines = costProbe?.(trace.tokenUsage?.costUsd === undefined ? {} : { tokenCostUsd: trace.tokenUsage.costUsd });
|
|
65
|
+
if (costProbe)
|
|
63
66
|
await validatePreparedRunArtifactPaths(runPaths);
|
|
64
67
|
const cost = buildCostLedger({
|
|
65
68
|
...(trace.tokenUsage?.costUsd === undefined ? {} : { tokenCostUsd: trace.tokenUsage.costUsd }),
|
|
@@ -68,15 +71,15 @@ async function settleLiveLedgers(inputs, trace, normalizedTranscript) {
|
|
|
68
71
|
});
|
|
69
72
|
const noSpendProof = buildNoSpendProof(cost, maxUsd ?? null, trace.tokenUsage);
|
|
70
73
|
const proofVerdict = !noSpendProof.satisfied
|
|
71
|
-
? `No-spend proof
|
|
74
|
+
? `No-spend proof not satisfied for maxUsd=${maxUsd ?? "null"}.`
|
|
72
75
|
: noSpendLineMeasured(noSpendProof)
|
|
73
76
|
? noSpendNotEstablished(maxUsd ?? 0)
|
|
74
77
|
: `No-spend proof satisfied on the measured lines for maxUsd=${maxUsd ?? "null"}.`;
|
|
75
78
|
const measuredSpend = describeMeasuredSpend(cost, trace.tokenUsage);
|
|
76
79
|
recordLifecycle("terminal-lab.cost.measured", `Cost ledger: known total ${cost.knownTotalUsd} USD${cost.fullyMeasured ? " (fully measured)" : " (lower bound)"}.${measuredSpend.length > 0 ? ` ${measuredSpend}` : ""} ${proofVerdict}`);
|
|
77
|
-
//
|
|
78
|
-
// known job count exceeds maxJobs), the run fails closed
|
|
79
|
-
//
|
|
80
|
+
// Fail-closed caps enforcement: if a known spend line exceeds maxUsd (or a
|
|
81
|
+
// known job count exceeds maxJobs), the run fails closed with no green result. Unknowns (null)
|
|
82
|
+
// never trip the cap (we cannot claim a violation we did not measure) but never grant a pass
|
|
80
83
|
// either (the no-spend proof reports them as unmeasured). maxMinutes is already wall-clock-
|
|
81
84
|
// enforced above. A blown cap is an execution failure: the agent's own status stays the
|
|
82
85
|
// verdict, and the result's ok is false.
|
|
@@ -91,7 +94,7 @@ async function settleLiveLedgers(inputs, trace, normalizedTranscript) {
|
|
|
91
94
|
runtime,
|
|
92
95
|
lifecycle,
|
|
93
96
|
commandLog,
|
|
94
|
-
interventions, //
|
|
97
|
+
interventions, // Always present, and always empty while no assisted-input path ships.
|
|
95
98
|
cleanup: session.cleanup,
|
|
96
99
|
cost,
|
|
97
100
|
noSpendProof,
|
|
@@ -102,11 +105,11 @@ async function settleLiveLedgers(inputs, trace, normalizedTranscript) {
|
|
|
102
105
|
export async function finishLiveTerminalSession(inputs) {
|
|
103
106
|
const { normalizedTranscript, trace } = buildLiveTrace(inputs);
|
|
104
107
|
const { cost, noSpendProof, capFailure, ledgers } = await settleLiveLedgers(inputs, trace, normalizedTranscript);
|
|
105
|
-
const { plan, input, cwd,
|
|
108
|
+
const { plan, input, cwd, sanitize } = inputs;
|
|
106
109
|
const { product, caps } = plan;
|
|
107
110
|
const policies = plan.residual.policies;
|
|
108
111
|
const { runtimeEnv, persona, mission, run, source, warnings, session } = inputs;
|
|
109
|
-
const { runId,
|
|
112
|
+
const { runId, paths: runPaths } = run;
|
|
110
113
|
// One judgment, after a blown cap has overridden the session: the bundle's verdict (and so
|
|
111
114
|
// status.json's outcome) and the result's ok both read it.
|
|
112
115
|
const participant = terminalParticipantFacts(trace, session.error);
|
|
@@ -120,9 +123,8 @@ export async function finishLiveTerminalSession(inputs) {
|
|
|
120
123
|
...(desktops === undefined ? {} : { desktops }),
|
|
121
124
|
});
|
|
122
125
|
const bundle = buildLiveTerminalProductBundle({
|
|
123
|
-
|
|
126
|
+
run,
|
|
124
127
|
actorId: plan.actor,
|
|
125
|
-
createdAt,
|
|
126
128
|
labId: plan.labId,
|
|
127
129
|
...(plan.title ? { labTitle: plan.title } : {}),
|
|
128
130
|
mission: sanitize(mission),
|
|
@@ -138,7 +140,6 @@ export async function finishLiveTerminalSession(inputs) {
|
|
|
138
140
|
allowPaymentCredentials: policies?.allowPaymentCredentials ?? false,
|
|
139
141
|
allowGitHubMutation: policies?.allowGitHubMutation ?? false,
|
|
140
142
|
},
|
|
141
|
-
runId,
|
|
142
143
|
source,
|
|
143
144
|
trace,
|
|
144
145
|
ledgers,
|
|
@@ -154,7 +155,7 @@ export async function finishLiveTerminalSession(inputs) {
|
|
|
154
155
|
// through foldScorerFailures below. Adapter payloads pass the same scrub and redaction as the
|
|
155
156
|
// rest of the bundle, and the bundle verifier checks them downstream.
|
|
156
157
|
const scorer = await applyAdapterExtensionSeam({
|
|
157
|
-
|
|
158
|
+
scorer: input.scorer,
|
|
158
159
|
bundle,
|
|
159
160
|
trace,
|
|
160
161
|
ledgers,
|
|
@@ -4,7 +4,8 @@ import type { RunScope } from "../../run/run.js";
|
|
|
4
4
|
import type { buildRuntimeAuth, buildSandboxMetadata } from "./credentials.js";
|
|
5
5
|
import type { createTerminalRecorder } from "./recorder.js";
|
|
6
6
|
import { type declaredRuntimeProvenance } from "./runtime.js";
|
|
7
|
-
import { type LiveTerminalPlan, type TerminalLedgers
|
|
7
|
+
import { type LiveTerminalPlan, type TerminalLedgers } from "./types.js";
|
|
8
|
+
import type { LabDeps } from "../../lab/lab-deps.js";
|
|
8
9
|
type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
|
|
9
10
|
ok: true;
|
|
10
11
|
}>["run"];
|
|
@@ -12,7 +13,7 @@ type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
|
|
|
12
13
|
export interface LiveSandboxInputs {
|
|
13
14
|
plan: LiveTerminalPlan;
|
|
14
15
|
cwd: string;
|
|
15
|
-
|
|
16
|
+
deps: LabDeps;
|
|
16
17
|
now: () => number;
|
|
17
18
|
nowIso: () => string;
|
|
18
19
|
sanitize: (text: string) => string;
|