humanish 0.107.0 → 0.108.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 +22 -17
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +51 -44
- package/README.md +145 -172
- 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-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 +8 -6
- 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 +2 -2
- package/dist/actors/codex/restricted-session.js +10 -5
- package/dist/actors/computer-use/actor.d.ts +16 -16
- package/dist/actors/computer-use/actor.js +2 -2
- package/dist/actors/computer-use/admission-limit.d.ts +1 -1
- package/dist/actors/computer-use/admission-limit.js +1 -1
- package/dist/actors/computer-use/loop/actions.d.ts +3 -3
- package/dist/actors/computer-use/loop/actions.js +10 -10
- 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/ending.d.ts +5 -5
- package/dist/actors/computer-use/loop/ending.js +7 -7
- package/dist/actors/computer-use/loop/observation.d.ts +2 -2
- package/dist/actors/computer-use/loop/observation.js +9 -9
- package/dist/actors/computer-use/loop/provider-call.d.ts +1 -1
- package/dist/actors/computer-use/loop/provider-call.js +1 -1
- package/dist/actors/computer-use/loop/session.js +3 -3
- 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 +9 -8
- package/dist/actors/computer-use/loop/types.d.ts +25 -23
- package/dist/actors/computer-use/loop/usage.js +2 -2
- 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 +11 -8
- package/dist/actors/computer-use/openai-provider.js +45 -34
- 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/contract.d.ts +78 -43
- package/dist/actors/contract.js +29 -23
- package/dist/actors/local-agent/claude-session.d.ts +1 -1
- package/dist/actors/local-agent/claude-session.js +10 -9
- package/dist/actors/local-agent/cli.d.ts +8 -6
- 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 +6 -6
- package/dist/actors/registry.d.ts +10 -10
- package/dist/actors/registry.js +18 -17
- package/dist/actors/scripted-browser/actor.d.ts +8 -8
- package/dist/actors/scripted-browser/actor.js +16 -16
- 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/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/service.js +5 -5
- package/dist/cli/commands/analyze.js +19 -16
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +54 -33
- package/dist/cli/commands/feedback.js +20 -21
- package/dist/cli/commands/lab-format.d.ts +5 -4
- package/dist/cli/commands/lab-format.js +35 -23
- package/dist/cli/commands/lab-route-computer-use.js +6 -7
- package/dist/cli/commands/lab-route-preview.js +4 -3
- package/dist/cli/commands/lab-route-shared-world.js +3 -3
- package/dist/cli/commands/lab-run.js +10 -11
- package/dist/cli/commands/lab-scorer.d.ts +2 -2
- package/dist/cli/commands/lab-scorer.js +1 -1
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.js +65 -0
- package/dist/cli/commands/observe.js +147 -108
- 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 +137 -138
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.js +26 -21
- package/dist/cli/commands/study.d.ts +3 -0
- package/dist/cli/commands/study.js +182 -0
- package/dist/cli/commands/tui.d.ts +4 -4
- package/dist/cli/commands/tui.js +21 -21
- package/dist/cli/commands/watch.js +60 -75
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +15 -5
- package/dist/cli/doctor.js +103 -48
- package/dist/cli/first-run-path.d.ts +12 -10
- package/dist/cli/first-run-path.js +30 -28
- package/dist/cli/io.d.ts +41 -6
- package/dist/cli/io.js +97 -22
- package/dist/cli/observer-follow.d.ts +2 -2
- package/dist/cli/observer-follow.js +5 -6
- package/dist/cli/orientation.d.ts +6 -3
- package/dist/cli/orientation.js +43 -39
- 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 +109 -40
- package/dist/cli/telemetry.d.ts +15 -15
- package/dist/cli/telemetry.js +48 -40
- 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 +14 -14
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.js +2 -2
- package/dist/comms/extract.js +2 -2
- package/dist/comms/fake-inbox.d.ts +2 -2
- package/dist/comms/fake-inbox.js +2 -2
- package/dist/comms/receiving-render.d.ts +1 -1
- package/dist/comms/receiving-render.js +2 -2
- 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 +36 -37
- package/dist/comms/sandbox-catch.js +34 -35
- package/dist/comms/setup.js +42 -8
- 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 +36 -78
- package/dist/feedback/export-bundle.js +1 -1
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +7 -8
- package/dist/feedback/feedback.d.ts +2 -2
- package/dist/feedback/feedback.js +21 -3
- package/dist/guest/chromium-text.js +2 -2
- package/dist/guest/desktop-native.d.ts +1 -1
- package/dist/guest/runtime.js +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.js +8 -6
- package/dist/keys/key-resolution.d.ts +5 -5
- package/dist/keys/key-resolution.js +23 -23
- package/dist/lab/adapter-extension.d.ts +7 -7
- package/dist/lab/adapter-extension.js +13 -36
- package/dist/lab/adapter-scorer-loader.d.ts +7 -7
- package/dist/lab/adapter-scorer-loader.js +32 -32
- package/dist/lab/composition-rules.js +42 -42
- package/dist/lab/config.js +65 -25
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +8 -8
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +117 -57
- package/dist/lab/doctor.d.ts +10 -3
- package/dist/lab/doctor.js +47 -9
- package/dist/lab/init-templates.js +147 -147
- package/dist/lab/init.d.ts +1 -1
- package/dist/lab/init.js +41 -9
- package/dist/lab/keys.d.ts +2 -0
- package/dist/lab/keys.js +42 -8
- package/dist/lab/lab-deps.d.ts +7 -12
- package/dist/lab/parse/actors.js +9 -9
- package/dist/lab/parse/comms.js +5 -5
- package/dist/lab/parse/execution.js +13 -13
- package/dist/lab/parse/study-v3.d.ts +23 -0
- package/dist/lab/parse/study-v3.js +259 -0
- package/dist/lab/parse/subject-state.d.ts +7 -7
- package/dist/lab/parse/subject-state.js +16 -16
- package/dist/lab/parse/subject.js +28 -28
- package/dist/lab/parse/values.d.ts +1 -1
- package/dist/lab/parse/values.js +3 -3
- package/dist/lab/persona-resolve.d.ts +4 -4
- package/dist/lab/persona-resolve.js +4 -4
- package/dist/lab/plan-participants.d.ts +2 -2
- package/dist/lab/plan-types.d.ts +4 -4
- package/dist/lab/plan.d.ts +1 -7
- package/dist/lab/plan.js +10 -41
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -4
- package/dist/lab/preflight.d.ts +7 -5
- package/dist/lab/preflight.js +5 -5
- package/dist/lab/routing.d.ts +31 -25
- package/dist/lab/routing.js +60 -29
- package/dist/lab/run-lab-events.d.ts +0 -3
- package/dist/lab/run-lab-events.js +0 -6
- package/dist/lab/run-lab-homes.d.ts +22 -10
- package/dist/lab/run-lab-homes.js +5 -1
- package/dist/lab/run-lab-options.d.ts +1 -1
- package/dist/lab/run-lab-options.js +16 -13
- package/dist/lab/summary.d.ts +7 -6
- package/dist/lab/summary.js +10 -10
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +101 -95
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +13 -13
- package/dist/lab/validation.js +44 -42
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +61 -33
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +6 -6
- 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 +1 -1
- package/dist/observer/library.js +4 -2
- package/dist/observer/listen.js +5 -4
- package/dist/observer/render.d.ts +1 -1
- package/dist/observer/render.js +10 -5
- package/dist/observer/run-routes.d.ts +3 -3
- package/dist/observer/run-routes.js +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 +15 -15
- package/dist/routes/computer-use/bundle.js +3 -3
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.js +14 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -4
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +4 -3
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -10
- package/dist/routes/computer-use/e2b-desktop/prepare.js +7 -7
- package/dist/routes/computer-use/e2b-desktop/start.js +9 -8
- package/dist/routes/computer-use/e2b-desktop/teardown.js +5 -4
- package/dist/routes/computer-use/external-comms.d.ts +1 -1
- package/dist/routes/computer-use/external-comms.js +1 -1
- package/dist/routes/computer-use/fanout-bundle.js +18 -18
- package/dist/routes/computer-use/fanout-records.js +10 -11
- package/dist/routes/computer-use/live-flush.d.ts +1 -1
- package/dist/routes/computer-use/live-flush.js +6 -6
- package/dist/routes/computer-use/live-phase.d.ts +4 -2
- package/dist/routes/computer-use/live-phase.js +6 -6
- package/dist/routes/computer-use/local-vm.js +1 -1
- package/dist/routes/computer-use/participant-desktop.d.ts +4 -4
- package/dist/routes/computer-use/participant-desktop.js +4 -4
- package/dist/routes/computer-use/participant-execution.d.ts +4 -4
- package/dist/routes/computer-use/participant-execution.js +9 -9
- package/dist/routes/computer-use/participant-model.d.ts +6 -0
- package/dist/routes/computer-use/participant-model.js +31 -13
- package/dist/routes/computer-use/participant-prompt.d.ts +11 -11
- package/dist/routes/computer-use/participant-prompt.js +6 -6
- package/dist/routes/computer-use/participant-runs.d.ts +7 -7
- package/dist/routes/computer-use/participant-runs.js +13 -13
- package/dist/routes/computer-use/plan.js +22 -22
- package/dist/routes/computer-use/preflight.js +21 -21
- package/dist/routes/computer-use/rerun-selection.js +1 -1
- package/dist/routes/computer-use/result.js +11 -11
- package/dist/routes/computer-use/route.d.ts +2 -1
- package/dist/routes/computer-use/route.js +15 -14
- package/dist/routes/computer-use/self-report.d.ts +7 -7
- package/dist/routes/computer-use/self-report.js +31 -31
- package/dist/routes/computer-use/setup.d.ts +1 -1
- package/dist/routes/computer-use/setup.js +17 -18
- package/dist/routes/computer-use/single-bundle.d.ts +7 -7
- package/dist/routes/computer-use/single-bundle.js +28 -30
- package/dist/routes/computer-use/subject-projection.d.ts +1 -1
- package/dist/routes/computer-use/subject-projection.js +6 -6
- package/dist/routes/computer-use/types.d.ts +40 -42
- package/dist/routes/computer-use/types.js +10 -10
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -4
- package/dist/routes/scripted/bundle.d.ts +2 -2
- package/dist/routes/scripted/bundle.js +13 -12
- package/dist/routes/scripted/plan.d.ts +1 -1
- package/dist/routes/scripted/plan.js +9 -9
- package/dist/routes/scripted/result.js +5 -5
- package/dist/routes/scripted/route.js +5 -6
- package/dist/routes/scripted/scenario.js +2 -2
- package/dist/routes/scripted/setup.js +7 -7
- package/dist/routes/scripted/subject.js +1 -1
- package/dist/routes/scripted/surface-records.js +3 -3
- package/dist/routes/scripted/types.d.ts +3 -5
- package/dist/routes/scripted/types.js +1 -1
- package/dist/routes/shared-world/bundle-records.js +9 -8
- package/dist/routes/shared-world/bundle.d.ts +5 -5
- package/dist/routes/shared-world/bundle.js +40 -38
- package/dist/routes/shared-world/checkpoints.d.ts +1 -1
- package/dist/routes/shared-world/checkpoints.js +1 -1
- package/dist/routes/shared-world/comms.d.ts +5 -5
- package/dist/routes/shared-world/comms.js +14 -14
- 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 +7 -6
- package/dist/routes/shared-world/participant-specs.js +31 -24
- package/dist/routes/shared-world/plan.js +7 -7
- 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.js +14 -13
- package/dist/routes/shared-world/result.js +20 -21
- package/dist/routes/shared-world/route.js +23 -22
- package/dist/routes/shared-world/setup.d.ts +3 -3
- package/dist/routes/shared-world/setup.js +4 -4
- package/dist/routes/shared-world/types.d.ts +30 -28
- package/dist/routes/shared-world/types.js +4 -4
- package/dist/routes/terminal/adapter.d.ts +3 -3
- package/dist/routes/terminal/adapter.js +5 -5
- package/dist/routes/terminal/bundle.d.ts +3 -3
- package/dist/routes/terminal/bundle.js +22 -21
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +7 -7
- package/dist/routes/terminal/dry-run.js +4 -4
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +3 -3
- package/dist/routes/terminal/ledger.js +14 -14
- package/dist/routes/terminal/live-finish.js +3 -3
- package/dist/routes/terminal/live-sandbox.js +12 -13
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.js +11 -11
- package/dist/routes/terminal/recorder.js +2 -2
- package/dist/routes/terminal/result.js +8 -8
- package/dist/routes/terminal/route.js +6 -7
- package/dist/routes/terminal/sandbox.d.ts +1 -1
- package/dist/routes/terminal/sandbox.js +1 -1
- package/dist/routes/terminal/session.js +8 -7
- 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 +2 -2
- package/dist/routes/terminal/trace.js +2 -2
- package/dist/routes/terminal/types.d.ts +26 -28
- package/dist/routes/terminal/types.js +3 -3
- package/dist/run/bundle-shape.js +3 -3
- package/dist/run/bundle.d.ts +46 -46
- package/dist/run/bundle.js +2 -1
- package/dist/run/cost-summary.js +3 -3
- package/dist/run/costs.js +7 -1
- package/dist/run/detail.d.ts +6 -6
- package/dist/run/detail.js +4 -4
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +18 -18
- package/dist/run/judge.d.ts +19 -13
- package/dist/run/judge.js +18 -8
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +1 -1
- package/dist/run/pricing.d.ts +11 -6
- package/dist/run/pricing.js +20 -13
- package/dist/run/projection.d.ts +14 -14
- package/dist/run/projection.js +15 -15
- package/dist/run/reclaim.js +2 -2
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +8 -6
- package/dist/run/run-index.js +15 -16
- 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 +5 -4
- package/dist/run/run.js +1 -1
- 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 +36 -35
- 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 +6 -6
- package/dist/run/stats.d.ts +12 -6
- package/dist/run/stats.js +116 -58
- package/dist/run/status.d.ts +8 -29
- package/dist/run/status.js +5 -27
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +6 -6
- package/dist/run/study-provenance.d.ts +47 -0
- package/dist/run/study-provenance.js +63 -0
- package/dist/run/study-result.d.ts +16 -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-lab.d.ts +7 -7
- package/dist/run-lab.js +1 -3
- package/dist/study/convert.d.ts +33 -0
- package/dist/study/convert.js +432 -0
- 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 +43 -0
- 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/subject/clone.d.ts +1 -1
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +2 -2
- package/dist/subject/local-tree-archive.js +1 -1
- package/dist/subject/local-tree.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +1 -1
- package/dist/subject/runtime.js +8 -9
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +3 -3
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +5 -5
- package/dist/subject/steps.js +4 -4
- package/dist/substrates/command-failure.d.ts +3 -3
- package/dist/substrates/command-failure.js +3 -3
- 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 +2 -2
- package/dist/substrates/e2b/desktop-browser.js +8 -8
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -9
- package/dist/substrates/e2b/desktop-cdp.js +8 -8
- package/dist/substrates/e2b/desktop-executor.d.ts +1 -1
- package/dist/substrates/e2b/desktop-executor.js +1 -1
- package/dist/substrates/e2b/desktop-geometry.d.ts +3 -3
- package/dist/substrates/e2b/desktop-geometry.js +7 -7
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- 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/sandbox.d.ts +1 -1
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +6 -6
- package/dist/tui/actions.d.ts +1 -1
- package/dist/tui/actions.js +13 -13
- package/dist/tui/contract.d.ts +16 -16
- package/dist/tui/contract.js +10 -10
- package/dist/tui/launch.d.ts +4 -4
- package/dist/tui/launch.js +18 -19
- package/dist/tui/project.js +5 -5
- package/dist/tui-app.js +82 -82
- 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 +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +92 -43
- package/docs/README.md +25 -32
- package/docs/architecture/actor-contract.md +56 -87
- package/docs/architecture/desktop-sessions.md +7 -7
- package/docs/architecture/external-public-shared-world.md +61 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- 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 +5 -5
- package/docs/architecture/terminal-product-route.md +67 -107
- package/docs/contracts/README.md +24 -0
- package/docs/contracts/adapter-admission.md +3 -3
- package/docs/contracts/adapter-fixtures.md +2 -5
- 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 +45 -44
- package/docs/contracts/schemas.md +421 -362
- package/docs/contracts/study-analysis.md +3 -3
- package/docs/contracts/study-costs.md +11 -7
- 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/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/package.json +16 -17
- package/skills/humanish/SKILL.md +60 -58
- 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.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/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- 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/tui/contract.d.ts
CHANGED
|
@@ -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
|
listLabs(cwd: string): Promise<LabListResult>;
|
|
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 lab
|
|
62
|
+
* What a lab is: subject, participants, model, spend caps, and whether the keys a live run needs
|
|
63
63
|
* resolve right now. Read for the lab being looked at, because it is what someone reads before
|
|
64
64
|
* deciding to spend money.
|
|
65
65
|
*/
|
|
66
66
|
readLabSummary(cwd: string, lab: string, options?: ReadLabSummaryOptions): Promise<LabSummary | null>;
|
|
67
|
-
/** Whether this directory is a humanish project
|
|
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 lab does it belong to, is it alive"
|
|
8
|
+
// implementation of "what is a run, which lab 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
50
|
? "`humanish tui` opens the interactive surface for browsing labs and runs"
|
|
51
|
-
: "`humanish tui` is the interactive
|
|
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
|
@@ -2,7 +2,7 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
export declare function isSafeLabHandle(value: string): boolean;
|
|
3
3
|
export interface LaunchRunOptions {
|
|
4
4
|
cwd: string;
|
|
5
|
-
/** The manifest handle (filename stem), as `humanish
|
|
5
|
+
/** The manifest handle (filename stem), as `humanish run` takes it. */
|
|
6
6
|
lab: string;
|
|
7
7
|
/** Exact selected manifest, avoiding a same-name committed lab shadowing a local copy. */
|
|
8
8
|
manifestPath?: string;
|
|
@@ -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>;
|
package/dist/tui/launch.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
// Starting a run from the terminal surface
|
|
1
|
+
// Starting a run from the terminal surface.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// The run must outlive the surface. A study can take minutes and costs real money, so a run
|
|
4
4
|
// started from the TUI cannot be a child of the TUI's event loop: closing the surface, or losing
|
|
5
5
|
// the SSH session it is running over, must not kill it. So this spawns the CLI the same way a
|
|
6
|
-
// person would type it
|
|
6
|
+
// person would type it: detached, in its own process group, with its output going to a file
|
|
7
7
|
// rather than to a terminal that may be about to disappear.
|
|
8
8
|
//
|
|
9
9
|
// The surface then learns what happened the same way any other reader does: from `status.json`.
|
|
10
10
|
// It does not hold a handle to the run, parse its stdout, or track it in memory. That is what
|
|
11
|
-
// makes the surface restartable
|
|
11
|
+
// makes the surface restartable: quit the TUI mid-run, reopen it, and the run is still there,
|
|
12
12
|
// because the filesystem was always the source of truth rather than a process handle.
|
|
13
13
|
import { spawn } from "node:child_process";
|
|
14
14
|
import { constants as fsConstants } from "node:fs";
|
|
@@ -18,14 +18,14 @@ import { fileURLToPath } from "node:url";
|
|
|
18
18
|
import { resolveLabManifest } from "../lab/discover.js";
|
|
19
19
|
import { prepareManagedHumanishOutputDirectory } from "../run/contained-output.js";
|
|
20
20
|
/**
|
|
21
|
-
* A lab handle is the manifest
|
|
22
|
-
* characters a manifest name can actually contain, and
|
|
21
|
+
* A lab handle is the manifest filename, which is what `humanish run` resolves. Restricted to
|
|
22
|
+
* characters a manifest name can actually contain, and (the part that matters) never allowed to
|
|
23
23
|
* begin with `-`, because argv is positional: a lab called `--json` would otherwise be handed to
|
|
24
24
|
* the CLI as a flag. There is no shell involved, so this is the whole injection surface.
|
|
25
25
|
*
|
|
26
|
-
* A leading underscore
|
|
27
|
-
* manifest, `humanish
|
|
28
|
-
* listing a lab it will not start. A leading dot stays out
|
|
26
|
+
* A leading underscore is allowed: `_wip.yaml` is an ordinary way to name a work-in-progress
|
|
27
|
+
* manifest, `humanish run _wip` resolves it, and refusing it here would leave the surface
|
|
28
|
+
* listing a lab it will not start. A leading dot stays out: that names a hidden file, not a lab.
|
|
29
29
|
*/
|
|
30
30
|
const SAFE_LAB_HANDLE = /^[A-Za-z0-9_][A-Za-z0-9._:-]*$/;
|
|
31
31
|
export function isSafeLabHandle(value) {
|
|
@@ -44,8 +44,8 @@ export async function launchRun(options) {
|
|
|
44
44
|
return {
|
|
45
45
|
ok: false,
|
|
46
46
|
error: {
|
|
47
|
-
code: "
|
|
48
|
-
message: `"${options.lab}" is not a usable lab handle. Run it by path with \`humanish
|
|
47
|
+
code: "HUMANISH_LAUNCH_INVALID_STUDY",
|
|
48
|
+
message: `"${options.lab}" is not a usable lab handle. Run it by path with \`humanish run <path>\` instead.`,
|
|
49
49
|
},
|
|
50
50
|
};
|
|
51
51
|
}
|
|
@@ -57,8 +57,8 @@ export async function launchRun(options) {
|
|
|
57
57
|
return {
|
|
58
58
|
ok: false,
|
|
59
59
|
error: {
|
|
60
|
-
code: "
|
|
61
|
-
message: "The selected
|
|
60
|
+
code: "HUMANISH_LAUNCH_INVALID_STUDY",
|
|
61
|
+
message: "The selected study path could not be read safely. Refresh the study list.",
|
|
62
62
|
},
|
|
63
63
|
};
|
|
64
64
|
selectedLab = path.relative(cwd, path.resolve(cwd, resolved.path)).replace(/\\/g, "/");
|
|
@@ -74,8 +74,8 @@ export async function launchRun(options) {
|
|
|
74
74
|
const logDir = await prepareManagedHumanishOutputDirectory(cwd, "launches");
|
|
75
75
|
const stamp = launchedAt.replace(/[:.]/g, "-");
|
|
76
76
|
logPath = path.join(logDir.physicalPath, `${stamp}-${options.lab}.log`);
|
|
77
|
-
// O_NOFOLLOW so a symlink planted at this path cannot redirect a run's output
|
|
78
|
-
// provider error text
|
|
77
|
+
// O_NOFOLLOW so a symlink planted at this path cannot redirect a run's output (which may carry
|
|
78
|
+
// provider error text) outside the project, and cannot defeat the 0600 mode by pointing at a
|
|
79
79
|
// file that already exists with looser permissions. O_CREAT|O_APPEND keeps ordinary reuse
|
|
80
80
|
// working; only a symlink is refused (ELOOP).
|
|
81
81
|
handle = await open(logPath, fsConstants.O_CREAT | fsConstants.O_WRONLY | fsConstants.O_APPEND | fsConstants.O_NOFOLLOW, 0o600);
|
|
@@ -93,7 +93,6 @@ export async function launchRun(options) {
|
|
|
93
93
|
// the operator's attention and must not have a browser thrown over it.
|
|
94
94
|
const args = [
|
|
95
95
|
options.cliPath ?? defaultCliPath(),
|
|
96
|
-
"lab",
|
|
97
96
|
"run",
|
|
98
97
|
"--cwd",
|
|
99
98
|
cwd,
|
|
@@ -115,9 +114,9 @@ export async function launchRun(options) {
|
|
|
115
114
|
};
|
|
116
115
|
try {
|
|
117
116
|
const child = spawnFn(process.execPath, args, spawnOptions);
|
|
118
|
-
// A spawn failure is delivered
|
|
117
|
+
// A spawn failure is delivered asynchronously as an 'error' event (EAGAIN, EMFILE, ENOMEM, a
|
|
119
118
|
// vanished node binary). An 'error' event with no listener is re-thrown by EventEmitter as an
|
|
120
|
-
// uncaught exception
|
|
119
|
+
// uncaught exception, which would tear down the whole surface, the one thing this module
|
|
121
120
|
// promises never to do. The run is already unref'd and unobserved, so recording it is all that
|
|
122
121
|
// is available; the operator learns about it from the launch log and the missing record.
|
|
123
122
|
child.on("error", () => {
|
|
@@ -151,7 +150,7 @@ export async function launchRun(options) {
|
|
|
151
150
|
};
|
|
152
151
|
}
|
|
153
152
|
}
|
|
154
|
-
/** Read the tail of a launch log
|
|
153
|
+
/** Read the tail of a launch log: the only account of a run that died before writing evidence. */
|
|
155
154
|
export async function readLaunchLogTail(logPath, maxBytes = 4_000) {
|
|
156
155
|
try {
|
|
157
156
|
const handle = await open(logPath, "r");
|
package/dist/tui/project.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// Is this directory a humanish project at all?
|
|
1
|
+
// Is this directory a humanish project at all?
|
|
2
2
|
//
|
|
3
|
-
// The surface has two
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// The surface has two empty states and renders a different screen for each. A project with no
|
|
4
|
+
// labs yet needs "write one"; a directory that is not a project (someone's home directory,
|
|
5
|
+
// because `npx humanish tui` is easy to type anywhere) needs to know that first. Being told "no
|
|
6
|
+
// labs here yet" in `~` reads as a broken tool.
|
|
7
7
|
import { existsSync } from "node:fs";
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
const TUI_PROJECT_SCHEMA = "humanish.tui-project.v1";
|