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,8 +1,8 @@
|
|
|
1
|
-
// Which subject, target and actor compositions a
|
|
1
|
+
// Which subject, target and actor compositions a study may declare. Each rule returns the refusal
|
|
2
2
|
// message for the first thing its composition gets wrong, or null. compositionReason runs them in
|
|
3
|
-
// the parser's order, and only
|
|
3
|
+
// the parser's order, and only parseStudy calls it. planStudy does not: each route planner checks
|
|
4
4
|
// a library caller's config itself, under its route's error codes. The planners call the shared
|
|
5
|
-
// checks in
|
|
5
|
+
// checks in study/validation.ts and desktopCliProductReason below. The other subject rules here have
|
|
6
6
|
// planner counterparts whose conditions and wording differ (clone serve and repo, local-tree
|
|
7
7
|
// target, in-process fan-out, loopback targets, scripted scenario.ref).
|
|
8
8
|
import { isLoopbackUrl } from "./parse/subject.js";
|
|
@@ -30,14 +30,14 @@ export function compositionReason(config) {
|
|
|
30
30
|
terminalValidationReason(config) ??
|
|
31
31
|
cloneActorValidationReason(config));
|
|
32
32
|
}
|
|
33
|
-
/** Why a this-repo
|
|
34
|
-
export const THIS_REPO_DRY_RUN_ONLY = "this-repo
|
|
33
|
+
/** Why a this-repo study cannot run live. The parser and the preview planner both refuse with it. */
|
|
34
|
+
export const THIS_REPO_DRY_RUN_ONLY = "this-repo studies are dry-run only; use a clone or app-url subject for a live run.";
|
|
35
35
|
// this-repo subjects run locally and dry-run only: there is no live execution target for the
|
|
36
36
|
// host repo (clone/app-url provide that). Reject the mis-configs rather than silently mishandle.
|
|
37
37
|
function thisRepoValidationReason(config) {
|
|
38
38
|
if (config.subject.source === "this-repo") {
|
|
39
39
|
if (config.execution?.target) {
|
|
40
|
-
return "`execution.target` applies only to clone/app-url/local-app subjects; this-repo
|
|
40
|
+
return "`execution.target` applies only to clone/app-url/local-app subjects; this-repo studies run locally.";
|
|
41
41
|
}
|
|
42
42
|
if (config.scenario?.mode === "live") {
|
|
43
43
|
return THIS_REPO_DRY_RUN_ONLY;
|
|
@@ -51,7 +51,7 @@ function thisRepoValidationReason(config) {
|
|
|
51
51
|
// desktop), and no public-target policy (it is always loopback; the loopback shape was already
|
|
52
52
|
// enforced in parseSubject). The actual "no inProcess executor supplied" case is inherently an
|
|
53
53
|
// engine-time decision (the parser cannot know whether a library caller will pass one), so
|
|
54
|
-
// it fails closed in
|
|
54
|
+
// it fails closed in runCuaActorStudy with HUMANISH_COMPUTER_USE_LOCAL_APP_NO_EXECUTOR.
|
|
55
55
|
function localAppValidationReason(config) {
|
|
56
56
|
if (config.subject.source === "local-app") {
|
|
57
57
|
const type = config.actors[0]?.type ?? "";
|
|
@@ -106,7 +106,7 @@ function appUrlValidationReason(config) {
|
|
|
106
106
|
return "app-url computer-use subjects require `execution.target: local` or `e2b-desktop`.";
|
|
107
107
|
}
|
|
108
108
|
if (!actorResolvesToComputerUse(type)) {
|
|
109
|
-
return `actors[0].type must be a registered computer-use actor for app-url × e2b-desktop
|
|
109
|
+
return `actors[0].type must be a registered computer-use actor for app-url × e2b-desktop studies (one of: ${registeredComputerUseActors().join(", ")}); for local scripted execution use a registered scripted-browser actor (${registeredScriptedBrowserActors().join(", ")}). Got "${type}".`;
|
|
110
110
|
}
|
|
111
111
|
// Multi-participant fan-out is consumed on this route (`per-lane-worlds`; the shared cua
|
|
112
112
|
// cross-validation below enforces `lanes`/`count` XOR rules, the 16 cap, and the
|
|
@@ -136,7 +136,7 @@ function scriptedBrowserValidationReason(config) {
|
|
|
136
136
|
return "A clone subject with a scripted-browser actor needs `subject.serve` (start and url): humanish starts the app in the sandbox before the browser steps run.";
|
|
137
137
|
}
|
|
138
138
|
if ((config.subject.repos?.length ?? 0) !== 1) {
|
|
139
|
-
return "clone scripted-browser
|
|
139
|
+
return "clone scripted-browser studies require exactly one repo in subject.repos.";
|
|
140
140
|
}
|
|
141
141
|
const repo = config.subject.repos?.[0] ?? "";
|
|
142
142
|
if (!REPO_SLUG_PATTERN.test(repo)) {
|
|
@@ -188,7 +188,7 @@ function cloneComputerUseValidationReason(config) {
|
|
|
188
188
|
return "A clone subject on the computer-use route needs `subject.serve` (start and url): humanish starts the app in the sandbox before the participant opens it.";
|
|
189
189
|
}
|
|
190
190
|
if ((config.subject.repos?.length ?? 0) !== 1) {
|
|
191
|
-
return "computer-use clone
|
|
191
|
+
return "computer-use clone studies serve one repo; declare exactly one repo in subject.repos.";
|
|
192
192
|
}
|
|
193
193
|
const repo = config.subject.repos?.[0] ?? "";
|
|
194
194
|
if (!REPO_SLUG_PATTERN.test(repo)) {
|
|
@@ -278,14 +278,14 @@ function terminalValidationReason(config) {
|
|
|
278
278
|
}
|
|
279
279
|
return null;
|
|
280
280
|
}
|
|
281
|
-
// A clone
|
|
281
|
+
// A clone study is served in-sandbox for a participant to drive, so only a computer-use or a
|
|
282
282
|
// scripted-browser actor can run it. Any other actor would parse and then fail at run start.
|
|
283
283
|
// Terminal actors were already refused above with their own message.
|
|
284
284
|
function cloneActorValidationReason(config) {
|
|
285
285
|
if (config.subject.source === "clone") {
|
|
286
286
|
const type = config.actors[0]?.type ?? "";
|
|
287
287
|
if (!actorResolvesToComputerUse(type) && !actorResolvesToScriptedBrowser(type)) {
|
|
288
|
-
return `clone subjects need a registered computer-use actor (one of: ${registeredComputerUseActors().join(", ")}) or scripted-browser actor (one of: ${registeredScriptedBrowserActors().join(", ")});
|
|
288
|
+
return `clone subjects need a registered computer-use actor (one of: ${registeredComputerUseActors().join(", ")}) or scripted-browser actor (one of: ${registeredScriptedBrowserActors().join(", ")}); humanish clones and serves the app for that participant to drive. Got "${type}".`;
|
|
289
289
|
}
|
|
290
290
|
}
|
|
291
291
|
return null;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type StudyParseResult } from "./types.js";
|
|
2
|
+
/** The message for a humanish.lab.v2 document, which the package and the CLI no longer run. */
|
|
3
|
+
export declare const V2_UNSUPPORTED_MESSAGE = "This is a humanish.lab.v2 study, which humanish no longer reads. Convert its file with humanish migrate <path>.";
|
|
4
|
+
/**
|
|
5
|
+
* The package's study parser (src/index.ts) and the one discovery uses: a humanish.study.v3
|
|
6
|
+
* document. It refuses a humanish.lab.v2 one with HUMANISH_STUDY_V2_UNSUPPORTED.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseStudy(raw: unknown): StudyParseResult;
|
|
9
|
+
/**
|
|
10
|
+
* Validate a parsed YAML object, humanish.study.v3 or humanish.lab.v2, into a StudyConfig. Pure:
|
|
11
|
+
* the caller owns file IO. Structural validation only. Fields the engine does not yet consume are
|
|
12
|
+
* accepted but reported in `warnings` so `study show` never silently swallows a setting that does
|
|
13
|
+
* nothing. migrate's conversion (convert.ts) calls it directly, since it reads v2 files.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseStudyDocument(raw: unknown): StudyParseResult;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// humanish.lab.v2: a
|
|
1
|
+
// The normalized config, in the humanish.lab.v2 spelling: a study composes code primitives, with no
|
|
2
|
+
// hardcoded study kind.
|
|
2
3
|
// A humanish.study.v3 file is rewritten into this spelling first (parse/study-v3.ts), and then must
|
|
3
4
|
// take the route it declares and set no field that route does not read.
|
|
4
5
|
//
|
|
@@ -24,7 +25,7 @@
|
|
|
24
25
|
// presets belong to the computer-use route; scripted surfaces are the driver's own desktop/mobile
|
|
25
26
|
// viewports where isMobile/DSF genuinely render via playwright emulation).
|
|
26
27
|
// On the other routes those fields remain forward-declared and are not yet consumed:
|
|
27
|
-
//
|
|
28
|
+
// parseStudy emits a warning listing any such field that is set, so `study show` shows
|
|
28
29
|
// the truth.
|
|
29
30
|
//
|
|
30
31
|
// NOTE on actors[0].count: it carries route-specific meanings. Preview route: simCount;
|
|
@@ -49,10 +50,10 @@
|
|
|
49
50
|
//
|
|
50
51
|
// There is deliberately no v1 compatibility: v1 had zero real users. Breaking schema changes
|
|
51
52
|
// bump the version.
|
|
52
|
-
import {
|
|
53
|
+
import { isLocalBrowserStudy, localBrowserDefaults, localBrowserUnsupportedReason, } from "../substrates/local/runtime-config.js";
|
|
53
54
|
import { isRecord } from "../run/type-guards.js";
|
|
54
55
|
import { compositionReason } from "./composition-rules.js";
|
|
55
|
-
import {
|
|
56
|
+
import { findUnknownV2Key } from "./keys.js";
|
|
56
57
|
import { parseActors, rosterOf } from "./parse/actors.js";
|
|
57
58
|
import { parseComms, recipientParticipantId } from "./parse/comms.js";
|
|
58
59
|
import { parseDefaults, parseExecution, parsePersonas, parsePolicies, parseReview, parseScenario, } from "./parse/execution.js";
|
|
@@ -61,22 +62,38 @@ import { parseSubject } from "./parse/subject.js";
|
|
|
61
62
|
import { invalid, optionalStr, str } from "./parse/values.js";
|
|
62
63
|
import { isComputerUseComposition, isSharedWorldComposition, routeOf } from "./routing.js";
|
|
63
64
|
import { declaredParticipantIds } from "./plan-participants.js";
|
|
64
|
-
import { ID_PATTERN,
|
|
65
|
+
import { ID_PATTERN, V2_SCHEMA, STUDY_SCHEMA, } from "./types.js";
|
|
65
66
|
import { automaticAnalysisRouteReason, desktopMediaValidationReason, outputTokenLimitValidationReason, receivingEmailValidationReason, scenarioCapsValidationReason, taskProtocolValidationReason, } from "./validation.js";
|
|
66
67
|
import { forwardDeclaredWarnings, inertFieldLabels } from "./warnings.js";
|
|
68
|
+
import { plural } from "../run/text.js";
|
|
69
|
+
/** The message for a humanish.lab.v2 document, which the package and the CLI no longer run. */
|
|
70
|
+
export const V2_UNSUPPORTED_MESSAGE = "This is a humanish.lab.v2 study, which humanish no longer reads. Convert its file with humanish migrate <path>.";
|
|
67
71
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* `warnings` so `lab inspect` never silently swallows a setting that does nothing.
|
|
72
|
+
* The package's study parser (src/index.ts) and the one discovery uses: a humanish.study.v3
|
|
73
|
+
* document. It refuses a humanish.lab.v2 one with HUMANISH_STUDY_V2_UNSUPPORTED.
|
|
71
74
|
*/
|
|
72
|
-
export function
|
|
75
|
+
export function parseStudy(raw) {
|
|
76
|
+
if (isRecord(raw) && raw.schema === V2_SCHEMA)
|
|
77
|
+
return {
|
|
78
|
+
ok: false,
|
|
79
|
+
error: { code: "HUMANISH_STUDY_V2_UNSUPPORTED", message: V2_UNSUPPORTED_MESSAGE },
|
|
80
|
+
};
|
|
81
|
+
return parseStudyDocument(raw);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Validate a parsed YAML object, humanish.study.v3 or humanish.lab.v2, into a StudyConfig. Pure:
|
|
85
|
+
* the caller owns file IO. Structural validation only. Fields the engine does not yet consume are
|
|
86
|
+
* accepted but reported in `warnings` so `study show` never silently swallows a setting that does
|
|
87
|
+
* nothing. migrate's conversion (convert.ts) calls it directly, since it reads v2 files.
|
|
88
|
+
*/
|
|
89
|
+
export function parseStudyDocument(raw) {
|
|
73
90
|
if (!isRecord(raw)) {
|
|
74
|
-
return invalid("
|
|
91
|
+
return invalid("A study file must be a YAML object.");
|
|
75
92
|
}
|
|
76
93
|
if (raw.schema === STUDY_SCHEMA)
|
|
77
|
-
return
|
|
78
|
-
if (raw.schema !==
|
|
79
|
-
return invalid(`
|
|
94
|
+
return parseV3(raw);
|
|
95
|
+
if (raw.schema !== V2_SCHEMA) {
|
|
96
|
+
return invalid(`The study schema must be ${STUDY_SCHEMA} or ${V2_SCHEMA}.`);
|
|
80
97
|
}
|
|
81
98
|
return parseV2(raw);
|
|
82
99
|
}
|
|
@@ -84,7 +101,7 @@ export function parseLabConfig(raw) {
|
|
|
84
101
|
* A v3 study parses through the v2 parser, then must take the route it declares and set no field
|
|
85
102
|
* that route does not read. A v2 file gets those fields as a warning instead.
|
|
86
103
|
*/
|
|
87
|
-
function
|
|
104
|
+
function parseV3(raw) {
|
|
88
105
|
const document = studyToV2(raw);
|
|
89
106
|
if (!document.ok)
|
|
90
107
|
return document;
|
|
@@ -108,12 +125,12 @@ function parseStudy(raw) {
|
|
|
108
125
|
};
|
|
109
126
|
}
|
|
110
127
|
function parseV2(raw) {
|
|
111
|
-
const unknownKey =
|
|
128
|
+
const unknownKey = findUnknownV2Key(raw);
|
|
112
129
|
if (unknownKey)
|
|
113
130
|
return invalid(unknownKey);
|
|
114
131
|
const id = str(raw.id);
|
|
115
132
|
if (!id || !ID_PATTERN.test(id)) {
|
|
116
|
-
return invalid("
|
|
133
|
+
return invalid("The study id must be a public-safe token starting with a letter or digit (/^[A-Za-z0-9][A-Za-z0-9_.-]*$/).");
|
|
117
134
|
}
|
|
118
135
|
const subjectResult = parseSubject(raw.subject);
|
|
119
136
|
if (!subjectResult.ok) {
|
|
@@ -128,7 +145,7 @@ function parseV2(raw) {
|
|
|
128
145
|
return executionResult;
|
|
129
146
|
}
|
|
130
147
|
const config = {
|
|
131
|
-
schema:
|
|
148
|
+
schema: V2_SCHEMA,
|
|
132
149
|
id,
|
|
133
150
|
...optionalStr("title", raw.title),
|
|
134
151
|
...optionalStr("description", raw.description),
|
|
@@ -174,7 +191,7 @@ function parseV2(raw) {
|
|
|
174
191
|
if (commsResult.value)
|
|
175
192
|
config.comms = commsResult.value;
|
|
176
193
|
if (config.comms?.email?.smtp && config.subject.topology === "shared-world") {
|
|
177
|
-
return invalid("SMTP capture is not yet
|
|
194
|
+
return invalid("SMTP capture is not supported yet for shared-world studies. Use the default per-lane-worlds topology for SMTP, or configure supported HTTP email capture for concurrent shared-world studies.");
|
|
178
195
|
}
|
|
179
196
|
const mediaReason = desktopMediaValidationReason(config);
|
|
180
197
|
if (mediaReason)
|
|
@@ -220,7 +237,7 @@ function parseV2(raw) {
|
|
|
220
237
|
else {
|
|
221
238
|
const unknown = email.recipients.filter((recipient) => !participantIds.includes(recipientParticipantId(recipient)));
|
|
222
239
|
if (unknown.length > 0) {
|
|
223
|
-
return invalid(`comms.email.recipients name participant
|
|
240
|
+
return invalid(`comms.email.recipients name ${plural(unknown.length, "participant")} that ${unknown.length === 1 ? "does" : "do"} not exist: ${unknown.map((r) => `"${recipientParticipantId(r)}"`).join(", ")}. This study's participant ids are: ${participantIds.join(", ")}. A recipient's \`lane\` must match one of them exactly: the inbox instruction is injected per participant, and a mismatch disables the email funnel for that participant.`);
|
|
224
241
|
}
|
|
225
242
|
if (!email.recipients.some((recipient) => recipient.address !== undefined)) {
|
|
226
243
|
return invalid("comms.email.recipients cover no participant with an address, so no actor would be told an inbox exists and no captured mail could match. Give at least one recipient an address, or omit `recipients` entirely (every participant then gets a deterministic address automatically).");
|
|
@@ -237,7 +254,7 @@ function parseV2(raw) {
|
|
|
237
254
|
if (analysisReason)
|
|
238
255
|
return invalid(analysisReason);
|
|
239
256
|
const normalized = localBrowserDefaults(config);
|
|
240
|
-
if (
|
|
257
|
+
if (isLocalBrowserStudy(normalized)) {
|
|
241
258
|
const reason = localBrowserUnsupportedReason(normalized);
|
|
242
259
|
if (reason)
|
|
243
260
|
return invalid(reason);
|
package/dist/study/convert.d.ts
CHANGED
package/dist/study/convert.js
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
// every key it moved and every key it dropped. It refuses a file whose v3 form would parse or plan
|
|
4
4
|
// differently from the v2 source with the dropped keys removed.
|
|
5
5
|
import { isAlias, isMap, isScalar, isSeq, LineCounter, Pair, parseDocument, Scalar, visit, YAMLMap, YAMLSeq, } from "yaml";
|
|
6
|
-
import {
|
|
7
|
-
import { focusOf } from "
|
|
8
|
-
import { posInt } from "
|
|
9
|
-
import {
|
|
10
|
-
import { routeOf } from "
|
|
11
|
-
import {
|
|
12
|
-
import { inertFieldPaths } from "
|
|
6
|
+
import { parseStudyDocument } from "./config.js";
|
|
7
|
+
import { focusOf } from "./parse/actors.js";
|
|
8
|
+
import { posInt } from "./parse/values.js";
|
|
9
|
+
import { planStudy } from "./plan.js";
|
|
10
|
+
import { routeOf } from "./routing.js";
|
|
11
|
+
import { V2_SCHEMA, STUDY_SCHEMA } from "./types.js";
|
|
12
|
+
import { inertFieldPaths } from "./warnings.js";
|
|
13
13
|
import { deleteNodeFieldPath, deletePlainFieldPath, pairIndex, readFieldPath, } from "./field-paths.js";
|
|
14
14
|
function isPlainRecord(value) {
|
|
15
15
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -34,9 +34,9 @@ export function convertStudyText(text, cwd) {
|
|
|
34
34
|
const raw = doc.toJS();
|
|
35
35
|
if (!isPlainRecord(raw) || !isMap(doc.contents))
|
|
36
36
|
return refuse("it is not a YAML mapping.");
|
|
37
|
-
if (raw.schema !==
|
|
38
|
-
return refuse(`its schema is not ${
|
|
39
|
-
const source =
|
|
37
|
+
if (raw.schema !== V2_SCHEMA)
|
|
38
|
+
return refuse(`its schema is not ${V2_SCHEMA}.`);
|
|
39
|
+
const source = parseStudyDocument(raw);
|
|
40
40
|
if (!source.ok)
|
|
41
41
|
return refuse(`it does not parse: ${source.error.message}`);
|
|
42
42
|
const route = routeOf(source.config);
|
|
@@ -410,20 +410,20 @@ function samePlans(raw, dropped, text, cwd) {
|
|
|
410
410
|
const projected = structuredClone(raw);
|
|
411
411
|
for (const path of dropped)
|
|
412
412
|
deletePlainFieldPath(projected, path);
|
|
413
|
-
const before =
|
|
413
|
+
const before = parseStudyDocument(projected);
|
|
414
414
|
if (!before.ok) {
|
|
415
415
|
return refuse(`it does not parse once the unread keys are dropped: ${before.error.message}`);
|
|
416
416
|
}
|
|
417
|
-
const after =
|
|
417
|
+
const after = parseStudyDocument(parseDocument(text).toJS());
|
|
418
418
|
if (!after.ok)
|
|
419
419
|
return refuse(`its v3 form does not parse: ${after.error.message}`);
|
|
420
|
-
if (JSON.stringify(plain({ ...after.config, schema:
|
|
420
|
+
if (JSON.stringify(plain({ ...after.config, schema: V2_SCHEMA })) !==
|
|
421
421
|
JSON.stringify(plain(before.config))) {
|
|
422
422
|
return refuse("its v3 form parses to a different study.");
|
|
423
423
|
}
|
|
424
424
|
for (const dryRun of [true, false]) {
|
|
425
|
-
const v2 = plain(
|
|
426
|
-
const v3 = plain(
|
|
425
|
+
const v2 = plain(planStudy(before.config, { cwd, dryRun }));
|
|
426
|
+
const v3 = plain(planStudy(after.config, { cwd, dryRun }));
|
|
427
427
|
if (JSON.stringify(v2) !== JSON.stringify(v3)) {
|
|
428
428
|
return refuse(`its v3 form plans a different ${dryRun ? "dry" : "live"} run.`);
|
|
429
429
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyConfig } from "./types.js";
|
|
2
2
|
export interface DevicePreset {
|
|
3
3
|
/** Requested device width; the hosted physical screen may be widened to its minimum. */
|
|
4
4
|
width: number;
|
|
@@ -88,7 +88,7 @@ export declare function floorRenderResolution(resolution: readonly [number, numb
|
|
|
88
88
|
* `resolution` is floored to MIN_DESKTOP_RENDER_WIDTH so the browser window fits its X screen (no clip);
|
|
89
89
|
* `preset` keeps the declared device identity (a mobile preset stays 414/isMobile for the prompt).
|
|
90
90
|
*/
|
|
91
|
-
export declare function resolveParticipantDevice(config:
|
|
91
|
+
export declare function resolveParticipantDevice(config: StudyConfig,
|
|
92
92
|
/** The device the participant's roster entry names, if any. */
|
|
93
93
|
device: string | undefined): {
|
|
94
94
|
name: string;
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import type { ActorPersonaRef } from "../actors/contract.js";
|
|
2
|
-
import { type
|
|
2
|
+
import { type StudyConfig } from "./types.js";
|
|
3
3
|
declare const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
|
|
4
4
|
declare const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
|
|
5
|
-
type
|
|
6
|
-
interface
|
|
7
|
-
config:
|
|
8
|
-
origin:
|
|
5
|
+
type StudyOrigin = "committed" | "ignored" | "explicit";
|
|
6
|
+
interface ResolvedStudyConfig {
|
|
7
|
+
config: StudyConfig;
|
|
8
|
+
origin: StudyOrigin;
|
|
9
9
|
path: string;
|
|
10
10
|
warnings: string[];
|
|
11
11
|
}
|
|
12
|
-
export interface
|
|
12
|
+
export interface StudyResolveFailure {
|
|
13
13
|
ok: false;
|
|
14
14
|
cwd: string;
|
|
15
15
|
/** The study the caller asked for, as given. */
|
|
16
16
|
study: string;
|
|
17
17
|
error: {
|
|
18
|
-
code: "HUMANISH_STUDY_NOT_FOUND" | "HUMANISH_STUDY_INVALID" | "
|
|
18
|
+
code: "HUMANISH_STUDY_NOT_FOUND" | "HUMANISH_STUDY_INVALID" | "HUMANISH_STUDY_V2_UNSUPPORTED" | "HUMANISH_STUDY_RETIRED_DIRECTORY";
|
|
19
19
|
message: string;
|
|
20
20
|
};
|
|
21
21
|
warnings: string[];
|
|
22
22
|
}
|
|
23
|
-
export type
|
|
23
|
+
export type StudyResolveResult = ({
|
|
24
24
|
ok: true;
|
|
25
|
-
} &
|
|
26
|
-
export interface
|
|
25
|
+
} & ResolvedStudyConfig) | StudyResolveFailure;
|
|
26
|
+
export interface StudyListEntry {
|
|
27
27
|
id: string;
|
|
28
|
-
source:
|
|
29
|
-
origin:
|
|
28
|
+
source: StudyConfig["subject"]["source"];
|
|
29
|
+
origin: StudyOrigin;
|
|
30
30
|
path: string;
|
|
31
31
|
title?: string;
|
|
32
32
|
/**
|
|
@@ -35,17 +35,23 @@ export interface LabListEntry {
|
|
|
35
35
|
* stakeholder feedback that added this was, verbatim, "so i know wtf they are".
|
|
36
36
|
*/
|
|
37
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;
|
|
40
38
|
}
|
|
41
|
-
|
|
39
|
+
/** A file in a study directory that humanish no longer reads, with what to do about it. */
|
|
40
|
+
interface RetiredStudyFile {
|
|
41
|
+
path: string;
|
|
42
|
+
code: "HUMANISH_STUDY_V2_UNSUPPORTED" | "HUMANISH_STUDY_RETIRED_DIRECTORY";
|
|
43
|
+
message: string;
|
|
44
|
+
}
|
|
45
|
+
export interface StudyListResult {
|
|
42
46
|
schema: typeof STUDY_LIST_SCHEMA;
|
|
43
47
|
ok: true;
|
|
44
48
|
cwd: string;
|
|
45
|
-
studies:
|
|
49
|
+
studies: StudyListEntry[];
|
|
50
|
+
/** Each also has its message in `warnings`. */
|
|
51
|
+
retired: RetiredStudyFile[];
|
|
46
52
|
warnings: string[];
|
|
47
53
|
}
|
|
48
|
-
export interface
|
|
54
|
+
export interface StudyInspectResult {
|
|
49
55
|
/** Persona context only, before route instructions and runtime grants. */
|
|
50
56
|
personas?: Array<{
|
|
51
57
|
id: string;
|
|
@@ -57,13 +63,13 @@ export interface LabInspectResult {
|
|
|
57
63
|
cwd: string;
|
|
58
64
|
/** The study the caller asked for, as given. */
|
|
59
65
|
study: string;
|
|
60
|
-
config?:
|
|
61
|
-
origin?:
|
|
66
|
+
config?: StudyConfig;
|
|
67
|
+
origin?: StudyOrigin;
|
|
62
68
|
path?: string;
|
|
63
|
-
error?:
|
|
69
|
+
error?: StudyResolveFailure["error"];
|
|
64
70
|
warnings: string[];
|
|
65
71
|
}
|
|
66
|
-
export declare function
|
|
67
|
-
export declare function
|
|
68
|
-
export declare function
|
|
72
|
+
export declare function resolveStudyManifest(cwd: string, study: string): Promise<StudyResolveResult>;
|
|
73
|
+
export declare function listStudyManifests(cwd: string): Promise<StudyListResult>;
|
|
74
|
+
export declare function inspectStudyManifest(cwd: string, study: string): Promise<StudyInspectResult>;
|
|
69
75
|
export {};
|