humanish 0.106.0 → 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 -2
- package/ARCHITECTURE.md +17 -16
- package/CHANGELOG.md +24 -0
- package/CONTEXT.md +42 -39
- package/CONTRIBUTING.md +8 -6
- 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 +31 -4
- package/dist/actors/codex/qualified-versions.js +51 -6
- 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 +10 -8
- package/dist/actors/contract.js +7 -1
- 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.d.ts +2 -0
- package/dist/lab/composition-rules.js +35 -26
- 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 +6 -2
- package/dist/lab/plan-base.js +22 -7
- package/dist/lab/plan-participants.d.ts +5 -5
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +33 -7
- 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/observer-app.html +1 -1
- 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} +14 -13
- 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 +58 -33
- 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 +59 -65
- package/dist/routes/computer-use/preflight.d.ts +6 -11
- package/dist/routes/computer-use/preflight.js +26 -18
- 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 -17
- package/dist/routes/computer-use/setup.js +98 -86
- 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 -211
- package/dist/routes/computer-use/types.js +13 -6
- 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 +11 -6
- 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} +46 -51
- 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 +48 -41
- 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 +4 -2
- package/dist/routes/terminal/live-sandbox.js +25 -21
- 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 +5 -3
- package/dist/routes/terminal/sandbox.js +13 -16
- 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 +7 -1
- package/dist/run/reclaim.js +24 -4
- 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/desktop-session.d.ts +2 -0
- 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.d.ts +2 -0
- package/dist/substrates/e2b/sandbox.js +22 -8
- package/dist/substrates/e2b/sdk.d.ts +12 -1
- package/dist/substrates/e2b/sdk.js +30 -9
- 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 +40 -4
- 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,32 +1,39 @@
|
|
|
1
|
-
// The model side of one computer-use
|
|
1
|
+
// The model side of one computer-use participant: the provider a local agent brings, the session options
|
|
2
2
|
// the loop runs with, the study's shared spend ledger, the provider cleanup, and the checks on the
|
|
3
|
-
// finished session. The desktop side stays with the
|
|
3
|
+
// finished session. The desktop side stays with the participant runner.
|
|
4
4
|
import { startClaudeSession } from "../../actors/local-agent/claude-session.js";
|
|
5
5
|
import { createLocalAgentProvider } from "../../actors/local-agent/cli.js";
|
|
6
|
-
import {
|
|
6
|
+
import { pricedModel } from "../../lab/plan-base.js";
|
|
7
7
|
import { estimateActorCostForExecution, round6 } from "../../run/pricing.js";
|
|
8
8
|
import { redactText } from "../../evidence/redaction.js";
|
|
9
|
-
import { createRestrictedCodexParticipant } from "../../actors/codex/restricted-participant.js";
|
|
9
|
+
import { createRestrictedCodexParticipant, } from "../../actors/codex/restricted-participant.js";
|
|
10
10
|
import { writeContainedOutputFile } from "../../run/contained-output.js";
|
|
11
11
|
import { withInboxMission } from "./participant-prompt.js";
|
|
12
12
|
import { resolveSelfReportedBlocker, resolveSelfReportedFriction, sessionEnding, } from "./self-report.js";
|
|
13
13
|
import { hollowCompletion } from "../../run/judge.js";
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
// Caller providers backed by a native Codex session (the local study's), with their close report.
|
|
15
|
+
const closeReports = new WeakMap();
|
|
16
|
+
/**
|
|
17
|
+
* Registers a caller's provider as backed by a native Codex session: the participant runner reads the session's
|
|
18
|
+
* run warnings and a refusal no request reported from `report` when it closes the provider.
|
|
19
|
+
*/
|
|
20
|
+
export function withCloseReport(provider, report) {
|
|
21
|
+
closeReports.set(provider, report);
|
|
22
|
+
return provider;
|
|
23
|
+
}
|
|
24
|
+
/** Starts the participant's model: a caller's provider, the operator's Codex, a Claude session, or none. */
|
|
16
25
|
export async function startParticipantModel(spec, deps, executor) {
|
|
17
|
-
const {
|
|
18
|
-
if (deps.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
lane: legacyHookSpecOf(spec),
|
|
24
|
-
laneCount: deps.participantCount,
|
|
25
|
-
executor,
|
|
26
|
-
}),
|
|
26
|
+
const { env, brain } = deps;
|
|
27
|
+
if (deps.createProvider) {
|
|
28
|
+
const participant = {
|
|
29
|
+
id: spec.planned.id,
|
|
30
|
+
index: spec.planned.index,
|
|
31
|
+
count: deps.participantCount,
|
|
27
32
|
};
|
|
33
|
+
return { provider: await deps.createProvider(participant, executor) };
|
|
28
34
|
}
|
|
29
|
-
|
|
35
|
+
const localAgent = brain.kind === "local-agent" ? brain.agent : undefined;
|
|
36
|
+
if (localAgent === "codex") {
|
|
30
37
|
// Hosted local-agent studies use the same native participant engine as local desktops.
|
|
31
38
|
// Operator auth deliberately retains the operator's Codex home, config and supported auth
|
|
32
39
|
// stores instead of applying the isolated restricted-account profile used by local studies.
|
|
@@ -35,13 +42,13 @@ export async function startParticipantModel(spec, deps, executor) {
|
|
|
35
42
|
...(spec.planned.limits.reasoningEffort === undefined
|
|
36
43
|
? {}
|
|
37
44
|
: { reasoningEffort: spec.planned.limits.reasoningEffort }),
|
|
38
|
-
...(
|
|
45
|
+
...(brain.declaredModel === undefined ? {} : { model: brain.declaredModel }),
|
|
39
46
|
...(executor.speechEnabled === true ? { speechEnabled: true } : {}),
|
|
40
47
|
session: { env },
|
|
41
48
|
});
|
|
42
49
|
return { provider: codexParticipant.provider, codexParticipant };
|
|
43
50
|
}
|
|
44
|
-
if (
|
|
51
|
+
if (localAgent === "claude") {
|
|
45
52
|
// One session for the whole run, like the codex thread above (#520). The one-shot
|
|
46
53
|
// provider (createLocalAgentProvider) spawned `claude -p` per turn, and every turn
|
|
47
54
|
// started with no memory of the last. HUMANISH_LOCAL_AGENT_ONE_SHOT=1 keeps that path
|
|
@@ -58,7 +65,7 @@ export async function startParticipantModel(spec, deps, executor) {
|
|
|
58
65
|
...(spec.planned.limits.reasoningEffort === undefined
|
|
59
66
|
? {}
|
|
60
67
|
: { reasoningEffort: spec.planned.limits.reasoningEffort }),
|
|
61
|
-
...(
|
|
68
|
+
...(brain.declaredModel === undefined ? {} : { model: brain.declaredModel }),
|
|
62
69
|
}),
|
|
63
70
|
};
|
|
64
71
|
}
|
|
@@ -66,22 +73,21 @@ export async function startParticipantModel(spec, deps, executor) {
|
|
|
66
73
|
...(spec.planned.limits.reasoningEffort === undefined
|
|
67
74
|
? {}
|
|
68
75
|
: { reasoningEffort: spec.planned.limits.reasoningEffort }),
|
|
69
|
-
...(
|
|
76
|
+
...(brain.declaredModel === undefined ? {} : { model: brain.declaredModel }),
|
|
70
77
|
});
|
|
71
78
|
return { provider: claudeSession.provider, claudeSession };
|
|
72
79
|
}
|
|
73
80
|
return {};
|
|
74
81
|
}
|
|
75
|
-
/** The options the
|
|
82
|
+
/** The options the participant's session runs with: prompt, model settings, spend caps and callbacks. */
|
|
76
83
|
export function participantSessionOptions(spec, deps, ready, provider, writeScreenshot) {
|
|
77
|
-
const { config } = deps;
|
|
78
84
|
const { executor, inbox } = ready;
|
|
79
85
|
// The FAIL-CLOSED spend cap (execution.caps.maxUsd) is wired into the loop as maxUsd + an
|
|
80
86
|
// injected pure per-turn estimator keyed on the resolved model. Preflight already refused a
|
|
81
87
|
// cap on an unpriced model, so the estimate is measurable whenever a cap is in force. The
|
|
82
88
|
// model id here matches provider.version (openai-responses-cu resolves the default when unset).
|
|
83
|
-
const capModelId =
|
|
84
|
-
const maxUsd =
|
|
89
|
+
const capModelId = pricedModel(deps.brain);
|
|
90
|
+
const maxUsd = deps.caps.maxUsd;
|
|
85
91
|
return {
|
|
86
92
|
instructions: inbox
|
|
87
93
|
? withInboxMission(spec, inbox.url, inbox.address, inbox.receiving).instructions
|
|
@@ -94,8 +100,9 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
|
|
|
94
100
|
...(provider === undefined ? {} : { provider: provider }),
|
|
95
101
|
openai: {
|
|
96
102
|
apiKey: deps.openaiApiKey,
|
|
97
|
-
...(
|
|
98
|
-
// Per-
|
|
103
|
+
...(deps.brain.declaredModel ? { model: deps.brain.declaredModel } : {}),
|
|
104
|
+
// Per-participant, not per-actor: two participants at different efforts is the control this
|
|
105
|
+
// exists for.
|
|
99
106
|
...(spec.planned.limits.reasoningEffort === undefined
|
|
100
107
|
? {}
|
|
101
108
|
: { reasoningEffort: spec.planned.limits.reasoningEffort }),
|
|
@@ -122,8 +129,9 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
|
|
|
122
129
|
: { stopWhen: spec.planned.limits.stopWhen }),
|
|
123
130
|
...(spec.planned.limits.dwell === undefined ? {} : { dwell: spec.planned.limits.dwell }),
|
|
124
131
|
...(spec.planned.tasks === undefined ? {} : { tasks: spec.planned.tasks }),
|
|
125
|
-
// The STUDY budget (#299): this
|
|
126
|
-
// and stops when the RUN total crosses the cap — independent of the per-
|
|
132
|
+
// The STUDY budget (#299): this participant notes its own running estimate on the shared
|
|
133
|
+
// ledger and stops when the RUN total crosses the cap — independent of the per-participant
|
|
134
|
+
// maxUsd above.
|
|
127
135
|
...(deps.runBudget === undefined
|
|
128
136
|
? {}
|
|
129
137
|
: {
|
|
@@ -141,18 +149,19 @@ export function participantSessionOptions(spec, deps, ready, provider, writeScre
|
|
|
141
149
|
...(deps.onTrace === undefined
|
|
142
150
|
? {}
|
|
143
151
|
: {
|
|
144
|
-
// Forwards the RUNNING usage as well: the
|
|
152
|
+
// Forwards the RUNNING usage as well: the participant runner is where both are known, and usage
|
|
145
153
|
// without it never reaches the flush — which is how the live cost stayed unknown.
|
|
146
154
|
onTrace: (items, usage, metadata) => deps.onTrace?.(spec.planned.id, items, usage, metadata),
|
|
147
155
|
}),
|
|
148
156
|
};
|
|
149
157
|
}
|
|
150
158
|
/**
|
|
151
|
-
* Closes the
|
|
159
|
+
* Closes the participant's model, in the order it was opened. Returns true when a provider's cleanup is
|
|
152
160
|
* unconfirmed; each failure also adds a warning.
|
|
153
161
|
*/
|
|
154
162
|
export async function closeParticipantModel(model, warnings) {
|
|
155
163
|
let unconfirmed = false;
|
|
164
|
+
let refusal;
|
|
156
165
|
try {
|
|
157
166
|
if (model.codexParticipant === undefined)
|
|
158
167
|
await model.provider?.close?.();
|
|
@@ -163,6 +172,8 @@ export async function closeParticipantModel(model, warnings) {
|
|
|
163
172
|
}
|
|
164
173
|
try {
|
|
165
174
|
const cleanup = await model.codexParticipant?.close();
|
|
175
|
+
warnings.push(...(cleanup?.warnings ?? []));
|
|
176
|
+
refusal = cleanup?.refusal;
|
|
166
177
|
if (cleanup?.status === "unconfirmed") {
|
|
167
178
|
warnings.push("Model provider cleanup is unconfirmed.");
|
|
168
179
|
unconfirmed = true;
|
|
@@ -172,17 +183,31 @@ export async function closeParticipantModel(model, warnings) {
|
|
|
172
183
|
warnings.push("Model provider cleanup is unconfirmed.");
|
|
173
184
|
unconfirmed = true;
|
|
174
185
|
}
|
|
186
|
+
const report = model.codexParticipant === undefined && model.provider !== undefined
|
|
187
|
+
? closeReports.get(model.provider)
|
|
188
|
+
: undefined;
|
|
189
|
+
if (report) {
|
|
190
|
+
// The provider's own close reported cleanup above; this reads what its session found.
|
|
191
|
+
try {
|
|
192
|
+
const found = await report();
|
|
193
|
+
warnings.push(...(found.warnings ?? []));
|
|
194
|
+
refusal ??= found.refusal;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
/* Cleanup was already reported through the provider's close. */
|
|
198
|
+
}
|
|
199
|
+
}
|
|
175
200
|
try {
|
|
176
201
|
await model.claudeSession?.close();
|
|
177
202
|
}
|
|
178
203
|
catch {
|
|
179
204
|
warnings.push("Claude session cleanup failed; desktop cleanup will still run.");
|
|
180
205
|
}
|
|
181
|
-
return unconfirmed;
|
|
206
|
+
return { unconfirmed, refusal };
|
|
182
207
|
}
|
|
183
208
|
/** Prices the finished session's tokens onto its trace, writes the trace, and warns on raw screenshots. */
|
|
184
209
|
export async function recordParticipantTrace(spec, deps, session, warnings) {
|
|
185
|
-
// Per-
|
|
210
|
+
// Per-participant model-token cost ESTIMATE, attached to the trace before it is persisted (the model
|
|
186
211
|
// id is authoritative here — provider.version). Kept at the lab boundary so the pure loop
|
|
187
212
|
// never depends on the operator rate table. estimateActorCost declares absent (null) for an
|
|
188
213
|
// unknown rate / missing usage rather than guessing.
|
|
@@ -15,8 +15,8 @@ export declare const DEFAULT_MISSION = "You are testing a web application. The b
|
|
|
15
15
|
export declare const CLOSING_LINE_DIRECTIVE: string;
|
|
16
16
|
/** The persona id a computer-use participant gets when neither it nor its actor names one. */
|
|
17
17
|
export declare const FALLBACK_PERSONA_ID = "cua-operator";
|
|
18
|
-
/** Compose one
|
|
19
|
-
* At N=1 (homogeneous, no roster) this reproduces the prior composeInstructions byte-for-byte. */
|
|
18
|
+
/** Compose one participant's actor prompt: persona line + device line + mission + per-participant
|
|
19
|
+
* steer. At N=1 (homogeneous, no roster) this reproduces the prior composeInstructions byte-for-byte. */
|
|
20
20
|
export declare function composeParticipantInstructions(args: {
|
|
21
21
|
mission: string;
|
|
22
22
|
persona?: string;
|
|
@@ -46,7 +46,7 @@ export declare function composeParticipantInstructions(args: {
|
|
|
46
46
|
instructions: string;
|
|
47
47
|
persona: ActorPersonaRef;
|
|
48
48
|
};
|
|
49
|
-
/** Runtime-inject the persona inbox instruction into a
|
|
49
|
+
/** Runtime-inject the persona inbox instruction into a participant's prompt (#297 slice B). The inbox URL is a
|
|
50
50
|
* runtime loopback/getHost address (not secret), so — mirroring the lobby-code runtime injection — this
|
|
51
51
|
* augments only the instructions the model receives; the authored prompt + its digest are unchanged.
|
|
52
52
|
* Returns a new spec (never mutates). Shared by the CUA + concurrent shared-world routes. */
|
|
@@ -19,8 +19,8 @@ export const CLOSING_LINE_DIRECTIVE = "When you stop, make the FIRST line of you
|
|
|
19
19
|
"Then, from the next line, say what you did, what confused you, and where you hesitated.";
|
|
20
20
|
/** The persona id a computer-use participant gets when neither it nor its actor names one. */
|
|
21
21
|
export const FALLBACK_PERSONA_ID = "cua-operator";
|
|
22
|
-
/** Compose one
|
|
23
|
-
* At N=1 (homogeneous, no roster) this reproduces the prior composeInstructions byte-for-byte. */
|
|
22
|
+
/** Compose one participant's actor prompt: persona line + device line + mission + per-participant
|
|
23
|
+
* steer. At N=1 (homogeneous, no roster) this reproduces the prior composeInstructions byte-for-byte. */
|
|
24
24
|
export function composeParticipantInstructions(args) {
|
|
25
25
|
const { name, preset } = args.device;
|
|
26
26
|
const deviceLine = preset.isMobile
|
|
@@ -31,7 +31,7 @@ export function composeParticipantInstructions(args) {
|
|
|
31
31
|
// be measured optimizes for the measurement instead of using the product (src/lab/tasks.ts).
|
|
32
32
|
const taskLines = renderTaskPrompt(args.tasks ?? []);
|
|
33
33
|
// A resolved persona contributes its compiled directives (friction tolerance, skill bias,
|
|
34
|
-
// accessibility behavior, constraints) through the SAME persona.ts compiler the terminal
|
|
34
|
+
// accessibility behavior, constraints) through the SAME persona.ts compiler the terminal route
|
|
35
35
|
// uses, so one persona file means one behavior across every route.
|
|
36
36
|
const personaLine = args.resolvedPersona
|
|
37
37
|
? renderPersonaPromptSection(args.resolvedPersona)
|
|
@@ -64,7 +64,7 @@ export function composeParticipantInstructions(args) {
|
|
|
64
64
|
},
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
|
-
/** Runtime-inject the persona inbox instruction into a
|
|
67
|
+
/** Runtime-inject the persona inbox instruction into a participant's prompt (#297 slice B). The inbox URL is a
|
|
68
68
|
* runtime loopback/getHost address (not secret), so — mirroring the lobby-code runtime injection — this
|
|
69
69
|
* augments only the instructions the model receives; the authored prompt + its digest are unchanged.
|
|
70
70
|
* Returns a new spec (never mutates). Shared by the CUA + concurrent shared-world routes. */
|
|
@@ -5,8 +5,8 @@ import { type RunRerunLineage } from "../../run/bundle.js";
|
|
|
5
5
|
import type { PreparedSelectedOutputDirectory } from "../../run/contained-output.js";
|
|
6
6
|
import { type CuaActorLabErrorCode, type CuaParticipantPlan, type CuaParticipantPlanEntry, type DesktopParticipantRun } from "./types.js";
|
|
7
7
|
export declare function defaultSessionTimeoutMs(config: LabConfig): number;
|
|
8
|
-
/** Per-
|
|
9
|
-
* verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
|
|
8
|
+
/** Per-participant sandbox deadline (each one owns its own desktop). Mirrors the
|
|
9
|
+
* single-participant formula verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
|
|
10
10
|
* or local-tree: provision budget + Σ state-step budgets) + the server-side
|
|
11
11
|
* reclamation buffer. Local-tree shares the clone route's provisioning budget: it swaps a
|
|
12
12
|
* git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
|
|
@@ -21,8 +21,8 @@ export declare function resolveParticipantSandboxMs(config: LabConfig): number;
|
|
|
21
21
|
*/
|
|
22
22
|
export declare function boundedConcurrency(declared: number | undefined, participantCount: number): number;
|
|
23
23
|
/**
|
|
24
|
-
* Pure pre-flight plan resolver (runs in dry-run AND live). Returns the
|
|
25
|
-
* effective concurrency, the wave count, the per-
|
|
24
|
+
* Pure pre-flight plan resolver (runs in dry-run AND live). Returns the participant table, the
|
|
25
|
+
* effective concurrency, the wave count, the per-participant session budget, and the worst-case total
|
|
26
26
|
* sandbox-minutes — BEFORE any sandbox or provider call. The same plan appears in dry-run,
|
|
27
27
|
* marked $0 (dryRun: true).
|
|
28
28
|
*/
|
|
@@ -32,7 +32,7 @@ export declare function resolveCuaParticipantPlan(config: LabConfig, opts?: {
|
|
|
32
32
|
dryRun?: boolean;
|
|
33
33
|
personas?: Map<string, ResolvedPersona>;
|
|
34
34
|
}): CuaParticipantPlan;
|
|
35
|
-
/** Print the
|
|
35
|
+
/** Print the participant plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
|
|
36
36
|
* digests, and budgets only — no prompt text, no secrets). */
|
|
37
37
|
export declare function emitPreflightPlan(participantPlan: CuaParticipantPlan, labId: string): void;
|
|
38
38
|
export declare function formatParticipantPlanEntry(entry: CuaParticipantPlanEntry): string;
|
|
@@ -63,5 +63,5 @@ export declare function loadCuaParticipants(args: {
|
|
|
63
63
|
code: CuaActorLabErrorCode;
|
|
64
64
|
message: string;
|
|
65
65
|
}>;
|
|
66
|
-
/** Scrub known secret values from each
|
|
66
|
+
/** Scrub known secret values from each participant's declarative snapshot before any bundle uses it. */
|
|
67
67
|
export declare function sanitizeParticipantRuns(runs: readonly DesktopParticipantRun[], scrub: (text: string) => string): void;
|
|
@@ -26,8 +26,8 @@ export function defaultSessionTimeoutMs(config) {
|
|
|
26
26
|
const room = MAX_SANDBOX_MS - SUBJECT_PROVISION_BUDGET_MS - stateBudgetMs - SANDBOX_TIMEOUT_BUFFER_MS;
|
|
27
27
|
return Math.max(MIN_DERIVED_SESSION_TIMEOUT_MS, Math.min(DEFAULT_APP_URL_SESSION_TIMEOUT_MS, room));
|
|
28
28
|
}
|
|
29
|
-
/** Per-
|
|
30
|
-
* verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
|
|
29
|
+
/** Per-participant sandbox deadline (each one owns its own desktop). Mirrors the
|
|
30
|
+
* single-participant formula verbatim so N=1 stays byte-stable: explicit sandboxTimeoutMs, else session budget + (clone
|
|
31
31
|
* or local-tree: provision budget + Σ state-step budgets) + the server-side
|
|
32
32
|
* reclamation buffer. Local-tree shares the clone route's provisioning budget: it swaps a
|
|
33
33
|
* git clone for an upload+extract, but the shared install/build/state/start/probe pipeline
|
|
@@ -162,8 +162,8 @@ function participantRunsAndPlan(planned, opts = {}) {
|
|
|
162
162
|
return { runs, participantPlan };
|
|
163
163
|
}
|
|
164
164
|
/**
|
|
165
|
-
* Pure pre-flight plan resolver (runs in dry-run AND live). Returns the
|
|
166
|
-
* effective concurrency, the wave count, the per-
|
|
165
|
+
* Pure pre-flight plan resolver (runs in dry-run AND live). Returns the participant table, the
|
|
166
|
+
* effective concurrency, the wave count, the per-participant session budget, and the worst-case total
|
|
167
167
|
* sandbox-minutes — BEFORE any sandbox or provider call. The same plan appears in dry-run,
|
|
168
168
|
* marked $0 (dryRun: true).
|
|
169
169
|
*/
|
|
@@ -171,11 +171,11 @@ export function resolveCuaParticipantPlan(config, opts = {}) {
|
|
|
171
171
|
const { countOverride, ...rest } = opts;
|
|
172
172
|
return participantRunsAndPlan(plannedParticipantsOf(config, countOverride), rest).participantPlan;
|
|
173
173
|
}
|
|
174
|
-
/** Print the
|
|
174
|
+
/** Print the participant plan to stderr BEFORE any sandbox/provider call (public-safe: ids, devices,
|
|
175
175
|
* digests, and budgets only — no prompt text, no secrets). */
|
|
176
176
|
export function emitPreflightPlan(participantPlan, labId) {
|
|
177
177
|
const lines = [];
|
|
178
|
-
lines.push(`humanish
|
|
178
|
+
lines.push(`humanish computer-use fan-out plan (${labId}): ${participantPlan.laneCount} participant(s), strategy ${participantPlan.strategy}, concurrency ${participantPlan.concurrency}${participantPlan.envLoweredConcurrencyFrom === undefined ? "" : ` (lowered from ${participantPlan.envLoweredConcurrencyFrom} by ${CUA_MAX_CONCURRENCY_ENV})`}, ${participantPlan.waves} wave(s).`);
|
|
179
179
|
lines.push(` session budget ${Math.round(participantPlan.perLaneSessionBudgetMs / 1000)}s per participant; worst-case ~${participantPlan.worstCaseSandboxMinutes} sandbox-minutes total${participantPlan.dryRun ? " (dry-run: $0)" : ""}.`);
|
|
180
180
|
for (const entry of participantPlan.lanes) {
|
|
181
181
|
lines.push(` - ${formatParticipantPlanEntry(entry)}`);
|
|
@@ -212,7 +212,7 @@ export async function compileParticipantPersonas(projectRoot, personaIds) {
|
|
|
212
212
|
export async function loadCuaParticipants(args) {
|
|
213
213
|
const { plan } = args;
|
|
214
214
|
const { participants } = plan.runner;
|
|
215
|
-
// Compile any committed personas BEFORE planning, so the plan builder stays pure and each
|
|
215
|
+
// Compile any committed personas BEFORE planning, so the plan builder stays pure and each participant's
|
|
216
216
|
// prompt carries real behavioral directives rather than a bare `Persona: <id>.` label (#381).
|
|
217
217
|
const personas = await compileParticipantPersonas(args.projectRoot, participants.map((participant) => participant.personaId));
|
|
218
218
|
const { runs: participantRuns, participantPlan } = participantRunsAndPlan({
|
|
@@ -244,7 +244,7 @@ export async function loadCuaParticipants(args) {
|
|
|
244
244
|
rerunLineage: selected.rerun,
|
|
245
245
|
};
|
|
246
246
|
}
|
|
247
|
-
/** Scrub known secret values from each
|
|
247
|
+
/** Scrub known secret values from each participant's declarative snapshot before any bundle uses it. */
|
|
248
248
|
export function sanitizeParticipantRuns(runs, scrub) {
|
|
249
249
|
for (const spec of runs) {
|
|
250
250
|
if (spec.evidenceAssignment)
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { type CuaActorDescriptor } from "../../actors/registry.js";
|
|
2
|
-
import type { ComputerUsePlan, RoutePlanResult, RouteRefusal } from "../../lab/plan-types.js";
|
|
3
|
-
import type { LabConfig,
|
|
4
|
-
import type
|
|
5
|
-
import { type CuaActorLabErrorCode, type CuaActorLabHooks, type RunCuaActorLabOptions } from "./types.js";
|
|
2
|
+
import type { ComputerUsePlan, ComputerUseRunner, RoutePlanResult, RouteRefusal } from "../../lab/plan-types.js";
|
|
3
|
+
import type { LabConfig, LabSubjectState } from "../../lab/types.js";
|
|
4
|
+
import { type CuaActorLabErrorCode, type RunCuaActorLabOptions } from "./types.js";
|
|
6
5
|
/** The error a computer-use lab returns before a run starts. */
|
|
7
6
|
export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActorLabErrorCode> {
|
|
8
7
|
/**
|
|
9
8
|
* Where the route returns it. "before-scope": analysis and tasks, returned before the run scope
|
|
10
9
|
* with no automatic-analysis record. "in-scope": after the cwd checks. "after-personas": after
|
|
11
|
-
* the route reads committed persona files, so a persona-file error still wins over the
|
|
10
|
+
* the route reads committed persona files, so a persona-file error still wins over the participant cap
|
|
12
11
|
* and in-process fan-out.
|
|
13
12
|
*/
|
|
14
13
|
readonly stage: "before-scope" | "in-scope" | "after-personas";
|
|
@@ -18,39 +17,32 @@ export interface ComputerUseRefusal extends RouteRefusal<"computer-use", CuaActo
|
|
|
18
17
|
export type ComputerUsePlanResult = RoutePlanResult<ComputerUsePlan, ComputerUseRefusal>;
|
|
19
18
|
/** The registered descriptor for a planned actor id; planComputerUseLab checked the registry. */
|
|
20
19
|
export declare function cuaDescriptorOf(actor: string): CuaActorDescriptor;
|
|
21
|
-
/** Which
|
|
22
|
-
export interface
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
desktopCliRoute: boolean;
|
|
26
|
-
localTreeRoute: boolean;
|
|
27
|
-
/**
|
|
28
|
-
* Clone and local-tree both provision the subject in-sandbox (clone via git, local-tree via
|
|
29
|
-
* pack+upload) and share the install/build/state/start/probe pipeline, so every seam that gates
|
|
30
|
-
* on "does this route provision a subject" is keyed on this union.
|
|
31
|
-
*/
|
|
32
|
-
provisionedRoute: boolean;
|
|
33
|
-
localAppSubject: boolean;
|
|
34
|
-
/** A caller-supplied executor drives the subject in-process; no desktop is created. */
|
|
35
|
-
inProcessRoute: boolean;
|
|
36
|
-
serve: LabSubjectServe | undefined;
|
|
37
|
-
appUrl: string;
|
|
38
|
-
subjectRepo: string | undefined;
|
|
39
|
-
subjectEnvNames: string[];
|
|
20
|
+
/** Which of the caller's driving homes, createProvider and inProcess, a run has. */
|
|
21
|
+
export interface CallerDriving {
|
|
22
|
+
readonly inProcess: boolean;
|
|
23
|
+
readonly createProvider: boolean;
|
|
40
24
|
}
|
|
41
|
-
|
|
25
|
+
/** The driving a computer-use run's options carry. */
|
|
26
|
+
export declare function callerDrivingOf(options: {
|
|
27
|
+
readonly inProcess?: unknown;
|
|
28
|
+
readonly createProvider?: unknown;
|
|
29
|
+
}): CallerDriving;
|
|
42
30
|
/** The state a planned run's provisioned subject declares. Other subjects declare none. */
|
|
43
31
|
export declare function cuaDeclaredState(plan: ComputerUsePlan): LabSubjectState | undefined;
|
|
44
|
-
/** The
|
|
45
|
-
export declare function
|
|
32
|
+
/** The URL a refused lab's result names, from its declaration: a provisioned subject's serve URL. */
|
|
33
|
+
export declare function declaredAppUrl(config: LabConfig): string;
|
|
34
|
+
/** The URL a planned run's participants open: a provisioned subject's served URL, else its own. */
|
|
35
|
+
export declare function plannedAppUrl(subject: ComputerUseRunner["subject"]): string;
|
|
46
36
|
/**
|
|
47
37
|
* Plan a computer-use lab. It is called for any config handed to the computer-use runner, not only
|
|
48
38
|
* one routeOf sends here, so a config for another route gets this route's refusal.
|
|
49
39
|
*/
|
|
50
40
|
export declare function planComputerUseLab(config: LabConfig, input: {
|
|
51
41
|
readonly dryRun: boolean;
|
|
52
|
-
|
|
53
|
-
readonly
|
|
42
|
+
/** Whether deps.runSession is set: a caller's session runner cannot enforce maxOutputTokens. */
|
|
43
|
+
readonly hasRunSession?: boolean;
|
|
44
|
+
/** Which of the caller's driving homes are set; neither when absent. */
|
|
45
|
+
readonly driving?: CallerDriving;
|
|
54
46
|
readonly countOverride?: number;
|
|
55
47
|
readonly rerun?: RunCuaActorLabOptions["rerun"];
|
|
56
48
|
}): ComputerUsePlanResult;
|