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,10 +1,10 @@
|
|
|
1
1
|
// Finishing a concurrent shared-world run: publishing its bundle, rendering the Observer, and the
|
|
2
2
|
// lab result with each role's outcome and the one error a run that did not pass reports.
|
|
3
3
|
import { redactText } from "../../evidence/redaction.js";
|
|
4
|
-
import { adapterScoreFailureMessage,
|
|
4
|
+
import { adapterScoreFailureMessage, applyBrowserScorer } from "../../lab/adapter-extension.js";
|
|
5
5
|
import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
|
|
6
|
-
import { foldScorerFailures, judgeExecution, OUTCOME_POLICIES, participantHarnessFailed, resultOk, sharedWorldShortfall, } from "../../run/judge.js";
|
|
7
|
-
import { participantFactsOf } from "../computer-use/participant-facts.js";
|
|
6
|
+
import { foldScorerFailures, judgeExecution, sandboxCleanupFailure, OUTCOME_POLICIES, participantHarnessFailed, resultOk, sharedWorldShortfall, } from "../../run/judge.js";
|
|
7
|
+
import { participantFactsOf, unreleasedSandboxFailures, } from "../computer-use/participant-facts.js";
|
|
8
8
|
import { resolveSubjectState } from "../computer-use/subject-projection.js";
|
|
9
9
|
import { actorRunPassed, buildConcurrentSharedWorldBundle, judgeSharedWorldRun, maxSimultaneousWindows, } from "./bundle.js";
|
|
10
10
|
import { planeStateOf } from "./plan.js";
|
|
@@ -18,6 +18,7 @@ export function emptyPlaneResults() {
|
|
|
18
18
|
subjectCommit: undefined,
|
|
19
19
|
subjectSandboxId: undefined,
|
|
20
20
|
subjectKilled: false,
|
|
21
|
+
subjectReleaseWarning: undefined,
|
|
21
22
|
subjectDesktop: undefined,
|
|
22
23
|
getHostUrl: undefined,
|
|
23
24
|
publicOriginDigest: undefined,
|
|
@@ -85,8 +86,8 @@ function concurrentLabError(args) {
|
|
|
85
86
|
if (ok)
|
|
86
87
|
return undefined;
|
|
87
88
|
if (handoffTimedOut) {
|
|
88
|
-
// Checked
|
|
89
|
-
// deadline (followers failed closed without opening), which is the
|
|
89
|
+
// Checked before the observer failure: the host never yielded a /lobby/CODE within the
|
|
90
|
+
// deadline (followers failed closed without opening), which is the root cause, and it can
|
|
90
91
|
// itself make the Observer unable to render a coherent run. Report the distinct, honest
|
|
91
92
|
// handoff-timeout code rather than a generic observer/run failure.
|
|
92
93
|
return {
|
|
@@ -159,10 +160,12 @@ export function concurrentLabFailure(envelope) {
|
|
|
159
160
|
}
|
|
160
161
|
/**
|
|
161
162
|
* The run's execution failures: a run error (the handoff, the plane), each seat whose session
|
|
162
|
-
* failed in the harness,
|
|
163
|
+
* failed in the harness, each provider whose cleanup is unconfirmed or that reported a disallowed
|
|
164
|
+
* item after its last request, each sandbox whose release is unconfirmed, and an Observer that
|
|
165
|
+
* failed.
|
|
163
166
|
*/
|
|
164
167
|
function sharedWorldExecutionFailures(args) {
|
|
165
|
-
const { runError, actorResults, observer } = args;
|
|
168
|
+
const { runId, runError, actorResults, subject, observer } = args;
|
|
166
169
|
return [
|
|
167
170
|
...(runError === undefined ? [] : [{ kind: "run", message: runError }]),
|
|
168
171
|
...actorResults
|
|
@@ -179,6 +182,18 @@ function sharedWorldExecutionFailures(args) {
|
|
|
179
182
|
message: `${result.spec.planned.id}: ${result.outcome.providerCleanupError}`,
|
|
180
183
|
},
|
|
181
184
|
]),
|
|
185
|
+
...actorResults.flatMap((result) => result.outcome.providerPolicyError === undefined
|
|
186
|
+
? []
|
|
187
|
+
: [
|
|
188
|
+
{
|
|
189
|
+
kind: "provider-policy",
|
|
190
|
+
message: `${result.spec.planned.id}: ${result.outcome.providerPolicyError}`,
|
|
191
|
+
},
|
|
192
|
+
]),
|
|
193
|
+
...unreleasedSandboxFailures(actorResults.map((result) => result.outcome), runId),
|
|
194
|
+
...(subject.subjectSandboxId === undefined || subject.subjectKilled
|
|
195
|
+
? []
|
|
196
|
+
: [sandboxCleanupFailure("subject", subject.subjectReleaseWarning, runId)]),
|
|
182
197
|
...(observer.ok
|
|
183
198
|
? []
|
|
184
199
|
: [
|
|
@@ -191,7 +206,7 @@ function sharedWorldExecutionFailures(args) {
|
|
|
191
206
|
}
|
|
192
207
|
/** Builds and publishes the bundle, renders the Observer and returns the lab result. */
|
|
193
208
|
export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
194
|
-
const { plan, input, descriptor,
|
|
209
|
+
const { plan, input, descriptor, actorSpecs, run, runId } = ctx;
|
|
195
210
|
const participantCount = plan.plane.participants.length;
|
|
196
211
|
const { cwd, concurrency, source, seedDigest, receiving, warnings, scrubKnownValues } = ctx;
|
|
197
212
|
const { dryRun } = plan;
|
|
@@ -218,17 +233,15 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
218
233
|
}),
|
|
219
234
|
});
|
|
220
235
|
const planeCommit = localTreeRoute ? localTreeArchive?.git?.commit : subjectCommit;
|
|
221
|
-
// Collect per-actor warnings (each
|
|
236
|
+
// Collect per-actor warnings (each participant's own teardown/raw-screenshot notes).
|
|
222
237
|
for (const result of actorResults) {
|
|
223
238
|
warnings.push(...result.outcome.warnings);
|
|
224
239
|
}
|
|
225
240
|
const bundleArgs = {
|
|
226
|
-
|
|
241
|
+
run,
|
|
227
242
|
plan,
|
|
228
243
|
descriptor,
|
|
229
|
-
createdAt,
|
|
230
244
|
dryRun,
|
|
231
|
-
runId,
|
|
232
245
|
source,
|
|
233
246
|
actorSpecs,
|
|
234
247
|
actorResults,
|
|
@@ -249,8 +262,8 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
249
262
|
const judgment = judgeSharedWorldRun(bundleArgs);
|
|
250
263
|
const bundle = buildConcurrentSharedWorldBundle({ ...bundleArgs, judgment });
|
|
251
264
|
const adapterWarnings = [];
|
|
252
|
-
const scorerResult = await
|
|
253
|
-
|
|
265
|
+
const scorerResult = await applyBrowserScorer({
|
|
266
|
+
scorer: input.scorer,
|
|
254
267
|
bundle,
|
|
255
268
|
context: {
|
|
256
269
|
bundle,
|
|
@@ -258,13 +271,12 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
258
271
|
labId: plan.labId,
|
|
259
272
|
runId,
|
|
260
273
|
actor: descriptor.id,
|
|
261
|
-
|
|
274
|
+
route: "shared-world",
|
|
262
275
|
dryRun,
|
|
263
|
-
|
|
276
|
+
participantCount,
|
|
264
277
|
},
|
|
265
278
|
sanitize: (text) => redactText(scrubKnownValues(text)),
|
|
266
279
|
warnings: adapterWarnings,
|
|
267
|
-
hookLabel: "sharedWorldHooks",
|
|
268
280
|
...(input.scorerProvenance === undefined ? {} : { scorerProvenance: input.scorerProvenance }),
|
|
269
281
|
});
|
|
270
282
|
// The one final verdict fold: scoring can only make the judged verdict stricter.
|
|
@@ -276,13 +288,13 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
276
288
|
if (observer.ok && live.observer) {
|
|
277
289
|
attachObserverRuntimeStreamUrls(observer, live.streamUrls);
|
|
278
290
|
}
|
|
279
|
-
// Concurrent "ok": every actor must produce a terminal, engaged
|
|
291
|
+
// Concurrent "ok": every actor must produce a terminal, engaged, passed session, and the seats
|
|
280
292
|
// must show the concurrency verify requires of a pass (judgeSharedWorld). This is a
|
|
281
293
|
// harness/session-credibility gate, not mission-completion proof; a failed actor trace cannot
|
|
282
294
|
// make the route green just because the harness got a terminal.
|
|
283
295
|
const adapterFailure = adapterScoreFailureMessage(bundle);
|
|
284
296
|
const policy = OUTCOME_POLICIES["shared-world"];
|
|
285
|
-
const execution = judgeExecution(sharedWorldExecutionFailures({ runError, actorResults, observer }), policy);
|
|
297
|
+
const execution = judgeExecution(sharedWorldExecutionFailures({ runId, runError, actorResults, subject: results, observer }), policy);
|
|
286
298
|
const ok = resultOk({ judgment, execution, scorerFailures: scorerResult.failures, policy });
|
|
287
299
|
const overlapProven = !dryRun && judgment.world.overlap;
|
|
288
300
|
const participantResults = concurrentParticipantResults(actorSpecs, actorResults, dryRun);
|
|
@@ -1,38 +1,39 @@
|
|
|
1
|
-
// The
|
|
2
|
-
// mutable service plane
|
|
1
|
+
// The concurrent shared-world lab backend (#164 phase 2): N persona participants drive one shared,
|
|
2
|
+
// mutable service plane at the same time. A recomposition of shipped
|
|
3
3
|
// pieces + the getHost wrapper:
|
|
4
4
|
//
|
|
5
|
-
// -
|
|
5
|
+
// - One subject sandbox: provisionCloneSubject once (clone+install+build+seed) + serve on
|
|
6
6
|
// 0.0.0.0, exposed via getHost(port) → a tokenless reachable URL (the headless service host;
|
|
7
7
|
// no GUI seat).
|
|
8
|
-
// - N
|
|
8
|
+
// - N actor desktop sandboxes: fan-out's runCuaParticipant machinery (per-participant device/persona, by-id
|
|
9
9
|
// teardown) bounded by execution.concurrency, each browser pointed at the getHost URL —
|
|
10
|
-
// driving the shared service
|
|
10
|
+
// driving the shared service at the same time. Independent: no pipeline gate, no
|
|
11
11
|
// fail-fast — one actor's failure must not block the swarm or corrupt the "M of N" outcomes.
|
|
12
12
|
// - A background prober snapshots the subject DB checkpoint digests on a cadence → a stateSeries
|
|
13
13
|
// of the shared world evolving under load.
|
|
14
|
-
// -
|
|
14
|
+
// - All N+1 sandboxes torn down by exact id in a finally, never through Sandbox.list.
|
|
15
15
|
//
|
|
16
|
-
//
|
|
17
|
-
// attributionClass: shared-world + a
|
|
18
|
-
// "concurrent"; laneWindows + stateSeries + outcomes;
|
|
16
|
+
// Attribution (enforced by verify): the bundle declares
|
|
17
|
+
// attributionClass: shared-world + a concurrent humanish.shared-world.v1 block (topologyMode
|
|
18
|
+
// "concurrent"; laneWindows + stateSeries + outcomes; no timeline) whose attributionLimits drop
|
|
19
19
|
// `sequential-only`/`no-concurrent-races` and add `concurrent`,
|
|
20
20
|
// `best-effort-causal-attribution`, `non-deterministic-shared-state`,
|
|
21
21
|
// `window-and-snapshot-granularity`, `contention-observed-not-proven-safe`,
|
|
22
|
-
// `state-change-not-isolated-to-actors`. laneWindows + stateSeries are
|
|
22
|
+
// `state-change-not-isolated-to-actors`. laneWindows + stateSeries are independent series with no
|
|
23
23
|
// per-delta→actor field — causation under concurrency is structurally inexpressible.
|
|
24
24
|
//
|
|
25
|
-
//
|
|
25
|
+
// Capability and proof: the deterministic $0 gate proves the plumbing + the honesty
|
|
26
26
|
// contract — the real mapWithConcurrency produces genuinely overlapping laneWindows (a rendezvous
|
|
27
|
-
// latch in the fake session forces two
|
|
27
|
+
// latch in the fake session forces two participant fns in-flight while the real orchestrator clock
|
|
28
28
|
// measures the windows). Every generated bundle describes only its own observations; no one run
|
|
29
29
|
// establishes scale, repeatability, or adopter-harness replacement.
|
|
30
30
|
//
|
|
31
|
-
// Synthetic
|
|
32
|
-
// synthetic
|
|
31
|
+
// Synthetic subject: a getHost URL is internet-reachable for the run, so this route is for
|
|
32
|
+
// synthetic seeded subjects only. Verify fail-closes on subject.state.provenance != "seeded" and
|
|
33
33
|
// requires the author attestation subject.exposure: synthetic. This is author-trust + a provenance
|
|
34
|
-
// gate
|
|
34
|
+
// gate; humanish cannot tell synthetic from real data, so it makes no claim about real data.
|
|
35
35
|
import path from "node:path";
|
|
36
|
+
import { missingKeys, missingSubjectEnv } from "../../lab/requirements.js";
|
|
36
37
|
import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
|
|
37
38
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
38
39
|
import { scrubLiterals } from "../../evidence/redaction.js";
|
|
@@ -46,7 +47,8 @@ import { localAgentRefusal } from "../../actors/local-agent/readiness.js";
|
|
|
46
47
|
import { runProvisionedPlane } from "./provisioned.js";
|
|
47
48
|
import { concurrentLabFailure, finishConcurrentRun } from "./result.js";
|
|
48
49
|
import { prepareConcurrentRun } from "./setup.js";
|
|
49
|
-
import {
|
|
50
|
+
import { browserRouteScorer } from "../../lab/adapter-scorer-loader.js";
|
|
51
|
+
import { withLateScorer } from "../../lab/route-inputs.js";
|
|
50
52
|
import {} from "./types.js";
|
|
51
53
|
import { rosterOf } from "../../lab/parse/actors.js";
|
|
52
54
|
/** The shared-world code for each local-agent refusal, kind for kind with computer-use. */
|
|
@@ -62,12 +64,11 @@ const LOCAL_AGENT_REFUSAL_CODES = {
|
|
|
62
64
|
* run and its analysis.
|
|
63
65
|
*/
|
|
64
66
|
export async function runConcurrentSharedWorld(options) {
|
|
65
|
-
const { config, dryRun,
|
|
67
|
+
const { config, dryRun, ...input } = options;
|
|
66
68
|
// planSharedWorldLab makes every configuration refusal, in the order this route always has.
|
|
67
69
|
const planned = planSharedWorldLab(config, {
|
|
68
70
|
dryRun,
|
|
69
|
-
|
|
70
|
-
hooks: input.hooks ?? {},
|
|
71
|
+
hasRunSession: input.deps?.runSession !== undefined,
|
|
71
72
|
});
|
|
72
73
|
if (planned.ok)
|
|
73
74
|
return runSharedWorldPlan(planned.plan, input, config);
|
|
@@ -90,7 +91,7 @@ export function sharedWorldLabRefusal(options, refusal) {
|
|
|
90
91
|
});
|
|
91
92
|
// A refusal starts no run, so a declared or default analysis is recorded as skipped.
|
|
92
93
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
93
|
-
return completeAutomaticAnalysis(fail(refusal.code, refusal.message, refusal.actor), undefined, analysis.ok ? analysis.config : undefined, options
|
|
94
|
+
return completeAutomaticAnalysis(fail(refusal.code, refusal.message, refusal.actor), undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
|
|
94
95
|
}
|
|
95
96
|
/**
|
|
96
97
|
* runLab's step for a shared-world plan. It runs a live plan's local checks (the keys, a local
|
|
@@ -103,11 +104,11 @@ export async function admitSharedWorldPlan(plan, input, config) {
|
|
|
103
104
|
return { ok: false, outcome: sharedWorldOutcome(refused) };
|
|
104
105
|
return {
|
|
105
106
|
ok: true,
|
|
106
|
-
run: async (scorer) => sharedWorldOutcome(await runAdmittedSharedWorldRun(plan,
|
|
107
|
+
run: async (scorer) => sharedWorldOutcome(await runAdmittedSharedWorldRun(plan, withLateScorer(input, scorer, browserRouteScorer), config)),
|
|
107
108
|
};
|
|
108
109
|
}
|
|
109
110
|
function sharedWorldOutcome(result) {
|
|
110
|
-
return { route: "shared-world",
|
|
111
|
+
return { route: "shared-world", result };
|
|
111
112
|
}
|
|
112
113
|
/** Run a shared-world plan: its local checks, then the run. */
|
|
113
114
|
export async function runSharedWorldPlan(plan, input, config) {
|
|
@@ -122,18 +123,13 @@ export async function runSharedWorldPlan(plan, input, config) {
|
|
|
122
123
|
async function admitSharedWorldRun(plan, input) {
|
|
123
124
|
if (plan.dryRun)
|
|
124
125
|
return undefined;
|
|
125
|
-
const env = input.
|
|
126
|
-
const subjectEnvNames = plan.plane.kind === "provisioned" ? plan.plane.subject.env : [];
|
|
126
|
+
const env = input.env ?? process.env;
|
|
127
127
|
const fail = (code, message) => completeSharedWorldAnalysis(plan, input, sharedWorldFailure(plan, input)(code, message, sharedWorldDescriptorOf(plan.actor).id), undefined);
|
|
128
|
-
// OPENAI_API_KEY
|
|
129
|
-
// reader; a local-agent brain's seats run on the operator's signed-in agent instead.
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
...(env.E2B_API_KEY?.trim() ? [] : ["E2B_API_KEY"]),
|
|
134
|
-
];
|
|
135
|
-
if (missingKeys.length > 0) {
|
|
136
|
-
return fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_KEYS_MISSING", `Live concurrent shared-world labs need ${missingKeys.join(" and ")} in the environment (values are never persisted). ${describeMissingKeys(missingKeys, env)}`);
|
|
128
|
+
// The plan lists OPENAI_API_KEY for an openai brain's seats and the external-public plane's
|
|
129
|
+
// lobby-code reader; a local-agent brain's seats run on the operator's signed-in agent instead.
|
|
130
|
+
const missing = missingKeys(plan.requirements, env);
|
|
131
|
+
if (missing.length > 0) {
|
|
132
|
+
return fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_KEYS_MISSING", `Live concurrent shared-world labs need ${missing.join(" and ")} in the environment (values are never persisted). ${describeMissingKeys(missing, env)}`);
|
|
137
133
|
}
|
|
138
134
|
if (plan.brain.kind === "local-agent") {
|
|
139
135
|
// A missing or signed-out agent found after the seats' desktops are paid for is the same
|
|
@@ -142,9 +138,9 @@ async function admitSharedWorldRun(plan, input) {
|
|
|
142
138
|
if (refusal)
|
|
143
139
|
return fail(LOCAL_AGENT_REFUSAL_CODES[refusal.kind], refusal.message);
|
|
144
140
|
}
|
|
145
|
-
const
|
|
146
|
-
if (
|
|
147
|
-
return fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_SUBJECT_ENV_MISSING", `subject.env declares ${
|
|
141
|
+
const unsetSubjectEnv = missingSubjectEnv(plan.requirements, env);
|
|
142
|
+
if (unsetSubjectEnv.length > 0) {
|
|
143
|
+
return fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_SUBJECT_ENV_MISSING", `subject.env declares ${unsetSubjectEnv.join(", ")} but the environment does not provide ${unsetSubjectEnv.length === 1 ? "it" : "them"} (pass via --env-file; values are never persisted).`);
|
|
148
144
|
}
|
|
149
145
|
return undefined;
|
|
150
146
|
}
|
|
@@ -160,7 +156,7 @@ function runAdmittedSharedWorldRun(plan, input, config) {
|
|
|
160
156
|
});
|
|
161
157
|
}
|
|
162
158
|
function completeSharedWorldAnalysis(plan, input, result, finished) {
|
|
163
|
-
return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input
|
|
159
|
+
return completeAutomaticAnalysis(result, finished, plan.analysis?.config, input, {
|
|
164
160
|
...(plan.analysis === undefined ? {} : { trigger: plan.analysis.trigger }),
|
|
165
161
|
preferLargerOutput: plan.analysis?.preferLargerOutput === true,
|
|
166
162
|
});
|
|
@@ -180,8 +176,8 @@ function sharedWorldFailure(plan, input) {
|
|
|
180
176
|
async function runPlanInScope(plan, input, config, scope) {
|
|
181
177
|
const { dryRun } = plan;
|
|
182
178
|
const requestedCwd = path.resolve(input.cwd);
|
|
183
|
-
const
|
|
184
|
-
const env =
|
|
179
|
+
const deps = input.deps ?? {};
|
|
180
|
+
const env = input.env ?? process.env;
|
|
185
181
|
const fail = sharedWorldFailure(plan, input);
|
|
186
182
|
const descriptor = sharedWorldDescriptorOf(plan.actor);
|
|
187
183
|
const planeClass = plan.plane.kind === "external-public" ? "external-public" : "provisioned-getHost";
|
|
@@ -194,7 +190,7 @@ async function runPlanInScope(plan, input, config, scope) {
|
|
|
194
190
|
const subjectRepo = plan.residual.subject.repos?.[0] ?? "";
|
|
195
191
|
const subjectEnvNames = [...(subject?.env ?? [])];
|
|
196
192
|
const checkpoints = [...(subject?.state.checkpoint ?? [])];
|
|
197
|
-
const runSession =
|
|
193
|
+
const runSession = deps.runSession ?? descriptor.runSession;
|
|
198
194
|
const openaiApiKey = env.OPENAI_API_KEY?.trim() ?? "";
|
|
199
195
|
const e2bApiKey = env.E2B_API_KEY?.trim() ?? "";
|
|
200
196
|
const knownSecretValues = [
|
|
@@ -212,7 +208,7 @@ async function runPlanInScope(plan, input, config, scope) {
|
|
|
212
208
|
input,
|
|
213
209
|
config,
|
|
214
210
|
requestedCwd,
|
|
215
|
-
|
|
211
|
+
deps,
|
|
216
212
|
env,
|
|
217
213
|
descriptor,
|
|
218
214
|
planeClass,
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import type { CuaActorDescriptor } from "../../actors/registry.js";
|
|
2
2
|
import type { LabConfig, LabSubjectServe, LabSubjectStateCheckpoint } from "../../lab/types.js";
|
|
3
3
|
import type { RunScope } from "../../run/run.js";
|
|
4
|
-
import type { ConcurrentSharedWorldLabErrorCode, ConcurrentSharedWorldLabResult, ConcurrentSharedWorldPlaneClass, FinishFacts, LiveParticipants, PlaneContext, PlaneResults, PlaneSelection,
|
|
4
|
+
import type { ConcurrentSharedWorldLabErrorCode, ConcurrentSharedWorldLabResult, ConcurrentSharedWorldPlaneClass, FinishFacts, LiveParticipants, PlaneContext, PlaneResults, PlaneSelection, SharedWorldRunInput } from "./types.js";
|
|
5
|
+
import type { LabDeps } from "../../lab/lab-deps.js";
|
|
5
6
|
import type { SharedWorldPlan } from "../../lab/plan-types.js";
|
|
6
7
|
/** What validation derived from the lab, which setup reads. */
|
|
7
8
|
interface AdmittedLab {
|
|
8
9
|
plan: SharedWorldPlan;
|
|
9
10
|
input: SharedWorldRunInput;
|
|
10
|
-
/** Read
|
|
11
|
-
*
|
|
11
|
+
/** Read for the subject's serve URL, which each seat's subject names. Seats, their count and
|
|
12
|
+
* their host and entry come from the plan's participants. */
|
|
12
13
|
config: LabConfig;
|
|
13
14
|
requestedCwd: string;
|
|
14
|
-
|
|
15
|
+
deps: LabDeps;
|
|
15
16
|
env: Record<string, string | undefined>;
|
|
16
17
|
descriptor: CuaActorDescriptor;
|
|
17
18
|
planeClass: ConcurrentSharedWorldPlaneClass;
|
|
@@ -10,7 +10,7 @@ import { prepareEmailReceiving, prepareExternalComms, receivingSourceOf, subject
|
|
|
10
10
|
import { declaredOriginDigestOf } from "./external-public.js";
|
|
11
11
|
import { packSubjectTree } from "./provisioned.js";
|
|
12
12
|
import { emptyPlaneResults } from "./result.js";
|
|
13
|
-
import { buildParticipantSpecs, defaultSessionTimeoutMs } from "./
|
|
13
|
+
import { buildParticipantSpecs, defaultSessionTimeoutMs } from "./participant-specs.js";
|
|
14
14
|
import { planeStateOf } from "./plan.js";
|
|
15
15
|
import path from "node:path";
|
|
16
16
|
import { e2bRequestTimeoutMs } from "../../substrates/e2b/lifetime.js";
|
|
@@ -49,7 +49,7 @@ async function bindPhysicalProject(requestedCwd) {
|
|
|
49
49
|
.physicalPath;
|
|
50
50
|
}
|
|
51
51
|
function startConcurrentRun(lab, cwd, scope) {
|
|
52
|
-
const { plan, input,
|
|
52
|
+
const { plan, input, deps } = lab;
|
|
53
53
|
return scope.startRun({
|
|
54
54
|
cwd,
|
|
55
55
|
runId: input.runId,
|
|
@@ -57,7 +57,7 @@ function startConcurrentRun(lab, cwd, scope) {
|
|
|
57
57
|
mode: plan.dryRun ? "dry-run" : "live",
|
|
58
58
|
lab: plan.lab,
|
|
59
59
|
renderReview: renderConcurrentReviewMarkdown,
|
|
60
|
-
observer: { open: input.open === true, render:
|
|
60
|
+
observer: { open: input.open === true, render: deps.renderObserver },
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
@@ -65,7 +65,7 @@ function startConcurrentRun(lab, cwd, scope) {
|
|
|
65
65
|
* specs, comms, the packed tree and email receiving. Returns the refusal when one of them fails.
|
|
66
66
|
*/
|
|
67
67
|
export async function prepareConcurrentRun(lab, scope) {
|
|
68
|
-
const { plan, input, config, requestedCwd,
|
|
68
|
+
const { plan, input, config, requestedCwd, deps, env, descriptor, planeClass, fail } = lab;
|
|
69
69
|
const { runBudget, runSession, localTreeRoute, subjectEnvNames, publicRepo } = lab;
|
|
70
70
|
const { openaiApiKey, e2bApiKey, knownSecretValues, scrubKnownValues } = lab;
|
|
71
71
|
const { dryRun, concurrency } = plan;
|
|
@@ -73,17 +73,14 @@ export async function prepareConcurrentRun(lab, scope) {
|
|
|
73
73
|
const warnings = [];
|
|
74
74
|
// The comms catch and the packed tree are checked before the run starts, so a refusal leaves
|
|
75
75
|
// no run directory. Neither spends: the probe is one request and packing runs on the host.
|
|
76
|
-
const externalComms = await prepareExternalComms(plan.residual, planeClass, dryRun, warnings);
|
|
76
|
+
const externalComms = await prepareExternalComms(plan.residual, planeClass, dryRun, warnings, env);
|
|
77
77
|
if (!externalComms.ok) {
|
|
78
|
-
return {
|
|
79
|
-
ok: false,
|
|
80
|
-
result: fail("HUMANISH_CONCURRENT_SHARED_WORLD_LAB_COMMS_CATCH_UNREACHABLE", externalComms.message),
|
|
81
|
-
};
|
|
78
|
+
return { ok: false, result: fail(externalComms.code, externalComms.message) };
|
|
82
79
|
}
|
|
83
80
|
// Pack the working tree once per run, on the host, before any sandbox exists: a packing
|
|
84
81
|
// failure fails the run closed without sandbox cost. Dry-run packs nothing.
|
|
85
82
|
const packed = localTreeRoute && !dryRun
|
|
86
|
-
? await packSubjectTree(cwd, plan.residual,
|
|
83
|
+
? await packSubjectTree(cwd, plan.residual, deps, scrubKnownValues)
|
|
87
84
|
: { ok: true, archive: undefined, buffer: undefined };
|
|
88
85
|
if (!packed.ok) {
|
|
89
86
|
return {
|
|
@@ -102,9 +99,9 @@ export async function prepareConcurrentRun(lab, scope) {
|
|
|
102
99
|
const timeoutMs = plan.sessionTimeoutMs ?? defaultSessionTimeoutMs(plan);
|
|
103
100
|
const requestTimeoutMs = e2bRequestTimeoutMs(env);
|
|
104
101
|
const redactScreenshots = plan.residual.policies?.redactScreenshots === true;
|
|
105
|
-
const timers =
|
|
106
|
-
const now =
|
|
107
|
-
const proberCadenceMs =
|
|
102
|
+
const timers = deps.detachedTimers ?? {};
|
|
103
|
+
const now = deps.now ?? Date.now;
|
|
104
|
+
const proberCadenceMs = deps.proberCadenceMs ?? DEFAULT_PROBER_CADENCE_MS;
|
|
108
105
|
const seedDigest = seedRecipeDigest(planeStateOf(plan));
|
|
109
106
|
const source = await buildRunSource({
|
|
110
107
|
capturedAt: createdAt,
|
|
@@ -147,7 +144,7 @@ export async function prepareConcurrentRun(lab, scope) {
|
|
|
147
144
|
input,
|
|
148
145
|
config,
|
|
149
146
|
descriptor,
|
|
150
|
-
|
|
147
|
+
deps,
|
|
151
148
|
env,
|
|
152
149
|
concurrency,
|
|
153
150
|
runBudget,
|
|
@@ -155,6 +152,7 @@ export async function prepareConcurrentRun(lab, scope) {
|
|
|
155
152
|
openaiApiKey,
|
|
156
153
|
e2bApiKey,
|
|
157
154
|
scrubKnownValues,
|
|
155
|
+
knownSecretValues,
|
|
158
156
|
cwd,
|
|
159
157
|
run,
|
|
160
158
|
runId,
|