humanish 0.106.1 → 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 +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- 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-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- 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 +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- 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 +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- 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 +86 -49
- 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/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- 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.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- 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 +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- 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 +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -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 +46 -10
- package/dist/cli/io.js +109 -30
- 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 +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- 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/lease-store.js +7 -7
- 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 +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- 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 +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- 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 +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- 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 +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- 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 +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- 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 +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- 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 +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- 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 +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- 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/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- 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 +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- 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 +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- 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 +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- 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 +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- 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 +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- 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 +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- 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 +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- 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/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- 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 +8 -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 +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- 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 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -4,7 +4,7 @@ import { CUA_SPEECH_LIMITS } from "../speech.js";
|
|
|
4
4
|
import { dwellCompleted, missingFrame, stopWhenMatched } from "./ending.js";
|
|
5
5
|
import { CuaAbortError, CuaStallError, raceCallBound } from "./race.js";
|
|
6
6
|
import { notice } from "./trace.js";
|
|
7
|
-
// One projection feeds
|
|
7
|
+
// One projection feeds both the stop guard and the task tracker, so a criterion that would stop
|
|
8
8
|
// the run and a criterion that completes a task can never see different evidence for one turn.
|
|
9
9
|
function stopObservationOf(observation) {
|
|
10
10
|
return {
|
|
@@ -72,8 +72,8 @@ export class DesktopObserver {
|
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* Hand an observation the next turn may react to to the runtime hooks, and note whether it
|
|
75
|
-
* carried app state. Runtime-only: the
|
|
76
|
-
* and is never persisted.
|
|
75
|
+
* carried app state. Runtime-only: the participant's live location.href goes back to the
|
|
76
|
+
* orchestrator and is never persisted.
|
|
77
77
|
*/
|
|
78
78
|
handToHooks(observation) {
|
|
79
79
|
const { onObservedUrl, onScreenshot } = this.session.settings;
|
|
@@ -118,7 +118,7 @@ export class DesktopObserver {
|
|
|
118
118
|
throw error;
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
|
-
// An executor without stallRecovery "fail_closed" gets one retry of a stalled observe
|
|
121
|
+
// An executor without stallRecovery "fail_closed" gets one retry of a stalled observe.
|
|
122
122
|
// One that cannot safely replay a pending request opts out, so even a shorter outer bound stops
|
|
123
123
|
// without retrying.
|
|
124
124
|
async observeBounded(label) {
|
|
@@ -185,19 +185,19 @@ export class DesktopObserver {
|
|
|
185
185
|
}));
|
|
186
186
|
session.trace.bump("screenshots");
|
|
187
187
|
}
|
|
188
|
-
// Evaluated
|
|
188
|
+
// Evaluated before the stopWhen check each turn so a final task whose criterion coincides with
|
|
189
189
|
// the stop condition still lands in the funnel of the very turn that ends the session.
|
|
190
190
|
observeTasks(observation, turnNumber) {
|
|
191
191
|
const { taskTracker } = this.session;
|
|
192
192
|
if (taskTracker === undefined)
|
|
193
193
|
return;
|
|
194
194
|
for (const completion of taskTracker.observe(stopObservationOf(observation), turnNumber)) {
|
|
195
|
-
// The id is researcher-authored config and the kinds are rule-type names; the matched
|
|
196
|
-
// (a URL, page text) never appear here
|
|
195
|
+
// The id is researcher-authored config and the kinds are rule-type names; the matched values
|
|
196
|
+
// (a URL, page text) never appear here: the same discipline as the stopWhen notice.
|
|
197
197
|
this.session.trace.record("notice", () => notice("matched", `task completed: ${this.session.redactNarration(completion.id)}`, this.session.redactNarration(`turn ${turnNumber}; matched rule ${completion.matchedRuleIndex} (${completion.matchedKinds.join("+")})`)));
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
|
-
// The declared observation window
|
|
200
|
+
// The declared observation window. The harness holds, looks, and takes nothing back to
|
|
201
201
|
// the model: no action, no turn, no tokens. It runs once, cut to whatever session budget is
|
|
202
202
|
// left, and says in the trace that the time was deliberate.
|
|
203
203
|
async dwellIfDue(observation, turnNumber) {
|
|
@@ -238,7 +238,7 @@ export class DesktopObserver {
|
|
|
238
238
|
}
|
|
239
239
|
const heldMs = session.now() - dwellStartedAtMs;
|
|
240
240
|
session.trace.record("notice", () => notice(
|
|
241
|
-
// A window that
|
|
241
|
+
// A window that ends the session is structured, harness-owned completion evidence, the
|
|
242
242
|
// same class as a matched stopWhen, and the verdict resolver reads it that way.
|
|
243
243
|
dwell.then === "stop" ? "matched" : "ok", "dwell window complete", `${frames} frame(s) over ${heldMs}ms; no model turn was requested during the window`));
|
|
244
244
|
return { next: dwell.then, heldMs };
|
|
@@ -8,7 +8,7 @@ export type TurnReply = {
|
|
|
8
8
|
};
|
|
9
9
|
/**
|
|
10
10
|
* Ask the provider for one turn. A fail_closed provider gets one single dispatch; any other is
|
|
11
|
-
* raced against turnTimeoutMs
|
|
11
|
+
* raced against turnTimeoutMs and retried once when it stalls.
|
|
12
12
|
*/
|
|
13
13
|
export declare function requestTurn(session: LoopSession, request: CuaTurnRequest, turnNumber: number): Promise<TurnReply>;
|
|
14
14
|
/**
|
|
@@ -12,7 +12,7 @@ import { reportedCounts, settledReceipt } from "./usage.js";
|
|
|
12
12
|
const CUA_PROVIDER_CLEANUP_GRACE_MS = 5000;
|
|
13
13
|
/**
|
|
14
14
|
* Ask the provider for one turn. A fail_closed provider gets one single dispatch; any other is
|
|
15
|
-
* raced against turnTimeoutMs
|
|
15
|
+
* raced against turnTimeoutMs and retried once when it stalls.
|
|
16
16
|
*/
|
|
17
17
|
export async function requestTurn(session, request, turnNumber) {
|
|
18
18
|
const { provider } = session;
|
|
@@ -7,7 +7,7 @@ import { UsageLedger } from "./usage.js";
|
|
|
7
7
|
// (screenshot, wait, screenshot, wait), and a short idle limit ends that session as gave_up before
|
|
8
8
|
// the mail can arrive.
|
|
9
9
|
const DEFAULT_IDLE_STEPS = 24;
|
|
10
|
-
// A no-progress turn also needs a repeated action
|
|
10
|
+
// A no-progress turn also needs a repeated action, so this needs less headroom than the
|
|
11
11
|
// idle limit.
|
|
12
12
|
const DEFAULT_NO_PROGRESS_STEPS = 20;
|
|
13
13
|
const DEFAULT_TURN_TIMEOUT_MS = 180_000;
|
|
@@ -105,9 +105,9 @@ export class LoopSession {
|
|
|
105
105
|
remaining() {
|
|
106
106
|
return this.timeoutMs - (this.now() - this.startedAtMs);
|
|
107
107
|
}
|
|
108
|
-
// Model-authored narration: literal-scrub known provisioned values,
|
|
108
|
+
// Model-authored narration: literal-scrub known provisioned values, then pattern-redact.
|
|
109
109
|
// A value the model transcribes (a DB password it read on screen) has no shape, so redactText
|
|
110
|
-
// alone cannot catch it
|
|
110
|
+
// alone cannot catch it; the lab's scrubKnownValues, injected as scrubText, closes that.
|
|
111
111
|
redactNarration(text) {
|
|
112
112
|
return this.settings.redaction.redactText(this.scrubText(text));
|
|
113
113
|
}
|
|
@@ -8,8 +8,8 @@ export declare class LostRequestRefused extends Error {
|
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* The spend caps, checked before the next provider request so a model stuck retrying cannot keep
|
|
11
|
-
* spending. The
|
|
12
|
-
* estimate cannot trip it, because preflight guaranteed a rate. The study budget
|
|
11
|
+
* spending. The per-participant cap stops the session once the running estimate crosses maxUsd; a null
|
|
12
|
+
* estimate cannot trip it, because preflight guaranteed a rate. The study budget is checked
|
|
13
13
|
* next.
|
|
14
14
|
*/
|
|
15
15
|
export declare function spendStop(session: LoopSession): Stop | undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as stops from "./ending.js";
|
|
2
2
|
import { notice } from "./trace.js";
|
|
3
|
-
// The spend guards. The
|
|
3
|
+
// The spend guards. The per-participant cap (maxUsd) and the study budget (overRunBudget) are priced from
|
|
4
4
|
// the usage each reply reports, plus a worst-case charge booked for each request lost without a
|
|
5
5
|
// reply. A request whose cost is unknown and unbounded stops a capped session before the next one.
|
|
6
6
|
/** Thrown through the provider when a lost attempt may not be sent again; carries the stop. */
|
|
@@ -13,8 +13,8 @@ export class LostRequestRefused extends Error {
|
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* The spend caps, checked before the next provider request so a model stuck retrying cannot keep
|
|
16
|
-
* spending. The
|
|
17
|
-
* estimate cannot trip it, because preflight guaranteed a rate. The study budget
|
|
16
|
+
* spending. The per-participant cap stops the session once the running estimate crosses maxUsd; a null
|
|
17
|
+
* estimate cannot trip it, because preflight guaranteed a rate. The study budget is checked
|
|
18
18
|
* next.
|
|
19
19
|
*/
|
|
20
20
|
export function spendStop(session) {
|
|
@@ -29,7 +29,7 @@ export function spendStop(session) {
|
|
|
29
29
|
if (overRunBudget) {
|
|
30
30
|
const runStop = overRunBudget(session.usage.forCap());
|
|
31
31
|
if (runStop !== null)
|
|
32
|
-
return stops.
|
|
32
|
+
return stops.runSpendLimit(runStop);
|
|
33
33
|
}
|
|
34
34
|
return undefined;
|
|
35
35
|
}
|
|
@@ -20,7 +20,7 @@ export class TraceRecorder {
|
|
|
20
20
|
constructor(now) {
|
|
21
21
|
this.now = now;
|
|
22
22
|
}
|
|
23
|
-
// The
|
|
23
|
+
// The single recording choke point: every trace item is stamped `at` from the
|
|
24
24
|
// loop's injected clock as it is recorded, so timed playback reads recorded facts
|
|
25
25
|
// (deterministic in tests via the injected `now`). The id is allocated before the body is
|
|
26
26
|
// built, so a body that fails to build (a redaction error) still consumes its id.
|
|
@@ -37,10 +37,10 @@ export class TraceRecorder {
|
|
|
37
37
|
export function statusForCompletionReason(reason) {
|
|
38
38
|
switch (reason) {
|
|
39
39
|
case "goal_satisfied":
|
|
40
|
-
case "turn_completed": // turn_completed is a Codex
|
|
40
|
+
case "turn_completed": // turn_completed is a Codex reason; this loop emits goal_satisfied
|
|
41
41
|
return "passed";
|
|
42
42
|
// A session that ran out of time or budget did not reach its goal, whatever it achieved along
|
|
43
|
-
// the way. Calling that `passed` is how a truncated study came to be reported as a green one
|
|
43
|
+
// the way. Calling that `passed` is how a truncated study came to be reported as a green one,
|
|
44
44
|
// and why "raise the timeout" kept landing on the operator instead of on the tool. This switch
|
|
45
45
|
// is exhaustive with no default, so a new completion reason forces a compile error here.
|
|
46
46
|
case "budget_reached":
|
|
@@ -51,12 +51,12 @@ export function statusForCompletionReason(reason) {
|
|
|
51
51
|
return "blocked";
|
|
52
52
|
// A participant who stopped trying is the single most valuable thing a usability study
|
|
53
53
|
// produces. Recording it as `failed` said the instrument broke, which is a different claim and
|
|
54
|
-
// a false one
|
|
54
|
+
// a false one; see docs/principles/three-roles.md.
|
|
55
55
|
case "gave_up":
|
|
56
56
|
return "abandoned";
|
|
57
57
|
// Only the harness failing is a harness failure.
|
|
58
58
|
case "actor_error":
|
|
59
|
-
case "step_failed": // step_failed is the scripted-browser
|
|
59
|
+
case "step_failed": // step_failed is the scripted-browser route's reason; this loop never emits it
|
|
60
60
|
case "harness_error":
|
|
61
61
|
return "failed";
|
|
62
62
|
}
|
|
@@ -77,12 +77,12 @@ export function loopResult(session, stop, debrief) {
|
|
|
77
77
|
? "no screenshots captured"
|
|
78
78
|
: session.redactScreenshots
|
|
79
79
|
? `${counts.screenshots} screenshot(s) redacted to blurred thumbnails via RedactionHooks`
|
|
80
|
-
: `${counts.screenshots}
|
|
81
|
-
// Self-describing artifact
|
|
80
|
+
: `${counts.screenshots} unblurred screenshot(s) kept for local use and not redacted for publishing; set redactScreenshots to blur screenshots in a bundle you plan to share`;
|
|
81
|
+
// Self-describing artifact: when any observation carried structured app state,
|
|
82
82
|
// the trace says how the loop handled it: it fed progress and task checks and was not written to
|
|
83
83
|
// the trace. The appState itself never appears in this bundle.
|
|
84
84
|
const notes = session.observedAppState
|
|
85
|
-
? `${screenshotNote}. App state was
|
|
85
|
+
? `${screenshotNote}. App state was read each turn to detect progress (an in-process executor) and was not written to the trace: it is used only while the run is live and is never stored as evidence.`
|
|
86
86
|
: screenshotNote;
|
|
87
87
|
const tokenUsage = usage.tokenUsage();
|
|
88
88
|
const trace = {
|
|
@@ -90,6 +90,7 @@ export function loopResult(session, stop, debrief) {
|
|
|
90
90
|
provider: provider.id,
|
|
91
91
|
...usage.liveMetadata(),
|
|
92
92
|
...(provider.version === undefined ? {} : { providerVersion: provider.version }),
|
|
93
|
+
...(provider.conversation === undefined ? {} : { conversation: provider.conversation }),
|
|
93
94
|
protocol: "cua-loop",
|
|
94
95
|
lane: "computer-use",
|
|
95
96
|
persona: settings.persona,
|
|
@@ -130,8 +131,8 @@ export function loopResult(session, stop, debrief) {
|
|
|
130
131
|
...(usage.interactionUsageIncomplete(session.capDeclared)
|
|
131
132
|
? { interactionUsageIncomplete: true }
|
|
132
133
|
: {}),
|
|
133
|
-
// The funnel is present exactly when a protocol was declared
|
|
134
|
-
// on turn 0, whose funnel
|
|
134
|
+
// The funnel is present exactly when a protocol was declared, including a session that ended
|
|
135
|
+
// on turn 0, whose funnel reads 0/N. No tasks declared means no funnel, not an empty one.
|
|
135
136
|
...(session.taskTracker === undefined ? {} : { taskFunnel: session.taskTracker.funnel() }),
|
|
136
137
|
...(tokenUsage === undefined ? {} : { tokenUsage }),
|
|
137
138
|
capabilities: provider.capabilities,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { HeardSpeech } from "../speech.js";
|
|
2
|
-
import type { ActorCapabilities, ActorExecutionProfile, ActorPersonaRef, ActorSessionResult, ActorTokenUsage, ActorTrace, ActorTraceItem, ParticipantClosingReport, ParticipantDeclaredOutcome, ProviderRequestReceipt } from "../../contract.js";
|
|
2
|
+
import type { ActorCapabilities, ActorConversation, ActorExecutionProfile, ActorPersonaRef, ActorSessionResult, ActorTokenUsage, ActorTrace, ActorTraceItem, ParticipantClosingReport, ParticipantDeclaredOutcome, ProviderRequestReceipt } from "../../contract.js";
|
|
3
3
|
import type { RedactionHooks } from "../../../evidence/redaction.js";
|
|
4
4
|
import type { DwellWindow, StopWhen } from "../../stop-conditions.js";
|
|
5
5
|
import type { LabTask } from "../../../lab/tasks.js";
|
|
@@ -93,7 +93,7 @@ export interface CuaObservation {
|
|
|
93
93
|
url?: string;
|
|
94
94
|
/**
|
|
95
95
|
* The page's vertical scroll offset (window.scrollY), when the executor can read it. Scroll
|
|
96
|
-
* position is state
|
|
96
|
+
* position is state: inside a scroll-pinned section the viewport stays visually fixed
|
|
97
97
|
* while the participant advances, so the frame hash alone reads "no change". Runtime-only like
|
|
98
98
|
* url and text: it feeds the progress key, bucketed, and is never persisted.
|
|
99
99
|
*/
|
|
@@ -182,7 +182,7 @@ export interface CuaTurn {
|
|
|
182
182
|
done: boolean;
|
|
183
183
|
/** Explicit provider interruption, independent of actions or participant intent. */
|
|
184
184
|
interruption?: "output_limit" | "token_limit" | "incomplete" | "unexpected_status";
|
|
185
|
-
/** The participant's own word for how it ended, when its reply format carries one
|
|
185
|
+
/** The participant's own word for how it ended, when its reply format carries one. */
|
|
186
186
|
outcome?: ParticipantDeclaredOutcome;
|
|
187
187
|
/** Present only for an accepted structured closing account. */
|
|
188
188
|
closingReport?: ParticipantClosingReport;
|
|
@@ -193,11 +193,13 @@ export interface CuaProvider {
|
|
|
193
193
|
readonly requestPolicy?: "fail_closed";
|
|
194
194
|
readonly executionProfile?: ActorExecutionProfile | undefined;
|
|
195
195
|
readonly historyTurnsOmitted?: number;
|
|
196
|
+
/** How the conversation was carried between requests, for the trace. */
|
|
197
|
+
readonly conversation?: ActorConversation;
|
|
196
198
|
readonly id: string;
|
|
197
199
|
readonly version?: string | undefined;
|
|
198
200
|
/**
|
|
199
201
|
* The request settings this provider will actually send, for the trace to record. `version` says
|
|
200
|
-
*
|
|
202
|
+
* which model; this says how it was asked to run. Optional: a provider with no such settings
|
|
201
203
|
* records none, and absence stays absence rather than becoming a default nobody chose.
|
|
202
204
|
*/
|
|
203
205
|
readonly modelSettings?: {
|
|
@@ -229,7 +231,7 @@ export interface CuaProvider {
|
|
|
229
231
|
nextTurn(req: CuaTurnRequest, signal: AbortSignal, spend?: CuaSpendGate): Promise<CuaTurn>;
|
|
230
232
|
/** Optional read-only closing report. Implementations must disable tools and make no retries. */
|
|
231
233
|
debrief?: ((req: CuaTurnRequest, signal: AbortSignal) => Promise<CuaTurn>) | undefined;
|
|
232
|
-
/** Release
|
|
234
|
+
/** Release the participant's model resources. Idempotent; reject if cleanup is unconfirmed. */
|
|
233
235
|
close?(): Promise<void>;
|
|
234
236
|
}
|
|
235
237
|
/** The desktop side of the loop. */
|
|
@@ -259,13 +261,13 @@ export interface CuaLoopOptions {
|
|
|
259
261
|
/** Hard wall-clock runaway guard. The only count-free hard stop. */
|
|
260
262
|
timeoutMs: number;
|
|
261
263
|
/**
|
|
262
|
-
* Per-attempt bound on the provider call
|
|
264
|
+
* Per-attempt bound on the provider call, so a hung request is told apart from a
|
|
263
265
|
* participant still thinking. A stalled turn is retried once with a notice; a second stall ends
|
|
264
|
-
* the
|
|
266
|
+
* the participant as harness_error.
|
|
265
267
|
*/
|
|
266
268
|
turnTimeoutMs?: number;
|
|
267
269
|
/**
|
|
268
|
-
* Per-call bound on observation work
|
|
270
|
+
* Per-call bound on observation work: executor.observe() and the idle actions (`wait`,
|
|
269
271
|
* `screenshot`), whose only job is to look. A `wait` adds its own ms to the bound. A stalled
|
|
270
272
|
* observe is retried once; a stalled idle action is skipped with a notice.
|
|
271
273
|
*/
|
|
@@ -288,19 +290,19 @@ export interface CuaLoopOptions {
|
|
|
288
290
|
*/
|
|
289
291
|
acknowledgeSafetyChecks?: (checks: CuaSafetyCheck[]) => CuaSafetyCheck[] | null;
|
|
290
292
|
/**
|
|
291
|
-
* Redact (blur+downscale) persisted screenshots. Default
|
|
292
|
-
* retained, because the common case is a developer watching a sim of their
|
|
293
|
+
* Redact (blur+downscale) persisted screenshots. Default `false`: full-fidelity frames are
|
|
294
|
+
* retained, because the common case is a developer watching a sim of their own app locally
|
|
293
295
|
* (gitignored .humanish), where blur destroys the core deliverable. Set true for unowned
|
|
294
|
-
* subjects or when the bundle is meant to be shared as-is. The frame sent to the
|
|
296
|
+
* subjects or when the bundle is meant to be shared as-is. The frame sent to the provider is
|
|
295
297
|
* always full-resolution regardless (the model must see the screen to act); this flag only
|
|
296
|
-
* governs what is
|
|
298
|
+
* governs what is persisted. Publish-safety belongs at the publish boundary (commit scan / redactScreenshots), not capture.
|
|
297
299
|
*/
|
|
298
300
|
redactScreenshots?: boolean;
|
|
299
301
|
/**
|
|
300
|
-
* Extra literal scrub for
|
|
301
|
-
* pattern redaction cannot catch them), composed
|
|
302
|
+
* Extra literal scrub for known provisioned values (which have no detectable "shape", so
|
|
303
|
+
* pattern redaction cannot catch them), composed before redactText on every model-authored
|
|
302
304
|
* text item (reasoning, message, completion summary) and the loop error. The lab passes the
|
|
303
|
-
* env-value scrubber here so a value the
|
|
305
|
+
* env-value scrubber here so a value the model narrates can never land raw in the trace.
|
|
304
306
|
* Default: identity (the loop is shape-only on its own).
|
|
305
307
|
*/
|
|
306
308
|
scrubText?: (text: string) => string;
|
|
@@ -308,12 +310,12 @@ export interface CuaLoopOptions {
|
|
|
308
310
|
writeScreenshot?: (name: string, bytes: Buffer) => Promise<string>;
|
|
309
311
|
/**
|
|
310
312
|
* Deterministic harness-owned success guards. Evaluated after the initial observation and after
|
|
311
|
-
* every post-action observation, before another model turn is requested. This keeps a
|
|
313
|
+
* every post-action observation, before another model turn is requested. This keeps a participant from
|
|
312
314
|
* wandering after the product already reached an app-visible endpoint.
|
|
313
315
|
*/
|
|
314
316
|
stopWhen?: StopWhen;
|
|
315
317
|
/**
|
|
316
|
-
* A declared observation window
|
|
318
|
+
* A declared observation window: once its condition matches (or after the first
|
|
317
319
|
* observation when it has none) the loop holds the page for the window, captures a frame on the
|
|
318
320
|
* cadence, takes no action and requests no model turn, then hands control back or ends. Runs at
|
|
319
321
|
* most once per session and never past the session budget.
|
|
@@ -322,11 +324,11 @@ export interface CuaLoopOptions {
|
|
|
322
324
|
/** Injected pause for the dwell window's cadence; tests advance their clock through it. */
|
|
323
325
|
sleep?: (ms: number) => Promise<void>;
|
|
324
326
|
/**
|
|
325
|
-
* The lab's declared protocol
|
|
327
|
+
* The lab's declared protocol: discrete tasks whose completion is corroborated by the
|
|
326
328
|
* same observations stopWhen reads, on the same cadence. The tracker never influences the loop's
|
|
327
|
-
* control flow
|
|
329
|
+
* control flow: a completed task list does not stop a session (that is stopWhen's job); it only
|
|
328
330
|
* records the funnel that lands on the trace. The participant-facing halves of these tasks are
|
|
329
|
-
* already
|
|
331
|
+
* already in `instructions` (composed upstream); the loop reads only the `success` criteria,
|
|
330
332
|
* which never reach the prompt.
|
|
331
333
|
*/
|
|
332
334
|
tasks?: readonly LabTask[];
|
|
@@ -338,18 +340,18 @@ export interface CuaLoopOptions {
|
|
|
338
340
|
*/
|
|
339
341
|
maxUsd?: number;
|
|
340
342
|
/**
|
|
341
|
-
* Injected
|
|
343
|
+
* Injected pure per-turn cost estimator (keeps the loop free of the operator rate table and
|
|
342
344
|
* makes the cap deterministic in tests). Given running (input, output) token totals, returns the
|
|
343
345
|
* estimated USD, or null when unpriceable. Only consulted when `maxUsd` is set. A null estimate
|
|
344
|
-
* mid-run cannot trip the cap
|
|
346
|
+
* mid-run cannot trip the cap; preflight already guaranteed a rate exists, so a null here is a
|
|
345
347
|
* vanished-rate harness condition, not a silent uncapped pass.
|
|
346
348
|
*/
|
|
347
349
|
estimateTurnCostUsd?: (usage: ActorTokenUsage) => number | null;
|
|
348
350
|
/**
|
|
349
|
-
*
|
|
350
|
-
* point the per-
|
|
351
|
+
* Run-level spend guard: called with this participant's running usage each turn, at the same
|
|
352
|
+
* point the per-participant cap is checked. Returns a human-readable reason when the study's shared
|
|
351
353
|
* budget is exhausted, else null. On a non-null return the loop stops with `budget_reached`
|
|
352
|
-
* regardless of material progress
|
|
354
|
+
* regardless of material progress: a study-level stop is a recruiting decision hitting its
|
|
353
355
|
* limit, not this participant's runaway, so it never reads as `gave_up`.
|
|
354
356
|
*/
|
|
355
357
|
overRunBudget?: (usage: ActorTokenUsage) => string | null;
|
|
@@ -368,6 +370,9 @@ export interface CuaLoopOptions {
|
|
|
368
370
|
*
|
|
369
371
|
* Built-in caller: the external-public shared-world handoff (src/routes/shared-world/handoff.ts)
|
|
370
372
|
* latches the host participant's lobby URL and checks that each follower reached the same lobby.
|
|
373
|
+
*
|
|
374
|
+
* @deprecated Wrap the executor's `observe` and read `url` from each observation it returns. The
|
|
375
|
+
* next minor removes this option.
|
|
371
376
|
*/
|
|
372
377
|
onObservedUrl?: (url: string | undefined) => void;
|
|
373
378
|
/**
|
|
@@ -378,6 +383,9 @@ export interface CuaLoopOptions {
|
|
|
378
383
|
*
|
|
379
384
|
* Built-in caller: the external-public handoff scans the host's narration for the lobby code,
|
|
380
385
|
* because the E2B desktop's CDP URL read behind onObservedUrl is unreliable.
|
|
386
|
+
*
|
|
387
|
+
* @deprecated Wrap the provider's `nextTurn` and read `reasoning` and `message` from each turn it
|
|
388
|
+
* returns. The next minor removes this option.
|
|
381
389
|
*/
|
|
382
390
|
onMessage?: (text: string) => void;
|
|
383
391
|
/**
|
|
@@ -387,10 +395,13 @@ export interface CuaLoopOptions {
|
|
|
387
395
|
*
|
|
388
396
|
* Built-in caller: the external-public handoff reads the lobby code off each participant's own
|
|
389
397
|
* frame until that participant has one: the host's latch, or a follower's convergence observation.
|
|
398
|
+
*
|
|
399
|
+
* @deprecated Wrap the executor's `observe` and read `screenshot` from each observation it
|
|
400
|
+
* returns. The next minor removes this option.
|
|
390
401
|
*/
|
|
391
402
|
onScreenshot?: (frame: Buffer) => void;
|
|
392
403
|
/**
|
|
393
|
-
* Trace snapshot for a watcher
|
|
404
|
+
* Trace snapshot for a watcher: the redacted items recorded so far, with the running
|
|
394
405
|
* usage so a run can be priced in flight. Called after each checkpoint's screenshot (the initial
|
|
395
406
|
* observation and every acted turn, so a flush never shows an action without the frame before
|
|
396
407
|
* it), after each dwell frame, and after a closing request. The array is a fresh copy; its items
|
|
@@ -80,7 +80,7 @@ export class UsageLedger {
|
|
|
80
80
|
cachedInput = 0;
|
|
81
81
|
cacheWriteInput = 0;
|
|
82
82
|
output = 0;
|
|
83
|
-
// Per model-inference usage, in order
|
|
83
|
+
// Per model-inference usage, in order: the recorded fact long-context pricing tiers
|
|
84
84
|
// need. A continuing native tool interaction may contain several inference requests.
|
|
85
85
|
turns = [];
|
|
86
86
|
/** An interaction turn arrived without complete usage, or its receipt said usage is incomplete. */
|
|
@@ -245,7 +245,7 @@ export class UsageLedger {
|
|
|
245
245
|
input: this.input,
|
|
246
246
|
output: this.output,
|
|
247
247
|
// Recorded only when the provider actually reported it, so a reader can tell "no cache
|
|
248
|
-
// hits" from "this provider does not say"
|
|
248
|
+
// hits" from "this provider does not say"; same for cache writes.
|
|
249
249
|
...(this.cachedInput > 0 ? { cachedInput: this.cachedInput } : {}),
|
|
250
250
|
...(this.cacheWriteInput > 0 ? { cacheWriteInput: this.cacheWriteInput } : {}),
|
|
251
251
|
...(this.turns.length > 0 ? { turns: this.turns.map((turn) => ({ ...turn })) } : {}),
|
|
@@ -187,11 +187,11 @@ function stopBeforeActing(session, turn, turnNumber) {
|
|
|
187
187
|
return stops.accountBilledCaps;
|
|
188
188
|
if (turn.interruption !== undefined) {
|
|
189
189
|
// Preserve usage and partial narration of an interrupted response. Its usage still counts
|
|
190
|
-
// toward the study budget; when that exhausts it, sibling
|
|
191
|
-
const
|
|
190
|
+
// toward the study budget; when that exhausts it, sibling participants stop, so this trace says why.
|
|
191
|
+
const runBudgetStop = overRunBudget?.(session.usage.forCap());
|
|
192
192
|
recordNarration(session, turn, turnNumber, "interrupted");
|
|
193
|
-
if (
|
|
194
|
-
session.trace.record("notice", () => notice("warn", "study budget reached during an interrupted response",
|
|
193
|
+
if (runBudgetStop != null) {
|
|
194
|
+
session.trace.record("notice", () => notice("warn", "study budget reached during an interrupted response", runBudgetStop));
|
|
195
195
|
}
|
|
196
196
|
return stops.providerInterrupted(turn.interruption);
|
|
197
197
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** The estimated input a carried conversation may reach before its oldest turns are summarized. */
|
|
2
|
+
export declare const CONTEXT_TOKEN_BUDGET = 64000;
|
|
3
|
+
/** What the next request would carry, for the trace. */
|
|
4
|
+
export interface CarriedContextSize {
|
|
5
|
+
readonly exchanges: number;
|
|
6
|
+
readonly screenshots: number;
|
|
7
|
+
readonly notedTurns: number;
|
|
8
|
+
readonly estimatedTokens: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class CarriedConversation {
|
|
11
|
+
private readonly budget;
|
|
12
|
+
private opening;
|
|
13
|
+
private readonly exchanges;
|
|
14
|
+
/** The latest accepted reply's output items, which the next request answers. */
|
|
15
|
+
private pending;
|
|
16
|
+
private readonly notes;
|
|
17
|
+
private notesDropped;
|
|
18
|
+
private collapsedTurns;
|
|
19
|
+
constructor(budget?: number);
|
|
20
|
+
/**
|
|
21
|
+
* Record an accepted reply. `sent` is what that request added after the carried items: the
|
|
22
|
+
* opening message on the first request, then the call outputs and any hint.
|
|
23
|
+
*/
|
|
24
|
+
accept(turn: number, sent: readonly unknown[], output: readonly unknown[]): void;
|
|
25
|
+
/** The items to send ahead of a request's own new items. */
|
|
26
|
+
carried(): unknown[];
|
|
27
|
+
/** The carried context's size, for the trace. */
|
|
28
|
+
size(): CarriedContextSize;
|
|
29
|
+
private trim;
|
|
30
|
+
private noteItem;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A rough input-token estimate: images by their size in 32-pixel patches, everything else at four
|
|
34
|
+
* characters a token. It decides when to trim, not what is billed; the trace records the billed
|
|
35
|
+
* input per request beside it.
|
|
36
|
+
*/
|
|
37
|
+
export declare function estimateTokens(items: readonly unknown[]): number;
|