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/deprecated.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
// The exports this minor deprecates and the next minor removes (docs/contracts/schemas.md,
|
|
2
|
-
// "Library options"). Each function warns once per process and then runs unchanged. Each type is
|
|
3
|
-
// an alias of the type it always was, and each constant has the value it always had. Internal code
|
|
4
|
-
// calls the original functions, so only a package caller sees a warning.
|
|
5
|
-
import { runCuaActorSession as cuaActorSession, } from "./actors/computer-use/actor.js";
|
|
6
|
-
import { resolveLabDryRun as labDryRun } from "./lab/plan.js";
|
|
7
|
-
import { actorResolvesToTerminal as resolvesToTerminal, cuaLaneCount as laneCount, MAX_CUA_LANES as laneCap, resolveSeatUrl as seatUrl, } from "./lab/routing.js";
|
|
8
|
-
import { concurrentSharedWorldValidationReason as concurrentSharedWorldReason, cuaLaneValidationReason as laneRosterReason, externalPublicSharedWorldValidationReason as externalPublicSharedWorldReason, sharedWorldValidationReason as sharedWorldReason, } from "./lab/validation.js";
|
|
9
|
-
import { runCuaActorLab as cuaActorLab } from "./routes/computer-use/route.js";
|
|
10
|
-
import { runScriptedBrowserLab as scriptedBrowserLab } from "./routes/scripted/route.js";
|
|
11
|
-
import { runConcurrentSharedWorld as concurrentSharedWorld } from "./routes/shared-world/route.js";
|
|
12
|
-
import { runTerminalProductLab as terminalProductLab } from "./routes/terminal/route.js";
|
|
13
|
-
import { runDryRun as dryRun } from "./run/dry-run.js";
|
|
14
|
-
const warned = new Set();
|
|
15
|
-
function deprecated(name, replacement) {
|
|
16
|
-
if (warned.has(name))
|
|
17
|
-
return;
|
|
18
|
-
warned.add(name);
|
|
19
|
-
process.emitWarning(`${name} is deprecated and is removed in the next minor. Use ${replacement}.`, { type: "DeprecationWarning", code: "HUMANISH_DEPRECATED_EXPORT" });
|
|
20
|
-
}
|
|
21
|
-
const RUN_LAB = "runLab(config, options); its result is LabResult<route>";
|
|
22
|
-
/**
|
|
23
|
-
* @deprecated Use `runComputerUseLoop` with `createOpenAiResponsesProvider({ singleDispatch: true })`,
|
|
24
|
-
* the strict-spend composition in docs/contracts/schemas.md.
|
|
25
|
-
*/
|
|
26
|
-
export function runCuaActorSession(options) {
|
|
27
|
-
deprecated("runCuaActorSession", "runComputerUseLoop with createOpenAiResponsesProvider({ singleDispatch: true }) (the strict-spend composition in docs/contracts/schemas.md)");
|
|
28
|
-
return cuaActorSession(options);
|
|
29
|
-
}
|
|
30
|
-
/** @deprecated Use `runLab(config, options)`; its result is `LabResult<"computer-use">`. */
|
|
31
|
-
export function runCuaActorLab(options) {
|
|
32
|
-
deprecated("runCuaActorLab", RUN_LAB);
|
|
33
|
-
return cuaActorLab(options);
|
|
34
|
-
}
|
|
35
|
-
/** @deprecated Use `runLab(config, options)`; its result is `LabResult<"scripted">`. */
|
|
36
|
-
export function runScriptedBrowserLab(options) {
|
|
37
|
-
deprecated("runScriptedBrowserLab", RUN_LAB);
|
|
38
|
-
return scriptedBrowserLab(options);
|
|
39
|
-
}
|
|
40
|
-
/** @deprecated Use `runLab(config, options)`; its result is `LabResult<"terminal">`. */
|
|
41
|
-
export function runTerminalProductLab(options) {
|
|
42
|
-
deprecated("runTerminalProductLab", RUN_LAB);
|
|
43
|
-
return terminalProductLab(options);
|
|
44
|
-
}
|
|
45
|
-
/** @deprecated Use `runLab(config, options)`; its result is `LabResult<"shared-world">`. */
|
|
46
|
-
export function runConcurrentSharedWorld(options) {
|
|
47
|
-
deprecated("runConcurrentSharedWorld", RUN_LAB);
|
|
48
|
-
return concurrentSharedWorld(options);
|
|
49
|
-
}
|
|
50
|
-
/** @deprecated Use `runLab(config, options)` on a `this-repo` lab; its result is `LabResult<"preview">`. */
|
|
51
|
-
export function runDryRun(options) {
|
|
52
|
-
deprecated("runDryRun", RUN_LAB);
|
|
53
|
-
return dryRun(options);
|
|
54
|
-
}
|
|
55
|
-
const PARSE_REASON = "parseLabConfig, which returns the same reason";
|
|
56
|
-
/** @deprecated Use `routeOf(config)` on the lab. This goes in the next minor. */
|
|
57
|
-
export function actorResolvesToTerminal(type) {
|
|
58
|
-
deprecated("actorResolvesToTerminal", "routeOf(config) on the lab");
|
|
59
|
-
return resolvesToTerminal(type);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* @deprecated Use the `plan` `LabEvent` from `RunLabOptions.onEvent`, which lists every
|
|
63
|
-
* participant. This goes in the next minor.
|
|
64
|
-
*/
|
|
65
|
-
export function cuaLaneCount(config) {
|
|
66
|
-
deprecated("cuaLaneCount", "the plan LabEvent from RunLabOptions.onEvent, which lists every participant");
|
|
67
|
-
return laneCount(config);
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* @deprecated Use `parseLabConfig`, which refuses a seat entry that is not same-origin loopback.
|
|
71
|
-
* This goes in the next minor.
|
|
72
|
-
*/
|
|
73
|
-
export function resolveSeatUrl(serveUrl, entry) {
|
|
74
|
-
deprecated("resolveSeatUrl", "parseLabConfig, which refuses a participant entry that is not same-origin loopback");
|
|
75
|
-
return seatUrl(serveUrl, entry);
|
|
76
|
-
}
|
|
77
|
-
/** @deprecated Use `parseLabConfig`, which returns the same reason. This goes in the next minor. */
|
|
78
|
-
export function cuaLaneValidationReason(config) {
|
|
79
|
-
deprecated("cuaLaneValidationReason", PARSE_REASON);
|
|
80
|
-
return laneRosterReason(config);
|
|
81
|
-
}
|
|
82
|
-
/** @deprecated Use `parseLabConfig`, which returns the same reason. This goes in the next minor. */
|
|
83
|
-
export function sharedWorldValidationReason(config) {
|
|
84
|
-
deprecated("sharedWorldValidationReason", PARSE_REASON);
|
|
85
|
-
return sharedWorldReason(config);
|
|
86
|
-
}
|
|
87
|
-
/** @deprecated Use `parseLabConfig`, which returns the same reason. This goes in the next minor. */
|
|
88
|
-
export function concurrentSharedWorldValidationReason(config) {
|
|
89
|
-
deprecated("concurrentSharedWorldValidationReason", PARSE_REASON);
|
|
90
|
-
return concurrentSharedWorldReason(config);
|
|
91
|
-
}
|
|
92
|
-
/** @deprecated Use `parseLabConfig`, which returns the same reason. This goes in the next minor. */
|
|
93
|
-
export function externalPublicSharedWorldValidationReason(config) {
|
|
94
|
-
deprecated("externalPublicSharedWorldValidationReason", PARSE_REASON);
|
|
95
|
-
return externalPublicSharedWorldReason(config);
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* @deprecated Use `RunLabOptions.dryRun`; without it, `scenario.mode` decides. This goes in the
|
|
99
|
-
* next minor.
|
|
100
|
-
*/
|
|
101
|
-
export function resolveLabDryRun(config, override, fallback) {
|
|
102
|
-
deprecated("resolveLabDryRun", "RunLabOptions.dryRun; without it, scenario.mode decides");
|
|
103
|
-
return labDryRun(config, override, fallback);
|
|
104
|
-
}
|
|
105
|
-
/** @deprecated `parseLabConfig` refuses a roster larger than this. This goes in the next minor. */
|
|
106
|
-
export const MAX_CUA_LANES = laneCap;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/** The members each bag type declares, forwarded even when the bag does not enumerate them. */
|
|
2
|
-
export declare const HOOK_MEMBERS: {
|
|
3
|
-
readonly cua: string[];
|
|
4
|
-
readonly sharedWorld: string[];
|
|
5
|
-
readonly terminal: string[];
|
|
6
|
-
readonly scripted: string[];
|
|
7
|
-
readonly analysis: string[];
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* The bag with `overrides` in place of its own members. Every other member becomes an enumerable
|
|
11
|
-
* accessor that reads the bag when it is read, so a getter runs only then and a spread of the
|
|
12
|
-
* result keeps every member. The members are the bag's own and inherited keys (string or symbol)
|
|
13
|
-
* plus `declared`, the members its type declares, which a proxy-backed bag may answer without
|
|
14
|
-
* listing. A function is bound to the bag, so its private fields still work. The overrides are
|
|
15
|
-
* ordinary data properties. Declared members always appear as own properties (undefined when
|
|
16
|
-
* unset), so code reading a wrapped bag tests the value, never `in`.
|
|
17
|
-
*/
|
|
18
|
-
export declare function withHookOverrides<T extends object>(bag: T | undefined, declared: readonly string[], overrides: Partial<T>): T;
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
// A caller's hook bag with some members replaced, without copying the bag's values. Spreading a
|
|
2
|
-
// class instance keeps only its own properties, so a route that spreads a caller's bag loses the
|
|
3
|
-
// class's methods; this builds a plain object that keeps them.
|
|
4
|
-
// Every member each bag type declares. The record type makes the compiler reject a missing or
|
|
5
|
-
// unknown name, so a member added to a bag type must be added here too.
|
|
6
|
-
const cuaMembers = {
|
|
7
|
-
prepareDesktop: true,
|
|
8
|
-
onPreflight: true,
|
|
9
|
-
onPhase: true,
|
|
10
|
-
onRuntimeStreamReady: true,
|
|
11
|
-
onRuntimeStreamEnded: true,
|
|
12
|
-
loadDesktopModule: true,
|
|
13
|
-
runSession: true,
|
|
14
|
-
buildExecutor: true,
|
|
15
|
-
buildProvider: true,
|
|
16
|
-
createDesktopLane: true,
|
|
17
|
-
env: true,
|
|
18
|
-
renderObserverFn: true,
|
|
19
|
-
now: true,
|
|
20
|
-
detachedTimers: true,
|
|
21
|
-
packLocalTree: true,
|
|
22
|
-
score: true,
|
|
23
|
-
deriveFeedback: true,
|
|
24
|
-
deriveArtifacts: true,
|
|
25
|
-
};
|
|
26
|
-
const sharedWorldMembers = {
|
|
27
|
-
loadDesktopModule: true,
|
|
28
|
-
prepareDesktop: true,
|
|
29
|
-
onRuntimeStreamReady: true,
|
|
30
|
-
onRuntimeStreamEnded: true,
|
|
31
|
-
runSession: true,
|
|
32
|
-
env: true,
|
|
33
|
-
renderObserverFn: true,
|
|
34
|
-
detachedTimers: true,
|
|
35
|
-
onPhase: true,
|
|
36
|
-
now: true,
|
|
37
|
-
proberCadenceMs: true,
|
|
38
|
-
handoffDeadlineMs: true,
|
|
39
|
-
readLobbyCodeFromFrame: true,
|
|
40
|
-
packLocalTree: true,
|
|
41
|
-
score: true,
|
|
42
|
-
deriveFeedback: true,
|
|
43
|
-
deriveArtifacts: true,
|
|
44
|
-
};
|
|
45
|
-
const terminalMembers = {
|
|
46
|
-
loadModule: true,
|
|
47
|
-
env: true,
|
|
48
|
-
renderObserverFn: true,
|
|
49
|
-
now: true,
|
|
50
|
-
costProbe: true,
|
|
51
|
-
score: true,
|
|
52
|
-
deriveFeedback: true,
|
|
53
|
-
};
|
|
54
|
-
const scriptedMembers = {
|
|
55
|
-
runSession: true,
|
|
56
|
-
launchBrowser: true,
|
|
57
|
-
env: true,
|
|
58
|
-
loadDesktopModule: true,
|
|
59
|
-
prepareDesktop: true,
|
|
60
|
-
detachedTimers: true,
|
|
61
|
-
browserCommand: true,
|
|
62
|
-
renderObserverFn: true,
|
|
63
|
-
now: true,
|
|
64
|
-
};
|
|
65
|
-
const analysisMembers = {
|
|
66
|
-
deps: true,
|
|
67
|
-
onStart: true,
|
|
68
|
-
run: true,
|
|
69
|
-
};
|
|
70
|
-
/** The members each bag type declares, forwarded even when the bag does not enumerate them. */
|
|
71
|
-
export const HOOK_MEMBERS = {
|
|
72
|
-
cua: Object.keys(cuaMembers),
|
|
73
|
-
sharedWorld: Object.keys(sharedWorldMembers),
|
|
74
|
-
terminal: Object.keys(terminalMembers),
|
|
75
|
-
scripted: Object.keys(scriptedMembers),
|
|
76
|
-
analysis: Object.keys(analysisMembers),
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* The bag with `overrides` in place of its own members. Every other member becomes an enumerable
|
|
80
|
-
* accessor that reads the bag when it is read, so a getter runs only then and a spread of the
|
|
81
|
-
* result keeps every member. The members are the bag's own and inherited keys (string or symbol)
|
|
82
|
-
* plus `declared`, the members its type declares, which a proxy-backed bag may answer without
|
|
83
|
-
* listing. A function is bound to the bag, so its private fields still work. The overrides are
|
|
84
|
-
* ordinary data properties. Declared members always appear as own properties (undefined when
|
|
85
|
-
* unset), so code reading a wrapped bag tests the value, never `in`.
|
|
86
|
-
*/
|
|
87
|
-
export function withHookOverrides(bag, declared, overrides) {
|
|
88
|
-
const forward = {};
|
|
89
|
-
const replaced = new Set(Reflect.ownKeys(overrides));
|
|
90
|
-
const forwardMember = (key) => {
|
|
91
|
-
if (key === "constructor" || replaced.has(key) || Object.hasOwn(forward, key))
|
|
92
|
-
return;
|
|
93
|
-
Object.defineProperty(forward, key, {
|
|
94
|
-
enumerable: true,
|
|
95
|
-
configurable: true,
|
|
96
|
-
get() {
|
|
97
|
-
const value = Reflect.get(bag, key, bag);
|
|
98
|
-
return typeof value === "function" ? value.bind(bag) : value;
|
|
99
|
-
},
|
|
100
|
-
set(value) {
|
|
101
|
-
Reflect.set(bag, key, value, bag);
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
if (bag !== undefined) {
|
|
106
|
-
for (let source = bag; source !== null && source !== Object.prototype; source = Object.getPrototypeOf(source))
|
|
107
|
-
for (const key of Reflect.ownKeys(source))
|
|
108
|
-
forwardMember(key);
|
|
109
|
-
for (const key of declared)
|
|
110
|
-
forwardMember(key);
|
|
111
|
-
}
|
|
112
|
-
for (const key of replaced) {
|
|
113
|
-
Object.defineProperty(forward, key, {
|
|
114
|
-
value: overrides[key],
|
|
115
|
-
enumerable: true,
|
|
116
|
-
configurable: true,
|
|
117
|
-
writable: true,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
return forward;
|
|
121
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
-
export declare const OBSERVER_STATIC_HOST = "127.0.0.1";
|
|
3
|
-
export interface ObserverStaticHandlerOptions {
|
|
4
|
-
/** Directory served as the loopback root. Requests can never escape it. */
|
|
5
|
-
root: string;
|
|
6
|
-
/** File served for directory requests. Defaults to `index.html`. */
|
|
7
|
-
indexPath?: string;
|
|
8
|
-
/**
|
|
9
|
-
* When set, an exact `/` request returns a 302 to `/<redirectRootTo>` instead
|
|
10
|
-
* of serving a file. Used to land visitors on `observer/index.html` so the
|
|
11
|
-
* Observer's relative artifact links (`../run.json`, ...) resolve.
|
|
12
|
-
*/
|
|
13
|
-
redirectRootTo?: string;
|
|
14
|
-
}
|
|
15
|
-
export interface ObserverStaticServeOptions extends ObserverStaticHandlerOptions {
|
|
16
|
-
/** TCP port to bind on 127.0.0.1. Defaults to an ephemeral port (0). */
|
|
17
|
-
port?: number;
|
|
18
|
-
/**
|
|
19
|
-
* Relative entry page (e.g. `observer/index.html`). Drives the returned
|
|
20
|
-
* `url` and the `/` -> entry redirect so callers open the page directly.
|
|
21
|
-
*/
|
|
22
|
-
entryPath?: string;
|
|
23
|
-
}
|
|
24
|
-
export interface ObserverStaticServer {
|
|
25
|
-
url: string;
|
|
26
|
-
port: number;
|
|
27
|
-
host: string;
|
|
28
|
-
close(): Promise<void>;
|
|
29
|
-
}
|
|
30
|
-
export declare function observerStaticContentType(filePath: string): string;
|
|
31
|
-
/**
|
|
32
|
-
* Resolve, guard, and serve a single static request from `root`. Never throws:
|
|
33
|
-
* any unexpected failure is reported as a 500 so the connection always closes.
|
|
34
|
-
* Exported directly so the security guards can be unit-tested without binding a
|
|
35
|
-
* socket.
|
|
36
|
-
*/
|
|
37
|
-
export declare function respondToObserverStaticRequest(options: ObserverStaticHandlerOptions, request: Pick<IncomingMessage, "method" | "url">, response: ServerResponse): Promise<void>;
|
|
38
|
-
export declare function createObserverStaticHandler(options: ObserverStaticHandlerOptions): (request: IncomingMessage, response: ServerResponse) => void;
|
|
39
|
-
export declare function serveObserverStatic(options: ObserverStaticServeOptions): Promise<ObserverStaticServer>;
|
package/dist/observer/static.js
DELETED
|
@@ -1,369 +0,0 @@
|
|
|
1
|
-
import { constants as fsConstants } from "node:fs";
|
|
2
|
-
import { createServer } from "node:http";
|
|
3
|
-
import { lstat, open, realpath } from "node:fs/promises";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import { buildArtifactSecurityHeaders } from "./http.js";
|
|
6
|
-
// Loopback-only host for the Observer static server. We never bind 0.0.0.0:
|
|
7
|
-
// the Observer surfaces local run evidence and must stay reachable only from
|
|
8
|
-
// the machine that owns the run bundle.
|
|
9
|
-
export const OBSERVER_STATIC_HOST = "127.0.0.1";
|
|
10
|
-
// Minimal extension -> content-type map. Kept dependency-free (no `mime`
|
|
11
|
-
// package) because the Observer ships a small, known set of asset kinds.
|
|
12
|
-
const CONTENT_TYPES = {
|
|
13
|
-
".html": "text/html; charset=utf-8",
|
|
14
|
-
".htm": "text/html; charset=utf-8",
|
|
15
|
-
".js": "text/javascript; charset=utf-8",
|
|
16
|
-
".mjs": "text/javascript; charset=utf-8",
|
|
17
|
-
".css": "text/css; charset=utf-8",
|
|
18
|
-
".json": "application/json; charset=utf-8",
|
|
19
|
-
".map": "application/json; charset=utf-8",
|
|
20
|
-
".svg": "image/svg+xml",
|
|
21
|
-
".png": "image/png",
|
|
22
|
-
".jpg": "image/jpeg",
|
|
23
|
-
".jpeg": "image/jpeg",
|
|
24
|
-
".webp": "image/webp",
|
|
25
|
-
".gif": "image/gif",
|
|
26
|
-
".ico": "image/x-icon",
|
|
27
|
-
".md": "text/markdown; charset=utf-8",
|
|
28
|
-
".ndjson": "application/x-ndjson; charset=utf-8",
|
|
29
|
-
".txt": "text/plain; charset=utf-8",
|
|
30
|
-
".woff": "font/woff",
|
|
31
|
-
".woff2": "font/woff2",
|
|
32
|
-
};
|
|
33
|
-
export function observerStaticContentType(filePath) {
|
|
34
|
-
return CONTENT_TYPES[path.extname(filePath).toLowerCase()] ?? "application/octet-stream";
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Resolve, guard, and serve a single static request from `root`. Never throws:
|
|
38
|
-
* any unexpected failure is reported as a 500 so the connection always closes.
|
|
39
|
-
* Exported directly so the security guards can be unit-tested without binding a
|
|
40
|
-
* socket.
|
|
41
|
-
*/
|
|
42
|
-
export async function respondToObserverStaticRequest(options, request, response) {
|
|
43
|
-
applySecurityHeaders(response);
|
|
44
|
-
try {
|
|
45
|
-
const root = await pinStaticRoot(options.root);
|
|
46
|
-
await respondToPinnedObserverStaticRequest(root, options, request, response);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
if (response.headersSent) {
|
|
50
|
-
response.end();
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
writeText(response, 500, "Observer request failed");
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
async function respondToPinnedObserverStaticRequest(root, options, request, response) {
|
|
57
|
-
applySecurityHeaders(response);
|
|
58
|
-
const indexRelative = options.indexPath ?? "index.html";
|
|
59
|
-
try {
|
|
60
|
-
await assertPinnedStaticRoot(root);
|
|
61
|
-
const method = request.method ?? "GET";
|
|
62
|
-
if (method !== "GET" && method !== "HEAD") {
|
|
63
|
-
writeText(response, 405, "Method Not Allowed");
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
let pathname;
|
|
67
|
-
try {
|
|
68
|
-
pathname = new URL(request.url ?? "/", `http://${OBSERVER_STATIC_HOST}`).pathname;
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
writeText(response, 400, "Bad Request");
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
if (pathname === "/" && options.redirectRootTo) {
|
|
75
|
-
const location = `/${options.redirectRootTo.replace(/^\/+/, "")}`;
|
|
76
|
-
response.writeHead(302, {
|
|
77
|
-
location,
|
|
78
|
-
"cache-control": "no-store",
|
|
79
|
-
"content-length": "0",
|
|
80
|
-
});
|
|
81
|
-
response.end();
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
let decoded;
|
|
85
|
-
try {
|
|
86
|
-
decoded = decodeURIComponent(pathname);
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
writeText(response, 400, "Bad Request");
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
// Reject embedded NUL bytes outright rather than letting them reach the fs.
|
|
93
|
-
if (decoded.includes("\0")) {
|
|
94
|
-
writeText(response, 400, "Bad Request");
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
let relative = decoded.replace(/^\/+/, "");
|
|
98
|
-
if (relative === "" || relative.endsWith("/")) {
|
|
99
|
-
relative = `${relative}${indexRelative}`;
|
|
100
|
-
}
|
|
101
|
-
const target = path.resolve(root.physicalPath, relative);
|
|
102
|
-
if (!isPathInside(root.physicalPath, target)) {
|
|
103
|
-
writeText(response, 403, "Forbidden");
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
let info;
|
|
107
|
-
try {
|
|
108
|
-
info = await lstat(target);
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
writeText(response, 404, "Not Found");
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
if (info.isSymbolicLink()) {
|
|
115
|
-
writeText(response, 403, "Forbidden");
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
let filePath = target;
|
|
119
|
-
if (info.isDirectory()) {
|
|
120
|
-
filePath = path.resolve(target, indexRelative);
|
|
121
|
-
if (!isPathInside(root.physicalPath, filePath)) {
|
|
122
|
-
writeText(response, 403, "Forbidden");
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
const rawBody = await readContainedRegularFile(root, filePath);
|
|
127
|
-
const body = rawBody ? recordedObserverStaticBody(filePath, rawBody) : null;
|
|
128
|
-
if (!body) {
|
|
129
|
-
writeText(response, 404, "Not Found");
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
response.writeHead(200, {
|
|
133
|
-
"cache-control": "no-store",
|
|
134
|
-
"content-type": observerStaticContentType(filePath),
|
|
135
|
-
"content-length": String(body.byteLength),
|
|
136
|
-
});
|
|
137
|
-
if (method === "HEAD") {
|
|
138
|
-
response.end();
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
response.end(body);
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
if (response.headersSent) {
|
|
145
|
-
response.end();
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
writeText(response, 500, "Observer request failed");
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
function applySecurityHeaders(response) {
|
|
152
|
-
for (const [name, value] of Object.entries(buildArtifactSecurityHeaders()))
|
|
153
|
-
response.setHeader(name, value);
|
|
154
|
-
}
|
|
155
|
-
/** Static serving is recorded evidence. Neither JSON files nor inline HTML snapshots
|
|
156
|
-
* can carry a live process observation or grant provider-origin access. */
|
|
157
|
-
function recordedObserverStaticBody(filePath, body) {
|
|
158
|
-
const strip = (text) => {
|
|
159
|
-
try {
|
|
160
|
-
const data = JSON.parse(text);
|
|
161
|
-
if (!data ||
|
|
162
|
-
typeof data !== "object" ||
|
|
163
|
-
Array.isArray(data) ||
|
|
164
|
-
data.schema !== "humanish.observer-data.v1")
|
|
165
|
-
return null;
|
|
166
|
-
const projection = data;
|
|
167
|
-
delete projection.runtime;
|
|
168
|
-
if (Array.isArray(projection.streams)) {
|
|
169
|
-
for (const stream of projection.streams) {
|
|
170
|
-
if (!stream || typeof stream !== "object" || Array.isArray(stream))
|
|
171
|
-
continue;
|
|
172
|
-
const embed = stream.embed;
|
|
173
|
-
if (embed && typeof embed === "object" && !Array.isArray(embed))
|
|
174
|
-
delete embed.runtimeDesktop;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return JSON.stringify(projection)
|
|
178
|
-
.replace(/</g, "\\u003c")
|
|
179
|
-
.replace(/>/g, "\\u003e")
|
|
180
|
-
.replace(/&/g, "\\u0026");
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
if (path.basename(filePath) === "observer-data.json") {
|
|
187
|
-
const stripped = strip(body.toString("utf8"));
|
|
188
|
-
return stripped === null ? body : Buffer.from(stripped);
|
|
189
|
-
}
|
|
190
|
-
if (/\.html?$/i.test(filePath)) {
|
|
191
|
-
const html = body.toString("utf8");
|
|
192
|
-
// Identify Observer JSON by its schema, not an attribute spelling: HTML permits
|
|
193
|
-
// encoded ids and '>' inside quoted attributes. Other scripts remain byte-identical.
|
|
194
|
-
const sanitized = html.replace(/(<script\b(?:[^>"']|"[^"]*"|'[^']*')*>)([\s\S]*?)(<\/script\s*>)/gi, (match, start, json, end) => {
|
|
195
|
-
const stripped = strip(json);
|
|
196
|
-
return stripped === null ? match : `${start}${stripped}${end}`;
|
|
197
|
-
});
|
|
198
|
-
return sanitized === html ? body : Buffer.from(sanitized);
|
|
199
|
-
}
|
|
200
|
-
return body;
|
|
201
|
-
}
|
|
202
|
-
async function readContainedRegularFile(root, filePathInput) {
|
|
203
|
-
const filePath = path.resolve(filePathInput);
|
|
204
|
-
if (!isPathInside(root.physicalPath, filePath))
|
|
205
|
-
return null;
|
|
206
|
-
try {
|
|
207
|
-
await assertPinnedStaticRoot(root);
|
|
208
|
-
const expectedStats = await inspectContainedStaticFile(root, filePath);
|
|
209
|
-
if (!expectedStats) {
|
|
210
|
-
return null;
|
|
211
|
-
}
|
|
212
|
-
const handle = await open(filePath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
|
|
213
|
-
try {
|
|
214
|
-
const openedStats = await handle.stat({ bigint: true });
|
|
215
|
-
if (!openedStats.isFile() ||
|
|
216
|
-
openedStats.nlink !== 1n ||
|
|
217
|
-
openedStats.dev !== expectedStats.dev ||
|
|
218
|
-
openedStats.ino !== expectedStats.ino) {
|
|
219
|
-
return null;
|
|
220
|
-
}
|
|
221
|
-
const recheckedStats = await inspectContainedStaticFile(root, filePath);
|
|
222
|
-
if (!recheckedStats ||
|
|
223
|
-
recheckedStats.dev !== expectedStats.dev ||
|
|
224
|
-
recheckedStats.ino !== expectedStats.ino) {
|
|
225
|
-
return null;
|
|
226
|
-
}
|
|
227
|
-
await assertPinnedStaticRoot(root);
|
|
228
|
-
const body = await handle.readFile();
|
|
229
|
-
await assertPinnedStaticRoot(root);
|
|
230
|
-
return body;
|
|
231
|
-
}
|
|
232
|
-
finally {
|
|
233
|
-
await handle.close();
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
catch {
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
export function createObserverStaticHandler(options) {
|
|
241
|
-
let rootPromise;
|
|
242
|
-
return (request, response) => {
|
|
243
|
-
applySecurityHeaders(response);
|
|
244
|
-
rootPromise ??= pinStaticRoot(options.root);
|
|
245
|
-
void rootPromise
|
|
246
|
-
.then((root) => respondToPinnedObserverStaticRequest(root, options, request, response))
|
|
247
|
-
.catch(() => {
|
|
248
|
-
if (response.headersSent) {
|
|
249
|
-
response.end();
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
writeText(response, 500, "Observer request failed");
|
|
253
|
-
});
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
export async function serveObserverStatic(options) {
|
|
257
|
-
const entryPath = options.entryPath?.replace(/^\/+/, "") ?? "";
|
|
258
|
-
const handlerOptions = {
|
|
259
|
-
root: options.root,
|
|
260
|
-
...(options.indexPath === undefined ? {} : { indexPath: options.indexPath }),
|
|
261
|
-
...(entryPath ? { redirectRootTo: entryPath } : {}),
|
|
262
|
-
};
|
|
263
|
-
const root = await pinStaticRoot(options.root);
|
|
264
|
-
const handler = (request, response) => {
|
|
265
|
-
void respondToPinnedObserverStaticRequest(root, handlerOptions, request, response);
|
|
266
|
-
};
|
|
267
|
-
const server = createServer(handler);
|
|
268
|
-
const port = await listen(server, options.port ?? 0);
|
|
269
|
-
return {
|
|
270
|
-
url: `http://${OBSERVER_STATIC_HOST}:${port}/${entryPath}`,
|
|
271
|
-
port,
|
|
272
|
-
host: OBSERVER_STATIC_HOST,
|
|
273
|
-
close: () => closeServer(server),
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
function writeText(response, status, message) {
|
|
277
|
-
const body = `${message}\n`;
|
|
278
|
-
response.writeHead(status, {
|
|
279
|
-
"cache-control": "no-store",
|
|
280
|
-
"content-type": "text/plain; charset=utf-8",
|
|
281
|
-
"content-length": String(Buffer.byteLength(body)),
|
|
282
|
-
});
|
|
283
|
-
response.end(body);
|
|
284
|
-
}
|
|
285
|
-
function isPathInside(root, candidate) {
|
|
286
|
-
const relative = path.relative(root, candidate);
|
|
287
|
-
return (relative === "" ||
|
|
288
|
-
(relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)));
|
|
289
|
-
}
|
|
290
|
-
async function inspectContainedStaticFile(root, filePath) {
|
|
291
|
-
const relative = path.relative(root.physicalPath, filePath);
|
|
292
|
-
if (!relative ||
|
|
293
|
-
relative === ".." ||
|
|
294
|
-
relative.startsWith(`..${path.sep}`) ||
|
|
295
|
-
path.isAbsolute(relative)) {
|
|
296
|
-
return null;
|
|
297
|
-
}
|
|
298
|
-
const segments = relative.split(path.sep).filter(Boolean);
|
|
299
|
-
let current = root.physicalPath;
|
|
300
|
-
let fileIdentity = null;
|
|
301
|
-
for (const [index, segment] of segments.entries()) {
|
|
302
|
-
current = path.join(current, segment);
|
|
303
|
-
const stats = await lstat(current, { bigint: true });
|
|
304
|
-
if (stats.isSymbolicLink())
|
|
305
|
-
return null;
|
|
306
|
-
if (index < segments.length - 1) {
|
|
307
|
-
if (!stats.isDirectory())
|
|
308
|
-
return null;
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
if (!stats.isFile() || stats.nlink !== 1n)
|
|
312
|
-
return null;
|
|
313
|
-
fileIdentity = { dev: stats.dev, ino: stats.ino };
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
if ((await realpath(filePath)) !== filePath)
|
|
317
|
-
return null;
|
|
318
|
-
return fileIdentity;
|
|
319
|
-
}
|
|
320
|
-
async function pinStaticRoot(rootInput) {
|
|
321
|
-
const physicalPath = await realpath(path.resolve(rootInput));
|
|
322
|
-
const stats = await lstat(physicalPath, { bigint: true });
|
|
323
|
-
if (stats.isSymbolicLink() || !stats.isDirectory()) {
|
|
324
|
-
throw new Error("Observer static roots must be physical directories.");
|
|
325
|
-
}
|
|
326
|
-
return Object.freeze({
|
|
327
|
-
birthtimeNs: stats.birthtimeNs,
|
|
328
|
-
dev: stats.dev,
|
|
329
|
-
ino: stats.ino,
|
|
330
|
-
physicalPath,
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
async function assertPinnedStaticRoot(root) {
|
|
334
|
-
const stats = await lstat(root.physicalPath, { bigint: true });
|
|
335
|
-
if (stats.isSymbolicLink() ||
|
|
336
|
-
!stats.isDirectory() ||
|
|
337
|
-
stats.birthtimeNs !== root.birthtimeNs ||
|
|
338
|
-
stats.dev !== root.dev ||
|
|
339
|
-
stats.ino !== root.ino ||
|
|
340
|
-
(await realpath(root.physicalPath)) !== root.physicalPath) {
|
|
341
|
-
throw new Error("Observer static root identity changed.");
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
function listen(server, port) {
|
|
345
|
-
return new Promise((resolve, reject) => {
|
|
346
|
-
server.once("error", reject);
|
|
347
|
-
server.listen(port, OBSERVER_STATIC_HOST, () => {
|
|
348
|
-
server.off("error", reject);
|
|
349
|
-
const address = server.address();
|
|
350
|
-
if (!address || typeof address === "string") {
|
|
351
|
-
reject(new Error("Observer static server did not bind to a TCP port."));
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
resolve(address.port);
|
|
355
|
-
});
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
function closeServer(server) {
|
|
359
|
-
return new Promise((resolve, reject) => {
|
|
360
|
-
server.close((error) => {
|
|
361
|
-
if (error) {
|
|
362
|
-
reject(error);
|
|
363
|
-
}
|
|
364
|
-
else {
|
|
365
|
-
resolve();
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
|
-
});
|
|
369
|
-
}
|