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
|
@@ -105,9 +105,9 @@ export function publicPathForTrace(value, rootCwd) {
|
|
|
105
105
|
// or a logged-in third-party UI. A raw frame must never reach a public artifact.
|
|
106
106
|
// redactScreenshot is the fail-closed primitive that gates that surface. It
|
|
107
107
|
// always returns a freshly re-encoded, downscaled, box-blurred thumbnail (or a
|
|
108
|
-
// neutral placeholder), and
|
|
108
|
+
// neutral placeholder), and never the source pixels. The "too coarse to read"
|
|
109
109
|
// invariant is enforced in code, not by defaults: the emitted width is hard-
|
|
110
|
-
// capped (a caller may request a
|
|
110
|
+
// capped (a caller may request a smaller thumbnail but never a larger one), and
|
|
111
111
|
// the blur radius is computed internally with a floor, so neither a caller
|
|
112
112
|
// option nor a natively small frame can widen the output back into legibility.
|
|
113
113
|
// On any uncertainty (non-PNG input, an oversized or unreadable PNG, or any
|
|
@@ -241,7 +241,7 @@ export function tailText(value, maxChars) {
|
|
|
241
241
|
}
|
|
242
242
|
/**
|
|
243
243
|
* A redacted, ellipsis-prefixed tail of captured output for a (public-bound)
|
|
244
|
-
* message field. Pattern-redacts the
|
|
244
|
+
* message field. Pattern-redacts the full text before truncating: slicing a tail
|
|
245
245
|
* first could cut through a secret's prefix (e.g. drop "sk-proj-") and defeat the
|
|
246
246
|
* pattern matcher on the remainder. Callers should literal-scrub known
|
|
247
247
|
* provisioned values first; this is the pattern pass. Empty output -> "(no output)".
|
|
@@ -321,7 +321,7 @@ export function scrubLiterals(values) {
|
|
|
321
321
|
/**
|
|
322
322
|
* Coerce an unknown thrown value to its message string. Prefer this over the
|
|
323
323
|
* inline `error instanceof Error ? error.message : String(error)` so error
|
|
324
|
-
* stringification stays uniform. Note: this does
|
|
324
|
+
* stringification stays uniform. Note: this does not redact; sites that emit
|
|
325
325
|
* to public-bound artifacts must run the result through `redactText` first.
|
|
326
326
|
*/
|
|
327
327
|
export function toErrorMessage(error) {
|
package/dist/feedback/draft.js
CHANGED
|
@@ -49,95 +49,55 @@ export function buildDraft(bundle, bundlePath, candidateId) {
|
|
|
49
49
|
acceptance_proof: projectFeedbackAcceptanceProof(bundle, candidate),
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
? []
|
|
69
|
-
: [`Tasks: ${formatRunTaskFunnel(bundle.review.tasks)}.`]),
|
|
70
|
-
];
|
|
71
|
-
return {
|
|
72
|
-
schema: FEEDBACK_SCHEMA,
|
|
73
|
-
run_id: bundle.runId,
|
|
74
|
-
adapter_id: bundle.source.packageName ?? bundle.scenario.id,
|
|
75
|
-
scenario_id: bundle.scenario.id,
|
|
76
|
-
persona_id: bundle.persona.id,
|
|
77
|
-
actor: (bundle.streams ?? []).some((stream) => stream.actor?.lane === "computer-use")
|
|
78
|
-
? "computer-use"
|
|
79
|
-
: "unknown",
|
|
80
|
-
substrate: "unknown",
|
|
81
|
-
failure_owner: "unknown",
|
|
82
|
-
summary: "Live study completed without a participant-reported finding",
|
|
83
|
-
expected: bundle.scenario.goal,
|
|
84
|
-
actual: actualLines.join(" "),
|
|
85
|
-
source_bundle: bundlePath,
|
|
86
|
-
evidence: [
|
|
87
|
-
{
|
|
88
|
-
path: bundlePath,
|
|
89
|
-
kind: "state",
|
|
90
|
-
note: "Source run bundle.",
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
path: path.join(path.dirname(bundlePath), "review.md"),
|
|
94
|
-
kind: "review",
|
|
95
|
-
note: "The run's review: verdict, participants, and gaps.",
|
|
96
|
-
},
|
|
97
|
-
],
|
|
98
|
-
redaction: {
|
|
99
|
-
status: "passed",
|
|
100
|
-
notes: bundle.redaction.notes,
|
|
101
|
-
},
|
|
102
|
-
idempotency_key: `humanish:${bundle.runId}:live-run-summary`,
|
|
103
|
-
proposed_next_state: "study-quality-review",
|
|
104
|
-
acceptance_proof: [
|
|
105
|
-
feedbackProofCommands(bundle.runId).verify,
|
|
106
|
-
feedbackProofCommands(bundle.runId).watch,
|
|
107
|
-
],
|
|
108
|
-
};
|
|
109
|
-
}
|
|
52
|
+
// A bundle without a candidate gets a draft that describes the run that happened, built from the
|
|
53
|
+
// same review lines the stakeholder surfaces show (participants and tasks keep their
|
|
54
|
+
// denominators). Feedback refuses a dry run before it gets here.
|
|
55
|
+
const participantEndings = participantOutcomeDetails(bundle.streams);
|
|
56
|
+
const review = withCuaReviewProvenance(bundle.review, bundle.streams);
|
|
57
|
+
const actualLines = [
|
|
58
|
+
review.summary,
|
|
59
|
+
...(bundle.review.participants === undefined
|
|
60
|
+
? []
|
|
61
|
+
: [
|
|
62
|
+
`Participants: ${formatParticipantOutcomes(bundle.review.participants, participantEndings)}.`,
|
|
63
|
+
]),
|
|
64
|
+
...(bundle.review.tasks === undefined
|
|
65
|
+
? []
|
|
66
|
+
: [`Tasks: ${formatRunTaskFunnel(bundle.review.tasks)}.`]),
|
|
67
|
+
];
|
|
110
68
|
return {
|
|
111
69
|
schema: FEEDBACK_SCHEMA,
|
|
112
70
|
run_id: bundle.runId,
|
|
113
|
-
adapter_id: bundle.source.packageName ??
|
|
71
|
+
adapter_id: bundle.source.packageName ?? bundle.scenario.id,
|
|
114
72
|
scenario_id: bundle.scenario.id,
|
|
115
73
|
persona_id: bundle.persona.id,
|
|
116
|
-
actor: "
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
74
|
+
actor: (bundle.streams ?? []).some((stream) => stream.actor?.lane === "computer-use")
|
|
75
|
+
? "computer-use"
|
|
76
|
+
: "unknown",
|
|
77
|
+
substrate: "unknown",
|
|
78
|
+
failure_owner: "unknown",
|
|
79
|
+
summary: "Live study completed without a participant-reported finding",
|
|
80
|
+
expected: bundle.scenario.goal,
|
|
81
|
+
actual: actualLines.join(" "),
|
|
122
82
|
source_bundle: bundlePath,
|
|
123
83
|
evidence: [
|
|
124
84
|
{
|
|
125
85
|
path: bundlePath,
|
|
126
86
|
kind: "state",
|
|
127
|
-
note: "
|
|
87
|
+
note: "Source run bundle.",
|
|
128
88
|
},
|
|
129
89
|
{
|
|
130
90
|
path: path.join(path.dirname(bundlePath), "review.md"),
|
|
131
91
|
kind: "review",
|
|
132
|
-
note: "
|
|
92
|
+
note: "The run's review: verdict, participants, and gaps.",
|
|
133
93
|
},
|
|
134
94
|
],
|
|
135
95
|
redaction: {
|
|
136
96
|
status: "passed",
|
|
137
97
|
notes: bundle.redaction.notes,
|
|
138
98
|
},
|
|
139
|
-
idempotency_key: `humanish:${bundle.runId}:
|
|
140
|
-
proposed_next_state: "
|
|
99
|
+
idempotency_key: `humanish:${bundle.runId}:live-run-summary`,
|
|
100
|
+
proposed_next_state: "study-quality-review",
|
|
141
101
|
acceptance_proof: [
|
|
142
102
|
feedbackProofCommands(bundle.runId).verify,
|
|
143
103
|
feedbackProofCommands(bundle.runId).watch,
|
|
@@ -254,11 +214,14 @@ export function isUsableFeedbackCandidate(candidate) {
|
|
|
254
214
|
!item.path.includes("://") &&
|
|
255
215
|
!item.path.includes(".."));
|
|
256
216
|
}
|
|
217
|
+
/** An evidence path inside the run directory, as "run.json" or "screenshots/step-003.png". */
|
|
218
|
+
function runRelative(draft, evidencePath) {
|
|
219
|
+
const relative = path.relative(path.dirname(draft.source_bundle), evidencePath);
|
|
220
|
+
return relative === "" || relative.startsWith("..") ? evidencePath : relative;
|
|
221
|
+
}
|
|
257
222
|
export function renderMarkdown(draft, repo) {
|
|
258
223
|
return `This issue was drafted by humanish from a verified humanish run bundle.
|
|
259
224
|
|
|
260
|
-
It contributes to public-safe simulation harness coverage. The feedback command did not mutate GitHub, commit code, or claim unobserved product behavior.
|
|
261
|
-
|
|
262
225
|
## Summary
|
|
263
226
|
|
|
264
227
|
${draft.summary}
|
|
@@ -273,14 +236,9 @@ ${draft.actual}
|
|
|
273
236
|
|
|
274
237
|
## Evidence
|
|
275
238
|
|
|
276
|
-
${draft.evidence.map((item) => `- ${item.kind}
|
|
277
|
-
|
|
278
|
-
## Filing Notes
|
|
239
|
+
${draft.evidence.map((item) => `- ${item.kind} ${runRelative(draft, item.path)}: ${item.note}`).join("\n")}
|
|
279
240
|
|
|
280
|
-
|
|
281
|
-
- GitHub mutation: not performed
|
|
282
|
-
- Substrate: ${draft.substrate}
|
|
283
|
-
- Production data: not used
|
|
241
|
+
Repository: ${repo}
|
|
284
242
|
|
|
285
243
|
\`\`\`yaml
|
|
286
244
|
humanish_feedback:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// The publish boundary for existing raw runs
|
|
1
|
+
// The publish boundary for existing raw runs. A derivative is an isolated
|
|
2
2
|
// workspace, never a new run in the source history. No provider APIs are involved.
|
|
3
3
|
import { createHash } from "node:crypto";
|
|
4
4
|
import { lstat, mkdir, mkdtemp, readdir, realpath, rename, rm, rmdir } from "node:fs/promises";
|
|
@@ -46,5 +46,9 @@ export interface ExportDeps {
|
|
|
46
46
|
/** The banner a --local-only export carries. Plain HTML, before the app root, so it renders with JS off. */
|
|
47
47
|
export declare function localOnlyBanner(reasons: string[]): string;
|
|
48
48
|
export declare function exportRun(cwdInput: string, runInput: string, options?: ExportOptions, deps?: ExportDeps): Promise<ExportResult | ExportFailure>;
|
|
49
|
-
|
|
49
|
+
/** Human output; a failure is an error the CLI prints on stderr (HumanOutput in src/cli/io.ts). */
|
|
50
|
+
export declare function formatExportHuman(result: ExportResult): string;
|
|
51
|
+
export declare function formatExportHuman(result: ExportResult | ExportFailure): string | {
|
|
52
|
+
error: ExportFailure["error"];
|
|
53
|
+
};
|
|
50
54
|
export {};
|
package/dist/feedback/export.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// `humanish export`: one file a coworker can open
|
|
1
|
+
// `humanish export`: one file a coworker can open.
|
|
2
2
|
//
|
|
3
3
|
// A run is a directory. Sharing it meant a tunnel (`serve --expose`) or a hand-zipped bundle,
|
|
4
4
|
// neither of which is "send one thing". The Observer is already a single-file artifact with the
|
|
@@ -40,7 +40,7 @@ const IMAGE_MIME = {
|
|
|
40
40
|
export function localOnlyBanner(reasons) {
|
|
41
41
|
const why = reasons.length === 0 ? "" : ` (${reasons.join(", ")})`;
|
|
42
42
|
return (`<div id="humanish-local-only" role="alert" tabindex="0" style="position:sticky;top:0;z-index:2147483647;max-height:40vh;overflow:auto;background:#7a1f1f;color:#fff;font:600 14px/1.4 system-ui,sans-serif;padding:10px 16px;text-align:center">` +
|
|
43
|
-
`
|
|
43
|
+
`Local only. This export was made from a bundle that is not share-safe${why}. Do not forward it outside the team that owns the run.` +
|
|
44
44
|
`</div>`);
|
|
45
45
|
}
|
|
46
46
|
async function isInside(root, candidate) {
|
|
@@ -146,9 +146,8 @@ async function readObserverSlot(cwd, runInput, runRoot, runId, verified, deps, w
|
|
|
146
146
|
html = await readFile(observerPath, "utf8");
|
|
147
147
|
}
|
|
148
148
|
catch {
|
|
149
|
-
// `run` writes observer-data.json and no index.html; `watch` writes both
|
|
150
|
-
//
|
|
151
|
-
// artifact watch uses, so what produced the run never decides whether it can be sent.
|
|
149
|
+
// `run` writes observer-data.json and no index.html; `watch` writes both. Render it here, from
|
|
150
|
+
// the same artifact watch uses, so what produced the run never decides whether it can be sent.
|
|
152
151
|
const rendered = await (deps.render ?? ((c, r) => renderObserver(c, r, { open: false })))(cwd, runInput).catch(() => ({ ok: false }));
|
|
153
152
|
try {
|
|
154
153
|
if (!rendered.ok)
|
|
@@ -281,7 +280,7 @@ function makePortable(inlined, verified) {
|
|
|
281
280
|
}
|
|
282
281
|
}
|
|
283
282
|
}
|
|
284
|
-
// What verify said, in the file, so the chrome can agree with the result envelope
|
|
283
|
+
// What verify said, in the file, so the chrome can agree with the result envelope.
|
|
285
284
|
const publicSafety = (inlined.publicSafety ?? {});
|
|
286
285
|
inlined.publicSafety = {
|
|
287
286
|
...publicSafety,
|
|
@@ -358,7 +357,7 @@ function renderExportHtml(inlined, analysis, assets, verified, watermarked, omit
|
|
|
358
357
|
}
|
|
359
358
|
export function formatExportHuman(result) {
|
|
360
359
|
if (!result.ok)
|
|
361
|
-
return
|
|
360
|
+
return { error: result.error };
|
|
362
361
|
if (result.format === "bundle") {
|
|
363
362
|
return [
|
|
364
363
|
`humanish export ${result.runId}`,
|
|
@@ -373,7 +372,7 @@ export function formatExportHuman(result) {
|
|
|
373
372
|
const lines = [
|
|
374
373
|
`humanish export ${result.runId}`,
|
|
375
374
|
`file: ${result.path} (${(result.bytes / 1024).toFixed(0)} KB, ${result.embeddedImages} image(s) embedded)`,
|
|
376
|
-
`share safety: ${result.shareSafety.status}${result.watermarked ? "
|
|
375
|
+
`share safety: ${result.shareSafety.status}${result.watermarked ? " (watermarked: local only)" : ""}`,
|
|
377
376
|
...result.warnings.map((warning) => `warning: ${warning}`),
|
|
378
377
|
];
|
|
379
378
|
return `${lines.join("\n")}\n`;
|
|
@@ -13,11 +13,11 @@ export interface FeedbackResult {
|
|
|
13
13
|
issueUrl?: string;
|
|
14
14
|
draft?: FeedbackDraft;
|
|
15
15
|
/** Every usable candidate on the bundle, so a multi-participant study's second and third findings can be
|
|
16
|
-
* chosen with `--candidate` instead of being invisible behind the first
|
|
16
|
+
* chosen with `--candidate` instead of being invisible behind the first. */
|
|
17
17
|
candidates?: FeedbackCandidateSummary[];
|
|
18
18
|
shareSafety?: VerifyResult["shareSafety"];
|
|
19
19
|
error?: {
|
|
20
|
-
code: "HUMANISH_RUN_NOT_FOUND" | "HUMANISH_INVALID_RUN_BUNDLE" | "HUMANISH_INVALID_FEEDBACK_DRAFT" | "HUMANISH_FEEDBACK_SHARE_SAFETY_BLOCKED" | "HUMANISH_FEEDBACK_CANDIDATE_NOT_FOUND";
|
|
20
|
+
code: "HUMANISH_RUN_NOT_FOUND" | "HUMANISH_INVALID_RUN_BUNDLE" | "HUMANISH_INVALID_FEEDBACK_DRAFT" | "HUMANISH_FEEDBACK_SHARE_SAFETY_BLOCKED" | "HUMANISH_FEEDBACK_CANDIDATE_NOT_FOUND" | "HUMANISH_FEEDBACK_REQUIRES_LIVE_RUN";
|
|
21
21
|
message: string;
|
|
22
22
|
};
|
|
23
23
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// The feedback commands: resolve a run, draft a feedback issue from it, verify the draft, render it
|
|
2
2
|
// as an issue body or URL, and list a run's candidates. What a draft contains is in draft.ts.
|
|
3
3
|
import { realpath } from "node:fs/promises";
|
|
4
|
+
import { runNotFoundMessage } from "../run/run-not-found.js";
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
import { bindExistingRunArtifactPaths, isSafeRunIdSegment, resolveLatestRunDirectory, validatePreparedRunArtifactPaths, } from "../run/paths.js";
|
|
6
7
|
import { bindExistingManagedHumanishOutputDirectory, readContainedRegularFile, writeContainedOutputFile, } from "../run/contained-output.js";
|
|
@@ -34,7 +35,24 @@ async function draftFeedbackBound(cwdInput, runInput, options = {}) {
|
|
|
34
35
|
run: runInput,
|
|
35
36
|
error: {
|
|
36
37
|
code: "HUMANISH_RUN_NOT_FOUND",
|
|
37
|
-
message:
|
|
38
|
+
message: await runNotFoundMessage(cwd, runInput),
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// A dry run exercised no product, so it has nothing to report upstream; analyze refuses it the
|
|
44
|
+
// same way (ANALYSIS_REQUIRES_LIVE_RUN).
|
|
45
|
+
if (context.loaded.bundle.mode !== "live") {
|
|
46
|
+
return {
|
|
47
|
+
context,
|
|
48
|
+
result: {
|
|
49
|
+
schema: FEEDBACK_RESULT_SCHEMA,
|
|
50
|
+
ok: false,
|
|
51
|
+
cwd,
|
|
52
|
+
run: runInput,
|
|
53
|
+
error: {
|
|
54
|
+
code: "HUMANISH_FEEDBACK_REQUIRES_LIVE_RUN",
|
|
55
|
+
message: `Run ${context.storedRunId} is a dry run, which tests no product behavior. Feedback drafts need a live run.`,
|
|
38
56
|
},
|
|
39
57
|
},
|
|
40
58
|
};
|
|
@@ -204,7 +222,7 @@ export async function listFeedback(cwdInput, runInput) {
|
|
|
204
222
|
run: runInput,
|
|
205
223
|
error: {
|
|
206
224
|
code: "HUMANISH_RUN_NOT_FOUND",
|
|
207
|
-
message:
|
|
225
|
+
message: await runNotFoundMessage(cwd, runInput),
|
|
208
226
|
},
|
|
209
227
|
};
|
|
210
228
|
}
|
|
@@ -218,7 +236,7 @@ export async function listFeedback(cwdInput, runInput) {
|
|
|
218
236
|
run: runInput,
|
|
219
237
|
...(draft ? { draftPath, draft } : {}),
|
|
220
238
|
// The choice set for `draft --candidate`: a three-participant study has up to three findings,
|
|
221
|
-
// and
|
|
239
|
+
// and each can reach a draft.
|
|
222
240
|
candidates: summarizeCandidates(context.loaded.bundle),
|
|
223
241
|
};
|
|
224
242
|
}
|
|
@@ -220,7 +220,7 @@ async function probeElement(op, session, contextId, expression) {
|
|
|
220
220
|
/**
|
|
221
221
|
* Preparation: the owner check, a CDP session (recorded on the handle as soon as it exists, so
|
|
222
222
|
* disposal detaches a partial acquisition), the owned top frame, an isolated world, and the
|
|
223
|
-
* PREPARE probe.
|
|
223
|
+
* `PREPARE` probe.
|
|
224
224
|
*/
|
|
225
225
|
async function acquireIsolatedWorld(settings, state, detach, prepared, op) {
|
|
226
226
|
await assertOwnerReady(settings, op);
|
|
@@ -267,7 +267,7 @@ function disposePrepared(state, detach, prepared, self) {
|
|
|
267
267
|
return prepared.disposal;
|
|
268
268
|
}
|
|
269
269
|
/**
|
|
270
|
-
* The handle for one preparation. paste inserts the text once: owner check, RECHECK probe, owner
|
|
270
|
+
* The handle for one preparation. paste inserts the text once: owner check, `RECHECK` probe, owner
|
|
271
271
|
* check, check, then insertText. close is the handle's disposal.
|
|
272
272
|
*/
|
|
273
273
|
function preparedHandle(settings, state, prepared, dispose) {
|
|
@@ -9,6 +9,6 @@ export declare function createGuestDesktopNativeTools(options: {
|
|
|
9
9
|
display: string;
|
|
10
10
|
/** An owner-created private directory inside the disposable guest. */
|
|
11
11
|
temporaryDirectory: string;
|
|
12
|
-
/** Owner-created cookie file; never inherit an operator's XAUTHORITY
|
|
12
|
+
/** Owner-created cookie file; never inherit an operator's `XAUTHORITY`. */
|
|
13
13
|
xauthority: string;
|
|
14
14
|
}): GuestDesktopNativeTools;
|
package/dist/guest/runtime.js
CHANGED
|
@@ -105,7 +105,7 @@ export async function runGuestRuntime(options) {
|
|
|
105
105
|
isAuthorized: () => !authority.aborted,
|
|
106
106
|
...(desktop.finishRecording ? { finishRecording: desktop.finishRecording } : {}),
|
|
107
107
|
});
|
|
108
|
-
// No await in this handoff: an immediate
|
|
108
|
+
// No await in this handoff: an immediate hello already has its sole receiver.
|
|
109
109
|
options.transport.write(encodeGuestBootstrap(identity, true), (error) => {
|
|
110
110
|
if (error)
|
|
111
111
|
terminal();
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export { runPackageLab as
|
|
2
|
-
export type { LabOutcome, LabResult, RunLabOptions } from "./run-lab.js";
|
|
3
|
-
export type { LabEvent } from "./lab/run-lab-events.js";
|
|
1
|
+
export { runPackageLab as runStudy } from "./run-lab.js";
|
|
2
|
+
export type { LabOutcome as StudyOutcome, LabResult as StudyResult, RunLabOptions as RunStudyOptions, } from "./run-lab.js";
|
|
3
|
+
export type { LabEvent as StudyEvent } from "./lab/run-lab-events.js";
|
|
4
4
|
export type { ProviderContext } from "./lab/run-lab-homes.js";
|
|
5
5
|
export { routeOf } from "./lab/plan.js";
|
|
6
|
-
export type { LabRoute } from "./lab/plan.js";
|
|
7
|
-
export { parseLabConfig } from "./lab/config.js";
|
|
8
|
-
export {
|
|
9
|
-
export type { LabConfig } from "./lab/types.js";
|
|
6
|
+
export type { LabRoute as StudyRoute } from "./lab/plan.js";
|
|
7
|
+
export { parseLabConfig as parseStudy } from "./lab/config.js";
|
|
8
|
+
export { STUDY_SCHEMA } from "./lab/types.js";
|
|
9
|
+
export type { LabConfig as StudyConfig } from "./lab/types.js";
|
|
10
10
|
export { verifyRun } from "./verify/verify.js";
|
|
11
11
|
export type { VerifyResult } from "./verify/verify.js";
|
|
12
12
|
export { renderObserver } from "./observer/render.js";
|
|
@@ -14,16 +14,18 @@ export type { ObserverResult } from "./observer/render.js";
|
|
|
14
14
|
export type { RunBundle, RunFeedbackCandidate } from "./run/bundle.js";
|
|
15
15
|
export type { ActorTrace } from "./actors/contract.js";
|
|
16
16
|
export { runComputerUseLoop, stableProgressKey } from "./actors/computer-use/loop.js";
|
|
17
|
-
export type { CuaAction, CuaExecutor, CuaLoopOptions, CuaLoopResult, CuaObservation, CuaProvider, CuaSafetyCheck, CuaTurn, CuaTurnRequest, } from "./actors/computer-use/loop.js";
|
|
17
|
+
export type { CuaAction as ComputerUseAction, CuaExecutor as ComputerUseExecutor, CuaLoopOptions as ComputerUseLoopOptions, CuaLoopResult as ComputerUseLoopResult, CuaObservation as ComputerUseObservation, CuaProvider as ComputerUseProvider, CuaSafetyCheck as ComputerUseSafetyCheck, CuaTurn as ComputerUseTurn, CuaTurnRequest as ComputerUseTurnRequest, } from "./actors/computer-use/loop.js";
|
|
18
18
|
export type { ActorCapabilities } from "./actors/contract.js";
|
|
19
19
|
export { createOpenAiResponsesProvider } from "./actors/computer-use/openai-provider.js";
|
|
20
20
|
export type { OpenAiResponsesProviderOptions } from "./actors/computer-use/openai-provider.js";
|
|
21
|
-
export { CuaAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
|
|
21
|
+
export { CuaAdmissionLimitError as ComputerUseAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
|
|
22
22
|
export { defaultRedactionHooks } from "./evidence/redaction.js";
|
|
23
23
|
export type { RedactionHooks } from "./evidence/redaction.js";
|
|
24
24
|
export type { E2BDesktopSandbox } from "./substrates/e2b/sdk.js";
|
|
25
25
|
export { browserScorer, terminalScorer } from "./lab/adapter-scorer-loader.js";
|
|
26
26
|
export type { AdapterScorerModule, AdapterScoringContext } from "./lab/adapter-scorer-loader.js";
|
|
27
|
-
export type { BrowserLabScoringContext } from "./lab/adapter-extension.js";
|
|
27
|
+
export type { BrowserLabScoringContext as BrowserScoringContext } from "./lab/adapter-extension.js";
|
|
28
28
|
export type { TerminalProductScoringContext } from "./routes/terminal/types.js";
|
|
29
29
|
export type { RunAdapterArtifact, RunAdapterScore } from "./run/bundle.js";
|
|
30
|
+
export { CuaAdmissionLimitError, LAB_CONFIG_SCHEMA, parseLabConfig, runLab, } from "./library-aliases.js";
|
|
31
|
+
export type { BrowserLabScoringContext, CuaAction, CuaExecutor, CuaLoopOptions, CuaLoopResult, CuaObservation, CuaProvider, CuaSafetyCheck, CuaTurn, CuaTurnRequest, LabConfig, LabEvent, LabOutcome, LabResult, LabRoute, RunLabOptions, } from "./library-aliases.js";
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
// The library surface: what an adopter needs to run a
|
|
1
|
+
// The library surface: what an adopter needs to run a study, read a run, bring a participant or
|
|
2
2
|
// score a run. Everything else is internal and reached through the `humanish` bin. See
|
|
3
3
|
// docs/contracts/schemas.md, "Library options", and the site's library page.
|
|
4
|
-
// Run a
|
|
5
|
-
export { runPackageLab as
|
|
4
|
+
// Run a study.
|
|
5
|
+
export { runPackageLab as runStudy } from "./run-lab.js";
|
|
6
6
|
export { routeOf } from "./lab/plan.js";
|
|
7
|
-
export { parseLabConfig } from "./lab/config.js";
|
|
8
|
-
export {
|
|
7
|
+
export { parseLabConfig as parseStudy } from "./lab/config.js";
|
|
8
|
+
export { STUDY_SCHEMA } from "./lab/types.js";
|
|
9
9
|
// Read a run.
|
|
10
10
|
export { verifyRun } from "./verify/verify.js";
|
|
11
11
|
export { renderObserver } from "./observer/render.js";
|
|
12
12
|
// Bring a participant.
|
|
13
13
|
export { runComputerUseLoop, stableProgressKey } from "./actors/computer-use/loop.js";
|
|
14
14
|
export { createOpenAiResponsesProvider } from "./actors/computer-use/openai-provider.js";
|
|
15
|
-
export { CuaAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
|
|
15
|
+
export { CuaAdmissionLimitError as ComputerUseAdmissionLimitError } from "./actors/computer-use/admission-limit.js";
|
|
16
16
|
export { defaultRedactionHooks } from "./evidence/redaction.js";
|
|
17
17
|
// Score a run.
|
|
18
18
|
export { browserScorer, terminalScorer } from "./lab/adapter-scorer-loader.js";
|
|
19
|
+
// The 0.107 names, deprecated until 0.109 removes them. Each is its new name's value or type.
|
|
20
|
+
export { CuaAdmissionLimitError, LAB_CONFIG_SCHEMA, parseLabConfig, runLab, } from "./library-aliases.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export interface ResolvedKeyFill {
|
|
2
2
|
name: string;
|
|
3
|
-
/** Human-readable source label (a path or command name)
|
|
3
|
+
/** Human-readable source label (a path or command name), never a value. */
|
|
4
4
|
source: string;
|
|
5
5
|
}
|
|
6
6
|
export interface KeyResolutionDeps {
|
|
@@ -29,8 +29,8 @@ export interface KeySourceProbe {
|
|
|
29
29
|
/** The command/path that would fill it when missing. */
|
|
30
30
|
hint: string;
|
|
31
31
|
}
|
|
32
|
-
/** The nearest fill instruction for a missing key
|
|
33
|
-
* *_KEYS_MISSING errors so the failure names the fix
|
|
32
|
+
/** The nearest fill instruction for a missing key. Doctor rows use it, and it is appended to
|
|
33
|
+
* *_KEYS_MISSING errors so the failure names the fix. */
|
|
34
34
|
export declare function missingKeyHint(name: string): string;
|
|
35
35
|
/** One shared suffix for *_KEYS_MISSING messages: where discovery looked, and what fills each
|
|
36
36
|
* missing key. Pure text; never values. */
|
|
@@ -47,10 +47,10 @@ export declare function probeKeySources(names: readonly string[], args: {
|
|
|
47
47
|
/** Resolve a `humanish keys set` target: a vendor alias or a raw env name. Null = invalid. */
|
|
48
48
|
export declare function resolveKeyName(vendorOrName: string): string | null;
|
|
49
49
|
/** Write one key into the user store (0700 dir, 0600 file). Only allowlisted provider names
|
|
50
|
-
* are storable (the store feeds implicit discovery
|
|
50
|
+
* are storable (the store feeds implicit discovery, so an arbitrary-name store would be an env
|
|
51
51
|
* injection vector with extra steps). The value must be a single non-empty line that
|
|
52
52
|
* round-trips the store's own parser byte-identically, and the write refuses symlinks at the
|
|
53
|
-
* file and its parent directory
|
|
53
|
+
* file and its parent directory. */
|
|
54
54
|
export declare function setUserKey(name: string, value: string, env: NodeJS.ProcessEnv, deps?: KeyResolutionDeps): {
|
|
55
55
|
path: string;
|
|
56
56
|
};
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
// Provider-key discovery
|
|
1
|
+
// Provider-key discovery: resolve the keys a live run needs through each vendor's
|
|
2
2
|
// native chain instead of demanding a per-repo --env-file that operators hand-copy keys into.
|
|
3
3
|
//
|
|
4
|
-
// The chain, per key,
|
|
5
|
-
// 1. process env
|
|
6
|
-
// 2. `.humanish/local/provider.env
|
|
4
|
+
// The chain, per key, fill-only (a rung never overrides anything already present):
|
|
5
|
+
// 1. process env, including whatever --env-file just loaded (explicit always wins);
|
|
6
|
+
// 2. `.humanish/local/provider.env`, the project-local overlay this CLI's own --help
|
|
7
7
|
// examples document;
|
|
8
8
|
// 3. the owning vendor's native store, where one exists:
|
|
9
9
|
// E2B_API_KEY <- ~/.e2b/config.json (written by `e2b auth login`);
|
|
10
10
|
// GH_TOKEN <- `gh auth token` (the gh CLI's credential chain);
|
|
11
11
|
// 4. the humanish user-level store `$XDG_CONFIG_HOME/humanish/keys.env`, written only by
|
|
12
|
-
// `humanish keys set` (0600, prompted or --stdin)
|
|
12
|
+
// `humanish keys set` (0600, prompted or --stdin), the fallback for vendors that ship
|
|
13
13
|
// no machine chain of their own (OpenAI, Anthropic).
|
|
14
14
|
//
|
|
15
15
|
// Every fill is announced by key name + source, never by value. The subject app's own
|
|
16
16
|
// `.env`/`.env.local` are never read: those hold product credentials, a different class
|
|
17
|
-
//
|
|
18
|
-
// `HUMANISH_STRICT_KEYS=1` disables every rung below process env
|
|
17
|
+
// of secret; this module only reads humanish-owned files and vendor-owned stores.
|
|
18
|
+
// `HUMANISH_STRICT_KEYS=1` disables every rung below process env.
|
|
19
19
|
import { spawn } from "node:child_process";
|
|
20
20
|
import { chmodSync, closeSync, constants as fsConstants, existsSync, ftruncateSync, lstatSync, mkdirSync, openSync, readFileSync, writeSync, } from "node:fs";
|
|
21
21
|
import { homedir } from "node:os";
|
|
@@ -24,7 +24,7 @@ import { loadEnvFile } from "./env-file.js";
|
|
|
24
24
|
/** The only names implicit discovery may fill (and `humanish keys set` may store). Everything
|
|
25
25
|
* else in an overlay/store file is ignored-and-named: a repo-planted NODE_OPTIONS/LD_PRELOAD
|
|
26
26
|
* must never enter process env off a file the operator did not explicitly pass (an explicit
|
|
27
|
-
* --env-file remains the operator's own full-file load).
|
|
27
|
+
* --env-file remains the operator's own full-file load). */
|
|
28
28
|
const KNOWN_PROVIDER_KEYS = [
|
|
29
29
|
"OPENAI_API_KEY",
|
|
30
30
|
"ANTHROPIC_API_KEY",
|
|
@@ -52,7 +52,7 @@ export function userKeyStorePath(env, deps = {}) {
|
|
|
52
52
|
const home = deps.homeDir ?? homedir();
|
|
53
53
|
const declared = env.XDG_CONFIG_HOME?.trim();
|
|
54
54
|
// The XDG spec: a relative XDG_CONFIG_HOME must be ignored. Honoring one would make the
|
|
55
|
-
// key store cwd-relative
|
|
55
|
+
// key store cwd-relative: `humanish keys set` would write a secret into the current repo.
|
|
56
56
|
const configHome = declared !== undefined && declared !== "" && path.isAbsolute(declared)
|
|
57
57
|
? declared
|
|
58
58
|
: path.join(home, ".config");
|
|
@@ -151,16 +151,16 @@ export async function discoverProviderKeys(args) {
|
|
|
151
151
|
const fills = [];
|
|
152
152
|
const ignored = [];
|
|
153
153
|
// Fill-only means presence wins, including an explicitly-set empty value: an operator who
|
|
154
|
-
// exported OPENAI_API_KEY="" said "off", and a rung that "fixes" that has overridden them
|
|
155
|
-
//
|
|
154
|
+
// exported OPENAI_API_KEY="" said "off", and a rung that "fixes" that has overridden them.
|
|
155
|
+
// Only a truly-unset name is fillable.
|
|
156
156
|
const fillable = (name) => env[name] === undefined;
|
|
157
157
|
const fill = (name, value, source) => {
|
|
158
158
|
env[name] = value;
|
|
159
159
|
fills.push({ name, source });
|
|
160
160
|
};
|
|
161
161
|
// Rung 2: the documented project-local overlay. Parsed atomically against a scratch env so a
|
|
162
|
-
// file loadEnvFile rejects can never half-apply
|
|
163
|
-
// in env unannounced
|
|
162
|
+
// file loadEnvFile rejects can never half-apply: otherwise lines before the parse error would
|
|
163
|
+
// land in env unannounced. Only allowlisted provider names cross
|
|
164
164
|
// from the file into the real env.
|
|
165
165
|
const overlayPath = path.resolve(cwd, PROJECT_OVERLAY_RELATIVE);
|
|
166
166
|
if (isRegularFile(overlayPath) && !dirIsSymlink(overlayPath)) {
|
|
@@ -196,7 +196,7 @@ export async function discoverProviderKeys(args) {
|
|
|
196
196
|
}
|
|
197
197
|
// Rung 4: the humanish user-level store, read with the same lenient parser `keys set`/`list`
|
|
198
198
|
// use, so one hand-mangled line degrades to that line alone instead of silently voiding the
|
|
199
|
-
// whole store
|
|
199
|
+
// whole store, as the strict parser would.
|
|
200
200
|
const storePath = userKeyStorePath(env, deps);
|
|
201
201
|
if (isRegularFile(storePath) && !dirIsSymlink(storePath)) {
|
|
202
202
|
for (const [name, value] of readStoreEntries(storePath)) {
|
|
@@ -213,11 +213,11 @@ export async function discoverProviderKeys(args) {
|
|
|
213
213
|
if (announced === undefined || announced.has(fill_.name))
|
|
214
214
|
announce(`humanish keys: ${fill_.name} from ${fill_.source}`);
|
|
215
215
|
for (const name of ignored)
|
|
216
|
-
announce(`humanish keys: ignored
|
|
216
|
+
announce(`humanish keys: ignored ${name}, which is not a provider key. Discovery loads provider keys only; pass the file with --env-file to load every name in it.`);
|
|
217
217
|
return fills;
|
|
218
218
|
}
|
|
219
219
|
/** True when the file's parent directory is (or traverses) a symlink at its last component:
|
|
220
|
-
* the dir-level retarget that defeats a file-level lstat check
|
|
220
|
+
* the dir-level retarget that defeats a file-level lstat check. */
|
|
221
221
|
function dirIsSymlink(filePath) {
|
|
222
222
|
try {
|
|
223
223
|
return lstatSync(path.dirname(filePath)).isSymbolicLink();
|
|
@@ -230,8 +230,8 @@ function storeLabel(env, deps) {
|
|
|
230
230
|
const home = deps.homeDir ?? homedir();
|
|
231
231
|
return userKeyStorePath(env, deps).replace(home, "~");
|
|
232
232
|
}
|
|
233
|
-
/** The nearest fill instruction for a missing key
|
|
234
|
-
* *_KEYS_MISSING errors so the failure names the fix
|
|
233
|
+
/** The nearest fill instruction for a missing key. Doctor rows use it, and it is appended to
|
|
234
|
+
* *_KEYS_MISSING errors so the failure names the fix. */
|
|
235
235
|
export function missingKeyHint(name) {
|
|
236
236
|
switch (name) {
|
|
237
237
|
case "E2B_API_KEY":
|
|
@@ -273,7 +273,7 @@ export async function probeKeySources(names, args) {
|
|
|
273
273
|
return names.map((name) => {
|
|
274
274
|
const inEnv = args.env[name] !== undefined && args.env[name]?.trim() !== "";
|
|
275
275
|
// GH_TOKEN and GITHUB_TOKEN are one credential with two spellings; a doctor row that says
|
|
276
|
-
// "missing" while GITHUB_TOKEN sits in the env would be wrong
|
|
276
|
+
// "missing" while GITHUB_TOKEN sits in the env would be wrong.
|
|
277
277
|
const aliasInEnv = name === "GH_TOKEN" &&
|
|
278
278
|
args.env.GITHUB_TOKEN !== undefined &&
|
|
279
279
|
args.env.GITHUB_TOKEN.trim() !== "";
|
|
@@ -294,10 +294,10 @@ export function resolveKeyName(vendorOrName) {
|
|
|
294
294
|
return ENV_NAME.test(vendorOrName) ? vendorOrName : null;
|
|
295
295
|
}
|
|
296
296
|
/** Write one key into the user store (0700 dir, 0600 file). Only allowlisted provider names
|
|
297
|
-
* are storable (the store feeds implicit discovery
|
|
297
|
+
* are storable (the store feeds implicit discovery, so an arbitrary-name store would be an env
|
|
298
298
|
* injection vector with extra steps). The value must be a single non-empty line that
|
|
299
299
|
* round-trips the store's own parser byte-identically, and the write refuses symlinks at the
|
|
300
|
-
* file and its parent directory
|
|
300
|
+
* file and its parent directory. */
|
|
301
301
|
export function setUserKey(name, value, env, deps = {}) {
|
|
302
302
|
const trimmed = value.trim();
|
|
303
303
|
if (trimmed.length === 0 || /[\u0000-\u001f\u007f]/.test(trimmed)) {
|
|
@@ -363,8 +363,8 @@ function readStoreEntries(storePath) {
|
|
|
363
363
|
function writeStore(storePath, entries) {
|
|
364
364
|
const body = [...entries.entries()].map(([name, value]) => `${name}=${value}`).join("\n");
|
|
365
365
|
const text = body.length > 0 ? `${body}\n` : "";
|
|
366
|
-
// O_NOFOLLOW: a symlinked keys.env must never carry the write to its target
|
|
367
|
-
//
|
|
366
|
+
// O_NOFOLLOW: a symlinked keys.env must never carry the write to its target, which would put a
|
|
367
|
+
// secret into an attacker-chosen file.
|
|
368
368
|
const fd = openSync(storePath, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_NOFOLLOW, 0o600);
|
|
369
369
|
try {
|
|
370
370
|
ftruncateSync(fd, 0);
|