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,32 +4,32 @@ import type { TaskFunnel } from "../lab/tasks.js";
|
|
|
4
4
|
import { type CuaProviderFailurePhase } from "./computer-use/provider-error.js";
|
|
5
5
|
export declare const ACTOR_TRACE_SCHEMA = "humanish.actor-trace.v1";
|
|
6
6
|
/**
|
|
7
|
-
* How a session ended, from the point of view of the
|
|
7
|
+
* How a session ended, from the point of view of the study rather than the harness.
|
|
8
8
|
*
|
|
9
9
|
* The distinction matters because two of these are participant outcomes and the rest are not. A
|
|
10
10
|
* participant who abandons a task is the single most valuable thing a usability study produces, and
|
|
11
|
-
* recording that as `failed`
|
|
11
|
+
* recording that as `failed` reads as the instrument breaking. See
|
|
12
12
|
* docs/principles/three-roles.md.
|
|
13
13
|
*
|
|
14
14
|
* - `passed` the participant reached the goal
|
|
15
|
-
* - `abandoned` the participant stopped trying. A
|
|
15
|
+
* - `abandoned` the participant stopped trying. A finding, not a malfunction
|
|
16
16
|
* - `incomplete` the session ended (time or budget) before the goal was reached
|
|
17
17
|
* - `blocked` the participant could not proceed: an approval the run could not give, or a
|
|
18
|
-
* blocker they described in their own final words
|
|
18
|
+
* blocker they described in their own final words
|
|
19
19
|
* - `timed_out` the session hit its deadline with no productive activity at all
|
|
20
|
-
* - `failed` the
|
|
20
|
+
* - `failed` the harness failed: a dead sandbox, a provider error, a broken artifact
|
|
21
21
|
*/
|
|
22
22
|
export declare const ACTOR_STATUSES: readonly ["passed", "abandoned", "incomplete", "blocked", "timed_out", "failed"];
|
|
23
23
|
export type ActorStatus = (typeof ACTOR_STATUSES)[number];
|
|
24
24
|
/**
|
|
25
|
-
* What the
|
|
25
|
+
* What the participant said happened, in a field rather than a paragraph. Providers whose
|
|
26
26
|
* reply is schema-constrained (the local-agent routes) fill it on their final turn; a free-text
|
|
27
27
|
* provider leaves it absent and the route falls back to reading the closing message. `reached`:
|
|
28
28
|
* the task is finished. `blocked`: something in the app stopped the participant. `not_reached`:
|
|
29
29
|
* the participant stopped for another reason (gave up, ran out of ideas).
|
|
30
30
|
*/
|
|
31
31
|
export type ParticipantDeclaredOutcome = "reached" | "not_reached" | "blocked";
|
|
32
|
-
/** Statuses that describe what happened to a
|
|
32
|
+
/** Statuses that describe what happened to a participant rather than a harness malfunction. Verify
|
|
33
33
|
* treats these as study results, so a run whose evidence is sound is not called untrustworthy just
|
|
34
34
|
* because a persona gave up. */
|
|
35
35
|
export declare const PARTICIPANT_OUTCOME_STATUSES: readonly ActorStatus[];
|
|
@@ -62,11 +62,11 @@ export interface ActorTraceItem {
|
|
|
62
62
|
redaction: "blurred" | "ocr_scrubbed" | "none";
|
|
63
63
|
};
|
|
64
64
|
text?: string;
|
|
65
|
-
/** When the item was recorded (ISO-8601), from the loop's injected clock. Additive
|
|
66
|
-
*
|
|
65
|
+
/** When the item was recorded (ISO-8601), from the loop's injected clock. Additive:
|
|
66
|
+
* items from older bundles and non-stamping producers lack it, so every
|
|
67
67
|
* consumer must treat absence as "timing unknown", never as t=0. */
|
|
68
68
|
at?: string;
|
|
69
|
-
/** Structured pointer coordinates for click-like `ui_action` items
|
|
69
|
+
/** Structured pointer coordinates for click-like `ui_action` items: the
|
|
70
70
|
* recorded fact the Observer's pins previously re-parsed out of the title text. */
|
|
71
71
|
coord?: {
|
|
72
72
|
x: number;
|
|
@@ -83,13 +83,13 @@ export interface ActorCapabilities {
|
|
|
83
83
|
inProcessTools: boolean;
|
|
84
84
|
license: "open" | "source-available" | "proprietary";
|
|
85
85
|
/**
|
|
86
|
-
*
|
|
87
|
-
* "keys live where the keyed process runs
|
|
88
|
-
* enforces,
|
|
86
|
+
* Where this actor's runtime key lives, per the placement rule (invariants-and-defaults.md):
|
|
87
|
+
* "keys live where the keyed process runs, and nowhere else." Registry metadata the engine
|
|
88
|
+
* enforces, not a code convention.
|
|
89
89
|
* - "external" (the implicit default for every existing actor): the keyed process (e.g. a
|
|
90
|
-
* computer-use provider loop) runs
|
|
90
|
+
* computer-use provider loop) runs outside any sandbox, so its key never enters one.
|
|
91
91
|
* - "in-sandbox-command-scoped": the keyed process is an agent-harness-under-test that runs
|
|
92
|
-
*
|
|
92
|
+
* inside the sandbox; its runtime key is injected only into the per-command `envs` of that
|
|
93
93
|
* invocation (never `Sandbox.create({envs})`, which is sandbox-global), the key is presumed
|
|
94
94
|
* exfiltratable, and the blast radius is bounded by key scoping + a spend budget.
|
|
95
95
|
* Absent === "external". On the shipped terminal-product live route, the engine enforces this
|
|
@@ -115,18 +115,18 @@ export interface ActorPersonaRef {
|
|
|
115
115
|
export interface ActorTokenUsage {
|
|
116
116
|
input?: number;
|
|
117
117
|
output?: number;
|
|
118
|
-
/** Of `input`, how many tokens were served from the provider's prompt cache. Optional
|
|
119
|
-
*
|
|
120
|
-
* reporting 0, because 0 and "unknown" price very differently
|
|
118
|
+
/** Of `input`, how many tokens were served from the provider's prompt cache. Optional. A
|
|
119
|
+
* provider that does not report it leaves this undefined rather than
|
|
120
|
+
* reporting 0, because 0 and "unknown" price very differently. */
|
|
121
121
|
cachedInput?: number;
|
|
122
|
-
/** Of `input`, how many tokens were newly
|
|
122
|
+
/** Of `input`, how many tokens were newly written to the provider's prompt cache
|
|
123
123
|
* (OpenAI 5.6+ bills these at a surcharge and reports `cache_write_tokens`). Same
|
|
124
|
-
*
|
|
124
|
+
* absent-when-unreported rule as `cachedInput`. */
|
|
125
125
|
cacheWriteInput?: number;
|
|
126
126
|
/** Per model-inference request usage, in request order. One provider interaction can contain
|
|
127
127
|
* several inferences around native tool calls. A provider that re-prices whole requests past
|
|
128
128
|
* an input-size threshold can only be priced exactly from these sizes; totals cannot say which
|
|
129
|
-
* requests crossed. Additive and
|
|
129
|
+
* requests crossed. Additive, and absent on producers that do not record it. */
|
|
130
130
|
turns?: Array<{
|
|
131
131
|
input?: number;
|
|
132
132
|
cachedInput?: number;
|
|
@@ -137,12 +137,13 @@ export interface ActorTokenUsage {
|
|
|
137
137
|
costUsd?: number;
|
|
138
138
|
}
|
|
139
139
|
/**
|
|
140
|
-
* Codex CLI
|
|
141
|
-
*
|
|
140
|
+
* The oldest Codex CLI release a recorded account profile may name. Readers accept every stable
|
|
141
|
+
* `MAJOR.MINOR.PATCH` release from it on, so a saved bundle stays readable whichever release
|
|
142
|
+
* recorded it; launch admission (codex/codex-admission.ts) alone decides what runs.
|
|
142
143
|
*/
|
|
143
|
-
export declare const
|
|
144
|
-
|
|
145
|
-
export declare function isRecordedCodexCliVersion(value: unknown): value is
|
|
144
|
+
export declare const RECORDED_CODEX_CLI_FLOOR = "0.154.0";
|
|
145
|
+
/** A stable release at or above the floor. Parts compare as digit strings, exact at any length. */
|
|
146
|
+
export declare function isRecordedCodexCliVersion(value: unknown): value is string;
|
|
146
147
|
/** Requested execution profile; per-request verification is recorded separately. */
|
|
147
148
|
export interface ActorExecutionProfile {
|
|
148
149
|
schema: "humanish.actor-execution-profile.v1";
|
|
@@ -151,7 +152,8 @@ export interface ActorExecutionProfile {
|
|
|
151
152
|
billing: "account-unknown";
|
|
152
153
|
requestedModel: string;
|
|
153
154
|
reasoningEffort: import("./reasoning-effort.js").ReasoningEffort;
|
|
154
|
-
|
|
155
|
+
/** A stable release at or above RECORDED_CODEX_CLI_FLOOR. */
|
|
156
|
+
cliVersion: string;
|
|
155
157
|
toolPolicy: "restricted-codex-v1" | "codex-ui-tools-v1";
|
|
156
158
|
participantSchema: "humanish.restricted-participant-turn.v1" | "humanish.codex-ui-tool.v1";
|
|
157
159
|
memoryPolicy: "recent-eight-16k-v1" | "continuing-thread-v1";
|
|
@@ -200,6 +202,37 @@ export interface ActorRuntimeProvenance {
|
|
|
200
202
|
/** Codex turn.completed aggregates requests; it cannot establish per-request pricing tiers. */
|
|
201
203
|
usageGranularity: "runtime_turn";
|
|
202
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* How a provider carried the conversation between its requests. `threaded`: the provider's server
|
|
207
|
+
* kept it (OpenAI previous_response_id). `explicit_context`: the server kept none (a
|
|
208
|
+
* zero-data-retention org, or zeroDataRetention set), so each request carried it from the client
|
|
209
|
+
* within a token budget, with the oldest turns summarized as text once it passed the budget.
|
|
210
|
+
*/
|
|
211
|
+
export interface ActorConversation {
|
|
212
|
+
/** The mode of the session's last request. */
|
|
213
|
+
mode: "threaded" | "explicit_context";
|
|
214
|
+
/** Why the session used explicit_context: configured, or the org rejected server-side state. */
|
|
215
|
+
explicitReason?: "configured" | "zdr_rejection";
|
|
216
|
+
/** When a threaded session switched to explicit_context (ISO-8601), and on which request. */
|
|
217
|
+
switchedAt?: string;
|
|
218
|
+
switchedAtRequest?: number;
|
|
219
|
+
/**
|
|
220
|
+
* Earlier turns the latest explicit_context request no longer carried whole, to stay within the
|
|
221
|
+
* budget: written as lines of a text note, or only counted once the note reached its cap. Their
|
|
222
|
+
* screenshots were dropped. 0 when no explicit_context request summarized any.
|
|
223
|
+
*/
|
|
224
|
+
summarizedTurns: number;
|
|
225
|
+
/**
|
|
226
|
+
* Per participant request, in order: its mode and, in explicit_context, what it carried and its
|
|
227
|
+
* estimated input. `tokenUsage.turns` has each request's billed input.
|
|
228
|
+
*/
|
|
229
|
+
requests: Array<{
|
|
230
|
+
mode: "threaded" | "explicit_context";
|
|
231
|
+
carriedExchanges?: number;
|
|
232
|
+
carriedScreenshots?: number;
|
|
233
|
+
estimatedInputTokens?: number;
|
|
234
|
+
}>;
|
|
235
|
+
}
|
|
203
236
|
export interface ActorTrace {
|
|
204
237
|
schema: typeof ACTOR_TRACE_SCHEMA;
|
|
205
238
|
provider: string;
|
|
@@ -207,6 +240,8 @@ export interface ActorTrace {
|
|
|
207
240
|
executionProfile?: ActorExecutionProfile;
|
|
208
241
|
providerRequests?: ActorProviderRequest[];
|
|
209
242
|
historyTurnsOmitted?: number;
|
|
243
|
+
/** How the provider carried the conversation; present for the OpenAI computer-use provider. */
|
|
244
|
+
conversation?: ActorConversation;
|
|
210
245
|
runtime?: ActorRuntimeProvenance;
|
|
211
246
|
protocol: ActorProtocol;
|
|
212
247
|
lane: ActorRunKind;
|
|
@@ -231,15 +266,15 @@ export interface ActorTrace {
|
|
|
231
266
|
model?: string;
|
|
232
267
|
};
|
|
233
268
|
/**
|
|
234
|
-
*
|
|
235
|
-
*
|
|
269
|
+
* Additive + optional record of how the model was asked to run (humanish.model-settings.v1).
|
|
270
|
+
* `ids.model` says which model; this says the reasoning effort the request actually
|
|
236
271
|
* carried. Present on traces whose provider declares settings; absent everywhere else and on
|
|
237
272
|
* every pre-existing bundle, and its absence is tolerated by verify.
|
|
238
273
|
*
|
|
239
274
|
* It exists because effort was a silent constant: unreachable from a lab, so every run took the
|
|
240
|
-
* provider default. Effort is part of
|
|
275
|
+
* provider default. Effort is part of who the participant was, not of how the instrument was
|
|
241
276
|
* tuned (docs/principles/actor-fidelity.md), so a trace that does not carry it is a result with
|
|
242
|
-
* half its sample description missing
|
|
277
|
+
* half its sample description missing, and two such traces cannot be compared.
|
|
243
278
|
*/
|
|
244
279
|
modelSettings?: {
|
|
245
280
|
reasoningEffort: string;
|
|
@@ -247,29 +282,29 @@ export interface ActorTrace {
|
|
|
247
282
|
};
|
|
248
283
|
counts: Record<string, number>;
|
|
249
284
|
/**
|
|
250
|
-
*
|
|
251
|
-
* this actor took
|
|
252
|
-
* browser-internal, observation
|
|
285
|
+
* Additive + optional affordance record (humanish.affordance-use.v1): which kind of route
|
|
286
|
+
* this actor took (pointer, keyboard, url-navigation, script-execution, devtools,
|
|
287
|
+
* browser-internal, observation), as per-class counts over the run's dispatched actions.
|
|
253
288
|
* Present on computer-use traces that dispatched at least one action; absent elsewhere and on
|
|
254
289
|
* every pre-existing bundle (its absence is tolerated by verify). The harness records the class
|
|
255
|
-
* and states
|
|
290
|
+
* and states no verdict: whether a class is faithful depends on the population the study
|
|
256
291
|
* declares, which is product semantics and belongs to the adopter's scorer. See
|
|
257
292
|
* docs/principles/actor-fidelity.md.
|
|
258
293
|
*/
|
|
259
294
|
affordanceUse?: AffordanceUse;
|
|
260
295
|
/**
|
|
261
|
-
*
|
|
296
|
+
* Additive + optional task funnel (humanish.task-funnel.v1): how far this participant got
|
|
262
297
|
* through the lab's declared protocol, corroborated per task by observations rather than by the
|
|
263
298
|
* actor's own narration. Present only when the lab declared `tasks` and the session ran; absent
|
|
264
|
-
* on every pre-existing bundle and on dry-run contract bundles (
|
|
299
|
+
* on every pre-existing bundle and on dry-run contract bundles (a funnel that
|
|
265
300
|
* was never measured is not an empty funnel). Its absence is tolerated by verify.
|
|
266
301
|
*/
|
|
267
302
|
taskFunnel?: TaskFunnel;
|
|
268
303
|
/**
|
|
269
|
-
*
|
|
304
|
+
* Additive + optional: the outcome the participant declared on its final turn, when its
|
|
270
305
|
* provider's reply carries the field. Absent on free-text providers and on every older bundle.
|
|
271
306
|
* The route reads this before it reads the closing paragraph; three regex patches in one month
|
|
272
|
-
*
|
|
307
|
+
* each fixed a false refusal and each left the next shape unhandled.
|
|
273
308
|
*/
|
|
274
309
|
declaredOutcome?: ParticipantDeclaredOutcome;
|
|
275
310
|
/** Closing report after a harness-owned stop. Does not change task outcomes or permit actions. */
|
|
@@ -289,13 +324,13 @@ export interface ActorTrace {
|
|
|
289
324
|
* Known tokenUsage remains usable as a partial total. Absence is not proof of completeness. */
|
|
290
325
|
interactionUsageIncomplete?: true;
|
|
291
326
|
/**
|
|
292
|
-
*
|
|
293
|
-
* Distinct from `tokenUsage.costUsd`, which is
|
|
327
|
+
* Additive + optional token-derived cost estimate for this trace (humanish.actor-estimated-cost.v1).
|
|
328
|
+
* Distinct from `tokenUsage.costUsd`, which is reserved for a real provider-returned charge: a
|
|
294
329
|
* bare `costUsd` always means "the provider billed this", while `estimatedCost.estimatedCostUsd`
|
|
295
|
-
* is a rate-table multiply named
|
|
330
|
+
* is a rate-table multiply named as an estimate, so the claim matches the mechanism. Absent on the Codex
|
|
296
331
|
* app-server and scripted traces and on every pre-existing bundle; the terminal trace records a
|
|
297
332
|
* null estimate. Its absence is tolerated by verify (fail-open on display). A `null`
|
|
298
|
-
* estimatedCostUsd is
|
|
333
|
+
* estimatedCostUsd is declared absent (unknown rate / no usage), never 0.
|
|
299
334
|
*/
|
|
300
335
|
estimatedCost?: ActorEstimatedCost;
|
|
301
336
|
capabilities: ActorCapabilities;
|
package/dist/actors/contract.js
CHANGED
|
@@ -10,20 +10,20 @@ import { isCuaProviderFailurePhase, } from "./computer-use/provider-error.js";
|
|
|
10
10
|
// their own modules.
|
|
11
11
|
export const ACTOR_TRACE_SCHEMA = "humanish.actor-trace.v1";
|
|
12
12
|
/**
|
|
13
|
-
* How a session ended, from the point of view of the
|
|
13
|
+
* How a session ended, from the point of view of the study rather than the harness.
|
|
14
14
|
*
|
|
15
15
|
* The distinction matters because two of these are participant outcomes and the rest are not. A
|
|
16
16
|
* participant who abandons a task is the single most valuable thing a usability study produces, and
|
|
17
|
-
* recording that as `failed`
|
|
17
|
+
* recording that as `failed` reads as the instrument breaking. See
|
|
18
18
|
* docs/principles/three-roles.md.
|
|
19
19
|
*
|
|
20
20
|
* - `passed` the participant reached the goal
|
|
21
|
-
* - `abandoned` the participant stopped trying. A
|
|
21
|
+
* - `abandoned` the participant stopped trying. A finding, not a malfunction
|
|
22
22
|
* - `incomplete` the session ended (time or budget) before the goal was reached
|
|
23
23
|
* - `blocked` the participant could not proceed: an approval the run could not give, or a
|
|
24
|
-
* blocker they described in their own final words
|
|
24
|
+
* blocker they described in their own final words
|
|
25
25
|
* - `timed_out` the session hit its deadline with no productive activity at all
|
|
26
|
-
* - `failed` the
|
|
26
|
+
* - `failed` the harness failed: a dead sandbox, a provider error, a broken artifact
|
|
27
27
|
*/
|
|
28
28
|
export const ACTOR_STATUSES = [
|
|
29
29
|
"passed",
|
|
@@ -33,7 +33,7 @@ export const ACTOR_STATUSES = [
|
|
|
33
33
|
"timed_out",
|
|
34
34
|
"failed",
|
|
35
35
|
];
|
|
36
|
-
/** Statuses that describe what happened to a
|
|
36
|
+
/** Statuses that describe what happened to a participant rather than a harness malfunction. Verify
|
|
37
37
|
* treats these as study results, so a run whose evidence is sound is not called untrustworthy just
|
|
38
38
|
* because a persona gave up. */
|
|
39
39
|
export const PARTICIPANT_OUTCOME_STATUSES = ["abandoned", "incomplete"];
|
|
@@ -55,18 +55,23 @@ export const ACTOR_STOP_CAUSES = [
|
|
|
55
55
|
"usage_unreported",
|
|
56
56
|
];
|
|
57
57
|
/**
|
|
58
|
-
* Codex CLI
|
|
59
|
-
*
|
|
58
|
+
* The oldest Codex CLI release a recorded account profile may name. Readers accept every stable
|
|
59
|
+
* `MAJOR.MINOR.PATCH` release from it on, so a saved bundle stays readable whichever release
|
|
60
|
+
* recorded it; launch admission (codex/codex-admission.ts) alone decides what runs.
|
|
60
61
|
*/
|
|
61
|
-
export const
|
|
62
|
-
|
|
63
|
-
"0.157.1",
|
|
64
|
-
"0.159.2",
|
|
65
|
-
"0.159.3",
|
|
66
|
-
"0.160.0",
|
|
67
|
-
];
|
|
62
|
+
export const RECORDED_CODEX_CLI_FLOOR = "0.154.0";
|
|
63
|
+
/** A stable release at or above the floor. Parts compare as digit strings, exact at any length. */
|
|
68
64
|
export function isRecordedCodexCliVersion(value) {
|
|
69
|
-
|
|
65
|
+
if (typeof value !== "string" || !/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(value))
|
|
66
|
+
return false;
|
|
67
|
+
const release = value.split("."), floor = RECORDED_CODEX_CLI_FLOOR.split(".");
|
|
68
|
+
for (const [index, part] of release.entries()) {
|
|
69
|
+
const order = part.length - floor[index].length ||
|
|
70
|
+
(part === floor[index] ? 0 : part > floor[index] ? 1 : -1);
|
|
71
|
+
if (order !== 0)
|
|
72
|
+
return order > 0;
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
70
75
|
}
|
|
71
76
|
/** Durable reader profile. Append new qualified profiles; never rewrite old evidence. */
|
|
72
77
|
export function validActorExecutionProfile(value) {
|
|
@@ -174,7 +179,7 @@ export const CODEX_APP_SERVER_CAPABILITIES = {
|
|
|
174
179
|
license: "open",
|
|
175
180
|
};
|
|
176
181
|
// Scripted browser driver (src/actors/scripted-browser/): deterministic Playwright step
|
|
177
|
-
// replay against a loopback app. byoModel is false because there is
|
|
182
|
+
// replay against a loopback app. byoModel is false because there is no model: the committed
|
|
178
183
|
// scenario steps are the whole behavior; tokenUsage on its traces records zeros by mechanism.
|
|
179
184
|
export const SCRIPTED_BROWSER_CAPABILITIES = {
|
|
180
185
|
headless: true,
|
|
@@ -188,12 +193,13 @@ export const SCRIPTED_BROWSER_CAPABILITIES = {
|
|
|
188
193
|
};
|
|
189
194
|
// Terminal agent (src/routes/terminal/route.ts): a real autonomous coding agent (Codex) discovering
|
|
190
195
|
// and using a CLI/product from inside an E2B shell, capturing its non-interactive exec output as
|
|
191
|
-
// a redacted event stream + normalized transcript. The "terminal"
|
|
192
|
-
// study
|
|
193
|
-
// agent runs its own model via the command-scoped runtime
|
|
194
|
-
// keyPlacement is "in-sandbox-command-scoped"
|
|
195
|
-
// E2B route's external-key default (the agent is the keyed process and it
|
|
196
|
-
// terminal-product live route enforces the boundary before sandbox
|
|
196
|
+
// a redacted event stream + normalized transcript. The "terminal" run kind is the
|
|
197
|
+
// autonomous-agent study run kind (distinct from "code", the operator-machine Codex
|
|
198
|
+
// actors). byoModel is false: the agent runs its own model via the command-scoped runtime
|
|
199
|
+
// auth, not a humanish-supplied provider. keyPlacement is "in-sandbox-command-scoped": the
|
|
200
|
+
// inversion of every other E2B route's external-key default (the agent is the keyed process and it
|
|
201
|
+
// runs inside the sandbox). The terminal-product live route enforces the boundary before sandbox
|
|
202
|
+
// creation.
|
|
197
203
|
export const TERMINAL_AGENT_CAPABILITIES = {
|
|
198
204
|
headless: true,
|
|
199
205
|
structuredTrace: true,
|
|
@@ -34,7 +34,7 @@ export interface ClaudeSession {
|
|
|
34
34
|
export declare function userMessage(text: string): JsonObject;
|
|
35
35
|
/**
|
|
36
36
|
* Start one Claude Code session and return a provider that spends it, one user message per
|
|
37
|
-
* computer-use turn. Started
|
|
37
|
+
* computer-use turn. Started eagerly (before the first screenshot) so the CLI's own boot is paid
|
|
38
38
|
* while the sandbox is still settling rather than inside turn one.
|
|
39
39
|
*/
|
|
40
40
|
export declare function startClaudeSession(options?: ClaudeSessionOptions): Promise<ClaudeSession>;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
//
|
|
1
|
+
// One Claude Code process as the computer-use brain, instead of a fresh `claude -p` per turn.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// so the participant remembers what it tried. `claude` spawned `claude -p` per turn, so
|
|
3
|
+
// Why: `actors[].localAgent: codex` already runs through a persistent app-server thread,
|
|
4
|
+
// so the participant remembers what it tried. `claude` spawned `claude -p` per turn, so every
|
|
5
5
|
// turn started cold. Measured on the same lab with the same credentials (n=1 each): one-shot,
|
|
6
6
|
// 188 actions over 90 turns and never finished; a thread that remembers, 21 actions over 8 turns
|
|
7
7
|
// and goal_satisfied in 103 s. A participant that cannot remember trying the menu tries the menu
|
|
8
8
|
// again. Until this existed, comparing the two agents measured the transport, not the model.
|
|
9
9
|
//
|
|
10
|
-
//
|
|
10
|
+
// The mechanism, checked on this machine before it was written: `claude -p --input-format
|
|
11
11
|
// stream-json --output-format stream-json --verbose` is a bidirectional session over stdio. One
|
|
12
12
|
// NDJSON `user` message in, a stream of `system` / `assistant` / `result` messages out, then it
|
|
13
13
|
// waits for the next `user` message with the conversation intact. Two messages, one session id,
|
|
14
14
|
// and a codeword given in the first turn was recalled in the second. `--allowedTools Read` keeps
|
|
15
15
|
// the bound the one-shot version had: it looks at a picture, and that is all it can do.
|
|
16
16
|
//
|
|
17
|
-
// What this is
|
|
17
|
+
// What this is not: a change to the loop, the executor, the trace, or the Observer. Only where
|
|
18
18
|
// the next action comes from.
|
|
19
19
|
import { spawn } from "node:child_process";
|
|
20
20
|
import { randomUUID } from "node:crypto";
|
|
@@ -221,7 +221,7 @@ export function userMessage(text) {
|
|
|
221
221
|
}
|
|
222
222
|
/**
|
|
223
223
|
* Start one Claude Code session and return a provider that spends it, one user message per
|
|
224
|
-
* computer-use turn. Started
|
|
224
|
+
* computer-use turn. Started eagerly (before the first screenshot) so the CLI's own boot is paid
|
|
225
225
|
* while the sandbox is still settling rather than inside turn one.
|
|
226
226
|
*/
|
|
227
227
|
export async function startClaudeSession(options = {}) {
|
|
@@ -240,7 +240,7 @@ export async function startClaudeSession(options = {}) {
|
|
|
240
240
|
"stream-json",
|
|
241
241
|
// Required for stream-json output in -p mode; it is what makes the per-turn `result` visible.
|
|
242
242
|
"--verbose",
|
|
243
|
-
// Read is the only tool it needs
|
|
243
|
+
// Read is the only tool it needs (the screenshot) and the only one it gets.
|
|
244
244
|
"--allowedTools",
|
|
245
245
|
"Read",
|
|
246
246
|
...(options.model === undefined ? [] : ["--model", options.model]),
|
|
@@ -274,6 +274,7 @@ export async function startClaudeSession(options = {}) {
|
|
|
274
274
|
: `\n\nNote from the harness: ${request.contextHint}`;
|
|
275
275
|
// The persona and the reply shape are in the conversation after turn one; re-sending them
|
|
276
276
|
// every turn is what the one-shot version had to do, and it is most of what it cost.
|
|
277
|
+
// prose-check: model prompt (the participant model reads this, not a person)
|
|
277
278
|
const text = turnIndex === 1
|
|
278
279
|
? promptFor(request, shot)
|
|
279
280
|
: `Read the image file ${shot}. That is the CURRENT SCREEN, after your last actions took effect. ` +
|
|
@@ -316,7 +317,7 @@ export async function startClaudeSession(options = {}) {
|
|
|
316
317
|
export function turnFromResult(result) {
|
|
317
318
|
if (result.is_error === true ||
|
|
318
319
|
(typeof result.subtype === "string" && result.subtype !== "success")) {
|
|
319
|
-
// A turn that errored is a
|
|
320
|
+
// A turn that errored is a broken turn, never an empty one: an empty turn reads to the loop
|
|
320
321
|
// as "the participant chose to do nothing".
|
|
321
322
|
throw new Error(`Claude Code turn ended ${String(result.subtype ?? "in error")}: ${String(result.result ?? "").slice(0, 160)}`);
|
|
322
323
|
}
|
|
@@ -354,7 +355,7 @@ export function turnFromResult(result) {
|
|
|
354
355
|
...(typeof parsed.message === "string" && parsed.message.length > 0
|
|
355
356
|
? { message: parsed.message }
|
|
356
357
|
: {}),
|
|
357
|
-
// Claude Code reports its token counts per turn
|
|
358
|
+
// Claude Code reports its token counts per turn. They are recorded as counts; the
|
|
358
359
|
// run's cost line stays "not priced", because a subscription is not a rate card.
|
|
359
360
|
...(input === undefined && output === undefined
|
|
360
361
|
? {}
|
|
@@ -20,7 +20,7 @@ interface RawAction {
|
|
|
20
20
|
ms?: number | null;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
* Map the agent's answer onto the harness action vocabulary. Anything unrecognized is
|
|
23
|
+
* Map the agent's answer onto the harness action vocabulary. Anything unrecognized is dropped
|
|
24
24
|
* rather than guessed at: a coordinate we invented would be recorded as the participant's choice.
|
|
25
25
|
*/
|
|
26
26
|
export declare function toCuaActions(raw: readonly RawAction[]): CuaAction[];
|
|
@@ -29,7 +29,7 @@ export declare function declaredOutcomeOf(value: unknown): ParticipantDeclaredOu
|
|
|
29
29
|
/**
|
|
30
30
|
* Pull the JSON object out of whatever the CLI printed: clean JSON, a Claude Code envelope, or an
|
|
31
31
|
* answer wrapped in a ```json fence. A response with no object at all is a turn error, never an
|
|
32
|
-
* empty turn
|
|
32
|
+
* empty turn: an empty turn would read to the loop as "the participant chose to do nothing".
|
|
33
33
|
*/
|
|
34
34
|
export declare function parseAgentJson(text: string): Record<string, unknown>;
|
|
35
35
|
export interface SpawnResult {
|
|
@@ -74,7 +74,7 @@ export interface DetectedLocalAgent extends LocalAgentDescriptor {
|
|
|
74
74
|
/** Resolved path to the binary. */
|
|
75
75
|
binPath: string;
|
|
76
76
|
/**
|
|
77
|
-
* Whether a credential file exists for it.
|
|
77
|
+
* Whether a credential file exists for it. Existence only: never read, never parsed, never
|
|
78
78
|
* reported beyond this boolean. Keyring storage may have no file at all.
|
|
79
79
|
*/
|
|
80
80
|
credentialsPresent: boolean;
|
|
@@ -106,10 +106,12 @@ export declare function checkHostedCodexCompatibility(binPath: string, options?:
|
|
|
106
106
|
*
|
|
107
107
|
* This is the whole point of the feature at the surface: someone new does not have to go and make
|
|
108
108
|
* an API key if the thing that can drive the study is already on their laptop. `doctor` says so,
|
|
109
|
-
* and says it as a capability rather than a gate
|
|
109
|
+
* and says it as a capability rather than a gate: a machine with no local agent is not broken,
|
|
110
110
|
* it just needs a key.
|
|
111
111
|
*/
|
|
112
112
|
export declare function detectLocalAgents(options?: DetectLocalAgentsOptions): Promise<DetectedLocalAgent[]>;
|
|
113
|
-
/**
|
|
114
|
-
export declare
|
|
113
|
+
/** Doctor's row when neither Codex nor Claude Code is installed. */
|
|
114
|
+
export declare const NO_LOCAL_AGENT_MESSAGE = "no local coding agent found. openai-computer-use needs OPENAI_API_KEY; local-agent needs Codex or Claude Code installed and signed in. Hosted desktops also need E2B_API_KEY.";
|
|
115
|
+
/** Doctor's row for one installed agent, in the register the other rows use. */
|
|
116
|
+
export declare function localAgentDoctorMessage(agent: DetectedLocalAgent): string;
|
|
115
117
|
export {};
|
|
@@ -11,22 +11,22 @@
|
|
|
11
11
|
// The design started from a measurement: with every OPENAI_* variable unset, `codex exec --image`
|
|
12
12
|
// returned a correct click on a real desktop screenshot and `claude -p` agreed within three pixels.
|
|
13
13
|
//
|
|
14
|
-
//
|
|
15
|
-
// which is why the cost line for these runs says "not priced"
|
|
14
|
+
// What this is not: a way to avoid paying. Subscription usage consumes the operator's own plan,
|
|
15
|
+
// which is why the cost line for these runs says "not priced": $0 would be a lie.
|
|
16
16
|
// It is also not marketed as free API access, and it fails closed on a rate limit rather than
|
|
17
17
|
// hammering a plan that was sold for interactive coding.
|
|
18
18
|
//
|
|
19
|
-
//
|
|
19
|
+
// Where it is safe, and this inverts the intuitive reading: the local agent only decides. humanish
|
|
20
20
|
// executes the action inside the desktop sandbox, so nothing the persona chooses ever runs on the
|
|
21
|
-
// operator's machine. The same trick on the
|
|
22
|
-
// code execution out of the sandbox and onto a real disk
|
|
21
|
+
// operator's machine. The same trick on the terminal route would be the opposite: it would move
|
|
22
|
+
// code execution out of the sandbox and onto a real disk, which is why this is a computer-use
|
|
23
23
|
// provider and nothing else. Even so, these are coding agents with their own shell and file tools,
|
|
24
24
|
// so each one is spawned tool-restricted, in a scratch directory, with a per-turn timeout.
|
|
25
25
|
import { spawn } from "node:child_process";
|
|
26
26
|
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
27
27
|
import { tmpdir } from "node:os";
|
|
28
28
|
import path from "node:path";
|
|
29
|
-
import {
|
|
29
|
+
import { admitsCodexCliVersion, parseCodexCliVersion } from "../codex/codex-admission.js";
|
|
30
30
|
import { restrictedCodexNpmTarget } from "../codex/restricted-executable.js";
|
|
31
31
|
const LOCAL_AGENTS = [
|
|
32
32
|
{ id: "codex", bin: "codex", label: "Codex", credentialPath: ".codex/auth.json" },
|
|
@@ -38,7 +38,7 @@ const LOCAL_AGENTS = [
|
|
|
38
38
|
},
|
|
39
39
|
];
|
|
40
40
|
/**
|
|
41
|
-
* Map the agent's answer onto the harness action vocabulary. Anything unrecognized is
|
|
41
|
+
* Map the agent's answer onto the harness action vocabulary. Anything unrecognized is dropped
|
|
42
42
|
* rather than guessed at: a coordinate we invented would be recorded as the participant's choice.
|
|
43
43
|
*/
|
|
44
44
|
export function toCuaActions(raw) {
|
|
@@ -90,11 +90,11 @@ export function declaredOutcomeOf(value) {
|
|
|
90
90
|
/**
|
|
91
91
|
* Pull the JSON object out of whatever the CLI printed: clean JSON, a Claude Code envelope, or an
|
|
92
92
|
* answer wrapped in a ```json fence. A response with no object at all is a turn error, never an
|
|
93
|
-
* empty turn
|
|
93
|
+
* empty turn: an empty turn would read to the loop as "the participant chose to do nothing".
|
|
94
94
|
*/
|
|
95
95
|
export function parseAgentJson(text) {
|
|
96
|
-
//
|
|
97
|
-
//
|
|
96
|
+
// Order matters, and a test caught it: Claude Code's envelope is valid JSON whose `result`
|
|
97
|
+
// string contains a ```json fence. Stripping fences first reached inside that string and
|
|
98
98
|
// mangled the envelope. So: parse what we were given, and only go fence-hunting if it is not
|
|
99
99
|
// already JSON.
|
|
100
100
|
const attempts = [text.trim()];
|
|
@@ -167,6 +167,7 @@ export function promptFor(request, screenshotPath) {
|
|
|
167
167
|
const shape = '{"reasoning":string,"done":boolean,"message":string|null,"outcome":"reached"|"not_reached"|"blocked"|null,' +
|
|
168
168
|
'"actions":[{"kind":"click|double_click|type|keypress|scroll|wait|done",' +
|
|
169
169
|
'"x":int|null,"y":int|null,"text":string|null,"keys":[string]|null,"ms":int|null}]}';
|
|
170
|
+
// prose-check: model prompt (the participant model reads this, not a person)
|
|
170
171
|
return [
|
|
171
172
|
request.instructions,
|
|
172
173
|
"",
|
|
@@ -217,7 +218,7 @@ export function createLocalAgentProvider(options) {
|
|
|
217
218
|
"-p",
|
|
218
219
|
"--output-format",
|
|
219
220
|
"json",
|
|
220
|
-
// Read is the only tool it needs
|
|
221
|
+
// Read is the only tool it needs (the screenshot) and the only one it gets.
|
|
221
222
|
"--allowedTools",
|
|
222
223
|
"Read",
|
|
223
224
|
...(options.model === undefined ? [] : ["--model", options.model]),
|
|
@@ -339,9 +340,7 @@ export async function checkHostedCodexCompatibility(binPath, options = {}) {
|
|
|
339
340
|
return "unsupported_platform";
|
|
340
341
|
const result = await (options.probe ?? authProbe)(binPath, ["--version"], options.env ?? process.env).catch(() => ({ code: null, stdout: "", stderr: "" }));
|
|
341
342
|
const version = parseCodexCliVersion(result.stdout);
|
|
342
|
-
return result.code === 0 &&
|
|
343
|
-
version !== undefined &&
|
|
344
|
-
admittedCodexCliVersions(platform, arch).some((admitted) => admitted === version)
|
|
343
|
+
return result.code === 0 && version !== undefined && admitsCodexCliVersion(version)
|
|
345
344
|
? "supported"
|
|
346
345
|
: "unsupported_version";
|
|
347
346
|
}
|
|
@@ -350,7 +349,7 @@ export async function checkHostedCodexCompatibility(binPath, options = {}) {
|
|
|
350
349
|
*
|
|
351
350
|
* This is the whole point of the feature at the surface: someone new does not have to go and make
|
|
352
351
|
* an API key if the thing that can drive the study is already on their laptop. `doctor` says so,
|
|
353
|
-
* and says it as a capability rather than a gate
|
|
352
|
+
* and says it as a capability rather than a gate: a machine with no local agent is not broken,
|
|
354
353
|
* it just needs a key.
|
|
355
354
|
*/
|
|
356
355
|
export async function detectLocalAgents(options = {}) {
|
|
@@ -397,17 +396,14 @@ export async function detectLocalAgents(options = {}) {
|
|
|
397
396
|
}
|
|
398
397
|
return found;
|
|
399
398
|
}
|
|
400
|
-
/**
|
|
401
|
-
export
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
: `${agent.label} installed; authentication status could not be checked — run \`${agent.id === "codex" ? "codex login status" : "claude auth status"}\` and update the CLI if needed`)
|
|
411
|
-
.join(". ") +
|
|
412
|
-
". Desktop and analysis requirements depend on the selected lab; run doctor --lab <lab> for its setup checks.");
|
|
399
|
+
/** Doctor's row when neither Codex nor Claude Code is installed. */
|
|
400
|
+
export const NO_LOCAL_AGENT_MESSAGE = "no local coding agent found. openai-computer-use needs OPENAI_API_KEY; local-agent needs Codex or Claude Code installed and signed in. Hosted desktops also need E2B_API_KEY.";
|
|
401
|
+
/** Doctor's row for one installed agent, in the register the other rows use. */
|
|
402
|
+
export function localAgentDoctorMessage(agent) {
|
|
403
|
+
if (agent.authStatus === "authenticated")
|
|
404
|
+
return `${agent.label} reports signed in; a lab with actors[0].type: local-agent can use it instead of a provider API key. Account access and limits are untested.`;
|
|
405
|
+
const status = agent.id === "codex" ? "codex login status" : "claude auth status";
|
|
406
|
+
return agent.authStatus === "unauthenticated"
|
|
407
|
+
? `${agent.label} is installed and reports not signed in; run \`${agent.id === "codex" ? "codex login" : "claude auth login"}\``
|
|
408
|
+
: `${agent.label} is installed; its sign-in status could not be checked. Run \`${status}\`, and update the CLI if needed.`;
|
|
413
409
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type LocalAgentId } from "./cli.js";
|
|
2
2
|
/** Why a local-agent participant cannot run here. */
|
|
3
3
|
export type LocalAgentRefusal =
|
|
4
|
-
/** The CLI is not on PATH
|
|
4
|
+
/** The CLI is not on `PATH`. */
|
|
5
5
|
{
|
|
6
6
|
kind: "agent-missing";
|
|
7
7
|
message: string;
|
|
@@ -11,7 +11,7 @@ export type LocalAgentRefusal =
|
|
|
11
11
|
kind: "signin-required";
|
|
12
12
|
message: string;
|
|
13
13
|
}
|
|
14
|
-
/** Hosted Codex on an unsupported platform or
|
|
14
|
+
/** Hosted Codex on an unsupported platform or a CLI release the launcher refuses. */
|
|
15
15
|
| {
|
|
16
16
|
kind: "unsupported";
|
|
17
17
|
message: string;
|