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,12 +1,12 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { isLocalBrowserStudy } from "../substrates/local/runtime-config.js";
|
|
3
3
|
import { localRuntimeStatus } from "../substrates/local/runtime.js";
|
|
4
4
|
import { keyNamesOf, requiredKeys, requiredSubjectEnv } from "./requirements.js";
|
|
5
5
|
import { protocolAdditionsWarning, protocolIncompatibilityMessage, } from "../actors/codex/protocol-compat.js";
|
|
6
6
|
import { automaticAnalysisBudget } from "../analysis/automatic-config.js";
|
|
7
7
|
import { externalCatchHealthy } from "../comms/sandbox-catch.js";
|
|
8
8
|
import { receivingRequiredKey } from "../comms/setup.js";
|
|
9
|
-
import { classifyCodexInstallation, codexInstallAdvice, codexVersionRecovery, } from "../actors/codex/
|
|
9
|
+
import { classifyCodexInstallation, codexInstallAdvice, codexVersionRecovery, } from "../actors/codex/codex-admission.js";
|
|
10
10
|
/** A ready row's message, with the schema values the launch recorded. */
|
|
11
11
|
function readyMessage(message, readiness) {
|
|
12
12
|
const additions = protocolAdditionsWarning(readiness.cliVersion, readiness.protocolAdditions);
|
|
@@ -40,7 +40,7 @@ async function codexAccountReadiness(env) {
|
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
42
|
* The hosted participant check: the operator-auth launch to an ephemeral thread, with no turn,
|
|
43
|
-
* using the
|
|
43
|
+
* using the study's declared model and reasoning effort as a run would.
|
|
44
44
|
*/
|
|
45
45
|
async function hostedCodexReadiness(env, actor) {
|
|
46
46
|
const { checkRestrictedCodexParticipantReadiness } = await import("../actors/codex/restricted-participant.js");
|
|
@@ -110,31 +110,44 @@ export async function localCodexParticipantCheck(args) {
|
|
|
110
110
|
name: "local participant authentication",
|
|
111
111
|
ok: readiness.ready,
|
|
112
112
|
message: readiness.ready
|
|
113
|
-
? readyMessage("
|
|
113
|
+
? readyMessage("Codex CLI and ChatGPT login are ready for restricted local browser participants. No E2B or model API key is required; inference is remote, and model access and account quota remain untested.", readiness)
|
|
114
114
|
: `Local Codex participant setup is unavailable (${readiness.errorCode}). ${codexRecovery(readiness, "Install the supported Codex CLI version and sign in with a ChatGPT account.")} No API fallback is used.`,
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* The discovery and planning functions doctor's study checks use, loaded on first use as
|
|
119
|
+
* studySetupChecks always loaded them, so they stay out of this module's static imports.
|
|
120
|
+
*/
|
|
121
|
+
async function studyLoaders() {
|
|
122
|
+
const discover = await import("./discover.js");
|
|
123
|
+
const plan = await import("./plan.js");
|
|
124
|
+
return {
|
|
125
|
+
listStudies: discover.listStudyManifests,
|
|
126
|
+
resolveStudy: discover.resolveStudyManifest,
|
|
127
|
+
resolveDryRun: plan.resolveStudyDryRun,
|
|
128
|
+
routeOf: plan.routeOf,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
117
131
|
/**
|
|
118
132
|
* Setup checks only: no model turn, browser or desktop creation. CLI startup may use the network.
|
|
119
|
-
* `keys` are the keys a live run requires. `reads` are the provider keys the
|
|
120
|
-
* required or not; it is undefined when that is unknown: the
|
|
133
|
+
* `keys` are the keys a live run requires. `reads` are the provider keys the study is known to read,
|
|
134
|
+
* required or not; it is undefined when that is unknown: the study does not plan, or a declared
|
|
121
135
|
* scorer's host code may read any key.
|
|
122
136
|
*/
|
|
123
|
-
export async function
|
|
124
|
-
const {
|
|
125
|
-
const
|
|
126
|
-
const resolved = await resolveLabManifest(args.cwd, args.lab);
|
|
137
|
+
export async function studySetupChecks(args) {
|
|
138
|
+
const { resolveStudy, resolveDryRun, routeOf } = await studyLoaders();
|
|
139
|
+
const resolved = await resolveStudy(args.cwd, args.study);
|
|
127
140
|
if (!resolved.ok)
|
|
128
141
|
return {
|
|
129
142
|
desktop: false,
|
|
130
143
|
keys: [],
|
|
131
|
-
checks: [{ name: "
|
|
144
|
+
checks: [{ name: "study", ok: false, message: resolved.error.message }],
|
|
132
145
|
};
|
|
133
146
|
const config = resolved.config, route = routeOf(config);
|
|
134
|
-
const dryRun =
|
|
147
|
+
const dryRun = resolveDryRun(config, undefined, true) === true;
|
|
135
148
|
const checks = [
|
|
136
149
|
{
|
|
137
|
-
name: "
|
|
150
|
+
name: "study route",
|
|
138
151
|
ok: true,
|
|
139
152
|
message: `${config.id}: ${config.actors[0]?.type ?? "synthetic"} / ${route} / ${dryRun ? "dry-run (no live participant)" : "live"}`,
|
|
140
153
|
},
|
|
@@ -159,7 +172,7 @@ export async function labSetupChecks(args) {
|
|
|
159
172
|
const keys = requiredKeys(requirements, args.keyPresent);
|
|
160
173
|
// This flag controls the hosted desktop SDK check as well as its API key.
|
|
161
174
|
const desktop = keys.includes("E2B_API_KEY");
|
|
162
|
-
const local =
|
|
175
|
+
const local = isLocalBrowserStudy(config);
|
|
163
176
|
// One account check, shared by the local participant row and the Codex analysis row.
|
|
164
177
|
let accountReadiness;
|
|
165
178
|
const checkAccount = () => (accountReadiness ??= (args.codexAnalysisReadiness ?? codexAccountReadiness)(args.env).catch(() => ({ ready: false, errorCode: "codex_unavailable" })));
|
|
@@ -298,19 +311,21 @@ async function analysisCheck(analysis, args, checkAccount) {
|
|
|
298
311
|
? "Use Linux x64 or the Apple Silicon Mac with a supported Codex CLI, or explicitly select provider: openai with an API key."
|
|
299
312
|
: readiness.errorCode === "codex_busy"
|
|
300
313
|
? "Another restricted Codex analyst or setup check is active in this process. Wait for it to finish, then retry."
|
|
301
|
-
: codexRecovery(readiness, "Install the
|
|
314
|
+
: codexRecovery(readiness, "Install the Codex CLI and sign in with a ChatGPT account.");
|
|
302
315
|
return {
|
|
303
316
|
name: "post-run analysis",
|
|
304
317
|
ok: readiness.ready,
|
|
305
318
|
message: readiness.ready
|
|
306
|
-
? readyMessage("
|
|
319
|
+
? readyMessage("Codex CLI and ChatGPT account login are ready for a separate restricted analyst. Analysis sends selected evidence to remote inference; model access and account allowance remain untested. Dollar cost and output-token ceilings are unavailable.", readiness)
|
|
307
320
|
: `Codex account analysis is unavailable (${readiness.errorCode ?? "codex_unavailable"}). ${recovery} No API fallback is used; participant readiness is independent.`,
|
|
308
321
|
};
|
|
309
322
|
}
|
|
323
|
+
const keyed = args.keyPresent("OPENAI_API_KEY");
|
|
310
324
|
return {
|
|
311
325
|
name: "post-run analysis",
|
|
312
326
|
ok: true,
|
|
313
|
-
|
|
327
|
+
...(keyed ? {} : { status: "note" }),
|
|
328
|
+
message: keyed
|
|
314
329
|
? `OPENAI_API_KEY is present for the separate automatic analysis request; model access and quota are not tested. The analysis is refused before it starts if its estimate is over $${analysis.maxCostUsd}; this is not a billing cap. Participant readiness is independent.`
|
|
315
330
|
: "Will be skipped: OPENAI_API_KEY is missing. The participant may run, but there will be no automatic findings report. Add an OpenAI API key or set review.analysis: false deliberately.",
|
|
316
331
|
};
|
|
@@ -326,16 +341,39 @@ function checkScope(analysis) {
|
|
|
326
341
|
};
|
|
327
342
|
}
|
|
328
343
|
/**
|
|
329
|
-
* The
|
|
344
|
+
* The ids of the project's labs that need each provider key for a live run, from the same plan
|
|
345
|
+
* `doctor --study` reads. Each listed manifest resolves by its path, since a file name need not match
|
|
346
|
+
* the id inside. A study that runs dry, that the plain CLI cannot run, or that does not plan needs
|
|
347
|
+
* none.
|
|
348
|
+
*/
|
|
349
|
+
export async function studiesByRequiredKey(cwd, keyPresent) {
|
|
350
|
+
const { listStudies, resolveStudy, resolveDryRun, routeOf } = await studyLoaders();
|
|
351
|
+
const users = new Map();
|
|
352
|
+
for (const entry of (await listStudies(cwd)).studies) {
|
|
353
|
+
const resolved = await resolveStudy(cwd, entry.path);
|
|
354
|
+
if (!resolved.ok || resolveDryRun(resolved.config, undefined, true) === true)
|
|
355
|
+
continue;
|
|
356
|
+
if (unsupportedCliRoute(resolved.config, routeOf(resolved.config)))
|
|
357
|
+
continue;
|
|
358
|
+
const planned = await planCliRun(resolved.config, cwd);
|
|
359
|
+
if (!planned.ok)
|
|
360
|
+
continue;
|
|
361
|
+
for (const key of requiredKeys(planned.planned.plan.requirements, keyPresent))
|
|
362
|
+
users.set(key, (users.get(key) ?? new Set()).add(entry.id));
|
|
363
|
+
}
|
|
364
|
+
return new Map([...users].map(([key, ids]) => [key, [...ids]]));
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* The study planned with no run options, so its own scenario mode decides dry or live. Doctor and the
|
|
330
368
|
* TUI read a live run's keys and subject env from this plan's requirements.
|
|
331
369
|
*/
|
|
332
370
|
export async function planCliRun(config, cwd) {
|
|
333
|
-
return (await import("./plan.js")).
|
|
371
|
+
return (await import("./plan.js")).planStudy(config, { cwd });
|
|
334
372
|
}
|
|
335
373
|
function unsupportedCliRoute(config, route) {
|
|
336
374
|
if (config.subject.source === "local-app")
|
|
337
375
|
return "local-app needs a caller-supplied executor and provider through the library API; the plain CLI cannot run it.";
|
|
338
376
|
if (route === "preview")
|
|
339
|
-
return "This route only creates synthetic evidence. Use first-run in dry-run mode or a supported live
|
|
377
|
+
return "This route only creates synthetic evidence. Use first-run in dry-run mode or a supported live study.";
|
|
340
378
|
return undefined;
|
|
341
379
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Pair, type YAMLMap } from "yaml";
|
|
2
|
+
/** The value at `path`, or for a `[]` segment the values found in each item; undefined if none. */
|
|
3
|
+
export declare function readFieldPath(root: unknown, path: string): unknown;
|
|
4
|
+
/** Delete `path` from a parsed object. Returns whether anything was deleted. */
|
|
5
|
+
export declare function deletePlainFieldPath(root: unknown, path: string): boolean;
|
|
6
|
+
/** The index of `key`'s pair in a YAML mapping, or -1. */
|
|
7
|
+
export declare function pairIndex(map: YAMLMap, key: string): number;
|
|
8
|
+
/**
|
|
9
|
+
* Delete `path` from a YAML document's root mapping. Returns the deleted pairs, including the
|
|
10
|
+
* mappings a deletion left empty, so the caller can report their comments.
|
|
11
|
+
*/
|
|
12
|
+
export declare function deleteNodeFieldPath(root: unknown, path: string): Pair[];
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// Dotted field paths such as `execution.timeoutMs` or `actors[0].lanes[].entry`, read and deleted
|
|
2
|
+
// on a parsed object and on a YAML document node. The parsed participant list's key also matches
|
|
3
|
+
// a v2 `roster`, which the parser expands into that list. A mapping a deletion leaves empty is deleted with it.
|
|
4
|
+
import { isMap, isScalar, isSeq } from "yaml";
|
|
5
|
+
function segments(path) {
|
|
6
|
+
return path.split(".").map((part) => {
|
|
7
|
+
const match = /^([^[\]]+)(?:\[(\d*)\])?$/.exec(part);
|
|
8
|
+
if (!match)
|
|
9
|
+
throw new Error(`Unreadable field path: ${path}`);
|
|
10
|
+
const [, key, index] = match;
|
|
11
|
+
if (index === undefined)
|
|
12
|
+
return { key: key };
|
|
13
|
+
return { key: key, index: index === "" ? "all" : Number(index) };
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function isPlainRecord(value) {
|
|
17
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
18
|
+
}
|
|
19
|
+
// `lanes` names the participant list after parsing; a v2 file may spell it `roster`.
|
|
20
|
+
function plainKey(record, key) {
|
|
21
|
+
return key === "lanes" && !(key in record) && "roster" in record ? "roster" : key;
|
|
22
|
+
}
|
|
23
|
+
function itemsAt(list, index) {
|
|
24
|
+
if (index === "all")
|
|
25
|
+
return [...list];
|
|
26
|
+
const item = list[index];
|
|
27
|
+
return item === undefined ? [] : [item];
|
|
28
|
+
}
|
|
29
|
+
/** The value at `path`, or for a `[]` segment the values found in each item; undefined if none. */
|
|
30
|
+
export function readFieldPath(root, path) {
|
|
31
|
+
const read = (value, rest) => {
|
|
32
|
+
const [segment, ...tail] = rest;
|
|
33
|
+
if (segment === undefined)
|
|
34
|
+
return [value];
|
|
35
|
+
if (!isPlainRecord(value))
|
|
36
|
+
return [];
|
|
37
|
+
const child = value[plainKey(value, segment.key)];
|
|
38
|
+
if (child === undefined)
|
|
39
|
+
return [];
|
|
40
|
+
if (segment.index === undefined)
|
|
41
|
+
return read(child, tail);
|
|
42
|
+
if (!Array.isArray(child))
|
|
43
|
+
return [];
|
|
44
|
+
return itemsAt(child, segment.index).flatMap((item) => read(item, tail));
|
|
45
|
+
};
|
|
46
|
+
const parsed = segments(path);
|
|
47
|
+
const found = read(root, parsed);
|
|
48
|
+
if (found.length === 0)
|
|
49
|
+
return undefined;
|
|
50
|
+
return parsed.some((segment) => segment.index === "all") ? found : found[0];
|
|
51
|
+
}
|
|
52
|
+
/** Delete `path` from a parsed object. Returns whether anything was deleted. */
|
|
53
|
+
export function deletePlainFieldPath(root, path) {
|
|
54
|
+
const remove = (value, rest) => {
|
|
55
|
+
const [segment, ...tail] = rest;
|
|
56
|
+
if (segment === undefined || !isPlainRecord(value))
|
|
57
|
+
return false;
|
|
58
|
+
const key = plainKey(value, segment.key);
|
|
59
|
+
if (!(key in value))
|
|
60
|
+
return false;
|
|
61
|
+
const child = value[key];
|
|
62
|
+
let removed;
|
|
63
|
+
if (segment.index === undefined) {
|
|
64
|
+
if (tail.length === 0) {
|
|
65
|
+
delete value[key];
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
removed = remove(child, tail);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (!Array.isArray(child))
|
|
72
|
+
return false;
|
|
73
|
+
removed = itemsAt(child, segment.index).reduce((any, item) => remove(item, tail) || any, false);
|
|
74
|
+
}
|
|
75
|
+
if (removed && isPlainRecord(child) && Object.keys(child).length === 0)
|
|
76
|
+
delete value[key];
|
|
77
|
+
return removed;
|
|
78
|
+
};
|
|
79
|
+
return remove(root, segments(path));
|
|
80
|
+
}
|
|
81
|
+
function mapKey(map, key) {
|
|
82
|
+
const has = (name) => map.items.some((pair) => isScalar(pair.key) && pair.key.value === name);
|
|
83
|
+
return key === "lanes" && !has(key) && has("roster") ? "roster" : key;
|
|
84
|
+
}
|
|
85
|
+
/** The index of `key`'s pair in a YAML mapping, or -1. */
|
|
86
|
+
export function pairIndex(map, key) {
|
|
87
|
+
return map.items.findIndex((pair) => isScalar(pair.key) && pair.key.value === key);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Delete `path` from a YAML document's root mapping. Returns the deleted pairs, including the
|
|
91
|
+
* mappings a deletion left empty, so the caller can report their comments.
|
|
92
|
+
*/
|
|
93
|
+
export function deleteNodeFieldPath(root, path) {
|
|
94
|
+
const remove = (node, rest) => {
|
|
95
|
+
const [segment, ...tail] = rest;
|
|
96
|
+
if (segment === undefined || !isMap(node))
|
|
97
|
+
return [];
|
|
98
|
+
const index = pairIndex(node, mapKey(node, segment.key));
|
|
99
|
+
if (index < 0)
|
|
100
|
+
return [];
|
|
101
|
+
const pair = node.items[index];
|
|
102
|
+
let removed;
|
|
103
|
+
if (segment.index === undefined) {
|
|
104
|
+
if (tail.length === 0) {
|
|
105
|
+
// A mapping holds the comment above its first key; it goes with that key.
|
|
106
|
+
if (index === 0 && node.commentBefore && isScalar(pair.key)) {
|
|
107
|
+
pair.key.commentBefore = [node.commentBefore, pair.key.commentBefore]
|
|
108
|
+
.filter(Boolean)
|
|
109
|
+
.join("\n");
|
|
110
|
+
node.commentBefore = null;
|
|
111
|
+
}
|
|
112
|
+
return node.items.splice(index, 1);
|
|
113
|
+
}
|
|
114
|
+
removed = remove(pair.value, tail);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
if (!isSeq(pair.value))
|
|
118
|
+
return [];
|
|
119
|
+
removed = itemsAt(pair.value.items, segment.index).flatMap((item) => remove(item, tail));
|
|
120
|
+
}
|
|
121
|
+
if (removed.length > 0 && isMap(pair.value) && pair.value.items.length === 0)
|
|
122
|
+
removed.push(...node.items.splice(index, 1));
|
|
123
|
+
return removed;
|
|
124
|
+
};
|
|
125
|
+
return remove(root, segments(path));
|
|
126
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** One directory discovery reads study files from. */
|
|
2
|
+
export interface StudyDirectory {
|
|
3
|
+
readonly relativeDir: string;
|
|
4
|
+
/** `committed` is the project's own directory; `ignored` ones are gitignored overlays. */
|
|
5
|
+
readonly origin: "committed" | "ignored";
|
|
6
|
+
/** `labs` is the directory a `studies/` one replaces. */
|
|
7
|
+
readonly family: "studies" | "labs";
|
|
8
|
+
}
|
|
9
|
+
/** The six directories, in resolution order. */
|
|
10
|
+
export declare const STUDY_DIRECTORIES: readonly StudyDirectory[];
|
|
11
|
+
/** One path a study named by its stem can have. */
|
|
12
|
+
export interface StudyFileCandidate {
|
|
13
|
+
readonly relativePath: string;
|
|
14
|
+
readonly directory: StudyDirectory;
|
|
15
|
+
}
|
|
16
|
+
/** Every path a study with this stem can have, in resolution order. */
|
|
17
|
+
export declare function studyFileCandidates(stem: string): StudyFileCandidate[];
|
|
18
|
+
/** A file name's stem when it is a study file name, else undefined. */
|
|
19
|
+
export declare function studyFileStem(name: string): string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* The files that already use `stem` in any of the six directories, other than `except`, which is
|
|
22
|
+
* the file the writer is about to replace. `exists` reads through the writer's own contained
|
|
23
|
+
* filesystem checks. A writer skips or refuses when the result is not empty, so no write leaves
|
|
24
|
+
* two files for one study name.
|
|
25
|
+
*/
|
|
26
|
+
export declare function otherStudyFiles(stem: string, exists: (relativePath: string) => Promise<boolean>, except?: string): Promise<string[]>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Where study files live. Discovery reads the three studies/ directories, and looks in the three
|
|
2
|
+
// labs/ directories they replace only to refuse a file there with its fix. migrate reads all six.
|
|
3
|
+
// Every writer checks a name against all six before it writes, so a new file never shadows another
|
|
4
|
+
// study or takes the name migrate needs to move a labs/ file.
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
/** The six directories, in resolution order. */
|
|
7
|
+
export const STUDY_DIRECTORIES = [
|
|
8
|
+
{ relativeDir: path.join("humanish", "studies"), origin: "committed", family: "studies" },
|
|
9
|
+
{ relativeDir: path.join(".humanish", "studies"), origin: "ignored", family: "studies" },
|
|
10
|
+
{ relativeDir: path.join(".humanish", "local", "studies"), origin: "ignored", family: "studies" },
|
|
11
|
+
{ relativeDir: path.join("humanish", "labs"), origin: "committed", family: "labs" },
|
|
12
|
+
{ relativeDir: path.join(".humanish", "labs"), origin: "ignored", family: "labs" },
|
|
13
|
+
{ relativeDir: path.join(".humanish", "local", "labs"), origin: "ignored", family: "labs" },
|
|
14
|
+
];
|
|
15
|
+
/** A study file's extensions, `.yaml` first. */
|
|
16
|
+
const STUDY_EXTENSIONS = [".yaml", ".yml"];
|
|
17
|
+
/** Every path a study with this stem can have, in resolution order. */
|
|
18
|
+
export function studyFileCandidates(stem) {
|
|
19
|
+
return STUDY_DIRECTORIES.flatMap((directory) => STUDY_EXTENSIONS.map((extension) => ({
|
|
20
|
+
relativePath: path.join(directory.relativeDir, `${stem}${extension}`),
|
|
21
|
+
directory,
|
|
22
|
+
})));
|
|
23
|
+
}
|
|
24
|
+
/** A file name's stem when it is a study file name, else undefined. */
|
|
25
|
+
export function studyFileStem(name) {
|
|
26
|
+
const extension = STUDY_EXTENSIONS.find((candidate) => name.endsWith(candidate));
|
|
27
|
+
return extension === undefined ? undefined : name.slice(0, -extension.length);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The files that already use `stem` in any of the six directories, other than `except`, which is
|
|
31
|
+
* the file the writer is about to replace. `exists` reads through the writer's own contained
|
|
32
|
+
* filesystem checks. A writer skips or refuses when the result is not empty, so no write leaves
|
|
33
|
+
* two files for one study name.
|
|
34
|
+
*/
|
|
35
|
+
export async function otherStudyFiles(stem, exists, except) {
|
|
36
|
+
const found = [];
|
|
37
|
+
for (const candidate of studyFileCandidates(stem)) {
|
|
38
|
+
if (except !== undefined && path.normalize(candidate.relativePath) === path.normalize(except))
|
|
39
|
+
continue;
|
|
40
|
+
if (await exists(candidate.relativePath))
|
|
41
|
+
found.push(candidate.relativePath);
|
|
42
|
+
}
|
|
43
|
+
return found;
|
|
44
|
+
}
|
|
@@ -18,9 +18,9 @@ export declare const starterFiles: StarterFile[];
|
|
|
18
18
|
export declare const runtimeDirectories: RuntimeDirectory[];
|
|
19
19
|
export declare const humanishScripts: Record<string, string>;
|
|
20
20
|
/**
|
|
21
|
-
* The starter files, with the live
|
|
21
|
+
* The starter files, with the live study written for the brain this machine can use.
|
|
22
22
|
*
|
|
23
|
-
* `local-agent` is not a variant of the
|
|
23
|
+
* `local-agent` is not a variant of the study so much as a different participant: on a machine with
|
|
24
24
|
* a signed-in Codex and no provider key, the study runs with the operator's own agent and needs
|
|
25
25
|
* only E2B. Writing the other one there would hand someone homework instead of a first run.
|
|
26
26
|
*/
|