humanish 0.106.1 → 0.107.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/AGENTS.md +4 -4
- package/ARCHITECTURE.md +17 -16
- package/CHANGELOG.md +14 -0
- package/CONTEXT.md +42 -39
- package/CONTRIBUTING.md +8 -8
- package/README.md +8 -3
- 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.js +2 -1
- 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/qualified-versions.d.ts +30 -3
- package/dist/actors/codex/qualified-versions.js +50 -5
- package/dist/actors/codex/restricted-executable.d.ts +24 -0
- package/dist/actors/codex/restricted-executable.js +97 -22
- package/dist/actors/codex/restricted-launch.d.ts +7 -1
- package/dist/actors/codex/restricted-launch.js +42 -3
- 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 +60 -2
- package/dist/actors/codex/restricted-policy.d.ts +9 -1
- package/dist/actors/codex/restricted-session.d.ts +14 -1
- package/dist/actors/codex/restricted-session.js +50 -17
- 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 +1 -1
- package/dist/actors/computer-use/actor.js +4 -4
- package/dist/actors/computer-use/loop/backstop.js +1 -1
- package/dist/actors/computer-use/loop/ending.d.ts +2 -2
- package/dist/actors/computer-use/loop/ending.js +2 -2
- package/dist/actors/computer-use/loop/spend.d.ts +1 -1
- package/dist/actors/computer-use/loop/spend.js +3 -3
- package/dist/actors/computer-use/loop/trace.js +2 -2
- package/dist/actors/computer-use/loop/types.d.ts +14 -5
- package/dist/actors/computer-use/loop.js +4 -4
- package/dist/actors/computer-use/openai-provider.d.ts +1 -1
- package/dist/actors/computer-use/openai-provider.js +2 -2
- package/dist/actors/contract.d.ts +9 -7
- package/dist/actors/local-agent/cli.js +1 -1
- package/dist/actors/scripted-browser/actor.d.ts +2 -2
- package/dist/actors/scripted-browser/journey.js +15 -4
- package/dist/actors/scripted-browser/steps.js +18 -0
- package/dist/actors/scripted-browser/types.d.ts +11 -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/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 +31 -12
- 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 +4 -2
- package/dist/cli/commands/comms.js +8 -1
- package/dist/cli/commands/lab-route-computer-use.d.ts +0 -2
- package/dist/cli/commands/lab-route-computer-use.js +26 -14
- package/dist/cli/commands/lab-route-preview.d.ts +1 -3
- package/dist/cli/commands/lab-route-preview.js +3 -4
- 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 +0 -1
- 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 +76 -45
- package/dist/cli/commands/lab-scorer.d.ts +0 -2
- package/dist/cli/commands/lab.js +12 -6
- package/dist/cli/commands/observe.js +22 -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 +10 -8
- package/dist/cli/commands/watch.js +12 -10
- package/dist/cli/doctor.d.ts +3 -0
- package/dist/cli/doctor.js +10 -2
- package/dist/cli/io.d.ts +5 -4
- package/dist/cli/io.js +12 -8
- package/dist/cli/program.js +3 -3
- package/dist/cli/renamed-options.d.ts +11 -0
- package/dist/cli/renamed-options.js +18 -0
- package/dist/cli/telemetry.d.ts +2 -2
- package/dist/cli/telemetry.js +1 -1
- package/dist/comms/capture-surface.d.ts +1 -1
- package/dist/comms/catch-host.d.ts +1 -1
- package/dist/comms/connections.js +4 -4
- package/dist/comms/external-evidence.d.ts +27 -0
- package/dist/comms/external-evidence.js +93 -0
- package/dist/comms/lease-store.js +7 -7
- package/dist/comms/types.js +1 -1
- package/dist/evidence/browser-hygiene.d.ts +1 -1
- package/dist/evidence/browser-hygiene.js +1 -1
- package/dist/evidence/redaction.js +1 -1
- package/dist/evidence/secret-scrub.d.ts +9 -0
- package/dist/evidence/secret-scrub.js +96 -0
- package/dist/feedback/draft.js +7 -9
- package/dist/feedback/export-bundle.js +4 -4
- package/dist/feedback/export.js +9 -9
- package/dist/feedback/feedback.d.ts +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.js +3 -6
- package/dist/keys/key-resolution.d.ts +3 -1
- package/dist/keys/key-resolution.js +18 -16
- package/dist/lab/adapter-extension.d.ts +28 -6
- package/dist/lab/adapter-extension.js +65 -126
- package/dist/lab/adapter-scorer-loader.d.ts +25 -5
- package/dist/lab/adapter-scorer-loader.js +24 -0
- package/dist/lab/composition-rules.js +20 -20
- package/dist/lab/config.js +28 -26
- package/dist/lab/device-presets.d.ts +2 -2
- package/dist/lab/discover.js +1 -3
- package/dist/lab/doctor.d.ts +44 -9
- package/dist/lab/doctor.js +149 -41
- package/dist/lab/init-plan.js +1 -3
- package/dist/lab/keys.js +1 -1
- package/dist/lab/lab-deps.d.ts +85 -0
- package/dist/lab/lab-deps.js +4 -0
- package/dist/lab/parse/actors.js +8 -7
- package/dist/lab/parse/comms.js +3 -2
- package/dist/lab/parse/execution.js +3 -2
- package/dist/lab/parse/subject-state.js +2 -1
- package/dist/lab/parse/subject.js +2 -1
- package/dist/lab/parse/values.d.ts +0 -1
- package/dist/lab/parse/values.js +0 -3
- package/dist/lab/persona-resolve.d.ts +3 -3
- package/dist/lab/persona-resolve.js +4 -4
- 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 +5 -5
- package/dist/lab/plan-participants.js +2 -2
- package/dist/lab/plan-types.d.ts +22 -4
- package/dist/lab/plan.d.ts +3 -11
- package/dist/lab/plan.js +18 -42
- package/dist/lab/preflight-result.js +0 -2
- package/dist/lab/preflight.d.ts +0 -3
- package/dist/lab/preflight.js +1 -1
- 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 +19 -24
- package/dist/lab/routing.js +14 -47
- package/dist/lab/run-lab-events.d.ts +6 -11
- package/dist/lab/run-lab-events.js +3 -11
- package/dist/lab/run-lab-homes.d.ts +64 -0
- package/dist/lab/run-lab-homes.js +3 -0
- package/dist/lab/run-lab-options.d.ts +12 -66
- package/dist/lab/run-lab-options.js +45 -275
- package/dist/lab/summary.d.ts +9 -4
- package/dist/lab/summary.js +15 -8
- package/dist/lab/types.d.ts +132 -132
- package/dist/lab/validation.d.ts +15 -15
- package/dist/lab/validation.js +28 -28
- package/dist/lab/warnings.js +20 -19
- package/dist/observer/artifact.d.ts +1 -1
- package/dist/observer/artifact.js +3 -3
- package/dist/observer/data.js +2 -2
- package/dist/observer/render.js +2 -2
- package/dist/observer/run-routes.d.ts +1 -1
- package/dist/observer/run-routes.js +5 -5
- package/dist/observer/serve.d.ts +17 -0
- package/dist/observer/serve.js +34 -3
- package/dist/routes/computer-use/bundle-parts.d.ts +1 -1
- package/dist/routes/computer-use/bundle-parts.js +10 -3
- package/dist/routes/computer-use/bundle.d.ts +4 -11
- package/dist/routes/computer-use/bundle.js +9 -15
- 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 +10 -10
- package/dist/routes/computer-use/e2b-desktop/comms.js +11 -14
- package/dist/routes/computer-use/e2b-desktop/desktop.d.ts +2 -2
- package/dist/routes/computer-use/e2b-desktop/desktop.js +4 -7
- package/dist/routes/computer-use/e2b-desktop/fidelity.d.ts +13 -13
- package/dist/routes/computer-use/e2b-desktop/fidelity.js +11 -11
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +3 -3
- package/dist/routes/computer-use/e2b-desktop/prepare.js +33 -36
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +1 -1
- package/dist/routes/computer-use/e2b-desktop/start.js +24 -23
- 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 +29 -17
- 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 +25 -29
- package/dist/routes/computer-use/{fanout-lanes.js → fanout-records.js} +25 -19
- 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 +19 -27
- package/dist/routes/computer-use/{run-lanes.js → live-phase.js} +12 -11
- 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 +39 -66
- 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} +10 -10
- package/dist/routes/computer-use/{lanes.js → participant-execution.js} +35 -22
- 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 +19 -11
- package/dist/routes/computer-use/participant-model.js +49 -25
- package/dist/routes/computer-use/participant-prompt.d.ts +3 -3
- package/dist/routes/computer-use/participant-prompt.js +4 -4
- package/dist/routes/computer-use/participant-runs.d.ts +6 -6
- package/dist/routes/computer-use/participant-runs.js +8 -8
- package/dist/routes/computer-use/plan.d.ts +21 -29
- package/dist/routes/computer-use/plan.js +52 -60
- package/dist/routes/computer-use/preflight.d.ts +3 -5
- package/dist/routes/computer-use/preflight.js +20 -16
- package/dist/routes/computer-use/rerun-selection.js +10 -6
- package/dist/routes/computer-use/result.d.ts +1 -1
- package/dist/routes/computer-use/result.js +40 -30
- package/dist/routes/computer-use/route.d.ts +3 -4
- package/dist/routes/computer-use/route.js +21 -19
- package/dist/routes/computer-use/self-report.d.ts +2 -2
- package/dist/routes/computer-use/self-report.js +4 -4
- package/dist/routes/computer-use/setup.d.ts +8 -14
- package/dist/routes/computer-use/setup.js +96 -72
- package/dist/routes/computer-use/single-bundle.d.ts +8 -11
- package/dist/routes/computer-use/single-bundle.js +20 -25
- package/dist/routes/computer-use/subject-projection.d.ts +5 -7
- package/dist/routes/computer-use/subject-projection.js +20 -19
- package/dist/routes/computer-use/types.d.ts +169 -210
- package/dist/routes/computer-use/types.js +13 -5
- package/dist/routes/preview.js +0 -1
- package/dist/routes/scripted/bundle.d.ts +3 -6
- package/dist/routes/scripted/bundle.js +11 -16
- package/dist/routes/scripted/plan.d.ts +5 -7
- package/dist/routes/scripted/plan.js +6 -4
- package/dist/routes/scripted/result.d.ts +4 -1
- package/dist/routes/scripted/result.js +10 -6
- package/dist/routes/scripted/route.js +10 -11
- package/dist/routes/scripted/scenario.d.ts +1 -1
- package/dist/routes/scripted/scenario.js +1 -1
- package/dist/routes/scripted/setup.d.ts +3 -2
- package/dist/routes/scripted/setup.js +22 -21
- package/dist/routes/scripted/subject.d.ts +8 -3
- package/dist/routes/scripted/subject.js +9 -5
- package/dist/routes/scripted/surface-records.js +1 -1
- 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 +19 -36
- package/dist/routes/scripted/types.js +1 -2
- package/dist/routes/shared-world/{seat-records.js → bundle-records.js} +8 -8
- package/dist/routes/shared-world/bundle.d.ts +2 -2
- package/dist/routes/shared-world/bundle.js +22 -26
- package/dist/routes/shared-world/checkpoints.d.ts +4 -4
- package/dist/routes/shared-world/checkpoints.js +4 -4
- package/dist/routes/shared-world/comms.d.ts +5 -4
- package/dist/routes/shared-world/comms.js +28 -41
- package/dist/routes/shared-world/external-public.d.ts +5 -5
- package/dist/routes/shared-world/external-public.js +19 -20
- package/dist/routes/shared-world/handoff.d.ts +4 -4
- package/dist/routes/shared-world/handoff.js +50 -50
- package/dist/routes/shared-world/lobby-code.d.ts +5 -5
- package/dist/routes/shared-world/lobby-code.js +13 -13
- package/dist/routes/shared-world/{seats.d.ts → participant-specs.d.ts} +8 -6
- package/dist/routes/shared-world/{seats.js → participant-specs.js} +43 -48
- package/dist/routes/shared-world/plan.d.ts +2 -6
- package/dist/routes/shared-world/plan.js +1 -2
- 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 +46 -40
- package/dist/routes/shared-world/result.js +31 -19
- package/dist/routes/shared-world/route.js +37 -41
- package/dist/routes/shared-world/setup.d.ts +5 -4
- package/dist/routes/shared-world/setup.js +12 -14
- package/dist/routes/shared-world/types.d.ts +53 -126
- package/dist/routes/shared-world/types.js +2 -2
- package/dist/routes/terminal/adapter.d.ts +8 -8
- package/dist/routes/terminal/adapter.js +28 -125
- package/dist/routes/terminal/bundle.d.ts +7 -12
- package/dist/routes/terminal/bundle.js +24 -34
- package/dist/routes/terminal/credentials.d.ts +2 -2
- package/dist/routes/terminal/credentials.js +16 -16
- package/dist/routes/terminal/dry-run.d.ts +1 -1
- package/dist/routes/terminal/dry-run.js +9 -11
- package/dist/routes/terminal/encoding.d.ts +1 -1
- package/dist/routes/terminal/encoding.js +2 -2
- package/dist/routes/terminal/ledger.d.ts +6 -6
- package/dist/routes/terminal/ledger.js +9 -9
- package/dist/routes/terminal/live-finish.d.ts +1 -2
- package/dist/routes/terminal/live-finish.js +21 -20
- package/dist/routes/terminal/live-sandbox.d.ts +3 -2
- package/dist/routes/terminal/live-sandbox.js +20 -20
- package/dist/routes/terminal/participant-text.d.ts +23 -0
- package/dist/routes/terminal/participant-text.js +165 -0
- package/dist/routes/terminal/plan.d.ts +2 -6
- package/dist/routes/terminal/plan.js +13 -9
- package/dist/routes/terminal/recorder.d.ts +6 -1
- package/dist/routes/terminal/recorder.js +12 -4
- package/dist/routes/terminal/result.js +4 -4
- package/dist/routes/terminal/route.js +26 -26
- package/dist/routes/terminal/runtime.d.ts +3 -2
- package/dist/routes/terminal/runtime.js +3 -3
- package/dist/routes/terminal/sandbox.d.ts +3 -3
- package/dist/routes/terminal/sandbox.js +9 -9
- package/dist/routes/terminal/session.js +16 -14
- package/dist/routes/terminal/token-usage.js +5 -5
- package/dist/routes/terminal/trace.d.ts +5 -8
- package/dist/routes/terminal/trace.js +9 -64
- package/dist/routes/terminal/types.d.ts +85 -93
- package/dist/routes/terminal/types.js +9 -4
- 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 +4 -4
- package/dist/run/bundle.d.ts +63 -56
- package/dist/run/bundle.js +9 -8
- package/dist/run/cost-summary.js +3 -2
- package/dist/run/costs.d.ts +6 -6
- package/dist/run/costs.js +10 -10
- package/dist/run/detail.d.ts +5 -5
- package/dist/run/detail.js +6 -6
- package/dist/run/dry-run.js +5 -12
- 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 +16 -4
- package/dist/run/judge.js +24 -7
- 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.js +1 -1
- package/dist/run/pricing.d.ts +19 -9
- package/dist/run/pricing.js +30 -18
- package/dist/run/projection.d.ts +13 -13
- package/dist/run/projection.js +8 -8
- package/dist/run/reclaim.d.ts +6 -0
- package/dist/run/reclaim.js +13 -3
- package/dist/run/results.d.ts +1 -1
- package/dist/run/run-index.d.ts +1 -1
- package/dist/run/run-index.js +11 -11
- package/dist/run/run.d.ts +4 -2
- package/dist/run/run.js +9 -5
- package/dist/run/sandbox-receipts.d.ts +4 -4
- package/dist/run/sandbox-receipts.js +4 -4
- package/dist/run/shared-world-evidence.d.ts +47 -47
- package/dist/run/shared-world-shape.d.ts +3 -3
- package/dist/run/shared-world-shape.js +11 -11
- package/dist/run/stats.d.ts +5 -5
- package/dist/run/stats.js +8 -8
- package/dist/run/status.d.ts +16 -6
- package/dist/run/status.js +31 -8
- package/dist/run/streams.d.ts +26 -19
- package/dist/run/terminal-contract.d.ts +5 -5
- package/dist/run/terminal-contract.js +4 -4
- 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 +36 -34
- package/dist/run-lab.js +41 -37
- package/dist/subject/desktop-cli.d.ts +1 -1
- package/dist/subject/desktop-cli.js +1 -1
- package/dist/subject/local-tree-archive.d.ts +1 -1
- package/dist/subject/local-tree-archive.js +4 -4
- package/dist/subject/local-tree.d.ts +2 -2
- 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 +5 -5
- package/dist/subject/serve.js +1 -1
- package/dist/subject/steps.d.ts +4 -4
- package/dist/subject/steps.js +5 -5
- package/dist/substrates/e2b/cdp-probe.d.ts +2 -2
- package/dist/substrates/e2b/cdp-probe.js +1 -1
- package/dist/substrates/e2b/desktop-browser.d.ts +3 -3
- package/dist/substrates/e2b/desktop-browser.js +4 -4
- package/dist/substrates/e2b/desktop-cdp.d.ts +7 -7
- package/dist/substrates/e2b/desktop-cdp.js +4 -4
- package/dist/substrates/e2b/desktop-geometry.d.ts +4 -4
- package/dist/substrates/e2b/desktop-geometry.js +3 -3
- package/dist/substrates/e2b/desktop-media.js +2 -2
- package/dist/substrates/e2b/sandbox.js +1 -1
- package/dist/substrates/e2b/sdk.js +2 -2
- 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 +7 -5
- package/dist/tui/actions.js +18 -9
- package/dist/tui-app.js +42 -42
- package/dist/verify/actor.d.ts +10 -10
- package/dist/verify/actor.js +15 -15
- package/dist/verify/artifacts.d.ts +1 -1
- package/dist/verify/artifacts.js +3 -3
- package/dist/verify/costs.d.ts +2 -2
- package/dist/verify/costs.js +2 -2
- 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.js +2 -2
- package/dist/verify/verify.js +6 -6
- package/docs/README.md +1 -1
- package/docs/architecture/actor-contract.md +60 -22
- package/docs/architecture/desktop-sessions.md +9 -9
- package/docs/architecture/external-public-shared-world.md +5 -0
- package/docs/architecture/observer.md +4 -4
- package/docs/architecture/restricted-codex-analysis.md +36 -2
- package/docs/architecture/state-driven-executor.md +4 -5
- package/docs/architecture/task-protocol-support.md +3 -5
- package/docs/architecture/{terminal-product-lane.md → terminal-product-route.md} +24 -16
- package/docs/contracts/run-bundle.md +10 -8
- package/docs/contracts/schemas.md +109 -53
- package/docs/contracts/study-analysis.md +24 -0
- package/docs/decisions/0004-participant-desktops-stay-in-the-route.md +2 -1
- package/docs/product/automatic-analysis.md +1 -0
- package/docs/ramp/README.md +2 -1
- package/package.json +4 -4
- package/skills/humanish/SKILL.md +3 -2
- package/skills/humanish/agents/openai.yaml +1 -1
- 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/routes/computer-use/legacy-lane-spec.d.ts +0 -62
- package/dist/routes/computer-use/legacy-lane-spec.js +0 -39
- /package/dist/routes/computer-use/{fanout-lanes.d.ts → fanout-records.d.ts} +0 -0
- /package/dist/routes/computer-use/{run-lanes.d.ts → live-phase.d.ts} +0 -0
- /package/dist/routes/shared-world/{seat-records.d.ts → bundle-records.d.ts} +0 -0
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;
|
package/dist/analysis/service.js
CHANGED
|
@@ -10,11 +10,12 @@ import { loadRunBundlePrepared, resolveRunPath } from "../run/locate.js";
|
|
|
10
10
|
import { physicalCwdOf, runIdOf, resolvePhysicalCwd, validatePreparedRunRootIdentity, } from "../run/paths.js";
|
|
11
11
|
import { isRunStatusRecord, RUN_STATUS_FILE } from "../run/status.js";
|
|
12
12
|
import { captureEvidence, EVIDENCE_LIMITS } from "./evidence.js";
|
|
13
|
-
import { pathMissing,
|
|
13
|
+
import { pathMissing, readBoundedFile } from "../run/evidence-files.js";
|
|
14
14
|
import { estimateAnalysisAdmission, preferLargerAnalysisOutput, runAnalysis, ANALYSIS_PROMPT_VERSION, } from "./execute.js";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
15
|
+
import { appendAnalysisCorrection, assertAnalysisPublicationCapacity, listAnalyses, writeAnalysis, } from "./store.js";
|
|
16
|
+
import { beginAnalysisExecution, writeAnalysisExecutionReceipt } from "./store-executions.js";
|
|
17
|
+
import { keepRejectedAnalysisOutput } from "./diagnostics.js";
|
|
18
|
+
import { loadAnalysis } from "./load.js";
|
|
18
19
|
import { hashAnalysisValue } from "./validation.js";
|
|
19
20
|
import { ANALYSIS_CORRECTION_SCHEMA, } from "./types.js";
|
|
20
21
|
import { RUN_BUNDLE_FILE } from "../run/bundle.js";
|
|
@@ -57,6 +58,7 @@ const codexRecovery = {
|
|
|
57
58
|
analysis_codex_busy: "Another restricted Codex analyst or setup check is active in this process. Wait for it to finish, then explicitly retry.",
|
|
58
59
|
analysis_codex_unavailable: `The qualified Codex CLI is unavailable. Install a qualified Codex CLI (${describeQualifiedCodexCliVersions()}) and sign in with a ChatGPT account, then retry --provider codex.`,
|
|
59
60
|
analysis_codex_unsupported_version: `Codex account analysis requires a qualified CLI version (${describeQualifiedCodexCliVersions()}). Other versions have not passed this tool-policy contract.`,
|
|
61
|
+
analysis_codex_incompatible_release: `This Codex CLI release changed app-server protocol fields humanish reads, so no request was sent; the warnings name each change. Install a release humanish was tested with (${describeQualifiedCodexCliVersions()}), then retry.`,
|
|
60
62
|
analysis_codex_unsupported_platform: "This platform has not qualified the restricted Codex account launcher.",
|
|
61
63
|
analysis_codex_login_required: "Sign in to Codex with a ChatGPT account, then retry humanish analyze --provider codex --rerun.",
|
|
62
64
|
analysis_codex_unsupported_auth: "Codex analysis requires ChatGPT account authentication; API-key and custom provider authentication are not used as fallbacks.",
|
|
@@ -140,7 +142,7 @@ export async function withAnalysisLock(prepared, action) {
|
|
|
140
142
|
}
|
|
141
143
|
/** The completion gate: the run verifies, is live and finished, and has participants. */
|
|
142
144
|
export async function readCompletedAnalysisSource(cwd, prepared) {
|
|
143
|
-
const bytes = await
|
|
145
|
+
const bytes = await readBoundedFile(prepared, RUN_BUNDLE_FILE, EVIDENCE_LIMITS.sourceBytes);
|
|
144
146
|
if (!bytes)
|
|
145
147
|
throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
|
|
146
148
|
const verified = await verifyRunPrepared(cwd, runIdOf(prepared), prepared);
|
|
@@ -151,7 +153,7 @@ export async function readCompletedAnalysisSource(cwd, prepared) {
|
|
|
151
153
|
throw new Error("ANALYSIS_NO_PARTICIPANTS");
|
|
152
154
|
if (loaded.bundle.mode !== "live")
|
|
153
155
|
throw new Error("ANALYSIS_REQUIRES_LIVE_RUN");
|
|
154
|
-
const statusBytes = await
|
|
156
|
+
const statusBytes = await readBoundedFile(prepared, RUN_STATUS_FILE, MAX_STATUS_BYTES);
|
|
155
157
|
if (!statusBytes) {
|
|
156
158
|
const missing = await pathMissing(path.join(prepared.physicalRunRoot, RUN_STATUS_FILE)).catch(() => {
|
|
157
159
|
throw new Error("ANALYSIS_SOURCE_UNAVAILABLE");
|
|
@@ -258,9 +260,9 @@ async function publishAttempt(prepared, analysis, result, finalizeExecution) {
|
|
|
258
260
|
if (finalizeExecution)
|
|
259
261
|
await finalizeExecution(analysis);
|
|
260
262
|
else
|
|
261
|
-
await
|
|
263
|
+
await writeAnalysisExecutionReceipt(prepared, analysis);
|
|
262
264
|
result.executionReceiptPath = path.join(prepared.relativeRunRoot, "analysis-attempts", analysis.id, "receipt.json");
|
|
263
|
-
await
|
|
265
|
+
await writeAnalysis(prepared, analysis);
|
|
264
266
|
result.artifactPath = path.join(prepared.relativeRunRoot, "analysis", analysis.id, "analysis.json");
|
|
265
267
|
return true;
|
|
266
268
|
}
|
|
@@ -308,19 +310,36 @@ async function executeAnalysis(attempt) {
|
|
|
308
310
|
if (config.provider !== "codex" && !apiKey.trim())
|
|
309
311
|
return { ...fail(input.runId, false, "ANALYSIS_API_KEY_MISSING"), admission };
|
|
310
312
|
let finalizeExecution;
|
|
313
|
+
const rejection = {};
|
|
311
314
|
const analysis = await runAnalysis(input, config, {
|
|
312
315
|
apiKey,
|
|
313
316
|
...(deps.codexProvider === undefined ? {} : { codexProvider: deps.codexProvider }),
|
|
314
317
|
...(deps.analysisId === undefined ? {} : { analysisId: deps.analysisId }),
|
|
315
318
|
beforeDispatch: async (context) => {
|
|
316
319
|
await deps.beforeDispatch?.(context);
|
|
317
|
-
finalizeExecution = await
|
|
320
|
+
finalizeExecution = await beginAnalysisExecution(prepared, context);
|
|
318
321
|
},
|
|
319
322
|
...(deps.signal === undefined ? {} : { signal: deps.signal }),
|
|
320
323
|
...(deps.onProgress === undefined ? {} : { onProgress: deps.onProgress }),
|
|
321
324
|
...(deps.fetch === undefined ? {} : { fetch: deps.fetch }),
|
|
325
|
+
warnings: base.warnings,
|
|
326
|
+
onRejectedOutput: (output) => {
|
|
327
|
+
rejection.output = output;
|
|
328
|
+
},
|
|
322
329
|
});
|
|
323
330
|
const result = attemptResult(base, analysis);
|
|
331
|
+
if (rejection.output)
|
|
332
|
+
try {
|
|
333
|
+
result.rejectedOutputPath = await keepRejectedAnalysisOutput(cwd, {
|
|
334
|
+
runId: analysis.runId,
|
|
335
|
+
analysisId: analysis.id,
|
|
336
|
+
model: config.model,
|
|
337
|
+
promptVersion: analysis.promptVersion,
|
|
338
|
+
}, rejection.output);
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
result.warnings.push("The rejected analyst output could not be kept under .humanish/analysis-diagnostics.");
|
|
342
|
+
}
|
|
324
343
|
if (!(await publishAttempt(prepared, analysis, result, finalizeExecution)))
|
|
325
344
|
return {
|
|
326
345
|
...result,
|
|
@@ -365,7 +384,7 @@ export async function analyzeRun(cwdInput, run, options, deps = {}) {
|
|
|
365
384
|
export async function showAnalysis(cwd, run, id) {
|
|
366
385
|
const prepared = await resolveRunPath(await resolvePhysicalCwd(cwd), run).catch(() => null);
|
|
367
386
|
return prepared
|
|
368
|
-
?
|
|
387
|
+
? loadAnalysis(prepared, id)
|
|
369
388
|
: { state: "invalid", analysis: null, corrections: [], warnings: ["ANALYSIS_RUN_NOT_FOUND"] };
|
|
370
389
|
}
|
|
371
390
|
export async function correctAnalysis(cwd, run, options) {
|
|
@@ -373,7 +392,7 @@ export async function correctAnalysis(cwd, run, options) {
|
|
|
373
392
|
if (!prepared)
|
|
374
393
|
throw new Error("ANALYSIS_RUN_NOT_FOUND");
|
|
375
394
|
return withAnalysisLock(prepared, async () => {
|
|
376
|
-
const loaded = await
|
|
395
|
+
const loaded = await loadAnalysis(prepared, options.analysisId);
|
|
377
396
|
const analysis = loaded.analysis;
|
|
378
397
|
const finding = analysis?.result?.findings.find((item) => item.id === options.findingId);
|
|
379
398
|
if (loaded.state !== "ready" || !analysis || !finding)
|
|
@@ -392,7 +411,7 @@ export async function correctAnalysis(cwd, run, options) {
|
|
|
392
411
|
reason: options.reason,
|
|
393
412
|
replacementClaim: options.replacementClaim ?? null,
|
|
394
413
|
};
|
|
395
|
-
await
|
|
414
|
+
await appendAnalysisCorrection(prepared, correction);
|
|
396
415
|
await refreshObserver(cwd, runIdOf(prepared), prepared);
|
|
397
416
|
return correction;
|
|
398
417
|
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { LoadedAnalysis } from "./types.js";
|
|
2
2
|
/** True for the analysis record files, matched by name inside their directories. Any other file
|
|
3
3
|
* under analysis/ is ordinary evidence and follows the ordinary evidence policy. */
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function isAnalysisRecordPath(relativePath: string): boolean;
|
|
5
5
|
/** Check the exact in-memory snapshot being projected; a prior filesystem scan cannot approve a later write. */
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function analysisSharingProblems(loaded: LoadedAnalysis): {
|
|
7
7
|
sensitive: boolean;
|
|
8
8
|
unverified: boolean;
|
|
9
9
|
};
|
package/dist/analysis/sharing.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { containsSensitive } from "../evidence/redaction.js";
|
|
2
|
-
import { AUTOMATIC_ANALYSIS_DIRECTORY,
|
|
2
|
+
import { AUTOMATIC_ANALYSIS_DIRECTORY, projectAutomaticAnalysisView } from "./job.js";
|
|
3
3
|
import { ANALYSIS_DIRECTORY, ANALYSIS_EXECUTION_DIRECTORY } from "./store.js";
|
|
4
4
|
/** True for the analysis record files, matched by name inside their directories. Any other file
|
|
5
5
|
* under analysis/ is ordinary evidence and follows the ordinary evidence policy. */
|
|
6
|
-
export function
|
|
6
|
+
export function isAnalysisRecordPath(relativePath) {
|
|
7
7
|
const parts = relativePath.split("/");
|
|
8
8
|
const leaf = parts.at(-1);
|
|
9
9
|
const directory = parts[0];
|
|
@@ -14,7 +14,7 @@ export function isStudyAnalysisRecordPath(relativePath) {
|
|
|
14
14
|
leaf.startsWith(".humanish-write-")));
|
|
15
15
|
}
|
|
16
16
|
/** Check the exact in-memory snapshot being projected; a prior filesystem scan cannot approve a later write. */
|
|
17
|
-
export function
|
|
17
|
+
export function analysisSharingProblems(loaded) {
|
|
18
18
|
// Job metadata never approves evidence, nor does uncertain liveness revoke its approval.
|
|
19
19
|
const { automatic: _automatic, ...evidence } = loaded;
|
|
20
20
|
const benignAttempt = loaded.analysis?.result === null &&
|
|
@@ -30,9 +30,9 @@ export function studyAnalysisSharingProblems(loaded) {
|
|
|
30
30
|
/** Unsafe generated text is quarantined without hiding the original recording. */
|
|
31
31
|
export function projectShareCheckedAnalysis(loaded) {
|
|
32
32
|
const { automatic: _automatic, ...evidence } = loaded;
|
|
33
|
-
const automatic =
|
|
33
|
+
const automatic = projectAutomaticAnalysisView(loaded.automatic);
|
|
34
34
|
const safe = automatic === undefined ? evidence : { ...evidence, automatic };
|
|
35
|
-
return
|
|
35
|
+
return analysisSharingProblems(safe).sensitive
|
|
36
36
|
? {
|
|
37
37
|
state: "invalid",
|
|
38
38
|
analysis: null,
|
|
@@ -2,15 +2,15 @@ import { type PreparedRunArtifactPaths } from "../run/paths.js";
|
|
|
2
2
|
import { type AnalysisExecutionReceipt, type AnalysisExecutionStart } from "./validation.js";
|
|
3
3
|
import type { AnalysisArtifact } from "./types.js";
|
|
4
4
|
/** Exact bounded receipt lookup for an already claimed execution, never a dispatch decision. */
|
|
5
|
-
export declare function
|
|
5
|
+
export declare function readAnalysisExecution(prepared: PreparedRunArtifactPaths, id: string): Promise<AnalysisExecutionReceipt | null>;
|
|
6
6
|
/**
|
|
7
7
|
* Publish accounting first. Unlike a usable report, this receipt does not claim
|
|
8
8
|
* the source still matches; its digests name the exact input that was attempted.
|
|
9
9
|
*/
|
|
10
|
-
export declare function
|
|
10
|
+
export declare function writeAnalysisExecutionReceipt(prepared: PreparedRunArtifactPaths, value: AnalysisArtifact): Promise<void>;
|
|
11
11
|
/** The returned closure owns one exact directory; persisted IDs never authorize overwriting it. */
|
|
12
|
-
export declare function
|
|
13
|
-
export declare function
|
|
12
|
+
export declare function beginAnalysisExecution(prepared: PreparedRunArtifactPaths, context: Omit<AnalysisExecutionStart, "schema" | "createdAt">): Promise<(value: AnalysisArtifact) => Promise<void>>;
|
|
13
|
+
export declare function listAnalysisExecutions(prepared: PreparedRunArtifactPaths): Promise<{
|
|
14
14
|
receipts: AnalysisExecutionReceipt[];
|
|
15
15
|
warnings: string[];
|
|
16
16
|
}>;
|
|
@@ -21,7 +21,7 @@ export interface AnalysisAccountingRecord {
|
|
|
21
21
|
legacy: boolean;
|
|
22
22
|
}
|
|
23
23
|
/** Accounting is independent of source freshness and findings validation. No evidence is opened. */
|
|
24
|
-
export declare function
|
|
24
|
+
export declare function readAnalysisAccountingRecords(prepared: PreparedRunArtifactPaths): Promise<{
|
|
25
25
|
records: AnalysisAccountingRecord[];
|
|
26
26
|
warnings: string[];
|
|
27
27
|
}>;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { runIdOf } from "../run/paths.js";
|
|
5
5
|
import { assertPreparedSelectedOutputDirectory, prepareContainedOutputDirectoryRoot, writeContainedOutputFile, } from "../run/contained-output.js";
|
|
6
|
-
import { pathMissing,
|
|
6
|
+
import { pathMissing, readBoundedFile } from "../run/evidence-files.js";
|
|
7
7
|
import { ANALYSIS_MAX_BYTES, MAX_VERSIONS, ANALYSIS_DIRECTORY, ANALYSIS_EXECUTION_DIRECTORY, claimDirectory, directoryIds, existingRoot, safeId, } from "./store.js";
|
|
8
8
|
import { hashAnalysisValue, analysisExecutionStartSchema, validateAnalysisArtifact, validateAnalysisExecutionReceipt, } from "./validation.js";
|
|
9
9
|
/** receipt.json and start.json in an execution directory. */
|
|
@@ -17,14 +17,14 @@ const EXECUTION_BINDING_KEYS = [
|
|
|
17
17
|
"promptVersion",
|
|
18
18
|
];
|
|
19
19
|
/** Exact bounded receipt lookup for an already claimed execution, never a dispatch decision. */
|
|
20
|
-
export async function
|
|
20
|
+
export async function readAnalysisExecution(prepared, id) {
|
|
21
21
|
if (!safeId(id))
|
|
22
22
|
return null;
|
|
23
23
|
try {
|
|
24
24
|
const root = await existingRoot(prepared, ANALYSIS_EXECUTION_DIRECTORY);
|
|
25
25
|
if (!root)
|
|
26
26
|
return null;
|
|
27
|
-
const bytes = await
|
|
27
|
+
const bytes = await readBoundedFile(root, `${id}/receipt.json`, MAX_EXECUTION_RECORD_BYTES);
|
|
28
28
|
if (!bytes)
|
|
29
29
|
return null;
|
|
30
30
|
const receipt = validateAnalysisExecutionReceipt(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)));
|
|
@@ -38,7 +38,7 @@ export async function readStudyAnalysisExecution(prepared, id) {
|
|
|
38
38
|
* Publish accounting first. Unlike a usable report, this receipt does not claim
|
|
39
39
|
* the source still matches; its digests name the exact input that was attempted.
|
|
40
40
|
*/
|
|
41
|
-
export async function
|
|
41
|
+
export async function writeAnalysisExecutionReceipt(prepared, value) {
|
|
42
42
|
const receipt = executionReceipt(value, prepared);
|
|
43
43
|
const root = await prepareContainedOutputDirectoryRoot(prepared, ANALYSIS_EXECUTION_DIRECTORY);
|
|
44
44
|
const claimed = await claimDirectory(root, receipt.id);
|
|
@@ -68,7 +68,7 @@ function executionReceipt(value, prepared) {
|
|
|
68
68
|
return receipt;
|
|
69
69
|
}
|
|
70
70
|
/** The returned closure owns one exact directory; persisted IDs never authorize overwriting it. */
|
|
71
|
-
export async function
|
|
71
|
+
export async function beginAnalysisExecution(prepared, context) {
|
|
72
72
|
const start = analysisExecutionStartSchema.parse({
|
|
73
73
|
...context,
|
|
74
74
|
schema: "humanish.analysis-execution-start.v1",
|
|
@@ -92,7 +92,7 @@ export async function beginStudyAnalysisExecution(prepared, context) {
|
|
|
92
92
|
await writeContainedOutputFile(claimed, "receipt.json", `${JSON.stringify(receipt, null, 2)}\n`);
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
|
-
export async function
|
|
95
|
+
export async function listAnalysisExecutions(prepared) {
|
|
96
96
|
const receipts = [];
|
|
97
97
|
const warnings = [];
|
|
98
98
|
try {
|
|
@@ -102,7 +102,7 @@ export async function listStudyAnalysisExecutions(prepared) {
|
|
|
102
102
|
const inventory = await directoryIds(root, MAX_VERSIONS);
|
|
103
103
|
warnings.push(...inventory.warnings);
|
|
104
104
|
for (const id of inventory.ids) {
|
|
105
|
-
const bytes = await
|
|
105
|
+
const bytes = await readBoundedFile(root, `${id}/receipt.json`, MAX_EXECUTION_RECORD_BYTES);
|
|
106
106
|
if (!bytes) {
|
|
107
107
|
if (!(await pathMissing(path.join(root.physicalPath, id, "receipt.json")).catch(() => false)))
|
|
108
108
|
warnings.push("ANALYSIS_RECEIPT_UNREADABLE");
|
|
@@ -128,7 +128,7 @@ export async function listStudyAnalysisExecutions(prepared) {
|
|
|
128
128
|
return { receipts, warnings: [...new Set(warnings)] };
|
|
129
129
|
}
|
|
130
130
|
/** Accounting is independent of source freshness and findings validation. No evidence is opened. */
|
|
131
|
-
export async function
|
|
131
|
+
export async function readAnalysisAccountingRecords(prepared) {
|
|
132
132
|
const records = new Map();
|
|
133
133
|
const warnings = [];
|
|
134
134
|
for (const directory of [ANALYSIS_EXECUTION_DIRECTORY, ANALYSIS_DIRECTORY]) {
|
|
@@ -145,7 +145,7 @@ export async function readStudyAnalysisAccountingRecords(prepared) {
|
|
|
145
145
|
records.set(id, record);
|
|
146
146
|
}
|
|
147
147
|
if (directory === ANALYSIS_EXECUTION_DIRECTORY) {
|
|
148
|
-
const startBytes = await
|
|
148
|
+
const startBytes = await readBoundedFile(root, `${id}/start.json`, MAX_EXECUTION_RECORD_BYTES);
|
|
149
149
|
if (startBytes) {
|
|
150
150
|
try {
|
|
151
151
|
const start = analysisExecutionStartSchema.parse(JSON.parse(startBytes.toString("utf8")));
|
|
@@ -159,7 +159,7 @@ export async function readStudyAnalysisAccountingRecords(prepared) {
|
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
const legacy = directory === ANALYSIS_DIRECTORY;
|
|
162
|
-
const bytes = await
|
|
162
|
+
const bytes = await readBoundedFile(root, `${id}/${legacy ? "analysis.json" : "receipt.json"}`, legacy ? ANALYSIS_MAX_BYTES : MAX_EXECUTION_RECORD_BYTES);
|
|
163
163
|
if (!bytes)
|
|
164
164
|
continue;
|
|
165
165
|
try {
|
|
@@ -169,7 +169,7 @@ export async function readStudyAnalysisAccountingRecords(prepared) {
|
|
|
169
169
|
// A historical report may have stale captures or invalid findings. Its strictly checked
|
|
170
170
|
// accounting metadata still records incurred usage; it never approves those findings.
|
|
171
171
|
const candidate = legacy
|
|
172
|
-
? Object.fromEntries(Object.keys(
|
|
172
|
+
? Object.fromEntries(Object.keys(analysisExecutionReceiptKeys).map((key) => [key, raw[key]]))
|
|
173
173
|
: raw;
|
|
174
174
|
if (legacy)
|
|
175
175
|
Object.assign(candidate, {
|
|
@@ -208,7 +208,7 @@ export async function readStudyAnalysisAccountingRecords(prepared) {
|
|
|
208
208
|
}
|
|
209
209
|
return { records: [...records.values()], warnings: [...new Set(warnings)] };
|
|
210
210
|
}
|
|
211
|
-
const
|
|
211
|
+
const analysisExecutionReceiptKeys = {
|
|
212
212
|
id: true,
|
|
213
213
|
runId: true,
|
|
214
214
|
status: true,
|
package/dist/analysis/store.d.ts
CHANGED
|
@@ -18,14 +18,14 @@ export declare function assertAnalysisPublicationCapacity(prepared: PreparedRunA
|
|
|
18
18
|
export declare function existingRoot(prepared: PreparedRunArtifactPaths, directory?: string): Promise<PreparedSelectedOutputDirectory | null>;
|
|
19
19
|
export declare function claimDirectory(parent: PreparedSelectedOutputDirectory, id: string): Promise<PreparedSelectedOutputDirectory>;
|
|
20
20
|
/** A claimed version is never reused, including after interruption before publication. */
|
|
21
|
-
export declare function
|
|
21
|
+
export declare function writeAnalysis(prepared: PreparedRunArtifactPaths, value: AnalysisArtifact): Promise<void>;
|
|
22
22
|
export declare function directoryIds(root: PreparedSelectedOutputDirectory, limit: number, ignoreLegacyFiles?: boolean): Promise<{
|
|
23
23
|
ids: string[];
|
|
24
24
|
warnings: string[];
|
|
25
25
|
}>;
|
|
26
26
|
/** Read one exact result without reading automatic job state or unrelated history. */
|
|
27
|
-
export declare function
|
|
27
|
+
export declare function readAnalysisVersion(prepared: PreparedRunArtifactPaths, id: string): Promise<AnalysisListEntry | null>;
|
|
28
28
|
/** Includes failed attempts; callers must not equate the newest attempt with usable findings. */
|
|
29
29
|
export declare function listAnalyses(prepared: PreparedRunArtifactPaths): Promise<AnalysisListEntry[]>;
|
|
30
|
-
export declare function
|
|
31
|
-
export declare function
|
|
30
|
+
export declare function loadAnalysisRecord(prepared: PreparedRunArtifactPaths, id?: string): Promise<LoadedAnalysis>;
|
|
31
|
+
export declare function appendAnalysisCorrection(prepared: PreparedRunArtifactPaths, value: AnalysisCorrection): Promise<void>;
|