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,10 +1,10 @@
|
|
|
1
1
|
import { startDesktopMedia } from "../../guest/desktop-media.js";
|
|
2
2
|
import type { E2BDesktopSandbox } from "./sdk.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { StudyDesktopMedia } from "../../study/types.js";
|
|
4
4
|
/** The same worker and conversation contract, transported by the hosted SDK's stdin/stdout. */
|
|
5
5
|
export declare function startE2BDesktopMedia(options: {
|
|
6
6
|
desktop: E2BDesktopSandbox;
|
|
7
|
-
media:
|
|
7
|
+
media: StudyDesktopMedia;
|
|
8
8
|
signal: AbortSignal;
|
|
9
9
|
onTerminal(): void;
|
|
10
10
|
requestTimeoutMs: number;
|
|
@@ -22,8 +22,8 @@ export interface DesktopMediaEvidence {
|
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Put the declared camera feed in the sandbox and return the Chromium flags that present it as a
|
|
25
|
-
* capture device
|
|
25
|
+
* capture device. Fails closed: a feed that cannot be produced (no ffmpeg on the image, an
|
|
26
26
|
* unreadable host file) is named before the browser launches, because a participant told it has
|
|
27
27
|
* a camera and finds none reports the instrument's gap as the product's.
|
|
28
28
|
*/
|
|
29
|
-
export declare function prepareDesktopMedia(desktop: E2BDesktopSandbox, media:
|
|
29
|
+
export declare function prepareDesktopMedia(desktop: E2BDesktopSandbox, media: StudyDesktopMedia, permission: "prompt" | "granted", cwd: string, requestTimeoutMs: number, readHostFile?: (absolutePath: string) => Promise<Buffer>): Promise<DesktopMediaEvidence>;
|
|
@@ -91,7 +91,7 @@ const SANDBOX_CAMERA_PATH = `${SANDBOX_MEDIA_DIR}/camera.y4m`;
|
|
|
91
91
|
const SYNTHETIC_CAMERA_COMMAND = `mkdir -p ${SANDBOX_MEDIA_DIR} && ffmpeg -y -loglevel error -f lavfi -i testsrc=size=640x480:rate=10 -t 6 -pix_fmt yuv420p ${SANDBOX_CAMERA_PATH}`;
|
|
92
92
|
/**
|
|
93
93
|
* Put the declared camera feed in the sandbox and return the Chromium flags that present it as a
|
|
94
|
-
* capture device
|
|
94
|
+
* capture device. Fails closed: a feed that cannot be produced (no ffmpeg on the image, an
|
|
95
95
|
* unreadable host file) is named before the browser launches, because a participant told it has
|
|
96
96
|
* a camera and finds none reports the instrument's gap as the product's.
|
|
97
97
|
*/
|
|
@@ -4,12 +4,12 @@ export declare function desktopScreenshotCleanupFailures(desktop: object): numbe
|
|
|
4
4
|
/**
|
|
5
5
|
* @e2b/desktop 2.3.3 screenshot() awaits capture and files.read(path), then discards the
|
|
6
6
|
* files.remove(path) promise. A removal that races sandbox teardown can therefore crash Node
|
|
7
|
-
*
|
|
7
|
+
* after valid bytes were returned. Installed-SDK conformance tests pin that behavior.
|
|
8
8
|
*
|
|
9
|
-
* Observe only removal of a file successfully read within
|
|
9
|
+
* Observe only removal of a file successfully read within this screenshot invocation. The
|
|
10
10
|
* exact path comes from the SDK, not a guessed filename pattern. AsyncLocalStorage isolates
|
|
11
11
|
* concurrent screenshots and unrelated file operations without changing SDK method receivers.
|
|
12
|
-
* The
|
|
12
|
+
* The original removal promise is returned: an SDK version (or caller) that awaits it still
|
|
13
13
|
* receives the original rejection. No process-wide rejection handler or filesystem retry.
|
|
14
14
|
*/
|
|
15
15
|
export declare function protectDesktopScreenshotCleanup<T extends E2BDesktopSandbox>(desktop: T): T;
|
|
@@ -11,12 +11,12 @@ export function desktopScreenshotCleanupFailures(desktop) {
|
|
|
11
11
|
/**
|
|
12
12
|
* @e2b/desktop 2.3.3 screenshot() awaits capture and files.read(path), then discards the
|
|
13
13
|
* files.remove(path) promise. A removal that races sandbox teardown can therefore crash Node
|
|
14
|
-
*
|
|
14
|
+
* after valid bytes were returned. Installed-SDK conformance tests pin that behavior.
|
|
15
15
|
*
|
|
16
|
-
* Observe only removal of a file successfully read within
|
|
16
|
+
* Observe only removal of a file successfully read within this screenshot invocation. The
|
|
17
17
|
* exact path comes from the SDK, not a guessed filename pattern. AsyncLocalStorage isolates
|
|
18
18
|
* concurrent screenshots and unrelated file operations without changing SDK method receivers.
|
|
19
|
-
* The
|
|
19
|
+
* The original removal promise is returned: an SDK version (or caller) that awaits it still
|
|
20
20
|
* receives the original rejection. No process-wide rejection handler or filesystem retry.
|
|
21
21
|
*/
|
|
22
22
|
export function protectDesktopScreenshotCleanup(desktop) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// How long an E2B sandbox may live, and the budgets the desktop routes add to a participant's own
|
|
2
2
|
// deadline when they set a sandbox's server-side timeout. A dead host process can never orphan a
|
|
3
3
|
// sandbox past that timeout, so every route derives it from these values.
|
|
4
|
-
import { readPositiveInt } from "../../
|
|
4
|
+
import { readPositiveInt } from "../../study/parse/values.js";
|
|
5
5
|
/**
|
|
6
6
|
* E2B refuses a sandbox lifetime over one hour ("400: Timeout cannot be greater than 1 hours").
|
|
7
7
|
* A derived deadline has to stay under it, and saying so at plan time beats discovering it from a
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PreparedOutputRoot } from "../../run/contained-output.js";
|
|
2
2
|
import { type DesktopReleaseResult, type OwnedDesktopAllocation } from "../desktop-session.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
4
4
|
import { type E2BDesktopCreateOptions, type E2BDesktopModule, type E2BDesktopSandbox } from "./sdk.js";
|
|
5
5
|
/** Where an allocation's receipt goes: the run's prepared root, under a public-safe participant
|
|
6
6
|
* label. The receipt line saves it as `laneId`. */
|
|
@@ -66,9 +66,9 @@ export declare function destroyE2BSandbox(module: E2BDesktopModule, sandboxId: s
|
|
|
66
66
|
}): Promise<E2BSandboxDestroyOutcome>;
|
|
67
67
|
/** Versioned public template built by runtime/browser-media/e2b-template.mjs. */
|
|
68
68
|
export declare const E2B_SPEECH_TEMPLATE = "7409n13kr83f7g7abx5g";
|
|
69
|
-
/** The desktop template a
|
|
69
|
+
/** The desktop template a study asks for; undefined selects the SDK default. */
|
|
70
70
|
export declare function e2bDesktopTemplate(config: {
|
|
71
|
-
readonly execution?: Pick<NonNullable<
|
|
71
|
+
readonly execution?: Pick<NonNullable<StudyConfig["execution"]>, "target" | "desktop">;
|
|
72
72
|
}): string | undefined;
|
|
73
73
|
/** How a caller hears about the one retry; `sleep` is injectable so tests never wait. */
|
|
74
74
|
export interface TransientRetryHooks {
|
|
@@ -89,7 +89,7 @@ export declare const TRANSIENT_RETRY_DELAY_MS = 3000;
|
|
|
89
89
|
* describing, the same routing gap seen from the upload side.
|
|
90
90
|
* - transport resets (`fetch failed`, `ECONNRESET`, `socket hang up`, 502/503/504).
|
|
91
91
|
*
|
|
92
|
-
*
|
|
92
|
+
* Not retried: timeouts (the budget is spent), auth (401/403), quota and rate limits (429: a burst
|
|
93
93
|
* that hit the limit should be spaced, not repeated), and anything that names the request as wrong.
|
|
94
94
|
*/
|
|
95
95
|
export declare function isTransientE2BError(error: unknown): boolean;
|
|
@@ -158,7 +158,7 @@ export async function destroyE2BSandbox(module, sandboxId, options) {
|
|
|
158
158
|
}
|
|
159
159
|
/** Versioned public template built by runtime/browser-media/e2b-template.mjs. */
|
|
160
160
|
export const E2B_SPEECH_TEMPLATE = "7409n13kr83f7g7abx5g";
|
|
161
|
-
/** The desktop template a
|
|
161
|
+
/** The desktop template a study asks for; undefined selects the SDK default. */
|
|
162
162
|
export function e2bDesktopTemplate(config) {
|
|
163
163
|
if (config.execution?.target === "local")
|
|
164
164
|
return undefined;
|
|
@@ -181,7 +181,7 @@ export const TRANSIENT_RETRY_DELAY_MS = 3_000;
|
|
|
181
181
|
* describing, the same routing gap seen from the upload side.
|
|
182
182
|
* - transport resets (`fetch failed`, `ECONNRESET`, `socket hang up`, 502/503/504).
|
|
183
183
|
*
|
|
184
|
-
*
|
|
184
|
+
* Not retried: timeouts (the budget is spent), auth (401/403), quota and rate limits (429: a burst
|
|
185
185
|
* that hit the limit should be spaced, not repeated), and anything that names the request as wrong.
|
|
186
186
|
*/
|
|
187
187
|
export function isTransientE2BError(error) {
|
|
@@ -3,25 +3,25 @@ export interface E2BDesktopModule {
|
|
|
3
3
|
/** The stock `desktop` template (no custom image). */
|
|
4
4
|
create(options: E2BDesktopCreateOptions): Promise<E2BDesktopSandbox>;
|
|
5
5
|
/**
|
|
6
|
-
* Launch on a
|
|
7
|
-
* `Sandbox.create(template, opts)` overload. Lets a
|
|
6
|
+
* Launch on a custom E2B desktop template (image) by name or ID: the SDK's
|
|
7
|
+
* `Sandbox.create(template, opts)` overload. Lets a study run on an adopter-maintained image
|
|
8
8
|
* with extra runtimes baked in (e.g. node/bun/a local Postgres the stock `desktop` template
|
|
9
9
|
* lacks), instead of the stock template. The base @e2b/desktop SDK implements this; the
|
|
10
10
|
* wrapper just exposes it. Threaded from `execution.desktop.template`.
|
|
11
11
|
*/
|
|
12
12
|
create(template: string, options: E2BDesktopCreateOptions): Promise<E2BDesktopSandbox>;
|
|
13
13
|
/**
|
|
14
|
-
* Kill the sandbox specified by exact id. Returns true iff
|
|
15
|
-
* killed, false otherwise (the SDK's own doc comment). This boolean is the
|
|
14
|
+
* Kill the sandbox specified by exact id. Returns true iff that sandbox was found and
|
|
15
|
+
* killed, false otherwise (the SDK's own doc comment). This boolean is the primary by-id
|
|
16
16
|
* cleanup proof: a caller never needs to re-list to confirm reclamation.
|
|
17
17
|
*/
|
|
18
18
|
kill?(sandboxId: string, options?: {
|
|
19
19
|
requestTimeoutMs?: number;
|
|
20
20
|
}): Promise<boolean>;
|
|
21
21
|
/**
|
|
22
|
-
* Fetch
|
|
22
|
+
* Fetch one sandbox by its exact id (never account-wide). Throws a SandboxNotFoundError-
|
|
23
23
|
* shaped error (see isSandboxNotFoundError below) when the id no longer exists; that thrown
|
|
24
|
-
* error
|
|
24
|
+
* error is the by-id confirmation that a killed sandbox is gone. Optional: older SDKs may
|
|
25
25
|
* lack it, so callers fall back to kill()'s own boolean rather than ever calling Sandbox.list.
|
|
26
26
|
*/
|
|
27
27
|
getInfo?(sandboxId: string, options?: {
|
|
@@ -123,10 +123,10 @@ export interface E2BDesktopSandbox {
|
|
|
123
123
|
/** Open a file or URL with the desktop's default application (present on @e2b/desktop >= 1.x). */
|
|
124
124
|
open?(fileOrUrl: string): Promise<void>;
|
|
125
125
|
/**
|
|
126
|
-
* Map an in-sandbox port to a reachable host URL
|
|
127
|
-
*
|
|
128
|
-
* the wrapper just exposes it. Used by the
|
|
129
|
-
* expose the
|
|
126
|
+
* Map an in-sandbox port to a reachable host URL, `https://<port>-<sandboxId>.e2b.app`,
|
|
127
|
+
* tokenless (no authKey, unlike `stream.getUrl`). The base `e2b` SDK (v2.27.0) implements this;
|
|
128
|
+
* the wrapper just exposes it. Used by the concurrent shared-world topology to
|
|
129
|
+
* expose the one subject service plane to N actor sandboxes. Optional: older SDKs may lack it, so
|
|
130
130
|
* the concurrent backend fails closed when it is absent rather than calling a missing method.
|
|
131
131
|
*/
|
|
132
132
|
getHost?(port: number): string;
|
|
@@ -169,7 +169,7 @@ export declare class E2BDesktopStartupError extends Error {
|
|
|
169
169
|
constructor(error: unknown, cleanup: DesktopCreateCleanup, cleanupDetail?: string | undefined);
|
|
170
170
|
}
|
|
171
171
|
/**
|
|
172
|
-
* Preserve ownership before the desktop SDK starts Xvfb/XFCE
|
|
172
|
+
* Preserve ownership before the desktop SDK starts Xvfb/XFCE. Its public generic create
|
|
173
173
|
* constructs `new this(...)` through the base SDK, then awaits desktop startup. Newer SDKs
|
|
174
174
|
* attempt their own kill before rejecting create; older SDKs leave cleanup to the caller.
|
|
175
175
|
* Both paths share one bounded cleanup result so an internal kill cannot delay our deadline
|
|
@@ -183,7 +183,7 @@ export declare class E2BDesktopStartupError extends Error {
|
|
|
183
183
|
*/
|
|
184
184
|
export declare function guardDesktopSandboxCreate(module: E2BDesktopModule): E2BDesktopModule;
|
|
185
185
|
/**
|
|
186
|
-
* Detect a SandboxNotFoundError-shaped error from the real @e2b/desktop SDK,
|
|
186
|
+
* Detect a SandboxNotFoundError-shaped error from the real @e2b/desktop SDK, without importing
|
|
187
187
|
* its class (this module stays optional-peer / lazily-loaded, same as everything else here).
|
|
188
188
|
* The real SDK sets `this.name = "SandboxNotFoundError"` on the class (it extends the
|
|
189
189
|
* deprecated NotFoundError), so checking `.name` is the stable, import-free detection contract.
|
|
@@ -18,9 +18,9 @@ export async function loadE2BDesktopModule() {
|
|
|
18
18
|
? "Live E2B desktop launch requires the optional peer @e2b/desktop. Install it beside humanish " +
|
|
19
19
|
"in this project: `npm i -D @e2b/desktop`."
|
|
20
20
|
: "Live E2B desktop launch requires the optional peer @e2b/desktop, and humanish is running from an " +
|
|
21
|
-
"npx cache
|
|
22
|
-
"
|
|
23
|
-
"`npm i -D humanish @e2b/desktop` then `npx humanish run <
|
|
21
|
+
"npx cache. Node resolves the peer relative to humanish itself, so a copy installed in this project " +
|
|
22
|
+
"is not found. Install both into the project and run it from there: " +
|
|
23
|
+
"`npm i -D humanish @e2b/desktop` then `npx humanish run <study>`.");
|
|
24
24
|
}
|
|
25
25
|
throw error;
|
|
26
26
|
}
|
|
@@ -44,7 +44,7 @@ export class E2BDesktopStartupError extends Error {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
* Preserve ownership before the desktop SDK starts Xvfb/XFCE
|
|
47
|
+
* Preserve ownership before the desktop SDK starts Xvfb/XFCE. Its public generic create
|
|
48
48
|
* constructs `new this(...)` through the base SDK, then awaits desktop startup. Newer SDKs
|
|
49
49
|
* attempt their own kill before rejecting create; older SDKs leave cleanup to the caller.
|
|
50
50
|
* Both paths share one bounded cleanup result so an internal kill cannot delay our deadline
|
|
@@ -147,8 +147,8 @@ async function reclaimFailedDesktopCreate(kill, timeoutMs) {
|
|
|
147
147
|
/**
|
|
148
148
|
* Is humanish running from this project's node_modules, or from an npx cache?
|
|
149
149
|
*
|
|
150
|
-
* It decides which advice is
|
|
151
|
-
*
|
|
150
|
+
* It decides which advice is true. `npx humanish@latest` resolves its optional peer relative to
|
|
151
|
+
* itself, so "install @e2b/desktop in this project" is advice that cannot work there, and that
|
|
152
152
|
* message cost two cold verification runs before the difference was noticed. A one-shot npx
|
|
153
153
|
* invocation cannot do a live desktop run at all; humanish has to be installed alongside the peer.
|
|
154
154
|
*/
|
|
@@ -161,7 +161,7 @@ function isMissingE2BDesktopDependency(error) {
|
|
|
161
161
|
return value.code === "ERR_MODULE_NOT_FOUND" && value.message?.includes("@e2b/desktop") === true;
|
|
162
162
|
}
|
|
163
163
|
/**
|
|
164
|
-
* Detect a SandboxNotFoundError-shaped error from the real @e2b/desktop SDK,
|
|
164
|
+
* Detect a SandboxNotFoundError-shaped error from the real @e2b/desktop SDK, without importing
|
|
165
165
|
* its class (this module stays optional-peer / lazily-loaded, same as everything else here).
|
|
166
166
|
* The real SDK sets `this.name = "SandboxNotFoundError"` on the class (it extends the
|
|
167
167
|
* deprecated NotFoundError), so checking `.name` is the stable, import-free detection contract.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StudyConfig } from "../../study/types.js";
|
|
2
2
|
export declare const LOCAL_BROWSER_LIFETIME_MS: number;
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function isLocalBrowserStudy(config: StudyConfig): boolean;
|
|
4
4
|
/** Defaults for the explicitly selected local substrate; hosted configurations are untouched. */
|
|
5
|
-
export declare function localBrowserDefaults(config:
|
|
6
|
-
export declare function localBrowserUnsupportedReason(config:
|
|
5
|
+
export declare function localBrowserDefaults(config: StudyConfig): StudyConfig;
|
|
6
|
+
export declare function localBrowserUnsupportedReason(config: StudyConfig): string | undefined;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { rosterOf } from "../../
|
|
1
|
+
import { rosterOf } from "../../study/parse/actors.js";
|
|
2
2
|
// The runtime image enforces a 30-minute lifetime; reserve setup/teardown room.
|
|
3
3
|
export const LOCAL_BROWSER_LIFETIME_MS = 30 * 60_000;
|
|
4
4
|
const MAX_SESSION_MS = 20 * 60_000;
|
|
5
|
-
export function
|
|
5
|
+
export function isLocalBrowserStudy(config) {
|
|
6
6
|
return (config.subject.source === "app-url" &&
|
|
7
7
|
config.execution?.target === "local" &&
|
|
8
8
|
["local-agent", "openai-computer-use"].includes(config.actors[0]?.type ?? ""));
|
|
9
9
|
}
|
|
10
10
|
/** Defaults for the explicitly selected local substrate; hosted configurations are untouched. */
|
|
11
11
|
export function localBrowserDefaults(config) {
|
|
12
|
-
if (!
|
|
12
|
+
if (!isLocalBrowserStudy(config))
|
|
13
13
|
return config;
|
|
14
14
|
return {
|
|
15
15
|
...config,
|
|
@@ -40,7 +40,7 @@ export function localBrowserUnsupportedReason(config) {
|
|
|
40
40
|
if (config.actors.length !== 1 ||
|
|
41
41
|
!actor ||
|
|
42
42
|
(actor.type === "local-agent" && actor.localAgent !== undefined && actor.localAgent !== "codex")) {
|
|
43
|
-
return "Local browser
|
|
43
|
+
return "Local browser studies support only Codex local-agent or openai-computer-use participants.";
|
|
44
44
|
}
|
|
45
45
|
if (desktop?.resolution?.[0] !== 960 ||
|
|
46
46
|
desktop.resolution[1] !== 720 ||
|
package/dist/tui/actions.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ export declare function createTuiObserverSession(cwdInput: string, options?: {
|
|
|
25
25
|
* The counterpart to starting one: a study that is going nowhere costs money every turn, and until
|
|
26
26
|
* now the only way to end it was to find the pid yourself.
|
|
27
27
|
*
|
|
28
|
-
* It signals the
|
|
28
|
+
* It signals the process group, not the process. A run is spawned detached, in its own group, and it
|
|
29
29
|
* has children: the CLI, and whatever it spawned to reach the sandbox. Signalling only the parent
|
|
30
30
|
* leaves those orphaned and still working.
|
|
31
31
|
*
|
package/dist/tui/actions.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { requestAutomaticAnalysisCancellation } from "../analysis/automatic.js";
|
|
2
|
-
// The two things a run card can
|
|
2
|
+
// The two things a run card can do.
|
|
3
3
|
//
|
|
4
|
-
// The mock's run screen is an outcome
|
|
5
|
-
// nothing is worse than no action
|
|
6
|
-
// and nothing else. `Share…` waits for the export contract
|
|
4
|
+
// The mock's run screen is an outcome card with actions, not a field list, and an action that does
|
|
5
|
+
// nothing is worse than no action, so this ships the two that are genuinely implementable today
|
|
6
|
+
// and nothing else. `Share…` waits for the export contract rather than appearing as a
|
|
7
7
|
// control that fails.
|
|
8
8
|
import { readFile } from "node:fs/promises";
|
|
9
9
|
import path from "node:path";
|
|
@@ -32,7 +32,7 @@ export function createTuiObserverSession(cwdInput, options = {}) {
|
|
|
32
32
|
return {
|
|
33
33
|
async open(targetCwd, observerPath) {
|
|
34
34
|
if (closed)
|
|
35
|
-
return result(false, "this terminal session has closed
|
|
35
|
+
return result(false, "this terminal session has closed; reopen `humanish tui` to view the run");
|
|
36
36
|
if (path.resolve(targetCwd) !== cwd)
|
|
37
37
|
return result(false, "Observer can only open runs from this terminal session's project");
|
|
38
38
|
// The capability takes the run-card path, not an arbitrary file, URL, or second project.
|
|
@@ -58,7 +58,7 @@ export function createTuiObserverSession(cwdInput, options = {}) {
|
|
|
58
58
|
return result(false, "this run's evidence directory is missing or unsafe to open");
|
|
59
59
|
}
|
|
60
60
|
if (closed)
|
|
61
|
-
return result(false, "this terminal session has closed
|
|
61
|
+
return result(false, "this terminal session has closed; reopen `humanish tui` to view the run");
|
|
62
62
|
try {
|
|
63
63
|
// Share the pending start too: two quick selections must not create two listeners.
|
|
64
64
|
serverPromise ??= serveObserverLibrary(cwd, {
|
|
@@ -78,13 +78,13 @@ export function createTuiObserverSession(cwdInput, options = {}) {
|
|
|
78
78
|
});
|
|
79
79
|
const server = await serverPromise;
|
|
80
80
|
if (closed)
|
|
81
|
-
return result(false, "this terminal session has closed
|
|
81
|
+
return result(false, "this terminal session has closed; reopen `humanish tui` to view the run");
|
|
82
82
|
const url = new URL(`_humanish/runs/${encodeURIComponent(runId)}/observer/index.html`, server.url).href;
|
|
83
83
|
const opened = open(url);
|
|
84
|
-
return result(true, `${url}
|
|
84
|
+
return result(true, `${url} follows saved captures while you keep this TUI open.${opened.warning ? ` ${opened.warning}` : " If no browser appeared, open this URL on this machine or forward its port over SSH."}`);
|
|
85
85
|
}
|
|
86
86
|
catch {
|
|
87
|
-
return result(false, "Observer could not start
|
|
87
|
+
return result(false, "Observer could not start; run `humanish observe --run <run id>` in another terminal");
|
|
88
88
|
}
|
|
89
89
|
},
|
|
90
90
|
close() {
|
|
@@ -104,7 +104,7 @@ export function createTuiObserverSession(cwdInput, options = {}) {
|
|
|
104
104
|
* The counterpart to starting one: a study that is going nowhere costs money every turn, and until
|
|
105
105
|
* now the only way to end it was to find the pid yourself.
|
|
106
106
|
*
|
|
107
|
-
* It signals the
|
|
107
|
+
* It signals the process group, not the process. A run is spawned detached, in its own group, and it
|
|
108
108
|
* has children: the CLI, and whatever it spawned to reach the sandbox. Signalling only the parent
|
|
109
109
|
* leaves those orphaned and still working.
|
|
110
110
|
*
|
|
@@ -144,7 +144,7 @@ export async function stopRun(cwd, runId, intent = "run") {
|
|
|
144
144
|
return {
|
|
145
145
|
schema: TUI_ACTION_SCHEMA,
|
|
146
146
|
ok: false,
|
|
147
|
-
message: "this run has no status record, so there is no pid to stop
|
|
147
|
+
message: "this run has no status record, so there is no pid to stop; it predates status records or never started",
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
150
|
if (!isRunStatusRecord(record)) {
|
|
@@ -177,7 +177,7 @@ export async function stopRun(cwd, runId, intent = "run") {
|
|
|
177
177
|
return { schema: TUI_ACTION_SCHEMA, ok: false, message: "this run recorded no usable pid" };
|
|
178
178
|
}
|
|
179
179
|
// Is it actually still there? A pid whose process is already gone means the run died without
|
|
180
|
-
// finalizing
|
|
180
|
+
// finalizing: nothing to stop, and the record will read as interrupted on its own.
|
|
181
181
|
try {
|
|
182
182
|
process.kill(pid, 0);
|
|
183
183
|
}
|
|
@@ -185,7 +185,7 @@ export async function stopRun(cwd, runId, intent = "run") {
|
|
|
185
185
|
return {
|
|
186
186
|
schema: TUI_ACTION_SCHEMA,
|
|
187
187
|
ok: false,
|
|
188
|
-
message: `nothing is running under pid ${pid}
|
|
188
|
+
message: `nothing is running under pid ${pid}; it has already stopped, and its record will read as interrupted`,
|
|
189
189
|
};
|
|
190
190
|
}
|
|
191
191
|
try {
|
package/dist/tui/contract.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { StudyListResult } from "../study/discover.js";
|
|
2
|
+
import type { StudySummary, ReadStudySummaryOptions } from "../study/summary.js";
|
|
3
3
|
import type { RunDetail } from "../run/detail.js";
|
|
4
4
|
import type { ReclaimResult } from "../run/reclaim.js";
|
|
5
5
|
import type { TuiActionResult } from "./actions.js";
|
|
@@ -25,11 +25,11 @@ export interface TuiCapabilities {
|
|
|
25
25
|
read(): Promise<CommsSetupStatus>;
|
|
26
26
|
save(): Promise<CommsSetupResult>;
|
|
27
27
|
check?(): Promise<CommsCheckResult>;
|
|
28
|
-
|
|
28
|
+
studies?(): Promise<{
|
|
29
29
|
title: string;
|
|
30
30
|
path: string;
|
|
31
31
|
}[]>;
|
|
32
|
-
configure?(
|
|
32
|
+
configure?(study: string, apply: boolean, planToken?: string): Promise<CommsConfigureResult>;
|
|
33
33
|
recovery?(): Promise<CommsRecoveryEntry[]>;
|
|
34
34
|
recover?(runId: string, connectionName: string): Promise<{
|
|
35
35
|
ok: boolean;
|
|
@@ -39,32 +39,32 @@ export interface TuiCapabilities {
|
|
|
39
39
|
/** Read every run in the project, cheapest source first. */
|
|
40
40
|
readRunIndex(cwd: string, options?: ReadRunIndexOptions): Promise<RunIndexResult>;
|
|
41
41
|
/**
|
|
42
|
-
* The labs
|
|
42
|
+
* The labs declared in this project. Listed separately from run history because neither side is
|
|
43
43
|
* the whole truth: a fresh project has manifests and no runs, and a long-lived one has runs from
|
|
44
44
|
* manifests since renamed or deleted.
|
|
45
45
|
*/
|
|
46
|
-
|
|
46
|
+
listStudies(cwd: string): Promise<StudyListResult>;
|
|
47
47
|
/**
|
|
48
|
-
* Start a run and return once it is running. The run is
|
|
49
|
-
* quitting the TUI
|
|
48
|
+
* Start a run and return once it is running. The run is detached: it outlives this surface, so
|
|
49
|
+
* quitting the TUI (or losing the connection it runs over) does not kill a study that costs
|
|
50
50
|
* real money. The surface then follows it through `status.json` like any other reader.
|
|
51
51
|
*/
|
|
52
52
|
startRun(options: Omit<LaunchRunOptions, "spawn" | "cliPath" | "now">): Promise<LaunchRunResult>;
|
|
53
53
|
/** The tail of a launch log: the only account of a run that died before writing evidence. */
|
|
54
54
|
readLaunchLog(logPath: string): Promise<string>;
|
|
55
55
|
/**
|
|
56
|
-
* Who is in
|
|
57
|
-
* deliberately does not
|
|
56
|
+
* Who is in one run and what they are thinking. Opens that run's bundle, which the index
|
|
57
|
+
* deliberately does not. That is affordable because it is asked only for the run being watched.
|
|
58
58
|
* `null` when the run has not written a bundle yet.
|
|
59
59
|
*/
|
|
60
60
|
readRunDetail(cwd: string, runId: string): Promise<RunDetail | null>;
|
|
61
61
|
/**
|
|
62
|
-
* What a
|
|
63
|
-
* resolve right now. Read for the
|
|
62
|
+
* What a study is: subject, participants, model, spend caps, and whether the keys a live run needs
|
|
63
|
+
* resolve right now. Read for the study being looked at, because it is what someone reads before
|
|
64
64
|
* deciding to spend money.
|
|
65
65
|
*/
|
|
66
|
-
|
|
67
|
-
/** Whether this directory is a humanish project
|
|
66
|
+
readStudySummary(cwd: string, study: string, options?: ReadStudySummaryOptions): Promise<StudySummary | null>;
|
|
67
|
+
/** Whether this directory is a humanish project: an empty project and a wrong directory are
|
|
68
68
|
* different problems and must not share a screen. */
|
|
69
69
|
readProjectState(cwd: string): TuiProjectState;
|
|
70
70
|
/** Open the selected run in the session-owned local evidence server; closes when the TUI exits. */
|
|
@@ -72,12 +72,12 @@ export interface TuiCapabilities {
|
|
|
72
72
|
/** Stop the sandboxes an interrupted run left behind, keeping its evidence. */
|
|
73
73
|
reclaimRun(cwd: string, runId: string): Promise<ReclaimResult>;
|
|
74
74
|
/** End a run that is still going. "analysis" is marker-only regardless of the current status;
|
|
75
|
-
* it
|
|
75
|
+
* it must not probe or signal a process. The default "run" intent stops the participant process. */
|
|
76
76
|
stopRun(cwd: string, runId: string, intent?: "run" | "analysis"): Promise<TuiActionResult>;
|
|
77
77
|
/**
|
|
78
|
-
* Set this directory up as a humanish project. The surface's only
|
|
79
|
-
* starting runs
|
|
80
|
-
* exactly the person who has just arrived
|
|
78
|
+
* Set this directory up as a humanish project. The surface's only writing action outside of
|
|
79
|
+
* starting runs, offered because "cd somewhere else and run init" is a dead end shown to
|
|
80
|
+
* exactly the person who has just arrived.
|
|
81
81
|
*/
|
|
82
82
|
initProject(cwd: string): Promise<TuiActionResult>;
|
|
83
83
|
}
|
|
@@ -100,7 +100,7 @@ export interface TuiOptions {
|
|
|
100
100
|
exitAfterFirstFrame?: boolean;
|
|
101
101
|
}
|
|
102
102
|
/**
|
|
103
|
-
* Start the surface. Resolves with the process exit code when the operator quits
|
|
103
|
+
* Start the surface. Resolves with the process exit code when the operator quits; the TUI owns the
|
|
104
104
|
* screen until then, so the CLI must not write to stdout while this is pending.
|
|
105
105
|
*/
|
|
106
106
|
export type TuiHandoff = {
|
|
@@ -125,14 +125,14 @@ export declare function nodeSupportsTui(versionString?: string): boolean;
|
|
|
125
125
|
*/
|
|
126
126
|
export declare const TUI_BUNDLE_URL: import("url").URL;
|
|
127
127
|
/**
|
|
128
|
-
* What `doctor` says about the stakeholder surface
|
|
129
|
-
* crucially, of
|
|
128
|
+
* What `doctor` says about the stakeholder surface: a pure function of the machine's state and,
|
|
129
|
+
* crucially, of who is reading.
|
|
130
130
|
*
|
|
131
131
|
* A real first-contact study (labs/first-contact.yaml) is why the reader matters. An autonomous
|
|
132
132
|
* agent evaluating humanish read "`humanish tui` is available in an interactive terminal",
|
|
133
|
-
* correctly concluded it was not in one, and dropped it
|
|
133
|
+
* correctly concluded it was not in one, and dropped it, then wrote a report for a human that
|
|
134
134
|
* never mentioned the human surface at all. Discovery worked and handoff did not. A capability
|
|
135
|
-
* described to a reader who cannot use it has to be phrased as something to
|
|
135
|
+
* described to a reader who cannot use it has to be phrased as something to pass on, or it reads
|
|
136
136
|
* as "not for you" and dies in the transcript.
|
|
137
137
|
*/
|
|
138
138
|
export declare function terminalSurfaceMessage(state: {
|
package/dist/tui/contract.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// The boundary between the CLI and the terminal UI
|
|
1
|
+
// The boundary between the CLI and the terminal UI.
|
|
2
2
|
//
|
|
3
|
-
// `humanish tui` loads a
|
|
4
|
-
// screens
|
|
3
|
+
// `humanish tui` loads a pre-built bundle (dist/tui-app.js) that contains Ink, React and the
|
|
4
|
+
// screens, and nothing else. Everything the surface needs to know is passed across this interface
|
|
5
5
|
// by the CLI, which imports it from the same modules every other command uses.
|
|
6
6
|
//
|
|
7
7
|
// The reason for the seam: a terminal UI that reads the filesystem itself would become a second
|
|
8
|
-
// implementation of "what is a run, which
|
|
8
|
+
// implementation of "what is a run, which study does it belong to, is it alive", one that ships
|
|
9
9
|
// minified, is invisible to the root test suite, and drifts from `humanish runs` the first time
|
|
10
10
|
// either side changes. Injection keeps exactly one implementation, already unit-tested, and leaves
|
|
11
11
|
// the bundle a view layer that can be reasoned about as one.
|
|
@@ -29,14 +29,14 @@ export function nodeSupportsTui(versionString = process.version) {
|
|
|
29
29
|
*/
|
|
30
30
|
export const TUI_BUNDLE_URL = new URL("../tui-app.js", import.meta.url);
|
|
31
31
|
/**
|
|
32
|
-
* What `doctor` says about the stakeholder surface
|
|
33
|
-
* crucially, of
|
|
32
|
+
* What `doctor` says about the stakeholder surface: a pure function of the machine's state and,
|
|
33
|
+
* crucially, of who is reading.
|
|
34
34
|
*
|
|
35
35
|
* A real first-contact study (labs/first-contact.yaml) is why the reader matters. An autonomous
|
|
36
36
|
* agent evaluating humanish read "`humanish tui` is available in an interactive terminal",
|
|
37
|
-
* correctly concluded it was not in one, and dropped it
|
|
37
|
+
* correctly concluded it was not in one, and dropped it, then wrote a report for a human that
|
|
38
38
|
* never mentioned the human surface at all. Discovery worked and handoff did not. A capability
|
|
39
|
-
* described to a reader who cannot use it has to be phrased as something to
|
|
39
|
+
* described to a reader who cannot use it has to be phrased as something to pass on, or it reads
|
|
40
40
|
* as "not for you" and dies in the transcript.
|
|
41
41
|
*/
|
|
42
42
|
export function terminalSurfaceMessage(state) {
|
|
@@ -44,9 +44,9 @@ export function terminalSurfaceMessage(state) {
|
|
|
44
44
|
return `\`humanish tui\` needs Node ${TUI_MIN_NODE_MAJOR}+ (this is ${state.nodeVersion}); every other command works here`;
|
|
45
45
|
}
|
|
46
46
|
if (!state.bundlePresent) {
|
|
47
|
-
return "`humanish tui`
|
|
47
|
+
return "`humanish tui` is not built in this checkout; run `pnpm build` (installed packages ship it prebuilt)";
|
|
48
48
|
}
|
|
49
49
|
return state.interactive
|
|
50
|
-
? "`humanish tui` opens the interactive surface for browsing
|
|
51
|
-
: "`humanish tui` is the interactive
|
|
50
|
+
? "`humanish tui` opens the interactive surface for browsing studies and runs"
|
|
51
|
+
: "`humanish tui` is the interactive screen a person uses to watch and start runs here. This shell is not a terminal, so pass it on to a person at one";
|
|
52
52
|
}
|
package/dist/tui/launch.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function isSafeStudyHandle(value: string): boolean;
|
|
3
3
|
export interface LaunchRunOptions {
|
|
4
4
|
cwd: string;
|
|
5
|
-
/** The manifest handle (filename stem), as `humanish
|
|
6
|
-
|
|
7
|
-
/** Exact selected manifest, avoiding a same-name committed
|
|
5
|
+
/** The manifest handle (filename stem), as `humanish run` takes it. */
|
|
6
|
+
study: string;
|
|
7
|
+
/** Exact selected manifest, avoiding a same-name committed study shadowing a local copy. */
|
|
8
8
|
manifestPath?: string;
|
|
9
9
|
mode: "dry-run" | "live";
|
|
10
10
|
/** Injected in tests; defaults to the real spawn. */
|
|
@@ -19,7 +19,7 @@ export interface LaunchedRun {
|
|
|
19
19
|
/** The spawned CLI's pid. The run's `status.json` stamps the same value. */
|
|
20
20
|
pid: number;
|
|
21
21
|
/**
|
|
22
|
-
* When the launch happened. A pid
|
|
22
|
+
* When the launch happened. A pid alone cannot identify a run: pids are recycled by the OS and a
|
|
23
23
|
* finished run keeps its pid in `status.json` forever, so a week-old record can carry the pid the
|
|
24
24
|
* kernel just handed this child. Anything matching on pid must also require the record to be
|
|
25
25
|
* newer than this.
|
|
@@ -40,11 +40,11 @@ export type LaunchRunResult = {
|
|
|
40
40
|
message: string;
|
|
41
41
|
};
|
|
42
42
|
};
|
|
43
|
-
export type LaunchErrorCode = "
|
|
43
|
+
export type LaunchErrorCode = "HUMANISH_LAUNCH_INVALID_STUDY" | "HUMANISH_LAUNCH_FAILED";
|
|
44
44
|
/**
|
|
45
45
|
* Start a run and return as soon as it is running. Never throws: a launch that cannot happen is a
|
|
46
46
|
* result the surface can render, not an exception that would tear down the screen.
|
|
47
47
|
*/
|
|
48
48
|
export declare function launchRun(options: LaunchRunOptions): Promise<LaunchRunResult>;
|
|
49
|
-
/** Read the tail of a launch log
|
|
49
|
+
/** Read the tail of a launch log: the only account of a run that died before writing evidence. */
|
|
50
50
|
export declare function readLaunchLogTail(logPath: string, maxBytes?: number): Promise<string>;
|