humanish 0.106.1 → 0.107.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/AGENTS.md +4 -4
- package/ARCHITECTURE.md +17 -16
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +42 -39
- package/CONTRIBUTING.md +8 -8
- package/README.md +8 -3
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/qualified-versions.d.ts +30 -3
- package/dist/actors/codex/qualified-versions.js +50 -5
- package/dist/actors/codex/restricted-executable.d.ts +24 -0
- package/dist/actors/codex/restricted-executable.js +97 -22
- package/dist/actors/codex/restricted-launch.d.ts +7 -1
- package/dist/actors/codex/restricted-launch.js +42 -3
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +60 -2
- package/dist/actors/codex/restricted-policy.d.ts +9 -1
- package/dist/actors/codex/restricted-session.d.ts +14 -1
- package/dist/actors/codex/restricted-session.js +50 -17
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +1 -1
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/loop/backstop.js +1 -1
- package/dist/actors/computer-use/loop/ending.d.ts +2 -2
- package/dist/actors/computer-use/loop/ending.js +2 -2
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +3 -3
- package/dist/actors/computer-use/loop/trace.js +2 -2
- package/dist/actors/computer-use/loop/types.d.ts +14 -5
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-provider.d.ts +1 -1
- package/dist/actors/computer-use/openai-provider.js +2 -2
- package/dist/actors/contract.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +1 -1
- package/dist/actors/scripted-browser/actor.d.ts +2 -2
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +18 -0
- package/dist/actors/scripted-browser/types.d.ts +11 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +31 -12
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +4 -2
- package/dist/cli/commands/comms.js +8 -1
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +26 -14
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +3 -4
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +0 -1
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +76 -45
- package/dist/cli/commands/lab-scorer.d.ts +0 -2
- package/dist/cli/commands/lab.js +12 -6
- package/dist/cli/commands/observe.js +22 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +10 -8
- package/dist/cli/commands/watch.js +12 -10
- package/dist/cli/doctor.d.ts +3 -0
- package/dist/cli/doctor.js +10 -2
- package/dist/cli/io.d.ts +5 -4
- package/dist/cli/io.js +12 -8
- package/dist/cli/program.js +3 -3
- package/dist/cli/renamed-options.d.ts +11 -0
- package/dist/cli/renamed-options.js +18 -0
- package/dist/cli/telemetry.d.ts +2 -2
- package/dist/cli/telemetry.js +1 -1
- package/dist/comms/capture-surface.d.ts +1 -1
- package/dist/comms/catch-host.d.ts +1 -1
- package/dist/comms/connections.js +4 -4
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/types.js +1 -1
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/redaction.js +1 -1
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +7 -9
- package/dist/feedback/export-bundle.js +4 -4
- package/dist/feedback/export.js +9 -9
- package/dist/feedback/feedback.d.ts +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.js +3 -6
- package/dist/keys/key-resolution.d.ts +3 -1
- package/dist/keys/key-resolution.js +18 -16
- package/dist/lab/adapter-extension.d.ts +28 -6
- package/dist/lab/adapter-extension.js +65 -126
- package/dist/lab/adapter-scorer-loader.d.ts +25 -5
- package/dist/lab/adapter-scorer-loader.js +24 -0
- package/dist/lab/composition-rules.js +20 -20
- package/dist/lab/config.js +28 -26
- package/dist/lab/device-presets.d.ts +2 -2
- package/dist/lab/discover.js +1 -3
- package/dist/lab/doctor.d.ts +44 -9
- package/dist/lab/doctor.js +149 -41
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/keys.js +1 -1
- package/dist/lab/lab-deps.d.ts +85 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +8 -7
- package/dist/lab/parse/comms.js +3 -2
- package/dist/lab/parse/execution.js +3 -2
- package/dist/lab/parse/subject-state.js +2 -1
- package/dist/lab/parse/subject.js +2 -1
- package/dist/lab/parse/values.d.ts +0 -1
- package/dist/lab/parse/values.js +0 -3
- package/dist/lab/persona-resolve.d.ts +3 -3
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +5 -5
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +22 -4
- package/dist/lab/plan.d.ts +3 -11
- package/dist/lab/plan.js +18 -42
- package/dist/lab/preflight-result.js +0 -2
- package/dist/lab/preflight.d.ts +0 -3
- package/dist/lab/preflight.js +1 -1
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +19 -24
- package/dist/lab/routing.js +14 -47
- package/dist/lab/run-lab-events.d.ts +6 -11
- package/dist/lab/run-lab-events.js +3 -11
- package/dist/lab/run-lab-homes.d.ts +64 -0
- package/dist/lab/run-lab-homes.js +3 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +45 -275
- package/dist/lab/summary.d.ts +9 -4
- package/dist/lab/summary.js +15 -8
- package/dist/lab/types.d.ts +132 -132
- package/dist/lab/validation.d.ts +15 -15
- package/dist/lab/validation.js +28 -28
- package/dist/lab/warnings.js +20 -19
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +3 -3
- package/dist/observer/data.js +2 -2
- package/dist/observer/render.js +2 -2
- package/dist/observer/run-routes.d.ts +1 -1
- package/dist/observer/run-routes.js +5 -5
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +34 -3
- package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
- package/dist/routes/computer-use/bundle-parts.js +10 -3
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +9 -15
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +10 -10
- package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +29 -17
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +25 -29
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +19 -27
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +12 -11
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +39 -66
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +10 -10
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +19 -11
- package/dist/routes/computer-use/participant-model.js +49 -25
- package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
- package/dist/routes/computer-use/participant-prompt.js +4 -4
- package/dist/routes/computer-use/participant-runs.d.ts +6 -6
- package/dist/routes/computer-use/participant-runs.js +8 -8
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +52 -60
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +20 -16
- package/dist/routes/computer-use/rerun-selection.js +10 -6
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +40 -30
- package/dist/routes/computer-use/route.d.ts +3 -4
- package/dist/routes/computer-use/route.js +21 -19
- package/dist/routes/computer-use/self-report.d.ts +2 -2
- package/dist/routes/computer-use/self-report.js +4 -4
- package/dist/routes/computer-use/setup.d.ts +8 -14
- package/dist/routes/computer-use/setup.js +96 -72
- package/dist/routes/computer-use/single-bundle.d.ts +8 -11
- package/dist/routes/computer-use/single-bundle.js +20 -25
- package/dist/routes/computer-use/subject-projection.d.ts +5 -7
- package/dist/routes/computer-use/subject-projection.js +20 -19
- package/dist/routes/computer-use/types.d.ts +169 -210
- package/dist/routes/computer-use/types.js +13 -5
- package/dist/routes/preview.js +0 -1
- package/dist/routes/scripted/bundle.d.ts +3 -6
- package/dist/routes/scripted/bundle.js +11 -16
- package/dist/routes/scripted/plan.d.ts +5 -7
- package/dist/routes/scripted/plan.js +6 -4
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +10 -6
- package/dist/routes/scripted/route.js +10 -11
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +1 -1
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +22 -21
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +9 -5
- package/dist/routes/scripted/surface-records.js +1 -1
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +19 -36
- package/dist/routes/scripted/types.js +1 -2
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
- package/dist/routes/shared-world/bundle.d.ts +2 -2
- package/dist/routes/shared-world/bundle.js +22 -26
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +4 -4
- package/dist/routes/shared-world/comms.d.ts +5 -4
- package/dist/routes/shared-world/comms.js +28 -41
- package/dist/routes/shared-world/external-public.d.ts +5 -5
- package/dist/routes/shared-world/external-public.js +19 -20
- package/dist/routes/shared-world/handoff.d.ts +4 -4
- package/dist/routes/shared-world/handoff.js +50 -50
- package/dist/routes/shared-world/lobby-code.d.ts +5 -5
- package/dist/routes/shared-world/lobby-code.js +13 -13
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +43 -48
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +1 -2
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +46 -40
- package/dist/routes/shared-world/result.js +31 -19
- package/dist/routes/shared-world/route.js +37 -41
- package/dist/routes/shared-world/setup.d.ts +5 -4
- package/dist/routes/shared-world/setup.js +12 -14
- package/dist/routes/shared-world/types.d.ts +53 -126
- package/dist/routes/shared-world/types.js +2 -2
- package/dist/routes/terminal/adapter.d.ts +8 -8
- package/dist/routes/terminal/adapter.js +28 -125
- package/dist/routes/terminal/bundle.d.ts +7 -12
- package/dist/routes/terminal/bundle.js +24 -34
- package/dist/routes/terminal/credentials.d.ts +2 -2
- package/dist/routes/terminal/credentials.js +16 -16
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +9 -11
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +6 -6
- package/dist/routes/terminal/ledger.js +9 -9
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +21 -20
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +20 -20
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +13 -9
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +4 -4
- package/dist/routes/terminal/route.js +26 -26
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +3 -3
- package/dist/routes/terminal/sandbox.js +9 -9
- package/dist/routes/terminal/session.js +16 -14
- package/dist/routes/terminal/token-usage.js +5 -5
- package/dist/routes/terminal/trace.d.ts +5 -8
- package/dist/routes/terminal/trace.js +9 -64
- package/dist/routes/terminal/types.d.ts +85 -93
- package/dist/routes/terminal/types.js +9 -4
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +4 -4
- package/dist/run/bundle.d.ts +63 -56
- package/dist/run/bundle.js +9 -8
- package/dist/run/cost-summary.js +3 -2
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +10 -10
- package/dist/run/detail.d.ts +5 -5
- package/dist/run/detail.js +6 -6
- package/dist/run/dry-run.js +5 -12
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +16 -4
- package/dist/run/judge.js +24 -7
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +19 -9
- package/dist/run/pricing.js +30 -18
- package/dist/run/projection.d.ts +13 -13
- package/dist/run/projection.js +8 -8
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +13 -3
- package/dist/run/results.d.ts +1 -1
- package/dist/run/run-index.d.ts +1 -1
- package/dist/run/run-index.js +11 -11
- package/dist/run/run.d.ts +4 -2
- package/dist/run/run.js +9 -5
- package/dist/run/sandbox-receipts.d.ts +4 -4
- package/dist/run/sandbox-receipts.js +4 -4
- package/dist/run/shared-world-evidence.d.ts +47 -47
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +11 -11
- package/dist/run/stats.d.ts +5 -5
- package/dist/run/stats.js +8 -8
- package/dist/run/status.d.ts +16 -6
- package/dist/run/status.js +31 -8
- package/dist/run/streams.d.ts +26 -19
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +36 -34
- package/dist/run-lab.js +41 -37
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +1 -1
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +2 -2
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +5 -5
- package/dist/subject/serve.js +1 -1
- package/dist/subject/steps.d.ts +4 -4
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
- package/dist/substrates/e2b/cdp-probe.js +1 -1
- package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
- package/dist/substrates/e2b/desktop-browser.js +4 -4
- package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
- package/dist/substrates/e2b/desktop-cdp.js +4 -4
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +3 -3
- package/dist/substrates/e2b/desktop-media.js +2 -2
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.js +2 -2
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +7 -5
- package/dist/tui/actions.js +18 -9
- package/dist/tui-app.js +42 -42
- package/dist/verify/actor.d.ts +10 -10
- package/dist/verify/actor.js +15 -15
- package/dist/verify/artifacts.d.ts +1 -1
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/costs.d.ts +2 -2
- package/dist/verify/costs.js +2 -2
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world.js +2 -2
- package/dist/verify/verify.js +6 -6
- package/docs/README.md +1 -1
- package/docs/architecture/actor-contract.md +60 -22
- package/docs/architecture/desktop-sessions.md +9 -9
- package/docs/architecture/external-public-shared-world.md +5 -0
- package/docs/architecture/observer.md +4 -4
- package/docs/architecture/restricted-codex-analysis.md +36 -2
- package/docs/architecture/state-driven-executor.md +4 -5
- package/docs/architecture/task-protocol-support.md +3 -5
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
- package/docs/contracts/run-bundle.md +10 -8
- package/docs/contracts/schemas.md +109 -53
- package/docs/contracts/study-analysis.md +24 -0
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/product/automatic-analysis.md +1 -0
- package/docs/ramp/README.md +2 -1
- package/package.json +4 -4
- package/skills/humanish/SKILL.md +3 -2
- package/skills/humanish/agents/openai.yaml +1 -1
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import type { ActorTrace } from "../../actors/contract.js";
|
|
2
2
|
import { type RunBundle, type RunScorerProvenance } from "../../run/bundle.js";
|
|
3
3
|
import { type ScorerOutcome } from "../../lab/adapter-extension.js";
|
|
4
|
-
import type { TerminalLedgers,
|
|
4
|
+
import type { TerminalLedgers, TerminalScorer } from "./types.js";
|
|
5
5
|
/**
|
|
6
6
|
* Run the layer-6 product-adapter extension seam (issue #154 acceptance #8) over the assembled
|
|
7
|
-
* evidence and attach its results to the bundle
|
|
7
|
+
* evidence and attach its results to the bundle in place, without core knowing any product noun.
|
|
8
8
|
* The review is not touched here: the returned failures are folded into it by the caller.
|
|
9
9
|
*
|
|
10
10
|
* - `score`: when present, the returned namespaced `RunAdapterScore` lands on `bundle.adapterScore`.
|
|
11
|
-
* For a
|
|
12
|
-
* failure. For a
|
|
13
|
-
* failure (the keystone
|
|
14
|
-
* that
|
|
11
|
+
* For a library caller (no `scorerProvenance`), the adapter score is additive and never a
|
|
12
|
+
* failure. For a config-declared scorer (#316; `scorerProvenance` present), a status:"fail" is a
|
|
13
|
+
* failure (the keystone route is the product's own definition of pass/fail), and so is a scorer
|
|
14
|
+
* that throws or returns a malformed value, so a crashed declared gate is never a silent green.
|
|
15
15
|
* - `deriveFeedback`: when present, the returned candidates are appended to
|
|
16
16
|
* `bundle.feedbackCandidates`; each carries its own namespaced `adapter` product-noun block.
|
|
17
17
|
*
|
|
18
18
|
* Defense in depth: the adapter's namespaced payloads are re-serialized through the run's scrub +
|
|
19
|
-
* redact, and any candidate / score that does not satisfy core's exported shape is
|
|
19
|
+
* redact, and any candidate / score that does not satisfy core's exported shape is dropped with a
|
|
20
20
|
* warning (a malformed adapter output never poisons a verifiable bundle). The bundle verifier
|
|
21
21
|
* re-checks the surviving shapes downstream, so the seam stays fail-closed end to end.
|
|
22
22
|
*/
|
|
23
23
|
export declare function applyAdapterExtensionSeam(args: {
|
|
24
|
-
|
|
24
|
+
scorer: TerminalScorer | undefined;
|
|
25
25
|
bundle: RunBundle;
|
|
26
26
|
trace: ActorTrace;
|
|
27
27
|
ledgers: TerminalLedgers;
|
|
@@ -1,28 +1,27 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
1
|
import {} from "../../run/bundle.js";
|
|
3
|
-
import {
|
|
4
|
-
import { adapterScoreFailureMessage, declaredScorerThrew, DECLARED_SCORER_MALFORMED, frozenBundleView, } from "../../lab/adapter-extension.js";
|
|
2
|
+
import { isRunAdapterScore } from "../../run/bundle-shape.js";
|
|
3
|
+
import { adapterScoreFailureMessage, declaredScorerThrew, DECLARED_SCORER_MALFORMED, frozenBundleView, isAdapterFeedbackCandidate, } from "../../lab/adapter-extension.js";
|
|
5
4
|
/**
|
|
6
5
|
* Run the layer-6 product-adapter extension seam (issue #154 acceptance #8) over the assembled
|
|
7
|
-
* evidence and attach its results to the bundle
|
|
6
|
+
* evidence and attach its results to the bundle in place, without core knowing any product noun.
|
|
8
7
|
* The review is not touched here: the returned failures are folded into it by the caller.
|
|
9
8
|
*
|
|
10
9
|
* - `score`: when present, the returned namespaced `RunAdapterScore` lands on `bundle.adapterScore`.
|
|
11
|
-
* For a
|
|
12
|
-
* failure. For a
|
|
13
|
-
* failure (the keystone
|
|
14
|
-
* that
|
|
10
|
+
* For a library caller (no `scorerProvenance`), the adapter score is additive and never a
|
|
11
|
+
* failure. For a config-declared scorer (#316; `scorerProvenance` present), a status:"fail" is a
|
|
12
|
+
* failure (the keystone route is the product's own definition of pass/fail), and so is a scorer
|
|
13
|
+
* that throws or returns a malformed value, so a crashed declared gate is never a silent green.
|
|
15
14
|
* - `deriveFeedback`: when present, the returned candidates are appended to
|
|
16
15
|
* `bundle.feedbackCandidates`; each carries its own namespaced `adapter` product-noun block.
|
|
17
16
|
*
|
|
18
17
|
* Defense in depth: the adapter's namespaced payloads are re-serialized through the run's scrub +
|
|
19
|
-
* redact, and any candidate / score that does not satisfy core's exported shape is
|
|
18
|
+
* redact, and any candidate / score that does not satisfy core's exported shape is dropped with a
|
|
20
19
|
* warning (a malformed adapter output never poisons a verifiable bundle). The bundle verifier
|
|
21
20
|
* re-checks the surviving shapes downstream, so the seam stays fail-closed end to end.
|
|
22
21
|
*/
|
|
23
22
|
export async function applyAdapterExtensionSeam(args) {
|
|
24
|
-
const {
|
|
25
|
-
if (!
|
|
23
|
+
const { scorer, bundle, trace, ledgers, transcript, product, labId, runId, sanitize, warnings, scorerProvenance, } = args;
|
|
24
|
+
if (!scorer?.score && !scorer?.deriveFeedback)
|
|
26
25
|
return { failures: [] };
|
|
27
26
|
const declared = scorerProvenance !== undefined;
|
|
28
27
|
// Record the loaded scorer's identity regardless of hook outcome (a throwing/invalid scorer was
|
|
@@ -31,7 +30,7 @@ export async function applyAdapterExtensionSeam(args) {
|
|
|
31
30
|
bundle.scorerProvenance = scorerProvenance;
|
|
32
31
|
// The scorer sees a READ-ONLY view of the bundle so it cannot mutate noSpend/cost/review in place to
|
|
33
32
|
// launder a verdict (a tamper attempt throws and is caught as a hook failure below). The seam stamps
|
|
34
|
-
// the
|
|
33
|
+
// the real bundle. The transcript is the same normalized, source-scrubbed text the run persists as
|
|
35
34
|
// terminal-transcript.txt — no new exposure beyond what disk already holds (#341).
|
|
36
35
|
const ctx = {
|
|
37
36
|
bundle: frozenBundleView(bundle),
|
|
@@ -43,21 +42,22 @@ export async function applyAdapterExtensionSeam(args) {
|
|
|
43
42
|
runId,
|
|
44
43
|
};
|
|
45
44
|
// Best-effort re-scrub of the adapter payload: round-trip the whole JSON through the run's denylist
|
|
46
|
-
// sanitizer.
|
|
47
|
-
//
|
|
45
|
+
// sanitizer. It is a scrub with no containment: it catches recognizable secret shapes and known
|
|
46
|
+
// local paths, and misses encoded/split/custom secrets, DB passwords, PII, or abs paths outside
|
|
47
|
+
// the denylist. A
|
|
48
48
|
// payload from config-declared code is acceptable only because the trust boundary (the party who
|
|
49
49
|
// declares the scorer runs the lab) already permits direct exfiltration; the re-scrub is
|
|
50
50
|
// defense-in-depth, not a wall.
|
|
51
51
|
const scrubValue = (value) => JSON.parse(sanitize(JSON.stringify(value)));
|
|
52
|
-
// Set for a
|
|
53
|
-
// The caller folds it into the review and fails the run
|
|
52
|
+
// Set for a declared scorer that fails to render a pass verdict (status:"fail", malformed, or throw).
|
|
53
|
+
// The caller folds it into the review and fails the run result on it: a declared gate that cannot
|
|
54
54
|
// pass is a fail, never a silent green. Empty for a library caller and for a passing scorer.
|
|
55
55
|
const failures = [];
|
|
56
|
-
if (
|
|
56
|
+
if (scorer?.score) {
|
|
57
57
|
try {
|
|
58
|
-
const score = await
|
|
58
|
+
const score = await scorer.score(ctx);
|
|
59
59
|
const cleaned = scrubValue(score);
|
|
60
|
-
if (
|
|
60
|
+
if (isRunAdapterScore(cleaned)) {
|
|
61
61
|
bundle.adapterScore = cleaned;
|
|
62
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.
|
|
@@ -66,136 +66,39 @@ export async function applyAdapterExtensionSeam(args) {
|
|
|
66
66
|
failures.push(message);
|
|
67
67
|
}
|
|
68
68
|
else {
|
|
69
|
-
warnings.push("
|
|
70
|
-
// A declared gate that returned a
|
|
69
|
+
warnings.push("scorer.score returned a value that is not a well-formed humanish.adapter-score.v1 (non-empty namespace + status + numeric score + summary); dropped so the bundle stays verifiable.");
|
|
70
|
+
// A declared gate that returned a malformed value never rendered a verdict, so it fails closed.
|
|
71
71
|
if (declared)
|
|
72
72
|
failures.push(DECLARED_SCORER_MALFORMED);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
catch (error) {
|
|
76
76
|
const detail = sanitize(error instanceof Error ? error.message : String(error));
|
|
77
|
-
warnings.push(`
|
|
78
|
-
// A crashed
|
|
77
|
+
warnings.push(`scorer.score threw (${detail}); dropped so the bundle stays verifiable.`);
|
|
78
|
+
// A crashed declared gate must be visible, never a silent pass: it fails the review and the
|
|
79
79
|
// run result.
|
|
80
80
|
if (declared)
|
|
81
81
|
failures.push(declaredScorerThrew(detail));
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
if (
|
|
84
|
+
if (scorer?.deriveFeedback) {
|
|
85
85
|
try {
|
|
86
|
-
const candidates = await
|
|
86
|
+
const candidates = await scorer.deriveFeedback(ctx);
|
|
87
87
|
const accepted = [];
|
|
88
88
|
for (const candidate of Array.isArray(candidates) ? candidates : []) {
|
|
89
89
|
const cleaned = scrubValue(candidate);
|
|
90
|
-
if (
|
|
90
|
+
if (isAdapterFeedbackCandidate(cleaned))
|
|
91
91
|
accepted.push(cleaned);
|
|
92
92
|
else
|
|
93
|
-
warnings.push("
|
|
93
|
+
warnings.push("scorer.deriveFeedback returned a candidate that is not a well-formed humanish.feedback-candidate.v1 (or its adapter block lacked a non-empty namespace + data record); dropped so the bundle stays verifiable.");
|
|
94
94
|
}
|
|
95
95
|
if (accepted.length > 0) {
|
|
96
96
|
bundle.feedbackCandidates = [...bundle.feedbackCandidates, ...accepted];
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
catch (error) {
|
|
100
|
-
warnings.push(`
|
|
100
|
+
warnings.push(`scorer.deriveFeedback threw (${sanitize(error instanceof Error ? error.message : String(error))}); dropped so the bundle stays verifiable.`);
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
return { failures };
|
|
104
104
|
}
|
|
105
|
-
/** Structural guard for an adapter-returned RunAdapterScore (mirrors run/bundle-shape.ts isRunAdapterScore, kept
|
|
106
|
-
* local so the lane fails closed at the seam BEFORE the bundle verifier re-checks it). */
|
|
107
|
-
function isAdapterScoreShape(value) {
|
|
108
|
-
return (typeof value === "object" &&
|
|
109
|
-
value !== null &&
|
|
110
|
-
!Array.isArray(value) &&
|
|
111
|
-
value.schema === "humanish.adapter-score.v1" &&
|
|
112
|
-
typeof value.namespace === "string" &&
|
|
113
|
-
value.namespace.trim().length > 0 &&
|
|
114
|
-
["pass", "partial", "fail"].includes(value.status) &&
|
|
115
|
-
typeof value.score === "number" &&
|
|
116
|
-
Number.isFinite(value.score) &&
|
|
117
|
-
typeof value.summary === "string");
|
|
118
|
-
}
|
|
119
|
-
/** Structural guard for an adapter-returned feedback candidate. This mirrors run/feedback-shape.ts's full
|
|
120
|
-
* isRunFeedbackCandidate predicate, including its local evidence-path contract, so a malformed
|
|
121
|
-
* candidate is dropped at the extension seam instead of poisoning the persisted bundle. */
|
|
122
|
-
function isAdapterFeedbackCandidateShape(value) {
|
|
123
|
-
return (isAdapterRecord(value) &&
|
|
124
|
-
value.schema === "humanish.feedback-candidate.v1" &&
|
|
125
|
-
typeof value.id === "string" &&
|
|
126
|
-
typeof value.run_id === "string" &&
|
|
127
|
-
(typeof value.stream_id === "string" || value.stream_id === undefined) &&
|
|
128
|
-
typeof value.adapter_id === "string" &&
|
|
129
|
-
typeof value.scenario_id === "string" &&
|
|
130
|
-
typeof value.persona_id === "string" &&
|
|
131
|
-
isAdapterFeedbackActor(value.actor) &&
|
|
132
|
-
isAdapterFeedbackSubstrate(value.substrate) &&
|
|
133
|
-
isAdapterFeedbackFailureOwner(value.failure_owner) &&
|
|
134
|
-
typeof value.summary === "string" &&
|
|
135
|
-
value.summary.trim().length > 0 &&
|
|
136
|
-
typeof value.expected === "string" &&
|
|
137
|
-
typeof value.actual === "string" &&
|
|
138
|
-
Array.isArray(value.evidence) &&
|
|
139
|
-
value.evidence.every(isAdapterFeedbackEvidence) &&
|
|
140
|
-
isAdapterRecord(value.redaction) &&
|
|
141
|
-
value.redaction.status === "passed" &&
|
|
142
|
-
typeof value.redaction.notes === "string" &&
|
|
143
|
-
isFeedbackIdempotencyKey(value.idempotency_key) &&
|
|
144
|
-
isAdapterFeedbackNextState(value.proposed_next_state) &&
|
|
145
|
-
Array.isArray(value.acceptance_proof) &&
|
|
146
|
-
value.acceptance_proof.every((item) => typeof item === "string") &&
|
|
147
|
-
(value.adapter === undefined ||
|
|
148
|
-
(isAdapterRecord(value.adapter) &&
|
|
149
|
-
typeof value.adapter.namespace === "string" &&
|
|
150
|
-
value.adapter.namespace.trim().length > 0 &&
|
|
151
|
-
isAdapterRecord(value.adapter.data))));
|
|
152
|
-
}
|
|
153
|
-
function isAdapterFeedbackEvidence(value) {
|
|
154
|
-
return (isAdapterRecord(value) &&
|
|
155
|
-
typeof value.path === "string" &&
|
|
156
|
-
value.path.length > 0 &&
|
|
157
|
-
!path.isAbsolute(value.path) &&
|
|
158
|
-
!value.path.includes("://") &&
|
|
159
|
-
!value.path.includes("..") &&
|
|
160
|
-
(value.kind === "review" ||
|
|
161
|
-
value.kind === "state" ||
|
|
162
|
-
value.kind === "log" ||
|
|
163
|
-
value.kind === "trace" ||
|
|
164
|
-
value.kind === "screenshot" ||
|
|
165
|
-
value.kind === "filesystem") &&
|
|
166
|
-
typeof value.note === "string");
|
|
167
|
-
}
|
|
168
|
-
function isAdapterFeedbackActor(value) {
|
|
169
|
-
return (value === "codex-tui" ||
|
|
170
|
-
value === "codex-exec" ||
|
|
171
|
-
value === "codex-app-server" ||
|
|
172
|
-
value === "computer-use" ||
|
|
173
|
-
value === "synthetic-dry-run" ||
|
|
174
|
-
value === "unknown");
|
|
175
|
-
}
|
|
176
|
-
function isAdapterFeedbackSubstrate(value) {
|
|
177
|
-
return (value === "e2b-desktop" ||
|
|
178
|
-
value === "local-desktop" ||
|
|
179
|
-
value === "e2b-terminal" ||
|
|
180
|
-
value === "local-filesystem" ||
|
|
181
|
-
value === "codex-app-server" ||
|
|
182
|
-
value === "unknown");
|
|
183
|
-
}
|
|
184
|
-
function isAdapterFeedbackFailureOwner(value) {
|
|
185
|
-
return (value === "harness" ||
|
|
186
|
-
value === "target-app" ||
|
|
187
|
-
value === "actor" ||
|
|
188
|
-
value === "environment" ||
|
|
189
|
-
value === "unknown");
|
|
190
|
-
}
|
|
191
|
-
function isAdapterFeedbackNextState(value) {
|
|
192
|
-
return (value === "watch" ||
|
|
193
|
-
value === "adapter-hardening" ||
|
|
194
|
-
value === "target-app-setup" ||
|
|
195
|
-
value === "actor-auth" ||
|
|
196
|
-
value === "setup-quality-review" ||
|
|
197
|
-
value === "study-quality-review");
|
|
198
|
-
}
|
|
199
|
-
function isAdapterRecord(value) {
|
|
200
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
201
|
-
}
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
import type { ActorPersonaRef, ActorTrace } from "../../actors/contract.js";
|
|
2
|
-
import { type RunLabProvenance } from "../../run/status.js";
|
|
3
2
|
import type { LabScenarioCaps, LabRuntimeAuth } from "../../lab/types.js";
|
|
4
|
-
import { type RunBundle, type RunCostSummary } from "../../run/bundle.js";
|
|
3
|
+
import { type RunBundle, type RunCostSummary, type BundleRun } from "../../run/bundle.js";
|
|
5
4
|
import type { Verdict } from "../../run/judge.js";
|
|
6
5
|
import type { TerminalLedgers } from "./types.js";
|
|
7
6
|
/**
|
|
8
7
|
* Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
|
|
9
8
|
* producer only). DRY-RUN: a contract bundle. The terminal stream is a contract placeholder
|
|
10
|
-
* (stdin disabled, no captured tail
|
|
9
|
+
* (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
|
|
11
10
|
* the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
|
|
12
11
|
* exist. The shipped live builder fills the same evidence contract. Exported for tests.
|
|
13
12
|
*/
|
|
14
13
|
export declare function buildTerminalProductBundle(args: {
|
|
15
|
-
/**
|
|
16
|
-
|
|
14
|
+
/** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
|
|
15
|
+
run: BundleRun;
|
|
17
16
|
actorId: string;
|
|
18
|
-
createdAt: string;
|
|
19
17
|
dryRun: boolean;
|
|
20
18
|
labId: string;
|
|
21
19
|
labTitle?: string;
|
|
@@ -32,23 +30,21 @@ export declare function buildTerminalProductBundle(args: {
|
|
|
32
30
|
allowPaymentCredentials: boolean;
|
|
33
31
|
allowGitHubMutation: boolean;
|
|
34
32
|
};
|
|
35
|
-
runId: string;
|
|
36
33
|
source: RunBundle["source"];
|
|
37
34
|
/** The run's judgment verdict (judgeTerminal): a contract for a dry run. */
|
|
38
35
|
verdict: Verdict;
|
|
39
36
|
}): RunBundle;
|
|
40
37
|
/**
|
|
41
|
-
* Build the
|
|
38
|
+
* Build the live terminal-product run bundle (mode "live") from the captured session: the actor
|
|
42
39
|
* trace seam (stream.actor = trace), the substrate-lifecycle events, the terminal stream with the
|
|
43
40
|
* redacted transcript tail, and references to the written evidence artifacts (terminal event
|
|
44
41
|
* stream, transcript, ledgers, actor trace). verifyRun's terminal-product check (gated on
|
|
45
42
|
* mode==="live") enforces the ledgers + proven cleanup + interventions-present over this bundle.
|
|
46
43
|
*/
|
|
47
44
|
export declare function buildLiveTerminalProductBundle(args: {
|
|
48
|
-
/**
|
|
49
|
-
|
|
45
|
+
/** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
|
|
46
|
+
run: BundleRun;
|
|
50
47
|
actorId: string;
|
|
51
|
-
createdAt: string;
|
|
52
48
|
labId: string;
|
|
53
49
|
labTitle?: string;
|
|
54
50
|
mission: string;
|
|
@@ -64,7 +60,6 @@ export declare function buildLiveTerminalProductBundle(args: {
|
|
|
64
60
|
allowPaymentCredentials: boolean;
|
|
65
61
|
allowGitHubMutation: boolean;
|
|
66
62
|
};
|
|
67
|
-
runId: string;
|
|
68
63
|
source: RunBundle["source"];
|
|
69
64
|
trace: ActorTrace;
|
|
70
65
|
ledgers: TerminalLedgers;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {} from "../../run/status.js";
|
|
2
1
|
import { redactText } from "../../evidence/redaction.js";
|
|
3
2
|
import { participantAssignment } from "../../lab/participant-assignment.js";
|
|
4
3
|
import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
|
|
@@ -9,21 +8,21 @@ import { describeMeasuredSpend, noSpendLineMeasured, noSpendNotEstablished } fro
|
|
|
9
8
|
/**
|
|
10
9
|
* Project the terminal-product lab run into a humanish.run-bundle.v1 (no schema change — a new
|
|
11
10
|
* producer only). DRY-RUN: a contract bundle. The terminal stream is a contract placeholder
|
|
12
|
-
* (stdin disabled, no captured tail
|
|
11
|
+
* (stdin disabled, no captured tail, because nothing ran), the subject is declared unpinned, and
|
|
13
12
|
* the caps/policies/runtime-auth declarations are recorded without pretending that live ledgers
|
|
14
13
|
* exist. The shipped live builder fills the same evidence contract. Exported for tests.
|
|
15
14
|
*/
|
|
16
15
|
export function buildTerminalProductBundle(args) {
|
|
17
16
|
const reason = "Contract bundle only: dry-run declared the terminal-product study contract without creating an E2B sandbox, injecting any key, or spending. This run did not execute an agent or prove live behavior.";
|
|
18
|
-
// The terminal stream is a
|
|
19
|
-
// exec output was captured, so the tail is empty and transport stays "snapshot"
|
|
17
|
+
// The terminal stream is a contract placeholder on the dry-run path: stdin is disabled and no
|
|
18
|
+
// exec output was captured, so the tail is empty and transport stays "snapshot", never "pty"
|
|
20
19
|
// (captured non-interactive exec output is never an interactive PTY; invariant 6 + the PTY
|
|
21
20
|
// ruling). The shipped live builder fills terminal.tail from redacted exec-stream capture.
|
|
22
21
|
const { simulation, stream } = terminalParticipant(args, {
|
|
23
22
|
status: "contract_proof_only",
|
|
24
23
|
reason,
|
|
25
24
|
summary: `Contract participant for the terminal agent (${args.actorId}) studying ${args.productName} from public surfaces.`,
|
|
26
|
-
updatedAt: args.createdAt,
|
|
25
|
+
updatedAt: args.run.createdAt,
|
|
27
26
|
stdin: args.stdin,
|
|
28
27
|
tail: "",
|
|
29
28
|
artifacts: [
|
|
@@ -36,40 +35,40 @@ export function buildTerminalProductBundle(args) {
|
|
|
36
35
|
const events = [
|
|
37
36
|
{
|
|
38
37
|
id: "event-000-created",
|
|
39
|
-
at: args.createdAt,
|
|
38
|
+
at: args.run.createdAt,
|
|
40
39
|
level: "info",
|
|
41
40
|
type: "terminal-lab.run.created",
|
|
42
41
|
message: `Created terminal-product lab run for ${args.labId} (actor ${args.actorId}, product ${args.productName}).`,
|
|
43
42
|
},
|
|
44
43
|
participantEvent(TERMINAL_IDS, {
|
|
45
44
|
id: "event-001-subject",
|
|
46
|
-
at: args.createdAt,
|
|
45
|
+
at: args.run.createdAt,
|
|
47
46
|
level: "info",
|
|
48
47
|
type: "terminal-lab.subject.declared",
|
|
49
|
-
// Invariant 5: provenance recorded or its absence
|
|
50
|
-
//
|
|
48
|
+
// Invariant 5: provenance recorded or its absence declared. The agent drives public surfaces
|
|
49
|
+
// and nothing is cloned, so the subject provenance is explicitly unpinned; evidence binds to the
|
|
51
50
|
// composed-prompt digest. Public surfaces are recorded (they are public by declaration).
|
|
52
51
|
message: `Subject product declared: ${args.productName}; public surfaces: ${args.publicSurfaces.join(", ")}. The lab did not provision/clone the product — subject provenance is UNPINNED (a public-surface study cannot be commit-pinned); evidence binds to the composed-prompt digest ${args.persona.promptDigest}.`,
|
|
53
52
|
}),
|
|
54
53
|
participantEvent(TERMINAL_IDS, {
|
|
55
54
|
id: "event-002-credentials",
|
|
56
|
-
at: args.createdAt,
|
|
55
|
+
at: args.run.createdAt,
|
|
57
56
|
level: "info",
|
|
58
57
|
type: "terminal-lab.credentials.declared",
|
|
59
|
-
// Names-only evidence (invariant 1): the runtime-auth
|
|
58
|
+
// Names-only evidence (invariant 1): the runtime-auth channel is declared; no value is ever
|
|
60
59
|
// recorded. The deny-by-default policies are recorded so the credential posture is auditable.
|
|
61
60
|
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}.`,
|
|
62
61
|
}),
|
|
63
62
|
participantEvent(TERMINAL_IDS, {
|
|
64
63
|
id: "event-003-caps",
|
|
65
|
-
at: args.createdAt,
|
|
64
|
+
at: args.run.createdAt,
|
|
66
65
|
level: "info",
|
|
67
66
|
type: "terminal-lab.caps.declared",
|
|
68
67
|
message: `Spend/job/time caps: ${capsText}. A live run never exercises the runtime key without a fail-closed cap; its no-spend proof is derived from the persisted cost ledger. This dry-run spends $0 by mechanism.`,
|
|
69
68
|
}),
|
|
70
69
|
participantEvent(TERMINAL_IDS, {
|
|
71
70
|
id: "event-004-contract",
|
|
72
|
-
at: args.createdAt,
|
|
71
|
+
at: args.run.createdAt,
|
|
73
72
|
level: "info",
|
|
74
73
|
type: "terminal-lab.contract.ready",
|
|
75
74
|
message: "Dry-run contract 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.",
|
|
@@ -85,10 +84,9 @@ export function buildTerminalProductBundle(args) {
|
|
|
85
84
|
],
|
|
86
85
|
};
|
|
87
86
|
return terminalRunBundle(args, {
|
|
88
|
-
mode: args.dryRun ? "dry-run" : "live",
|
|
89
87
|
lifecycle: [
|
|
90
88
|
{
|
|
91
|
-
at: args.createdAt,
|
|
89
|
+
at: args.run.createdAt,
|
|
92
90
|
event: "terminal-lab.run.created",
|
|
93
91
|
message: `Created terminal-product lab run with one in-sandbox agent participant (actor ${args.actorId}, product ${args.productName}).`,
|
|
94
92
|
},
|
|
@@ -101,7 +99,7 @@ export function buildTerminalProductBundle(args) {
|
|
|
101
99
|
});
|
|
102
100
|
}
|
|
103
101
|
/**
|
|
104
|
-
* Build the
|
|
102
|
+
* Build the live terminal-product run bundle (mode "live") from the captured session: the actor
|
|
105
103
|
* trace seam (stream.actor = trace), the substrate-lifecycle events, the terminal stream with the
|
|
106
104
|
* redacted transcript tail, and references to the written evidence artifacts (terminal event
|
|
107
105
|
* stream, transcript, ledgers, actor trace). verifyRun's terminal-product check (gated on
|
|
@@ -115,10 +113,10 @@ export function buildLiveTerminalProductBundle(args) {
|
|
|
115
113
|
: args.trace.status === "timed_out"
|
|
116
114
|
? "timed_out"
|
|
117
115
|
: "failed";
|
|
118
|
-
const
|
|
119
|
-
const tail = (
|
|
116
|
+
const commandItem = args.trace.items.find((item) => item.kind === "command");
|
|
117
|
+
const tail = (commandItem?.command?.outputTail || args.trace.reason).slice(0, 2000);
|
|
120
118
|
// transport "snapshot": the persisted tail is a redacted snapshot of the captured exec output,
|
|
121
|
-
//
|
|
119
|
+
// never an interactive PTY (stdin disabled). The actor trace seam carries the structured evidence.
|
|
122
120
|
const { simulation, stream } = terminalParticipant(args, {
|
|
123
121
|
status: recordStatus,
|
|
124
122
|
reason: args.sessionReason,
|
|
@@ -149,9 +147,9 @@ export function buildLiveTerminalProductBundle(args) {
|
|
|
149
147
|
type: record.event,
|
|
150
148
|
message: record.message,
|
|
151
149
|
}));
|
|
152
|
-
// Surface the no-spend proof as a first-class bundle event so the Observer/review can
|
|
153
|
-
// It is
|
|
154
|
-
// for
|
|
150
|
+
// Surface the no-spend proof as a first-class bundle event so the Observer/review can show it.
|
|
151
|
+
// It is derived from the cost ledger (never asserted): it lists the known-zero lines it vouches
|
|
152
|
+
// for and the unmeasured (null) lines it explicitly cannot vouch for.
|
|
155
153
|
const noSpend = args.ledgers.noSpendProof;
|
|
156
154
|
lifecycleEvents.push(participantEvent(TERMINAL_IDS, {
|
|
157
155
|
id: "event-cost-no-spend-proof",
|
|
@@ -169,7 +167,7 @@ export function buildLiveTerminalProductBundle(args) {
|
|
|
169
167
|
? []
|
|
170
168
|
: [`Agent session ended ${args.trace.status}: ${args.sessionReason}`]),
|
|
171
169
|
...(args.capFailure === undefined ? [] : [args.capFailure]),
|
|
172
|
-
// Honesty gap: the no-spend proof always declares which spend lines it could
|
|
170
|
+
// Honesty gap: the no-spend proof always declares which spend lines it could not measure, so a
|
|
173
171
|
// green run never silently over-claims a fully-proven $0.
|
|
174
172
|
...(noSpend.unmeasuredLines.length > 0
|
|
175
173
|
? [
|
|
@@ -179,7 +177,6 @@ export function buildLiveTerminalProductBundle(args) {
|
|
|
179
177
|
],
|
|
180
178
|
};
|
|
181
179
|
return terminalRunBundle(args, {
|
|
182
|
-
mode: "live",
|
|
183
180
|
lifecycle: args.ledgers.lifecycle.map((record) => ({
|
|
184
181
|
at: record.at,
|
|
185
182
|
event: record.event,
|
|
@@ -206,7 +203,7 @@ function terminalParticipant(args, session) {
|
|
|
206
203
|
progress: 100,
|
|
207
204
|
currentStep: session.reason,
|
|
208
205
|
summary: session.summary,
|
|
209
|
-
startedAt: args.createdAt,
|
|
206
|
+
startedAt: args.run.createdAt,
|
|
210
207
|
updatedAt: session.updatedAt,
|
|
211
208
|
});
|
|
212
209
|
const stream = participantStream(TERMINAL_IDS, {
|
|
@@ -232,17 +229,10 @@ function terminalParticipant(args, session) {
|
|
|
232
229
|
});
|
|
233
230
|
return { simulation, stream };
|
|
234
231
|
}
|
|
235
|
-
/** The run bundle around the
|
|
232
|
+
/** The run bundle around the terminal session: the fields both builders fill the same way. */
|
|
236
233
|
function terminalRunBundle(args, parts) {
|
|
237
234
|
return {
|
|
238
|
-
...bundleHead({
|
|
239
|
-
runId: args.runId,
|
|
240
|
-
mode: parts.mode,
|
|
241
|
-
participants: 1,
|
|
242
|
-
createdAt: args.createdAt,
|
|
243
|
-
...(args.lab === undefined ? {} : { lab: args.lab }),
|
|
244
|
-
source: args.source,
|
|
245
|
-
}),
|
|
235
|
+
...bundleHead(args.run, { participants: 1, source: args.source }),
|
|
246
236
|
persona: {
|
|
247
237
|
id: args.persona.id,
|
|
248
238
|
name: `Autonomous terminal agent (${args.persona.id})`,
|
|
@@ -22,8 +22,8 @@ export declare function buildRuntimeAuth(args: {
|
|
|
22
22
|
message: string;
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
25
|
-
* Build the sandbox metadata from a
|
|
26
|
-
* way metadata is set on the terminal
|
|
25
|
+
* Build the sandbox metadata from a positive allowlist (safety contract item 6). 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
|
*/
|
|
@@ -7,22 +7,22 @@ import { TERMINAL_PRODUCT_LAB_PROVIDER_METADATA } from "./types.js";
|
|
|
7
7
|
* credential is forwarded. The real value must never be logged or persisted in either mode.
|
|
8
8
|
*/
|
|
9
9
|
export function buildRuntimeAuth(args) {
|
|
10
|
-
// The "openai-env" channel accepts CODEX_API_KEY or OPENAI_API_KEY as the runtime key
|
|
10
|
+
// The "openai-env" channel accepts CODEX_API_KEY or OPENAI_API_KEY as the runtime key source
|
|
11
11
|
// name, read in this preference order. CODEX_API_KEY is preferred: the official Codex docs
|
|
12
|
-
// (developers.openai.com/codex/noninteractive) document it as the channel for a
|
|
13
|
-
// invocation, which is exactly this
|
|
12
|
+
// (developers.openai.com/codex/noninteractive) document it as the channel for a single codex exec
|
|
13
|
+
// invocation, which is exactly this route's shape (no persisted auth.json/CODEX_HOME, per-command
|
|
14
14
|
// envs only). A dated in-repo receipt
|
|
15
15
|
// (docs/goals/humanish-recursive-proof-critical-point/receipts/actor-required-attempt.md) shows a
|
|
16
16
|
// job-wide OPENAI_API_KEY alone failing bearer auth for this same pinned-exec pattern. When the
|
|
17
|
-
// operator only exported OPENAI_API_KEY, its value is
|
|
17
|
+
// operator only exported OPENAI_API_KEY, its value is also injected under CODEX_API_KEY below, so
|
|
18
18
|
// the documented exec auth channel is always populated regardless of which name the operator
|
|
19
|
-
// used. The
|
|
19
|
+
// used. The allowlist is exactly these two names; everything else is denied by construction.
|
|
20
20
|
const ALLOWED_RUNTIME_KEY_NAMES = ["CODEX_API_KEY", "OPENAI_API_KEY"];
|
|
21
|
-
// Tripwire (safety contract item 4): if a
|
|
21
|
+
// Tripwire (safety contract item 4): if a future widening of ALLOWED_RUNTIME_KEY_NAMES ever
|
|
22
22
|
// added a clearly-non-runtime credential (a GitHub/payment/deploy/db secret), fail closed. The
|
|
23
|
-
// generic `*_KEY` shape is deliberately
|
|
23
|
+
// generic `*_KEY` shape is deliberately left out of the tripwire, since a runtime key legitimately
|
|
24
24
|
// ends in _KEY (CODEX_API_KEY/OPENAI_API_KEY), so testing it against the generic shape would
|
|
25
|
-
// false-positive on the very key this
|
|
25
|
+
// false-positive on the very key this route exists to inject. The positive allowlist itself is
|
|
26
26
|
// the real boundary: the command env is built from exactly these names and nothing else (so
|
|
27
27
|
// GITHUB_TOKEN/payment/db keys present in the operator env are never forwarded, proven by the
|
|
28
28
|
// deterministic test).
|
|
@@ -42,9 +42,9 @@ export function buildRuntimeAuth(args) {
|
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
const keyValue = args.env[keyName];
|
|
45
|
-
// The command-scoped env is the
|
|
45
|
+
// The command-scoped env is the allowlist: exactly the runtime key name(s). No
|
|
46
46
|
// GITHUB_TOKEN/GH_TOKEN, no payment/deploy/db/media key, excluded by construction. When the
|
|
47
|
-
//
|
|
47
|
+
// source was OPENAI_API_KEY, the same value is also injected as CODEX_API_KEY so codex exec's
|
|
48
48
|
// documented single-invocation auth channel is populated either way (see the comment above).
|
|
49
49
|
const mode = args.runtimeAuth ?? "openai-env";
|
|
50
50
|
const envs = mode === "openai-egress"
|
|
@@ -62,11 +62,11 @@ export function buildRuntimeAuth(args) {
|
|
|
62
62
|
keyValue,
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
|
-
// Clearly-non-runtime credential
|
|
66
|
-
// runtime key must never be one of these). Deliberately
|
|
67
|
-
// runtime key this
|
|
65
|
+
// Clearly-non-runtime credential name shapes. Used as the runtime-key allowlist tripwire (a
|
|
66
|
+
// runtime key must never be one of these). Deliberately excludes the generic `*_KEY` shape: the
|
|
67
|
+
// runtime key this route injects (CODEX_API_KEY/OPENAI_API_KEY) legitimately ends in _KEY, so the
|
|
68
68
|
// generic shape would false-positive on it. The positive allowlist, not a denylist, is what
|
|
69
|
-
// keeps every
|
|
69
|
+
// keeps every other operator-env credential (GitHub/payment/deploy/db/media keys) out of the
|
|
70
70
|
// sandbox: the command env is built from exactly the allowlisted runtime key and nothing else.
|
|
71
71
|
const NON_RUNTIME_CREDENTIAL_NAME_PATTERNS = [
|
|
72
72
|
/^GITHUB_TOKEN$/i,
|
|
@@ -84,8 +84,8 @@ function isNonRuntimeCredentialName(name) {
|
|
|
84
84
|
return NON_RUNTIME_CREDENTIAL_NAME_PATTERNS.some((pattern) => pattern.test(name));
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
|
-
* Build the sandbox metadata from a
|
|
88
|
-
* way metadata is set on the terminal
|
|
87
|
+
* Build the sandbox metadata from a positive allowlist (safety contract item 6). 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
|
*/
|
|
@@ -15,7 +15,7 @@ export declare function runDryTerminalLab(args: {
|
|
|
15
15
|
failed: RunLiveTerminalSessionArgs["failed"];
|
|
16
16
|
scope: RunScope;
|
|
17
17
|
}): Promise<TerminalProductLabResult>;
|
|
18
|
-
/** Compose the full prompt the agent would run. Bound to evidence by
|
|
18
|
+
/** Compose the full prompt the agent would run. Bound to evidence by digest only. */
|
|
19
19
|
export declare function composePrompt(args: {
|
|
20
20
|
mission: string;
|
|
21
21
|
personaLine: string;
|