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,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { defaultCodexCliVersion } from "./
|
|
3
|
-
import {
|
|
1
|
+
import {} from "../contract.js";
|
|
2
|
+
import { defaultCodexCliVersion, untestedOperatorReleaseWarning } from "./codex-admission.js";
|
|
3
|
+
import { ComputerUseProviderError, isComputerUseProviderError, } from "../computer-use/provider-error.js";
|
|
4
4
|
import { validateBrowserControlPng, validateHeardSpeech } from "../../browser-control/protocol.js";
|
|
5
5
|
import { createRestrictedCodexSession, } from "./restricted-session.js";
|
|
6
6
|
import { PARTICIPANT_PROFILE, PARTICIPANT_LIMITS as L, PARTICIPANT_FINAL_SCHEMA, participantToolSchema, parseParticipantTool, parseParticipantFinal, } from "./restricted-participant-policy.js";
|
|
@@ -38,6 +38,7 @@ function deferred() {
|
|
|
38
38
|
void promise.catch(() => undefined);
|
|
39
39
|
return { promise, resolve, reject };
|
|
40
40
|
}
|
|
41
|
+
// prose-check: model prompt (Codex reads this tool description, not a person)
|
|
41
42
|
const toolDescription = (speechEnabled) => `Act on the participant's browser through humanish. Submit one to four UI actions${speechEnabled ? ", including speak when you need to reply aloud," : ""} and a short public comment; never private reasoning. humanish returns a JSON STRING with execution acknowledgments${speechEnabled ? ", speech heard from the actual participant speaker sink," : ""} and a fresh screenshot. In Code Mode use: const r = JSON.parse(await tools.humanish_ui({narration: "...", actions: [...]})); text({acknowledgments: r.acknowledgments${speechEnabled ? ", heardSpeech: r.heardSpeech" : ""}, contextHint: r.contextHint, closing: r.closing}); image(r.imageUrl). Call serially and inspect each returned screenshot${speechEnabled ? " and heardSpeech array" : ""} before deciding what to do next.${speechEnabled ? " Use speak only after the visible UI shows that you joined the call and your microphone is unmuted; it sends audio into that call." : ""} Acknowledged input does not prove an application outcome. If closing is true, stop calling tools and give your final account.`;
|
|
42
43
|
const participantInstructions = (prompt, speechEnabled) => `${prompt}\n\nYou are the study participant throughout this conversation, including its closing account. Use only the supplied screenshots and humanish_ui tool to interact. The tool returns a JSON string: parse it, inspect acknowledgments${speechEnabled ? " and heardSpeech captured from the actual participant speaker sink" : ""}, and display imageUrl with Code Mode image(). Do not print the image data URL as text. Keep your persona and earlier observations throughout the session.${speechEnabled ? " A speak action plays into the participant microphone; use it only after the visible UI shows that you joined the call and the microphone is unmuted." : ""} Speak publicly about your experience, never reveal private reasoning. Completed inputs do not prove application outcomes; verify on the next screenshot. When the task ends, return only the required final JSON with outcome, summary and frictionReports. Report observed confusion and recovered mistakes as well as blockers. Do not invent observations.`;
|
|
43
44
|
/** Turns and failures from the native run, handed in order to the next provider request. */
|
|
@@ -149,15 +150,15 @@ const runReceipt = (result) => ({
|
|
|
149
150
|
*/
|
|
150
151
|
function finalTurn(result, receipt, usage, stopped) {
|
|
151
152
|
if (stopped.stopped)
|
|
152
|
-
throw new
|
|
153
|
+
throw new ComputerUseProviderError(stopped.failedCleanup ? "cleanup_unconfirmed" : "cancelled", receipt, usage, result.failurePhase);
|
|
153
154
|
if (result.status !== "completed" || result.errorCode !== null)
|
|
154
|
-
throw new
|
|
155
|
+
throw new ComputerUseProviderError(codeOf(result.errorCode), receipt, usage, result.failurePhase);
|
|
155
156
|
let turn;
|
|
156
157
|
try {
|
|
157
158
|
turn = parseParticipantFinal(result.output);
|
|
158
159
|
}
|
|
159
160
|
catch {
|
|
160
|
-
throw new
|
|
161
|
+
throw new ComputerUseProviderError("invalid_response", receipt, usage, "response");
|
|
161
162
|
}
|
|
162
163
|
return {
|
|
163
164
|
...turn,
|
|
@@ -238,8 +239,7 @@ export async function checkRestrictedCodexParticipantReadiness(options) {
|
|
|
238
239
|
* An operator-auth session has one only once it resolved a model on a ChatGPT account.
|
|
239
240
|
*/
|
|
240
241
|
function participantExecutionProfile(session, operator, effort) {
|
|
241
|
-
const
|
|
242
|
-
const cliVersion = isRecordedCodexCliVersion(detected) ? detected : defaultCodexCliVersion();
|
|
242
|
+
const cliVersion = session.cliVersion ?? defaultCodexCliVersion();
|
|
243
243
|
if (!operator)
|
|
244
244
|
return { ...PARTICIPANT_PROFILE, cliVersion };
|
|
245
245
|
return session.authentication === "chatgpt-account" && session.resolvedModel
|
|
@@ -284,8 +284,10 @@ function closeParticipantSession(state) {
|
|
|
284
284
|
}));
|
|
285
285
|
}
|
|
286
286
|
/** What the closed native session reports beside cleanup: its run warnings and a late refusal. */
|
|
287
|
-
function sessionReport(session) {
|
|
287
|
+
function sessionReport(session, operator) {
|
|
288
288
|
const warnings = [
|
|
289
|
+
// A resolved model means thread/start was admitted: the release actually launched.
|
|
290
|
+
untestedOperatorReleaseWarning(session.resolvedModel === undefined ? undefined : session.cliVersion, operator),
|
|
289
291
|
session.protocolIncompatibilities === undefined
|
|
290
292
|
? undefined
|
|
291
293
|
: protocolIncompatibilityMessage(session.cliVersion, session.protocolIncompatibilities),
|
|
@@ -338,9 +340,9 @@ function launchNativeRun(settings, state, req, imageUrl) {
|
|
|
338
340
|
catch (error) {
|
|
339
341
|
revokeParticipant(state);
|
|
340
342
|
state.events.emit({
|
|
341
|
-
error:
|
|
343
|
+
error: isComputerUseProviderError(error)
|
|
342
344
|
? error
|
|
343
|
-
: new
|
|
345
|
+
: new ComputerUseProviderError("process_failed", { dispatched: "unknown", usageComplete: false, cleanup: "unconfirmed" }, usage),
|
|
344
346
|
});
|
|
345
347
|
}
|
|
346
348
|
finally {
|
|
@@ -354,7 +356,7 @@ async function runParticipantTurn(settings, state, req, signal, debrief) {
|
|
|
354
356
|
return state.events.next();
|
|
355
357
|
if (signal.aborted) {
|
|
356
358
|
revokeParticipant(state);
|
|
357
|
-
throw new
|
|
359
|
+
throw new ComputerUseProviderError("cancelled", noDispatch());
|
|
358
360
|
}
|
|
359
361
|
const conversation = {
|
|
360
362
|
instructions: state.instructions,
|
|
@@ -363,7 +365,7 @@ async function runParticipantTurn(settings, state, req, signal, debrief) {
|
|
|
363
365
|
lastActionCount: state.lastActionCount,
|
|
364
366
|
};
|
|
365
367
|
if (rejectsParticipantRequest(req, conversation))
|
|
366
|
-
throw new
|
|
368
|
+
throw new ComputerUseProviderError("request_rejected", noDispatch());
|
|
367
369
|
const onAbort = () => {
|
|
368
370
|
revokeParticipant(state);
|
|
369
371
|
};
|
|
@@ -380,7 +382,7 @@ async function runParticipantTurn(settings, state, req, signal, debrief) {
|
|
|
380
382
|
else if (!state.active)
|
|
381
383
|
launchNativeRun(settings, state, req, imageUrl);
|
|
382
384
|
else
|
|
383
|
-
throw new
|
|
385
|
+
throw new ComputerUseProviderError("busy", noDispatch());
|
|
384
386
|
return await state.events.next();
|
|
385
387
|
}
|
|
386
388
|
finally {
|
|
@@ -424,7 +426,7 @@ function participantProvider(settings, state, start) {
|
|
|
424
426
|
export function createRestrictedCodexParticipant(options = {}) {
|
|
425
427
|
const timeoutMs = options.requestTimeoutMs ?? L.requestMs;
|
|
426
428
|
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > L.requestMs)
|
|
427
|
-
throw new
|
|
429
|
+
throw new ComputerUseProviderError("request_rejected", noDispatch());
|
|
428
430
|
const operator = options.authMode === "operator";
|
|
429
431
|
const speechEnabled = options.speechEnabled === true;
|
|
430
432
|
const settings = {
|
|
@@ -456,9 +458,9 @@ export function createRestrictedCodexParticipant(options = {}) {
|
|
|
456
458
|
let pending, closing;
|
|
457
459
|
const start = (req, signal, debrief) => {
|
|
458
460
|
if (state.closed && !state.events.waiting)
|
|
459
|
-
return Promise.reject(new
|
|
461
|
+
return Promise.reject(new ComputerUseProviderError("request_rejected", noDispatch()));
|
|
460
462
|
if (pending)
|
|
461
|
-
return Promise.reject(new
|
|
463
|
+
return Promise.reject(new ComputerUseProviderError("busy", noDispatch()));
|
|
462
464
|
const task = runParticipantTurn(settings, state, req, signal, debrief);
|
|
463
465
|
pending = task;
|
|
464
466
|
void task
|
|
@@ -481,7 +483,7 @@ export function createRestrictedCodexParticipant(options = {}) {
|
|
|
481
483
|
state.failedCleanup = true;
|
|
482
484
|
return {
|
|
483
485
|
status: state.failedCleanup ? "unconfirmed" : "confirmed",
|
|
484
|
-
...sessionReport(state.session),
|
|
486
|
+
...sessionReport(state.session, settings.operator),
|
|
485
487
|
};
|
|
486
488
|
})();
|
|
487
489
|
return closing;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ReasoningEffort } from "../reasoning-effort.js";
|
|
2
2
|
/** Versioned, deliberately narrow profile qualified with an account-backed vision turn.
|
|
3
3
|
* The CLI still advertises code-mode tools: disabling their host is the enforcement
|
|
4
|
-
* boundary. Feature names alone are not proof that a tool has been removed.
|
|
5
|
-
*
|
|
4
|
+
* boundary. Feature names alone are not proof that a tool has been removed. Which CLI
|
|
5
|
+
* releases launch is decided in codex-admission.ts. */
|
|
6
6
|
export declare const RESTRICTED_CODEX_ANALYSIS_IDENTITY: {
|
|
7
7
|
readonly provider: "codex";
|
|
8
8
|
readonly authMode: "chatgpt";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Versioned, deliberately narrow profile qualified with an account-backed vision turn.
|
|
2
2
|
* The CLI still advertises code-mode tools: disabling their host is the enforcement
|
|
3
|
-
* boundary. Feature names alone are not proof that a tool has been removed.
|
|
4
|
-
*
|
|
3
|
+
* boundary. Feature names alone are not proof that a tool has been removed. Which CLI
|
|
4
|
+
* releases launch is decided in codex-admission.ts. */
|
|
5
5
|
export const RESTRICTED_CODEX_ANALYSIS_IDENTITY = {
|
|
6
6
|
provider: "codex",
|
|
7
7
|
authMode: "chatgpt",
|
|
@@ -12,9 +12,9 @@ export interface RestrictedCodexSessionOptions {
|
|
|
12
12
|
/** The release a caller already recorded (an analysis identity); any other release is refused. */
|
|
13
13
|
cliVersion?: string;
|
|
14
14
|
/**
|
|
15
|
-
* Bypasses
|
|
16
|
-
*
|
|
17
|
-
* manifest, CLI flag,
|
|
15
|
+
* Bypasses launch admission: admits exactly this list. It exists only so
|
|
16
|
+
* scripts/codex-qualify.mjs can launch a candidate admission would refuse. No library export, study
|
|
17
|
+
* manifest, CLI flag, RunStudyOptions field or StudyDeps seam reaches it
|
|
18
18
|
* (tests/actors/codex/cli-versions-seam.test.ts).
|
|
19
19
|
*/
|
|
20
20
|
cliVersions?: readonly string[];
|
|
@@ -2,7 +2,7 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { chmod, lstat, mkdir, mkdtemp, readdir, realpath, rm, unlink, writeFile, } from "node:fs/promises";
|
|
3
3
|
import { homedir, tmpdir } from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { admitsCodexCliVersion, supportsIsolatedCodex } from "./codex-admission.js";
|
|
6
6
|
import { launchAdmittedAppServer, } from "./restricted-launch.js";
|
|
7
7
|
import { CODEX_IMAGE, CODEX_MAX_OUTPUT_BYTES, CODEX_MAX_REQUEST_BYTES, RESTRICTED_CODEX_ANALYSIS_MODELS, codexRecord, restrictedCodexFailure, restrictedCodexRequestError, } from "./restricted-policy.js";
|
|
8
8
|
import { RestrictedCodexDeadline, RestrictedCodexStop, hasUnclosedChildren, retainUnclosedChild, } from "./restricted-transport.js";
|
|
@@ -312,11 +312,16 @@ function refusedRun(settings, state, request, busy) {
|
|
|
312
312
|
return restrictedCodexFailure("codex_busy");
|
|
313
313
|
const supportedPlatform = operatorAuth
|
|
314
314
|
? restrictedCodexNpmTarget(platform, arch) !== undefined
|
|
315
|
-
: (platform
|
|
315
|
+
: supportsIsolatedCodex(platform, arch);
|
|
316
316
|
if (!supportedPlatform)
|
|
317
317
|
return restrictedCodexFailure("codex_unsupported_platform");
|
|
318
318
|
return undefined;
|
|
319
319
|
}
|
|
320
|
+
/** Which releases a session starts: launch admission, or the qualifier's exact list. */
|
|
321
|
+
function launchAdmission(options) {
|
|
322
|
+
const exact = options.cliVersions;
|
|
323
|
+
return exact === undefined ? admitsCodexCliVersion : (version) => exact.includes(version);
|
|
324
|
+
}
|
|
320
325
|
export function createRestrictedCodexSession(options = {}) {
|
|
321
326
|
// Option reads keep their old order: platform, arch, env, participant, spawnFn, cliVersions.
|
|
322
327
|
const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;
|
|
@@ -331,7 +336,7 @@ export function createRestrictedCodexSession(options = {}) {
|
|
|
331
336
|
operatorAuth: participant?.authMode === "operator",
|
|
332
337
|
reasoningEffort: participant?.reasoningEffort ?? "low",
|
|
333
338
|
spawnFn: options.spawnFn ?? ((file, args, spawnOptions) => spawn(file, args, spawnOptions)),
|
|
334
|
-
|
|
339
|
+
admits: launchAdmission(options),
|
|
335
340
|
};
|
|
336
341
|
const state = {
|
|
337
342
|
work: undefined,
|
|
@@ -434,7 +439,7 @@ export async function checkRestrictedCodexSessionReadiness(input = {}, options =
|
|
|
434
439
|
* `--version` runs with a private temporary home, removed afterwards. */
|
|
435
440
|
export async function detectRestrictedCodexCliVersion(input = {}, options = {}) {
|
|
436
441
|
const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;
|
|
437
|
-
if (!(
|
|
442
|
+
if (!supportsIsolatedCodex(platform, arch))
|
|
438
443
|
return { cliVersion: null, errorCode: "codex_unsupported_platform" };
|
|
439
444
|
const sourceEnv = options.env ?? process.env;
|
|
440
445
|
const deadline = new RestrictedCodexDeadline(input.timeoutMs ?? 15_000, input.signal);
|
|
@@ -444,7 +449,7 @@ export async function detectRestrictedCodexCliVersion(input = {}, options = {})
|
|
|
444
449
|
work = await realpath(await mkdtemp(path.join(options.tempRoot ?? tmpdir(), "humanish-codex-version-")));
|
|
445
450
|
const home = path.join(work, "home");
|
|
446
451
|
await mkdir(home, { mode: 0o700 });
|
|
447
|
-
const cliVersion = await checkVersion(file, childEnvironment(sourceEnv, home, work), work, options.spawnFn ?? ((command, args, settings) => spawn(command, args, settings)), deadline, options
|
|
452
|
+
const cliVersion = await checkVersion(file, childEnvironment(sourceEnv, home, work), work, options.spawnFn ?? ((command, args, settings) => spawn(command, args, settings)), deadline, launchAdmission(options), options.cliVersion);
|
|
448
453
|
return { cliVersion, errorCode: null };
|
|
449
454
|
}
|
|
450
455
|
catch (error) {
|
|
@@ -4,13 +4,13 @@ import { type E2BDesktopExecutorOptions, type E2BDesktopLike } from "../../subst
|
|
|
4
4
|
import { type OpenAiResponsesProviderOptions } from "./openai-provider.js";
|
|
5
5
|
import { type RedactionHooks } from "../../evidence/redaction.js";
|
|
6
6
|
import type { DwellWindow, StopWhen } from "../stop-conditions.js";
|
|
7
|
-
import type {
|
|
7
|
+
import type { StudyTask } from "../../study/tasks.js";
|
|
8
8
|
export interface CuaActorSessionOptions {
|
|
9
9
|
/** The composed mission (persona + scenario/participant instruction) handed to the model. */
|
|
10
10
|
instructions: string;
|
|
11
11
|
/** Provenance of the persona this actor embodies (id + applied traits + prompt digest). */
|
|
12
12
|
persona: ActorPersonaRef;
|
|
13
|
-
/** Hard wall-clock runaway guard
|
|
13
|
+
/** Hard wall-clock runaway guard: the only count-free hard stop the loop honors. */
|
|
14
14
|
timeoutMs: number;
|
|
15
15
|
signal?: AbortSignal;
|
|
16
16
|
/** Live provider construction (used when `provider` is not injected). */
|
|
@@ -19,10 +19,10 @@ export interface CuaActorSessionOptions {
|
|
|
19
19
|
desktop?: E2BDesktopLike;
|
|
20
20
|
executorOptions?: E2BDesktopExecutorOptions;
|
|
21
21
|
/**
|
|
22
|
-
* DI seams
|
|
23
|
-
* callers use them to drive a state-driven, non-vision flow). NOTE: a
|
|
24
|
-
* whose observe() returns no screenshot
|
|
25
|
-
* paired with a
|
|
22
|
+
* DI seams: inject to bypass live construction (CI uses these for zero-spend tests; library
|
|
23
|
+
* callers use them to drive a state-driven, non-vision flow). NOTE: a state executor (one
|
|
24
|
+
* whose observe() returns no screenshot; see CuaObservation.screenshot optional) must be
|
|
25
|
+
* paired with a non-vision provider (requiresFrame falsey). The default OpenAI provider is
|
|
26
26
|
* vision-based and would fail closed against a screenshot-less observation. See
|
|
27
27
|
* docs/architecture/state-driven-executor.md.
|
|
28
28
|
*/
|
|
@@ -39,7 +39,7 @@ export interface CuaActorSessionOptions {
|
|
|
39
39
|
idleSteps?: number;
|
|
40
40
|
noProgressSteps?: number;
|
|
41
41
|
/**
|
|
42
|
-
* Redact persisted screenshots (blur+downscale). Default
|
|
42
|
+
* Redact persisted screenshots (blur+downscale). Default `false`: full fidelity for local use.
|
|
43
43
|
* Set true for unowned subjects or share-as-is bundles. The provider always sees raw frames.
|
|
44
44
|
*/
|
|
45
45
|
redactScreenshots?: boolean;
|
|
@@ -49,29 +49,29 @@ export interface CuaActorSessionOptions {
|
|
|
49
49
|
writeScreenshot?: (name: string, bytes: Buffer) => Promise<string>;
|
|
50
50
|
/** Deterministic harness-owned stop guards evaluated between model turns. */
|
|
51
51
|
stopWhen?: StopWhen;
|
|
52
|
-
/** A declared observation window
|
|
52
|
+
/** A declared observation window, forwarded to the loop. */
|
|
53
53
|
dwell?: DwellWindow;
|
|
54
|
-
/** The
|
|
55
|
-
* Only the `success` criteria are read here
|
|
54
|
+
/** The study's declared protocol; the loop records a corroborated task funnel on the trace.
|
|
55
|
+
* Only the `success` criteria are read here; the participant-facing goals are already composed
|
|
56
56
|
* into `instructions` upstream, and the criteria never reach the prompt. */
|
|
57
|
-
tasks?: readonly
|
|
58
|
-
/**
|
|
57
|
+
tasks?: readonly StudyTask[];
|
|
58
|
+
/** Fail-closed spend cap (USD) threaded to the loop; absent = uncapped. See CuaLoopOptions.maxUsd. */
|
|
59
59
|
maxUsd?: number;
|
|
60
60
|
/** Injected pure per-turn cost estimator paired with `maxUsd`. See CuaLoopOptions.estimateTurnCostUsd. */
|
|
61
61
|
estimateTurnCostUsd?: (usage: ActorTokenUsage) => number | null;
|
|
62
|
-
/**
|
|
62
|
+
/** Run-level spend guard threaded to the loop. See CuaLoopOptions.overRunBudget. */
|
|
63
63
|
overRunBudget?: (usage: ActorTokenUsage) => string | null;
|
|
64
64
|
/** Stricter unknown-usage policy for capped sessions (see CuaLoopOptions); it also makes the
|
|
65
65
|
* OpenAI provider send one HTTP dispatch per turn. Library-only. */
|
|
66
66
|
requireReportedUsageForSpendCap?: boolean;
|
|
67
|
-
/**
|
|
68
|
-
* the concurrent shared-world handoff barrier to latch a host
|
|
67
|
+
/** Runtime-only observed-URL callback threaded to the loop; see LoopTaps.onObservedUrl. Used by
|
|
68
|
+
* the concurrent shared-world handoff barrier to latch a host's live /lobby/CODE URL. */
|
|
69
69
|
onObservedUrl?: (url: string | undefined) => void;
|
|
70
|
-
/**
|
|
70
|
+
/** Runtime-only per-turn narration callback threaded to the loop; see LoopTaps.onMessage. */
|
|
71
71
|
onMessage?: (text: string) => void;
|
|
72
|
-
/**
|
|
72
|
+
/** Runtime-only per-turn raw-frame callback threaded to the loop; see LoopTaps.onScreenshot. */
|
|
73
73
|
onScreenshot?: (frame: Buffer) => void;
|
|
74
|
-
/** Per-turn trace snapshot callback threaded to the loop
|
|
74
|
+
/** Per-turn trace snapshot callback threaded to the loop; see CuaLoopOptions.onTrace. */
|
|
75
75
|
onTrace?: (items: readonly ActorTraceItem[], usage: ActorTokenUsage, metadata?: CuaLiveMetadata) => void;
|
|
76
76
|
}
|
|
77
77
|
export declare function runCuaActorSession(options: CuaActorSessionOptions): Promise<CuaLoopResult>;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// The registry-facing wrapper for the OpenAI Computer Use (CUA) actor. runComputerUseLoop needs
|
|
2
2
|
// fully-constructed provider/executor instances; exposing that raw through the actor registry
|
|
3
3
|
// would leak adapter construction to every call site. So runCuaActorSession takes intent-level
|
|
4
|
-
// fields and constructs the provider/executor internally
|
|
4
|
+
// fields and constructs the provider/executor internally, with DI seams (provider/executor/now)
|
|
5
5
|
// so CI can drive the real loop with fakes and zero network/zero spend (mirrors how the Claude
|
|
6
6
|
// adapter injects its queryFn).
|
|
7
7
|
//
|
|
8
8
|
// The loop already returns a fully-formed ActorTrace at result.trace, so there is no separate
|
|
9
|
-
// toActorTrace mapper
|
|
10
|
-
import {
|
|
9
|
+
// toActorTrace mapper: runCuaActorSession returns the CuaLoopResult unchanged.
|
|
10
|
+
import { runComputerUseLoopWithTaps, } from "./loop.js";
|
|
11
11
|
import { createE2BDesktopExecutor, } from "../../substrates/e2b/desktop-executor.js";
|
|
12
12
|
import { createOpenAiResponsesProvider, } from "./openai-provider.js";
|
|
13
13
|
import { defaultRedactionHooks } from "../../evidence/redaction.js";
|
|
@@ -55,7 +55,7 @@ export async function runCuaActorSession(options) {
|
|
|
55
55
|
...(options.onScreenshot === undefined ? {} : { onScreenshot: options.onScreenshot }),
|
|
56
56
|
...(options.onTrace === undefined ? {} : { onTrace: options.onTrace }),
|
|
57
57
|
};
|
|
58
|
-
const result = await
|
|
58
|
+
const result = await runComputerUseLoopWithTaps(loopOptions);
|
|
59
59
|
if (result.trace.executionProfile?.billing === "account-unknown") {
|
|
60
60
|
result.trace.estimatedCost = estimateActorCostForExecution(result.trace.tokenUsage, result.trace.ids.model, result.trace.executionProfile);
|
|
61
61
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* A caller's adapter refused this request
|
|
2
|
+
* A caller's adapter refused this request before provider dispatch because a configured
|
|
3
3
|
* local control limit was reached. This is an adapter declaration, not a provider response
|
|
4
4
|
* or independent transport/billing attestation. Never use it for a dispatched request whose
|
|
5
5
|
* outcome or usage is unknown. Import this class from the same humanish installation as the
|
|
6
6
|
* loop/provider; names, message text and lookalike objects are not the contract.
|
|
7
7
|
*/
|
|
8
|
-
export declare class
|
|
8
|
+
export declare class ComputerUseAdmissionLimitError extends Error {
|
|
9
9
|
constructor();
|
|
10
10
|
}
|
|
11
11
|
/** Internal nominal check: neither a matching payload nor a forged prototype is a declaration. */
|
|
12
|
-
export declare function
|
|
12
|
+
export declare function isComputerUseAdmissionLimitError(error: unknown): error is ComputerUseAdmissionLimitError;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
const admissionLimits = new WeakSet();
|
|
2
2
|
/**
|
|
3
|
-
* A caller's adapter refused this request
|
|
3
|
+
* A caller's adapter refused this request before provider dispatch because a configured
|
|
4
4
|
* local control limit was reached. This is an adapter declaration, not a provider response
|
|
5
5
|
* or independent transport/billing attestation. Never use it for a dispatched request whose
|
|
6
6
|
* outcome or usage is unknown. Import this class from the same humanish installation as the
|
|
7
7
|
* loop/provider; names, message text and lookalike objects are not the contract.
|
|
8
8
|
*/
|
|
9
|
-
export class
|
|
9
|
+
export class ComputerUseAdmissionLimitError extends Error {
|
|
10
10
|
constructor() {
|
|
11
11
|
super("The adapter refused the request before provider dispatch because a local admission limit was reached.");
|
|
12
|
-
this.name = "
|
|
12
|
+
this.name = "ComputerUseAdmissionLimitError";
|
|
13
13
|
admissionLimits.add(this);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
/** Internal nominal check: neither a matching payload nor a forged prototype is a declaration. */
|
|
17
|
-
export function
|
|
17
|
+
export function isComputerUseAdmissionLimitError(error) {
|
|
18
18
|
return typeof error === "object" && error !== null && admissionLimits.has(error);
|
|
19
19
|
}
|
|
@@ -21,11 +21,11 @@ export declare function isCuaExecutorErrorCode(value: unknown): value is CuaExec
|
|
|
21
21
|
* began; a lost acknowledgement or partial action is `outcome_uncertain`, never a retry.
|
|
22
22
|
* Import from the same installation as the loop: names and lookalike objects do not qualify.
|
|
23
23
|
*/
|
|
24
|
-
export declare class
|
|
24
|
+
export declare class ComputerUseExecutorError extends Error {
|
|
25
25
|
readonly code: CuaExecutorErrorCode;
|
|
26
26
|
readonly disposition: CuaExecutorDisposition;
|
|
27
27
|
constructor(code: CuaExecutorErrorCode, disposition: CuaExecutorDisposition);
|
|
28
28
|
}
|
|
29
29
|
/** A forged prototype is not an executor declaration. */
|
|
30
|
-
export declare function
|
|
30
|
+
export declare function isComputerUseExecutorError(error: unknown): error is ComputerUseExecutorError;
|
|
31
31
|
export {};
|
|
@@ -22,7 +22,7 @@ const executorErrors = new WeakSet();
|
|
|
22
22
|
* began; a lost acknowledgement or partial action is `outcome_uncertain`, never a retry.
|
|
23
23
|
* Import from the same installation as the loop: names and lookalike objects do not qualify.
|
|
24
24
|
*/
|
|
25
|
-
export class
|
|
25
|
+
export class ComputerUseExecutorError extends Error {
|
|
26
26
|
code;
|
|
27
27
|
disposition;
|
|
28
28
|
constructor(code, disposition) {
|
|
@@ -31,7 +31,7 @@ export class CuaExecutorError extends Error {
|
|
|
31
31
|
throw new TypeError("Invalid desktop executor error declaration.");
|
|
32
32
|
}
|
|
33
33
|
super(messages[code]);
|
|
34
|
-
this.name = "
|
|
34
|
+
this.name = "ComputerUseExecutorError";
|
|
35
35
|
this.code = code;
|
|
36
36
|
this.disposition = disposition;
|
|
37
37
|
// Keep the values used in durable diagnostics finite even for JavaScript callers.
|
|
@@ -43,6 +43,6 @@ export class CuaExecutorError extends Error {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
/** A forged prototype is not an executor declaration. */
|
|
46
|
-
export function
|
|
46
|
+
export function isComputerUseExecutorError(error) {
|
|
47
47
|
return typeof error === "object" && error !== null && executorErrors.has(error);
|
|
48
48
|
}
|
|
@@ -3,10 +3,10 @@ import type { CuaAction, CuaTurnRequest } from "./types.js";
|
|
|
3
3
|
/** A public-safe one-line action label. Never includes raw typed text. */
|
|
4
4
|
export declare function describeCuaAction(action: CuaAction): string;
|
|
5
5
|
/**
|
|
6
|
-
* A public-safe fingerprint of
|
|
7
|
-
* thing again" from "trying something new"
|
|
6
|
+
* A public-safe fingerprint of one turn's actions, used only in memory to tell "trying the same
|
|
7
|
+
* thing again" from "trying something new".
|
|
8
8
|
*
|
|
9
|
-
* Never includes typed text or key contents
|
|
9
|
+
* Never includes typed text or key contents: a `type` contributes its length, exactly as
|
|
10
10
|
* describeCuaAction does, so this can never become a keylogger. Coordinates are bucketed so that
|
|
11
11
|
* re-clicking the same control counts as a repeat while moving to a different control does not.
|
|
12
12
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { classifyCuaAction } from "../../affordance.js";
|
|
2
2
|
import { commandFailureInfo, isCommandExitError } from "../../../substrates/command-failure.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ComputerUseExecutorError, isComputerUseExecutorError } from "../executor-error.js";
|
|
4
4
|
import { CuaAbortError, CuaDeadlineError, CuaStallError, raceCallBound, raceSessionDeadline, requestScope, } from "./race.js";
|
|
5
5
|
import { notice } from "./trace.js";
|
|
6
6
|
// The participant's actions: their public labels, what counts as a material action, and how one
|
|
@@ -47,10 +47,10 @@ function describeAction(action) {
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
|
-
* A public-safe fingerprint of
|
|
51
|
-
* thing again" from "trying something new"
|
|
50
|
+
* A public-safe fingerprint of one turn's actions, used only in memory to tell "trying the same
|
|
51
|
+
* thing again" from "trying something new".
|
|
52
52
|
*
|
|
53
|
-
* Never includes typed text or key contents
|
|
53
|
+
* Never includes typed text or key contents: a `type` contributes its length, exactly as
|
|
54
54
|
* describeCuaAction does, so this can never become a keylogger. Coordinates are bucketed so that
|
|
55
55
|
* re-clicking the same control counts as a repeat while moving to a different control does not.
|
|
56
56
|
*/
|
|
@@ -121,8 +121,8 @@ export async function runActionBatch(session, actions) {
|
|
|
121
121
|
if (actionHistory.recentActionTitles.length > RECENT_ACTION_TITLES)
|
|
122
122
|
actionHistory.recentActionTitles.shift();
|
|
123
123
|
trace.bump("actions");
|
|
124
|
-
// Classify
|
|
125
|
-
//
|
|
124
|
+
// Classify before execute, mirroring counts.actions: the record is of what the actor
|
|
125
|
+
// chose, so an action that then fails to actuate is still a record of the route
|
|
126
126
|
// it reached for.
|
|
127
127
|
actionHistory.affordances.push(classifyCuaAction(action));
|
|
128
128
|
session.phase = `executing ${title}`;
|
|
@@ -131,7 +131,7 @@ export async function runActionBatch(session, actions) {
|
|
|
131
131
|
status = await dispatchAction(session, action, title);
|
|
132
132
|
}
|
|
133
133
|
catch (error) {
|
|
134
|
-
const declared =
|
|
134
|
+
const declared = isComputerUseExecutorError(error)
|
|
135
135
|
? error.disposition
|
|
136
136
|
: isCommandExitError(error)
|
|
137
137
|
? "skipped"
|
|
@@ -139,7 +139,7 @@ export async function runActionBatch(session, actions) {
|
|
|
139
139
|
if (declared !== undefined)
|
|
140
140
|
execution.actions.push({ index, status: declared });
|
|
141
141
|
countAttempt(session, action, title, declared);
|
|
142
|
-
if (
|
|
142
|
+
if (isComputerUseExecutorError(error) &&
|
|
143
143
|
error.code === "action_rejected" &&
|
|
144
144
|
error.disposition === "not_dispatched") {
|
|
145
145
|
// Later actions may depend on this one (type, then submit). Return
|
|
@@ -150,10 +150,10 @@ export async function runActionBatch(session, actions) {
|
|
|
150
150
|
trace.record("notice", () => notice("warn", "action rejected before dispatch", session.redactNarration(`action: ${title}; code: action_rejected; disposition: not_dispatched; remaining batch actions not dispatched: ${actions.length - index - 1}`)));
|
|
151
151
|
return { execution, hint: rejectedActionHint(title) };
|
|
152
152
|
}
|
|
153
|
-
if (
|
|
153
|
+
if (isComputerUseExecutorError(error) || !isCommandExitError(error))
|
|
154
154
|
throw error;
|
|
155
155
|
// A skipped action changes nothing on screen, so a persistently-failing run makes no
|
|
156
|
-
// progress and still terminates
|
|
156
|
+
// progress and still terminates via the idle/no-progress backstop (gave_up),
|
|
157
157
|
// never a silent actor_error and never an infinite loop.
|
|
158
158
|
recordCommandFailure(session, title, error);
|
|
159
159
|
continue;
|
|
@@ -164,8 +164,8 @@ export async function runActionBatch(session, actions) {
|
|
|
164
164
|
lifecycle: "completed",
|
|
165
165
|
title,
|
|
166
166
|
...(action.kind === "speak" ? { text: session.redactNarration(action.text) } : {}),
|
|
167
|
-
// Structured pin coordinates
|
|
168
|
-
// pins render
|
|
167
|
+
// Structured pin coordinates, exactly the click classes the Observer
|
|
168
|
+
// pins render: recorded fact instead of a title re-parse downstream.
|
|
169
169
|
...(action.kind === "click" || action.kind === "double_click"
|
|
170
170
|
? { coord: { x: action.x, y: action.y } }
|
|
171
171
|
: {}),
|
|
@@ -180,9 +180,9 @@ function countAttempt(session, action, title, status) {
|
|
|
180
180
|
session.trace.counts.materialActions += 1;
|
|
181
181
|
}
|
|
182
182
|
/**
|
|
183
|
-
* Execute one action. Idle actions only look
|
|
183
|
+
* Execute one action. Idle actions only look: a `wait` that hangs inside the SDK has in
|
|
184
184
|
* effect waited, so a stalled one is skipped with a notice and loses nothing the participant
|
|
185
|
-
* chose. An action is recorded as completed only after execute() resolves
|
|
185
|
+
* chose. An action is recorded as completed only after execute() resolves.
|
|
186
186
|
*/
|
|
187
187
|
async function dispatchAction(session, action, title) {
|
|
188
188
|
if (!isIdleAction(action)) {
|
|
@@ -213,7 +213,7 @@ async function executeAction(session, action, title, boundMs) {
|
|
|
213
213
|
}
|
|
214
214
|
catch (error) {
|
|
215
215
|
if (error instanceof CuaStallError && session.executor.stallRecovery === "fail_closed") {
|
|
216
|
-
throw new
|
|
216
|
+
throw new ComputerUseExecutorError("deadline_exceeded", "outcome_uncertain");
|
|
217
217
|
}
|
|
218
218
|
if (error instanceof CuaDeadlineError || error instanceof CuaAbortError) {
|
|
219
219
|
// The loop's deadline/abort may win before the executor can report whether its
|
|
@@ -2,10 +2,10 @@ import type { CuaAction, CuaObservation } from "./types.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* A deterministic, bounded, sorted-key projection of an appState object, used as the friction
|
|
4
4
|
* loop's progress key. Two structurally-equal states (regardless of key insertion order) map
|
|
5
|
-
* to the
|
|
5
|
+
* to the same string, so key reordering can never fabricate a progress delta; two different
|
|
6
6
|
* states map to different strings (within the caps).
|
|
7
7
|
*
|
|
8
|
-
* Correctness
|
|
8
|
+
* Correctness depends on this: it must not throw on a cyclic or huge input. Cycles are detected
|
|
9
9
|
* with a seen-set (a back-edge degrades to the marker "[Circular]"); depth, key count, array
|
|
10
10
|
* length, string length, and total output length are all capped so an adversarial or merely
|
|
11
11
|
* large appState degrades to a bounded value rather than crashing the loop. Pure: it never
|
|
@@ -14,7 +14,7 @@ import type { CuaAction, CuaObservation } from "./types.js";
|
|
|
14
14
|
export declare function stableProgressKey(appState: Record<string, unknown>): string;
|
|
15
15
|
export interface Backstop {
|
|
16
16
|
readonly progressKey: string;
|
|
17
|
-
/** The last few turns' action fingerprints, in memory only, for the
|
|
17
|
+
/** The last few turns' action fingerprints, in memory only, for the corroboration rule below. */
|
|
18
18
|
readonly recentFingerprints: readonly string[];
|
|
19
19
|
readonly consecutiveIdle: number;
|
|
20
20
|
readonly consecutiveNoProgress: number;
|