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,6 +1,6 @@
|
|
|
1
|
-
// The computer-use run's setup: resolve the project and route, plan the
|
|
2
|
-
// checks that need no sandbox, pack a local tree, then start the run and build the
|
|
3
|
-
// bundle base that the
|
|
1
|
+
// The computer-use run's setup: resolve the project and route, plan the participants, make the
|
|
2
|
+
// live checks that need no sandbox, pack a local tree, then start the run and build the
|
|
3
|
+
// participant deps and bundle base that the participants and the finish share.
|
|
4
4
|
import { randomBytes } from "node:crypto";
|
|
5
5
|
import { realpath } from "node:fs/promises";
|
|
6
6
|
import path from "node:path";
|
|
@@ -15,14 +15,15 @@ import { emitPreflightPlan, compileParticipantPersonas, loadCuaParticipants, san
|
|
|
15
15
|
import { makeCuaRunBudget } from "./participant-model.js";
|
|
16
16
|
import { e2bRequestTimeoutMs } from "../../substrates/e2b/lifetime.js";
|
|
17
17
|
import { liveCuaRejection } from "./preflight.js";
|
|
18
|
-
import { cuaDescriptorOf,
|
|
18
|
+
import { cuaDescriptorOf, declaredAppUrl, plannedAppUrl } from "./plan.js";
|
|
19
19
|
import { trackRuntimeStreams } from "./live-flush.js";
|
|
20
|
+
import { participantOf, phaseEvent, planEvent } from "../../lab/run-lab-events.js";
|
|
21
|
+
import { defaultSubjectPhaseSink } from "../../subject/steps.js";
|
|
20
22
|
import {} from "./bundle.js";
|
|
21
23
|
import { packRunLocalTree } from "./local-tree-pack.js";
|
|
22
24
|
import { projectParticipantSubjects, subjectProvenanceArg } from "./subject-projection.js";
|
|
23
|
-
import { CUA_ACTOR_LAB_SCHEMA, } from "./types.js";
|
|
25
|
+
import { CUA_ACTOR_LAB_SCHEMA, participantSubjectEnv, } from "./types.js";
|
|
24
26
|
import { labPersonaIds } from "../../lab/persona-resolve.js";
|
|
25
|
-
import { participantDesktopOf } from "./participant-desktop.js";
|
|
26
27
|
/** The physical project, bound before any caller hook runs. */
|
|
27
28
|
async function bindProject(cwd) {
|
|
28
29
|
// Capture the physical project before reading or invoking any caller hook. A supported
|
|
@@ -32,13 +33,12 @@ async function bindProject(cwd) {
|
|
|
32
33
|
return prepareSelectedOutputDirectory(path.dirname(physicalCwd), physicalCwd);
|
|
33
34
|
}
|
|
34
35
|
/**
|
|
35
|
-
* The envelope of a refusal the plan left for after the cwd checks. The
|
|
36
|
-
* fan-out refusals come after the committed personas are read, so a persona-file error still wins.
|
|
36
|
+
* The envelope of a refusal the plan left for after the cwd checks. The participant cap and
|
|
37
|
+
* in-process fan-out refusals come after the committed personas are read, so a persona-file error still wins.
|
|
37
38
|
*/
|
|
38
39
|
export async function refuseCuaLab(options, refusal) {
|
|
39
40
|
const { config, dryRun } = options;
|
|
40
41
|
const projectRoot = await bindProject(options.cwd);
|
|
41
|
-
const hooks = options.hooks ?? {};
|
|
42
42
|
// The committed personas are read before the refusal returns, so a persona-file error wins.
|
|
43
43
|
if (refusal.stage === "after-personas")
|
|
44
44
|
await compileParticipantPersonas(projectRoot, labPersonaIds(config));
|
|
@@ -48,7 +48,7 @@ export async function refuseCuaLab(options, refusal) {
|
|
|
48
48
|
cwd: projectRoot.physicalPath,
|
|
49
49
|
labId: config.id,
|
|
50
50
|
actor: refusal.actor ?? config.actors[0]?.type ?? "",
|
|
51
|
-
appUrl:
|
|
51
|
+
appUrl: declaredAppUrl(config),
|
|
52
52
|
dryRun,
|
|
53
53
|
runId: options.runId ?? "not-created",
|
|
54
54
|
lanes: [],
|
|
@@ -66,11 +66,13 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
66
66
|
const { dryRun } = plan;
|
|
67
67
|
const projectRoot = await bindProject(input.cwd);
|
|
68
68
|
const cwd = projectRoot.physicalPath;
|
|
69
|
-
const
|
|
70
|
-
const streams = trackRuntimeStreams(
|
|
71
|
-
const env =
|
|
72
|
-
const
|
|
73
|
-
const
|
|
69
|
+
const seams = input.deps ?? {};
|
|
70
|
+
const streams = trackRuntimeStreams(input.onStream);
|
|
71
|
+
const env = input.env ?? process.env;
|
|
72
|
+
const { subject, desktop } = plan.runner;
|
|
73
|
+
const inProcess = desktop === "in-process";
|
|
74
|
+
const appUrl = plannedAppUrl(subject);
|
|
75
|
+
const subjectEnvNames = [...participantSubjectEnv(subject)];
|
|
74
76
|
const fail = (code, message, actorLabel) => ({
|
|
75
77
|
schema: CUA_ACTOR_LAB_SCHEMA,
|
|
76
78
|
ok: false,
|
|
@@ -88,15 +90,29 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
88
90
|
ok: false,
|
|
89
91
|
result: fail(...args),
|
|
90
92
|
});
|
|
93
|
+
// runLab's local VM study supplies a local-target app-url lab's desktop; a direct route call or
|
|
94
|
+
// an in-process executor on the same lab has none. It reads the declared source, as the planner
|
|
95
|
+
// did: a library config the parser never saw can plan to an app-url subject from another source.
|
|
96
|
+
if (config.subject.source === "app-url" &&
|
|
97
|
+
config.execution?.target === "local" &&
|
|
98
|
+
input.localVm === undefined)
|
|
99
|
+
return refuse("HUMANISH_CUA_LAB_LOCAL_DESKTOP_MISSING", "An app-url lab with execution.target: local needs a local desktop. runLab starts one; a direct route call or an in-process executor does not.");
|
|
91
100
|
const descriptor = cuaDescriptorOf(plan.actor);
|
|
92
|
-
const
|
|
101
|
+
const baseRunSession = seams.runSession ?? descriptor.runSession;
|
|
102
|
+
// A local VM study's sessions abort on its signal.
|
|
103
|
+
const localVmSignal = input.localVm?.signal;
|
|
104
|
+
const runSession = localVmSignal === undefined
|
|
105
|
+
? baseRunSession
|
|
106
|
+
: (options) => baseRunSession({ ...options, signal: localVmSignal });
|
|
93
107
|
// Adopter-hosted comms plane on the app-url route (#380): humanish provisions no subject here,
|
|
94
108
|
// so it cannot host a catch — the OPERATOR runs one, and humanish still does every other part
|
|
95
109
|
// of the funnel: tells each persona its address and inbox URL, drains the catch over HTTP after
|
|
96
|
-
// the
|
|
110
|
+
// the participants, and writes the same digest-only evidence. Declaring `external` previously did
|
|
97
111
|
// nothing on this route (and, per #387, on every other) while its docs said otherwise.
|
|
98
112
|
const comms = plan.residual.comms;
|
|
99
|
-
const externalCommsConfig =
|
|
113
|
+
const externalCommsConfig = subject.kind !== "clone" && subject.kind !== "local-tree" && !inProcess
|
|
114
|
+
? comms?.email?.external
|
|
115
|
+
: undefined;
|
|
100
116
|
const externalCommsEmail = externalCommsConfig ? comms?.email : undefined;
|
|
101
117
|
const participants = await loadCuaParticipants({ plan, cwd, projectRoot, env });
|
|
102
118
|
if (!participants.ok) {
|
|
@@ -104,13 +120,13 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
104
120
|
}
|
|
105
121
|
const { participantRuns, participantPlan, rerunLineage } = participants;
|
|
106
122
|
const participantCount = participantRuns.length;
|
|
107
|
-
// Pre-flight plan: BEFORE any sandbox or provider call (dry-run AND live).
|
|
108
|
-
// every N
|
|
109
|
-
//
|
|
123
|
+
// Pre-flight plan: BEFORE any sandbox or provider call (dry-run AND live). onEvent gets it for
|
|
124
|
+
// every N; the stderr table prints for fan-out (N>1) so single-participant runs stay as quiet as they
|
|
125
|
+
// always were.
|
|
110
126
|
if (participantCount > 1) {
|
|
111
127
|
emitPreflightPlan(participantPlan, plan.labId);
|
|
112
128
|
}
|
|
113
|
-
|
|
129
|
+
input.emit?.(planEvent(participantPlan));
|
|
114
130
|
await assertPreparedSelectedOutputDirectory(projectRoot);
|
|
115
131
|
// Read keys once into locals (names only; values never logged or persisted).
|
|
116
132
|
const openaiApiKey = env.OPENAI_API_KEY?.trim() ?? "";
|
|
@@ -124,34 +140,30 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
124
140
|
const scrubKnownValues = scrubLiterals(knownSecretValues);
|
|
125
141
|
sanitizeParticipantRuns(participantRuns, scrubKnownValues);
|
|
126
142
|
const redactRepoLabel = plan.residual.policies?.redactRepos ?? subjectEnvNames.includes("GITHUB_TOKEN");
|
|
127
|
-
const publicRepo =
|
|
128
|
-
const hasGithubToken = subjectEnvNames.includes("GITHUB_TOKEN");
|
|
143
|
+
const publicRepo = subject.kind === "clone" ? (redactRepoLabel ? "repo-01" : subject.repo) : undefined;
|
|
129
144
|
// Key-gating is route-aware: the in-process route uses the caller's OWN model + executor, and
|
|
130
145
|
// the local-agent route uses a CLI the operator has already signed in to.
|
|
131
|
-
if (!dryRun && !
|
|
146
|
+
if (!dryRun && !inProcess) {
|
|
132
147
|
const rejection = await liveCuaRejection({
|
|
133
148
|
caps: plan.caps,
|
|
134
149
|
brain: plan.runner.brain,
|
|
135
|
-
hooks,
|
|
136
150
|
env,
|
|
137
|
-
|
|
138
|
-
e2bApiKey,
|
|
139
|
-
subjectEnvNames,
|
|
151
|
+
requirements: plan.requirements,
|
|
140
152
|
externalCommsConfig,
|
|
141
153
|
});
|
|
142
154
|
if (rejection)
|
|
143
155
|
return refuse(rejection.code, rejection.message, descriptor.id);
|
|
144
156
|
}
|
|
145
157
|
// Pack the working tree ONCE per run, on the host, BEFORE any sandbox or provider call: every
|
|
146
|
-
// fan-out
|
|
147
|
-
// digest. Dry-run packs nothing (no fs side effects; the contract bundle carries no
|
|
158
|
+
// fan-out participant below uploads this SAME archive, so one archiveSha256 describes every
|
|
159
|
+
// participant's digest. Dry-run packs nothing (no fs side effects; the contract bundle carries no
|
|
148
160
|
// archiveSha256). A packing failure fails the run closed here, before any sandbox is
|
|
149
161
|
// created and before the run directory exists.
|
|
150
162
|
let localTreeArchive;
|
|
151
163
|
let localTreeArchiveBuffer;
|
|
152
|
-
if (
|
|
164
|
+
if (subject.kind === "local-tree" && !dryRun) {
|
|
153
165
|
try {
|
|
154
|
-
const packed = await packRunLocalTree(
|
|
166
|
+
const packed = await packRunLocalTree(seams, plan.residual, cwd);
|
|
155
167
|
localTreeArchive = packed.archive;
|
|
156
168
|
localTreeArchiveBuffer = packed.buffer;
|
|
157
169
|
}
|
|
@@ -165,10 +177,10 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
165
177
|
config,
|
|
166
178
|
dryRun,
|
|
167
179
|
cwd,
|
|
168
|
-
|
|
180
|
+
seams,
|
|
169
181
|
streams,
|
|
170
182
|
env,
|
|
171
|
-
|
|
183
|
+
appUrl,
|
|
172
184
|
fail,
|
|
173
185
|
refuse,
|
|
174
186
|
descriptor,
|
|
@@ -184,7 +196,6 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
184
196
|
knownSecretValues,
|
|
185
197
|
scrubKnownValues,
|
|
186
198
|
publicRepo,
|
|
187
|
-
hasGithubToken,
|
|
188
199
|
localTreeArchive,
|
|
189
200
|
localTreeArchiveBuffer,
|
|
190
201
|
},
|
|
@@ -192,8 +203,8 @@ export async function admitCuaRun(plan, input, config) {
|
|
|
192
203
|
}
|
|
193
204
|
/** Starts the run and builds what the participants and the finish read: the deps and the bundle base. */
|
|
194
205
|
export async function startCuaRun(plan, input, admitted, scope) {
|
|
195
|
-
const {
|
|
196
|
-
const { appUrl
|
|
206
|
+
const { dryRun, cwd, seams, descriptor, participantRuns, participantPlan, publicRepo } = admitted;
|
|
207
|
+
const { appUrl } = admitted;
|
|
197
208
|
// The run's status record exists from here on, so anything watching the runs directory can
|
|
198
209
|
// tell which lab this is and that it is alive. The fail-closed returns below leave it finished
|
|
199
210
|
// with no outcome when the scope closes; a crash leaves it stale, which reads as interrupted.
|
|
@@ -204,12 +215,12 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
204
215
|
mode: dryRun ? "dry-run" : "live",
|
|
205
216
|
lab: plan.lab,
|
|
206
217
|
renderReview: renderCuaReviewMarkdown,
|
|
207
|
-
observer: { open: input.open === true, render:
|
|
218
|
+
observer: { open: input.open === true, render: seams.renderObserver },
|
|
208
219
|
});
|
|
209
220
|
if (!started.ok)
|
|
210
221
|
return admitted.refuse(started.code, started.message, descriptor.id);
|
|
211
222
|
const { run } = started;
|
|
212
|
-
const {
|
|
223
|
+
const { createdAt, paths: runPaths } = run;
|
|
213
224
|
const redactScreenshots = plan.residual.policies?.redactScreenshots === true;
|
|
214
225
|
await prepareContainedOutputDirectory(runPaths, "screenshots");
|
|
215
226
|
const source = await buildRunSource({
|
|
@@ -219,7 +230,7 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
219
230
|
packageName: "humanish",
|
|
220
231
|
});
|
|
221
232
|
// Live-trace flush seam (#441): runLabParticipants fills it when a live run has an in-progress bundle
|
|
222
|
-
// to grow;
|
|
233
|
+
// to grow; participants call it through deps.onTrace. It exists before deps so deps can reference it as
|
|
223
234
|
// a stable indirection.
|
|
224
235
|
const liveTrace = {};
|
|
225
236
|
const deps = cuaParticipantDeps(plan, input, admitted, {
|
|
@@ -229,7 +240,6 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
229
240
|
});
|
|
230
241
|
const subjectArgs = {
|
|
231
242
|
plan,
|
|
232
|
-
subjectRoute: admitted.subjectRoute,
|
|
233
243
|
...(publicRepo === undefined ? {} : { publicRepo }),
|
|
234
244
|
...(admitted.localTreeArchive === undefined
|
|
235
245
|
? {}
|
|
@@ -242,25 +252,20 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
242
252
|
dryRun: false,
|
|
243
253
|
});
|
|
244
254
|
const inProgressAggregateSubject = inProgressSubjects[0];
|
|
245
|
-
const inProgressProvenance = subjectProvenanceArg(inProgressAggregateSubject, publicRepo,
|
|
255
|
+
const inProgressProvenance = subjectProvenanceArg(inProgressAggregateSubject, publicRepo, [
|
|
256
|
+
...participantSubjectEnv(plan.runner.subject),
|
|
257
|
+
]);
|
|
246
258
|
const bundleBase = {
|
|
247
|
-
|
|
259
|
+
run,
|
|
248
260
|
participantRuns,
|
|
249
261
|
descriptor,
|
|
250
262
|
appUrl,
|
|
251
|
-
createdAt,
|
|
252
263
|
plan,
|
|
253
|
-
runId,
|
|
254
264
|
source,
|
|
255
265
|
participantPlan,
|
|
256
266
|
...(admitted.rerunLineage === undefined ? {} : { rerun: admitted.rerunLineage }),
|
|
257
267
|
redactScreenshots,
|
|
258
|
-
inProcessRoute,
|
|
259
|
-
localAppSubject,
|
|
260
|
-
cloneRoute,
|
|
261
|
-
localTreeRoute,
|
|
262
268
|
...(publicRepo === undefined ? {} : { publicRepo }),
|
|
263
|
-
subjectEnvNames,
|
|
264
269
|
};
|
|
265
270
|
const { externalCommsConfig, externalCommsEmail } = admitted;
|
|
266
271
|
return {
|
|
@@ -268,10 +273,8 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
268
273
|
setup: {
|
|
269
274
|
plan,
|
|
270
275
|
input,
|
|
271
|
-
config,
|
|
272
276
|
cwd,
|
|
273
277
|
descriptor,
|
|
274
|
-
subjectRoute: admitted.subjectRoute,
|
|
275
278
|
run,
|
|
276
279
|
streams: admitted.streams,
|
|
277
280
|
participantRuns,
|
|
@@ -294,35 +297,30 @@ export async function startCuaRun(plan, input, admitted, scope) {
|
|
|
294
297
|
},
|
|
295
298
|
fail: admitted.fail,
|
|
296
299
|
},
|
|
297
|
-
finish: {
|
|
300
|
+
finish: { rerunLineage: admitted.rerunLineage, publicRepo, subjectArgs },
|
|
298
301
|
};
|
|
299
302
|
}
|
|
300
|
-
/** The
|
|
303
|
+
/** The participant deps every participant reads: the route, keys, timeouts, scrubber, budget and seams. */
|
|
301
304
|
function cuaParticipantDeps(plan, input, admitted, run) {
|
|
302
|
-
const { config, dryRun,
|
|
303
|
-
const {
|
|
305
|
+
const { config, dryRun, seams, streams, env, runSession, participantCount } = admitted;
|
|
306
|
+
const { localTreeArchiveBuffer } = admitted;
|
|
304
307
|
const { openaiApiKey, e2bApiKey, scrubKnownValues } = admitted;
|
|
305
308
|
const { externalCommsConfig, externalCommsEmail } = admitted;
|
|
306
|
-
const { appUrl
|
|
307
|
-
const { subjectEnvNames } = admitted.subjectRoute;
|
|
309
|
+
const { appUrl } = admitted;
|
|
308
310
|
const { runPaths, redactScreenshots, liveTrace } = run;
|
|
309
|
-
const createDesktop =
|
|
311
|
+
const createDesktop = input.localVm?.desktop;
|
|
310
312
|
const timeoutMs = plan.sessionBudgetMs;
|
|
311
313
|
const requestTimeoutMs = e2bRequestTimeoutMs(env);
|
|
312
314
|
return {
|
|
313
315
|
...(createDesktop === undefined ? {} : { createDesktop }),
|
|
314
316
|
onTrace: (participantId, items, usage, metadata) => liveTrace.flush?.(participantId, items, usage, metadata),
|
|
315
|
-
config,
|
|
316
|
-
|
|
317
|
+
...callerDriving(input, config),
|
|
318
|
+
residual: plan.residual,
|
|
319
|
+
labId: plan.labId,
|
|
320
|
+
caps: plan.caps,
|
|
317
321
|
appUrl,
|
|
318
322
|
brain: plan.runner.brain,
|
|
319
|
-
|
|
320
|
-
desktopCliRoute,
|
|
321
|
-
localTreeRoute,
|
|
322
|
-
...(serve === undefined ? {} : { serve }),
|
|
323
|
-
...(subjectRepo === undefined ? {} : { subjectRepo }),
|
|
324
|
-
subjectEnvNames,
|
|
325
|
-
hasGithubToken,
|
|
323
|
+
subject: plan.runner.subject,
|
|
326
324
|
...(localTreeArchiveBuffer === undefined ? {} : { localTreeArchiveBuffer }),
|
|
327
325
|
env,
|
|
328
326
|
openaiApiKey,
|
|
@@ -336,7 +334,7 @@ function cuaParticipantDeps(plan, input, admitted, run) {
|
|
|
336
334
|
redactScreenshots,
|
|
337
335
|
scrubKnownValues,
|
|
338
336
|
runSession,
|
|
339
|
-
// The study-level ledger exists once per RUN, shared by every
|
|
337
|
+
// The study-level ledger exists once per RUN, shared by every participant (#299). Dry runs never
|
|
340
338
|
// spend, so they carry none.
|
|
341
339
|
...(dryRun || plan.caps.maxTotalUsd === undefined
|
|
342
340
|
? {}
|
|
@@ -349,8 +347,34 @@ function cuaParticipantDeps(plan, input, admitted, run) {
|
|
|
349
347
|
inboxUrl: externalInboxUrl(externalCommsConfig),
|
|
350
348
|
},
|
|
351
349
|
}),
|
|
352
|
-
now:
|
|
353
|
-
|
|
350
|
+
now: seams.now ?? Date.now,
|
|
351
|
+
...(seams.desktopModule === undefined ? {} : { desktopModule: seams.desktopModule }),
|
|
352
|
+
...(input.prepareDesktop === undefined ? {} : { prepareDesktop: input.prepareDesktop }),
|
|
353
|
+
...(seams.detachedTimers === undefined ? {} : { detachedTimers: seams.detachedTimers }),
|
|
354
|
+
onStream: streams.onStream,
|
|
355
|
+
reportSubjectPhase: subjectPhaseReporter(input),
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/** The caller's createProvider and inProcess executor, with the run's config bound. */
|
|
359
|
+
function callerDriving(input, config) {
|
|
360
|
+
const { createProvider, inProcess } = input;
|
|
361
|
+
return {
|
|
362
|
+
...(createProvider === undefined
|
|
363
|
+
? {}
|
|
364
|
+
: {
|
|
365
|
+
createProvider: (participant, executor) => createProvider({ config, participant, executor }),
|
|
366
|
+
}),
|
|
367
|
+
...(inProcess === undefined
|
|
368
|
+
? {}
|
|
369
|
+
: { inProcessExecutor: (appUrl) => inProcess.executor({ config, appUrl }) }),
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
/** Each subject phase goes to the phase sink, stderr by default, and to onEvent. */
|
|
373
|
+
function subjectPhaseReporter(input) {
|
|
374
|
+
const sink = input.deps?.subjectPhaseSink ?? defaultSubjectPhaseSink;
|
|
375
|
+
return (event, participant) => {
|
|
376
|
+
sink(event, participant);
|
|
377
|
+
input.emit?.(phaseEvent(event, { kind: "participant", participant: participantOf(participant) }));
|
|
354
378
|
};
|
|
355
379
|
}
|
|
356
380
|
function makeCuaRunId() {
|
|
@@ -3,8 +3,7 @@ import type { SubjectPhaseEvent } from "../../subject/steps.js";
|
|
|
3
3
|
import type { DesktopBrowserEvidence } from "../../substrates/e2b/desktop-browser.js";
|
|
4
4
|
import type { ActorPersonaRef } from "../../actors/contract.js";
|
|
5
5
|
import type { CuaLoopResult } from "../../actors/computer-use/loop.js";
|
|
6
|
-
import { type
|
|
7
|
-
import { type RunBundle, type RunFeedbackCandidate, type RunProviderResource } from "../../run/bundle.js";
|
|
6
|
+
import { type BundleRun, type RunBundle, type RunFeedbackCandidate, type RunProviderResource } from "../../run/bundle.js";
|
|
8
7
|
import { type RunDesktopGeometry, type RunStream } from "../../run/streams.js";
|
|
9
8
|
import { type Verdict } from "../../run/judge.js";
|
|
10
9
|
import { type DesktopUsage } from "../../run/cost-summary.js";
|
|
@@ -17,8 +16,8 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
17
16
|
/** The run's verdict, from the judge. */
|
|
18
17
|
verdict: Verdict;
|
|
19
18
|
realEmail?: boolean;
|
|
20
|
-
/**
|
|
21
|
-
|
|
19
|
+
/** The run this bundle belongs to; the bundle head reads its id, mode, start and lab. */
|
|
20
|
+
run: BundleRun;
|
|
22
21
|
actorId: string;
|
|
23
22
|
appUrl: string;
|
|
24
23
|
/** The participant's plan id, saved as the stream's laneId ("lane-01" when absent). */
|
|
@@ -26,7 +25,6 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
26
25
|
actorType?: string;
|
|
27
26
|
surface?: string;
|
|
28
27
|
caseGroup?: string;
|
|
29
|
-
createdAt: string;
|
|
30
28
|
dryRun: boolean;
|
|
31
29
|
labId: string;
|
|
32
30
|
labTitle?: string;
|
|
@@ -44,7 +42,6 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
44
42
|
/** Device-preset touch metadata echoed on the measured stream viewport (a prompt signal on
|
|
45
43
|
* this route, never a rendered claim); the measured width/height/DPR stay authoritative. */
|
|
46
44
|
isMobile?: boolean;
|
|
47
|
-
runId: string;
|
|
48
45
|
screenshots: string[];
|
|
49
46
|
/** Relative run-dir path of the digest-only comms-thread evidence artifact (humanish.comms-thread.v1),
|
|
50
47
|
* when a comms lab captured mail; registered as a "log" stream artifact. */
|
|
@@ -59,10 +56,10 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
59
56
|
session?: CuaLoopResult;
|
|
60
57
|
sessionError?: string;
|
|
61
58
|
/**
|
|
62
|
-
* The
|
|
63
|
-
* evidence of what it CLAIMED; whether the harness counts the claim is decided by the
|
|
59
|
+
* The route's own credibility read of a goal_satisfied session (#476). The actor's status is
|
|
60
|
+
* evidence of what it CLAIMED; whether the harness counts the claim is decided by the route
|
|
64
61
|
* (zero engagement, a final message that describes a blocker). The review has to say the same
|
|
65
|
-
* thing the
|
|
62
|
+
* thing the participant's exit code says, or the durable bundle reports a participant reaching the
|
|
66
63
|
* goal on a run the harness refused to count.
|
|
67
64
|
*/
|
|
68
65
|
credibility?: {
|
|
@@ -80,7 +77,7 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
80
77
|
* declared honestly as caller-provisioned/unpinned with no E2B. Absent: a plain app-url entry.
|
|
81
78
|
*/
|
|
82
79
|
entryKind?: "local-app";
|
|
83
|
-
/** The custom E2B desktop template (image) this
|
|
80
|
+
/** The custom E2B desktop template (image) this participant launched on, when configured (provenance). */
|
|
84
81
|
desktopTemplate?: string;
|
|
85
82
|
/** The configured browser choice and the command that opened, when explicitly configured. */
|
|
86
83
|
desktopBrowser?: DesktopBrowserEvidence;
|
|
@@ -90,7 +87,7 @@ export declare function buildSingleParticipantBundle(args: {
|
|
|
90
87
|
/** Completed subject-phase records (clone/upload/extract/install/build/ready/state groups)
|
|
91
88
|
* to fold into bundle.events, so run.json carries real phase timing after the fact. */
|
|
92
89
|
phaseEvents?: SubjectPhaseEvent[];
|
|
93
|
-
/** Host-side E2B desktop billed span for this
|
|
90
|
+
/** Host-side E2B desktop billed span for this participant, in minutes (from ParticipantRunOutcome
|
|
94
91
|
* desktopDurationMs). Absent when no sandbox ran (in-process/dry-run) → no desktop cost line. */
|
|
95
92
|
desktopMinutes?: number;
|
|
96
93
|
desktopUsage?: DesktopUsage;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { participantAssignment } from "../../lab/participant-assignment.js";
|
|
2
2
|
import { redactText } from "../../evidence/redaction.js";
|
|
3
|
-
import {} from "../../run/status.js";
|
|
4
3
|
import { REVIEW_SCHEMA, bundleArtifacts, bundleHead, } from "../../run/bundle.js";
|
|
5
4
|
import {} from "../../run/streams.js";
|
|
6
5
|
import { aggregateTaskFunnels, tallyParticipantOutcomes, withCuaReviewProvenance, } from "../../run/outcomes.js";
|
|
@@ -94,8 +93,8 @@ function singleSimulation(args, view) {
|
|
|
94
93
|
: args.sessionError !== undefined
|
|
95
94
|
? `Computer-use lab failed before a terminal session verdict: ${args.sessionError}`
|
|
96
95
|
: `Contract participant for the computer-use actor (${args.actorId}) against ${publicAppUrl}.`,
|
|
97
|
-
startedAt: args.createdAt,
|
|
98
|
-
updatedAt: args.createdAt,
|
|
96
|
+
startedAt: args.run.createdAt,
|
|
97
|
+
updatedAt: args.run.createdAt,
|
|
99
98
|
});
|
|
100
99
|
}
|
|
101
100
|
function singleStream(args, view) {
|
|
@@ -111,7 +110,7 @@ function singleStream(args, view) {
|
|
|
111
110
|
label: `CUA browser — ${args.labId}`,
|
|
112
111
|
status,
|
|
113
112
|
transport: "snapshot",
|
|
114
|
-
updatedAt: args.createdAt,
|
|
113
|
+
updatedAt: args.run.createdAt,
|
|
115
114
|
embed: lastScreenshot
|
|
116
115
|
? { kind: "screenshot", url: lastScreenshot, title: `CUA desktop (${screenshotMode})` }
|
|
117
116
|
: { kind: "placeholder", title: "CUA desktop" },
|
|
@@ -162,7 +161,7 @@ function singleEvents(args, view) {
|
|
|
162
161
|
const events = [
|
|
163
162
|
{
|
|
164
163
|
id: "event-000-created",
|
|
165
|
-
at: args.createdAt,
|
|
164
|
+
at: args.run.createdAt,
|
|
166
165
|
level: "info",
|
|
167
166
|
type: "cua-lab.run.created",
|
|
168
167
|
message: `Created computer-use lab run for ${args.labId} (actor ${args.actorId}).`,
|
|
@@ -170,7 +169,7 @@ function singleEvents(args, view) {
|
|
|
170
169
|
args.subjectProvenance
|
|
171
170
|
? participantEvent(SINGLE, {
|
|
172
171
|
id: "event-001-subject",
|
|
173
|
-
at: args.createdAt,
|
|
172
|
+
at: args.run.createdAt,
|
|
174
173
|
level: "info",
|
|
175
174
|
type: "cua-lab.subject.provenance",
|
|
176
175
|
// HONEST WORDING: claim "cloned/packed and served" only when it actually happened.
|
|
@@ -178,7 +177,7 @@ function singleEvents(args, view) {
|
|
|
178
177
|
})
|
|
179
178
|
: participantEvent(SINGLE, {
|
|
180
179
|
id: "event-001-subject",
|
|
181
|
-
at: args.createdAt,
|
|
180
|
+
at: args.run.createdAt,
|
|
182
181
|
level: "info",
|
|
183
182
|
type: "cua-lab.subject.declared",
|
|
184
183
|
// Invariant 5: declare what the subject WAS, including the ABSENCE of a pin. A
|
|
@@ -195,7 +194,7 @@ function singleEvents(args, view) {
|
|
|
195
194
|
args.session
|
|
196
195
|
? participantEvent(SINGLE, {
|
|
197
196
|
id: "event-002-session",
|
|
198
|
-
at: args.createdAt,
|
|
197
|
+
at: args.run.createdAt,
|
|
199
198
|
level: args.session.status === "passed" ? "info" : "warn",
|
|
200
199
|
type: `cua-lab.session.${args.session.completionReason}`,
|
|
201
200
|
message: `${args.session.status}: ${args.session.reason}`,
|
|
@@ -203,7 +202,7 @@ function singleEvents(args, view) {
|
|
|
203
202
|
: args.inProgress === true
|
|
204
203
|
? participantEvent(SINGLE, {
|
|
205
204
|
id: "event-002-running",
|
|
206
|
-
at: args.createdAt,
|
|
205
|
+
at: args.run.createdAt,
|
|
207
206
|
level: "info",
|
|
208
207
|
type: "cua-lab.session.running",
|
|
209
208
|
message: "Live computer-use session is running; terminal evidence has not been written yet.",
|
|
@@ -211,14 +210,14 @@ function singleEvents(args, view) {
|
|
|
211
210
|
: args.sessionError !== undefined
|
|
212
211
|
? participantEvent(SINGLE, {
|
|
213
212
|
id: "event-002-session",
|
|
214
|
-
at: args.createdAt,
|
|
213
|
+
at: args.run.createdAt,
|
|
215
214
|
level: "error",
|
|
216
215
|
type: "cua-lab.session.error",
|
|
217
216
|
message: args.sessionError,
|
|
218
217
|
})
|
|
219
218
|
: participantEvent(SINGLE, {
|
|
220
219
|
id: "event-002-contract",
|
|
221
|
-
at: args.createdAt,
|
|
220
|
+
at: args.run.createdAt,
|
|
222
221
|
level: "info",
|
|
223
222
|
type: "cua-lab.contract.ready",
|
|
224
223
|
message: "Dry-run contract bundle ready; switch scenario.mode to live for a real desktop session.",
|
|
@@ -242,7 +241,7 @@ function singleEvents(args, view) {
|
|
|
242
241
|
for (const warning of desktopGeometry?.warnings ?? []) {
|
|
243
242
|
record({
|
|
244
243
|
id: `event-${String(phaseEventSeq++).padStart(3, "0")}-geometry-warning`,
|
|
245
|
-
at: args.createdAt,
|
|
244
|
+
at: args.run.createdAt,
|
|
246
245
|
level: "warn",
|
|
247
246
|
type: "cua-lab.geometry.warning",
|
|
248
247
|
message: warning,
|
|
@@ -254,12 +253,12 @@ function singleReview(args, view, stream) {
|
|
|
254
253
|
const { reason } = view;
|
|
255
254
|
// A funnel with a denominator of one is still the funnel — and its absence stays honest: no
|
|
256
255
|
// declared protocol (or a dry run) means no `tasks` field, never an empty one.
|
|
257
|
-
const
|
|
256
|
+
const singleRunTasks = args.inProgress !== true && args.session?.trace.taskFunnel !== undefined
|
|
258
257
|
? aggregateTaskFunnels([args.session.trace.taskFunnel])
|
|
259
258
|
: undefined;
|
|
260
|
-
// What happened to the participant, as the
|
|
259
|
+
// What happened to the participant, as the route judged it — the same rule the fan-out roll-up
|
|
261
260
|
// applies (participantStatusForOutcome). Before #476 this read the actor's own status, so a
|
|
262
|
-
// run the
|
|
261
|
+
// run the route refused as "not a credible pass" was written up as verdict pass, 1/1 reached
|
|
263
262
|
// the goal, and every projection of the bundle (Observer tally, `runs`, the status index)
|
|
264
263
|
// repeated it. Found on a real drawDB run whose participant wrote "Blocked after partial
|
|
265
264
|
// completion".
|
|
@@ -274,14 +273,14 @@ function singleReview(args, view, stream) {
|
|
|
274
273
|
const review = withCuaReviewProvenance({
|
|
275
274
|
schema: REVIEW_SCHEMA,
|
|
276
275
|
verdict: args.verdict,
|
|
277
|
-
// One
|
|
278
|
-
// result from being read as though it generalized.
|
|
276
|
+
// One participant is still a study with a denominator of one, and saying so keeps a
|
|
277
|
+
// single-participant result from being read as though it generalized.
|
|
279
278
|
...(participantStatus !== undefined && args.inProgress !== true
|
|
280
279
|
? {
|
|
281
280
|
participants: tallyParticipantOutcomes([participantStatus], [args.credibility?.reportedFriction === true]),
|
|
282
281
|
}
|
|
283
282
|
: {}),
|
|
284
|
-
...(
|
|
283
|
+
...(singleRunTasks === undefined ? {} : { tasks: singleRunTasks }),
|
|
285
284
|
summary: credibilityNote === undefined ? reason : `${credibilityNote} ${reason}`,
|
|
286
285
|
gaps: args.session || args.sessionError !== undefined
|
|
287
286
|
? []
|
|
@@ -305,15 +304,11 @@ export function buildSingleParticipantBundle(args) {
|
|
|
305
304
|
const events = singleEvents(args, view);
|
|
306
305
|
const review = singleReview(args, view, stream);
|
|
307
306
|
return {
|
|
308
|
-
...bundleHead({
|
|
307
|
+
...bundleHead(args.run, {
|
|
309
308
|
...(args.realEmail && !args.dryRun
|
|
310
309
|
? { publication: { restrictions: ["real-communications"] } }
|
|
311
310
|
: {}),
|
|
312
|
-
runId: args.runId,
|
|
313
|
-
mode: args.dryRun ? "dry-run" : "live",
|
|
314
311
|
participants: 1,
|
|
315
|
-
createdAt: args.createdAt,
|
|
316
|
-
...(args.lab === undefined ? {} : { lab: args.lab }),
|
|
317
312
|
source: args.source,
|
|
318
313
|
}),
|
|
319
314
|
persona: {
|
|
@@ -331,7 +326,7 @@ export function buildSingleParticipantBundle(args) {
|
|
|
331
326
|
},
|
|
332
327
|
lifecycle: [
|
|
333
328
|
{
|
|
334
|
-
at: args.createdAt,
|
|
329
|
+
at: args.run.createdAt,
|
|
335
330
|
event: "cua-lab.run.created",
|
|
336
331
|
message: `Created computer-use lab run with one participant in a desktop browser (actor ${args.actorId}).`,
|
|
337
332
|
},
|
|
@@ -356,7 +351,7 @@ export function buildSingleParticipantBundle(args) {
|
|
|
356
351
|
feedbackCandidates: args.dryRun || args.inProgress === true
|
|
357
352
|
? []
|
|
358
353
|
: participantFeedbackCandidates({
|
|
359
|
-
runId: args.runId,
|
|
354
|
+
runId: args.run.runId,
|
|
360
355
|
scenarioId: `cua-${args.labId}`,
|
|
361
356
|
adapterId: args.labId,
|
|
362
357
|
goal: redactText(args.mission),
|
|
@@ -2,16 +2,14 @@ import type { ComputerUsePlan } from "../../lab/plan-types.js";
|
|
|
2
2
|
import type { LabSubjectState } from "../../lab/types.js";
|
|
3
3
|
import { type RunSubjectProvenance, type RunSubjectStateStepRecord } from "../../run/bundle.js";
|
|
4
4
|
import { type LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
5
|
-
import { type CuaSubjectRoute } from "./plan.js";
|
|
6
5
|
import { type DesktopParticipantRun, type CuaSubjectProjection, type CuaSubjectProvenanceArg, type ParticipantRunOutcome } from "./types.js";
|
|
7
6
|
/**
|
|
8
|
-
* Each
|
|
7
|
+
* Each participant's subject projection. A participant's outcome adds the subject commit it resolved and the
|
|
9
8
|
* state steps it executed; without outcomes (dry run, or a run still in progress) the declared
|
|
10
9
|
* state is projected as not yet run.
|
|
11
10
|
*/
|
|
12
11
|
export declare function projectParticipantSubjects(args: {
|
|
13
12
|
plan: ComputerUsePlan;
|
|
14
|
-
subjectRoute: CuaSubjectRoute;
|
|
15
13
|
publicRepo?: string;
|
|
16
14
|
localTreeArchive?: LocalTreeArchive;
|
|
17
15
|
runs: readonly DesktopParticipantRun[];
|
|
@@ -35,10 +33,10 @@ export declare function resolveSubjectState(args: {
|
|
|
35
33
|
* default branch that builder already handles). */
|
|
36
34
|
export declare function subjectProvenanceArg(subject: CuaSubjectProjection, publicRepo: string | undefined, subjectEnvNames: string[]): CuaSubjectProvenanceArg | undefined;
|
|
37
35
|
/**
|
|
38
|
-
* The run-level subject for the top level and the bundle. Local-tree
|
|
39
|
-
* once-per-run archive, so every
|
|
40
|
-
* the first
|
|
41
|
-
* aggregate carries it only when every
|
|
36
|
+
* The run-level subject for the top level and the bundle. Local-tree participants all pack from the
|
|
37
|
+
* same once-per-run archive, so every participant already carries the identical archiveSha256/commit/dirty and
|
|
38
|
+
* the first participant's projection is the aggregate. Clone participants each resolve their own
|
|
39
|
+
* commit; the aggregate carries it only when every participant agrees, and warns when they diverge.
|
|
42
40
|
*/
|
|
43
41
|
export declare function aggregateCuaSubject(args: {
|
|
44
42
|
subjects: readonly CuaSubjectProjection[];
|