humanish 0.107.0 → 0.109.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 +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- 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-trace.js +2 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +20 -18
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- 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.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +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-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- 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/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- 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 +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- 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/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- 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} +17 -18
- 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} +7 -6
- 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} +10 -10
- 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} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- 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 +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- 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 +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- 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 +19 -19
- 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.d.ts +1 -1
- 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 +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- 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 +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- 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 +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- 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 +19 -7
- package/dist/run/run-index.js +77 -64
- 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 +6 -5
- package/dist/run/run.js +3 -3
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +37 -36
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- 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 +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- 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/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- 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 +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- 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 +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- 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 +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/README.md +1 -1
- 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/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -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 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- 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/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /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}/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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Find a Chromium binary on the host for the scripted browser: HUMANISH_BROWSER_COMMAND first, then
|
|
2
|
-
// the macOS Chrome path, then google-chrome, chromium and chromium-browser on PATH
|
|
2
|
+
// the macOS Chrome path, then google-chrome, chromium and chromium-browser on `PATH`. A candidate
|
|
3
3
|
// counts only if `--version` runs.
|
|
4
4
|
import { execFile } from "node:child_process";
|
|
5
5
|
import path from "node:path";
|
|
@@ -176,7 +176,7 @@ async function waitForPageText(page, expectedText, timeoutMs) {
|
|
|
176
176
|
}
|
|
177
177
|
export function buildBlockedBrowserPersonaSteps(args) {
|
|
178
178
|
// The journey never ran, so no screenshot was written for these steps. The
|
|
179
|
-
// failure
|
|
179
|
+
// failure is the evidence: keep the blocked status + reason, but omit the
|
|
180
180
|
// screenshot reference so the bundle never claims an artifact that does not
|
|
181
181
|
// exist (otherwise verify's missingLocalEvidenceArtifacts fails closed on
|
|
182
182
|
// evidence that was never meant to exist).
|
|
@@ -108,7 +108,7 @@ export interface BrowserPersonaStepCapture {
|
|
|
108
108
|
/**
|
|
109
109
|
* Path to the step screenshot the producer actually wrote. Omitted for blocked
|
|
110
110
|
* steps where the failure itself is the recorded evidence and no screenshot was
|
|
111
|
-
* written
|
|
111
|
+
* written: the bundle must not reference an artifact that does not exist. A step that
|
|
112
112
|
* ran and attempted a screenshot keeps this even when its assertions failed, so a broken
|
|
113
113
|
* producer still fails verify.
|
|
114
114
|
*/
|
|
@@ -14,7 +14,7 @@ export interface StopWhen {
|
|
|
14
14
|
any: StopWhenRule[];
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* A declared observation window
|
|
17
|
+
* A declared observation window: once `when` matches (or at the start, when `when` is
|
|
18
18
|
* absent), the harness holds the page for `ms`, captures a frame every `everyMs`, takes no action
|
|
19
19
|
* and requests no model turn, then hands control back to the participant (`then: continue`) or
|
|
20
20
|
* ends the session (`then: stop`). Bounded by the session budget: a window that would outlast it
|
|
@@ -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 study. */
|
|
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) {
|
|
@@ -2,7 +2,11 @@ import type { CodexAnalysisIdentity, AnalysisConfig } from "./types.js";
|
|
|
2
2
|
export declare const CODEX_ANALYSIS_MODEL: "gpt-6-astra";
|
|
3
3
|
/** Before dispatch, analysis replaces the default release with the detected one. */
|
|
4
4
|
export declare function codexAnalysisIdentity(model: string, cliVersion?: string): CodexAnalysisIdentity;
|
|
5
|
-
/** Execution admission:
|
|
5
|
+
/** Execution admission: an isolated-mode host, and an identity naming a release the launcher starts. */
|
|
6
6
|
export declare function validCodexAnalysisConfig(config: AnalysisConfig, platform?: NodeJS.Platform, arch?: string): boolean;
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Reading historical artifacts never inserts defaults or selects a launch policy: the restricted
|
|
9
|
+
* analyst's fixed identity, from any recordable release, so a change to launch admission never
|
|
10
|
+
* invalidates a saved report.
|
|
11
|
+
*/
|
|
8
12
|
export declare function validStoredCodexAnalysisConfig(config: AnalysisConfig): boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { defaultCodexCliVersion,
|
|
1
|
+
import { isRecordedCodexCliVersion } from "../actors/contract.js";
|
|
2
|
+
import { admitsCodexCliVersion, defaultCodexCliVersion, supportsIsolatedCodex, } from "../actors/codex/codex-admission.js";
|
|
3
3
|
import { RESTRICTED_CODEX_ANALYSIS_IDENTITY, RESTRICTED_CODEX_ANALYSIS_MODELS, } from "../actors/codex/restricted-policy.js";
|
|
4
|
-
/** This account route
|
|
4
|
+
/** This account route runs the releases codex-admission.ts admits, one model and one tool policy. */
|
|
5
5
|
const CODEX_ANALYSIS_TOOL_POLICY = RESTRICTED_CODEX_ANALYSIS_IDENTITY.toolPolicy;
|
|
6
6
|
export const CODEX_ANALYSIS_MODEL = RESTRICTED_CODEX_ANALYSIS_MODELS[0];
|
|
7
7
|
const CODEX_ANALYSIS_EFFORT = RESTRICTED_CODEX_ANALYSIS_IDENTITY.reasoningEffort;
|
|
@@ -26,13 +26,6 @@ export function codexAnalysisIdentity(model, cliVersion = defaultCodexCliVersion
|
|
|
26
26
|
cliVersion,
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
-
/** Reader profiles are append-only. A new launch qualification must not invalidate a saved report. */
|
|
30
|
-
const storedProfiles = RECORDED_CODEX_CLI_VERSIONS.map((cliVersion) => ({
|
|
31
|
-
cliVersion,
|
|
32
|
-
toolPolicy: "restricted-codex-v1",
|
|
33
|
-
model: "gpt-6-astra",
|
|
34
|
-
reasoningEffort: "low",
|
|
35
|
-
}));
|
|
36
29
|
function matchesProfile(config, expected) {
|
|
37
30
|
if (config.provider !== "codex")
|
|
38
31
|
return false;
|
|
@@ -54,16 +47,31 @@ function matchesProfile(config, expected) {
|
|
|
54
47
|
Object.keys(config.identity).length === Object.keys(expected).length &&
|
|
55
48
|
Object.entries(expected).every(([key, value]) => config.identity[key] === value));
|
|
56
49
|
}
|
|
57
|
-
/** Execution admission:
|
|
50
|
+
/** Execution admission: an isolated-mode host, and an identity naming a release the launcher starts. */
|
|
58
51
|
export function validCodexAnalysisConfig(config, platform = process.platform, arch = process.arch) {
|
|
59
52
|
if (config.provider !== "codex")
|
|
60
53
|
return false;
|
|
61
54
|
const cliVersion = config.identity?.cliVersion;
|
|
62
55
|
return (config.model === CODEX_ANALYSIS_MODEL &&
|
|
63
|
-
|
|
56
|
+
supportsIsolatedCodex(platform, arch) &&
|
|
57
|
+
typeof cliVersion === "string" &&
|
|
58
|
+
admitsCodexCliVersion(cliVersion) &&
|
|
64
59
|
matchesProfile(config, codexAnalysisIdentity(config.model, cliVersion)));
|
|
65
60
|
}
|
|
66
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* Reading historical artifacts never inserts defaults or selects a launch policy: the restricted
|
|
63
|
+
* analyst's fixed identity, from any recordable release, so a change to launch admission never
|
|
64
|
+
* invalidates a saved report.
|
|
65
|
+
*/
|
|
67
66
|
export function validStoredCodexAnalysisConfig(config) {
|
|
68
|
-
|
|
67
|
+
if (config.provider !== "codex")
|
|
68
|
+
return false;
|
|
69
|
+
const cliVersion = config.identity?.cliVersion;
|
|
70
|
+
return (isRecordedCodexCliVersion(cliVersion) &&
|
|
71
|
+
matchesProfile(config, identityFor({
|
|
72
|
+
cliVersion,
|
|
73
|
+
toolPolicy: "restricted-codex-v1",
|
|
74
|
+
model: "gpt-6-astra",
|
|
75
|
+
reasoningEffort: "low",
|
|
76
|
+
})));
|
|
69
77
|
}
|
|
@@ -3,7 +3,7 @@ import { type AnalysisFetch, type AnalysisProvider } from "./provider.js";
|
|
|
3
3
|
import type { RejectedAnalysisOutput } from "./diagnostics.js";
|
|
4
4
|
export declare const ANALYSIS_PROMPT_VERSION = "study-evidence-6";
|
|
5
5
|
export declare const isSupportedAnalysisModel: (model: string) => boolean;
|
|
6
|
-
/** The OpenAI output limit when a
|
|
6
|
+
/** The OpenAI output limit when a study omits maxOutputTokens, and the most it may ask for. */
|
|
7
7
|
export declare const DEFAULT_ANALYSIS_MAX_OUTPUT_TOKENS = 16384;
|
|
8
8
|
export declare const MAX_ANALYSIS_OUTPUT_TOKENS = 32768;
|
|
9
9
|
export interface AnalysisAdmission {
|
package/dist/analysis/execute.js
CHANGED
|
@@ -21,7 +21,7 @@ const SUPPORTED_ANALYSIS_MODELS = Object.freeze([
|
|
|
21
21
|
]);
|
|
22
22
|
const SUPPORTED_MODELS = new Set(SUPPORTED_ANALYSIS_MODELS);
|
|
23
23
|
export const isSupportedAnalysisModel = (model) => SUPPORTED_MODELS.has(model);
|
|
24
|
-
/** The OpenAI output limit when a
|
|
24
|
+
/** The OpenAI output limit when a study omits maxOutputTokens, and the most it may ask for. */
|
|
25
25
|
export const DEFAULT_ANALYSIS_MAX_OUTPUT_TOKENS = 16_384;
|
|
26
26
|
export const MAX_ANALYSIS_OUTPUT_TOKENS = 32_768;
|
|
27
27
|
const MAX_EVIDENCE_BYTES = 1024 * 1024;
|
package/dist/analysis/service.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defaultCodexCliVersion, describeCodexCliAdmission, } from "../actors/codex/codex-admission.js";
|
|
2
2
|
import { validCodexAnalysisConfig } from "./codex-config.js";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
4
|
import { lstat, mkdir, realpath, rmdir } from "node:fs/promises";
|
|
@@ -43,7 +43,7 @@ const messages = {
|
|
|
43
43
|
ANALYSIS_VERIFY_FAILED: "The run must pass verification before analysis.",
|
|
44
44
|
ANALYSIS_RUN_ACTIVE: "Analysis requires a completed recording. Wait for the study to finish.",
|
|
45
45
|
ANALYSIS_NO_PARTICIPANTS: "This run contains no participant evidence to analyze.",
|
|
46
|
-
ANALYSIS_REQUIRES_LIVE_RUN: "A dry
|
|
46
|
+
ANALYSIS_REQUIRES_LIVE_RUN: "A dry run has no participant behavior to analyze. Select a completed live run.",
|
|
47
47
|
ANALYSIS_SOURCE_UNAVAILABLE: "The source recording is missing, unsafe, or exceeds the input limit.",
|
|
48
48
|
ANALYSIS_SOURCE_CHANGED: "The source recording changed during analysis. The result cannot be published against different evidence.",
|
|
49
49
|
ANALYSIS_BUSY: "Another analysis holds this run's .analysis-lock directory. If it was interrupted, confirm it has stopped before removing that empty directory.",
|
|
@@ -56,9 +56,9 @@ const messages = {
|
|
|
56
56
|
};
|
|
57
57
|
const codexRecovery = {
|
|
58
58
|
analysis_codex_busy: "Another restricted Codex analyst or setup check is active in this process. Wait for it to finish, then explicitly retry.",
|
|
59
|
-
analysis_codex_unavailable: `The
|
|
60
|
-
analysis_codex_unsupported_version: `Codex
|
|
61
|
-
analysis_codex_incompatible_release: `This Codex CLI release changed app-server protocol fields humanish reads, so no request was sent; the warnings name each change. Install
|
|
59
|
+
analysis_codex_unavailable: `The Codex CLI is unavailable. Install one (${describeCodexCliAdmission()}) and sign in with a ChatGPT account, then retry --provider codex.`,
|
|
60
|
+
analysis_codex_unsupported_version: `This Codex CLI release is refused: ${describeCodexCliAdmission()}. \`humanish doctor\` names the release it found, why, and the command that replaces it.`,
|
|
61
|
+
analysis_codex_incompatible_release: `This Codex CLI release changed app-server protocol fields humanish reads, so no request was sent; the warnings name each change. Install the last tested release (${defaultCodexCliVersion()}), then retry.`,
|
|
62
62
|
analysis_codex_unsupported_platform: "This platform has not qualified the restricted Codex account launcher.",
|
|
63
63
|
analysis_codex_login_required: "Sign in to Codex with a ChatGPT account, then retry humanish analyze --provider codex --rerun.",
|
|
64
64
|
analysis_codex_unsupported_auth: "Codex analysis requires ChatGPT account authentication; API-key and custom provider authentication are not used as fallbacks.",
|
package/dist/analysis/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ActorStatus, ActorCompletionReason, ActorStopCause, ParticipantDeclaredOutcome } from "../actors/contract.js";
|
|
2
2
|
import type { CuaGoalSource } from "../actors/goal-source.js";
|
|
3
3
|
import type { AutomaticAnalysisView } from "./job.js";
|
|
4
|
+
import type { RunAnalysisCost } from "../run/run-cost.js";
|
|
4
5
|
/** Independent interpretation of retained evidence; never a participant or harness verdict. */
|
|
5
6
|
export declare const ANALYSIS_SCHEMA: "humanish.study-analysis.v1";
|
|
6
7
|
export declare const ANALYSIS_CORRECTION_SCHEMA: "humanish.study-analysis-correction.v1";
|
|
@@ -213,5 +214,10 @@ export interface LoadedAnalysis {
|
|
|
213
214
|
warnings: string[];
|
|
214
215
|
/** Independent post-run execution metadata; never changes evidence sharing grades. */
|
|
215
216
|
automatic?: AutomaticAnalysisView;
|
|
217
|
+
/**
|
|
218
|
+
* What the run's analysis requests cost, every attempt counted once (src/run/costs.ts
|
|
219
|
+
* readAnalysisAccounting, the reader stats uses). Absent when the run sent none.
|
|
220
|
+
*/
|
|
221
|
+
spend?: RunAnalysisCost;
|
|
216
222
|
}
|
|
217
223
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
|
|
2
2
|
import { BROWSER_CONTROL_LIMITS, BROWSER_CONTROL_VERSION, decodeBrowserControlObservation, parseBrowserControlReply, sameBrowserControlIdentity, validateBrowserControlAction, validateBrowserControlIdentity, } from "./protocol.js";
|
|
3
3
|
import { BrowserControlTransport } from "./transport.js";
|
|
4
4
|
import { receiveBrowserControlRecording } from "./recording-transfer.js";
|
|
@@ -8,7 +8,7 @@ export function createBrowserControlClient(options) {
|
|
|
8
8
|
if (!Number.isFinite(timeoutMs) ||
|
|
9
9
|
timeoutMs < 1 ||
|
|
10
10
|
timeoutMs > BROWSER_CONTROL_LIMITS.maxRequestTimeoutMs)
|
|
11
|
-
throw new
|
|
11
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
12
12
|
const state = {
|
|
13
13
|
identity,
|
|
14
14
|
timeoutMs,
|
|
@@ -47,7 +47,7 @@ function closeClient(state, code) {
|
|
|
47
47
|
state.pending = undefined;
|
|
48
48
|
if (operation) {
|
|
49
49
|
operation.dispose();
|
|
50
|
-
operation.reject(new
|
|
50
|
+
operation.reject(new ComputerUseExecutorError(code, operation.written ? "outcome_uncertain" : "not_dispatched"));
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
/** Settles the pending exchange once both its reply has arrived and its request write finished. */
|
|
@@ -68,7 +68,7 @@ function finishExchange(session) {
|
|
|
68
68
|
code !== "action_rejected" ||
|
|
69
69
|
disposition !== "not_dispatched")
|
|
70
70
|
session.transport.close(code);
|
|
71
|
-
operation.reject(new
|
|
71
|
+
operation.reject(new ComputerUseExecutorError(code, disposition));
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
/** Matches a reply frame to the pending request; any mismatch closes the channel. */
|
|
@@ -120,12 +120,12 @@ function acceptReply(session, value) {
|
|
|
120
120
|
function exchange(session, operation, action, signal, destination) {
|
|
121
121
|
const { transport } = session;
|
|
122
122
|
if (session.closed)
|
|
123
|
-
return Promise.reject(new
|
|
123
|
+
return Promise.reject(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
|
|
124
124
|
if (signal?.aborted)
|
|
125
|
-
return Promise.reject(new
|
|
125
|
+
return Promise.reject(new ComputerUseExecutorError("cancelled", "not_dispatched"));
|
|
126
126
|
if (session.seq >= Number.MAX_SAFE_INTEGER) {
|
|
127
127
|
transport.close("protocol_mismatch");
|
|
128
|
-
return Promise.reject(new
|
|
128
|
+
return Promise.reject(new ComputerUseExecutorError("protocol_mismatch", "not_dispatched"));
|
|
129
129
|
}
|
|
130
130
|
session.seq += 1;
|
|
131
131
|
const seq = session.seq;
|
|
@@ -174,9 +174,9 @@ function exchange(session, operation, action, signal, destination) {
|
|
|
174
174
|
/** Runs one public operation at a time on an open client. */
|
|
175
175
|
async function withOperation(session, work) {
|
|
176
176
|
if (session.closed)
|
|
177
|
-
throw new
|
|
177
|
+
throw new ComputerUseExecutorError("executor_closed", "not_dispatched");
|
|
178
178
|
if (session.busy)
|
|
179
|
-
throw new
|
|
179
|
+
throw new ComputerUseExecutorError("executor_busy", "not_dispatched");
|
|
180
180
|
session.busy = true;
|
|
181
181
|
try {
|
|
182
182
|
return await work();
|
|
@@ -202,34 +202,34 @@ async function observe(session) {
|
|
|
202
202
|
}
|
|
203
203
|
catch {
|
|
204
204
|
session.transport.close("invalid_response");
|
|
205
|
-
throw new
|
|
205
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
206
206
|
}
|
|
207
207
|
}
|
|
208
208
|
async function execute(session, action, signal) {
|
|
209
209
|
const validAction = validateBrowserControlAction(action);
|
|
210
210
|
if (validAction.kind === "speak" && !session.speechEnabled) {
|
|
211
|
-
throw new
|
|
211
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
212
212
|
}
|
|
213
213
|
if (signal?.aborted)
|
|
214
|
-
throw new
|
|
214
|
+
throw new ComputerUseExecutorError("cancelled", "not_dispatched");
|
|
215
215
|
try {
|
|
216
216
|
await hello(session, signal);
|
|
217
217
|
}
|
|
218
218
|
catch (error) {
|
|
219
|
-
if (error instanceof
|
|
220
|
-
throw new
|
|
219
|
+
if (error instanceof ComputerUseExecutorError)
|
|
220
|
+
throw new ComputerUseExecutorError(error.code, "not_dispatched");
|
|
221
221
|
throw error;
|
|
222
222
|
}
|
|
223
223
|
await exchange(session, "EXECUTE", validAction, signal);
|
|
224
224
|
}
|
|
225
225
|
async function finishRecording(session, destination) {
|
|
226
226
|
if (!destination || destination.destroyed)
|
|
227
|
-
throw new
|
|
227
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
228
228
|
try {
|
|
229
229
|
await hello(session);
|
|
230
230
|
const reply = await exchange(session, "FINISH_RECORDING", undefined, undefined, destination);
|
|
231
231
|
if (!reply.ok || !reply.recording)
|
|
232
|
-
throw new
|
|
232
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
233
233
|
return reply.recording;
|
|
234
234
|
}
|
|
235
235
|
catch (error) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
|
|
2
2
|
import { BROWSER_CONTROL_LIMITS, BROWSER_CONTROL_VERSION, encodeBrowserControlObservation, parseBrowserControlRequest, safeBrowserControlFailure, sameBrowserControlIdentity, validateBrowserControlIdentity, } from "./protocol.js";
|
|
3
3
|
import { BrowserControlTransport } from "./transport.js";
|
|
4
4
|
import { sendBrowserControlRecording } from "./recording-transfer.js";
|
|
@@ -103,7 +103,7 @@ function failure(common, error, invoked) {
|
|
|
103
103
|
async function dispatch(session, request, signal) {
|
|
104
104
|
const common = replyCommon(session.identity, request);
|
|
105
105
|
if (!authorized(session.options) || signal.aborted) {
|
|
106
|
-
const refusal = new
|
|
106
|
+
const refusal = new ComputerUseExecutorError("session_revoked", "not_dispatched");
|
|
107
107
|
await sendReply(session, request, failure(common, refusal, false));
|
|
108
108
|
return;
|
|
109
109
|
}
|
|
@@ -160,7 +160,7 @@ async function execute(session, request, common, signal) {
|
|
|
160
160
|
let invoked = false, reply;
|
|
161
161
|
try {
|
|
162
162
|
if (request.action.kind === "speak" && session.options.executor.speechEnabled !== true) {
|
|
163
|
-
throw new
|
|
163
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
164
164
|
}
|
|
165
165
|
// No await between the owner gate in dispatch and invocation. The physical driver must
|
|
166
166
|
// check this signal again immediately before each actual input after preparation.
|
|
@@ -183,7 +183,7 @@ async function finishRecording(session, request, common, signal) {
|
|
|
183
183
|
let reply;
|
|
184
184
|
try {
|
|
185
185
|
if (!options.finishRecording)
|
|
186
|
-
throw new
|
|
186
|
+
throw new ComputerUseExecutorError("action_rejected", "not_dispatched");
|
|
187
187
|
const recording = await options.finishRecording();
|
|
188
188
|
let metadata;
|
|
189
189
|
try {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PNG } from "pngjs";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { CUA_SPEECH_LIMITS } from "../actors/computer-use/speech.js";
|
|
4
|
-
import {
|
|
4
|
+
import { ComputerUseExecutorError, isComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
|
|
5
5
|
import { desktopRecordingMetadataSchema } from "../evidence/desktop-recording-types.js";
|
|
6
6
|
export const BROWSER_CONTROL_VERSION = 1;
|
|
7
7
|
export const BROWSER_CONTROL_LIMITS = Object.freeze({
|
|
@@ -219,7 +219,7 @@ const replySchema = z.discriminatedUnion("ok", [
|
|
|
219
219
|
export function validateBrowserControlIdentity(value) {
|
|
220
220
|
const parsed = identitySchema.safeParse(value);
|
|
221
221
|
if (!parsed.success)
|
|
222
|
-
throw new
|
|
222
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
223
223
|
return parsed.data;
|
|
224
224
|
}
|
|
225
225
|
export function sameBrowserControlIdentity(a, b) {
|
|
@@ -230,41 +230,41 @@ export function sameBrowserControlIdentity(a, b) {
|
|
|
230
230
|
export function parseBrowserControlRequest(value) {
|
|
231
231
|
const parsed = requestSchema.safeParse(value);
|
|
232
232
|
if (!parsed.success)
|
|
233
|
-
throw new
|
|
233
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
234
234
|
const request = parsed.data;
|
|
235
235
|
if (request.requestId !== `request-${request.seq}` ||
|
|
236
236
|
(request.operation === "EXECUTE" && request.actionId !== `action-${request.seq}`))
|
|
237
|
-
throw new
|
|
237
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
238
238
|
return request;
|
|
239
239
|
}
|
|
240
240
|
export function parseBrowserControlReply(value) {
|
|
241
241
|
const parsed = replySchema.safeParse(value);
|
|
242
242
|
if (!parsed.success)
|
|
243
|
-
throw new
|
|
243
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
244
244
|
const reply = parsed.data;
|
|
245
245
|
if ((reply.operation === "EXECUTE") !== (reply.actionId !== undefined) ||
|
|
246
246
|
(reply.ok &&
|
|
247
247
|
((reply.operation === "OBSERVE") !== (reply.observation !== undefined) ||
|
|
248
248
|
(reply.operation === "FINISH_RECORDING") !== (reply.recording !== undefined))))
|
|
249
|
-
throw new
|
|
249
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
250
250
|
return reply;
|
|
251
251
|
}
|
|
252
252
|
export function validateBrowserControlAction(value) {
|
|
253
253
|
const parsed = wireActionSchema.safeParse(value);
|
|
254
254
|
if (!parsed.success)
|
|
255
|
-
throw new
|
|
255
|
+
throw new ComputerUseExecutorError("invalid_request", "not_dispatched");
|
|
256
256
|
return parsed.data;
|
|
257
257
|
}
|
|
258
258
|
export function validateHeardSpeech(value) {
|
|
259
259
|
const parsed = heardSpeechListSchema.safeParse(value);
|
|
260
260
|
if (!parsed.success)
|
|
261
|
-
throw new
|
|
261
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
262
262
|
return parsed.data;
|
|
263
263
|
}
|
|
264
264
|
/** Check dimensions before allocating decoder output; v1 accepts browser-style 8-bit, noninterlaced PNG. */
|
|
265
265
|
export function validateBrowserControlPng(bytes) {
|
|
266
266
|
const fail = () => {
|
|
267
|
-
throw new
|
|
267
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
268
268
|
};
|
|
269
269
|
if (bytes.length < 45 ||
|
|
270
270
|
bytes.length > BROWSER_CONTROL_LIMITS.pngBytes ||
|
|
@@ -316,7 +316,7 @@ export function encodeBrowserControlObservation(observation) {
|
|
|
316
316
|
if (!observation ||
|
|
317
317
|
observation.appState !== undefined ||
|
|
318
318
|
!Buffer.isBuffer(observation.screenshot))
|
|
319
|
-
throw new
|
|
319
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
320
320
|
validateBrowserControlPng(observation.screenshot);
|
|
321
321
|
const parsed = observationSchema.safeParse({
|
|
322
322
|
png: observation.screenshot.toString("base64"),
|
|
@@ -328,17 +328,17 @@ export function encodeBrowserControlObservation(observation) {
|
|
|
328
328
|
...(observation.heardSpeech !== undefined ? { heardSpeech: observation.heardSpeech } : {}),
|
|
329
329
|
});
|
|
330
330
|
if (!parsed.success)
|
|
331
|
-
throw new
|
|
331
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
332
332
|
return parsed.data;
|
|
333
333
|
}
|
|
334
334
|
export function decodeBrowserControlObservation(value) {
|
|
335
335
|
const parsed = observationSchema.safeParse(value);
|
|
336
336
|
if (!parsed.success)
|
|
337
|
-
throw new
|
|
337
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
338
338
|
const { png, ...state } = parsed.data;
|
|
339
339
|
const screenshot = Buffer.from(png, "base64");
|
|
340
340
|
if (screenshot.toString("base64") !== png)
|
|
341
|
-
throw new
|
|
341
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
342
342
|
validateBrowserControlPng(screenshot);
|
|
343
343
|
return {
|
|
344
344
|
screenshot,
|
|
@@ -351,7 +351,7 @@ export function decodeBrowserControlObservation(value) {
|
|
|
351
351
|
};
|
|
352
352
|
}
|
|
353
353
|
export function safeBrowserControlFailure(error, dispatched) {
|
|
354
|
-
if (
|
|
354
|
+
if (isComputerUseExecutorError(error))
|
|
355
355
|
return { code: error.code, disposition: error.disposition };
|
|
356
356
|
return {
|
|
357
357
|
code: "action_rejected",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Transform } from "node:stream";
|
|
2
2
|
import { pipeline } from "node:stream/promises";
|
|
3
|
-
import {
|
|
3
|
+
import { ComputerUseExecutorError } from "../actors/computer-use/executor-error.js";
|
|
4
4
|
import { DESKTOP_RECORDING_MAX_BYTES } from "../evidence/desktop-recording-types.js";
|
|
5
5
|
const BROWSER_CONTROL_RECORDING_TRANSFER_TIMEOUT_MS = 120_000;
|
|
6
6
|
function exactBytes(expected) {
|
|
@@ -17,7 +17,7 @@ function exactBytes(expected) {
|
|
|
17
17
|
}
|
|
18
18
|
function validLength(bytes) {
|
|
19
19
|
if (!Number.isSafeInteger(bytes) || bytes < 1 || bytes > DESKTOP_RECORDING_MAX_BYTES) {
|
|
20
|
-
throw new
|
|
20
|
+
throw new ComputerUseExecutorError("invalid_response", "outcome_uncertain");
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
export async function receiveBrowserControlRecording(source, destination, bytes) {
|
|
@@ -28,7 +28,7 @@ export async function receiveBrowserControlRecording(source, destination, bytes)
|
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
catch {
|
|
31
|
-
throw new
|
|
31
|
+
throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
export async function sendBrowserControlRecording(source, destination, bytes) {
|
|
@@ -43,6 +43,6 @@ export async function sendBrowserControlRecording(source, destination, bytes) {
|
|
|
43
43
|
}
|
|
44
44
|
catch {
|
|
45
45
|
destination.destroy();
|
|
46
|
-
throw new
|
|
46
|
+
throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
|
|
47
47
|
}
|
|
48
48
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TextDecoder } from "node:util";
|
|
2
2
|
import { BROWSER_CONTROL_LIMITS } from "./protocol.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ComputerUseExecutorError, } from "../actors/computer-use/executor-error.js";
|
|
4
4
|
/** Owned byte channel only. This module never discovers endpoints or reconnects. */
|
|
5
5
|
export class BrowserControlTransport {
|
|
6
6
|
stream;
|
|
@@ -92,7 +92,7 @@ export class BrowserControlTransport {
|
|
|
92
92
|
/** Relinquish the live byte stream synchronously after a complete frame. */
|
|
93
93
|
handoff() {
|
|
94
94
|
if (this.ended || this.handedOff || this.payload !== undefined || this.headerUsed !== 0) {
|
|
95
|
-
throw new
|
|
95
|
+
throw new ComputerUseExecutorError("transport_failed", "outcome_uncertain");
|
|
96
96
|
}
|
|
97
97
|
this.handedOff = true;
|
|
98
98
|
clearTimeout(this.frameTimer);
|
|
@@ -112,9 +112,9 @@ export class BrowserControlTransport {
|
|
|
112
112
|
};
|
|
113
113
|
send(value, beforeWrite = () => { }) {
|
|
114
114
|
if (this.ended || this.handedOff)
|
|
115
|
-
return Promise.reject(new
|
|
115
|
+
return Promise.reject(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
|
|
116
116
|
if (this.sending)
|
|
117
|
-
return Promise.reject(new
|
|
117
|
+
return Promise.reject(new ComputerUseExecutorError("executor_busy", "not_dispatched"));
|
|
118
118
|
let payload;
|
|
119
119
|
try {
|
|
120
120
|
const json = JSON.stringify(value);
|
|
@@ -123,7 +123,7 @@ export class BrowserControlTransport {
|
|
|
123
123
|
payload = Buffer.from(json);
|
|
124
124
|
}
|
|
125
125
|
catch {
|
|
126
|
-
return Promise.reject(new
|
|
126
|
+
return Promise.reject(new ComputerUseExecutorError("invalid_request", "not_dispatched"));
|
|
127
127
|
}
|
|
128
128
|
const frame = Buffer.allocUnsafe(4 + payload.length);
|
|
129
129
|
frame.writeUInt32BE(payload.length);
|
|
@@ -144,7 +144,7 @@ export class BrowserControlTransport {
|
|
|
144
144
|
try {
|
|
145
145
|
beforeWrite();
|
|
146
146
|
if (this.ended) {
|
|
147
|
-
done(new
|
|
147
|
+
done(new ComputerUseExecutorError("executor_closed", "not_dispatched"));
|
|
148
148
|
return;
|
|
149
149
|
}
|
|
150
150
|
this.stream.write(frame, (error) => {
|
|
@@ -178,7 +178,7 @@ export class BrowserControlTransport {
|
|
|
178
178
|
this.stream.off("close", releaseListeners);
|
|
179
179
|
};
|
|
180
180
|
this.stream.once("close", releaseListeners);
|
|
181
|
-
this.pendingWrite?.(new
|
|
181
|
+
this.pendingWrite?.(new ComputerUseExecutorError(code, "outcome_uncertain"));
|
|
182
182
|
this.stream.destroy();
|
|
183
183
|
// A stream whose close event already happened will not emit it again. `closed`
|
|
184
184
|
// can also precede queued error/close events, so defer removal past native ticks.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { RunStudyOptions } from "../../run-study.js";
|
|
2
2
|
import type { CliIo } from "../io.js";
|
|
3
3
|
/**
|
|
4
4
|
* Post-run analysis cancellation for the CLI: while analysis runs, SIGINT, SIGTERM and SIGHUP abort
|
|
5
5
|
* it. The listeners exist only during analysis; before it, the run's own handlers
|
|
6
6
|
* (run-signals.ts) hold the signals and hand them over here.
|
|
7
7
|
*/
|
|
8
|
-
export declare function cliAnalysisOptions(io: Pick<CliIo, "writeErr">): Pick<
|
|
8
|
+
export declare function cliAnalysisOptions(io: Pick<CliIo, "writeErr">): Pick<RunStudyOptions, "onEvent" | "analysisSignal">;
|