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
|
@@ -1,33 +1,28 @@
|
|
|
1
1
|
# Serve: the run library surface
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
`src/observer/http.ts`, `src/observer/exposure.ts` and `src/observer/tunnel.ts`,
|
|
8
|
-
with per-run routes and the history index in `src/observer/run-routes.ts` and the
|
|
9
|
-
loopback bind in `src/observer/listen.ts`. The CLI wiring is in
|
|
3
|
+
The `loopback`, `exposed` (edge-authed) and `share-safe-open` modes live in
|
|
4
|
+
`src/observer/serve.ts`, `src/observer/library.ts`, `src/observer/http.ts`,
|
|
5
|
+
`src/observer/exposure.ts` and `src/observer/tunnel.ts`, with per-run routes and the history
|
|
6
|
+
index in `src/observer/run-routes.ts` and the loopback bind in `src/observer/listen.ts`. The CLI wiring is in
|
|
10
7
|
`src/cli/commands/observe.ts`. The `/_humanish/api/*` control-plane namespace is
|
|
11
8
|
reserved and answers `501`; no mutating route ships.
|
|
12
9
|
|
|
13
|
-
Exposure auth
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
operator-secured `--public-url` (Cloudflare Access, Tailscale, a reverse proxy
|
|
19
|
-
you own).
|
|
10
|
+
Exposure auth happens only at the tunnel edge. humanish has had no in-process auth since 0.18.0,
|
|
11
|
+
which removed the capability link (cookie, token and TTL), its auth module and the
|
|
12
|
+
`serve --auth link|none` flags. The gate is ngrok `--oauth google` with `--allow-email` or
|
|
13
|
+
`--allow-domain` rules, or an operator-secured `--public-url` (Cloudflare Access, Tailscale or a
|
|
14
|
+
reverse proxy you own).
|
|
20
15
|
|
|
21
16
|
## What serve is
|
|
22
17
|
|
|
23
|
-
`humanish
|
|
24
|
-
the
|
|
18
|
+
`humanish observe --all` is the third observer surface, and the first whose subject is
|
|
19
|
+
the library rather than a run:
|
|
25
20
|
|
|
26
21
|
- `humanish watch` serves one attached run: the process that created the run
|
|
27
22
|
serves it and may inject runtime stream URLs for live following (see the
|
|
28
23
|
stream-URL rules below and `watch --expose`);
|
|
29
24
|
- `humanish observe` re-serves one finished run read-only;
|
|
30
|
-
- `humanish
|
|
25
|
+
- `humanish observe --all` serves the whole local library under `.humanish/runs/`: a
|
|
31
26
|
library index, per-run Observer pages, `/_humanish/history.json` polling, and
|
|
32
27
|
optional edge-authenticated exposure beyond the machine.
|
|
33
28
|
|
|
@@ -39,11 +34,11 @@ authenticated edge (or `--safe`, see the fail-closed matrix).
|
|
|
39
34
|
## Fail-closed exposure matrix
|
|
40
35
|
|
|
41
36
|
One shared validator (`validateExposure` in `src/observer/exposure.ts`) governs
|
|
42
|
-
both `
|
|
37
|
+
both `observe --all` and `watch`. `--expose` must always resolve to a reachable public
|
|
43
38
|
origin (a `--tunnel` or a `--public-url`), even under `--safe`, since an
|
|
44
39
|
origin-less exposed server is an unreachable loopback no-op. With an origin
|
|
45
|
-
present, exposure requires
|
|
46
|
-
`--public-url` you secure)
|
|
40
|
+
present, exposure requires either edge auth (`--oauth` on the ngrok edge, or a
|
|
41
|
+
`--public-url` you secure) or `--safe` (share_ready runs only). A tunnel with
|
|
47
42
|
neither is a wide-open public URL to local bundles and is refused.
|
|
48
43
|
|
|
49
44
|
| `--expose` | `--tunnel` | `--oauth` | `--public-url` | `--safe` | Outcome |
|
|
@@ -51,11 +46,11 @@ neither is a wide-open public URL to local bundles and is refused.
|
|
|
51
46
|
| no | no | no | no | any | `loopback` (no exposure) |
|
|
52
47
|
| yes | yes | yes | no | any | OK → `exposed` (edge-authed; all runs unless `--safe`) |
|
|
53
48
|
| yes | yes | no | no | yes | OK → `share-safe-open` (public, share_ready only) |
|
|
54
|
-
| yes | yes | no | no | no | **
|
|
49
|
+
| yes | yes | no | no | no | **refused** `HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE` |
|
|
55
50
|
| yes | no | no | yes | any | OK → `exposed` (operator-secured edge) |
|
|
56
|
-
| yes | no | no | no | any | **
|
|
57
|
-
| yes | no | yes | no | any | **
|
|
58
|
-
| yes | yes | yes | yes | any | **
|
|
51
|
+
| yes | no | no | no | any | **refused** `HUMANISH_SERVE_EXPOSE_REQUIRES_ORIGIN` (no reachable origin, even with `--safe`) |
|
|
52
|
+
| yes | no | yes | no | any | **refused** `HUMANISH_SERVE_OAUTH_REQUIRES_TUNNEL` |
|
|
53
|
+
| yes | yes | yes | yes | any | **refused** `HUMANISH_SERVE_OPTION_CONFLICT` (tunnel + public-url) |
|
|
59
54
|
|
|
60
55
|
Guard order (all before any bind/spawn): `--allow-email`/`--allow-domain` without
|
|
61
56
|
`--oauth` → `HUMANISH_SERVE_ALLOW_REQUIRES_OAUTH`; `--oauth` without `--tunnel` →
|
|
@@ -66,8 +61,8 @@ http(s) origin → conflict; a tunnel/public-url without `--expose` →
|
|
|
66
61
|
no `--public-url` (even under `--safe`) →
|
|
67
62
|
`HUMANISH_SERVE_EXPOSE_REQUIRES_ORIGIN`; `--expose` with an origin but without
|
|
68
63
|
edge auth and without `--safe` →
|
|
69
|
-
`HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE`. `--oauth google` with
|
|
70
|
-
allow rule is
|
|
64
|
+
`HUMANISH_SERVE_EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE`. `--oauth google` with no
|
|
65
|
+
allow rule is allowed (any Google account authenticates) but pushes a prominent
|
|
71
66
|
warning recommending at least one `--allow-email`/`--allow-domain`.
|
|
72
67
|
|
|
73
68
|
The `watch` surface reuses the same validator but is stricter: a live,
|
|
@@ -77,7 +72,7 @@ therefore refused outright with `HUMANISH_WATCH_SAFE_NOT_APPLICABLE` (exit 2), s
|
|
|
77
72
|
never silently ignored.
|
|
78
73
|
`watch --expose` always requires edge auth (`--tunnel --oauth` or `--public-url`),
|
|
79
74
|
and is also refused with `--dry-run`/`--detach`/`--json` (no live desktop / no
|
|
80
|
-
attached follow). An exposed watch serves
|
|
75
|
+
attached follow). An exposed watch serves only the attached live run: its
|
|
81
76
|
`/_humanish/history.json` lists just that run and every other run id 404s
|
|
82
77
|
byte-identically to a nonexistent one, so a remote viewer can never enumerate or
|
|
83
78
|
reach any prior run's raw evidence (loopback watch still serves the full library).
|
|
@@ -122,14 +117,14 @@ which adds `sandbox allow-scripts` to that policy.
|
|
|
122
117
|
|
|
123
118
|
| Mode | Invocation | Boundary class |
|
|
124
119
|
| ----------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
125
|
-
| `loopback` | `humanish
|
|
120
|
+
| `loopback` | `humanish observe --all` | Capture-side trust: readable only by whoever can already read gitignored `.humanish/` on this machine; no new boundary is crossed. |
|
|
126
121
|
| `exposed` | `--expose --tunnel ngrok --oauth google …`, or `--expose --public-url <origin>` | Edge-authed exposure: only viewers who clear the edge OAuth (or the operator's own edge) reach the loopback server, which then serves everything it grants unless `--safe` composes in. The gate is the edge, not humanish. |
|
|
127
122
|
| `share-safe-open` | `--expose --safe --tunnel ngrok` (no `--oauth`) | Genuine publishing behind the feedback-grade `share_ready` gate: only runs that pass verify are served. Each request walks the run, and any added, removed or changed file re-verifies it first; a file is read only while its inode, size, mtime and ctime match the walk verify covered, and its bytes are served only when their sha256 matches the hash taken at admission. Everything else is absent, 404ing byte-identically to a nonexistent run (no existence oracle). |
|
|
128
123
|
|
|
129
124
|
## Keep stream URLs off the library surface
|
|
130
125
|
|
|
131
126
|
Live desktop stream URLs (auth-bearing hosted-VNC links) are never served by the
|
|
132
|
-
|
|
127
|
+
library surface, in any mode, and the guarantee is layered:
|
|
133
128
|
|
|
134
129
|
- **Structural:** runtime stream URLs live in a `WeakMap` keyed by the watch
|
|
135
130
|
process's in-memory `ObserverResult` (`src/observer/render.ts`) and are never
|
|
@@ -149,12 +144,14 @@ disk). See observer.md.
|
|
|
149
144
|
|
|
150
145
|
## Know what `share_ready` checks
|
|
151
146
|
|
|
152
|
-
`share_ready` was designed as the bar for
|
|
147
|
+
`share_ready` was designed as the bar for feedback payloads: evidence eligible
|
|
153
148
|
to leave the machine inside a public issue draft. Serve's `share-safe-open` mode
|
|
154
|
-
extends that same gate to arbitrary-audience
|
|
155
|
-
exposure of the same artifacts. The
|
|
149
|
+
extends that same gate to arbitrary-audience browsing, which is a broader
|
|
150
|
+
exposure of the same artifacts. The same caveat carries over:
|
|
156
151
|
`humanish verify` does not yet detect free-form PII/PHI (names, emails, medical
|
|
157
|
-
identifiers; see
|
|
152
|
+
identifiers; see
|
|
153
|
+
[Share evidence safely](../../README.md#share-evidence-safely) and the
|
|
154
|
+
[open detector issue](https://github.com/danielgwilson/humanish/issues/108)), so
|
|
158
155
|
`share_ready` means the automated secret/path scan passed, not that a human would
|
|
159
156
|
publish every pixel. Maintainers should treat open mode accordingly: synthetic
|
|
160
157
|
data upstream, review before exposing, and treat `--safe` without edge auth as
|
|
@@ -173,13 +170,13 @@ any mutating route ships, the contract is:
|
|
|
173
170
|
- an operator identity distinct from a viewer, sourced from the edge/control
|
|
174
171
|
plane, not from a humanish-minted cookie;
|
|
175
172
|
- mutating routes require CSRF defenses appropriate to the chosen edge session;
|
|
176
|
-
- the spend rule
|
|
173
|
+
- the live-spend rule applies to remote hands too: a phone-initiated live
|
|
177
174
|
run needs its own affirmative declaration at serve startup (an explicit opt-in
|
|
178
|
-
naming the
|
|
175
|
+
naming the study and budget), never a default the viewer UI can reach.
|
|
179
176
|
|
|
180
177
|
## Why not Better Auth here
|
|
181
178
|
|
|
182
|
-
Better Auth is a strong TypeScript auth framework, but it is deliberately
|
|
179
|
+
Better Auth is a strong TypeScript auth framework, but it is deliberately not
|
|
183
180
|
used for this CLI serve surface: serve is an ephemeral, no-database,
|
|
184
181
|
per-invocation loopback server whose only job is to hand persisted evidence to an
|
|
185
182
|
already-authenticated edge. A password/session/social-login framework with a
|
|
@@ -193,6 +190,6 @@ where accounts, org membership, and durable sessions actually exist.
|
|
|
193
190
|
- **Traffic Policy for ngrok.** Migrate off the deprecated `--oauth*` flags to a
|
|
194
191
|
generated Traffic Policy YAML once ngrok requires it (the `yaml` dep is already
|
|
195
192
|
available); pin the behavior in `tests/observer/tunnel.test.ts` first.
|
|
196
|
-
- **Shipped in 0.18.0: `watch --expose`.** Remote
|
|
193
|
+
- **Shipped in 0.18.0: `watch --expose`.** Remote live following of a run,
|
|
197
194
|
including its live E2B desktop stream, behind the same edge auth. It is the one
|
|
198
195
|
surface that deliberately serves runtime stream URLs. See observer.md.
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
# State-driven executor (the `
|
|
1
|
+
# State-driven executor (the `ComputerUseExecutor` port)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
non-vision provider, driven through the lab with NO E2B and NO vision) is
|
|
7
|
-
implemented and proven. A config-only deterministic route and a
|
|
8
|
-
`subject.contract.ref` JS-module loader are deferred (see "Deferred", below).
|
|
3
|
+
The library path ships: a custom executor and a non-vision provider, driven through a study with
|
|
4
|
+
no E2B desktop and no vision model. A config-only deterministic route and a `subject.contract.ref`
|
|
5
|
+
module loader are not built (see Not built, below).
|
|
9
6
|
|
|
10
7
|
## What this is
|
|
11
8
|
|
|
12
9
|
The computer-use (CUA) loop in
|
|
13
10
|
[`src/actors/computer-use/loop.ts`](https://github.com/danielgwilson/humanish/blob/main/src/actors/computer-use/loop.ts) is provider- and
|
|
14
|
-
substrate-agnostic by design: the model lives behind a `
|
|
15
|
-
being driven lives behind a `
|
|
11
|
+
substrate-agnostic by design: the model lives behind a `ComputerUseProvider` port and the thing
|
|
12
|
+
being driven lives behind a `ComputerUseExecutor` port. Both ports are declared in
|
|
16
13
|
`src/actors/computer-use/loop/types.ts`. You do not have to drive a screen with a vision
|
|
17
14
|
model. You can point the loop at **an already-running local app** and drive it through that
|
|
18
15
|
app's **in-process JavaScript automation contract** (e.g. `window.app.getState()`,
|
|
@@ -27,12 +24,12 @@ This is the "plural harnesses / transport-agnostic" intent of
|
|
|
27
24
|
## The port
|
|
28
25
|
|
|
29
26
|
```ts
|
|
30
|
-
interface
|
|
31
|
-
observe(): Promise<
|
|
32
|
-
execute(action:
|
|
27
|
+
interface ComputerUseExecutor {
|
|
28
|
+
observe(): Promise<ComputerUseObservation>; // capture current state
|
|
29
|
+
execute(action: ComputerUseAction, signal?: AbortSignal): Promise<void>; // perform one action
|
|
33
30
|
}
|
|
34
31
|
|
|
35
|
-
interface
|
|
32
|
+
interface ComputerUseObservation {
|
|
36
33
|
screenshot?: Buffer; // OPTIONAL — a state executor omits it
|
|
37
34
|
stateSignature: string; // REQUIRED — the fallback progress key
|
|
38
35
|
appState?: Record<string, unknown>; // structured state; preferred for progress
|
|
@@ -71,9 +68,9 @@ graphically dense (pixel-art) UI. `stableProgressKey(appState)`:
|
|
|
71
68
|
- sorts object keys, so key order never counts as progress;
|
|
72
69
|
- caps depth, key count, array length, string length, and total output;
|
|
73
70
|
- never throws on a cyclic or huge `appState`; it degrades to a bounded value
|
|
74
|
-
(cycles become `"[Circular]"`, over-cap nodes become markers).
|
|
75
|
-
correctness
|
|
76
|
-
|
|
71
|
+
(cycles become `"[Circular]"`, over-cap nodes become markers). The loop's
|
|
72
|
+
correctness depends on this: a hostile or merely large state blob cannot crash
|
|
73
|
+
it.
|
|
77
74
|
|
|
78
75
|
## A single desktop command failure is a recoverable skipped action
|
|
79
76
|
|
|
@@ -102,7 +99,7 @@ skipped: desktop command failed`, text = the public-safe action label + exit cod
|
|
|
102
99
|
and any genuine non-`CommandExitError` adapter fault as `actor_error`.
|
|
103
100
|
- **No infinite loop.** A skipped action changes nothing on screen, so it is not
|
|
104
101
|
progress. A run that keeps failing every action makes no progress and still
|
|
105
|
-
terminates
|
|
102
|
+
terminates through the existing idle / no-progress backstop
|
|
106
103
|
(`gave_up`). The resilience only converts a _single flaky command_ from fatal
|
|
107
104
|
to survivable; it never masks a genuinely stuck run.
|
|
108
105
|
|
|
@@ -112,7 +109,7 @@ whitespace-collapsed) and a numeric exit code, and is still run through the loop
|
|
|
112
109
|
values, and machine paths never appear. The action label comes from
|
|
113
110
|
`describeCuaAction`, which never includes typed text.
|
|
114
111
|
|
|
115
|
-
## You need a
|
|
112
|
+
## You need a non-vision provider too
|
|
116
113
|
|
|
117
114
|
Swapping the executor is not enough. The default OpenAI computer-use provider is
|
|
118
115
|
**vision-based**: it sends the screenshot as the `computer_call_output`, so a
|
|
@@ -122,7 +119,7 @@ reasons over app state).
|
|
|
122
119
|
|
|
123
120
|
**Provider-authoring contract:**
|
|
124
121
|
|
|
125
|
-
- A **vision** provider
|
|
122
|
+
- A **vision** provider must set `requiresFrame: true` (the OpenAI provider does). When a
|
|
126
123
|
`requiresFrame: true` provider is handed a screenshot-less observation, the loop ends the
|
|
127
124
|
session with a structured `harness_error` (`missingFrame` in
|
|
128
125
|
`src/actors/computer-use/loop/ending.ts`). It neither crashes silently nor passes falsely.
|
|
@@ -131,10 +128,10 @@ reasons over app state).
|
|
|
131
128
|
|
|
132
129
|
`requiresFrame` defaulting to falsey is a known third-party-author footgun (a vision
|
|
133
130
|
provider that forgets to set it would get a blank-frame crash instead of a clean verdict).
|
|
134
|
-
|
|
131
|
+
The loop accepts it because every in-tree vision provider sets it: OpenAI computer use,
|
|
135
132
|
the local-agent Codex and Claude sessions, and the restricted Codex participant.
|
|
136
133
|
|
|
137
|
-
## `appState` is
|
|
134
|
+
## `appState` is runtime-only
|
|
138
135
|
|
|
139
136
|
`appState` is an in-memory progress-comparison input, exactly like
|
|
140
137
|
`stateSignature` (which is itself never written as text). It is **never** copied
|
|
@@ -144,35 +141,35 @@ trace. Only the derived progress key is computed in-memory and discarded.
|
|
|
144
141
|
Why: the published-evidence scan catches only secret-_shaped_ patterns. A
|
|
145
142
|
structured app blob (ids, free-form state, possibly user chat or shapeless
|
|
146
143
|
tokens) is exactly the "value has no shape" gap that pattern redaction cannot
|
|
147
|
-
close. So
|
|
144
|
+
close. So `appState` is not an evidence surface at all.
|
|
148
145
|
|
|
149
|
-
The bundle
|
|
146
|
+
The bundle says so: when a state executor
|
|
150
147
|
surfaces `appState`, the trace's `redaction.notes` declares that app state was
|
|
151
|
-
observed each turn to drive progress detection and was
|
|
148
|
+
observed each turn to drive progress detection and was not written to the trace.
|
|
152
149
|
|
|
153
|
-
A future
|
|
154
|
-
`redaction.redactText` (and the
|
|
150
|
+
A future change that puts `appState` in evidence must route a stringified projection through
|
|
151
|
+
`redaction.redactText` (and the study's `scrubText`) and cap / whitelist fields
|
|
155
152
|
before persisting. Pattern + literal redaction alone cannot sanitize an
|
|
156
153
|
arbitrary blob.
|
|
157
154
|
|
|
158
|
-
## Provenance is
|
|
155
|
+
## Provenance is declared unpinned
|
|
159
156
|
|
|
160
157
|
An already-running local dev server cannot be commit-pinned. The bundle does not
|
|
161
158
|
silently omit a subject block. It declares the absence: `subject.source:
|
|
162
159
|
app-url` with `state.provenance: "undeclared"` (the app-url "absence declared"
|
|
163
160
|
marker), and a `cua-lab.subject.declared` event that states the entry is a local
|
|
164
|
-
dev server driven in-process, caller-provisioned and
|
|
161
|
+
dev server driven in-process, caller-provisioned and unpinned, with no E2B
|
|
165
162
|
desktop created.
|
|
166
163
|
|
|
167
164
|
## Two entry points
|
|
168
165
|
|
|
169
166
|
### 1. Bare `runComputerUseLoop` (lowest level)
|
|
170
167
|
|
|
171
|
-
Implement `
|
|
172
|
-
from your own state, pair it with a non-vision `
|
|
168
|
+
Implement `ComputerUseExecutor.observe()/execute()`, derive `stateSignature`/`appState`
|
|
169
|
+
from your own state, pair it with a non-vision `ComputerUseProvider`, and call
|
|
173
170
|
`runComputerUseLoop`. You own the bundle/redaction wiring.
|
|
174
171
|
|
|
175
|
-
### 2. `
|
|
172
|
+
### 2. `runStudy` + `inProcess` / `createProvider` (keeps the composition)
|
|
176
173
|
|
|
177
174
|
The supported library path keeps personas, the Observer, the evidence bundle,
|
|
178
175
|
redaction, and the friction loop, while skipping E2B entirely. Start with the
|
|
@@ -185,47 +182,47 @@ node node_modules/humanish/examples/participant/run.mjs
|
|
|
185
182
|
```
|
|
186
183
|
|
|
187
184
|
The example includes a real loopback app, HTTP state/action bridge, full config
|
|
188
|
-
object (`schema:
|
|
189
|
-
`stableProgressKey`, `
|
|
185
|
+
object (`schema: STUDY_SCHEMA`), deterministic non-vision provider,
|
|
186
|
+
`stableProgressKey`, `runStudy`, verification, a printed report and `finally`
|
|
190
187
|
cleanup. It makes no model calls and does not demonstrate persona efficacy.
|
|
191
|
-
`
|
|
192
|
-
on `.ok`, then narrow `
|
|
193
|
-
the
|
|
194
|
-
|
|
188
|
+
`parseStudy` accepts a decoded object, not a YAML string; narrow its result
|
|
189
|
+
on `.ok`, then narrow `runStudy`'s result on `route === "computer-use"` before
|
|
190
|
+
reading the computer-use result. The example defines all helpers, so a consumer does not
|
|
191
|
+
reconstruct them.
|
|
195
192
|
|
|
196
|
-
Pass `inProcess: { executor }` and `createProvider` in `
|
|
193
|
+
Pass `inProcess: { executor }` and `createProvider` in `RunStudyOptions`. The type requires
|
|
197
194
|
`createProvider` beside `inProcess`: a state executor returns no frame, so it needs a non-vision
|
|
198
|
-
provider. With `inProcess` set, the computer-use route takes a branch that
|
|
195
|
+
provider. With `inProcess` set, the computer-use route takes a branch that never
|
|
199
196
|
loads the E2B module, creates a sandbox, runs `prepareDesktop`, provisions a
|
|
200
197
|
clone, opens a browser, or starts a stream. `sandboxId`/`streamUrl` stay
|
|
201
198
|
undefined, so `result.sandbox` is omitted. That omission is the verifiable
|
|
202
199
|
"no E2B SDK call" proof.
|
|
203
200
|
|
|
204
|
-
Fail-closed guards, all
|
|
205
|
-
`
|
|
201
|
+
Fail-closed guards, all before any key check, so a CLI invocation never sees a misleading
|
|
202
|
+
`HUMANISH_COMPUTER_USE_KEYS_MISSING` first:
|
|
206
203
|
|
|
207
|
-
- `
|
|
204
|
+
- `HUMANISH_STUDY_OPTION_UNSUPPORTED`: `inProcess` without `createProvider` (from JavaScript,
|
|
208
205
|
where the type does not stop it), or on a subject other than `app-url` or `local-app`.
|
|
209
206
|
`createProvider` alone is allowed; that is a model swap on the normal E2B route.
|
|
210
|
-
- `
|
|
207
|
+
- `HUMANISH_COMPUTER_USE_FANOUT_INVALID`: `inProcess` with more than one participant. The planner refuses it, because fan-out gives each participant
|
|
211
208
|
its own E2B desktop and the in-process route has none.
|
|
212
|
-
- `
|
|
209
|
+
- `HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR`: a `subject.source: local-app` config run
|
|
213
210
|
without `inProcess` (there is no built-in in-process driver yet). A structured error,
|
|
214
211
|
never a desktop attempt.
|
|
215
|
-
- `
|
|
216
|
-
and no local desktop. `
|
|
217
|
-
call or an in-process executor on the same
|
|
218
|
-
- `
|
|
219
|
-
provider hook. A package caller gets `
|
|
212
|
+
- `HUMANISH_COMPUTER_USE_LOCAL_DESKTOP_MISSING`: an `app-url` study with `execution.target: local`
|
|
213
|
+
and no local desktop. `runStudy` gives a local browser study its desktop; a direct route
|
|
214
|
+
call or an in-process executor on the same study has none.
|
|
215
|
+
- `HUMANISH_COMPUTER_USE_EXECUTOR_NO_PROVIDER`: the route's internal executor hook without its
|
|
216
|
+
provider hook. A package caller gets `HUMANISH_STUDY_OPTION_UNSUPPORTED` above instead.
|
|
220
217
|
|
|
221
|
-
Key gating is route-aware: the in-process route uses the caller's
|
|
218
|
+
Key gating is route-aware: the in-process route uses the caller's own model and
|
|
222
219
|
executor, so no `OPENAI_API_KEY`/`E2B_API_KEY` is required.
|
|
223
220
|
|
|
224
221
|
## A note on `appState` typing
|
|
225
222
|
|
|
226
|
-
`
|
|
223
|
+
`ComputerUseObservation.appState` is `Record<string, unknown> | undefined` under the
|
|
227
224
|
repo's strict flags (`exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`).
|
|
228
|
-
A value typed as an `interface` does
|
|
225
|
+
A value typed as an `interface` does not satisfy `Record<string, unknown>`
|
|
229
226
|
(interfaces have no implicit index signature), and a direct `as Record<...>` cast
|
|
230
227
|
on an interface-typed value is rejected. Use one of:
|
|
231
228
|
|
|
@@ -236,15 +233,15 @@ on an interface-typed value is rejected. Use one of:
|
|
|
236
233
|
Read every optional field defensively, and spread-omit optional fields
|
|
237
234
|
(`...(x === undefined ? {} : { x })`) rather than assigning `undefined`.
|
|
238
235
|
|
|
239
|
-
##
|
|
236
|
+
## Not built
|
|
240
237
|
|
|
241
|
-
- **
|
|
238
|
+
- **A config-only deterministic `state-contract` route.** A registered,
|
|
242
239
|
model-free route driving a built-in `window.app.*` bridge over the existing
|
|
243
|
-
`ScriptedPageLike.evaluate` primitive + a YAML step program, `
|
|
244
|
-
|
|
240
|
+
`ScriptedPageLike.evaluate` primitive + a YAML step program, `mode: live`
|
|
241
|
+
gating actuation. It would be deterministic step replay, not
|
|
245
242
|
`runComputerUseLoop`, and must not overclaim friction-loop reuse.
|
|
246
|
-
- **
|
|
247
|
-
loaded and run in-process with full harness privileges is a genuinely
|
|
243
|
+
- **A `subject.contract.ref` JS-module loader.** A config-referenced module
|
|
244
|
+
loaded and run in-process with full harness privileges is a genuinely new trust
|
|
248
245
|
surface with no precedent in this repo (the scripted route loads only declarative
|
|
249
246
|
YAML; serve commands run isolated inside the disposable E2B sandbox). It earns
|
|
250
247
|
its place only behind its own clamping / trust / digest-pinning design.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Task protocol support
|
|
2
2
|
|
|
3
|
-
`
|
|
3
|
+
`actor.tasks` adds a participant protocol to the mission. Goals reach the
|
|
4
4
|
participant; hidden success criteria go only to the observation tracker. A route
|
|
5
5
|
that cannot carry both halves refuses the declaration before execution. Removing
|
|
6
6
|
`tasks` is an explicit choice to run a mission-only study, not an automatic fallback.
|
|
@@ -14,7 +14,7 @@ that cannot carry both halves refuses the declaration before execution. Removing
|
|
|
14
14
|
| Shared-world, provisioned or external-public | Rejected | Actor specs omit the protocol before CUA session dispatch |
|
|
15
15
|
| Terminal-product | Rejected | Terminal prompt and result contract do not implement tasks |
|
|
16
16
|
| Scripted-browser, local or provisioned | Rejected | Scenario steps drive the participant; no task protocol is consumed |
|
|
17
|
-
| Synthetic (`this-repo`) | Rejected |
|
|
17
|
+
| Synthetic (`this-repo`) | Rejected | Study dispatch does not pass task declarations to the dry-run engine |
|
|
18
18
|
| Any second or later `actors[]` entry | Rejected | Current runners consume only the first actor; declare every participant under the first actor |
|
|
19
19
|
|
|
20
20
|
Both registered CUA actors (`openai-computer-use` and `local-agent`) share the CUA
|
|
@@ -22,12 +22,12 @@ session loop. Their task support does not depend on which provider chooses actio
|
|
|
22
22
|
Custom session hooks remain caller-owned implementations of that same contract;
|
|
23
23
|
this preflight does not certify arbitrary hook behavior.
|
|
24
24
|
|
|
25
|
-
The parser reports `
|
|
26
|
-
reports `
|
|
25
|
+
The parser reports `HUMANISH_STUDY_INVALID` with the unsupported field path. `runStudy`
|
|
26
|
+
reports `HUMANISH_STUDY_TASKS_UNSUPPORTED` in the route's failure envelope, from
|
|
27
27
|
`planLab` (`src/lab/plan.ts`) and each route's plan.
|
|
28
28
|
Refusal precedes run storage, source preparation, user hooks, local processes,
|
|
29
29
|
sandbox allocation, and model calls. No task content appears in the error.
|
|
30
30
|
|
|
31
31
|
A future route gains support only after proving participant goals, hidden criteria,
|
|
32
|
-
observation-backed completion,
|
|
32
|
+
observation-backed completion, explicit missing-input handling, and per-participant
|
|
33
33
|
bundle evidence together. Appending goals to a prompt alone is insufficient.
|