humanish 0.107.0 → 0.108.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- package/SECURITY.md +16 -26
- package/TELEMETRY.md +8 -6
- package/dist/actors/affordance.d.ts +4 -4
- package/dist/actors/affordance.js +12 -12
- package/dist/actors/agent-session.d.ts +2 -2
- package/dist/actors/agent-session.js +7 -7
- package/dist/actors/codex/app-server-actor-trace.d.ts +1 -1
- package/dist/actors/codex/app-server-actor-trace.js +1 -1
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/restricted-executable.d.ts +4 -4
- package/dist/actors/codex/restricted-executable.js +8 -8
- package/dist/actors/codex/restricted-launch.d.ts +2 -1
- package/dist/actors/codex/restricted-launch.js +1 -1
- package/dist/actors/codex/restricted-participant.js +8 -6
- package/dist/actors/codex/restricted-policy.d.ts +2 -2
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- package/dist/actors/computer-use/loop/backstop.d.ts +3 -3
- package/dist/actors/computer-use/loop/backstop.js +14 -12
- package/dist/actors/computer-use/loop/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +1 -1
- package/dist/actors/computer-use/loop/trace.js +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- package/dist/actors/computer-use/openai-requests.d.ts +36 -10
- package/dist/actors/computer-use/openai-requests.js +82 -15
- package/dist/actors/computer-use/openai-wire.d.ts +19 -7
- package/dist/actors/computer-use/openai-wire.js +36 -34
- package/dist/actors/contract.d.ts +78 -43
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- package/dist/actors/local-agent/cli.js +24 -28
- package/dist/actors/local-agent/readiness.d.ts +2 -2
- package/dist/actors/local-agent/readiness.js +4 -4
- package/dist/actors/reasoning-effort.js +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- package/dist/actors/scripted-browser/browser-command.js +1 -1
- package/dist/actors/scripted-browser/steps.js +1 -1
- package/dist/actors/scripted-browser/types.d.ts +1 -1
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +147 -108
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/runs.js +137 -138
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +41 -6
- package/dist/cli/io.js +97 -22
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- package/dist/cli/product-sentence.d.ts +6 -0
- package/dist/cli/product-sentence.js +6 -0
- package/dist/cli/program.d.ts +6 -1
- package/dist/cli/program.js +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +13 -12
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +7 -7
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/sandbox-catch-script.d.ts +6 -6
- package/dist/comms/sandbox-catch-script.js +6 -6
- package/dist/comms/sandbox-catch.d.ts +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- package/dist/comms/thread-evidence.d.ts +1 -1
- package/dist/comms/thread-evidence.js +6 -6
- package/dist/comms/types.d.ts +6 -6
- package/dist/comms/types.js +3 -3
- package/dist/evidence/frame-signature.d.ts +1 -1
- package/dist/evidence/frame-signature.js +4 -4
- package/dist/evidence/redaction.d.ts +3 -3
- package/dist/evidence/redaction.js +4 -4
- package/dist/feedback/draft.js +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +5 -4
- package/dist/observer/exposure.d.ts +1 -1
- package/dist/observer/exposure.js +11 -11
- package/dist/observer/http.js +1 -1
- package/dist/observer/library.d.ts +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +1 -1
- package/dist/observer/serve.js +7 -3
- package/dist/observer/tunnel.js +1 -1
- package/dist/observer-app.html +4 -4
- package/dist/routes/computer-use/bundle-parts.d.ts +9 -9
- package/dist/routes/computer-use/bundle-parts.js +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- package/dist/routes/shared-world/external-public.d.ts +4 -3
- package/dist/routes/shared-world/external-public.js +16 -12
- package/dist/routes/shared-world/handoff.d.ts +7 -6
- package/dist/routes/shared-world/handoff.js +65 -57
- package/dist/routes/shared-world/lobby-code.d.ts +2 -2
- package/dist/routes/shared-world/lobby-code.js +9 -9
- package/dist/routes/shared-world/participant-specs.d.ts +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- package/dist/routes/shared-world/provenance.d.ts +2 -2
- package/dist/routes/shared-world/provenance.js +2 -2
- package/dist/routes/shared-world/provisioned.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +7 -8
- package/dist/routes/terminal/trace.d.ts +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- package/dist/run/run-not-found.d.ts +5 -0
- package/dist/run/run-not-found.js +15 -0
- package/dist/run/run.d.ts +5 -4
- package/dist/run/run.js +1 -1
- package/dist/run/sandbox-receipts.d.ts +2 -2
- package/dist/run/sandbox-receipts.js +3 -3
- package/dist/run/shared-world-evidence.d.ts +36 -35
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +1 -1
- package/dist/run/shared-world-shape.js +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -0
- package/dist/run/study-result.js +9 -0
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/study/field-paths.d.ts +12 -0
- package/dist/study/field-paths.js +126 -0
- package/dist/study/files.d.ts +26 -0
- package/dist/study/files.js +43 -0
- package/dist/study/migrate.d.ts +48 -0
- package/dist/study/migrate.js +408 -0
- package/dist/study/owned-files.d.ts +38 -0
- package/dist/study/owned-files.js +182 -0
- package/dist/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/detached.d.ts +6 -6
- package/dist/substrates/detached.js +7 -7
- package/dist/substrates/e2b/cdp-probe.d.ts +9 -9
- package/dist/substrates/e2b/cdp-probe.js +14 -17
- package/dist/substrates/e2b/desktop-browser.d.ts +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +1 -1
- package/dist/substrates/e2b/desktop-screenshot-cleanup.d.ts +3 -3
- package/dist/substrates/e2b/desktop-screenshot-cleanup.js +3 -3
- package/dist/substrates/e2b/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +82 -82
- package/dist/verify/actor.d.ts +8 -8
- package/dist/verify/actor.js +36 -36
- package/dist/verify/artifacts.d.ts +2 -2
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +6 -6
- package/dist/verify/costs.js +8 -8
- package/dist/verify/shared-world-concurrent.d.ts +2 -2
- package/dist/verify/shared-world-concurrent.js +79 -76
- package/dist/verify/shared-world.d.ts +2 -2
- package/dist/verify/shared-world.js +16 -16
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +34 -34
- package/docs/architecture/restricted-codex-analysis.md +34 -28
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -58
- package/docs/architecture/task-protocol-support.md +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- package/docs/contracts/core.md +1 -3
- package/docs/contracts/errors.md +62 -0
- package/docs/contracts/feedback.md +8 -9
- package/docs/contracts/policy.md +7 -12
- package/docs/contracts/run-bundle.md +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- package/docs/contracts/study-costs.md +11 -7
- package/docs/decisions/0001-run-bundle-is-the-source-of-truth.md +1 -1
- package/docs/decisions/0002-observer-is-one-self-contained-file.md +2 -2
- package/docs/decisions/0003-contained-paths-and-cleanup-authority.md +3 -3
- package/docs/principles/actor-fidelity.md +4 -4
- package/docs/principles/engineering.md +3 -3
- package/docs/principles/invariants-and-defaults.md +38 -38
- package/docs/principles/self-driving-harness.md +1 -5
- package/docs/principles/three-roles.md +1 -1
- package/docs/product/automatic-analysis.md +7 -7
- package/examples/participant/README.md +5 -5
- package/examples/participant/run.mjs +11 -10
- package/examples/scorer/README.md +3 -3
- package/examples/scorer/run.mjs +11 -12
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +60 -58
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -199
- package/dist/cli/renamed-options.d.ts +0 -11
- package/dist/cli/renamed-options.js +0 -18
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/docs/architecture/comms-inbox.md +0 -122
- package/docs/architecture/desktop-recording.md +0 -80
- package/docs/architecture/local-browser-runtime.md +0 -178
- package/docs/architecture/observer-review.md +0 -144
- package/docs/architecture/participant-media.md +0 -90
- package/docs/architecture/project-layout.md +0 -62
- package/docs/architecture/real-email-receiving.md +0 -136
- package/docs/assets/humanish-drawdb-hero.png +0 -0
- package/docs/assets/humanish-observer-hero.png +0 -0
- package/docs/goals/current.md +0 -207
- package/docs/product/lobby-trivia-3player-external-public.md +0 -77
- package/docs/product/open-source-install-experience.md +0 -240
- package/docs/ramp/README.md +0 -295
- package/docs/release/open-source-readiness.md +0 -222
- package/docs/release/public-readiness-standard.md +0 -210
- package/docs/roadmap/world-class-open-source-v0.md +0 -311
|
@@ -7,14 +7,15 @@ import { checkCommsConnection, configureCommsLab } from "../../comms/setup.js";
|
|
|
7
7
|
import { inspectCommsRecovery, recoverCommsReceiving } from "../../comms/receiving-recovery.js";
|
|
8
8
|
import { resolveReceivingConnection } from "../../comms/receiving-runtime.js";
|
|
9
9
|
import { resolveLabManifest } from "../../lab/discover.js";
|
|
10
|
+
import { oldStudyOption, studyOptionValue } from "../deprecations.js";
|
|
10
11
|
import { runCommsCatchHost } from "../../comms/catch-host.js";
|
|
11
12
|
import { DEFAULT_SANDBOX_CATCH_PORT } from "../../comms/sandbox-catch.js";
|
|
12
|
-
import { applyEnvFileOption, JSON_OPTION_DESCRIPTION, writeResult } from "../io.js";
|
|
13
|
+
import { applyEnvFileOption, CWD_OPTION_DESCRIPTION, ENV_FILE_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, PORT_OPTION_DESCRIPTION, writeResult, messageOutput, } from "../io.js";
|
|
13
14
|
export function registerCommsCommands(parent, io) {
|
|
14
15
|
const comms = parent
|
|
15
16
|
.command("comms")
|
|
16
17
|
.description("Local email capture, real receiving connections, checks and cleanup recovery.")
|
|
17
|
-
.summary("
|
|
18
|
+
.summary("Catch the email an app sends, for email-gated flows.");
|
|
18
19
|
comms
|
|
19
20
|
.command("providers")
|
|
20
21
|
.description("List installed communication provider capabilities. No network requests.")
|
|
@@ -22,61 +23,70 @@ export function registerCommsCommands(parent, io) {
|
|
|
22
23
|
.action((_options, command) => handleCommsProviders(io, _options, command));
|
|
23
24
|
const connections = comms
|
|
24
25
|
.command("connections")
|
|
25
|
-
.description("Manage project-local non-secret connection profiles. A
|
|
26
|
+
.description("Manage project-local non-secret connection profiles. A study explicitly selects its receiving connection.");
|
|
26
27
|
connections
|
|
27
28
|
.command("list")
|
|
28
29
|
.description("Show saved connections and local credential status; does not authenticate with a provider.")
|
|
29
|
-
.option("--cwd <path>",
|
|
30
|
-
.option("--env-file <path>",
|
|
30
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
31
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
31
32
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
32
33
|
.action((options, command) => handleCommsList(io, options, command));
|
|
33
34
|
connections
|
|
34
35
|
.command("add")
|
|
35
36
|
.argument("[name]", "Project connection name.", "agentmail")
|
|
36
|
-
.description("Save an AgentMail connection profile. Does not write a key, alter a
|
|
37
|
-
.option("--cwd <path>",
|
|
37
|
+
.description("Save an AgentMail connection profile. Does not write a key, alter a study or contact the provider.")
|
|
38
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
38
39
|
.option("--provider <id>", "Installed provider id.", "agentmail")
|
|
39
|
-
.option("--api-key-env <name>", "
|
|
40
|
+
.option("--api-key-env <name>", "The name of an environment variable, never its value.", "AGENTMAIL_API_KEY")
|
|
40
41
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
41
42
|
.action((name, options, command) => handleCommsAdd(io, name, options, command));
|
|
42
43
|
comms
|
|
43
44
|
.command("check")
|
|
44
45
|
.description("Check connection and credential presence; --online authenticates without creating inboxes.")
|
|
45
|
-
.option("--cwd <path>",
|
|
46
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
46
47
|
.option("--connection <name>", "Saved connection name.", "agentmail")
|
|
47
|
-
.option("--
|
|
48
|
+
.option("--study <path>", "Check the connection this study selects.")
|
|
49
|
+
.addOption(oldStudyOption("path"))
|
|
48
50
|
.option("--online", "Make a read-only provider authentication request.")
|
|
49
|
-
.option("--env-file <path>",
|
|
51
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
50
52
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
51
53
|
.action((options, command) => handleCommsCheck(io, options, command));
|
|
52
54
|
comms
|
|
53
55
|
.command("configure")
|
|
54
|
-
.description("Preview or save a local receiving-enabled copy of a supported
|
|
55
|
-
|
|
56
|
-
.option("--
|
|
56
|
+
.description("Preview or save a local receiving-enabled copy of a supported study. No provider requests.")
|
|
57
|
+
// Required, but checked in the action, so --lab still works for one minor.
|
|
58
|
+
.option("--study <path>", "Source study path or name. Required.")
|
|
59
|
+
.addOption(oldStudyOption("path"))
|
|
60
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
57
61
|
.option("--connection <name>", "Saved connection name.", "agentmail")
|
|
58
|
-
.option("--apply", "Save the local copy;
|
|
62
|
+
.option("--apply", "Save the local copy; the source study stays unchanged.")
|
|
59
63
|
.option("--plan-token <digest>", "Require the source and destination to match a previous preview.")
|
|
60
64
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
65
|
+
.hook("preAction", (command) => {
|
|
66
|
+
const options = command.opts();
|
|
67
|
+
// The message commander gives a missing required option.
|
|
68
|
+
if (options.study === undefined && options.lab === undefined)
|
|
69
|
+
command.error("error: required option '--study <path>' not specified");
|
|
70
|
+
})
|
|
61
71
|
.action((options, command) => handleCommsConfigure(io, options, command));
|
|
62
72
|
comms
|
|
63
73
|
.command("recover")
|
|
64
74
|
.description("Inspect interrupted email leases; --apply deletes only privately recorded resources owned by this project and account.")
|
|
65
|
-
.option("--cwd <path>",
|
|
75
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
66
76
|
.option("--run <id>", "One run to inspect or recover.")
|
|
67
77
|
.option("--apply", "Recover the selected inactive run and verify mailbox deletion.")
|
|
68
|
-
.option("--env-file <path>",
|
|
78
|
+
.option("--env-file <path>", ENV_FILE_OPTION_DESCRIPTION)
|
|
69
79
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
70
80
|
.action((options, command) => handleCommsRecover(io, options, command));
|
|
71
81
|
comms
|
|
72
82
|
.command("catch")
|
|
73
|
-
.description("Run the email catch on this host so humanish can study an app it does not provision. Your app posts its email sends here; the persona opens /inbox; humanish drains GET /deliveries and writes digest-only evidence. Point your
|
|
74
|
-
.summary("Run the
|
|
75
|
-
.option("--port <port>",
|
|
83
|
+
.description("Run the email catch on this host so humanish can study an app it does not provision. Your app posts its email sends here; the persona opens /inbox; humanish drains GET /deliveries and writes digest-only evidence. Point your study's comms.email.external.catchBaseUrl at this server.")
|
|
84
|
+
.summary("Run the email catch on this host.")
|
|
85
|
+
.option("--port <port>", PORT_OPTION_DESCRIPTION, String(DEFAULT_SANDBOX_CATCH_PORT))
|
|
76
86
|
.option("--dir <path>", "Directory for the deliveries log and rendered inbox.", ".humanish/comms-catch")
|
|
77
87
|
.option("--token <value>", "Require this bearer token, at least 16 characters, on GET /deliveries (recommended when reachable off-host).")
|
|
78
88
|
.option("--smtp-port <port>", "Also capture SMTP mail on 127.0.0.1:<port>. Point your app's SMTP transport here.")
|
|
79
|
-
.option("--inbox-port <port>", "Also serve a
|
|
89
|
+
.option("--inbox-port <port>", "Also serve a read-only inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
|
|
80
90
|
.option("--recipient <address>", "Only render mail sent to this address (repeatable). Default: render whatever the app actually mailed.", (value, previous) => [...(previous ?? []), value])
|
|
81
91
|
.action((options) => handleCommsCatch(io, options));
|
|
82
92
|
}
|
|
@@ -102,25 +112,26 @@ async function handleCommsAdd(io, name, options, command) {
|
|
|
102
112
|
? await saveCommsConnection(resolve(options.cwd), name, options.apiKeyEnv)
|
|
103
113
|
: { ok: false, message: "Only AgentMail connection setup is currently available." }),
|
|
104
114
|
};
|
|
105
|
-
writeResult(command, io, result,
|
|
115
|
+
writeResult(command, io, result, messageOutput);
|
|
106
116
|
io.setExitCode(result.ok ? 0 : 2);
|
|
107
117
|
}
|
|
108
118
|
async function handleCommsCheck(io, options, command) {
|
|
109
119
|
if (!(await applyEnvFileOption({ command, cwd: options.cwd, envFile: options.envFile, io })))
|
|
110
120
|
return;
|
|
111
121
|
let connection = options.connection;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
122
|
+
const study = studyOptionValue(command, io, options);
|
|
123
|
+
if (study) {
|
|
124
|
+
const resolved = await resolveLabManifest(options.cwd, study);
|
|
125
|
+
if (!resolved.ok || resolved.config.comms?.email?.kind !== "real") {
|
|
115
126
|
const result = {
|
|
116
127
|
ok: false,
|
|
117
|
-
message: "This
|
|
128
|
+
message: "This study does not select a real email connection.",
|
|
118
129
|
};
|
|
119
|
-
writeResult(command, io, result,
|
|
130
|
+
writeResult(command, io, result, messageOutput);
|
|
120
131
|
io.setExitCode(2);
|
|
121
132
|
return;
|
|
122
133
|
}
|
|
123
|
-
connection =
|
|
134
|
+
connection = resolved.config.comms.email.connection;
|
|
124
135
|
}
|
|
125
136
|
const result = await checkCommsConnection({
|
|
126
137
|
cwd: resolve(options.cwd),
|
|
@@ -128,12 +139,22 @@ async function handleCommsCheck(io, options, command) {
|
|
|
128
139
|
env: process.env,
|
|
129
140
|
online: options.online === true,
|
|
130
141
|
});
|
|
131
|
-
writeResult(command, io, result,
|
|
142
|
+
writeResult(command, io, result, messageOutput);
|
|
132
143
|
io.setExitCode(result.ok ? 0 : 2);
|
|
133
144
|
}
|
|
134
145
|
async function handleCommsConfigure(io, options, command) {
|
|
135
|
-
const
|
|
136
|
-
|
|
146
|
+
const study = studyOptionValue(command, io, options);
|
|
147
|
+
// The preAction hook refuses a call without either option.
|
|
148
|
+
if (study === undefined)
|
|
149
|
+
return;
|
|
150
|
+
const result = await configureCommsLab({
|
|
151
|
+
cwd: resolve(options.cwd),
|
|
152
|
+
lab: study,
|
|
153
|
+
connection: options.connection,
|
|
154
|
+
...(options.apply === undefined ? {} : { apply: options.apply }),
|
|
155
|
+
...(options.planToken === undefined ? {} : { planToken: options.planToken }),
|
|
156
|
+
});
|
|
157
|
+
writeResult(command, io, result, messageOutput);
|
|
137
158
|
io.setExitCode(result.ok ? 0 : 2);
|
|
138
159
|
}
|
|
139
160
|
async function handleCommsRecover(io, options, command) {
|
|
@@ -165,7 +186,7 @@ async function handleCommsRecover(io, options, command) {
|
|
|
165
186
|
adapter,
|
|
166
187
|
})),
|
|
167
188
|
};
|
|
168
|
-
writeResult(command, io, result,
|
|
189
|
+
writeResult(command, io, result, messageOutput);
|
|
169
190
|
io.setExitCode(result.ok ? 0 : 2);
|
|
170
191
|
}
|
|
171
192
|
catch {
|
|
@@ -174,7 +195,7 @@ async function handleCommsRecover(io, options, command) {
|
|
|
174
195
|
ok: false,
|
|
175
196
|
message: "Recovery could not complete. Select one recorded run with --run, check its connection, and retry. No unrecorded resources are eligible.",
|
|
176
197
|
};
|
|
177
|
-
writeResult(command, io, result,
|
|
198
|
+
writeResult(command, io, result, messageOutput);
|
|
178
199
|
io.setExitCode(2);
|
|
179
200
|
}
|
|
180
201
|
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { draftFeedback, listFeedback, renderIssueMarkdown, renderIssueUrl, verifyFeedback, } from "../../feedback/feedback.js";
|
|
3
|
-
import { candidateOption, JSON_OPTION_DESCRIPTION, wantsJson, writeResult, } from "../io.js";
|
|
3
|
+
import { candidateOption, CWD_OPTION_DESCRIPTION, JSON_OPTION_DESCRIPTION, RUN_OPTION_DESCRIPTION, wantsJson, writeResult, humanError, writeHuman, } from "../io.js";
|
|
4
4
|
export function registerFeedbackCommands(parent, io) {
|
|
5
5
|
const feedback = parent
|
|
6
6
|
.command("feedback")
|
|
7
|
-
.description("
|
|
8
|
-
.summary("
|
|
7
|
+
.description("Draft public-safe feedback issues from a run. humanish never calls the GitHub API.")
|
|
8
|
+
.summary("Draft public-safe feedback issues from a run.");
|
|
9
9
|
feedback
|
|
10
10
|
.command("list")
|
|
11
11
|
.description("List recorded feedback candidates and any saved draft.")
|
|
12
|
-
.addHelpText("after", "\nWith no candidates, feedback draft and feedback issue
|
|
13
|
-
.option("--run <id>",
|
|
14
|
-
.option("--cwd <path>",
|
|
12
|
+
.addHelpText("after", "\nWith no candidates, feedback draft and feedback issue write a run-summary follow-up for a live run that verifies share_ready. A dry run gets no draft.\n")
|
|
13
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
14
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
15
15
|
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
16
16
|
.action((options, command) => handleFeedbackList(io, options, command));
|
|
17
17
|
feedback
|
|
18
18
|
.command("draft")
|
|
19
19
|
.description("Generate a public-safe feedback draft from verified evidence.")
|
|
20
|
-
.option("--run <id>",
|
|
21
|
-
.option("--cwd <path>",
|
|
20
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
21
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
22
22
|
.option("--analysis <id>", "Independent analysis version; use with --finding.")
|
|
23
23
|
.option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
|
|
24
24
|
.option("--candidate <id>", "Which finding to draft (ids from `feedback list`); default: the first.")
|
|
@@ -27,8 +27,8 @@ export function registerFeedbackCommands(parent, io) {
|
|
|
27
27
|
feedback
|
|
28
28
|
.command("verify")
|
|
29
29
|
.description("Verify the feedback draft for public issue eligibility.")
|
|
30
|
-
.option("--run <id>",
|
|
31
|
-
.option("--cwd <path>",
|
|
30
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
31
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
32
32
|
.option("--analysis <id>", "Independent analysis version; use with --finding.")
|
|
33
33
|
.option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
|
|
34
34
|
.option("--candidate <id>", "Which finding to verify (ids from `feedback list`); default: the first.")
|
|
@@ -37,8 +37,8 @@ export function registerFeedbackCommands(parent, io) {
|
|
|
37
37
|
feedback
|
|
38
38
|
.command("issue")
|
|
39
39
|
.description("Print Markdown for a public GitHub issue. Does not mutate GitHub.")
|
|
40
|
-
.option("--run <id>",
|
|
41
|
-
.option("--cwd <path>",
|
|
40
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
41
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
42
42
|
.requiredOption("--repo <owner/repo>", "Repository slug used in rendered filing instructions.")
|
|
43
43
|
.option("--format <format>", "Output format.", "markdown")
|
|
44
44
|
.option("--analysis <id>", "Independent analysis version; use with --finding.")
|
|
@@ -49,8 +49,8 @@ export function registerFeedbackCommands(parent, io) {
|
|
|
49
49
|
feedback
|
|
50
50
|
.command("issue-url")
|
|
51
51
|
.description("Print a prefilled public issue URL. Does not mutate GitHub.")
|
|
52
|
-
.option("--run <id>",
|
|
53
|
-
.option("--cwd <path>",
|
|
52
|
+
.option("--run <id>", RUN_OPTION_DESCRIPTION, "latest")
|
|
53
|
+
.option("--cwd <path>", CWD_OPTION_DESCRIPTION, ".")
|
|
54
54
|
.requiredOption("--repo <owner/repo>", "Repository slug used in the generated URL.")
|
|
55
55
|
.option("--analysis <id>", "Independent analysis version; use with --finding.")
|
|
56
56
|
.option("--finding <id>", "Finding within --analysis, separate from participant candidates.")
|
|
@@ -87,7 +87,7 @@ async function handleFeedbackIssue(io, options, command) {
|
|
|
87
87
|
io.writeOut(result.issueMarkdown);
|
|
88
88
|
}
|
|
89
89
|
else {
|
|
90
|
-
io
|
|
90
|
+
writeHuman(command, io, formatFeedbackHuman(result));
|
|
91
91
|
}
|
|
92
92
|
io.setExitCode(result.ok ? 0 : 2);
|
|
93
93
|
}
|
|
@@ -100,14 +100,13 @@ async function handleFeedbackIssueUrl(io, options, command) {
|
|
|
100
100
|
io.writeOut(`${result.issueUrl}\n`);
|
|
101
101
|
}
|
|
102
102
|
else {
|
|
103
|
-
io
|
|
103
|
+
writeHuman(command, io, formatFeedbackHuman(result));
|
|
104
104
|
}
|
|
105
105
|
io.setExitCode(result.ok ? 0 : 2);
|
|
106
106
|
}
|
|
107
107
|
function formatFeedbackHuman(result) {
|
|
108
|
-
if (!result.ok)
|
|
109
|
-
return
|
|
110
|
-
}
|
|
108
|
+
if (!result.ok)
|
|
109
|
+
return humanError(result.error);
|
|
111
110
|
const candidates = result.candidates ?? [];
|
|
112
111
|
const noCandidates = result.candidates !== undefined && candidates.length === 0;
|
|
113
112
|
return ([
|
|
@@ -123,11 +122,11 @@ function formatFeedbackHuman(result) {
|
|
|
123
122
|
...(noCandidates
|
|
124
123
|
? [
|
|
125
124
|
"candidates: none recorded",
|
|
126
|
-
"With no candidates, feedback draft and feedback issue
|
|
125
|
+
"With no candidates, feedback draft and feedback issue write a run-summary follow-up for a live run that verifies share_ready.",
|
|
127
126
|
...(result.draft ? [`summary: ${result.draft.summary}`] : []),
|
|
128
127
|
]
|
|
129
128
|
: []),
|
|
130
|
-
// Every finding the run produced, so the second and third are one flag away
|
|
129
|
+
// Every finding the run produced, so the second and third are one flag away.
|
|
131
130
|
...(candidates.length > 1 || (candidates.length === 1 && result.draft === undefined)
|
|
132
131
|
? [
|
|
133
132
|
`candidates (${candidates.length}; choose one with --candidate <id>):`,
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { HumanOutput } from "../io.js";
|
|
1
2
|
import type { CuaActorLabResult } from "../../routes/computer-use/types.js";
|
|
2
3
|
import type { ScriptedBrowserLabResult } from "../../routes/scripted/types.js";
|
|
3
4
|
import type { TerminalProductLabResult } from "../../routes/terminal/types.js";
|
|
4
5
|
import type { ConcurrentSharedWorldLabResult } from "../../routes/shared-world/types.js";
|
|
5
|
-
export declare function formatConcurrentSharedWorldLabHuman(result: ConcurrentSharedWorldLabResult):
|
|
6
|
-
export declare function formatTerminalLabHuman(result: TerminalProductLabResult):
|
|
7
|
-
export declare function formatScriptedLabHuman(result: ScriptedBrowserLabResult):
|
|
8
|
-
export declare function formatCuaLabHuman(result: CuaActorLabResult):
|
|
6
|
+
export declare function formatConcurrentSharedWorldLabHuman(result: ConcurrentSharedWorldLabResult): HumanOutput;
|
|
7
|
+
export declare function formatTerminalLabHuman(result: TerminalProductLabResult): HumanOutput;
|
|
8
|
+
export declare function formatScriptedLabHuman(result: ScriptedBrowserLabResult): HumanOutput;
|
|
9
|
+
export declare function formatCuaLabHuman(result: CuaActorLabResult): HumanOutput;
|
|
@@ -1,10 +1,28 @@
|
|
|
1
1
|
import { formatCuaDiagnostics, formatCuaStopCause } from "../../routes/computer-use/diagnostics.js";
|
|
2
|
+
/** A lab run's first lines: the command that ran, whether it was a dry run, how it ended, and its route. */
|
|
3
|
+
function runHeader(result, route) {
|
|
4
|
+
const kind = result.dryRun === true ? "dry run" : result.dryRun === false ? "live run" : "run";
|
|
5
|
+
return [
|
|
6
|
+
`humanish run ${result.studyId}: ${kind} ${result.ok ? "finished" : "failed"}`,
|
|
7
|
+
`route: ${route}`,
|
|
8
|
+
];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A run's human output: its lines on stdout and, when it failed with an error, that error on
|
|
12
|
+
* stderr through formatCliError.
|
|
13
|
+
*/
|
|
14
|
+
function withError(error, lines) {
|
|
15
|
+
const stdout = `${lines.join("\n")}\n`;
|
|
16
|
+
return error === undefined ? stdout : { stdout, error };
|
|
17
|
+
}
|
|
18
|
+
/** A participant's status in words: a dry run's placeholder status says that nothing ran live. */
|
|
19
|
+
function participantStatus(status) {
|
|
20
|
+
return status === "contract_proof_only" ? "dry run, nothing ran live" : status;
|
|
21
|
+
}
|
|
2
22
|
export function formatConcurrentSharedWorldLabHuman(result) {
|
|
3
|
-
return ([
|
|
4
|
-
|
|
5
|
-
...(result.error ? [`${result.error.code}: ${result.error.message}`] : []),
|
|
23
|
+
return withError(result.error, [
|
|
24
|
+
...runHeader(result, "shared-world"),
|
|
6
25
|
`run: ${result.runId}`,
|
|
7
|
-
`lab: ${result.labId}`,
|
|
8
26
|
`actor: ${result.actor}`,
|
|
9
27
|
`topology: ${result.topology}/${result.topologyMode} (${result.roleCount} persona${result.roleCount === 1 ? "" : "s"}, concurrency ${result.concurrency})`,
|
|
10
28
|
...(result.host ? [`host: ${result.host}`] : []),
|
|
@@ -16,7 +34,7 @@ export function formatConcurrentSharedWorldLabHuman(result) {
|
|
|
16
34
|
: [
|
|
17
35
|
`overlap: ${result.overlapProven ? "proven" : "not observed"} (this run only; no scale or adoption claim)`,
|
|
18
36
|
]),
|
|
19
|
-
...result.roles.map((participant) => `persona ${participant.id} (${participant.persona}): ${participant.status}${participant.session ? ` (${participant.session.completionReason})` : ""}
|
|
37
|
+
...result.roles.map((participant) => `persona ${participant.id} (${participant.persona}): ${participantStatus(participant.status)}${participant.session ? ` (${participant.session.completionReason})` : ""}${participant.ok ? "" : ", not ok"}`),
|
|
20
38
|
...(result.subjectSandbox
|
|
21
39
|
? [
|
|
22
40
|
`subject sandbox: ${result.subjectSandbox.sandboxId} killed=${result.subjectSandbox.killed ? "yes" : "no"}`,
|
|
@@ -27,14 +45,12 @@ export function formatConcurrentSharedWorldLabHuman(result) {
|
|
|
27
45
|
? []
|
|
28
46
|
: [`opened: ${result.observer.opened ? "yes" : "no"}`]),
|
|
29
47
|
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
30
|
-
]
|
|
48
|
+
]);
|
|
31
49
|
}
|
|
32
50
|
export function formatTerminalLabHuman(result) {
|
|
33
|
-
return ([
|
|
34
|
-
|
|
35
|
-
...(result.error ? [`${result.error.code}: ${result.error.message}`] : []),
|
|
51
|
+
return withError(result.error, [
|
|
52
|
+
...runHeader(result, "terminal"),
|
|
36
53
|
`run: ${result.runId}`,
|
|
37
|
-
`lab: ${result.labId}`,
|
|
38
54
|
`actor: ${result.actor}`,
|
|
39
55
|
`product: ${result.product}`,
|
|
40
56
|
...(result.observer?.observerPath ? [`observer: ${result.observer.observerPath}`] : []),
|
|
@@ -42,14 +58,12 @@ export function formatTerminalLabHuman(result) {
|
|
|
42
58
|
? []
|
|
43
59
|
: [`opened: ${result.observer.opened ? "yes" : "no"}`]),
|
|
44
60
|
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
45
|
-
]
|
|
61
|
+
]);
|
|
46
62
|
}
|
|
47
63
|
export function formatScriptedLabHuman(result) {
|
|
48
|
-
return ([
|
|
49
|
-
|
|
50
|
-
...(result.error ? [`${result.error.code}: ${result.error.message}`] : []),
|
|
64
|
+
return withError(result.error, [
|
|
65
|
+
...runHeader(result, "scripted"),
|
|
51
66
|
`run: ${result.runId}`,
|
|
52
|
-
`lab: ${result.labId}`,
|
|
53
67
|
`actor: ${result.actor}`,
|
|
54
68
|
`subject: ${result.appUrl}`,
|
|
55
69
|
...(result.scenario
|
|
@@ -63,14 +77,12 @@ export function formatScriptedLabHuman(result) {
|
|
|
63
77
|
? []
|
|
64
78
|
: [`opened: ${result.observer.opened ? "yes" : "no"}`]),
|
|
65
79
|
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
66
|
-
]
|
|
80
|
+
]);
|
|
67
81
|
}
|
|
68
82
|
export function formatCuaLabHuman(result) {
|
|
69
|
-
return ([
|
|
70
|
-
|
|
71
|
-
...(result.error ? [`${result.error.code}: ${result.error.message}`] : []),
|
|
83
|
+
return withError(result.error, [
|
|
84
|
+
...runHeader(result, "computer-use"),
|
|
72
85
|
`run: ${result.runId}`,
|
|
73
|
-
`lab: ${result.labId}`,
|
|
74
86
|
`actor: ${result.actor}`,
|
|
75
87
|
`subject: ${result.appUrl}`,
|
|
76
88
|
...(result.subject?.source === "clone"
|
|
@@ -83,11 +95,11 @@ export function formatCuaLabHuman(result) {
|
|
|
83
95
|
: []),
|
|
84
96
|
...(result.diagnostics ? [`diagnostic: ${formatCuaDiagnostics(result.diagnostics)}`] : []),
|
|
85
97
|
...((result.lanes?.length ?? 0) > 1
|
|
86
|
-
? result.lanes.map((participant) => `participant ${participant.id}: ${participant.status}${participant.session ? ` (${participant.session.completionReason})` : ""}${participant.diagnostics ? ` · ${formatCuaDiagnostics(participant.diagnostics)}` : ""}${participant.session ? ` · ${participant.session.reason}` : ""}`)
|
|
98
|
+
? result.lanes.map((participant) => `participant ${participant.id}: ${participantStatus(participant.status)}${participant.session ? ` (${participant.session.completionReason})` : ""}${participant.diagnostics ? ` · ${formatCuaDiagnostics(participant.diagnostics)}` : ""}${participant.session ? ` · ${participant.session.reason}` : ""}`)
|
|
87
99
|
: []),
|
|
88
100
|
...(result.session && (result.lanes?.length ?? 0) <= 1
|
|
89
101
|
? [
|
|
90
|
-
`session: ${result.session.status} (${result.session.completionReason})${result.session.stopCause ? ` · ${formatCuaStopCause(result.session.stopCause)}` : ""} · ${result.session.reason}`,
|
|
102
|
+
`session: ${participantStatus(result.session.status)} (${result.session.completionReason})${result.session.stopCause ? ` · ${formatCuaStopCause(result.session.stopCause)}` : ""} · ${result.session.reason}`,
|
|
91
103
|
`screenshots: ${result.session.screenshots}`,
|
|
92
104
|
]
|
|
93
105
|
: []),
|
|
@@ -101,5 +113,5 @@ export function formatCuaLabHuman(result) {
|
|
|
101
113
|
? []
|
|
102
114
|
: [`opened: ${result.observer.opened ? "yes" : "no"}`]),
|
|
103
115
|
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
104
|
-
]
|
|
116
|
+
]);
|
|
105
117
|
}
|
|
@@ -2,7 +2,6 @@ import { automaticAnalysisSucceeded } from "../../analysis/automatic-completion.
|
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import {} from "../../run-lab.js";
|
|
4
4
|
import { resolveLabDryRun } from "../../lab/plan.js";
|
|
5
|
-
import { CUA_ACTOR_LAB_SCHEMA } from "../../routes/computer-use/types.js";
|
|
6
5
|
import { serveObserver } from "../../observer/render.js";
|
|
7
6
|
import { startExposedObserver, validateExposure } from "../../observer/exposure.js";
|
|
8
7
|
import { ServeTunnelError } from "../../observer/tunnel.js";
|
|
@@ -12,6 +11,7 @@ import { parseLabCount, parseParticipantIds, parseObserverPort, wantsJson, write
|
|
|
12
11
|
import { exposureRequestFromOptions, followObserver, planObserver, showObserver, staticObserverOpen, withObserverServer, } from "../observer-follow.js";
|
|
13
12
|
import { formatCuaLabHuman } from "./lab-format.js";
|
|
14
13
|
import { resolveRouteShouldOpen } from "./lab-route-open.js";
|
|
14
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
15
15
|
/**
|
|
16
16
|
* The computer-use route's CLI setup: its settings, the watch and exposure plan, the runLab options
|
|
17
17
|
* with the live Observer hook, and how it presents the outcome or a run error. Undefined when
|
|
@@ -50,10 +50,9 @@ export function computerUseRouteRun(args) {
|
|
|
50
50
|
}
|
|
51
51
|
function refuseCua(args, dryRun, code, message) {
|
|
52
52
|
const result = {
|
|
53
|
-
|
|
53
|
+
...studyResultIdentity("computer-use", args.config.id),
|
|
54
54
|
ok: false,
|
|
55
55
|
cwd: args.options.cwd,
|
|
56
|
-
labId: args.config.id,
|
|
57
56
|
actor: args.config.actors[0]?.type ?? "",
|
|
58
57
|
appUrl: "",
|
|
59
58
|
dryRun,
|
|
@@ -97,7 +96,7 @@ function resolveCuaSettings(args) {
|
|
|
97
96
|
/** Validates exposure and plans the finished-run Observer, or returns undefined after refusing. */
|
|
98
97
|
function prepareCuaWatch(args, settings) {
|
|
99
98
|
// Validate exposure up front (fail-closed matrix), before any run/spend. A live CUA watch is the
|
|
100
|
-
// one surface that serves runtime E2B stream URLs, so it
|
|
99
|
+
// one surface that serves runtime E2B stream URLs, so it must sit behind edge auth.
|
|
101
100
|
const exposeValidation = validateExposure("watch", exposureRequestFromOptions(args.options), {
|
|
102
101
|
dryRun: settings.dryRun,
|
|
103
102
|
detach: args.options.detach === true,
|
|
@@ -141,7 +140,7 @@ function cuaRunOptions(args, settings, prepared, live) {
|
|
|
141
140
|
dryRun: settings.dryRun,
|
|
142
141
|
...(settings.wantsFollow
|
|
143
142
|
? {
|
|
144
|
-
// Fires
|
|
143
|
+
// Fires inside runLab, before the actor loop and before sandbox creation, so a
|
|
145
144
|
// tunnel-auth failure aborts before any spend and leaves no orphaned sandbox.
|
|
146
145
|
onObserverReady: (observer) => attachLiveObserver(args.io, settings, prepared.exposure, live, observer),
|
|
147
146
|
}
|
|
@@ -214,7 +213,7 @@ async function attachLiveObserver(io, settings, exposure, live, observer) {
|
|
|
214
213
|
async function reportCuaRun(args, prepared, result, live) {
|
|
215
214
|
const { server, observer: attachedObserver } = live;
|
|
216
215
|
const exposeRequested = prepared.exposure.exposed;
|
|
217
|
-
// Serving is
|
|
216
|
+
// Serving is not gated on result.ok: a timed_out, incomplete or failed run still comes up so the
|
|
218
217
|
// operator can inspect its evidence live (and, under --expose, from a phone).
|
|
219
218
|
let output = result;
|
|
220
219
|
if (server && attachedObserver) {
|
|
@@ -224,7 +223,7 @@ async function reportCuaRun(args, prepared, result, live) {
|
|
|
224
223
|
observer: withObserverServer(attachedResult, server),
|
|
225
224
|
warnings: [
|
|
226
225
|
...result.warnings,
|
|
227
|
-
"
|
|
226
|
+
"The live computer-use server polls observer-data.json with no-store caching.",
|
|
228
227
|
...(exposeRequested
|
|
229
228
|
? [
|
|
230
229
|
`Exposed live desktop stream URLs to an edge-authenticated remote viewer${live.tunnel ? ` via ${live.tunnel.url.replace(/\/$/, "")}` : ""}.`,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
2
3
|
import { formatRunHuman, parseLabCount, writeResult, } from "../io.js";
|
|
3
4
|
import { planObserver, showObserver, staticObserverOpen } from "../observer-follow.js";
|
|
4
5
|
/**
|
|
@@ -9,12 +10,12 @@ export function previewRouteRun(args) {
|
|
|
9
10
|
const participantCount = parseLabCount(args.options.count, args.config.actors[0]?.count ?? 4);
|
|
10
11
|
if (participantCount === null) {
|
|
11
12
|
const result = {
|
|
12
|
-
|
|
13
|
+
...studyResultIdentity("preview", args.config.id),
|
|
13
14
|
ok: false,
|
|
14
15
|
cwd: args.options.cwd,
|
|
15
16
|
warnings: [],
|
|
16
17
|
error: {
|
|
17
|
-
code: "
|
|
18
|
+
code: "HUMANISH_INVALID_PARTICIPANT_COUNT",
|
|
18
19
|
message: "--count must be a positive integer.",
|
|
19
20
|
},
|
|
20
21
|
};
|
|
@@ -23,7 +24,7 @@ export function previewRouteRun(args) {
|
|
|
23
24
|
return undefined;
|
|
24
25
|
}
|
|
25
26
|
// `run` renders the Observer too, so `run` and `watch` write the same bundle and the first
|
|
26
|
-
// `export` of a run bundle finds observer/index.html
|
|
27
|
+
// `export` of a run bundle finds observer/index.html. A render failure is a warning on the
|
|
27
28
|
// result, never a failed run. The preview renders through its finished run, so the page shown is
|
|
28
29
|
// the run just written, never a directory swapped in under its id.
|
|
29
30
|
const openOverride = args.options.open ?? args.config.defaults?.open;
|
|
@@ -9,6 +9,7 @@ import { followObserver, showObserver, staticObserverOpen, withObserverServer, }
|
|
|
9
9
|
import { formatConcurrentSharedWorldLabHuman } from "./lab-format.js";
|
|
10
10
|
import { resolveRouteShouldOpen, watchFinishedPlan } from "./lab-route-open.js";
|
|
11
11
|
import { rosterOf } from "../../lab/parse/actors.js";
|
|
12
|
+
import { studyResultIdentity } from "../../run/study-result.js";
|
|
12
13
|
/**
|
|
13
14
|
* The shared-world route's CLI setup: dry run, open and follow semantics, the live Observer server
|
|
14
15
|
* the run attaches, and how it presents the outcome. Undefined when setup has already written its
|
|
@@ -27,10 +28,9 @@ export function sharedWorldRouteRun(args) {
|
|
|
27
28
|
const port = parseObserverPort(args.options.port ?? "0");
|
|
28
29
|
const failConcurrent = (message, runId) => {
|
|
29
30
|
const result = {
|
|
30
|
-
|
|
31
|
+
...studyResultIdentity("shared-world", args.config.id),
|
|
31
32
|
ok: false,
|
|
32
33
|
cwd: args.options.cwd,
|
|
33
|
-
labId: args.config.id,
|
|
34
34
|
actor: args.config.actors[0]?.type ?? "",
|
|
35
35
|
topology: "shared-world",
|
|
36
36
|
topologyMode: "concurrent",
|
|
@@ -40,7 +40,7 @@ export function sharedWorldRouteRun(args) {
|
|
|
40
40
|
runId: runId ?? args.options.runId ?? "not-created",
|
|
41
41
|
roles: [],
|
|
42
42
|
warnings: [],
|
|
43
|
-
error: { code: "
|
|
43
|
+
error: { code: "HUMANISH_SHARED_WORLD_FAILED", message },
|
|
44
44
|
};
|
|
45
45
|
writeResult(args.command, args.io, result, formatConcurrentSharedWorldLabHuman);
|
|
46
46
|
args.io.setExitCode(2);
|
|
@@ -3,6 +3,7 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import { deriveRunFacts } from "../telemetry.js";
|
|
5
5
|
import { resolveLabManifest } from "../../lab/discover.js";
|
|
6
|
+
import { warnAndQueue } from "../deprecations.js";
|
|
6
7
|
import { planLab, resolveLabDryRun } from "../../lab/plan.js";
|
|
7
8
|
import { keyNamesOf } from "../../lab/requirements.js";
|
|
8
9
|
import { routeOf } from "../../lab/plan.js";
|
|
@@ -26,12 +27,12 @@ export async function runLabCommand(args) {
|
|
|
26
27
|
}
|
|
27
28
|
// Surface forward-declared-field + .yml warnings on run/watch too, not only on inspect.
|
|
28
29
|
// Otherwise a setting that does nothing is silently swallowed on the path users actually run.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// Each also goes into the JSON result's warnings[], so a --json caller sees it.
|
|
31
|
+
for (const warning of resolved.warnings)
|
|
32
|
+
warnAndQueue(args.command, args.io, warning);
|
|
32
33
|
const config = resolved.config;
|
|
33
|
-
// The run's identity
|
|
34
|
-
// local overlay, or an explicit path. Resolved once here
|
|
34
|
+
// The run's identity: which manifest, where it lives, and whether it is committed, a
|
|
35
|
+
// local overlay, or an explicit path. Resolved once here (the only place that knows all three)
|
|
35
36
|
// and carried into the run's status record and bundle so the filesystem can answer "which lab
|
|
36
37
|
// produced this run" without the old `persona.source = "lab:<id>"` string convention.
|
|
37
38
|
const lab = { id: config.id, path: resolved.path, origin: resolved.origin };
|
|
@@ -101,7 +102,7 @@ export async function runLabCommand(args) {
|
|
|
101
102
|
// From here a signal marks the run interrupted and reclaims its sandboxes (run-signals.ts).
|
|
102
103
|
const signals = beginRunSignalPhase(args.io);
|
|
103
104
|
try {
|
|
104
|
-
//
|
|
105
|
+
// Resolve + load a config-declared/CLI-flagged adopter scorer fail-closed, before any
|
|
105
106
|
// spend, and only for a plan that will run. A declared gate that cannot load (bad ref, not
|
|
106
107
|
// found, load failure, no hooks, unsupported route) aborts with exit 2 rather than green-passing.
|
|
107
108
|
await runRoute(config, run, async () => {
|
|
@@ -127,7 +128,7 @@ export async function runLabCommand(args) {
|
|
|
127
128
|
if (scorer) {
|
|
128
129
|
// Cross-repo guardrail: `humanish lab run` now import()s host JS named in the manifest.
|
|
129
130
|
// Surface it so the invoker (who may not be the manifest author) knows executable code ran.
|
|
130
|
-
args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is
|
|
131
|
+
args.io.writeErr(`warning: review scorer ${scorer.provenance.ref} (${scorer.provenance.source}) is code that humanish loaded and ran in this process. Review it as you would any code you run.\n`);
|
|
131
132
|
}
|
|
132
133
|
const analysisBudget = automaticAnalysisBudget(config.review?.analysis, route);
|
|
133
134
|
if (analysisBudget && resolveLabDryRun(config, args.options.dryRun, true) === false) {
|
|
@@ -190,8 +191,6 @@ function writeUnsupportedRerunFlagsResult(args, route) {
|
|
|
190
191
|
args.io.setExitCode(2);
|
|
191
192
|
}
|
|
192
193
|
function formatLabResolveFailureHuman(result) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
196
|
-
].join("\n") + "\n");
|
|
194
|
+
const warnings = result.warnings.map((warning) => `warning: ${warning}\n`).join("");
|
|
195
|
+
return { ...(warnings ? { stdout: warnings } : {}), error: result.error };
|
|
197
196
|
}
|
|
@@ -3,14 +3,14 @@ import type { LabRoute } from "../../lab/plan.js";
|
|
|
3
3
|
import type { RunScorerProvenance } from "../../run/bundle.js";
|
|
4
4
|
import type { LabConfig } from "../../lab/types.js";
|
|
5
5
|
import type { RunResult } from "../../run/results.js";
|
|
6
|
-
/** A
|
|
6
|
+
/** A config-declared scorer that resolved + loaded fail-closed, ready to thread into a backend. */
|
|
7
7
|
export interface LoadedAdapterScorer {
|
|
8
8
|
hooks: AdapterScorerModule;
|
|
9
9
|
provenance: RunScorerProvenance;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
12
|
* Resolve `review.scorer.ref` (or the `--scorer` override) to a loaded adopter scorer, fail-closed
|
|
13
|
-
* (typed error)
|
|
13
|
+
* (typed error) pre-spend. Precedence: CLI `--scorer` overrides the manifest; `source` records which
|
|
14
14
|
* won. No scorer declared → `{ ok: true }` with no scorer. A declared scorer on an unsupported
|
|
15
15
|
* backend, or a bad/unreadable/broken ref, → `{ ok: false }` so the caller aborts with exit 2.
|
|
16
16
|
*/
|