harnery 0.33.0 → 0.34.1
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/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +4 -0
- package/dist/commands/adapter.js +2 -2
- package/dist/commands/agents.d.ts +144 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +1237 -590
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +7 -6
- package/dist/commands/backup.d.ts +1 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +29 -16
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +234 -12
- package/dist/commands/checkpoint.d.ts.map +1 -1
- package/dist/commands/checkpoint.js +3 -2
- package/dist/commands/claude-desktop.d.ts +1 -1
- package/dist/commands/claude-desktop.d.ts.map +1 -1
- package/dist/commands/claude-desktop.js +3 -74
- package/dist/commands/context.js +1 -6
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +22 -38
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +91 -28
- package/dist/commands/doctor.js +10 -1
- package/dist/commands/events.d.ts +5 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +189 -0
- package/dist/commands/governor.d.ts.map +1 -1
- package/dist/commands/governor.js +13 -4
- package/dist/commands/init.d.ts +9 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +223 -51
- package/dist/commands/journal.d.ts.map +1 -1
- package/dist/commands/journal.js +4 -13
- package/dist/commands/ledger-v3.d.ts +5 -0
- package/dist/commands/ledger-v3.d.ts.map +1 -0
- package/dist/commands/ledger-v3.js +91 -0
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +11 -5
- package/dist/commands/sync.d.ts +1 -1
- package/dist/commands/sync.js +1 -1
- package/dist/commands/web.d.ts +6 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +67 -7
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +22 -5
- package/dist/core/adapter.d.ts +5 -0
- package/dist/core/adapter.d.ts.map +1 -0
- package/dist/core/adapter.js +1 -0
- package/dist/core/adapters/attest.d.ts +5 -2
- package/dist/core/adapters/attest.d.ts.map +1 -1
- package/dist/core/adapters/attest.js +8 -3
- package/dist/core/adapters/profiles.d.ts +6 -6
- package/dist/core/adapters/profiles.d.ts.map +1 -1
- package/dist/core/adapters/profiles.js +4 -4
- package/dist/core/agents/canonical-emit.d.ts +17 -15
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +22 -22
- package/dist/core/agents/cli.js +207 -234
- package/dist/core/agents/codex-archive-v3.d.ts +14 -0
- package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
- package/dist/core/agents/codex-archive-v3.js +110 -0
- package/dist/core/agents/coord-client.d.ts +19 -81
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +65 -155
- package/dist/core/agents/finalization.d.ts +4 -1
- package/dist/core/agents/finalization.d.ts.map +1 -1
- package/dist/core/agents/finalization.js +89 -32
- package/dist/core/agents/index.d.ts +4 -5
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +4 -5
- package/dist/core/agents/live-authority-v3.d.ts +59 -0
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
- package/dist/core/agents/live-authority-v3.js +233 -0
- package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
- package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
- package/dist/core/agents/live-lifecycle-v3.js +91 -0
- package/dist/core/agents/live-observation-v3.d.ts +25 -0
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
- package/dist/core/agents/live-observation-v3.js +157 -0
- package/dist/core/agents/render/prompt-context.d.ts +4 -4
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +23 -58
- package/dist/core/agents/render/session-context.d.ts +1 -1
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +8 -32
- package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
- package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/claim-conflict.js +79 -127
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +3 -18
- package/dist/core/agents/rules/stop-hook.d.ts +9 -50
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +193 -236
- package/dist/core/agents/session-events.d.ts +5 -7
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +127 -95
- package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
- package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
- package/dist/core/agents/session-finalization-state-v3.js +40 -0
- package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
- package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
- package/dist/core/agents/session-finalizer-v3.js +734 -0
- package/dist/core/agents/session-name-display.d.ts +40 -0
- package/dist/core/agents/session-name-display.d.ts.map +1 -0
- package/dist/core/agents/session-name-display.js +119 -0
- package/dist/core/agents/state/activity-log.d.ts +3 -3
- package/dist/core/agents/state/activity-log.d.ts.map +1 -1
- package/dist/core/agents/state/activity-log.js +7 -16
- package/dist/core/agents/state/heartbeat-writer.d.ts +23 -55
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +56 -228
- package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
- package/dist/core/agents/state/live-coordination-view.js +209 -0
- package/dist/core/agents/state/session-state.d.ts +4 -3
- package/dist/core/agents/state/session-state.d.ts.map +1 -1
- package/dist/core/agents/state/session-state.js +18 -9
- package/dist/core/agents/state/stale-sweep.d.ts +1 -1
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +26 -15
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +5 -7
- package/dist/core/config.d.ts +33 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +98 -2
- package/dist/core/context/index.d.ts +1 -4
- package/dist/core/context/index.d.ts.map +1 -1
- package/dist/core/context/index.js +9 -9
- package/dist/core/events/span-parent.d.ts +15 -0
- package/dist/core/events/span-parent.d.ts.map +1 -0
- package/dist/core/events/span-parent.js +34 -0
- package/dist/core/events/v3/advance.d.ts +14 -0
- package/dist/core/events/v3/advance.d.ts.map +1 -0
- package/dist/core/events/v3/advance.js +134 -0
- package/dist/core/events/v3/authority-outbox.d.ts +78 -0
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
- package/dist/core/events/v3/authority-outbox.js +399 -0
- package/dist/core/events/v3/base-builder.d.ts +20 -0
- package/dist/core/events/v3/base-builder.d.ts.map +1 -0
- package/dist/core/events/v3/base-builder.js +29 -0
- package/dist/core/events/v3/base-contract.d.ts +7576 -0
- package/dist/core/events/v3/base-contract.d.ts.map +1 -0
- package/dist/core/events/v3/base-contract.js +647 -0
- package/dist/core/events/v3/bootstrap.d.ts +34 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
- package/dist/core/events/v3/bootstrap.js +175 -0
- package/dist/core/events/v3/builder.d.ts +20 -0
- package/dist/core/events/v3/builder.d.ts.map +1 -0
- package/dist/core/events/v3/builder.js +28 -0
- package/dist/core/events/v3/canonical.d.ts +31 -0
- package/dist/core/events/v3/canonical.d.ts.map +1 -0
- package/dist/core/events/v3/canonical.js +100 -0
- package/dist/core/events/v3/capabilities.d.ts +31 -0
- package/dist/core/events/v3/capabilities.d.ts.map +1 -0
- package/dist/core/events/v3/capabilities.js +107 -0
- package/dist/core/events/v3/capability-drift.d.ts +22 -0
- package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
- package/dist/core/events/v3/capability-drift.js +134 -0
- package/dist/core/events/v3/catalog.d.ts +38 -0
- package/dist/core/events/v3/catalog.d.ts.map +1 -0
- package/dist/core/events/v3/catalog.js +135 -0
- package/dist/core/events/v3/clock-order.d.ts +34 -0
- package/dist/core/events/v3/clock-order.d.ts.map +1 -0
- package/dist/core/events/v3/clock-order.js +35 -0
- package/dist/core/events/v3/contract.d.ts +171 -0
- package/dist/core/events/v3/contract.d.ts.map +1 -0
- package/dist/core/events/v3/contract.js +180 -0
- package/dist/core/events/v3/control.d.ts +111 -0
- package/dist/core/events/v3/control.d.ts.map +1 -0
- package/dist/core/events/v3/control.js +419 -0
- package/dist/core/events/v3/coordination-view.d.ts +69 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
- package/dist/core/events/v3/coordination-view.js +119 -0
- package/dist/core/events/v3/economics.d.ts +77 -0
- package/dist/core/events/v3/economics.d.ts.map +1 -0
- package/dist/core/events/v3/economics.js +274 -0
- package/dist/core/events/v3/finalization-view.d.ts +26 -0
- package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
- package/dist/core/events/v3/finalization-view.js +37 -0
- package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
- package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
- package/dist/core/events/v3/fingerprint-keys.js +217 -0
- package/dist/core/events/v3/generated.d.ts +4 -0
- package/dist/core/events/v3/generated.d.ts.map +1 -0
- package/dist/core/events/v3/generated.js +47 -0
- package/dist/core/events/v3/ids.d.ts +9 -0
- package/dist/core/events/v3/ids.d.ts.map +1 -0
- package/dist/core/events/v3/ids.js +25 -0
- package/dist/core/events/v3/index.d.ts +35 -0
- package/dist/core/events/v3/index.d.ts.map +1 -0
- package/dist/core/events/v3/index.js +33 -0
- package/dist/core/events/v3/latency.d.ts +63 -0
- package/dist/core/events/v3/latency.d.ts.map +1 -0
- package/dist/core/events/v3/latency.js +412 -0
- package/dist/core/events/v3/live-feed.d.ts +45 -0
- package/dist/core/events/v3/live-feed.d.ts.map +1 -0
- package/dist/core/events/v3/live-feed.js +246 -0
- package/dist/core/events/v3/live-observation.d.ts +35 -0
- package/dist/core/events/v3/live-observation.d.ts.map +1 -0
- package/dist/core/events/v3/live-observation.js +1 -0
- package/dist/core/events/v3/live-routing.d.ts +57 -0
- package/dist/core/events/v3/live-routing.d.ts.map +1 -0
- package/dist/core/events/v3/live-routing.js +107 -0
- package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/command-recorder.js +477 -0
- package/dist/core/events/v3/producers/command.d.ts +50 -0
- package/dist/core/events/v3/producers/command.d.ts.map +1 -0
- package/dist/core/events/v3/producers/command.js +135 -0
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
- package/dist/core/events/v3/producers/coordination.d.ts +90 -0
- package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
- package/dist/core/events/v3/producers/coordination.js +229 -0
- package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
- package/dist/core/events/v3/producers/hook-base.js +424 -0
- package/dist/core/events/v3/producers/hook.d.ts +29 -0
- package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
- package/dist/core/events/v3/producers/hook.js +71 -0
- package/dist/core/events/v3/producers/intake.d.ts +65 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
- package/dist/core/events/v3/producers/intake.js +244 -0
- package/dist/core/events/v3/producers/recorder.d.ts +240 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/recorder.js +2176 -0
- package/dist/core/events/v3/projection.d.ts +101 -0
- package/dist/core/events/v3/projection.d.ts.map +1 -0
- package/dist/core/events/v3/projection.js +479 -0
- package/dist/core/events/v3/reader.d.ts +75 -0
- package/dist/core/events/v3/reader.d.ts.map +1 -0
- package/dist/core/events/v3/reader.js +778 -0
- package/dist/core/events/v3/recovery-record.d.ts +47 -0
- package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
- package/dist/core/events/v3/recovery-record.js +167 -0
- package/dist/core/events/v3/recovery.d.ts +22 -0
- package/dist/core/events/v3/recovery.d.ts.map +1 -0
- package/dist/core/events/v3/recovery.js +227 -0
- package/dist/core/events/v3/span-state.d.ts +52 -0
- package/dist/core/events/v3/span-state.d.ts.map +1 -0
- package/dist/core/events/v3/span-state.js +142 -0
- package/dist/core/events/v3/targets.d.ts +23 -0
- package/dist/core/events/v3/targets.d.ts.map +1 -0
- package/dist/core/events/v3/targets.js +134 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
- package/dist/core/events/v3/turn-telemetry.js +168 -0
- package/dist/core/events/v3/validate.d.ts +9 -0
- package/dist/core/events/v3/validate.d.ts.map +1 -0
- package/dist/core/events/v3/validate.js +281 -0
- package/dist/core/events/v3/writer.d.ts +56 -0
- package/dist/core/events/v3/writer.d.ts.map +1 -0
- package/dist/core/events/v3/writer.js +335 -0
- package/dist/core/governor/index.d.ts +1 -1
- package/dist/core/governor/index.d.ts.map +1 -1
- package/dist/core/governor/index.js +1 -1
- package/dist/core/governor/plan-api.d.ts +2 -1
- package/dist/core/governor/plan-api.d.ts.map +1 -1
- package/dist/core/governor/plan-api.js +6 -3
- package/dist/core/governor/read.d.ts +1 -1
- package/dist/core/governor/read.d.ts.map +1 -1
- package/dist/core/governor/read.js +1 -1
- package/dist/core/governor/state.d.ts +9 -0
- package/dist/core/governor/state.d.ts.map +1 -1
- package/dist/core/governor/state.js +40 -3
- package/dist/core/guard/config.d.ts +5 -0
- package/dist/core/guard/config.d.ts.map +1 -0
- package/dist/core/guard/config.js +157 -0
- package/dist/core/guard/coordinator.d.ts +14 -0
- package/dist/core/guard/coordinator.d.ts.map +1 -0
- package/dist/core/guard/coordinator.js +173 -0
- package/dist/core/guard/evaluator.d.ts +4 -0
- package/dist/core/guard/evaluator.d.ts.map +1 -0
- package/dist/core/guard/evaluator.js +242 -0
- package/dist/core/guard/evidence-v3.d.ts +15 -0
- package/dist/core/guard/evidence-v3.d.ts.map +1 -0
- package/dist/core/guard/evidence-v3.js +171 -0
- package/dist/core/guard/index.d.ts +10 -0
- package/dist/core/guard/index.d.ts.map +1 -0
- package/dist/core/guard/index.js +6 -0
- package/dist/core/guard/live-source-v3.d.ts +40 -0
- package/dist/core/guard/live-source-v3.d.ts.map +1 -0
- package/dist/core/guard/live-source-v3.js +128 -0
- package/dist/core/guard/storage.d.ts +27 -0
- package/dist/core/guard/storage.d.ts.map +1 -0
- package/dist/core/guard/storage.js +140 -0
- package/dist/core/guard/types.d.ts +119 -0
- package/dist/core/guard/types.d.ts.map +1 -0
- package/dist/core/guard/types.js +1 -0
- package/dist/core/hooks/adapter/detect.d.ts +18 -1
- package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
- package/dist/core/hooks/adapter/detect.js +29 -0
- package/dist/core/hooks/adapter/events.d.ts +7 -4
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +12 -4
- package/dist/core/hooks/adapter/output.d.ts +2 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.d.ts +7 -4
- package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.js +63 -25
- package/dist/core/hooks/adapter/wiring.d.ts +30 -4
- package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
- package/dist/core/hooks/adapter/wiring.js +89 -11
- package/dist/core/hooks/cli.d.ts +1 -1
- package/dist/core/hooks/cli.js +306 -444
- package/dist/core/hooks/effects/image-capture.d.ts +20 -34
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +212 -221
- package/dist/core/hooks/effects/index.d.ts +1 -9
- package/dist/core/hooks/effects/index.d.ts.map +1 -1
- package/dist/core/hooks/effects/index.js +1 -24
- package/dist/core/hooks/events/input-hash.d.ts +7 -0
- package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
- package/dist/core/hooks/events/input-hash.js +43 -0
- package/dist/core/hooks/index.d.ts +4 -3
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/index.js +2 -3
- package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
- package/dist/core/hooks/resolve/coord-root.js +1 -1
- package/dist/core/hooks/resolve/owner.d.ts +16 -15
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +51 -42
- package/dist/core/hooks/resolve/transcript.d.ts +33 -3
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +161 -14
- package/dist/core/hooks/session-name-presence.d.ts +9 -10
- package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
- package/dist/core/hooks/session-name-presence.js +15 -15
- package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
- package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
- package/dist/core/journal/index.d.ts +2 -2
- package/dist/core/journal/index.d.ts.map +1 -1
- package/dist/core/journal/index.js +9 -22
- package/dist/core/presence/blob.d.ts +4 -3
- package/dist/core/presence/blob.d.ts.map +1 -1
- package/dist/core/presence/blob.js +45 -44
- package/dist/core/presence/codec-digest.d.ts +29 -0
- package/dist/core/presence/codec-digest.d.ts.map +1 -0
- package/dist/core/presence/codec-digest.js +170 -0
- package/dist/core/presence/relay-client.d.ts +1 -1
- package/dist/core/presence/relay-client.d.ts.map +1 -1
- package/dist/core/presence/relay-client.js +5 -5
- package/dist/core/work/index.d.ts +1 -1
- package/dist/core/work/index.d.ts.map +1 -1
- package/dist/core/work/index.js +1 -1
- package/dist/core/work/read.d.ts +1 -1
- package/dist/core/work/read.d.ts.map +1 -1
- package/dist/core/work/read.js +1 -1
- package/dist/core/work/runner.d.ts.map +1 -1
- package/dist/core/work/runner.js +6 -0
- package/dist/core/work/state.d.ts +9 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +17 -3
- package/dist/core/workflow/engine.js +24 -25
- package/dist/core/workflow/live-session-v3.d.ts +19 -0
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
- package/dist/core/workflow/live-session-v3.js +86 -0
- package/dist/core/workflow/scope-id.d.ts +3 -0
- package/dist/core/workflow/scope-id.d.ts.map +1 -0
- package/dist/core/workflow/scope-id.js +5 -0
- package/dist/core/workflow/workspaces/leases.d.ts +4 -0
- package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/leases.js +53 -19
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/browser/client.d.ts +41 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +203 -0
- package/dist/lib/browser/critique.d.ts +28 -2
- package/dist/lib/browser/critique.d.ts.map +1 -1
- package/dist/lib/browser/critique.js +74 -18
- package/dist/lib/browser/geometry.d.ts +1 -1
- package/dist/lib/browser/geometry.d.ts.map +1 -1
- package/dist/lib/browser/geometry.js +130 -6
- package/dist/lib/browser/index.d.ts +3 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +3 -0
- package/dist/lib/browser/qa-plan.d.ts +174 -0
- package/dist/lib/browser/qa-plan.d.ts.map +1 -0
- package/dist/lib/browser/qa-plan.js +321 -0
- package/dist/lib/browser/qa-reuse.d.ts +99 -0
- package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
- package/dist/lib/browser/qa-reuse.js +222 -0
- package/dist/lib/browser/qa-snapshot.d.ts +64 -0
- package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
- package/dist/lib/browser/qa-snapshot.js +171 -0
- package/dist/lib/browser/runts.d.ts.map +1 -1
- package/dist/lib/browser/runts.js +22 -1
- package/dist/lib/browser/tiling.d.ts +71 -0
- package/dist/lib/browser/tiling.d.ts.map +1 -0
- package/dist/lib/browser/tiling.js +118 -0
- package/dist/lib/claude-desktop.d.ts +0 -47
- package/dist/lib/claude-desktop.d.ts.map +1 -1
- package/dist/lib/claude-desktop.js +1 -169
- package/dist/lib/context/index.d.ts +0 -3
- package/dist/lib/context/index.d.ts.map +1 -1
- package/dist/lib/context/index.js +20 -42
- package/dist/lib/council/index.d.ts +2 -2
- package/dist/lib/council/index.d.ts.map +1 -1
- package/dist/lib/council/index.js +9 -20
- package/dist/lib/docs-frontmatter.d.ts +1 -6
- package/dist/lib/docs-frontmatter.d.ts.map +1 -1
- package/dist/lib/docs-frontmatter.js +12 -78
- package/dist/lib/docs-index.d.ts +9 -0
- package/dist/lib/docs-index.d.ts.map +1 -1
- package/dist/lib/docs-index.js +32 -3
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +14 -30
- package/dist/lib/docs-metadata-audit.d.ts +19 -0
- package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
- package/dist/lib/docs-metadata-audit.js +132 -0
- package/dist/lib/docs-metadata-managed.d.ts +23 -0
- package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
- package/dist/lib/docs-metadata-managed.js +78 -0
- package/dist/lib/docs-metadata-sync.d.ts +20 -0
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
- package/dist/lib/docs-metadata-sync.js +222 -0
- package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
- package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
- package/dist/lib/docs-metadata-v2-schema.js +134 -0
- package/dist/lib/docs-metadata-v2.d.ts +21 -0
- package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
- package/dist/lib/docs-metadata-v2.js +424 -0
- package/dist/lib/docs-new.d.ts +11 -0
- package/dist/lib/docs-new.d.ts.map +1 -0
- package/dist/lib/docs-new.js +52 -0
- package/dist/lib/docs-sweep.d.ts.map +1 -1
- package/dist/lib/docs-sweep.js +45 -29
- package/dist/lib/headless/index.d.ts +98 -0
- package/dist/lib/headless/index.d.ts.map +1 -0
- package/dist/lib/headless/index.js +211 -0
- package/dist/lib/identities/assume.d.ts +4 -4
- package/dist/lib/identities/assume.d.ts.map +1 -1
- package/dist/lib/identities/assume.js +52 -68
- package/dist/lib/instructions/apply.d.ts +5 -4
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +32 -20
- package/dist/lib/instructions/bundle.d.ts +1 -1
- package/dist/lib/instructions/bundle.d.ts.map +1 -1
- package/dist/lib/instructions/bundle.js +1 -1
- package/dist/lib/instructions/splice.d.ts +0 -1
- package/dist/lib/instructions/splice.d.ts.map +1 -1
- package/dist/lib/instructions/splice.js +22 -6
- package/dist/lib/instructions/templates.d.ts +7 -5
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +79 -9
- package/package.json +26 -5
- package/schemas/config.schema.json +120 -2
- package/schemas/docs-metadata-v2.schema.json +441 -0
- package/schemas/event-v3.schema.json +24472 -0
- package/src/commander.ts +4 -0
- package/src/commands/adapter.ts +2 -2
- package/src/commands/agents.ts +1530 -593
- package/src/commands/artifacts.ts +7 -6
- package/src/commands/backup.ts +29 -21
- package/src/commands/browse.ts +349 -8
- package/src/commands/checkpoint.ts +4 -3
- package/src/commands/claude-desktop.ts +2 -101
- package/src/commands/context.ts +1 -6
- package/src/commands/decision.ts +27 -44
- package/src/commands/docs.ts +100 -33
- package/src/commands/doctor.ts +14 -1
- package/src/commands/events.ts +256 -0
- package/src/commands/governor.ts +18 -4
- package/src/commands/init.ts +253 -57
- package/src/commands/instructions.ts +1 -1
- package/src/commands/journal.ts +4 -13
- package/src/commands/ledger-v3.ts +111 -0
- package/src/commands/presence.ts +11 -10
- package/src/commands/sync.ts +1 -1
- package/src/commands/web.ts +67 -8
- package/src/commands/work.ts +28 -5
- package/src/core/adapter.ts +5 -0
- package/src/core/adapters/attest.ts +8 -3
- package/src/core/adapters/profiles.ts +4 -6
- package/src/core/agents/canonical-emit.ts +34 -25
- package/src/core/agents/cli.ts +236 -262
- package/src/core/agents/codex-archive-v3.ts +138 -0
- package/src/core/agents/coord-client.ts +75 -188
- package/src/core/agents/finalization.ts +120 -38
- package/src/core/agents/index.ts +4 -5
- package/src/core/agents/live-authority-v3.ts +375 -0
- package/src/core/agents/live-lifecycle-v3.ts +140 -0
- package/src/core/agents/live-observation-v3.ts +216 -0
- package/src/core/agents/render/prompt-context.ts +29 -60
- package/src/core/agents/render/session-context.ts +10 -31
- package/src/core/agents/rules/claim-conflict.ts +85 -126
- package/src/core/agents/rules/commit-conflict.ts +3 -14
- package/src/core/agents/rules/stop-hook.ts +239 -293
- package/src/core/agents/session-events.ts +137 -104
- package/src/core/agents/session-finalization-state-v3.ts +90 -0
- package/src/core/agents/session-finalizer-v3.ts +953 -0
- package/src/core/agents/session-name-display.ts +149 -0
- package/src/core/agents/state/activity-log.ts +6 -14
- package/src/core/agents/state/heartbeat-writer.ts +82 -277
- package/src/core/agents/state/live-coordination-view.ts +290 -0
- package/src/core/agents/state/session-state.ts +24 -12
- package/src/core/agents/state/stale-sweep.ts +40 -17
- package/src/core/artifacts/index.ts +4 -5
- package/src/core/config.ts +148 -3
- package/src/core/context/index.ts +9 -17
- package/src/core/events/span-parent.ts +46 -0
- package/src/core/events/v3/advance.ts +168 -0
- package/src/core/events/v3/authority-outbox.ts +548 -0
- package/src/core/events/v3/base-builder.ts +60 -0
- package/src/core/events/v3/base-contract.ts +882 -0
- package/src/core/events/v3/bootstrap.ts +226 -0
- package/src/core/events/v3/builder.ts +59 -0
- package/src/core/events/v3/canonical.ts +153 -0
- package/src/core/events/v3/capabilities.ts +171 -0
- package/src/core/events/v3/capability-drift.ts +177 -0
- package/src/core/events/v3/catalog.ts +202 -0
- package/src/core/events/v3/clock-order.ts +41 -0
- package/src/core/events/v3/contract.ts +365 -0
- package/src/core/events/v3/control.ts +576 -0
- package/src/core/events/v3/coordination-view.ts +193 -0
- package/src/core/events/v3/economics.ts +384 -0
- package/src/core/events/v3/finalization-view.ts +67 -0
- package/src/core/events/v3/fingerprint-keys.ts +260 -0
- package/src/core/events/v3/generated.ts +48 -0
- package/src/core/events/v3/ids.ts +33 -0
- package/src/core/events/v3/index.ts +322 -0
- package/src/core/events/v3/latency.ts +551 -0
- package/src/core/events/v3/live-feed.ts +319 -0
- package/src/core/events/v3/live-observation.ts +39 -0
- package/src/core/events/v3/live-routing.ts +135 -0
- package/src/core/events/v3/producers/command-recorder.ts +631 -0
- package/src/core/events/v3/producers/command.ts +201 -0
- package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
- package/src/core/events/v3/producers/coordination.ts +355 -0
- package/src/core/events/v3/producers/hook-base.ts +578 -0
- package/src/core/events/v3/producers/hook.ts +119 -0
- package/src/core/events/v3/producers/intake.ts +319 -0
- package/src/core/events/v3/producers/recorder.ts +2805 -0
- package/src/core/events/v3/projection.ts +653 -0
- package/src/core/events/v3/reader.ts +1127 -0
- package/src/core/events/v3/recovery-record.ts +244 -0
- package/src/core/events/v3/recovery.ts +271 -0
- package/src/core/events/v3/span-state.ts +187 -0
- package/src/core/events/v3/targets.ts +182 -0
- package/src/core/events/v3/turn-telemetry.ts +259 -0
- package/src/core/events/v3/validate.ts +361 -0
- package/src/core/events/v3/writer.ts +419 -0
- package/src/core/governor/index.ts +3 -0
- package/src/core/governor/plan-api.ts +10 -2
- package/src/core/governor/read.ts +3 -0
- package/src/core/governor/state.ts +52 -5
- package/src/core/guard/config.ts +206 -0
- package/src/core/guard/coordinator.ts +227 -0
- package/src/core/guard/evaluator.ts +343 -0
- package/src/core/guard/evidence-v3.ts +227 -0
- package/src/core/guard/index.ts +35 -0
- package/src/core/guard/live-source-v3.ts +204 -0
- package/src/core/guard/storage.ts +188 -0
- package/src/core/guard/types.ts +152 -0
- package/src/core/hooks/adapter/detect.ts +28 -1
- package/src/core/hooks/adapter/events.ts +14 -6
- package/src/core/hooks/adapter/output.ts +7 -2
- package/src/core/hooks/adapter/parse.ts +80 -38
- package/src/core/hooks/adapter/wiring.ts +119 -13
- package/src/core/hooks/cli.ts +352 -466
- package/src/core/hooks/effects/image-capture.ts +228 -238
- package/src/core/hooks/effects/index.ts +1 -36
- package/src/core/hooks/events/input-hash.ts +47 -0
- package/src/core/hooks/index.ts +4 -11
- package/src/core/hooks/resolve/coord-root.ts +1 -1
- package/src/core/hooks/resolve/owner.ts +52 -45
- package/src/core/hooks/resolve/transcript.ts +171 -14
- package/src/core/hooks/session-name-presence.ts +14 -15
- package/src/core/hooks/unsafe-cross-shell.ts +1 -1
- package/src/core/journal/index.ts +15 -22
- package/src/core/presence/blob.ts +48 -41
- package/src/core/presence/codec-digest.ts +215 -0
- package/src/core/presence/relay-client.ts +5 -5
- package/src/core/work/index.ts +3 -0
- package/src/core/work/read.ts +3 -0
- package/src/core/work/runner.ts +6 -0
- package/src/core/work/state.ts +27 -3
- package/src/core/workflow/engine.ts +24 -24
- package/src/core/workflow/live-session-v3.ts +126 -0
- package/src/core/workflow/scope-id.ts +6 -0
- package/src/core/workflow/workspaces/leases.ts +56 -19
- package/src/index.ts +1 -1
- package/src/lib/browser/client.ts +230 -0
- package/src/lib/browser/critique.ts +104 -27
- package/src/lib/browser/geometry.ts +143 -14
- package/src/lib/browser/index.ts +34 -0
- package/src/lib/browser/qa-plan.ts +501 -0
- package/src/lib/browser/qa-reuse.ts +306 -0
- package/src/lib/browser/qa-snapshot.ts +223 -0
- package/src/lib/browser/runts.ts +27 -2
- package/src/lib/browser/tiling.ts +164 -0
- package/src/lib/claude-desktop.ts +1 -232
- package/src/lib/context/index.ts +22 -46
- package/src/lib/council/index.ts +9 -21
- package/src/lib/docs-frontmatter.ts +8 -79
- package/src/lib/docs-index.ts +33 -3
- package/src/lib/docs-lint.ts +15 -29
- package/src/lib/docs-metadata-audit.ts +166 -0
- package/src/lib/docs-metadata-managed.ts +83 -0
- package/src/lib/docs-metadata-sync.ts +262 -0
- package/src/lib/docs-metadata-v2-schema.ts +138 -0
- package/src/lib/docs-metadata-v2.ts +646 -0
- package/src/lib/docs-new.ts +63 -0
- package/src/lib/docs-sweep.ts +42 -28
- package/src/lib/headless/index.ts +287 -0
- package/src/lib/identities/assume.ts +67 -86
- package/src/lib/instructions/apply.ts +33 -20
- package/src/lib/instructions/bundle.ts +2 -2
- package/src/lib/instructions/splice.ts +21 -7
- package/src/lib/instructions/templates.ts +85 -13
- package/dist/core/agents/cli-emit.d.ts +0 -27
- package/dist/core/agents/cli-emit.d.ts.map +0 -1
- package/dist/core/agents/cli-emit.js +0 -57
- package/dist/core/agents/codex-replay.d.ts +0 -29
- package/dist/core/agents/codex-replay.d.ts.map +0 -1
- package/dist/core/agents/codex-replay.js +0 -138
- package/dist/core/agents/events/consume.d.ts +0 -82
- package/dist/core/agents/events/consume.d.ts.map +0 -1
- package/dist/core/agents/events/consume.js +0 -195
- package/dist/core/agents/events/emit.d.ts +0 -42
- package/dist/core/agents/events/emit.d.ts.map +0 -1
- package/dist/core/agents/events/emit.js +0 -75
- package/dist/core/agents/events/ulid.d.ts +0 -11
- package/dist/core/agents/events/ulid.d.ts.map +0 -1
- package/dist/core/agents/events/ulid.js +0 -47
- package/dist/core/agents/state/heartbeat-projector.d.ts +0 -76
- package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
- package/dist/core/agents/state/heartbeat-projector.js +0 -581
- package/dist/core/hooks/events/emit.d.ts +0 -31
- package/dist/core/hooks/events/emit.d.ts.map +0 -1
- package/dist/core/hooks/events/emit.js +0 -93
- package/dist/core/hooks/events/rotate.d.ts +0 -43
- package/dist/core/hooks/events/rotate.d.ts.map +0 -1
- package/dist/core/hooks/events/rotate.js +0 -142
- package/dist/core/hooks/events/schema.d.ts +0 -341
- package/dist/core/hooks/events/schema.d.ts.map +0 -1
- package/dist/core/hooks/events/schema.js +0 -12
- package/dist/core/hooks/events/ulid.d.ts +0 -10
- package/dist/core/hooks/events/ulid.d.ts.map +0 -1
- package/dist/core/hooks/events/ulid.js +0 -47
- package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
- package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
- package/dist/lib/docs-frontmatter-migrate.js +0 -364
- package/src/core/agents/cli-emit.ts +0 -64
- package/src/core/agents/codex-replay.ts +0 -163
- package/src/core/agents/events/consume.ts +0 -254
- package/src/core/agents/events/emit.ts +0 -115
- package/src/core/agents/events/ulid.ts +0 -51
- package/src/core/agents/state/heartbeat-projector.ts +0 -645
- package/src/core/hooks/events/emit.ts +0 -125
- package/src/core/hooks/events/rotate.ts +0 -151
- package/src/core/hooks/events/schema.ts +0 -582
- package/src/core/hooks/events/ulid.ts +0 -51
- package/src/lib/docs-frontmatter-migrate.ts +0 -427
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type QaContext, type QaSignature } from "./qa-plan.js";
|
|
2
|
+
import type { PersistedCritique } from "./qa-reuse.js";
|
|
3
|
+
declare const SNAPSHOT_DIR: string;
|
|
4
|
+
export interface QaSnapshotStoreOptions {
|
|
5
|
+
/** Override the store root (tests, host-managed cache locations). */
|
|
6
|
+
root?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface StoredQaSnapshot {
|
|
9
|
+
signature: QaSignature;
|
|
10
|
+
/** Directory holding this snapshot's files. */
|
|
11
|
+
path: string;
|
|
12
|
+
domHtmlPath?: string;
|
|
13
|
+
screenshotPath?: string;
|
|
14
|
+
/** Critique results persisted with the snapshot (full-coverage runs only) —
|
|
15
|
+
* what the band-diff reuse layer replays for provably-unchanged regions. */
|
|
16
|
+
critique?: PersistedCritique;
|
|
17
|
+
}
|
|
18
|
+
/** Filesystem-safe key for a target URL/file + render context. The digest
|
|
19
|
+
* disambiguates targets whose sanitized slugs collide. */
|
|
20
|
+
export declare function qaSnapshotKey(target: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Persist a QA snapshot atomically. The whole context directory is staged as
|
|
23
|
+
* `<dir>.tmp-<pid>` and renamed into place, replacing any prior snapshot for
|
|
24
|
+
* the same target + context — a reader never observes a partial write.
|
|
25
|
+
*/
|
|
26
|
+
export declare function saveQaSnapshot(target: string, context: QaContext, content: {
|
|
27
|
+
signature: QaSignature;
|
|
28
|
+
domHtml?: string;
|
|
29
|
+
screenshotPng?: Buffer;
|
|
30
|
+
critique?: PersistedCritique;
|
|
31
|
+
}, opts?: QaSnapshotStoreOptions): StoredQaSnapshot;
|
|
32
|
+
/** Load the persisted snapshot for a target + context, or null. A corrupt
|
|
33
|
+
* signature file returns null (and the caller re-acquires a baseline) rather
|
|
34
|
+
* than throwing — a bad cache entry must never block QA. */
|
|
35
|
+
export declare function loadQaSnapshot(target: string, context: QaContext, opts?: QaSnapshotStoreOptions): StoredQaSnapshot | null;
|
|
36
|
+
/** List targets with at least one persisted snapshot (store maintenance). */
|
|
37
|
+
export declare function listQaSnapshotTargets(opts?: QaSnapshotStoreOptions): string[];
|
|
38
|
+
export interface ResolvedQaBaseline {
|
|
39
|
+
/** `qa-snapshot:<capturedAt>` | `production-render:<capturedAt>` |
|
|
40
|
+
* `revision-render:<label>` | `none` — recorded in the manifest so a
|
|
41
|
+
* reviewer can judge staleness. */
|
|
42
|
+
source: string;
|
|
43
|
+
signature: QaSignature | null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Walk the baseline resolution order with caller-supplied fallbacks. Pure
|
|
47
|
+
* orchestration: rendering lives in the caller (production URLs and git
|
|
48
|
+
* worktrees are its business), this just encodes the order and the source
|
|
49
|
+
* labeling. A fallback that throws or returns null falls through to the next
|
|
50
|
+
* rung; exhausting all rungs returns `{ source: "none", signature: null }`,
|
|
51
|
+
* which classifies as `unknown` — never silently text-only.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveQaBaseline(opts: {
|
|
54
|
+
target: string;
|
|
55
|
+
context: QaContext;
|
|
56
|
+
store?: QaSnapshotStoreOptions;
|
|
57
|
+
renderProduction?: () => Promise<QaSignature | null>;
|
|
58
|
+
renderRevision?: {
|
|
59
|
+
label: string;
|
|
60
|
+
render: () => Promise<QaSignature | null>;
|
|
61
|
+
};
|
|
62
|
+
}): Promise<ResolvedQaBaseline>;
|
|
63
|
+
export { SNAPSHOT_DIR as QA_SNAPSHOT_DIR };
|
|
64
|
+
//# sourceMappingURL=qa-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa-snapshot.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/qa-snapshot.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAW,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,QAAA,MAAM,YAAY,QAA0D,CAAC;AAE7E,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,WAAW,CAAC;IACvB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;gFAC4E;IAC5E,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;0DAC0D;AAC1D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBpD;AAWD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE;IACP,SAAS,EAAE,WAAW,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B,EACD,IAAI,GAAE,sBAA2B,GAChC,gBAAgB,CAyBlB;AAED;;4DAE4D;AAC5D,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,EAClB,IAAI,GAAE,sBAA2B,GAChC,gBAAgB,GAAG,IAAI,CAiCzB;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,IAAI,GAAE,sBAA2B,GAAG,MAAM,EAAE,CAUjF;AAED,MAAM,WAAW,kBAAkB;IACjC;;uCAEmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,cAAc,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;KAAE,CAAC;CAC/E,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwB9B;AAED,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// Persisted QA snapshots: the baseline source that makes repeat QA cheap.
|
|
2
|
+
//
|
|
3
|
+
// Every passing QA run persists its final page signature (and optionally the
|
|
4
|
+
// serialized DOM + full-page screenshot) per render context. The next run
|
|
5
|
+
// inherits its baseline for free instead of re-rendering production or a git
|
|
6
|
+
// revision. Resolution order (the plan's 2.6):
|
|
7
|
+
// 1. persisted QA snapshot (this store)
|
|
8
|
+
// 2. production render (caller-supplied fallback)
|
|
9
|
+
// 3. baseline-revision render (caller-supplied fallback, from a worktree)
|
|
10
|
+
// 4. none → classification is `unknown`, never text-only
|
|
11
|
+
//
|
|
12
|
+
// Storage is content-under-a-key, like visual-diff baselines: a directory per
|
|
13
|
+
// target, a subdirectory per context, atomic writes (tmp + rename) so a
|
|
14
|
+
// crashed writer never leaves a half-baseline the next run would trust.
|
|
15
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
import { resolve } from "node:path";
|
|
18
|
+
import { fnv1a32 } from "./qa-plan.js";
|
|
19
|
+
const SNAPSHOT_DIR = resolve(homedir(), ".cache", "harnery", "qa-snapshots");
|
|
20
|
+
/** Filesystem-safe key for a target URL/file + render context. The digest
|
|
21
|
+
* disambiguates targets whose sanitized slugs collide. */
|
|
22
|
+
export function qaSnapshotKey(target) {
|
|
23
|
+
const source = target.replace(/^[a-z]+:\/\//i, "");
|
|
24
|
+
let slug = "";
|
|
25
|
+
let separatorPending = false;
|
|
26
|
+
for (let index = 0; index < source.length && slug.length < 80; index++) {
|
|
27
|
+
const code = source.charCodeAt(index);
|
|
28
|
+
const alpha = (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
|
|
29
|
+
const digit = code >= 48 && code <= 57;
|
|
30
|
+
if (alpha || digit) {
|
|
31
|
+
if (separatorPending && slug.length > 0 && slug.length < 80)
|
|
32
|
+
slug += "-";
|
|
33
|
+
if (slug.length < 80)
|
|
34
|
+
slug += source[index];
|
|
35
|
+
separatorPending = false;
|
|
36
|
+
}
|
|
37
|
+
else if (slug.length > 0) {
|
|
38
|
+
separatorPending = true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return `${slug || "target"}-${fnv1a32(target).slice(0, 8)}`;
|
|
42
|
+
}
|
|
43
|
+
function contextDirName(context) {
|
|
44
|
+
const clean = (part) => part.replace(/[^a-zA-Z0-9_.]+/g, "-");
|
|
45
|
+
return `${clean(context.viewport)}-${clean(context.theme)}-${clean(context.state)}`;
|
|
46
|
+
}
|
|
47
|
+
function snapshotDir(target, context, opts) {
|
|
48
|
+
return resolve(opts.root ?? SNAPSHOT_DIR, qaSnapshotKey(target), contextDirName(context));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Persist a QA snapshot atomically. The whole context directory is staged as
|
|
52
|
+
* `<dir>.tmp-<pid>` and renamed into place, replacing any prior snapshot for
|
|
53
|
+
* the same target + context — a reader never observes a partial write.
|
|
54
|
+
*/
|
|
55
|
+
export function saveQaSnapshot(target, context, content, opts = {}) {
|
|
56
|
+
const dir = snapshotDir(target, context, opts);
|
|
57
|
+
const staging = `${dir}.tmp-${process.pid}`;
|
|
58
|
+
rmSync(staging, { recursive: true, force: true });
|
|
59
|
+
mkdirSync(staging, { recursive: true });
|
|
60
|
+
writeFileSync(resolve(staging, "signature.json"), `${JSON.stringify(content.signature)}\n`);
|
|
61
|
+
if (content.domHtml !== undefined) {
|
|
62
|
+
writeFileSync(resolve(staging, "dom.html"), content.domHtml);
|
|
63
|
+
}
|
|
64
|
+
if (content.screenshotPng !== undefined) {
|
|
65
|
+
writeFileSync(resolve(staging, "screenshot.png"), content.screenshotPng);
|
|
66
|
+
}
|
|
67
|
+
if (content.critique !== undefined) {
|
|
68
|
+
writeFileSync(resolve(staging, "critique.json"), `${JSON.stringify(content.critique)}\n`);
|
|
69
|
+
}
|
|
70
|
+
rmSync(dir, { recursive: true, force: true });
|
|
71
|
+
renameSync(staging, dir);
|
|
72
|
+
return {
|
|
73
|
+
signature: content.signature,
|
|
74
|
+
path: dir,
|
|
75
|
+
...(content.domHtml !== undefined ? { domHtmlPath: resolve(dir, "dom.html") } : {}),
|
|
76
|
+
...(content.screenshotPng !== undefined
|
|
77
|
+
? { screenshotPath: resolve(dir, "screenshot.png") }
|
|
78
|
+
: {}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** Load the persisted snapshot for a target + context, or null. A corrupt
|
|
82
|
+
* signature file returns null (and the caller re-acquires a baseline) rather
|
|
83
|
+
* than throwing — a bad cache entry must never block QA. */
|
|
84
|
+
export function loadQaSnapshot(target, context, opts = {}) {
|
|
85
|
+
const dir = snapshotDir(target, context, opts);
|
|
86
|
+
const sigPath = resolve(dir, "signature.json");
|
|
87
|
+
if (!existsSync(sigPath))
|
|
88
|
+
return null;
|
|
89
|
+
try {
|
|
90
|
+
const signature = JSON.parse(readFileSync(sigPath, "utf8"));
|
|
91
|
+
if (!signature || !Array.isArray(signature.nodes) || !Array.isArray(signature.stylesheets)) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const domHtmlPath = resolve(dir, "dom.html");
|
|
95
|
+
const screenshotPath = resolve(dir, "screenshot.png");
|
|
96
|
+
const critiquePath = resolve(dir, "critique.json");
|
|
97
|
+
let critique;
|
|
98
|
+
if (existsSync(critiquePath)) {
|
|
99
|
+
try {
|
|
100
|
+
const parsed = JSON.parse(readFileSync(critiquePath, "utf8"));
|
|
101
|
+
if (parsed && typeof parsed.contract_version === "number" && Array.isArray(parsed.tiles)) {
|
|
102
|
+
critique = parsed;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// corrupt critique.json degrades to a reuse miss, never an error
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
signature,
|
|
111
|
+
path: dir,
|
|
112
|
+
...(existsSync(domHtmlPath) ? { domHtmlPath } : {}),
|
|
113
|
+
...(existsSync(screenshotPath) ? { screenshotPath } : {}),
|
|
114
|
+
...(critique ? { critique } : {}),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** List targets with at least one persisted snapshot (store maintenance). */
|
|
122
|
+
export function listQaSnapshotTargets(opts = {}) {
|
|
123
|
+
const root = opts.root ?? SNAPSHOT_DIR;
|
|
124
|
+
if (!existsSync(root))
|
|
125
|
+
return [];
|
|
126
|
+
try {
|
|
127
|
+
return readdirSync(root)
|
|
128
|
+
.filter((name) => !name.includes(".tmp-"))
|
|
129
|
+
.sort();
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Walk the baseline resolution order with caller-supplied fallbacks. Pure
|
|
137
|
+
* orchestration: rendering lives in the caller (production URLs and git
|
|
138
|
+
* worktrees are its business), this just encodes the order and the source
|
|
139
|
+
* labeling. A fallback that throws or returns null falls through to the next
|
|
140
|
+
* rung; exhausting all rungs returns `{ source: "none", signature: null }`,
|
|
141
|
+
* which classifies as `unknown` — never silently text-only.
|
|
142
|
+
*/
|
|
143
|
+
export async function resolveQaBaseline(opts) {
|
|
144
|
+
const stored = loadQaSnapshot(opts.target, opts.context, opts.store ?? {});
|
|
145
|
+
if (stored) {
|
|
146
|
+
return { source: `qa-snapshot:${stored.signature.capturedAt}`, signature: stored.signature };
|
|
147
|
+
}
|
|
148
|
+
if (opts.renderProduction) {
|
|
149
|
+
try {
|
|
150
|
+
const signature = await opts.renderProduction();
|
|
151
|
+
if (signature)
|
|
152
|
+
return { source: `production-render:${signature.capturedAt}`, signature };
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// fall through — an unreachable production URL is not a verdict
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (opts.renderRevision) {
|
|
159
|
+
try {
|
|
160
|
+
const signature = await opts.renderRevision.render();
|
|
161
|
+
if (signature) {
|
|
162
|
+
return { source: `revision-render:${opts.renderRevision.label}`, signature };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// fall through
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { source: "none", signature: null };
|
|
170
|
+
}
|
|
171
|
+
export { SNAPSHOT_DIR as QA_SNAPSHOT_DIR };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runts.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/runts.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,OAAO;IACtB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uDAAuD;IACvD,KAAK,EAAE,OAAO,CAAC;IACf,8EAA8E;IAC9E,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"runts.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/runts.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,OAAO;IACtB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uDAAuD;IACvD,KAAK,EAAE,OAAO,CAAC;IACf,8EAA8E;IAC9E,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,KAAK,WAAW,CA6JhB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,KAAK,IAAI,CAyC/E;AAED,wBAAgB,gCAAgC,IAAI,MAAM,IAAI,CAI7D"}
|
|
@@ -113,9 +113,10 @@ export function buildRuntsCheck() {
|
|
|
113
113
|
if (entry) {
|
|
114
114
|
entry.words.push(m[0]);
|
|
115
115
|
entry.last = rect;
|
|
116
|
+
entry.node = n;
|
|
116
117
|
}
|
|
117
118
|
else {
|
|
118
|
-
lines.set(top, { words: [m[0]], last: rect });
|
|
119
|
+
lines.set(top, { words: [m[0]], last: rect, node: n });
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
122
|
}
|
|
@@ -129,6 +130,26 @@ export function buildRuntsCheck() {
|
|
|
129
130
|
const word = last.words[0] ?? "";
|
|
130
131
|
if (ATOMIC.test(word))
|
|
131
132
|
continue;
|
|
133
|
+
// A chip is not prose. A lone token whose glyphs live inside a padded,
|
|
134
|
+
// boxed inline element (a <code> chip, pill, or badge) is a UI control:
|
|
135
|
+
// it cannot be rebalanced by rewording, tag rows legitimately wrap to a
|
|
136
|
+
// single chip, and its shifted glyph box also buckets as a phantom
|
|
137
|
+
// "line" when it sits mid-line beside normal text. Walk the word's
|
|
138
|
+
// inline ancestry (tag-based, since flex/grid parents blockify computed
|
|
139
|
+
// display) and skip the finding when a chip hosts it.
|
|
140
|
+
const chipHosted = (() => {
|
|
141
|
+
for (let e = last.node.parentElement; e && e !== el && INLINE.has(e.tagName); e = e.parentElement) {
|
|
142
|
+
const cs = getComputedStyle(e);
|
|
143
|
+
const padX = (Number.parseFloat(cs.paddingLeft) || 0) + (Number.parseFloat(cs.paddingRight) || 0);
|
|
144
|
+
const boxed = (cs.backgroundColor !== "rgba(0, 0, 0, 0)" && cs.backgroundColor !== "transparent") ||
|
|
145
|
+
(Number.parseFloat(cs.borderTopWidth) || 0) > 0;
|
|
146
|
+
if (padX > 0 && boxed)
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
return false;
|
|
150
|
+
})();
|
|
151
|
+
if (chipHosted)
|
|
152
|
+
continue;
|
|
132
153
|
runts.push({
|
|
133
154
|
block: label(el),
|
|
134
155
|
word,
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export interface VisualAtom {
|
|
2
|
+
/** hard: cutting through it visibly breaks content. soft: looks untidy. */
|
|
3
|
+
kind: "text-line" | "replaced" | "box";
|
|
4
|
+
/** Document-space vertical span (CSS px scaled to image px by the caller). */
|
|
5
|
+
top: number;
|
|
6
|
+
bottom: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SnapSeam {
|
|
9
|
+
/** Document-space y of the cut. */
|
|
10
|
+
y: number;
|
|
11
|
+
/** Weighted atoms the cut passes through; 0 = clean. */
|
|
12
|
+
cost: number;
|
|
13
|
+
/** Hard atoms (text lines, replaced elements) the cut passes through. */
|
|
14
|
+
hard: number;
|
|
15
|
+
clean: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface SnapOptions {
|
|
18
|
+
bandHeight: number;
|
|
19
|
+
/** Overlap applied below a dirty seam (the legacy constant, e.g. 120). */
|
|
20
|
+
overlap: number;
|
|
21
|
+
/** Overlap applied below a clean seam. Default 16. */
|
|
22
|
+
cleanOverlap?: number;
|
|
23
|
+
/** Fraction of bandHeight the seam may move up from its target. Default 0.3. */
|
|
24
|
+
slackRatio?: number;
|
|
25
|
+
/** Minimum band height as a fraction of bandHeight. Default 0.5. */
|
|
26
|
+
minBandRatio?: number;
|
|
27
|
+
}
|
|
28
|
+
/** Weighted cost of a horizontal cut at document-space y. */
|
|
29
|
+
export declare function cutCost(atoms: VisualAtom[], y: number): {
|
|
30
|
+
cost: number;
|
|
31
|
+
hard: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Cut the vertical span [top, bottom) into bands whose seams snap into
|
|
35
|
+
* content gaps. Seams only move UP from their fixed target (never down), so
|
|
36
|
+
* band height is bounded by `bandHeight` above and `minBandRatio` below.
|
|
37
|
+
* Returns full-width rects in the caller's coordinate space plus the seam
|
|
38
|
+
* record for logging/telemetry.
|
|
39
|
+
*/
|
|
40
|
+
export declare function snappedBandRects(top: number, bottom: number, x: number, width: number, atoms: VisualAtom[], opts: SnapOptions): {
|
|
41
|
+
rects: Array<{
|
|
42
|
+
index: number;
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
width: number;
|
|
46
|
+
height: number;
|
|
47
|
+
}>;
|
|
48
|
+
seams: SnapSeam[];
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Split one element rect into internally-banded sub-rects when it is taller
|
|
52
|
+
* than the band budget. Selector-mode tiles previously shipped over-tall
|
|
53
|
+
* elements as one giant tile that the vision provider downscales; banding
|
|
54
|
+
* inside the element keeps every sub-tile at full resolution. Elements within
|
|
55
|
+
* 1.25x of the budget stay whole — a slightly-over tile beats a degenerate
|
|
56
|
+
* split.
|
|
57
|
+
*/
|
|
58
|
+
export declare function bandOversizedRect(rect: {
|
|
59
|
+
label: string;
|
|
60
|
+
x: number;
|
|
61
|
+
y: number;
|
|
62
|
+
width: number;
|
|
63
|
+
height: number;
|
|
64
|
+
}, atoms: VisualAtom[], opts: SnapOptions): Array<{
|
|
65
|
+
label: string;
|
|
66
|
+
x: number;
|
|
67
|
+
y: number;
|
|
68
|
+
width: number;
|
|
69
|
+
height: number;
|
|
70
|
+
}>;
|
|
71
|
+
//# sourceMappingURL=tiling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiling.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/tiling.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,KAAK,CAAC;IACvC,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,mCAAmC;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD,6DAA6D;AAC7D,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CActF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,EAAE,EACnB,IAAI,EAAE,WAAW,GAChB;IACD,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB,CA+CA;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC5E,KAAK,EAAE,UAAU,EAAE,EACnB,IAAI,EAAE,WAAW,GAChB,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAU/E"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// Content-aware band placement for the vision critique tiler.
|
|
2
|
+
//
|
|
3
|
+
// Fixed-height bands cut whatever sits at the boundary — half a heading, a
|
|
4
|
+
// sliced table row, the middle of an image — and the critique rubric then has
|
|
5
|
+
// to tell the model to ignore slice-edge clipping, which costs sensitivity on
|
|
6
|
+
// every tile. This module snaps each cut into nearby content gaps instead:
|
|
7
|
+
// the caller extracts "visual atoms" (text line boxes, replaced elements,
|
|
8
|
+
// small bordered boxes) from the live page, and `snappedBandRects` places
|
|
9
|
+
// each seam at the cheapest cut inside a bounded search window above the
|
|
10
|
+
// fixed target. A clean seam (nothing straddles it) needs only a token
|
|
11
|
+
// overlap; a dirty seam (unavoidable content, e.g. an element taller than
|
|
12
|
+
// the band) keeps the caller's full overlap so the rubric mitigation still
|
|
13
|
+
// applies there.
|
|
14
|
+
//
|
|
15
|
+
// Measured on a mixed fixture (prose, cards, 60-row table, an 1800px chart):
|
|
16
|
+
// hard-atom slices per page dropped 9 → 1 on desktop and 4 → 2 on mobile at
|
|
17
|
+
// an unchanged tile count, with every band height within [50%, 100%] of the
|
|
18
|
+
// budget. The remaining slice was inside the over-tall chart, where no clean
|
|
19
|
+
// cut exists — exactly the case the dirty-seam fallback covers.
|
|
20
|
+
//
|
|
21
|
+
// Pure math, no DOM access: atoms come in as plain rect spans so the module
|
|
22
|
+
// stays testable and portable. Atom extraction lives on the browser client.
|
|
23
|
+
const HARD_WEIGHT = 10;
|
|
24
|
+
const SOFT_WEIGHT = 1;
|
|
25
|
+
const EDGE_MARGIN = 4; // grazing an atom edge this closely counts as crossing
|
|
26
|
+
const CANDIDATE_STEP = 2; // px between scored cut candidates
|
|
27
|
+
/** Weighted cost of a horizontal cut at document-space y. */
|
|
28
|
+
export function cutCost(atoms, y) {
|
|
29
|
+
let cost = 0;
|
|
30
|
+
let hard = 0;
|
|
31
|
+
for (const a of atoms) {
|
|
32
|
+
if (y > a.top - EDGE_MARGIN && y < a.bottom + EDGE_MARGIN) {
|
|
33
|
+
if (a.kind === "box") {
|
|
34
|
+
cost += SOFT_WEIGHT;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
cost += HARD_WEIGHT;
|
|
38
|
+
hard++;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { cost, hard };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Cut the vertical span [top, bottom) into bands whose seams snap into
|
|
46
|
+
* content gaps. Seams only move UP from their fixed target (never down), so
|
|
47
|
+
* band height is bounded by `bandHeight` above and `minBandRatio` below.
|
|
48
|
+
* Returns full-width rects in the caller's coordinate space plus the seam
|
|
49
|
+
* record for logging/telemetry.
|
|
50
|
+
*/
|
|
51
|
+
export function snappedBandRects(top, bottom, x, width, atoms, opts) {
|
|
52
|
+
const rects = [];
|
|
53
|
+
const seams = [];
|
|
54
|
+
const span = bottom - top;
|
|
55
|
+
if (span <= 0 || width <= 0)
|
|
56
|
+
return { rects, seams };
|
|
57
|
+
const cleanOverlap = opts.cleanOverlap ?? 16;
|
|
58
|
+
const slack = Math.round(opts.bandHeight * (opts.slackRatio ?? 0.3));
|
|
59
|
+
const minBand = Math.round(opts.bandHeight * (opts.minBandRatio ?? 0.5));
|
|
60
|
+
let bandTop = top;
|
|
61
|
+
let index = 0;
|
|
62
|
+
while (bandTop + opts.bandHeight < bottom) {
|
|
63
|
+
const target = bandTop + opts.bandHeight;
|
|
64
|
+
const lo = Math.max(bandTop + minBand, target - slack);
|
|
65
|
+
// Score candidates, find the minimal cost in the window.
|
|
66
|
+
const costs = [];
|
|
67
|
+
let minCost = Number.POSITIVE_INFINITY;
|
|
68
|
+
for (let y = lo; y <= target; y += CANDIDATE_STEP) {
|
|
69
|
+
const c = cutCost(atoms, y);
|
|
70
|
+
costs.push({ y, ...c });
|
|
71
|
+
if (c.cost < minCost)
|
|
72
|
+
minCost = c.cost;
|
|
73
|
+
}
|
|
74
|
+
// Snap to the center of the widest minimal-cost run; ties resolve toward
|
|
75
|
+
// the target (later run wins on >=) so bands stay as tall as possible.
|
|
76
|
+
let runStart = -1;
|
|
77
|
+
let best = { start: 0, end: costs.length - 1, len: 0 };
|
|
78
|
+
for (let i = 0; i <= costs.length; i++) {
|
|
79
|
+
const inRun = i < costs.length && costs[i].cost === minCost;
|
|
80
|
+
if (inRun && runStart === -1)
|
|
81
|
+
runStart = i;
|
|
82
|
+
if (!inRun && runStart !== -1) {
|
|
83
|
+
const len = i - runStart;
|
|
84
|
+
if (len >= best.len)
|
|
85
|
+
best = { start: runStart, end: i - 1, len };
|
|
86
|
+
runStart = -1;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const pick = costs[Math.floor((best.start + best.end) / 2)];
|
|
90
|
+
const clean = pick.cost === 0;
|
|
91
|
+
seams.push({ y: pick.y, cost: pick.cost, hard: pick.hard, clean });
|
|
92
|
+
rects.push({ index, x, y: bandTop, width, height: pick.y - bandTop });
|
|
93
|
+
index++;
|
|
94
|
+
bandTop = pick.y - (clean ? cleanOverlap : opts.overlap);
|
|
95
|
+
}
|
|
96
|
+
rects.push({ index, x, y: bandTop, width, height: bottom - bandTop });
|
|
97
|
+
return { rects, seams };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Split one element rect into internally-banded sub-rects when it is taller
|
|
101
|
+
* than the band budget. Selector-mode tiles previously shipped over-tall
|
|
102
|
+
* elements as one giant tile that the vision provider downscales; banding
|
|
103
|
+
* inside the element keeps every sub-tile at full resolution. Elements within
|
|
104
|
+
* 1.25x of the budget stay whole — a slightly-over tile beats a degenerate
|
|
105
|
+
* split.
|
|
106
|
+
*/
|
|
107
|
+
export function bandOversizedRect(rect, atoms, opts) {
|
|
108
|
+
if (rect.height <= opts.bandHeight * 1.25)
|
|
109
|
+
return [rect];
|
|
110
|
+
const { rects } = snappedBandRects(rect.y, rect.y + rect.height, rect.x, rect.width, atoms, opts);
|
|
111
|
+
return rects.map((r, i) => ({
|
|
112
|
+
label: `${rect.label} (${i + 1}/${rects.length})`,
|
|
113
|
+
x: r.x,
|
|
114
|
+
y: r.y,
|
|
115
|
+
width: r.width,
|
|
116
|
+
height: r.height,
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
@@ -58,36 +58,6 @@ export interface MirrorPlan {
|
|
|
58
58
|
/** Entries skipped because they are archived (opt in via includeArchived). */
|
|
59
59
|
skippedArchived: number;
|
|
60
60
|
}
|
|
61
|
-
export type DesktopLifecycleState = "active" | "blocked" | "done";
|
|
62
|
-
export interface DesktopLifecycleRecord {
|
|
63
|
-
state: DesktopLifecycleState;
|
|
64
|
-
updatedAt: string;
|
|
65
|
-
instanceId: string | null;
|
|
66
|
-
sessionId: string | null;
|
|
67
|
-
reason: string | null;
|
|
68
|
-
}
|
|
69
|
-
export type DesktopTidySource = "lifecycle" | "legacy-prefix";
|
|
70
|
-
export interface DesktopTidyAction {
|
|
71
|
-
entry: DesktopSessionEntry;
|
|
72
|
-
source: DesktopTidySource;
|
|
73
|
-
lifecycle: DesktopLifecycleRecord | null;
|
|
74
|
-
}
|
|
75
|
-
export type DesktopTidySkipReason = "already_archived" | "blocked_title" | "lifecycle_active" | "lifecycle_blocked" | "unmatched";
|
|
76
|
-
export interface DesktopTidySkip {
|
|
77
|
-
entry: DesktopSessionEntry;
|
|
78
|
-
reason: DesktopTidySkipReason;
|
|
79
|
-
lifecycle: DesktopLifecycleRecord | null;
|
|
80
|
-
}
|
|
81
|
-
export interface DesktopTidyPlan {
|
|
82
|
-
actions: DesktopTidyAction[];
|
|
83
|
-
skipped: DesktopTidySkip[];
|
|
84
|
-
}
|
|
85
|
-
export interface DesktopTidyOptions {
|
|
86
|
-
/** Restrict entries to accounts whose UUID starts with one of these prefixes. */
|
|
87
|
-
accounts?: string[];
|
|
88
|
-
/** Accept an unmatched historical `[DONE]` title as a compatibility fallback. */
|
|
89
|
-
includeLegacyPrefix?: boolean;
|
|
90
|
-
}
|
|
91
61
|
/**
|
|
92
62
|
* Candidate desktop-app data directories for this machine, most specific
|
|
93
63
|
* first. Only directories that exist AND contain a claude-code-sessions/
|
|
@@ -132,21 +102,4 @@ export declare function planMirror(accounts: DesktopAccount[], opts?: MirrorOpti
|
|
|
132
102
|
export declare function applyMirror(plan: MirrorPlan): {
|
|
133
103
|
copied: number;
|
|
134
104
|
};
|
|
135
|
-
/**
|
|
136
|
-
* Read the latest durable lifecycle declaration for every Harnery session.
|
|
137
|
-
*
|
|
138
|
-
* The canonical ledger rotates into `events-*.ndjson` archives. Stream each
|
|
139
|
-
* file rather than loading the whole history into one string, then compare
|
|
140
|
-
* event timestamps because adapter replay may append an older event later.
|
|
141
|
-
* Records are indexed by both session_id and instance_id so a desktop
|
|
142
|
-
* cliSessionId can match either identity shape used by older adapters.
|
|
143
|
-
*/
|
|
144
|
-
export declare function readDesktopLifecycleIndex(coordRoot: string): Promise<Map<string, DesktopLifecycleRecord>>;
|
|
145
|
-
/** Select desktop entries whose durable lifecycle is done. */
|
|
146
|
-
export declare function planTidy(accounts: DesktopAccount[], lifecycleBySession: ReadonlyMap<string, DesktopLifecycleRecord>, opts?: DesktopTidyOptions): DesktopTidyPlan;
|
|
147
|
-
/** Apply a tidy plan with same-directory temp files and atomic renames. */
|
|
148
|
-
export declare function applyTidy(plan: DesktopTidyPlan): {
|
|
149
|
-
archived: number;
|
|
150
|
-
alreadyArchived: number;
|
|
151
|
-
};
|
|
152
105
|
//# sourceMappingURL=claude-desktop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/lib/claude-desktop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude-desktop.d.ts","sourceRoot":"","sources":["../../src/lib/claude-desktop.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,mBAAmB,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;CACzB;AAaD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAgC/D;AA4CD,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAyB9D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAerF;AAED,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM1F;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,UAAU,CA2C3F;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAQhE"}
|