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
package/CONTRIBUTING.md
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
# Contributing
|
|
2
|
-
|
|
3
|
-
Thanks for helping make humanish better.
|
|
4
|
-
|
|
5
|
-
## Read these in order
|
|
6
|
-
|
|
7
|
-
1. [README.md](README.md): what humanish does and how a user runs a study.
|
|
8
|
-
2. This file: the ground rules, the commands and what a pull request needs.
|
|
9
|
-
3. [ARCHITECTURE.md](ARCHITECTURE.md): `humanish run <lab>` traced through the code, the code map
|
|
10
|
-
and the invariants a change must keep.
|
|
11
|
-
4. [CONTEXT.md](CONTEXT.md): the domain terms and the field spellings that map to them.
|
|
12
|
-
5. [docs/ramp/README.md](docs/ramp/README.md), for depth: current state, how to pick work and the
|
|
13
|
-
quality bar.
|
|
14
|
-
|
|
15
|
-
[docs/README.md](https://github.com/danielgwilson/humanish/blob/main/docs/README.md) sorts the rest of `docs/` into guides, reference, design records
|
|
16
|
-
and history.
|
|
17
|
-
|
|
18
|
-
## Ground Rules
|
|
19
|
-
|
|
20
|
-
- Follow [engineering principles](docs/principles/engineering.md): prefer simple,
|
|
21
|
-
idiomatic implementations and reuse established components. Validate the changed
|
|
22
|
-
behavior and material risks; keep required CI and release gates.
|
|
23
|
-
- Keep examples synthetic and public-safe.
|
|
24
|
-
- Do not commit `.env*`, `.npmrc`, `.humanish/`, generated run bundles, provider
|
|
25
|
-
credentials, private screenshots, raw transcripts, or customer data.
|
|
26
|
-
- Prefer small PRs with explicit proof commands.
|
|
27
|
-
- Keep a target product's page names, milestones, and vocabulary in adapters.
|
|
28
|
-
- For changes to credentials, provider spend, hosted execution or GitHub mutation,
|
|
29
|
-
state the relevant authority and failure boundaries. Use dry runs where useful;
|
|
30
|
-
they do not establish live behavior.
|
|
31
|
-
|
|
32
|
-
## Local Setup
|
|
33
|
-
|
|
34
|
-
Use Node.js 22.19 or newer and pnpm 12; `packageManager` in `package.json` pins the pnpm version.
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
pnpm install --frozen-lockfile # as CI installs
|
|
38
|
-
pnpm vitest run tests/<file> # while editing: one test file, a few seconds
|
|
39
|
-
pnpm docs:check # after editing a doc: paths, anchors, symbols, the CLI reference
|
|
40
|
-
pnpm format # oxfmt; run before every commit
|
|
41
|
-
pnpm release:check # once before pushing: the gate CI's test job runs
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
`release:check` runs `pnpm check` (format, lint, knip, the prose and vocabulary caps, typecheck,
|
|
45
|
-
the test suites, build and the startup proofs), then `api:proof`, `public-surface:scan`,
|
|
46
|
-
`skill:check` and `npm pack --dry-run`. On a 16-core Linux machine it takes about 6 minutes, 4 of
|
|
47
|
-
them in `pnpm check`. The test step prints nothing for a few minutes while it runs. `skill:check`
|
|
48
|
-
calls `npx skills`, so it needs network access.
|
|
49
|
-
|
|
50
|
-
CI (`.github/workflows/ci.yml`) runs six jobs on every pull request and every push to `main`:
|
|
51
|
-
|
|
52
|
-
| Job | What it runs |
|
|
53
|
-
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
|
54
|
-
| `test` (Node 22.19.0 and 24) | `pnpm release:check` |
|
|
55
|
-
| `site` | `pnpm docs:check`, then the site's typecheck, `registry:check` and build |
|
|
56
|
-
| `observer` | `pnpm build`, the Observer's typecheck and tests, `pnpm browser-control:proof` and the four `observer:*:proof` scripts in Chromium |
|
|
57
|
-
| `tui` | The TUI's typecheck and tests |
|
|
58
|
-
| `guest-desktop` | Builds the guest image and runs `pnpm guest-desktop:proof`, only when guest files change |
|
|
59
|
-
| `secret-scan` | gitleaks over the full git history |
|
|
60
|
-
|
|
61
|
-
Two kinds of change need one more step:
|
|
62
|
-
|
|
63
|
-
- After changing a CLI option, run `pnpm docs:generate`. `pnpm docs:check` fails on a stale
|
|
64
|
-
`site/content/docs/cli.mdx`.
|
|
65
|
-
- After changing what `src/index.ts` exports, run `pnpm build`, then `pnpm api:proof --update`, and
|
|
66
|
-
review the diff to `tests/golden/public-api.json`. `pnpm api:proof` also runs `examples/` against
|
|
67
|
-
the packed package.
|
|
68
|
-
|
|
69
|
-
`pnpm format` rewrites files with oxfmt. `pnpm check` fails on unformatted files.
|
|
70
|
-
It also holds three counts to caps in package.json: oxlint warnings (`lint`), prose in `src/`
|
|
71
|
-
comments (`prose:check`: issue references, `FIX-N` tags, all-caps emphasis), and identifiers and
|
|
72
|
-
file names in `src/` outside the exempt contract modules that still say lane, seat, role, sim or
|
|
73
|
-
study (`vocabulary:check`). Each check fails when its count rises above the cap and also when it
|
|
74
|
-
falls below it, so the PR that reduces a count lowers the cap in the same commit; the failure
|
|
75
|
-
message names the flag and the new value. CI's `caps` workflow (`scripts/check-cap-direction.mjs`)
|
|
76
|
-
also fails a PR that raises or removes a cap against the base branch, unless the PR has the
|
|
77
|
-
`raise-cap` label and a `Cap raise:` line in its body that says why. `pnpm lint` prints the warnings
|
|
78
|
-
that already exist, several hundred of them; that is expected. `pnpm knip` fails on unused files,
|
|
79
|
-
dependencies and exports, and on any import cycle.
|
|
80
|
-
|
|
81
|
-
## Useful Commands
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
pnpm humanish --help
|
|
85
|
-
pnpm humanish watch --json --no-open
|
|
86
|
-
pnpm humanish verify --run latest --json
|
|
87
|
-
pnpm pack:dry-run
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Make your first change
|
|
91
|
-
|
|
92
|
-
This walkthrough changes the persona id a computer-use participant gets when neither the
|
|
93
|
-
participant nor its actor names one. It runs offline and spends nothing. Two tests pin the id, and
|
|
94
|
-
the steps below update both.
|
|
95
|
-
|
|
96
|
-
1. Change `FALLBACK_PERSONA_ID` (`src/routes/computer-use/participant-prompt.ts`) from
|
|
97
|
-
`"cua-operator"` to a new id.
|
|
98
|
-
2. Run `pnpm vitest run tests/routes/computer-use/lane-persona-fallback.test.ts`. It fails because
|
|
99
|
-
it asserts the old id. Update the assertion once the new id is what you want.
|
|
100
|
-
3. Run `pnpm vitest run tests/routes/computer-use/local-vm.golden.test.ts`. It fails because the
|
|
101
|
-
local VM golden, `tests/golden/routes/computer-use-local-vm-live.json`, records the persona id.
|
|
102
|
-
Rerun it with `-u` to rewrite the golden, then check with `git diff tests/golden/` that only
|
|
103
|
-
the persona id changed.
|
|
104
|
-
4. Run `mkdir -p .humanish/local/labs`, then copy `humanish/labs/dwell-window-todomvc.yaml` to
|
|
105
|
-
`.humanish/local/labs/walkthrough.yaml`. Change its `id` to `walkthrough` and delete its
|
|
106
|
-
`persona:` line.
|
|
107
|
-
5. Run `pnpm humanish run walkthrough --dry-run --no-open`. It prints the run id on its `run:`
|
|
108
|
-
line. Check `persona.id` in `.humanish/runs/<runId>/run.json`.
|
|
109
|
-
6. Run `pnpm humanish verify --run latest`, then `pnpm format` and `pnpm release:check`.
|
|
110
|
-
|
|
111
|
-
Common changes touch these tests and contracts:
|
|
112
|
-
|
|
113
|
-
| Change | Tests | Contract or doc to update |
|
|
114
|
-
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
|
|
115
|
-
| A lab manifest field | `tests/lab/config.test.ts`, the route's tests. Its cases pin each lab's warnings, so a new warning fails cases that expect none | `docs/contracts/schemas.md`, `site/content/docs/lab-manifests.mdx` |
|
|
116
|
-
| A CLI option | the command's tests under `tests/cli/` | Run `pnpm docs:generate` to update `site/content/docs/cli.mdx` |
|
|
117
|
-
| A `run.json` field | the route's tests; rerun them with `-u` to update `tests/golden/routes/` and `tests/golden/failures/<route>/` | `docs/contracts/run-bundle.md` |
|
|
118
|
-
| An actor trace field | `tests/actors/`, `tests/actors/conformance.test.ts`, then the route goldens with `-u` | `docs/contracts/schemas.md#actor-trace`, `docs/architecture/actor-contract.md` |
|
|
119
|
-
| Observer data | `tests/observer/data-contract.test.ts` with `UPDATE_OBSERVER_DATA_GOLDENS=1` | `docs/architecture/observer.md` |
|
|
120
|
-
| Observer UI | `observer/tests/` and the four `observer:*:proof` scripts | `observer/AGENTS.md` |
|
|
121
|
-
| A route's behavior | the route's folder in `tests/routes/` (the scripted route's main suite is `tests/routes/scripted/route.test.ts`), `tests/lab/task-route-preflight.test.ts` | the support matrix in `docs/ramp/README.md` |
|
|
122
|
-
| An actor | `tests/actors/`, `tests/actors/conformance.test.ts` | `docs/architecture/actor-contract.md` |
|
|
123
|
-
| Redaction or share safety | `tests/evidence/`, `tests/run/transient-comms-secrets.test.ts` | `docs/contracts/policy.md` |
|
|
124
|
-
| Study analysis | `tests/analysis/` | `docs/contracts/study-analysis.md` |
|
|
125
|
-
| A public export | `pnpm build` and `pnpm api:proof` (`--update` to accept) | `tests/golden/public-api.json` |
|
|
126
|
-
| An example | `pnpm build` and `pnpm api:proof`, which runs every example | `examples/README.md` |
|
|
127
|
-
|
|
128
|
-
Three folders hold fixtures. `tests/fixtures/` holds test inputs, `humanish/fixtures/` holds the
|
|
129
|
-
synthetic apps this repo's own labs start, and the root `fixtures/` holds synthetic apps and cases
|
|
130
|
-
that several tests and scripts copy, such as `fixtures/minimal-app/`.
|
|
131
|
-
|
|
132
|
-
### Find the test folders outside the `src/` mirror
|
|
133
|
-
|
|
134
|
-
Most of `tests/` mirrors `src/`. Six folders sit outside that mirror. `tests/admission/` pins what the CLI and the
|
|
135
|
-
library do when they refuse a lab before a run starts, and `tests/scripts/` tests `scripts/`.
|
|
136
|
-
`tests/surface/` checks the README, the site, `site/public/llms.txt`, the agent skill and the package
|
|
137
|
-
against the shipped CLI. `tests/helpers/`, `tests/fixtures/` and `tests/golden/` hold shared test
|
|
138
|
-
code, inputs and goldens.
|
|
139
|
-
|
|
140
|
-
## Pull Requests
|
|
141
|
-
|
|
142
|
-
PRs should include:
|
|
143
|
-
|
|
144
|
-
- a concise summary;
|
|
145
|
-
- why the design is the simplest adequate option, when adding architectural complexity;
|
|
146
|
-
- proof commands and outcomes;
|
|
147
|
-
- any remaining gaps;
|
|
148
|
-
- confirmation that fixtures and examples are synthetic or redacted.
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Codex CLI releases the restricted launcher admits, per host, oldest first. Each qualified
|
|
3
|
-
* release needs a receipt under docs/goals/computer-use-actor/receipts/ that meets
|
|
4
|
-
* docs/architecture/restricted-codex-analysis.md ("Admitting a Codex CLI release"). Removing a
|
|
5
|
-
* release stops new launches; saved bundles stay readable through the separate reader lists in
|
|
6
|
-
* src/actors/contract.ts.
|
|
7
|
-
*
|
|
8
|
-
* A release string is a compatibility check, not binary attestation: the launcher compares what
|
|
9
|
-
* `codex --version`, initialize and thread start report, and a modified binary can report any
|
|
10
|
-
* of them.
|
|
11
|
-
*/
|
|
12
|
-
export declare const QUALIFIED_CODEX_CLI_VERSIONS: {
|
|
13
|
-
readonly "linux-x64": readonly ["0.154.0", "0.157.1", "0.159.2", "0.159.3", "0.160.0"];
|
|
14
|
-
readonly "darwin-arm64": readonly ["0.154.0"];
|
|
15
|
-
};
|
|
16
|
-
/**
|
|
17
|
-
* The pre-existing admission, not a qualification. Hosted participants on these hosts ran
|
|
18
|
-
* 0.154.0 while it was the only admitted release, and they keep it; no qualification has run
|
|
19
|
-
* on either host, and no later release is admitted there.
|
|
20
|
-
*/
|
|
21
|
-
export declare const PREEXISTING_CODEX_CLI_ADMISSIONS: {
|
|
22
|
-
readonly "linux-arm64": readonly ["0.154.0"];
|
|
23
|
-
readonly "darwin-x64": readonly ["0.154.0"];
|
|
24
|
-
};
|
|
25
|
-
type QualifiedHost = keyof typeof QUALIFIED_CODEX_CLI_VERSIONS;
|
|
26
|
-
type PreexistingHost = keyof typeof PREEXISTING_CODEX_CLI_ADMISSIONS;
|
|
27
|
-
export type CodexHost = QualifiedHost | PreexistingHost;
|
|
28
|
-
export type AdmittedCodexCliVersion = (typeof QUALIFIED_CODEX_CLI_VERSIONS)[QualifiedHost][number] | (typeof PREEXISTING_CODEX_CLI_ADMISSIONS)[PreexistingHost][number];
|
|
29
|
-
export declare function codexHost(platform: NodeJS.Platform, arch: string): CodexHost | undefined;
|
|
30
|
-
/** Releases that passed qualification on this host; the pre-existing admission is excluded. */
|
|
31
|
-
export declare function qualifiedCodexCliVersions(platform: NodeJS.Platform, arch: string): readonly AdmittedCodexCliVersion[];
|
|
32
|
-
/** Everything the launcher starts on this host: qualified releases or the pre-existing one. */
|
|
33
|
-
export declare function admittedCodexCliVersions(platform: NodeJS.Platform, arch: string): readonly AdmittedCodexCliVersion[];
|
|
34
|
-
/** What a declaration names before the installed CLI is detected: the host's newest release. */
|
|
35
|
-
export declare function defaultCodexCliVersion(platform?: NodeJS.Platform, arch?: string): AdmittedCodexCliVersion;
|
|
36
|
-
/** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
|
|
37
|
-
export declare function parseCodexCliVersion(stdout: string): string | undefined;
|
|
38
|
-
/**
|
|
39
|
-
* doctor's recovery for an unadmitted CLI: the release it found and where, what this host admits,
|
|
40
|
-
* and how to replace that binary with the newest admitted release.
|
|
41
|
-
*/
|
|
42
|
-
export declare function codexVersionRecovery(detected: string | undefined, installation?: CodexInstallation, platform?: NodeJS.Platform, arch?: string): string;
|
|
43
|
-
/**
|
|
44
|
-
* Where the `codex` humanish found was installed, which decides the command that replaces it.
|
|
45
|
-
* `path` is the file on `PATH`.
|
|
46
|
-
*/
|
|
47
|
-
export type CodexInstallation = {
|
|
48
|
-
readonly kind: "project";
|
|
49
|
-
readonly path: string;
|
|
50
|
-
readonly project: string;
|
|
51
|
-
} | {
|
|
52
|
-
readonly kind: "global";
|
|
53
|
-
readonly path: string;
|
|
54
|
-
} | {
|
|
55
|
-
readonly kind: "other";
|
|
56
|
-
readonly path: string;
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
|
|
60
|
-
* resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
|
|
61
|
-
* install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
|
|
62
|
-
* Homebrew or a standalone download, is other.
|
|
63
|
-
*/
|
|
64
|
-
export declare function classifyCodexInstallation(found: {
|
|
65
|
-
path: string;
|
|
66
|
-
resolved: string;
|
|
67
|
-
}, npmGlobalPrefix: string | undefined): CodexInstallation;
|
|
68
|
-
/** One sentence: how to put the newest admitted Codex CLI in place of the one humanish found. */
|
|
69
|
-
export declare function codexInstallAdvice(installation: CodexInstallation | undefined, platform?: NodeJS.Platform, arch?: string): string;
|
|
70
|
-
/** For refusal messages: the admitted releases on this host, or every host when it has none. */
|
|
71
|
-
export declare function describeQualifiedCodexCliVersions(platform?: NodeJS.Platform, arch?: string): string;
|
|
72
|
-
export {};
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
/**
|
|
3
|
-
* Codex CLI releases the restricted launcher admits, per host, oldest first. Each qualified
|
|
4
|
-
* release needs a receipt under docs/goals/computer-use-actor/receipts/ that meets
|
|
5
|
-
* docs/architecture/restricted-codex-analysis.md ("Admitting a Codex CLI release"). Removing a
|
|
6
|
-
* release stops new launches; saved bundles stay readable through the separate reader lists in
|
|
7
|
-
* src/actors/contract.ts.
|
|
8
|
-
*
|
|
9
|
-
* A release string is a compatibility check, not binary attestation: the launcher compares what
|
|
10
|
-
* `codex --version`, initialize and thread start report, and a modified binary can report any
|
|
11
|
-
* of them.
|
|
12
|
-
*/
|
|
13
|
-
export const QUALIFIED_CODEX_CLI_VERSIONS = {
|
|
14
|
-
"linux-x64": ["0.154.0", "0.157.1", "0.159.2", "0.159.3", "0.160.0"],
|
|
15
|
-
"darwin-arm64": ["0.154.0"],
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* The pre-existing admission, not a qualification. Hosted participants on these hosts ran
|
|
19
|
-
* 0.154.0 while it was the only admitted release, and they keep it; no qualification has run
|
|
20
|
-
* on either host, and no later release is admitted there.
|
|
21
|
-
*/
|
|
22
|
-
export const PREEXISTING_CODEX_CLI_ADMISSIONS = {
|
|
23
|
-
"linux-arm64": ["0.154.0"],
|
|
24
|
-
"darwin-x64": ["0.154.0"],
|
|
25
|
-
};
|
|
26
|
-
const HOST_LABELS = {
|
|
27
|
-
"linux-x64": "Linux x64",
|
|
28
|
-
"darwin-arm64": "macOS arm64",
|
|
29
|
-
"linux-arm64": "Linux arm64",
|
|
30
|
-
"darwin-x64": "macOS x64",
|
|
31
|
-
};
|
|
32
|
-
export function codexHost(platform, arch) {
|
|
33
|
-
const host = `${platform}-${arch}`;
|
|
34
|
-
return Object.hasOwn(QUALIFIED_CODEX_CLI_VERSIONS, host) ||
|
|
35
|
-
Object.hasOwn(PREEXISTING_CODEX_CLI_ADMISSIONS, host)
|
|
36
|
-
? host
|
|
37
|
-
: undefined;
|
|
38
|
-
}
|
|
39
|
-
/** Releases that passed qualification on this host; the pre-existing admission is excluded. */
|
|
40
|
-
export function qualifiedCodexCliVersions(platform, arch) {
|
|
41
|
-
const host = codexHost(platform, arch);
|
|
42
|
-
return host !== undefined && Object.hasOwn(QUALIFIED_CODEX_CLI_VERSIONS, host)
|
|
43
|
-
? QUALIFIED_CODEX_CLI_VERSIONS[host]
|
|
44
|
-
: [];
|
|
45
|
-
}
|
|
46
|
-
/** Everything the launcher starts on this host: qualified releases or the pre-existing one. */
|
|
47
|
-
export function admittedCodexCliVersions(platform, arch) {
|
|
48
|
-
const host = codexHost(platform, arch);
|
|
49
|
-
if (host === undefined)
|
|
50
|
-
return [];
|
|
51
|
-
return Object.hasOwn(QUALIFIED_CODEX_CLI_VERSIONS, host)
|
|
52
|
-
? QUALIFIED_CODEX_CLI_VERSIONS[host]
|
|
53
|
-
: PREEXISTING_CODEX_CLI_ADMISSIONS[host];
|
|
54
|
-
}
|
|
55
|
-
/** What a declaration names before the installed CLI is detected: the host's newest release. */
|
|
56
|
-
export function defaultCodexCliVersion(platform = process.platform, arch = process.arch) {
|
|
57
|
-
return (admittedCodexCliVersions(platform, arch).at(-1) ??
|
|
58
|
-
QUALIFIED_CODEX_CLI_VERSIONS["linux-x64"].at(-1));
|
|
59
|
-
}
|
|
60
|
-
/** The version from `codex --version` output (`codex-cli 0.157.1`); any other shape is undefined. */
|
|
61
|
-
export function parseCodexCliVersion(stdout) {
|
|
62
|
-
return /^codex-cli ([0-9][0-9A-Za-z.+-]{0,63})$/.exec(stdout.trim())?.[1];
|
|
63
|
-
}
|
|
64
|
-
function describeHost(host) {
|
|
65
|
-
return Object.hasOwn(QUALIFIED_CODEX_CLI_VERSIONS, host)
|
|
66
|
-
? QUALIFIED_CODEX_CLI_VERSIONS[host].join(", ")
|
|
67
|
-
: `${PREEXISTING_CODEX_CLI_ADMISSIONS[host].join(", ")} (pre-existing admission, not qualified)`;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* doctor's recovery for an unadmitted CLI: the release it found and where, what this host admits,
|
|
71
|
-
* and how to replace that binary with the newest admitted release.
|
|
72
|
-
*/
|
|
73
|
-
export function codexVersionRecovery(detected, installation, platform = process.platform, arch = process.arch) {
|
|
74
|
-
const found = detected === undefined
|
|
75
|
-
? "The installed Codex CLI did not report a recognizable version"
|
|
76
|
-
: `Found Codex CLI ${detected}`;
|
|
77
|
-
const where = installation === undefined ? "" : ` at \`${installation.path}\``;
|
|
78
|
-
return `${found}${where}; ${describeQualifiedCodexCliVersions(platform, arch)}. ${codexInstallAdvice(installation, platform, arch)} Then sign in with a ChatGPT account (\`codex login\`).`;
|
|
79
|
-
}
|
|
80
|
-
const inside = (file, directory) => file.startsWith(`${directory}${path.sep}`);
|
|
81
|
-
/**
|
|
82
|
-
* Classifies the `codex` on `PATH` by the file it resolves to. A project's node_modules/.bin/codex
|
|
83
|
-
* resolving into that project's @openai/codex is project-local, so `npx` runs it before any global
|
|
84
|
-
* install. One inside npm's global prefix (`npm prefix -g`) is global. Anything else, such as
|
|
85
|
-
* Homebrew or a standalone download, is other.
|
|
86
|
-
*/
|
|
87
|
-
export function classifyCodexInstallation(found, npmGlobalPrefix) {
|
|
88
|
-
const bin = path.dirname(found.path);
|
|
89
|
-
const modules = path.dirname(bin);
|
|
90
|
-
if (path.basename(bin) === ".bin" &&
|
|
91
|
-
path.basename(modules) === "node_modules" &&
|
|
92
|
-
inside(found.resolved, path.join(modules, "@openai", "codex")))
|
|
93
|
-
return { kind: "project", path: found.path, project: path.dirname(modules) };
|
|
94
|
-
if (npmGlobalPrefix !== undefined &&
|
|
95
|
-
(found.path === path.join(npmGlobalPrefix, "bin", "codex") ||
|
|
96
|
-
inside(found.resolved, path.join(npmGlobalPrefix, "lib", "node_modules", "@openai", "codex"))))
|
|
97
|
-
return { kind: "global", path: found.path };
|
|
98
|
-
return { kind: "other", path: found.path };
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* The command that installs the newest admitted Codex CLI where it replaces the one humanish
|
|
102
|
-
* found: in its project for a project-local install, otherwise npm's global install.
|
|
103
|
-
*/
|
|
104
|
-
function codexInstallCommand(installation, platform = process.platform, arch = process.arch) {
|
|
105
|
-
const version = defaultCodexCliVersion(platform, arch);
|
|
106
|
-
return installation?.kind === "project"
|
|
107
|
-
? `npm install -D @openai/codex@${version}`
|
|
108
|
-
: `npm install -g @openai/codex@${version}`;
|
|
109
|
-
}
|
|
110
|
-
/** One sentence: how to put the newest admitted Codex CLI in place of the one humanish found. */
|
|
111
|
-
export function codexInstallAdvice(installation, platform = process.platform, arch = process.arch) {
|
|
112
|
-
const command = codexInstallCommand(installation, platform, arch);
|
|
113
|
-
switch (installation?.kind) {
|
|
114
|
-
case undefined:
|
|
115
|
-
return `Install the newest with \`${command}\`.`;
|
|
116
|
-
case "global":
|
|
117
|
-
return `Replace it with \`${command}\`.`;
|
|
118
|
-
case "project":
|
|
119
|
-
return `It is installed in this project: run \`${command}\` in \`${installation.project}\`, or \`npm uninstall @openai/codex\` there to use the global Codex.`;
|
|
120
|
-
case "other":
|
|
121
|
-
return `Update it with the tool that installed it, or put Codex ${defaultCodexCliVersion(platform, arch)} first on PATH.`;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/** For refusal messages: the admitted releases on this host, or every host when it has none. */
|
|
125
|
-
export function describeQualifiedCodexCliVersions(platform = process.platform, arch = process.arch) {
|
|
126
|
-
const host = codexHost(platform, arch);
|
|
127
|
-
if (host !== undefined)
|
|
128
|
-
return `${HOST_LABELS[host]} accepts Codex CLI ${describeHost(host)}`;
|
|
129
|
-
return Object.keys(HOST_LABELS)
|
|
130
|
-
.map((key) => `${HOST_LABELS[key]}: ${describeHost(key)}`)
|
|
131
|
-
.join("; ");
|
|
132
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { CuaActorLabResult } from "../../routes/computer-use/types.js";
|
|
2
|
-
import type { ScriptedBrowserLabResult } from "../../routes/scripted/types.js";
|
|
3
|
-
import type { TerminalProductLabResult } from "../../routes/terminal/types.js";
|
|
4
|
-
import type { ConcurrentSharedWorldLabResult } from "../../routes/shared-world/types.js";
|
|
5
|
-
export declare function formatConcurrentSharedWorldLabHuman(result: ConcurrentSharedWorldLabResult): string;
|
|
6
|
-
export declare function formatTerminalLabHuman(result: TerminalProductLabResult): string;
|
|
7
|
-
export declare function formatScriptedLabHuman(result: ScriptedBrowserLabResult): string;
|
|
8
|
-
export declare function formatCuaLabHuman(result: CuaActorLabResult): string;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { type InternalRunLabOptions, type LabOutcome } from "../../run-lab.js";
|
|
2
|
-
import type { LabConfig } from "../../lab/types.js";
|
|
3
|
-
import type { LoadedAdapterScorer } from "./lab-scorer.js";
|
|
4
|
-
export interface RouteRun {
|
|
5
|
-
readonly options: InternalRunLabOptions;
|
|
6
|
-
present(outcome: LabOutcome): Promise<void>;
|
|
7
|
-
/** Handles an error runLab threw, and rethrows any it does not handle. */
|
|
8
|
-
onRunError?(error: unknown): Promise<void>;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Plans the lab with a route's options, then presents the refusal or the run. `beforeRun` runs
|
|
12
|
-
* only for a plan that will run: it loads the scorer, or writes its own refusal and returns
|
|
13
|
-
* undefined, so a refused lab never imports the scorer's host code. `afterRun` runs once runLab
|
|
14
|
-
* has returned or thrown, before presentation, which may hold its own signal handlers (watch's
|
|
15
|
-
* Observer and tunnel).
|
|
16
|
-
*/
|
|
17
|
-
export declare function runRoute(config: LabConfig, run: RouteRun, beforeRun?: () => Promise<{
|
|
18
|
-
scorer?: LoadedAdapterScorer;
|
|
19
|
-
} | undefined>, afterRun?: () => void): Promise<void>;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import type { LabConfig } from "../../lab/types.js";
|
|
3
|
-
import { type CliIo, type LabCommandOptions } from "../io.js";
|
|
4
|
-
import type { RouteRun } from "./lab-route-run.js";
|
|
5
|
-
interface ScriptedRouteArgs {
|
|
6
|
-
command: Command;
|
|
7
|
-
io: CliIo;
|
|
8
|
-
config: LabConfig;
|
|
9
|
-
mode: "run" | "watch";
|
|
10
|
-
options: LabCommandOptions;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* The scripted route's CLI setup: its open semantics and runLab options, and how it presents the
|
|
14
|
-
* outcome. Undefined when watch-mode setup has already written its own result.
|
|
15
|
-
*/
|
|
16
|
-
export declare function scriptedRouteRun(args: ScriptedRouteArgs): RouteRun | undefined;
|
|
17
|
-
export {};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import type { LabConfig } from "../../lab/types.js";
|
|
3
|
-
import { type CliIo, type LabCommandOptions } from "../io.js";
|
|
4
|
-
import type { RouteRun } from "./lab-route-run.js";
|
|
5
|
-
interface TerminalRouteArgs {
|
|
6
|
-
command: Command;
|
|
7
|
-
io: CliIo;
|
|
8
|
-
config: LabConfig;
|
|
9
|
-
mode: "run" | "watch";
|
|
10
|
-
options: LabCommandOptions;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* The terminal route's CLI setup: its open semantics and runLab options, and how it presents the
|
|
14
|
-
* outcome. Undefined when watch-mode setup has already written its own result.
|
|
15
|
-
*/
|
|
16
|
-
export declare function terminalRouteRun(args: TerminalRouteArgs): RouteRun | undefined;
|
|
17
|
-
export {};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import { type CliIo, type LabCommandOptions } from "../io.js";
|
|
3
|
-
export declare function runLabCommand(args: {
|
|
4
|
-
command: Command;
|
|
5
|
-
io: CliIo;
|
|
6
|
-
lab: string;
|
|
7
|
-
mode: "run" | "watch";
|
|
8
|
-
options: LabCommandOptions;
|
|
9
|
-
}): Promise<void>;
|
package/dist/cli/commands/lab.js
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { formatAutomaticAnalysisBudget } from "../../analysis/automatic-config.js";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { Command, Option } from "commander";
|
|
4
|
-
import { inspectLabManifest, listLabManifests } from "../../lab/discover.js";
|
|
5
|
-
import { runLabPreflight, } from "../../lab/preflight.js";
|
|
6
|
-
import { runLabCommand } from "./lab-run.js";
|
|
7
|
-
import { countOption, participantsOption } from "../renamed-options.js";
|
|
8
|
-
import { applyEnvFileOption, JSON_OPTION_DESCRIPTION, parsePositiveInteger, writeResult, } from "../io.js";
|
|
9
|
-
export function registerLabCommands(parent, io) {
|
|
10
|
-
const lab = parent
|
|
11
|
-
.command("lab")
|
|
12
|
-
.description("List, inspect, and run humanish lab manifests.")
|
|
13
|
-
.summary("List, inspect, and run humanish lab manifests.");
|
|
14
|
-
lab
|
|
15
|
-
.command("list")
|
|
16
|
-
.description("List committed and ignored humanish lab manifests.")
|
|
17
|
-
.option("--cwd <path>", "Target project directory.", ".")
|
|
18
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
19
|
-
.action((options, command) => handleLabList(io, options, command));
|
|
20
|
-
lab
|
|
21
|
-
.command("inspect")
|
|
22
|
-
.argument("<lab>", "Lab id or .yaml path.")
|
|
23
|
-
.description("Inspect a humanish lab manifest without running it.")
|
|
24
|
-
.option("--cwd <path>", "Target project directory.", ".")
|
|
25
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
26
|
-
.action((labName, options, command) => handleLabInspect(io, labName, options, command));
|
|
27
|
-
lab
|
|
28
|
-
.command("preflight")
|
|
29
|
-
.argument("<lab>", "Lab id or .yaml path.")
|
|
30
|
-
.description("Check lab metadata or explicitly probe reachability. Metadata mode does not verify setup; use doctor --lab <lab> first.")
|
|
31
|
-
.option("--cwd <path>", "Target project directory.", ".")
|
|
32
|
-
.addOption(new Option("--reachability <mode>", "Reachability mode.")
|
|
33
|
-
.choices(["metadata", "public-preview", "sandbox-loopback", "prepared-host"])
|
|
34
|
-
.default("metadata"))
|
|
35
|
-
.option("--timeout-ms <ms>", "Target reachability timeout.", String(30_000))
|
|
36
|
-
.option("--env-file <path>", "Load a local env file for this preflight without persisting values.")
|
|
37
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
38
|
-
.action((labName, options, command) => handleLabPreflight(io, labName, options, command));
|
|
39
|
-
lab
|
|
40
|
-
.command("run")
|
|
41
|
-
.argument("<lab>", "Lab id or .yaml path.")
|
|
42
|
-
.description("Run a humanish lab manifest. Same as `humanish run <lab>`, grouped under `lab`.")
|
|
43
|
-
.option("--env-file <path>", "Load a local env file for this lab without persisting values.")
|
|
44
|
-
.option("--dry-run", "Render contract evidence without live provider spend.")
|
|
45
|
-
.option("--open", "Open the observer in the default browser.")
|
|
46
|
-
.option("--no-open", "Render without opening a browser.")
|
|
47
|
-
.option("--detach", "Render/open once and exit without attached watch server.")
|
|
48
|
-
.option("--port <port>", "Local observer server port when following.", "0")
|
|
49
|
-
.option("--count <count>", "Override the participant count of a preview or computer-use lab.")
|
|
50
|
-
// The older spelling of --count, hidden and noted on stderr (renamed-options.ts).
|
|
51
|
-
.addOption(new Option("--sims <count>").hideHelp())
|
|
52
|
-
.option("--rerun-failed-from <run>", "CUA fan-out only: create a new run for failed participants from a prior run.")
|
|
53
|
-
.option("--participants <ids>", "CUA rerun only: comma-separated participant ids from the source run. Ids are the lab's declared actors[0].lanes[].id, or lane-01, lane-02, … by position.")
|
|
54
|
-
// The older spelling of --participants, hidden and noted on stderr (renamed-options.ts).
|
|
55
|
-
.addOption(new Option("--lanes <participant-ids>").hideHelp())
|
|
56
|
-
.option("--run-id <id>", "Explicit lab run id; refused when that run already exists.")
|
|
57
|
-
.option("--cwd <path>", "Target project directory.", ".")
|
|
58
|
-
.option("--scorer <path>", "Terminal/computer-use/shared-world labs only: repo-relative adopter scorer module (.mjs). Overrides review.scorer.ref. Executable code: review it as code.")
|
|
59
|
-
.option("--json", JSON_OPTION_DESCRIPTION)
|
|
60
|
-
.addHelpText("after", [
|
|
61
|
-
"",
|
|
62
|
-
"Examples:",
|
|
63
|
-
" humanish lab run first-run",
|
|
64
|
-
" humanish lab run fanout-demo --rerun-failed-from latest --participants lane-02,lane-04",
|
|
65
|
-
" humanish lab run my-terminal-lab --scorer scorers/product.mjs",
|
|
66
|
-
" humanish lab run .humanish/labs/private-dogfood.yaml --env-file .humanish/local/provider.env",
|
|
67
|
-
"",
|
|
68
|
-
"Human watch path:",
|
|
69
|
-
" humanish watch first-run",
|
|
70
|
-
" humanish watch --lab .humanish/labs/local.yaml",
|
|
71
|
-
].join("\n"))
|
|
72
|
-
.action((labName, options, command) => handleLabRun(io, labName, options, command));
|
|
73
|
-
}
|
|
74
|
-
async function handleLabList(io, options, command) {
|
|
75
|
-
const result = await listLabManifests(options.cwd);
|
|
76
|
-
writeResult(command, io, result, formatLabListHuman);
|
|
77
|
-
io.setExitCode(0);
|
|
78
|
-
}
|
|
79
|
-
async function handleLabInspect(io, labName, options, command) {
|
|
80
|
-
const result = await inspectLabManifest(options.cwd, labName);
|
|
81
|
-
writeResult(command, io, result, formatLabInspectHuman);
|
|
82
|
-
io.setExitCode(result.ok ? 0 : 2);
|
|
83
|
-
}
|
|
84
|
-
async function handleLabPreflight(io, labName, options, command) {
|
|
85
|
-
if (!(await applyEnvFileOption({
|
|
86
|
-
command,
|
|
87
|
-
cwd: options.cwd,
|
|
88
|
-
envFile: options.envFile,
|
|
89
|
-
io,
|
|
90
|
-
}))) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const timeoutMs = parsePositiveInteger(options.timeoutMs);
|
|
94
|
-
if (timeoutMs === null) {
|
|
95
|
-
const result = {
|
|
96
|
-
schema: "humanish.lab-preflight-result.v1",
|
|
97
|
-
ok: false,
|
|
98
|
-
cwd: resolve(options.cwd),
|
|
99
|
-
lab: labName,
|
|
100
|
-
reachability: options.reachability,
|
|
101
|
-
checks: [{ name: "timeout", ok: false, message: "--timeout-ms must be a positive integer." }],
|
|
102
|
-
targets: [],
|
|
103
|
-
sandbox: { created: false },
|
|
104
|
-
spend: { e2bDesktop: false, model: false },
|
|
105
|
-
warnings: [],
|
|
106
|
-
error: {
|
|
107
|
-
code: "HUMANISH_LAB_PREFLIGHT_INVALID_OPTION",
|
|
108
|
-
message: "--timeout-ms must be a positive integer.",
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
writeResult(command, io, result, formatLabPreflightHuman);
|
|
112
|
-
io.setExitCode(2);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
const result = await runLabPreflight({
|
|
116
|
-
cwd: options.cwd,
|
|
117
|
-
lab: labName,
|
|
118
|
-
reachability: options.reachability,
|
|
119
|
-
timeoutMs,
|
|
120
|
-
});
|
|
121
|
-
writeResult(command, io, result, formatLabPreflightHuman);
|
|
122
|
-
io.setExitCode(result.ok ? 0 : 2);
|
|
123
|
-
}
|
|
124
|
-
async function handleLabRun(io, labName, options, command) {
|
|
125
|
-
const count = countOption(io, options);
|
|
126
|
-
const participants = participantsOption(io, options);
|
|
127
|
-
if (!(await applyEnvFileOption({
|
|
128
|
-
command,
|
|
129
|
-
cwd: options.cwd,
|
|
130
|
-
envFile: options.envFile,
|
|
131
|
-
io,
|
|
132
|
-
// runLabCommand discovers keys once the lab resolves to a live run.
|
|
133
|
-
discoverKeys: false,
|
|
134
|
-
}))) {
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
await runLabCommand({
|
|
138
|
-
command,
|
|
139
|
-
io,
|
|
140
|
-
lab: labName,
|
|
141
|
-
mode: "run",
|
|
142
|
-
options: { ...options, count, participants },
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
function formatLabListHuman(result) {
|
|
146
|
-
if (result.labs.length === 0) {
|
|
147
|
-
return ([
|
|
148
|
-
`No humanish labs found in ${result.cwd}`,
|
|
149
|
-
"Create one under humanish/labs/*.yaml, .humanish/labs/*.yaml, or pass a .yaml path.",
|
|
150
|
-
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
151
|
-
].join("\n") + "\n");
|
|
152
|
-
}
|
|
153
|
-
return ([
|
|
154
|
-
"humanish labs",
|
|
155
|
-
...result.labs.map((lab) => `- ${lab.id} ${lab.source} ${lab.origin} ${lab.path}${lab.title ? ` (${lab.title})` : ""}`),
|
|
156
|
-
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
157
|
-
].join("\n") + "\n");
|
|
158
|
-
}
|
|
159
|
-
function formatLabInspectHuman(result) {
|
|
160
|
-
if (!result.ok || !result.config) {
|
|
161
|
-
return `${result.error?.code}: ${result.error?.message}\n`;
|
|
162
|
-
}
|
|
163
|
-
const config = result.config;
|
|
164
|
-
return ([
|
|
165
|
-
"humanish lab",
|
|
166
|
-
`id: ${config.id}`,
|
|
167
|
-
`subject: ${config.subject.source}`,
|
|
168
|
-
...(config.execution?.target ? [`execution: ${config.execution.target}`] : []),
|
|
169
|
-
`actors: ${config.actors.map((actor) => actor.type).join(", ")}`,
|
|
170
|
-
...(config.title ? [`title: ${config.title}`] : []),
|
|
171
|
-
...(config.description ? [`description: ${config.description}`] : []),
|
|
172
|
-
...(result.path ? [`path: ${result.path}`] : []),
|
|
173
|
-
...(result.origin ? [`origin: ${result.origin}`] : []),
|
|
174
|
-
...(config.subject.repos?.length ? [`repos: ${config.subject.repos.join(", ")}`] : []),
|
|
175
|
-
...(result.personas ?? []).map((persona) => `persona ${persona.id}: ${persona.brief ? `authored context (before runtime additions)\n${persona.brief.text}` : "unresolved; id only"}`),
|
|
176
|
-
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
177
|
-
].join("\n") + "\n");
|
|
178
|
-
}
|
|
179
|
-
function formatLabPreflightHuman(result) {
|
|
180
|
-
const checkedTargets = result.targets.filter((target) => target.checked);
|
|
181
|
-
const reachableTargets = checkedTargets.filter((target) => target.reachable === true);
|
|
182
|
-
const blockedTargets = result.targets.filter((target) => target.status === "blocked");
|
|
183
|
-
return ([
|
|
184
|
-
`humanish lab preflight ${result.ok ? "passed" : "failed"}`,
|
|
185
|
-
`lab: ${result.labId ?? result.lab}`,
|
|
186
|
-
...(result.route ? [`route: ${result.route}`] : []),
|
|
187
|
-
`reachability: ${result.reachability}`,
|
|
188
|
-
`targets: ${checkedTargets.length ? `${reachableTargets.length}/${checkedTargets.length} reachable` : `${result.targets.length} declared, not checked`}`,
|
|
189
|
-
...(blockedTargets.length ? [`blocked-targets: ${blockedTargets.length}`] : []),
|
|
190
|
-
`spend: ${result.spend.e2bDesktop ? "one e2b desktop, no model calls" : "none"}`,
|
|
191
|
-
...(result.analysis ? [formatAutomaticAnalysisBudget(result.analysis)] : []),
|
|
192
|
-
...(result.sandbox.created
|
|
193
|
-
? [`sandbox: created=yes killed=${result.sandbox.killed === true ? "yes" : "no"}`]
|
|
194
|
-
: []),
|
|
195
|
-
...result.checks.map((check) => `- ${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`),
|
|
196
|
-
...(result.error ? [`error: ${result.error.code}: ${result.error.message}`] : []),
|
|
197
|
-
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
198
|
-
].join("\n") + "\n");
|
|
199
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { CliIo } from "./io.js";
|
|
2
|
-
/** `--participants`, or `--lanes` when only the older spelling is set. */
|
|
3
|
-
export declare function participantsOption(io: CliIo, options: {
|
|
4
|
-
participants?: string | undefined;
|
|
5
|
-
lanes?: string | undefined;
|
|
6
|
-
}): string | undefined;
|
|
7
|
-
/** `--count`, or `--sims` when only the older spelling is set. */
|
|
8
|
-
export declare function countOption(io: CliIo, options: {
|
|
9
|
-
count?: string | undefined;
|
|
10
|
-
sims?: string | undefined;
|
|
11
|
-
}): string | undefined;
|