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
|
@@ -13,13 +13,13 @@ const otherRoute = (routes) => !promptRoute(routes) && !routes.scripted;
|
|
|
13
13
|
/** Rows for each actor, reported as `actors[<index>].<field>`, in this order per actor. */
|
|
14
14
|
const ACTOR_ROWS = [
|
|
15
15
|
// Shared-world-only fields on the roster: a participant's `entry` is inert anywhere else
|
|
16
|
-
// (
|
|
16
|
+
// (claims match mechanism).
|
|
17
17
|
{
|
|
18
18
|
field: "lanes[].entry",
|
|
19
19
|
reason: "the per-participant loopback entry is a shared-world capability; needs subject.topology: shared-world",
|
|
20
20
|
applies: (actor, routes) => Boolean(rosterOf(actor)?.some((entry) => entry.entry !== undefined)) && !routes.shared,
|
|
21
21
|
},
|
|
22
|
-
// The host
|
|
22
|
+
// The host marker acts only on the external-public shared-world route; inert elsewhere.
|
|
23
23
|
{
|
|
24
24
|
field: "lanes[].host",
|
|
25
25
|
reason: "the designated host-participant marker; needs the external-public shared-world route: app-url × topology shared-world × allowPublicTargets",
|
|
@@ -35,7 +35,7 @@ const ACTOR_ROWS = [
|
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
field: "lanes",
|
|
38
|
-
reason: "
|
|
38
|
+
reason: "only the computer-use route runs more than one participant",
|
|
39
39
|
applies: (actor, routes) => routes.terminal && Boolean(rosterOf(actor)),
|
|
40
40
|
},
|
|
41
41
|
{
|
|
@@ -69,7 +69,7 @@ const ACTOR_ROWS = [
|
|
|
69
69
|
{ field: "lanes", applies: (actor, routes) => otherRoute(routes) && Boolean(rosterOf(actor)) },
|
|
70
70
|
];
|
|
71
71
|
const TERMINAL_ONLY = "needs subject.source: terminal-product + a registered terminal actor";
|
|
72
|
-
const RESERVED = "reserved
|
|
72
|
+
const RESERVED = "reserved; no route reads it yet";
|
|
73
73
|
/** Rows for the rest of the config, reported after the actor rows, in this order. */
|
|
74
74
|
const CONFIG_ROWS = [
|
|
75
75
|
// The computer-use routes consume (clone) subject.{serve,env,state,clone.depth}, and so does the
|
|
@@ -90,8 +90,9 @@ const CONFIG_ROWS = [
|
|
|
90
90
|
field: "subject.state",
|
|
91
91
|
applies: (config, routes) => Boolean(config.subject.state) && !routes.cua && !routes.scripted,
|
|
92
92
|
},
|
|
93
|
-
// topology + checkpoint act only on the shared-world route
|
|
94
|
-
// (incl. an explicit per-lane-worlds, which the
|
|
93
|
+
// topology + checkpoint act only on the shared-world route; a set-but-unconsumed value
|
|
94
|
+
// (incl. an explicit per-lane-worlds, which the computer-use route already is by mechanism) warns
|
|
95
|
+
// inert.
|
|
95
96
|
{
|
|
96
97
|
field: "subject.topology",
|
|
97
98
|
reason: "drives behavior only on the shared-world route; needs subject.topology: shared-world + clone × e2b-desktop × a computer-use actor + a roster of ≥2 participants",
|
|
@@ -113,7 +114,7 @@ const CONFIG_ROWS = [
|
|
|
113
114
|
// getHost-exposed plane) and on scripted clones; inert elsewhere.
|
|
114
115
|
{
|
|
115
116
|
field: "subject.exposure",
|
|
116
|
-
reason: "the
|
|
117
|
+
reason: "the statement that a subject served on a public sandbox URL holds only synthetic data; needs shared-world or clone × e2b-desktop × scripted-browser",
|
|
117
118
|
applies: (config, routes) => config.subject.exposure !== undefined &&
|
|
118
119
|
!routes.shared &&
|
|
119
120
|
!(routes.scripted && config.subject.source === "clone"),
|
|
@@ -121,10 +122,10 @@ const CONFIG_ROWS = [
|
|
|
121
122
|
// comms.email drives the in-sandbox email/SMS catch, which needs a subject sandbox that humanish
|
|
122
123
|
// provisions (clone or local-tree) so it holds a handle to host the catch. On an app-url /
|
|
123
124
|
// operator-provided subject there is no such handle, so a declared comms block would silently
|
|
124
|
-
// collect nothing
|
|
125
|
+
// collect nothing, a false green. Warn at parse time (fires on inspect + dry-run too).
|
|
125
126
|
{
|
|
126
127
|
field: "comms.email",
|
|
127
|
-
reason: "the
|
|
128
|
+
reason: "the email catch runs in a sandbox humanish provisions, which needs `subject.source: clone` or `local-tree`, and an app-url subject has none. To use email here, run the catch yourself with `humanish comms catch` and declare `comms.email.external`: humanish then points each persona at your inbox, reads your catch and records the same evidence",
|
|
128
129
|
applies: (config) => config.comms?.email?.kind === "fake" &&
|
|
129
130
|
config.comms.email.external === undefined &&
|
|
130
131
|
config.subject.source !== "clone" &&
|
|
@@ -135,13 +136,13 @@ const CONFIG_ROWS = [
|
|
|
135
136
|
// declared external one would silently collect nothing.
|
|
136
137
|
{
|
|
137
138
|
field: "comms.email.external",
|
|
138
|
-
reason: "this subject is harness-provisioned, so humanish hosts the catch itself and injects its URL; an adopter-hosted catch would receive nothing. Drop `external` here, or move the
|
|
139
|
+
reason: "this subject is harness-provisioned, so humanish hosts the catch itself and injects its URL; an adopter-hosted catch would receive nothing. Drop `external` here, or move the study to an app-url or operator-provisioned subject",
|
|
139
140
|
applies: (config) => Boolean(config.comms?.email?.external) &&
|
|
140
141
|
(config.subject.source === "clone" || config.subject.source === "local-tree"),
|
|
141
142
|
},
|
|
142
|
-
// clone.keep is consumed on the
|
|
143
|
-
// a failed install/boot; otherwise always killed). clone.fanout is rejected on the
|
|
144
|
-
// (a hard parse error above), so it can never reach this warning list there.
|
|
143
|
+
// clone.keep is consumed on the computer-use route (honored on failure: the sandbox is left up to
|
|
144
|
+
// debug a failed install/boot; otherwise always killed). clone.fanout is rejected on the
|
|
145
|
+
// computer-use route (a hard parse error above), so it can never reach this warning list there.
|
|
145
146
|
{
|
|
146
147
|
field: "execution.timeoutMs",
|
|
147
148
|
applies: (config, routes) => !routes.cua &&
|
|
@@ -153,23 +154,24 @@ const CONFIG_ROWS = [
|
|
|
153
154
|
field: "execution.completionTimeoutMs",
|
|
154
155
|
applies: (config) => config.execution?.completionTimeoutMs !== undefined,
|
|
155
156
|
},
|
|
156
|
-
// execution.concurrency is consumed on the
|
|
157
|
-
// inert (warned) everywhere else.
|
|
157
|
+
// execution.concurrency is consumed on the computer-use route (it bounds in-flight fan-out
|
|
158
|
+
// participants); inert (warned) everywhere else.
|
|
158
159
|
{
|
|
159
160
|
field: "execution.concurrency",
|
|
160
161
|
applies: (config, routes) => config.execution?.concurrency !== undefined && !routes.cua,
|
|
161
162
|
},
|
|
162
|
-
// execution.caps is consumed on the
|
|
163
|
-
// (warned) everywhere else so a misplaced budget field is never trusted to cap a route it
|
|
163
|
+
// execution.caps is consumed on the computer-use route (maxUsd is the fail-closed spend abort);
|
|
164
|
+
// inert (warned) everywhere else so a misplaced budget field is never trusted to cap a route it
|
|
165
|
+
// cannot.
|
|
164
166
|
{
|
|
165
167
|
field: "execution.caps",
|
|
166
|
-
reason: "the
|
|
168
|
+
reason: "only the computer-use route enforces it, with a computer-use actor on e2b-desktop",
|
|
167
169
|
applies: (config, routes) => Boolean(config.execution?.caps) && !routes.cua,
|
|
168
170
|
},
|
|
169
171
|
// terminal-product consumes subject.product, scenario.caps, execution.{terminal,runtimeAuth}:
|
|
170
172
|
// dry-run records the contract; live execution enforces caps and command-scoped auth. On every
|
|
171
173
|
// other route they are inert and must warn so a
|
|
172
|
-
// misplaced safety/budget field is never trusted to do something it cannot
|
|
174
|
+
// misplaced safety/budget field is never trusted to do something it cannot.
|
|
173
175
|
{
|
|
174
176
|
field: "subject.product",
|
|
175
177
|
reason: "needs subject.source: terminal-product or desktop-cli with the matching actor",
|
|
@@ -229,9 +231,9 @@ const CONFIG_ROWS = [
|
|
|
229
231
|
applies: (config, routes) => !routes.cua && config.execution?.desktop?.sandboxTimeoutMs !== undefined,
|
|
230
232
|
},
|
|
231
233
|
// execution.desktop.template (the custom E2B desktop image) is consumed only where a desktop is
|
|
232
|
-
// actually created via Sandbox.create
|
|
233
|
-
// concurrent). It is inert on every other route (incl. the in-process local-app
|
|
234
|
-
// creates no desktop): warn so an unconsumed template is never silently ignored
|
|
234
|
+
// actually created via Sandbox.create: the e2b-desktop computer-use routes (cua/shared-world/
|
|
235
|
+
// concurrent). It is inert on every other route (incl. the in-process local-app computer-use
|
|
236
|
+
// route, which creates no desktop): warn so an unconsumed template is never silently ignored.
|
|
235
237
|
{
|
|
236
238
|
field: "execution.desktop.template",
|
|
237
239
|
reason: "the custom E2B desktop image is consumed only on execution.target: e2b-desktop computer-use routes that create a desktop; needs a computer-use actor on e2b-desktop",
|
|
@@ -251,8 +253,8 @@ const CONFIG_ROWS = [
|
|
|
251
253
|
applies: (config, routes) => Boolean(config.scenario?.ref) && !routes.scripted,
|
|
252
254
|
},
|
|
253
255
|
{ field: "scenario.inline", applies: (config) => Boolean(config.scenario?.inline) },
|
|
254
|
-
// review.{scoring,milestones,vocabulary} stay forward-declared
|
|
255
|
-
// review.scorer
|
|
256
|
+
// review.{scoring,milestones,vocabulary} stay forward-declared on every route.
|
|
257
|
+
// review.scorer is consumed (loaded + wired, or fail-closed at load) on every scorer-capable
|
|
256
258
|
// route, so it does not warn there; on the scripted-browser route the actor carries no scorer seam,
|
|
257
259
|
// so a declared scorer is flagged inert (the run also fails closed at load).
|
|
258
260
|
{
|
|
@@ -297,9 +299,11 @@ function rowLabel(row, prefix = "") {
|
|
|
297
299
|
? `${prefix}${row.field}`
|
|
298
300
|
: `${prefix}${row.field} (${row.reason})`;
|
|
299
301
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
302
|
+
/**
|
|
303
|
+
* The fields a config sets that its route does not read, each as `field` or `field (reason)`. A v2
|
|
304
|
+
* file gets them as one warning; a v3 study is refused for any of them.
|
|
305
|
+
*/
|
|
306
|
+
export function inertFieldLabels(config) {
|
|
303
307
|
const routes = routesOf(config);
|
|
304
308
|
const inert = [];
|
|
305
309
|
for (const [index, actor] of config.actors.entries()) {
|
|
@@ -310,14 +314,38 @@ export function forwardDeclaredWarnings(config) {
|
|
|
310
314
|
for (const row of CONFIG_ROWS)
|
|
311
315
|
if (row.applies(config, routes))
|
|
312
316
|
inert.push(rowLabel(row));
|
|
317
|
+
return inert;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* The same fields as `inertFieldLabels`, as paths without their reasons, such as
|
|
321
|
+
* `actors[0].lanes[].entry` or `execution.timeoutMs`. `humanish migrate` drops each one.
|
|
322
|
+
*/
|
|
323
|
+
export function inertFieldPaths(config) {
|
|
324
|
+
const routes = routesOf(config);
|
|
325
|
+
const paths = [];
|
|
326
|
+
for (const [index, actor] of config.actors.entries()) {
|
|
327
|
+
for (const row of ACTOR_ROWS)
|
|
328
|
+
if (row.applies(actor, routes))
|
|
329
|
+
paths.push(`actors[${index}].${row.field}`);
|
|
330
|
+
}
|
|
331
|
+
for (const row of CONFIG_ROWS)
|
|
332
|
+
if (row.applies(config, routes))
|
|
333
|
+
paths.push(row.field);
|
|
334
|
+
return paths;
|
|
335
|
+
}
|
|
336
|
+
// Report fields that are present but not yet consumed by the engine, so a user never trusts a
|
|
337
|
+
// setting that silently does nothing.
|
|
338
|
+
export function forwardDeclaredWarnings(config) {
|
|
339
|
+
const routes = routesOf(config);
|
|
340
|
+
const inert = inertFieldLabels(config);
|
|
313
341
|
const warnings = inert.length === 0
|
|
314
342
|
? []
|
|
315
343
|
: [
|
|
316
|
-
`
|
|
344
|
+
`These fields are set, but no route reads them yet, so they have no effect: ${inert.join(", ")}.`,
|
|
317
345
|
];
|
|
318
|
-
// A declared cap below the
|
|
319
|
-
// the cap delivers waves of M. Say so up front (inspect + dry-run + run)
|
|
320
|
-
// is otherwise indistinguishable from the all-live run the author meant
|
|
346
|
+
// A declared cap below the participant count is legal but loud: the roster promises N live actors
|
|
347
|
+
// and the cap delivers waves of M. Say so up front (inspect + dry-run + run): a green run in
|
|
348
|
+
// waves is otherwise indistinguishable from the all-live run the author meant.
|
|
321
349
|
{
|
|
322
350
|
const participantCount = rosterOf(config.actors[0])?.length ?? config.actors[0]?.count ?? 1;
|
|
323
351
|
const cap = config.execution?.concurrency;
|
|
@@ -325,14 +353,14 @@ export function forwardDeclaredWarnings(config) {
|
|
|
325
353
|
warnings.push(`execution.concurrency ${cap} caps a ${participantCount}-participant roster: participants run in waves of ${cap}, never all live at once. Remove execution.concurrency (the default runs all ${participantCount} participants simultaneously) or set it to ${participantCount}; declare a lower cap only to bound simultaneous paid desktops.`);
|
|
326
354
|
}
|
|
327
355
|
}
|
|
328
|
-
// Partial email coverage is legal but loud
|
|
329
|
-
// hears an inbox exists, so an email-gated flow on that
|
|
356
|
+
// Partial email coverage is legal but loud: a participant without an addressed recipient never
|
|
357
|
+
// hears an inbox exists, so an email-gated flow on that participant dead-ends by construction.
|
|
330
358
|
if (routes.cua && config.comms?.email?.recipients) {
|
|
331
359
|
const participantIds = declaredParticipantIds(config);
|
|
332
360
|
const covered = new Set(addressedRecipients(config.comms.email).map((recipient) => recipient.participantId));
|
|
333
361
|
const uncovered = participantIds.filter((id) => !covered.has(id));
|
|
334
362
|
if (covered.size > 0 && uncovered.length > 0 && participantIds.length > 1) {
|
|
335
|
-
warnings.push(`comms.email covers ${covered.size} of ${participantIds.length} participants
|
|
363
|
+
warnings.push(`comms.email covers ${covered.size} of ${participantIds.length} participants. These get no inbox and are never told one exists: ${uncovered.join(", ")}. Add a recipient with an address for each one whose flow needs email.`);
|
|
336
364
|
}
|
|
337
365
|
}
|
|
338
366
|
return warnings;
|
package/dist/subject/clone.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../run/bundle.js";
|
|
3
3
|
import { type DetachedTimers } from "../substrates/detached.js";
|
|
4
4
|
import { type Shell } from "../substrates/shell.js";
|
|
5
5
|
import { type SubjectPhaseEvent } from "./steps.js";
|
|
6
|
-
/** The longest provisionCloneSubject can take with the
|
|
7
|
-
export declare function cloneProvisioningBudgetMs(serve:
|
|
6
|
+
/** The longest provisionCloneSubject can take with the study's budgets: the clone, then serving. */
|
|
7
|
+
export declare function cloneProvisioningBudgetMs(serve: StudySubjectServe, state: StudySubjectState | undefined): number;
|
|
8
8
|
/**
|
|
9
9
|
* Provision a clone subject inside the sandbox: clone, then the shared serve pipeline (install,
|
|
10
10
|
* state before-build, build, state before-start, start, readiness probe, state after-ready).
|
|
11
11
|
* Returns the latest subject HEAD after successful provisioning. Throws (with a capped log tail
|
|
12
|
-
* for the caller to redact) on any failing step; the
|
|
12
|
+
* for the caller to redact) on any failing step; the route persists that as a failed-evidence
|
|
13
13
|
* bundle.
|
|
14
14
|
*
|
|
15
15
|
* Auth: when GITHUB_TOKEN is among the declared subject env names, the clone authenticates via an
|
|
@@ -20,12 +20,12 @@ export declare function cloneProvisioningBudgetMs(serve: LabSubjectServe, state:
|
|
|
20
20
|
export declare function provisionCloneSubject(shell: Shell, args: {
|
|
21
21
|
repo: string;
|
|
22
22
|
depth: number;
|
|
23
|
-
serve:
|
|
23
|
+
serve: StudySubjectServe;
|
|
24
24
|
/** Declared subject state (seed steps; external declaration is provenance-only). */
|
|
25
|
-
state?:
|
|
25
|
+
state?: StudySubjectState;
|
|
26
26
|
hasGithubToken: boolean;
|
|
27
27
|
requestTimeoutMs: number;
|
|
28
|
-
/** Literal scrubber for known provisioned values, applied to log tails
|
|
28
|
+
/** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
|
|
29
29
|
scrub: (text: string) => string;
|
|
30
30
|
/** Called the moment the cloned commit resolves, so provenance survives later failures. */
|
|
31
31
|
onCommit?: (commit: string) => void;
|
package/dist/subject/clone.js
CHANGED
|
@@ -3,7 +3,7 @@ import { detachedTimersOf, runDetachedStep } from "../substrates/detached.js";
|
|
|
3
3
|
import { runOrThrow } from "../substrates/shell.js";
|
|
4
4
|
import { runSubjectServePipeline, serveProvisioningBudgetMs } from "./serve.js";
|
|
5
5
|
import { SOURCE_TIMEOUT_MS, emitPhaseCompleted, emitPhaseStarted, SUBJECT_DIR, } from "./steps.js";
|
|
6
|
-
/** The longest provisionCloneSubject can take with the
|
|
6
|
+
/** The longest provisionCloneSubject can take with the study's budgets: the clone, then serving. */
|
|
7
7
|
export function cloneProvisioningBudgetMs(serve, state) {
|
|
8
8
|
return SOURCE_TIMEOUT_MS + serveProvisioningBudgetMs(serve, state);
|
|
9
9
|
}
|
|
@@ -11,7 +11,7 @@ export function cloneProvisioningBudgetMs(serve, state) {
|
|
|
11
11
|
* Provision a clone subject inside the sandbox: clone, then the shared serve pipeline (install,
|
|
12
12
|
* state before-build, build, state before-start, start, readiness probe, state after-ready).
|
|
13
13
|
* Returns the latest subject HEAD after successful provisioning. Throws (with a capped log tail
|
|
14
|
-
* for the caller to redact) on any failing step; the
|
|
14
|
+
* for the caller to redact) on any failing step; the route persists that as a failed-evidence
|
|
15
15
|
* bundle.
|
|
16
16
|
*
|
|
17
17
|
* Auth: when GITHUB_TOKEN is among the declared subject env names, the clone authenticates via an
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Shell } from "../substrates/shell.js";
|
|
2
2
|
import { type SubjectPhaseEvent } from "./steps.js";
|
|
3
3
|
/**
|
|
4
|
-
* Prepare a CLI study's runtime and, only when declared, its product
|
|
4
|
+
* Prepare a CLI study's runtime and, only when declared, its product.
|
|
5
5
|
*
|
|
6
6
|
* The install runs unkeyed and before the session starts, for the same reason the clone route
|
|
7
7
|
* provisions its subject first: what is being studied begins when the participant looks at the
|
|
@@ -4,7 +4,7 @@ import { NODE_BOOTSTRAP_COMMAND, NODE_BOOTSTRAP_TIMEOUT_MS } from "./node-bootst
|
|
|
4
4
|
import { runDetachedStep } from "../substrates/detached.js";
|
|
5
5
|
import { emitPhaseCompleted, emitPhaseStarted, INSTALL_TIMEOUT_MS, } from "./steps.js";
|
|
6
6
|
/**
|
|
7
|
-
* Prepare a CLI study's runtime and, only when declared, its product
|
|
7
|
+
* Prepare a CLI study's runtime and, only when declared, its product.
|
|
8
8
|
*
|
|
9
9
|
* The install runs unkeyed and before the session starts, for the same reason the clone route
|
|
10
10
|
* provisions its subject first: what is being studied begins when the participant looks at the
|
|
@@ -44,7 +44,7 @@ export async function provisionDesktopCli(shell, args) {
|
|
|
44
44
|
if (!result.ok) {
|
|
45
45
|
// Fail closed: a participant handed a desktop where the product is not installed would produce
|
|
46
46
|
// a transcript about a missing command, and that finding belongs to the harness, not the tool.
|
|
47
|
-
// The tail rides along, scrubbed before truncation like every other provisioning failure
|
|
47
|
+
// The tail rides along, scrubbed before truncation like every other provisioning failure. A
|
|
48
48
|
// bare "install failed" is unactionable to whoever wrote the command.
|
|
49
49
|
throw new Error(args.scrub(`desktop-cli install failed for "${args.product}" (${result.timedOut ? "timed out" : `exit ${result.exitCode ?? "?"}`}): ${failureTail(args.scrub(result.logTail))}`));
|
|
50
50
|
}
|
|
@@ -76,7 +76,7 @@ export declare function createLocalTreeArchive(root: string, options?: CreateLoc
|
|
|
76
76
|
* produces (no leading "./", no trailing "/"). Absolute paths and glob syntax
|
|
77
77
|
* are rejected instead of silently ignored: an exclude the author believed in but
|
|
78
78
|
* that never matches anything is a leak vector, so unusable shapes fail
|
|
79
|
-
* closed at the packing boundary (and, for
|
|
80
|
-
* time in src/
|
|
79
|
+
* closed at the packing boundary (and, for study manifests, already at parse
|
|
80
|
+
* time in src/study/parse/subject.ts).
|
|
81
81
|
*/
|
|
82
82
|
export declare function normalizeExtraExcludeEntry(entry: string): string;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// that cannot happen: enumerateLocalTree() builds one entries array, and both
|
|
9
9
|
// the hash and the tar file list are derived from that same array.
|
|
10
10
|
//
|
|
11
|
-
// See docs/goals/local-tree-subject/goal.md ("Packing design") for the full
|
|
11
|
+
// See docs/history/goals/local-tree-subject/goal.md ("Packing design") for the full
|
|
12
12
|
// contract implemented here. Node builtins only, no npm dependencies.
|
|
13
13
|
import { execFileSync } from "node:child_process";
|
|
14
14
|
import { createHash } from "node:crypto";
|
|
@@ -111,7 +111,7 @@ export function createLocalTreeArchive(root, options = {}) {
|
|
|
111
111
|
if (entries.length === 0) {
|
|
112
112
|
throw new Error(`Local tree root "${path.basename(resolvedRoot)}" produced zero packable entries after the always-on denylist` +
|
|
113
113
|
(extraExclude.length > 0 ? " and extraExclude" : "") +
|
|
114
|
-
"; local-tree packing requires at least one non-denylisted file or symlink. (Paths in this message are basenames only; the packed root is the
|
|
114
|
+
"; local-tree packing requires at least one non-denylisted file or symlink. (Paths in this message are basenames only; the packed root is the study's working directory.)");
|
|
115
115
|
}
|
|
116
116
|
// Check the cap from enumerated sizes before reading/hashing file bytes, so
|
|
117
117
|
// an oversized tree fails closed without the cost of hashing all of it.
|
|
@@ -292,8 +292,8 @@ function isDenylistedSegment(relPath) {
|
|
|
292
292
|
* produces (no leading "./", no trailing "/"). Absolute paths and glob syntax
|
|
293
293
|
* are rejected instead of silently ignored: an exclude the author believed in but
|
|
294
294
|
* that never matches anything is a leak vector, so unusable shapes fail
|
|
295
|
-
* closed at the packing boundary (and, for
|
|
296
|
-
* time in src/
|
|
295
|
+
* closed at the packing boundary (and, for study manifests, already at parse
|
|
296
|
+
* time in src/study/parse/subject.ts).
|
|
297
297
|
*/
|
|
298
298
|
export function normalizeExtraExcludeEntry(entry) {
|
|
299
299
|
const trimmed = entry.trim();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../run/bundle.js";
|
|
3
3
|
import { type DetachedTimers } from "../substrates/detached.js";
|
|
4
4
|
import type { Shell } from "../substrates/shell.js";
|
|
@@ -14,11 +14,11 @@ import { type SubjectPhaseEvent } from "./steps.js";
|
|
|
14
14
|
export declare function provisionLocalTreeSubject(shell: Shell, args: {
|
|
15
15
|
/** The once-per-run packed archive bytes (shared byte-identically across every participant). */
|
|
16
16
|
archiveBuffer: ArrayBuffer;
|
|
17
|
-
serve:
|
|
17
|
+
serve: StudySubjectServe;
|
|
18
18
|
/** Declared subject state (seed steps; external declaration is provenance-only). */
|
|
19
|
-
state?:
|
|
19
|
+
state?: StudySubjectState;
|
|
20
20
|
requestTimeoutMs: number;
|
|
21
|
-
/** Literal scrubber for known provisioned values, applied to log tails
|
|
21
|
+
/** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
|
|
22
22
|
scrub: (text: string) => string;
|
|
23
23
|
/** Called the moment each state step finishes, success or failure. */
|
|
24
24
|
onStateStep?: (record: RunSubjectStateStepRecord) => void;
|
|
@@ -54,7 +54,7 @@ export const NODE_BOOTSTRAP_COMMAND = [
|
|
|
54
54
|
"for executable in node npm npx; do",
|
|
55
55
|
` sudo -n ln -sfn "$node_target/bin/$executable" "/usr/local/bin/$executable"`,
|
|
56
56
|
"done",
|
|
57
|
-
// Keep global product executables on the existing ordinary/sudo `PATH
|
|
57
|
+
// Keep global product executables on the existing ordinary/sudo `PATH`. The new
|
|
58
58
|
// versioned distribution is the only config we modify; no user/global npmrc or profile.
|
|
59
59
|
`sudo -n "$node_target/bin/node" -e '${NODE_NPM_PREFIX_SCRIPT}' "$node_target/lib/node_modules/npm/npmrc"`,
|
|
60
60
|
"hash -r",
|
package/dist/subject/runtime.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
// Provide the runtime a subject's serve pipeline needs, instead of failing at exit 127
|
|
1
|
+
// Provide the runtime a subject's serve pipeline needs, instead of failing at exit 127.
|
|
2
2
|
//
|
|
3
|
-
// The stock E2B `desktop` template ships python3 and curl but no Node.
|
|
4
|
-
//
|
|
5
|
-
// for
|
|
6
|
-
//
|
|
7
|
-
// `pnpm: command not found` after a sandbox had been created and paid for.
|
|
3
|
+
// The stock E2B `desktop` template ships python3 and curl but no Node. So the in-sandbox comms
|
|
4
|
+
// catch runs on python3, the terminal route bootstraps Node explicitly, and this module provides
|
|
5
|
+
// Node for the computer-use clone/local-tree route. Without it, any study whose `serve.install`
|
|
6
|
+
// runs npm or pnpm dies with `pnpm: command not found` after its sandbox is created and paid for.
|
|
8
7
|
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
8
|
+
// That failure is invisible up front: `study show` is clean, the plan prints normally, the sandbox
|
|
9
|
+
// provisions, and the first signal is a shell exit code attributed to "subject install failed".
|
|
11
10
|
// Nobody can debug that from the outside.
|
|
12
11
|
//
|
|
13
|
-
// The harness provides the runtime instead of warning about it. An adopter writing a
|
|
14
|
-
// know which binaries the template happens to carry
|
|
12
|
+
// The harness provides the runtime instead of warning about it. An adopter writing a study for a Node app should not have to
|
|
13
|
+
// know which binaries the template happens to carry. That is the harness's job, and the terminal
|
|
15
14
|
// route already treats it that way. Detection is conservative and the bootstrap is skipped whenever
|
|
16
15
|
// a runtime is already present, so a custom template that ships Node pays nothing.
|
|
17
16
|
/** Package managers and runtimes whose absence on the stock template breaks a serve pipeline. */
|
package/dist/subject/serve.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudySubjectServe, StudySubjectState } from "../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../run/bundle.js";
|
|
3
3
|
import { type DetachedTimers } from "../substrates/detached.js";
|
|
4
4
|
import type { Shell } from "../substrates/shell.js";
|
|
@@ -8,7 +8,7 @@ import { type SubjectPhaseEvent } from "./steps.js";
|
|
|
8
8
|
* with their one retry, the package-manager step, every seed step, the build and the readiness
|
|
9
9
|
* wait. Detached-step polling adds seconds on top.
|
|
10
10
|
*/
|
|
11
|
-
export declare function serveProvisioningBudgetMs(serve:
|
|
11
|
+
export declare function serveProvisioningBudgetMs(serve: StudySubjectServe, state: StudySubjectState | undefined): number;
|
|
12
12
|
/**
|
|
13
13
|
* The provisioning pipeline the clone and local-tree routes share once SUBJECT_DIR is populated
|
|
14
14
|
* (by git clone, or by upload and extract): install, state before-build, build, state
|
|
@@ -21,11 +21,11 @@ export declare function serveProvisioningBudgetMs(serve: LabSubjectServe, state:
|
|
|
21
21
|
* eats the session budget.
|
|
22
22
|
*/
|
|
23
23
|
export declare function runSubjectServePipeline(shell: Shell, args: {
|
|
24
|
-
serve:
|
|
24
|
+
serve: StudySubjectServe;
|
|
25
25
|
/** Declared subject state (seed steps; external declaration is provenance-only). */
|
|
26
|
-
state?:
|
|
26
|
+
state?: StudySubjectState;
|
|
27
27
|
requestTimeoutMs: number;
|
|
28
|
-
/** Literal scrubber for known provisioned values, applied to log tails
|
|
28
|
+
/** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
|
|
29
29
|
scrub: (text: string) => string;
|
|
30
30
|
/** Called the moment each state step finishes, success or failure. */
|
|
31
31
|
onStateStep?: (record: RunSubjectStateStepRecord) => void;
|
package/dist/subject/serve.js
CHANGED
|
@@ -8,7 +8,7 @@ import { emitPhaseCompleted, emitPhaseStarted, INSTALL_TIMEOUT_MS, isoNow, SUBJE
|
|
|
8
8
|
const BUILD_TIMEOUT_MS = 10 * 60_000;
|
|
9
9
|
const DEFAULT_READY_TIMEOUT_MS = 180_000;
|
|
10
10
|
/**
|
|
11
|
-
* Run a provisioning step and, when it fails with an exit code, run it once more
|
|
11
|
+
* Run a provisioning step and, when it fails with an exit code, run it once more: a
|
|
12
12
|
* transient network error inside `npm install` is the common case. A timeout is not retried: its
|
|
13
13
|
* budget is already spent, and a second wait would double it. The retry runs under its own step
|
|
14
14
|
* name so both logs stay.
|
|
@@ -121,7 +121,7 @@ export async function runSubjectServePipeline(shell, args) {
|
|
|
121
121
|
await refresh();
|
|
122
122
|
}
|
|
123
123
|
/**
|
|
124
|
-
* Provide the runtime the pipeline needs before running it
|
|
124
|
+
* Provide the runtime the pipeline needs before running it. The stock desktop template
|
|
125
125
|
* ships python3 and curl but no Node. Probe first, so a template that ships its own Node pays
|
|
126
126
|
* nothing.
|
|
127
127
|
*/
|
|
@@ -187,7 +187,7 @@ async function installSubject(step, command) {
|
|
|
187
187
|
? "subject install failed twice"
|
|
188
188
|
: "subject install failed");
|
|
189
189
|
if (!install.ok) {
|
|
190
|
-
// Lead with the line a person can act on; npm's own trace follows it
|
|
190
|
+
// Lead with the line a person can act on; npm's own trace follows it.
|
|
191
191
|
const headline = install.timedOut
|
|
192
192
|
? `subject install timed out after ${step.serve.installTimeoutMs ?? INSTALL_TIMEOUT_MS}ms`
|
|
193
193
|
: install.attempts === 2
|
package/dist/subject/state.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyStateStepWhen, StudySubjectState } from "../study/types.js";
|
|
2
2
|
import type { RunSubjectStateStepRecord } from "../run/bundle.js";
|
|
3
3
|
import { type DetachedTimers } from "../substrates/detached.js";
|
|
4
4
|
import type { Shell } from "../substrates/shell.js";
|
|
@@ -11,10 +11,10 @@ export declare function commandDigestOf(command: string): string;
|
|
|
11
11
|
* `subject-state-<name>` so a step can never collide with a serve step. Each step's record goes
|
|
12
12
|
* to `onStateStep` as it finishes; the first failure throws with its scrubbed log tail.
|
|
13
13
|
*/
|
|
14
|
-
export declare function runStateSteps(shell: Shell, when:
|
|
15
|
-
state?:
|
|
14
|
+
export declare function runStateSteps(shell: Shell, when: StudyStateStepWhen, args: {
|
|
15
|
+
state?: StudySubjectState;
|
|
16
16
|
requestTimeoutMs: number;
|
|
17
|
-
/** Literal scrubber for known provisioned values, applied to log tails
|
|
17
|
+
/** Literal scrubber for known provisioned values, applied to log tails pre-truncation. */
|
|
18
18
|
scrub: (text: string) => string;
|
|
19
19
|
onStateStep?: (record: RunSubjectStateStepRecord) => void;
|
|
20
20
|
onPhase?: (event: SubjectPhaseEvent) => void;
|
package/dist/subject/state.js
CHANGED
|
@@ -39,7 +39,7 @@ export async function runStateSteps(shell, when, args) {
|
|
|
39
39
|
args.onStateStep?.({
|
|
40
40
|
name: step.name,
|
|
41
41
|
when,
|
|
42
|
-
// Digest only (sha256-16): the command text never persists: the
|
|
42
|
+
// Digest only (sha256-16): the command text never persists: the study YAML in the
|
|
43
43
|
// consumer's repo is the plaintext source of truth.
|
|
44
44
|
commandDigest: commandDigestOf(step.command),
|
|
45
45
|
ok: result.ok,
|
package/dist/subject/steps.d.ts
CHANGED
|
@@ -25,13 +25,13 @@ export declare function emitPhaseStarted(onPhase: ((event: SubjectPhaseEvent) =>
|
|
|
25
25
|
/** Emit the matching phase-completed event: always carries ok and durationMs (>= 0). */
|
|
26
26
|
export declare function emitPhaseCompleted(onPhase: ((event: SubjectPhaseEvent) => void) | undefined, now: () => number, startedAt: number, phase: string, ok: boolean, message: string): void;
|
|
27
27
|
/** Default phase-boundary sink (stderr): one line per event, prefixed with the participant id
|
|
28
|
-
* only when
|
|
29
|
-
*
|
|
30
|
-
* Overridable via
|
|
28
|
+
* only when the run has more than one participant. A single participant still gets every line:
|
|
29
|
+
* a silent clone, install, build and ready boot is the bug this event stream exists to close.
|
|
30
|
+
* Overridable via StudyDeps.subjectPhaseSink so deterministic tests capture instead of writing to
|
|
31
31
|
* the real stderr. */
|
|
32
|
-
export declare function defaultSubjectPhaseSink(event: SubjectPhaseEvent,
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
export declare function defaultSubjectPhaseSink(event: SubjectPhaseEvent, participant: {
|
|
33
|
+
readonly id: string;
|
|
34
|
+
readonly count: number;
|
|
35
35
|
}): void;
|
|
36
36
|
/** The shared-world subject's phase line: one shared plane, so no participant prefix. */
|
|
37
37
|
export declare function defaultSharedWorldPhaseSink(event: SubjectPhaseEvent): void;
|
package/dist/subject/steps.js
CHANGED
|
@@ -23,13 +23,13 @@ export function emitPhaseCompleted(onPhase, now, startedAt, phase, ok, message)
|
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
/** Default phase-boundary sink (stderr): one line per event, prefixed with the participant id
|
|
26
|
-
* only when
|
|
27
|
-
*
|
|
28
|
-
* Overridable via
|
|
26
|
+
* only when the run has more than one participant. A single participant still gets every line:
|
|
27
|
+
* a silent clone, install, build and ready boot is the bug this event stream exists to close.
|
|
28
|
+
* Overridable via StudyDeps.subjectPhaseSink so deterministic tests capture instead of writing to
|
|
29
29
|
* the real stderr. */
|
|
30
|
-
export function defaultSubjectPhaseSink(event,
|
|
30
|
+
export function defaultSubjectPhaseSink(event, participant) {
|
|
31
31
|
const durationSuffix = event.durationMs === undefined ? "" : ` (${event.durationMs}ms)`;
|
|
32
|
-
const prefix =
|
|
32
|
+
const prefix = participant.count > 1 ? `humanish computer-use [${participant.id}]` : "humanish computer-use";
|
|
33
33
|
process.stderr.write(`${prefix}: ${event.message}${durationSuffix}\n`);
|
|
34
34
|
}
|
|
35
35
|
/** The shared-world subject's phase line: one shared plane, so no participant prefix. */
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* True when `error` is (structurally) the @e2b/desktop CommandExitError: a
|
|
3
|
-
* non-zero substrate command exit that the real Sandbox surfaces as a
|
|
3
|
+
* non-zero substrate command exit that the real Sandbox surfaces as a throw.
|
|
4
4
|
* Matches either the SDK class name (`name === "CommandExitError"`) or any object
|
|
5
5
|
* carrying a numeric `exitCode` (the same field `commandFailureInfo` reads, so a
|
|
6
6
|
* structural fake is covered without importing the SDK class).
|
|
7
7
|
*
|
|
8
|
-
* Deliberately conservative
|
|
8
|
+
* Deliberately conservative: it is the recoverability predicate the CUA loop uses
|
|
9
9
|
* to skip a single failed desktop action instead of ending the whole run: it must
|
|
10
|
-
*
|
|
10
|
+
* not match a deadline/abort control-flow signal (those subclass Error without a
|
|
11
11
|
* name override or an exitCode) or a generic Error with no exit signal, so only a
|
|
12
12
|
* genuine substrate-command failure is treated as recoverable.
|
|
13
13
|
*/
|
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
import { tailOf } from "./shell.js";
|
|
13
13
|
/**
|
|
14
14
|
* True when `error` is (structurally) the @e2b/desktop CommandExitError: a
|
|
15
|
-
* non-zero substrate command exit that the real Sandbox surfaces as a
|
|
15
|
+
* non-zero substrate command exit that the real Sandbox surfaces as a throw.
|
|
16
16
|
* Matches either the SDK class name (`name === "CommandExitError"`) or any object
|
|
17
17
|
* carrying a numeric `exitCode` (the same field `commandFailureInfo` reads, so a
|
|
18
18
|
* structural fake is covered without importing the SDK class).
|
|
19
19
|
*
|
|
20
|
-
* Deliberately conservative
|
|
20
|
+
* Deliberately conservative: it is the recoverability predicate the CUA loop uses
|
|
21
21
|
* to skip a single failed desktop action instead of ending the whole run: it must
|
|
22
|
-
*
|
|
22
|
+
* not match a deadline/abort control-flow signal (those subclass Error without a
|
|
23
23
|
* name override or an exitCode) or a generic Error with no exit signal, so only a
|
|
24
24
|
* genuine substrate-command failure is treated as recoverable.
|
|
25
25
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
|
|
2
2
|
/**
|
|
3
3
|
* Wrap an already-acquired resource. The adapter supplies release authority as a closure;
|
|
4
4
|
* this layer never reconstructs it from a saved ID or enumerates provider resources.
|
|
@@ -12,7 +12,7 @@ export function ownDesktopAllocation(options) {
|
|
|
12
12
|
let closing;
|
|
13
13
|
const assertOpen = () => {
|
|
14
14
|
if (closing !== undefined)
|
|
15
|
-
throw new
|
|
15
|
+
throw new ComputerUseExecutorError("executor_closed", "not_dispatched");
|
|
16
16
|
};
|
|
17
17
|
const close = (policy = {}) => {
|
|
18
18
|
// Install the promise before invoking release: concurrent/reentrant callers share it.
|