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,13 +4,13 @@
|
|
|
4
4
|
* the per-line notes record where the two reference sims agree vs. diverge.
|
|
5
5
|
*/
|
|
6
6
|
export const DEVICE_PRESETS = {
|
|
7
|
-
// phone
|
|
7
|
+
// phone: both reference sims agree
|
|
8
8
|
mobile: { width: 414, height: 896, isMobile: true, deviceScaleFactor: 3 },
|
|
9
|
-
// small phone
|
|
9
|
+
// small phone: both reference sims agree
|
|
10
10
|
"small-mobile": { width: 360, height: 740, isMobile: true, deviceScaleFactor: 3 },
|
|
11
11
|
// older narrow phone
|
|
12
12
|
"narrow-mobile": { width: 320, height: 700, isMobile: true, deviceScaleFactor: 2 },
|
|
13
|
-
// tablet
|
|
13
|
+
// tablet: both reference sims agree
|
|
14
14
|
tablet: { width: 820, height: 1180, isMobile: false, deviceScaleFactor: 2 },
|
|
15
15
|
// laptop baseline (the in-house desktop screen; close to the 1440x960 dry-run surface in
|
|
16
16
|
// src/run/dry-run.ts)
|
|
@@ -20,7 +20,7 @@ export const DEVICE_PRESETS = {
|
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
22
|
* Default device for a run that does not declare one. `desktop` (1440x950) is the median
|
|
23
|
-
* first-run laptop screen
|
|
23
|
+
* first-run laptop screen, the in-house desktop default, within 10px of the 1440x960 dry-run
|
|
24
24
|
* surface in src/run/dry-run.ts. `wide` (1920x1080), the most-common external monitor, is one
|
|
25
25
|
* keystroke away (`execution.desktop.device: wide`) but is deliberately not the default,
|
|
26
26
|
* because the median device a first-time user arrives on is a laptop, not a 1080p monitor.
|
|
@@ -36,24 +36,24 @@ export function resolveDevicePreset(name) {
|
|
|
36
36
|
return DEVICE_PRESETS[name ?? DEFAULT_DEVICE_PRESET];
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* The narrowest browser
|
|
39
|
+
* The narrowest browser window Chrome/Chromium will render on the E2B desktop. Chrome refuses to
|
|
40
40
|
* make its window narrower than this (~500 CSS px observed: a 414-wide X screen produced a 500-wide
|
|
41
|
-
* window that
|
|
42
|
-
*
|
|
43
|
-
* narrow-mobile 320) gets a 500-wide screen the window fits exactly
|
|
41
|
+
* window that overflowed it, clipping the right edge of the page off-screen). So the physically
|
|
42
|
+
* rendered screen width is floored here: a sub-500 mobile preset (mobile 414, small-mobile 360,
|
|
43
|
+
* narrow-mobile 320) gets a 500-wide screen the window fits exactly, with no clip. The device preset keeps
|
|
44
44
|
* its true identity (isMobile, nominal width) for the persona prompt + metadata; only the rendered
|
|
45
45
|
* screen is floored. True sub-500 CSS-viewport rendering (page laid out at 414 regardless of window
|
|
46
|
-
* width, via CDP device-metric emulation) is the separate
|
|
46
|
+
* width, via CDP device-metric emulation) is the separate mobileEmulation option.
|
|
47
47
|
*/
|
|
48
48
|
export const MIN_DESKTOP_RENDER_WIDTH = 500;
|
|
49
|
-
/** Floor a screen resolution's
|
|
49
|
+
/** Floor a screen resolution's width to what Chrome can actually render (see MIN_DESKTOP_RENDER_WIDTH). */
|
|
50
50
|
export function floorRenderResolution(resolution) {
|
|
51
51
|
return [Math.max(resolution[0], MIN_DESKTOP_RENDER_WIDTH), resolution[1]];
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
54
|
* Resolve a participant's device + rendered resolution (most-specific wins, exactly as the
|
|
55
55
|
* single-participant path always has): a raw execution.desktop.resolution escape hatch (only legal
|
|
56
|
-
* when no roster entry sets a device
|
|
56
|
+
* when no roster entry sets a device; XOR enforced at parse) → the participant's named device → the run-wide
|
|
57
57
|
* execution.desktop.device → the default preset. A raw resolution is an unnamed custom desktop
|
|
58
58
|
* (non-mobile, DSF 1): we never claim a named preset's mobile/DPR for hand-set geometry. The rendered
|
|
59
59
|
* `resolution` is floored to MIN_DESKTOP_RENDER_WIDTH so the browser window fits its X screen (no clip);
|
package/dist/lab/discover.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../actors/contract.js";
|
|
2
2
|
import { type LabConfig } from "./types.js";
|
|
3
|
-
declare const
|
|
4
|
-
declare const
|
|
3
|
+
declare const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
|
|
4
|
+
declare const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
|
|
5
5
|
type LabOrigin = "committed" | "ignored" | "explicit";
|
|
6
6
|
interface ResolvedLabConfig {
|
|
7
7
|
config: LabConfig;
|
|
@@ -12,9 +12,10 @@ interface ResolvedLabConfig {
|
|
|
12
12
|
export interface LabResolveFailure {
|
|
13
13
|
ok: false;
|
|
14
14
|
cwd: string;
|
|
15
|
-
|
|
15
|
+
/** The study the caller asked for, as given. */
|
|
16
|
+
study: string;
|
|
16
17
|
error: {
|
|
17
|
-
code: "
|
|
18
|
+
code: "HUMANISH_STUDY_NOT_FOUND" | "HUMANISH_STUDY_INVALID" | "HUMANISH_STUDY_AMBIGUOUS";
|
|
18
19
|
message: string;
|
|
19
20
|
};
|
|
20
21
|
warnings: string[];
|
|
@@ -30,16 +31,18 @@ export interface LabListEntry {
|
|
|
30
31
|
title?: string;
|
|
31
32
|
/**
|
|
32
33
|
* The manifest's own first sentence. The list is where someone decides which study to open, and a
|
|
33
|
-
* list of names cannot answer "what is this one" for a project with twenty labs in it
|
|
34
|
+
* list of names cannot answer "what is this one" for a project with twenty labs in it; the
|
|
34
35
|
* stakeholder feedback that added this was, verbatim, "so i know wtf they are".
|
|
35
36
|
*/
|
|
36
37
|
description?: string;
|
|
38
|
+
/** Why `run` refuses this file by name: its stem also names a file in the other directory family. */
|
|
39
|
+
error?: string;
|
|
37
40
|
}
|
|
38
41
|
export interface LabListResult {
|
|
39
|
-
schema: typeof
|
|
42
|
+
schema: typeof STUDY_LIST_SCHEMA;
|
|
40
43
|
ok: true;
|
|
41
44
|
cwd: string;
|
|
42
|
-
|
|
45
|
+
studies: LabListEntry[];
|
|
43
46
|
warnings: string[];
|
|
44
47
|
}
|
|
45
48
|
export interface LabInspectResult {
|
|
@@ -49,10 +52,11 @@ export interface LabInspectResult {
|
|
|
49
52
|
resolved: boolean;
|
|
50
53
|
brief?: ActorPersonaRef["brief"];
|
|
51
54
|
}>;
|
|
52
|
-
schema: typeof
|
|
55
|
+
schema: typeof STUDY_SHOW_SCHEMA;
|
|
53
56
|
ok: boolean;
|
|
54
57
|
cwd: string;
|
|
55
|
-
|
|
58
|
+
/** The study the caller asked for, as given. */
|
|
59
|
+
study: string;
|
|
56
60
|
config?: LabConfig;
|
|
57
61
|
origin?: LabOrigin;
|
|
58
62
|
path?: string;
|
package/dist/lab/discover.js
CHANGED
|
@@ -5,15 +5,12 @@ import { lstat, open, readdir, realpath } from "node:fs/promises";
|
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { parse } from "yaml";
|
|
7
7
|
import { parseLabConfig } from "./config.js";
|
|
8
|
-
import {} from "./types.js";
|
|
8
|
+
import { STUDY_SCHEMA } from "./types.js";
|
|
9
9
|
import { assertPreparedSelectedOutputDirectory, assertSafeOutputPathSegment, prepareSelectedOutputDirectory, readContainedRegularFile, } from "../run/contained-output.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
path.join(".humanish", "labs"),
|
|
15
|
-
path.join(".humanish", "local", "labs"),
|
|
16
|
-
];
|
|
10
|
+
import { isNodeError } from "../run/type-guards.js";
|
|
11
|
+
import { studyFileCandidates, studyFileStem, STUDY_DIRECTORIES } from "../study/files.js";
|
|
12
|
+
const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
|
|
13
|
+
const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
|
|
17
14
|
export async function resolveLabManifest(cwd, lab) {
|
|
18
15
|
const resolvedCwd = path.resolve(cwd);
|
|
19
16
|
const warnings = [];
|
|
@@ -39,16 +36,10 @@ export async function resolveLabManifest(cwd, lab) {
|
|
|
39
36
|
contents: read.contents,
|
|
40
37
|
});
|
|
41
38
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
...ignoredLabsDirs.flatMap((dir) => [
|
|
46
|
-
{ origin: "ignored", relativePath: path.join(dir, `${lab}.yaml`) },
|
|
47
|
-
{ origin: "ignored", relativePath: path.join(dir, `${lab}.yml`) },
|
|
48
|
-
]),
|
|
49
|
-
];
|
|
39
|
+
// A studies/ file wins over every labs/ file. The same stem under both families is an error, so
|
|
40
|
+
// neither file silently shadows the other.
|
|
41
|
+
const candidates = studyFileCandidates(lab);
|
|
50
42
|
for (const candidate of candidates) {
|
|
51
|
-
const requestedPath = path.join(resolvedCwd, candidate.relativePath);
|
|
52
43
|
const read = await readManagedManifest(projectRoot, candidate.relativePath);
|
|
53
44
|
if (read.status === "missing") {
|
|
54
45
|
continue;
|
|
@@ -56,11 +47,18 @@ export async function resolveLabManifest(cwd, lab) {
|
|
|
56
47
|
if (read.status === "unsafe") {
|
|
57
48
|
return invalidLab({ cwd: resolvedCwd, lab, warnings }, read.message);
|
|
58
49
|
}
|
|
50
|
+
if (candidate.directory.family === "studies") {
|
|
51
|
+
for (const other of candidates.filter((entry) => entry.directory.family === "labs")) {
|
|
52
|
+
const present = await inspectManagedPath(projectRoot, other.relativePath, "file");
|
|
53
|
+
if (present.status !== "missing")
|
|
54
|
+
return ambiguousStudy(resolvedCwd, lab, [candidate.relativePath, other.relativePath], warnings);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
59
57
|
return parseResolvedLab({
|
|
60
58
|
cwd: resolvedCwd,
|
|
61
59
|
lab,
|
|
62
|
-
origin: candidate.origin,
|
|
63
|
-
path:
|
|
60
|
+
origin: candidate.directory.origin,
|
|
61
|
+
path: path.join(resolvedCwd, candidate.relativePath),
|
|
64
62
|
warnings,
|
|
65
63
|
contents: read.contents,
|
|
66
64
|
});
|
|
@@ -70,22 +68,21 @@ export async function resolveLabManifest(cwd, lab) {
|
|
|
70
68
|
export async function listLabManifests(cwd) {
|
|
71
69
|
const resolvedCwd = path.resolve(cwd);
|
|
72
70
|
const warnings = [];
|
|
73
|
-
const
|
|
71
|
+
const listed = new Map();
|
|
74
72
|
const projectRoot = await bindProjectRoot(resolvedCwd);
|
|
75
73
|
if (!projectRoot) {
|
|
76
74
|
return {
|
|
77
|
-
schema:
|
|
75
|
+
schema: STUDY_LIST_SCHEMA,
|
|
78
76
|
ok: true,
|
|
79
77
|
cwd: resolvedCwd,
|
|
80
|
-
|
|
81
|
-
warnings: ["Project root failed containment validation;
|
|
78
|
+
studies: [],
|
|
79
|
+
warnings: ["Project root failed containment validation; study files were skipped."],
|
|
82
80
|
};
|
|
83
81
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
for (const entry of dirs) {
|
|
82
|
+
let legacyFiles = 0;
|
|
83
|
+
// Each stem's files by directory family, to mark the stems that name a file in both.
|
|
84
|
+
const stems = new Map();
|
|
85
|
+
for (const entry of STUDY_DIRECTORIES) {
|
|
89
86
|
const directory = await bindManagedDirectory(projectRoot, entry.relativeDir);
|
|
90
87
|
if (directory.status === "missing") {
|
|
91
88
|
continue;
|
|
@@ -106,13 +103,15 @@ export async function listLabManifests(cwd) {
|
|
|
106
103
|
for (const name of names.filter((value) => value.endsWith(".yaml") || value.endsWith(".yml"))) {
|
|
107
104
|
let relativePath;
|
|
108
105
|
try {
|
|
109
|
-
assertSafeOutputPathSegment(name, "
|
|
106
|
+
assertSafeOutputPathSegment(name, "Study file name");
|
|
110
107
|
relativePath = path.join(entry.relativeDir, name);
|
|
111
108
|
}
|
|
112
109
|
catch {
|
|
113
|
-
warnings.push(`${entry.relativeDir}: unsafe
|
|
110
|
+
warnings.push(`${entry.relativeDir}: unsafe study file name; skipped.`);
|
|
114
111
|
continue;
|
|
115
112
|
}
|
|
113
|
+
const stem = stemSlot(stems, studyFileStem(name) ?? name);
|
|
114
|
+
stem[entry.family === "studies" ? "studies" : "legacy"] ??= relativeToCwd(resolvedCwd, path.join(resolvedCwd, relativePath));
|
|
116
115
|
const requestedPath = path.join(resolvedCwd, relativePath);
|
|
117
116
|
const read = await readManagedManifest(projectRoot, relativePath);
|
|
118
117
|
if (read.status !== "ok") {
|
|
@@ -131,8 +130,11 @@ export async function listLabManifests(cwd) {
|
|
|
131
130
|
warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${parsed.error.message}`);
|
|
132
131
|
continue;
|
|
133
132
|
}
|
|
133
|
+
if (legacyStudyWarning(parsed.path, parsed.config.schema) !== undefined)
|
|
134
|
+
legacyFiles += 1;
|
|
134
135
|
const key = `${parsed.config.id}:${entry.origin}:${relativeToCwd(resolvedCwd, requestedPath)}`;
|
|
135
|
-
|
|
136
|
+
stem.keys.push(key);
|
|
137
|
+
listed.set(key, {
|
|
136
138
|
id: parsed.config.id,
|
|
137
139
|
source: parsed.config.subject.source,
|
|
138
140
|
origin: entry.origin,
|
|
@@ -145,11 +147,24 @@ export async function listLabManifests(cwd) {
|
|
|
145
147
|
});
|
|
146
148
|
}
|
|
147
149
|
}
|
|
150
|
+
if (legacyFiles > 0) {
|
|
151
|
+
warnings.push(`${legacyFiles === 1 ? "One study file uses" : `${legacyFiles} study files use`} humanish.lab.v2 or a labs/ directory, which 0.109 stops reading. humanish migrate converts and moves the v2 files; humanish study show names the fix for each file.`);
|
|
152
|
+
}
|
|
153
|
+
for (const [name, stem] of stems) {
|
|
154
|
+
if (stem.studies === undefined || stem.legacy === undefined)
|
|
155
|
+
continue;
|
|
156
|
+
const error = `${name} names two files, ${stem.studies} and ${stem.legacy}; running it by name fails until you delete one (humanish migrate moves a kept labs/ file).`;
|
|
157
|
+
for (const key of stem.keys) {
|
|
158
|
+
const entry = listed.get(key);
|
|
159
|
+
if (entry)
|
|
160
|
+
entry.error = error;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
148
163
|
return {
|
|
149
|
-
schema:
|
|
164
|
+
schema: STUDY_LIST_SCHEMA,
|
|
150
165
|
ok: true,
|
|
151
166
|
cwd: resolvedCwd,
|
|
152
|
-
|
|
167
|
+
studies: [...listed.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
|
|
153
168
|
warnings,
|
|
154
169
|
};
|
|
155
170
|
}
|
|
@@ -157,10 +172,10 @@ export async function inspectLabManifest(cwd, lab) {
|
|
|
157
172
|
const resolved = await resolveLabManifest(cwd, lab);
|
|
158
173
|
if (!resolved.ok) {
|
|
159
174
|
return {
|
|
160
|
-
schema:
|
|
175
|
+
schema: STUDY_SHOW_SCHEMA,
|
|
161
176
|
ok: false,
|
|
162
177
|
cwd: resolved.cwd,
|
|
163
|
-
lab,
|
|
178
|
+
study: lab,
|
|
164
179
|
error: resolved.error,
|
|
165
180
|
warnings: resolved.warnings,
|
|
166
181
|
};
|
|
@@ -173,23 +188,23 @@ export async function inspectLabManifest(cwd, lab) {
|
|
|
173
188
|
if (!(error instanceof PersonaConfigError))
|
|
174
189
|
throw error;
|
|
175
190
|
return {
|
|
176
|
-
schema:
|
|
191
|
+
schema: STUDY_SHOW_SCHEMA,
|
|
177
192
|
ok: false,
|
|
178
193
|
cwd: path.resolve(cwd),
|
|
179
|
-
lab,
|
|
180
|
-
error: { code: "
|
|
194
|
+
study: lab,
|
|
195
|
+
error: { code: "HUMANISH_STUDY_INVALID", message: error.message },
|
|
181
196
|
warnings: resolved.warnings,
|
|
182
197
|
};
|
|
183
198
|
}
|
|
184
199
|
return {
|
|
185
|
-
schema:
|
|
200
|
+
schema: STUDY_SHOW_SCHEMA,
|
|
186
201
|
personas: labPersonaIds(resolved.config).map((id) => {
|
|
187
202
|
const persona = personaResolution.personas.get(id);
|
|
188
203
|
return { id, resolved: !!persona, ...(persona ? { brief: personaBrief(persona) } : {}) };
|
|
189
204
|
}),
|
|
190
205
|
ok: true,
|
|
191
206
|
cwd: path.resolve(cwd),
|
|
192
|
-
lab,
|
|
207
|
+
study: lab,
|
|
193
208
|
config: resolved.config,
|
|
194
209
|
origin: resolved.origin,
|
|
195
210
|
path: resolved.path,
|
|
@@ -202,13 +217,16 @@ function parseResolvedLab(args) {
|
|
|
202
217
|
raw = parse(args.contents);
|
|
203
218
|
}
|
|
204
219
|
catch (error) {
|
|
205
|
-
return invalidLab(args, error instanceof Error ? error.message : "
|
|
220
|
+
return invalidLab(args, error instanceof Error ? error.message : "The study file's YAML could not be parsed.");
|
|
206
221
|
}
|
|
207
222
|
const parsed = parseLabConfig(raw);
|
|
208
223
|
if (!parsed.ok) {
|
|
209
224
|
return invalidLab(args, parsed.error.message);
|
|
210
225
|
}
|
|
211
226
|
const warnings = [...args.warnings, ...parsed.warnings];
|
|
227
|
+
const legacy = legacyStudyWarning(relativeToCwd(args.cwd, args.path), parsed.config.schema);
|
|
228
|
+
if (legacy !== undefined)
|
|
229
|
+
warnings.push(legacy);
|
|
212
230
|
if (args.path.endsWith(".yml")) {
|
|
213
231
|
warnings.push("Prefer .yaml for humanish-authored lab source; .yml is accepted for compatibility only.");
|
|
214
232
|
}
|
|
@@ -220,6 +238,24 @@ function parseResolvedLab(args) {
|
|
|
220
238
|
warnings,
|
|
221
239
|
};
|
|
222
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* What 0.109 stops reading in this file: the humanish.lab.v2 format, a labs/ directory, or both, and
|
|
243
|
+
* what to run about it. Undefined for a v3 file outside the labs/ directories.
|
|
244
|
+
*/
|
|
245
|
+
function legacyStudyWarning(relativePath, schema) {
|
|
246
|
+
const retiredDirectory = STUDY_DIRECTORIES.find((directory) => directory.family === "labs" && path.dirname(relativePath) === directory.relativeDir);
|
|
247
|
+
// A file discovery parsed has one of two schemas, so not v3 is v2.
|
|
248
|
+
const v2 = schema !== STUDY_SCHEMA;
|
|
249
|
+
if (retiredDirectory !== undefined) {
|
|
250
|
+
const studies = retiredDirectory.relativeDir.replace(/labs$/, "studies");
|
|
251
|
+
return v2
|
|
252
|
+
? `${relativePath} is a humanish.lab.v2 file in ${retiredDirectory.relativeDir}/, and 0.109 reads neither. Run humanish migrate to convert it and move it to ${studies}/.`
|
|
253
|
+
: `${relativePath} is in ${retiredDirectory.relativeDir}/, which 0.109 stops reading. Move it to ${studies}/.`;
|
|
254
|
+
}
|
|
255
|
+
return v2
|
|
256
|
+
? `${relativePath} is a humanish.lab.v2 file, which 0.109 stops reading. Run humanish migrate ${relativePath} to convert it.`
|
|
257
|
+
: undefined;
|
|
258
|
+
}
|
|
223
259
|
async function bindProjectRoot(cwd) {
|
|
224
260
|
try {
|
|
225
261
|
const lexical = await lstat(cwd);
|
|
@@ -241,7 +277,7 @@ async function readManagedManifest(projectRoot, relativePath) {
|
|
|
241
277
|
if (!contents) {
|
|
242
278
|
return {
|
|
243
279
|
status: "unsafe",
|
|
244
|
-
message: "
|
|
280
|
+
message: "The study file changed or failed containment validation.",
|
|
245
281
|
};
|
|
246
282
|
}
|
|
247
283
|
return { status: "ok", contents: contents.toString("utf8") };
|
|
@@ -263,7 +299,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
|
|
|
263
299
|
if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1n) {
|
|
264
300
|
return {
|
|
265
301
|
status: "unsafe",
|
|
266
|
-
message: "
|
|
302
|
+
message: "The study file path must resolve to a single-link regular file.",
|
|
267
303
|
};
|
|
268
304
|
}
|
|
269
305
|
const handle = await open(physicalPath, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
@@ -275,7 +311,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
|
|
|
275
311
|
opened.ino !== before.ino) {
|
|
276
312
|
return {
|
|
277
313
|
status: "unsafe",
|
|
278
|
-
message: "
|
|
314
|
+
message: "The study file changed before it could be read safely.",
|
|
279
315
|
};
|
|
280
316
|
}
|
|
281
317
|
const contents = await handle.readFile();
|
|
@@ -292,7 +328,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
|
|
|
292
328
|
after.ino !== before.ino) {
|
|
293
329
|
return {
|
|
294
330
|
status: "unsafe",
|
|
295
|
-
message: "
|
|
331
|
+
message: "The study file changed while it was being read.",
|
|
296
332
|
};
|
|
297
333
|
}
|
|
298
334
|
return { status: "ok", contents: contents.toString("utf8") };
|
|
@@ -302,7 +338,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
|
|
|
302
338
|
}
|
|
303
339
|
}
|
|
304
340
|
catch {
|
|
305
|
-
return { status: "unsafe", message: "
|
|
341
|
+
return { status: "unsafe", message: "The study file path failed containment validation." };
|
|
306
342
|
}
|
|
307
343
|
}
|
|
308
344
|
async function bindManagedDirectory(projectRoot, relativePath) {
|
|
@@ -326,7 +362,7 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
|
|
|
326
362
|
const segments = relativePath.replace(/\\/g, "/").split("/");
|
|
327
363
|
let current = projectRoot.physicalPath;
|
|
328
364
|
for (const [index, segment] of segments.entries()) {
|
|
329
|
-
assertSafeOutputPathSegment(segment, "
|
|
365
|
+
assertSafeOutputPathSegment(segment, "Study file path segment");
|
|
330
366
|
current = path.join(current, segment);
|
|
331
367
|
let stats;
|
|
332
368
|
try {
|
|
@@ -340,18 +376,21 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
|
|
|
340
376
|
}
|
|
341
377
|
const leaf = index === segments.length - 1;
|
|
342
378
|
if (stats.isSymbolicLink()) {
|
|
343
|
-
return {
|
|
379
|
+
return {
|
|
380
|
+
status: "unsafe",
|
|
381
|
+
message: "Study directory paths must not contain symbolic links.",
|
|
382
|
+
};
|
|
344
383
|
}
|
|
345
384
|
if (!leaf && !stats.isDirectory()) {
|
|
346
|
-
return { status: "unsafe", message: "
|
|
385
|
+
return { status: "unsafe", message: "Study file path parents must be directories." };
|
|
347
386
|
}
|
|
348
387
|
if (leaf && expectedKind === "directory" && !stats.isDirectory()) {
|
|
349
|
-
return { status: "unsafe", message: "
|
|
388
|
+
return { status: "unsafe", message: "A study directory has an unsafe file type." };
|
|
350
389
|
}
|
|
351
390
|
if (leaf && expectedKind === "file" && (!stats.isFile() || stats.nlink !== 1n)) {
|
|
352
391
|
return {
|
|
353
392
|
status: "unsafe",
|
|
354
|
-
message: "
|
|
393
|
+
message: "A study file must be a single-link regular file.",
|
|
355
394
|
};
|
|
356
395
|
}
|
|
357
396
|
if (leaf) {
|
|
@@ -367,7 +406,7 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
|
|
|
367
406
|
}
|
|
368
407
|
}
|
|
369
408
|
catch {
|
|
370
|
-
return { status: "unsafe", message: "
|
|
409
|
+
return { status: "unsafe", message: "A study file path failed containment validation." };
|
|
371
410
|
}
|
|
372
411
|
return { status: "missing" };
|
|
373
412
|
}
|
|
@@ -386,22 +425,44 @@ function invalidLab(args, message) {
|
|
|
386
425
|
return {
|
|
387
426
|
ok: false,
|
|
388
427
|
cwd: args.cwd,
|
|
389
|
-
|
|
428
|
+
study: args.lab,
|
|
390
429
|
error: {
|
|
391
|
-
code: "
|
|
430
|
+
code: "HUMANISH_STUDY_INVALID",
|
|
392
431
|
message,
|
|
393
432
|
},
|
|
394
433
|
warnings: args.warnings,
|
|
395
434
|
};
|
|
396
435
|
}
|
|
436
|
+
function stemSlot(stems, name) {
|
|
437
|
+
let slot = stems.get(name);
|
|
438
|
+
if (slot === undefined) {
|
|
439
|
+
slot = { keys: [] };
|
|
440
|
+
stems.set(name, slot);
|
|
441
|
+
}
|
|
442
|
+
return slot;
|
|
443
|
+
}
|
|
444
|
+
/** The same stem under a studies/ and a labs/ directory: discovery reads neither. */
|
|
445
|
+
function ambiguousStudy(cwd, name, paths, warnings) {
|
|
446
|
+
const [studiesPath, labsPath] = paths.map((entry) => entry.replace(/\\/g, "/"));
|
|
447
|
+
return {
|
|
448
|
+
ok: false,
|
|
449
|
+
cwd,
|
|
450
|
+
study: name,
|
|
451
|
+
error: {
|
|
452
|
+
code: "HUMANISH_STUDY_AMBIGUOUS",
|
|
453
|
+
message: `${name} names two files, ${studiesPath} and ${labsPath}. Delete the one you do not want; if you keep ${labsPath}, run humanish migrate to move it. Or pass the path of the one to run.`,
|
|
454
|
+
},
|
|
455
|
+
warnings,
|
|
456
|
+
};
|
|
457
|
+
}
|
|
397
458
|
function labNotFound(cwd, lab, warnings) {
|
|
398
459
|
return {
|
|
399
460
|
ok: false,
|
|
400
461
|
cwd,
|
|
401
|
-
lab,
|
|
462
|
+
study: lab,
|
|
402
463
|
error: {
|
|
403
|
-
code: "
|
|
404
|
-
message: `
|
|
464
|
+
code: "HUMANISH_STUDY_NOT_FOUND",
|
|
465
|
+
message: `Study not found: ${lab}. Look in humanish/studies/ or humanish/labs/, or pass a .yaml path.`,
|
|
405
466
|
},
|
|
406
467
|
warnings,
|
|
407
468
|
};
|
|
@@ -417,6 +478,3 @@ function relativeToCwd(cwd, filePath) {
|
|
|
417
478
|
const relative = path.relative(cwd, filePath);
|
|
418
479
|
return relative && !relative.startsWith("..") ? relative : filePath;
|
|
419
480
|
}
|
|
420
|
-
function isNodeError(error) {
|
|
421
|
-
return error instanceof Error && "code" in error;
|
|
422
|
-
}
|
package/dist/lab/doctor.d.ts
CHANGED
|
@@ -1,21 +1,48 @@
|
|
|
1
1
|
import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
|
|
2
2
|
import type { LabConfig } from "./types.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { PlanResult } from "./plan-types.js";
|
|
4
4
|
import type { DetectedLocalAgent } from "../actors/local-agent/cli.js";
|
|
5
|
-
import type {
|
|
6
|
-
type
|
|
7
|
-
|
|
5
|
+
import type { ReasoningEffort } from "../actors/reasoning-effort.js";
|
|
6
|
+
import type { DoctorCheckDraft } from "../cli/doctor.js";
|
|
7
|
+
import { type CodexInstallation } from "../actors/codex/codex-admission.js";
|
|
8
|
+
import type { RefusedCodexExecutable } from "../actors/codex/restricted-executable.js";
|
|
9
|
+
type Check = DoctorCheckDraft;
|
|
10
|
+
/**
|
|
11
|
+
* Read-only Codex account readiness. An unadmitted CLI also reports the release it found, and an
|
|
12
|
+
* unavailable one the file humanish found and turned down.
|
|
13
|
+
*/
|
|
8
14
|
type CodexReadiness = {
|
|
9
15
|
ready: boolean;
|
|
10
16
|
errorCode: string | null;
|
|
11
17
|
detectedCliVersion?: string;
|
|
18
|
+
refusedExecutable?: RefusedCodexExecutable;
|
|
19
|
+
/** Where the `codex` on `PATH` was installed, for the command that replaces it. */
|
|
20
|
+
installation?: CodexInstallation;
|
|
21
|
+
/** How the release's app-server schema differs from the fields humanish reads. */
|
|
22
|
+
protocolIncompatibilities?: readonly string[];
|
|
23
|
+
/** Schema values beyond the baseline, recorded by a launch that passed. */
|
|
24
|
+
protocolAdditions?: readonly string[];
|
|
12
25
|
};
|
|
26
|
+
/** What doctor's hosted Codex participant check found: a readiness result and what it admitted. */
|
|
27
|
+
type HostedCodexReadiness = CodexReadiness & {
|
|
28
|
+
cliVersion?: string;
|
|
29
|
+
resolvedModel?: string;
|
|
30
|
+
authentication?: "chatgpt-account" | "api-key";
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* The hosted participant check: the operator-auth launch to an ephemeral thread, with no turn,
|
|
34
|
+
* using the lab's declared model and reasoning effort as a run would.
|
|
35
|
+
*/
|
|
36
|
+
declare function hostedCodexReadiness(env: NodeJS.ProcessEnv, actor: {
|
|
37
|
+
model?: string;
|
|
38
|
+
reasoningEffort?: ReasoningEffort;
|
|
39
|
+
}): Promise<HostedCodexReadiness>;
|
|
13
40
|
/** Shared read-only Codex account check for local participants in doctor and the TUI. */
|
|
14
41
|
export declare function localCodexParticipantCheck(args: {
|
|
15
42
|
env: NodeJS.ProcessEnv;
|
|
16
43
|
readiness?: (env: NodeJS.ProcessEnv) => Promise<CodexReadiness>;
|
|
17
44
|
}): Promise<Check>;
|
|
18
|
-
interface LabSetupCheckArgs {
|
|
45
|
+
export interface LabSetupCheckArgs {
|
|
19
46
|
cwd: string;
|
|
20
47
|
lab: string;
|
|
21
48
|
env: NodeJS.ProcessEnv;
|
|
@@ -24,16 +51,31 @@ interface LabSetupCheckArgs {
|
|
|
24
51
|
/** Internal read-only qualification seam; never a participant/model request. */
|
|
25
52
|
localRuntimeReadiness?: () => Promise<LocalRuntimeStatus>;
|
|
26
53
|
codexAnalysisReadiness?: (env: NodeJS.ProcessEnv) => Promise<CodexReadiness>;
|
|
54
|
+
/** The hosted Codex participant's operator handshake; tests replace it. */
|
|
55
|
+
codexParticipantReadiness?: typeof hostedCodexReadiness;
|
|
27
56
|
}
|
|
28
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* Setup checks only: no model turn, browser or desktop creation. CLI startup may use the network.
|
|
59
|
+
* `keys` are the keys a live run requires. `reads` are the provider keys the lab is known to read,
|
|
60
|
+
* required or not; it is undefined when that is unknown: the lab does not plan, or a declared
|
|
61
|
+
* scorer's host code may read any key.
|
|
62
|
+
*/
|
|
29
63
|
export declare function labSetupChecks(args: LabSetupCheckArgs): Promise<{
|
|
30
64
|
desktop: boolean;
|
|
31
65
|
keys: string[];
|
|
66
|
+
reads?: ReadonlySet<string>;
|
|
32
67
|
checks: Check[];
|
|
33
68
|
}>;
|
|
34
|
-
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
69
|
+
/**
|
|
70
|
+
* The ids of the project's labs that need each provider key for a live run, from the same plan
|
|
71
|
+
* `doctor --lab` reads. Each listed manifest resolves by its path, since a file name need not match
|
|
72
|
+
* the id inside. A lab that runs dry, that the plain CLI cannot run, or that does not plan needs
|
|
73
|
+
* none.
|
|
74
|
+
*/
|
|
75
|
+
export declare function studiesByRequiredKey(cwd: string, keyPresent: (name: string) => boolean): Promise<Map<string, string[]>>;
|
|
76
|
+
/**
|
|
77
|
+
* The lab planned with no run options, so its own scenario mode decides dry or live. Doctor and the
|
|
78
|
+
* TUI read a live run's keys and subject env from this plan's requirements.
|
|
79
|
+
*/
|
|
80
|
+
export declare function planCliRun(config: LabConfig, cwd: string): Promise<PlanResult>;
|
|
39
81
|
export {};
|