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
|
@@ -4,29 +4,30 @@ export const DEFAULT_LOCAL_BROWSER_STARTER = {
|
|
|
4
4
|
};
|
|
5
5
|
function localBrowserLab(starter = DEFAULT_LOCAL_BROWSER_STARTER) {
|
|
6
6
|
return {
|
|
7
|
-
path: "humanish/
|
|
7
|
+
path: "humanish/studies/local-browser.yaml",
|
|
8
8
|
plane: "source",
|
|
9
|
-
contents: `schema: humanish.
|
|
9
|
+
contents: `schema: humanish.study.v3
|
|
10
10
|
id: local-browser
|
|
11
11
|
title: Local browser · your app · Codex account
|
|
12
12
|
description: >-
|
|
13
|
-
|
|
14
|
-
or OpenAI API key
|
|
15
|
-
|
|
13
|
+
Runs one participant on your Codex account in an isolated local browser against your loopback
|
|
14
|
+
app. Needs no E2B or OpenAI API key: inference is remote and uses your Codex account quota.
|
|
15
|
+
Before the first live run, check the Codex login and the local runtime with humanish doctor
|
|
16
|
+
--study local-browser.
|
|
17
|
+
route: computer-use
|
|
18
|
+
mode: live
|
|
16
19
|
subject:
|
|
17
20
|
source: app-url
|
|
18
21
|
appUrl: ${JSON.stringify(starter.appUrl)}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
actor:
|
|
23
|
+
type: local-agent
|
|
24
|
+
localAgent: codex
|
|
25
|
+
persona: synthetic-new-user
|
|
26
|
+
mission: ${JSON.stringify(starter.mission)}
|
|
24
27
|
execution:
|
|
25
28
|
target: local
|
|
26
29
|
concurrency: 1
|
|
27
30
|
timeoutMs: 120000
|
|
28
|
-
scenario:
|
|
29
|
-
mode: live
|
|
30
31
|
defaults:
|
|
31
32
|
open: true
|
|
32
33
|
`,
|
|
@@ -34,51 +35,53 @@ defaults:
|
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* The flagship live lab. A ChatGPT-account Codex participant has no API-dollar price, so preflight
|
|
37
|
-
* refuses a dollar cap on it (
|
|
38
|
+
* refuses a dollar cap on it (HUMANISH_COMPUTER_USE_UNPRICED_CAP); that variant is bounded by the
|
|
38
39
|
* session timeout instead of a cap it could never enforce.
|
|
39
40
|
*/
|
|
40
41
|
function tryLiveLab(actor, localAgent = "codex") {
|
|
41
42
|
const account = actor === "local-agent";
|
|
42
|
-
const
|
|
43
|
-
? `
|
|
44
|
-
|
|
45
|
-
session limit below bounds the run.`
|
|
46
|
-
: `
|
|
47
|
-
run stops before its next model request once the estimate passes $2, so the last
|
|
48
|
-
|
|
43
|
+
const needs = account
|
|
44
|
+
? ` Needs E2B_API_KEY and the coding agent signed in on this machine. Cost: one small task, a few
|
|
45
|
+
E2B desktop minutes and the agent's account usage. humanish cannot put a dollar cap on account
|
|
46
|
+
usage, so the ten-minute session limit below bounds the run.`
|
|
47
|
+
: ` Needs E2B_API_KEY and OPENAI_API_KEY. Cost: one small task with a $2 cap on estimated model
|
|
48
|
+
spend. The run stops before its next model request once the estimate passes $2, so the last
|
|
49
|
+
request can go slightly over, and hosted desktop time is billed separately.`;
|
|
49
50
|
const participant = account
|
|
50
|
-
?
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
: `
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
51
|
+
? `# Your machine has a coding agent signed in, so this study uses it: no provider API key, only
|
|
52
|
+
# E2B. To use a provider key instead, swap to \`type: openai-computer-use\` and add caps.maxUsd.
|
|
53
|
+
actor:
|
|
54
|
+
type: local-agent
|
|
55
|
+
localAgent: ${localAgent}`
|
|
56
|
+
: `actor:
|
|
57
|
+
type: openai-computer-use
|
|
58
|
+
# Bounds each model reply. Under the cap below it also bounds what a stalled or lost request
|
|
59
|
+
# can cost, so the run can retry it instead of stopping.
|
|
60
|
+
maxOutputTokens: 8192`;
|
|
61
|
+
const caps = account
|
|
62
|
+
? ""
|
|
63
|
+
: `caps:
|
|
64
|
+
maxUsd: 2 # estimated model spend; the run stops before its next request once it passes this
|
|
65
|
+
`;
|
|
66
|
+
const timeout = account
|
|
60
67
|
? " timeoutMs: 600000 # bounds the run; a dollar cap cannot be enforced on account usage"
|
|
61
|
-
:
|
|
62
|
-
caps:
|
|
63
|
-
maxUsd: 2 # estimated model spend; the run stops before its next request once it passes this`;
|
|
68
|
+
: " timeoutMs: 600000";
|
|
64
69
|
return {
|
|
65
|
-
path: "humanish/
|
|
70
|
+
path: "humanish/studies/try-live.yaml",
|
|
66
71
|
plane: "source",
|
|
67
|
-
contents: `schema: humanish.
|
|
72
|
+
contents: `schema: humanish.study.v3
|
|
68
73
|
id: try-live
|
|
69
|
-
title: Your first
|
|
74
|
+
title: "Your first live study: one participant on a demo app"
|
|
70
75
|
description: >-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
on purpose, and the friction they describe is the finding. A first run that ends in "I could not
|
|
81
|
-
do it, and here is where I got lost" worked exactly as intended.
|
|
76
|
+
Runs one participant live on drawDB, a public open-source diagram editor that humanish clones
|
|
77
|
+
and serves in a hosted desktop, so it runs with nothing to configure. The app under study is
|
|
78
|
+
that demo, not yours. The other starter studies need your app's details first.
|
|
79
|
+
${needs}
|
|
80
|
+
A participant who gets stuck and says where is a useful result: humanish does not count that
|
|
81
|
+
run as a pass, and the friction the participant describes is the finding. To study your own
|
|
82
|
+
app, change subject; humanish/studies/cua-browser.yaml shows the shape.
|
|
83
|
+
route: computer-use
|
|
84
|
+
mode: live # the other starter studies start as dry runs
|
|
82
85
|
subject:
|
|
83
86
|
source: clone
|
|
84
87
|
repos:
|
|
@@ -86,22 +89,19 @@ subject:
|
|
|
86
89
|
clone:
|
|
87
90
|
depth: 1
|
|
88
91
|
serve:
|
|
89
|
-
# Plain npm
|
|
92
|
+
# Plain npm: humanish provides the Node runtime that the stock desktop image lacks.
|
|
90
93
|
install: npm install --no-audit --no-fund
|
|
91
94
|
build: npm run build
|
|
92
95
|
start: npx vite preview --host 127.0.0.1 --port 3000
|
|
93
96
|
url: http://127.0.0.1:3000/
|
|
94
|
-
actors:
|
|
95
97
|
${participant}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
execution:
|
|
98
|
+
persona: synthetic-new-user
|
|
99
|
+
mission: >-
|
|
100
|
+
You have never seen this diagram tool before. Add two tables and give them meaningful names,
|
|
101
|
+
then stop and say what you did, what confused you, and where you hesitated.
|
|
102
|
+
${caps}execution:
|
|
101
103
|
target: e2b-desktop
|
|
102
|
-
${
|
|
103
|
-
scenario:
|
|
104
|
-
mode: live # the point of this lab — the others start as dry-run
|
|
104
|
+
${timeout}
|
|
105
105
|
defaults:
|
|
106
106
|
open: true
|
|
107
107
|
`,
|
|
@@ -113,7 +113,8 @@ export const starterFiles = [
|
|
|
113
113
|
plane: "source",
|
|
114
114
|
contents: `# humanish
|
|
115
115
|
|
|
116
|
-
This directory
|
|
116
|
+
This directory holds the committed definitions of this app's humanish studies: study files,
|
|
117
|
+
personas and scenarios.
|
|
117
118
|
|
|
118
119
|
Keep this directory public-safe:
|
|
119
120
|
|
|
@@ -124,11 +125,13 @@ Keep this directory public-safe:
|
|
|
124
125
|
|
|
125
126
|
Generated run bundles, screenshots, traces, logs, and local overrides belong in ignored \`.humanish/\`.
|
|
126
127
|
|
|
127
|
-
|
|
128
|
+
Studies:
|
|
128
129
|
|
|
129
|
-
- committed reusable
|
|
130
|
-
- private or machine-local
|
|
131
|
-
|
|
130
|
+
- committed reusable studies live in humanish/studies/*.yaml;
|
|
131
|
+
- private or machine-local studies live in ignored .humanish/studies/*.yaml or
|
|
132
|
+
.humanish/local/studies/*.yaml;
|
|
133
|
+
- run a study with \`humanish run <study>\`, or \`humanish watch <study>\` to stay attached;
|
|
134
|
+
- files under humanish/labs/ move there with \`humanish migrate\`.
|
|
132
135
|
|
|
133
136
|
Format standard:
|
|
134
137
|
|
|
@@ -207,19 +210,21 @@ steps:
|
|
|
207
210
|
`,
|
|
208
211
|
},
|
|
209
212
|
{
|
|
210
|
-
path: "humanish/
|
|
213
|
+
path: "humanish/studies/first-run.yaml",
|
|
211
214
|
plane: "source",
|
|
212
|
-
contents: `schema: humanish.
|
|
215
|
+
contents: `schema: humanish.study.v3
|
|
213
216
|
id: first-run
|
|
214
217
|
title: First-run synthetic Observer
|
|
215
|
-
description:
|
|
218
|
+
description: >-
|
|
219
|
+
Does a dry run: writes a synthetic run bundle and Observer for four participants. Needs no browser,
|
|
220
|
+
model or keys, and costs nothing. Run it with humanish run first-run.
|
|
221
|
+
route: preview
|
|
222
|
+
mode: dry-run
|
|
216
223
|
subject:
|
|
217
224
|
source: this-repo
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
scenario:
|
|
222
|
-
mode: dry-run
|
|
225
|
+
actor:
|
|
226
|
+
type: synthetic-persona
|
|
227
|
+
participants: 4
|
|
223
228
|
defaults:
|
|
224
229
|
open: true
|
|
225
230
|
`,
|
|
@@ -227,19 +232,21 @@ defaults:
|
|
|
227
232
|
tryLiveLab("openai-computer-use"),
|
|
228
233
|
localBrowserLab(),
|
|
229
234
|
{
|
|
230
|
-
path: "humanish/
|
|
235
|
+
path: "humanish/studies/cua-browser.yaml",
|
|
231
236
|
plane: "source",
|
|
232
|
-
contents: `schema: humanish.
|
|
237
|
+
contents: `schema: humanish.study.v3
|
|
233
238
|
id: cua-browser
|
|
234
|
-
title: Computer-use browser
|
|
239
|
+
title: Computer-use browser study
|
|
235
240
|
description: >-
|
|
236
|
-
A
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
241
|
+
A computer-use participant drives your app in a hosted desktop browser and writes its evidence
|
|
242
|
+
to gitignored .humanish/. Starts as a dry run. For a live session, set mode to live
|
|
243
|
+
and pass OPENAI_API_KEY and E2B_API_KEY with --env-file. The clone subject below serves your
|
|
244
|
+
repo inside the sandbox, and the env names declared under subject get their values from
|
|
245
|
+
--env-file without the values being saved. Screenshots keep full fidelity by default; set
|
|
246
|
+
policies.redactScreenshots: true to blur them at capture for a bundle you can share as is.
|
|
247
|
+
Typed text is recorded as its length only.
|
|
248
|
+
route: computer-use
|
|
249
|
+
mode: dry-run
|
|
243
250
|
subject:
|
|
244
251
|
source: clone
|
|
245
252
|
repos: [your-org/your-app]
|
|
@@ -251,7 +258,7 @@ subject:
|
|
|
251
258
|
# installTimeoutMs: 1200000 # bump for monorepo-scale installs/builds (default 600000)
|
|
252
259
|
# buildTimeoutMs: 1800000
|
|
253
260
|
# env: [DATABASE_URL]
|
|
254
|
-
# state: # the subject's
|
|
261
|
+
# state: # the subject's state, recorded as provenance:
|
|
255
262
|
# seed: # ordered, bounded seed/migration/fixture steps (commands are
|
|
256
263
|
# - name: db-up # author-trusted; evidence records sha256 digests, never text)
|
|
257
264
|
# command: sudo service postgresql start && pg_isready -t 30
|
|
@@ -259,104 +266,97 @@ subject:
|
|
|
259
266
|
# - name: db-migrate
|
|
260
267
|
# command: pnpm prisma migrate deploy
|
|
261
268
|
# timeoutMs: 300000 # per-step budget (default 300000)
|
|
262
|
-
# - name: admin-user # after-ready steps run against the
|
|
269
|
+
# - name: admin-user # after-ready steps run against the running app
|
|
263
270
|
# command: curl -sf -X POST http://127.0.0.1:3000/api/test/bootstrap-admin
|
|
264
271
|
# when: after-ready
|
|
265
|
-
# # Or point at a shared DB you do
|
|
272
|
+
# # Or point at a shared DB you do not control; provenance records it as unpinned.
|
|
266
273
|
# # each name must also be declared in subject.env:
|
|
267
274
|
# # external: [DATABASE_URL]
|
|
268
275
|
# clone:
|
|
269
|
-
# keep: true #
|
|
276
|
+
# keep: true # keep the sandbox after a failure to debug install or boot
|
|
270
277
|
# Alternative: drive a deployment you own (Vercel preview, staging) instead of a clone:
|
|
271
278
|
# source: app-url
|
|
272
279
|
# appUrl: https://your-preview.vercel.app/
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
280
|
+
actor:
|
|
281
|
+
type: openai-computer-use
|
|
282
|
+
persona: synthetic-new-user
|
|
283
|
+
mission: >-
|
|
284
|
+
Explore the app as a brand-new user trying to complete its primary flow. Note anything
|
|
285
|
+
confusing. Stop when the flow completes or you are stuck.
|
|
279
286
|
execution:
|
|
280
287
|
target: e2b-desktop
|
|
281
|
-
# 20 minutes
|
|
282
|
-
#
|
|
283
|
-
#
|
|
284
|
-
#
|
|
285
|
-
#
|
|
286
|
-
# execution.desktop.sandboxTimeoutMs deliberately if you need more.
|
|
287
|
-
# Spend protection belongs to the dollar caps, not the clock.
|
|
288
|
+
# 20 minutes, the longest this route allows, so a session ends when the participant finishes.
|
|
289
|
+
# The route clones, installs, builds and serves the subject before the participant starts, so
|
|
290
|
+
# the sandbox deadline is this budget plus 40 minutes of provisioning and teardown, and a sandbox
|
|
291
|
+
# lives at most 60 minutes. A value above 20 minutes fails the run before it starts; raise
|
|
292
|
+
# execution.desktop.sandboxTimeoutMs if you need more. The dollar caps limit spend.
|
|
288
293
|
timeoutMs: 1200000
|
|
289
294
|
desktop:
|
|
290
295
|
device: desktop # mobile | small-mobile | narrow-mobile | tablet | desktop | wide
|
|
291
296
|
# browser: chrome # default | chrome | chromium | firefox; concrete values fail closed
|
|
292
297
|
# Presets size the physical screen; Chrome's window width has a ~500px minimum.
|
|
293
298
|
# For mobile presets, opt into CSS viewport, touch, DPR and mobile user-agent emulation:
|
|
294
|
-
# fidelity: { mobileEmulation: true } # Chrome/Chromium only; desktop
|
|
299
|
+
# fidelity: { mobileEmulation: true } # Chrome/Chromium only; desktop and tablet are unchanged
|
|
295
300
|
# The bundle records measured screen, page viewport and emulation fidelity separately.
|
|
296
|
-
scenario:
|
|
297
|
-
mode: dry-run
|
|
298
301
|
# policies:
|
|
299
|
-
# redactScreenshots: true # blur
|
|
302
|
+
# redactScreenshots: true # blur saved frames (off by default: full fidelity for local use)
|
|
300
303
|
# allowPublicTargets: true # required to drive a non-loopback app-url (a deployment you own)
|
|
301
304
|
defaults:
|
|
302
305
|
open: true
|
|
303
306
|
`,
|
|
304
307
|
},
|
|
305
308
|
{
|
|
306
|
-
path: "humanish/
|
|
309
|
+
path: "humanish/studies/lobby-trivia-3player.yaml",
|
|
307
310
|
plane: "source",
|
|
308
|
-
contents: `schema: humanish.
|
|
311
|
+
contents: `schema: humanish.study.v3
|
|
309
312
|
id: lobby-trivia-3player
|
|
310
|
-
title:
|
|
313
|
+
title: "Shared world on a public app: three mobile participants in one lobby"
|
|
311
314
|
description: >-
|
|
312
|
-
A worked example of the
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
shared-
|
|
324
|
-
|
|
325
|
-
|
|
315
|
+
A worked example of the external-public shared-world route: three participants on mobile layouts
|
|
316
|
+
play the same multiplayer lobby on a public deployment at the same time. The public site is the
|
|
317
|
+
shared plane, so there is no clone, subject sandbox or seed. The host participant creates the
|
|
318
|
+
lobby, humanish reads the session code from the host's page URL, and the other participants get
|
|
319
|
+
it in their missions and join through the app's own join flow. Starts as a dry run, which writes
|
|
320
|
+
one evidence bundle at no cost. A live run needs OPENAI_API_KEY, E2B_API_KEY and mode: live. Point appUrl and publicTarget at a public deployment you own or operate. Mobile layout:
|
|
321
|
+
Chrome's physical window is at least 500px wide and has no touch emulation, desktop pixel ratio
|
|
322
|
+
and a desktop user agent. Set execution.desktop.fidelity.mobileEmulation to true to request the
|
|
323
|
+
preset's CSS viewport, touch, pixel ratio and mobile user agent on Chrome or Chromium; the bundle
|
|
324
|
+
records the measured geometry and emulation fidelity. A run on a public site proves less than a
|
|
325
|
+
provisioned one: its provenance is external-public, it carries no synthetic-data attestation and
|
|
326
|
+
no authoritative shared-state proof, and concurrency rests on overlapping sessions and every
|
|
327
|
+
participant reaching the same lobby.
|
|
328
|
+
route: shared-world
|
|
329
|
+
mode: dry-run # a live run opens three mobile-layout desktops against the public app
|
|
326
330
|
subject:
|
|
327
|
-
source: app-url # the
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
publicTarget: # REQUIRED ownership attestation (the honest analog of exposure: synthetic)
|
|
331
|
+
source: app-url # the public deployment is the shared plane: no clone and no getHost
|
|
332
|
+
appUrl: https://your-public-app.example/ # a deployment you own or operate
|
|
333
|
+
publicTarget: # required: your attestation that you own or operate this deployment
|
|
331
334
|
owner: your-org/your-app
|
|
332
335
|
authorized: true
|
|
333
336
|
policies:
|
|
334
|
-
allowPublicTargets: true #
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
337
|
+
allowPublicTargets: true # required: the shared plane is a public, non-loopback deployment
|
|
338
|
+
actor:
|
|
339
|
+
type: openai-computer-use
|
|
340
|
+
mission: You are one of several users on the same shared session at once. Play your role, then stop.
|
|
341
|
+
participants: # at least two participants, exactly one with host: true
|
|
342
|
+
- id: host
|
|
343
|
+
host: true # this participant creates the shared session
|
|
344
|
+
device: mobile # 414x896 preset; physical window width floors to 500 (see emulation above)
|
|
345
|
+
instruction: Create a shared lobby, wait for the others to join, then start and play.
|
|
346
|
+
- id: player-2
|
|
347
|
+
device: mobile
|
|
348
|
+
instruction: Join the lobby you're told the code for, then play.
|
|
349
|
+
- id: player-3
|
|
350
|
+
device: small-mobile
|
|
351
|
+
instruction: Join the lobby you're told the code for, then play.
|
|
349
352
|
execution:
|
|
350
353
|
target: e2b-desktop
|
|
351
|
-
#
|
|
352
|
-
#
|
|
353
|
-
# example died at 120000 with every seat expiring mid game and zero mission actions taken.
|
|
354
|
+
# Each participant's session budget, which also bounds the host's handoff deadline. It has to
|
|
355
|
+
# cover provisioning, joining the shared session and play; 420000 ms (7 minutes) does.
|
|
354
356
|
timeoutMs: 420000
|
|
355
|
-
concurrency: 3 # all
|
|
357
|
+
concurrency: 3 # all three participants at once, the default; lower it only to limit paid desktops
|
|
356
358
|
# desktop:
|
|
357
359
|
# fidelity: { mobileEmulation: true } # opt into mobile CSS viewport, touch, DPR and user agent
|
|
358
|
-
scenario:
|
|
359
|
-
mode: dry-run # default; the live path opens N real mobile-layout seats against the public app
|
|
360
360
|
defaults:
|
|
361
361
|
open: true
|
|
362
362
|
`,
|
|
@@ -388,8 +388,8 @@ export const runtimeDirectories = [
|
|
|
388
388
|
{ path: ".humanish/cache", plane: "runtime" },
|
|
389
389
|
{ path: ".humanish/tmp", plane: "runtime" },
|
|
390
390
|
{ path: ".humanish/logs", plane: "runtime" },
|
|
391
|
-
{ path: ".humanish/
|
|
392
|
-
{ path: ".humanish/local/
|
|
391
|
+
{ path: ".humanish/studies", plane: "runtime" },
|
|
392
|
+
{ path: ".humanish/local/studies", plane: "runtime" },
|
|
393
393
|
{ path: ".humanish/local/personas", plane: "runtime" },
|
|
394
394
|
];
|
|
395
395
|
export const humanishScripts = {
|
|
@@ -408,9 +408,9 @@ export const humanishScripts = {
|
|
|
408
408
|
* only E2B. Writing the other one there would hand someone homework instead of a first run.
|
|
409
409
|
*/
|
|
410
410
|
export function starterFilesFor(actor, localBrowser = DEFAULT_LOCAL_BROWSER_STARTER, localAgent) {
|
|
411
|
-
return starterFiles.map((file) => file.path === "humanish/
|
|
411
|
+
return starterFiles.map((file) => file.path === "humanish/studies/local-browser.yaml"
|
|
412
412
|
? localBrowserLab(localBrowser)
|
|
413
|
-
: file.path === "humanish/
|
|
413
|
+
: file.path === "humanish/studies/try-live.yaml"
|
|
414
414
|
? tryLiveLab(actor, localAgent)
|
|
415
415
|
: file);
|
|
416
416
|
}
|
package/dist/lab/init.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ export interface InitResult {
|
|
|
26
26
|
changes: InitChange[];
|
|
27
27
|
warnings: string[];
|
|
28
28
|
/**
|
|
29
|
-
* The next one or two commands, already resolved against
|
|
29
|
+
* The next one or two commands, already resolved against this machine's credentials. Present on
|
|
30
30
|
* an applied init; absent on a dry-run or a failure, where there is no "next" yet.
|
|
31
31
|
*/
|
|
32
32
|
nextSteps?: string[];
|
package/dist/lab/init.js
CHANGED
|
@@ -8,6 +8,7 @@ import { assertPreparedSelectedOutputDirectory, prepareContainedOutputDirectory,
|
|
|
8
8
|
import { validateCwd } from "../run/project.js";
|
|
9
9
|
import { pathExists, readTextIfExists, validateInitProjectPaths } from "./init-paths.js";
|
|
10
10
|
import { planGitignore, planPackageJson } from "./init-plan.js";
|
|
11
|
+
import { otherStudyFiles, STUDY_DIRECTORIES, studyFileStem } from "../study/files.js";
|
|
11
12
|
const INIT_RESPONSE_SCHEMA = "humanish.init-result.v1";
|
|
12
13
|
export async function runInit(options) {
|
|
13
14
|
const requestedCwd = path.resolve(options.cwd);
|
|
@@ -39,7 +40,7 @@ export async function runInit(options) {
|
|
|
39
40
|
await planAgentsFile(preparedProjectRoot, cwd, plan);
|
|
40
41
|
// The starter live lab is written for the brain this machine can actually use. Shipping it as
|
|
41
42
|
// openai-computer-use on a machine with no provider key but a signed-in Codex would hand someone
|
|
42
|
-
// a file that asks for a credential they were just told they do not need
|
|
43
|
+
// a file that asks for a credential they were just told they do not need.
|
|
43
44
|
const machine = await firstRunEnvironment(options.env ?? process.env, requestedCwd);
|
|
44
45
|
const starterActor = starterActorFor(machine);
|
|
45
46
|
await planStarterFiles(preparedProjectRoot, cwd, starterFilesFor(starterActor, localBrowser.value, starterLocalAgentFor(machine)), options.localBrowser !== undefined, plan);
|
|
@@ -77,16 +78,16 @@ export async function runInit(options) {
|
|
|
77
78
|
cwd: requestedCwd,
|
|
78
79
|
changes: plan.changes,
|
|
79
80
|
warnings: plan.warnings,
|
|
80
|
-
// Resolved against
|
|
81
|
+
// Resolved against this machine, because a next step that cannot work is worse than none.
|
|
81
82
|
...(mode === "applied" ? { nextSteps: firstRunGuidance(machine) } : {}),
|
|
82
83
|
};
|
|
83
84
|
}
|
|
84
|
-
// Leave instructions for the
|
|
85
|
-
// Codex, Claude Code, Cursor, Aider and others read it
|
|
85
|
+
// Leave instructions for the next agent. `AGENTS.md` is the cross-vendor convention (agents.md);
|
|
86
|
+
// Codex, Claude Code, Cursor, Aider and others read it, and increasingly the thing that runs
|
|
86
87
|
// `humanish init` is a coding agent doing setup on someone's behalf. Without this, the agent
|
|
87
88
|
// that arrives tomorrow finds a humanish/ directory and no idea what to do with it.
|
|
88
89
|
//
|
|
89
|
-
//
|
|
90
|
+
// Append-only and idempotent: an existing `AGENTS.md` is a file someone wrote, so humanish adds its
|
|
90
91
|
// own section once and never rewrites theirs.
|
|
91
92
|
async function planAgentsFile(preparedProjectRoot, cwd, plan) {
|
|
92
93
|
const agentsPath = "AGENTS.md";
|
|
@@ -136,10 +137,22 @@ async function planStarterFiles(preparedProjectRoot, cwd, files, localBrowserReq
|
|
|
136
137
|
const existing = await readTextIfExists(preparedProjectRoot, file.path);
|
|
137
138
|
if (existing !== null &&
|
|
138
139
|
localBrowserRequested &&
|
|
139
|
-
file.path === "humanish/
|
|
140
|
-
plan.warnings.push("Skipped --local-browser/--local-mission: humanish/
|
|
140
|
+
file.path === "humanish/studies/local-browser.yaml") {
|
|
141
|
+
plan.warnings.push("Skipped --local-browser/--local-mission: humanish/studies/local-browser.yaml already exists and init never overwrites it.");
|
|
141
142
|
}
|
|
142
|
-
|
|
143
|
+
const others = existing === null ? await otherStudyFilesFor(preparedProjectRoot, file.path) : [];
|
|
144
|
+
if (others.length > 0) {
|
|
145
|
+
const stem = studyFileStem(path.basename(file.path));
|
|
146
|
+
plan.changes.push({
|
|
147
|
+
path: file.path,
|
|
148
|
+
action: "skip",
|
|
149
|
+
target: file.plane,
|
|
150
|
+
reason: `${others.join(", ")} already uses the name ${stem}`,
|
|
151
|
+
});
|
|
152
|
+
const legacy = others.some((other) => other.split(path.sep).includes("labs"));
|
|
153
|
+
plan.warnings.push(`Skipped ${file.path}: ${others.join(", ")} already uses the name ${stem}, and a second file with that name would make \`run ${stem}\` fail.${legacy ? " Run humanish migrate to move it to a studies/ directory." : ""}`);
|
|
154
|
+
}
|
|
155
|
+
else if (existing === null) {
|
|
143
156
|
plan.changes.push({
|
|
144
157
|
path: file.path,
|
|
145
158
|
action: "create",
|
|
@@ -172,6 +185,25 @@ async function planStarterFiles(preparedProjectRoot, cwd, files, localBrowserReq
|
|
|
172
185
|
}
|
|
173
186
|
}
|
|
174
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* The study files that already use a starter study's name in any study directory, other than the
|
|
190
|
+
* starter's own path. An unsafe path counts as present, so init skips the starter rather than
|
|
191
|
+
* failing.
|
|
192
|
+
*/
|
|
193
|
+
async function otherStudyFilesFor(preparedProjectRoot, relativePath) {
|
|
194
|
+
const stem = studyFileStem(path.basename(relativePath));
|
|
195
|
+
const inStudyDirectory = STUDY_DIRECTORIES.some((directory) => directory.relativeDir === path.dirname(relativePath));
|
|
196
|
+
if (stem === undefined || !inStudyDirectory)
|
|
197
|
+
return [];
|
|
198
|
+
return otherStudyFiles(stem, async (candidate) => {
|
|
199
|
+
try {
|
|
200
|
+
return (await readTextIfExists(preparedProjectRoot, candidate)) !== null;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
}, relativePath);
|
|
206
|
+
}
|
|
175
207
|
/** Create each ignored runtime directory that is missing. */
|
|
176
208
|
async function planRuntimeDirectories(preparedProjectRoot, cwd, plan) {
|
|
177
209
|
for (const directory of runtimeDirectories) {
|
|
@@ -254,7 +286,7 @@ async function firstRunEnvironment(env, cwd) {
|
|
|
254
286
|
const present = (name) => keys.some((key) => key.name === name && key.source !== null);
|
|
255
287
|
let hasDesktopSdk = false;
|
|
256
288
|
try {
|
|
257
|
-
// Resolution from the
|
|
289
|
+
// Resolution starts from the project, wherever humanish itself is installed.
|
|
258
290
|
const { createRequire } = await import("node:module");
|
|
259
291
|
createRequire(path.join(process.cwd(), "package.json")).resolve("@e2b/desktop");
|
|
260
292
|
hasDesktopSdk = true;
|
package/dist/lab/keys.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
/** The first key in `raw` that LAB_KEYS does not list, as an error message; undefined if none. */
|
|
2
2
|
export declare function findUnknownLabKey(raw: unknown): string | undefined;
|
|
3
|
+
/** The first key in a humanish.study.v3 document that the format does not have; undefined if none. */
|
|
4
|
+
export declare function findUnknownStudyKey(raw: unknown): string | undefined;
|