humanish 0.107.0 → 0.108.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 +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- 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-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 +8 -6
- 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 +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- 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/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- 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 +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- 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 +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- 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/contract.d.ts +78 -43
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- 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 +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- 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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +147 -108
- 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 +137 -138
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +41 -6
- package/dist/cli/io.js +97 -22
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- 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 +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- 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 +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- 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 +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- 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 +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- 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 +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +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 +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- 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 +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- 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.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- 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 +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- 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 +5 -4
- package/dist/run/run.js +1 -1
- 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 +36 -35
- 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 +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -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-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- 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 +43 -0
- 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/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- 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 +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- 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/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +82 -82
- 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 +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- 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 +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- 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 +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- package/docs/contracts/study-costs.md +11 -7
- 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/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/package.json +16 -17
- package/skills/humanish/SKILL.md +60 -58
- 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.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/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- 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/config.js
CHANGED
|
@@ -1,38 +1,40 @@
|
|
|
1
1
|
// humanish.lab.v2: a lab is a composition over code primitives. There is no hardcoded lab kind.
|
|
2
|
+
// A humanish.study.v3 file is rewritten into this spelling first (parse/study-v3.ts), and then must
|
|
3
|
+
// take the route it declares and set no field that route does not read.
|
|
2
4
|
//
|
|
3
5
|
// Scope (read before trusting field names): the engine routes by
|
|
4
|
-
// subject.source × execution.target (disambiguated by the actor
|
|
6
|
+
// subject.source × execution.target (disambiguated by the actor's run kind where both axes
|
|
5
7
|
// collide) and consumes a deliberately small set of fields:
|
|
6
8
|
// subject.source/repos/appUrl/serve/env/state/clone.{depth,fanout,keep}, actors[0].count,
|
|
7
9
|
// execution.target + execution.desktop.codexAppServer, scenario.mode,
|
|
8
10
|
// policies.redactRepos, defaults.open.
|
|
9
11
|
// On the computer-use routes (app-url × e2b-desktop, and clone × e2b-desktop with a
|
|
10
|
-
// computer-use actor), `actors[0].type`
|
|
12
|
+
// computer-use actor), `actors[0].type` selects the actor: it must resolve to a registered
|
|
11
13
|
// computer-use actor, and that descriptor runs the session. Those routes also consume
|
|
12
14
|
// actors[0].{mission,persona,laneFocus.instruction,model,reasoningEffort}, execution.timeoutMs,
|
|
13
15
|
// execution.desktop.{browser,resolution,sandboxTimeoutMs}, and (clone)
|
|
14
16
|
// subject.{serve,env,state,clone.depth}.
|
|
15
17
|
// On the scripted-browser route (app-url × local-or-absent, or clone × e2b-desktop, with a
|
|
16
|
-
// registered scripted-browser actor), `actors[0].type`
|
|
18
|
+
// registered scripted-browser actor), `actors[0].type` selects the actor too, and the route
|
|
17
19
|
// consumes scenario.ref (required there, because the committed scenario's browser steps are what the
|
|
18
20
|
// actor executes), actors[0].{persona,count}, and execution.timeoutMs. On the provisioned
|
|
19
21
|
// clone slice it also consumes subject.{repos,serve,env,state,exposure,clone.depth} and
|
|
20
22
|
// execution.desktop.template. actors[0].{mission,laneFocus,model} are inert on that route
|
|
21
23
|
// because no model runs, and most execution.desktop.* fields remain forward-declared (device
|
|
22
|
-
// presets belong to the
|
|
24
|
+
// presets belong to the computer-use route; scripted surfaces are the driver's own desktop/mobile
|
|
23
25
|
// viewports where isMobile/DSF genuinely render via playwright emulation).
|
|
24
26
|
// On the other routes those fields remain forward-declared and are not yet consumed:
|
|
25
27
|
// parseLabConfig emits a warning listing any such field that is set, so `lab inspect` shows
|
|
26
28
|
// the truth.
|
|
27
29
|
//
|
|
28
|
-
// NOTE on actors[0].count: it
|
|
30
|
+
// NOTE on actors[0].count: it carries route-specific meanings. Preview route: simCount;
|
|
29
31
|
// scripted-browser route: surface roster {1 = desktop, 2 = desktop + mobile}, default 1 (the
|
|
30
32
|
// defaults-table single-participant row governs; count: 2 is the declared override); computer-use
|
|
31
33
|
// E2B route: the homogeneous fan-out participant count (N identical participants, each its own E2B
|
|
32
|
-
// desktop), capped at 16; the in-process/local-app
|
|
33
|
-
// fan out).
|
|
34
|
+
// desktop), capped at 16; the in-process/local-app computer-use route stays single-participant (no
|
|
35
|
+
// E2B to fan out).
|
|
34
36
|
//
|
|
35
|
-
// NOTE on actors[0].lanes / actors[0].roster (computer-use E2B route
|
|
37
|
+
// NOTE on actors[0].lanes / actors[0].roster (computer-use E2B route): a
|
|
36
38
|
// differentiated fan-out roster: each `{ id?, persona?, device?, instruction?, target? }` becomes one
|
|
37
39
|
// independent E2B desktop (`per-lane-worlds`, the default topology). `roster[]` is parser sugar for
|
|
38
40
|
// repeated groups and is normalized into `lanes[]` before the engine sees it. `lanes|roster` XOR
|
|
@@ -40,13 +42,13 @@
|
|
|
40
42
|
// XOR `actors[0].laneFocus` (each entry's `instruction` is the roster's steer); `lanes[].device` XOR
|
|
41
43
|
// raw `execution.desktop.resolution`. `execution.concurrency` bounds in-flight participants (default:
|
|
42
44
|
// the participant count, all at once; env HUMANISH_CUA_MAX_CONCURRENCY may only lower it, per invariant
|
|
43
|
-
// 3). On every non-
|
|
44
|
-
// rejected on the
|
|
45
|
-
// URL this participant opens instead of `subject.appUrl`; it is the generic
|
|
46
|
-
// handoff, not a service topology primitive.
|
|
45
|
+
// 3). On every non-computer-use route normalized `lanes` are inert (warned). subject.clone.fanout
|
|
46
|
+
// is rejected on the computer-use route. `lanes[].target` is app-url × computer-use only: an
|
|
47
|
+
// absolute browser URL this participant opens instead of `subject.appUrl`; it is the generic
|
|
48
|
+
// setup-produced-target handoff, not a service topology primitive.
|
|
47
49
|
//
|
|
48
50
|
// There is deliberately no v1 compatibility: v1 had zero real users. Breaking schema changes
|
|
49
|
-
// bump the version
|
|
51
|
+
// bump the version.
|
|
50
52
|
import { isLocalBrowserLab, localBrowserDefaults, localBrowserUnsupportedReason, } from "../substrates/local/runtime-config.js";
|
|
51
53
|
import { isRecord } from "../run/type-guards.js";
|
|
52
54
|
import { compositionReason } from "./composition-rules.js";
|
|
@@ -54,13 +56,14 @@ import { findUnknownLabKey } from "./keys.js";
|
|
|
54
56
|
import { parseActors, rosterOf } from "./parse/actors.js";
|
|
55
57
|
import { parseComms, recipientParticipantId } from "./parse/comms.js";
|
|
56
58
|
import { parseDefaults, parseExecution, parsePersonas, parsePolicies, parseReview, parseScenario, } from "./parse/execution.js";
|
|
59
|
+
import { studySpelling, studyToV2 } from "./parse/study-v3.js";
|
|
57
60
|
import { parseSubject } from "./parse/subject.js";
|
|
58
61
|
import { invalid, optionalStr, str } from "./parse/values.js";
|
|
59
|
-
import { isComputerUseComposition, isSharedWorldComposition } from "./routing.js";
|
|
62
|
+
import { isComputerUseComposition, isSharedWorldComposition, routeOf } from "./routing.js";
|
|
60
63
|
import { declaredParticipantIds } from "./plan-participants.js";
|
|
61
|
-
import { ID_PATTERN, LAB_CONFIG_SCHEMA, } from "./types.js";
|
|
64
|
+
import { ID_PATTERN, LAB_CONFIG_SCHEMA, STUDY_SCHEMA, } from "./types.js";
|
|
62
65
|
import { automaticAnalysisRouteReason, desktopMediaValidationReason, outputTokenLimitValidationReason, receivingEmailValidationReason, scenarioCapsValidationReason, taskProtocolValidationReason, } from "./validation.js";
|
|
63
|
-
import { forwardDeclaredWarnings } from "./warnings.js";
|
|
66
|
+
import { forwardDeclaredWarnings, inertFieldLabels } from "./warnings.js";
|
|
64
67
|
/**
|
|
65
68
|
* Validate a parsed YAML object into a LabConfig. Pure: the caller owns file IO. Structural
|
|
66
69
|
* validation only. Fields the engine does not yet consume are accepted but reported in
|
|
@@ -70,9 +73,41 @@ export function parseLabConfig(raw) {
|
|
|
70
73
|
if (!isRecord(raw)) {
|
|
71
74
|
return invalid("Lab manifest must be a YAML object.");
|
|
72
75
|
}
|
|
76
|
+
if (raw.schema === STUDY_SCHEMA)
|
|
77
|
+
return parseStudy(raw);
|
|
73
78
|
if (raw.schema !== LAB_CONFIG_SCHEMA) {
|
|
74
|
-
return invalid(`Lab schema must be ${LAB_CONFIG_SCHEMA}.`);
|
|
79
|
+
return invalid(`Lab schema must be ${STUDY_SCHEMA} or ${LAB_CONFIG_SCHEMA}.`);
|
|
75
80
|
}
|
|
81
|
+
return parseV2(raw);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A v3 study parses through the v2 parser, then must take the route it declares and set no field
|
|
85
|
+
* that route does not read. A v2 file gets those fields as a warning instead.
|
|
86
|
+
*/
|
|
87
|
+
function parseStudy(raw) {
|
|
88
|
+
const document = studyToV2(raw);
|
|
89
|
+
if (!document.ok)
|
|
90
|
+
return document;
|
|
91
|
+
const { route, v2, participantSource } = document.value;
|
|
92
|
+
const spell = (message) => studySpelling(message, route, participantSource);
|
|
93
|
+
const parsed = parseV2(v2);
|
|
94
|
+
if (!parsed.ok)
|
|
95
|
+
return invalid(spell(parsed.error.message));
|
|
96
|
+
const taken = routeOf(parsed.config);
|
|
97
|
+
if (taken !== route) {
|
|
98
|
+
return invalid(`This study declares route: ${route}, but its subject (source: ${parsed.config.subject.source}) and actor (type: ${parsed.config.actors[0]?.type}) take the ${taken} route. Change \`route\`, or change the subject or actor.`);
|
|
99
|
+
}
|
|
100
|
+
const inert = inertFieldLabels(parsed.config);
|
|
101
|
+
if (inert.length > 0) {
|
|
102
|
+
return invalid(spell(`route: ${route} does not read ${inert.join(", ")}. Remove ${inert.length === 1 ? "it" : "them"}.`));
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
ok: true,
|
|
106
|
+
config: { ...parsed.config, schema: STUDY_SCHEMA },
|
|
107
|
+
warnings: parsed.warnings.map(spell),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function parseV2(raw) {
|
|
76
111
|
const unknownKey = findUnknownLabKey(raw);
|
|
77
112
|
if (unknownKey)
|
|
78
113
|
return invalid(unknownKey);
|
|
@@ -150,11 +185,12 @@ export function parseLabConfig(raw) {
|
|
|
150
185
|
const scenarioCapsReason = scenarioCapsValidationReason(config);
|
|
151
186
|
if (scenarioCapsReason)
|
|
152
187
|
return invalid(scenarioCapsReason);
|
|
153
|
-
// All-parallel default
|
|
154
|
-
// every
|
|
155
|
-
// computer-use participants resolve that default from the final participant count
|
|
156
|
-
// --count override, so the parser leaves it unset for them. A shared
|
|
157
|
-
// its default is filled here for the envelopes and warnings that read
|
|
188
|
+
// All-parallel default: a multi-participant study that does not declare execution.concurrency
|
|
189
|
+
// runs every participant at once; the declared field is a cap the author chose, never a mode.
|
|
190
|
+
// Independent computer-use participants resolve that default from the final participant count
|
|
191
|
+
// when they plan, after any --count override, so the parser leaves it unset for them. A shared
|
|
192
|
+
// world's roster is fixed, so its default is filled here for the envelopes and warnings that read
|
|
193
|
+
// the parsed config.
|
|
158
194
|
{
|
|
159
195
|
const participantCount = rosterOf(config.actors[0])?.length ?? config.actors[0]?.count ?? 1;
|
|
160
196
|
if (participantCount > 1 &&
|
|
@@ -163,8 +199,8 @@ export function parseLabConfig(raw) {
|
|
|
163
199
|
config.execution = { ...config.execution, concurrency: participantCount };
|
|
164
200
|
}
|
|
165
201
|
}
|
|
166
|
-
// Email that just works
|
|
167
|
-
// inbox instruction, gated on recipients[]. Guessed participant ids broke a field run
|
|
202
|
+
// Email that just works: the funnel's only handoff to an actor is the per-participant
|
|
203
|
+
// inbox instruction, gated on recipients[]. Guessed participant ids broke a field run:
|
|
168
204
|
// recipients copied from a single-participant example matched nothing, so every actor was left inbox-blind with zero
|
|
169
205
|
// signal. Omitted recipients are therefore filled (one deterministic address per participant);
|
|
170
206
|
// a recipient naming an unknown participant is a hard error listing the real ids; declared
|
|
@@ -206,5 +242,9 @@ export function parseLabConfig(raw) {
|
|
|
206
242
|
if (reason)
|
|
207
243
|
return invalid(reason);
|
|
208
244
|
}
|
|
209
|
-
return {
|
|
245
|
+
return {
|
|
246
|
+
ok: true,
|
|
247
|
+
config: normalized,
|
|
248
|
+
warnings: forwardDeclaredWarnings(normalized),
|
|
249
|
+
};
|
|
210
250
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** One deprecated field: what to read instead, and how to compute the old value. */
|
|
2
|
+
export interface DeprecatedField {
|
|
3
|
+
readonly replacement: string;
|
|
4
|
+
readonly read: () => unknown;
|
|
5
|
+
}
|
|
6
|
+
/** Adds `fields` to `value` as warning getters and returns `value`. */
|
|
7
|
+
export declare function withDeprecatedFields<T extends object>(value: T, owner: {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly code: `HUMANISH_${string}`;
|
|
10
|
+
}, fields: Readonly<Record<string, DeprecatedField>>): T;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Deprecated fields on a value humanish hands to a caller. Each is a getter that warns once per
|
|
2
|
+
// process when read. The getters are not enumerable, so a spread, `Object.assign`,
|
|
3
|
+
// `JSON.stringify` or `structuredClone` of the value skips them and warns about no field the
|
|
4
|
+
// caller never named; `"name" in value` still finds them. Core never reads them.
|
|
5
|
+
const warned = new Set();
|
|
6
|
+
/** Adds `fields` to `value` as warning getters and returns `value`. */
|
|
7
|
+
export function withDeprecatedFields(value, owner, fields) {
|
|
8
|
+
return Object.defineProperties(value, Object.fromEntries(Object.entries(fields).map(([field, { replacement, read }]) => [
|
|
9
|
+
field,
|
|
10
|
+
{
|
|
11
|
+
enumerable: false,
|
|
12
|
+
get: () => {
|
|
13
|
+
warnOnce(`${owner.name}.${field}`, replacement, owner.code);
|
|
14
|
+
return read();
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
])));
|
|
18
|
+
}
|
|
19
|
+
function warnOnce(name, replacement, code) {
|
|
20
|
+
if (warned.has(name))
|
|
21
|
+
return;
|
|
22
|
+
warned.add(name);
|
|
23
|
+
process.emitWarning(`${name} is deprecated and is removed in the next minor. Use ${replacement}.`, { type: "DeprecationWarning", code });
|
|
24
|
+
}
|
|
@@ -55,7 +55,7 @@ export declare const DEVICE_PRESETS: {
|
|
|
55
55
|
export type DevicePresetName = keyof typeof DEVICE_PRESETS;
|
|
56
56
|
/**
|
|
57
57
|
* Default device for a run that does not declare one. `desktop` (1440x950) is the median
|
|
58
|
-
* first-run laptop screen
|
|
58
|
+
* first-run laptop screen, the in-house desktop default, within 10px of the 1440x960 dry-run
|
|
59
59
|
* surface in src/run/dry-run.ts. `wide` (1920x1080), the most-common external monitor, is one
|
|
60
60
|
* keystroke away (`execution.desktop.device: wide`) but is deliberately not the default,
|
|
61
61
|
* because the median device a first-time user arrives on is a laptop, not a 1080p monitor.
|
|
@@ -67,22 +67,22 @@ export declare function isDevicePresetName(value: unknown): value is DevicePrese
|
|
|
67
67
|
/** Resolve a preset name (or undefined) to its preset, falling back to the default. */
|
|
68
68
|
export declare function resolveDevicePreset(name: DevicePresetName | undefined): DevicePreset;
|
|
69
69
|
/**
|
|
70
|
-
* The narrowest browser
|
|
70
|
+
* The narrowest browser window Chrome/Chromium will render on the E2B desktop. Chrome refuses to
|
|
71
71
|
* make its window narrower than this (~500 CSS px observed: a 414-wide X screen produced a 500-wide
|
|
72
|
-
* window that
|
|
73
|
-
*
|
|
74
|
-
* narrow-mobile 320) gets a 500-wide screen the window fits exactly
|
|
72
|
+
* window that overflowed it, clipping the right edge of the page off-screen). So the physically
|
|
73
|
+
* rendered screen width is floored here: a sub-500 mobile preset (mobile 414, small-mobile 360,
|
|
74
|
+
* narrow-mobile 320) gets a 500-wide screen the window fits exactly, with no clip. The device preset keeps
|
|
75
75
|
* its true identity (isMobile, nominal width) for the persona prompt + metadata; only the rendered
|
|
76
76
|
* screen is floored. True sub-500 CSS-viewport rendering (page laid out at 414 regardless of window
|
|
77
|
-
* width, via CDP device-metric emulation) is the separate
|
|
77
|
+
* width, via CDP device-metric emulation) is the separate mobileEmulation option.
|
|
78
78
|
*/
|
|
79
79
|
export declare const MIN_DESKTOP_RENDER_WIDTH = 500;
|
|
80
|
-
/** Floor a screen resolution's
|
|
80
|
+
/** Floor a screen resolution's width to what Chrome can actually render (see MIN_DESKTOP_RENDER_WIDTH). */
|
|
81
81
|
export declare function floorRenderResolution(resolution: readonly [number, number]): [number, number];
|
|
82
82
|
/**
|
|
83
83
|
* Resolve a participant's device + rendered resolution (most-specific wins, exactly as the
|
|
84
84
|
* single-participant path always has): a raw execution.desktop.resolution escape hatch (only legal
|
|
85
|
-
* when no roster entry sets a device
|
|
85
|
+
* when no roster entry sets a device; XOR enforced at parse) → the participant's named device → the run-wide
|
|
86
86
|
* execution.desktop.device → the default preset. A raw resolution is an unnamed custom desktop
|
|
87
87
|
* (non-mobile, DSF 1): we never claim a named preset's mobile/DPR for hand-set geometry. The rendered
|
|
88
88
|
* `resolution` is floored to MIN_DESKTOP_RENDER_WIDTH so the browser window fits its X screen (no clip);
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
* the per-line notes record where the two reference sims agree vs. diverge.
|
|
5
5
|
*/
|
|
6
6
|
export const DEVICE_PRESETS = {
|
|
7
|
-
// phone
|
|
7
|
+
// phone: both reference sims agree
|
|
8
8
|
mobile: { width: 414, height: 896, isMobile: true, deviceScaleFactor: 3 },
|
|
9
|
-
// small phone
|
|
9
|
+
// small phone: both reference sims agree
|
|
10
10
|
"small-mobile": { width: 360, height: 740, isMobile: true, deviceScaleFactor: 3 },
|
|
11
11
|
// older narrow phone
|
|
12
12
|
"narrow-mobile": { width: 320, height: 700, isMobile: true, deviceScaleFactor: 2 },
|
|
13
|
-
// tablet
|
|
13
|
+
// tablet: both reference sims agree
|
|
14
14
|
tablet: { width: 820, height: 1180, isMobile: false, deviceScaleFactor: 2 },
|
|
15
15
|
// laptop baseline (the in-house desktop screen; close to the 1440x960 dry-run surface in
|
|
16
16
|
// src/run/dry-run.ts)
|
|
@@ -20,7 +20,7 @@ export const DEVICE_PRESETS = {
|
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
22
|
* Default device for a run that does not declare one. `desktop` (1440x950) is the median
|
|
23
|
-
* first-run laptop screen
|
|
23
|
+
* first-run laptop screen, the in-house desktop default, within 10px of the 1440x960 dry-run
|
|
24
24
|
* surface in src/run/dry-run.ts. `wide` (1920x1080), the most-common external monitor, is one
|
|
25
25
|
* keystroke away (`execution.desktop.device: wide`) but is deliberately not the default,
|
|
26
26
|
* because the median device a first-time user arrives on is a laptop, not a 1080p monitor.
|
|
@@ -36,24 +36,24 @@ export function resolveDevicePreset(name) {
|
|
|
36
36
|
return DEVICE_PRESETS[name ?? DEFAULT_DEVICE_PRESET];
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* The narrowest browser
|
|
39
|
+
* The narrowest browser window Chrome/Chromium will render on the E2B desktop. Chrome refuses to
|
|
40
40
|
* make its window narrower than this (~500 CSS px observed: a 414-wide X screen produced a 500-wide
|
|
41
|
-
* window that
|
|
42
|
-
*
|
|
43
|
-
* narrow-mobile 320) gets a 500-wide screen the window fits exactly
|
|
41
|
+
* window that overflowed it, clipping the right edge of the page off-screen). So the physically
|
|
42
|
+
* rendered screen width is floored here: a sub-500 mobile preset (mobile 414, small-mobile 360,
|
|
43
|
+
* narrow-mobile 320) gets a 500-wide screen the window fits exactly, with no clip. The device preset keeps
|
|
44
44
|
* its true identity (isMobile, nominal width) for the persona prompt + metadata; only the rendered
|
|
45
45
|
* screen is floored. True sub-500 CSS-viewport rendering (page laid out at 414 regardless of window
|
|
46
|
-
* width, via CDP device-metric emulation) is the separate
|
|
46
|
+
* width, via CDP device-metric emulation) is the separate mobileEmulation option.
|
|
47
47
|
*/
|
|
48
48
|
export const MIN_DESKTOP_RENDER_WIDTH = 500;
|
|
49
|
-
/** Floor a screen resolution's
|
|
49
|
+
/** Floor a screen resolution's width to what Chrome can actually render (see MIN_DESKTOP_RENDER_WIDTH). */
|
|
50
50
|
export function floorRenderResolution(resolution) {
|
|
51
51
|
return [Math.max(resolution[0], MIN_DESKTOP_RENDER_WIDTH), resolution[1]];
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
54
|
* Resolve a participant's device + rendered resolution (most-specific wins, exactly as the
|
|
55
55
|
* single-participant path always has): a raw execution.desktop.resolution escape hatch (only legal
|
|
56
|
-
* when no roster entry sets a device
|
|
56
|
+
* when no roster entry sets a device; XOR enforced at parse) → the participant's named device → the run-wide
|
|
57
57
|
* execution.desktop.device → the default preset. A raw resolution is an unnamed custom desktop
|
|
58
58
|
* (non-mobile, DSF 1): we never claim a named preset's mobile/DPR for hand-set geometry. The rendered
|
|
59
59
|
* `resolution` is floored to MIN_DESKTOP_RENDER_WIDTH so the browser window fits its X screen (no clip);
|
package/dist/lab/discover.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../actors/contract.js";
|
|
2
2
|
import { type LabConfig } from "./types.js";
|
|
3
|
-
declare const
|
|
4
|
-
declare const
|
|
3
|
+
declare const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
|
|
4
|
+
declare const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
|
|
5
5
|
type LabOrigin = "committed" | "ignored" | "explicit";
|
|
6
6
|
interface ResolvedLabConfig {
|
|
7
7
|
config: LabConfig;
|
|
@@ -12,9 +12,10 @@ interface ResolvedLabConfig {
|
|
|
12
12
|
export interface LabResolveFailure {
|
|
13
13
|
ok: false;
|
|
14
14
|
cwd: string;
|
|
15
|
-
|
|
15
|
+
/** The study the caller asked for, as given. */
|
|
16
|
+
study: string;
|
|
16
17
|
error: {
|
|
17
|
-
code: "
|
|
18
|
+
code: "HUMANISH_STUDY_NOT_FOUND" | "HUMANISH_STUDY_INVALID" | "HUMANISH_STUDY_AMBIGUOUS";
|
|
18
19
|
message: string;
|
|
19
20
|
};
|
|
20
21
|
warnings: string[];
|
|
@@ -30,16 +31,18 @@ export interface LabListEntry {
|
|
|
30
31
|
title?: string;
|
|
31
32
|
/**
|
|
32
33
|
* The manifest's own first sentence. The list is where someone decides which study to open, and a
|
|
33
|
-
* list of names cannot answer "what is this one" for a project with twenty labs in it
|
|
34
|
+
* list of names cannot answer "what is this one" for a project with twenty labs in it; the
|
|
34
35
|
* stakeholder feedback that added this was, verbatim, "so i know wtf they are".
|
|
35
36
|
*/
|
|
36
37
|
description?: string;
|
|
38
|
+
/** Why `run` refuses this file by name: its stem also names a file in the other directory family. */
|
|
39
|
+
error?: string;
|
|
37
40
|
}
|
|
38
41
|
export interface LabListResult {
|
|
39
|
-
schema: typeof
|
|
42
|
+
schema: typeof STUDY_LIST_SCHEMA;
|
|
40
43
|
ok: true;
|
|
41
44
|
cwd: string;
|
|
42
|
-
|
|
45
|
+
studies: LabListEntry[];
|
|
43
46
|
warnings: string[];
|
|
44
47
|
}
|
|
45
48
|
export interface LabInspectResult {
|
|
@@ -49,10 +52,11 @@ export interface LabInspectResult {
|
|
|
49
52
|
resolved: boolean;
|
|
50
53
|
brief?: ActorPersonaRef["brief"];
|
|
51
54
|
}>;
|
|
52
|
-
schema: typeof
|
|
55
|
+
schema: typeof STUDY_SHOW_SCHEMA;
|
|
53
56
|
ok: boolean;
|
|
54
57
|
cwd: string;
|
|
55
|
-
|
|
58
|
+
/** The study the caller asked for, as given. */
|
|
59
|
+
study: string;
|
|
56
60
|
config?: LabConfig;
|
|
57
61
|
origin?: LabOrigin;
|
|
58
62
|
path?: string;
|