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,5 +1,5 @@
|
|
|
1
1
|
// Finishing a live terminal session: the actor trace from the captured stream, the spend ledger
|
|
2
|
-
// and its caps check, the evidence files, the bundle, and the
|
|
2
|
+
// and its caps check, the evidence files, the bundle, and the study result.
|
|
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";
|
|
@@ -9,7 +9,7 @@ import { applyAdapterExtensionSeam } from "./adapter.js";
|
|
|
9
9
|
import { buildLiveTerminalProductBundle } from "./bundle.js";
|
|
10
10
|
import { buildCostLedger, buildNoSpendProof, describeMeasuredSpend, evaluateCapsAgainstLedger, noSpendLineMeasured, noSpendNotEstablished, } from "./ledger.js";
|
|
11
11
|
import { foldScorerFailures, judgeExecution, judgeTerminal, OUTCOME_POLICIES, } from "../../run/judge.js";
|
|
12
|
-
import { terminalExecutionFailures,
|
|
12
|
+
import { terminalExecutionFailures, terminalStudyResult, terminalParticipantFacts, } from "./result.js";
|
|
13
13
|
import { parseTerminalTokenUsage } from "./token-usage.js";
|
|
14
14
|
import { buildTerminalActorTrace, scrubSplitKnownValues, tailOf } from "./trace.js";
|
|
15
15
|
function buildLiveTrace(inputs) {
|
|
@@ -25,7 +25,7 @@ function buildLiveTrace(inputs) {
|
|
|
25
25
|
// Build the actor trace first (the cost ledger reads its tokenUsage).
|
|
26
26
|
const normalizedTranscript = normalizeLocalActorTranscript(terminalEvents.map((e) => e.chunk).join(""));
|
|
27
27
|
// Parsed from the full stream: usage records arrive once per turn, and the tail
|
|
28
|
-
// would drop all but the last
|
|
28
|
+
// would drop all but the last.
|
|
29
29
|
const terminalTokenUsage = parseTerminalTokenUsage(normalizedTranscript);
|
|
30
30
|
const trace = buildTerminalActorTrace({
|
|
31
31
|
persona,
|
|
@@ -71,14 +71,14 @@ async function settleLiveLedgers(inputs, trace, normalizedTranscript) {
|
|
|
71
71
|
});
|
|
72
72
|
const noSpendProof = buildNoSpendProof(cost, maxUsd ?? null, trace.tokenUsage);
|
|
73
73
|
const proofVerdict = !noSpendProof.satisfied
|
|
74
|
-
? `No-spend proof
|
|
74
|
+
? `No-spend proof not satisfied for maxUsd=${maxUsd ?? "null"}.`
|
|
75
75
|
: noSpendLineMeasured(noSpendProof)
|
|
76
76
|
? noSpendNotEstablished(maxUsd ?? 0)
|
|
77
77
|
: `No-spend proof satisfied on the measured lines for maxUsd=${maxUsd ?? "null"}.`;
|
|
78
78
|
const measuredSpend = describeMeasuredSpend(cost, trace.tokenUsage);
|
|
79
79
|
recordLifecycle("terminal-lab.cost.measured", `Cost ledger: known total ${cost.knownTotalUsd} USD${cost.fullyMeasured ? " (fully measured)" : " (lower bound)"}.${measuredSpend.length > 0 ? ` ${measuredSpend}` : ""} ${proofVerdict}`);
|
|
80
80
|
// Fail-closed caps enforcement: if a known spend line exceeds maxUsd (or a
|
|
81
|
-
// known job count exceeds maxJobs), the run fails closed
|
|
81
|
+
// known job count exceeds maxJobs), the run fails closed with no green result. Unknowns (null)
|
|
82
82
|
// never trip the cap (we cannot claim a violation we did not measure) but never grant a pass
|
|
83
83
|
// either (the no-spend proof reports them as unmeasured). maxMinutes is already wall-clock-
|
|
84
84
|
// enforced above. A blown cap is an execution failure: the agent's own status stays the
|
|
@@ -125,8 +125,8 @@ export async function finishLiveTerminalSession(inputs) {
|
|
|
125
125
|
const bundle = buildLiveTerminalProductBundle({
|
|
126
126
|
run,
|
|
127
127
|
actorId: plan.actor,
|
|
128
|
-
|
|
129
|
-
...(plan.title ? {
|
|
128
|
+
studyId: plan.studyId,
|
|
129
|
+
...(plan.title ? { studyTitle: plan.title } : {}),
|
|
130
130
|
mission: sanitize(mission),
|
|
131
131
|
persona,
|
|
132
132
|
productName: product.name,
|
|
@@ -161,7 +161,7 @@ export async function finishLiveTerminalSession(inputs) {
|
|
|
161
161
|
ledgers,
|
|
162
162
|
transcript: normalizedTranscript,
|
|
163
163
|
product: product.name,
|
|
164
|
-
|
|
164
|
+
studyId: plan.studyId,
|
|
165
165
|
runId,
|
|
166
166
|
sanitize,
|
|
167
167
|
warnings,
|
|
@@ -182,9 +182,9 @@ export async function finishLiveTerminalSession(inputs) {
|
|
|
182
182
|
cleanup: session.cleanup,
|
|
183
183
|
observer,
|
|
184
184
|
}), OUTCOME_POLICIES.terminal);
|
|
185
|
-
const result =
|
|
185
|
+
const result = terminalStudyResult({
|
|
186
186
|
cwd,
|
|
187
|
-
|
|
187
|
+
studyId: plan.studyId,
|
|
188
188
|
actorId: plan.actor,
|
|
189
189
|
productName: product.name,
|
|
190
190
|
runId,
|
|
@@ -5,7 +5,7 @@ import type { buildRuntimeAuth, buildSandboxMetadata } from "./credentials.js";
|
|
|
5
5
|
import type { createTerminalRecorder } from "./recorder.js";
|
|
6
6
|
import { type declaredRuntimeProvenance } from "./runtime.js";
|
|
7
7
|
import { type LiveTerminalPlan, type TerminalLedgers } from "./types.js";
|
|
8
|
-
import type {
|
|
8
|
+
import type { StudyDeps } from "../../study/study-deps.js";
|
|
9
9
|
type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
|
|
10
10
|
ok: true;
|
|
11
11
|
}>["run"];
|
|
@@ -13,7 +13,7 @@ type StartedRun = Extract<Awaited<ReturnType<RunScope["startRun"]>>, {
|
|
|
13
13
|
export interface LiveSandboxInputs {
|
|
14
14
|
plan: LiveTerminalPlan;
|
|
15
15
|
cwd: string;
|
|
16
|
-
deps:
|
|
16
|
+
deps: StudyDeps;
|
|
17
17
|
now: () => number;
|
|
18
18
|
nowIso: () => string;
|
|
19
19
|
sanitize: (text: string) => string;
|
|
@@ -18,6 +18,7 @@ import { TERMINAL_RUNTIME_VERSION_TIMEOUT_MS, buildRuntimeExecPrefix, buildRunti
|
|
|
18
18
|
import { runWithWallClock, teardownSandbox } from "./sandbox.js";
|
|
19
19
|
import { DEFAULT_REQUEST_TIMEOUT_MS, PRODUCT_SETUP_TIMEOUT_MS, SANDBOX_WORKDIR, UPLOAD_MAX_BYTES, } from "./types.js";
|
|
20
20
|
import { terminalSandboxTimeoutMs } from "./lifetime.js";
|
|
21
|
+
import { plural } from "../../run/text.js";
|
|
21
22
|
export class LiveTerminalSandbox {
|
|
22
23
|
status = "failed";
|
|
23
24
|
completionReason = "harness_error";
|
|
@@ -56,7 +57,7 @@ export class LiveTerminalSandbox {
|
|
|
56
57
|
const { warnings } = this.inputs;
|
|
57
58
|
const { recordLifecycle } = this.inputs.recorder;
|
|
58
59
|
const { requestTimeoutMs, sandboxTimeoutMs } = this;
|
|
59
|
-
// Declared egress allowlist, or undefined for the historical unrestricted default
|
|
60
|
+
// Declared egress allowlist, or undefined for the historical unrestricted default.
|
|
60
61
|
const egressAllow = plan.egressAllow;
|
|
61
62
|
const sandboxModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
|
|
62
63
|
this.module = sandboxModule;
|
|
@@ -99,7 +100,7 @@ export class LiveTerminalSandbox {
|
|
|
99
100
|
this.sandboxId = sandboxId;
|
|
100
101
|
this.createdAtMs = now();
|
|
101
102
|
await validatePreparedRunArtifactPaths(runPaths);
|
|
102
|
-
recordLifecycle("terminal-lab.sandbox.created", `E2B shell sandbox ${sandboxId} created with
|
|
103
|
+
recordLifecycle("terminal-lab.sandbox.created", `E2B shell sandbox ${sandboxId} created with allowlisted metadata and kill-on-timeout, and with no sandbox-wide environment variables.`);
|
|
103
104
|
const sandboxResources = await observeDesktopResources(sandbox);
|
|
104
105
|
this.resources = sandboxResources;
|
|
105
106
|
if ("reason" in sandboxResources) {
|
|
@@ -108,8 +109,8 @@ export class LiveTerminalSandbox {
|
|
|
108
109
|
// The allowlist is evidence: a reader of the ledger can see exactly what the participant was
|
|
109
110
|
// able to reach, without the ledger carrying any secret.
|
|
110
111
|
recordLifecycle("terminal-lab.egress.policy", egressAllow === undefined
|
|
111
|
-
? "Egress
|
|
112
|
-
: `Egress routing allowlist: ${egressAllow.length
|
|
112
|
+
? "Egress is unrestricted (no execution.egressAllow declared)."
|
|
113
|
+
: `Egress routing allowlist: ${plural(egressAllow.length, "declared host")}: ${egressAllow.join(", ")}; deny-all fallback. Domain routing is not strict destination isolation on shared infrastructure.`);
|
|
113
114
|
recordLifecycle("terminal-lab.runtime-auth", runtimeEnv.mode === "openai-egress"
|
|
114
115
|
? "Runtime auth openai-egress: raw key remains outside the sandbox in the api.openai.com HTTPS Authorization transform; Codex receives an inert CODEX_API_KEY placeholder and the default OpenAI endpoint. Every sandbox process, including bootstrap/setup, can spend via this proxy; no added routing restriction or provider spending limit."
|
|
115
116
|
: `Runtime auth openai-env: raw key from ${runtimeEnv.keyName} is passed command-scoped to Codex and inherited by its child processes.`);
|
|
@@ -131,7 +132,7 @@ export class LiveTerminalSandbox {
|
|
|
131
132
|
const { requestTimeoutMs } = this;
|
|
132
133
|
// --- Runtime bootstrap: no runtime env; openai-egress proxy capability is already available. ---
|
|
133
134
|
// The stock desktop needs Node/npm on `PATH` before npx can run Codex. Reuse a working
|
|
134
|
-
// installation or install the pinned official binary after checksum verification
|
|
135
|
+
// installation or install the pinned official binary after checksum verification.
|
|
135
136
|
// No raw runtime key touches this step; the egress proxy, when selected, is already available.
|
|
136
137
|
const bootstrapStartedAt = now();
|
|
137
138
|
let bootstrapError;
|
|
@@ -149,7 +150,7 @@ export class LiveTerminalSandbox {
|
|
|
149
150
|
}
|
|
150
151
|
const bootstrapDurationMs = Math.max(0, now() - bootstrapStartedAt);
|
|
151
152
|
recordLifecycle("terminal-lab.runtime.bootstrapped", bootstrapError
|
|
152
|
-
? `Runtime bootstrap
|
|
153
|
+
? `Runtime bootstrap failed after ${bootstrapDurationMs}ms: ${bootstrapError}. codex exec runs through npx and needs Node and npm, so the participant stops here instead of starting codex with no runtime.`
|
|
153
154
|
: `Runtime bootstrap ensured Node/npm present in ${bootstrapDurationMs}ms (codex exec runs via npx).`);
|
|
154
155
|
if (bootstrapError) {
|
|
155
156
|
// Fail closed as a structured route status (never a raw throw): no codex exec is attempted
|
|
@@ -207,7 +208,7 @@ export class LiveTerminalSandbox {
|
|
|
207
208
|
// Same channel and same guarantees as the runtime bootstrap above: no runtime key touches it,
|
|
208
209
|
// and a failure fails the run closed rather than handing the agent a half-built world. It
|
|
209
210
|
// exists so a study can put the participant in a prepared project: asking an agent what
|
|
210
|
-
// studies a project contains, in an empty directory, measures the
|
|
211
|
+
// studies a project contains, in an empty directory, measures the study and not the product
|
|
211
212
|
// (learned the hard way on the desktop route, labs/tui-self-study.yaml).
|
|
212
213
|
const install = plan.product.install;
|
|
213
214
|
if (install === undefined)
|
|
@@ -259,7 +260,7 @@ export class LiveTerminalSandbox {
|
|
|
259
260
|
const setup = await this.sandbox.commands.run(`${uploadAssignment}cd ${SANDBOX_WORKDIR} && ${install}`, {
|
|
260
261
|
// The install step may run the product itself (release:dogfood's does: `humanish init
|
|
261
262
|
// --yes`); on the 0.67.0 dogfood that one command arrived unmarked while the participant's
|
|
262
|
-
// nine others carried the marker
|
|
263
|
+
// nine others carried the marker.
|
|
263
264
|
envs: { HUMANISH_STUDY_PARTICIPANT: "1" },
|
|
264
265
|
requestTimeoutMs,
|
|
265
266
|
timeoutMs: PRODUCT_SETUP_TIMEOUT_MS,
|
|
@@ -272,7 +273,7 @@ export class LiveTerminalSandbox {
|
|
|
272
273
|
setupError = toErrorMessage(error);
|
|
273
274
|
}
|
|
274
275
|
recordLifecycle("terminal-lab.product.prepared", setupError
|
|
275
|
-
? `Product setup
|
|
276
|
+
? `Product setup failed after ${Math.max(0, now() - setupStartedAt)}ms: ${sanitize(setupError)}`
|
|
276
277
|
: `Product setup completed in ${Math.max(0, now() - setupStartedAt)}ms (no runtime env; declared egress auth may already be available).`);
|
|
277
278
|
if (setupError) {
|
|
278
279
|
this.status = "failed";
|
|
@@ -292,8 +293,8 @@ export class LiveTerminalSandbox {
|
|
|
292
293
|
const { requestTimeoutMs, wallClockMs } = this;
|
|
293
294
|
// --- The keyed run: `codex exec --json` non-interactively (stdin disabled). ---
|
|
294
295
|
// openai-env passes the real key here; openai-egress passes an inert placeholder. stdin is
|
|
295
|
-
// never wired
|
|
296
|
-
// wall-clock is bounded by maxMinutes
|
|
296
|
+
// never wired: commands.run takes no stdin channel. The command's
|
|
297
|
+
// wall-clock is bounded by maxMinutes: commands.run timeoutMs +
|
|
297
298
|
// an injected-clock guard so a mock/real run that exceeds it is killed and fails closed.
|
|
298
299
|
const codexCommand = buildCodexExecCommand({
|
|
299
300
|
workdir: SANDBOX_WORKDIR,
|
|
@@ -312,8 +313,7 @@ export class LiveTerminalSandbox {
|
|
|
312
313
|
const result = await runWithWallClock(this.sandbox.commands.run(codexCommand, {
|
|
313
314
|
// The selected command env (raw key or inert placeholder). The participant
|
|
314
315
|
// marker rides the same command: humanish telemetry from inside a study reads as a new
|
|
315
|
-
// adopter otherwise.
|
|
316
|
-
// participant's twelve commands arrived unmarked.
|
|
316
|
+
// adopter otherwise.
|
|
317
317
|
envs: { ...runtimeEnv.envs, HUMANISH_STUDY_PARTICIPANT: "1" },
|
|
318
318
|
requestTimeoutMs,
|
|
319
319
|
timeoutMs: wallClockMs,
|
|
@@ -404,7 +404,7 @@ export class LiveTerminalSandbox {
|
|
|
404
404
|
const { now, sanitize, warnings } = this.inputs;
|
|
405
405
|
const { recordLifecycle } = this.inputs.recorder;
|
|
406
406
|
const { requestTimeoutMs } = this;
|
|
407
|
-
// ---
|
|
407
|
+
// --- Proven cleanup, by exact id, never Sandbox.list. ---
|
|
408
408
|
this.cleanup = await teardownSandbox({
|
|
409
409
|
allocation: this.allocation,
|
|
410
410
|
sandboxModule: this.module,
|
|
@@ -439,7 +439,7 @@ function buildCodexExecCommand(args) {
|
|
|
439
439
|
// the prompt rides as the final positional arg, shell-quoted. codex exec --json runs once and
|
|
440
440
|
// exits (no interactive loop). --skip-git-repo-check: the workdir is a fresh scratch dir.
|
|
441
441
|
// Pinned via npx (never an ambient/preinstalled `codex` binary, which the stock @e2b/desktop
|
|
442
|
-
// image does not ship
|
|
442
|
+
// image does not ship); npm_config_update_notifier=false silences npx's own
|
|
443
443
|
// update check so it cannot leak into the captured stdout the scorer/redactor parse.
|
|
444
444
|
const quotedPrompt = shellQuote(args.prompt);
|
|
445
445
|
// --dangerously-bypass-approvals-and-sandbox: codex's own inner sandbox is
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { normalizeLocalActorTranscript } from "../../run/terminal-contract.js";
|
|
2
2
|
import { MESSAGE_CHARS, PENDING_LINE_CHARS, TEXT_ITEMS_BYTES, TEXT_ITEMS_MAX } from "./types.js";
|
|
3
|
+
import { plural } from "../../run/text.js";
|
|
3
4
|
const itemEvents = new Set(["item.started", "item.updated", "item.completed"]);
|
|
4
5
|
const nonempty = (value) => typeof value === "string" && value.trim().length > 0;
|
|
5
6
|
const object = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
@@ -148,7 +149,7 @@ export function createTerminalParticipantReader(sanitize) {
|
|
|
148
149
|
if (droppedLines > 0)
|
|
149
150
|
notices.push([
|
|
150
151
|
"agent output lines skipped",
|
|
151
|
-
`Skipped ${droppedLines
|
|
152
|
+
`Skipped ${plural(droppedLines, "stdout line")} that ran past ${PENDING_LINE_CHARS} characters without a newline. Items on those lines are not in this trace or its counts.`,
|
|
152
153
|
]);
|
|
153
154
|
notices.forEach(([title, text], index) => items.push({
|
|
154
155
|
id: `notice-${String(index + 1).padStart(3, "0")}`,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
2
|
-
import { type ResolvedPersona } from "../../
|
|
3
|
-
import type { TerminalPlan } from "../../
|
|
2
|
+
import { type ResolvedPersona } from "../../study/persona.js";
|
|
3
|
+
import type { TerminalPlan } from "../../study/plan-types.js";
|
|
4
4
|
/** A terminal run's persona, resolved against the project's committed persona files. */
|
|
5
5
|
export interface TerminalPersona {
|
|
6
6
|
personaId: string;
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
// record come from one place. Each path keeps its own prompt and its own set of scrubbed secrets.
|
|
4
4
|
import { realpath } from "node:fs/promises";
|
|
5
5
|
import path from "node:path";
|
|
6
|
-
import { personaBrief, personaToDirectives, renderPersonaPromptSection, } from "../../
|
|
7
|
-
import { resolveCommittedPersona } from "../../
|
|
6
|
+
import { personaBrief, personaToDirectives, renderPersonaPromptSection, } from "../../study/persona.js";
|
|
7
|
+
import { resolveCommittedPersona } from "../../study/persona-resolve.js";
|
|
8
8
|
import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
|
|
9
9
|
/** Resolves the plan's persona; the resolver's warnings go into `warnings`. */
|
|
10
10
|
export async function resolveTerminalPersona(args) {
|
|
11
11
|
const personaId = args.plan.personaId ?? "autonomous-terminal-agent";
|
|
12
12
|
const physicalCwd = await realpath(args.cwd);
|
|
13
|
-
// Resolve the committed persona so its traits actually shape the agent prompt
|
|
13
|
+
// Resolve the committed persona so its traits actually shape the agent prompt; fail-safe to
|
|
14
14
|
// the bare persona id (no traits applied) when no persona file is committed.
|
|
15
15
|
const projectRoot = await prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
|
|
16
16
|
const { persona, warnings } = await resolveCommittedPersona(projectRoot, personaId);
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type { RoutePlanResult, RouteRefusal, TerminalPlan } from "../../
|
|
2
|
-
import type {
|
|
3
|
-
import { type
|
|
4
|
-
/** The error a terminal
|
|
5
|
-
export interface TerminalRefusal extends RouteRefusal<"terminal", NonNullable<
|
|
1
|
+
import type { RoutePlanResult, RouteRefusal, TerminalPlan } from "../../study/plan-types.js";
|
|
2
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
3
|
+
import { type TerminalProductStudyResult } from "./types.js";
|
|
4
|
+
/** The error a terminal study returns before a run starts. `actor` names the registered actor. */
|
|
5
|
+
export interface TerminalRefusal extends RouteRefusal<"terminal", NonNullable<TerminalProductStudyResult["error"]>["code"]> {
|
|
6
6
|
readonly actor?: string;
|
|
7
7
|
}
|
|
8
8
|
export type TerminalPlanResult = RoutePlanResult<TerminalPlan, TerminalRefusal>;
|
|
9
9
|
/**
|
|
10
|
-
* Plan a terminal-product
|
|
10
|
+
* Plan a terminal-product study. It is called for any config handed to the terminal runner, not
|
|
11
11
|
* only one routeOf sends here, so a config for another route gets this route's refusal.
|
|
12
12
|
*/
|
|
13
|
-
export declare function
|
|
13
|
+
export declare function planTerminalStudy(config: StudyConfig, input: {
|
|
14
14
|
readonly dryRun: boolean;
|
|
15
15
|
/** A test's costProbe can measure spend lines, so a positive maxUsd can trip. */
|
|
16
16
|
readonly hasCostProbe?: boolean;
|
|
@@ -5,48 +5,48 @@ import { DEFAULT_OPENAI_CU_MODEL } from "../../actors/computer-use/openai-provid
|
|
|
5
5
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
6
6
|
import { isReasoningEffort } from "../../actors/reasoning-effort.js";
|
|
7
7
|
import { actorRegistry, isTerminalActorDescriptor } from "../../actors/registry.js";
|
|
8
|
-
import { isNonEmpty, planBase } from "../../
|
|
9
|
-
import { desktopMediaValidationReason, taskProtocolValidationReason, } from "../../
|
|
8
|
+
import { isNonEmpty, planBase } from "../../study/plan-base.js";
|
|
9
|
+
import { desktopMediaValidationReason, taskProtocolValidationReason, } from "../../study/validation.js";
|
|
10
10
|
import { MAX_SANDBOX_MS } from "../../substrates/e2b/lifetime.js";
|
|
11
11
|
import { NODE_BOOTSTRAP_TIMEOUT_MS } from "../../subject/node-bootstrap.js";
|
|
12
12
|
import { terminalSandboxTimeoutMs } from "./lifetime.js";
|
|
13
13
|
import { isExactRuntimeVersion, TERMINAL_RUNTIME_VERSION_TIMEOUT_MS } from "./runtime.js";
|
|
14
14
|
import { PRODUCT_SETUP_TIMEOUT_MS, TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS, } from "./types.js";
|
|
15
15
|
/**
|
|
16
|
-
* Plan a terminal-product
|
|
16
|
+
* Plan a terminal-product study. It is called for any config handed to the terminal runner, not
|
|
17
17
|
* only one routeOf sends here, so a config for another route gets this route's refusal.
|
|
18
18
|
*/
|
|
19
|
-
export function
|
|
19
|
+
export function planTerminalStudy(config, input) {
|
|
20
20
|
const refuse = (code, message, actor) => ({
|
|
21
21
|
ok: false,
|
|
22
22
|
refusal: { route: "terminal", code, message, ...(actor === undefined ? {} : { actor }) },
|
|
23
23
|
});
|
|
24
24
|
if (String(config.comms?.email?.kind) === "real")
|
|
25
|
-
return refuse("
|
|
25
|
+
return refuse("HUMANISH_TERMINAL_SUBJECT_INVALID", "Real email receiving is unsupported on the terminal route. Use a supported hosted computer-use browser study.");
|
|
26
26
|
const mediaReason = desktopMediaValidationReason(config);
|
|
27
27
|
if (mediaReason)
|
|
28
|
-
return refuse("
|
|
28
|
+
return refuse("HUMANISH_TERMINAL_SUBJECT_INVALID", mediaReason);
|
|
29
29
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
30
30
|
if (!analysis.ok)
|
|
31
|
-
return refuse("
|
|
31
|
+
return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
|
|
32
32
|
const tasksReason = taskProtocolValidationReason(config, false);
|
|
33
33
|
if (tasksReason)
|
|
34
|
-
return refuse("
|
|
34
|
+
return refuse("HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason);
|
|
35
35
|
const actorType = config.actors[0]?.type ?? "";
|
|
36
36
|
const descriptor = actorRegistry[actorType];
|
|
37
37
|
if (!descriptor || !isTerminalActorDescriptor(descriptor))
|
|
38
|
-
return refuse("
|
|
38
|
+
return refuse("HUMANISH_TERMINAL_ACTOR_UNSUPPORTED", `actors[0].type "${actorType}" is not a registered terminal actor.`);
|
|
39
39
|
const runtimeVersion = config.execution?.runtime?.version;
|
|
40
40
|
const actor = config.actors[0];
|
|
41
41
|
if ((config.execution?.runtime !== undefined && !isExactRuntimeVersion(runtimeVersion)) ||
|
|
42
42
|
(actor?.model !== undefined &&
|
|
43
43
|
(typeof actor.model !== "string" || actor.model.trim().length === 0)) ||
|
|
44
44
|
(actor?.reasoningEffort !== undefined && !isReasoningEffort(actor.reasoningEffort)))
|
|
45
|
-
return refuse("
|
|
45
|
+
return refuse("HUMANISH_TERMINAL_FAILED", "Terminal runtime settings require an exact Codex version, a nonempty model when declared, and a supported reasoning-effort value.");
|
|
46
46
|
const product = config.subject.product;
|
|
47
47
|
const surfaces = product?.publicSurfaces ?? [];
|
|
48
48
|
if (!product || !product.name || !isNonEmpty(surfaces))
|
|
49
|
-
return refuse("
|
|
49
|
+
return refuse("HUMANISH_TERMINAL_SUBJECT_INVALID", "terminal-product subjects require `subject.product` with a name and at least one public surface URL.", descriptor.id);
|
|
50
50
|
const base = planBase(config, {
|
|
51
51
|
dryRun: input.dryRun,
|
|
52
52
|
analysis,
|
|
@@ -82,19 +82,19 @@ export function planTerminalLab(config, input) {
|
|
|
82
82
|
// that declares that placement may run live.
|
|
83
83
|
const keyPlacement = descriptor.capabilities.keyPlacement;
|
|
84
84
|
if (keyPlacement !== "in-sandbox-command-scoped")
|
|
85
|
-
return refuse("
|
|
85
|
+
return refuse("HUMANISH_TERMINAL_KEYPLACEMENT_INVALID", `Terminal actor "${descriptor.id}" must declare keyPlacement "in-sandbox-command-scoped" for a live run (got "${String(keyPlacement)}"). The engine requires this registered default before applying the declared runtime-auth mode.`, descriptor.id);
|
|
86
86
|
// A live run grants the in-sandbox agent provider access, so a fail-closed cap must be in force.
|
|
87
87
|
const maxUsd = caps?.maxUsd;
|
|
88
88
|
const maxMinutes = caps?.maxMinutes;
|
|
89
89
|
if (caps === undefined || maxUsd === undefined || maxMinutes === undefined || maxMinutes <= 0)
|
|
90
|
-
return refuse("
|
|
90
|
+
return refuse("HUMANISH_TERMINAL_CAPS_MISSING", "A live terminal-product run gives the agent in the sandbox access to a model provider, so it needs a cap: set scenario.caps with maxUsd (0 means no spend) and a positive maxMinutes (the time limit for the codex command). The key is used only while the cap is in force.", descriptor.id);
|
|
91
91
|
// maxUsd is checked against the cost ledger after the session, and only known lines can trip it.
|
|
92
92
|
// The ledger's provider line takes only provider-reported cost, which Codex does not report (the
|
|
93
93
|
// token estimate in run.json is not a measurement), and core has no product, media or payment
|
|
94
94
|
// signal, so without a costProbe every line is null and a positive maxUsd could never trip. That
|
|
95
95
|
// cap would promise a bound nothing enforces, so it is refused; maxMinutes bounds a live run.
|
|
96
96
|
if (maxUsd > 0 && input.hasCostProbe !== true)
|
|
97
|
-
return refuse("
|
|
97
|
+
return refuse("HUMANISH_TERMINAL_UNPRICED_CAP", `scenario.caps.maxUsd=${maxUsd} cannot be enforced: Codex reports no provider cost for the participant (its token cost is only estimated after the run) and no product, media or payment spend is measured, so a positive dollar cap can never trip. Set scenario.caps.maxUsd to 0 and bound the run with scenario.caps.maxMinutes, the codex command's wall-clock kill. No sandbox was created and the runtime key was not used.`, descriptor.id);
|
|
98
98
|
// The sandbox's timeout covers the steps before the codex command, maxMinutes and the teardown
|
|
99
99
|
// buffer, and E2B refuses a sandbox over an hour. Refuse here, with the arithmetic, rather than
|
|
100
100
|
// after the plan prints, from a provider 400 that names neither knob.
|
|
@@ -102,7 +102,7 @@ export function planTerminalLab(config, input) {
|
|
|
102
102
|
const sandboxTimeoutMs = terminalSandboxTimeoutMs({ maxMinutes, productInstall });
|
|
103
103
|
if (sandboxTimeoutMs > MAX_SANDBOX_MS) {
|
|
104
104
|
const headroomMinutes = (sandboxTimeoutMs - maxMinutes * 60_000) / 60_000;
|
|
105
|
-
return refuse("
|
|
105
|
+
return refuse("HUMANISH_TERMINAL_CAPS_INVALID", `scenario.caps.maxMinutes ${maxMinutes} derives a ${sandboxTimeoutMs / 60_000}m sandbox deadline, and a sandbox may not live longer than ${MAX_SANDBOX_MS / 60_000}m. The deadline is maxMinutes plus ${headroomMinutes}m: the Node bootstrap (${NODE_BOOTSTRAP_TIMEOUT_MS / 60_000}m), the runtime version check (${TERMINAL_RUNTIME_VERSION_TIMEOUT_MS / 60_000}m)${productInstall ? `, the product setup (${PRODUCT_SETUP_TIMEOUT_MS / 60_000}m)` : ""} and the teardown buffer (${TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS / 60_000}m). Lower scenario.caps.maxMinutes to at most ${MAX_SANDBOX_MS / 60_000 - headroomMinutes}. No sandbox was created and the runtime key was not used.`, descriptor.id);
|
|
106
106
|
}
|
|
107
107
|
return {
|
|
108
108
|
ok: true,
|
|
@@ -32,13 +32,13 @@ export function createTerminalRecorder(args) {
|
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
34
34
|
transcriptBytes += Buffer.byteLength(raw, "utf8");
|
|
35
|
-
// Scrub, then redact, at the source
|
|
35
|
+
// Scrub, then redact, at the source. Only the participant reader below
|
|
36
36
|
// sees the raw bytes, and it stores none of them.
|
|
37
37
|
terminalEvents.push({ at: nowIso(), stream, chunk: sanitize(raw) });
|
|
38
38
|
if (stream === "stdout")
|
|
39
39
|
participantText.append(raw);
|
|
40
40
|
};
|
|
41
|
-
// E2B can stream every byte through callbacks and return the same complete output
|
|
41
|
+
// E2B can stream every byte through callbacks and return the same complete output.
|
|
42
42
|
// Track transport delivery, independently per stream, rather than deduplicating participant
|
|
43
43
|
// lines or equal usage records. Hash raw callback bytes before redaction/truncation so the
|
|
44
44
|
// comparison cannot confuse two values that redact identically or lose capped-away delivery.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ObserverResult } from "../../observer/render.js";
|
|
2
2
|
import type { ActorCompletionReason, ActorStatus, ActorTrace } from "../../actors/contract.js";
|
|
3
3
|
import { type ExecutionFailure, type ExecutionOutcome, type Judgment, type ParticipantFacts } from "../../run/judge.js";
|
|
4
|
-
import { type NoSpendProof, type TerminalCostLedger, type TerminalLedgers, type
|
|
4
|
+
import { type NoSpendProof, type TerminalCostLedger, type TerminalLedgers, type TerminalProductStudyResult } from "./types.js";
|
|
5
5
|
/**
|
|
6
6
|
* What judge.ts reads from a finished terminal session, after a blown cap has overridden it. It has
|
|
7
7
|
* no engagement or blocker rule: the agent's nonce-verified marker is its declared outcome.
|
|
@@ -20,10 +20,10 @@ export declare function terminalExecutionFailures(args: {
|
|
|
20
20
|
cleanup: TerminalLedgers["cleanup"];
|
|
21
21
|
observer: Pick<ObserverResult, "ok" | "error">;
|
|
22
22
|
}): ExecutionFailure[];
|
|
23
|
-
/** The terminal-product
|
|
24
|
-
export declare function
|
|
23
|
+
/** The terminal-product study result for a live run, from its session, cleanup and cost ledger. */
|
|
24
|
+
export declare function terminalStudyResult(args: {
|
|
25
25
|
cwd: string;
|
|
26
|
-
|
|
26
|
+
studyId: string;
|
|
27
27
|
actorId: string;
|
|
28
28
|
productName: string;
|
|
29
29
|
runId: string;
|
|
@@ -44,4 +44,4 @@ export declare function terminalLabResult(args: {
|
|
|
44
44
|
execution: ExecutionOutcome;
|
|
45
45
|
observer: ObserverResult;
|
|
46
46
|
warnings: string[];
|
|
47
|
-
}):
|
|
47
|
+
}): TerminalProductStudyResult;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { OUTCOME_POLICIES, participantHarnessFailed, resultOk, } from "../../run/judge.js";
|
|
2
|
-
import {
|
|
2
|
+
import {} from "./types.js";
|
|
3
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
3
4
|
/**
|
|
4
5
|
* What judge.ts reads from a finished terminal session, after a blown cap has overridden it. It has
|
|
5
6
|
* no engagement or blocker rule: the agent's nonce-verified marker is its declared outcome.
|
|
@@ -38,21 +39,21 @@ export function terminalExecutionFailures(args) {
|
|
|
38
39
|
: [
|
|
39
40
|
{
|
|
40
41
|
kind: "evidence",
|
|
41
|
-
message: observer.error?.message ?? "Observer failed for the terminal-product
|
|
42
|
+
message: observer.error?.message ?? "Observer failed for the terminal-product run.",
|
|
42
43
|
},
|
|
43
44
|
]),
|
|
44
45
|
];
|
|
45
46
|
}
|
|
46
|
-
/** The terminal-product
|
|
47
|
-
export function
|
|
48
|
-
const { cwd,
|
|
49
|
-
// The
|
|
47
|
+
/** The terminal-product study result for a live run, from its session, cleanup and cost ledger. */
|
|
48
|
+
export function terminalStudyResult(args) {
|
|
49
|
+
const { cwd, studyId, actorId, productName, runId, sessionStatus, completionReason, sessionReason, sessionError, sandboxId, cleanup, cost, noSpendProof, capFailure, declaredScorerFailure, judgment, execution, observer, warnings, } = args;
|
|
50
|
+
// The run's exit code: verified evidence, no harness error and proven cleanup. A blocked/
|
|
50
51
|
// timed-out agent run is still ok-as-evidence at the bundle level (the failure is the evidence),
|
|
51
|
-
// but the
|
|
52
|
+
// but the study result surfaces ok:false on a harness error or unproven teardown (fail-closed).
|
|
52
53
|
// remaining===0 is the by-id-confirmed-reclaimed state; remaining===1 (still present) and
|
|
53
54
|
// remaining===-1 (kill(id) itself failed) are both unproven by design.
|
|
54
55
|
const cleanupProven = cleanup.killed && cleanup.remaining === 0;
|
|
55
|
-
// A
|
|
56
|
+
// A config-declared scorer that failed to render a pass (status:"fail" / malformed / throw) fails the
|
|
56
57
|
// run result as well as the persisted verdict: the keystone route's declared rubric is a gate, so
|
|
57
58
|
// its fail must drive exit code. Library callers never set this (additive, back-compat).
|
|
58
59
|
const ok = resultOk({
|
|
@@ -62,10 +63,9 @@ export function terminalLabResult(args) {
|
|
|
62
63
|
policy: OUTCOME_POLICIES.terminal,
|
|
63
64
|
});
|
|
64
65
|
return {
|
|
65
|
-
|
|
66
|
+
...studyResultIdentity("terminal", studyId),
|
|
66
67
|
ok,
|
|
67
68
|
cwd,
|
|
68
|
-
labId,
|
|
69
69
|
actor: actorId,
|
|
70
70
|
product: productName,
|
|
71
71
|
dryRun: false,
|
|
@@ -97,12 +97,12 @@ export function terminalLabResult(args) {
|
|
|
97
97
|
: {
|
|
98
98
|
error: {
|
|
99
99
|
code: (!cleanupProven
|
|
100
|
-
? "
|
|
100
|
+
? "HUMANISH_TERMINAL_CLEANUP_UNPROVEN"
|
|
101
101
|
: capFailure !== undefined
|
|
102
|
-
? "
|
|
103
|
-
: "
|
|
102
|
+
? "HUMANISH_TERMINAL_CAPS_EXCEEDED"
|
|
103
|
+
: "HUMANISH_TERMINAL_FAILED"),
|
|
104
104
|
message: !cleanupProven
|
|
105
|
-
? `Live terminal-product run could not prove sandbox teardown (killed=${cleanup.killed}, remaining=${cleanup.remaining}): ${cleanup.reason}. A run that cannot prove
|
|
105
|
+
? `Live terminal-product run could not prove sandbox teardown (killed=${cleanup.killed}, remaining=${cleanup.remaining}): ${cleanup.reason}. A run that cannot prove its sandbox was removed does not pass.${sessionError !== undefined ? ` Session failure: ${sessionError}` : ""}`
|
|
106
106
|
: (declaredScorerFailure ??
|
|
107
107
|
capFailure ??
|
|
108
108
|
sessionError ??
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { type TerminalRefusal } from "./plan.js";
|
|
2
|
-
import type { TerminalPlan } from "../../
|
|
3
|
-
import type { AdmittedPlan } from "../../run-
|
|
4
|
-
import { type
|
|
2
|
+
import type { TerminalPlan } from "../../study/plan-types.js";
|
|
3
|
+
import type { AdmittedPlan } from "../../run-study.js";
|
|
4
|
+
import { type RunTerminalProductStudyOptions, type TerminalProductStudyResult, type TerminalRunInput } from "./types.js";
|
|
5
5
|
/**
|
|
6
6
|
* The config-taking entry point. It plans, returns a refusal with the same envelope and analysis
|
|
7
7
|
* record the route has always returned, and otherwise runs the plan.
|
|
8
8
|
*/
|
|
9
|
-
export declare function
|
|
10
|
-
/** A refused terminal
|
|
11
|
-
export declare function
|
|
9
|
+
export declare function runTerminalProductStudy(options: RunTerminalProductStudyOptions): Promise<TerminalProductStudyResult>;
|
|
10
|
+
/** A refused terminal study's result: the route's envelope, and the analysis record a refusal gets. */
|
|
11
|
+
export declare function terminalStudyRefusal(options: RunTerminalProductStudyOptions, refusal: TerminalRefusal): Promise<TerminalProductStudyResult>;
|
|
12
12
|
/**
|
|
13
13
|
* Run a terminal plan. The run scope gives a direct library caller the same run lifetime the CLI
|
|
14
|
-
* gets: whichever of its fail-closed exits the
|
|
14
|
+
* gets: whichever of its fail-closed exits the run takes, the run it started is closed, and only a
|
|
15
15
|
* run that published its final bundle reaches automatic analysis.
|
|
16
16
|
*/
|
|
17
|
-
export declare function runTerminalPlan(plan: TerminalPlan, input: TerminalRunInput): Promise<
|
|
17
|
+
export declare function runTerminalPlan(plan: TerminalPlan, input: TerminalRunInput): Promise<TerminalProductStudyResult>;
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* runStudyWith's step for a terminal plan. It runs a live plan's local checks (checkLiveTerminalMachine)
|
|
20
20
|
* before any run scope opens, so the CLI can present their refusal before it loads a declared
|
|
21
21
|
* scorer, and returns the run that continues from them with that scorer.
|
|
22
22
|
*/
|