humanish 0.108.0 → 0.109.1
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 +58 -59
- package/CHANGELOG.md +22 -0
- package/CONTEXT.md +44 -44
- package/README.md +3 -3
- package/TELEMETRY.md +2 -2
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/restricted-participant.js +12 -12
- package/dist/actors/codex/restricted-session.d.ts +2 -2
- package/dist/actors/computer-use/actor.d.ts +6 -6
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +2 -2
- package/dist/actors/computer-use/admission-limit.js +3 -3
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.js +5 -5
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +1 -1
- package/dist/actors/computer-use/loop/ending.js +12 -11
- package/dist/actors/computer-use/loop/observation.js +6 -5
- package/dist/actors/computer-use/loop/provider-call.js +11 -11
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +2 -2
- package/dist/actors/computer-use/loop/trace.js +3 -2
- package/dist/actors/computer-use/loop/types.d.ts +24 -24
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-provider.d.ts +2 -2
- package/dist/actors/computer-use/openai-provider.js +8 -8
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +4 -4
- package/dist/actors/contract.js +1 -1
- package/dist/actors/local-agent/claude-session.js +3 -3
- package/dist/actors/local-agent/cli.d.ts +1 -1
- package/dist/actors/local-agent/cli.js +1 -1
- package/dist/actors/reasoning-effort.js +3 -3
- package/dist/actors/registry.d.ts +2 -2
- package/dist/actors/registry.js +3 -3
- package/dist/actors/scripted-browser/actor.d.ts +2 -2
- package/dist/actors/scripted-browser/actor.js +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/comms.js +14 -22
- package/dist/cli/commands/migrate.js +15 -4
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +0 -15
- package/dist/cli/commands/run-command.d.ts +2 -2
- package/dist/cli/commands/run-command.js +3 -3
- package/dist/cli/commands/runs.js +9 -7
- package/dist/cli/commands/setup.js +5 -7
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
- package/dist/cli/commands/study.js +13 -49
- package/dist/cli/commands/tui.js +12 -12
- package/dist/cli/commands/watch.js +30 -65
- package/dist/cli/deprecations.d.ts +1 -13
- package/dist/cli/deprecations.js +0 -30
- package/dist/cli/doctor.d.ts +3 -3
- package/dist/cli/doctor.js +16 -16
- package/dist/cli/first-run-path.d.ts +4 -4
- package/dist/cli/first-run-path.js +7 -7
- package/dist/cli/io.d.ts +3 -3
- package/dist/cli/io.js +2 -2
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +2 -2
- package/dist/cli/orientation.d.ts +4 -4
- package/dist/cli/orientation.js +58 -20
- package/dist/cli/program.js +3 -4
- package/dist/cli/telemetry.d.ts +1 -1
- package/dist/cli/telemetry.js +14 -20
- package/dist/comms/catch-host.d.ts +1 -1
- package/dist/comms/catch-host.js +3 -3
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +4 -3
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch.d.ts +2 -2
- package/dist/comms/sandbox-catch.js +2 -2
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +29 -32
- package/dist/evidence/redaction.d.ts +11 -0
- package/dist/evidence/redaction.js +43 -0
- package/dist/feedback/draft.js +2 -2
- package/dist/feedback/export-bundle.js +5 -4
- package/dist/feedback/export.js +3 -2
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +17 -17
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +5 -5
- package/dist/index.d.ts +13 -15
- package/dist/index.js +6 -8
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +1 -1
- package/dist/observer/data.d.ts +1 -1
- package/dist/observer/library.d.ts +2 -0
- package/dist/observer/library.js +4 -1
- package/dist/observer/render.js +7 -1
- package/dist/observer/run-routes.d.ts +1 -0
- package/dist/observer/run-routes.js +37 -12
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer-app.html +1 -1
- package/dist/routes/computer-use/bundle-parts.js +3 -2
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +7 -6
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
- package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
- package/dist/routes/computer-use/external-comms.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +11 -10
- package/dist/routes/computer-use/fanout-records.js +2 -2
- package/dist/routes/computer-use/in-process-desktop.js +1 -1
- package/dist/routes/computer-use/live-flush.d.ts +3 -3
- package/dist/routes/computer-use/live-phase.d.ts +2 -3
- package/dist/routes/computer-use/live-phase.js +3 -3
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +2 -2
- package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
- package/dist/routes/computer-use/participant-desktop.js +1 -1
- package/dist/routes/computer-use/participant-execution.js +1 -1
- package/dist/routes/computer-use/participant-model.js +3 -3
- package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
- package/dist/routes/computer-use/participant-prompt.js +3 -3
- package/dist/routes/computer-use/participant-runs.d.ts +10 -10
- package/dist/routes/computer-use/participant-runs.js +14 -13
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +27 -27
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +5 -5
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +3 -2
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +13 -12
- package/dist/routes/computer-use/route.d.ts +12 -12
- package/dist/routes/computer-use/route.js +19 -19
- package/dist/routes/computer-use/self-report.js +1 -1
- package/dist/routes/computer-use/setup.d.ts +22 -22
- package/dist/routes/computer-use/setup.js +15 -15
- package/dist/routes/computer-use/single-bundle.d.ts +4 -4
- package/dist/routes/computer-use/single-bundle.js +14 -13
- package/dist/routes/computer-use/subject-projection.d.ts +3 -3
- package/dist/routes/computer-use/types.d.ts +34 -34
- package/dist/routes/computer-use/types.js +3 -3
- package/dist/routes/preview.d.ts +6 -6
- package/dist/routes/preview.js +5 -5
- package/dist/routes/scripted/bundle.d.ts +6 -6
- package/dist/routes/scripted/bundle.js +10 -9
- package/dist/routes/scripted/plan.d.ts +7 -7
- package/dist/routes/scripted/plan.js +6 -6
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +9 -9
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +11 -11
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +4 -4
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +3 -3
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +2 -2
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +17 -17
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +3 -3
- package/dist/routes/shared-world/bundle.js +15 -14
- package/dist/routes/shared-world/checkpoints.d.ts +3 -3
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +9 -9
- package/dist/routes/shared-world/comms.js +6 -5
- package/dist/routes/shared-world/participant-specs.d.ts +3 -3
- package/dist/routes/shared-world/participant-specs.js +7 -7
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +9 -9
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +4 -4
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +11 -10
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +19 -19
- package/dist/routes/shared-world/setup.d.ts +13 -13
- package/dist/routes/shared-world/setup.js +19 -19
- package/dist/routes/shared-world/types.d.ts +27 -27
- package/dist/routes/terminal/adapter.d.ts +2 -2
- package/dist/routes/terminal/adapter.js +4 -4
- package/dist/routes/terminal/bundle.d.ts +11 -11
- package/dist/routes/terminal/bundle.js +12 -12
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +5 -5
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +9 -9
- package/dist/routes/terminal/ledger.d.ts +2 -2
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +7 -7
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +3 -2
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +2 -2
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +5 -5
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +7 -7
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +14 -14
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +7 -7
- package/dist/routes/terminal/trace.d.ts +2 -2
- package/dist/routes/terminal/types.d.ts +24 -24
- package/dist/routes/terminal/types.js +2 -2
- package/dist/run/bundle.d.ts +7 -7
- package/dist/run/bundle.js +2 -2
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +72 -43
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +2 -2
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.js +2 -2
- package/dist/run/projection.d.ts +32 -32
- package/dist/run/projection.js +44 -44
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +1 -1
- package/dist/run/results.d.ts +2 -2
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +11 -1
- package/dist/run/run-index.js +63 -49
- package/dist/run/run.d.ts +3 -3
- package/dist/run/run.js +2 -2
- package/dist/run/shared-world-evidence.d.ts +1 -1
- package/dist/run/shared-world-shape.js +1 -1
- package/dist/run/stats.d.ts +3 -3
- package/dist/run/stats.js +14 -14
- package/dist/run/status.d.ts +10 -2
- package/dist/run/status.js +6 -3
- package/dist/run/streams.d.ts +2 -2
- package/dist/run/study-provenance.d.ts +4 -2
- package/dist/run/study-provenance.js +7 -4
- package/dist/run/study-result.d.ts +0 -5
- package/dist/run/study-result.js +1 -1
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -45
- package/dist/{lab → study}/adapter-extension.d.ts +8 -20
- package/dist/{lab → study}/adapter-extension.js +2 -14
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
- package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +12 -12
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +37 -20
- package/dist/study/convert.d.ts +1 -1
- package/dist/study/convert.js +15 -15
- package/dist/{lab → study}/device-presets.d.ts +2 -2
- package/dist/{lab → study}/discover.d.ts +29 -23
- package/dist/{lab → study}/discover.js +97 -118
- package/dist/{lab → study}/doctor.d.ts +11 -11
- package/dist/{lab → study}/doctor.js +18 -18
- package/dist/study/files.d.ts +2 -2
- package/dist/study/files.js +6 -5
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/{lab → study}/init-templates.js +16 -11
- package/dist/{lab → study}/init.d.ts +1 -1
- package/dist/{lab → study}/init.js +7 -4
- package/dist/{lab → study}/keys.d.ts +2 -2
- package/dist/{lab → study}/keys.js +10 -10
- package/dist/study/migrate.d.ts +8 -3
- package/dist/study/migrate.js +60 -4
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +5 -5
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
- package/dist/{lab → study}/parse/study-v3.js +3 -3
- package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
- package/dist/{lab → study}/parse/subject-state.js +4 -4
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +8 -8
- package/dist/{lab → study}/parse/values.d.ts +2 -2
- package/dist/{lab → study}/persona-resolve.d.ts +4 -4
- package/dist/{lab → study}/persona-resolve.js +2 -2
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +10 -10
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +28 -28
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/{lab → study}/plan.js +20 -20
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +9 -8
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +3 -3
- package/dist/{lab → study}/preflight.d.ts +31 -31
- package/dist/{lab → study}/preflight.js +8 -8
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +12 -12
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +4 -4
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
- package/dist/study/run-study-homes.js +3 -0
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +16 -15
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +10 -10
- package/dist/{lab → study}/summary.js +15 -15
- package/dist/{lab → study}/tasks.d.ts +3 -3
- package/dist/{lab → study}/tasks.js +1 -1
- package/dist/{lab → study}/types.d.ts +104 -104
- package/dist/{lab → study}/types.js +1 -1
- package/dist/{lab → study}/validation.d.ts +19 -19
- package/dist/{lab → study}/validation.js +13 -13
- package/dist/{lab → study}/warnings.d.ts +4 -4
- package/dist/{lab → study}/warnings.js +1 -1
- package/dist/subject/clone.d.ts +6 -6
- package/dist/subject/clone.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +3 -3
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/runtime.js +2 -2
- package/dist/subject/serve.d.ts +4 -4
- package/dist/subject/state.d.ts +3 -3
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +1 -1
- package/dist/subject/steps.js +1 -1
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +1 -1
- package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
- package/dist/substrates/e2b/desktop-browser.js +1 -1
- package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
- package/dist/substrates/e2b/desktop-cdp.js +1 -1
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +12 -12
- package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
- package/dist/substrates/e2b/desktop-geometry.js +1 -1
- package/dist/substrates/e2b/desktop-media.d.ts +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +3 -3
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +1 -1
- package/dist/substrates/e2b/sdk.js +1 -1
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/contract.d.ts +8 -8
- package/dist/tui/contract.js +2 -2
- package/dist/tui/launch.d.ts +3 -3
- package/dist/tui/launch.js +22 -16
- package/dist/tui-app.js +139 -139
- package/dist/verify/subject.d.ts +1 -1
- package/dist/verify/subject.js +1 -1
- package/dist/verify/verify.js +2 -1
- package/docs/architecture/actor-contract.md +5 -5
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/external-public-shared-world.md +8 -7
- package/docs/architecture/github-feedback-loop.md +1 -1
- package/docs/architecture/task-protocol-support.md +1 -1
- package/docs/architecture/terminal-product-route.md +18 -18
- package/docs/contracts/adapter-fixtures.md +2 -2
- package/docs/contracts/errors.md +8 -8
- package/docs/contracts/run-bundle.md +6 -4
- package/docs/contracts/schemas.md +61 -42
- package/docs/contracts/study-analysis.md +4 -1
- package/docs/contracts/study-costs.md +17 -2
- package/examples/README.md +1 -1
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +2 -1
- package/skills/humanish/SKILL.md +8 -6
- package/skills/humanish/agents/openai.yaml +1 -1
- package/dist/cli/commands/lab-format.d.ts +0 -9
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/deprecated-fields.d.ts +0 -10
- package/dist/lab/deprecated-fields.js +0 -24
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/plan.d.ts +0 -13
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -8
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-homes.js +0 -7
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/library-aliases.d.ts +0 -56
- package/dist/library-aliases.js +0 -22
- package/dist/run-lab.d.ts +0 -112
- /package/dist/{lab → study}/device-presets.js +0 -0
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/parse/comms.js +0 -0
- /package/dist/{lab → study}/parse/execution.js +0 -0
- /package/dist/{lab → study}/parse/values.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
- /package/dist/{lab → study}/routing.js +0 -0
|
@@ -2,7 +2,7 @@ import type { HeardSpeech } from "../speech.js";
|
|
|
2
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
|
-
import type {
|
|
5
|
+
import type { StudyTask } from "../../../study/tasks.js";
|
|
6
6
|
import type { ReasoningEffort } from "../../reasoning-effort.js";
|
|
7
7
|
/**
|
|
8
8
|
* One desktop action. `heldKeys` on a pointer action are held down for the whole action and
|
|
@@ -80,7 +80,7 @@ export interface CuaObservation {
|
|
|
80
80
|
* in-memory progress key is derived from it. A structured blob has no detectable secret shape
|
|
81
81
|
* (the published-evidence scan catches only secret-shaped patterns), so it is handled like
|
|
82
82
|
* stateSignature, which is never written as text either. Persisting it would need a stringified
|
|
83
|
-
* projection through redaction.redactText and the
|
|
83
|
+
* projection through redaction.redactText and the run's scrubText, with its fields capped or
|
|
84
84
|
* allowlisted, since pattern and literal redaction cannot sanitize an arbitrary blob.
|
|
85
85
|
*/
|
|
86
86
|
appState?: Record<string, unknown>;
|
|
@@ -301,7 +301,7 @@ export interface CuaLoopOptions {
|
|
|
301
301
|
/**
|
|
302
302
|
* Extra literal scrub for known provisioned values (which have no detectable "shape", so
|
|
303
303
|
* pattern redaction cannot catch them), composed before redactText on every model-authored
|
|
304
|
-
* text item (reasoning, message, completion summary) and the loop error. The
|
|
304
|
+
* text item (reasoning, message, completion summary) and the loop error. The route passes the
|
|
305
305
|
* env-value scrubber here so a value the model narrates can never land raw in the trace.
|
|
306
306
|
* Default: identity (the loop is shape-only on its own).
|
|
307
307
|
*/
|
|
@@ -324,19 +324,19 @@ export interface CuaLoopOptions {
|
|
|
324
324
|
/** Injected pause for the dwell window's cadence; tests advance their clock through it. */
|
|
325
325
|
sleep?: (ms: number) => Promise<void>;
|
|
326
326
|
/**
|
|
327
|
-
* The
|
|
327
|
+
* The study's declared protocol: discrete tasks whose completion is corroborated by the
|
|
328
328
|
* same observations stopWhen reads, on the same cadence. The tracker never influences the loop's
|
|
329
329
|
* control flow: a completed task list does not stop a session (that is stopWhen's job); it only
|
|
330
330
|
* records the funnel that lands on the trace. The participant-facing halves of these tasks are
|
|
331
331
|
* already in `instructions` (composed upstream); the loop reads only the `success` criteria,
|
|
332
332
|
* which never reach the prompt.
|
|
333
333
|
*/
|
|
334
|
-
tasks?: readonly
|
|
334
|
+
tasks?: readonly StudyTask[];
|
|
335
335
|
/**
|
|
336
336
|
* Spend cap in USD. When set, the loop stops with budget_reached as soon as the running
|
|
337
337
|
* estimated spend crosses it, before the next provider turn. Absent means uncapped. maxUsd: 0
|
|
338
338
|
* can still permit one model request before its reported spend trips the check. Enforcement
|
|
339
|
-
* needs an estimate, so
|
|
339
|
+
* needs an estimate, so humanish refuses a cap on an unpriced model at preflight.
|
|
340
340
|
*/
|
|
341
341
|
maxUsd?: number;
|
|
342
342
|
/**
|
|
@@ -363,6 +363,22 @@ export interface CuaLoopOptions {
|
|
|
363
363
|
* built-in route sets it.
|
|
364
364
|
*/
|
|
365
365
|
requireReportedUsageForSpendCap?: boolean;
|
|
366
|
+
/**
|
|
367
|
+
* Trace snapshot for a watcher: the redacted items recorded so far, with the running
|
|
368
|
+
* usage so a run can be priced in flight. Called after each checkpoint's screenshot (the initial
|
|
369
|
+
* observation and every acted turn, so a flush never shows an action without the frame before
|
|
370
|
+
* it), after each dwell frame, and after a closing request. The array is a fresh copy; its items
|
|
371
|
+
* are the objects the final trace persists. Not awaited, so a slow flush cannot stall a turn.
|
|
372
|
+
* Default: no-op.
|
|
373
|
+
*/
|
|
374
|
+
onTrace?: (items: readonly ActorTraceItem[], usage: ActorTokenUsage, metadata?: CuaLiveMetadata) => void;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* The runtime-only taps the external-public shared-world handoff (src/routes/shared-world/handoff.ts)
|
|
378
|
+
* reads the lobby code through. Internal: 0.109.0 removed them from CuaLoopOptions, and a library
|
|
379
|
+
* caller wraps the executor's `observe` or the provider's `nextTurn` instead.
|
|
380
|
+
*/
|
|
381
|
+
export interface LoopTaps {
|
|
366
382
|
/**
|
|
367
383
|
* Runtime-only URL tap: called with `observation.url` for each observation a turn may receive
|
|
368
384
|
* (the initial one, each post-action one and the one after a dwell window). The loop never
|
|
@@ -370,9 +386,6 @@ export interface CuaLoopOptions {
|
|
|
370
386
|
*
|
|
371
387
|
* Built-in caller: the external-public shared-world handoff (src/routes/shared-world/handoff.ts)
|
|
372
388
|
* 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.
|
|
376
389
|
*/
|
|
377
390
|
onObservedUrl?: (url: string | undefined) => void;
|
|
378
391
|
/**
|
|
@@ -383,9 +396,6 @@ export interface CuaLoopOptions {
|
|
|
383
396
|
*
|
|
384
397
|
* Built-in caller: the external-public handoff scans the host's narration for the lobby code,
|
|
385
398
|
* 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.
|
|
389
399
|
*/
|
|
390
400
|
onMessage?: (text: string) => void;
|
|
391
401
|
/**
|
|
@@ -395,21 +405,11 @@ export interface CuaLoopOptions {
|
|
|
395
405
|
*
|
|
396
406
|
* Built-in caller: the external-public handoff reads the lobby code off each participant's own
|
|
397
407
|
* 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.
|
|
401
408
|
*/
|
|
402
409
|
onScreenshot?: (frame: Buffer) => void;
|
|
403
|
-
/**
|
|
404
|
-
* Trace snapshot for a watcher: the redacted items recorded so far, with the running
|
|
405
|
-
* usage so a run can be priced in flight. Called after each checkpoint's screenshot (the initial
|
|
406
|
-
* observation and every acted turn, so a flush never shows an action without the frame before
|
|
407
|
-
* it), after each dwell frame, and after a closing request. The array is a fresh copy; its items
|
|
408
|
-
* are the objects the final trace persists. Not awaited, so a slow flush cannot stall a turn.
|
|
409
|
-
* Default: no-op.
|
|
410
|
-
*/
|
|
411
|
-
onTrace?: (items: readonly ActorTraceItem[], usage: ActorTokenUsage, metadata?: CuaLiveMetadata) => void;
|
|
412
410
|
}
|
|
411
|
+
/** The loop's options inside humanish: the public ones plus the handoff's taps. */
|
|
412
|
+
export type LoopRunOptions = CuaLoopOptions & LoopTaps;
|
|
413
413
|
export type CuaLiveMetadata = Pick<ActorTrace, "executionProfile" | "providerRequests" | "historyTurnsOmitted">;
|
|
414
414
|
/** What runComputerUseLoop returns; the public name for an actor session result. */
|
|
415
415
|
export type CuaLoopResult = ActorSessionResult;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ActorProviderRequest, ActorTokenUsage, ProviderRequestReceipt } from "../../contract.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ComputerUseProviderError } from "../provider-error.js";
|
|
3
3
|
import type { CuaLiveMetadata, CuaProvider, CuaTurn } from "./types.js";
|
|
4
4
|
type TurnUsage = NonNullable<CuaTurn["usage"]>;
|
|
5
5
|
/** Turn usage with valid input and output counts, cache counts within input, and turns that add up. */
|
|
@@ -67,7 +67,7 @@ export declare class UsageLedger {
|
|
|
67
67
|
* Book one settled single-dispatch request. A request that settles while a continuing request
|
|
68
68
|
* is open belongs to that interaction, whatever kind the caller asked for.
|
|
69
69
|
*/
|
|
70
|
-
settle(kind: "interaction" | "debrief", receipt: ProviderRequestReceipt, usage: ActorTokenUsage | undefined, error:
|
|
70
|
+
settle(kind: "interaction" | "debrief", receipt: ProviderRequestReceipt, usage: ActorTokenUsage | undefined, error: ComputerUseProviderError | undefined): "interaction" | "debrief";
|
|
71
71
|
/**
|
|
72
72
|
* The running usage both spend guards price: totals plus the per-inference ledger, shaped like
|
|
73
73
|
* the trace's final tokenUsage so one estimator prices both. Unlike the persisted trace, where an
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CuaLoopOptions, CuaLoopResult } from "./loop/types.js";
|
|
1
|
+
import type { CuaLoopOptions, CuaLoopResult, LoopRunOptions } from "./loop/types.js";
|
|
2
2
|
export type { CuaAction, CuaExecutor, CuaLiveMetadata, CuaLoopOptions, CuaLoopResult, CuaObservation, CuaProvider, CuaSafetyCheck, CuaSpendGate, CuaTurn, CuaTurnRequest, } from "./loop/types.js";
|
|
3
3
|
export { describeCuaAction } from "./loop/actions.js";
|
|
4
4
|
export { stableProgressKey } from "./loop/backstop.js";
|
|
@@ -9,3 +9,8 @@ export { validClosingReport } from "./loop/debrief.js";
|
|
|
9
9
|
* it is recorded; screenshots are persisted raw unless redactScreenshots is set.
|
|
10
10
|
*/
|
|
11
11
|
export declare function runComputerUseLoop(options: CuaLoopOptions): Promise<CuaLoopResult>;
|
|
12
|
+
/**
|
|
13
|
+
* runComputerUseLoop with the external-public handoff's taps (LoopTaps), which the public
|
|
14
|
+
* options no longer carry. The actor's entry.
|
|
15
|
+
*/
|
|
16
|
+
export declare function runComputerUseLoopWithTaps(options: LoopRunOptions): Promise<CuaLoopResult>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComputerUseProviderError } from "./provider-error.js";
|
|
2
2
|
import { runActionBatch } from "./loop/actions.js";
|
|
3
3
|
import { advanceBackstop, startBackstop } from "./loop/backstop.js";
|
|
4
4
|
import { requestDebrief } from "./loop/debrief.js";
|
|
@@ -20,6 +20,28 @@ export { validClosingReport } from "./loop/debrief.js";
|
|
|
20
20
|
* it is recorded; screenshots are persisted raw unless redactScreenshots is set.
|
|
21
21
|
*/
|
|
22
22
|
export async function runComputerUseLoop(options) {
|
|
23
|
+
refuseRemovedOptions(options);
|
|
24
|
+
return runComputerUseLoopWithTaps(options);
|
|
25
|
+
}
|
|
26
|
+
/** What 0.109.0 removed from CuaLoopOptions, and what a caller does instead. */
|
|
27
|
+
const REMOVED_OPTIONS = {
|
|
28
|
+
onObservedUrl: "Wrap the executor's `observe` and read `url` from each observation it returns.",
|
|
29
|
+
onMessage: "Wrap the provider's `nextTurn` and read `reasoning` and `message` from each turn it returns.",
|
|
30
|
+
onScreenshot: "Wrap the executor's `observe` and read `screenshot` from each observation it returns.",
|
|
31
|
+
};
|
|
32
|
+
/** A JavaScript caller still passing a removed option gets an error, not a hook that never fires. */
|
|
33
|
+
function refuseRemovedOptions(options) {
|
|
34
|
+
for (const [name, replacement] of Object.entries(REMOVED_OPTIONS)) {
|
|
35
|
+
if (options[name] !== undefined) {
|
|
36
|
+
throw new TypeError(`runComputerUseLoop: ${name} was removed in 0.109.0. ${replacement}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* runComputerUseLoop with the external-public handoff's taps (LoopTaps), which the public
|
|
42
|
+
* options no longer carry. The actor's entry.
|
|
43
|
+
*/
|
|
44
|
+
export async function runComputerUseLoopWithTaps(options) {
|
|
23
45
|
refuseAccountBilledCaps(options);
|
|
24
46
|
const session = new LoopSession(options);
|
|
25
47
|
const conversation = {
|
|
@@ -132,7 +154,7 @@ function applyBackstop(session, conversation, step, turnHints) {
|
|
|
132
154
|
}
|
|
133
155
|
function refuseAccountBilledCaps(options) {
|
|
134
156
|
if (accountBillingConflicts(options.provider, options)) {
|
|
135
|
-
throw new
|
|
157
|
+
throw new ComputerUseProviderError("request_rejected", {
|
|
136
158
|
dispatched: false,
|
|
137
159
|
usageComplete: false,
|
|
138
160
|
cleanup: "confirmed",
|
|
@@ -201,7 +223,7 @@ function stopBeforeActing(session, turn, turnNumber) {
|
|
|
201
223
|
}
|
|
202
224
|
return undefined;
|
|
203
225
|
}
|
|
204
|
-
/** Hand the turn's narration to the onMessage
|
|
226
|
+
/** Hand the turn's narration to the onMessage tap; see LoopTaps.onMessage. */
|
|
205
227
|
function forwardNarration(session, turn) {
|
|
206
228
|
const { onMessage } = session.settings;
|
|
207
229
|
const narration = [turn.reasoning, turn.message]
|
|
@@ -241,7 +263,7 @@ function reviewSafetyChecks(session, conversation, turn) {
|
|
|
241
263
|
const { acknowledgeSafetyChecks } = session;
|
|
242
264
|
const acks = acknowledgeSafetyChecks(turn.pendingSafetyChecks);
|
|
243
265
|
if (acks === null || acks.length === 0) {
|
|
244
|
-
return stops.blockedOnSafetyChecks(session.settings.redaction.redactText(turn.pendingSafetyChecks.map((check) => check.code).join(", ")));
|
|
266
|
+
return stops.blockedOnSafetyChecks(session.settings.redaction.redactText(turn.pendingSafetyChecks.map((check) => check.code).join(", ")), turn.pendingSafetyChecks.length);
|
|
245
267
|
}
|
|
246
268
|
conversation.acknowledgedSafetyChecks = acks;
|
|
247
269
|
return undefined;
|
|
@@ -5,8 +5,8 @@ import type { ReasoningEffort } from "../reasoning-effort.js";
|
|
|
5
5
|
export declare const OPENAI_RESPONSES_CU_CAPABILITIES: ActorCapabilities;
|
|
6
6
|
export declare const DEFAULT_OPENAI_CU_MODEL = "gpt-5.6-sol";
|
|
7
7
|
/**
|
|
8
|
-
* The effort a request carries when a
|
|
9
|
-
* exists as a literal inside the provider is exactly how it stayed invisible: the
|
|
8
|
+
* The effort a request carries when a study declares none. Exported because a default that only
|
|
9
|
+
* exists as a literal inside the provider is exactly how it stayed invisible: the study surface has
|
|
10
10
|
* to be able to say what will actually run.
|
|
11
11
|
*/
|
|
12
12
|
export declare const DEFAULT_OPENAI_CU_REASONING_EFFORT: ReasoningEffort;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { validClosingReport } from "./loop.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { ComputerUseAdmissionLimitError, isComputerUseAdmissionLimitError, } from "./admission-limit.js";
|
|
3
|
+
import { ComputerUsePromptRefusedError } from "./provider-error.js";
|
|
4
4
|
import { CarriedConversation } from "./openai-context.js";
|
|
5
5
|
import { acceptReply, ConversationRecord, debriefRequestBody, turnInputItems, turnRequestBody, } from "./openai-requests.js";
|
|
6
6
|
import { asRecord, optionalString, parseOpenAiResponse, } from "./openai-wire.js";
|
|
@@ -56,8 +56,8 @@ export const OPENAI_RESPONSES_CU_CAPABILITIES = {
|
|
|
56
56
|
// rate-table key stay stable if OpenAI repoints the alias.
|
|
57
57
|
export const DEFAULT_OPENAI_CU_MODEL = "gpt-5.6-sol";
|
|
58
58
|
/**
|
|
59
|
-
* The effort a request carries when a
|
|
60
|
-
* exists as a literal inside the provider is exactly how it stayed invisible: the
|
|
59
|
+
* The effort a request carries when a study declares none. Exported because a default that only
|
|
60
|
+
* exists as a literal inside the provider is exactly how it stayed invisible: the study surface has
|
|
61
61
|
* to be able to say what will actually run.
|
|
62
62
|
*/
|
|
63
63
|
export const DEFAULT_OPENAI_CU_REASONING_EFFORT = "medium";
|
|
@@ -280,8 +280,8 @@ async function postResponse(transport, body, signal, retries, interaction, spend
|
|
|
280
280
|
catch (error) {
|
|
281
281
|
// An explicit local pre-dispatch limit is terminal. Recreate the fixed safe payload
|
|
282
282
|
// rather than propagating caller-added message/context through the transport seam.
|
|
283
|
-
if (
|
|
284
|
-
throw new
|
|
283
|
+
if (isComputerUseAdmissionLimitError(error))
|
|
284
|
+
throw new ComputerUseAdmissionLimitError();
|
|
285
285
|
// Dispatch may have reached the provider. Preserve this uncertainty even when a later
|
|
286
286
|
// retry succeeds or is refused locally; only that later refusal is known not to dispatch.
|
|
287
287
|
// Under a spend gate the loop accounts for the attempt instead: it books a resend below
|
|
@@ -317,7 +317,7 @@ async function postResponse(transport, body, signal, retries, interaction, spend
|
|
|
317
317
|
}
|
|
318
318
|
// A usage-policy flag is terminal for this prompt: typed so the loop names it, never retried.
|
|
319
319
|
if (namedProviderErrorCode(bodyText) === "invalid_prompt") {
|
|
320
|
-
throw new
|
|
320
|
+
throw new ComputerUsePromptRefusedError("OpenAI", "400 invalid_prompt");
|
|
321
321
|
}
|
|
322
322
|
const detail = requestRejectionDetail(bodyText);
|
|
323
323
|
throw new Error(`OpenAI Responses 400${detail === undefined ? "" : ` ${detail}`}`);
|
|
@@ -452,7 +452,7 @@ export function createOpenAiResponsesProvider(options) {
|
|
|
452
452
|
return {
|
|
453
453
|
id: "openai-responses-cu",
|
|
454
454
|
version: model,
|
|
455
|
-
// The effort the wire actually carries, not the one the
|
|
455
|
+
// The effort the wire actually carries, not the one the study asked for: the provider defaults
|
|
456
456
|
// an absent request to "medium", and the trace has to say what produced it.
|
|
457
457
|
modelSettings: {
|
|
458
458
|
reasoningEffort,
|
|
@@ -5,23 +5,23 @@ export declare const isCuaProviderFailurePhase: (value: unknown) => value is Cua
|
|
|
5
5
|
declare const codes: readonly ["request_rejected", "unavailable", "busy", "refused", "invalid_response", "protocol_error", "timeout", "cancelled", "process_failed", "cleanup_unconfirmed"];
|
|
6
6
|
export type CuaProviderErrorCode = (typeof codes)[number];
|
|
7
7
|
/** Safe local classification. Never attach provider prose, stderr, paths or a raw cause. */
|
|
8
|
-
export declare class
|
|
8
|
+
export declare class ComputerUseProviderError extends Error {
|
|
9
9
|
readonly code: CuaProviderErrorCode;
|
|
10
10
|
readonly receipt: ProviderRequestReceipt;
|
|
11
11
|
readonly usage?: ActorTokenUsage;
|
|
12
12
|
readonly failurePhase?: CuaProviderFailurePhase;
|
|
13
13
|
constructor(code: CuaProviderErrorCode, receipt: ProviderRequestReceipt, usage?: ActorTokenUsage, failurePhase?: CuaProviderFailurePhase);
|
|
14
14
|
}
|
|
15
|
-
export declare const
|
|
15
|
+
export declare const isComputerUseProviderError: (value: unknown) => value is ComputerUseProviderError;
|
|
16
16
|
/**
|
|
17
17
|
* The model provider refused the request under its usage policy (OpenAI `invalid_prompt`). A
|
|
18
18
|
* refusal is the provider's decision about this prompt, so it is not a harness fault, and sending
|
|
19
19
|
* the same prompt again is not a recovery path. `providerCode` is the provider's identifier only;
|
|
20
20
|
* the provider's message can echo the prompt and is never attached.
|
|
21
21
|
*/
|
|
22
|
-
export declare class
|
|
22
|
+
export declare class ComputerUsePromptRefusedError extends Error {
|
|
23
23
|
readonly providerCode: string;
|
|
24
24
|
constructor(provider: string, providerCode: string);
|
|
25
25
|
}
|
|
26
|
-
export declare const
|
|
26
|
+
export declare const isComputerUsePromptRefusedError: (value: unknown) => value is ComputerUsePromptRefusedError;
|
|
27
27
|
export {};
|
|
@@ -24,7 +24,7 @@ const codes = Object.freeze([
|
|
|
24
24
|
]);
|
|
25
25
|
const errors = new WeakSet();
|
|
26
26
|
/** Safe local classification. Never attach provider prose, stderr, paths or a raw cause. */
|
|
27
|
-
export class
|
|
27
|
+
export class ComputerUseProviderError extends Error {
|
|
28
28
|
code;
|
|
29
29
|
receipt;
|
|
30
30
|
usage;
|
|
@@ -50,7 +50,7 @@ export class CuaProviderError extends Error {
|
|
|
50
50
|
throw new TypeError("Invalid participant provider error declaration.");
|
|
51
51
|
}
|
|
52
52
|
super(`Participant provider: ${code}`);
|
|
53
|
-
this.name = "
|
|
53
|
+
this.name = "ComputerUseProviderError";
|
|
54
54
|
this.code = code;
|
|
55
55
|
this.receipt = Object.freeze({
|
|
56
56
|
dispatched: receipt.dispatched,
|
|
@@ -66,7 +66,7 @@ export class CuaProviderError extends Error {
|
|
|
66
66
|
errors.add(this);
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
export const
|
|
69
|
+
export const isComputerUseProviderError = (value) => typeof value === "object" && value !== null && errors.has(value);
|
|
70
70
|
const refusals = new WeakSet();
|
|
71
71
|
/**
|
|
72
72
|
* The model provider refused the request under its usage policy (OpenAI `invalid_prompt`). A
|
|
@@ -74,13 +74,13 @@ const refusals = new WeakSet();
|
|
|
74
74
|
* the same prompt again is not a recovery path. `providerCode` is the provider's identifier only;
|
|
75
75
|
* the provider's message can echo the prompt and is never attached.
|
|
76
76
|
*/
|
|
77
|
-
export class
|
|
77
|
+
export class ComputerUsePromptRefusedError extends Error {
|
|
78
78
|
providerCode;
|
|
79
79
|
constructor(provider, providerCode) {
|
|
80
80
|
super(`${provider} refused the prompt under its usage policy (${providerCode})`);
|
|
81
|
-
this.name = "
|
|
81
|
+
this.name = "ComputerUsePromptRefusedError";
|
|
82
82
|
this.providerCode = providerCode;
|
|
83
83
|
refusals.add(this);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
export const
|
|
86
|
+
export const isComputerUsePromptRefusedError = (value) => typeof value === "object" && value !== null && refusals.has(value);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AffordanceUse } from "./affordance.js";
|
|
2
2
|
import type { ActorEstimatedCost } from "../run/pricing.js";
|
|
3
|
-
import type { TaskFunnel } from "../
|
|
3
|
+
import type { TaskFunnel } from "../study/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
|
/**
|
|
@@ -271,7 +271,7 @@ export interface ActorTrace {
|
|
|
271
271
|
* carried. Present on traces whose provider declares settings; absent everywhere else and on
|
|
272
272
|
* every pre-existing bundle, and its absence is tolerated by verify.
|
|
273
273
|
*
|
|
274
|
-
* It exists because effort was a silent constant: unreachable from a
|
|
274
|
+
* It exists because effort was a silent constant: unreachable from a study, so every run took the
|
|
275
275
|
* provider default. Effort is part of who the participant was, not of how the instrument was
|
|
276
276
|
* tuned (docs/principles/actor-fidelity.md), so a trace that does not carry it is a result with
|
|
277
277
|
* half its sample description missing, and two such traces cannot be compared.
|
|
@@ -294,8 +294,8 @@ export interface ActorTrace {
|
|
|
294
294
|
affordanceUse?: AffordanceUse;
|
|
295
295
|
/**
|
|
296
296
|
* Additive + optional task funnel (humanish.task-funnel.v1): how far this participant got
|
|
297
|
-
* through the
|
|
298
|
-
* actor's own narration. Present only when the
|
|
297
|
+
* through the study's declared protocol, corroborated per task by observations rather than by the
|
|
298
|
+
* actor's own narration. Present only when the study declared `tasks` and the session ran; absent
|
|
299
299
|
* on every pre-existing bundle and on dry-run contract bundles (a funnel that
|
|
300
300
|
* was never measured is not an empty funnel). Its absence is tolerated by verify.
|
|
301
301
|
*/
|
package/dist/actors/contract.js
CHANGED
|
@@ -6,7 +6,7 @@ import { isCuaProviderFailurePhase, } from "./computer-use/provider-error.js";
|
|
|
6
6
|
// The schema maps the providers and routes implemented by the closed first-party
|
|
7
7
|
// registry. The broader Actor.run(input) and ApprovalPolicy contract remains
|
|
8
8
|
// design-only and is intentionally absent from these runtime types. RedactionHooks
|
|
9
|
-
// (src/evidence/redaction.ts) and ResolvedPersona (src/
|
|
9
|
+
// (src/evidence/redaction.ts) and ResolvedPersona (src/study/persona.ts) ship in
|
|
10
10
|
// their own modules.
|
|
11
11
|
export const ACTOR_TRACE_SCHEMA = "humanish.actor-trace.v1";
|
|
12
12
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Why: `actors[].localAgent: codex` already runs through a persistent app-server thread,
|
|
4
4
|
// so the participant remembers what it tried. `claude` spawned `claude -p` per turn, so every
|
|
5
|
-
// turn started cold. Measured on the same
|
|
5
|
+
// turn started cold. Measured on the same study 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.
|
|
@@ -22,7 +22,7 @@ import { mkdtemp, rm, unlink, writeFile } from "node:fs/promises";
|
|
|
22
22
|
import { tmpdir } from "node:os";
|
|
23
23
|
import path from "node:path";
|
|
24
24
|
import readline from "node:readline";
|
|
25
|
-
import {
|
|
25
|
+
import { ComputerUseProviderError } from "../computer-use/provider-error.js";
|
|
26
26
|
import { declaredOutcomeOf, parseAgentJson, promptFor, toCuaActions, LOCAL_AGENT_CAPABILITIES, } from "./cli.js";
|
|
27
27
|
/** How long Claude Code may take to acknowledge an interrupt before the session is ended. */
|
|
28
28
|
const INTERRUPT_RECEIPT_TIMEOUT_MS = 5_000;
|
|
@@ -289,7 +289,7 @@ export async function startClaudeSession(options = {}) {
|
|
|
289
289
|
usageIncomplete = true;
|
|
290
290
|
if (error instanceof ClaudeSessionDesyncError) {
|
|
291
291
|
// The stream no longer pairs results with turns, so no later turn can trust it.
|
|
292
|
-
throw new
|
|
292
|
+
throw new ComputerUseProviderError("protocol_error", {
|
|
293
293
|
dispatched: "unknown",
|
|
294
294
|
usageComplete: false,
|
|
295
295
|
cleanup: "unconfirmed",
|
|
@@ -49,7 +49,7 @@ export interface LocalAgentProviderOptions {
|
|
|
49
49
|
timeoutMs?: number;
|
|
50
50
|
/**
|
|
51
51
|
* Recorded in the trace's model settings. Low by default: a computer-use run is sixty turns, and
|
|
52
|
-
* a high-effort answer per turn costs minutes. The
|
|
52
|
+
* a high-effort answer per turn costs minutes. The study can raise it.
|
|
53
53
|
*/
|
|
54
54
|
reasoningEffort?: ReasoningEffort;
|
|
55
55
|
/** Model override passed to the CLI (`--model`). Absent = the CLI's own default. */
|
|
@@ -401,7 +401,7 @@ export const NO_LOCAL_AGENT_MESSAGE = "no local coding agent found. openai-compu
|
|
|
401
401
|
/** Doctor's row for one installed agent, in the register the other rows use. */
|
|
402
402
|
export function localAgentDoctorMessage(agent) {
|
|
403
403
|
if (agent.authStatus === "authenticated")
|
|
404
|
-
return `${agent.label} reports signed in; a
|
|
404
|
+
return `${agent.label} reports signed in; a study with actors[0].type: local-agent can use it instead of a provider API key. Account access and limits are untested.`;
|
|
405
405
|
const status = agent.id === "codex" ? "codex login status" : "claude auth status";
|
|
406
406
|
return agent.authStatus === "unauthenticated"
|
|
407
407
|
? `${agent.label} is installed and reports not signed in; run \`${agent.id === "codex" ? "codex login" : "claude auth login"}\``
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// The provider-declared reasoning-effort vocabulary, kept in its own module so the
|
|
1
|
+
// The provider-declared reasoning-effort vocabulary, kept in its own module so the study schema and
|
|
2
2
|
// the OpenAI provider can share it without the schema depending on a provider.
|
|
3
3
|
//
|
|
4
|
-
// Why this exists: effort was reachable in the provider and unreachable from a
|
|
4
|
+
// Why this exists: effort was reachable in the provider and unreachable from a study. Every
|
|
5
5
|
// computer-use run humanish had ever done was therefore the provider default, not by decision but
|
|
6
6
|
// by omission. Effort changes who the participant is, the same way a persona prompt does
|
|
7
7
|
// (docs/principles/actor-fidelity.md: capability settings are recruiting decisions), so pinning it
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
//
|
|
11
11
|
// Support is model-dependent. OpenAI documents the vocabulary below as the union across models and
|
|
12
12
|
// states plainly that "supported values are model-dependent"; there is no offline way to know which
|
|
13
|
-
// subset a given model id accepts. So this module refuses to pretend: it validates that a
|
|
13
|
+
// subset a given model id accepts. So this module refuses to pretend: it validates that a study asked
|
|
14
14
|
// for a real effort level, and a model that does not support the one it was asked for fails on the
|
|
15
15
|
// first turn with the provider's own message rather than being silently downgraded. Silent
|
|
16
16
|
// downgrade is the worse failure: it would record an effort the run did not actually use.
|
|
@@ -31,7 +31,7 @@ export type ActorDescriptor = CodexActorDescriptor | CuaActorDescriptor | Script
|
|
|
31
31
|
* CuaActorDescriptor: its runSession takes CuaActorSessionOptions and returns a CuaLoopResult.
|
|
32
32
|
* Any future computer-use provider (e.g. stagehand-cua) must keep that session signature and add
|
|
33
33
|
* its id to CuaActorDescriptor["id"], so code narrowed by this guard can still tell the ids apart.
|
|
34
|
-
* This guard is what lets
|
|
34
|
+
* This guard is what lets humanish dispatch on capabilities rather than on hardcoded actor ids.
|
|
35
35
|
*/
|
|
36
36
|
export declare function isCuaActorDescriptor(descriptor: ActorDescriptor): descriptor is CuaActorDescriptor;
|
|
37
37
|
/**
|
|
@@ -39,7 +39,7 @@ export declare function isCuaActorDescriptor(descriptor: ActorDescriptor): descr
|
|
|
39
39
|
* "scripted-browser" run kind is a ScriptedBrowserActorDescriptor; runSession takes
|
|
40
40
|
* ScriptedBrowserSessionOptions and returns ScriptedBrowserSessionResult (trace fully formed,
|
|
41
41
|
* like the CUA shape; no separate toActorTrace). Any future scripted driver (e.g. a HAR
|
|
42
|
-
* replayer) must keep this signature; it is what lets
|
|
42
|
+
* replayer) must keep this signature; it is what lets humanish dispatch on capabilities.
|
|
43
43
|
*/
|
|
44
44
|
export declare function isScriptedBrowserActorDescriptor(descriptor: ActorDescriptor): descriptor is ScriptedBrowserActorDescriptor;
|
|
45
45
|
/**
|
package/dist/actors/registry.js
CHANGED
|
@@ -10,7 +10,7 @@ import { runScriptedBrowserSession, } from "./scripted-browser/actor.js";
|
|
|
10
10
|
* CuaActorDescriptor: its runSession takes CuaActorSessionOptions and returns a CuaLoopResult.
|
|
11
11
|
* Any future computer-use provider (e.g. stagehand-cua) must keep that session signature and add
|
|
12
12
|
* its id to CuaActorDescriptor["id"], so code narrowed by this guard can still tell the ids apart.
|
|
13
|
-
* This guard is what lets
|
|
13
|
+
* This guard is what lets humanish dispatch on capabilities rather than on hardcoded actor ids.
|
|
14
14
|
*/
|
|
15
15
|
export function isCuaActorDescriptor(descriptor) {
|
|
16
16
|
return descriptor.capabilities.lanes.includes("computer-use");
|
|
@@ -20,7 +20,7 @@ export function isCuaActorDescriptor(descriptor) {
|
|
|
20
20
|
* "scripted-browser" run kind is a ScriptedBrowserActorDescriptor; runSession takes
|
|
21
21
|
* ScriptedBrowserSessionOptions and returns ScriptedBrowserSessionResult (trace fully formed,
|
|
22
22
|
* like the CUA shape; no separate toActorTrace). Any future scripted driver (e.g. a HAR
|
|
23
|
-
* replayer) must keep this signature; it is what lets
|
|
23
|
+
* replayer) must keep this signature; it is what lets humanish dispatch on capabilities.
|
|
24
24
|
*/
|
|
25
25
|
export function isScriptedBrowserActorDescriptor(descriptor) {
|
|
26
26
|
return descriptor.capabilities.lanes.includes("scripted-browser");
|
|
@@ -74,7 +74,7 @@ export const actorRegistry = {
|
|
|
74
74
|
},
|
|
75
75
|
// The ActorId names the terminal-product dispatch slot; the live route records the concrete
|
|
76
76
|
// provider as "codex". keyPlacement "in-sandbox-command-scoped" is registry-declared and
|
|
77
|
-
// enforced by
|
|
77
|
+
// enforced by runTerminalProductStudy before it creates a sandbox, which is where this actor runs.
|
|
78
78
|
"codex-exec": {
|
|
79
79
|
id: "codex-exec",
|
|
80
80
|
label: "Codex Exec (autonomous terminal agent, in-sandbox)",
|
|
@@ -15,7 +15,7 @@ export interface ScriptedBrowserSessionOptions {
|
|
|
15
15
|
/** id = actors[0].persona ?? "scripted-journey"; promptDigest = journey.sourceDigest prefix
|
|
16
16
|
* (the step manifest is the "prompt"; no model prompt exists on this route). */
|
|
17
17
|
persona: ActorPersonaRef;
|
|
18
|
-
/** Journey wall-clock budget in ms; the
|
|
18
|
+
/** Journey wall-clock budget in ms; the route passes execution.timeoutMs or 300_000. */
|
|
19
19
|
timeoutMs: number;
|
|
20
20
|
/** Absolute; the session writes screenshots/ and traces/<surface>.json beneath it. */
|
|
21
21
|
artifactRoot: string;
|
|
@@ -45,5 +45,5 @@ export interface ScriptedBrowserSessionResult extends ActorSessionResult {
|
|
|
45
45
|
* approvals exist on a deterministic replay), asserted in tests.
|
|
46
46
|
*/
|
|
47
47
|
export declare function runScriptedBrowserSession(options: ScriptedBrowserSessionOptions): Promise<ScriptedBrowserSessionResult>;
|
|
48
|
-
/** Internal
|
|
48
|
+
/** Internal route seam: the run root is already prepared and must stay bound to that identity. */
|
|
49
49
|
export declare function runScriptedBrowserSessionInPreparedRoot(options: ScriptedBrowserSessionOptions, preparedArtifactRoot: PreparedOutputRoot): Promise<ScriptedBrowserSessionResult>;
|
|
@@ -69,7 +69,7 @@ export async function runScriptedBrowserSession(options) {
|
|
|
69
69
|
const preparedArtifactRoot = await prepareSelectedOutputDirectory(process.cwd(), options.artifactRoot);
|
|
70
70
|
return runScriptedBrowserSessionInPreparedRoot(options, preparedArtifactRoot);
|
|
71
71
|
}
|
|
72
|
-
/** Internal
|
|
72
|
+
/** Internal route seam: the run root is already prepared and must stay bound to that identity. */
|
|
73
73
|
export async function runScriptedBrowserSessionInPreparedRoot(options, preparedArtifactRoot) {
|
|
74
74
|
assertScriptedSessionPathIds(options);
|
|
75
75
|
await prepareContainedOutputDirectory(preparedArtifactRoot, "screenshots");
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { FinishedRun } from "../run/run.js";
|
|
2
2
|
import type { AnalysisConfig } from "./types.js";
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
3
|
+
import type { StudyDeps } from "../study/study-deps.js";
|
|
4
|
+
import type { StudyEvent } from "../study/run-study-events.js";
|
|
5
5
|
import { type AutomaticAnalysisDeps } from "./automatic.js";
|
|
6
6
|
import type { AutomaticAnalysisOutcome } from "./job.js";
|
|
7
7
|
/** What a route's input gives its analysis: the test's runner and deps, the signal and onEvent. */
|
|
8
8
|
export interface AnalysisInput {
|
|
9
|
-
readonly deps?: Pick<
|
|
9
|
+
readonly deps?: Pick<StudyDeps, "analysis">;
|
|
10
10
|
/** Cancels the analysis only. */
|
|
11
11
|
readonly analysisSignal?: AbortSignal;
|
|
12
12
|
/** Receives analysis-started and analysis-finished. */
|
|
13
|
-
readonly emit?: (event:
|
|
13
|
+
readonly emit?: (event: StudyEvent) => void;
|
|
14
14
|
}
|
|
15
15
|
export interface AutomaticAnalysisResult {
|
|
16
16
|
automaticAnalysis?: AutomaticAnalysisOutcome;
|
|
@@ -27,15 +27,15 @@ export declare function completeAutomaticAnalysis<T extends {
|
|
|
27
27
|
runId: string;
|
|
28
28
|
dryRun: boolean;
|
|
29
29
|
}>(result: T, finished: FinishedRun | undefined, config: AnalysisConfig | undefined, input: AnalysisInput | undefined, { trigger, preferLargerOutput, refusal, }?: {
|
|
30
|
-
/** "default" when the
|
|
30
|
+
/** "default" when the study declared no analysis; its missing-key skip is not a failure. */
|
|
31
31
|
trigger?: "default" | "explicit";
|
|
32
|
-
/** The
|
|
32
|
+
/** The study omitted an output limit, so a larger one may be used within the admission budget. */
|
|
33
33
|
preferLargerOutput?: boolean;
|
|
34
34
|
/** The route's reason not to analyze this run; see AutomaticAnalysisDeps.refusal. */
|
|
35
35
|
refusal?: AutomaticAnalysisDeps["refusal"];
|
|
36
36
|
}): Promise<T & AutomaticAnalysisResult>;
|
|
37
37
|
/**
|
|
38
|
-
* True when an analysis the
|
|
38
|
+
* True when an analysis the study never declared was refused because its conservative estimate is
|
|
39
39
|
* over the default cap. The author did not ask for it, so the refusal does not fail the run;
|
|
40
40
|
* `humanish analyze --max-cost` can still run it.
|
|
41
41
|
*/
|
|
@@ -72,7 +72,7 @@ export async function completeAutomaticAnalysis(result, finished, config, input,
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
* True when an analysis the
|
|
75
|
+
* True when an analysis the study never declared was refused because its conservative estimate is
|
|
76
76
|
* over the default cap. The author did not ask for it, so the refusal does not fail the run;
|
|
77
77
|
* `humanish analyze --max-cost` can still run it.
|
|
78
78
|
*/
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyRoute } from "../study/plan.js";
|
|
2
2
|
import type { AnalysisConfig } from "./types.js";
|
|
3
3
|
export declare const DEFAULT_ANALYSIS_TIMEOUT_MS = 600000;
|
|
4
4
|
export declare const DEFAULT_ANALYSIS_MODEL = "gpt-6-astra";
|
|
5
|
-
interface
|
|
5
|
+
interface StudyAnalysisSettings {
|
|
6
6
|
model?: string;
|
|
7
7
|
question?: string;
|
|
8
8
|
timeoutMs?: number;
|
|
9
9
|
}
|
|
10
|
-
/** The
|
|
11
|
-
export type
|
|
10
|
+
/** The study's review.analysis: a provider selection for a separate review after a live run. */
|
|
11
|
+
export type StudyAnalysis = StudyAnalysisSettings & ({
|
|
12
12
|
provider?: "openai";
|
|
13
13
|
maxCostUsd: number;
|
|
14
14
|
maxOutputTokens?: number;
|
|
@@ -17,7 +17,7 @@ export type LabAnalysis = LabAnalysisSettings & ({
|
|
|
17
17
|
maxCostUsd?: null;
|
|
18
18
|
maxOutputTokens?: null;
|
|
19
19
|
});
|
|
20
|
-
/** The spend cap on an analysis the
|
|
20
|
+
/** The spend cap on an analysis the study did not declare. */
|
|
21
21
|
export declare const DEFAULT_ANALYSIS_MAX_COST_USD = 3;
|
|
22
22
|
/** Called for parsed manifests and direct library configs, before participant execution. */
|
|
23
23
|
export declare function resolveAutomaticAnalysis(raw: unknown): {
|
|
@@ -36,6 +36,6 @@ export interface AutomaticAnalysisBudget {
|
|
|
36
36
|
trigger: "default" | "explicit";
|
|
37
37
|
}
|
|
38
38
|
/** Metadata only: resolving the future live-run budget never reads keys or dispatches. */
|
|
39
|
-
export declare function automaticAnalysisBudget(raw: unknown, route:
|
|
39
|
+
export declare function automaticAnalysisBudget(raw: unknown, route: StudyRoute): AutomaticAnalysisBudget | undefined;
|
|
40
40
|
export declare function formatAutomaticAnalysisBudget(budget: AutomaticAnalysisBudget): string;
|
|
41
41
|
export {};
|
|
@@ -22,7 +22,7 @@ const SENSITIVE_QUESTION = {
|
|
|
22
22
|
ok: false,
|
|
23
23
|
message: "review.analysis.question contains sensitive text and cannot be sent for analysis.",
|
|
24
24
|
};
|
|
25
|
-
/** The spend cap on an analysis the
|
|
25
|
+
/** The spend cap on an analysis the study did not declare. */
|
|
26
26
|
export const DEFAULT_ANALYSIS_MAX_COST_USD = 3;
|
|
27
27
|
/** Called for parsed manifests and direct library configs, before participant execution. */
|
|
28
28
|
export function resolveAutomaticAnalysis(raw) {
|