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
|
@@ -10,7 +10,7 @@ export declare function detachedTimersOf(options: DetachedTimers): DetachedTimer
|
|
|
10
10
|
export interface DetachedStepOptions extends DetachedTimers {
|
|
11
11
|
/** Short [a-z0-9-] label; names the script/status/log files under /tmp. */
|
|
12
12
|
name: string;
|
|
13
|
-
/** The shell command to run (the
|
|
13
|
+
/** The shell command to run (the study author's own command: package.json-script trust). */
|
|
14
14
|
command: string;
|
|
15
15
|
cwd?: string;
|
|
16
16
|
/** Wall-clock budget for the step. */
|
|
@@ -22,19 +22,19 @@ export interface DetachedStepResult {
|
|
|
22
22
|
ok: boolean;
|
|
23
23
|
exitCode?: number;
|
|
24
24
|
timedOut: boolean;
|
|
25
|
-
/** Capped,
|
|
25
|
+
/** Capped, unredacted log tail; redact before persisting. */
|
|
26
26
|
logTail: string;
|
|
27
27
|
}
|
|
28
|
-
/** Read the capped log tail for a step (raw
|
|
28
|
+
/** Read the capped log tail for a step (raw; caller redacts). */
|
|
29
29
|
export declare function readDetachedLog(shell: Shell, name: string, requestTimeoutMs?: number): Promise<string>;
|
|
30
30
|
/**
|
|
31
|
-
* Run a
|
|
31
|
+
* Run a bounded step (install/build) detached, polling its atomic status file until it
|
|
32
32
|
* exits or the budget runs out. On timeout the process group is killed and the log tail is
|
|
33
33
|
* still captured so failures stay diagnosable.
|
|
34
34
|
*/
|
|
35
35
|
export declare function runDetachedStep(shell: Shell, options: DetachedStepOptions): Promise<DetachedStepResult>;
|
|
36
36
|
/**
|
|
37
|
-
* Launch a
|
|
37
|
+
* Launch a long-lived process (the subject's server) fully detached and return immediately.
|
|
38
38
|
* No status polling: liveness is the caller's readiness probe, and reclamation belongs to
|
|
39
39
|
* the sandbox lifecycle (create with kill-on-timeout).
|
|
40
40
|
*/
|
|
@@ -45,7 +45,7 @@ export declare function startDetachedProcess(shell: Shell, options: {
|
|
|
45
45
|
requestTimeoutMs?: number;
|
|
46
46
|
}): Promise<void>;
|
|
47
47
|
/**
|
|
48
|
-
* Poll a URL from
|
|
48
|
+
* Poll a URL from inside the sandbox until it answers 2xx/3xx or the budget runs out.
|
|
49
49
|
* Returns true when the subject is ready.
|
|
50
50
|
*/
|
|
51
51
|
export declare function probeUrl(shell: Shell, url: string, options: {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
// Detached process management over a Shell, the primitive behind serving a subject app in the
|
|
2
2
|
// sandbox. A foreground command hits its deadline on long-running work, so long work runs detached:
|
|
3
3
|
//
|
|
4
|
-
// - Scripts are written via `writeFile`, never heredocs
|
|
4
|
+
// - Scripts are written via `writeFile`, never heredocs, which eliminates the
|
|
5
5
|
// sentinel-collision bug class (a command line that equals the heredoc terminator) by
|
|
6
6
|
// construction.
|
|
7
|
-
// - Bounded steps (install/build) run detached with an
|
|
7
|
+
// - Bounded steps (install/build) run detached with an atomically-written status file
|
|
8
8
|
// (write tmp + mv), polled by short foreground commands; a timeout kills the process
|
|
9
9
|
// group and surfaces a capped log tail for the caller to redact and persist.
|
|
10
10
|
// - Long-lived steps (a dev/prod server) launch fully detached through `Shell.start`; the
|
|
11
11
|
// sandbox lifecycle (kill-on-timeout) owns their reclamation.
|
|
12
12
|
// - Readiness is an explicit curl probe against the declared URL.
|
|
13
13
|
//
|
|
14
|
-
// Log tails are returned
|
|
14
|
+
// Log tails are returned raw; callers must pass them through redaction before persisting
|
|
15
15
|
// (build output can echo env values and paths).
|
|
16
16
|
import { runOrThrow, shellQuote, throwOnExit } from "./shell.js";
|
|
17
17
|
const WORK_ROOT = "/tmp/humanish-subject";
|
|
@@ -62,14 +62,14 @@ async function writeAndLaunch(shell, name, command, cwd, requestTimeoutMs) {
|
|
|
62
62
|
await shell.writeFile(scriptPath, wrapperScript(name, command, cwd));
|
|
63
63
|
throwOnExit(await shell.start(`bash ${shellQuote(scriptPath)}`, { requestTimeoutMs }));
|
|
64
64
|
}
|
|
65
|
-
/** Read the capped log tail for a step (raw
|
|
65
|
+
/** Read the capped log tail for a step (raw; caller redacts). */
|
|
66
66
|
export async function readDetachedLog(shell, name, requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
|
|
67
67
|
assertName(name);
|
|
68
68
|
const result = await runOrThrow(shell, `tail -c ${LOG_TAIL_BYTES} ${shellQuote(`${stepDir(name)}/log.txt`)} 2>/dev/null || true`, { requestTimeoutMs });
|
|
69
69
|
return result.stdout;
|
|
70
70
|
}
|
|
71
71
|
/**
|
|
72
|
-
* Run a
|
|
72
|
+
* Run a bounded step (install/build) detached, polling its atomic status file until it
|
|
73
73
|
* exits or the budget runs out. On timeout the process group is killed and the log tail is
|
|
74
74
|
* still captured so failures stay diagnosable.
|
|
75
75
|
*/
|
|
@@ -105,7 +105,7 @@ export async function runDetachedStep(shell, options) {
|
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
108
|
-
* Launch a
|
|
108
|
+
* Launch a long-lived process (the subject's server) fully detached and return immediately.
|
|
109
109
|
* No status polling: liveness is the caller's readiness probe, and reclamation belongs to
|
|
110
110
|
* the sandbox lifecycle (create with kill-on-timeout).
|
|
111
111
|
*/
|
|
@@ -113,7 +113,7 @@ export async function startDetachedProcess(shell, options) {
|
|
|
113
113
|
await writeAndLaunch(shell, options.name, options.command, options.cwd, options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);
|
|
114
114
|
}
|
|
115
115
|
/**
|
|
116
|
-
* Poll a URL from
|
|
116
|
+
* Poll a URL from inside the sandbox until it answers 2xx/3xx or the budget runs out.
|
|
117
117
|
* Returns true when the subject is ready.
|
|
118
118
|
*/
|
|
119
119
|
export async function probeUrl(shell, url, options) {
|
|
@@ -11,29 +11,29 @@ export interface ChromeCdpProbeArgs {
|
|
|
11
11
|
targetId?: string;
|
|
12
12
|
/**
|
|
13
13
|
* "pinned" (default): the launch-time target, for launch geometry and emulation attribution.
|
|
14
|
-
* "active": the tab the participant is driving
|
|
14
|
+
* "active": the tab the participant is driving now; Chrome's /json lists page
|
|
15
15
|
* targets most-recently-focused first. The state observer must follow the participant: a
|
|
16
|
-
* verification link that opens in a
|
|
16
|
+
* verification link that opens in a new tab left a pinned observer reading the old tab forever,
|
|
17
17
|
* so the observed URL never changed again and stopWhen/task criteria went blind (a live run's
|
|
18
|
-
* funnel read reach-dashboard 0/2 under a screenshot
|
|
18
|
+
* funnel read reach-dashboard 0/2 under a screenshot of the dashboard). Final geometry follows
|
|
19
19
|
* this target too: a closed launch tab is unavailable, and a background tab may report stale
|
|
20
20
|
* layout dimensions or zero outer bounds after navigation.
|
|
21
21
|
*/
|
|
22
22
|
prefer?: ChromeCdpPagePreference;
|
|
23
23
|
/**
|
|
24
24
|
* "state": url/title/text/scrollY. "geometry": outer window + CSS viewport. "port": resolution
|
|
25
|
-
* only. "emulate": apply mobile emulation
|
|
25
|
+
* only. "emulate": apply mobile emulation to the selected page and exit (the overrides that
|
|
26
26
|
* are session-scoped, UA / touch / DPR, lapse when the socket closes). "hold": the same over a browser-level
|
|
27
27
|
* socket, then stay attached until killed (how a participant keeps them for its whole life) and attach
|
|
28
28
|
* to every page target Chrome opens later, sending it the same overrides and a reload the moment
|
|
29
|
-
* it exists, never pausing it
|
|
29
|
+
* it exists, never pausing it. "fidelity": read
|
|
30
30
|
* back what the page reports about itself (UA, DPR, viewport, touch), the proof for the bundle.
|
|
31
31
|
*/
|
|
32
32
|
mode: "state" | "geometry" | "port" | "emulate" | "hold" | "fidelity";
|
|
33
33
|
/** For "emulate": what to apply. */
|
|
34
34
|
emulation?: ChromeMobileEmulationRequest;
|
|
35
35
|
}
|
|
36
|
-
/** Mobile emulation request
|
|
36
|
+
/** Mobile emulation request: the CDP Emulation domain applied to one page target. */
|
|
37
37
|
export interface ChromeMobileEmulationRequest {
|
|
38
38
|
width: number;
|
|
39
39
|
height: number;
|
|
@@ -82,9 +82,9 @@ export interface ChromeCdpProbeResult {
|
|
|
82
82
|
* headless Chrome).
|
|
83
83
|
*
|
|
84
84
|
* WebSocket is hand-rolled because python's stdlib has no client: one masked text frame out, frames
|
|
85
|
-
* in until the reply with id 1 arrives, 1.5 s budget, and
|
|
85
|
+
* in until the reply with id 1 arrives, 1.5 s budget, and no Origin header (Chrome refuses
|
|
86
86
|
* cross-origin DevTools sockets unless --remote-allow-origins is set; a header-less client is a
|
|
87
|
-
* local one). urllib is opened
|
|
87
|
+
* local one). urllib is opened without proxy handlers so a sandbox-wide http_proxy cannot redirect
|
|
88
88
|
* a loopback read.
|
|
89
89
|
*/
|
|
90
90
|
export declare const CHROME_CDP_PROBE_PY: string;
|
|
@@ -93,7 +93,7 @@ export declare function chromeCdpProbeCommand(args: ChromeCdpProbeArgs): string;
|
|
|
93
93
|
/**
|
|
94
94
|
* Narrow one probe's stdout. A parse failure is reported as unavailable with the reason, never as
|
|
95
95
|
* an empty success: the difference between "nothing to observe" and "could not observe" is the
|
|
96
|
-
* whole point
|
|
96
|
+
* whole point.
|
|
97
97
|
*/
|
|
98
98
|
export declare function parseChromeCdpProbeOutput(stdout: string | undefined): ChromeCdpProbeResult;
|
|
99
99
|
export {};
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
// The in-sandbox Chrome DevTools probe behind every URL / page-text / viewport observation.
|
|
2
2
|
//
|
|
3
|
-
// It runs on python3, stdlib only.
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// `
|
|
8
|
-
//
|
|
9
|
-
// was a geometry warning that the CSS viewport "could not be measured", which named the symptom
|
|
10
|
-
// and not the cause. The tab-pinning fix that preceded this one (prefer "active") was diagnosed on
|
|
11
|
-
// a Node subject, where the probe happened to work.
|
|
3
|
+
// It runs on python3, stdlib only. The stock E2B desktop template ships python3 and curl but no
|
|
4
|
+
// Node, and Node only arrives when a subject's serve pipeline needs it (src/subject/runtime.ts).
|
|
5
|
+
// So on the app-url route, and on any subject served by something other than Node (the taskly
|
|
6
|
+
// benchmark is `python3 -m http.server`), a `node -e` probe exits 127 on every turn, degrades to
|
|
7
|
+
// `{}`, and blinds every urlIncludes / textIncludes stop condition and task criterion for the
|
|
8
|
+
// whole session, with only a geometry warning that the CSS viewport "could not be measured".
|
|
12
9
|
//
|
|
13
10
|
// The same lesson was learned once already: the comms catch was rewritten from node to python3 in
|
|
14
11
|
// 0.29.0 (comms/sandbox-catch.ts). This is the third in-sandbox runtime dependency to move.
|
|
15
12
|
//
|
|
16
|
-
// The script takes
|
|
17
|
-
// `{"unavailable": "<reason>"}` with exit 0 so the caller can say
|
|
13
|
+
// The script takes one JSON argument and prints one JSON line. Failures print
|
|
14
|
+
// `{"unavailable": "<reason>"}` with exit 0 so the caller can say why the channel is dark instead
|
|
18
15
|
// of swallowing an exit code; the TypeScript side turns that into a participant warning that names the
|
|
19
|
-
// consequence ("url/text criteria will read as
|
|
16
|
+
// consequence ("url/text criteria will read as never measured").
|
|
20
17
|
import { shellQuote } from "../shell.js";
|
|
21
18
|
/**
|
|
22
19
|
* The probe itself. Kept as one string so the shipped command is exactly what the tests execute
|
|
@@ -24,9 +21,9 @@ import { shellQuote } from "../shell.js";
|
|
|
24
21
|
* headless Chrome).
|
|
25
22
|
*
|
|
26
23
|
* WebSocket is hand-rolled because python's stdlib has no client: one masked text frame out, frames
|
|
27
|
-
* in until the reply with id 1 arrives, 1.5 s budget, and
|
|
24
|
+
* in until the reply with id 1 arrives, 1.5 s budget, and no Origin header (Chrome refuses
|
|
28
25
|
* cross-origin DevTools sockets unless --remote-allow-origins is set; a header-less client is a
|
|
29
|
-
* local one). urllib is opened
|
|
26
|
+
* local one). urllib is opened without proxy handlers so a sandbox-wide http_proxy cannot redirect
|
|
30
27
|
* a loopback read.
|
|
31
28
|
*/
|
|
32
29
|
export const CHROME_CDP_PROBE_PY = String.raw `
|
|
@@ -277,7 +274,7 @@ def browser_ws_url(port):
|
|
|
277
274
|
|
|
278
275
|
def hold(port, page, request):
|
|
279
276
|
"""Emulate the launch page and then every page target Chrome opens later, for as long as this
|
|
280
|
-
process lives
|
|
277
|
+
process lives. One browser-level socket with flattened sessions: the launch page is
|
|
281
278
|
attached by id and reloaded so scripts that read the UA at load see it; a target that appears
|
|
282
279
|
later is attached the moment it exists, sent the same overrides, and reloaded once after its
|
|
283
280
|
first real navigation commits (touch emulation reaches a document only when it loads under it).
|
|
@@ -387,7 +384,7 @@ def main():
|
|
|
387
384
|
page = select_page(pages, args)
|
|
388
385
|
# A listing with targets but no http page is usually an instant: a reload in flight, a tab
|
|
389
386
|
# between about:blank and its navigation. Ask again for up to a second before calling it
|
|
390
|
-
# unavailable
|
|
387
|
+
# unavailable: the lane's observer would otherwise lose one turn of url/text evidence,
|
|
391
388
|
# and a test on a loaded runner saw exactly this twice in one evening.
|
|
392
389
|
for _ in range(4):
|
|
393
390
|
if page is not None or not pages:
|
|
@@ -465,7 +462,7 @@ export function chromeCdpProbeCommand(args) {
|
|
|
465
462
|
/**
|
|
466
463
|
* Narrow one probe's stdout. A parse failure is reported as unavailable with the reason, never as
|
|
467
464
|
* an empty success: the difference between "nothing to observe" and "could not observe" is the
|
|
468
|
-
* whole point
|
|
465
|
+
* whole point.
|
|
469
466
|
*/
|
|
470
467
|
export function parseChromeCdpProbeOutput(stdout) {
|
|
471
468
|
const trimmed = (stdout ?? "").trim();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyDesktopBrowser } from "../../study/types.js";
|
|
2
2
|
import type { E2BDesktopSandbox } from "./sdk.js";
|
|
3
3
|
import type { DesktopMediaEvidence } from "./desktop-media.js";
|
|
4
4
|
export declare const DESKTOP_SETTLE_MS = 8000;
|
|
@@ -27,9 +27,9 @@ export type ChromeDevToolsReadiness = {
|
|
|
27
27
|
/** Reads the readiness markers from a launch command's stdout. */
|
|
28
28
|
export declare function parseChromeDevToolsReadiness(stdout: string): ChromeDevToolsReadiness | undefined;
|
|
29
29
|
export interface DesktopBrowserEvidence {
|
|
30
|
-
requested:
|
|
30
|
+
requested: StudyDesktopBrowser;
|
|
31
31
|
resolved?: string;
|
|
32
|
-
/** Synthetic media devices the browser was launched with
|
|
32
|
+
/** Synthetic media devices the browser was launched with, and how permission is answered. */
|
|
33
33
|
media?: DesktopMediaEvidence;
|
|
34
34
|
}
|
|
35
35
|
export type DesktopBrowserFamily = "chromium" | "firefox" | "unknown";
|
|
@@ -42,7 +42,7 @@ export interface DesktopBrowserLaunchIdentity {
|
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
44
|
* Runtime-only launch result. `evidence` is what the bundle records: the requested browser and the
|
|
45
|
-
* one that launched, and only when the
|
|
45
|
+
* one that launched, and only when the study declared a browser.
|
|
46
46
|
*/
|
|
47
47
|
export interface DesktopBrowserLaunchResult {
|
|
48
48
|
family: DesktopBrowserFamily;
|
|
@@ -65,8 +65,8 @@ export declare function buildFillDesktopWindowCommand(windowId: string, width: n
|
|
|
65
65
|
* below checks for clipping and refuses an uncorrectable window before the actor runs.
|
|
66
66
|
*/
|
|
67
67
|
export declare function fillDesktopBrowserWindow(desktop: E2BDesktopSandbox, windowId: string, resolution: readonly [number, number], requestTimeoutMs: number): Promise<void>;
|
|
68
|
-
export declare function openDesktopBrowserTarget(desktop: E2BDesktopSandbox, targetUrl: string, requestTimeoutMs: number, browserPreference:
|
|
69
|
-
/** Launch-time flags that make mobile fidelity
|
|
68
|
+
export declare function openDesktopBrowserTarget(desktop: E2BDesktopSandbox, targetUrl: string, requestTimeoutMs: number, browserPreference: StudyDesktopBrowser | undefined,
|
|
69
|
+
/** Launch-time flags that make mobile fidelity hold across every tab: the user agent and
|
|
70
70
|
* touch events are browser-wide here, where the CDP holder covers only the launch page. */
|
|
71
71
|
extraChromiumFlags?: readonly string[], environment?: Readonly<Record<string, string>>): Promise<DesktopBrowserLaunchResult>;
|
|
72
72
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// window a desktop-CLI study starts in.
|
|
3
3
|
import { CHROMIUM_EVIDENCE_HYGIENE_FLAGS, chromiumEvidenceProfilePreferencesJson, } from "../../evidence/browser-hygiene.js";
|
|
4
4
|
import { failureTail } from "../../evidence/redaction.js";
|
|
5
|
-
import { isHttpUrl } from "../../
|
|
5
|
+
import { isHttpUrl } from "../../study/parse/subject.js";
|
|
6
6
|
import { runDetachedStep } from "../detached.js";
|
|
7
7
|
import { shellQuote } from "../shell.js";
|
|
8
8
|
import { e2bShell } from "./shell.js";
|
|
@@ -111,7 +111,7 @@ export function parseChromeDevToolsReadiness(stdout) {
|
|
|
111
111
|
export async function findVisibleBrowserWindowId(desktop, requestTimeoutMs, browserFamily, launchIdentity) {
|
|
112
112
|
if (browserFamily === "unknown")
|
|
113
113
|
return undefined;
|
|
114
|
-
// The candidate loop keeps the
|
|
114
|
+
// The candidate loop keeps the last identity match: with a launch identity the match is
|
|
115
115
|
// unique anyway, and without one every family candidate matches, so the newest visible
|
|
116
116
|
// window of the launched family wins (the window this participant just opened).
|
|
117
117
|
const finder = browserFamily === "firefox"
|
|
@@ -197,7 +197,7 @@ export async function fillDesktopBrowserWindow(desktop, windowId, resolution, re
|
|
|
197
197
|
.catch(() => undefined);
|
|
198
198
|
}
|
|
199
199
|
export async function openDesktopBrowserTarget(desktop, targetUrl, requestTimeoutMs, browserPreference,
|
|
200
|
-
/** Launch-time flags that make mobile fidelity
|
|
200
|
+
/** Launch-time flags that make mobile fidelity hold across every tab: the user agent and
|
|
201
201
|
* touch events are browser-wide here, where the CDP holder covers only the launch page. */
|
|
202
202
|
extraChromiumFlags = [], environment) {
|
|
203
203
|
const requestedBrowser = browserPreference ?? "default";
|
|
@@ -242,10 +242,10 @@ extraChromiumFlags = [], environment) {
|
|
|
242
242
|
" fi",
|
|
243
243
|
" return 1",
|
|
244
244
|
"}",
|
|
245
|
-
// Fixed CDP port (not :0/random): each
|
|
246
|
-
// cannot conflict, and it makes the observer's port resolution deterministic. With :0
|
|
247
|
-
// real port lives only in DevToolsActivePort; when the launch-time capture misses on a
|
|
248
|
-
// start the observer falls back to 9222 and
|
|
245
|
+
// Fixed CDP port (not :0/random): each participant has its own desktop sandbox, so a known
|
|
246
|
+
// port cannot conflict, and it makes the observer's port resolution deterministic. With :0
|
|
247
|
+
// the real port lives only in DevToolsActivePort; when the launch-time capture misses on a
|
|
248
|
+
// cold start the observer falls back to 9222 and, being wrong, every CDP read fails for the
|
|
249
249
|
// whole run (the lobby-code handoff then never sees the host's /lobby URL). 9222 is already
|
|
250
250
|
// the fallback, so making it the actual port aligns launch, capture, and fallback.
|
|
251
251
|
`chrome_debug_flags=(--remote-debugging-address=127.0.0.1 --remote-debugging-port=${CHROME_DEVTOOLS_PORT} ${chromiumFlags})`,
|
|
@@ -375,9 +375,9 @@ export async function openDesktopTerminal(desktop, requestTimeoutMs, workdir) {
|
|
|
375
375
|
command: [
|
|
376
376
|
"for candidate in x-terminal-emulator xfce4-terminal gnome-terminal konsole xterm; do",
|
|
377
377
|
' if command -v "$candidate" >/dev/null 2>&1; then',
|
|
378
|
-
// LANG is set on the terminal we open, not globally: the stock image declares no locale, and
|
|
378
|
+
// `LANG` is set on the terminal we open, not globally: the stock image declares no locale, and
|
|
379
379
|
// a study that measures our own mojibake against an unconfigured template would be measuring
|
|
380
|
-
// the template. The
|
|
380
|
+
// the template. The product-side fix (an ASCII fallback when the locale is not UTF-8) is in
|
|
381
381
|
// src/routes/terminal/encoding.ts, and it is the one that matters for real users.
|
|
382
382
|
` (cd ${shellQuote(dir)} 2>/dev/null || cd /home/user; DISPLAY=:0 LANG=C.UTF-8 LC_ALL=C.UTF-8 HUMANISH_STUDY_PARTICIPANT=1 nohup "$candidate" >/dev/null 2>&1 &)`,
|
|
383
383
|
" sleep 3",
|
|
@@ -3,7 +3,7 @@ import type { RunDesktopGeometry } from "../../run/streams.js";
|
|
|
3
3
|
import type { E2BDesktopSandbox } from "./sdk.js";
|
|
4
4
|
/**
|
|
5
5
|
* Runtime-only CDP endpoint attribution for the exact chromium this participant launched. Port
|
|
6
|
-
* resolution at
|
|
6
|
+
* resolution at observe time: the cached launch-time `cdpPort` wins; absent that, the observer
|
|
7
7
|
* probe re-reads `profileDir`'s DevToolsActivePort marker (a slow cold start can publish it
|
|
8
8
|
* after the launch-time poll gave up); absent both it uses 9222, the port every participant launches
|
|
9
9
|
* Chrome with, where a dead endpoint degrades into a warning that names the cause.
|
|
@@ -16,7 +16,7 @@ export interface ChromeCdpEndpoint {
|
|
|
16
16
|
targetUrl: string;
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
|
-
* Mobile emulation on later tabs
|
|
19
|
+
* Mobile emulation on later tabs: the holder attaches to every page target Chrome opens
|
|
20
20
|
* after the launch page, so a tab the participant opens later should lay out at the phone width
|
|
21
21
|
* too. The first observation on each new target reads that page's own report; a target that
|
|
22
22
|
* reports the requested width is recorded through `onCovered`, and one that does not (or cannot be
|
|
@@ -37,15 +37,15 @@ export interface ChromeEmulationDrift {
|
|
|
37
37
|
/**
|
|
38
38
|
* The URL / title / page-text / scroll observer behind stopWhen and task criteria. One probe per
|
|
39
39
|
* observation, run on the sandbox's python3 (see src/substrates/e2b/cdp-probe.ts for why not
|
|
40
|
-
* node
|
|
40
|
+
* node).
|
|
41
41
|
*
|
|
42
|
-
* "active": follow the participant to whatever tab they are driving now
|
|
43
|
-
* observer to the launch tab (a verification link that opened in a
|
|
42
|
+
* "active": follow the participant to whatever tab they are driving now; never pin the state
|
|
43
|
+
* observer to the launch tab (a verification link that opened in a new tab left a pinned observer
|
|
44
44
|
* reading the old tab forever).
|
|
45
45
|
*
|
|
46
|
-
* `onUnavailable` fires
|
|
46
|
+
* `onUnavailable` fires once, on the first probe that could not read the page, with the reason.
|
|
47
47
|
* The observer still degrades to `{}` for the loop; the callback is how a participant says out loud that
|
|
48
|
-
* url/text criteria are not being measured, instead of letting the funnel report 0/N
|
|
48
|
+
* url/text criteria are not being measured, instead of letting the funnel report 0/N.
|
|
49
49
|
*/
|
|
50
50
|
export declare function makeChromeBrowserStateObserver(desktop: E2BDesktopSandbox, requestTimeoutMs: number, endpoint: ChromeCdpEndpoint, options?: {
|
|
51
51
|
/** The page target to prefer before the participant switches tabs. */
|
|
@@ -59,11 +59,11 @@ export declare function makeChromeBrowserStateObserver(desktop: E2BDesktopSandbo
|
|
|
59
59
|
text?: string;
|
|
60
60
|
scrollY?: number;
|
|
61
61
|
}>;
|
|
62
|
-
/** The user agent a mobile-emulated participant presents unless the
|
|
62
|
+
/** The user agent a mobile-emulated participant presents unless the study sets its own. */
|
|
63
63
|
export declare const DEFAULT_MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
64
64
|
/**
|
|
65
|
-
* Apply mobile emulation
|
|
66
|
-
* Fails
|
|
65
|
+
* Apply mobile emulation to the participant's launch page and read back what the page reports.
|
|
66
|
+
* Fails closed: a request that cannot be applied throws, because a desktop run labelled mobile is
|
|
67
67
|
* the over-trust this feature exists to prevent. A read-back that cannot be taken is a warning
|
|
68
68
|
* (the emulation was applied; only the proof is missing).
|
|
69
69
|
*/
|
|
@@ -7,15 +7,15 @@ import { e2bShell } from "./shell.js";
|
|
|
7
7
|
/**
|
|
8
8
|
* The URL / title / page-text / scroll observer behind stopWhen and task criteria. One probe per
|
|
9
9
|
* observation, run on the sandbox's python3 (see src/substrates/e2b/cdp-probe.ts for why not
|
|
10
|
-
* node
|
|
10
|
+
* node).
|
|
11
11
|
*
|
|
12
|
-
* "active": follow the participant to whatever tab they are driving now
|
|
13
|
-
* observer to the launch tab (a verification link that opened in a
|
|
12
|
+
* "active": follow the participant to whatever tab they are driving now; never pin the state
|
|
13
|
+
* observer to the launch tab (a verification link that opened in a new tab left a pinned observer
|
|
14
14
|
* reading the old tab forever).
|
|
15
15
|
*
|
|
16
|
-
* `onUnavailable` fires
|
|
16
|
+
* `onUnavailable` fires once, on the first probe that could not read the page, with the reason.
|
|
17
17
|
* The observer still degrades to `{}` for the loop; the callback is how a participant says out loud that
|
|
18
|
-
* url/text criteria are not being measured, instead of letting the funnel report 0/N
|
|
18
|
+
* url/text criteria are not being measured, instead of letting the funnel report 0/N.
|
|
19
19
|
*/
|
|
20
20
|
export function makeChromeBrowserStateObserver(desktop, requestTimeoutMs, endpoint, options = {}) {
|
|
21
21
|
const { targetId, onUnavailable, drift } = options;
|
|
@@ -97,11 +97,11 @@ export function makeChromeBrowserStateObserver(desktop, requestTimeoutMs, endpoi
|
|
|
97
97
|
};
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
-
/** The user agent a mobile-emulated participant presents unless the
|
|
100
|
+
/** The user agent a mobile-emulated participant presents unless the study sets its own. */
|
|
101
101
|
export const DEFAULT_MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
102
102
|
/**
|
|
103
|
-
* Apply mobile emulation
|
|
104
|
-
* Fails
|
|
103
|
+
* Apply mobile emulation to the participant's launch page and read back what the page reports.
|
|
104
|
+
* Fails closed: a request that cannot be applied throws, because a desktop run labelled mobile is
|
|
105
105
|
* the over-trust this feature exists to prevent. A read-back that cannot be taken is a warning
|
|
106
106
|
* (the emulation was applied; only the proof is missing).
|
|
107
107
|
*/
|
|
@@ -153,7 +153,7 @@ export async function applyMobileEmulation(desktop, requestTimeoutMs, endpoint,
|
|
|
153
153
|
}
|
|
154
154
|
const applied = announced;
|
|
155
155
|
// Viewport/touch read-back proves context settings, not gesture equivalence. Two hosted
|
|
156
|
-
// replicas and a native-X conversion-toggle control reproduced reset click counts
|
|
156
|
+
// replicas and a native-X conversion-toggle control reproduced reset click counts.
|
|
157
157
|
const warnings = request.touch
|
|
158
158
|
? [
|
|
159
159
|
"Mobile emulation uses desktop pointer-to-touch conversion, which can differ for repeated taps. Confirm gesture failures with direct or native touch input before attributing them to the app.",
|
|
@@ -17,7 +17,7 @@ export interface E2BDesktopLike {
|
|
|
17
17
|
stdout?: string;
|
|
18
18
|
}>;
|
|
19
19
|
};
|
|
20
|
-
/** Optional file surface
|
|
20
|
+
/** Optional file surface for transferring typed text without shell-quoting it. */
|
|
21
21
|
files?: {
|
|
22
22
|
write(path: string, data: string | ArrayBuffer, options?: {
|
|
23
23
|
requestTimeoutMs?: number;
|
|
@@ -77,7 +77,7 @@ export type CuaTypePhase = "desktop-write" | "text-tempfile" | "text-command";
|
|
|
77
77
|
* password), so the message names the phase and, for xdotool, its exit code only: no text, no
|
|
78
78
|
* temp-file path, no substrate output. The loop records `.name` + `.message` into the actor trace.
|
|
79
79
|
*/
|
|
80
|
-
export declare class
|
|
80
|
+
export declare class ComputerUseTypeError extends Error {
|
|
81
81
|
readonly phase: CuaTypePhase;
|
|
82
82
|
readonly exitCode?: number;
|
|
83
83
|
constructor(phase: CuaTypePhase, exitCode?: number);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { shellQuote } from "../shell.js";
|
|
2
2
|
import { perceptualSignature } from "../../evidence/frame-signature.js";
|
|
3
3
|
import { commandFailureInfo } from "../command-failure.js";
|
|
4
|
-
import {
|
|
4
|
+
import { ComputerUseExecutorError } from "../../actors/computer-use/executor-error.js";
|
|
5
5
|
import { xdotoolHeldModifiers } from "../../guest/desktop-keys.js";
|
|
6
6
|
const DEFAULT_WAIT_MS = 500;
|
|
7
7
|
const DEFAULT_SCROLL_AMOUNT_PER_TICK = 100;
|
|
@@ -9,7 +9,7 @@ const TYPE_COMMAND_TIMEOUT_MS = 15_000;
|
|
|
9
9
|
const HELD_KEYS_TIMEOUT_MS = 15_000;
|
|
10
10
|
const CURSOR_READ_TIMEOUT_MS = 500;
|
|
11
11
|
/**
|
|
12
|
-
* The stock image's xdotool waits ~15s on a synchronized move to its current position
|
|
12
|
+
* The stock image's xdotool waits ~15s on a synchronized move to its current position.
|
|
13
13
|
* Only an exact integer match can omit that move; fractional actions keep the SDK's own
|
|
14
14
|
* coordinate conversion. Read every time: another action or sequential role may move it.
|
|
15
15
|
* The SDK's getCursorPosition (2.3 through 2.4.0) takes no timeout or signal. Bound our wait, observe late
|
|
@@ -72,12 +72,12 @@ function toBuffer(bytes) {
|
|
|
72
72
|
* password), so the message names the phase and, for xdotool, its exit code only: no text, no
|
|
73
73
|
* temp-file path, no substrate output. The loop records `.name` + `.message` into the actor trace.
|
|
74
74
|
*/
|
|
75
|
-
export class
|
|
75
|
+
export class ComputerUseTypeError extends Error {
|
|
76
76
|
phase;
|
|
77
77
|
exitCode;
|
|
78
78
|
constructor(phase, exitCode) {
|
|
79
79
|
super(`type failed at ${phase}${exitCode === undefined ? "" : ` (exit ${exitCode})`}`);
|
|
80
|
-
this.name = "
|
|
80
|
+
this.name = "ComputerUseTypeError";
|
|
81
81
|
this.phase = phase;
|
|
82
82
|
if (exitCode !== undefined)
|
|
83
83
|
this.exitCode = exitCode;
|
|
@@ -107,17 +107,17 @@ async function typeText(desktop, text) {
|
|
|
107
107
|
directory = made.stdout?.trim();
|
|
108
108
|
}
|
|
109
109
|
catch {
|
|
110
|
-
throw new
|
|
110
|
+
throw new ComputerUseTypeError("text-tempfile");
|
|
111
111
|
}
|
|
112
112
|
if (directory === undefined || !TYPE_DIRECTORY.test(directory))
|
|
113
|
-
throw new
|
|
113
|
+
throw new ComputerUseTypeError("text-tempfile");
|
|
114
114
|
const file = `${directory}/text`;
|
|
115
115
|
try {
|
|
116
116
|
try {
|
|
117
117
|
await files.write(file, text, { requestTimeoutMs: TYPE_COMMAND_TIMEOUT_MS });
|
|
118
118
|
}
|
|
119
119
|
catch {
|
|
120
|
-
throw new
|
|
120
|
+
throw new ComputerUseTypeError("text-tempfile");
|
|
121
121
|
}
|
|
122
122
|
// xdotool waits the delay after every character, so a long text needs a longer budget.
|
|
123
123
|
const timeoutMs = TYPE_COMMAND_TIMEOUT_MS + [...text].length * XDOTOOL_TYPE_DELAY_MS;
|
|
@@ -127,11 +127,11 @@ async function typeText(desktop, text) {
|
|
|
127
127
|
}
|
|
128
128
|
catch (error) {
|
|
129
129
|
// The SDK throws on a non-zero exit; only its exit code is kept.
|
|
130
|
-
throw new
|
|
130
|
+
throw new ComputerUseTypeError("text-command", commandFailureInfo(error).exitCode);
|
|
131
131
|
}
|
|
132
132
|
// A structural fake may return a non-zero exit instead of throwing, as the SDK does.
|
|
133
133
|
if (result?.exitCode !== undefined && result.exitCode !== 0)
|
|
134
|
-
throw new
|
|
134
|
+
throw new ComputerUseTypeError("text-command", result.exitCode);
|
|
135
135
|
}
|
|
136
136
|
finally {
|
|
137
137
|
await commands.run(`rm -rf -- ${shellQuote(directory)}`, quick).catch(() => undefined);
|
|
@@ -230,7 +230,7 @@ export function createE2BDesktopExecutor(desktop, options = {}) {
|
|
|
230
230
|
await desktop.write(action.text);
|
|
231
231
|
}
|
|
232
232
|
catch {
|
|
233
|
-
throw new
|
|
233
|
+
throw new ComputerUseTypeError("desktop-write");
|
|
234
234
|
}
|
|
235
235
|
return;
|
|
236
236
|
}
|
|
@@ -261,7 +261,7 @@ export function createE2BDesktopExecutor(desktop, options = {}) {
|
|
|
261
261
|
// capturing here would double-capture. Leave the desktop untouched.
|
|
262
262
|
return;
|
|
263
263
|
case "speak":
|
|
264
|
-
throw new
|
|
264
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
265
265
|
}
|
|
266
266
|
}
|
|
267
267
|
}
|
|
@@ -278,7 +278,7 @@ function sendsNoInput(action) {
|
|
|
278
278
|
async function withHeldModifiers(desktop, chord, run) {
|
|
279
279
|
const commands = desktop.commands;
|
|
280
280
|
if (!commands)
|
|
281
|
-
throw new
|
|
281
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
282
282
|
const options = { requestTimeoutMs: HELD_KEYS_TIMEOUT_MS, timeoutMs: HELD_KEYS_TIMEOUT_MS };
|
|
283
283
|
let failed = false;
|
|
284
284
|
let failure;
|
|
@@ -295,7 +295,7 @@ async function withHeldModifiers(desktop, chord, run) {
|
|
|
295
295
|
await commands.run(`xdotool keyup ${chord}`, options);
|
|
296
296
|
}
|
|
297
297
|
catch {
|
|
298
|
-
throw new
|
|
298
|
+
throw new ComputerUseExecutorError("execution_failed", "outcome_uncertain");
|
|
299
299
|
}
|
|
300
300
|
if (failed)
|
|
301
301
|
throw failure;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { type DevicePreset } from "../../
|
|
1
|
+
import { type DevicePreset } from "../../study/device-presets.js";
|
|
2
2
|
import { type RunDesktopGeometry } from "../../run/streams.js";
|
|
3
3
|
import { type ChromeCdpPagePreference } from "./cdp-probe.js";
|
|
4
4
|
import { type DesktopBrowserFamily, type DesktopBrowserLaunchIdentity } from "./desktop-browser.js";
|
|
5
5
|
import type { ChromeCdpEndpoint } from "./desktop-cdp.js";
|
|
6
6
|
import type { E2BDesktopSandbox } from "./sdk.js";
|
|
7
7
|
/**
|
|
8
|
-
* The
|
|
8
|
+
* The declared preset to record alongside the rendered screen, or undefined when the preset
|
|
9
9
|
* rendered faithfully.
|
|
10
10
|
*
|
|
11
|
-
* `desktopGeometry.screen.verified` compares the
|
|
11
|
+
* `desktopGeometry.screen.verified` compares the floored number with itself, so on its own a
|
|
12
12
|
* floored run is indistinguishable from a faithful one: a reader sees requested 500 / verified 500
|
|
13
13
|
* and concludes a 500-wide screen was asked for. Recording the declared preset is what makes
|
|
14
14
|
* "the preset width did not render" legible in the bundle.
|
|
@@ -19,7 +19,7 @@ export declare function declaredScreenForRender(preset: DevicePreset, presetName
|
|
|
19
19
|
preset: string;
|
|
20
20
|
} | undefined;
|
|
21
21
|
/**
|
|
22
|
-
* Verify the desktop screen geometry
|
|
22
|
+
* Verify the desktop screen geometry in-sandbox (the participant's device claim is checked, never
|
|
23
23
|
* assumed). A parseable mismatch fails closed. Unavailable/unparseable evidence is returned as
|
|
24
24
|
* an explicit warning: the participant may still run, but its bundle records only the requested screen
|
|
25
25
|
* and never upgrades that request into a verified measurement.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Screen and browser-window geometry on a hosted E2B desktop, measured in the sandbox rather than
|
|
2
2
|
// taken from the request.
|
|
3
|
-
import {} from "../../
|
|
3
|
+
import {} from "../../study/device-presets.js";
|
|
4
4
|
import { failureTail, redactText, toErrorMessage } from "../../evidence/redaction.js";
|
|
5
5
|
import {} from "../../run/streams.js";
|
|
6
6
|
import { chromeCdpProbeCommand, parseChromeCdpProbeOutput, } from "./cdp-probe.js";
|
|
@@ -8,10 +8,10 @@ import { shellQuote } from "../shell.js";
|
|
|
8
8
|
import { e2bShell } from "./shell.js";
|
|
9
9
|
import { findVisibleBrowserWindowId, fillDesktopBrowserWindow, } from "./desktop-browser.js";
|
|
10
10
|
/**
|
|
11
|
-
* The
|
|
11
|
+
* The declared preset to record alongside the rendered screen, or undefined when the preset
|
|
12
12
|
* rendered faithfully.
|
|
13
13
|
*
|
|
14
|
-
* `desktopGeometry.screen.verified` compares the
|
|
14
|
+
* `desktopGeometry.screen.verified` compares the floored number with itself, so on its own a
|
|
15
15
|
* floored run is indistinguishable from a faithful one: a reader sees requested 500 / verified 500
|
|
16
16
|
* and concludes a 500-wide screen was asked for. Recording the declared preset is what makes
|
|
17
17
|
* "the preset width did not render" legible in the bundle.
|
|
@@ -22,7 +22,7 @@ export function declaredScreenForRender(preset, presetName, rendered) {
|
|
|
22
22
|
return { width: preset.width, height: preset.height, preset: presetName };
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
* Verify the desktop screen geometry
|
|
25
|
+
* Verify the desktop screen geometry in-sandbox (the participant's device claim is checked, never
|
|
26
26
|
* assumed). A parseable mismatch fails closed. Unavailable/unparseable evidence is returned as
|
|
27
27
|
* an explicit warning: the participant may still run, but its bundle records only the requested screen
|
|
28
28
|
* and never upgrades that request into a verified measurement.
|
|
@@ -52,7 +52,7 @@ export async function inspectDesktopScreenGeometry(args) {
|
|
|
52
52
|
}
|
|
53
53
|
return {
|
|
54
54
|
verified: { width, height, source: "xdpyinfo" },
|
|
55
|
-
error: `
|
|
55
|
+
error: `HUMANISH_COMPUTER_USE_DEVICE_GEOMETRY: participant ${args.participantId} requested a ${expectedWidth}x${expectedHeight} desktop but xdpyinfo reports ${width}x${height} in the sandbox. The participant stops, because its screen does not match the device it declared.`,
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
@@ -298,8 +298,8 @@ export async function captureDesktopBrowserGeometry(args) {
|
|
|
298
298
|
: undefined;
|
|
299
299
|
const browserWindow = physicalWindow ?? chromeGeometry?.browserWindow;
|
|
300
300
|
const viewport = chromeGeometry?.viewport;
|
|
301
|
-
// The fill check reads the X window when it was measured: under mobile emulation
|
|
302
|
-
// page's window.outerWidth reports the
|
|
301
|
+
// The fill check reads the X window when it was measured: under mobile emulation the
|
|
302
|
+
// page's window.outerWidth reports the emulated screen (414), which is not a fill failure.
|
|
303
303
|
const fillBounds = physicalWindow;
|
|
304
304
|
if (!browserWindow) {
|
|
305
305
|
warnings.push(`Browser outer bounds could not be measured for participant ${args.participantId}.`);
|
|
@@ -314,7 +314,7 @@ export async function captureDesktopBrowserGeometry(args) {
|
|
|
314
314
|
}
|
|
315
315
|
if (!viewport) {
|
|
316
316
|
// Name the cause, not only the symptom: the same dead DevTools channel that loses the viewport
|
|
317
|
-
// loses every url/text observation, and a reader of the bundle should learn that here
|
|
317
|
+
// loses every url/text observation, and a reader of the bundle should learn that here.
|
|
318
318
|
const cause = cdpUnavailable === undefined ? "" : ` DevTools probe: ${redactText(cdpUnavailable)}.`;
|
|
319
319
|
warnings.push(args.browserFamily === "firefox"
|
|
320
320
|
? `Browser CSS viewport measurement is unavailable in Firefox for participant ${args.participantId}; stream.viewport is omitted instead of reading a different browser's CDP endpoint.`
|