humanish 0.107.0 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +17 -18
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +7 -6
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +10 -10
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +19 -19
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +19 -7
- package/dist/run/run-index.js +77 -64
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
|
@@ -2,7 +2,7 @@ import type { RunSubjectProvenance } from "../../run/bundle.js";
|
|
|
2
2
|
import type { LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
3
3
|
/** Extract the in-sandbox port from the (loopback) serve.url so getHost can expose it. */
|
|
4
4
|
export declare function servePort(serveUrl: string): number;
|
|
5
|
-
/** A getHost URL must be tokenless (no userinfo and no query, so no authKey
|
|
5
|
+
/** A getHost URL must be tokenless (no userinfo and no query, so no authKey reaches evidence). */
|
|
6
6
|
export declare function isTokenlessHost(value: string): boolean;
|
|
7
7
|
/** sha256-16 of a URL's origin: the publish-safe host identity persisted in the bundle (the raw
|
|
8
8
|
* getHost URL embeds the live sandbox id + matches the e2b-URL redaction, so it never lands raw). */
|
|
@@ -11,7 +11,7 @@ export declare function hostOriginDigest(url: string): string;
|
|
|
11
11
|
* entry path kept). Never contains the raw getHost URL. */
|
|
12
12
|
export declare function publicSafeRouteLabel(entry: string | undefined): string;
|
|
13
13
|
/**
|
|
14
|
-
* Build the one subject sandbox's provenance
|
|
14
|
+
* Build the one subject sandbox's provenance: clone (repo + optional commit) or
|
|
15
15
|
* local-tree (archiveSha256 + optional commit/dirty from the once-per-run host-packed archive -
|
|
16
16
|
* archiveSha256 is the pin; there is only one archive, so no per-participant unanimity math applies,
|
|
17
17
|
* unlike the cua fan-out route). Used for both the in-progress and final bundle: the archive
|
|
@@ -8,7 +8,7 @@ export function servePort(serveUrl) {
|
|
|
8
8
|
return Number(url.port);
|
|
9
9
|
return url.protocol === "https:" ? 443 : 80;
|
|
10
10
|
}
|
|
11
|
-
/** A getHost URL must be tokenless (no userinfo and no query, so no authKey
|
|
11
|
+
/** A getHost URL must be tokenless (no userinfo and no query, so no authKey reaches evidence). */
|
|
12
12
|
export function isTokenlessHost(value) {
|
|
13
13
|
try {
|
|
14
14
|
const url = new URL(value);
|
|
@@ -34,7 +34,7 @@ export function publicSafeRouteLabel(entry) {
|
|
|
34
34
|
return `[provisioned-subject]${entry ?? "/"}`;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Build the one subject sandbox's provenance
|
|
37
|
+
* Build the one subject sandbox's provenance: clone (repo + optional commit) or
|
|
38
38
|
* local-tree (archiveSha256 + optional commit/dirty from the once-per-run host-packed archive -
|
|
39
39
|
* archiveSha256 is the pin; there is only one archive, so no per-participant unanimity math applies,
|
|
40
40
|
* unlike the cua fan-out route). Used for both the in-progress and final bundle: the archive
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyCommsEmail, StudyConfig, StudySubjectServe, StudySubjectStateCheckpoint } from "../../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../../run/bundle.js";
|
|
3
3
|
import type { SharedWorldStateSnapshot } from "../../run/shared-world-evidence.js";
|
|
4
4
|
import type { LocalTreeArchive } from "../../subject/local-tree-archive.js";
|
|
5
5
|
import type { DetachedTimers } from "../../substrates/detached.js";
|
|
6
|
-
import type {
|
|
6
|
+
import type { StudyDeps } from "../../study/study-deps.js";
|
|
7
7
|
import { type ActorRunResult, type SubjectDesktopUsage, type LiveParticipants, type PlaneContext } from "./types.js";
|
|
8
8
|
/** What the provisioned plane needs besides the shared plane context. */
|
|
9
9
|
export interface ProvisionedPlaneSetup {
|
|
10
|
-
serve:
|
|
10
|
+
serve: StudySubjectServe;
|
|
11
11
|
localTreeRoute: boolean;
|
|
12
12
|
localTreeArchive: LocalTreeArchive | undefined;
|
|
13
13
|
localTreeArchiveBuffer: ArrayBuffer | undefined;
|
|
@@ -15,9 +15,9 @@ export interface ProvisionedPlaneSetup {
|
|
|
15
15
|
publicRepo: string;
|
|
16
16
|
subjectEnvNames: string[];
|
|
17
17
|
hasGithubToken: boolean;
|
|
18
|
-
checkpoints:
|
|
19
|
-
/** The in-sandbox email catch, when a comms
|
|
20
|
-
commsEmail:
|
|
18
|
+
checkpoints: StudySubjectStateCheckpoint[];
|
|
19
|
+
/** The in-sandbox email catch, when a comms study declared one. */
|
|
20
|
+
commsEmail: StudyCommsEmail | undefined;
|
|
21
21
|
commsPort: number | undefined;
|
|
22
22
|
/** The catch's base URL, injected into the subject's env at create. */
|
|
23
23
|
commsEnv: Record<string, string>;
|
|
@@ -47,8 +47,8 @@ export declare function runProvisionedPlane(ctx: PlaneContext, live: LivePartici
|
|
|
47
47
|
* or the message the run fails with.
|
|
48
48
|
*/
|
|
49
49
|
export declare function packSubjectTree(cwd: string, config: {
|
|
50
|
-
readonly subject: Pick<
|
|
51
|
-
}, deps:
|
|
50
|
+
readonly subject: Pick<StudyConfig["subject"], "localTree">;
|
|
51
|
+
}, deps: StudyDeps, scrubKnownValues: (text: string) => string): Promise<{
|
|
52
52
|
ok: true;
|
|
53
53
|
archive: LocalTreeArchive;
|
|
54
54
|
buffer: ArrayBuffer;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// The provisioned-getHost plane: the harness provisions one subject sandbox (clone or local-tree,
|
|
2
2
|
// install/build, seed, serve on 0.0.0.0), exposes it through getHost, probes its state on a
|
|
3
|
-
// cadence, and runs every
|
|
4
|
-
// id in the plane's finally, never through Sandbox.list.
|
|
3
|
+
// cadence, and runs every participant against that one shared plane. All sandboxes are torn down by
|
|
4
|
+
// exact id in the plane's finally, never through Sandbox.list.
|
|
5
5
|
import { buildOriginMap } from "../../comms/capture-surface.js";
|
|
6
6
|
import { deployCommsCatch, refreshInboxSurface, writeInboxSurface, } from "../../comms/sandbox-catch.js";
|
|
7
7
|
import { redactText, toErrorMessage } from "../../evidence/redaction.js";
|
|
@@ -10,7 +10,7 @@ import { mapWithConcurrency } from "../../run/concurrency.js";
|
|
|
10
10
|
import { provisionCloneSubject } from "../../subject/clone.js";
|
|
11
11
|
import { provisionLocalTreeSubject } from "../../subject/local-tree.js";
|
|
12
12
|
import { defaultSharedWorldPhaseSink } from "../../subject/steps.js";
|
|
13
|
-
import { phaseEvent } from "../../
|
|
13
|
+
import { phaseEvent } from "../../study/run-study-events.js";
|
|
14
14
|
import { loadE2BDesktopModule } from "../../substrates/e2b/sdk.js";
|
|
15
15
|
import { observeDesktopResources, } from "../../substrates/e2b/desktop-resources.js";
|
|
16
16
|
import { acquireE2BDesktopSandbox, readE2BRelease } from "../../substrates/e2b/sandbox.js";
|
|
@@ -29,7 +29,7 @@ import { SANDBOX_TIMEOUT_BUFFER_MS, SUBJECT_PROVISION_BUDGET_MS, } from "../../s
|
|
|
29
29
|
import { DEFAULT_STATE_STEP_TIMEOUT_MS } from "../../subject/state.js";
|
|
30
30
|
import { resolveActorEntryUrl, participantRunDeps, startParticipantFlush, } from "./participant-specs.js";
|
|
31
31
|
import { CONCURRENT_SHARED_WORLD_PROVIDER_METADATA, } from "./types.js";
|
|
32
|
-
import { addressedRecipients } from "../../
|
|
32
|
+
import { addressedRecipients } from "../../study/parse/comms.js";
|
|
33
33
|
/**
|
|
34
34
|
* A failure of the caller's `onObserverReady` gate on the provisioned plane. The gate runs inside
|
|
35
35
|
* the try that records participant failures, so it is wrapped to be told apart and rethrown: a gate
|
|
@@ -59,8 +59,8 @@ class SubjectPlane {
|
|
|
59
59
|
subjectAllocation;
|
|
60
60
|
subjectDesktop;
|
|
61
61
|
subjectShell;
|
|
62
|
-
// The in-sandbox email catch on the one subject sandbox
|
|
63
|
-
// unless a comms
|
|
62
|
+
// The in-sandbox email catch on the one subject sandbox; drained at teardown. Undefined
|
|
63
|
+
// unless a comms study declared it.
|
|
64
64
|
deployedComms;
|
|
65
65
|
// Background prober dispose signal, cleared in teardown.
|
|
66
66
|
proberDisposed = false;
|
|
@@ -68,7 +68,7 @@ class SubjectPlane {
|
|
|
68
68
|
disposeSignal;
|
|
69
69
|
proberLoop;
|
|
70
70
|
snapshotIndex = 0;
|
|
71
|
-
// Persona inbox surface
|
|
71
|
+
// Persona inbox surface: the serve->getHost origin-rewrite map
|
|
72
72
|
// (required here so the app's loopback verify links resolve to a reachable host), and the
|
|
73
73
|
// dedicated surface render loop.
|
|
74
74
|
commsOriginMap = [];
|
|
@@ -103,8 +103,8 @@ class SubjectPlane {
|
|
|
103
103
|
const { plan, deps, env, requestTimeoutMs, timeoutMs } = this.ctx;
|
|
104
104
|
const { subjectEnvNames, commsEnv } = this.setup;
|
|
105
105
|
const subjectModule = await (deps.desktopModule ?? loadE2BDesktopModule)();
|
|
106
|
-
// The one subject sandbox: headless service host (no GUI
|
|
107
|
-
// here; the actor sandboxes get none of it. A custom desktop template (image) is
|
|
106
|
+
// The one subject sandbox: headless service host (no GUI participant). The subject env is
|
|
107
|
+
// provisioned here; the actor sandboxes get none of it. A custom desktop template (image) is
|
|
108
108
|
// honored on both the subject sandbox (here) and every actor sandbox (via runCuaParticipant, which
|
|
109
109
|
// reads the same config); absent keeps the byte-stable Sandbox.create(opts) default. The
|
|
110
110
|
// receipt is on disk before any work, so `humanish reclaim` can kill it by exact id.
|
|
@@ -119,11 +119,11 @@ class SubjectPlane {
|
|
|
119
119
|
SANDBOX_TIMEOUT_BUFFER_MS,
|
|
120
120
|
metadata: {
|
|
121
121
|
...CONCURRENT_SHARED_WORLD_PROVIDER_METADATA,
|
|
122
|
-
labId: plan.
|
|
122
|
+
labId: plan.studyId,
|
|
123
123
|
topology: "shared-world",
|
|
124
124
|
topologyMode: "concurrent",
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
kind: "subject",
|
|
126
|
+
participantCount: String(plan.plane.participants.length),
|
|
127
127
|
},
|
|
128
128
|
...(subjectEnvNames.length > 0 || Object.keys(commsEnv).length > 0
|
|
129
129
|
? {
|
|
@@ -228,7 +228,7 @@ class SubjectPlane {
|
|
|
228
228
|
}
|
|
229
229
|
this.getHostUrl = hostUrl;
|
|
230
230
|
}
|
|
231
|
-
// Persona inbox surface
|
|
231
|
+
// Persona inbox surface: getHost-expose the read-only inbox listener so
|
|
232
232
|
// a persona in another sandbox can open it; build the serve->getHost origin map (required here:
|
|
233
233
|
// the app's loopback verify links must be rewritten to a reachable host); provision the surface
|
|
234
234
|
// channel; write the empty inbox up front (so /inbox never 404s); and start a render loop that drains
|
|
@@ -263,7 +263,7 @@ class SubjectPlane {
|
|
|
263
263
|
const surfaceCadenceMs = 2500;
|
|
264
264
|
this.surfaceLoop = (async () => {
|
|
265
265
|
// Full, idempotent rebuild each tick; surfaceRenderedCount advances only on a successful render,
|
|
266
|
-
// so a transient failure retries cleanly. Real timer (dispose-interruptible + cleared)
|
|
266
|
+
// so a transient failure retries cleanly. Real timer (dispose-interruptible + cleared): an
|
|
267
267
|
// unbounded loop must not busy-spin on the injected instant clock.
|
|
268
268
|
for (;;) {
|
|
269
269
|
try {
|
|
@@ -327,7 +327,7 @@ class SubjectPlane {
|
|
|
327
327
|
await this.proberLoop.catch(() => undefined);
|
|
328
328
|
}
|
|
329
329
|
// Stop the inbox-surface render loop too (shares the prober's dispose signal), before the teardown
|
|
330
|
-
// evidence drain below
|
|
330
|
+
// evidence drain below, so the two in-sandbox reads never overlap and the surface state is final.
|
|
331
331
|
if (this.surfaceLoop) {
|
|
332
332
|
await this.surfaceLoop.catch(() => undefined);
|
|
333
333
|
}
|
|
@@ -370,7 +370,8 @@ class SubjectPlane {
|
|
|
370
370
|
};
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
|
-
/** Writes the in-progress bundle, runs the caller's Observer gate and starts the
|
|
373
|
+
/** Writes the in-progress bundle, runs the caller's Observer gate and starts the participants'
|
|
374
|
+
* flush. */
|
|
374
375
|
async function publishInProgress(plane, ctx, live, setup) {
|
|
375
376
|
const { plan, input } = ctx;
|
|
376
377
|
const { localTreeRoute, localTreeArchive } = setup;
|
|
@@ -435,7 +436,7 @@ function runParticipants(plane, ctx, live, setup) {
|
|
|
435
436
|
// Tell this persona its (getHost-reachable) inbox URL, but only when comms is live and this participant
|
|
436
437
|
// has a declared recipient it can actually receive mail into (else it would stall on an empty
|
|
437
438
|
// inbox). Only the in-sandbox catch exists on this plane; the adopter-hosted catch is the
|
|
438
|
-
// external-public plane's
|
|
439
|
+
// external-public plane's.
|
|
439
440
|
const actorSpec = commsEmail && plane.commsInboxUrl && participantHasInboxRecipient(commsEmail, spec.planned.id)
|
|
440
441
|
? withInboxMission(spec, plane.commsInboxUrl, inboxRecipientFor(commsEmail, spec.planned.id)?.address)
|
|
441
442
|
: spec;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type ConcurrentSharedWorldStudyErrorCode, type ConcurrentSharedWorldStudyResult, type FinishFacts, type LiveParticipants, type PlaneContext, type PlaneResults } from "./types.js";
|
|
2
2
|
/** The results of a run whose plane did not run (a dry run) or has not reported yet. */
|
|
3
3
|
export declare function emptyPlaneResults(): PlaneResults;
|
|
4
4
|
/**
|
|
5
5
|
* The refusal envelope for a run that stops before it has results: the requested cwd, no roles,
|
|
6
6
|
* and the run id the caller asked for, if any. `actor` is the label when a refusal names none.
|
|
7
7
|
*/
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function concurrentStudyFailure(envelope: {
|
|
9
9
|
cwd: string;
|
|
10
|
-
|
|
10
|
+
studyId: string;
|
|
11
11
|
actor: string;
|
|
12
12
|
participantCount: number;
|
|
13
13
|
concurrency: number;
|
|
14
14
|
dryRun: boolean;
|
|
15
15
|
runId: string | undefined;
|
|
16
|
-
}): (code:
|
|
17
|
-
/** Builds and publishes the bundle, renders the Observer and returns the
|
|
18
|
-
export declare function finishConcurrentRun(ctx: PlaneContext, live: LiveParticipants, results: PlaneResults, plane: FinishFacts): Promise<
|
|
16
|
+
}): (code: ConcurrentSharedWorldStudyErrorCode, message: string, actorLabel?: string) => ConcurrentSharedWorldStudyResult;
|
|
17
|
+
/** Builds and publishes the bundle, renders the Observer and returns the study result. */
|
|
18
|
+
export declare function finishConcurrentRun(ctx: PlaneContext, live: LiveParticipants, results: PlaneResults, plane: FinishFacts): Promise<ConcurrentSharedWorldStudyResult>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Finishing a concurrent shared-world run: publishing its bundle, rendering the Observer, and the
|
|
2
|
-
//
|
|
2
|
+
// study 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, applyBrowserScorer } from "../../
|
|
4
|
+
import { adapterScoreFailureMessage, applyBrowserScorer } from "../../study/adapter-extension.js";
|
|
5
5
|
import { attachObserverRuntimeStreamUrls } from "../../observer/render.js";
|
|
6
6
|
import { foldScorerFailures, judgeExecution, sandboxCleanupFailure, OUTCOME_POLICIES, participantHarnessFailed, resultOk, sharedWorldShortfall, } from "../../run/judge.js";
|
|
7
7
|
import { participantFactsOf, unreleasedSandboxFailures, } from "../computer-use/participant-facts.js";
|
|
@@ -9,7 +9,9 @@ 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";
|
|
11
11
|
import { buildSubjectProvenance, hostOriginDigest } from "./provenance.js";
|
|
12
|
-
import {
|
|
12
|
+
import {} from "./types.js";
|
|
13
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
14
|
+
import { plural } from "../../run/text.js";
|
|
13
15
|
/** The results of a run whose plane did not run (a dry run) or has not reported yet. */
|
|
14
16
|
export function emptyPlaneResults() {
|
|
15
17
|
return {
|
|
@@ -65,7 +67,7 @@ function concurrentParticipantResults(actorSpecs, actorResults, dryRun) {
|
|
|
65
67
|
? {}
|
|
66
68
|
: {
|
|
67
69
|
error: {
|
|
68
|
-
code: "
|
|
70
|
+
code: "HUMANISH_SHARED_WORLD_FAILED",
|
|
69
71
|
message: result.outcome.sessionError ??
|
|
70
72
|
(result.outcome.noEngagement
|
|
71
73
|
? "Actor took no actions and produced no message (likely a blank/still-loading screen); not a credible goal_satisfied."
|
|
@@ -80,7 +82,7 @@ function concurrentParticipantResults(actorSpecs, actorResults, dryRun) {
|
|
|
80
82
|
});
|
|
81
83
|
}
|
|
82
84
|
/** The error a run that did not pass reports, most specific cause first. */
|
|
83
|
-
function
|
|
85
|
+
function concurrentStudyError(args) {
|
|
84
86
|
const { ok, handoffTimedOut, hostHandoffFailure, observer, runError, adapterFailure } = args;
|
|
85
87
|
const { participantResults, participantCount } = args;
|
|
86
88
|
if (ok)
|
|
@@ -88,16 +90,16 @@ function concurrentLabError(args) {
|
|
|
88
90
|
if (handoffTimedOut) {
|
|
89
91
|
// Checked before the observer failure: the host never yielded a /lobby/CODE within the
|
|
90
92
|
// deadline (followers failed closed without opening), which is the root cause, and it can
|
|
91
|
-
// itself make the Observer unable to render a coherent run. Report the distinct
|
|
93
|
+
// itself make the Observer unable to render a coherent run. Report the distinct
|
|
92
94
|
// handoff-timeout code rather than a generic observer/run failure.
|
|
93
95
|
return {
|
|
94
|
-
code: "
|
|
96
|
+
code: "HUMANISH_SHARED_WORLD_HANDOFF_TIMEOUT",
|
|
95
97
|
message: runError ??
|
|
96
98
|
"The host participant never produced a /lobby/CODE URL within the handoff deadline.",
|
|
97
99
|
};
|
|
98
100
|
}
|
|
99
101
|
if (hostHandoffFailure !== undefined) {
|
|
100
|
-
return { code: "
|
|
102
|
+
return { code: "HUMANISH_SHARED_WORLD_FAILED", message: hostHandoffFailure };
|
|
101
103
|
}
|
|
102
104
|
// The run's own failure before the Observer's: a run that stopped early (a desktop module that
|
|
103
105
|
// failed to load, a plane that failed to start) leaves a bundle verify then refuses, and naming
|
|
@@ -105,47 +107,46 @@ function concurrentLabError(args) {
|
|
|
105
107
|
// evidence).
|
|
106
108
|
if (runError) {
|
|
107
109
|
return {
|
|
108
|
-
code: "
|
|
110
|
+
code: "HUMANISH_SHARED_WORLD_FAILED",
|
|
109
111
|
message: observer.ok ? runError : `${runError} The run bundle it left failed verification.`,
|
|
110
112
|
};
|
|
111
113
|
}
|
|
112
114
|
if (!observer.ok) {
|
|
113
115
|
return {
|
|
114
|
-
code: "
|
|
116
|
+
code: "HUMANISH_SHARED_WORLD_FAILED",
|
|
115
117
|
message: observer.error?.message ?? "Observer failed for the concurrent shared-world run.",
|
|
116
118
|
};
|
|
117
119
|
}
|
|
118
120
|
if (adapterFailure !== undefined) {
|
|
119
|
-
return { code: "
|
|
121
|
+
return { code: "HUMANISH_SHARED_WORLD_FAILED", message: adapterFailure };
|
|
120
122
|
}
|
|
121
123
|
const passed = participantResults.filter((result) => result.ok).length;
|
|
122
124
|
if (passed === participantCount && args.shortfall !== undefined) {
|
|
123
125
|
return {
|
|
124
|
-
code: "
|
|
126
|
+
code: "HUMANISH_SHARED_WORLD_FAILED",
|
|
125
127
|
message: `Concurrent shared-world run did not run coherently. ${args.shortfall}`,
|
|
126
128
|
};
|
|
127
129
|
}
|
|
128
130
|
if (passed === participantCount && args.executionFailure !== undefined) {
|
|
129
131
|
return {
|
|
130
|
-
code: "
|
|
132
|
+
code: "HUMANISH_SHARED_WORLD_FAILED",
|
|
131
133
|
message: `Concurrent shared-world run failed as an execution. ${args.executionFailure}`,
|
|
132
134
|
};
|
|
133
135
|
}
|
|
134
136
|
return {
|
|
135
|
-
code: "
|
|
136
|
-
message: `Concurrent shared-world run did not run coherently: ${passed}/${participantCount
|
|
137
|
+
code: "HUMANISH_SHARED_WORLD_FAILED",
|
|
138
|
+
message: `Concurrent shared-world run did not run coherently: ${passed}/${plural(participantCount, "actor")} reached a terminal, engaged passed session.`,
|
|
137
139
|
};
|
|
138
140
|
}
|
|
139
141
|
/**
|
|
140
142
|
* The refusal envelope for a run that stops before it has results: the requested cwd, no roles,
|
|
141
143
|
* and the run id the caller asked for, if any. `actor` is the label when a refusal names none.
|
|
142
144
|
*/
|
|
143
|
-
export function
|
|
145
|
+
export function concurrentStudyFailure(envelope) {
|
|
144
146
|
return (code, message, actorLabel) => ({
|
|
145
|
-
|
|
147
|
+
...studyResultIdentity("shared-world", envelope.studyId),
|
|
146
148
|
ok: false,
|
|
147
149
|
cwd: envelope.cwd,
|
|
148
|
-
labId: envelope.labId,
|
|
149
150
|
actor: actorLabel ?? envelope.actor,
|
|
150
151
|
topology: "shared-world",
|
|
151
152
|
topologyMode: "concurrent",
|
|
@@ -159,10 +160,10 @@ export function concurrentLabFailure(envelope) {
|
|
|
159
160
|
});
|
|
160
161
|
}
|
|
161
162
|
/**
|
|
162
|
-
* The run's execution failures: a run error (the handoff, the plane), each
|
|
163
|
-
* failed in the harness, each provider whose cleanup is unconfirmed or that reported a
|
|
164
|
-
* item after its last request, each sandbox whose release is unconfirmed, and an
|
|
165
|
-
* failed.
|
|
163
|
+
* The run's execution failures: a run error (the handoff, the plane), each participant whose
|
|
164
|
+
* session failed in the harness, each provider whose cleanup is unconfirmed or that reported a
|
|
165
|
+
* disallowed item after its last request, each sandbox whose release is unconfirmed, and an
|
|
166
|
+
* Observer that failed.
|
|
166
167
|
*/
|
|
167
168
|
function sharedWorldExecutionFailures(args) {
|
|
168
169
|
const { runId, runError, actorResults, subject, observer } = args;
|
|
@@ -204,7 +205,7 @@ function sharedWorldExecutionFailures(args) {
|
|
|
204
205
|
]),
|
|
205
206
|
];
|
|
206
207
|
}
|
|
207
|
-
/** Builds and publishes the bundle, renders the Observer and returns the
|
|
208
|
+
/** Builds and publishes the bundle, renders the Observer and returns the study result. */
|
|
208
209
|
export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
209
210
|
const { plan, input, descriptor, actorSpecs, run, runId } = ctx;
|
|
210
211
|
const participantCount = plan.plane.participants.length;
|
|
@@ -268,7 +269,7 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
268
269
|
context: {
|
|
269
270
|
bundle,
|
|
270
271
|
runDir: physicalArtifactRoot,
|
|
271
|
-
|
|
272
|
+
studyId: plan.studyId,
|
|
272
273
|
runId,
|
|
273
274
|
actor: descriptor.id,
|
|
274
275
|
route: "shared-world",
|
|
@@ -288,8 +289,8 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
288
289
|
if (observer.ok && live.observer) {
|
|
289
290
|
attachObserverRuntimeStreamUrls(observer, live.streamUrls);
|
|
290
291
|
}
|
|
291
|
-
// Concurrent "ok": every actor must produce a terminal, engaged, passed session, and the
|
|
292
|
-
// must show the concurrency verify requires of a pass (judgeSharedWorld). This is a
|
|
292
|
+
// Concurrent "ok": every actor must produce a terminal, engaged, passed session, and the
|
|
293
|
+
// participants must show the concurrency verify requires of a pass (judgeSharedWorld). This is a
|
|
293
294
|
// harness/session-credibility gate, not mission-completion proof; a failed actor trace cannot
|
|
294
295
|
// make the route green just because the harness got a terminal.
|
|
295
296
|
const adapterFailure = adapterScoreFailureMessage(bundle);
|
|
@@ -298,7 +299,7 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
298
299
|
const ok = resultOk({ judgment, execution, scorerFailures: scorerResult.failures, policy });
|
|
299
300
|
const overlapProven = !dryRun && judgment.world.overlap;
|
|
300
301
|
const participantResults = concurrentParticipantResults(actorSpecs, actorResults, dryRun);
|
|
301
|
-
const errorResult =
|
|
302
|
+
const errorResult = concurrentStudyError({
|
|
302
303
|
ok,
|
|
303
304
|
handoffTimedOut,
|
|
304
305
|
hostHandoffFailure,
|
|
@@ -311,10 +312,9 @@ export async function finishConcurrentRun(ctx, live, results, plane) {
|
|
|
311
312
|
executionFailure: execution.failures[0]?.message,
|
|
312
313
|
});
|
|
313
314
|
const result = {
|
|
314
|
-
|
|
315
|
+
...studyResultIdentity("shared-world", plan.studyId),
|
|
315
316
|
ok,
|
|
316
317
|
cwd,
|
|
317
|
-
labId: plan.labId,
|
|
318
318
|
actor: descriptor.id,
|
|
319
319
|
topology: "shared-world",
|
|
320
320
|
topologyMode: "concurrent",
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { type SharedWorldRefusal } from "./plan.js";
|
|
2
|
-
import type { SharedWorldPlan } from "../../
|
|
3
|
-
import type { AdmittedPlan } from "../../run-
|
|
4
|
-
import type {
|
|
5
|
-
import { type
|
|
2
|
+
import type { SharedWorldPlan } from "../../study/plan-types.js";
|
|
3
|
+
import type { AdmittedPlan } from "../../run-study.js";
|
|
4
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
5
|
+
import { type ConcurrentSharedWorldStudyResult, type SharedWorldRunInput, type RunConcurrentSharedWorldStudyOptions } from "./types.js";
|
|
6
6
|
/**
|
|
7
|
-
* The library entry for a shared-world
|
|
7
|
+
* The library entry for a shared-world study. It plans the config with planSharedWorldStudy and runs
|
|
8
8
|
* the plan with runSharedWorldPlan, whose run scope and withTransientCommsSecrets wrapper cover the
|
|
9
9
|
* run and its analysis.
|
|
10
10
|
*/
|
|
11
|
-
export declare function runConcurrentSharedWorld(options:
|
|
12
|
-
/** A refused shared-world
|
|
13
|
-
export declare function
|
|
11
|
+
export declare function runConcurrentSharedWorld(options: RunConcurrentSharedWorldStudyOptions): Promise<ConcurrentSharedWorldStudyResult>;
|
|
12
|
+
/** A refused shared-world study's result: the route's envelope, and a refusal's analysis record. */
|
|
13
|
+
export declare function sharedWorldStudyRefusal(options: RunConcurrentSharedWorldStudyOptions, refusal: SharedWorldRefusal): Promise<ConcurrentSharedWorldStudyResult>;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* runStudyWith's step for a shared-world plan. It runs a live plan's local checks (the keys, a local
|
|
16
16
|
* agent's sign-in and the subject env) before any run scope opens, so the CLI can present their refusal before it loads a
|
|
17
17
|
* declared scorer, and returns the run that continues from them with that scorer.
|
|
18
18
|
*/
|
|
19
|
-
export declare function admitSharedWorldPlan(plan: SharedWorldPlan, input: SharedWorldRunInput, config:
|
|
19
|
+
export declare function admitSharedWorldPlan(plan: SharedWorldPlan, input: SharedWorldRunInput, config: StudyConfig): Promise<AdmittedPlan<"shared-world">>;
|
|
20
20
|
/** Run a shared-world plan: its local checks, then the run. */
|
|
21
|
-
export declare function runSharedWorldPlan(plan: SharedWorldPlan, input: SharedWorldRunInput, config:
|
|
21
|
+
export declare function runSharedWorldPlan(plan: SharedWorldPlan, input: SharedWorldRunInput, config: StudyConfig): Promise<ConcurrentSharedWorldStudyResult>;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
// The concurrent shared-world
|
|
1
|
+
// The concurrent shared-world route: N persona participants drive one shared,
|
|
2
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
|
-
// no GUI
|
|
7
|
+
// no GUI participant).
|
|
8
8
|
// - N actor desktop sandboxes: fan-out's runCuaParticipant machinery (per-participant device/persona, by-id
|
|
9
|
-
// teardown) bounded by execution.concurrency, each browser pointed at the getHost URL
|
|
9
|
+
// teardown) bounded by execution.concurrency, each browser pointed at the getHost URL and
|
|
10
10
|
// driving the shared service at the same time. Independent: no pipeline gate, no
|
|
11
|
-
// fail-fast
|
|
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.
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
// `best-effort-causal-attribution`, `non-deterministic-shared-state`,
|
|
21
21
|
// `window-and-snapshot-granularity`, `contention-observed-not-proven-safe`,
|
|
22
22
|
// `state-change-not-isolated-to-actors`. laneWindows + stateSeries are independent series with no
|
|
23
|
-
// per-delta→actor field
|
|
23
|
+
// per-delta→actor field, so causation under concurrency is structurally inexpressible.
|
|
24
24
|
//
|
|
25
|
-
// Capability and proof: the deterministic $0 gate proves the plumbing + the
|
|
26
|
-
// contract
|
|
25
|
+
// Capability and proof: the deterministic $0 gate proves the plumbing + the claims-match-mechanism
|
|
26
|
+
// contract: the real mapWithConcurrency produces genuinely overlapping laneWindows (a rendezvous
|
|
27
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.
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
// requires the author attestation subject.exposure: synthetic. This is author-trust + a provenance
|
|
34
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 "../../
|
|
36
|
+
import { missingKeys, missingSubjectEnv } from "../../study/requirements.js";
|
|
37
37
|
import { completeAutomaticAnalysis } from "../../analysis/automatic-completion.js";
|
|
38
38
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
39
39
|
import { scrubLiterals } from "../../evidence/redaction.js";
|
|
@@ -42,49 +42,49 @@ import { withTransientCommsSecrets } from "../../run/transient-comms-secrets.js"
|
|
|
42
42
|
import { runScope } from "../../run/run.js";
|
|
43
43
|
import { makeCuaRunBudget } from "../computer-use/participant-model.js";
|
|
44
44
|
import { runExternalPublicPlane } from "./external-public.js";
|
|
45
|
-
import {
|
|
45
|
+
import { planSharedWorldStudy, sharedWorldDescriptorOf } from "./plan.js";
|
|
46
46
|
import { localAgentRefusal } from "../../actors/local-agent/readiness.js";
|
|
47
47
|
import { runProvisionedPlane } from "./provisioned.js";
|
|
48
|
-
import {
|
|
48
|
+
import { concurrentStudyFailure, finishConcurrentRun } from "./result.js";
|
|
49
49
|
import { prepareConcurrentRun } from "./setup.js";
|
|
50
|
-
import { browserRouteScorer } from "../../
|
|
51
|
-
import { withLateScorer } from "../../
|
|
50
|
+
import { browserRouteScorer } from "../../study/adapter-scorer-loader.js";
|
|
51
|
+
import { withLateScorer } from "../../study/route-inputs.js";
|
|
52
52
|
import {} from "./types.js";
|
|
53
|
-
import { rosterOf } from "../../
|
|
53
|
+
import { rosterOf } from "../../study/parse/actors.js";
|
|
54
54
|
/** The shared-world code for each local-agent refusal, kind for kind with computer-use. */
|
|
55
55
|
const LOCAL_AGENT_REFUSAL_CODES = {
|
|
56
|
-
"agent-missing": "
|
|
57
|
-
"signin-required": "
|
|
58
|
-
unsupported: "
|
|
59
|
-
"unpriced-cap": "
|
|
56
|
+
"agent-missing": "HUMANISH_SHARED_WORLD_AGENT_MISSING",
|
|
57
|
+
"signin-required": "HUMANISH_SHARED_WORLD_AGENT_SIGNIN_REQUIRED",
|
|
58
|
+
unsupported: "HUMANISH_SHARED_WORLD_ACTOR_UNSUPPORTED",
|
|
59
|
+
"unpriced-cap": "HUMANISH_SHARED_WORLD_UNPRICED_CAP",
|
|
60
60
|
};
|
|
61
61
|
/**
|
|
62
|
-
* The library entry for a shared-world
|
|
62
|
+
* The library entry for a shared-world study. It plans the config with planSharedWorldStudy and runs
|
|
63
63
|
* the plan with runSharedWorldPlan, whose run scope and withTransientCommsSecrets wrapper cover the
|
|
64
64
|
* run and its analysis.
|
|
65
65
|
*/
|
|
66
66
|
export async function runConcurrentSharedWorld(options) {
|
|
67
67
|
const { config, dryRun, ...input } = options;
|
|
68
|
-
//
|
|
69
|
-
const planned =
|
|
68
|
+
// planSharedWorldStudy makes every configuration refusal, in the order this route always has.
|
|
69
|
+
const planned = planSharedWorldStudy(config, {
|
|
70
70
|
dryRun,
|
|
71
71
|
hasRunSession: input.deps?.runSession !== undefined,
|
|
72
72
|
});
|
|
73
73
|
if (planned.ok)
|
|
74
74
|
return runSharedWorldPlan(planned.plan, input, config);
|
|
75
|
-
return
|
|
75
|
+
return sharedWorldStudyRefusal(options, planned.refusal);
|
|
76
76
|
}
|
|
77
|
-
/** A refused shared-world
|
|
78
|
-
export function
|
|
77
|
+
/** A refused shared-world study's result: the route's envelope, and a refusal's analysis record. */
|
|
78
|
+
export function sharedWorldStudyRefusal(options, refusal) {
|
|
79
79
|
const { config, dryRun } = options;
|
|
80
80
|
const declared = rosterOf(config.actors[0]) ?? [];
|
|
81
|
-
const fail =
|
|
81
|
+
const fail = concurrentStudyFailure({
|
|
82
82
|
cwd: path.resolve(options.cwd),
|
|
83
|
-
|
|
83
|
+
studyId: config.id,
|
|
84
84
|
actor: config.actors[0]?.type ?? "",
|
|
85
85
|
participantCount: declared.length,
|
|
86
|
-
// The parser fills concurrency for multi-
|
|
87
|
-
// callers: every declared
|
|
86
|
+
// The parser fills concurrency for multi-participant studies, so this fallback serves only
|
|
87
|
+
// library callers: every declared participant runs at once unless the author declared a cap.
|
|
88
88
|
concurrency: config.execution?.concurrency ?? Math.max(1, declared.length),
|
|
89
89
|
dryRun,
|
|
90
90
|
runId: options.runId,
|
|
@@ -94,7 +94,7 @@ export function sharedWorldLabRefusal(options, refusal) {
|
|
|
94
94
|
return completeAutomaticAnalysis(fail(refusal.code, refusal.message, refusal.actor), undefined, analysis.ok ? analysis.config : undefined, options, { trigger: config.review?.analysis === undefined ? "default" : "explicit" });
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
|
-
*
|
|
97
|
+
* runStudyWith's step for a shared-world plan. It runs a live plan's local checks (the keys, a local
|
|
98
98
|
* agent's sign-in and the subject env) before any run scope opens, so the CLI can present their refusal before it loads a
|
|
99
99
|
* declared scorer, and returns the run that continues from them with that scorer.
|
|
100
100
|
*/
|
|
@@ -125,14 +125,15 @@ async function admitSharedWorldRun(plan, input) {
|
|
|
125
125
|
return undefined;
|
|
126
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
|
-
// The plan lists OPENAI_API_KEY for an openai brain's
|
|
129
|
-
// lobby-code reader; a local-agent brain's
|
|
128
|
+
// The plan lists OPENAI_API_KEY for an openai brain's participants and the external-public
|
|
129
|
+
// plane's lobby-code reader; a local-agent brain's participants run on the operator's signed-in
|
|
130
|
+
// agent instead.
|
|
130
131
|
const missing = missingKeys(plan.requirements, env);
|
|
131
132
|
if (missing.length > 0) {
|
|
132
|
-
return fail("
|
|
133
|
+
return fail("HUMANISH_SHARED_WORLD_KEYS_MISSING", `Live concurrent shared-world studies need ${missing.join(" and ")} in the environment (values are never persisted). ${describeMissingKeys(missing, env)}`);
|
|
133
134
|
}
|
|
134
135
|
if (plan.brain.kind === "local-agent") {
|
|
135
|
-
// A missing or signed-out agent found after the
|
|
136
|
+
// A missing or signed-out agent found after the participants' desktops are paid for is the same
|
|
136
137
|
// news at the worst moment.
|
|
137
138
|
const refusal = await localAgentRefusal({ agent: plan.brain.agent, env, caps: plan.caps });
|
|
138
139
|
if (refusal)
|
|
@@ -140,7 +141,7 @@ async function admitSharedWorldRun(plan, input) {
|
|
|
140
141
|
}
|
|
141
142
|
const unsetSubjectEnv = missingSubjectEnv(plan.requirements, env);
|
|
142
143
|
if (unsetSubjectEnv.length > 0) {
|
|
143
|
-
return fail("
|
|
144
|
+
return fail("HUMANISH_SHARED_WORLD_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).`);
|
|
144
145
|
}
|
|
145
146
|
return undefined;
|
|
146
147
|
}
|
|
@@ -163,9 +164,9 @@ function completeSharedWorldAnalysis(plan, input, result, finished) {
|
|
|
163
164
|
}
|
|
164
165
|
/** The route's envelope for a run that stops before its bundle. */
|
|
165
166
|
function sharedWorldFailure(plan, input) {
|
|
166
|
-
return
|
|
167
|
+
return concurrentStudyFailure({
|
|
167
168
|
cwd: path.resolve(input.cwd),
|
|
168
|
-
|
|
169
|
+
studyId: plan.studyId,
|
|
169
170
|
actor: plan.actor,
|
|
170
171
|
participantCount: plan.plane.participants.length,
|
|
171
172
|
concurrency: plan.concurrency,
|
|
@@ -232,13 +233,13 @@ async function runPlanInScope(plan, input, config, scope) {
|
|
|
232
233
|
const { ctx, live, results } = prepared;
|
|
233
234
|
const planeRan = await runPlane(ctx, live, results, prepared.plane);
|
|
234
235
|
if (!planeRan) {
|
|
235
|
-
return fail("
|
|
236
|
+
return fail("HUMANISH_SHARED_WORLD_INVALID", "the provisioned-getHost concurrent shared-world route requires `subject.serve`.", descriptor.id);
|
|
236
237
|
}
|
|
237
238
|
return finishConcurrentRun(ctx, live, results, prepared.finish);
|
|
238
239
|
}
|
|
239
240
|
/**
|
|
240
|
-
* Runs the plane the
|
|
241
|
-
* every exit. Returns false when a provisioned
|
|
241
|
+
* Runs the plane the study declares, then finalizes email receiving and stops the participants'
|
|
242
|
+
* flush on every exit. Returns false when a provisioned study reaches it without `subject.serve`.
|
|
242
243
|
*/
|
|
243
244
|
async function runPlane(ctx, live, results, plane) {
|
|
244
245
|
const { dryRun } = ctx.plan;
|
|
@@ -266,7 +267,7 @@ async function runPlane(ctx, live, results, plane) {
|
|
|
266
267
|
catch {
|
|
267
268
|
ctx.warnings.push("Email finalization could not complete. Inspect humanish comms recover; provider cleanup remains unresolved.");
|
|
268
269
|
}
|
|
269
|
-
// Stop the
|
|
270
|
+
// Stop the participants' flush timer on every exit, before the final write.
|
|
270
271
|
await live.flush?.stop();
|
|
271
272
|
}
|
|
272
273
|
return true;
|