humanish 0.106.1 → 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 +38 -32
- package/CHANGELOG.md +28 -0
- package/CONTEXT.md +51 -41
- package/README.md +152 -174
- 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-client.js +2 -1
- package/dist/actors/codex/app-server-trace.d.ts +0 -1
- package/dist/actors/codex/app-server-trace.js +1 -3
- package/dist/actors/codex/app-server-ui.js +1 -1
- package/dist/actors/codex/app-server.js +2 -1
- package/dist/actors/codex/codex-admission.d.ts +91 -0
- package/dist/actors/codex/codex-admission.js +150 -0
- package/dist/actors/codex/protocol-compat.d.ts +27 -0
- package/dist/actors/codex/protocol-compat.js +357 -0
- package/dist/actors/codex/protocol-contract.d.ts +61 -0
- package/dist/actors/codex/protocol-contract.js +471 -0
- package/dist/actors/codex/restricted-executable.d.ts +28 -4
- package/dist/actors/codex/restricted-executable.js +104 -29
- package/dist/actors/codex/restricted-launch.d.ts +9 -2
- package/dist/actors/codex/restricted-launch.js +43 -4
- package/dist/actors/codex/restricted-notifications.d.ts +101 -0
- package/dist/actors/codex/restricted-notifications.js +277 -0
- package/dist/actors/codex/restricted-participant.d.ts +30 -0
- package/dist/actors/codex/restricted-participant.js +66 -6
- package/dist/actors/codex/restricted-policy.d.ts +11 -3
- package/dist/actors/codex/restricted-policy.js +2 -2
- package/dist/actors/codex/restricted-session.d.ts +16 -3
- package/dist/actors/codex/restricted-session.js +60 -22
- package/dist/actors/codex/restricted-transport.d.ts +29 -0
- package/dist/actors/codex/restricted-transport.js +139 -27
- package/dist/actors/codex/restricted-turn.d.ts +19 -4
- package/dist/actors/codex/restricted-turn.js +43 -30
- package/dist/actors/computer-use/actor.d.ts +17 -17
- package/dist/actors/computer-use/actor.js +6 -6
- 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 +15 -13
- package/dist/actors/computer-use/loop/ending.d.ts +7 -7
- package/dist/actors/computer-use/loop/ending.js +9 -9
- 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 +2 -2
- package/dist/actors/computer-use/loop/spend.js +4 -4
- package/dist/actors/computer-use/loop/trace.js +11 -10
- package/dist/actors/computer-use/loop/types.d.ts +37 -26
- package/dist/actors/computer-use/loop/usage.js +2 -2
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-context.d.ts +37 -0
- package/dist/actors/computer-use/openai-context.js +214 -0
- package/dist/actors/computer-use/openai-provider.d.ts +12 -9
- package/dist/actors/computer-use/openai-provider.js +47 -36
- 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 +86 -49
- 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/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +19 -1
- package/dist/actors/scripted-browser/types.d.ts +12 -2
- package/dist/actors/stop-conditions.d.ts +1 -1
- package/dist/actors/stop-conditions.js +1 -3
- package/dist/analysis/automatic-completion.d.ts +13 -8
- package/dist/analysis/automatic-completion.js +14 -8
- package/dist/analysis/automatic-config.d.ts +1 -1
- package/dist/analysis/automatic-config.js +2 -2
- package/dist/analysis/automatic.d.ts +10 -4
- package/dist/analysis/automatic.js +17 -13
- package/dist/analysis/codex-config.d.ts +6 -2
- package/dist/analysis/codex-config.js +22 -14
- package/dist/analysis/diagnostics.d.ts +23 -0
- package/dist/analysis/diagnostics.js +112 -0
- package/dist/analysis/evidence-sources.js +2 -2
- package/dist/analysis/evidence.js +6 -6
- package/dist/analysis/execute.d.ts +7 -1
- package/dist/analysis/execute.js +39 -12
- package/dist/analysis/job.d.ts +8 -5
- package/dist/analysis/job.js +15 -14
- package/dist/analysis/load.d.ts +1 -1
- package/dist/analysis/load.js +5 -5
- package/dist/analysis/provider.d.ts +9 -1
- package/dist/analysis/restricted-codex.d.ts +2 -0
- package/dist/analysis/restricted-codex.js +10 -1
- package/dist/analysis/service.d.ts +2 -0
- package/dist/analysis/service.js +35 -16
- package/dist/analysis/sharing.d.ts +2 -2
- package/dist/analysis/sharing.js +5 -5
- package/dist/analysis/store-executions.d.ts +5 -5
- package/dist/analysis/store-executions.js +12 -12
- package/dist/analysis/store.d.ts +4 -4
- package/dist/analysis/store.js +13 -13
- package/dist/cli/commands/analysis-signals.d.ts +2 -1
- package/dist/cli/commands/analysis-signals.js +4 -1
- package/dist/cli/commands/analyze.js +23 -18
- package/dist/cli/commands/codex.js +9 -9
- package/dist/cli/commands/comms.js +62 -34
- 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.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +32 -21
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +7 -7
- package/dist/cli/commands/lab-route-run.d.ts +6 -4
- package/dist/cli/commands/lab-route-run.js +6 -2
- package/dist/cli/commands/lab-route-scripted.d.ts +0 -2
- package/dist/cli/commands/lab-route-scripted.js +0 -1
- package/dist/cli/commands/lab-route-shared-world.d.ts +0 -2
- package/dist/cli/commands/lab-route-shared-world.js +3 -4
- package/dist/cli/commands/lab-route-terminal.d.ts +0 -2
- package/dist/cli/commands/lab-route-terminal.js +0 -1
- package/dist/cli/commands/lab-run.js +84 -54
- package/dist/cli/commands/lab-scorer.d.ts +2 -4
- 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 +168 -107
- package/dist/cli/commands/run-command.d.ts +10 -0
- package/dist/cli/commands/run-command.js +85 -0
- package/dist/cli/commands/run-signals.d.ts +30 -0
- package/dist/cli/commands/run-signals.js +146 -0
- package/dist/cli/commands/runs.js +137 -136
- 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 +64 -77
- package/dist/cli/deprecations.d.ts +18 -0
- package/dist/cli/deprecations.js +48 -0
- package/dist/cli/doctor.d.ts +18 -5
- package/dist/cli/doctor.js +111 -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 +46 -10
- package/dist/cli/io.js +109 -30
- 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 +112 -43
- package/dist/cli/telemetry.d.ts +17 -17
- package/dist/cli/telemetry.js +49 -41
- package/dist/cli.js +1 -1
- package/dist/comms/capture-surface.d.ts +14 -13
- package/dist/comms/capture-surface.js +23 -22
- package/dist/comms/catch-host.d.ts +8 -8
- package/dist/comms/catch-host.js +14 -14
- package/dist/comms/connections.js +4 -4
- package/dist/comms/email-catch.d.ts +3 -3
- package/dist/comms/email-catch.js +8 -8
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- 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/lease-store.js +7 -7
- 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 +4 -4
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- 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 +5 -5
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +41 -85
- package/dist/feedback/export-bundle.js +5 -5
- package/dist/feedback/export.d.ts +5 -1
- package/dist/feedback/export.js +16 -17
- package/dist/feedback/feedback.d.ts +3 -3
- 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 +14 -15
- package/dist/index.js +10 -11
- package/dist/keys/key-resolution.d.ts +7 -5
- package/dist/keys/key-resolution.js +40 -38
- package/dist/lab/adapter-extension.d.ts +35 -13
- package/dist/lab/adapter-extension.js +50 -134
- package/dist/lab/adapter-scorer-loader.d.ts +32 -12
- package/dist/lab/adapter-scorer-loader.js +56 -32
- package/dist/lab/composition-rules.js +58 -58
- package/dist/lab/config.js +85 -43
- package/dist/lab/deprecated-fields.d.ts +10 -0
- package/dist/lab/deprecated-fields.js +24 -0
- package/dist/lab/device-presets.d.ts +10 -10
- package/dist/lab/device-presets.js +11 -11
- package/dist/lab/discover.d.ts +13 -9
- package/dist/lab/discover.js +118 -60
- package/dist/lab/doctor.d.ts +53 -11
- package/dist/lab/doctor.js +193 -47
- package/dist/lab/init-plan.js +1 -3
- 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 +43 -9
- package/dist/lab/lab-deps.d.ts +80 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +17 -16
- package/dist/lab/parse/comms.js +8 -7
- package/dist/lab/parse/execution.js +15 -14
- 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 +18 -17
- package/dist/lab/parse/subject.js +30 -29
- package/dist/lab/parse/values.d.ts +1 -2
- package/dist/lab/parse/values.js +3 -6
- package/dist/lab/persona-resolve.d.ts +7 -7
- package/dist/lab/persona-resolve.js +8 -8
- package/dist/lab/persona.js +1 -3
- package/dist/lab/plan-base.d.ts +0 -2
- package/dist/lab/plan-base.js +6 -4
- package/dist/lab/plan-participants.d.ts +7 -7
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +26 -8
- package/dist/lab/plan.d.ts +4 -18
- package/dist/lab/plan.js +24 -79
- package/dist/lab/preflight-probes.js +11 -11
- package/dist/lab/preflight-result.d.ts +2 -1
- package/dist/lab/preflight-result.js +5 -6
- package/dist/lab/preflight.d.ts +7 -8
- package/dist/lab/preflight.js +6 -6
- package/dist/lab/requirements.d.ts +20 -0
- package/dist/lab/requirements.js +54 -0
- package/dist/lab/route-inputs.d.ts +23 -12
- package/dist/lab/route-inputs.js +48 -51
- package/dist/lab/routing.d.ts +42 -41
- package/dist/lab/routing.js +66 -68
- package/dist/lab/run-lab-events.d.ts +3 -11
- package/dist/lab/run-lab-events.js +2 -16
- package/dist/lab/run-lab-homes.d.ts +76 -0
- package/dist/lab/run-lab-homes.js +7 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +58 -285
- package/dist/lab/summary.d.ts +15 -9
- package/dist/lab/summary.js +24 -17
- package/dist/lab/tasks.d.ts +15 -15
- package/dist/lab/tasks.js +14 -14
- package/dist/lab/types.d.ts +201 -195
- package/dist/lab/types.js +2 -0
- package/dist/lab/validation.d.ts +21 -21
- package/dist/lab/validation.js +61 -59
- package/dist/lab/warnings.d.ts +10 -0
- package/dist/lab/warnings.js +70 -41
- package/dist/library-aliases.d.ts +56 -0
- package/dist/library-aliases.js +22 -0
- package/dist/observer/artifact.d.ts +2 -2
- package/dist/observer/artifact.js +9 -9
- package/dist/observer/data.d.ts +6 -6
- package/dist/observer/data.js +7 -6
- 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 +12 -7
- package/dist/observer/run-routes.d.ts +4 -4
- package/dist/observer/run-routes.js +6 -6
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +41 -6
- 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 +24 -17
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +12 -18
- package/dist/routes/computer-use/diagnostics.d.ts +1 -1
- package/dist/routes/computer-use/diagnostics.js +1 -1
- package/dist/routes/computer-use/e2b-desktop/comms.d.ts +11 -11
- package/dist/routes/computer-use/e2b-desktop/comms.js +24 -27
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +8 -11
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +16 -15
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +20 -19
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +40 -43
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +32 -30
- package/dist/routes/computer-use/e2b-desktop/state.d.ts +5 -4
- package/dist/routes/computer-use/e2b-desktop/state.js +5 -3
- package/dist/routes/computer-use/e2b-desktop/teardown.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/teardown.js +33 -20
- package/dist/routes/computer-use/external-comms.d.ts +4 -4
- package/dist/routes/computer-use/external-comms.js +19 -43
- package/dist/routes/computer-use/fanout-bundle.d.ts +3 -3
- package/dist/routes/computer-use/fanout-bundle.js +38 -42
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +33 -28
- package/dist/routes/computer-use/in-process-desktop.d.ts +3 -10
- package/dist/routes/computer-use/in-process-desktop.js +3 -9
- package/dist/routes/computer-use/live-flush.d.ts +7 -5
- package/dist/routes/computer-use/live-flush.js +20 -28
- package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +4 -2
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +17 -16
- package/dist/routes/computer-use/local-tree-pack.d.ts +3 -3
- package/dist/routes/computer-use/local-tree-pack.js +4 -5
- package/dist/routes/computer-use/local-vm.d.ts +11 -8
- package/dist/routes/computer-use/local-vm.js +40 -67
- package/dist/routes/computer-use/participant-desktop.d.ts +8 -23
- package/dist/routes/computer-use/participant-desktop.js +5 -25
- package/dist/routes/computer-use/{lanes.d.ts → participant-execution.d.ts} +11 -11
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +39 -26
- package/dist/routes/computer-use/participant-facts.d.ts +7 -1
- package/dist/routes/computer-use/participant-facts.js +12 -1
- package/dist/routes/computer-use/participant-model.d.ts +25 -11
- package/dist/routes/computer-use/participant-model.js +76 -34
- package/dist/routes/computer-use/participant-prompt.d.ts +13 -13
- package/dist/routes/computer-use/participant-prompt.js +8 -8
- package/dist/routes/computer-use/participant-runs.d.ts +11 -11
- package/dist/routes/computer-use/participant-runs.js +18 -18
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +70 -78
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +40 -36
- package/dist/routes/computer-use/rerun-selection.js +11 -7
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +48 -38
- package/dist/routes/computer-use/route.d.ts +5 -5
- package/dist/routes/computer-use/route.js +36 -33
- package/dist/routes/computer-use/self-report.d.ts +8 -8
- package/dist/routes/computer-use/self-report.js +33 -33
- package/dist/routes/computer-use/setup.d.ts +9 -15
- package/dist/routes/computer-use/setup.js +106 -83
- package/dist/routes/computer-use/single-bundle.d.ts +13 -16
- package/dist/routes/computer-use/single-bundle.js +46 -53
- package/dist/routes/computer-use/subject-projection.d.ts +6 -8
- package/dist/routes/computer-use/subject-projection.js +24 -23
- package/dist/routes/computer-use/types.d.ts +195 -238
- package/dist/routes/computer-use/types.js +21 -13
- package/dist/routes/preview.d.ts +8 -2
- package/dist/routes/preview.js +8 -5
- package/dist/routes/scripted/bundle.d.ts +5 -8
- package/dist/routes/scripted/bundle.js +23 -27
- package/dist/routes/scripted/plan.d.ts +6 -8
- package/dist/routes/scripted/plan.js +15 -13
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +15 -11
- package/dist/routes/scripted/route.js +15 -17
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +3 -3
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +27 -26
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +10 -6
- package/dist/routes/scripted/surface-records.js +4 -4
- package/dist/routes/scripted/surface-sessions.d.ts +2 -2
- package/dist/routes/scripted/surface-sessions.js +4 -4
- package/dist/routes/scripted/types.d.ts +21 -40
- package/dist/routes/scripted/types.js +2 -3
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +17 -16
- package/dist/routes/shared-world/bundle.d.ts +7 -7
- package/dist/routes/shared-world/bundle.js +60 -62
- package/dist/routes/shared-world/checkpoints.d.ts +5 -5
- package/dist/routes/shared-world/checkpoints.js +5 -5
- package/dist/routes/shared-world/comms.d.ts +8 -7
- package/dist/routes/shared-world/comms.js +38 -51
- package/dist/routes/shared-world/external-public.d.ts +6 -5
- package/dist/routes/shared-world/external-public.js +28 -25
- package/dist/routes/shared-world/handoff.d.ts +10 -9
- package/dist/routes/shared-world/handoff.js +89 -81
- package/dist/routes/shared-world/lobby-code.d.ts +7 -7
- package/dist/routes/shared-world/lobby-code.js +22 -22
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +15 -12
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +65 -63
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +8 -9
- package/dist/routes/shared-world/provenance.d.ts +4 -4
- package/dist/routes/shared-world/provenance.js +4 -4
- package/dist/routes/shared-world/provisioned.d.ts +3 -2
- package/dist/routes/shared-world/provisioned.js +55 -48
- package/dist/routes/shared-world/result.js +47 -36
- package/dist/routes/shared-world/route.js +54 -57
- package/dist/routes/shared-world/setup.d.ts +6 -5
- package/dist/routes/shared-world/setup.js +16 -18
- package/dist/routes/shared-world/types.d.ts +70 -141
- package/dist/routes/shared-world/types.js +5 -5
- package/dist/routes/terminal/adapter.d.ts +10 -10
- package/dist/routes/terminal/adapter.js +32 -129
- package/dist/routes/terminal/bundle.d.ts +10 -15
- package/dist/routes/terminal/bundle.js +43 -52
- package/dist/routes/terminal/credentials.d.ts +4 -4
- package/dist/routes/terminal/credentials.js +20 -20
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +13 -15
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +4 -4
- package/dist/routes/terminal/ledger.d.ts +8 -8
- package/dist/routes/terminal/ledger.js +22 -22
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +24 -23
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +31 -32
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/persona.js +1 -1
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +23 -19
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +12 -12
- package/dist/routes/terminal/route.js +30 -31
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +4 -4
- package/dist/routes/terminal/sandbox.js +10 -10
- package/dist/routes/terminal/session.js +22 -19
- package/dist/routes/terminal/token-usage.d.ts +1 -1
- package/dist/routes/terminal/token-usage.js +10 -11
- package/dist/routes/terminal/trace.d.ts +7 -10
- package/dist/routes/terminal/trace.js +11 -66
- package/dist/routes/terminal/types.d.ts +104 -114
- package/dist/routes/terminal/types.js +12 -7
- package/dist/run/active-runs.d.ts +13 -0
- package/dist/run/active-runs.js +12 -0
- package/dist/run/bundle-shape.d.ts +2 -1
- package/dist/run/bundle-shape.js +7 -7
- package/dist/run/bundle.d.ts +99 -92
- package/dist/run/bundle.js +10 -8
- package/dist/run/cost-summary.js +6 -5
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +17 -11
- package/dist/run/detail.d.ts +9 -9
- package/dist/run/detail.js +10 -10
- package/dist/run/dry-run-inputs.js +1 -1
- package/dist/run/dry-run.js +23 -30
- package/dist/run/{study-files.d.ts → evidence-files.d.ts} +4 -4
- package/dist/run/{study-files.js → evidence-files.js} +5 -5
- package/dist/run/feedback-shape.js +1 -1
- package/dist/run/judge.d.ts +34 -16
- package/dist/run/judge.js +41 -14
- package/dist/run/locate.d.ts +2 -0
- package/dist/run/locate.js +3 -1
- package/dist/run/outcomes.d.ts +3 -3
- package/dist/run/outcomes.js +3 -3
- package/dist/run/participant-records.d.ts +2 -2
- package/dist/run/participant-records.js +2 -2
- package/dist/run/paths.d.ts +1 -1
- package/dist/run/paths.js +2 -2
- package/dist/run/pricing.d.ts +30 -15
- package/dist/run/pricing.js +49 -30
- package/dist/run/projection.d.ts +27 -27
- package/dist/run/projection.js +23 -23
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +15 -5
- package/dist/run/results.d.ts +5 -5
- package/dist/run/run-index.d.ts +9 -7
- package/dist/run/run-index.js +24 -25
- 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 +7 -4
- package/dist/run/run.js +10 -6
- package/dist/run/sandbox-receipts.d.ts +5 -5
- package/dist/run/sandbox-receipts.js +6 -6
- package/dist/run/shared-world-evidence.d.ts +67 -66
- package/dist/run/shared-world-evidence.js +4 -4
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +16 -16
- package/dist/run/stats.d.ts +17 -11
- package/dist/run/stats.js +124 -66
- package/dist/run/status.d.ts +21 -32
- package/dist/run/status.js +34 -33
- package/dist/run/stored-runs.js +2 -1
- package/dist/run/stream-shape.js +1 -1
- package/dist/run/streams.d.ts +29 -22
- 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/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- package/dist/run/text.d.ts +2 -0
- package/dist/run/text.js +4 -0
- package/dist/run/transient-comms-secrets.d.ts +5 -0
- package/dist/run/transient-comms-secrets.js +12 -0
- package/dist/run-lab.d.ts +40 -38
- package/dist/run-lab.js +42 -40
- 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 +2 -2
- package/dist/subject/desktop-cli.js +3 -3
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +5 -5
- package/dist/subject/local-tree.d.ts +3 -3
- package/dist/subject/local-tree.js +1 -1
- package/dist/subject/node-bootstrap.d.ts +1 -1
- package/dist/subject/node-bootstrap.js +4 -4
- package/dist/subject/runtime.js +10 -11
- package/dist/subject/serve.d.ts +1 -1
- package/dist/subject/serve.js +4 -4
- package/dist/subject/state.d.ts +1 -1
- package/dist/subject/steps.d.ts +8 -8
- package/dist/subject/steps.js +7 -7
- 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 +11 -11
- package/dist/substrates/e2b/cdp-probe.js +15 -18
- package/dist/substrates/e2b/desktop-browser.d.ts +5 -5
- package/dist/substrates/e2b/desktop-browser.js +12 -12
- package/dist/substrates/e2b/desktop-cdp.d.ts +15 -15
- package/dist/substrates/e2b/desktop-cdp.js +11 -11
- 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 +6 -6
- package/dist/substrates/e2b/desktop-geometry.js +9 -9
- package/dist/substrates/e2b/desktop-media.d.ts +1 -1
- package/dist/substrates/e2b/desktop-media.js +3 -3
- 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 +2 -2
- package/dist/substrates/e2b/sdk.d.ts +11 -11
- package/dist/substrates/e2b/sdk.js +8 -8
- package/dist/substrates/local/runtime-host.d.ts +2 -0
- package/dist/substrates/local/runtime-host.js +6 -0
- package/dist/tui/actions.d.ts +8 -6
- package/dist/tui/actions.js +31 -22
- 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 +83 -83
- package/dist/verify/actor.d.ts +14 -14
- package/dist/verify/actor.js +45 -45
- package/dist/verify/artifacts.d.ts +3 -3
- package/dist/verify/artifacts.js +6 -6
- package/dist/verify/context-growth.d.ts +9 -0
- package/dist/verify/context-growth.js +62 -0
- package/dist/verify/costs.d.ts +7 -7
- package/dist/verify/costs.js +9 -9
- package/dist/verify/liveness.d.ts +1 -1
- package/dist/verify/liveness.js +4 -1
- package/dist/verify/rerun.d.ts +1 -1
- package/dist/verify/rerun.js +1 -1
- 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 +18 -18
- package/dist/verify/subject.d.ts +4 -4
- package/dist/verify/subject.js +18 -18
- package/dist/verify/verify.js +98 -49
- package/docs/README.md +26 -33
- package/docs/architecture/actor-contract.md +105 -98
- package/docs/architecture/desktop-sessions.md +14 -14
- package/docs/architecture/external-public-shared-world.md +66 -59
- package/docs/architecture/github-feedback-loop.md +1 -4
- package/docs/architecture/guest-desktop.md +2 -2
- package/docs/architecture/observer.md +37 -37
- package/docs/architecture/restricted-codex-analysis.md +70 -30
- package/docs/architecture/serve.md +34 -37
- package/docs/architecture/state-driven-executor.md +55 -59
- package/docs/architecture/task-protocol-support.md +7 -9
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +83 -115
- 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 +54 -51
- package/docs/contracts/schemas.md +505 -390
- package/docs/contracts/study-analysis.md +26 -2
- 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/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- 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 +8 -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 +63 -60
- package/skills/humanish/agents/openai.yaml +1 -1
- package/AGENTS.md +0 -99
- package/CONTRIBUTING.md +0 -148
- package/dist/actors/codex/qualified-versions.d.ts +0 -45
- package/dist/actors/codex/qualified-versions.js +0 -87
- package/dist/cli/commands/lab.d.ts +0 -3
- package/dist/cli/commands/lab.js +0 -193
- package/dist/deprecated.d.ts +0 -90
- package/dist/deprecated.js +0 -106
- package/dist/lab/bag-overrides.d.ts +0 -18
- package/dist/lab/bag-overrides.js +0 -121
- package/dist/observer/static.d.ts +0 -39
- package/dist/observer/static.js +0 -369
- package/dist/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- 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 -294
- 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/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
package/dist/lab/warnings.js
CHANGED
|
@@ -12,13 +12,14 @@ const scriptedRoute = (routes) => !promptRoute(routes) && routes.scripted;
|
|
|
12
12
|
const otherRoute = (routes) => !promptRoute(routes) && !routes.scripted;
|
|
13
13
|
/** Rows for each actor, reported as `actors[<index>].<field>`, in this order per actor. */
|
|
14
14
|
const ACTOR_ROWS = [
|
|
15
|
-
// Shared-world
|
|
15
|
+
// Shared-world-only fields on the roster: a participant's `entry` is inert anywhere else
|
|
16
|
+
// (claims match mechanism).
|
|
16
17
|
{
|
|
17
18
|
field: "lanes[].entry",
|
|
18
|
-
reason: "the per-
|
|
19
|
+
reason: "the per-participant loopback entry is a shared-world capability; needs subject.topology: shared-world",
|
|
19
20
|
applies: (actor, routes) => Boolean(rosterOf(actor)?.some((entry) => entry.entry !== undefined)) && !routes.shared,
|
|
20
21
|
},
|
|
21
|
-
// The host
|
|
22
|
+
// The host marker acts only on the external-public shared-world route; inert elsewhere.
|
|
22
23
|
{
|
|
23
24
|
field: "lanes[].host",
|
|
24
25
|
reason: "the designated host-participant marker; needs the external-public shared-world route: app-url × topology shared-world × allowPublicTargets",
|
|
@@ -34,7 +35,7 @@ const ACTOR_ROWS = [
|
|
|
34
35
|
},
|
|
35
36
|
{
|
|
36
37
|
field: "lanes",
|
|
37
|
-
reason: "
|
|
38
|
+
reason: "only the computer-use route runs more than one participant",
|
|
38
39
|
applies: (actor, routes) => routes.terminal && Boolean(rosterOf(actor)),
|
|
39
40
|
},
|
|
40
41
|
{
|
|
@@ -57,7 +58,7 @@ const ACTOR_ROWS = [
|
|
|
57
58
|
reason: "the scripted-browser route fans out via actors[0].count, not an actors[0].lanes roster",
|
|
58
59
|
applies: (actor, routes) => scriptedRoute(routes) && Boolean(rosterOf(actor)),
|
|
59
60
|
},
|
|
60
|
-
// On every other route the prompt fields, persona and the
|
|
61
|
+
// On every other route the prompt fields, persona and the `lanes[]` roster are inert.
|
|
61
62
|
{ field: "mission", applies: (actor, routes) => otherRoute(routes) && Boolean(actor.mission) },
|
|
62
63
|
{
|
|
63
64
|
field: "laneFocus",
|
|
@@ -68,7 +69,7 @@ const ACTOR_ROWS = [
|
|
|
68
69
|
{ field: "lanes", applies: (actor, routes) => otherRoute(routes) && Boolean(rosterOf(actor)) },
|
|
69
70
|
];
|
|
70
71
|
const TERMINAL_ONLY = "needs subject.source: terminal-product + a registered terminal actor";
|
|
71
|
-
const RESERVED = "reserved
|
|
72
|
+
const RESERVED = "reserved; no route reads it yet";
|
|
72
73
|
/** Rows for the rest of the config, reported after the actor rows, in this order. */
|
|
73
74
|
const CONFIG_ROWS = [
|
|
74
75
|
// The computer-use routes consume (clone) subject.{serve,env,state,clone.depth}, and so does the
|
|
@@ -89,8 +90,9 @@ const CONFIG_ROWS = [
|
|
|
89
90
|
field: "subject.state",
|
|
90
91
|
applies: (config, routes) => Boolean(config.subject.state) && !routes.cua && !routes.scripted,
|
|
91
92
|
},
|
|
92
|
-
// topology + checkpoint act
|
|
93
|
-
// (incl. an explicit per-lane-worlds, which the
|
|
93
|
+
// topology + checkpoint act only on the shared-world route; a set-but-unconsumed value
|
|
94
|
+
// (incl. an explicit per-lane-worlds, which the computer-use route already is by mechanism) warns
|
|
95
|
+
// inert.
|
|
94
96
|
{
|
|
95
97
|
field: "subject.topology",
|
|
96
98
|
reason: "drives behavior only on the shared-world route; needs subject.topology: shared-world + clone × e2b-desktop × a computer-use actor + a roster of ≥2 participants",
|
|
@@ -101,29 +103,29 @@ const CONFIG_ROWS = [
|
|
|
101
103
|
reason: "the shared-world state-checkpoint probe; needs subject.topology: shared-world",
|
|
102
104
|
applies: (config, routes) => config.subject.state?.checkpoint !== undefined && !routes.shared,
|
|
103
105
|
},
|
|
104
|
-
// publicTarget (the external-public ownership attestation) acts
|
|
106
|
+
// publicTarget (the external-public ownership attestation) acts only on the external-public
|
|
105
107
|
// shared-world route; inert elsewhere. (It is already parse-rejected on non-app-url sources.)
|
|
106
108
|
{
|
|
107
109
|
field: "subject.publicTarget",
|
|
108
110
|
reason: "the external-public ownership attestation; needs the external-public shared-world route: app-url × topology shared-world × allowPublicTargets",
|
|
109
111
|
applies: (config, routes) => config.subject.publicTarget !== undefined && !routes.externalPublic,
|
|
110
112
|
},
|
|
111
|
-
// exposure (the synthetic-subject attestation) acts
|
|
113
|
+
// exposure (the synthetic-subject attestation) acts only on the shared-world route (the
|
|
112
114
|
// getHost-exposed plane) and on scripted clones; inert elsewhere.
|
|
113
115
|
{
|
|
114
116
|
field: "subject.exposure",
|
|
115
|
-
reason: "the
|
|
117
|
+
reason: "the statement that a subject served on a public sandbox URL holds only synthetic data; needs shared-world or clone × e2b-desktop × scripted-browser",
|
|
116
118
|
applies: (config, routes) => config.subject.exposure !== undefined &&
|
|
117
119
|
!routes.shared &&
|
|
118
120
|
!(routes.scripted && config.subject.source === "clone"),
|
|
119
121
|
},
|
|
120
|
-
// comms.email drives the in-sandbox email/SMS catch, which needs a subject sandbox
|
|
122
|
+
// comms.email drives the in-sandbox email/SMS catch, which needs a subject sandbox that humanish
|
|
121
123
|
// provisions (clone or local-tree) so it holds a handle to host the catch. On an app-url /
|
|
122
124
|
// operator-provided subject there is no such handle, so a declared comms block would silently
|
|
123
|
-
// collect nothing
|
|
125
|
+
// collect nothing, a false green. Warn at parse time (fires on inspect + dry-run too).
|
|
124
126
|
{
|
|
125
127
|
field: "comms.email",
|
|
126
|
-
reason: "the
|
|
128
|
+
reason: "the email catch runs in a sandbox humanish provisions, which needs `subject.source: clone` or `local-tree`, and an app-url subject has none. To use email here, run the catch yourself with `humanish comms catch` and declare `comms.email.external`: humanish then points each persona at your inbox, reads your catch and records the same evidence",
|
|
127
129
|
applies: (config) => config.comms?.email?.kind === "fake" &&
|
|
128
130
|
config.comms.email.external === undefined &&
|
|
129
131
|
config.subject.source !== "clone" &&
|
|
@@ -138,9 +140,9 @@ const CONFIG_ROWS = [
|
|
|
138
140
|
applies: (config) => Boolean(config.comms?.email?.external) &&
|
|
139
141
|
(config.subject.source === "clone" || config.subject.source === "local-tree"),
|
|
140
142
|
},
|
|
141
|
-
// clone.keep
|
|
142
|
-
// a failed install/boot; otherwise always killed). clone.fanout is
|
|
143
|
-
// (a hard parse error above), so it can never reach this warning list there.
|
|
143
|
+
// clone.keep is consumed on the computer-use route (honored on failure: the sandbox is left up to
|
|
144
|
+
// debug a failed install/boot; otherwise always killed). clone.fanout is rejected on the
|
|
145
|
+
// computer-use route (a hard parse error above), so it can never reach this warning list there.
|
|
144
146
|
{
|
|
145
147
|
field: "execution.timeoutMs",
|
|
146
148
|
applies: (config, routes) => !routes.cua &&
|
|
@@ -152,23 +154,24 @@ const CONFIG_ROWS = [
|
|
|
152
154
|
field: "execution.completionTimeoutMs",
|
|
153
155
|
applies: (config) => config.execution?.completionTimeoutMs !== undefined,
|
|
154
156
|
},
|
|
155
|
-
// execution.concurrency is
|
|
156
|
-
// inert (warned) everywhere else.
|
|
157
|
+
// execution.concurrency is consumed on the computer-use route (it bounds in-flight fan-out
|
|
158
|
+
// participants); inert (warned) everywhere else.
|
|
157
159
|
{
|
|
158
160
|
field: "execution.concurrency",
|
|
159
161
|
applies: (config, routes) => config.execution?.concurrency !== undefined && !routes.cua,
|
|
160
162
|
},
|
|
161
|
-
// execution.caps is
|
|
162
|
-
// (warned) everywhere else so a misplaced budget field is never trusted to cap a route it
|
|
163
|
+
// execution.caps is consumed on the computer-use route (maxUsd is the fail-closed spend abort);
|
|
164
|
+
// inert (warned) everywhere else so a misplaced budget field is never trusted to cap a route it
|
|
165
|
+
// cannot.
|
|
163
166
|
{
|
|
164
167
|
field: "execution.caps",
|
|
165
|
-
reason: "the
|
|
168
|
+
reason: "only the computer-use route enforces it, with a computer-use actor on e2b-desktop",
|
|
166
169
|
applies: (config, routes) => Boolean(config.execution?.caps) && !routes.cua,
|
|
167
170
|
},
|
|
168
171
|
// terminal-product consumes subject.product, scenario.caps, execution.{terminal,runtimeAuth}:
|
|
169
172
|
// dry-run records the contract; live execution enforces caps and command-scoped auth. On every
|
|
170
|
-
//
|
|
171
|
-
// misplaced safety/budget field is never trusted to do something it cannot
|
|
173
|
+
// other route they are inert and must warn so a
|
|
174
|
+
// misplaced safety/budget field is never trusted to do something it cannot.
|
|
172
175
|
{
|
|
173
176
|
field: "subject.product",
|
|
174
177
|
reason: "needs subject.source: terminal-product or desktop-cli with the matching actor",
|
|
@@ -227,10 +230,10 @@ const CONFIG_ROWS = [
|
|
|
227
230
|
field: "execution.desktop.sandboxTimeoutMs",
|
|
228
231
|
applies: (config, routes) => !routes.cua && config.execution?.desktop?.sandboxTimeoutMs !== undefined,
|
|
229
232
|
},
|
|
230
|
-
// execution.desktop.template (the custom E2B desktop image) is consumed
|
|
231
|
-
// actually created via Sandbox.create
|
|
232
|
-
// concurrent). It is
|
|
233
|
-
// creates no desktop): warn so an unconsumed template is never silently ignored
|
|
233
|
+
// execution.desktop.template (the custom E2B desktop image) is consumed only where a desktop is
|
|
234
|
+
// actually created via Sandbox.create: the e2b-desktop computer-use routes (cua/shared-world/
|
|
235
|
+
// concurrent). It is inert on every other route (incl. the in-process local-app computer-use
|
|
236
|
+
// route, which creates no desktop): warn so an unconsumed template is never silently ignored.
|
|
234
237
|
{
|
|
235
238
|
field: "execution.desktop.template",
|
|
236
239
|
reason: "the custom E2B desktop image is consumed only on execution.target: e2b-desktop computer-use routes that create a desktop; needs a computer-use actor on e2b-desktop",
|
|
@@ -243,15 +246,15 @@ const CONFIG_ROWS = [
|
|
|
243
246
|
reason: "no current route reads it",
|
|
244
247
|
applies: (config) => config.execution?.desktop?.codexAppServer !== undefined,
|
|
245
248
|
},
|
|
246
|
-
// scenario.ref is
|
|
249
|
+
// scenario.ref is consumed on the scripted-browser route (required there); forward-declared
|
|
247
250
|
// everywhere else.
|
|
248
251
|
{
|
|
249
252
|
field: "scenario.ref",
|
|
250
253
|
applies: (config, routes) => Boolean(config.scenario?.ref) && !routes.scripted,
|
|
251
254
|
},
|
|
252
255
|
{ field: "scenario.inline", applies: (config) => Boolean(config.scenario?.inline) },
|
|
253
|
-
// review.{scoring,milestones,vocabulary} stay forward-declared
|
|
254
|
-
// review.scorer
|
|
256
|
+
// review.{scoring,milestones,vocabulary} stay forward-declared on every route.
|
|
257
|
+
// review.scorer is consumed (loaded + wired, or fail-closed at load) on every scorer-capable
|
|
255
258
|
// route, so it does not warn there; on the scripted-browser route the actor carries no scorer seam,
|
|
256
259
|
// so a declared scorer is flagged inert (the run also fails closed at load).
|
|
257
260
|
{
|
|
@@ -296,9 +299,11 @@ function rowLabel(row, prefix = "") {
|
|
|
296
299
|
? `${prefix}${row.field}`
|
|
297
300
|
: `${prefix}${row.field} (${row.reason})`;
|
|
298
301
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
+
/**
|
|
303
|
+
* The fields a config sets that its route does not read, each as `field` or `field (reason)`. A v2
|
|
304
|
+
* file gets them as one warning; a v3 study is refused for any of them.
|
|
305
|
+
*/
|
|
306
|
+
export function inertFieldLabels(config) {
|
|
302
307
|
const routes = routesOf(config);
|
|
303
308
|
const inert = [];
|
|
304
309
|
for (const [index, actor] of config.actors.entries()) {
|
|
@@ -309,14 +314,38 @@ export function forwardDeclaredWarnings(config) {
|
|
|
309
314
|
for (const row of CONFIG_ROWS)
|
|
310
315
|
if (row.applies(config, routes))
|
|
311
316
|
inert.push(rowLabel(row));
|
|
317
|
+
return inert;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* The same fields as `inertFieldLabels`, as paths without their reasons, such as
|
|
321
|
+
* `actors[0].lanes[].entry` or `execution.timeoutMs`. `humanish migrate` drops each one.
|
|
322
|
+
*/
|
|
323
|
+
export function inertFieldPaths(config) {
|
|
324
|
+
const routes = routesOf(config);
|
|
325
|
+
const paths = [];
|
|
326
|
+
for (const [index, actor] of config.actors.entries()) {
|
|
327
|
+
for (const row of ACTOR_ROWS)
|
|
328
|
+
if (row.applies(actor, routes))
|
|
329
|
+
paths.push(`actors[${index}].${row.field}`);
|
|
330
|
+
}
|
|
331
|
+
for (const row of CONFIG_ROWS)
|
|
332
|
+
if (row.applies(config, routes))
|
|
333
|
+
paths.push(row.field);
|
|
334
|
+
return paths;
|
|
335
|
+
}
|
|
336
|
+
// Report fields that are present but not yet consumed by the engine, so a user never trusts a
|
|
337
|
+
// setting that silently does nothing.
|
|
338
|
+
export function forwardDeclaredWarnings(config) {
|
|
339
|
+
const routes = routesOf(config);
|
|
340
|
+
const inert = inertFieldLabels(config);
|
|
312
341
|
const warnings = inert.length === 0
|
|
313
342
|
? []
|
|
314
343
|
: [
|
|
315
|
-
`
|
|
344
|
+
`These fields are set, but no route reads them yet, so they have no effect: ${inert.join(", ")}.`,
|
|
316
345
|
];
|
|
317
|
-
// A declared cap below the
|
|
318
|
-
// the cap delivers waves of M. Say so up front (inspect + dry-run + run)
|
|
319
|
-
// is otherwise indistinguishable from the all-live run the author meant
|
|
346
|
+
// A declared cap below the participant count is legal but loud: the roster promises N live actors
|
|
347
|
+
// and the cap delivers waves of M. Say so up front (inspect + dry-run + run): a green run in
|
|
348
|
+
// waves is otherwise indistinguishable from the all-live run the author meant.
|
|
320
349
|
{
|
|
321
350
|
const participantCount = rosterOf(config.actors[0])?.length ?? config.actors[0]?.count ?? 1;
|
|
322
351
|
const cap = config.execution?.concurrency;
|
|
@@ -324,14 +353,14 @@ export function forwardDeclaredWarnings(config) {
|
|
|
324
353
|
warnings.push(`execution.concurrency ${cap} caps a ${participantCount}-participant roster: participants run in waves of ${cap}, never all live at once. Remove execution.concurrency (the default runs all ${participantCount} participants simultaneously) or set it to ${participantCount}; declare a lower cap only to bound simultaneous paid desktops.`);
|
|
325
354
|
}
|
|
326
355
|
}
|
|
327
|
-
// Partial email coverage is legal but loud
|
|
328
|
-
// hears an inbox exists, so an email-gated flow on that
|
|
356
|
+
// Partial email coverage is legal but loud: a participant without an addressed recipient never
|
|
357
|
+
// hears an inbox exists, so an email-gated flow on that participant dead-ends by construction.
|
|
329
358
|
if (routes.cua && config.comms?.email?.recipients) {
|
|
330
359
|
const participantIds = declaredParticipantIds(config);
|
|
331
360
|
const covered = new Set(addressedRecipients(config.comms.email).map((recipient) => recipient.participantId));
|
|
332
361
|
const uncovered = participantIds.filter((id) => !covered.has(id));
|
|
333
362
|
if (covered.size > 0 && uncovered.length > 0 && participantIds.length > 1) {
|
|
334
|
-
warnings.push(`comms.email covers ${covered.size} of ${participantIds.length} participants
|
|
363
|
+
warnings.push(`comms.email covers ${covered.size} of ${participantIds.length} participants. These get no inbox and are never told one exists: ${uncovered.join(", ")}. Add a recipient with an address for each one whose flow needs email.`);
|
|
335
364
|
}
|
|
336
365
|
}
|
|
337
366
|
return warnings;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { CuaAdmissionLimitError as AdmissionLimitError } from "./actors/computer-use/admission-limit.js";
|
|
2
|
+
import type { CuaAction as Action, CuaExecutor as Executor, CuaLoopOptions as LoopOptions, CuaLoopResult as LoopResult, CuaObservation as Observation, CuaProvider as Provider, CuaSafetyCheck as SafetyCheck, CuaTurn as Turn, CuaTurnRequest as TurnRequest } from "./actors/computer-use/loop.js";
|
|
3
|
+
import type { BrowserLabScoringContext as BrowserScoringContext } from "./lab/adapter-extension.js";
|
|
4
|
+
import { parseLabConfig as parseStudy } from "./lab/config.js";
|
|
5
|
+
import type { LabRoute as StudyRoute } from "./lab/routing.js";
|
|
6
|
+
import type { LabEvent as StudyEvent } from "./lab/run-lab-events.js";
|
|
7
|
+
import { type LabConfig as StudyConfig } from "./lab/types.js";
|
|
8
|
+
import { runPackageLab as runStudy, type LabOutcome as StudyOutcome, type LabResult as StudyResult, type RunLabOptions as RunStudyOptions } from "./run-lab.js";
|
|
9
|
+
/** @deprecated Use `runStudy`, the same function. 0.109 removes `runLab`. */
|
|
10
|
+
export declare const runLab: typeof runStudy;
|
|
11
|
+
/** @deprecated Use `parseStudy`, the same function. 0.109 removes `parseLabConfig`. */
|
|
12
|
+
export declare const parseLabConfig: typeof parseStudy;
|
|
13
|
+
/**
|
|
14
|
+
* The `humanish.lab.v2` schema id, which 0.109 stops parsing.
|
|
15
|
+
* @deprecated Write `STUDY_SCHEMA` (`humanish.study.v3`) files. 0.109 removes `LAB_CONFIG_SCHEMA`.
|
|
16
|
+
*/
|
|
17
|
+
export declare const LAB_CONFIG_SCHEMA = "humanish.lab.v2";
|
|
18
|
+
/** @deprecated Use `StudyConfig`, the same type. 0.109 removes `LabConfig`. */
|
|
19
|
+
export type LabConfig = StudyConfig;
|
|
20
|
+
/** @deprecated Use `StudyEvent`, the same type. 0.109 removes `LabEvent`. */
|
|
21
|
+
export type LabEvent = StudyEvent;
|
|
22
|
+
/** @deprecated Use `StudyOutcome`, the same type. 0.109 removes `LabOutcome`. */
|
|
23
|
+
export type LabOutcome = StudyOutcome;
|
|
24
|
+
/** @deprecated Use `StudyResult`, the same type. 0.109 removes `LabResult`. */
|
|
25
|
+
export type LabResult<R extends StudyRoute = StudyRoute> = StudyResult<R>;
|
|
26
|
+
/** @deprecated Use `StudyRoute`, the same type. 0.109 removes `LabRoute`. */
|
|
27
|
+
export type LabRoute = StudyRoute;
|
|
28
|
+
/** @deprecated Use `RunStudyOptions`, the same type. 0.109 removes `RunLabOptions`. */
|
|
29
|
+
export type RunLabOptions = RunStudyOptions;
|
|
30
|
+
/** @deprecated Use `BrowserScoringContext`, the same type. 0.109 removes `BrowserLabScoringContext`. */
|
|
31
|
+
export type BrowserLabScoringContext = BrowserScoringContext;
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated Use `ComputerUseAdmissionLimitError`, the same class, so `instanceof` matches either
|
|
34
|
+
* name. 0.109 removes `CuaAdmissionLimitError`.
|
|
35
|
+
*/
|
|
36
|
+
export declare const CuaAdmissionLimitError: typeof AdmissionLimitError;
|
|
37
|
+
/** @deprecated Use `ComputerUseAdmissionLimitError`. 0.109 removes `CuaAdmissionLimitError`. */
|
|
38
|
+
export type CuaAdmissionLimitError = AdmissionLimitError;
|
|
39
|
+
/** @deprecated Use `ComputerUseAction`, the same type. 0.109 removes `CuaAction`. */
|
|
40
|
+
export type CuaAction = Action;
|
|
41
|
+
/** @deprecated Use `ComputerUseExecutor`, the same type. 0.109 removes `CuaExecutor`. */
|
|
42
|
+
export type CuaExecutor = Executor;
|
|
43
|
+
/** @deprecated Use `ComputerUseLoopOptions`, the same type. 0.109 removes `CuaLoopOptions`. */
|
|
44
|
+
export type CuaLoopOptions = LoopOptions;
|
|
45
|
+
/** @deprecated Use `ComputerUseLoopResult`, the same type. 0.109 removes `CuaLoopResult`. */
|
|
46
|
+
export type CuaLoopResult = LoopResult;
|
|
47
|
+
/** @deprecated Use `ComputerUseObservation`, the same type. 0.109 removes `CuaObservation`. */
|
|
48
|
+
export type CuaObservation = Observation;
|
|
49
|
+
/** @deprecated Use `ComputerUseProvider`, the same type. 0.109 removes `CuaProvider`. */
|
|
50
|
+
export type CuaProvider = Provider;
|
|
51
|
+
/** @deprecated Use `ComputerUseSafetyCheck`, the same type. 0.109 removes `CuaSafetyCheck`. */
|
|
52
|
+
export type CuaSafetyCheck = SafetyCheck;
|
|
53
|
+
/** @deprecated Use `ComputerUseTurn`, the same type. 0.109 removes `CuaTurn`. */
|
|
54
|
+
export type CuaTurn = Turn;
|
|
55
|
+
/** @deprecated Use `ComputerUseTurnRequest`, the same type. 0.109 removes `CuaTurnRequest`. */
|
|
56
|
+
export type CuaTurnRequest = TurnRequest;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// The names 0.107's library exported for running a lab and driving a computer-use participant.
|
|
2
|
+
// Each is the same function, constant, class or type as the name that replaces it, so an existing
|
|
3
|
+
// import, call or `instanceof` check keeps working, and editors mark it deprecated.
|
|
4
|
+
// Removed in 0.109.0: this module and its exports in src/index.ts.
|
|
5
|
+
import { CuaAdmissionLimitError as AdmissionLimitError } from "./actors/computer-use/admission-limit.js";
|
|
6
|
+
import { parseLabConfig as parseStudy } from "./lab/config.js";
|
|
7
|
+
import { LAB_CONFIG_SCHEMA as V2_SCHEMA } from "./lab/types.js";
|
|
8
|
+
import { runPackageLab as runStudy, } from "./run-lab.js";
|
|
9
|
+
/** @deprecated Use `runStudy`, the same function. 0.109 removes `runLab`. */
|
|
10
|
+
export const runLab = runStudy;
|
|
11
|
+
/** @deprecated Use `parseStudy`, the same function. 0.109 removes `parseLabConfig`. */
|
|
12
|
+
export const parseLabConfig = parseStudy;
|
|
13
|
+
/**
|
|
14
|
+
* The `humanish.lab.v2` schema id, which 0.109 stops parsing.
|
|
15
|
+
* @deprecated Write `STUDY_SCHEMA` (`humanish.study.v3`) files. 0.109 removes `LAB_CONFIG_SCHEMA`.
|
|
16
|
+
*/
|
|
17
|
+
export const LAB_CONFIG_SCHEMA = V2_SCHEMA;
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Use `ComputerUseAdmissionLimitError`, the same class, so `instanceof` matches either
|
|
20
|
+
* name. 0.109 removes `CuaAdmissionLimitError`.
|
|
21
|
+
*/
|
|
22
|
+
export const CuaAdmissionLimitError = AdmissionLimitError;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { LoadedAnalysis } from "../analysis/types.js";
|
|
2
2
|
import { type ObserverData } from "./data.js";
|
|
3
3
|
/**
|
|
4
|
-
* Resolve
|
|
4
|
+
* Resolve (and in a repo checkout, build) the Observer artifact before any run or
|
|
5
5
|
* lab work starts. A missing artifact must cost seconds at startup, never a completed
|
|
6
|
-
* session (a live
|
|
6
|
+
* session (a live participant spends real money before the render step would have noticed).
|
|
7
7
|
* Unconditional on purpose: the artifact is the only renderer now, so the fail-before-
|
|
8
8
|
* spend property this preflight bought under the flag matters more, not less.
|
|
9
9
|
*/
|
|
@@ -5,15 +5,15 @@ import { execSync } from "node:child_process";
|
|
|
5
5
|
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
|
-
import { projectShareCheckedAnalysis,
|
|
8
|
+
import { projectShareCheckedAnalysis, analysisSharingProblems } from "../analysis/sharing.js";
|
|
9
9
|
import { withObserverEndings } from "./data.js";
|
|
10
10
|
const OBSERVER_DATA_PLACEHOLDER = "__HUMANISH_OBSERVER_DATA__";
|
|
11
11
|
const OBSERVER_DATA_SLOT = `<script id="observer-data" type="application/json">${OBSERVER_DATA_PLACEHOLDER}</script>`;
|
|
12
12
|
let cachedObserverArtifact = null;
|
|
13
13
|
/**
|
|
14
|
-
* Resolve
|
|
14
|
+
* Resolve (and in a repo checkout, build) the Observer artifact before any run or
|
|
15
15
|
* lab work starts. A missing artifact must cost seconds at startup, never a completed
|
|
16
|
-
* session (a live
|
|
16
|
+
* session (a live participant spends real money before the render step would have noticed).
|
|
17
17
|
* Unconditional on purpose: the artifact is the only renderer now, so the fail-before-
|
|
18
18
|
* spend property this preflight bought under the flag matters more, not less.
|
|
19
19
|
*/
|
|
@@ -42,7 +42,7 @@ function loadObserverArtifact() {
|
|
|
42
42
|
// together) must not race one `vite build` output: a reader can catch the
|
|
43
43
|
// artifact half-written. A mkdir lock serializes builders across processes;
|
|
44
44
|
// whoever loses the race re-checks staleness and usually just reads.
|
|
45
|
-
// The lock lives
|
|
45
|
+
// The lock lives outside dist/ (vite empties dist mid-build) and inside an
|
|
46
46
|
// ignored path so a crashed builder cannot dirty the tree.
|
|
47
47
|
const lockDir = path.join(workspaceDir, "node_modules", ".observer-build-lock");
|
|
48
48
|
mkdirSync(path.dirname(lockDir), { recursive: true });
|
|
@@ -50,7 +50,7 @@ function loadObserverArtifact() {
|
|
|
50
50
|
for (;;) {
|
|
51
51
|
try {
|
|
52
52
|
mkdirSync(lockDir);
|
|
53
|
-
break; // lock acquired
|
|
53
|
+
break; // lock acquired: this process builds
|
|
54
54
|
}
|
|
55
55
|
catch {
|
|
56
56
|
if (Date.now() > deadline)
|
|
@@ -71,7 +71,7 @@ function loadObserverArtifact() {
|
|
|
71
71
|
try {
|
|
72
72
|
// NODE_ENV is forced: Vite respects a preset NODE_ENV (test, development),
|
|
73
73
|
// and a dev-flavored artifact embeds jsxDEV plus the builder's absolute
|
|
74
|
-
// filesystem paths
|
|
74
|
+
// filesystem paths, which the run's public-safety scan then rightly rejects.
|
|
75
75
|
execSync("pnpm --filter humanish-observer build", {
|
|
76
76
|
cwd: repoRoot,
|
|
77
77
|
stdio: ["ignore", "pipe", "inherit"],
|
|
@@ -79,7 +79,7 @@ function loadObserverArtifact() {
|
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
81
|
catch {
|
|
82
|
-
throw new Error("observer workspace build failed
|
|
82
|
+
throw new Error("observer workspace build failed; run `pnpm --filter humanish-observer build` to see the full output.");
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -169,7 +169,7 @@ function renderObserverAppHtml(data, snapshot, analysis, assets) {
|
|
|
169
169
|
.replace(OBSERVER_DATA_SLOT, () => `<script id="observer-data" type="application/json">${escapeJsonScript(data)}</script>`)
|
|
170
170
|
.replace(/<script id="study-analysis" type="application\/json">[\s\S]*?<\/script>/, () => `<script id="study-analysis" type="application/json">${escapeJsonScript(analysis)}</script>`)
|
|
171
171
|
.replace("</body>", () => `${renderExportAssets(assets)}</body>`)
|
|
172
|
-
.replace(/<title>[^<]*<\/title>/, () => `<title>humanish Observer
|
|
172
|
+
.replace(/<title>[^<]*<\/title>/, () => `<title>humanish Observer · ${escapeHtml(data.run.runId)}</title>`);
|
|
173
173
|
}
|
|
174
174
|
/** Render current packaged UI around a validated/projected Observer snapshot. */
|
|
175
175
|
export function renderObserverHtml(data, options = {}) {
|
|
@@ -192,7 +192,7 @@ export function renderObserverHtml(data, options = {}) {
|
|
|
192
192
|
},
|
|
193
193
|
};
|
|
194
194
|
}
|
|
195
|
-
const sharing =
|
|
195
|
+
const sharing = analysisSharingProblems(analysis);
|
|
196
196
|
if (data.publicSafety && (sharing.sensitive || sharing.unverified)) {
|
|
197
197
|
const share = data.publicSafety.share;
|
|
198
198
|
data = {
|
package/dist/observer/data.d.ts
CHANGED
|
@@ -31,18 +31,18 @@ export interface ObserverData {
|
|
|
31
31
|
lifecycle: RunBundle["lifecycle"];
|
|
32
32
|
knownGaps: string[];
|
|
33
33
|
/**
|
|
34
|
-
* What happened to the
|
|
34
|
+
* What happened to the participants, with the denominator attached. `status` above collapses the
|
|
35
35
|
* run to one word for a gate; this is the study result, and it is what the person watching
|
|
36
36
|
* through the glass actually wants to know. Absent on a bundle with no participants.
|
|
37
37
|
*
|
|
38
|
-
* A viewing room that shows only vivid moments manufactures certainty from n=1
|
|
38
|
+
* A viewing room that shows only vivid moments manufactures certainty from n=1, so the count
|
|
39
39
|
* travels with the outcome here, always (docs/principles/three-roles.md).
|
|
40
40
|
*/
|
|
41
41
|
participants?: RunBundle["review"]["participants"];
|
|
42
42
|
/** The same thing as one readable line, so a renderer cannot accidentally show a number
|
|
43
43
|
* without its denominator. */
|
|
44
44
|
participantsLine?: string;
|
|
45
|
-
/** The study's per-task completion rates
|
|
45
|
+
/** The study's per-task completion rates, when the lab declared a protocol. */
|
|
46
46
|
tasks?: RunBundle["review"]["tasks"];
|
|
47
47
|
/** Pre-formatted like participantsLine, denominator on every number. */
|
|
48
48
|
tasksLine?: string;
|
|
@@ -56,8 +56,8 @@ export interface ObserverData {
|
|
|
56
56
|
};
|
|
57
57
|
laneGroups: ObserverLaneGroup[];
|
|
58
58
|
/**
|
|
59
|
-
*
|
|
60
|
-
* (humanish.run-cost-summary.v1). Absent when the bundle carries none. The Observer
|
|
59
|
+
* Optional run-level cost estimate projected straight through from the bundle
|
|
60
|
+
* (humanish.run-cost-summary.v1). Absent when the bundle carries none. The Observer labels every
|
|
61
61
|
* figure as estimated (rates as of <asOf>) and never presents it as an authoritative charge.
|
|
62
62
|
*/
|
|
63
63
|
cost?: RunCostSummary;
|
|
@@ -68,7 +68,7 @@ export interface ObserverData {
|
|
|
68
68
|
publishable: false;
|
|
69
69
|
note: string;
|
|
70
70
|
/**
|
|
71
|
-
*
|
|
71
|
+
* Additive + optional: the result of verification at static render or
|
|
72
72
|
* export time. Unverified projections omit this field. The timestamp records
|
|
73
73
|
* that check; it is not an assertion about subsequent file changes.
|
|
74
74
|
*/
|
package/dist/observer/data.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { actorEnding } from "../actors/stop-cause.js";
|
|
2
2
|
import { isCommsReceivingEvidence, receivingAnalysisContext } from "../comms/receiving-evidence.js";
|
|
3
|
-
import { formatParticipantOutcomes,
|
|
3
|
+
import { formatParticipantOutcomes, formatRunTaskFunnel, participantOutcomeDetails, withCuaReviewProvenance, } from "../run/outcomes.js";
|
|
4
4
|
import { cuaGoalSource, CUA_COMPLETION_NOTE } from "../actors/goal-source.js";
|
|
5
5
|
export const OBSERVER_DATA_SCHEMA = "humanish.observer-data.v1";
|
|
6
6
|
/** Discard a forged or stale runtime grant before projecting persisted evidence. */
|
|
@@ -33,7 +33,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
|
|
|
33
33
|
const sim = bundle.simulations.find((candidate) => candidate.id === stream.simId) ??
|
|
34
34
|
fallbackSimulation(bundle, stream);
|
|
35
35
|
// A natural session can finish its protocol while the participant explicitly reports a
|
|
36
|
-
// blocker
|
|
36
|
+
// blocker. Match the review's typed-outcome rule without rewriting the raw trace or
|
|
37
37
|
// guessing from prose. Never turn an active or failed harness into a participant outcome.
|
|
38
38
|
const status = (stream.status === "passed" || stream.status === "complete") &&
|
|
39
39
|
stream.actor?.completionReason === "goal_satisfied" &&
|
|
@@ -47,7 +47,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
|
|
|
47
47
|
status,
|
|
48
48
|
sim,
|
|
49
49
|
kindLabel: kindLabel(stream.kind),
|
|
50
|
-
statusLabel: statusLabel(status),
|
|
50
|
+
statusLabel: statusLabel(status, bundle.mode),
|
|
51
51
|
terminalPlain: stripAnsi(stream.terminal?.tail ?? ""),
|
|
52
52
|
timeline: [
|
|
53
53
|
...events.filter((event) => event.simId === sim.id || event.streamId === stream.id),
|
|
@@ -95,7 +95,7 @@ export function buildObserverData(bundle, generatedAt = new Date().toISOString()
|
|
|
95
95
|
? {}
|
|
96
96
|
: {
|
|
97
97
|
tasks: bundle.review.tasks,
|
|
98
|
-
tasksLine:
|
|
98
|
+
tasksLine: formatRunTaskFunnel(bundle.review.tasks),
|
|
99
99
|
}),
|
|
100
100
|
},
|
|
101
101
|
summary: {
|
|
@@ -229,10 +229,11 @@ function kindLabel(kind) {
|
|
|
229
229
|
return "Summary";
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
|
-
|
|
232
|
+
/** `contract_proof_only` reads "Dry run" on a dry run; a live participant with it has no result. */
|
|
233
|
+
function statusLabel(status, mode) {
|
|
233
234
|
switch (status) {
|
|
234
235
|
case "contract_proof_only":
|
|
235
|
-
return "
|
|
236
|
+
return mode === "dry-run" ? "Dry run" : "No verdict";
|
|
236
237
|
case "preparing":
|
|
237
238
|
return "Preparing";
|
|
238
239
|
case "queued":
|
|
@@ -47,7 +47,7 @@ export type ExposureValidation = {
|
|
|
47
47
|
};
|
|
48
48
|
};
|
|
49
49
|
/** Why `watch` refuses `--safe`, on every watch path. */
|
|
50
|
-
export declare const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready
|
|
50
|
+
export declare const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready, so --safe (a share_ready library filter for `observe --all`) cannot apply. Restrict viewers with edge auth: --allow-email / --allow-domain.";
|
|
51
51
|
export declare function validateExposure(surface: ExposureSurface, request: ExposureRequest, live?: WatchLiveContext): ExposureValidation;
|
|
52
52
|
export interface ExposableServer {
|
|
53
53
|
readonly port: number;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
// Shared fail-closed exposure validation + tunnel orchestration for
|
|
2
|
-
// finished runs) and `watch` (one live run). Exposure auth is
|
|
1
|
+
// Shared fail-closed exposure validation + tunnel orchestration for both `serve` (a library of
|
|
2
|
+
// finished runs) and `watch` (one live run). Exposure auth is tunnel-edge only: humanish carries no
|
|
3
3
|
// in-process auth. Exposure is admitted only behind edge auth (ngrok --oauth google, or an operator
|
|
4
|
-
// --public-url they secure)
|
|
5
|
-
// is never share_ready (raw, unverified screenshots), so watch --expose
|
|
4
|
+
// --public-url they secure) or, for serve, behind --safe (share_ready runs only). A live watch run
|
|
5
|
+
// is never share_ready (raw, unverified screenshots), so watch --expose always requires edge auth.
|
|
6
6
|
//
|
|
7
7
|
// This module is pure with respect to the fail-closed matrix (validateExposure) and thin over the
|
|
8
8
|
// tunnel launcher (startExposedObserver), so the CLI just maps flags in and results out.
|
|
9
9
|
import { parsePublicOrigin } from "./http.js";
|
|
10
10
|
import { startNgrokTunnel } from "./tunnel.js";
|
|
11
11
|
/** Why `watch` refuses `--safe`, on every watch path. */
|
|
12
|
-
export const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready
|
|
12
|
+
export const WATCH_SAFE_NOT_APPLICABLE_MESSAGE = "watch streams a single live run that is never share_ready, so --safe (a share_ready library filter for `observe --all`) cannot apply. Restrict viewers with edge auth: --allow-email / --allow-domain.";
|
|
13
13
|
function code(surface, suffix) {
|
|
14
14
|
return `HUMANISH_${surface.toUpperCase()}_${suffix}`;
|
|
15
15
|
}
|
|
@@ -70,12 +70,12 @@ export function validateExposure(surface, request, live) {
|
|
|
70
70
|
const warnings = [];
|
|
71
71
|
if (surface === "watch") {
|
|
72
72
|
// A live, in-progress run is never share_ready (raw screenshots, unverified), so --safe would
|
|
73
|
-
// admit nothing and expose nothing: watch --expose
|
|
73
|
+
// admit nothing and expose nothing: watch --expose always requires edge auth, and the live-follow
|
|
74
74
|
// preconditions are checked first so `--dry-run`/`--detach`/`--json` fail with the clearer reason.
|
|
75
75
|
if (live && (live.dryRun || live.detach || live.json)) {
|
|
76
76
|
return fail("EXPOSE_REQUIRES_LIVE_FOLLOW", "watch --expose streams a live desktop over an attached follow channel; it cannot combine with --dry-run, --detach, or --json.");
|
|
77
77
|
}
|
|
78
|
-
// --safe is a share_ready
|
|
78
|
+
// --safe is a share_ready library filter for `serve`; watch streams a single live run that is
|
|
79
79
|
// never share_ready, so --safe would silently do nothing here. Reject it rather than ignore it.
|
|
80
80
|
if (request.safe) {
|
|
81
81
|
return fail("SAFE_NOT_APPLICABLE", WATCH_SAFE_NOT_APPLICABLE_MESSAGE);
|
|
@@ -85,18 +85,18 @@ export function validateExposure(surface, request, live) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
else {
|
|
88
|
-
// serve: --expose must
|
|
88
|
+
// serve: --expose must always resolve to a reachable public origin (a tunnel or a --public-url),
|
|
89
89
|
// even under --safe. Without one the exposed server is an unreachable loopback no-op, so fail
|
|
90
|
-
// closed before the origin-less bind. When an origin
|
|
90
|
+
// closed before the origin-less bind. When an origin is present, keep the edge-auth-or-safe gate.
|
|
91
91
|
if (!request.tunnel && !publicOrigin) {
|
|
92
92
|
return fail("EXPOSE_REQUIRES_ORIGIN", "--expose needs a declared public origin: pass --tunnel ngrok or --public-url <origin>.");
|
|
93
93
|
}
|
|
94
94
|
if (!edgeAuthed && !request.safe) {
|
|
95
|
-
return fail("EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE", "--expose opens a public URL to local run bundles
|
|
95
|
+
return fail("EXPOSE_REQUIRES_EDGE_AUTH_OR_SAFE", "--expose opens a public URL to local run bundles, so it needs edge auth (--oauth google with --tunnel, or a --public-url you secure) or --safe (share_ready runs only).");
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
if (request.oauth && request.allowEmails.length === 0 && request.allowDomains.length === 0) {
|
|
99
|
-
warnings.push("ngrok --oauth google
|
|
99
|
+
warnings.push("ngrok --oauth google without --allow-email or --allow-domain lets in any Google account that reaches the URL. Add at least one allow rule to choose who can watch.");
|
|
100
100
|
}
|
|
101
101
|
const mode = edgeAuthed ? "exposed" : "share-safe-open";
|
|
102
102
|
return {
|
package/dist/observer/http.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Shared HTTP hardening primitives for the serve surfaces. Extracted here so
|
|
1
|
+
// Shared HTTP hardening primitives for the serve surfaces. Extracted here so both the live
|
|
2
2
|
// Observer server (src/observer/render.ts) and the run-library server
|
|
3
3
|
// (src/observer/serve.ts) can enforce the identical Host allowlist + security-header posture
|
|
4
4
|
// without a module cycle. This file imports nothing from the serve modules.
|
|
@@ -9,7 +9,7 @@ export interface LibraryHistory {
|
|
|
9
9
|
/** Current contained status-record observation, separate from the evidence verdict. */
|
|
10
10
|
runtimeState?: "running" | "finished" | "interrupted" | "unknown";
|
|
11
11
|
streamCount: number;
|
|
12
|
-
/** Labeled run-total cost
|
|
12
|
+
/** Labeled run-total cost estimate (null when the run carries no cost summary). */
|
|
13
13
|
estimatedCostUsd: number | null;
|
|
14
14
|
costRatesAsOf: string | null;
|
|
15
15
|
costPlaceholder: boolean;
|
package/dist/observer/library.js
CHANGED
|
@@ -7,8 +7,8 @@ const STATUS_TONES = {
|
|
|
7
7
|
};
|
|
8
8
|
export function renderLibraryHtml(history, opts) {
|
|
9
9
|
const emptyState = opts.safe
|
|
10
|
-
? "No share_ready runs yet
|
|
11
|
-
: "No runs yet
|
|
10
|
+
? "No share_ready runs yet. Run `humanish verify` to see why."
|
|
11
|
+
: "No runs yet. Run `humanish watch` to create one.";
|
|
12
12
|
return `<!doctype html>
|
|
13
13
|
<html lang="en" data-theme="dark">
|
|
14
14
|
<head>
|
|
@@ -39,6 +39,7 @@ function modeLabel(opts) {
|
|
|
39
39
|
const auth = opts.mode === "exposed" ? "edge-authed" : opts.mode === "share-safe-open" ? "open" : "loopback";
|
|
40
40
|
return opts.safe ? `${auth} · share_ready only` : auth;
|
|
41
41
|
}
|
|
42
|
+
// prose-check: script (the library page's CSS)
|
|
42
43
|
function libraryCss() {
|
|
43
44
|
return `
|
|
44
45
|
:root { color-scheme: dark; }
|
|
@@ -80,6 +81,7 @@ main { padding: 1rem 1.1rem 3rem; max-width: 44rem; margin: 0 auto; }
|
|
|
80
81
|
.empty { color: #9aa3b2; font-size: 0.85rem; padding: 2rem 0; text-align: center; }
|
|
81
82
|
`;
|
|
82
83
|
}
|
|
84
|
+
// prose-check: script (the library page's JavaScript)
|
|
83
85
|
function libraryClientJs() {
|
|
84
86
|
const tones = JSON.stringify(STATUS_TONES);
|
|
85
87
|
return `
|