humanish 0.107.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 +73 -69
- package/CHANGELOG.md +27 -0
- package/CONTEXT.md +51 -44
- package/README.md +148 -175
- 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-trace.js +2 -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 +20 -18
- 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 +3 -3
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +18 -18
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/admission-limit.d.ts +3 -3
- package/dist/actors/computer-use/admission-limit.js +4 -4
- 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.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +15 -15
- 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/debrief.js +2 -2
- package/dist/actors/computer-use/loop/ending.d.ts +6 -6
- package/dist/actors/computer-use/loop/ending.js +18 -17
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +15 -14
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +12 -12
- package/dist/actors/computer-use/loop/session.d.ts +4 -4
- package/dist/actors/computer-use/loop/session.js +4 -4
- 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 +11 -9
- package/dist/actors/computer-use/loop/types.d.ts +47 -45
- package/dist/actors/computer-use/loop/usage.d.ts +2 -2
- package/dist/actors/computer-use/loop/usage.js +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-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +13 -10
- package/dist/actors/computer-use/openai-provider.js +52 -41
- 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/computer-use/provider-error.d.ts +4 -4
- package/dist/actors/computer-use/provider-error.js +6 -6
- package/dist/actors/contract.d.ts +82 -47
- package/dist/actors/contract.js +30 -24
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +13 -12
- package/dist/actors/local-agent/cli.d.ts +9 -7
- 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 +8 -8
- package/dist/actors/registry.d.ts +12 -12
- package/dist/actors/registry.js +21 -20
- package/dist/actors/scripted-browser/actor.d.ts +10 -10
- package/dist/actors/scripted-browser/actor.js +17 -17
- 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/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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/execute.d.ts +1 -1
- package/dist/analysis/execute.js +1 -1
- package/dist/analysis/service.js +5 -5
- 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/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +48 -35
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.d.ts +0 -1
- package/dist/cli/commands/observe.js +136 -112
- 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 +136 -139
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +27 -24
- package/dist/cli/commands/study-format.d.ts +9 -0
- package/dist/cli/commands/{lab-format.js → study-format.js} +39 -27
- 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} +17 -18
- 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} +7 -6
- 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} +10 -10
- 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} +44 -45
- package/dist/cli/commands/{lab-scorer.d.ts → study-scorer.d.ts} +7 -7
- package/dist/cli/commands/{lab-scorer.js → study-scorer.js} +2 -2
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +146 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +31 -31
- package/dist/cli/commands/watch.js +71 -121
- package/dist/cli/deprecations.d.ts +6 -0
- package/dist/cli/deprecations.js +18 -0
- package/dist/cli/doctor.d.ts +18 -8
- package/dist/cli/doctor.js +114 -59
- package/dist/cli/first-run-path.d.ts +15 -13
- package/dist/cli/first-run-path.js +35 -33
- package/dist/cli/io.d.ts +44 -9
- package/dist/cli/io.js +98 -23
- package/dist/cli/observer-follow.d.ts +3 -3
- package/dist/cli/observer-follow.js +6 -7
- package/dist/cli/orientation.d.ts +10 -7
- package/dist/cli/orientation.js +89 -47
- 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 +111 -43
- package/dist/cli/telemetry.d.ts +16 -16
- package/dist/cli/telemetry.js +46 -44
- 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 +17 -17
- package/dist/comms/connections.d.ts +1 -1
- package/dist/comms/connections.js +2 -2
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +5 -5
- package/dist/comms/external-evidence.js +5 -4
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +3 -3
- package/dist/comms/fake-inbox.js +3 -3
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- package/dist/comms/receiving-runtime.d.ts +4 -4
- 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 +38 -39
- package/dist/comms/sandbox-catch.js +36 -37
- package/dist/comms/setup.d.ts +2 -2
- package/dist/comms/setup.js +56 -25
- 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 +38 -80
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +10 -10
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- 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 +19 -19
- 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.d.ts +1 -1
- 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 +6 -6
- package/dist/index.d.ts +14 -14
- package/dist/index.js +8 -8
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +7 -7
- 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 +3 -1
- package/dist/observer/library.js +8 -3
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +17 -6
- package/dist/observer/run-routes.d.ts +4 -3
- package/dist/observer/run-routes.js +38 -13
- package/dist/observer/serve.d.ts +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 +18 -17
- package/dist/routes/computer-use/bundle.d.ts +2 -2
- package/dist/routes/computer-use/bundle.js +10 -9
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +6 -6
- package/dist/routes/computer-use/e2b-desktop/comms.js +18 -17
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/prepare.js +10 -10
- package/dist/routes/computer-use/e2b-desktop/start.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/teardown.js +2 -2
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +27 -26
- package/dist/routes/computer-use/fanout-records.js +12 -13
- package/dist/routes/computer-use/live-flush.d.ts +4 -4
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +5 -4
- package/dist/routes/computer-use/live-phase.js +8 -8
- 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 +3 -3
- package/dist/routes/computer-use/participant-desktop.d.ts +7 -7
- package/dist/routes/computer-use/participant-desktop.js +5 -5
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +10 -10
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +33 -15
- package/dist/routes/computer-use/participant-prompt.d.ts +15 -15
- package/dist/routes/computer-use/participant-prompt.js +9 -9
- package/dist/routes/computer-use/participant-runs.d.ts +16 -16
- package/dist/routes/computer-use/participant-runs.js +26 -25
- package/dist/routes/computer-use/plan.d.ts +12 -12
- package/dist/routes/computer-use/plan.js +42 -42
- package/dist/routes/computer-use/preflight.d.ts +5 -5
- package/dist/routes/computer-use/preflight.js +25 -25
- package/dist/routes/computer-use/rerun-selection.d.ts +1 -1
- package/dist/routes/computer-use/rerun-selection.js +4 -3
- package/dist/routes/computer-use/result.d.ts +4 -4
- package/dist/routes/computer-use/result.js +22 -21
- package/dist/routes/computer-use/route.d.ts +12 -11
- package/dist/routes/computer-use/route.js +31 -30
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +32 -32
- package/dist/routes/computer-use/setup.d.ts +23 -23
- package/dist/routes/computer-use/setup.js +28 -29
- package/dist/routes/computer-use/single-bundle.d.ts +11 -11
- package/dist/routes/computer-use/single-bundle.js +40 -41
- package/dist/routes/computer-use/subject-projection.d.ts +4 -4
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +71 -73
- package/dist/routes/computer-use/types.js +12 -12
- package/dist/routes/preview.d.ts +13 -7
- package/dist/routes/preview.js +11 -7
- package/dist/routes/scripted/bundle.d.ts +7 -7
- package/dist/routes/scripted/bundle.js +20 -18
- package/dist/routes/scripted/plan.d.ts +8 -8
- package/dist/routes/scripted/plan.js +13 -13
- package/dist/routes/scripted/result.d.ts +3 -3
- package/dist/routes/scripted/result.js +13 -13
- package/dist/routes/scripted/route.d.ts +9 -9
- package/dist/routes/scripted/route.js +15 -16
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +5 -5
- package/dist/routes/scripted/setup.d.ts +6 -6
- package/dist/routes/scripted/setup.js +8 -8
- package/dist/routes/scripted/subject.d.ts +5 -5
- package/dist/routes/scripted/subject.js +4 -4
- package/dist/routes/scripted/surface-records.d.ts +1 -1
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +3 -3
- package/dist/routes/scripted/types.d.ts +18 -20
- package/dist/routes/scripted/types.js +2 -2
- package/dist/routes/shared-world/bundle-records.js +11 -10
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +46 -43
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +2 -2
- package/dist/routes/shared-world/comms.d.ts +14 -14
- package/dist/routes/shared-world/comms.js +19 -18
- 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 +10 -9
- package/dist/routes/shared-world/participant-specs.js +38 -31
- package/dist/routes/shared-world/plan.d.ts +9 -9
- package/dist/routes/shared-world/plan.js +16 -16
- 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.d.ts +8 -8
- package/dist/routes/shared-world/provisioned.js +18 -17
- package/dist/routes/shared-world/result.d.ts +6 -6
- package/dist/routes/shared-world/result.js +29 -29
- package/dist/routes/shared-world/route.d.ts +11 -11
- package/dist/routes/shared-world/route.js +40 -39
- package/dist/routes/shared-world/setup.d.ts +16 -16
- package/dist/routes/shared-world/setup.js +23 -23
- package/dist/routes/shared-world/types.d.ts +55 -53
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +5 -5
- package/dist/routes/terminal/adapter.js +9 -9
- package/dist/routes/terminal/bundle.d.ts +13 -13
- package/dist/routes/terminal/bundle.js +28 -27
- package/dist/routes/terminal/credentials.d.ts +8 -8
- package/dist/routes/terminal/credentials.js +12 -12
- package/dist/routes/terminal/dry-run.d.ts +4 -4
- package/dist/routes/terminal/dry-run.js +12 -12
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +5 -5
- package/dist/routes/terminal/ledger.js +14 -14
- 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 +10 -10
- package/dist/routes/terminal/live-sandbox.d.ts +2 -2
- package/dist/routes/terminal/live-sandbox.js +15 -15
- package/dist/routes/terminal/participant-text.js +2 -1
- package/dist/routes/terminal/persona.d.ts +2 -2
- package/dist/routes/terminal/persona.js +3 -3
- package/dist/routes/terminal/plan.d.ts +7 -7
- package/dist/routes/terminal/plan.js +15 -15
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.d.ts +5 -5
- package/dist/routes/terminal/result.js +14 -14
- package/dist/routes/terminal/route.d.ts +9 -9
- package/dist/routes/terminal/route.js +19 -20
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.d.ts +5 -5
- package/dist/routes/terminal/session.js +14 -13
- 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 +4 -4
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +48 -50
- package/dist/routes/terminal/types.js +5 -5
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +49 -49
- package/dist/run/bundle.js +3 -2
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.d.ts +23 -0
- package/dist/run/costs.js +79 -44
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.d.ts +1 -1
- package/dist/run/dry-run-inputs.js +2 -2
- package/dist/run/dry-run.js +20 -20
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/outcomes.d.ts +1 -1
- package/dist/run/participant.d.ts +1 -1
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/preflight-receipts.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +22 -15
- package/dist/run/projection.d.ts +46 -46
- package/dist/run/projection.js +57 -57
- package/dist/run/reclaim.d.ts +1 -1
- package/dist/run/reclaim.js +3 -3
- package/dist/run/results.d.ts +5 -5
- 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 +19 -7
- package/dist/run/run-index.js +77 -64
- 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 +6 -5
- package/dist/run/run.js +3 -3
- 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 +37 -36
- 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 +7 -7
- package/dist/run/stats.d.ts +14 -8
- package/dist/run/stats.js +121 -63
- package/dist/run/status.d.ts +16 -29
- package/dist/run/status.js +10 -29
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +7 -7
- package/dist/run/study-provenance.d.ts +49 -0
- package/dist/run/study-provenance.js +66 -0
- package/dist/run/study-result.d.ts +11 -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-study.d.ts +112 -0
- package/dist/{run-lab.js → run-study.js} +52 -47
- package/dist/{lab → study}/adapter-extension.d.ts +15 -27
- package/dist/{lab → study}/adapter-extension.js +10 -45
- package/dist/{lab → study}/adapter-scorer-loader.d.ts +17 -17
- package/dist/{lab → study}/adapter-scorer-loader.js +34 -34
- package/dist/study/composition-rules.d.ts +7 -0
- package/dist/{lab → study}/composition-rules.js +53 -53
- package/dist/study/config.d.ts +15 -0
- package/dist/{lab → study}/config.js +98 -41
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- package/dist/{lab → study}/device-presets.d.ts +10 -10
- package/dist/{lab → study}/device-presets.js +11 -11
- package/dist/study/discover.d.ts +75 -0
- package/dist/{lab → study}/discover.js +134 -95
- package/dist/{lab → study}/doctor.d.ts +19 -12
- package/dist/{lab → study}/doctor.js +58 -20
- 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 +44 -0
- package/dist/{lab → study}/init-templates.d.ts +2 -2
- package/dist/study/init-templates.js +421 -0
- package/dist/{lab → study}/init.d.ts +2 -2
- package/dist/{lab → study}/init.js +46 -11
- package/dist/study/keys.d.ts +4 -0
- package/dist/{lab → study}/keys.js +46 -12
- 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/{lab → study}/parse/actors.d.ts +5 -5
- package/dist/{lab → study}/parse/actors.js +14 -14
- package/dist/study/parse/comms.d.ts +12 -0
- package/dist/{lab → study}/parse/comms.js +5 -5
- package/dist/study/parse/execution.d.ts +19 -0
- package/dist/{lab → study}/parse/execution.js +13 -13
- package/dist/study/parse/study-v3.d.ts +21 -0
- package/dist/study/parse/study-v3.js +259 -0
- package/dist/study/parse/subject-state.d.ts +30 -0
- package/dist/{lab → study}/parse/subject-state.js +19 -19
- package/dist/{lab → study}/parse/subject.d.ts +3 -3
- package/dist/{lab → study}/parse/subject.js +34 -34
- package/dist/{lab → study}/parse/values.d.ts +3 -3
- package/dist/{lab → study}/parse/values.js +3 -3
- package/dist/{lab → study}/persona-resolve.d.ts +8 -8
- package/dist/{lab → study}/persona-resolve.js +6 -6
- 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 +12 -12
- package/dist/{lab → study}/plan-participants.js +4 -4
- package/dist/{lab → study}/plan-types.d.ts +31 -31
- package/dist/{lab → study}/plan-types.js +2 -2
- package/dist/study/plan.d.ts +13 -0
- package/dist/study/plan.js +101 -0
- package/dist/study/preflight-probes.d.ts +3 -0
- package/dist/{lab → study}/preflight-probes.js +20 -19
- package/dist/study/preflight-result.d.ts +8 -0
- package/dist/{lab → study}/preflight-result.js +5 -4
- package/dist/study/preflight.d.ts +94 -0
- package/dist/{lab → study}/preflight.js +12 -12
- 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 +39 -33
- package/dist/{lab → study}/routing.js +60 -29
- package/dist/{lab/run-lab-events.d.ts → study/run-study-events.d.ts} +10 -13
- package/dist/{lab/run-lab-events.js → study/run-study-events.js} +3 -9
- package/dist/{lab/run-lab-homes.d.ts → study/run-study-homes.d.ts} +21 -18
- package/dist/{lab/run-lab-homes.js → study/run-study-homes.js} +1 -1
- package/dist/study/run-study-options.d.ts +28 -0
- package/dist/{lab/run-lab-options.js → study/run-study-options.js} +29 -25
- package/dist/{lab/lab-deps.d.ts → study/study-deps.d.ts} +8 -13
- package/dist/{lab/lab-deps.js → study/study-deps.js} +2 -2
- package/dist/{lab → study}/summary.d.ts +16 -15
- package/dist/{lab → study}/summary.js +21 -21
- package/dist/{lab → study}/tasks.d.ts +18 -18
- package/dist/{lab → study}/tasks.js +14 -14
- package/dist/{lab → study}/types.d.ts +202 -196
- package/dist/{lab → study}/types.js +3 -1
- package/dist/{lab → study}/validation.d.ts +27 -27
- package/dist/{lab → study}/validation.js +53 -51
- package/dist/study/warnings.d.ts +12 -0
- package/dist/{lab → study}/warnings.js +62 -34
- package/dist/subject/clone.d.ts +7 -7
- package/dist/subject/clone.js +2 -2
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.d.ts +2 -2
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +4 -4
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +9 -10
- package/dist/subject/serve.d.ts +5 -5
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +4 -4
- package/dist/subject/state.js +1 -1
- package/dist/subject/steps.d.ts +6 -6
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- package/dist/substrates/desktop-session.js +2 -2
- 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 +6 -6
- package/dist/substrates/e2b/desktop-browser.js +9 -9
- package/dist/substrates/e2b/desktop-cdp.d.ts +10 -10
- package/dist/substrates/e2b/desktop-cdp.js +9 -9
- package/dist/substrates/e2b/desktop-executor.d.ts +2 -2
- package/dist/substrates/e2b/desktop-executor.js +13 -13
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +8 -8
- package/dist/substrates/e2b/desktop-media.d.ts +4 -4
- 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/lifetime.js +1 -1
- package/dist/substrates/e2b/sandbox.d.ts +4 -4
- package/dist/substrates/e2b/sandbox.js +2 -2
- package/dist/substrates/e2b/sdk.d.ts +12 -12
- package/dist/substrates/e2b/sdk.js +7 -7
- package/dist/substrates/local/runtime-config.d.ts +4 -4
- package/dist/substrates/local/runtime-config.js +4 -4
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +23 -23
- package/dist/tui/contract.js +11 -11
- package/dist/tui/launch.d.ts +7 -7
- package/dist/tui/launch.js +36 -31
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +139 -139
- 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 +5 -5
- package/dist/verify/subject.js +19 -19
- package/dist/verify/verify.js +94 -44
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +60 -91
- package/docs/architecture/browser-control.md +1 -1
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +68 -65
- package/docs/architecture/github-feedback-loop.md +2 -5
- 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 +6 -6
- package/docs/architecture/terminal-product-route.md +70 -110
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +4 -7
- 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 +42 -44
- package/docs/contracts/schemas.md +446 -368
- package/docs/contracts/study-analysis.md +7 -4
- package/docs/contracts/study-costs.md +28 -9
- 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/README.md +1 -1
- 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/examples/scorer/scorer.mjs +3 -3
- package/package.json +16 -17
- package/skills/humanish/SKILL.md +64 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -72
- package/dist/actors/codex/qualified-versions.js +0 -132
- package/dist/cli/commands/lab-format.d.ts +0 -8
- 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/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/lab/composition-rules.d.ts +0 -7
- package/dist/lab/config.d.ts +0 -7
- package/dist/lab/discover.d.ts +0 -65
- package/dist/lab/init-templates.js +0 -416
- package/dist/lab/keys.d.ts +0 -2
- package/dist/lab/parse/comms.d.ts +0 -12
- package/dist/lab/parse/execution.d.ts +0 -19
- package/dist/lab/parse/subject-state.d.ts +0 -30
- package/dist/lab/plan.d.ts +0 -19
- package/dist/lab/plan.js +0 -132
- package/dist/lab/preflight-probes.d.ts +0 -3
- package/dist/lab/preflight-result.d.ts +0 -7
- package/dist/lab/preflight.d.ts +0 -92
- package/dist/lab/route-inputs.d.ts +0 -28
- package/dist/lab/run-lab-options.d.ts +0 -28
- package/dist/lab/warnings.d.ts +0 -2
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/run-lab.d.ts +0 -112
- 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
- /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}/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
|
@@ -1,92 +1,80 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { studyPersonaIds, resolveCommittedPersonasForCwd } from "./persona-resolve.js";
|
|
2
2
|
import { personaBrief, PersonaConfigError } from "./persona.js";
|
|
3
3
|
import { constants } from "node:fs";
|
|
4
4
|
import { lstat, open, readdir, realpath } from "node:fs/promises";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { parse } from "yaml";
|
|
7
|
-
import {
|
|
8
|
-
import {} from "./types.js";
|
|
7
|
+
import { parseStudy } from "./config.js";
|
|
8
|
+
import { V2_SCHEMA } from "./types.js";
|
|
9
9
|
import { assertPreparedSelectedOutputDirectory, assertSafeOutputPathSegment, prepareSelectedOutputDirectory, readContainedRegularFile, } from "../run/contained-output.js";
|
|
10
10
|
import { isNodeError } from "../run/type-guards.js";
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
path.join(".humanish", "labs"),
|
|
16
|
-
path.join(".humanish", "local", "labs"),
|
|
17
|
-
];
|
|
18
|
-
export async function resolveLabManifest(cwd, lab) {
|
|
11
|
+
import { studyFileCandidates, STUDY_DIRECTORIES } from "./files.js";
|
|
12
|
+
const STUDY_LIST_SCHEMA = "humanish.study-list.v1";
|
|
13
|
+
const STUDY_SHOW_SCHEMA = "humanish.study-show.v1";
|
|
14
|
+
export async function resolveStudyManifest(cwd, study) {
|
|
19
15
|
const resolvedCwd = path.resolve(cwd);
|
|
20
16
|
const warnings = [];
|
|
21
17
|
const projectRoot = await bindProjectRoot(resolvedCwd);
|
|
22
18
|
if (!projectRoot) {
|
|
23
|
-
return
|
|
19
|
+
return invalidStudy({ cwd: resolvedCwd, study, warnings }, "Project root failed containment validation.");
|
|
24
20
|
}
|
|
25
|
-
if (
|
|
26
|
-
const requestedPath = path.resolve(resolvedCwd,
|
|
21
|
+
if (studyLooksLikePath(study)) {
|
|
22
|
+
const requestedPath = path.resolve(resolvedCwd, study);
|
|
27
23
|
const read = await readExplicitManifest(projectRoot, requestedPath);
|
|
28
24
|
if (read.status === "missing") {
|
|
29
|
-
return
|
|
25
|
+
return studyNotFound(resolvedCwd, study, warnings);
|
|
30
26
|
}
|
|
31
27
|
if (read.status === "unsafe") {
|
|
32
|
-
return
|
|
28
|
+
return invalidStudy({ cwd: resolvedCwd, study, warnings }, read.message);
|
|
33
29
|
}
|
|
34
|
-
return
|
|
30
|
+
return parseResolvedStudy({
|
|
35
31
|
cwd: resolvedCwd,
|
|
36
|
-
|
|
32
|
+
study,
|
|
37
33
|
origin: "explicit",
|
|
38
34
|
path: requestedPath,
|
|
39
35
|
warnings,
|
|
40
36
|
contents: read.contents,
|
|
41
37
|
});
|
|
42
38
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
...ignoredLabsDirs.flatMap((dir) => [
|
|
47
|
-
{ origin: "ignored", relativePath: path.join(dir, `${lab}.yaml`) },
|
|
48
|
-
{ origin: "ignored", relativePath: path.join(dir, `${lab}.yml`) },
|
|
49
|
-
]),
|
|
50
|
-
];
|
|
51
|
-
for (const candidate of candidates) {
|
|
52
|
-
const requestedPath = path.join(resolvedCwd, candidate.relativePath);
|
|
39
|
+
// The studies/ directories are read in order. A name found only under a labs/ directory is
|
|
40
|
+
// refused with what to do about it, so the user is not told the study does not exist.
|
|
41
|
+
for (const candidate of studyFileCandidates(study)) {
|
|
53
42
|
const read = await readManagedManifest(projectRoot, candidate.relativePath);
|
|
54
43
|
if (read.status === "missing") {
|
|
55
44
|
continue;
|
|
56
45
|
}
|
|
57
46
|
if (read.status === "unsafe") {
|
|
58
|
-
return
|
|
47
|
+
return invalidStudy({ cwd: resolvedCwd, study, warnings }, read.message);
|
|
59
48
|
}
|
|
60
|
-
return
|
|
49
|
+
return parseResolvedStudy({
|
|
61
50
|
cwd: resolvedCwd,
|
|
62
|
-
|
|
63
|
-
origin: candidate.origin,
|
|
64
|
-
path:
|
|
51
|
+
study,
|
|
52
|
+
origin: candidate.directory.origin,
|
|
53
|
+
path: path.join(resolvedCwd, candidate.relativePath),
|
|
65
54
|
warnings,
|
|
66
55
|
contents: read.contents,
|
|
56
|
+
retiredDirectory: candidate.directory.family === "labs",
|
|
67
57
|
});
|
|
68
58
|
}
|
|
69
|
-
return
|
|
59
|
+
return studyNotFound(resolvedCwd, study, warnings);
|
|
70
60
|
}
|
|
71
|
-
export async function
|
|
61
|
+
export async function listStudyManifests(cwd) {
|
|
72
62
|
const resolvedCwd = path.resolve(cwd);
|
|
73
63
|
const warnings = [];
|
|
74
|
-
const
|
|
64
|
+
const retired = [];
|
|
65
|
+
const listed = new Map();
|
|
75
66
|
const projectRoot = await bindProjectRoot(resolvedCwd);
|
|
76
67
|
if (!projectRoot) {
|
|
77
68
|
return {
|
|
78
|
-
schema:
|
|
69
|
+
schema: STUDY_LIST_SCHEMA,
|
|
79
70
|
ok: true,
|
|
80
71
|
cwd: resolvedCwd,
|
|
81
|
-
|
|
82
|
-
|
|
72
|
+
studies: [],
|
|
73
|
+
retired: [],
|
|
74
|
+
warnings: ["Project root failed containment validation; study files were skipped."],
|
|
83
75
|
};
|
|
84
76
|
}
|
|
85
|
-
const
|
|
86
|
-
{ origin: "committed", relativeDir: committedLabsDir },
|
|
87
|
-
...ignoredLabsDirs.map((relativeDir) => ({ origin: "ignored", relativeDir })),
|
|
88
|
-
];
|
|
89
|
-
for (const entry of dirs) {
|
|
77
|
+
for (const entry of STUDY_DIRECTORIES) {
|
|
90
78
|
const directory = await bindManagedDirectory(projectRoot, entry.relativeDir);
|
|
91
79
|
if (directory.status === "missing") {
|
|
92
80
|
continue;
|
|
@@ -101,39 +89,49 @@ export async function listLabManifests(cwd) {
|
|
|
101
89
|
await assertManagedDirectoryBinding(projectRoot, entry.relativeDir, directory.binding);
|
|
102
90
|
}
|
|
103
91
|
catch {
|
|
104
|
-
warnings.push(`${entry.relativeDir}: unsafe managed
|
|
92
|
+
warnings.push(`${entry.relativeDir}: unsafe managed study directory; skipped.`);
|
|
105
93
|
continue;
|
|
106
94
|
}
|
|
107
95
|
for (const name of names.filter((value) => value.endsWith(".yaml") || value.endsWith(".yml"))) {
|
|
108
96
|
let relativePath;
|
|
109
97
|
try {
|
|
110
|
-
assertSafeOutputPathSegment(name, "
|
|
98
|
+
assertSafeOutputPathSegment(name, "Study file name");
|
|
111
99
|
relativePath = path.join(entry.relativeDir, name);
|
|
112
100
|
}
|
|
113
101
|
catch {
|
|
114
|
-
warnings.push(`${entry.relativeDir}: unsafe
|
|
102
|
+
warnings.push(`${entry.relativeDir}: unsafe study file name; skipped.`);
|
|
115
103
|
continue;
|
|
116
104
|
}
|
|
117
105
|
const requestedPath = path.join(resolvedCwd, relativePath);
|
|
118
106
|
const read = await readManagedManifest(projectRoot, relativePath);
|
|
119
107
|
if (read.status !== "ok") {
|
|
120
|
-
warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${read.status === "unsafe" ? read.message : "
|
|
108
|
+
warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${read.status === "unsafe" ? read.message : "study file changed while it was listed; skipped."}`);
|
|
121
109
|
continue;
|
|
122
110
|
}
|
|
123
|
-
const parsed =
|
|
111
|
+
const parsed = parseResolvedStudy({
|
|
124
112
|
cwd: resolvedCwd,
|
|
125
|
-
|
|
113
|
+
study: name.replace(/\.(?:ya?ml)$/i, ""),
|
|
126
114
|
origin: entry.origin,
|
|
127
115
|
path: requestedPath,
|
|
128
116
|
warnings: [],
|
|
129
117
|
contents: read.contents,
|
|
118
|
+
retiredDirectory: entry.family === "labs",
|
|
130
119
|
});
|
|
131
120
|
if (!parsed.ok) {
|
|
132
|
-
|
|
121
|
+
const { code, message } = parsed.error;
|
|
122
|
+
if (code === "HUMANISH_STUDY_V2_UNSUPPORTED" ||
|
|
123
|
+
code === "HUMANISH_STUDY_RETIRED_DIRECTORY") {
|
|
124
|
+
// The message already starts with the file's path.
|
|
125
|
+
retired.push({ path: relativeToCwd(resolvedCwd, requestedPath), code, message });
|
|
126
|
+
warnings.push(message);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
warnings.push(`${relativeToCwd(resolvedCwd, requestedPath)}: ${message}`);
|
|
130
|
+
}
|
|
133
131
|
continue;
|
|
134
132
|
}
|
|
135
133
|
const key = `${parsed.config.id}:${entry.origin}:${relativeToCwd(resolvedCwd, requestedPath)}`;
|
|
136
|
-
|
|
134
|
+
listed.set(key, {
|
|
137
135
|
id: parsed.config.id,
|
|
138
136
|
source: parsed.config.subject.source,
|
|
139
137
|
origin: entry.origin,
|
|
@@ -147,71 +145,76 @@ export async function listLabManifests(cwd) {
|
|
|
147
145
|
}
|
|
148
146
|
}
|
|
149
147
|
return {
|
|
150
|
-
schema:
|
|
148
|
+
schema: STUDY_LIST_SCHEMA,
|
|
151
149
|
ok: true,
|
|
152
150
|
cwd: resolvedCwd,
|
|
153
|
-
|
|
151
|
+
studies: [...listed.values()].sort((left, right) => `${left.origin}:${left.id}`.localeCompare(`${right.origin}:${right.id}`)),
|
|
152
|
+
retired,
|
|
154
153
|
warnings,
|
|
155
154
|
};
|
|
156
155
|
}
|
|
157
|
-
export async function
|
|
158
|
-
const resolved = await
|
|
156
|
+
export async function inspectStudyManifest(cwd, study) {
|
|
157
|
+
const resolved = await resolveStudyManifest(cwd, study);
|
|
159
158
|
if (!resolved.ok) {
|
|
160
159
|
return {
|
|
161
|
-
schema:
|
|
160
|
+
schema: STUDY_SHOW_SCHEMA,
|
|
162
161
|
ok: false,
|
|
163
162
|
cwd: resolved.cwd,
|
|
164
|
-
|
|
163
|
+
study,
|
|
165
164
|
error: resolved.error,
|
|
166
165
|
warnings: resolved.warnings,
|
|
167
166
|
};
|
|
168
167
|
}
|
|
169
168
|
let personaResolution;
|
|
170
169
|
try {
|
|
171
|
-
personaResolution = await resolveCommittedPersonasForCwd(cwd,
|
|
170
|
+
personaResolution = await resolveCommittedPersonasForCwd(cwd, studyPersonaIds(resolved.config));
|
|
172
171
|
}
|
|
173
172
|
catch (error) {
|
|
174
173
|
if (!(error instanceof PersonaConfigError))
|
|
175
174
|
throw error;
|
|
176
175
|
return {
|
|
177
|
-
schema:
|
|
176
|
+
schema: STUDY_SHOW_SCHEMA,
|
|
178
177
|
ok: false,
|
|
179
178
|
cwd: path.resolve(cwd),
|
|
180
|
-
|
|
181
|
-
error: { code: "
|
|
179
|
+
study,
|
|
180
|
+
error: { code: "HUMANISH_STUDY_INVALID", message: error.message },
|
|
182
181
|
warnings: resolved.warnings,
|
|
183
182
|
};
|
|
184
183
|
}
|
|
185
184
|
return {
|
|
186
|
-
schema:
|
|
187
|
-
personas:
|
|
185
|
+
schema: STUDY_SHOW_SCHEMA,
|
|
186
|
+
personas: studyPersonaIds(resolved.config).map((id) => {
|
|
188
187
|
const persona = personaResolution.personas.get(id);
|
|
189
188
|
return { id, resolved: !!persona, ...(persona ? { brief: personaBrief(persona) } : {}) };
|
|
190
189
|
}),
|
|
191
190
|
ok: true,
|
|
192
191
|
cwd: path.resolve(cwd),
|
|
193
|
-
|
|
192
|
+
study,
|
|
194
193
|
config: resolved.config,
|
|
195
194
|
origin: resolved.origin,
|
|
196
195
|
path: resolved.path,
|
|
197
196
|
warnings: [...resolved.warnings, ...personaResolution.warnings],
|
|
198
197
|
};
|
|
199
198
|
}
|
|
200
|
-
function
|
|
199
|
+
function parseResolvedStudy(args) {
|
|
201
200
|
let raw;
|
|
202
201
|
try {
|
|
203
202
|
raw = parse(args.contents);
|
|
204
203
|
}
|
|
205
204
|
catch (error) {
|
|
206
|
-
return
|
|
205
|
+
return invalidStudy(args, error instanceof Error ? error.message : "The study file's YAML could not be parsed.");
|
|
206
|
+
}
|
|
207
|
+
const refusal = retiredStudyRefusal(relativeToCwd(args.cwd, args.path).replace(/\\/g, "/"), raw, args.retiredDirectory === true);
|
|
208
|
+
if (refusal !== undefined) {
|
|
209
|
+
return { ok: false, cwd: args.cwd, study: args.study, error: refusal, warnings: args.warnings };
|
|
207
210
|
}
|
|
208
|
-
const parsed =
|
|
211
|
+
const parsed = parseStudy(raw);
|
|
209
212
|
if (!parsed.ok) {
|
|
210
|
-
return
|
|
213
|
+
return invalidStudy(args, parsed.error.message);
|
|
211
214
|
}
|
|
212
215
|
const warnings = [...args.warnings, ...parsed.warnings];
|
|
213
216
|
if (args.path.endsWith(".yml")) {
|
|
214
|
-
warnings.push("Prefer .yaml for
|
|
217
|
+
warnings.push("Prefer .yaml for study files; .yml is accepted for compatibility only.");
|
|
215
218
|
}
|
|
216
219
|
return {
|
|
217
220
|
ok: true,
|
|
@@ -221,6 +224,39 @@ function parseResolvedLab(args) {
|
|
|
221
224
|
warnings,
|
|
222
225
|
};
|
|
223
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Why humanish refuses this file, or undefined. A humanish.lab.v2 file is refused wherever it is,
|
|
229
|
+
* and `humanish migrate` converts it (and moves it out of a labs/ directory). A v3 file is refused
|
|
230
|
+
* only when it was found by name in a labs/ directory; an explicit path to it still runs.
|
|
231
|
+
*/
|
|
232
|
+
function retiredStudyRefusal(relativePath, raw, retiredDirectory) {
|
|
233
|
+
const directory = path.posix.dirname(relativePath);
|
|
234
|
+
const studies = directory.replace(/labs$/, "studies");
|
|
235
|
+
// migrate moves a v2 file out of a labs/ directory however the file was named.
|
|
236
|
+
const inStudies = STUDY_DIRECTORIES.some((entry) => entry.family === "labs" && entry.relativeDir.replace(/\\/g, "/") === directory);
|
|
237
|
+
// migrate refuses a path outside its --cwd, so a file outside the project gets its own directory.
|
|
238
|
+
const migrate = path.isAbsolute(relativePath)
|
|
239
|
+
? `humanish migrate --cwd ${shellPath(path.dirname(relativePath))} ${shellPath(path.basename(relativePath))}`
|
|
240
|
+
: `humanish migrate ${shellPath(relativePath)}`;
|
|
241
|
+
if (typeof raw === "object" && raw !== null && raw.schema === V2_SCHEMA)
|
|
242
|
+
return {
|
|
243
|
+
code: "HUMANISH_STUDY_V2_UNSUPPORTED",
|
|
244
|
+
message: inStudies
|
|
245
|
+
? `${relativePath} is a humanish.lab.v2 file in ${directory}/, which humanish no longer reads. Run ${migrate} to convert it and move it to ${studies}/.`
|
|
246
|
+
: `${relativePath} is a humanish.lab.v2 file, which humanish no longer reads. Run ${migrate} to convert it.`,
|
|
247
|
+
};
|
|
248
|
+
if (retiredDirectory)
|
|
249
|
+
return {
|
|
250
|
+
code: "HUMANISH_STUDY_RETIRED_DIRECTORY",
|
|
251
|
+
message: `${relativePath} is in ${directory}/, which humanish no longer reads. Move it to ${studies}/.`,
|
|
252
|
+
};
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
/** A path as one shell argument: quoted when the shell would split or expand it, never an option. */
|
|
256
|
+
function shellPath(value) {
|
|
257
|
+
const arg = value.startsWith("-") ? `./${value}` : value;
|
|
258
|
+
return /^[\w@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, "'\\''")}'`;
|
|
259
|
+
}
|
|
224
260
|
async function bindProjectRoot(cwd) {
|
|
225
261
|
try {
|
|
226
262
|
const lexical = await lstat(cwd);
|
|
@@ -242,7 +278,7 @@ async function readManagedManifest(projectRoot, relativePath) {
|
|
|
242
278
|
if (!contents) {
|
|
243
279
|
return {
|
|
244
280
|
status: "unsafe",
|
|
245
|
-
message: "
|
|
281
|
+
message: "The study file changed or failed containment validation.",
|
|
246
282
|
};
|
|
247
283
|
}
|
|
248
284
|
return { status: "ok", contents: contents.toString("utf8") };
|
|
@@ -264,7 +300,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
|
|
|
264
300
|
if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1n) {
|
|
265
301
|
return {
|
|
266
302
|
status: "unsafe",
|
|
267
|
-
message: "
|
|
303
|
+
message: "The study file path must resolve to a single-link regular file.",
|
|
268
304
|
};
|
|
269
305
|
}
|
|
270
306
|
const handle = await open(physicalPath, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
@@ -276,7 +312,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
|
|
|
276
312
|
opened.ino !== before.ino) {
|
|
277
313
|
return {
|
|
278
314
|
status: "unsafe",
|
|
279
|
-
message: "
|
|
315
|
+
message: "The study file changed before it could be read safely.",
|
|
280
316
|
};
|
|
281
317
|
}
|
|
282
318
|
const contents = await handle.readFile();
|
|
@@ -293,7 +329,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
|
|
|
293
329
|
after.ino !== before.ino) {
|
|
294
330
|
return {
|
|
295
331
|
status: "unsafe",
|
|
296
|
-
message: "
|
|
332
|
+
message: "The study file changed while it was being read.",
|
|
297
333
|
};
|
|
298
334
|
}
|
|
299
335
|
return { status: "ok", contents: contents.toString("utf8") };
|
|
@@ -303,7 +339,7 @@ async function readExplicitManifest(projectRoot, requestedPath) {
|
|
|
303
339
|
}
|
|
304
340
|
}
|
|
305
341
|
catch {
|
|
306
|
-
return { status: "unsafe", message: "
|
|
342
|
+
return { status: "unsafe", message: "The study file path failed containment validation." };
|
|
307
343
|
}
|
|
308
344
|
}
|
|
309
345
|
async function bindManagedDirectory(projectRoot, relativePath) {
|
|
@@ -327,7 +363,7 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
|
|
|
327
363
|
const segments = relativePath.replace(/\\/g, "/").split("/");
|
|
328
364
|
let current = projectRoot.physicalPath;
|
|
329
365
|
for (const [index, segment] of segments.entries()) {
|
|
330
|
-
assertSafeOutputPathSegment(segment, "
|
|
366
|
+
assertSafeOutputPathSegment(segment, "Study file path segment");
|
|
331
367
|
current = path.join(current, segment);
|
|
332
368
|
let stats;
|
|
333
369
|
try {
|
|
@@ -341,18 +377,21 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
|
|
|
341
377
|
}
|
|
342
378
|
const leaf = index === segments.length - 1;
|
|
343
379
|
if (stats.isSymbolicLink()) {
|
|
344
|
-
return {
|
|
380
|
+
return {
|
|
381
|
+
status: "unsafe",
|
|
382
|
+
message: "Study directory paths must not contain symbolic links.",
|
|
383
|
+
};
|
|
345
384
|
}
|
|
346
385
|
if (!leaf && !stats.isDirectory()) {
|
|
347
|
-
return { status: "unsafe", message: "
|
|
386
|
+
return { status: "unsafe", message: "Study file path parents must be directories." };
|
|
348
387
|
}
|
|
349
388
|
if (leaf && expectedKind === "directory" && !stats.isDirectory()) {
|
|
350
|
-
return { status: "unsafe", message: "
|
|
389
|
+
return { status: "unsafe", message: "A study directory has an unsafe file type." };
|
|
351
390
|
}
|
|
352
391
|
if (leaf && expectedKind === "file" && (!stats.isFile() || stats.nlink !== 1n)) {
|
|
353
392
|
return {
|
|
354
393
|
status: "unsafe",
|
|
355
|
-
message: "
|
|
394
|
+
message: "A study file must be a single-link regular file.",
|
|
356
395
|
};
|
|
357
396
|
}
|
|
358
397
|
if (leaf) {
|
|
@@ -368,7 +407,7 @@ async function inspectManagedPath(projectRoot, relativePath, expectedKind) {
|
|
|
368
407
|
}
|
|
369
408
|
}
|
|
370
409
|
catch {
|
|
371
|
-
return { status: "unsafe", message: "
|
|
410
|
+
return { status: "unsafe", message: "A study file path failed containment validation." };
|
|
372
411
|
}
|
|
373
412
|
return { status: "missing" };
|
|
374
413
|
}
|
|
@@ -380,39 +419,39 @@ async function assertManagedDirectoryBinding(projectRoot, relativePath, binding)
|
|
|
380
419
|
current.birthtimeNs !== binding.birthtimeNs ||
|
|
381
420
|
current.dev !== binding.dev ||
|
|
382
421
|
current.ino !== binding.ino) {
|
|
383
|
-
throw new Error("Managed
|
|
422
|
+
throw new Error("Managed study directory identity changed after it was bound.");
|
|
384
423
|
}
|
|
385
424
|
}
|
|
386
|
-
function
|
|
425
|
+
function invalidStudy(args, message) {
|
|
387
426
|
return {
|
|
388
427
|
ok: false,
|
|
389
428
|
cwd: args.cwd,
|
|
390
|
-
|
|
429
|
+
study: args.study,
|
|
391
430
|
error: {
|
|
392
|
-
code: "
|
|
431
|
+
code: "HUMANISH_STUDY_INVALID",
|
|
393
432
|
message,
|
|
394
433
|
},
|
|
395
434
|
warnings: args.warnings,
|
|
396
435
|
};
|
|
397
436
|
}
|
|
398
|
-
function
|
|
437
|
+
function studyNotFound(cwd, study, warnings) {
|
|
399
438
|
return {
|
|
400
439
|
ok: false,
|
|
401
440
|
cwd,
|
|
402
|
-
|
|
441
|
+
study,
|
|
403
442
|
error: {
|
|
404
|
-
code: "
|
|
405
|
-
message: `
|
|
443
|
+
code: "HUMANISH_STUDY_NOT_FOUND",
|
|
444
|
+
message: `Study not found: ${study}. Look in humanish/studies/, or pass a .yaml path.`,
|
|
406
445
|
},
|
|
407
446
|
warnings,
|
|
408
447
|
};
|
|
409
448
|
}
|
|
410
|
-
function
|
|
411
|
-
return (
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
449
|
+
function studyLooksLikePath(study) {
|
|
450
|
+
return (study.endsWith(".yaml") ||
|
|
451
|
+
study.endsWith(".yml") ||
|
|
452
|
+
study.includes("/") ||
|
|
453
|
+
study.includes("\\") ||
|
|
454
|
+
study.startsWith("."));
|
|
416
455
|
}
|
|
417
456
|
function relativeToCwd(cwd, filePath) {
|
|
418
457
|
const relative = path.relative(cwd, filePath);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type LocalRuntimeStatus } from "../substrates/local/runtime.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { StudyConfig } from "./types.js";
|
|
3
3
|
import type { PlanResult } from "./plan-types.js";
|
|
4
4
|
import type { DetectedLocalAgent } from "../actors/local-agent/cli.js";
|
|
5
5
|
import type { ReasoningEffort } from "../actors/reasoning-effort.js";
|
|
6
|
-
import type {
|
|
7
|
-
import { type CodexInstallation } from "../actors/codex/
|
|
6
|
+
import type { DoctorCheckDraft } from "../cli/doctor.js";
|
|
7
|
+
import { type CodexInstallation } from "../actors/codex/codex-admission.js";
|
|
8
8
|
import type { RefusedCodexExecutable } from "../actors/codex/restricted-executable.js";
|
|
9
|
-
type Check =
|
|
9
|
+
type Check = DoctorCheckDraft;
|
|
10
10
|
/**
|
|
11
11
|
* Read-only Codex account readiness. An unadmitted CLI also reports the release it found, and an
|
|
12
12
|
* unavailable one the file humanish found and turned down.
|
|
@@ -31,7 +31,7 @@ type HostedCodexReadiness = CodexReadiness & {
|
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
33
33
|
* The hosted participant check: the operator-auth launch to an ephemeral thread, with no turn,
|
|
34
|
-
* using the
|
|
34
|
+
* using the study's declared model and reasoning effort as a run would.
|
|
35
35
|
*/
|
|
36
36
|
declare function hostedCodexReadiness(env: NodeJS.ProcessEnv, actor: {
|
|
37
37
|
model?: string;
|
|
@@ -42,9 +42,9 @@ export declare function localCodexParticipantCheck(args: {
|
|
|
42
42
|
env: NodeJS.ProcessEnv;
|
|
43
43
|
readiness?: (env: NodeJS.ProcessEnv) => Promise<CodexReadiness>;
|
|
44
44
|
}): Promise<Check>;
|
|
45
|
-
export interface
|
|
45
|
+
export interface StudySetupCheckArgs {
|
|
46
46
|
cwd: string;
|
|
47
|
-
|
|
47
|
+
study: string;
|
|
48
48
|
env: NodeJS.ProcessEnv;
|
|
49
49
|
agents: DetectedLocalAgent[];
|
|
50
50
|
keyPresent: (name: string) => boolean;
|
|
@@ -56,19 +56,26 @@ export interface LabSetupCheckArgs {
|
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
58
|
* Setup checks only: no model turn, browser or desktop creation. CLI startup may use the network.
|
|
59
|
-
* `keys` are the keys a live run requires. `reads` are the provider keys the
|
|
60
|
-
* required or not; it is undefined when that is unknown: the
|
|
59
|
+
* `keys` are the keys a live run requires. `reads` are the provider keys the study is known to read,
|
|
60
|
+
* required or not; it is undefined when that is unknown: the study does not plan, or a declared
|
|
61
61
|
* scorer's host code may read any key.
|
|
62
62
|
*/
|
|
63
|
-
export declare function
|
|
63
|
+
export declare function studySetupChecks(args: StudySetupCheckArgs): Promise<{
|
|
64
64
|
desktop: boolean;
|
|
65
65
|
keys: string[];
|
|
66
66
|
reads?: ReadonlySet<string>;
|
|
67
67
|
checks: Check[];
|
|
68
68
|
}>;
|
|
69
69
|
/**
|
|
70
|
-
* The
|
|
70
|
+
* The ids of the project's labs that need each provider key for a live run, from the same plan
|
|
71
|
+
* `doctor --study` reads. Each listed manifest resolves by its path, since a file name need not match
|
|
72
|
+
* the id inside. A study that runs dry, that the plain CLI cannot run, or that does not plan needs
|
|
73
|
+
* none.
|
|
74
|
+
*/
|
|
75
|
+
export declare function studiesByRequiredKey(cwd: string, keyPresent: (name: string) => boolean): Promise<Map<string, string[]>>;
|
|
76
|
+
/**
|
|
77
|
+
* The study planned with no run options, so its own scenario mode decides dry or live. Doctor and the
|
|
71
78
|
* TUI read a live run's keys and subject env from this plan's requirements.
|
|
72
79
|
*/
|
|
73
|
-
export declare function planCliRun(config:
|
|
80
|
+
export declare function planCliRun(config: StudyConfig, cwd: string): Promise<PlanResult>;
|
|
74
81
|
export {};
|