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
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { lstat, readdir, rmdir, unlink } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { decodeEscapes } from "../evidence/encoded-text.js";
|
|
4
|
+
import { redactText } from "../evidence/redaction.js";
|
|
5
|
+
import { assertPreparedSelectedOutputDirectory, assertSafeOutputPathSegment, bindExistingManagedHumanishOutputDirectory, prepareManagedHumanishOutputDirectory, writeContainedOutputFile, } from "../run/contained-output.js";
|
|
6
|
+
import { scrubTransientCommsText, transientCommsEncodedScrub, } from "../run/transient-comms-secrets.js";
|
|
7
|
+
import { ANALYSIS_ID_PATTERN } from "./types.js";
|
|
8
|
+
// A rejected analyst response is kept for diagnosis under .humanish/analysis-diagnostics/<run>/,
|
|
9
|
+
// outside every run directory. Export, verify and the Observer read run directories only, so the
|
|
10
|
+
// file never reaches a bundle, an export or a served page. The analysis artifact itself still
|
|
11
|
+
// records only the allowlisted code.
|
|
12
|
+
const ANALYSIS_DIAGNOSTICS_DIRECTORY = "analysis-diagnostics";
|
|
13
|
+
const ANALYSIS_DIAGNOSTIC_SCHEMA = "humanish.analysis-rejected-output.v1";
|
|
14
|
+
/** How many rejected outputs are kept across all runs; older ones are removed on each write. */
|
|
15
|
+
export const MAX_ANALYSIS_DIAGNOSTICS = 20;
|
|
16
|
+
const REDACTED = "[REDACTED_SECRET]";
|
|
17
|
+
const markers = (text) => text.split(REDACTED).length - 1;
|
|
18
|
+
/**
|
|
19
|
+
* Scrub every string, key and scalar in the output. The encoded scrub finds a known value written
|
|
20
|
+
* percent-encoded, escaped or base64-encoded and returns decoded text; a string where it finds
|
|
21
|
+
* nothing keeps its original spelling, so an escape in a rejected quote stays visible, and still
|
|
22
|
+
* gets the literal scrub. A number or boolean equal to a known value becomes the marker.
|
|
23
|
+
*/
|
|
24
|
+
function scrubber() {
|
|
25
|
+
const encoded = transientCommsEncodedScrub();
|
|
26
|
+
const text = (value) => {
|
|
27
|
+
const found = encoded(value);
|
|
28
|
+
return redactText(markers(found) > markers(decodeEscapes(value)) ? found : scrubTransientCommsText(value));
|
|
29
|
+
};
|
|
30
|
+
const scrub = (value) => {
|
|
31
|
+
if (typeof value === "string")
|
|
32
|
+
return text(value);
|
|
33
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
34
|
+
return text(String(value)) === String(value) ? value : REDACTED;
|
|
35
|
+
if (Array.isArray(value))
|
|
36
|
+
return value.map(scrub);
|
|
37
|
+
if (value !== null && typeof value === "object")
|
|
38
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [text(key), scrub(entry)]));
|
|
39
|
+
return value;
|
|
40
|
+
};
|
|
41
|
+
return scrub;
|
|
42
|
+
}
|
|
43
|
+
/** Write one rejected output and prune to the newest MAX_ANALYSIS_DIAGNOSTICS. Returns its path relative to cwd. */
|
|
44
|
+
export async function keepRejectedAnalysisOutput(cwd, record, rejected, hooks = {}) {
|
|
45
|
+
assertSafeOutputPathSegment(record.runId, "Run id");
|
|
46
|
+
if (!ANALYSIS_ID_PATTERN.test(record.analysisId))
|
|
47
|
+
throw new Error("Unsafe analysis id.");
|
|
48
|
+
const root = await prepareManagedHumanishOutputDirectory(cwd, ANALYSIS_DIAGNOSTICS_DIRECTORY, record.runId);
|
|
49
|
+
const file = `${record.analysisId}.json`;
|
|
50
|
+
const document = {
|
|
51
|
+
schema: ANALYSIS_DIAGNOSTIC_SCHEMA,
|
|
52
|
+
...record,
|
|
53
|
+
recordedAt: new Date().toISOString(),
|
|
54
|
+
error: rejected.error,
|
|
55
|
+
errors: rejected.errors,
|
|
56
|
+
output: scrubber()(rejected.output),
|
|
57
|
+
};
|
|
58
|
+
await writeContainedOutputFile(root, file, `${JSON.stringify(document, null, 2)}\n`, "utf8");
|
|
59
|
+
// A failed prune leaves extra files that the next write removes.
|
|
60
|
+
await pruneAnalysisDiagnostics(cwd, hooks).catch(() => undefined);
|
|
61
|
+
return path.join(".humanish", ANALYSIS_DIAGNOSTICS_DIRECTORY, record.runId, file);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Remove one record, or with no name one emptied run directory, only while the directory is still
|
|
65
|
+
* the one listed: its path resolves to the same physical directory with the same identity, so a
|
|
66
|
+
* directory swapped for a symlink after listing is refused. The record must be a regular file.
|
|
67
|
+
*/
|
|
68
|
+
async function removeListed(root, name) {
|
|
69
|
+
try {
|
|
70
|
+
await assertPreparedSelectedOutputDirectory(root);
|
|
71
|
+
if (name === undefined) {
|
|
72
|
+
await rmdir(root.physicalPath);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const file = path.join(root.physicalPath, name);
|
|
76
|
+
if (!(await lstat(file)).isFile())
|
|
77
|
+
return;
|
|
78
|
+
await unlink(file);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// A changed directory, a vanished file or a directory that still holds a file is left alone.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function pruneAnalysisDiagnostics(cwd, hooks) {
|
|
85
|
+
const parent = await bindExistingManagedHumanishOutputDirectory(cwd, ANALYSIS_DIAGNOSTICS_DIRECTORY);
|
|
86
|
+
if (!parent)
|
|
87
|
+
return;
|
|
88
|
+
const files = [];
|
|
89
|
+
for (const run of await readdir(parent.physicalPath, { withFileTypes: true })) {
|
|
90
|
+
if (!run.isDirectory())
|
|
91
|
+
continue;
|
|
92
|
+
const root = await bindExistingManagedHumanishOutputDirectory(cwd, ANALYSIS_DIAGNOSTICS_DIRECTORY, run.name);
|
|
93
|
+
if (!root)
|
|
94
|
+
continue;
|
|
95
|
+
for (const entry of await readdir(root.physicalPath, { withFileTypes: true })) {
|
|
96
|
+
if (!entry.isFile() || !entry.name.endsWith(".json"))
|
|
97
|
+
continue;
|
|
98
|
+
const modified = (await lstat(path.join(root.physicalPath, entry.name))).mtimeMs;
|
|
99
|
+
files.push({ root, name: entry.name, modified });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
files.sort((a, b) => b.modified - a.modified ||
|
|
103
|
+
path.join(b.root.physicalPath, b.name).localeCompare(path.join(a.root.physicalPath, a.name)));
|
|
104
|
+
const removed = files.slice(MAX_ANALYSIS_DIAGNOSTICS);
|
|
105
|
+
if (removed.length === 0)
|
|
106
|
+
return;
|
|
107
|
+
await hooks.beforeRemove?.();
|
|
108
|
+
for (const { root, name } of removed)
|
|
109
|
+
await removeListed(root, name);
|
|
110
|
+
for (const root of new Set(removed.map((entry) => entry.root)))
|
|
111
|
+
await removeListed(root);
|
|
112
|
+
}
|
|
@@ -3,7 +3,7 @@ import { eventRecordIdOf, recordIdOf, streamParticipantIdOf } from "../run/parti
|
|
|
3
3
|
import { cuaGoalSource } from "../actors/goal-source.js";
|
|
4
4
|
import { isRecord } from "../run/type-guards.js";
|
|
5
5
|
import { ACTION_CAPTURE_VERSION, } from "./types.js";
|
|
6
|
-
import { decodesToPlainRelativePath,
|
|
6
|
+
import { decodesToPlainRelativePath, isEvidencePath } from "../run/evidence-files.js";
|
|
7
7
|
// How a run bundle becomes analysis sources: each participant's recorded provenance and assignment,
|
|
8
8
|
// the evidence entries its trace offers, and the order in which entries are admitted under the
|
|
9
9
|
// count and byte budgets. captureEvidence selects from these, and validateAnalysisEvidence
|
|
@@ -127,7 +127,7 @@ export function sourceEntries(bundle, stream, captureVersion) {
|
|
|
127
127
|
const capturePath = isCaptureItem(item, captureVersion) &&
|
|
128
128
|
isRecord(item.screenshotRef) &&
|
|
129
129
|
typeof item.screenshotRef.path === "string" &&
|
|
130
|
-
|
|
130
|
+
isEvidencePath(item.screenshotRef.path)
|
|
131
131
|
? item.screenshotRef.path
|
|
132
132
|
: null;
|
|
133
133
|
if (frameIds.has(item.id))
|
|
@@ -7,7 +7,7 @@ import { RUN_BUNDLE_FILE } from "../run/bundle.js";
|
|
|
7
7
|
import { ACTION_CAPTURE_VERSION, } from "./types.js";
|
|
8
8
|
import { digestAnalysisInput, hashAnalysisValue, validateAnalysisInputMetadata, } from "./validation.js";
|
|
9
9
|
import { boundedText, fairShares, hasUnmappedCaptures, participantAssignment, participantSource, sourceEntries, sourceOrder, } from "./evidence-sources.js";
|
|
10
|
-
import {
|
|
10
|
+
import { readBoundedFile, readBoundedFileResult } from "../run/evidence-files.js";
|
|
11
11
|
export const EVIDENCE_LIMITS = Object.freeze({
|
|
12
12
|
participants: 16,
|
|
13
13
|
evidence: 800,
|
|
@@ -96,7 +96,7 @@ export async function captureEvidence(prepared, bundleBytes, requested = {}) {
|
|
|
96
96
|
}
|
|
97
97
|
if (bundleBytes.length > limits.sourceBytes)
|
|
98
98
|
throw new Error("ANALYSIS_SOURCE_TOO_LARGE");
|
|
99
|
-
const current = await
|
|
99
|
+
const current = await readBoundedFile(prepared, RUN_BUNDLE_FILE, limits.sourceBytes);
|
|
100
100
|
if (!current || !current.equals(bundleBytes))
|
|
101
101
|
throw new Error("ANALYSIS_SOURCE_CHANGED");
|
|
102
102
|
const bundle = parseSource(prepared, bundleBytes);
|
|
@@ -164,7 +164,7 @@ export async function captureEvidence(prepared, bundleBytes, requested = {}) {
|
|
|
164
164
|
};
|
|
165
165
|
result.inputDigest = digestAnalysisInput(result);
|
|
166
166
|
validateAnalysisInputMetadata(result);
|
|
167
|
-
const after = await
|
|
167
|
+
const after = await readBoundedFile(prepared, RUN_BUNDLE_FILE, limits.sourceBytes);
|
|
168
168
|
if (!after || !after.equals(bundleBytes))
|
|
169
169
|
throw new Error("ANALYSIS_SOURCE_CHANGED");
|
|
170
170
|
return result;
|
|
@@ -229,7 +229,7 @@ async function selectCaptures(prepared, packings, sel, omissions) {
|
|
|
229
229
|
packing.attempts++;
|
|
230
230
|
sel.attemptedReads++;
|
|
231
231
|
const source = sel.captureOrders[index][packing.captureCursor];
|
|
232
|
-
const result = await
|
|
232
|
+
const result = await readBoundedFileResult(prepared, source.capturePath, allowance);
|
|
233
233
|
if (result.state === "limit" &&
|
|
234
234
|
result.size <= BigInt(limits.imageBytes) &&
|
|
235
235
|
result.size <= BigInt(limits.totalImageBytes - sel.imageBytes) &&
|
|
@@ -458,7 +458,7 @@ export async function validateAnalysisEvidence(prepared, artifact, bundleBytes)
|
|
|
458
458
|
throw new Error("ANALYSIS_CAPTURE_REFERENCE_INVALID");
|
|
459
459
|
let hash = checkedCaptures.get(source.capturePath);
|
|
460
460
|
if (hash === undefined) {
|
|
461
|
-
const bytes = await
|
|
461
|
+
const bytes = await readBoundedFile(prepared, source.capturePath, EVIDENCE_LIMITS.imageBytes);
|
|
462
462
|
if (!bytes || screenshotEvidenceError(source.capturePath, bytes) !== null)
|
|
463
463
|
throw new Error("ANALYSIS_CAPTURE_UNAVAILABLE");
|
|
464
464
|
checkedImageBytes += bytes.length;
|
|
@@ -476,7 +476,7 @@ export async function validateAnalysisEvidence(prepared, artifact, bundleBytes)
|
|
|
476
476
|
artifact.evidence.length) {
|
|
477
477
|
throw new Error("ANALYSIS_COVERAGE_INCOMPLETE");
|
|
478
478
|
}
|
|
479
|
-
const current = await
|
|
479
|
+
const current = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
|
|
480
480
|
if (!current?.equals(bundleBytes))
|
|
481
481
|
throw new Error("ANALYSIS_SOURCE_CHANGED");
|
|
482
482
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type AnalysisArtifact, type AnalysisConfig, type AnalysisInput } from "./types.js";
|
|
2
2
|
import { type AnalysisFetch, type AnalysisProvider } from "./provider.js";
|
|
3
|
+
import type { RejectedAnalysisOutput } from "./diagnostics.js";
|
|
3
4
|
export declare const ANALYSIS_PROMPT_VERSION = "study-evidence-6";
|
|
4
5
|
export declare const isSupportedAnalysisModel: (model: string) => boolean;
|
|
5
6
|
/** The OpenAI output limit when a lab omits maxOutputTokens, and the most it may ask for. */
|
|
@@ -21,7 +22,7 @@ export interface AnalysisProgress {
|
|
|
21
22
|
status?: AnalysisArtifact["status"];
|
|
22
23
|
}
|
|
23
24
|
/**
|
|
24
|
-
* Local admission
|
|
25
|
+
* Local admission estimate, not a provider-enforced billed-spend guarantee. No token-count API
|
|
25
26
|
* call, credential, or network access. One UTF-8 byte/token for all text/schema plus framing is
|
|
26
27
|
* intentionally conservative. Each high-detail image is priced from its PNG size by the vision
|
|
27
28
|
* guide's patch formula (see image-tokens.ts), or at the 3,000-token ceiling when its size or the
|
|
@@ -46,6 +47,11 @@ interface RunAnalysisOptions {
|
|
|
46
47
|
/** Set by automatic analysis to its job attempt id, claimed before any provider call. */
|
|
47
48
|
analysisId?: string;
|
|
48
49
|
beforeDispatch?: (context: AnalysisDispatchContext) => Promise<void>;
|
|
50
|
+
/** Receives the provider's run warnings, such as Codex notification methods humanish does not know. */
|
|
51
|
+
warnings?: string[];
|
|
52
|
+
/** Receives a completed response that failed validation, for local diagnosis only. The
|
|
53
|
+
* artifact still records only the allowlisted code. */
|
|
54
|
+
onRejectedOutput?: (rejected: RejectedAnalysisOutput) => void;
|
|
49
55
|
}
|
|
50
56
|
/** Explicit invocation or an opted-in post-run owner; Observer readers never call this. */
|
|
51
57
|
export declare function runAnalysis(input: AnalysisInput, config: AnalysisConfig, options: RunAnalysisOptions): Promise<AnalysisArtifact>;
|
package/dist/analysis/execute.js
CHANGED
|
@@ -8,6 +8,8 @@ import { ANALYSIS_ID_PATTERN, ANALYSIS_SCHEMA, } from "./types.js";
|
|
|
8
8
|
import { INPUT_IMAGE_DATA_URL, createAnalysisProvider, } from "./provider.js";
|
|
9
9
|
import { checkAnalysisResult, hashAnalysisValue, analysisResponseSchema, analysisResultJsonSchema, validateAnalysisInputMetadata, } from "./validation.js";
|
|
10
10
|
import { EVIDENCE_LIMITS } from "./evidence.js";
|
|
11
|
+
import { truncatedFrameWarning, unknownNotificationsWarning, } from "../actors/codex/restricted-notifications.js";
|
|
12
|
+
import { protocolAdditionsWarning, protocolIncompatibilityMessage, } from "../actors/codex/protocol-compat.js";
|
|
11
13
|
export const ANALYSIS_PROMPT_VERSION = "study-evidence-6";
|
|
12
14
|
const SUPPORTED_ANALYSIS_MODELS = Object.freeze([
|
|
13
15
|
"gpt-6-astra",
|
|
@@ -119,7 +121,7 @@ function inputError(input) {
|
|
|
119
121
|
return null;
|
|
120
122
|
}
|
|
121
123
|
/**
|
|
122
|
-
* Local admission
|
|
124
|
+
* Local admission estimate, not a provider-enforced billed-spend guarantee. No token-count API
|
|
123
125
|
* call, credential, or network access. One UTF-8 byte/token for all text/schema plus framing is
|
|
124
126
|
* intentionally conservative. Each high-detail image is priced from its PNG size by the vision
|
|
125
127
|
* guide's patch formula (see image-tokens.ts), or at the 3,000-token ceiling when its size or the
|
|
@@ -296,26 +298,33 @@ const VALIDATION_FAILURES = Object.freeze({
|
|
|
296
298
|
function checkProviderAnalysis(input, value) {
|
|
297
299
|
try {
|
|
298
300
|
const parsed = analysisResponseSchema.safeParse(value);
|
|
299
|
-
if (!parsed.success)
|
|
300
|
-
|
|
301
|
+
if (!parsed.success) {
|
|
302
|
+
const error = VALIDATION_FAILURES.ANALYSIS_RESULT_SCHEMA_INVALID;
|
|
303
|
+
return { ok: false, error, rejected: { error, errors: [], output: value } };
|
|
304
|
+
}
|
|
301
305
|
let scrubbed;
|
|
302
306
|
try {
|
|
303
307
|
scrubbed = scrubGeneratedNarrative(parsed.data);
|
|
304
308
|
}
|
|
305
309
|
catch (error) {
|
|
310
|
+
if (!(error instanceof Error && error.message === "ANALYSIS_TRANSIENT_SECRET_IN_STRUCTURE"))
|
|
311
|
+
return { ok: false, error: "analysis_validation_failed_unexpected" };
|
|
312
|
+
const rejected = "analysis_validation_failed_scrub_rejected";
|
|
306
313
|
return {
|
|
307
314
|
ok: false,
|
|
308
|
-
error:
|
|
309
|
-
|
|
310
|
-
: "analysis_validation_failed_unexpected",
|
|
315
|
+
error: rejected,
|
|
316
|
+
rejected: { error: rejected, errors: [], output: value },
|
|
311
317
|
};
|
|
312
318
|
}
|
|
313
319
|
const checked = checkAnalysisResult(input, scrubbed);
|
|
314
|
-
if (!checked.ok)
|
|
320
|
+
if (!checked.ok) {
|
|
321
|
+
const error = VALIDATION_FAILURES[checked.errors[0] ?? ""] ?? "analysis_validation_failed_unexpected";
|
|
315
322
|
return {
|
|
316
323
|
ok: false,
|
|
317
|
-
error
|
|
324
|
+
error,
|
|
325
|
+
rejected: { error, errors: [...checked.errors], output: scrubbed },
|
|
318
326
|
};
|
|
327
|
+
}
|
|
319
328
|
return checked;
|
|
320
329
|
}
|
|
321
330
|
catch {
|
|
@@ -403,14 +412,21 @@ function recordProviderUsage(artifact, config, response) {
|
|
|
403
412
|
/**
|
|
404
413
|
* Settle a completed response. Parse the bounded shape first, then scrub and validate again.
|
|
405
414
|
* Changed exact quotes or expanded field lengths fail closed under the original validator; source
|
|
406
|
-
* bytes stay intact. Only an allowlisted stage or first rule code
|
|
407
|
-
* exceptions
|
|
415
|
+
* bytes stay intact. Only an allowlisted stage or first rule code reaches the artifact; rejected
|
|
416
|
+
* output goes to the caller's diagnostic callback and exceptions go nowhere.
|
|
408
417
|
*/
|
|
409
|
-
function settleCompletedOutput(artifact, input, config, admission, response) {
|
|
418
|
+
function settleCompletedOutput(artifact, input, config, admission, response, onRejectedOutput) {
|
|
410
419
|
const checked = checkProviderAnalysis(input, response.output);
|
|
411
420
|
if (!checked.ok) {
|
|
412
421
|
artifact.result = null;
|
|
413
422
|
artifact.error = checked.error;
|
|
423
|
+
if (checked.rejected)
|
|
424
|
+
try {
|
|
425
|
+
onRejectedOutput?.(checked.rejected);
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
/* Diagnosis does not own the attempt's outcome. */
|
|
429
|
+
}
|
|
414
430
|
return;
|
|
415
431
|
}
|
|
416
432
|
artifact.result = checked.result;
|
|
@@ -493,12 +509,23 @@ export async function runAnalysis(input, config, options) {
|
|
|
493
509
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
494
510
|
});
|
|
495
511
|
recordProviderUsage(artifact, config, response);
|
|
512
|
+
if (config.provider === "codex")
|
|
513
|
+
for (const warning of [
|
|
514
|
+
response.protocolIncompatibilities === undefined
|
|
515
|
+
? undefined
|
|
516
|
+
: protocolIncompatibilityMessage(config.identity.cliVersion, response.protocolIncompatibilities),
|
|
517
|
+
protocolAdditionsWarning(config.identity.cliVersion, response.protocolAdditions),
|
|
518
|
+
unknownNotificationsWarning(response.unknownNotifications, config.identity.cliVersion),
|
|
519
|
+
truncatedFrameWarning(response.truncatedFrameBytes),
|
|
520
|
+
])
|
|
521
|
+
if (warning !== undefined)
|
|
522
|
+
options.warnings?.push(warning);
|
|
496
523
|
if (response.status !== "completed") {
|
|
497
524
|
artifact.status = response.status === "cancelled" ? "cancelled" : "failed";
|
|
498
525
|
artifact.error = `analysis_${response.errorCode ?? "provider_failed"}`;
|
|
499
526
|
return finish();
|
|
500
527
|
}
|
|
501
528
|
progress("validating");
|
|
502
|
-
settleCompletedOutput(artifact, input, config, admission, response);
|
|
529
|
+
settleCompletedOutput(artifact, input, config, admission, response, options.onRejectedOutput);
|
|
503
530
|
return finish();
|
|
504
531
|
}
|
package/dist/analysis/job.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface AutomaticAnalysisCancellation {
|
|
|
21
21
|
requested: boolean;
|
|
22
22
|
reason: string | null;
|
|
23
23
|
}
|
|
24
|
+
/** A route's reason not to analyze a run it recorded, persisted as the job's skip reason. */
|
|
25
|
+
export type AutomaticAnalysisRefusal = "AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED";
|
|
24
26
|
declare const jobSchema: z.ZodObject<{
|
|
25
27
|
schema: z.ZodLiteral<"humanish.automatic-study-analysis.v1">;
|
|
26
28
|
runId: z.ZodString;
|
|
@@ -45,6 +47,7 @@ declare const jobSchema: z.ZodObject<{
|
|
|
45
47
|
AUTOMATIC_ANALYSIS_BUSY: "AUTOMATIC_ANALYSIS_BUSY";
|
|
46
48
|
AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE: "AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE";
|
|
47
49
|
AUTOMATIC_ANALYSIS_CANCELLED: "AUTOMATIC_ANALYSIS_CANCELLED";
|
|
50
|
+
AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED: "AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED";
|
|
48
51
|
AUTOMATIC_ANALYSIS_CODEX_UNAVAILABLE: "AUTOMATIC_ANALYSIS_CODEX_UNAVAILABLE";
|
|
49
52
|
AUTOMATIC_ANALYSIS_FAILED: "AUTOMATIC_ANALYSIS_FAILED";
|
|
50
53
|
AUTOMATIC_ANALYSIS_KEY_MISSING: "AUTOMATIC_ANALYSIS_KEY_MISSING";
|
|
@@ -69,9 +72,9 @@ declare const jobSchema: z.ZodObject<{
|
|
|
69
72
|
}, z.core.$strict>;
|
|
70
73
|
type JobRecord = z.infer<typeof jobSchema>;
|
|
71
74
|
/** Also guards direct HTML projection callers, not only the contained-file reader. */
|
|
72
|
-
export declare function
|
|
75
|
+
export declare function projectAutomaticAnalysisView(value: unknown): AutomaticAnalysisView | undefined;
|
|
73
76
|
/** Minimal historical accounting, without source validation, execution or liveness inference. */
|
|
74
|
-
export declare function
|
|
77
|
+
export declare function readAutomaticAnalysisAccounting(prepared: PreparedRunArtifactPaths): Promise<{
|
|
75
78
|
attemptId: string;
|
|
76
79
|
analysisId: string | null;
|
|
77
80
|
started: boolean;
|
|
@@ -79,7 +82,7 @@ export declare function readAutomaticStudyAnalysisAccounting(prepared: PreparedR
|
|
|
79
82
|
uncertain: boolean;
|
|
80
83
|
} | "unknown" | undefined>;
|
|
81
84
|
/** Read-only projection. A stale timestamp or persisted claim never authorizes execution. */
|
|
82
|
-
export declare function
|
|
85
|
+
export declare function readAutomaticAnalysisPrepared(prepared: PreparedRunArtifactPaths, now?: number): Promise<AutomaticAnalysisView | undefined>;
|
|
83
86
|
export interface AutomaticAnalysisJob {
|
|
84
87
|
readonly attemptId: string;
|
|
85
88
|
/** Serialized, awaited durability boundary. A failed write must prevent dispatch. */
|
|
@@ -88,10 +91,10 @@ export interface AutomaticAnalysisJob {
|
|
|
88
91
|
cancellationRequested(): Promise<boolean>;
|
|
89
92
|
}
|
|
90
93
|
/** The directory is permanent, including after interrupted/failed writes. Never re-open it as a writer. */
|
|
91
|
-
export declare function
|
|
94
|
+
export declare function claimAutomaticAnalysis(prepared: PreparedRunArtifactPaths, metadata: {
|
|
92
95
|
configDigest: string;
|
|
93
96
|
promptVersion: string;
|
|
94
97
|
}): Promise<AutomaticAnalysisJob | null>;
|
|
95
98
|
/** A scoped cancellation request, never a PID signal and never permission to create a new job. */
|
|
96
|
-
export declare function
|
|
99
|
+
export declare function requestAutomaticAnalysisCancellationPrepared(prepared: PreparedRunArtifactPaths): Promise<AutomaticAnalysisCancellation>;
|
|
97
100
|
export {};
|
package/dist/analysis/job.js
CHANGED
|
@@ -4,10 +4,10 @@ import path from "node:path";
|
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { physicalCwdOf, runIdOf, validatePreparedRunRootIdentity, } from "../run/paths.js";
|
|
6
6
|
import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile, } from "../run/contained-output.js";
|
|
7
|
-
import { pathMissing,
|
|
7
|
+
import { pathMissing, readBoundedFile } from "../run/evidence-files.js";
|
|
8
8
|
import { containsSensitive } from "../evidence/redaction.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { readAnalysisVersion } from "./store.js";
|
|
10
|
+
import { readAnalysisExecution } from "./store-executions.js";
|
|
11
11
|
import { hashAnalysisValue } from "./validation.js";
|
|
12
12
|
import { ANALYSIS_ID_PATTERN, SHA256_HEX_PATTERN } from "./types.js";
|
|
13
13
|
export const AUTOMATIC_ANALYSIS_DIRECTORY = "analysis-automatic";
|
|
@@ -47,6 +47,7 @@ const reasons = [
|
|
|
47
47
|
"AUTOMATIC_ANALYSIS_ADMISSION_EXCEEDED",
|
|
48
48
|
"AUTOMATIC_ANALYSIS_ACTOR_CANCELLED",
|
|
49
49
|
"AUTOMATIC_ANALYSIS_NO_PARTICIPANT_EVIDENCE",
|
|
50
|
+
"AUTOMATIC_ANALYSIS_CLEANUP_UNCONFIRMED",
|
|
50
51
|
];
|
|
51
52
|
const id = z.string().regex(ANALYSIS_ID_PATTERN);
|
|
52
53
|
const date = z.iso.datetime();
|
|
@@ -106,7 +107,7 @@ function parseJob(bytes, runId) {
|
|
|
106
107
|
return record;
|
|
107
108
|
}
|
|
108
109
|
/** Also guards direct HTML projection callers, not only the contained-file reader. */
|
|
109
|
-
export function
|
|
110
|
+
export function projectAutomaticAnalysisView(value) {
|
|
110
111
|
if (value === undefined)
|
|
111
112
|
return undefined;
|
|
112
113
|
const parsed = jobSchema
|
|
@@ -123,12 +124,12 @@ async function bindJob(prepared) {
|
|
|
123
124
|
return root ? Object.freeze({ ...root, parentRun: prepared }) : null;
|
|
124
125
|
}
|
|
125
126
|
/** Minimal historical accounting, without source validation, execution or liveness inference. */
|
|
126
|
-
export async function
|
|
127
|
+
export async function readAutomaticAnalysisAccounting(prepared) {
|
|
127
128
|
try {
|
|
128
129
|
const root = await bindJob(prepared);
|
|
129
130
|
if (!root)
|
|
130
131
|
return undefined;
|
|
131
|
-
const bytes = await
|
|
132
|
+
const bytes = await readBoundedFile(root, JOB_FILE, MAX_JOB_BYTES);
|
|
132
133
|
if (!bytes)
|
|
133
134
|
return "unknown";
|
|
134
135
|
const record = parseJob(bytes, runIdOf(prepared));
|
|
@@ -145,14 +146,14 @@ export async function readAutomaticStudyAnalysisAccounting(prepared) {
|
|
|
145
146
|
}
|
|
146
147
|
}
|
|
147
148
|
/** Read-only projection. A stale timestamp or persisted claim never authorizes execution. */
|
|
148
|
-
export async function
|
|
149
|
+
export async function readAutomaticAnalysisPrepared(prepared, now = Date.now()) {
|
|
149
150
|
try {
|
|
150
151
|
const root = await bindJob(prepared);
|
|
151
152
|
if (!root) {
|
|
152
153
|
const missing = await pathMissing(path.join(prepared.physicalRunRoot, AUTOMATIC_ANALYSIS_DIRECTORY));
|
|
153
154
|
return missing ? undefined : unknown();
|
|
154
155
|
}
|
|
155
|
-
const bytes = await
|
|
156
|
+
const bytes = await readBoundedFile(root, JOB_FILE, MAX_JOB_BYTES);
|
|
156
157
|
if (!bytes)
|
|
157
158
|
return unknown();
|
|
158
159
|
const record = parseJob(bytes, runIdOf(prepared));
|
|
@@ -185,7 +186,7 @@ async function terminalResultMatches(prepared, record) {
|
|
|
185
186
|
value.inputDigest === record.inputDigest &&
|
|
186
187
|
value.configDigest === record.configDigest &&
|
|
187
188
|
value.promptVersion === record.promptVersion;
|
|
188
|
-
const receipt = await
|
|
189
|
+
const receipt = await readAnalysisExecution(prepared, record.analysisId);
|
|
189
190
|
if (!receipt || !matches(receipt) || hashAnalysisValue(receipt) !== record.receiptSha256)
|
|
190
191
|
return false;
|
|
191
192
|
if (record.state === "failed" && record.reason === "AUTOMATIC_ANALYSIS_PUBLICATION_FAILED")
|
|
@@ -194,7 +195,7 @@ async function terminalResultMatches(prepared, record) {
|
|
|
194
195
|
return false;
|
|
195
196
|
if (record.state === "failed" || record.state === "cancelled")
|
|
196
197
|
return true;
|
|
197
|
-
const entry = await
|
|
198
|
+
const entry = await readAnalysisVersion(prepared, record.analysisId);
|
|
198
199
|
return (entry?.state === "ready" &&
|
|
199
200
|
entry.analysis !== null &&
|
|
200
201
|
matches(entry.analysis) &&
|
|
@@ -202,7 +203,7 @@ async function terminalResultMatches(prepared, record) {
|
|
|
202
203
|
hashAnalysisValue(entry.analysis) === record.analysisSha256);
|
|
203
204
|
}
|
|
204
205
|
/** The directory is permanent, including after interrupted/failed writes. Never re-open it as a writer. */
|
|
205
|
-
export async function
|
|
206
|
+
export async function claimAutomaticAnalysis(prepared, metadata) {
|
|
206
207
|
await validatePreparedRunRootIdentity(prepared);
|
|
207
208
|
const target = path.join(prepared.physicalRunRoot, AUTOMATIC_ANALYSIS_DIRECTORY);
|
|
208
209
|
try {
|
|
@@ -271,7 +272,7 @@ export async function claimAutomaticStudyAnalysis(prepared, metadata) {
|
|
|
271
272
|
touch: () => update({}),
|
|
272
273
|
async cancellationRequested() {
|
|
273
274
|
await assertPreparedSelectedOutputDirectory(root);
|
|
274
|
-
const bytes = await
|
|
275
|
+
const bytes = await readBoundedFile(root, CANCEL_FILE, MAX_CANCEL_BYTES);
|
|
275
276
|
if (!bytes) {
|
|
276
277
|
if (!(await pathMissing(path.join(root.physicalPath, CANCEL_FILE))))
|
|
277
278
|
throw new Error("AUTOMATIC_ANALYSIS_CANCELLATION_UNAVAILABLE");
|
|
@@ -285,12 +286,12 @@ export async function claimAutomaticStudyAnalysis(prepared, metadata) {
|
|
|
285
286
|
};
|
|
286
287
|
}
|
|
287
288
|
/** A scoped cancellation request, never a PID signal and never permission to create a new job. */
|
|
288
|
-
export async function
|
|
289
|
+
export async function requestAutomaticAnalysisCancellationPrepared(prepared) {
|
|
289
290
|
try {
|
|
290
291
|
const root = await bindJob(prepared);
|
|
291
292
|
if (!root)
|
|
292
293
|
return { requested: false, reason: "AUTOMATIC_ANALYSIS_SOURCE_UNAVAILABLE" };
|
|
293
|
-
const bytes = await
|
|
294
|
+
const bytes = await readBoundedFile(root, JOB_FILE, MAX_JOB_BYTES);
|
|
294
295
|
if (!bytes)
|
|
295
296
|
throw new Error("Unavailable job.");
|
|
296
297
|
const record = parseJob(bytes, runIdOf(prepared));
|
package/dist/analysis/load.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { PreparedRunArtifactPaths } from "../run/paths.js";
|
|
2
2
|
import type { LoadedAnalysis } from "./types.js";
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function loadAnalysis(prepared: PreparedRunArtifactPaths, id?: string): Promise<LoadedAnalysis>;
|
package/dist/analysis/load.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Loads a run's study analysis together with the automatic analysis job's view of it. The store
|
|
2
2
|
// and the job module each stay importable without the other.
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
export async function
|
|
3
|
+
import { readAutomaticAnalysisPrepared } from "./job.js";
|
|
4
|
+
import { loadAnalysisRecord } from "./store.js";
|
|
5
|
+
export async function loadAnalysis(prepared, id) {
|
|
6
6
|
const [loaded, automatic] = await Promise.all([
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
loadAnalysisRecord(prepared, id),
|
|
8
|
+
readAutomaticAnalysisPrepared(prepared),
|
|
9
9
|
]);
|
|
10
10
|
return automatic === undefined ? loaded : { ...loaded, automatic };
|
|
11
11
|
}
|
|
@@ -28,8 +28,16 @@ export interface AnalysisProviderResult {
|
|
|
28
28
|
dispatched: boolean;
|
|
29
29
|
/** Omitted preserves complete API-response accounting; account snapshots must state this. */
|
|
30
30
|
usageComplete?: boolean;
|
|
31
|
-
errorCode: "invalid_request" | "provider_http_error" | "provider_network_error" | "invalid_response" | "provider_headers_timeout" | "provider_body_timeout" | "provider_connect_timeout" | "provider_connection_reset" | "provider_dns_error" | "codex_busy" | "codex_unavailable" | "codex_unsupported_version" | "codex_unsupported_platform" | "codex_login_required" | "codex_unsupported_auth" | "codex_unsafe_configuration" | "codex_model_unavailable" | "codex_protocol_error" | "codex_tool_call" | "codex_process_failed" | "codex_cleanup_failed" | "response_too_large" | "output_incomplete" | "refusal" | "cancelled" | "timeout" | null;
|
|
31
|
+
errorCode: "invalid_request" | "provider_http_error" | "provider_network_error" | "invalid_response" | "provider_headers_timeout" | "provider_body_timeout" | "provider_connect_timeout" | "provider_connection_reset" | "provider_dns_error" | "codex_busy" | "codex_unavailable" | "codex_unsupported_version" | "codex_incompatible_release" | "codex_unsupported_platform" | "codex_login_required" | "codex_unsupported_auth" | "codex_unsafe_configuration" | "codex_model_unavailable" | "codex_protocol_error" | "codex_tool_call" | "codex_process_failed" | "codex_cleanup_failed" | "response_too_large" | "output_incomplete" | "refusal" | "cancelled" | "timeout" | null;
|
|
32
32
|
httpStatus?: number;
|
|
33
|
+
/** Codex only: notification methods humanish does not know that carried no item, by count. */
|
|
34
|
+
unknownNotifications?: Readonly<Record<string, number>>;
|
|
35
|
+
/** Codex only: bytes of a last frame cut off when humanish stopped the app-server. */
|
|
36
|
+
truncatedFrameBytes?: number;
|
|
37
|
+
/** Codex only: how the release's app-server schema differs from the fields humanish reads. */
|
|
38
|
+
protocolIncompatibilities?: readonly string[];
|
|
39
|
+
/** Codex only: schema values beyond the baseline humanish knows. */
|
|
40
|
+
protocolAdditions?: readonly string[];
|
|
33
41
|
}
|
|
34
42
|
export type AnalysisProvider = (request: AnalysisProviderRequest) => Promise<AnalysisProviderResult>;
|
|
35
43
|
/** An input image the provider accepts; the groups are the image type and its base64 bytes. */
|
|
@@ -16,4 +16,6 @@ export declare function checkRestrictedCodexAnalysisReadiness(input?: {
|
|
|
16
16
|
}, options?: RestrictedCodexSessionOptions): Promise<{
|
|
17
17
|
ready: boolean;
|
|
18
18
|
errorCode: RestrictedCodexAnalysisErrorCode | null;
|
|
19
|
+
protocolIncompatibilities?: readonly string[];
|
|
20
|
+
protocolAdditions?: readonly string[];
|
|
19
21
|
}>;
|
|
@@ -19,5 +19,14 @@ export async function bindCodexAnalysisCliVersion(config, detect = async () => (
|
|
|
19
19
|
/** Does not submit a model turn. Readiness is not a quota/access guarantee. */
|
|
20
20
|
export async function checkRestrictedCodexAnalysisReadiness(input = {}, options = {}) {
|
|
21
21
|
const result = await checkRestrictedCodexSessionReadiness(input, options);
|
|
22
|
-
return {
|
|
22
|
+
return {
|
|
23
|
+
ready: result.status === "completed",
|
|
24
|
+
errorCode: result.errorCode,
|
|
25
|
+
...(result.protocolIncompatibilities === undefined
|
|
26
|
+
? {}
|
|
27
|
+
: { protocolIncompatibilities: result.protocolIncompatibilities }),
|
|
28
|
+
...(result.protocolAdditions === undefined
|
|
29
|
+
? {}
|
|
30
|
+
: { protocolAdditions: result.protocolAdditions }),
|
|
31
|
+
};
|
|
23
32
|
}
|
|
@@ -19,6 +19,8 @@ export interface AnalyzeResult {
|
|
|
19
19
|
analysisId?: string;
|
|
20
20
|
artifactPath?: string;
|
|
21
21
|
executionReceiptPath?: string;
|
|
22
|
+
/** A rejected response kept for local diagnosis, outside the run directory. */
|
|
23
|
+
rejectedOutputPath?: string;
|
|
22
24
|
status?: AnalysisArtifact["status"];
|
|
23
25
|
usage?: AnalysisArtifact["usage"];
|
|
24
26
|
admission?: AnalysisAdmission;
|