humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
package/dist/lab/keys.js
CHANGED
|
@@ -92,8 +92,11 @@ const ACTOR = {
|
|
|
92
92
|
type: true,
|
|
93
93
|
count: true,
|
|
94
94
|
lanes: PARTICIPANT_ENTRY,
|
|
95
|
-
// Roster groups are
|
|
96
|
-
roster: {
|
|
95
|
+
// Roster groups are participants with a count; the parser expands them into `lanes[]`.
|
|
96
|
+
roster: {
|
|
97
|
+
...PARTICIPANT_ENTRY,
|
|
98
|
+
count: true,
|
|
99
|
+
},
|
|
97
100
|
persona: true,
|
|
98
101
|
mission: true,
|
|
99
102
|
model: true,
|
|
@@ -200,14 +203,45 @@ const LAB_KEYS = {
|
|
|
200
203
|
defaults: { open: true },
|
|
201
204
|
comms: { email: EMAIL },
|
|
202
205
|
};
|
|
206
|
+
function without(shape, ...keys) {
|
|
207
|
+
return Object.fromEntries(Object.entries(shape).filter(([key]) => !keys.includes(key)));
|
|
208
|
+
}
|
|
209
|
+
// humanish.study.v3. The route is declared, so `subject.topology` goes. The participant keys leave
|
|
210
|
+
// the actor for `participants`, and `caps` is one top-level block. Top-level `personas` and
|
|
211
|
+
// `scenario.inline` are read by no route, and `scenario` is a string.
|
|
212
|
+
const STUDY_KEYS = {
|
|
213
|
+
schema: true,
|
|
214
|
+
id: true,
|
|
215
|
+
title: true,
|
|
216
|
+
description: true,
|
|
217
|
+
route: true,
|
|
218
|
+
mode: true,
|
|
219
|
+
subject: without(SUBJECT, "topology"),
|
|
220
|
+
actor: without(ACTOR, "count", "lanes", "roster", "laneFocus"),
|
|
221
|
+
// A count, `{ count, instruction }` or a list of entries. studyToV2 checks which form the route
|
|
222
|
+
// takes; an entry with a count is a group.
|
|
223
|
+
participants: { ...PARTICIPANT_ENTRY, count: true },
|
|
224
|
+
surfaces: true,
|
|
225
|
+
caps: CAPS,
|
|
226
|
+
execution: without(EXECUTION, "caps"),
|
|
227
|
+
scenario: true,
|
|
228
|
+
policies: LAB_KEYS.policies,
|
|
229
|
+
review: LAB_KEYS.review,
|
|
230
|
+
defaults: LAB_KEYS.defaults,
|
|
231
|
+
comms: LAB_KEYS.comms,
|
|
232
|
+
};
|
|
203
233
|
/** The first key in `raw` that LAB_KEYS does not list, as an error message; undefined if none. */
|
|
204
234
|
export function findUnknownLabKey(raw) {
|
|
205
|
-
return walk(raw, LAB_KEYS, "");
|
|
235
|
+
return walk(raw, LAB_KEYS, "", "lab");
|
|
236
|
+
}
|
|
237
|
+
/** The first key in a humanish.study.v3 document that the format does not have; undefined if none. */
|
|
238
|
+
export function findUnknownStudyKey(raw) {
|
|
239
|
+
return walk(raw, STUDY_KEYS, "", "study");
|
|
206
240
|
}
|
|
207
|
-
function walk(value, shape, path) {
|
|
241
|
+
function walk(value, shape, path, noun) {
|
|
208
242
|
if (Array.isArray(value)) {
|
|
209
243
|
for (const [index, item] of value.entries()) {
|
|
210
|
-
const found = walk(item, shape, `${path}[${index}]
|
|
244
|
+
const found = walk(item, shape, `${path}[${index}]`, noun);
|
|
211
245
|
if (found)
|
|
212
246
|
return found;
|
|
213
247
|
}
|
|
@@ -220,23 +254,23 @@ function walk(value, shape, path) {
|
|
|
220
254
|
// Object.hasOwn: a key like `constructor` must not match Object.prototype.
|
|
221
255
|
const unknown = Object.keys(record).filter((key) => !Object.hasOwn(shape, key));
|
|
222
256
|
if (unknown.length > 0)
|
|
223
|
-
return unknownKeysMessage(path, unknown, known);
|
|
257
|
+
return unknownKeysMessage(path, unknown, known, noun);
|
|
224
258
|
for (const [key, child] of Object.entries(record)) {
|
|
225
259
|
const expected = shape[key];
|
|
226
260
|
if (expected !== true && expected !== undefined) {
|
|
227
|
-
const found = walk(child, expected, path ? `${path}.${key}` : key);
|
|
261
|
+
const found = walk(child, expected, path ? `${path}.${key}` : key, noun);
|
|
228
262
|
if (found)
|
|
229
263
|
return found;
|
|
230
264
|
}
|
|
231
265
|
}
|
|
232
266
|
return undefined;
|
|
233
267
|
}
|
|
234
|
-
function unknownKeysMessage(path, unknown, known) {
|
|
268
|
+
function unknownKeysMessage(path, unknown, known, noun) {
|
|
235
269
|
const named = unknown.map((key) => {
|
|
236
270
|
const suggestion = closest(key, known);
|
|
237
271
|
return suggestion ? `${key} (did you mean \`${suggestion}\`?)` : key;
|
|
238
272
|
});
|
|
239
|
-
return `Unknown
|
|
273
|
+
return `Unknown ${noun} field(s)${path ? ` in \`${path}\`` : ""}: ${named.join(", ")}. Known fields: ${known.join(", ")}.`;
|
|
240
274
|
}
|
|
241
275
|
// The known key within edit distance 2, or one that differs only in case.
|
|
242
276
|
function closest(key, known) {
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { ScriptedBrowserSessionOptions, ScriptedBrowserSessionResult } from "../actors/scripted-browser/actor.js";
|
|
2
|
+
import type { ScriptedBrowserLaunchArgs, ScriptedBrowserLike } from "../actors/scripted-browser/types.js";
|
|
3
|
+
import type { CuaActorSessionOptions } from "../actors/computer-use/actor.js";
|
|
4
|
+
import type { AutomaticAnalysisDeps, runAutomaticAnalysis } from "../analysis/automatic.js";
|
|
5
|
+
import type { CuaLoopResult } from "../actors/computer-use/loop.js";
|
|
6
|
+
import type { renderObserver } from "../observer/render.js";
|
|
7
|
+
import type { TerminalCostProbe } from "../routes/terminal/types.js";
|
|
8
|
+
import type { DetachedTimers } from "../substrates/detached.js";
|
|
9
|
+
import type { E2BDesktopModule } from "../substrates/e2b/sdk.js";
|
|
10
|
+
import type { LocalTreeArchive } from "../subject/local-tree-archive.js";
|
|
11
|
+
import type { SubjectPhaseEvent } from "../subject/steps.js";
|
|
12
|
+
import type { ParticipantRef } from "./run-lab-events.js";
|
|
13
|
+
export interface LabDeps {
|
|
14
|
+
/** Loads the E2B SDK. Defaults to loadE2BDesktopModule. */
|
|
15
|
+
readonly desktopModule?: () => Promise<E2BDesktopModule>;
|
|
16
|
+
/** Renders the Observer. Defaults to renderObserver. */
|
|
17
|
+
readonly renderObserver?: typeof renderObserver;
|
|
18
|
+
/** The clock, in epoch milliseconds. Defaults to Date.now. */
|
|
19
|
+
readonly now?: () => number;
|
|
20
|
+
/** Clock and sleep for detached provisioning steps. */
|
|
21
|
+
readonly detachedTimers?: DetachedTimers;
|
|
22
|
+
/**
|
|
23
|
+
* Computer use and shared world: where subject-provisioning phases go in place of stderr. A
|
|
24
|
+
* computer-use phase names its participant; a shared-world plane's names none. onEvent still
|
|
25
|
+
* receives every phase.
|
|
26
|
+
*/
|
|
27
|
+
readonly subjectPhaseSink?: (event: SubjectPhaseEvent, participant?: ParticipantRef) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Shared world: runs each participant's computer-use session in place of the actor's own. The
|
|
30
|
+
* planner reads whether it is set: a custom runner cannot enforce actors[0].maxOutputTokens.
|
|
31
|
+
*/
|
|
32
|
+
readonly runSession?: (options: CuaActorSessionOptions) => Promise<CuaLoopResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Shared world: packs a local-tree subject on the host. Defaults to createLocalTreeArchive and a
|
|
35
|
+
* read of the archive it writes. Called once per run, before the subject sandbox exists.
|
|
36
|
+
*/
|
|
37
|
+
readonly packLocalTree?: (args: {
|
|
38
|
+
root: string;
|
|
39
|
+
extraExclude?: string[];
|
|
40
|
+
maxArchiveBytes?: number;
|
|
41
|
+
}) => Promise<{
|
|
42
|
+
archive: LocalTreeArchive;
|
|
43
|
+
buffer: ArrayBuffer;
|
|
44
|
+
}>;
|
|
45
|
+
/** Shared world: the background stateSeries prober's cadence in milliseconds. Defaults to 1000. */
|
|
46
|
+
readonly proberCadenceMs?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Shared world, external-public plane: how long the host has to surface a /lobby/CODE URL
|
|
49
|
+
* before the run fails closed. Defaults to 120000, capped by execution.timeoutMs.
|
|
50
|
+
*/
|
|
51
|
+
readonly handoffDeadlineMs?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Shared world, external-public plane: reads a /lobby/CODE off a participant's screenshot.
|
|
54
|
+
* Defaults to the single-frame OpenAI read.
|
|
55
|
+
*/
|
|
56
|
+
readonly readLobbyCodeFromFrame?: (frame: Buffer, apiKey: string) => Promise<string | undefined>;
|
|
57
|
+
/**
|
|
58
|
+
* Every route: post-run analysis in place of the real one. `run` replaces
|
|
59
|
+
* the real analysis runner, and `deps` (provider fetch, keys, clock) reach the analysis only,
|
|
60
|
+
* never a participant.
|
|
61
|
+
*/
|
|
62
|
+
readonly analysis?: {
|
|
63
|
+
readonly run?: typeof runAutomaticAnalysis;
|
|
64
|
+
readonly deps?: AutomaticAnalysisDeps;
|
|
65
|
+
};
|
|
66
|
+
/** Scripted: runs one surface's session in place of the scripted-browser actor. */
|
|
67
|
+
readonly runScriptedSession?: (options: ScriptedBrowserSessionOptions) => Promise<ScriptedBrowserSessionResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Scripted: launches the browser each session drives, so no browser binary is resolved. The
|
|
70
|
+
* planner reads whether it, or browserCommand, is set: a live run then needs no host browser.
|
|
71
|
+
*/
|
|
72
|
+
readonly launchBrowser?: (args: ScriptedBrowserLaunchArgs) => Promise<ScriptedBrowserLike>;
|
|
73
|
+
/** Scripted: the browser binary to launch; operators use HUMANISH_BROWSER_COMMAND. */
|
|
74
|
+
readonly browserCommand?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Terminal: known spend lines for the cost ledger. The planner reads whether it is set, since
|
|
77
|
+
* only a measured line can trip a positive maxUsd.
|
|
78
|
+
*/
|
|
79
|
+
readonly costProbe?: TerminalCostProbe;
|
|
80
|
+
}
|
package/dist/lab/parse/actors.js
CHANGED
|
@@ -3,8 +3,9 @@ import { isReasoningEffort, reasoningEffortNames } from "../../actors/reasoning-
|
|
|
3
3
|
import { isMaxOutputTokens } from "../../actors/output-token-limit.js";
|
|
4
4
|
import { isHttpUrl } from "./subject.js";
|
|
5
5
|
import { registeredComputerUseActors, registeredScriptedBrowserActors, registeredTerminalActors, } from "../routing.js";
|
|
6
|
-
import { invalid,
|
|
7
|
-
|
|
6
|
+
import { invalid, posInt, str } from "./values.js";
|
|
7
|
+
import { isRecord } from "../../run/type-guards.js";
|
|
8
|
+
// A participant id interpolates into its evidence paths (screenshots/<id>/, actors/<id>.json), so
|
|
8
9
|
// it must be a public-safe path token, same shape as a lab id.
|
|
9
10
|
export const PARTICIPANT_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
|
|
10
11
|
export const PARTICIPANT_ID_MAX_CHARS = 40;
|
|
@@ -21,8 +22,8 @@ export function focusOf(actor) {
|
|
|
21
22
|
// Actor ids humanish no longer registers. Rejecting them at parse keeps a lab that names one
|
|
22
23
|
// from running on a route that ignores actors[0].type, such as a this-repo dry run.
|
|
23
24
|
const REMOVED_ACTOR_TYPES = new Set(["pi-agent-core", "claude-agent-sdk"]);
|
|
24
|
-
// Only actors
|
|
25
|
-
// "code"
|
|
25
|
+
// Only actors of a run kind a route dispatches. codex-app-server is registered but declares only
|
|
26
|
+
// the "code" run kind, which no study route runs, so naming it would lead to the same dead end.
|
|
26
27
|
function routableActorTypes() {
|
|
27
28
|
return [
|
|
28
29
|
...registeredComputerUseActors(),
|
|
@@ -56,10 +57,10 @@ export function parseActors(raw) {
|
|
|
56
57
|
if (count !== undefined)
|
|
57
58
|
actor.count = count;
|
|
58
59
|
if (entry.lanes !== undefined && entry.roster !== undefined) {
|
|
59
|
-
return invalid(`actors[${index}].lanes
|
|
60
|
+
return invalid(`Set either actors[${index}].lanes or actors[${index}].roster, not both: list participants one by one in \`lanes\`, or in groups in \`roster\`.`);
|
|
60
61
|
}
|
|
61
62
|
if (entry.roster !== undefined && count !== undefined) {
|
|
62
|
-
return invalid(`actors[${index}].roster
|
|
63
|
+
return invalid(`Set either actors[${index}].roster or actors[${index}].count, not both: \`roster\` declares groups of distinct participants, and \`count\` declares identical ones.`);
|
|
63
64
|
}
|
|
64
65
|
if (entry.roster !== undefined && entry.laneFocus !== undefined) {
|
|
65
66
|
return invalid(`actors[${index}].roster and actors[${index}].laneFocus are mutually exclusive: a roster group's instruction is each participant's steer.`);
|
|
@@ -138,7 +139,7 @@ function parseFocus(raw) {
|
|
|
138
139
|
return Object.keys(focus).length > 0 ? focus : undefined;
|
|
139
140
|
}
|
|
140
141
|
/**
|
|
141
|
-
* Parse `actors[index].roster` compact groups into concrete lanes. This is authoring sugar for
|
|
142
|
+
* Parse `actors[index].roster` compact groups into concrete `lanes[]` entries. This is authoring sugar for
|
|
142
143
|
* "N users of M adapter-owned types across S surfaces"; the runtime receives only `lanes[]`.
|
|
143
144
|
*/
|
|
144
145
|
function parseRosterGroups(raw, actorIndex) {
|
|
@@ -159,7 +160,7 @@ function parseRosterGroups(raw, actorIndex) {
|
|
|
159
160
|
return invalid(`actors[${actorIndex}].roster[${groupIndex}].id is required and must be a public-safe token matching ${PARTICIPANT_ID_PATTERN}.`);
|
|
160
161
|
}
|
|
161
162
|
if (!PARTICIPANT_ID_PATTERN.test(groupId) || groupId.length > PARTICIPANT_ID_MAX_CHARS - 3) {
|
|
162
|
-
return invalid(`actors[${actorIndex}].roster[${groupIndex}].id must
|
|
163
|
+
return invalid(`actors[${actorIndex}].roster[${groupIndex}].id must match ${PARTICIPANT_ID_PATTERN} and be at most ${PARTICIPANT_ID_MAX_CHARS - 3} characters, because each generated participant id adds a suffix like "-01"; "${groupId}" is not.`);
|
|
163
164
|
}
|
|
164
165
|
if (seenGroupIds.has(groupId)) {
|
|
165
166
|
return invalid(`actors[${actorIndex}].roster group ids must be unique (duplicate "${groupId}").`);
|
|
@@ -183,11 +184,11 @@ function parseRosterGroups(raw, actorIndex) {
|
|
|
183
184
|
}
|
|
184
185
|
/**
|
|
185
186
|
* Parse `actors[index].lanes` into a fan-out roster (computer-use E2B route). Structural only:
|
|
186
|
-
* each
|
|
187
|
+
* each entry is `{ id?, actorType?, surface?, caseGroup?, persona?, device?, instruction?, target?,
|
|
187
188
|
* entry?, host?, reasoningEffort?, stopWhen?, dwell? }`.
|
|
188
|
-
*
|
|
189
|
-
* must be public-safe tokens; a
|
|
190
|
-
* route-scoped cross-validation (lanes XOR count
|
|
189
|
+
* Participant ids (when declared) must be public-safe path tokens and unique; grouping metadata
|
|
190
|
+
* must be public-safe tokens; a device must be a known preset name. The
|
|
191
|
+
* route-scoped cross-validation (`lanes` XOR `count`/`laneFocus`, device XOR raw resolution, cap 16)
|
|
191
192
|
* runs in parseLabConfig where the route is known.
|
|
192
193
|
*/
|
|
193
194
|
function parseParticipantEntries(raw, actorIndex) {
|
|
@@ -271,7 +272,7 @@ function parseParticipantEntries(raw, actorIndex) {
|
|
|
271
272
|
const entryPath = str(entry.entry);
|
|
272
273
|
if (entryPath !== undefined)
|
|
273
274
|
parsedEntry.entry = entryPath;
|
|
274
|
-
// `host` marks the designated host
|
|
275
|
+
// `host` marks the designated host on the external-public shared-world route; the
|
|
275
276
|
// exactly-one-host check runs in externalPublicSharedWorldValidationReason (route context).
|
|
276
277
|
if (entry.host !== undefined) {
|
|
277
278
|
if (typeof entry.host !== "boolean") {
|
|
@@ -286,7 +287,7 @@ function parseParticipantEntries(raw, actorIndex) {
|
|
|
286
287
|
}
|
|
287
288
|
/**
|
|
288
289
|
* The researcher's protocol. Each task carries what the participant is asked to do and, optionally,
|
|
289
|
-
* the observation that proves it happened
|
|
290
|
+
* the observation that proves it happened, reusing `stopWhen`, so a criterion is exactly as
|
|
290
291
|
* expressive as a stop condition and an author who knows one knows the other.
|
|
291
292
|
*
|
|
292
293
|
* A task with no `success` is allowed on purpose: some things you ask a participant to do (think
|
|
@@ -313,7 +314,7 @@ function parseTasks(raw, field) {
|
|
|
313
314
|
seen.add(id);
|
|
314
315
|
const goal = str(entry.goal);
|
|
315
316
|
if (goal === undefined) {
|
|
316
|
-
return invalid(`\`${field}[${index}].goal\` is required
|
|
317
|
+
return invalid(`\`${field}[${index}].goal\` is required: what the participant is asked to do, in their own words.`);
|
|
317
318
|
}
|
|
318
319
|
const successResult = parseStopWhen(entry.success, `${field}[${index}].success`);
|
|
319
320
|
if (!successResult.ok)
|
|
@@ -326,7 +327,7 @@ function parseTasks(raw, field) {
|
|
|
326
327
|
}
|
|
327
328
|
return { ok: true, value: tasks };
|
|
328
329
|
}
|
|
329
|
-
/** The bounds a dwell window
|
|
330
|
+
/** The bounds a dwell window must sit inside: at least one frame, at most an hour. */
|
|
330
331
|
const DWELL_MIN_MS = 1_000;
|
|
331
332
|
const DWELL_MAX_MS = 3_600_000;
|
|
332
333
|
const DWELL_DEFAULT_EVERY_MS = 10_000;
|
package/dist/lab/parse/comms.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { invalid,
|
|
1
|
+
import { invalid, posInt, str } from "./values.js";
|
|
2
|
+
import { isRecord } from "../../run/type-guards.js";
|
|
2
3
|
// Fail-loud (never silently swallow a comms setting): a malformed `comms` block returns a parse
|
|
3
4
|
// failure rather than being dropped.
|
|
4
5
|
export function parseComms(raw) {
|
|
@@ -29,8 +30,8 @@ function parseCommsEmail(raw) {
|
|
|
29
30
|
if (raw.kind !== undefined && raw.kind !== "fake") {
|
|
30
31
|
return invalid("`comms.email.kind` must be `fake`.");
|
|
31
32
|
}
|
|
32
|
-
// external ingress
|
|
33
|
-
// inject and `injectEnv`
|
|
33
|
+
// external ingress: the adopter runs the catch, so there is no subject env for humanish to
|
|
34
|
+
// inject and `injectEnv` has nothing to name: the operator points their
|
|
34
35
|
// own app at their own catch. Parse it first so the injectEnv requirement can key off it.
|
|
35
36
|
const external = parseExternalCatch(raw.external);
|
|
36
37
|
if (!external.ok)
|
|
@@ -126,7 +127,7 @@ function parseExternalCatch(raw) {
|
|
|
126
127
|
return invalid("`comms.email.external` must be a mapping.");
|
|
127
128
|
const catchBaseUrl = str(raw.catchBaseUrl);
|
|
128
129
|
if (catchBaseUrl === undefined) {
|
|
129
|
-
return invalid("`comms.email.external.catchBaseUrl` is required
|
|
130
|
+
return invalid("`comms.email.external.catchBaseUrl` is required: the base URL of the catch you run. Your app sends its mail to it, and humanish reads GET /deliveries from it.");
|
|
130
131
|
}
|
|
131
132
|
for (const [field, value] of [
|
|
132
133
|
["catchBaseUrl", catchBaseUrl],
|
|
@@ -147,7 +148,7 @@ function parseExternalCatch(raw) {
|
|
|
147
148
|
}
|
|
148
149
|
const authTokenEnv = str(raw.authTokenEnv);
|
|
149
150
|
if (authTokenEnv !== undefined && !/^[A-Za-z_][A-Za-z0-9_]*$/.test(authTokenEnv)) {
|
|
150
|
-
return invalid(`\`comms.email.external.authTokenEnv\` must be
|
|
151
|
+
return invalid(`\`comms.email.external.authTokenEnv\` must be an environment variable name, and "${authTokenEnv}" is not one. Its value is read when the run starts and never stored.`);
|
|
151
152
|
}
|
|
152
153
|
const inboxBaseUrl = str(raw.inboxBaseUrl);
|
|
153
154
|
return {
|
|
@@ -174,7 +175,7 @@ function parseSmtp(raw) {
|
|
|
174
175
|
const hostEnv = envName(raw.hostEnv, "hostEnv");
|
|
175
176
|
const portEnv = envName(raw.portEnv, "portEnv");
|
|
176
177
|
if (hostEnv === undefined || portEnv === undefined) {
|
|
177
|
-
return invalid("`comms.email.smtp` needs both `hostEnv` and `portEnv
|
|
178
|
+
return invalid("`comms.email.smtp` needs both `hostEnv` and `portEnv`: the environment variables your app reads for its SMTP host and port. humanish sets them to its own loopback listener.");
|
|
178
179
|
}
|
|
179
180
|
if (hostEnv.startsWith("__invalid__") || portEnv.startsWith("__invalid__")) {
|
|
180
181
|
return invalid("`comms.email.smtp.hostEnv` and `portEnv` must be valid env var names.");
|
|
@@ -226,7 +227,7 @@ export function addressedRecipients(email) {
|
|
|
226
227
|
? []
|
|
227
228
|
: [{ participantId: recipient.lane, address: recipient.address }]);
|
|
228
229
|
}
|
|
229
|
-
/** `comms.email.recipients`: which
|
|
230
|
+
/** `comms.email.recipients`: which participant each captured address belongs to. */
|
|
230
231
|
function parseRecipients(raw) {
|
|
231
232
|
if (raw === undefined)
|
|
232
233
|
return { ok: true, value: undefined };
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { resolveAutomaticAnalysis } from "../../analysis/automatic-config.js";
|
|
2
2
|
import { DEVICE_PRESET_NAMES, isDevicePresetName } from "../device-presets.js";
|
|
3
3
|
import { isExactRuntimeVersion } from "../../routes/terminal/runtime.js";
|
|
4
|
-
import { invalid,
|
|
4
|
+
import { invalid, nonNegNumber, posInt, str } from "./values.js";
|
|
5
|
+
import { isRecord } from "../../run/type-guards.js";
|
|
5
6
|
export function parseExecution(raw) {
|
|
6
7
|
if (raw === undefined) {
|
|
7
8
|
return { ok: true, value: undefined };
|
|
@@ -32,7 +33,7 @@ export function parseExecution(raw) {
|
|
|
32
33
|
}
|
|
33
34
|
if (desktopResult.value)
|
|
34
35
|
execution.desktop = desktopResult.value;
|
|
35
|
-
// Reuse the terminal
|
|
36
|
+
// Reuse the terminal route's caps parser (same shape, not a fork); a malformed budget is a hard
|
|
36
37
|
// error, never silently dropped (a cap that silently does nothing would be a safety lie).
|
|
37
38
|
const capsResult = parseCaps(raw.caps);
|
|
38
39
|
if (!capsResult.ok) {
|
|
@@ -89,9 +90,9 @@ function parseTerminal(raw) {
|
|
|
89
90
|
const transport = str(raw.transport);
|
|
90
91
|
if (transport !== "exec-stream") {
|
|
91
92
|
// "pty" is deliberately rejected: stdin is disabled, so the capture is a non-interactive
|
|
92
|
-
// exec stream
|
|
93
|
-
//
|
|
94
|
-
return invalid("`execution.terminal.transport` must be exec-stream
|
|
93
|
+
// exec stream, and an interactive-PTY label would overstate the mechanism. True duplex PTY
|
|
94
|
+
// does not ship.
|
|
95
|
+
return invalid("`execution.terminal.transport` must be exec-stream: the route captures the agent's output with stdin closed, and an interactive terminal (pty) is not supported.");
|
|
95
96
|
}
|
|
96
97
|
terminal.transport = transport;
|
|
97
98
|
}
|
|
@@ -102,9 +103,9 @@ function parseTerminal(raw) {
|
|
|
102
103
|
}
|
|
103
104
|
if (stdin === "sent") {
|
|
104
105
|
// Assisted input is forbidden until the interventions ledger + comparability flag + verify
|
|
105
|
-
// check exist (
|
|
106
|
-
// autonomous green proof.
|
|
107
|
-
return invalid("`execution.terminal.stdin: sent` (assisted input) is not supported
|
|
106
|
+
// check exist (the terminal route's stdin rule); shipping it now would let an assisted run
|
|
107
|
+
// pose as autonomous green proof.
|
|
108
|
+
return invalid("`execution.terminal.stdin: sent` (assisted input) is not supported: the route cannot yet mark a run that received typed help as different from an unassisted one. Remove the setting; stdin stays closed.");
|
|
108
109
|
}
|
|
109
110
|
terminal.stdin = stdin;
|
|
110
111
|
}
|
|
@@ -152,13 +153,13 @@ function parseDesktop(raw) {
|
|
|
152
153
|
}
|
|
153
154
|
desktop.browser = browser;
|
|
154
155
|
}
|
|
155
|
-
// A custom E2B desktop template
|
|
156
|
-
// allowlisted (any string is a valid template name/id
|
|
156
|
+
// A custom E2B desktop template name or ID. Trimmed non-empty when present; deliberately not
|
|
157
|
+
// allowlisted (any string is a valid template name/id; over-restricting would reject real
|
|
157
158
|
// adopter images). An explicitly-set but blank/whitespace value is a mistake, not a template.
|
|
158
159
|
if (raw.template !== undefined) {
|
|
159
160
|
const template = str(raw.template);
|
|
160
161
|
if (template === undefined) {
|
|
161
|
-
return invalid("`execution.desktop.template` must be a non-empty E2B desktop template
|
|
162
|
+
return invalid("`execution.desktop.template` must be a non-empty E2B desktop template name or ID when it is set. Any name is accepted.");
|
|
162
163
|
}
|
|
163
164
|
desktop.template = template;
|
|
164
165
|
}
|
|
@@ -246,8 +247,8 @@ export function parseScenario(raw) {
|
|
|
246
247
|
}
|
|
247
248
|
/**
|
|
248
249
|
* Parse `scenario.caps`. Returns a parse failure on a malformed value rather than silently
|
|
249
|
-
* dropping a budget declaration (a cap that silently does nothing would
|
|
250
|
-
*
|
|
250
|
+
* dropping a budget declaration (a cap that silently does nothing would claim protection it
|
|
251
|
+
* does not give). Each cap must be a non-negative finite number.
|
|
251
252
|
*/
|
|
252
253
|
function parseCaps(raw) {
|
|
253
254
|
if (raw === undefined) {
|
|
@@ -338,7 +339,7 @@ function parseReviewScorer(raw) {
|
|
|
338
339
|
return invalid("`review.scorer` must be a mapping with a `ref` path (e.g. { ref: scorers/product.mjs }).");
|
|
339
340
|
const unknownKeys = Object.keys(raw).filter((key) => key !== "ref");
|
|
340
341
|
if (unknownKeys.length > 0) {
|
|
341
|
-
return invalid(
|
|
342
|
+
return invalid(`\`review.scorer\` accepts only \`ref\` (a scorer module path relative to the project), and these fields are unknown: ${unknownKeys.join(", ")}.`);
|
|
342
343
|
}
|
|
343
344
|
const ref = str(raw.ref);
|
|
344
345
|
if (!ref)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type LabConfigParseFailure } from "../types.js";
|
|
2
|
+
declare const ROUTES: readonly ["preview", "computer-use", "shared-world", "terminal", "scripted"];
|
|
3
|
+
/** A route a study declares. */
|
|
4
|
+
export type StudyRoute = (typeof ROUTES)[number];
|
|
5
|
+
export interface StudyDocument {
|
|
6
|
+
readonly route: StudyRoute;
|
|
7
|
+
/** The same document in the humanish.lab.v2 spelling. */
|
|
8
|
+
readonly v2: Record<string, unknown>;
|
|
9
|
+
/** For each expanded participant, the index of the `participants` entry it came from. */
|
|
10
|
+
readonly participantSource: readonly number[];
|
|
11
|
+
}
|
|
12
|
+
type Parsed<T> = {
|
|
13
|
+
ok: true;
|
|
14
|
+
value: T;
|
|
15
|
+
} | LabConfigParseFailure;
|
|
16
|
+
/** Rewrite a humanish.study.v3 document into humanish.lab.v2, or refuse it. */
|
|
17
|
+
export declare function studyToV2(raw: Record<string, unknown>): Parsed<StudyDocument>;
|
|
18
|
+
/**
|
|
19
|
+
* Spell a v2 parser message the way the study file is written: `actors[0].lanes[3]` becomes the
|
|
20
|
+
* `participants` entry it came from, `execution.caps` and `scenario.caps` become `caps`, and so on.
|
|
21
|
+
*/
|
|
22
|
+
export declare function studySpelling(message: string, route: StudyRoute, participantSource: readonly number[]): string;
|
|
23
|
+
export {};
|