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,27 +1,27 @@
|
|
|
1
1
|
// The state and env channels of a served subject (clone or local-tree): `subject.envValues`,
|
|
2
2
|
// the structural parse of `subject.state`, and subjectStateInvalidReason, the semantic check
|
|
3
|
-
//
|
|
3
|
+
// parseStudy and the computer-use route share.
|
|
4
4
|
import { containsSensitive } from "../../evidence/redaction.js";
|
|
5
5
|
import { ENV_NAME_PATTERN, invalid, posInt, str, strList } from "./values.js";
|
|
6
6
|
import { isRecord } from "../../run/type-guards.js";
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
* URL, a transport selector, a feature flag
|
|
8
|
+
* Literal non-secret subject env. Real apps need configuration before they will boot: a public base
|
|
9
|
+
* URL, a transport selector, a feature flag, and none of that is secret. Routing it through
|
|
10
10
|
* `subject.env` would force an adopter to carry a private env file just to reproduce a public study.
|
|
11
11
|
*
|
|
12
|
-
* These values
|
|
12
|
+
* These values are recorded in evidence (they are part of how the subject was configured), so a
|
|
13
13
|
* value that looks like a credential is refused here rather than committed to a public repo.
|
|
14
14
|
*/
|
|
15
15
|
export function parseEnvValues(raw) {
|
|
16
16
|
if (raw === undefined)
|
|
17
17
|
return { ok: true };
|
|
18
18
|
if (!isRecord(raw)) {
|
|
19
|
-
return invalid("`subject.envValues` must
|
|
19
|
+
return invalid("`subject.envValues` must map environment variable names to literal values that are not secret.");
|
|
20
20
|
}
|
|
21
21
|
const envValues = {};
|
|
22
22
|
for (const [name, rawValue] of Object.entries(raw)) {
|
|
23
23
|
if (!ENV_NAME_PATTERN.test(name)) {
|
|
24
|
-
return invalid(`subject.envValues keys must be
|
|
24
|
+
return invalid(`subject.envValues keys must be environment variable names like NEXT_PUBLIC_APP_URL, and "${name}" is not one.`);
|
|
25
25
|
}
|
|
26
26
|
const value = typeof rawValue === "number" || typeof rawValue === "boolean"
|
|
27
27
|
? String(rawValue)
|
|
@@ -30,19 +30,19 @@ export function parseEnvValues(raw) {
|
|
|
30
30
|
return invalid(`\`subject.envValues.${name}\` must be a string, number, or boolean.`);
|
|
31
31
|
}
|
|
32
32
|
// Reuse the redaction module's own detector rather than inventing a second opinion about what
|
|
33
|
-
// a secret looks like
|
|
33
|
+
// a secret looks like; the two must never disagree about the same string.
|
|
34
34
|
if (containsSensitive(value)) {
|
|
35
|
-
return invalid(`\`subject.envValues.${name}\` looks like a secret or a local path, and
|
|
35
|
+
return invalid(`\`subject.envValues.${name}\` looks like a secret or a local path, and envValues are committed with the study and recorded in evidence. List the name in \`subject.env\` instead: its value then comes from your environment and is never stored.`);
|
|
36
36
|
}
|
|
37
37
|
envValues[name] = value;
|
|
38
38
|
}
|
|
39
39
|
return { ok: true, value: envValues };
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
|
-
* Structural parse of `subject.state` into a candidate
|
|
42
|
+
* Structural parse of `subject.state` into a candidate StudySubjectState. Deliberately keeps
|
|
43
43
|
* unrecognized `when`/`timeoutMs` values in the candidate (instead of silently dropping
|
|
44
|
-
* them) so subjectStateInvalidReason rejects them
|
|
45
|
-
* less than it says would
|
|
44
|
+
* them) so subjectStateInvalidReason rejects them: a state declaration that silently does
|
|
45
|
+
* less than it says would claim more than its mechanism does.
|
|
46
46
|
*/
|
|
47
47
|
export function parseState(raw) {
|
|
48
48
|
if (raw === undefined) {
|
|
@@ -68,7 +68,7 @@ export function parseState(raw) {
|
|
|
68
68
|
if (raw.external !== undefined) {
|
|
69
69
|
const external = strList(raw.external);
|
|
70
70
|
if (!external) {
|
|
71
|
-
return invalid("`subject.state.external` must be a non-empty list of
|
|
71
|
+
return invalid("`subject.state.external` must be a non-empty list of environment variable names when it is set.");
|
|
72
72
|
}
|
|
73
73
|
state.external = external;
|
|
74
74
|
}
|
|
@@ -79,7 +79,7 @@ export function parseState(raw) {
|
|
|
79
79
|
state.checkpoint = raw.checkpoint.map((probe) => ({
|
|
80
80
|
name: typeof probe.name === "string" ? probe.name.trim() : "",
|
|
81
81
|
command: typeof probe.command === "string" ? probe.command.trim() : "",
|
|
82
|
-
// Preserve the redact list verbatim (literal secret values may contain commas, so do
|
|
82
|
+
// Preserve the redact list verbatim (literal secret values may contain commas, so do not
|
|
83
83
|
// run it through the comma-splitting strList); subjectStateInvalidReason validates the shape.
|
|
84
84
|
...(probe.redact === undefined ? {} : { redact: probe.redact }),
|
|
85
85
|
}));
|
|
@@ -87,7 +87,7 @@ export function parseState(raw) {
|
|
|
87
87
|
return { ok: true, value: state };
|
|
88
88
|
}
|
|
89
89
|
// The step name interpolates into in-sandbox script/status/log paths (`subject-state-<name>`);
|
|
90
|
-
// the
|
|
90
|
+
// so the shape is strict, exactly like the repo slug.
|
|
91
91
|
const STATE_STEP_NAME_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
92
92
|
const STATE_STEP_NAME_MAX_CHARS = 40;
|
|
93
93
|
const STATE_STEP_WHENS = [
|
|
@@ -96,10 +96,10 @@ const STATE_STEP_WHENS = [
|
|
|
96
96
|
"after-ready",
|
|
97
97
|
];
|
|
98
98
|
/**
|
|
99
|
-
* Semantic validation for `subject.state`, shared by
|
|
100
|
-
* (
|
|
99
|
+
* Semantic validation for `subject.state`, shared by parseStudy and the engine
|
|
100
|
+
* (the route re-enforces it on configs that arrive through runStudyWith). Returns
|
|
101
101
|
* the failure message, or null when the declaration is valid. Reads the candidate
|
|
102
|
-
* defensively
|
|
102
|
+
* defensively: library callers can hand the engine arbitrarily-shaped objects.
|
|
103
103
|
*/
|
|
104
104
|
export function subjectStateInvalidReason(state, env) {
|
|
105
105
|
const seed = state.seed;
|
|
@@ -140,11 +140,11 @@ export function subjectStateInvalidReason(state, env) {
|
|
|
140
140
|
}
|
|
141
141
|
if (external !== undefined) {
|
|
142
142
|
if (!Array.isArray(external) || external.length === 0) {
|
|
143
|
-
return "`subject.state.external` must be a non-empty list of
|
|
143
|
+
return "`subject.state.external` must be a non-empty list of environment variable names when it is set.";
|
|
144
144
|
}
|
|
145
145
|
for (const name of external) {
|
|
146
146
|
if (typeof name !== "string" || !ENV_NAME_PATTERN.test(name)) {
|
|
147
|
-
return "subject.state.external entries must be
|
|
147
|
+
return "subject.state.external entries must be environment variable names like DATABASE_URL. Their values come from your environment and are never stored.";
|
|
148
148
|
}
|
|
149
149
|
if (!env?.includes(name)) {
|
|
150
150
|
return "subject.state.external names must also be declared in subject.env (the declaration must name a provisioned channel).";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyParseFailure, StudySubject } from "../types.js";
|
|
2
2
|
export declare function parseSubject(raw: unknown): {
|
|
3
3
|
ok: true;
|
|
4
|
-
value:
|
|
5
|
-
} |
|
|
4
|
+
value: StudySubject;
|
|
5
|
+
} | StudyParseFailure;
|
|
6
6
|
export declare const PUBLIC_TARGET_OWNER_PATTERN: RegExp;
|
|
7
7
|
export declare function isLoopbackUrl(value: string): boolean;
|
|
8
8
|
/** A well-formed http(s) URL (any host). Shape gate before the loopback/public-target policy. */
|
|
@@ -4,7 +4,7 @@ import { parseEnvValues, parseState, subjectStateInvalidReason } from "./subject
|
|
|
4
4
|
import { isRecord } from "../../run/type-guards.js";
|
|
5
5
|
export function parseSubject(raw) {
|
|
6
6
|
if (!isRecord(raw)) {
|
|
7
|
-
return invalid("
|
|
7
|
+
return invalid("`subject` is required and must be an object.");
|
|
8
8
|
}
|
|
9
9
|
const source = str(raw.source);
|
|
10
10
|
if (source !== "this-repo" &&
|
|
@@ -17,9 +17,9 @@ export function parseSubject(raw) {
|
|
|
17
17
|
return invalid("`subject.source` must be one of: this-repo, clone, app-url, local-app, terminal-product, desktop-cli, local-tree.");
|
|
18
18
|
}
|
|
19
19
|
const subject = { source };
|
|
20
|
-
// topology is enum-validated everywhere; its
|
|
20
|
+
// topology is enum-validated everywhere; its semantics (shared-world requires clone × e2b-desktop
|
|
21
21
|
// × a ≥2 roster) are enforced in the shared-world cross-validation below, and a set-but-unconsumed
|
|
22
|
-
// topology warns as inert off the shared-world route
|
|
22
|
+
// topology warns as inert off the shared-world route.
|
|
23
23
|
if (raw.topology !== undefined) {
|
|
24
24
|
const topology = str(raw.topology);
|
|
25
25
|
if (topology !== "per-lane-worlds" && topology !== "shared-world") {
|
|
@@ -27,12 +27,12 @@ export function parseSubject(raw) {
|
|
|
27
27
|
}
|
|
28
28
|
subject.topology = topology;
|
|
29
29
|
}
|
|
30
|
-
// exposure is enum-validated everywhere; it is
|
|
30
|
+
// exposure is enum-validated everywhere; it is required on the concurrent shared-world route (the
|
|
31
31
|
// getHost synthetic-subject attestation) and warns inert elsewhere.
|
|
32
32
|
if (raw.exposure !== undefined) {
|
|
33
33
|
const exposure = str(raw.exposure);
|
|
34
34
|
if (exposure !== "synthetic") {
|
|
35
|
-
return invalid("`subject.exposure` must be `synthetic
|
|
35
|
+
return invalid("`subject.exposure` must be `synthetic`: your statement that the subject served on a public sandbox URL holds only synthetic seeded data.");
|
|
36
36
|
}
|
|
37
37
|
subject.exposure = exposure;
|
|
38
38
|
}
|
|
@@ -57,51 +57,51 @@ export function parseSubject(raw) {
|
|
|
57
57
|
}
|
|
58
58
|
/** The first field set on a source it cannot act on, in the order parseSubject has always checked. */
|
|
59
59
|
function misplacedFieldFailure(source, raw) {
|
|
60
|
-
// `product` is terminal-product-only; reject it elsewhere
|
|
61
|
-
//
|
|
60
|
+
// `product` is terminal-product-only; reject it elsewhere. A field that cannot act on this
|
|
61
|
+
// route is a parse error and is never silently dropped.
|
|
62
62
|
if (source !== "terminal-product" && source !== "desktop-cli" && raw.product !== undefined) {
|
|
63
63
|
return invalid("`subject.product` applies only to terminal-product and desktop-cli subjects (the CLI a participant studies from public surfaces).");
|
|
64
64
|
}
|
|
65
|
-
// appUrl is app-url/local-app-only; a terminal-product subject drives
|
|
66
|
-
// single loopback app
|
|
65
|
+
// appUrl is app-url/local-app-only; a terminal-product subject drives public surfaces instead of a
|
|
66
|
+
// single loopback app, so reject appUrl on it.
|
|
67
67
|
if (source === "terminal-product" && raw.appUrl !== undefined) {
|
|
68
|
-
return invalid("`subject.appUrl` does not apply to terminal-product
|
|
68
|
+
return invalid("`subject.appUrl` does not apply to a terminal-product subject: its agent works from the product's public pages. List them in `subject.product.publicSurfaces` instead.");
|
|
69
69
|
}
|
|
70
70
|
// serve/env/state are shared between clone (cloned app) and local-tree (packed working
|
|
71
71
|
// tree): both routes serve a subject in-sandbox with the same install/build/start/url +
|
|
72
72
|
// env-name + seed/external/checkpoint shapes.
|
|
73
73
|
if (source !== "clone" && source !== "local-tree" && raw.serve !== undefined) {
|
|
74
|
-
return invalid("`subject.serve` applies only to clone subjects or local-tree subjects (
|
|
74
|
+
return invalid("`subject.serve` applies only to clone subjects or local-tree subjects (humanish serves the cloned or packed app in the sandbox).");
|
|
75
75
|
}
|
|
76
76
|
if (source !== "clone" && source !== "local-tree" && raw.env !== undefined) {
|
|
77
77
|
return invalid("`subject.env` applies only to clone subjects or local-tree subjects (the served app's environment channel).");
|
|
78
78
|
}
|
|
79
79
|
if (source !== "clone" && source !== "local-tree" && raw.state !== undefined) {
|
|
80
|
-
return invalid("`subject.state` applies only to clone subjects or local-tree subjects (
|
|
80
|
+
return invalid("`subject.state` applies only to clone subjects or local-tree subjects (humanish seeds the state it serves).");
|
|
81
81
|
}
|
|
82
|
-
// repos/clone are clone-
|
|
82
|
+
// repos/clone are clone-only (a fresh-clone subject's git inputs). local-tree packs the
|
|
83
83
|
// resolution cwd itself, so it has no repo slug to clone and gets its own precise reasons
|
|
84
84
|
// rather than falling through to the generic clone-only message below.
|
|
85
85
|
if (source === "local-tree" && raw.repos !== undefined) {
|
|
86
|
-
return invalid("`subject.repos` does not apply to local-tree subjects. The local-tree route packs the
|
|
86
|
+
return invalid("`subject.repos` does not apply to local-tree subjects. The local-tree route packs the study's working directory itself; there is no owner/repo slug to clone.");
|
|
87
87
|
}
|
|
88
88
|
if (source === "local-tree" && raw.clone !== undefined) {
|
|
89
89
|
return invalid("`subject.clone` does not apply to local-tree subjects. Declare `subject.localTree` instead (keep/exclude/maxArchiveBytes).");
|
|
90
90
|
}
|
|
91
91
|
// Rejected, never silently dropped, on app-url/local-app/this-repo/terminal-product subjects
|
|
92
|
-
// too
|
|
92
|
+
// too: a field that cannot act on this route is a parse error.
|
|
93
93
|
if (source !== "clone" && raw.repos !== undefined) {
|
|
94
94
|
return invalid("`subject.repos` applies only to clone subjects (the owner/repo slugs to clone).");
|
|
95
95
|
}
|
|
96
96
|
if (source !== "clone" && raw.clone !== undefined) {
|
|
97
97
|
return invalid("`subject.clone` applies only to clone subjects (clone depth/fanout/keep).");
|
|
98
98
|
}
|
|
99
|
-
// localTree is local-tree-
|
|
99
|
+
// localTree is local-tree-only (pack/upload knobs for the packed working tree).
|
|
100
100
|
if (source !== "local-tree" && raw.localTree !== undefined) {
|
|
101
101
|
return invalid("`subject.localTree` applies only to local-tree subjects (keep/exclude/maxArchiveBytes for packing the working tree).");
|
|
102
102
|
}
|
|
103
|
-
// publicTarget is app-url-
|
|
104
|
-
// meaningless without a real public deployment as the plane
|
|
103
|
+
// publicTarget is app-url-only (the external-public shared-world ownership attestation). It is
|
|
104
|
+
// meaningless without a real public deployment as the plane, so reject it elsewhere.
|
|
105
105
|
if (source !== "app-url" && raw.publicTarget !== undefined) {
|
|
106
106
|
return invalid("`subject.publicTarget` applies only to app-url subjects on the external-public shared-world route (the operator's ownership attestation for a real public deployment used directly as the shared plane).");
|
|
107
107
|
}
|
|
@@ -125,8 +125,8 @@ function parseCloneSubject(raw, subject) {
|
|
|
125
125
|
}
|
|
126
126
|
function parseLocalTreeSubject(raw, subject) {
|
|
127
127
|
// A local-tree subject exists to be packed and served; there is no other way to boot it, so
|
|
128
|
-
// serve is
|
|
129
|
-
//
|
|
128
|
+
// serve is required here. Clone subjects get the same requirement from each route's checks in
|
|
129
|
+
// parseStudy.
|
|
130
130
|
if (raw.serve === undefined) {
|
|
131
131
|
return invalid("`subject.serve` is required when source is local-tree: a local-tree subject exists to be packed and served, so declare install/build/start/url exactly like the clone route.");
|
|
132
132
|
}
|
|
@@ -157,11 +157,11 @@ function parseServedApp(raw, subject) {
|
|
|
157
157
|
if (raw.env !== undefined) {
|
|
158
158
|
const env = strList(raw.env);
|
|
159
159
|
if (!env || env.length === 0) {
|
|
160
|
-
return invalid("`subject.env` must be a non-empty list of
|
|
160
|
+
return invalid("`subject.env` must be a non-empty list of environment variable names when it is set.");
|
|
161
161
|
}
|
|
162
162
|
const badName = env.find((name) => !ENV_NAME_PATTERN.test(name));
|
|
163
163
|
if (badName) {
|
|
164
|
-
return invalid(`subject.env entries must be
|
|
164
|
+
return invalid(`subject.env entries must be environment variable names like DATABASE_URL, and "${badName}" is not one. Their values come from your environment and are never stored.`);
|
|
165
165
|
}
|
|
166
166
|
subject.env = env;
|
|
167
167
|
}
|
|
@@ -175,7 +175,7 @@ function parseServedApp(raw, subject) {
|
|
|
175
175
|
return stateResult;
|
|
176
176
|
}
|
|
177
177
|
if (stateResult.value) {
|
|
178
|
-
// Semantic validation is shared with the engine (
|
|
178
|
+
// Semantic validation is shared with the engine (runCuaActorStudy re-enforces it for
|
|
179
179
|
// configs that arrive through the library API without the parser).
|
|
180
180
|
const reason = subjectStateInvalidReason(stateResult.value, subject.env);
|
|
181
181
|
if (reason) {
|
|
@@ -192,11 +192,11 @@ function parseAppSubject(raw, source, subject) {
|
|
|
192
192
|
}
|
|
193
193
|
// app-url: shape-only here; the loopback-vs-public-target gate is applied in the
|
|
194
194
|
// cross-validation block below, where policies.allowPublicTargets is available.
|
|
195
|
-
// local-app: an in-process local dev server
|
|
195
|
+
// local-app: an in-process local dev server, always loopback (no public-target option),
|
|
196
196
|
// so the loopback wall is enforced right here at parse.
|
|
197
197
|
if (source === "local-app") {
|
|
198
198
|
if (!isLoopbackUrl(appUrl)) {
|
|
199
|
-
return invalid("`subject.appUrl` must be a loopback URL (127.0.0.1
|
|
199
|
+
return invalid("`subject.appUrl` must be a loopback URL (127.0.0.1 or localhost) on a local-app subject: humanish drives your running dev server from this process, so it cannot reach a public URL.");
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
else if (!isHttpUrl(appUrl)) {
|
|
@@ -204,7 +204,7 @@ function parseAppSubject(raw, source, subject) {
|
|
|
204
204
|
}
|
|
205
205
|
subject.appUrl = appUrl;
|
|
206
206
|
// publicTarget (external-public shared-world ownership attestation) is app-url-only. Shape it
|
|
207
|
-
// here; its
|
|
207
|
+
// here; its required-on-that-route semantics live in externalPublicSharedWorldValidationReason.
|
|
208
208
|
if (source === "app-url" && raw.publicTarget !== undefined) {
|
|
209
209
|
const publicTargetResult = parsePublicTarget(raw.publicTarget);
|
|
210
210
|
if (!publicTargetResult.ok) {
|
|
@@ -226,22 +226,22 @@ function parseProductSubject(raw, subject) {
|
|
|
226
226
|
// "example-operator/lobby-trivia" or a bare org name). Slash allowed for the owner/repo convention.
|
|
227
227
|
export const PUBLIC_TARGET_OWNER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_./-]*$/;
|
|
228
228
|
/** Parse the external-public shared-world ownership attestation ({ owner, authorized: true }). The
|
|
229
|
-
* harness cannot verify ownership
|
|
229
|
+
* harness cannot verify ownership: this is author-trust, and the evidence class says so. */
|
|
230
230
|
function parsePublicTarget(raw) {
|
|
231
231
|
if (!isRecord(raw)) {
|
|
232
|
-
return invalid("`subject.publicTarget` must be an object
|
|
232
|
+
return invalid("`subject.publicTarget` must be an object, `{ owner, authorized: true }`, declaring that you own or operate the public deployment.");
|
|
233
233
|
}
|
|
234
234
|
const owner = str(raw.owner);
|
|
235
235
|
if (!owner || !PUBLIC_TARGET_OWNER_PATTERN.test(owner)) {
|
|
236
236
|
return invalid("`subject.publicTarget.owner` must be a public-safe operator/repo label (e.g. owner/repo); it is recorded in evidence, so it must carry no secret.");
|
|
237
237
|
}
|
|
238
238
|
if (raw.authorized !== true) {
|
|
239
|
-
return invalid("`subject.publicTarget.authorized` must be true
|
|
239
|
+
return invalid("`subject.publicTarget.authorized` must be true to declare that you own or operate the public deployment. humanish cannot check ownership, so the study states it.");
|
|
240
240
|
}
|
|
241
241
|
return { ok: true, value: { owner, authorized: true } };
|
|
242
242
|
}
|
|
243
243
|
// The product name interpolates into evidence labels and the composed prompt; the public-safe
|
|
244
|
-
// token shape is the same
|
|
244
|
+
// token shape is the same strict constraint as a study id.
|
|
245
245
|
const PRODUCT_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
|
|
246
246
|
function parseProduct(raw) {
|
|
247
247
|
if (!isRecord(raw)) {
|
|
@@ -263,7 +263,7 @@ function parseProduct(raw) {
|
|
|
263
263
|
if (upload.startsWith("/") ||
|
|
264
264
|
/^[A-Za-z]:/.test(upload) ||
|
|
265
265
|
upload.split(/[\\/]/).includes("..")) {
|
|
266
|
-
return invalid("`subject.product.upload` must stay inside the project
|
|
266
|
+
return invalid("`subject.product.upload` must stay inside the project: use a relative path with no `..` segments.");
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
const install = str(raw.install);
|
|
@@ -289,7 +289,7 @@ function parseProduct(raw) {
|
|
|
289
289
|
},
|
|
290
290
|
};
|
|
291
291
|
}
|
|
292
|
-
// Public-safe stance: a computer-use actor's
|
|
292
|
+
// Public-safe stance: a computer-use actor's entry URL is always an app the study owner runs on
|
|
293
293
|
// loopback (inside the sandbox), never an arbitrary public site. (The constraint binds the
|
|
294
294
|
// entry point; a navigation watchdog for mid-session escapes is a later slice.) Exported so
|
|
295
295
|
// the engine re-enforces the same boundary on configs that arrive through the library API.
|
|
@@ -330,7 +330,7 @@ function parseServe(raw) {
|
|
|
330
330
|
}
|
|
331
331
|
const url = str(raw.url);
|
|
332
332
|
if (!url || !isLoopbackUrl(url)) {
|
|
333
|
-
return invalid("`subject.serve.url` must be a loopback http(s) URL (127.0.0.1 or localhost)
|
|
333
|
+
return invalid("`subject.serve.url` must be a loopback http(s) URL (127.0.0.1 or localhost), because the app runs inside the sandbox.");
|
|
334
334
|
}
|
|
335
335
|
const serve = { start, url };
|
|
336
336
|
const install = str(raw.install);
|
|
@@ -368,7 +368,7 @@ function parseClone(raw) {
|
|
|
368
368
|
/**
|
|
369
369
|
* Structural parse of `subject.localTree`, mirroring parseClone. Unlike parseClone (which
|
|
370
370
|
* silently drops an out-of-range depth/fanout), an invalid exclude/maxArchiveBytes value is
|
|
371
|
-
*
|
|
371
|
+
* rejected, never silently dropped: a caller who typed an empty exclude entry or a non-positive
|
|
372
372
|
* maxArchiveBytes almost certainly meant something, and the archive-size cap is a safety knob,
|
|
373
373
|
* not a cosmetic default.
|
|
374
374
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyParseFailure } from "../types.js";
|
|
2
2
|
export declare const REPO_SLUG_PATTERN: RegExp;
|
|
3
3
|
export declare const ENV_NAME_PATTERN: RegExp;
|
|
4
|
-
export declare function invalid(message: string):
|
|
4
|
+
export declare function invalid(message: string): StudyParseFailure;
|
|
5
5
|
export declare function str(value: unknown): string | undefined;
|
|
6
6
|
export declare function optionalStr(key: string, value: unknown): Record<string, string>;
|
|
7
7
|
export declare function strList(value: unknown): string[] | undefined;
|
|
@@ -11,6 +11,6 @@ export declare function strList(value: unknown): string[] | undefined;
|
|
|
11
11
|
*/
|
|
12
12
|
export declare function readPositiveInt(value: string | undefined, fallback: number): number;
|
|
13
13
|
export declare function posInt(value: unknown): number | undefined;
|
|
14
|
-
/** A non-negative finite number (0 allowed
|
|
14
|
+
/** A non-negative finite number (0 allowed; caps default to 0 = no-spend). Accepts a numeric
|
|
15
15
|
* string too, since YAML scalars can arrive as strings. */
|
|
16
16
|
export declare function nonNegNumber(value: unknown): number | undefined;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// The slug interpolates into an in-sandbox shell command
|
|
1
|
+
// The slug interpolates into an in-sandbox shell command, so its shape is strict.
|
|
2
2
|
export const REPO_SLUG_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
3
3
|
export const ENV_NAME_PATTERN = /^[A-Z][A-Z0-9_]*$/;
|
|
4
4
|
export function invalid(message) {
|
|
5
|
-
return { ok: false, error: { code: "
|
|
5
|
+
return { ok: false, error: { code: "HUMANISH_STUDY_INVALID", message } };
|
|
6
6
|
}
|
|
7
7
|
export function str(value) {
|
|
8
8
|
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
@@ -48,7 +48,7 @@ export function posInt(value) {
|
|
|
48
48
|
}
|
|
49
49
|
return undefined;
|
|
50
50
|
}
|
|
51
|
-
/** A non-negative finite number (0 allowed
|
|
51
|
+
/** A non-negative finite number (0 allowed; caps default to 0 = no-spend). Accepts a numeric
|
|
52
52
|
* string too, since YAML scalars can arrive as strings. */
|
|
53
53
|
export function nonNegNumber(value) {
|
|
54
54
|
if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type ResolvedPersona } from "./persona.js";
|
|
2
2
|
import { type PreparedSelectedOutputDirectory } from "../run/contained-output.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { StudyActor } from "./types.js";
|
|
4
4
|
/** Title-case an id for the fallback display name (`skeptical-power-user` -> `Skeptical Power User`). */
|
|
5
5
|
export declare function personaTitleFromId(personaId: string): string;
|
|
6
6
|
/**
|
|
7
|
-
* Resolve
|
|
7
|
+
* Resolve one persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
|
|
8
8
|
* Returns `null` with a warning when the id is unsafe or no file exists. Invalid rich backgrounds
|
|
9
9
|
* reject the study before execution.
|
|
10
10
|
*/
|
|
@@ -14,7 +14,7 @@ export declare function resolveCommittedPersona(projectRoot: PreparedSelectedOut
|
|
|
14
14
|
}>;
|
|
15
15
|
/**
|
|
16
16
|
* Resolve every distinct persona id a run will use, once, before participant specs are built. Returning a
|
|
17
|
-
* map keeps the plan builder
|
|
17
|
+
* map keeps the plan builder pure (it is exported npm surface and asserted pure by tests): the
|
|
18
18
|
* async file reads happen here, and the composer only does a lookup.
|
|
19
19
|
*/
|
|
20
20
|
export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOutputDirectory, personaIds: readonly (string | undefined)[]): Promise<{
|
|
@@ -22,16 +22,16 @@ export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOu
|
|
|
22
22
|
warnings: string[];
|
|
23
23
|
}>;
|
|
24
24
|
/**
|
|
25
|
-
* Every persona id a
|
|
25
|
+
* Every persona id a study config could put on a browser participant: the roster when one is
|
|
26
26
|
* declared, otherwise the actor-level persona that every fan-out participant inherits.
|
|
27
27
|
*/
|
|
28
|
-
export declare function
|
|
29
|
-
actors?: readonly Pick<
|
|
28
|
+
export declare function studyPersonaIds(config: {
|
|
29
|
+
actors?: readonly Pick<StudyActor, "persona" | "lanes">[];
|
|
30
30
|
}): string[];
|
|
31
31
|
/**
|
|
32
32
|
* Same resolution from a plain cwd, for the labs that carry a directory string rather than an
|
|
33
|
-
* already-prepared root. Realpath-then-prepare mirrors the
|
|
34
|
-
* personas from the physical project.
|
|
33
|
+
* already-prepared root. Realpath-then-prepare mirrors the computer-use route so a symlinked cwd
|
|
34
|
+
* still reads personas from the physical project.
|
|
35
35
|
*/
|
|
36
36
|
export declare function resolveCommittedPersonasForCwd(cwd: string, personaIds: readonly (string | undefined)[]): Promise<{
|
|
37
37
|
personas: Map<string, ResolvedPersona>;
|
|
@@ -22,7 +22,7 @@ const PERSONA_DIRECTORIES = [
|
|
|
22
22
|
path.posix.join(".humanish", "local", "personas"),
|
|
23
23
|
];
|
|
24
24
|
/**
|
|
25
|
-
* Resolve
|
|
25
|
+
* Resolve one persona from `humanish/personas/`, then the ignored `.humanish/local/personas/`.
|
|
26
26
|
* Returns `null` with a warning when the id is unsafe or no file exists. Invalid rich backgrounds
|
|
27
27
|
* reject the study before execution.
|
|
28
28
|
*/
|
|
@@ -66,7 +66,7 @@ export async function resolveCommittedPersona(projectRoot, personaId) {
|
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Resolve every distinct persona id a run will use, once, before participant specs are built. Returning a
|
|
69
|
-
* map keeps the plan builder
|
|
69
|
+
* map keeps the plan builder pure (it is exported npm surface and asserted pure by tests): the
|
|
70
70
|
* async file reads happen here, and the composer only does a lookup.
|
|
71
71
|
*/
|
|
72
72
|
export async function resolveCommittedPersonas(projectRoot, personaIds) {
|
|
@@ -81,10 +81,10 @@ export async function resolveCommittedPersonas(projectRoot, personaIds) {
|
|
|
81
81
|
return { personas, warnings };
|
|
82
82
|
}
|
|
83
83
|
/**
|
|
84
|
-
* Every persona id a
|
|
84
|
+
* Every persona id a study config could put on a browser participant: the roster when one is
|
|
85
85
|
* declared, otherwise the actor-level persona that every fan-out participant inherits.
|
|
86
86
|
*/
|
|
87
|
-
export function
|
|
87
|
+
export function studyPersonaIds(config) {
|
|
88
88
|
const ids = [];
|
|
89
89
|
for (const actor of config.actors ?? []) {
|
|
90
90
|
if (actor.persona)
|
|
@@ -98,8 +98,8 @@ export function labPersonaIds(config) {
|
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
100
|
* Same resolution from a plain cwd, for the labs that carry a directory string rather than an
|
|
101
|
-
* already-prepared root. Realpath-then-prepare mirrors the
|
|
102
|
-
* personas from the physical project.
|
|
101
|
+
* already-prepared root. Realpath-then-prepare mirrors the computer-use route so a symlinked cwd
|
|
102
|
+
* still reads personas from the physical project.
|
|
103
103
|
*/
|
|
104
104
|
export async function resolveCommittedPersonasForCwd(cwd, personaIds) {
|
|
105
105
|
try {
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import type { Brain, ComputerUsePlan, NonEmpty, PlannedAnalysis, ProvisionedSubject, Requirement } from "./plan-types.js";
|
|
2
|
-
import type {
|
|
2
|
+
import type { StudyConfig } from "./types.js";
|
|
3
3
|
export type Base = Omit<ComputerUsePlan, "route" | "actor" | "runner" | "concurrency" | "sessionBudgetMs" | "sandboxMs" | "caps" | "rerun">;
|
|
4
4
|
export declare function isNonEmpty<T>(values: readonly T[]): values is NonEmpty<T>;
|
|
5
|
-
export declare function capsOf(config:
|
|
6
|
-
export declare function provisionedSubject(config:
|
|
5
|
+
export declare function capsOf(config: StudyConfig): ComputerUsePlan["caps"];
|
|
6
|
+
export declare function provisionedSubject(config: StudyConfig): ProvisionedSubject | undefined;
|
|
7
7
|
/** Keys, env and local tools a live run checks right before it acquires anything. */
|
|
8
|
-
export declare function desktopRequirements(config:
|
|
8
|
+
export declare function desktopRequirements(config: StudyConfig, args: {
|
|
9
9
|
e2b: boolean;
|
|
10
10
|
brain: Brain;
|
|
11
11
|
localVm: boolean;
|
|
12
12
|
externalCatch: boolean;
|
|
13
13
|
}): Requirement[];
|
|
14
|
-
export declare function brainOf(config:
|
|
14
|
+
export declare function brainOf(config: StudyConfig, callerProvider: boolean): Brain;
|
|
15
15
|
/** The brain of a run whose provider the library caller supplies. */
|
|
16
|
-
export declare function callerBrainOf(config:
|
|
16
|
+
export declare function callerBrainOf(config: StudyConfig): Extract<Brain, {
|
|
17
17
|
kind: "caller";
|
|
18
18
|
}>;
|
|
19
19
|
/** The model a participant's spend is priced at when its provider reports none. */
|
|
20
20
|
export declare function pricedModel(brain: Brain): string;
|
|
21
21
|
/** The fields every plan shares, from a config whose analysis already resolved. */
|
|
22
|
-
export declare function planBase(config:
|
|
22
|
+
export declare function planBase(config: StudyConfig, input: {
|
|
23
23
|
readonly dryRun: boolean;
|
|
24
24
|
readonly analysis?: {
|
|
25
25
|
readonly config?: PlannedAnalysis["config"] | undefined;
|
|
@@ -110,7 +110,7 @@ export function pricedModel(brain) {
|
|
|
110
110
|
export function planBase(config, input) {
|
|
111
111
|
const analysis = input.analysis?.config;
|
|
112
112
|
return {
|
|
113
|
-
|
|
113
|
+
studyId: config.id,
|
|
114
114
|
...(config.title === undefined ? {} : { title: config.title }),
|
|
115
115
|
residual: residualOf(config),
|
|
116
116
|
dryRun: input.dryRun,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { DwellWindow, StopWhen } from "../actors/stop-conditions.js";
|
|
2
2
|
import type { ReasoningEffort } from "../actors/reasoning-effort.js";
|
|
3
3
|
import { type DevicePreset } from "./device-presets.js";
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
4
|
+
import type { StudyTask } from "./tasks.js";
|
|
5
|
+
import type { StudyConfig } from "./types.js";
|
|
6
6
|
/** Who one participant is. Every route with participants carries this record. */
|
|
7
7
|
export interface Participant {
|
|
8
8
|
/** Declared roster id, else `lane-NN` (independent participants) or `role-NN` (shared-world participants). */
|
|
@@ -40,18 +40,18 @@ interface DesktopParticipant extends Participant {
|
|
|
40
40
|
}
|
|
41
41
|
/** Only independent computer-use participants consume a task protocol and their own target. */
|
|
42
42
|
export interface ComputerUseParticipant extends DesktopParticipant {
|
|
43
|
-
readonly tasks?: readonly
|
|
43
|
+
readonly tasks?: readonly StudyTask[];
|
|
44
44
|
/** app-url fan-out only: this participant's own entry URL; absent means the subject URL. */
|
|
45
45
|
readonly targetUrl?: string;
|
|
46
46
|
}
|
|
47
|
-
/** A
|
|
47
|
+
/** A participant on a provisioned plane: an optional same-origin path under `serve.url`. */
|
|
48
48
|
export interface ProvisionedParticipant extends DesktopParticipant {
|
|
49
49
|
readonly entry?: string;
|
|
50
50
|
readonly host?: never;
|
|
51
51
|
readonly tasks?: never;
|
|
52
52
|
readonly targetUrl?: never;
|
|
53
53
|
}
|
|
54
|
-
/** A
|
|
54
|
+
/** A participant on an external public plane: exactly one participant hosts the shared session. */
|
|
55
55
|
export interface ExternalPublicParticipant extends DesktopParticipant {
|
|
56
56
|
readonly host: boolean;
|
|
57
57
|
readonly entry?: never;
|
|
@@ -68,14 +68,14 @@ export type SharedWorldRoster = {
|
|
|
68
68
|
/** One shared-world participant on either plane. */
|
|
69
69
|
export type SharedWorldParticipant = ProvisionedParticipant | ExternalPublicParticipant;
|
|
70
70
|
/**
|
|
71
|
-
* The participants of a computer-use
|
|
71
|
+
* The participants of a computer-use study: the declared roster, else `count` identical ones. A count
|
|
72
72
|
* override (`--count`) applies only when no roster is declared.
|
|
73
73
|
*/
|
|
74
|
-
export declare function computerUseParticipants(config:
|
|
75
|
-
/** The participants of a shared-world
|
|
76
|
-
export declare function sharedWorldParticipants(config:
|
|
77
|
-
/** The ids of the participants a computer-use or shared-world
|
|
78
|
-
export declare function declaredParticipantIds(config:
|
|
74
|
+
export declare function computerUseParticipants(config: StudyConfig, countOverride?: number): ComputerUseParticipant[];
|
|
75
|
+
/** The participants of a shared-world study, one per roster entry, typed by the plane they share. */
|
|
76
|
+
export declare function sharedWorldParticipants(config: StudyConfig): SharedWorldRoster;
|
|
77
|
+
/** The ids of the participants a computer-use or shared-world study runs, in roster order. */
|
|
78
|
+
export declare function declaredParticipantIds(config: StudyConfig): string[];
|
|
79
79
|
/** The entry URLs roster entries declare in place of the subject URL (computer use, app-url). */
|
|
80
|
-
export declare function declaredTargets(config:
|
|
80
|
+
export declare function declaredTargets(config: StudyConfig): string[];
|
|
81
81
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Who takes part in a
|
|
1
|
+
// Who takes part in a study: one record per participant, built from the declared roster or a count.
|
|
2
2
|
// Computer-use and shared-world participants share the desktop fields; each kind adds its own.
|
|
3
3
|
import { resolveParticipantDevice } from "./device-presets.js";
|
|
4
4
|
import { isSharedWorldComposition, participantIdAt } from "./routing.js";
|
|
@@ -35,7 +35,7 @@ function desktopParticipant(config, entry, index, kind, focus) {
|
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* The participants of a computer-use
|
|
38
|
+
* The participants of a computer-use study: the declared roster, else `count` identical ones. A count
|
|
39
39
|
* override (`--count`) applies only when no roster is declared.
|
|
40
40
|
*/
|
|
41
41
|
export function computerUseParticipants(config, countOverride) {
|
|
@@ -52,7 +52,7 @@ export function computerUseParticipants(config, countOverride) {
|
|
|
52
52
|
};
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
|
-
/** The participants of a shared-world
|
|
55
|
+
/** The participants of a shared-world study, one per roster entry, typed by the plane they share. */
|
|
56
56
|
export function sharedWorldParticipants(config) {
|
|
57
57
|
const roster = rosterOf(config.actors[0]) ?? [];
|
|
58
58
|
const participantAt = (entry, index) => desktopParticipant(config, entry, index, "seat", entry.instruction);
|
|
@@ -73,7 +73,7 @@ export function sharedWorldParticipants(config) {
|
|
|
73
73
|
})),
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
|
-
/** The ids of the participants a computer-use or shared-world
|
|
76
|
+
/** The ids of the participants a computer-use or shared-world study runs, in roster order. */
|
|
77
77
|
export function declaredParticipantIds(config) {
|
|
78
78
|
const actor = config.actors[0];
|
|
79
79
|
const roster = rosterOf(actor);
|