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,6 +1,6 @@
|
|
|
1
1
|
// The terminal-product route: a real autonomous agent (Codex) studies a CLI or product from its
|
|
2
2
|
// public surfaces only, inside an E2B shell. The flow:
|
|
3
|
-
// 1. admit:
|
|
3
|
+
// 1. admit: planTerminalStudy refuses what the plan cannot hold, then a live plan's machine checks
|
|
4
4
|
// (checkLiveTerminalMachine) run before any run scope opens, so the CLI can refuse before it
|
|
5
5
|
// loads a declared scorer;
|
|
6
6
|
// 2. open the run scope;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// live-sandbox.ts and live-finish.ts); a dry plan publishes its contract bundle (dry-run.ts);
|
|
9
9
|
// 4. automatic analysis of a run that published its final bundle.
|
|
10
10
|
//
|
|
11
|
-
// The safety contract (`docs/goals/terminal-product-lane/goal.md`) is enforced by construction in
|
|
11
|
+
// The safety contract (`docs/history/goals/terminal-product-lane/goal.md`) is enforced by construction in
|
|
12
12
|
// the files each item names, and checked by the verifier (verify/actor.ts
|
|
13
13
|
// validateTerminalProductEvidence):
|
|
14
14
|
// 1. Explicit key placement. openai-env (default) injects the raw runtime key command-scoped,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// (default/require 0 = no-spend) + maxMinutes (wall-clock kill of the codex command).
|
|
21
21
|
// Enforced in plan.ts (caps required), live-sandbox.ts and lifetime.ts (the wall clock).
|
|
22
22
|
// 3. Public surfaces only. The mission references only subject.product.publicSurfaces + the
|
|
23
|
-
// author mission. No clone
|
|
23
|
+
// author mission. No clone and no private-source access: nothing is git-cloned on this route.
|
|
24
24
|
// Enforced in session.ts, which composes the prompt.
|
|
25
25
|
// 4. Deny-by-default credentials. The command envs are built from an allowlist holding only the
|
|
26
26
|
// declared runtime key; GITHUB_TOKEN/GH_TOKEN/payment/deploy/db/media keys are excluded by
|
|
@@ -47,34 +47,34 @@ import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
|
47
47
|
import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
|
|
48
48
|
import path from "node:path";
|
|
49
49
|
import { runScope } from "../../run/run.js";
|
|
50
|
-
import {
|
|
51
|
-
import {
|
|
50
|
+
import { planTerminalStudy } from "./plan.js";
|
|
51
|
+
import { runDryTerminalStudy } from "./dry-run.js";
|
|
52
52
|
import { checkLiveTerminalMachine, runLiveTerminalSession } from "./session.js";
|
|
53
|
-
import { terminalRouteScorer } from "../../
|
|
54
|
-
import { withLateScorer } from "../../
|
|
55
|
-
import {
|
|
53
|
+
import { terminalRouteScorer } from "../../study/adapter-scorer-loader.js";
|
|
54
|
+
import { withLateScorer } from "../../study/route-inputs.js";
|
|
55
|
+
import {} from "./types.js";
|
|
56
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
56
57
|
/**
|
|
57
58
|
* The config-taking entry point. It plans, returns a refusal with the same envelope and analysis
|
|
58
59
|
* record the route has always returned, and otherwise runs the plan.
|
|
59
60
|
*/
|
|
60
|
-
export async function
|
|
61
|
+
export async function runTerminalProductStudy(options) {
|
|
61
62
|
const { config, dryRun, ...input } = options;
|
|
62
|
-
const planned =
|
|
63
|
+
const planned = planTerminalStudy(config, {
|
|
63
64
|
dryRun,
|
|
64
65
|
hasCostProbe: input.deps?.costProbe !== undefined,
|
|
65
66
|
});
|
|
66
67
|
if (planned.ok)
|
|
67
68
|
return runTerminalPlan(planned.plan, input);
|
|
68
|
-
return
|
|
69
|
+
return terminalStudyRefusal(options, planned.refusal);
|
|
69
70
|
}
|
|
70
|
-
/** A refused terminal
|
|
71
|
-
export function
|
|
71
|
+
/** A refused terminal study's result: the route's envelope, and the analysis record a refusal gets. */
|
|
72
|
+
export function terminalStudyRefusal(options, refusal) {
|
|
72
73
|
const { config, dryRun } = options;
|
|
73
74
|
const refused = {
|
|
74
|
-
|
|
75
|
+
...studyResultIdentity("terminal", config.id),
|
|
75
76
|
ok: false,
|
|
76
77
|
cwd: path.resolve(options.cwd),
|
|
77
|
-
labId: config.id,
|
|
78
78
|
actor: refusal.actor ?? config.actors[0]?.type ?? "",
|
|
79
79
|
product: config.subject.product?.name ?? "",
|
|
80
80
|
dryRun,
|
|
@@ -88,7 +88,7 @@ export function terminalLabRefusal(options, refusal) {
|
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
90
|
* Run a terminal plan. The run scope gives a direct library caller the same run lifetime the CLI
|
|
91
|
-
* gets: whichever of its fail-closed exits the
|
|
91
|
+
* gets: whichever of its fail-closed exits the run takes, the run it started is closed, and only a
|
|
92
92
|
* run that published its final bundle reaches automatic analysis.
|
|
93
93
|
*/
|
|
94
94
|
export async function runTerminalPlan(plan, input) {
|
|
@@ -96,7 +96,7 @@ export async function runTerminalPlan(plan, input) {
|
|
|
96
96
|
return admission.ok ? runAdmittedTerminalRun(admission.admitted, input) : admission.result;
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
|
-
*
|
|
99
|
+
* runStudyWith's step for a terminal plan. It runs a live plan's local checks (checkLiveTerminalMachine)
|
|
100
100
|
* before any run scope opens, so the CLI can present their refusal before it loads a declared
|
|
101
101
|
* scorer, and returns the run that continues from them with that scorer.
|
|
102
102
|
*/
|
|
@@ -141,10 +141,9 @@ function completeTerminalAnalysis(plan, input, result, finished) {
|
|
|
141
141
|
function terminalFailure(plan, input, warnings) {
|
|
142
142
|
const cwd = path.resolve(input.cwd);
|
|
143
143
|
return (code, message) => ({
|
|
144
|
-
|
|
144
|
+
...studyResultIdentity("terminal", plan.studyId),
|
|
145
145
|
ok: false,
|
|
146
146
|
cwd,
|
|
147
|
-
labId: plan.labId,
|
|
148
147
|
actor: plan.actor,
|
|
149
148
|
product: plan.product.name,
|
|
150
149
|
dryRun: plan.dryRun,
|
|
@@ -166,5 +165,5 @@ async function runTerminalPlanInScope(admitted, input, scope) {
|
|
|
166
165
|
const { plan, runtimeEnv } = admitted;
|
|
167
166
|
return runLiveTerminalSession({ plan, input, cwd, warnings, failed, scope, runtimeEnv });
|
|
168
167
|
}
|
|
169
|
-
return
|
|
168
|
+
return runDryTerminalStudy({ plan: admitted.plan, input, cwd, warnings, failed, scope });
|
|
170
169
|
}
|
|
@@ -25,7 +25,7 @@ export declare function teardownSandbox(args: {
|
|
|
25
25
|
warnings: string[];
|
|
26
26
|
}): Promise<TerminalLedgers["cleanup"]>;
|
|
27
27
|
/**
|
|
28
|
-
* Race a commands.run promise against the maxMinutes wall-clock
|
|
28
|
+
* Race a commands.run promise against the maxMinutes wall-clock. The E2B
|
|
29
29
|
* commands.run timeoutMs is the primary kill; this injected-clock guard is the belt-and-suspenders
|
|
30
30
|
* backstop so a mock CLI (which ignores timeoutMs) is still bounded and fails closed in CI.
|
|
31
31
|
*/
|
|
@@ -98,7 +98,7 @@ export async function teardownSandbox(args) {
|
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
|
-
* Race a commands.run promise against the maxMinutes wall-clock
|
|
101
|
+
* Race a commands.run promise against the maxMinutes wall-clock. The E2B
|
|
102
102
|
* commands.run timeoutMs is the primary kill; this injected-clock guard is the belt-and-suspenders
|
|
103
103
|
* backstop so a mock CLI (which ignores timeoutMs) is still bounded and fails closed in CI.
|
|
104
104
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LiveTerminalAuth, LiveTerminalPlan, RunLiveTerminalSessionArgs,
|
|
1
|
+
import type { LiveTerminalAuth, LiveTerminalPlan, RunLiveTerminalSessionArgs, TerminalProductStudyErrorCode, TerminalProductStudyResult, TerminalRunInput } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* The checks of this machine a live run makes before its run starts: the runtime key and
|
|
4
4
|
* E2B_API_KEY. They read only the plan and the environment, so the CLI makes them before it loads
|
|
@@ -9,17 +9,17 @@ export declare function checkLiveTerminalMachine(plan: LiveTerminalPlan, input:
|
|
|
9
9
|
readonly runtimeEnv: LiveTerminalAuth;
|
|
10
10
|
} | {
|
|
11
11
|
readonly ok: false;
|
|
12
|
-
readonly code:
|
|
12
|
+
readonly code: TerminalProductStudyErrorCode;
|
|
13
13
|
readonly message: string;
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
|
-
* The live in-sandbox agent session orchestrator (mirror of
|
|
16
|
+
* The live in-sandbox agent session orchestrator (mirror of runCuaActorStudy's E2B branch). Enforces
|
|
17
17
|
* the 8-point safety contract by construction; fails closed before any sandbox/key/spend on any
|
|
18
18
|
* precondition miss. Persists the substrate-lifecycle/command-log/interventions/cleanup ledgers,
|
|
19
19
|
* the redacted terminal event stream + normalized transcript, the agent report, and the
|
|
20
20
|
* provider-neutral actor trace; tears the sandbox down in a finally and proves the teardown.
|
|
21
21
|
*/
|
|
22
|
-
export declare function runLiveTerminalSession(args: RunLiveTerminalSessionArgs): Promise<
|
|
23
|
-
/** The default mission when the
|
|
22
|
+
export declare function runLiveTerminalSession(args: RunLiveTerminalSessionArgs): Promise<TerminalProductStudyResult>;
|
|
23
|
+
/** The default mission when the study omits one. Public-safe, product-neutral author text. */
|
|
24
24
|
export declare function defaultMission(productName: string): string;
|
|
25
25
|
export declare function makeTerminalRunId(): string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
-
import { missingKeys } from "../../
|
|
2
|
+
import { missingKeys } from "../../study/requirements.js";
|
|
3
3
|
import { declaredRuntimeProvenance } from "./runtime.js";
|
|
4
4
|
import { digestText, redactText, scrubLiterals } from "../../evidence/redaction.js";
|
|
5
5
|
import { describeMissingKeys } from "../../keys/key-resolution.js";
|
|
@@ -18,11 +18,11 @@ import { finishLiveTerminalSession } from "./live-finish.js";
|
|
|
18
18
|
export function checkLiveTerminalMachine(plan, input, warnings) {
|
|
19
19
|
const env = input.env ?? process.env;
|
|
20
20
|
const { maxUsd } = plan.caps;
|
|
21
|
-
//
|
|
21
|
+
// planTerminalStudy refuses a positive maxUsd without a costProbe, so one is present here.
|
|
22
22
|
if (maxUsd > 0) {
|
|
23
23
|
warnings.push(`scenario.caps.maxUsd=${maxUsd} is checked after the session against the lines the costProbe measures; lines it leaves null (unmeasured) never trip it. scenario.caps.maxMinutes bounds the run while it runs.`);
|
|
24
24
|
}
|
|
25
|
-
// ---
|
|
25
|
+
// --- Deny-by-default credentials: build the command-scoped allowlist. ---
|
|
26
26
|
const runtimeEnv = buildRuntimeAuth({ runtimeAuth: plan.runtime.auth, env });
|
|
27
27
|
if (!runtimeEnv.ok)
|
|
28
28
|
return runtimeEnv;
|
|
@@ -31,14 +31,14 @@ export function checkLiveTerminalMachine(plan, input, warnings) {
|
|
|
31
31
|
if (missingKeys(plan.requirements, env).length > 0) {
|
|
32
32
|
return {
|
|
33
33
|
ok: false,
|
|
34
|
-
code: "
|
|
35
|
-
message: `Live terminal-product
|
|
34
|
+
code: "HUMANISH_TERMINAL_KEYS_MISSING",
|
|
35
|
+
message: `Live terminal-product studies need E2B_API_KEY in the environment (values are never persisted). ${describeMissingKeys(["E2B_API_KEY"], env)}`,
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
return { ok: true, runtimeEnv };
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
|
-
* The live in-sandbox agent session orchestrator (mirror of
|
|
41
|
+
* The live in-sandbox agent session orchestrator (mirror of runCuaActorStudy's E2B branch). Enforces
|
|
42
42
|
* the 8-point safety contract by construction; fails closed before any sandbox/key/spend on any
|
|
43
43
|
* precondition miss. Persists the substrate-lifecycle/command-log/interventions/cleanup ledgers,
|
|
44
44
|
* the redacted terminal event stream + normalized transcript, the agent report, and the
|
|
@@ -61,7 +61,7 @@ export async function runLiveTerminalSession(args) {
|
|
|
61
61
|
mintRunId: makeTerminalRunId,
|
|
62
62
|
// This entry point is the live terminal route; its dry-run sibling is a separate function.
|
|
63
63
|
mode: "live",
|
|
64
|
-
|
|
64
|
+
study: plan.study,
|
|
65
65
|
renderReview: renderTerminalReviewMarkdown,
|
|
66
66
|
observer: { open: input.open === true, render: deps.renderObserver },
|
|
67
67
|
now,
|
|
@@ -86,7 +86,7 @@ export async function runLiveTerminalSession(args) {
|
|
|
86
86
|
modelSource,
|
|
87
87
|
...(reasoningEffort === undefined ? {} : { reasoningEffort }),
|
|
88
88
|
});
|
|
89
|
-
recorder.recordLifecycle("terminal-lab.run.created", `Created live terminal-product run ${runId} (actor ${actor}, product ${product.name}). Caps: maxUsd=${maxUsd}, maxMinutes=${maxMinutes}. Subject provenance
|
|
89
|
+
recorder.recordLifecycle("terminal-lab.run.created", `Created live terminal-product run ${runId} (actor ${actor}, product ${product.name}). Caps: maxUsd=${maxUsd}, maxMinutes=${maxMinutes}. Subject provenance: unpinned (public pages only).`);
|
|
90
90
|
const session = new LiveTerminalSandbox({
|
|
91
91
|
plan,
|
|
92
92
|
cwd,
|
|
@@ -101,7 +101,7 @@ export async function runLiveTerminalSession(args) {
|
|
|
101
101
|
maxMinutes,
|
|
102
102
|
e2bApiKey,
|
|
103
103
|
runPaths,
|
|
104
|
-
metadata: buildSandboxMetadata({
|
|
104
|
+
metadata: buildSandboxMetadata({ studyId: plan.studyId, recordId: "sim-001", runId }),
|
|
105
105
|
warnings,
|
|
106
106
|
recorder,
|
|
107
107
|
});
|
|
@@ -146,7 +146,7 @@ export async function runLiveTerminalSession(args) {
|
|
|
146
146
|
async function prepareLivePrompt(args) {
|
|
147
147
|
const { plan, cwd, runtimeEnv, env, warnings } = args;
|
|
148
148
|
const { product } = plan;
|
|
149
|
-
// Compose the prompt from public surfaces and the author mission alone
|
|
149
|
+
// Compose the prompt from public surfaces and the author mission alone.
|
|
150
150
|
// Inject a per-run verdict nonce: the agent echoes HUMANISH_ACTOR_VERDICT=<status>
|
|
151
151
|
// HUMANISH_ACTOR_NONCE=<nonce>; the scorer verifies the nonce so replayed text cannot forge it.
|
|
152
152
|
const mission = plan.mission ?? defaultMission(product.name);
|
|
@@ -160,10 +160,10 @@ async function prepareLivePrompt(args) {
|
|
|
160
160
|
verdictNonce,
|
|
161
161
|
});
|
|
162
162
|
const promptDigest = digestText(composedPrompt);
|
|
163
|
-
// ---
|
|
163
|
+
// --- Literal-scrub every known value, then pattern-redact, at the source. ---
|
|
164
164
|
// The runtime key value (+ any other provisioned value) is scrubbed by literal match before
|
|
165
165
|
// anything persists (a key has no detectable "shape" if it is an arbitrary token); redactText is
|
|
166
|
-
// the second pass for secret-
|
|
166
|
+
// the second pass for secret-shaped content. Applied pre-truncation so a cut can never split a
|
|
167
167
|
// value past the scrubber.
|
|
168
168
|
const knownSecretValues = [runtimeEnv.keyValue, env.E2B_API_KEY?.trim() ?? ""].filter((v) => v.length >= 4);
|
|
169
169
|
const scrubKnownValues = scrubLiterals(knownSecretValues);
|
|
@@ -181,6 +181,7 @@ async function prepareLivePrompt(args) {
|
|
|
181
181
|
}
|
|
182
182
|
/** Compose the live prompt: public surfaces + author mission + the verdict-nonce marker contract. */
|
|
183
183
|
function composeLivePrompt(args) {
|
|
184
|
+
// prose-check: model prompt (the terminal agent reads this, not a person)
|
|
184
185
|
return [
|
|
185
186
|
args.personaLine,
|
|
186
187
|
`product: ${args.productName}`,
|
|
@@ -191,7 +192,7 @@ function composeLivePrompt(args) {
|
|
|
191
192
|
`When finished, print exactly one final machine-readable line in this format: HUMANISH_ACTOR_VERDICT=<status> HUMANISH_ACTOR_NONCE=${args.verdictNonce} where <status> is passed, blocked, or failed.`,
|
|
192
193
|
].join("\n");
|
|
193
194
|
}
|
|
194
|
-
/** The default mission when the
|
|
195
|
+
/** The default mission when the study omits one. Public-safe, product-neutral author text. */
|
|
195
196
|
export function defaultMission(productName) {
|
|
196
197
|
return `You are an autonomous agent. Discover ${productName} from its public surfaces and determine whether it can help with a durable real task. Stay within the declared no-spend caps. Leave feedback if the workflow is confusing.`;
|
|
197
198
|
}
|
|
@@ -3,7 +3,7 @@ import type { ActorTokenUsage } from "../../actors/contract.js";
|
|
|
3
3
|
* Accumulate runtime-turn usage from a captured `codex exec --json` stream. A Codex turn may
|
|
4
4
|
* include multiple provider requests; these records cannot establish per-request pricing tiers.
|
|
5
5
|
*
|
|
6
|
-
* Returns undefined when the stream carried no usage record at all, which is the
|
|
6
|
+
* Returns undefined when the stream carried no usage record at all, which is the "no
|
|
7
7
|
* signal" case and must stay distinguishable from a measured zero. Per-turn records are preserved
|
|
8
8
|
* in `turns` because long-context pricing can only be computed from per-request sizes
|
|
9
9
|
* (src/run/pricing.ts), and totals cannot say which requests crossed a threshold.
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
// Provider token accounting for the terminal route
|
|
1
|
+
// Provider token accounting for the terminal route.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// at all, and knowing exactly how many tokens were spent while lacking a rate to price them.
|
|
3
|
+
// Without these counts, a provider line of `null` with source "unmeasured" would let the no-spend
|
|
4
|
+
// proof read `satisfied: true` for `maxUsd: 0` on a run that consumed hundreds of thousands of
|
|
5
|
+
// provider tokens, conflating two different states: having no signal at all, and knowing exactly
|
|
6
|
+
// how many tokens were spent while lacking a rate to price them.
|
|
8
7
|
//
|
|
9
8
|
// The counts were already in the bundle. `codex exec --json` emits one usage record per turn:
|
|
10
9
|
// {"type":"turn.completed","usage":{"input_tokens":201536,"cached_input_tokens":170558,
|
|
@@ -12,7 +11,7 @@
|
|
|
12
11
|
//
|
|
13
12
|
// So the route can record a measured token fact even when it cannot record a priced one. Rates stay
|
|
14
13
|
// out of this module deliberately: pricing lives in src/run/pricing.ts, and the terminal route has no
|
|
15
|
-
// real model id to price against (it records `model: "codex"`), so the
|
|
14
|
+
// real model id to price against (it records `model: "codex"`), so the output is
|
|
16
15
|
// tokens-known-rate-unknown rather than a guessed dollar figure.
|
|
17
16
|
// Bounded to a single line on purpose. `[^}]*` would run past a truncated record's missing brace
|
|
18
17
|
// and swallow the next, valid record's body, silently dropping a real turn from the count.
|
|
@@ -24,7 +23,7 @@ function num(value) {
|
|
|
24
23
|
* Accumulate runtime-turn usage from a captured `codex exec --json` stream. A Codex turn may
|
|
25
24
|
* include multiple provider requests; these records cannot establish per-request pricing tiers.
|
|
26
25
|
*
|
|
27
|
-
* Returns undefined when the stream carried no usage record at all, which is the
|
|
26
|
+
* Returns undefined when the stream carried no usage record at all, which is the "no
|
|
28
27
|
* signal" case and must stay distinguishable from a measured zero. Per-turn records are preserved
|
|
29
28
|
* in `turns` because long-context pricing can only be computed from per-request sizes
|
|
30
29
|
* (src/run/pricing.ts), and totals cannot say which requests crossed a threshold.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ActorCompletionReason, ActorPersonaRef, ActorRuntimeProvenance, ActorStatus, ActorTokenUsage, ActorTrace } from "../../actors/contract.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { StudyRuntimeAuth } from "../../study/types.js";
|
|
3
3
|
import type { TerminalParticipantText } from "./participant-text.js";
|
|
4
4
|
import { type CommandLogRecord, type TerminalEventRecord } from "./types.js";
|
|
5
5
|
/**
|
|
@@ -12,7 +12,7 @@ export declare function scrubSplitKnownValues(events: TerminalEventRecord[], kno
|
|
|
12
12
|
export declare function tailOf(text: string): string;
|
|
13
13
|
/**
|
|
14
14
|
* Project the live terminal session into the provider-neutral humanish.actor-trace.v1 (`lane`
|
|
15
|
-
* "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement
|
|
15
|
+
* "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement
|
|
16
16
|
* guard (a real run bumps them; a no-op is caught). No screenshots on this route.
|
|
17
17
|
*/
|
|
18
18
|
export declare function buildTerminalActorTrace(args: {
|
|
@@ -27,9 +27,9 @@ export declare function buildTerminalActorTrace(args: {
|
|
|
27
27
|
terminalEvents: TerminalEventRecord[];
|
|
28
28
|
commandLog: CommandLogRecord[];
|
|
29
29
|
transcriptTail: string;
|
|
30
|
-
runtimeAuth:
|
|
30
|
+
runtimeAuth: StudyRuntimeAuth;
|
|
31
31
|
runtime: ActorRuntimeProvenance;
|
|
32
|
-
/** Runtime-turn aggregate usage parsed from the exec stream
|
|
32
|
+
/** Runtime-turn aggregate usage parsed from the exec stream. Absent when the stream
|
|
33
33
|
* carried no usage record, which stays distinct from a measured zero. */
|
|
34
34
|
tokenUsage?: ActorTokenUsage;
|
|
35
35
|
/** The agent's own text and activity, read from the raw stdout as it arrived. */
|
|
@@ -57,7 +57,7 @@ export function tailOf(text) {
|
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* Project the live terminal session into the provider-neutral humanish.actor-trace.v1 (`lane`
|
|
60
|
-
* "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement
|
|
60
|
+
* "terminal", protocol "terminal-exec"). counts.actions/messages drive the no-engagement
|
|
61
61
|
* guard (a real run bumps them; a no-op is caught). No screenshots on this route.
|
|
62
62
|
*/
|
|
63
63
|
export function buildTerminalActorTrace(args) {
|
|
@@ -88,7 +88,7 @@ export function buildTerminalActorTrace(args) {
|
|
|
88
88
|
redaction: {
|
|
89
89
|
status: "passed",
|
|
90
90
|
screenshots: "n/a",
|
|
91
|
-
notes: "Terminal
|
|
91
|
+
notes: "Terminal output captured through commands.run onStdout and onStderr; known values are scrubbed and shape patterns redacted before anything is stored. This route takes no screenshots.",
|
|
92
92
|
},
|
|
93
93
|
startedAt: args.createdAt,
|
|
94
94
|
completedAt: args.completedAt,
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyEvent } from "../../study/run-study-events.js";
|
|
2
2
|
import { type AutomaticAnalysisResult } from "../../analysis/automatic-completion.js";
|
|
3
3
|
import type { ActorCompletionReason, ActorRuntimeProvenance, ActorStatus, ActorTrace } from "../../actors/contract.js";
|
|
4
4
|
import type { CostCategory } from "../../run/terminal-contract.js";
|
|
5
5
|
import type { RunScope } from "../../run/run.js";
|
|
6
6
|
import type { buildRuntimeAuth } from "./credentials.js";
|
|
7
|
-
import type { TerminalPlan } from "../../
|
|
8
|
-
import type {
|
|
9
|
-
import type {
|
|
7
|
+
import type { TerminalPlan } from "../../study/plan-types.js";
|
|
8
|
+
import type { StudyDeps } from "../../study/study-deps.js";
|
|
9
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
10
10
|
import type { ObserverResult } from "../../observer/render.js";
|
|
11
11
|
import { type RunAdapterScore, type RunBundle, type RunFeedbackCandidate, type RunScorerProvenance } from "../../run/bundle.js";
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
import { type StudyResultIdentity } from "../../run/study-result.js";
|
|
13
|
+
/** Provider-neutral metadata constant: the route's non-secret tag (mirrors CUA_ACTOR_STUDY_PROVIDER_METADATA). */
|
|
14
|
+
export declare const TERMINAL_PRODUCT_STUDY_PROVIDER_METADATA: {
|
|
14
15
|
readonly mode: "terminal-product-lab";
|
|
15
16
|
readonly tool: "humanish";
|
|
16
17
|
};
|
|
@@ -22,7 +23,7 @@ export declare const UPLOAD_MAX_BYTES: number;
|
|
|
22
23
|
/**
|
|
23
24
|
* Server-side reclamation buffer past the codex command's own wall-clock (caps.maxMinutes) kill.
|
|
24
25
|
* Shorter than the desktop routes' SANDBOX_TIMEOUT_BUFFER_MS (src/substrates/e2b/lifetime.ts):
|
|
25
|
-
* when
|
|
26
|
+
* when this buffer was set, the terminal sandbox ran nothing but the codex command, and after its kill only
|
|
26
27
|
* teardown remained.
|
|
27
28
|
*/
|
|
28
29
|
export declare const TERMINAL_SANDBOX_TIMEOUT_BUFFER_MS: number;
|
|
@@ -34,13 +35,12 @@ export declare const TEXT_ITEMS_MAX = 200;
|
|
|
34
35
|
export declare const TEXT_ITEMS_BYTES: number;
|
|
35
36
|
export declare const PENDING_LINE_CHARS: number;
|
|
36
37
|
export declare const MAX_TRANSCRIPT_BYTES: number;
|
|
37
|
-
export declare const TERMINAL_PRODUCT_LAB_SCHEMA = "humanish.terminal-lab-result.v1";
|
|
38
38
|
/**
|
|
39
|
-
* The read-only evidence a thin adapter's scorer/feedback hook sees (the
|
|
40
|
-
*
|
|
39
|
+
* The read-only evidence a thin adapter's scorer/feedback hook sees (the adapter extension seam).
|
|
40
|
+
* It is the fully assembled, redacted, verifiable evidence: the live run
|
|
41
41
|
* bundle, the provider-neutral actor trace, and the persisted ledgers (substrate/command/
|
|
42
42
|
* interventions/cleanup/cost/no-spend). Every member is an exported public type, so a thin adapter
|
|
43
|
-
* types against `import("humanish")` alone
|
|
43
|
+
* types against `import("humanish")` alone and never needs a deep `src/` import. The adapter reads this
|
|
44
44
|
* to score the product attempt and derive feedback; it cannot mutate core's evidence (the route
|
|
45
45
|
* attaches only the namespaced `RunAdapterScore` it returns + the feedback candidates it derives).
|
|
46
46
|
*/
|
|
@@ -56,30 +56,30 @@ export interface TerminalProductScoringContext {
|
|
|
56
56
|
* values) then redacted (shape patterns) at the source, capped at MAX_TRANSCRIPT_BYTES, and
|
|
57
57
|
* byte-identical to the persisted terminal-transcript.txt artifact. The trace's transcriptTail
|
|
58
58
|
* is a ~2KB projection of this; a scorer needs the whole session so a rubric can find
|
|
59
|
-
* command-tier evidence anywhere in it
|
|
59
|
+
* command-tier evidence anywhere in it.
|
|
60
60
|
*/
|
|
61
61
|
transcript: string;
|
|
62
62
|
/** The studied product name (public-safe). */
|
|
63
63
|
product: string;
|
|
64
|
-
/** The
|
|
65
|
-
|
|
64
|
+
/** The study id (the run's scenario scope). */
|
|
65
|
+
studyId: string;
|
|
66
66
|
/** The run id (for building namespaced idempotency keys + evidence pointers). */
|
|
67
67
|
runId: string;
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
70
|
* Known spend lines for the terminal cost ledger. Core has no product, media or payment spend
|
|
71
71
|
* signal, so it fills only the provider line from trace tokenUsage when present. A test injects
|
|
72
|
-
* known lines through `
|
|
72
|
+
* known lines through `StudyDeps.costProbe`; absent signals keep the null-discipline default.
|
|
73
73
|
*/
|
|
74
74
|
export type TerminalCostProbe = (context: {
|
|
75
75
|
tokenCostUsd?: number;
|
|
76
76
|
}) => Partial<Record<"product" | "media" | "payment" | "provider", CostLine>> | undefined;
|
|
77
|
-
/** The scorer functions a terminal run calls: `
|
|
77
|
+
/** The scorer functions a terminal run calls: `RunStudyOptions.scorer` without `deriveArtifacts`. */
|
|
78
78
|
export interface TerminalScorer {
|
|
79
79
|
/**
|
|
80
|
-
* The
|
|
81
|
-
* core
|
|
82
|
-
* (when provided) over the fully-assembled evidence and attaches the returned,
|
|
80
|
+
* The adapter extension seam: product-adapter hooks without forking
|
|
81
|
+
* core. A thin in-repo/out-of-tree adapter registers a product scorer here. The route calls it
|
|
82
|
+
* (when provided) over the fully-assembled evidence and attaches the returned, adapter-namespaced
|
|
83
83
|
* `RunAdapterScore` to `bundle.adapterScore` without core knowing any product noun (the score is
|
|
84
84
|
* namespaced + its component breakdown rides in `data`). When no scorer is given, the default
|
|
85
85
|
* mission-based verdict (`review`) is unchanged. The adopter's scorecard plugs in here; product
|
|
@@ -90,20 +90,20 @@ export interface TerminalScorer {
|
|
|
90
90
|
* Companion seam: derive product-feedback candidates from the same assembled evidence. The route
|
|
91
91
|
* appends the returned candidates to `bundle.feedbackCandidates`. The adapter records its
|
|
92
92
|
* product-specific concepts (public CLI command observed, hosted success-or-blocker, feedback id,
|
|
93
|
-
* media/job ids, no-spend proof, defection/friction risk) under each candidate's
|
|
94
|
-
* `adapter` block
|
|
95
|
-
*
|
|
93
|
+
* media/job ids, no-spend proof, defection/friction risk) under each candidate's adapter-namespaced
|
|
94
|
+
* `adapter` block and never as core enums.
|
|
95
|
+
* The candidates must still satisfy core's feedback-candidate shape (which
|
|
96
96
|
* the bundle verifier enforces), so a malformed adapter candidate fails closed.
|
|
97
97
|
*/
|
|
98
98
|
deriveFeedback?: (ctx: TerminalProductScoringContext) => RunFeedbackCandidate[] | Promise<RunFeedbackCandidate[]>;
|
|
99
99
|
}
|
|
100
|
-
export interface
|
|
100
|
+
export interface RunTerminalProductStudyOptions {
|
|
101
101
|
/** Cancels post-run analysis only. */
|
|
102
102
|
analysisSignal?: AbortSignal;
|
|
103
|
-
/** Reports the analysis window to onEvent; built by
|
|
104
|
-
emit?: (event:
|
|
103
|
+
/** Reports the analysis window to onEvent; built by normalizeRunStudyOptions. */
|
|
104
|
+
emit?: (event: StudyEvent) => void;
|
|
105
105
|
cwd: string;
|
|
106
|
-
config:
|
|
106
|
+
config: StudyConfig;
|
|
107
107
|
/** Resolved upstream (scenario.mode + CLI override); defaults safe (dry-run). */
|
|
108
108
|
dryRun: boolean;
|
|
109
109
|
open?: boolean;
|
|
@@ -117,9 +117,9 @@ export interface RunTerminalProductLabOptions {
|
|
|
117
117
|
env?: Readonly<Record<string, string | undefined>>;
|
|
118
118
|
scorer?: TerminalScorer;
|
|
119
119
|
/** Test seams: the E2B module, the Observer renderer, the clock and the cost probe. */
|
|
120
|
-
deps?:
|
|
120
|
+
deps?: StudyDeps;
|
|
121
121
|
/**
|
|
122
|
-
* Present only when the scorer was config-declared and loaded by the CLI
|
|
122
|
+
* Present only when the scorer was config-declared and loaded by the CLI. Its presence
|
|
123
123
|
* is the "declared" marker: a config-declared terminal scorer returning status:"fail" flips
|
|
124
124
|
* bundle.review.verdict (like the browser routes), and one that throws becomes a visible review.gaps
|
|
125
125
|
* entry. A library caller passing `scorer` leaves this absent and keeps today's purely
|
|
@@ -127,14 +127,12 @@ export interface RunTerminalProductLabOptions {
|
|
|
127
127
|
*/
|
|
128
128
|
scorerProvenance?: RunScorerProvenance;
|
|
129
129
|
}
|
|
130
|
-
export interface
|
|
131
|
-
schema: typeof TERMINAL_PRODUCT_LAB_SCHEMA;
|
|
130
|
+
export interface TerminalProductStudyResult extends AutomaticAnalysisResult, StudyResultIdentity<"terminal"> {
|
|
132
131
|
/** True when the bundle verified and (dry-run, or the live session reached a terminal verdict
|
|
133
132
|
* without a harness error + cleanup was proven). The agent's pass/fail is evidence, not the
|
|
134
|
-
*
|
|
133
|
+
* run's exit code. */
|
|
135
134
|
ok: boolean;
|
|
136
135
|
cwd: string;
|
|
137
|
-
labId: string;
|
|
138
136
|
/** The registry-resolved actor id that ran (or would run) the session. */
|
|
139
137
|
actor: string;
|
|
140
138
|
/** The studied product name (public-safe). */
|
|
@@ -151,11 +149,11 @@ export interface TerminalProductLabResult extends AutomaticAnalysisResult {
|
|
|
151
149
|
sandbox?: {
|
|
152
150
|
sandboxId: string;
|
|
153
151
|
killed: boolean;
|
|
154
|
-
/**
|
|
152
|
+
/** By-id proof (never a re-list): 0 = confirmed reclaimed, 1 = still present (unconfirmed),
|
|
155
153
|
* -1 = kill(id) itself failed or was unavailable. See TerminalLedgers["cleanup"]. */
|
|
156
154
|
remaining: number;
|
|
157
155
|
};
|
|
158
|
-
/** Live-only: the spend ledger surfaced on the result
|
|
156
|
+
/** Live-only: the spend ledger surfaced on the result. Unknowns are null, never guessed.
|
|
159
157
|
* Lets a programmatic caller read spend without parsing the bundle. */
|
|
160
158
|
cost?: {
|
|
161
159
|
knownTotalUsd: number;
|
|
@@ -173,7 +171,7 @@ export interface TerminalProductLabResult extends AutomaticAnalysisResult {
|
|
|
173
171
|
observer?: ObserverResult;
|
|
174
172
|
warnings: string[];
|
|
175
173
|
error?: {
|
|
176
|
-
code: "
|
|
174
|
+
code: "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_STUDY_OPTION_UNSUPPORTED" | "HUMANISH_STUDY_V2_UNSUPPORTED" | "HUMANISH_TERMINAL_FAILED" | "HUMANISH_TERMINAL_ACTOR_UNSUPPORTED" | "HUMANISH_TERMINAL_SUBJECT_INVALID" | "HUMANISH_TERMINAL_KEYPLACEMENT_INVALID" | "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_KEYS_MISSING" | "HUMANISH_TERMINAL_CAPS_MISSING" | "HUMANISH_TERMINAL_CAPS_INVALID" | "HUMANISH_TERMINAL_UNPRICED_CAP" | "HUMANISH_TERMINAL_CAPS_EXCEEDED" | "HUMANISH_TERMINAL_CREDENTIAL_DENIED" | "HUMANISH_TERMINAL_CLEANUP_UNPROVEN" | "HUMANISH_RUN_ID_IN_USE";
|
|
177
175
|
message: string;
|
|
178
176
|
};
|
|
179
177
|
}
|
|
@@ -189,7 +187,7 @@ export interface CommandLogRecord {
|
|
|
189
187
|
at: string;
|
|
190
188
|
/** A public-safe label for the command (e.g. "codex-exec"); the full argv is bound by digest only. */
|
|
191
189
|
label: string;
|
|
192
|
-
/** sha256-12 of the exact command string
|
|
190
|
+
/** sha256-12 of the exact command string. It pins "same recipe" without persisting it. */
|
|
193
191
|
commandDigest: string;
|
|
194
192
|
/** The env var names injected command-scoped (values never persisted): the credential evidence. */
|
|
195
193
|
envNames: string[];
|
|
@@ -216,7 +214,7 @@ export interface InterventionRecord {
|
|
|
216
214
|
inputDigest: string;
|
|
217
215
|
}
|
|
218
216
|
/**
|
|
219
|
-
* One cost line of the spend ledger. The null discipline
|
|
217
|
+
* One cost line of the spend ledger. The null discipline:
|
|
220
218
|
* three distinct states are kept apart:
|
|
221
219
|
* - `usd: 0` => known to be zero. A measured-and-zero spend (we metered this category and it
|
|
222
220
|
* billed nothing). The no-spend proof may legitimately assert this is zero.
|
|
@@ -226,7 +224,7 @@ export interface InterventionRecord {
|
|
|
226
224
|
* - line absent => not applicable to this route/run (n/a). The line simply does not appear in
|
|
227
225
|
* `lines`. (The current route emits all four lines, so absence is reserved for
|
|
228
226
|
* future routes that genuinely have no such category.)
|
|
229
|
-
* `null` vs missing-key is the
|
|
227
|
+
* `null` vs missing-key is the distinction that matters: a missing key means "this category does not
|
|
230
228
|
* exist for this run"; a present key with `null` means "this category exists but we did not measure
|
|
231
229
|
* it". A no-spend proof that claimed zero on a `null` line would claim more than it measured.
|
|
232
230
|
*/
|
|
@@ -238,7 +236,7 @@ export interface CostLine {
|
|
|
238
236
|
/** How this line's value was established (provenance for the verifier + the human reviewer). */
|
|
239
237
|
source: "provider-token-usage" | "no-spend-signal" | "operator-cap" | "unmeasured"
|
|
240
238
|
/** Tokens were counted but no rate could price them, so `usd` stays null while the note
|
|
241
|
-
* carries the measured token totals
|
|
239
|
+
* carries the measured token totals. Distinct from "unmeasured", which means no
|
|
242
240
|
* signal at all. */
|
|
243
241
|
| "unpriced-token-usage";
|
|
244
242
|
/** A short, public-safe note (never a secret value). */
|
|
@@ -260,8 +258,8 @@ export interface TerminalCostLedger {
|
|
|
260
258
|
fullyMeasured: boolean;
|
|
261
259
|
}
|
|
262
260
|
/**
|
|
263
|
-
* The no-spend proof, derived from the cost ledger
|
|
264
|
-
*
|
|
261
|
+
* The no-spend proof, derived from the cost ledger.
|
|
262
|
+
* It lists the known-zero lines it can vouch for and, separately, the unmeasured
|
|
265
263
|
* (null) lines it cannot vouch for. `satisfied` is true only when every known line is zero (a
|
|
266
264
|
* known non-zero line fails it). A proof with unmeasured lines says it could not measure them;
|
|
267
265
|
* it never claims zero on a line the ledger marks null.
|
|
@@ -274,14 +272,14 @@ export interface NoSpendProof {
|
|
|
274
272
|
satisfied: boolean;
|
|
275
273
|
/** Categories the ledger measured and found at (known) zero: the proof can vouch for these. */
|
|
276
274
|
knownZeroLines: CostCategory[];
|
|
277
|
-
/** Categories the ledger measured with a known
|
|
275
|
+
/** Categories the ledger measured with a known non-zero spend (these break `satisfied`). */
|
|
278
276
|
knownNonZeroLines: CostCategory[];
|
|
279
277
|
/** Categories the ledger marks `null` (not measured). The proof lists these and does not claim
|
|
280
278
|
* they are zero; it claims only that this run could not measure them. */
|
|
281
279
|
unmeasuredLines: CostCategory[];
|
|
282
280
|
/** Sum of the known lines (== 0 for a satisfied no-spend run). */
|
|
283
281
|
knownTotalUsd: number;
|
|
284
|
-
/** Human-readable
|
|
282
|
+
/** Human-readable statement covering both what is proven and what is unmeasured. */
|
|
285
283
|
statement: string;
|
|
286
284
|
}
|
|
287
285
|
/** The persisted terminal-product ledgers artifact (substrate lifecycle + command log + interventions + cleanup + cost). */
|
|
@@ -302,7 +300,7 @@ export interface TerminalLedgers {
|
|
|
302
300
|
* this exact sandbox running/paused (still present); -1 = kill(id) itself failed, threw, or
|
|
303
301
|
* was unavailable (the server-side kill-on-timeout is the backstop). */
|
|
304
302
|
remaining: number;
|
|
305
|
-
/**
|
|
303
|
+
/** Human-readable statement of which by-id signal produced `remaining`. */
|
|
306
304
|
reason: string;
|
|
307
305
|
};
|
|
308
306
|
/** The spend ledger. Unknowns are `null`, never guessed; the no-spend proof
|
|
@@ -311,13 +309,13 @@ export interface TerminalLedgers {
|
|
|
311
309
|
/** The no-spend proof derived from `cost`. Never an independent assertion. */
|
|
312
310
|
noSpendProof: NoSpendProof;
|
|
313
311
|
}
|
|
314
|
-
/** What a terminal run takes besides its plan. The plan carries the config, dry run and
|
|
315
|
-
export type TerminalRunInput = Omit<
|
|
316
|
-
/** A live terminal plan: its caps are the fail-closed ones
|
|
312
|
+
/** What a terminal run takes besides its plan. The plan carries the config, dry run and study. */
|
|
313
|
+
export type TerminalRunInput = Omit<RunTerminalProductStudyOptions, "config" | "dryRun">;
|
|
314
|
+
/** A live terminal plan: its caps are the fail-closed ones planTerminalStudy required. */
|
|
317
315
|
export type LiveTerminalPlan = Extract<TerminalPlan, {
|
|
318
316
|
readonly dryRun: false;
|
|
319
317
|
}>;
|
|
320
|
-
export type
|
|
318
|
+
export type TerminalProductStudyErrorCode = NonNullable<TerminalProductStudyResult["error"]>["code"];
|
|
321
319
|
/** The runtime key's command-scoped placement, built by a live run's checks of this machine. */
|
|
322
320
|
export type LiveTerminalAuth = Extract<ReturnType<typeof buildRuntimeAuth>, {
|
|
323
321
|
ok: true;
|
|
@@ -327,8 +325,8 @@ export interface RunLiveTerminalSessionArgs {
|
|
|
327
325
|
input: TerminalRunInput;
|
|
328
326
|
cwd: string;
|
|
329
327
|
warnings: string[];
|
|
330
|
-
failed: (code:
|
|
331
|
-
/** The
|
|
328
|
+
failed: (code: TerminalProductStudyErrorCode, message: string) => TerminalProductStudyResult;
|
|
329
|
+
/** The study's run scope; the live session starts its run in it. */
|
|
332
330
|
scope: RunScope;
|
|
333
331
|
runtimeEnv: LiveTerminalAuth;
|
|
334
332
|
}
|