humanish 0.107.0 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- 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-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 +8 -6
- 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 +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- 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 +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +78 -43
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +147 -108
- 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 +137 -138
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +41 -6
- package/dist/cli/io.js +97 -22
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- 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 +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +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 +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- 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 +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +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 +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- 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 +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- 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.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- 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 +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- 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 +5 -4
- package/dist/run/run.js +1 -1
- 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 +36 -35
- 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 +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- 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/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +82 -82
- 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 +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- 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 +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/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/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +60 -58
- 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.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/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- 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
|
@@ -2,13 +2,13 @@ import {} from "../../run/bundle.js";
|
|
|
2
2
|
import { isRunAdapterScore } from "../../run/bundle-shape.js";
|
|
3
3
|
import { adapterScoreFailureMessage, declaredScorerThrew, DECLARED_SCORER_MALFORMED, frozenBundleView, isAdapterFeedbackCandidate, } from "../../lab/adapter-extension.js";
|
|
4
4
|
/**
|
|
5
|
-
* Run the
|
|
5
|
+
* Run the product-adapter extension seam over the assembled
|
|
6
6
|
* evidence and attach its results to the bundle in place, without core knowing any product noun.
|
|
7
7
|
* The review is not touched here: the returned failures are folded into it by the caller.
|
|
8
8
|
*
|
|
9
9
|
* - `score`: when present, the returned namespaced `RunAdapterScore` lands on `bundle.adapterScore`.
|
|
10
10
|
* For a library caller (no `scorerProvenance`), the adapter score is additive and never a
|
|
11
|
-
* failure. For a config-declared scorer (
|
|
11
|
+
* failure. For a config-declared scorer (`scorerProvenance` present), a status:"fail" is a
|
|
12
12
|
* failure (the keystone route is the product's own definition of pass/fail), and so is a scorer
|
|
13
13
|
* that throws or returns a malformed value, so a crashed declared gate is never a silent green.
|
|
14
14
|
* - `deriveFeedback`: when present, the returned candidates are appended to
|
|
@@ -28,10 +28,10 @@ export async function applyAdapterExtensionSeam(args) {
|
|
|
28
28
|
// still loaded and attempted).
|
|
29
29
|
if (scorerProvenance)
|
|
30
30
|
bundle.scorerProvenance = scorerProvenance;
|
|
31
|
-
// The scorer sees a
|
|
31
|
+
// The scorer sees a read-only view of the bundle so it cannot mutate noSpend/cost/review in place to
|
|
32
32
|
// launder a verdict (a tamper attempt throws and is caught as a hook failure below). The seam stamps
|
|
33
33
|
// the real bundle. The transcript is the same normalized, source-scrubbed text the run persists as
|
|
34
|
-
// terminal-transcript.txt
|
|
34
|
+
// terminal-transcript.txt, so the scorer sees nothing beyond what disk already holds.
|
|
35
35
|
const ctx = {
|
|
36
36
|
bundle: frozenBundleView(bundle),
|
|
37
37
|
trace,
|
|
@@ -59,7 +59,7 @@ export async function applyAdapterExtensionSeam(args) {
|
|
|
59
59
|
const cleaned = scrubValue(score);
|
|
60
60
|
if (isRunAdapterScore(cleaned)) {
|
|
61
61
|
bundle.adapterScore = cleaned;
|
|
62
|
-
// A
|
|
62
|
+
// A config-declared terminal scorer owns the product verdict: a status:"fail" fails the
|
|
63
63
|
// review and the run result. A library caller keeps the additive no-fail behavior.
|
|
64
64
|
const message = declared ? adapterScoreFailureMessage(bundle) : undefined;
|
|
65
65
|
if (message !== undefined)
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { ActorPersonaRef, ActorTrace } from "../../actors/contract.js";
|
|
2
2
|
import type { LabScenarioCaps, LabRuntimeAuth } from "../../lab/types.js";
|
|
3
3
|
import { type RunBundle, type RunCostSummary, type BundleRun } from "../../run/bundle.js";
|
|
4
|
-
import type
|
|
4
|
+
import { type Verdict } from "../../run/judge.js";
|
|
5
5
|
import type { TerminalLedgers } from "./types.js";
|
|
6
6
|
/**
|
|
7
|
-
* Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change
|
|
8
|
-
* producer only).
|
|
7
|
+
* Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change: a new
|
|
8
|
+
* producer only). Dry run: a contract bundle. The terminal stream is a contract placeholder
|
|
9
9
|
* (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
|
|
10
10
|
* the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
|
|
11
11
|
* exist. The shipped live builder fills the same evidence contract. Exported for tests.
|
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import { redactText } from "../../evidence/redaction.js";
|
|
2
2
|
import { participantAssignment } from "../../lab/participant-assignment.js";
|
|
3
3
|
import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
|
|
4
|
+
import { verdictText } from "../../run/judge.js";
|
|
4
5
|
import {} from "../../run/streams.js";
|
|
5
6
|
import { participantEvent, participantIds, participantRecord, participantStream, } from "../../run/participant-records.js";
|
|
6
7
|
import { TERMINAL_EVENTS_ARTIFACT, TERMINAL_LEDGERS_ARTIFACT, TERMINAL_TRANSCRIPT_ARTIFACT, } from "../../run/terminal-contract.js";
|
|
7
8
|
import { describeMeasuredSpend, noSpendLineMeasured, noSpendNotEstablished } from "./ledger.js";
|
|
8
9
|
/**
|
|
9
|
-
* Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change
|
|
10
|
-
* producer only).
|
|
10
|
+
* Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change: a new
|
|
11
|
+
* producer only). Dry run: a contract bundle. The terminal stream is a contract placeholder
|
|
11
12
|
* (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
|
|
12
13
|
* the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
|
|
13
14
|
* exist. The shipped live builder fills the same evidence contract. Exported for tests.
|
|
14
15
|
*/
|
|
15
16
|
export function buildTerminalProductBundle(args) {
|
|
16
|
-
const reason = "
|
|
17
|
+
const reason = "Dry run: the terminal-product study was declared without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
|
|
17
18
|
// The terminal stream is a contract placeholder on the dry-run path: stdin is disabled and no
|
|
18
19
|
// exec output was captured, so the tail is empty and transport stays "snapshot", never "pty"
|
|
19
|
-
// (captured non-interactive exec output is never an interactive PTY
|
|
20
|
-
//
|
|
20
|
+
// (captured non-interactive exec output is never an interactive PTY). The shipped live builder
|
|
21
|
+
// fills terminal.tail from redacted exec-stream capture.
|
|
21
22
|
const { simulation, stream } = terminalParticipant(args, {
|
|
22
23
|
status: "contract_proof_only",
|
|
23
24
|
reason,
|
|
24
|
-
summary: `
|
|
25
|
+
summary: `Dry-run participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
|
|
25
26
|
updatedAt: args.run.createdAt,
|
|
26
27
|
stdin: args.stdin,
|
|
27
28
|
tail: "",
|
|
@@ -45,17 +46,17 @@ export function buildTerminalProductBundle(args) {
|
|
|
45
46
|
at: args.run.createdAt,
|
|
46
47
|
level: "info",
|
|
47
48
|
type: "terminal-lab.subject.declared",
|
|
48
|
-
//
|
|
49
|
+
// Provenance is recorded or its absence declared. The agent drives public surfaces
|
|
49
50
|
// and nothing is cloned, so the subject provenance is explicitly unpinned; evidence binds to the
|
|
50
51
|
// composed-prompt digest. Public surfaces are recorded (they are public by declaration).
|
|
51
|
-
message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}.
|
|
52
|
+
message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. humanish did not provision or clone the product, so its provenance is unpinned: a study of public pages has no commit to pin. The evidence is tied to the prompt digest ${args.persona.promptDigest}.`,
|
|
52
53
|
}),
|
|
53
54
|
participantEvent(TERMINAL_IDS, {
|
|
54
55
|
id: "event-002-credentials",
|
|
55
56
|
at: args.run.createdAt,
|
|
56
57
|
level: "info",
|
|
57
58
|
type: "terminal-lab.credentials.declared",
|
|
58
|
-
// Names-only evidence
|
|
59
|
+
// Names-only evidence: the runtime-auth channel is declared; no value is ever
|
|
59
60
|
// recorded. The deny-by-default policies are recorded so the credential posture is auditable.
|
|
60
61
|
message: `Runtime auth channel: ${args.runtimeAuth ?? "none declared"} (names only; values never persist; the live engine applies the selected key placement, while this dry-run performs no injection). Credential policies (deny-by-default): allowPrivateRepoAccess=${args.policies.allowPrivateRepoAccess}, allowProviderCredentials=${args.policies.allowProviderCredentials}, allowPaymentCredentials=${args.policies.allowPaymentCredentials}, allowGitHubMutation=${args.policies.allowGitHubMutation}.`,
|
|
61
62
|
}),
|
|
@@ -64,14 +65,14 @@ export function buildTerminalProductBundle(args) {
|
|
|
64
65
|
at: args.run.createdAt,
|
|
65
66
|
level: "info",
|
|
66
67
|
type: "terminal-lab.caps.declared",
|
|
67
|
-
message: `Spend
|
|
68
|
+
message: `Spend, job and time caps: ${capsText}. A live run uses the runtime key only while a cap is in force, and derives its no-spend proof from the recorded cost ledger. This dry run spends $0: it makes no model request.`,
|
|
68
69
|
}),
|
|
69
70
|
participantEvent(TERMINAL_IDS, {
|
|
70
71
|
id: "event-004-contract",
|
|
71
72
|
at: args.run.createdAt,
|
|
72
73
|
level: "info",
|
|
73
74
|
type: "terminal-lab.contract.ready",
|
|
74
|
-
message: "Dry-run
|
|
75
|
+
message: "Dry-run bundle ready. Switch scenario.mode to live with the required runtime auth and caps to exercise the in-sandbox agent route, captured exec stream, and declared runtime-auth placement.",
|
|
75
76
|
}),
|
|
76
77
|
];
|
|
77
78
|
const review = {
|
|
@@ -79,7 +80,7 @@ export function buildTerminalProductBundle(args) {
|
|
|
79
80
|
verdict: args.verdict,
|
|
80
81
|
summary: reason,
|
|
81
82
|
gaps: [
|
|
82
|
-
"This dry
|
|
83
|
+
"This dry run did not execute the live in-sandbox agent route; it checks the evidence shape only, not live behavior, scale, or adoption.",
|
|
83
84
|
"No exec-stream, transcript, substrate, cost, or cleanup artifacts were produced because no live session ran; live verification requires those artifacts.",
|
|
84
85
|
],
|
|
85
86
|
};
|
|
@@ -94,7 +95,7 @@ export function buildTerminalProductBundle(args) {
|
|
|
94
95
|
simulation,
|
|
95
96
|
stream,
|
|
96
97
|
events,
|
|
97
|
-
redactionNotes: "Dry-run
|
|
98
|
+
redactionNotes: "Dry-run bundle: no sandbox ran, no key was injected, no exec output was captured. The author mission is public-safe committed lab text (redacted defensively); the composed prompt is bound by digest. The shipped live path applies scrubKnownValues then redactText at the capture source before persistence.",
|
|
98
99
|
review,
|
|
99
100
|
});
|
|
100
101
|
}
|
|
@@ -167,8 +168,8 @@ export function buildLiveTerminalProductBundle(args) {
|
|
|
167
168
|
? []
|
|
168
169
|
: [`Agent session ended ${args.trace.status}: ${args.sessionReason}`]),
|
|
169
170
|
...(args.capFailure === undefined ? [] : [args.capFailure]),
|
|
170
|
-
//
|
|
171
|
-
// green run never silently over-claims a fully-proven $0.
|
|
171
|
+
// Measurement gap: the no-spend proof always declares which spend lines it could not measure,
|
|
172
|
+
// so a green run never silently over-claims a fully-proven $0.
|
|
172
173
|
...(noSpend.unmeasuredLines.length > 0
|
|
173
174
|
? [
|
|
174
175
|
`${noSpendLineMeasured(noSpend) ? noSpendNotEstablished(noSpend.maxUsd ?? 0) : "No-spend proof is partial."} ${describeMeasuredSpend(args.ledgers.cost, args.trace.tokenUsage)} An adapter may supply the missing signals through costProbe.`,
|
|
@@ -185,7 +186,7 @@ export function buildLiveTerminalProductBundle(args) {
|
|
|
185
186
|
simulation,
|
|
186
187
|
stream,
|
|
187
188
|
events: lifecycleEvents,
|
|
188
|
-
redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and
|
|
189
|
+
redactionNotes: `Live terminal-product run: the in-sandbox agent's output was captured via commands.run onStdout/onStderr and had known values (including the runtime key) scrubbed, then shape patterns redacted, before anything was stored. ${args.runtimeAuth === "openai-egress" ? `Runtime auth openai-egress: the raw key from ${args.runtimeAuthKeyName} is reserved for E2B's external api.openai.com HTTPS header transform. ${args.ledgers.commandLog.some((command) => command.label === "codex-exec") ? "Codex received an inert CODEX_API_KEY placeholder." : "Codex was not launched."} Any created sandbox retains a spendable OpenAI proxy capability until teardown; additional provider calls may not appear in the Codex usage ledger.` : `Runtime auth openai-env: the runtime key (${args.runtimeAuthKeyName}) was passed only to the codex command, never to sandbox-wide environment variables or metadata; only its name appears in evidence.`} Subject provenance is unpinned (a study of public pages).`,
|
|
189
190
|
review,
|
|
190
191
|
...(args.cost === undefined ? {} : { cost: args.cost }),
|
|
191
192
|
});
|
|
@@ -209,7 +210,7 @@ function terminalParticipant(args, session) {
|
|
|
209
210
|
const stream = participantStream(TERMINAL_IDS, {
|
|
210
211
|
assignment: participantAssignment({ mission: args.mission }),
|
|
211
212
|
kind: "terminal",
|
|
212
|
-
label: `Terminal agent
|
|
213
|
+
label: `Terminal agent · ${args.labId}`,
|
|
213
214
|
status: session.status,
|
|
214
215
|
transport: "snapshot",
|
|
215
216
|
updatedAt: session.updatedAt,
|
|
@@ -236,17 +237,17 @@ function terminalRunBundle(args, parts) {
|
|
|
236
237
|
persona: {
|
|
237
238
|
id: args.persona.id,
|
|
238
239
|
name: `Autonomous terminal agent (${args.persona.id})`,
|
|
239
|
-
source: `
|
|
240
|
+
source: `study:${args.labId}`,
|
|
240
241
|
sourceDigest: args.persona.promptDigest,
|
|
241
242
|
},
|
|
242
243
|
scenario: {
|
|
243
244
|
id: `terminal-${args.labId}`,
|
|
244
245
|
title: args.labTitle ?? `Terminal-product lab: ${args.labId}`,
|
|
245
|
-
// The author mission is public-safe committed lab text
|
|
246
|
+
// The author mission is public-safe committed lab text. It is recorded plaintext as the goal,
|
|
246
247
|
// redacted defensively before persisting (it never carries a secret, but the harness never
|
|
247
248
|
// trusts that). The full composed prompt is bound by digest, not text.
|
|
248
249
|
goal: redactText(args.mission),
|
|
249
|
-
source: `
|
|
250
|
+
source: `study:${args.labId}`,
|
|
250
251
|
sourceDigest: args.persona.promptDigest,
|
|
251
252
|
},
|
|
252
253
|
lifecycle: parts.lifecycle,
|
|
@@ -281,7 +282,7 @@ export function renderTerminalReviewMarkdown(bundle) {
|
|
|
281
282
|
"",
|
|
282
283
|
`- run: ${bundle.runId}`,
|
|
283
284
|
`- mode: ${bundle.mode}`,
|
|
284
|
-
`- verdict: ${bundle.review.verdict}`,
|
|
285
|
+
`- verdict: ${verdictText(bundle.review.verdict, bundle.mode)}`,
|
|
285
286
|
`- summary: ${bundle.review.summary}`,
|
|
286
287
|
`- mission: ${bundle.scenario.goal}`,
|
|
287
288
|
...(subject ? [`- subject: ${subject.message}`] : []),
|
|
@@ -18,17 +18,17 @@ export declare function buildRuntimeAuth(args: {
|
|
|
18
18
|
keyValue: string;
|
|
19
19
|
} | {
|
|
20
20
|
ok: false;
|
|
21
|
-
code: "
|
|
21
|
+
code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING" | "HUMANISH_TERMINAL_CREDENTIAL_DENIED";
|
|
22
22
|
message: string;
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
25
|
-
* Build the sandbox metadata from a positive allowlist
|
|
26
|
-
* way metadata is set on the terminal route
|
|
25
|
+
* Build the sandbox metadata from a positive allowlist. This is the only
|
|
26
|
+
* way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
|
|
27
27
|
* value that is not a plain short label. A verifier check asserts the persisted metadata has no
|
|
28
28
|
* prompt/token/secret shapes; this builder makes that true by construction.
|
|
29
29
|
*/
|
|
30
30
|
export declare function buildSandboxMetadata(allowlist: {
|
|
31
31
|
labId: string;
|
|
32
|
-
|
|
32
|
+
recordId: string;
|
|
33
33
|
runId: string;
|
|
34
34
|
}): Record<string, string>;
|
|
@@ -12,13 +12,13 @@ export function buildRuntimeAuth(args) {
|
|
|
12
12
|
// (developers.openai.com/codex/noninteractive) document it as the channel for a single codex exec
|
|
13
13
|
// invocation, which is exactly this route's shape (no persisted auth.json/CODEX_HOME, per-command
|
|
14
14
|
// envs only). A dated in-repo receipt
|
|
15
|
-
// (docs/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
|
|
15
|
+
// (docs/history/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
|
|
16
16
|
// job-wide OPENAI_API_KEY alone failing bearer auth for this same pinned-exec pattern. When the
|
|
17
17
|
// operator only exported OPENAI_API_KEY, its value is also injected under CODEX_API_KEY below, so
|
|
18
18
|
// the documented exec auth channel is always populated regardless of which name the operator
|
|
19
19
|
// used. The allowlist is exactly these two names; everything else is denied by construction.
|
|
20
20
|
const ALLOWED_RUNTIME_KEY_NAMES = ["CODEX_API_KEY", "OPENAI_API_KEY"];
|
|
21
|
-
// Tripwire (
|
|
21
|
+
// Tripwire (deny-by-default credentials): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
|
|
22
22
|
// added a clearly-non-runtime credential (a GitHub/payment/deploy/db secret), fail closed. The
|
|
23
23
|
// generic `*_KEY` shape is deliberately left out of the tripwire, since a runtime key legitimately
|
|
24
24
|
// ends in _KEY (CODEX_API_KEY/OPENAI_API_KEY), so testing it against the generic shape would
|
|
@@ -29,7 +29,7 @@ export function buildRuntimeAuth(args) {
|
|
|
29
29
|
if (ALLOWED_RUNTIME_KEY_NAMES.some((name) => isNonRuntimeCredentialName(name))) {
|
|
30
30
|
return {
|
|
31
31
|
ok: false,
|
|
32
|
-
code: "
|
|
32
|
+
code: "HUMANISH_TERMINAL_CREDENTIAL_DENIED",
|
|
33
33
|
message: "Internal invariant violated: a runtime-key allowlist entry is a non-runtime credential (GitHub/payment/deploy/db).",
|
|
34
34
|
};
|
|
35
35
|
}
|
|
@@ -37,7 +37,7 @@ export function buildRuntimeAuth(args) {
|
|
|
37
37
|
if (!keyName) {
|
|
38
38
|
return {
|
|
39
39
|
ok: false,
|
|
40
|
-
code: "
|
|
40
|
+
code: "HUMANISH_TERMINAL_RUNTIME_AUTH_MISSING",
|
|
41
41
|
message: `Live terminal-product labs declare runtimeAuth "${String(args.runtimeAuth)}" and need ${ALLOWED_RUNTIME_KEY_NAMES.join(" or ")} in the environment (pass via --env-file; the selected auth mode places the value in command-scoped env or an external E2B header transform; the value is never persisted).`,
|
|
42
42
|
};
|
|
43
43
|
}
|
|
@@ -84,8 +84,8 @@ function isNonRuntimeCredentialName(name) {
|
|
|
84
84
|
return NON_RUNTIME_CREDENTIAL_NAME_PATTERNS.some((pattern) => pattern.test(name));
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
|
-
* Build the sandbox metadata from a positive allowlist
|
|
88
|
-
* way metadata is set on the terminal route
|
|
87
|
+
* Build the sandbox metadata from a positive allowlist. This is the only
|
|
88
|
+
* way metadata is set on the terminal route. It carries solely non-secret labels and rejects any
|
|
89
89
|
* value that is not a plain short label. A verifier check asserts the persisted metadata has no
|
|
90
90
|
* prompt/token/secret shapes; this builder makes that true by construction.
|
|
91
91
|
*/
|
|
@@ -95,7 +95,7 @@ export function buildSandboxMetadata(allowlist) {
|
|
|
95
95
|
tool: TERMINAL_PRODUCT_LAB_PROVIDER_METADATA.tool,
|
|
96
96
|
provider: "codex",
|
|
97
97
|
labId: allowlist.labId,
|
|
98
|
-
|
|
98
|
+
recordId: allowlist.recordId,
|
|
99
99
|
// The run id is a harness-minted token (terminal-<ts>-<hex>), not user data.
|
|
100
100
|
runId: allowlist.runId,
|
|
101
101
|
};
|
|
@@ -9,7 +9,8 @@ import { buildTerminalProductBundle, renderTerminalReviewMarkdown } from "./bund
|
|
|
9
9
|
import { resolveTerminalPersona, terminalPersonaRef } from "./persona.js";
|
|
10
10
|
import { declaredRuntimeProvenance } from "./runtime.js";
|
|
11
11
|
import { defaultMission, makeTerminalRunId } from "./session.js";
|
|
12
|
-
import {
|
|
12
|
+
import {} from "./types.js";
|
|
13
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
13
14
|
/**
|
|
14
15
|
* The dry-run path: a contract bundle with the persona and prompt digest bound, published through
|
|
15
16
|
* the run scope with no sandbox, key or spend.
|
|
@@ -82,10 +83,9 @@ export async function runDryTerminalLab(args) {
|
|
|
82
83
|
const ok = resultOk({ judgment, execution, scorerFailures: [], policy });
|
|
83
84
|
await finished.recordOutcome({ ok, execution });
|
|
84
85
|
return {
|
|
85
|
-
|
|
86
|
+
...studyResultIdentity("terminal", plan.labId),
|
|
86
87
|
ok,
|
|
87
88
|
cwd,
|
|
88
|
-
labId: plan.labId,
|
|
89
89
|
actor: plan.actor,
|
|
90
90
|
product: product.name,
|
|
91
91
|
dryRun: true,
|
|
@@ -96,7 +96,7 @@ export async function runDryTerminalLab(args) {
|
|
|
96
96
|
? {}
|
|
97
97
|
: {
|
|
98
98
|
error: {
|
|
99
|
-
code: "
|
|
99
|
+
code: "HUMANISH_TERMINAL_FAILED",
|
|
100
100
|
message: observer.error?.message ?? "Observer failed for the terminal-product lab run.",
|
|
101
101
|
},
|
|
102
102
|
}),
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// as a replacement glyph. Every ASCII character on the same screen was fine, which is exactly the
|
|
7
7
|
// signature.
|
|
8
8
|
//
|
|
9
|
-
// The
|
|
9
|
+
// The fix is not "stop using em dashes". It is to ask what the terminal can render and mean
|
|
10
10
|
// it. A surface that emits characters its own terminal cannot decode is not being expressive, it is
|
|
11
11
|
// producing garbage that reads as a bug in the tool.
|
|
12
12
|
const UTF8 = /utf-?8/i;
|
|
@@ -23,7 +23,7 @@ export function terminalRendersUnicode(env = process.env) {
|
|
|
23
23
|
const declared = env.LC_ALL ?? env.LC_CTYPE ?? env.LANG;
|
|
24
24
|
if (declared === undefined || declared.trim().length === 0) {
|
|
25
25
|
// Nothing declared at all. A bare login shell on a stock image lands here, and that is the
|
|
26
|
-
// case the participant hit
|
|
26
|
+
// case the participant hit. Assume it cannot, because the failure is silent and ugly while
|
|
27
27
|
// the fallback is merely plainer.
|
|
28
28
|
return false;
|
|
29
29
|
}
|
|
@@ -3,7 +3,7 @@ import type { LabScenarioCaps } from "../../lab/types.js";
|
|
|
3
3
|
import { type CostCategory } from "../../run/terminal-contract.js";
|
|
4
4
|
import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
|
|
5
5
|
/**
|
|
6
|
-
* Build the spend ledger from the captured session. The null discipline
|
|
6
|
+
* Build the spend ledger from the captured session. The null discipline:
|
|
7
7
|
* - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
|
|
8
8
|
* carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
|
|
9
9
|
* provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
|
|
@@ -14,7 +14,7 @@ import type { CostLine, NoSpendProof, TerminalCostLedger } from "./types.js";
|
|
|
14
14
|
*/
|
|
15
15
|
export declare function buildCostLedger(args: {
|
|
16
16
|
tokenCostUsd?: number;
|
|
17
|
-
/** Measured token counts, when the run produced them but no rate could price them
|
|
17
|
+
/** Measured token counts, when the run produced them but no rate could price them. */
|
|
18
18
|
tokenUsage?: ActorTokenUsage;
|
|
19
19
|
injectedLines?: Partial<Record<CostCategory, CostLine>>;
|
|
20
20
|
}): TerminalCostLedger;
|
|
@@ -32,7 +32,7 @@ export declare function noSpendNotEstablished(maxUsd: number): string;
|
|
|
32
32
|
*/
|
|
33
33
|
export declare function describeMeasuredSpend(ledger: TerminalCostLedger, tokenUsage?: ActorTokenUsage): string;
|
|
34
34
|
/** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
|
|
35
|
-
* explicitly lists the unmeasured (null) lines it cannot vouch for
|
|
35
|
+
* explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
|
|
36
36
|
export declare function buildNoSpendProof(ledger: TerminalCostLedger, maxUsd: number | null, tokenUsage?: ActorTokenUsage): NoSpendProof;
|
|
37
37
|
/**
|
|
38
38
|
* Fail-closed caps enforcement. Returns a structured violation when a known
|
|
@@ -2,7 +2,7 @@ import { describeTokenUsage } from "./token-usage.js";
|
|
|
2
2
|
import { round6 } from "../../run/pricing.js";
|
|
3
3
|
import { COST_CATEGORIES } from "../../run/terminal-contract.js";
|
|
4
4
|
/**
|
|
5
|
-
* Build the spend ledger from the captured session. The null discipline
|
|
5
|
+
* Build the spend ledger from the captured session. The null discipline:
|
|
6
6
|
* - The `provider` line is populated from the actor trace's tokenUsage.costUsd when the trace
|
|
7
7
|
* carries it (a measured value, incl. a measured 0). When the trace carries no costUsd, the
|
|
8
8
|
* provider line is `null` = not measured (never guessed to 0 just because no-spend was intended).
|
|
@@ -22,24 +22,24 @@ export function buildCostLedger(args) {
|
|
|
22
22
|
? {
|
|
23
23
|
// Tokens counted, no rate to price them. This stays `usd: null` because a guessed
|
|
24
24
|
// dollar figure would be worse than none, but the note carries the measured fact so a
|
|
25
|
-
// reader never mistakes "no charge recorded" for "nothing was consumed"
|
|
25
|
+
// reader never mistakes "no charge recorded" for "nothing was consumed".
|
|
26
26
|
usd: null,
|
|
27
27
|
source: "unpriced-token-usage",
|
|
28
|
-
note: `Provider spend
|
|
29
|
-
"but the terminal participant records the model as `codex` and
|
|
30
|
-
"
|
|
31
|
-
"
|
|
28
|
+
note: `Provider spend unpriced: the run consumed ${describeTokenUsage(args.tokenUsage)}, ` +
|
|
29
|
+
"but the terminal participant records the model as `codex` and humanish has no rate " +
|
|
30
|
+
"for it, so no dollar figure is given. The token count is measured; the price is " +
|
|
31
|
+
"not known. Recorded as null, never guessed as 0.",
|
|
32
32
|
}
|
|
33
33
|
: {
|
|
34
34
|
usd: null,
|
|
35
35
|
source: "unmeasured",
|
|
36
|
-
note: "Provider spend
|
|
36
|
+
note: "Provider spend not measured: the actor trace carried no tokenUsage.costUsd in this run, so it is recorded as null and not guessed as 0.",
|
|
37
37
|
};
|
|
38
38
|
const unmeasured = (category) => ({
|
|
39
39
|
usd: null,
|
|
40
40
|
count: null,
|
|
41
41
|
source: "unmeasured",
|
|
42
|
-
note: `${category} spend
|
|
42
|
+
note: `${category} spend not measured: humanish has no ${category} spend signal for this run, and an adapter may supply one through costProbe. Recorded as null, never guessed as 0.`,
|
|
43
43
|
});
|
|
44
44
|
const lines = {
|
|
45
45
|
product: args.injectedLines?.product ?? unmeasured("product"),
|
|
@@ -99,7 +99,7 @@ export function describeMeasuredSpend(ledger, tokenUsage) {
|
|
|
99
99
|
.join(" ");
|
|
100
100
|
}
|
|
101
101
|
/** Derive the no-spend proof from the ledger. It vouches for known-zero lines and
|
|
102
|
-
* explicitly lists the unmeasured (null) lines it cannot vouch for
|
|
102
|
+
* explicitly lists the unmeasured (null) lines it cannot vouch for. It never claims zero on null. */
|
|
103
103
|
export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
|
|
104
104
|
const knownZeroLines = [];
|
|
105
105
|
const knownNonZeroLines = [];
|
|
@@ -115,14 +115,14 @@ export function buildNoSpendProof(ledger, maxUsd, tokenUsage) {
|
|
|
115
115
|
}
|
|
116
116
|
// satisfied only when every known line is within the cap (for a no-spend run, maxUsd 0 => every
|
|
117
117
|
// known line must be exactly 0). Unmeasured lines never make it satisfied; they are reported
|
|
118
|
-
// separately as the proof's
|
|
118
|
+
// separately as the proof's blind spot.
|
|
119
119
|
const cap = maxUsd ?? 0;
|
|
120
120
|
const satisfied = knownNonZeroLines.length === 0 && ledger.knownTotalUsd <= cap;
|
|
121
121
|
const verdict = !satisfied
|
|
122
|
-
? `No-spend proof
|
|
122
|
+
? `No-spend proof not satisfied for maxUsd=${cap}: known spend total ${ledger.knownTotalUsd} USD${knownNonZeroLines.length > 0 ? ` (non-zero: ${knownNonZeroLines.join(", ")})` : ""}.`
|
|
123
123
|
: noSpendLineMeasured({ knownZeroLines, knownNonZeroLines })
|
|
124
124
|
? noSpendNotEstablished(cap)
|
|
125
|
-
: `No-spend proof
|
|
125
|
+
: `No-spend proof satisfied for maxUsd=${cap} on the measured lines (known total ${ledger.knownTotalUsd} USD).`;
|
|
126
126
|
const statement = [verdict, describeMeasuredSpend(ledger, tokenUsage)]
|
|
127
127
|
.filter((part) => part.length > 0)
|
|
128
128
|
.join(" ");
|
|
@@ -149,7 +149,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
|
|
|
149
149
|
const overLines = COST_CATEGORIES.filter((c) => ledger.lines[c].usd !== null && ledger.lines[c].usd > 0);
|
|
150
150
|
return {
|
|
151
151
|
ok: false,
|
|
152
|
-
message: `
|
|
152
|
+
message: `Stopped: measured spend ${ledger.knownTotalUsd} USD passed scenario.caps.maxUsd=${caps.maxUsd}${overLines.length > 0 ? ` (non-zero lines: ${overLines.join(", ")})` : ""}. The cap stops the run; it is not a warning.`,
|
|
153
153
|
};
|
|
154
154
|
}
|
|
155
155
|
if (caps.maxJobs !== undefined) {
|
|
@@ -162,7 +162,7 @@ export function evaluateCapsAgainstLedger(ledger, caps) {
|
|
|
162
162
|
if (knownJobs > caps.maxJobs) {
|
|
163
163
|
return {
|
|
164
164
|
ok: false,
|
|
165
|
-
message: `
|
|
165
|
+
message: `Stopped: ${knownJobs} measured billable jobs passed scenario.caps.maxJobs=${caps.maxJobs}.`,
|
|
166
166
|
};
|
|
167
167
|
}
|
|
168
168
|
}
|
|
@@ -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
|
|
@@ -56,7 +56,7 @@ export class LiveTerminalSandbox {
|
|
|
56
56
|
const { warnings } = this.inputs;
|
|
57
57
|
const { recordLifecycle } = this.inputs.recorder;
|
|
58
58
|
const { requestTimeoutMs, sandboxTimeoutMs } = this;
|
|
59
|
-
// Declared egress allowlist, or undefined for the historical unrestricted default
|
|
59
|
+
// Declared egress allowlist, or undefined for the historical unrestricted default.
|
|
60
60
|
const egressAllow = plan.egressAllow;
|
|
61
61
|
const sandboxModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
|
|
62
62
|
this.module = sandboxModule;
|
|
@@ -99,7 +99,7 @@ export class LiveTerminalSandbox {
|
|
|
99
99
|
this.sandboxId = sandboxId;
|
|
100
100
|
this.createdAtMs = now();
|
|
101
101
|
await validatePreparedRunArtifactPaths(runPaths);
|
|
102
|
-
recordLifecycle("terminal-lab.sandbox.created", `E2B shell sandbox ${sandboxId} created with
|
|
102
|
+
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
103
|
const sandboxResources = await observeDesktopResources(sandbox);
|
|
104
104
|
this.resources = sandboxResources;
|
|
105
105
|
if ("reason" in sandboxResources) {
|
|
@@ -108,7 +108,7 @@ export class LiveTerminalSandbox {
|
|
|
108
108
|
// The allowlist is evidence: a reader of the ledger can see exactly what the participant was
|
|
109
109
|
// able to reach, without the ledger carrying any secret.
|
|
110
110
|
recordLifecycle("terminal-lab.egress.policy", egressAllow === undefined
|
|
111
|
-
? "Egress
|
|
111
|
+
? "Egress is unrestricted (no execution.egressAllow declared)."
|
|
112
112
|
: `Egress routing allowlist: ${egressAllow.length} declared host(s): ${egressAllow.join(", ")}; deny-all fallback. Domain routing is not strict destination isolation on shared infrastructure.`);
|
|
113
113
|
recordLifecycle("terminal-lab.runtime-auth", runtimeEnv.mode === "openai-egress"
|
|
114
114
|
? "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."
|
|
@@ -131,7 +131,7 @@ export class LiveTerminalSandbox {
|
|
|
131
131
|
const { requestTimeoutMs } = this;
|
|
132
132
|
// --- Runtime bootstrap: no runtime env; openai-egress proxy capability is already available. ---
|
|
133
133
|
// 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
|
|
134
|
+
// installation or install the pinned official binary after checksum verification.
|
|
135
135
|
// No raw runtime key touches this step; the egress proxy, when selected, is already available.
|
|
136
136
|
const bootstrapStartedAt = now();
|
|
137
137
|
let bootstrapError;
|
|
@@ -149,7 +149,7 @@ export class LiveTerminalSandbox {
|
|
|
149
149
|
}
|
|
150
150
|
const bootstrapDurationMs = Math.max(0, now() - bootstrapStartedAt);
|
|
151
151
|
recordLifecycle("terminal-lab.runtime.bootstrapped", bootstrapError
|
|
152
|
-
? `Runtime bootstrap
|
|
152
|
+
? `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
153
|
: `Runtime bootstrap ensured Node/npm present in ${bootstrapDurationMs}ms (codex exec runs via npx).`);
|
|
154
154
|
if (bootstrapError) {
|
|
155
155
|
// Fail closed as a structured route status (never a raw throw): no codex exec is attempted
|
|
@@ -259,7 +259,7 @@ export class LiveTerminalSandbox {
|
|
|
259
259
|
const setup = await this.sandbox.commands.run(`${uploadAssignment}cd ${SANDBOX_WORKDIR} && ${install}`, {
|
|
260
260
|
// The install step may run the product itself (release:dogfood's does: `humanish init
|
|
261
261
|
// --yes`); on the 0.67.0 dogfood that one command arrived unmarked while the participant's
|
|
262
|
-
// nine others carried the marker
|
|
262
|
+
// nine others carried the marker.
|
|
263
263
|
envs: { HUMANISH_STUDY_PARTICIPANT: "1" },
|
|
264
264
|
requestTimeoutMs,
|
|
265
265
|
timeoutMs: PRODUCT_SETUP_TIMEOUT_MS,
|
|
@@ -272,7 +272,7 @@ export class LiveTerminalSandbox {
|
|
|
272
272
|
setupError = toErrorMessage(error);
|
|
273
273
|
}
|
|
274
274
|
recordLifecycle("terminal-lab.product.prepared", setupError
|
|
275
|
-
? `Product setup
|
|
275
|
+
? `Product setup failed after ${Math.max(0, now() - setupStartedAt)}ms: ${sanitize(setupError)}`
|
|
276
276
|
: `Product setup completed in ${Math.max(0, now() - setupStartedAt)}ms (no runtime env; declared egress auth may already be available).`);
|
|
277
277
|
if (setupError) {
|
|
278
278
|
this.status = "failed";
|
|
@@ -292,8 +292,8 @@ export class LiveTerminalSandbox {
|
|
|
292
292
|
const { requestTimeoutMs, wallClockMs } = this;
|
|
293
293
|
// --- The keyed run: `codex exec --json` non-interactively (stdin disabled). ---
|
|
294
294
|
// 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
|
|
295
|
+
// never wired: commands.run takes no stdin channel. The command's
|
|
296
|
+
// wall-clock is bounded by maxMinutes: commands.run timeoutMs +
|
|
297
297
|
// an injected-clock guard so a mock/real run that exceeds it is killed and fails closed.
|
|
298
298
|
const codexCommand = buildCodexExecCommand({
|
|
299
299
|
workdir: SANDBOX_WORKDIR,
|
|
@@ -312,8 +312,7 @@ export class LiveTerminalSandbox {
|
|
|
312
312
|
const result = await runWithWallClock(this.sandbox.commands.run(codexCommand, {
|
|
313
313
|
// The selected command env (raw key or inert placeholder). The participant
|
|
314
314
|
// 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.
|
|
315
|
+
// adopter otherwise.
|
|
317
316
|
envs: { ...runtimeEnv.envs, HUMANISH_STUDY_PARTICIPANT: "1" },
|
|
318
317
|
requestTimeoutMs,
|
|
319
318
|
timeoutMs: wallClockMs,
|
|
@@ -404,7 +403,7 @@ export class LiveTerminalSandbox {
|
|
|
404
403
|
const { now, sanitize, warnings } = this.inputs;
|
|
405
404
|
const { recordLifecycle } = this.inputs.recorder;
|
|
406
405
|
const { requestTimeoutMs } = this;
|
|
407
|
-
// ---
|
|
406
|
+
// --- Proven cleanup, by exact id, never Sandbox.list. ---
|
|
408
407
|
this.cleanup = await teardownSandbox({
|
|
409
408
|
allocation: this.allocation,
|
|
410
409
|
sandboxModule: this.module,
|
|
@@ -439,7 +438,7 @@ function buildCodexExecCommand(args) {
|
|
|
439
438
|
// the prompt rides as the final positional arg, shell-quoted. codex exec --json runs once and
|
|
440
439
|
// exits (no interactive loop). --skip-git-repo-check: the workdir is a fresh scratch dir.
|
|
441
440
|
// Pinned via npx (never an ambient/preinstalled `codex` binary, which the stock @e2b/desktop
|
|
442
|
-
// image does not ship
|
|
441
|
+
// image does not ship); npm_config_update_notifier=false silences npx's own
|
|
443
442
|
// update check so it cannot leak into the captured stdout the scorer/redactor parse.
|
|
444
443
|
const quotedPrompt = shellQuote(args.prompt);
|
|
445
444
|
// --dangerously-bypass-approvals-and-sandbox: codex's own inner sandbox is
|
|
@@ -10,7 +10,7 @@ import { prepareSelectedOutputDirectory } from "../../run/contained-output.js";
|
|
|
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);
|