humanish 0.106.1 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +86 -49
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +46 -10
- package/dist/cli/io.js +109 -30
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +8 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -294
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
|
@@ -4,7 +4,7 @@ import type { LabActor } from "./types.js";
|
|
|
4
4
|
/** Title-case an id for the fallback display name (`skeptical-power-user` -> `Skeptical Power User`). */
|
|
5
5
|
export declare function personaTitleFromId(personaId: string): string;
|
|
6
6
|
/**
|
|
7
|
-
* Resolve
|
|
7
|
+
* Resolve one persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
|
|
8
8
|
* Returns `null` with a warning when the id is unsafe or no file exists. Invalid rich backgrounds
|
|
9
9
|
* reject the study before execution.
|
|
10
10
|
*/
|
|
@@ -13,8 +13,8 @@ export declare function resolveCommittedPersona(projectRoot: PreparedSelectedOut
|
|
|
13
13
|
warnings: string[];
|
|
14
14
|
}>;
|
|
15
15
|
/**
|
|
16
|
-
* Resolve every distinct persona id a run will use, once, before
|
|
17
|
-
* map keeps the plan builder
|
|
16
|
+
* Resolve every distinct persona id a run will use, once, before participant specs are built. Returning a
|
|
17
|
+
* map keeps the plan builder pure (it is exported npm surface and asserted pure by tests): the
|
|
18
18
|
* async file reads happen here, and the composer only does a lookup.
|
|
19
19
|
*/
|
|
20
20
|
export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOutputDirectory, personaIds: readonly (string | undefined)[]): Promise<{
|
|
@@ -22,16 +22,16 @@ export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOu
|
|
|
22
22
|
warnings: string[];
|
|
23
23
|
}>;
|
|
24
24
|
/**
|
|
25
|
-
* Every persona id a lab config could put on a browser
|
|
26
|
-
* declared, otherwise the actor-level persona that every fan-out
|
|
25
|
+
* Every persona id a lab config could put on a browser participant: the roster when one is
|
|
26
|
+
* declared, otherwise the actor-level persona that every fan-out participant inherits.
|
|
27
27
|
*/
|
|
28
28
|
export declare function labPersonaIds(config: {
|
|
29
29
|
actors?: readonly Pick<LabActor, "persona" | "lanes">[];
|
|
30
30
|
}): string[];
|
|
31
31
|
/**
|
|
32
32
|
* Same resolution from a plain cwd, for the labs that carry a directory string rather than an
|
|
33
|
-
* already-prepared root. Realpath-then-prepare mirrors the
|
|
34
|
-
* personas from the physical project.
|
|
33
|
+
* already-prepared root. Realpath-then-prepare mirrors the computer-use route so a symlinked cwd
|
|
34
|
+
* still reads personas from the physical project.
|
|
35
35
|
*/
|
|
36
36
|
export declare function resolveCommittedPersonasForCwd(cwd: string, personaIds: readonly (string | undefined)[]): Promise<{
|
|
37
37
|
personas: Map<string, ResolvedPersona>;
|
|
@@ -6,7 +6,7 @@ import { prepareSelectedOutputDirectory, readContainedRegularFile, } from "../ru
|
|
|
6
6
|
import { digestText, redactText } from "../evidence/redaction.js";
|
|
7
7
|
import { realpath } from "node:fs/promises";
|
|
8
8
|
import { rosterOf } from "./parse/actors.js";
|
|
9
|
-
/** Persona ids are file-name segments, never paths: the same grammar the terminal
|
|
9
|
+
/** Persona ids are file-name segments, never paths: the same grammar the terminal route enforces. */
|
|
10
10
|
const PERSONA_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
|
|
11
11
|
/** Title-case an id for the fallback display name (`skeptical-power-user` -> `Skeptical Power User`). */
|
|
12
12
|
export function personaTitleFromId(personaId) {
|
|
@@ -22,7 +22,7 @@ const PERSONA_DIRECTORIES = [
|
|
|
22
22
|
path.posix.join(".humanish", "local", "personas"),
|
|
23
23
|
];
|
|
24
24
|
/**
|
|
25
|
-
* Resolve
|
|
25
|
+
* Resolve one persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
|
|
26
26
|
* Returns `null` with a warning when the id is unsafe or no file exists. Invalid rich backgrounds
|
|
27
27
|
* reject the study before execution.
|
|
28
28
|
*/
|
|
@@ -65,8 +65,8 @@ export async function resolveCommittedPersona(projectRoot, personaId) {
|
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
|
-
* Resolve every distinct persona id a run will use, once, before
|
|
69
|
-
* map keeps the plan builder
|
|
68
|
+
* Resolve every distinct persona id a run will use, once, before participant specs are built. Returning a
|
|
69
|
+
* map keeps the plan builder pure (it is exported npm surface and asserted pure by tests): the
|
|
70
70
|
* async file reads happen here, and the composer only does a lookup.
|
|
71
71
|
*/
|
|
72
72
|
export async function resolveCommittedPersonas(projectRoot, personaIds) {
|
|
@@ -81,8 +81,8 @@ export async function resolveCommittedPersonas(projectRoot, personaIds) {
|
|
|
81
81
|
return { personas, warnings };
|
|
82
82
|
}
|
|
83
83
|
/**
|
|
84
|
-
* Every persona id a lab config could put on a browser
|
|
85
|
-
* declared, otherwise the actor-level persona that every fan-out
|
|
84
|
+
* Every persona id a lab config could put on a browser participant: the roster when one is
|
|
85
|
+
* declared, otherwise the actor-level persona that every fan-out participant inherits.
|
|
86
86
|
*/
|
|
87
87
|
export function labPersonaIds(config) {
|
|
88
88
|
const ids = [];
|
|
@@ -98,8 +98,8 @@ export function labPersonaIds(config) {
|
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
100
|
* Same resolution from a plain cwd, for the labs that carry a directory string rather than an
|
|
101
|
-
* already-prepared root. Realpath-then-prepare mirrors the
|
|
102
|
-
* personas from the physical project.
|
|
101
|
+
* already-prepared root. Realpath-then-prepare mirrors the computer-use route so a symlinked cwd
|
|
102
|
+
* still reads personas from the physical project.
|
|
103
103
|
*/
|
|
104
104
|
export async function resolveCommittedPersonasForCwd(cwd, personaIds) {
|
|
105
105
|
try {
|
package/dist/lab/persona.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { digestText, redactText } from "../evidence/redaction.js";
|
|
2
|
+
import { isRecord } from "../run/type-guards.js";
|
|
2
3
|
export const PERSONA_BACKGROUND_MAX_BYTES = 32 * 1024;
|
|
3
4
|
const PERSONA_COMPILER_VERSION = 2;
|
|
4
5
|
export class PersonaConfigError extends Error {
|
|
@@ -18,9 +19,6 @@ const PERSONA_FIELDS = new Set([
|
|
|
18
19
|
"constraints",
|
|
19
20
|
]);
|
|
20
21
|
const TRAIT_FIELDS = new Set(["patience", "technical_confidence", "accessibility_needs"]);
|
|
21
|
-
function isRecord(value) {
|
|
22
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23
|
-
}
|
|
24
22
|
function cleanText(value) {
|
|
25
23
|
return value
|
|
26
24
|
.replace(/\r\n?/g, "\n")
|
package/dist/lab/plan-base.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { RunLabProvenance } from "../run/status.js";
|
|
2
1
|
import type { Brain, ComputerUsePlan, NonEmpty, PlannedAnalysis, ProvisionedSubject, Requirement } from "./plan-types.js";
|
|
3
2
|
import type { LabConfig } from "./types.js";
|
|
4
3
|
export type Base = Omit<ComputerUsePlan, "route" | "actor" | "runner" | "concurrency" | "sessionBudgetMs" | "sandboxMs" | "caps" | "rerun">;
|
|
@@ -22,7 +21,6 @@ export declare function pricedModel(brain: Brain): string;
|
|
|
22
21
|
/** The fields every plan shares, from a config whose analysis already resolved. */
|
|
23
22
|
export declare function planBase(config: LabConfig, input: {
|
|
24
23
|
readonly dryRun: boolean;
|
|
25
|
-
readonly lab?: RunLabProvenance;
|
|
26
24
|
readonly analysis?: {
|
|
27
25
|
readonly config?: PlannedAnalysis["config"] | undefined;
|
|
28
26
|
readonly preferLargerOutput?: boolean | undefined;
|
package/dist/lab/plan-base.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
// What every route planner shares: the plan fields common to all routes, the frozen residual config,
|
|
2
2
|
// and the requirement and subject helpers.
|
|
3
3
|
import { DEFAULT_OPENAI_CU_MODEL } from "../actors/computer-use/openai-provider.js";
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
// A YAML alias can make a parsed record contain itself (an inline persona that names its own
|
|
5
|
+
// anchor), and structuredClone keeps the cycle, so each object is frozen once.
|
|
6
|
+
function deepFreeze(value, frozen = new WeakSet()) {
|
|
7
|
+
if (typeof value === "object" && value !== null && !frozen.has(value)) {
|
|
8
|
+
frozen.add(value);
|
|
6
9
|
for (const child of Object.values(value))
|
|
7
|
-
deepFreeze(child);
|
|
10
|
+
deepFreeze(child, frozen);
|
|
8
11
|
Object.freeze(value);
|
|
9
12
|
}
|
|
10
13
|
return value;
|
|
@@ -109,7 +112,6 @@ export function planBase(config, input) {
|
|
|
109
112
|
return {
|
|
110
113
|
labId: config.id,
|
|
111
114
|
...(config.title === undefined ? {} : { title: config.title }),
|
|
112
|
-
...(input.lab === undefined ? {} : { lab: input.lab }),
|
|
113
115
|
residual: residualOf(config),
|
|
114
116
|
dryRun: input.dryRun,
|
|
115
117
|
...(analysis === undefined
|
|
@@ -5,7 +5,7 @@ import type { LabTask } from "./tasks.js";
|
|
|
5
5
|
import type { LabConfig } from "./types.js";
|
|
6
6
|
/** Who one participant is. Every route with participants carries this record. */
|
|
7
7
|
export interface Participant {
|
|
8
|
-
/** Declared roster id, else `lane-NN` (independent
|
|
8
|
+
/** Declared roster id, else `lane-NN` (independent participants) or `role-NN` (shared-world participants). */
|
|
9
9
|
readonly id: string;
|
|
10
10
|
/** 0-based position in the roster. Bundle `sim-NNN` and `stream-NNN` ids derive from it. */
|
|
11
11
|
readonly index: number;
|
|
@@ -30,7 +30,7 @@ interface DesktopParticipant extends Participant {
|
|
|
30
30
|
readonly preset: DevicePreset;
|
|
31
31
|
readonly resolution: [number, number];
|
|
32
32
|
};
|
|
33
|
-
/**
|
|
33
|
+
/** The `lanes[]` entry's value, else actor value, else absent (the provider default is recorded in the trace). */
|
|
34
34
|
readonly limits: {
|
|
35
35
|
readonly stopWhen?: StopWhen;
|
|
36
36
|
readonly dwell?: DwellWindow;
|
|
@@ -38,20 +38,20 @@ interface DesktopParticipant extends Participant {
|
|
|
38
38
|
readonly maxOutputTokens?: number;
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
-
/** Only independent computer-use
|
|
41
|
+
/** Only independent computer-use participants consume a task protocol and their own target. */
|
|
42
42
|
export interface ComputerUseParticipant extends DesktopParticipant {
|
|
43
43
|
readonly tasks?: readonly LabTask[];
|
|
44
|
-
/** app-url fan-out only: this
|
|
44
|
+
/** app-url fan-out only: this participant's own entry URL; absent means the subject URL. */
|
|
45
45
|
readonly targetUrl?: string;
|
|
46
46
|
}
|
|
47
|
-
/** A
|
|
47
|
+
/** A participant on a provisioned plane: an optional same-origin path under `serve.url`. */
|
|
48
48
|
export interface ProvisionedParticipant extends DesktopParticipant {
|
|
49
49
|
readonly entry?: string;
|
|
50
50
|
readonly host?: never;
|
|
51
51
|
readonly tasks?: never;
|
|
52
52
|
readonly targetUrl?: never;
|
|
53
53
|
}
|
|
54
|
-
/** A
|
|
54
|
+
/** A participant on an external public plane: exactly one participant hosts the shared session. */
|
|
55
55
|
export interface ExternalPublicParticipant extends DesktopParticipant {
|
|
56
56
|
readonly host: boolean;
|
|
57
57
|
readonly entry?: never;
|
|
@@ -68,7 +68,7 @@ export type SharedWorldRoster = {
|
|
|
68
68
|
/** One shared-world participant on either plane. */
|
|
69
69
|
export type SharedWorldParticipant = ProvisionedParticipant | ExternalPublicParticipant;
|
|
70
70
|
/**
|
|
71
|
-
* The
|
|
71
|
+
* The participants of a computer-use lab: the declared roster, else `count` identical ones. A count
|
|
72
72
|
* override (`--count`) applies only when no roster is declared.
|
|
73
73
|
*/
|
|
74
74
|
export declare function computerUseParticipants(config: LabConfig, countOverride?: number): ComputerUseParticipant[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Who takes part in a lab: one record per participant, built from the declared roster or a count.
|
|
2
|
-
// Computer-use
|
|
2
|
+
// Computer-use and shared-world participants share the desktop fields; each kind adds its own.
|
|
3
3
|
import { resolveParticipantDevice } from "./device-presets.js";
|
|
4
4
|
import { isSharedWorldComposition, participantIdAt } from "./routing.js";
|
|
5
5
|
import { focusOf, rosterOf } from "./parse/actors.js";
|
|
@@ -35,7 +35,7 @@ function desktopParticipant(config, entry, index, kind, focus) {
|
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* The
|
|
38
|
+
* The participants of a computer-use lab: the declared roster, else `count` identical ones. A count
|
|
39
39
|
* override (`--count`) applies only when no roster is declared.
|
|
40
40
|
*/
|
|
41
41
|
export function computerUseParticipants(config, countOverride) {
|
package/dist/lab/plan-types.d.ts
CHANGED
|
@@ -4,14 +4,17 @@ import type { ReasoningEffort } from "../actors/reasoning-effort.js";
|
|
|
4
4
|
import type { BrowserSurface } from "../actors/scripted-browser/types.js";
|
|
5
5
|
import type { ScriptedRefusal } from "../routes/scripted/plan.js";
|
|
6
6
|
import type { TerminalRefusal } from "../routes/terminal/plan.js";
|
|
7
|
-
import type {
|
|
7
|
+
import type { RunStudyProvenance } from "../run/study-provenance.js";
|
|
8
8
|
import type { ComputerUseRefusal } from "../routes/computer-use/plan.js";
|
|
9
9
|
import type { SharedWorldRefusal } from "../routes/shared-world/plan.js";
|
|
10
10
|
import type { ComputerUseParticipant, ExternalPublicParticipant, ProvisionedParticipant } from "./plan-participants.js";
|
|
11
11
|
import type { LabConfig, LabExecutionTerminal, LabRuntimeAuth, LabScenarioCaps, LabSubjectProduct, LabSubjectServe, LabSubjectState, LabSubjectStateCheckpoint } from "./types.js";
|
|
12
12
|
export type NonEmpty<T> = readonly [T, ...T[]];
|
|
13
13
|
type AtLeastTwo<T> = readonly [T, T, ...T[]];
|
|
14
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* Something a route checks right before acquisition. Preflight refuses on, and doctor and the TUI
|
|
16
|
+
* report, the keys and subject env listed here, through src/lab/requirements.ts.
|
|
17
|
+
*/
|
|
15
18
|
export type Requirement = {
|
|
16
19
|
readonly kind: "key";
|
|
17
20
|
readonly name: "OPENAI_API_KEY" | "E2B_API_KEY";
|
|
@@ -39,7 +42,12 @@ export type Requirement = {
|
|
|
39
42
|
readonly kind: "external-catch";
|
|
40
43
|
readonly url: string;
|
|
41
44
|
};
|
|
42
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Config fields no plan field decides. After admission, computer use reads the config only to pass
|
|
47
|
+
* it to the caller's createProvider and inProcess executor; its planner, refusal envelopes and local
|
|
48
|
+
* VM study read it before a plan exists. Shared world, terminal and scripted still read some config
|
|
49
|
+
* fields at run time.
|
|
50
|
+
*/
|
|
43
51
|
export type ResidualConfig = Pick<LabConfig, "comms" | "policies" | "personas" | "defaults" | "review"> & {
|
|
44
52
|
readonly execution?: Pick<NonNullable<LabConfig["execution"]>, "desktop" | "target">;
|
|
45
53
|
readonly subject: Pick<LabConfig["subject"], "clone" | "localTree" | "repos" | "envValues">;
|
|
@@ -54,7 +62,7 @@ interface PlanBase {
|
|
|
54
62
|
readonly labId: string;
|
|
55
63
|
/** The lab's declared title, which bundles record. */
|
|
56
64
|
readonly title?: string;
|
|
57
|
-
readonly lab?:
|
|
65
|
+
readonly lab?: RunStudyProvenance;
|
|
58
66
|
/** A frozen copy owned by the plan. */
|
|
59
67
|
readonly residual: Readonly<ResidualConfig>;
|
|
60
68
|
readonly dryRun: boolean;
|
|
@@ -74,7 +82,7 @@ interface PreviewPlan extends PlanBase {
|
|
|
74
82
|
readonly participantCount: number;
|
|
75
83
|
}
|
|
76
84
|
/**
|
|
77
|
-
* The model driving a desktop participant. `caller` is the library caller's
|
|
85
|
+
* The model driving a desktop participant. `caller` is the library caller's createProvider.
|
|
78
86
|
* `declaredModel` is actors[0].model as the lab wrote it, absent when undeclared: the providers
|
|
79
87
|
* take it as written, and spend is priced at it, else the default (pricedModel). An openai
|
|
80
88
|
* brain's `model` is the one its provider runs, with that default applied.
|
|
@@ -107,6 +115,11 @@ export interface AppUrlSubject {
|
|
|
107
115
|
readonly kind: "app-url";
|
|
108
116
|
readonly appUrl: string;
|
|
109
117
|
readonly publicTargets: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* A `subject.serve.url` declared on this subject, which the parser refuses and only a library
|
|
120
|
+
* config can carry. Participants map links to it back to their own app.
|
|
121
|
+
*/
|
|
122
|
+
readonly serveUrl?: string;
|
|
110
123
|
}
|
|
111
124
|
/**
|
|
112
125
|
* Supported subject and desktop pairings. The local VM also takes public targets: the route runs
|
|
@@ -119,6 +132,8 @@ export type ComputerUseRunner = {
|
|
|
119
132
|
readonly subject: AppUrlSubject | ProvisionedSubject | {
|
|
120
133
|
readonly kind: "desktop-cli";
|
|
121
134
|
readonly product: LabSubjectProduct;
|
|
135
|
+
/** As on AppUrlSubject: a library config's declared `subject.serve.url`. */
|
|
136
|
+
readonly serveUrl?: string;
|
|
122
137
|
};
|
|
123
138
|
} | {
|
|
124
139
|
readonly desktop: "local-vm";
|
|
@@ -179,7 +194,7 @@ export interface SharedWorldPlan extends PlanBase {
|
|
|
179
194
|
readonly plane: SharedWorldPlane;
|
|
180
195
|
/** At least 2. */
|
|
181
196
|
readonly concurrency: number;
|
|
182
|
-
/** The declared
|
|
197
|
+
/** The declared participant session timeout; the route supplies its default. */
|
|
183
198
|
readonly sessionTimeoutMs?: number;
|
|
184
199
|
readonly brain: Extract<Brain, {
|
|
185
200
|
kind: "openai" | "local-agent";
|
|
@@ -201,7 +216,10 @@ export type TerminalPlan = PlanBase & {
|
|
|
201
216
|
readonly mission?: string;
|
|
202
217
|
readonly runtime: {
|
|
203
218
|
readonly version?: string;
|
|
204
|
-
|
|
219
|
+
/** Passed to Codex as `--model` on every run, so the bundle can name and price it. */
|
|
220
|
+
readonly model: string;
|
|
221
|
+
/** `declared` by the lab's actor, or humanish's participant default. */
|
|
222
|
+
readonly modelSource: "declared" | "humanish_default";
|
|
205
223
|
readonly reasoningEffort?: ReasoningEffort;
|
|
206
224
|
readonly auth?: LabRuntimeAuth;
|
|
207
225
|
};
|
|
@@ -264,7 +282,7 @@ export type RoutePlanResult<Plan, Refusal> = {
|
|
|
264
282
|
readonly refusal: Refusal;
|
|
265
283
|
};
|
|
266
284
|
/** The error codes the preview route returns before a run starts. */
|
|
267
|
-
export type PreviewRefusalCode = "
|
|
285
|
+
export type PreviewRefusalCode = "HUMANISH_STUDY_COMMS_UNSUPPORTED" | "HUMANISH_STUDY_ANALYSIS_INVALID" | "HUMANISH_STUDY_ANALYSIS_UNSUPPORTED" | "HUMANISH_STUDY_TASKS_UNSUPPORTED" | "HUMANISH_INVALID_PARTICIPANT_COUNT" | "HUMANISH_LIVE_RUN_UNIMPLEMENTED";
|
|
268
286
|
/** Why planLab refused: the route's own code and message, as its runner returns them. */
|
|
269
287
|
export type PlanRefusal = RouteRefusal<"preview", PreviewRefusalCode> | TerminalRefusal | ScriptedRefusal | ComputerUseRefusal | SharedWorldRefusal;
|
|
270
288
|
export type PlanResult = {
|
package/dist/lab/plan.d.ts
CHANGED
|
@@ -1,22 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { InternalRunLabOptions } from "../run-lab.js";
|
|
2
|
+
import type { LabDeps } from "./lab-deps.js";
|
|
2
3
|
import type { PlanResult } from "./plan-types.js";
|
|
3
4
|
import type { LabConfig } from "./types.js";
|
|
4
|
-
|
|
5
|
-
export type LabRoute = "preview" | "computer-use" | "shared-world" | "terminal" | "scripted";
|
|
6
|
-
/** A route's older name, kept in `LabOutcome.backend` and the preflight result's `backend`. */
|
|
7
|
-
export type LabBackend = "synthetic" | "cua" | "scripted" | "terminal" | "concurrent-shared-world";
|
|
8
|
-
/** The backend name older callers and wire fields use for a route. */
|
|
9
|
-
export declare function backendOf(route: LabRoute): LabBackend;
|
|
10
|
-
/**
|
|
11
|
-
* The backend a config runs on: `routeOf`, under its older name.
|
|
12
|
-
* @deprecated Use `routeOf`, and `backendOf` for the older backend name. This goes in the next minor.
|
|
13
|
-
*/
|
|
14
|
-
export declare function selectLabBackend(config: LabConfig): LabBackend;
|
|
15
|
-
/**
|
|
16
|
-
* The route a config takes. It never refuses: a config no route can run still gets the route
|
|
17
|
-
* whose own checks refuse it with the most precise reason.
|
|
18
|
-
*/
|
|
19
|
-
export declare function routeOf(config: LabConfig): LabRoute;
|
|
5
|
+
export { routeOf, type LabRoute } from "./routing.js";
|
|
20
6
|
/** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
|
|
21
7
|
export declare function resolveLabDryRun(config: LabConfig, override: boolean | undefined, fallback: boolean | undefined): boolean | undefined;
|
|
22
8
|
/**
|
|
@@ -24,4 +10,4 @@ export declare function resolveLabDryRun(config: LabConfig, override: boolean |
|
|
|
24
10
|
* makes every refusal that route makes, in the route's order and with its codes and messages; the
|
|
25
11
|
* route's exported runner calls the same planner.
|
|
26
12
|
*/
|
|
27
|
-
export declare function planLab(config: LabConfig, options:
|
|
13
|
+
export declare function planLab(config: LabConfig, options: InternalRunLabOptions, deps?: LabDeps): PlanResult;
|
package/dist/lab/plan.js
CHANGED
|
@@ -1,67 +1,17 @@
|
|
|
1
1
|
// The route decision. A lab's route follows from its composition (subject.source,
|
|
2
|
-
// execution.target, the first actor's registered
|
|
3
|
-
// kind. This is the only function that decides it
|
|
4
|
-
// backend names.
|
|
2
|
+
// execution.target, the first actor's registered run kind, subject.topology), never from a
|
|
3
|
+
// declared kind. This is the only function that decides it.
|
|
5
4
|
import { resolveAutomaticAnalysis } from "../analysis/automatic-config.js";
|
|
6
|
-
import { planComputerUseLab } from "../routes/computer-use/plan.js";
|
|
7
|
-
import { planScriptedLab } from "../routes/scripted/plan.js";
|
|
5
|
+
import { callerDrivingOf, planComputerUseLab } from "../routes/computer-use/plan.js";
|
|
6
|
+
import { injectedBrowser, planScriptedLab } from "../routes/scripted/plan.js";
|
|
8
7
|
import { planSharedWorldLab } from "../routes/shared-world/plan.js";
|
|
9
8
|
import { planTerminalLab } from "../routes/terminal/plan.js";
|
|
10
9
|
import { localBrowserDefaults } from "../substrates/local/runtime-config.js";
|
|
11
10
|
import { THIS_REPO_DRY_RUN_ONLY } from "./composition-rules.js";
|
|
12
11
|
import { planBase } from "./plan-base.js";
|
|
13
|
-
import {
|
|
12
|
+
import { routeOf } from "./routing.js";
|
|
14
13
|
import { automaticAnalysisRouteReason, taskProtocolValidationReason } from "./validation.js";
|
|
15
|
-
|
|
16
|
-
preview: "synthetic",
|
|
17
|
-
"computer-use": "cua",
|
|
18
|
-
"shared-world": "concurrent-shared-world",
|
|
19
|
-
terminal: "terminal",
|
|
20
|
-
scripted: "scripted",
|
|
21
|
-
};
|
|
22
|
-
/** The backend name older callers and wire fields use for a route. */
|
|
23
|
-
export function backendOf(route) {
|
|
24
|
-
return BACKENDS[route];
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* The backend a config runs on: `routeOf`, under its older name.
|
|
28
|
-
* @deprecated Use `routeOf`, and `backendOf` for the older backend name. This goes in the next minor.
|
|
29
|
-
*/
|
|
30
|
-
export function selectLabBackend(config) {
|
|
31
|
-
return backendOf(routeOf(config));
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* The route a config takes. It never refuses: a config no route can run still gets the route
|
|
35
|
-
* whose own checks refuse it with the most precise reason.
|
|
36
|
-
*/
|
|
37
|
-
export function routeOf(config) {
|
|
38
|
-
const source = config.subject.source;
|
|
39
|
-
// A scripted-browser actor on a loopback app or a provisioned clone replays committed steps.
|
|
40
|
-
if (isScriptedBrowserComposition(config))
|
|
41
|
-
return "scripted";
|
|
42
|
-
// A terminal-product subject goes to the terminal route even with an unregistered actor, so that
|
|
43
|
-
// route refuses the actor instead of another route running something else.
|
|
44
|
-
if (isTerminalProductComposition(config) || source === "terminal-product")
|
|
45
|
-
return "terminal";
|
|
46
|
-
// Checked before computer use: the same composition without the topology declaration runs as
|
|
47
|
-
// independent lanes.
|
|
48
|
-
if (isSharedWorldComposition(config))
|
|
49
|
-
return "shared-world";
|
|
50
|
-
// A CLI studied at a desktop is a computer-use study whose subject is a terminal window.
|
|
51
|
-
if (source === "desktop-cli")
|
|
52
|
-
return "computer-use";
|
|
53
|
-
// Every other app-url, clone, local-app or local-tree config goes to computer use, including
|
|
54
|
-
// ones with an unknown actor: that route refuses the actor, where the preview route would run
|
|
55
|
-
// no participant at all.
|
|
56
|
-
if (isComputerUseComposition(config) ||
|
|
57
|
-
source === "app-url" ||
|
|
58
|
-
source === "clone" ||
|
|
59
|
-
source === "local-app" ||
|
|
60
|
-
source === "local-tree")
|
|
61
|
-
return "computer-use";
|
|
62
|
-
// this-repo runs the synthetic preview.
|
|
63
|
-
return "preview";
|
|
64
|
-
}
|
|
14
|
+
export { routeOf } from "./routing.js";
|
|
65
15
|
/** Resolve dry-run: explicit override wins, else the scenario mode, else the given fallback. */
|
|
66
16
|
export function resolveLabDryRun(config, override, fallback) {
|
|
67
17
|
if (override !== undefined) {
|
|
@@ -85,19 +35,19 @@ function planPreview(config, options, input) {
|
|
|
85
35
|
refusal: { route: "preview", code, message },
|
|
86
36
|
});
|
|
87
37
|
if (String(config.comms?.email?.kind) === "real")
|
|
88
|
-
return refuse("
|
|
38
|
+
return refuse("HUMANISH_STUDY_COMMS_UNSUPPORTED", "Real email receiving is unsupported on the preview route. Use a supported hosted computer-use lab.");
|
|
89
39
|
const analysis = resolveAutomaticAnalysis(config.review?.analysis);
|
|
90
40
|
if (!analysis.ok)
|
|
91
|
-
return refuse("
|
|
41
|
+
return refuse("HUMANISH_STUDY_ANALYSIS_INVALID", analysis.message);
|
|
92
42
|
const unsupported = automaticAnalysisRouteReason(config);
|
|
93
43
|
if (unsupported)
|
|
94
|
-
return refuse("
|
|
44
|
+
return refuse("HUMANISH_STUDY_ANALYSIS_UNSUPPORTED", unsupported);
|
|
95
45
|
const tasksReason = taskProtocolValidationReason(config);
|
|
96
46
|
if (tasksReason)
|
|
97
|
-
return refuse("
|
|
47
|
+
return refuse("HUMANISH_STUDY_TASKS_UNSUPPORTED", tasksReason);
|
|
98
48
|
const participantCount = options.count ?? config.actors[0]?.count ?? 4;
|
|
99
49
|
if (!Number.isSafeInteger(participantCount) || participantCount < 1)
|
|
100
|
-
return refuse("
|
|
50
|
+
return refuse("HUMANISH_INVALID_PARTICIPANT_COUNT", "count must be a positive integer.");
|
|
101
51
|
if (!input.dryRun)
|
|
102
52
|
return refuse("HUMANISH_LIVE_RUN_UNIMPLEMENTED", THIS_REPO_DRY_RUN_ONLY);
|
|
103
53
|
return {
|
|
@@ -115,42 +65,37 @@ function planPreview(config, options, input) {
|
|
|
115
65
|
* makes every refusal that route makes, in the route's order and with its codes and messages; the
|
|
116
66
|
* route's exported runner calls the same planner.
|
|
117
67
|
*/
|
|
118
|
-
export function planLab(config, options) {
|
|
68
|
+
export function planLab(config, options, deps = {}) {
|
|
119
69
|
const lab = localBrowserDefaults(config);
|
|
120
|
-
const input = {
|
|
121
|
-
|
|
122
|
-
...(options.lab === undefined ? {} : { lab: options.lab }),
|
|
123
|
-
};
|
|
124
|
-
const result = planRoute(routeOf(config), lab, options, input);
|
|
70
|
+
const input = { dryRun: resolveLabDryRun(lab, options.dryRun, true) ?? true };
|
|
71
|
+
const result = planRoute(routeOf(config), lab, options, input, deps);
|
|
125
72
|
if (!result.ok)
|
|
126
73
|
return result;
|
|
127
|
-
|
|
74
|
+
// The manifest the CLI resolved enters the plan here and nowhere else; the routes read
|
|
75
|
+
// plan.lab for the run's status record and bundle.
|
|
76
|
+
const plan = options.lab === undefined ? result.plan : { ...result.plan, lab: options.lab };
|
|
77
|
+
return { ok: true, planned: { plan } };
|
|
128
78
|
}
|
|
129
|
-
function planRoute(route, lab, options, input) {
|
|
79
|
+
function planRoute(route, lab, options, input, deps) {
|
|
130
80
|
switch (route) {
|
|
131
81
|
case "preview":
|
|
132
82
|
return planPreview(lab, options, input);
|
|
133
83
|
case "computer-use":
|
|
134
84
|
return planComputerUseLab(lab, {
|
|
135
85
|
...input,
|
|
136
|
-
|
|
86
|
+
hasRunSession: deps.runSession !== undefined,
|
|
87
|
+
driving: callerDrivingOf(options),
|
|
137
88
|
...(options.count === undefined ? {} : { countOverride: options.count }),
|
|
138
89
|
...(options.rerun === undefined ? {} : { rerun: options.rerun }),
|
|
139
90
|
});
|
|
140
91
|
case "shared-world":
|
|
141
92
|
return planSharedWorldLab(lab, {
|
|
142
93
|
...input,
|
|
143
|
-
|
|
94
|
+
hasRunSession: deps.runSession !== undefined,
|
|
144
95
|
});
|
|
145
96
|
case "terminal":
|
|
146
|
-
return planTerminalLab(lab, {
|
|
147
|
-
...input,
|
|
148
|
-
...(options.terminalHooks === undefined ? {} : { hooks: options.terminalHooks }),
|
|
149
|
-
});
|
|
97
|
+
return planTerminalLab(lab, { ...input, hasCostProbe: deps.costProbe !== undefined });
|
|
150
98
|
case "scripted":
|
|
151
|
-
return planScriptedLab(lab, {
|
|
152
|
-
...input,
|
|
153
|
-
...(options.scriptedHooks === undefined ? {} : { hooks: options.scriptedHooks }),
|
|
154
|
-
});
|
|
99
|
+
return planScriptedLab(lab, { ...input, injectedBrowser: injectedBrowser(deps) });
|
|
155
100
|
}
|
|
156
101
|
}
|
|
@@ -19,7 +19,7 @@ const PREFLIGHT_LEASE_BUFFER_MS = 5 * 60_000;
|
|
|
19
19
|
export async function runPublicPreviewPreflight(ctx) {
|
|
20
20
|
const routeError = publicPreviewRouteError(ctx.config, ctx.route);
|
|
21
21
|
if (routeError) {
|
|
22
|
-
return fail(ctx, "
|
|
22
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
|
|
23
23
|
{ name: "route", ok: false, message: routeError },
|
|
24
24
|
]);
|
|
25
25
|
}
|
|
@@ -28,12 +28,12 @@ export async function runPublicPreviewPreflight(ctx) {
|
|
|
28
28
|
? rosterTargets
|
|
29
29
|
: ctx.targets.filter((target) => target.kind === "subject.appUrl");
|
|
30
30
|
if (publicTargets.length === 0) {
|
|
31
|
-
return fail(ctx, "
|
|
31
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TARGET_POLICY", "public-preview preflight needs at least one declared app-url target.", [{ name: "targets", ok: false, message: "no app-url targets were declared" }]);
|
|
32
32
|
}
|
|
33
33
|
const loopbackTarget = publicTargets.find((target) => target.loopback);
|
|
34
34
|
if (loopbackTarget) {
|
|
35
35
|
blockTarget(loopbackTarget, "public-preview requires externally reachable non-loopback targets.");
|
|
36
|
-
return fail(ctx, "
|
|
36
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TARGET_POLICY", "public-preview reachability cannot prove loopback targets from a hosted desktop; use sandbox-loopback or a prepared public target.", [
|
|
37
37
|
{
|
|
38
38
|
name: "target policy",
|
|
39
39
|
ok: false,
|
|
@@ -43,7 +43,7 @@ export async function runPublicPreviewPreflight(ctx) {
|
|
|
43
43
|
}
|
|
44
44
|
const e2bApiKey = ctx.env.E2B_API_KEY?.trim();
|
|
45
45
|
if (!e2bApiKey) {
|
|
46
|
-
return fail(ctx, "
|
|
46
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_E2B_REQUIRED", "public-preview preflight creates one E2B desktop to probe target reachability; E2B_API_KEY is required.", [{ name: "e2b api key", ok: false, message: "missing E2B_API_KEY" }]);
|
|
47
47
|
}
|
|
48
48
|
// Each target gets at most one readiness budget.
|
|
49
49
|
const leaseMs = publicTargets.length * ctx.timeoutMs + PREFLIGHT_LEASE_BUFFER_MS;
|
|
@@ -63,7 +63,7 @@ export async function runPublicPreviewPreflight(ctx) {
|
|
|
63
63
|
}
|
|
64
64
|
const failed = publicTargets.find((target) => target.reachable === false);
|
|
65
65
|
if (failed) {
|
|
66
|
-
return fail(ctx, "
|
|
66
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TARGET_UNREACHABLE", "one or more declared public-preview targets were not reachable from the hosted desktop.", [
|
|
67
67
|
{
|
|
68
68
|
name: "target reachability",
|
|
69
69
|
ok: false,
|
|
@@ -82,13 +82,13 @@ export async function runPublicPreviewPreflight(ctx) {
|
|
|
82
82
|
export async function runSandboxLoopbackPreflight(ctx) {
|
|
83
83
|
const routeError = sandboxLoopbackRouteError(ctx.config, ctx.route);
|
|
84
84
|
if (routeError) {
|
|
85
|
-
return fail(ctx, "
|
|
85
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", routeError, [
|
|
86
86
|
{ name: "route", ok: false, message: routeError },
|
|
87
87
|
]);
|
|
88
88
|
}
|
|
89
89
|
const missingEnv = (ctx.config.subject.env ?? []).filter((name) => !ctx.env[name]?.trim());
|
|
90
90
|
if (missingEnv.length > 0) {
|
|
91
|
-
return fail(ctx, "
|
|
91
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_ENV_MISSING", `sandbox-loopback preflight needs declared env values: ${missingEnv.join(", ")}`, [
|
|
92
92
|
{
|
|
93
93
|
name: "subject env",
|
|
94
94
|
ok: false,
|
|
@@ -98,12 +98,12 @@ export async function runSandboxLoopbackPreflight(ctx) {
|
|
|
98
98
|
}
|
|
99
99
|
const e2bApiKey = ctx.env.E2B_API_KEY?.trim();
|
|
100
100
|
if (!e2bApiKey) {
|
|
101
|
-
return fail(ctx, "
|
|
101
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_E2B_REQUIRED", "sandbox-loopback preflight creates one E2B desktop to clone, serve, and probe the subject; E2B_API_KEY is required.", [{ name: "e2b api key", ok: false, message: "missing E2B_API_KEY" }]);
|
|
102
102
|
}
|
|
103
103
|
const repo = ctx.config.subject.repos?.[0];
|
|
104
104
|
const serve = ctx.config.subject.serve;
|
|
105
105
|
if (!repo || !serve) {
|
|
106
|
-
return fail(ctx, "
|
|
106
|
+
return fail(ctx, "HUMANISH_STUDY_PREFLIGHT_UNSUPPORTED_ROUTE", "sandbox-loopback preflight requires one clone repo and subject.serve.", [{ name: "clone subject", ok: false, message: "missing repo or serve block" }]);
|
|
107
107
|
}
|
|
108
108
|
let subjectCommitDigest;
|
|
109
109
|
// The longest the clone and serve steps can take with the lab's own budgets, so the probe is
|
|
@@ -216,7 +216,7 @@ async function withPreflightSandbox(ctx, args, callback) {
|
|
|
216
216
|
if (failureMessage) {
|
|
217
217
|
return {
|
|
218
218
|
ok: false,
|
|
219
|
-
result: fail(ctx, "
|
|
219
|
+
result: fail(ctx, "HUMANISH_STUDY_PREFLIGHT_PROVISION_FAILED", failureMessage, [
|
|
220
220
|
{ name: "sandbox preflight", ok: false, message: failureMessage },
|
|
221
221
|
]),
|
|
222
222
|
};
|
|
@@ -224,7 +224,7 @@ async function withPreflightSandbox(ctx, args, callback) {
|
|
|
224
224
|
if (ctx.sandbox.created && ctx.sandbox.killed !== true) {
|
|
225
225
|
return {
|
|
226
226
|
ok: false,
|
|
227
|
-
result: fail(ctx, "
|
|
227
|
+
result: fail(ctx, "HUMANISH_STUDY_PREFLIGHT_TEARDOWN_FAILED", "preflight sandbox was created but teardown could not be proven.", [{ name: "sandbox teardown", ok: false, message: "sandbox kill was not proven" }]),
|
|
228
228
|
};
|
|
229
229
|
}
|
|
230
230
|
return { ok: true };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { LabPreflightCheck, LabPreflightResult, PreflightContext } from "./preflight.js";
|
|
2
|
-
|
|
2
|
+
/** The schema of `lab preflight` results: whether a study is ready to run on this machine. */
|
|
3
|
+
export declare const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
|
|
3
4
|
export declare function finalize(ctx: PreflightContext, args?: {
|
|
4
5
|
check?: LabPreflightCheck;
|
|
5
6
|
}): LabPreflightResult;
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
// The preflight result a run returns, built from its context. preflight.ts and the probes in
|
|
2
2
|
// preflight-probes.ts both finish through these, so they live below both.
|
|
3
|
-
import { backendOf } from "./plan.js";
|
|
4
3
|
import { automaticAnalysisBudget } from "../analysis/automatic-config.js";
|
|
5
4
|
import { digestText } from "../evidence/redaction.js";
|
|
6
|
-
|
|
5
|
+
/** The schema of `lab preflight` results: whether a study is ready to run on this machine. */
|
|
6
|
+
export const STUDY_CHECK_SCHEMA = "humanish.study-check.v1";
|
|
7
7
|
export function finalize(ctx, args) {
|
|
8
8
|
const checks = args?.check ? [...ctx.checks, args.check] : ctx.checks;
|
|
9
9
|
const analysis = automaticAnalysisBudget(ctx.config.review?.analysis, ctx.route);
|
|
10
10
|
return {
|
|
11
|
-
schema:
|
|
11
|
+
schema: STUDY_CHECK_SCHEMA,
|
|
12
12
|
...(analysis ? { analysis } : {}),
|
|
13
13
|
ok: checks.every((check) => check.ok) &&
|
|
14
14
|
ctx.targets.every((target) => target.status !== "failed" && target.status !== "blocked"),
|
|
15
15
|
cwd: ctx.cwd,
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
study: ctx.lab,
|
|
17
|
+
studyId: ctx.labId,
|
|
18
18
|
origin: ctx.origin,
|
|
19
19
|
path: ctx.path,
|
|
20
|
-
backend: backendOf(ctx.route),
|
|
21
20
|
route: ctx.route,
|
|
22
21
|
reachability: ctx.reachability,
|
|
23
22
|
checks,
|