humanish 0.108.0 → 0.109.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +58 -59
- package/CHANGELOG.md +13 -0
- package/CONTEXT.md +44 -44
- package/README.md +3 -3
- package/TELEMETRY.md +2 -2
- package/dist/actors/codex/app-server-trace.js +2 -1
- package/dist/actors/codex/restricted-participant.js +12 -12
- package/dist/actors/codex/restricted-session.d.ts +2 -2
- package/dist/actors/computer-use/actor.d.ts +6 -6
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +2 -2
- package/dist/actors/computer-use/admission-limit.js +3 -3
- package/dist/actors/computer-use/executor-error.d.ts +2 -2
- package/dist/actors/computer-use/executor-error.js +3 -3
- package/dist/actors/computer-use/loop/actions.js +5 -5
- package/dist/actors/computer-use/loop/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +1 -1
- package/dist/actors/computer-use/loop/ending.js +12 -11
- package/dist/actors/computer-use/loop/observation.js +6 -5
- package/dist/actors/computer-use/loop/provider-call.js +11 -11
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +2 -2
- package/dist/actors/computer-use/loop/trace.js +3 -2
- package/dist/actors/computer-use/loop/types.d.ts +24 -24
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop.d.ts +6 -1
- package/dist/actors/computer-use/loop.js +26 -4
- package/dist/actors/computer-use/openai-provider.d.ts +2 -2
- package/dist/actors/computer-use/openai-provider.js +8 -8
- package/dist/actors/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +4 -4
- package/dist/actors/contract.js +1 -1
- package/dist/actors/local-agent/claude-session.js +3 -3
- package/dist/actors/local-agent/cli.d.ts +1 -1
- package/dist/actors/local-agent/cli.js +1 -1
- package/dist/actors/reasoning-effort.js +3 -3
- package/dist/actors/registry.d.ts +2 -2
- package/dist/actors/registry.js +3 -3
- package/dist/actors/scripted-browser/actor.d.ts +2 -2
- package/dist/actors/scripted-browser/actor.js +1 -1
- package/dist/analysis/automatic-completion.d.ts +7 -7
- package/dist/analysis/automatic-completion.js +1 -1
- package/dist/analysis/automatic-config.d.ts +6 -6
- package/dist/analysis/automatic-config.js +1 -1
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/types.d.ts +6 -0
- package/dist/browser-control/client.js +16 -16
- package/dist/browser-control/dispatcher.js +4 -4
- package/dist/browser-control/protocol.js +14 -14
- package/dist/browser-control/recording-transfer.js +4 -4
- package/dist/browser-control/transport.js +7 -7
- package/dist/cli/commands/analysis-signals.d.ts +2 -2
- package/dist/cli/commands/comms.js +14 -22
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +0 -15
- package/dist/cli/commands/run-command.d.ts +2 -2
- package/dist/cli/commands/run-command.js +3 -3
- package/dist/cli/commands/runs.js +3 -5
- package/dist/cli/commands/setup.js +5 -7
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +5 -5
- package/dist/cli/commands/{lab-route-computer-use.d.ts → study-route-computer-use.d.ts} +6 -6
- package/dist/cli/commands/{lab-route-computer-use.js → study-route-computer-use.js} +12 -12
- package/dist/cli/commands/{lab-route-open.d.ts → study-route-open.d.ts} +4 -4
- package/dist/cli/commands/{lab-route-open.js → study-route-open.js} +2 -2
- package/dist/cli/commands/{lab-route-preview.d.ts → study-route-preview.d.ts} +7 -7
- package/dist/cli/commands/{lab-route-preview.js → study-route-preview.js} +3 -3
- package/dist/cli/commands/study-route-run.d.ts +19 -0
- package/dist/cli/commands/{lab-route-run.js → study-route-run.js} +6 -6
- package/dist/cli/commands/study-route-scripted.d.ts +17 -0
- package/dist/cli/commands/{lab-route-scripted.js → study-route-scripted.js} +4 -4
- package/dist/cli/commands/{lab-route-shared-world.d.ts → study-route-shared-world.d.ts} +5 -5
- package/dist/cli/commands/{lab-route-shared-world.js → study-route-shared-world.js} +7 -7
- package/dist/cli/commands/study-route-terminal.d.ts +17 -0
- package/dist/cli/commands/{lab-route-terminal.js → study-route-terminal.js} +4 -4
- package/dist/cli/commands/study-run.d.ts +9 -0
- package/dist/cli/commands/{lab-run.js → study-run.js} +34 -34
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +5 -5
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +1 -1
- package/dist/cli/commands/study.js +13 -49
- package/dist/cli/commands/tui.js +12 -12
- package/dist/cli/commands/watch.js +30 -65
- package/dist/cli/deprecations.d.ts +1 -13
- package/dist/cli/deprecations.js +0 -30
- package/dist/cli/doctor.d.ts +3 -3
- package/dist/cli/doctor.js +16 -16
- package/dist/cli/first-run-path.d.ts +4 -4
- package/dist/cli/first-run-path.js +7 -7
- package/dist/cli/io.d.ts +3 -3
- package/dist/cli/io.js +2 -2
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +2 -2
- package/dist/cli/orientation.d.ts +4 -4
- package/dist/cli/orientation.js +58 -20
- package/dist/cli/program.js +3 -4
- package/dist/cli/telemetry.d.ts +1 -1
- package/dist/cli/telemetry.js +14 -20
- package/dist/comms/catch-host.d.ts +1 -1
- package/dist/comms/catch-host.js +3 -3
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +4 -3
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- package/dist/comms/sandbox-catch.d.ts +2 -2
- package/dist/comms/sandbox-catch.js +2 -2
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +29 -32
- package/dist/feedback/draft.js +2 -2
- package/dist/feedback/export.js +3 -2
- package/dist/feedback/proof.d.ts +1 -1
- package/dist/feedback/proof.js +2 -2
- package/dist/guest/bootstrap.js +6 -6
- package/dist/guest/browser-tools.js +8 -8
- package/dist/guest/chromium-text.js +17 -17
- package/dist/guest/desktop-executor.d.ts +2 -2
- package/dist/guest/desktop-executor.js +20 -20
- package/dist/guest/desktop-keys.js +4 -4
- package/dist/guest/desktop-media.d.ts +2 -2
- package/dist/guest/desktop-media.js +16 -16
- package/dist/guest/desktop-native.js +10 -10
- package/dist/guest/runtime-desktop.js +2 -2
- package/dist/guest/runtime-processes.d.ts +2 -2
- package/dist/guest/runtime-processes.js +2 -2
- package/dist/guest/runtime.js +5 -5
- package/dist/index.d.ts +13 -15
- package/dist/index.js +6 -8
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +1 -1
- package/dist/observer/data.d.ts +1 -1
- package/dist/observer/library.d.ts +2 -0
- package/dist/observer/library.js +4 -1
- package/dist/observer/render.js +7 -1
- package/dist/observer/run-routes.d.ts +1 -0
- package/dist/observer/run-routes.js +37 -12
- package/dist/observer/serve.d.ts +1 -1
- package/dist/observer-app.html +1 -1
- package/dist/routes/computer-use/bundle-parts.js +3 -2
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +7 -6
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +5 -5
- package/dist/routes/computer-use/e2b-desktop/comms.js +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/start.js +3 -4
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -3
- package/dist/routes/computer-use/external-comms.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +11 -10
- package/dist/routes/computer-use/fanout-records.js +2 -2
- package/dist/routes/computer-use/live-flush.d.ts +3 -3
- package/dist/routes/computer-use/live-phase.d.ts +2 -3
- package/dist/routes/computer-use/live-phase.js +3 -3
- package/dist/routes/computer-use/local-tree-pack.d.ts +5 -5
- package/dist/routes/computer-use/local-tree-pack.js +1 -1
- package/dist/routes/computer-use/local-vm.d.ts +8 -8
- package/dist/routes/computer-use/local-vm.js +2 -2
- package/dist/routes/computer-use/participant-desktop.d.ts +3 -3
- package/dist/routes/computer-use/participant-desktop.js +1 -1
- package/dist/routes/computer-use/participant-execution.js +1 -1
- package/dist/routes/computer-use/participant-model.js +3 -3
- package/dist/routes/computer-use/participant-prompt.d.ts +5 -5
- package/dist/routes/computer-use/participant-prompt.js +3 -3
- package/dist/routes/computer-use/participant-runs.d.ts +10 -10
- package/dist/routes/computer-use/participant-runs.js +14 -13
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +24 -24
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +5 -5
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +3 -2
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +13 -12
- package/dist/routes/computer-use/route.d.ts +12 -12
- package/dist/routes/computer-use/route.js +19 -19
- package/dist/routes/computer-use/self-report.js +1 -1
- package/dist/routes/computer-use/setup.d.ts +22 -22
- package/dist/routes/computer-use/setup.js +15 -15
- package/dist/routes/computer-use/single-bundle.d.ts +4 -4
- package/dist/routes/computer-use/single-bundle.js +14 -13
- package/dist/routes/computer-use/subject-projection.d.ts +3 -3
- package/dist/routes/computer-use/types.d.ts +34 -34
- package/dist/routes/computer-use/types.js +3 -3
- package/dist/routes/preview.d.ts +6 -6
- package/dist/routes/preview.js +5 -5
- package/dist/routes/scripted/bundle.d.ts +6 -6
- package/dist/routes/scripted/bundle.js +10 -9
- package/dist/routes/scripted/plan.d.ts +7 -7
- package/dist/routes/scripted/plan.js +6 -6
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +9 -9
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +11 -11
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +4 -4
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +3 -3
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +2 -2
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +17 -17
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +3 -3
- package/dist/routes/shared-world/bundle.js +15 -14
- package/dist/routes/shared-world/checkpoints.d.ts +3 -3
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +9 -9
- package/dist/routes/shared-world/comms.js +6 -5
- package/dist/routes/shared-world/participant-specs.d.ts +3 -3
- package/dist/routes/shared-world/participant-specs.js +7 -7
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +9 -9
- package/dist/routes/shared-world/provisioned.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +4 -4
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +11 -10
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +19 -19
- package/dist/routes/shared-world/setup.d.ts +13 -13
- package/dist/routes/shared-world/setup.js +19 -19
- package/dist/routes/shared-world/types.d.ts +27 -27
- package/dist/routes/terminal/adapter.d.ts +2 -2
- package/dist/routes/terminal/adapter.js +4 -4
- package/dist/routes/terminal/bundle.d.ts +11 -11
- package/dist/routes/terminal/bundle.js +12 -12
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +5 -5
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +9 -9
- package/dist/routes/terminal/ledger.d.ts +2 -2
- package/dist/routes/terminal/lifetime.d.ts +1 -1
- package/dist/routes/terminal/lifetime.js +1 -1
- package/dist/routes/terminal/live-finish.d.ts +2 -2
- package/dist/routes/terminal/live-finish.js +7 -7
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +3 -2
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +2 -2
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +5 -5
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +7 -7
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +14 -14
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +7 -7
- package/dist/routes/terminal/trace.d.ts +2 -2
- package/dist/routes/terminal/types.d.ts +24 -24
- package/dist/routes/terminal/types.js +2 -2
- package/dist/run/bundle.d.ts +7 -7
- package/dist/run/bundle.js +2 -2
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +72 -43
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +2 -2
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.js +2 -2
- package/dist/run/projection.d.ts +32 -32
- package/dist/run/projection.js +44 -44
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +1 -1
- package/dist/run/results.d.ts +2 -2
- package/dist/run/run-cost.d.ts +53 -0
- package/dist/run/run-cost.js +105 -0
- package/dist/run/run-index-analysis.d.ts +15 -0
- package/dist/run/run-index-analysis.js +77 -0
- package/dist/run/run-index.d.ts +11 -1
- package/dist/run/run-index.js +63 -49
- package/dist/run/run.d.ts +3 -3
- package/dist/run/run.js +2 -2
- package/dist/run/shared-world-evidence.d.ts +1 -1
- package/dist/run/shared-world-shape.js +1 -1
- package/dist/run/stats.d.ts +3 -3
- package/dist/run/stats.js +14 -14
- package/dist/run/status.d.ts +10 -2
- package/dist/run/status.js +6 -3
- package/dist/run/streams.d.ts +2 -2
- package/dist/run/study-provenance.d.ts +4 -2
- package/dist/run/study-provenance.js +7 -4
- package/dist/run/study-result.d.ts +0 -5
- package/dist/run/study-result.js +1 -1
- package/dist/run-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -45
- package/dist/{lab → study}/adapter-extension.d.ts +8 -20
- package/dist/{lab → study}/adapter-extension.js +2 -14
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +10 -10
- package/dist/{lab → study}/adapter-scorer-loader.js +3 -3
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +12 -12
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +37 -20
- package/dist/study/convert.d.ts +1 -1
- package/dist/study/convert.js +15 -15
- package/dist/{lab → study}/device-presets.d.ts +2 -2
- package/dist/{lab → study}/discover.d.ts +29 -23
- package/dist/{lab → study}/discover.js +97 -118
- package/dist/{lab → study}/doctor.d.ts +11 -11
- package/dist/{lab → study}/doctor.js +18 -18
- package/dist/study/files.d.ts +2 -2
- package/dist/study/files.js +6 -5
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/{lab → study}/init-templates.js +16 -11
- package/dist/{lab → study}/init.d.ts +1 -1
- package/dist/{lab → study}/init.js +7 -4
- package/dist/{lab → study}/keys.d.ts +2 -2
- package/dist/{lab → study}/keys.js +10 -10
- package/dist/study/migrate.d.ts +1 -1
- package/dist/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +5 -5
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/study-v3.d.ts +3 -5
- package/dist/{lab → study}/parse/study-v3.js +3 -3
- package/dist/{lab → study}/parse/subject-state.d.ts +8 -8
- package/dist/{lab → study}/parse/subject-state.js +4 -4
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +8 -8
- package/dist/{lab → study}/parse/values.d.ts +2 -2
- package/dist/{lab → study}/persona-resolve.d.ts +4 -4
- package/dist/{lab → study}/persona-resolve.js +2 -2
- package/dist/{lab → study}/plan-base.d.ts +7 -7
- package/dist/{lab → study}/plan-base.js +1 -1
- package/dist/{lab → study}/plan-participants.d.ts +10 -10
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +28 -28
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/{lab → study}/plan.js +20 -20
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +9 -8
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +3 -3
- package/dist/{lab → study}/preflight.d.ts +31 -31
- package/dist/{lab → study}/preflight.js +8 -8
- package/dist/{lab → study}/requirements.d.ts +3 -3
- package/dist/{lab → study}/requirements.js +1 -1
- package/dist/study/route-inputs.d.ts +28 -0
- package/dist/{lab → study}/route-inputs.js +1 -1
- package/dist/{lab → study}/routing.d.ts +12 -12
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -10
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -3
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +8 -17
- package/dist/study/run-study-homes.js +3 -0
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +13 -12
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +2 -2
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +10 -10
- package/dist/{lab → study}/summary.js +15 -15
- package/dist/{lab → study}/tasks.d.ts +3 -3
- package/dist/{lab → study}/tasks.js +1 -1
- package/dist/{lab → study}/types.d.ts +104 -104
- package/dist/{lab → study}/types.js +1 -1
- package/dist/{lab → study}/validation.d.ts +19 -19
- package/dist/{lab → study}/validation.js +13 -13
- package/dist/{lab → study}/warnings.d.ts +4 -4
- package/dist/{lab → study}/warnings.js +1 -1
- package/dist/subject/clone.d.ts +6 -6
- package/dist/subject/clone.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +3 -3
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/runtime.js +2 -2
- package/dist/subject/serve.d.ts +4 -4
- package/dist/subject/state.d.ts +3 -3
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +1 -1
- package/dist/subject/steps.js +1 -1
- package/dist/substrates/desktop-session.js +2 -2
- package/dist/substrates/detached.d.ts +1 -1
- package/dist/substrates/e2b/desktop-browser.d.ts +4 -4
- package/dist/substrates/e2b/desktop-browser.js +1 -1
- package/dist/substrates/e2b/desktop-cdp.d.ts +1 -1
- package/dist/substrates/e2b/desktop-cdp.js +1 -1
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +12 -12
- package/dist/substrates/e2b/desktop-geometry.d.ts +1 -1
- package/dist/substrates/e2b/desktop-geometry.js +1 -1
- package/dist/substrates/e2b/desktop-media.d.ts +3 -3
- package/dist/substrates/e2b/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +3 -3
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +1 -1
- package/dist/substrates/e2b/sdk.js +1 -1
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/contract.d.ts +8 -8
- package/dist/tui/contract.js +2 -2
- package/dist/tui/launch.d.ts +3 -3
- package/dist/tui/launch.js +22 -16
- package/dist/tui-app.js +139 -139
- package/dist/verify/subject.d.ts +1 -1
- package/dist/verify/subject.js +1 -1
- package/dist/verify/verify.js +2 -1
- package/docs/architecture/actor-contract.md +5 -5
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/external-public-shared-world.md +8 -7
- package/docs/architecture/github-feedback-loop.md +1 -1
- package/docs/architecture/task-protocol-support.md +1 -1
- package/docs/architecture/terminal-product-route.md +18 -18
- package/docs/contracts/adapter-fixtures.md +2 -2
- package/docs/contracts/errors.md +8 -8
- package/docs/contracts/run-bundle.md +1 -4
- package/docs/contracts/schemas.md +61 -42
- package/docs/contracts/study-analysis.md +4 -1
- package/docs/contracts/study-costs.md +17 -2
- package/examples/README.md +1 -1
- package/examples/scorer/scorer.mjs +3 -3
- package/package.json +1 -1
- package/skills/humanish/SKILL.md +8 -6
- package/skills/humanish/agents/openai.yaml +1 -1
- package/dist/cli/commands/lab-format.d.ts +0 -9
- package/dist/cli/commands/lab-route-run.d.ts +0 -19
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -17
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -17
- package/dist/cli/commands/lab-run.d.ts +0 -9
- package/dist/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/deprecated-fields.d.ts +0 -10
- package/dist/lab/deprecated-fields.js +0 -24
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/plan.d.ts +0 -13
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -8
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-homes.js +0 -7
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/library-aliases.d.ts +0 -56
- package/dist/library-aliases.js +0 -22
- package/dist/run-lab.d.ts +0 -112
- /package/dist/{lab → study}/device-presets.js +0 -0
- /package/dist/{lab → study}/init-paths.d.ts +0 -0
- /package/dist/{lab → study}/init-paths.js +0 -0
- /package/dist/{lab → study}/init-plan.d.ts +0 -0
- /package/dist/{lab → study}/init-plan.js +0 -0
- /package/dist/{lab → study}/parse/comms.js +0 -0
- /package/dist/{lab → study}/parse/execution.js +0 -0
- /package/dist/{lab → study}/parse/values.js +0 -0
- /package/dist/{lab → study}/participant-assignment.d.ts +0 -0
- /package/dist/{lab → study}/participant-assignment.js +0 -0
- /package/dist/{lab → study}/persona.d.ts +0 -0
- /package/dist/{lab → study}/persona.js +0 -0
- /package/dist/{lab → study}/routing.js +0 -0
|
@@ -1,73 +1,67 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { studyPersonaIds, resolveCommittedPersonasForCwd } from "./persona-resolve.js";
|
|
2
2
|
import { personaBrief, PersonaConfigError } from "./persona.js";
|
|
3
3
|
import { constants } from "node:fs";
|
|
4
4
|
import { lstat, open, readdir, realpath } from "node:fs/promises";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { parse } from "yaml";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { parseStudy } from "./config.js";
|
|
8
|
+
import { V2_SCHEMA } from "./types.js";
|
|
9
9
|
import { assertPreparedSelectedOutputDirectory, assertSafeOutputPathSegment, prepareSelectedOutputDirectory, readContainedRegularFile, } from "../run/contained-output.js";
|
|
10
10
|
import { isNodeError } from "../run/type-guards.js";
|
|
11
|
-
import { studyFileCandidates,
|
|
11
|
+
import { studyFileCandidates, STUDY_DIRECTORIES } from "./files.js";
|
|
12
12
|
const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
|
|
13
13
|
const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
|
|
14
|
-
export async function
|
|
14
|
+
export async function resolveStudyManifest(cwd, study) {
|
|
15
15
|
const resolvedCwd = path.resolve(cwd);
|
|
16
16
|
const warnings = [];
|
|
17
17
|
const projectRoot = await bindProjectRoot(resolvedCwd);
|
|
18
18
|
if (!projectRoot) {
|
|
19
|
-
return
|
|
19
|
+
return invalidStudy({ cwd: resolvedCwd, study, warnings }, "Project root failed containment validation.");
|
|
20
20
|
}
|
|
21
|
-
if (
|
|
22
|
-
const requestedPath = path.resolve(resolvedCwd,
|
|
21
|
+
if (studyLooksLikePath(study)) {
|
|
22
|
+
const requestedPath = path.resolve(resolvedCwd, study);
|
|
23
23
|
const read = await readExplicitManifest(projectRoot, requestedPath);
|
|
24
24
|
if (read.status === "missing") {
|
|
25
|
-
return
|
|
25
|
+
return studyNotFound(resolvedCwd, study, warnings);
|
|
26
26
|
}
|
|
27
27
|
if (read.status === "unsafe") {
|
|
28
|
-
return
|
|
28
|
+
return invalidStudy({ cwd: resolvedCwd, study, warnings }, read.message);
|
|
29
29
|
}
|
|
30
|
-
return
|
|
30
|
+
return parseResolvedStudy({
|
|
31
31
|
cwd: resolvedCwd,
|
|
32
|
-
|
|
32
|
+
study,
|
|
33
33
|
origin: "explicit",
|
|
34
34
|
path: requestedPath,
|
|
35
35
|
warnings,
|
|
36
36
|
contents: read.contents,
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
const
|
|
42
|
-
for (const candidate of candidates) {
|
|
39
|
+
// The studies/ directories are read in order. A name found only under a labs/ directory is
|
|
40
|
+
// refused with what to do about it, so the user is not told the study does not exist.
|
|
41
|
+
for (const candidate of studyFileCandidates(study)) {
|
|
43
42
|
const read = await readManagedManifest(projectRoot, candidate.relativePath);
|
|
44
43
|
if (read.status === "missing") {
|
|
45
44
|
continue;
|
|
46
45
|
}
|
|
47
46
|
if (read.status === "unsafe") {
|
|
48
|
-
return
|
|
47
|
+
return invalidStudy({ cwd: resolvedCwd, study, warnings }, read.message);
|
|
49
48
|
}
|
|
50
|
-
|
|
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
|
-
}
|
|
57
|
-
return parseResolvedLab({
|
|
49
|
+
return parseResolvedStudy({
|
|
58
50
|
cwd: resolvedCwd,
|
|
59
|
-
|
|
51
|
+
study,
|
|
60
52
|
origin: candidate.directory.origin,
|
|
61
53
|
path: path.join(resolvedCwd, candidate.relativePath),
|
|
62
54
|
warnings,
|
|
63
55
|
contents: read.contents,
|
|
56
|
+
retiredDirectory: candidate.directory.family === "labs",
|
|
64
57
|
});
|
|
65
58
|
}
|
|
66
|
-
return
|
|
59
|
+
return studyNotFound(resolvedCwd, study, warnings);
|
|
67
60
|
}
|
|
68
|
-
export async function
|
|
61
|
+
export async function listStudyManifests(cwd) {
|
|
69
62
|
const resolvedCwd = path.resolve(cwd);
|
|
70
63
|
const warnings = [];
|
|
64
|
+
const retired = [];
|
|
71
65
|
const listed = new Map();
|
|
72
66
|
const projectRoot = await bindProjectRoot(resolvedCwd);
|
|
73
67
|
if (!projectRoot) {
|
|
@@ -76,12 +70,10 @@ export async function listLabManifests(cwd) {
|
|
|
76
70
|
ok: true,
|
|
77
71
|
cwd: resolvedCwd,
|
|
78
72
|
studies: [],
|
|
73
|
+
retired: [],
|
|
79
74
|
warnings: ["Project root failed containment validation; study files were skipped."],
|
|
80
75
|
};
|
|
81
76
|
}
|
|
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
77
|
for (const entry of STUDY_DIRECTORIES) {
|
|
86
78
|
const directory = await bindManagedDirectory(projectRoot, entry.relativeDir);
|
|
87
79
|
if (directory.status === "missing") {
|
|
@@ -97,7 +89,7 @@ export async function listLabManifests(cwd) {
|
|
|
97
89
|
await assertManagedDirectoryBinding(projectRoot, entry.relativeDir, directory.binding);
|
|
98
90
|
}
|
|
99
91
|
catch {
|
|
100
|
-
warnings.push(`${entry.relativeDir}: unsafe managed
|
|
92
|
+
warnings.push(`${entry.relativeDir}: unsafe managed study directory; skipped.`);
|
|
101
93
|
continue;
|
|
102
94
|
}
|
|
103
95
|
for (const name of names.filter((value) => value.endsWith(".yaml") || value.endsWith(".yml"))) {
|
|
@@ -110,30 +102,35 @@ export async function listLabManifests(cwd) {
|
|
|
110
102
|
warnings.push(`${entry.relativeDir}: unsafe study file name; skipped.`);
|
|
111
103
|
continue;
|
|
112
104
|
}
|
|
113
|
-
const stem = stemSlot(stems, studyFileStem(name) ?? name);
|
|
114
|
-
stem[entry.family === "studies" ? "studies" : "legacy"] ??= relativeToCwd(resolvedCwd, path.join(resolvedCwd, relativePath));
|
|
115
105
|
const requestedPath = path.join(resolvedCwd, relativePath);
|
|
116
106
|
const read = await readManagedManifest(projectRoot, relativePath);
|
|
117
107
|
if (read.status !== "ok") {
|
|
118
|
-
warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${read.status === "unsafe" ? read.message : "
|
|
108
|
+
warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${read.status === "unsafe" ? read.message : "study file changed while it was listed; skipped."}`);
|
|
119
109
|
continue;
|
|
120
110
|
}
|
|
121
|
-
const parsed =
|
|
111
|
+
const parsed = parseResolvedStudy({
|
|
122
112
|
cwd: resolvedCwd,
|
|
123
|
-
|
|
113
|
+
study: name.replace(/\.(?:ya?ml)$/i, ""),
|
|
124
114
|
origin: entry.origin,
|
|
125
115
|
path: requestedPath,
|
|
126
116
|
warnings: [],
|
|
127
117
|
contents: read.contents,
|
|
118
|
+
retiredDirectory: entry.family === "labs",
|
|
128
119
|
});
|
|
129
120
|
if (!parsed.ok) {
|
|
130
|
-
|
|
121
|
+
const { code, message } = parsed.error;
|
|
122
|
+
if (code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
|
|
123
|
+
code === "HUMANISH_STUDY_RETIRED_DIRECTORY") {
|
|
124
|
+
// The message already starts with the file's path.
|
|
125
|
+
retired.push({ path: relativeToCwd(resolvedCwd, requestedPath), code, message });
|
|
126
|
+
warnings.push(message);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${message}`);
|
|
130
|
+
}
|
|
131
131
|
continue;
|
|
132
132
|
}
|
|
133
|
-
if (legacyStudyWarning(parsed.path, parsed.config.schema) !== undefined)
|
|
134
|
-
legacyFiles += 1;
|
|
135
133
|
const key = `${parsed.config.id}:${entry.origin}:${relativeToCwd(resolvedCwd, requestedPath)}`;
|
|
136
|
-
stem.keys.push(key);
|
|
137
134
|
listed.set(key, {
|
|
138
135
|
id: parsed.config.id,
|
|
139
136
|
source: parsed.config.subject.source,
|
|
@@ -147,42 +144,30 @@ export async function listLabManifests(cwd) {
|
|
|
147
144
|
});
|
|
148
145
|
}
|
|
149
146
|
}
|
|
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
|
-
}
|
|
163
147
|
return {
|
|
164
148
|
schema: STUDY_LIST_SCHEMA,
|
|
165
149
|
ok: true,
|
|
166
150
|
cwd: resolvedCwd,
|
|
167
151
|
studies: [...listed.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
|
|
152
|
+
retired,
|
|
168
153
|
warnings,
|
|
169
154
|
};
|
|
170
155
|
}
|
|
171
|
-
export async function
|
|
172
|
-
const resolved = await
|
|
156
|
+
export async function inspectStudyManifest(cwd, study) {
|
|
157
|
+
const resolved = await resolveStudyManifest(cwd, study);
|
|
173
158
|
if (!resolved.ok) {
|
|
174
159
|
return {
|
|
175
160
|
schema: STUDY_SHOW_SCHEMA,
|
|
176
161
|
ok: false,
|
|
177
162
|
cwd: resolved.cwd,
|
|
178
|
-
study
|
|
163
|
+
study,
|
|
179
164
|
error: resolved.error,
|
|
180
165
|
warnings: resolved.warnings,
|
|
181
166
|
};
|
|
182
167
|
}
|
|
183
168
|
let personaResolution;
|
|
184
169
|
try {
|
|
185
|
-
personaResolution = await resolveCommittedPersonasForCwd(cwd,
|
|
170
|
+
personaResolution = await resolveCommittedPersonasForCwd(cwd, studyPersonaIds(resolved.config));
|
|
186
171
|
}
|
|
187
172
|
catch (error) {
|
|
188
173
|
if (!(error instanceof PersonaConfigError))
|
|
@@ -191,44 +176,45 @@ export async function inspectLabManifest(cwd, lab) {
|
|
|
191
176
|
schema: STUDY_SHOW_SCHEMA,
|
|
192
177
|
ok: false,
|
|
193
178
|
cwd: path.resolve(cwd),
|
|
194
|
-
study
|
|
179
|
+
study,
|
|
195
180
|
error: { code: "HUMANISH_STUDY_INVALID", message: error.message },
|
|
196
181
|
warnings: resolved.warnings,
|
|
197
182
|
};
|
|
198
183
|
}
|
|
199
184
|
return {
|
|
200
185
|
schema: STUDY_SHOW_SCHEMA,
|
|
201
|
-
personas:
|
|
186
|
+
personas: studyPersonaIds(resolved.config).map((id) => {
|
|
202
187
|
const persona = personaResolution.personas.get(id);
|
|
203
188
|
return { id, resolved: !!persona, ...(persona ? { brief: personaBrief(persona) } : {}) };
|
|
204
189
|
}),
|
|
205
190
|
ok: true,
|
|
206
191
|
cwd: path.resolve(cwd),
|
|
207
|
-
study
|
|
192
|
+
study,
|
|
208
193
|
config: resolved.config,
|
|
209
194
|
origin: resolved.origin,
|
|
210
195
|
path: resolved.path,
|
|
211
196
|
warnings: [...resolved.warnings, ...personaResolution.warnings],
|
|
212
197
|
};
|
|
213
198
|
}
|
|
214
|
-
function
|
|
199
|
+
function parseResolvedStudy(args) {
|
|
215
200
|
let raw;
|
|
216
201
|
try {
|
|
217
202
|
raw = parse(args.contents);
|
|
218
203
|
}
|
|
219
204
|
catch (error) {
|
|
220
|
-
return
|
|
205
|
+
return invalidStudy(args, error instanceof Error ? error.message : "The study file's YAML could not be parsed.");
|
|
206
|
+
}
|
|
207
|
+
const refusal = retiredStudyRefusal(relativeToCwd(args.cwd, args.path).replace(/\\/g, "/"), raw, args.retiredDirectory === true);
|
|
208
|
+
if (refusal !== undefined) {
|
|
209
|
+
return { ok: false, cwd: args.cwd, study: args.study, error: refusal, warnings: args.warnings };
|
|
221
210
|
}
|
|
222
|
-
const parsed =
|
|
211
|
+
const parsed = parseStudy(raw);
|
|
223
212
|
if (!parsed.ok) {
|
|
224
|
-
return
|
|
213
|
+
return invalidStudy(args, parsed.error.message);
|
|
225
214
|
}
|
|
226
215
|
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);
|
|
230
216
|
if (args.path.endsWith(".yml")) {
|
|
231
|
-
warnings.push("Prefer .yaml for
|
|
217
|
+
warnings.push("Prefer .yaml for study files; .yml is accepted for compatibility only.");
|
|
232
218
|
}
|
|
233
219
|
return {
|
|
234
220
|
ok: true,
|
|
@@ -239,22 +225,37 @@ function parseResolvedLab(args) {
|
|
|
239
225
|
};
|
|
240
226
|
}
|
|
241
227
|
/**
|
|
242
|
-
*
|
|
243
|
-
*
|
|
228
|
+
* Why humanish refuses this file, or undefined. A humanish.lab.v2 file is refused wherever it is,
|
|
229
|
+
* and `humanish migrate` converts it (and moves it out of a labs/ directory). A v3 file is refused
|
|
230
|
+
* only when it was found by name in a labs/ directory; an explicit path to it still runs.
|
|
244
231
|
*/
|
|
245
|
-
function
|
|
246
|
-
const
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
232
|
+
function retiredStudyRefusal(relativePath, raw, retiredDirectory) {
|
|
233
|
+
const directory = path.posix.dirname(relativePath);
|
|
234
|
+
const studies = directory.replace(/labs$/, "studies");
|
|
235
|
+
// migrate moves a v2 file out of a labs/ directory however the file was named.
|
|
236
|
+
const inStudies = STUDY_DIRECTORIES.some((entry) => entry.family === "labs" && entry.relativeDir.replace(/\\/g, "/") === directory);
|
|
237
|
+
// migrate refuses a path outside its --cwd, so a file outside the project gets its own directory.
|
|
238
|
+
const migrate = path.isAbsolute(relativePath)
|
|
239
|
+
? `humanish migrate --cwd ${shellPath(path.dirname(relativePath))} ${shellPath(path.basename(relativePath))}`
|
|
240
|
+
: `humanish migrate ${shellPath(relativePath)}`;
|
|
241
|
+
if (typeof raw === "object" && raw !== null && raw.schema === V2_SCHEMA)
|
|
242
|
+
return {
|
|
243
|
+
code: "HUMANISH_STUDY_V2_UNSUPPORTED",
|
|
244
|
+
message: inStudies
|
|
245
|
+
? `${relativePath} is a humanish.lab.v2 file in ${directory}/, which humanish no longer reads. Run ${migrate} to convert it and move it to ${studies}/.`
|
|
246
|
+
: `${relativePath} is a humanish.lab.v2 file, which humanish no longer reads. Run ${migrate} to convert it.`,
|
|
247
|
+
};
|
|
248
|
+
if (retiredDirectory)
|
|
249
|
+
return {
|
|
250
|
+
code: "HUMANISH_STUDY_RETIRED_DIRECTORY",
|
|
251
|
+
message: `${relativePath} is in ${directory}/, which humanish no longer reads. Move it to ${studies}/.`,
|
|
252
|
+
};
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
/** A path as one shell argument: quoted when the shell would split or expand it, never an option. */
|
|
256
|
+
function shellPath(value) {
|
|
257
|
+
const arg = value.startsWith("-") ? `./${value}` : value;
|
|
258
|
+
return /^[\w@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, "'\\''")}'`;
|
|
258
259
|
}
|
|
259
260
|
async function bindProjectRoot(cwd) {
|
|
260
261
|
try {
|
|
@@ -418,14 +419,14 @@ async function assertManagedDirectoryBinding(projectRoot, relativePath, binding)
|
|
|
418
419
|
current.birthtimeNs !== binding.birthtimeNs ||
|
|
419
420
|
current.dev !== binding.dev ||
|
|
420
421
|
current.ino !== binding.ino) {
|
|
421
|
-
throw new Error("Managed
|
|
422
|
+
throw new Error("Managed study directory identity changed after it was bound.");
|
|
422
423
|
}
|
|
423
424
|
}
|
|
424
|
-
function
|
|
425
|
+
function invalidStudy(args, message) {
|
|
425
426
|
return {
|
|
426
427
|
ok: false,
|
|
427
428
|
cwd: args.cwd,
|
|
428
|
-
study: args.
|
|
429
|
+
study: args.study,
|
|
429
430
|
error: {
|
|
430
431
|
code: "HUMANISH_STUDY_INVALID",
|
|
431
432
|
message,
|
|
@@ -433,46 +434,24 @@ function invalidLab(args, message) {
|
|
|
433
434
|
warnings: args.warnings,
|
|
434
435
|
};
|
|
435
436
|
}
|
|
436
|
-
function
|
|
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
|
-
}
|
|
458
|
-
function labNotFound(cwd, lab, warnings) {
|
|
437
|
+
function studyNotFound(cwd, study, warnings) {
|
|
459
438
|
return {
|
|
460
439
|
ok: false,
|
|
461
440
|
cwd,
|
|
462
|
-
study
|
|
441
|
+
study,
|
|
463
442
|
error: {
|
|
464
443
|
code: "HUMANISH_STUDY_NOT_FOUND",
|
|
465
|
-
message: `Study not found: ${
|
|
444
|
+
message: `Study not found: ${study}. Look in humanish/studies/, or pass a .yaml path.`,
|
|
466
445
|
},
|
|
467
446
|
warnings,
|
|
468
447
|
};
|
|
469
448
|
}
|
|
470
|
-
function
|
|
471
|
-
return (
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
449
|
+
function studyLooksLikePath(study) {
|
|
450
|
+
return (study.endsWith(".yaml") ||
|
|
451
|
+
study.endsWith(".yml") ||
|
|
452
|
+
study.includes("/") ||
|
|
453
|
+
study.includes("\\") ||
|
|
454
|
+
study.startsWith("."));
|
|
476
455
|
}
|
|
477
456
|
function relativeToCwd(cwd, filePath) {
|
|
478
457
|
const relative = path.relative(cwd, filePath);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { StudyConfig } from "./types.js";
|
|
3
3
|
import type { PlanResult } from "./plan-types.js";
|
|
4
4
|
import type { DetectedLocalAgent } from "../actors/local-agent/cli.js";
|
|
5
5
|
import type { ReasoningEffort } from "../actors/reasoning-effort.js";
|
|
@@ -31,7 +31,7 @@ type HostedCodexReadiness = CodexReadiness & {
|
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
33
33
|
* The hosted participant check: the operator-auth launch to an ephemeral thread, with no turn,
|
|
34
|
-
* using the
|
|
34
|
+
* using the study's declared model and reasoning effort as a run would.
|
|
35
35
|
*/
|
|
36
36
|
declare function hostedCodexReadiness(env: NodeJS.ProcessEnv, actor: {
|
|
37
37
|
model?: string;
|
|
@@ -42,9 +42,9 @@ export declare function localCodexParticipantCheck(args: {
|
|
|
42
42
|
env: NodeJS.ProcessEnv;
|
|
43
43
|
readiness?: (env: NodeJS.ProcessEnv) => Promise<CodexReadiness>;
|
|
44
44
|
}): Promise<Check>;
|
|
45
|
-
export interface
|
|
45
|
+
export interface StudySetupCheckArgs {
|
|
46
46
|
cwd: string;
|
|
47
|
-
|
|
47
|
+
study: string;
|
|
48
48
|
env: NodeJS.ProcessEnv;
|
|
49
49
|
agents: DetectedLocalAgent[];
|
|
50
50
|
keyPresent: (name: string) => boolean;
|
|
@@ -56,11 +56,11 @@ export interface LabSetupCheckArgs {
|
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
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
|
|
60
|
-
* required or not; it is undefined when that is unknown: the
|
|
59
|
+
* `keys` are the keys a live run requires. `reads` are the provider keys the study is known to read,
|
|
60
|
+
* required or not; it is undefined when that is unknown: the study does not plan, or a declared
|
|
61
61
|
* scorer's host code may read any key.
|
|
62
62
|
*/
|
|
63
|
-
export declare function
|
|
63
|
+
export declare function studySetupChecks(args: StudySetupCheckArgs): Promise<{
|
|
64
64
|
desktop: boolean;
|
|
65
65
|
keys: string[];
|
|
66
66
|
reads?: ReadonlySet<string>;
|
|
@@ -68,14 +68,14 @@ export declare function labSetupChecks(args: LabSetupCheckArgs): Promise<{
|
|
|
68
68
|
}>;
|
|
69
69
|
/**
|
|
70
70
|
* The ids of the project's labs that need each provider key for a live run, from the same plan
|
|
71
|
-
* `doctor --
|
|
72
|
-
* the id inside. A
|
|
71
|
+
* `doctor --study` reads. Each listed manifest resolves by its path, since a file name need not match
|
|
72
|
+
* the id inside. A study that runs dry, that the plain CLI cannot run, or that does not plan needs
|
|
73
73
|
* none.
|
|
74
74
|
*/
|
|
75
75
|
export declare function studiesByRequiredKey(cwd: string, keyPresent: (name: string) => boolean): Promise<Map<string, string[]>>;
|
|
76
76
|
/**
|
|
77
|
-
* The
|
|
77
|
+
* The study planned with no run options, so its own scenario mode decides dry or live. Doctor and the
|
|
78
78
|
* TUI read a live run's keys and subject env from this plan's requirements.
|
|
79
79
|
*/
|
|
80
|
-
export declare function planCliRun(config:
|
|
80
|
+
export declare function planCliRun(config: StudyConfig, cwd: string): Promise<PlanResult>;
|
|
81
81
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { isLocalBrowserStudy } from "../substrates/local/runtime-config.js";
|
|
3
3
|
import { localRuntimeStatus } from "../substrates/local/runtime.js";
|
|
4
4
|
import { keyNamesOf, requiredKeys, requiredSubjectEnv } from "./requirements.js";
|
|
5
5
|
import { protocolAdditionsWarning, protocolIncompatibilityMessage, } from "../actors/codex/protocol-compat.js";
|
|
@@ -40,7 +40,7 @@ async function codexAccountReadiness(env) {
|
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
42
|
* The hosted participant check: the operator-auth launch to an ephemeral thread, with no turn,
|
|
43
|
-
* using the
|
|
43
|
+
* using the study's declared model and reasoning effort as a run would.
|
|
44
44
|
*/
|
|
45
45
|
async function hostedCodexReadiness(env, actor) {
|
|
46
46
|
const { checkRestrictedCodexParticipantReadiness } = await import("../actors/codex/restricted-participant.js");
|
|
@@ -116,38 +116,38 @@ export async function localCodexParticipantCheck(args) {
|
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
118
|
* The discovery and planning functions doctor's study checks use, loaded on first use as
|
|
119
|
-
*
|
|
119
|
+
* studySetupChecks always loaded them, so they stay out of this module's static imports.
|
|
120
120
|
*/
|
|
121
121
|
async function studyLoaders() {
|
|
122
122
|
const discover = await import("./discover.js");
|
|
123
123
|
const plan = await import("./plan.js");
|
|
124
124
|
return {
|
|
125
|
-
listStudies: discover.
|
|
126
|
-
resolveStudy: discover.
|
|
127
|
-
resolveDryRun: plan.
|
|
125
|
+
listStudies: discover.listStudyManifests,
|
|
126
|
+
resolveStudy: discover.resolveStudyManifest,
|
|
127
|
+
resolveDryRun: plan.resolveStudyDryRun,
|
|
128
128
|
routeOf: plan.routeOf,
|
|
129
129
|
};
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
132
132
|
* Setup checks only: no model turn, browser or desktop creation. CLI startup may use the network.
|
|
133
|
-
* `keys` are the keys a live run requires. `reads` are the provider keys the
|
|
134
|
-
* required or not; it is undefined when that is unknown: the
|
|
133
|
+
* `keys` are the keys a live run requires. `reads` are the provider keys the study is known to read,
|
|
134
|
+
* required or not; it is undefined when that is unknown: the study does not plan, or a declared
|
|
135
135
|
* scorer's host code may read any key.
|
|
136
136
|
*/
|
|
137
|
-
export async function
|
|
137
|
+
export async function studySetupChecks(args) {
|
|
138
138
|
const { resolveStudy, resolveDryRun, routeOf } = await studyLoaders();
|
|
139
|
-
const resolved = await resolveStudy(args.cwd, args.
|
|
139
|
+
const resolved = await resolveStudy(args.cwd, args.study);
|
|
140
140
|
if (!resolved.ok)
|
|
141
141
|
return {
|
|
142
142
|
desktop: false,
|
|
143
143
|
keys: [],
|
|
144
|
-
checks: [{ name: "
|
|
144
|
+
checks: [{ name: "study", ok: false, message: resolved.error.message }],
|
|
145
145
|
};
|
|
146
146
|
const config = resolved.config, route = routeOf(config);
|
|
147
147
|
const dryRun = resolveDryRun(config, undefined, true) === true;
|
|
148
148
|
const checks = [
|
|
149
149
|
{
|
|
150
|
-
name: "
|
|
150
|
+
name: "study route",
|
|
151
151
|
ok: true,
|
|
152
152
|
message: `${config.id}: ${config.actors[0]?.type ?? "synthetic"} / ${route} / ${dryRun ? "dry-run (no live participant)" : "live"}`,
|
|
153
153
|
},
|
|
@@ -172,7 +172,7 @@ export async function labSetupChecks(args) {
|
|
|
172
172
|
const keys = requiredKeys(requirements, args.keyPresent);
|
|
173
173
|
// This flag controls the hosted desktop SDK check as well as its API key.
|
|
174
174
|
const desktop = keys.includes("E2B_API_KEY");
|
|
175
|
-
const local =
|
|
175
|
+
const local = isLocalBrowserStudy(config);
|
|
176
176
|
// One account check, shared by the local participant row and the Codex analysis row.
|
|
177
177
|
let accountReadiness;
|
|
178
178
|
const checkAccount = () => (accountReadiness ??= (args.codexAnalysisReadiness ?? codexAccountReadiness)(args.env).catch(() => ({ ready: false, errorCode: "codex_unavailable" })));
|
|
@@ -342,8 +342,8 @@ function checkScope(analysis) {
|
|
|
342
342
|
}
|
|
343
343
|
/**
|
|
344
344
|
* The ids of the project's labs that need each provider key for a live run, from the same plan
|
|
345
|
-
* `doctor --
|
|
346
|
-
* the id inside. A
|
|
345
|
+
* `doctor --study` reads. Each listed manifest resolves by its path, since a file name need not match
|
|
346
|
+
* the id inside. A study that runs dry, that the plain CLI cannot run, or that does not plan needs
|
|
347
347
|
* none.
|
|
348
348
|
*/
|
|
349
349
|
export async function studiesByRequiredKey(cwd, keyPresent) {
|
|
@@ -364,16 +364,16 @@ export async function studiesByRequiredKey(cwd, keyPresent) {
|
|
|
364
364
|
return new Map([...users].map(([key, ids]) => [key, [...ids]]));
|
|
365
365
|
}
|
|
366
366
|
/**
|
|
367
|
-
* The
|
|
367
|
+
* The study planned with no run options, so its own scenario mode decides dry or live. Doctor and the
|
|
368
368
|
* TUI read a live run's keys and subject env from this plan's requirements.
|
|
369
369
|
*/
|
|
370
370
|
export async function planCliRun(config, cwd) {
|
|
371
|
-
return (await import("./plan.js")).
|
|
371
|
+
return (await import("./plan.js")).planStudy(config, { cwd });
|
|
372
372
|
}
|
|
373
373
|
function unsupportedCliRoute(config, route) {
|
|
374
374
|
if (config.subject.source === "local-app")
|
|
375
375
|
return "local-app needs a caller-supplied executor and provider through the library API; the plain CLI cannot run it.";
|
|
376
376
|
if (route === "preview")
|
|
377
|
-
return "This route only creates synthetic evidence. Use first-run in dry-run mode or a supported live
|
|
377
|
+
return "This route only creates synthetic evidence. Use first-run in dry-run mode or a supported live study.";
|
|
378
378
|
return undefined;
|
|
379
379
|
}
|
package/dist/study/files.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare function studyFileStem(name: string): string | undefined;
|
|
|
20
20
|
/**
|
|
21
21
|
* The files that already use `stem` in any of the six directories, other than `except`, which is
|
|
22
22
|
* the file the writer is about to replace. `exists` reads through the writer's own contained
|
|
23
|
-
* filesystem checks. A writer skips or refuses when the result is not empty, so no write
|
|
24
|
-
*
|
|
23
|
+
* filesystem checks. A writer skips or refuses when the result is not empty, so no write leaves
|
|
24
|
+
* two files for one study name.
|
|
25
25
|
*/
|
|
26
26
|
export declare function otherStudyFiles(stem: string, exists: (relativePath: string) => Promise<boolean>, except?: string): Promise<string[]>;
|
package/dist/study/files.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
// Where study files live. Discovery reads the three studies/ directories
|
|
2
|
-
// directories they replace
|
|
3
|
-
// checks a name against all six
|
|
1
|
+
// Where study files live. Discovery reads the three studies/ directories, and looks in the three
|
|
2
|
+
// labs/ directories they replace only to refuse a file there with its fix. migrate reads all six.
|
|
3
|
+
// Every writer checks a name against all six before it writes, so a new file never shadows another
|
|
4
|
+
// study or takes the name migrate needs to move a labs/ file.
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
/** The six directories, in resolution order. */
|
|
6
7
|
export const STUDY_DIRECTORIES = [
|
|
@@ -28,8 +29,8 @@ export function studyFileStem(name) {
|
|
|
28
29
|
/**
|
|
29
30
|
* The files that already use `stem` in any of the six directories, other than `except`, which is
|
|
30
31
|
* the file the writer is about to replace. `exists` reads through the writer's own contained
|
|
31
|
-
* filesystem checks. A writer skips or refuses when the result is not empty, so no write
|
|
32
|
-
*
|
|
32
|
+
* filesystem checks. A writer skips or refuses when the result is not empty, so no write leaves
|
|
33
|
+
* two files for one study name.
|
|
33
34
|
*/
|
|
34
35
|
export async function otherStudyFiles(stem, exists, except) {
|
|
35
36
|
const found = [];
|
|
@@ -18,9 +18,9 @@ export declare const starterFiles: StarterFile[];
|
|
|
18
18
|
export declare const runtimeDirectories: RuntimeDirectory[];
|
|
19
19
|
export declare const humanishScripts: Record<string, string>;
|
|
20
20
|
/**
|
|
21
|
-
* The starter files, with the live
|
|
21
|
+
* The starter files, with the live study written for the brain this machine can use.
|
|
22
22
|
*
|
|
23
|
-
* `local-agent` is not a variant of the
|
|
23
|
+
* `local-agent` is not a variant of the study so much as a different participant: on a machine with
|
|
24
24
|
* a signed-in Codex and no provider key, the study runs with the operator's own agent and needs
|
|
25
25
|
* only E2B. Writing the other one there would hand someone homework instead of a first run.
|
|
26
26
|
*/
|