harnery 0.33.0 → 0.34.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/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 +1220 -588
- 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 +305 -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 +155 -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 +1512 -592
- 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 +351 -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 +165 -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,164 @@
|
|
|
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
|
+
|
|
24
|
+
export interface VisualAtom {
|
|
25
|
+
/** hard: cutting through it visibly breaks content. soft: looks untidy. */
|
|
26
|
+
kind: "text-line" | "replaced" | "box";
|
|
27
|
+
/** Document-space vertical span (CSS px scaled to image px by the caller). */
|
|
28
|
+
top: number;
|
|
29
|
+
bottom: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface SnapSeam {
|
|
33
|
+
/** Document-space y of the cut. */
|
|
34
|
+
y: number;
|
|
35
|
+
/** Weighted atoms the cut passes through; 0 = clean. */
|
|
36
|
+
cost: number;
|
|
37
|
+
/** Hard atoms (text lines, replaced elements) the cut passes through. */
|
|
38
|
+
hard: number;
|
|
39
|
+
clean: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface SnapOptions {
|
|
43
|
+
bandHeight: number;
|
|
44
|
+
/** Overlap applied below a dirty seam (the legacy constant, e.g. 120). */
|
|
45
|
+
overlap: number;
|
|
46
|
+
/** Overlap applied below a clean seam. Default 16. */
|
|
47
|
+
cleanOverlap?: number;
|
|
48
|
+
/** Fraction of bandHeight the seam may move up from its target. Default 0.3. */
|
|
49
|
+
slackRatio?: number;
|
|
50
|
+
/** Minimum band height as a fraction of bandHeight. Default 0.5. */
|
|
51
|
+
minBandRatio?: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const HARD_WEIGHT = 10;
|
|
55
|
+
const SOFT_WEIGHT = 1;
|
|
56
|
+
const EDGE_MARGIN = 4; // grazing an atom edge this closely counts as crossing
|
|
57
|
+
const CANDIDATE_STEP = 2; // px between scored cut candidates
|
|
58
|
+
|
|
59
|
+
/** Weighted cost of a horizontal cut at document-space y. */
|
|
60
|
+
export function cutCost(atoms: VisualAtom[], y: number): { cost: number; hard: number } {
|
|
61
|
+
let cost = 0;
|
|
62
|
+
let hard = 0;
|
|
63
|
+
for (const a of atoms) {
|
|
64
|
+
if (y > a.top - EDGE_MARGIN && y < a.bottom + EDGE_MARGIN) {
|
|
65
|
+
if (a.kind === "box") {
|
|
66
|
+
cost += SOFT_WEIGHT;
|
|
67
|
+
} else {
|
|
68
|
+
cost += HARD_WEIGHT;
|
|
69
|
+
hard++;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return { cost, hard };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Cut the vertical span [top, bottom) into bands whose seams snap into
|
|
78
|
+
* content gaps. Seams only move UP from their fixed target (never down), so
|
|
79
|
+
* band height is bounded by `bandHeight` above and `minBandRatio` below.
|
|
80
|
+
* Returns full-width rects in the caller's coordinate space plus the seam
|
|
81
|
+
* record for logging/telemetry.
|
|
82
|
+
*/
|
|
83
|
+
export function snappedBandRects(
|
|
84
|
+
top: number,
|
|
85
|
+
bottom: number,
|
|
86
|
+
x: number,
|
|
87
|
+
width: number,
|
|
88
|
+
atoms: VisualAtom[],
|
|
89
|
+
opts: SnapOptions,
|
|
90
|
+
): {
|
|
91
|
+
rects: Array<{ index: number; x: number; y: number; width: number; height: number }>;
|
|
92
|
+
seams: SnapSeam[];
|
|
93
|
+
} {
|
|
94
|
+
const rects: Array<{ index: number; x: number; y: number; width: number; height: number }> = [];
|
|
95
|
+
const seams: SnapSeam[] = [];
|
|
96
|
+
const span = bottom - top;
|
|
97
|
+
if (span <= 0 || width <= 0) return { rects, seams };
|
|
98
|
+
|
|
99
|
+
const cleanOverlap = opts.cleanOverlap ?? 16;
|
|
100
|
+
const slack = Math.round(opts.bandHeight * (opts.slackRatio ?? 0.3));
|
|
101
|
+
const minBand = Math.round(opts.bandHeight * (opts.minBandRatio ?? 0.5));
|
|
102
|
+
|
|
103
|
+
let bandTop = top;
|
|
104
|
+
let index = 0;
|
|
105
|
+
while (bandTop + opts.bandHeight < bottom) {
|
|
106
|
+
const target = bandTop + opts.bandHeight;
|
|
107
|
+
const lo = Math.max(bandTop + minBand, target - slack);
|
|
108
|
+
|
|
109
|
+
// Score candidates, find the minimal cost in the window.
|
|
110
|
+
const costs: Array<{ y: number; cost: number; hard: number }> = [];
|
|
111
|
+
let minCost = Number.POSITIVE_INFINITY;
|
|
112
|
+
for (let y = lo; y <= target; y += CANDIDATE_STEP) {
|
|
113
|
+
const c = cutCost(atoms, y);
|
|
114
|
+
costs.push({ y, ...c });
|
|
115
|
+
if (c.cost < minCost) minCost = c.cost;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Snap to the center of the widest minimal-cost run; ties resolve toward
|
|
119
|
+
// the target (later run wins on >=) so bands stay as tall as possible.
|
|
120
|
+
let runStart = -1;
|
|
121
|
+
let best = { start: 0, end: costs.length - 1, len: 0 };
|
|
122
|
+
for (let i = 0; i <= costs.length; i++) {
|
|
123
|
+
const inRun = i < costs.length && costs[i].cost === minCost;
|
|
124
|
+
if (inRun && runStart === -1) runStart = i;
|
|
125
|
+
if (!inRun && runStart !== -1) {
|
|
126
|
+
const len = i - runStart;
|
|
127
|
+
if (len >= best.len) best = { start: runStart, end: i - 1, len };
|
|
128
|
+
runStart = -1;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const pick = costs[Math.floor((best.start + best.end) / 2)];
|
|
132
|
+
const clean = pick.cost === 0;
|
|
133
|
+
seams.push({ y: pick.y, cost: pick.cost, hard: pick.hard, clean });
|
|
134
|
+
rects.push({ index, x, y: bandTop, width, height: pick.y - bandTop });
|
|
135
|
+
index++;
|
|
136
|
+
bandTop = pick.y - (clean ? cleanOverlap : opts.overlap);
|
|
137
|
+
}
|
|
138
|
+
rects.push({ index, x, y: bandTop, width, height: bottom - bandTop });
|
|
139
|
+
return { rects, seams };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Split one element rect into internally-banded sub-rects when it is taller
|
|
144
|
+
* than the band budget. Selector-mode tiles previously shipped over-tall
|
|
145
|
+
* elements as one giant tile that the vision provider downscales; banding
|
|
146
|
+
* inside the element keeps every sub-tile at full resolution. Elements within
|
|
147
|
+
* 1.25x of the budget stay whole — a slightly-over tile beats a degenerate
|
|
148
|
+
* split.
|
|
149
|
+
*/
|
|
150
|
+
export function bandOversizedRect(
|
|
151
|
+
rect: { label: string; x: number; y: number; width: number; height: number },
|
|
152
|
+
atoms: VisualAtom[],
|
|
153
|
+
opts: SnapOptions,
|
|
154
|
+
): Array<{ label: string; x: number; y: number; width: number; height: number }> {
|
|
155
|
+
if (rect.height <= opts.bandHeight * 1.25) return [rect];
|
|
156
|
+
const { rects } = snappedBandRects(rect.y, rect.y + rect.height, rect.x, rect.width, atoms, opts);
|
|
157
|
+
return rects.map((r, i) => ({
|
|
158
|
+
label: `${rect.label} (${i + 1}/${rects.length})`,
|
|
159
|
+
x: r.x,
|
|
160
|
+
y: r.y,
|
|
161
|
+
width: r.width,
|
|
162
|
+
height: r.height,
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
copyFileSync,
|
|
4
|
-
createReadStream,
|
|
5
|
-
existsSync,
|
|
6
|
-
mkdirSync,
|
|
7
|
-
readdirSync,
|
|
8
|
-
readFileSync,
|
|
9
|
-
renameSync,
|
|
10
|
-
statSync,
|
|
11
|
-
unlinkSync,
|
|
12
|
-
writeFileSync,
|
|
13
|
-
} from "node:fs";
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
14
2
|
import { homedir } from "node:os";
|
|
15
3
|
import { basename, dirname, join } from "node:path";
|
|
16
|
-
import { createInterface } from "node:readline";
|
|
17
4
|
|
|
18
5
|
/**
|
|
19
6
|
* Claude desktop app session-index access.
|
|
@@ -80,49 +67,6 @@ export interface MirrorPlan {
|
|
|
80
67
|
skippedArchived: number;
|
|
81
68
|
}
|
|
82
69
|
|
|
83
|
-
export type DesktopLifecycleState = "active" | "blocked" | "done";
|
|
84
|
-
|
|
85
|
-
export interface DesktopLifecycleRecord {
|
|
86
|
-
state: DesktopLifecycleState;
|
|
87
|
-
updatedAt: string;
|
|
88
|
-
instanceId: string | null;
|
|
89
|
-
sessionId: string | null;
|
|
90
|
-
reason: string | null;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export type DesktopTidySource = "lifecycle" | "legacy-prefix";
|
|
94
|
-
|
|
95
|
-
export interface DesktopTidyAction {
|
|
96
|
-
entry: DesktopSessionEntry;
|
|
97
|
-
source: DesktopTidySource;
|
|
98
|
-
lifecycle: DesktopLifecycleRecord | null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export type DesktopTidySkipReason =
|
|
102
|
-
| "already_archived"
|
|
103
|
-
| "blocked_title"
|
|
104
|
-
| "lifecycle_active"
|
|
105
|
-
| "lifecycle_blocked"
|
|
106
|
-
| "unmatched";
|
|
107
|
-
|
|
108
|
-
export interface DesktopTidySkip {
|
|
109
|
-
entry: DesktopSessionEntry;
|
|
110
|
-
reason: DesktopTidySkipReason;
|
|
111
|
-
lifecycle: DesktopLifecycleRecord | null;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export interface DesktopTidyPlan {
|
|
115
|
-
actions: DesktopTidyAction[];
|
|
116
|
-
skipped: DesktopTidySkip[];
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export interface DesktopTidyOptions {
|
|
120
|
-
/** Restrict entries to accounts whose UUID starts with one of these prefixes. */
|
|
121
|
-
accounts?: string[];
|
|
122
|
-
/** Accept an unmatched historical `[DONE]` title as a compatibility fallback. */
|
|
123
|
-
includeLegacyPrefix?: boolean;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
70
|
const SESSIONS_DIRNAME = "claude-code-sessions";
|
|
127
71
|
|
|
128
72
|
function isWsl(): boolean {
|
|
@@ -350,178 +294,3 @@ export function applyMirror(plan: MirrorPlan): { copied: number } {
|
|
|
350
294
|
}
|
|
351
295
|
return { copied };
|
|
352
296
|
}
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Read the latest durable lifecycle declaration for every Harnery session.
|
|
356
|
-
*
|
|
357
|
-
* The canonical ledger rotates into `events-*.ndjson` archives. Stream each
|
|
358
|
-
* file rather than loading the whole history into one string, then compare
|
|
359
|
-
* event timestamps because adapter replay may append an older event later.
|
|
360
|
-
* Records are indexed by both session_id and instance_id so a desktop
|
|
361
|
-
* cliSessionId can match either identity shape used by older adapters.
|
|
362
|
-
*/
|
|
363
|
-
export async function readDesktopLifecycleIndex(
|
|
364
|
-
coordRoot: string,
|
|
365
|
-
): Promise<Map<string, DesktopLifecycleRecord>> {
|
|
366
|
-
const coordDir = join(coordRoot, ".harnery");
|
|
367
|
-
const archives = safeReaddir(coordDir)
|
|
368
|
-
.filter((name) => name.startsWith("events-") && name.endsWith(".ndjson"))
|
|
369
|
-
.sort();
|
|
370
|
-
const files = [...archives, "events.ndjson"]
|
|
371
|
-
.map((name) => join(coordDir, name))
|
|
372
|
-
.filter((path) => existsSync(path));
|
|
373
|
-
|
|
374
|
-
const records = new Map<string, DesktopLifecycleRecord>();
|
|
375
|
-
const timestamps = new Map<string, number>();
|
|
376
|
-
|
|
377
|
-
for (const file of files) {
|
|
378
|
-
let lines: ReturnType<typeof createInterface> | null = null;
|
|
379
|
-
try {
|
|
380
|
-
lines = createInterface({
|
|
381
|
-
input: createReadStream(file, { encoding: "utf8" }),
|
|
382
|
-
crlfDelay: Infinity,
|
|
383
|
-
});
|
|
384
|
-
for await (const line of lines) {
|
|
385
|
-
if (!line.trim()) continue;
|
|
386
|
-
let raw: unknown;
|
|
387
|
-
try {
|
|
388
|
-
raw = JSON.parse(line);
|
|
389
|
-
} catch {
|
|
390
|
-
continue;
|
|
391
|
-
}
|
|
392
|
-
if (!raw || typeof raw !== "object") continue;
|
|
393
|
-
const event = raw as Record<string, unknown>;
|
|
394
|
-
if (event.event_type !== "state.task_state" || typeof event.ts !== "string") continue;
|
|
395
|
-
const data = event.data;
|
|
396
|
-
if (!data || typeof data !== "object") continue;
|
|
397
|
-
const state = (data as Record<string, unknown>).state;
|
|
398
|
-
if (state !== "active" && state !== "blocked" && state !== "done") continue;
|
|
399
|
-
|
|
400
|
-
const instanceId = typeof event.instance_id === "string" ? event.instance_id : null;
|
|
401
|
-
const sessionId = typeof event.session_id === "string" ? event.session_id : null;
|
|
402
|
-
const reasonValue = (data as Record<string, unknown>).reason;
|
|
403
|
-
const record: DesktopLifecycleRecord = {
|
|
404
|
-
state,
|
|
405
|
-
updatedAt: event.ts,
|
|
406
|
-
instanceId,
|
|
407
|
-
sessionId,
|
|
408
|
-
reason: typeof reasonValue === "string" && reasonValue.length > 0 ? reasonValue : null,
|
|
409
|
-
};
|
|
410
|
-
const timestamp = Number.isFinite(Date.parse(event.ts)) ? Date.parse(event.ts) : 0;
|
|
411
|
-
for (const key of new Set(
|
|
412
|
-
[sessionId, instanceId].filter((value): value is string => !!value),
|
|
413
|
-
)) {
|
|
414
|
-
const priorTimestamp = timestamps.get(key);
|
|
415
|
-
if (priorTimestamp !== undefined && priorTimestamp > timestamp) continue;
|
|
416
|
-
timestamps.set(key, timestamp);
|
|
417
|
-
records.set(key, record);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
} catch {
|
|
421
|
-
// A missing or concurrently rotated event file cannot make tidy unsafe:
|
|
422
|
-
// absent lifecycle evidence leaves entries unmatched and therefore skipped.
|
|
423
|
-
} finally {
|
|
424
|
-
lines?.close();
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
return records;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/** Select desktop entries whose durable lifecycle is done. */
|
|
432
|
-
export function planTidy(
|
|
433
|
-
accounts: DesktopAccount[],
|
|
434
|
-
lifecycleBySession: ReadonlyMap<string, DesktopLifecycleRecord>,
|
|
435
|
-
opts: DesktopTidyOptions = {},
|
|
436
|
-
): DesktopTidyPlan {
|
|
437
|
-
const selectedAccounts = accounts.filter(
|
|
438
|
-
(account) =>
|
|
439
|
-
!opts.accounts?.length ||
|
|
440
|
-
opts.accounts.some((prefix) => account.accountUuid.startsWith(prefix)),
|
|
441
|
-
);
|
|
442
|
-
const actions: DesktopTidyAction[] = [];
|
|
443
|
-
const skipped: DesktopTidySkip[] = [];
|
|
444
|
-
|
|
445
|
-
for (const account of selectedAccounts) {
|
|
446
|
-
for (const entry of account.entries) {
|
|
447
|
-
const lifecycle = lifecycleForEntry(entry, lifecycleBySession);
|
|
448
|
-
if (entry.isArchived) {
|
|
449
|
-
skipped.push({ entry, reason: "already_archived", lifecycle });
|
|
450
|
-
continue;
|
|
451
|
-
}
|
|
452
|
-
if (hasLifecyclePrefix(entry.title, "BLOCKED")) {
|
|
453
|
-
skipped.push({ entry, reason: "blocked_title", lifecycle });
|
|
454
|
-
continue;
|
|
455
|
-
}
|
|
456
|
-
if (lifecycle) {
|
|
457
|
-
if (lifecycle.state === "done") {
|
|
458
|
-
actions.push({ entry, source: "lifecycle", lifecycle });
|
|
459
|
-
} else {
|
|
460
|
-
skipped.push({ entry, reason: `lifecycle_${lifecycle.state}`, lifecycle });
|
|
461
|
-
}
|
|
462
|
-
continue;
|
|
463
|
-
}
|
|
464
|
-
if (opts.includeLegacyPrefix && hasLifecyclePrefix(entry.title, "DONE")) {
|
|
465
|
-
actions.push({ entry, source: "legacy-prefix", lifecycle: null });
|
|
466
|
-
} else {
|
|
467
|
-
skipped.push({ entry, reason: "unmatched", lifecycle: null });
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
return { actions, skipped };
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
/** Apply a tidy plan with same-directory temp files and atomic renames. */
|
|
476
|
-
export function applyTidy(plan: DesktopTidyPlan): { archived: number; alreadyArchived: number } {
|
|
477
|
-
let archived = 0;
|
|
478
|
-
let alreadyArchived = 0;
|
|
479
|
-
for (const action of plan.actions) {
|
|
480
|
-
if (archiveEntry(action.entry.file)) archived++;
|
|
481
|
-
else alreadyArchived++;
|
|
482
|
-
}
|
|
483
|
-
return { archived, alreadyArchived };
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
function lifecycleForEntry(
|
|
487
|
-
entry: DesktopSessionEntry,
|
|
488
|
-
lifecycleBySession: ReadonlyMap<string, DesktopLifecycleRecord>,
|
|
489
|
-
): DesktopLifecycleRecord | null {
|
|
490
|
-
if (entry.cliSessionId) {
|
|
491
|
-
const lifecycle = lifecycleBySession.get(entry.cliSessionId);
|
|
492
|
-
if (lifecycle) return lifecycle;
|
|
493
|
-
}
|
|
494
|
-
return entry.sessionId ? (lifecycleBySession.get(entry.sessionId) ?? null) : null;
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
function hasLifecyclePrefix(title: string | null, state: "BLOCKED" | "DONE"): boolean {
|
|
498
|
-
if (!title) return false;
|
|
499
|
-
return new RegExp(`^\\s*\\[${state}\\](?:\\s*-|\\s|$)`, "i").test(title);
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
function archiveEntry(file: string): boolean {
|
|
503
|
-
const text = readFileSync(file, "utf8");
|
|
504
|
-
const raw = JSON.parse(text) as unknown;
|
|
505
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
506
|
-
throw new Error(`desktop entry is not a JSON object: ${file}`);
|
|
507
|
-
}
|
|
508
|
-
const entry = raw as Record<string, unknown>;
|
|
509
|
-
if (entry.isArchived === true) return false;
|
|
510
|
-
entry.isArchived = true;
|
|
511
|
-
|
|
512
|
-
const pretty = text.includes("\n");
|
|
513
|
-
const trailingNewline = text.endsWith("\n") ? "\n" : "";
|
|
514
|
-
const next = `${JSON.stringify(entry, null, pretty ? 2 : undefined)}${trailingNewline}`;
|
|
515
|
-
const temp = join(dirname(file), `.${basename(file)}.${process.pid}.${randomUUID()}.tmp`);
|
|
516
|
-
try {
|
|
517
|
-
writeFileSync(temp, next, { encoding: "utf8", mode: statSync(file).mode });
|
|
518
|
-
renameSync(temp, file);
|
|
519
|
-
} finally {
|
|
520
|
-
try {
|
|
521
|
-
unlinkSync(temp);
|
|
522
|
-
} catch {
|
|
523
|
-
// rename already consumed the temp file, or creation failed before it existed
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
return true;
|
|
527
|
-
}
|
package/src/lib/context/index.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { existsSync
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
|
+
import { monorepoRoot, resolveOwner } from "../../core/agents/index.ts";
|
|
3
4
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
resolveOwner,
|
|
8
|
-
} from "../../core/agents/index.ts";
|
|
5
|
+
readLiveCoordinationRow,
|
|
6
|
+
readLiveCoordinationRows,
|
|
7
|
+
} from "../../core/agents/state/live-coordination-view.ts";
|
|
9
8
|
import { exec } from "../exec.ts";
|
|
10
9
|
import { NO_DATA } from "../format.ts";
|
|
11
10
|
|
|
@@ -78,8 +77,6 @@ export interface SelfSection {
|
|
|
78
77
|
instance_id: string;
|
|
79
78
|
session_age_secs: number;
|
|
80
79
|
task: string | null;
|
|
81
|
-
last_tool: string | null;
|
|
82
|
-
last_tool_target: string | null;
|
|
83
80
|
files_held: string[];
|
|
84
81
|
}
|
|
85
82
|
|
|
@@ -113,7 +110,6 @@ export interface PeersSection {
|
|
|
113
110
|
instance_id_short: string;
|
|
114
111
|
age_min: number;
|
|
115
112
|
files: number;
|
|
116
|
-
last_tool: string | null;
|
|
117
113
|
task: string | null;
|
|
118
114
|
}[];
|
|
119
115
|
}
|
|
@@ -155,19 +151,14 @@ export async function buildContext(opts: ContextOptions = {}): Promise<ContextRe
|
|
|
155
151
|
function buildSelf(): SelfSection {
|
|
156
152
|
const owner = resolveOwner();
|
|
157
153
|
if (!owner) throw new Error("not in an agent session (no pid-map entry)");
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
// heartbeat no reader ever resolves — so the session still looks unhealable
|
|
163
|
-
// and now has a junk file shadowing it. Same rule as `noHeartbeatMessage` in
|
|
164
|
-
// the agents command.
|
|
154
|
+
const root = monorepoRoot();
|
|
155
|
+
const hb = root ? readLiveCoordinationRow(root, owner) : null;
|
|
156
|
+
// Full id, never abbreviated: command surfaces pass this identity back to
|
|
157
|
+
// the authority-safe V3 coordination projection.
|
|
165
158
|
if (!hb) {
|
|
166
|
-
throw new Error(
|
|
167
|
-
`pid-map resolved owner=${owner} but no heartbeat exists at .harnery/active/${owner}.json`,
|
|
168
|
-
);
|
|
159
|
+
throw new Error(`pid-map resolved owner=${owner} but no live V3 generation exists for it`);
|
|
169
160
|
}
|
|
170
|
-
const startedMs = Date.parse(hb.started_at);
|
|
161
|
+
const startedMs = Date.parse(hb.started_at ?? "");
|
|
171
162
|
const ageSecs = Number.isFinite(startedMs)
|
|
172
163
|
? Math.max(0, Math.floor((Date.now() - startedMs) / 1000))
|
|
173
164
|
: 0;
|
|
@@ -176,8 +167,6 @@ function buildSelf(): SelfSection {
|
|
|
176
167
|
instance_id: hb.instance_id,
|
|
177
168
|
session_age_secs: ageSecs,
|
|
178
169
|
task: hb.task ?? null,
|
|
179
|
-
last_tool: hb.last_tool ?? null,
|
|
180
|
-
last_tool_target: hb.last_tool_target ?? null,
|
|
181
170
|
files_held: hb.files_touched ?? [],
|
|
182
171
|
};
|
|
183
172
|
}
|
|
@@ -296,32 +285,19 @@ async function statusFor(name: string, cwd: string): Promise<SubmoduleStatus> {
|
|
|
296
285
|
function buildPeers(): PeersSection {
|
|
297
286
|
const root = monorepoRoot();
|
|
298
287
|
if (!root) throw new Error("coord_root() returned null");
|
|
299
|
-
const activeDir = resolve(root, ".harnery", "active");
|
|
300
|
-
if (!existsSync(activeDir)) return { rows: [] };
|
|
301
288
|
const myOwner = resolveOwner();
|
|
302
|
-
// No freshness filter; matches the SessionStart/UserPromptSubmit snapshot.
|
|
303
|
-
// Stale entries get swept by the SessionStart janitor on the next session start.
|
|
304
289
|
const rows: PeersSection["rows"] = [];
|
|
305
|
-
for (const
|
|
306
|
-
if (
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
instance_id_short: hb.instance_id.slice(0, 8),
|
|
317
|
-
age_min: ageMin,
|
|
318
|
-
files: hb.files_touched?.length ?? 0,
|
|
319
|
-
last_tool: hb.last_tool ?? null,
|
|
320
|
-
task: hb.task ?? null,
|
|
321
|
-
});
|
|
322
|
-
} catch {
|
|
323
|
-
// skip
|
|
324
|
-
}
|
|
290
|
+
for (const row of readLiveCoordinationRows(root)) {
|
|
291
|
+
if (row.instance_id === myOwner || row.kind === "transient") continue;
|
|
292
|
+
const startedMs = Date.parse(row.started_at ?? row.last_heartbeat);
|
|
293
|
+
const ageMin = Number.isFinite(startedMs) ? Math.floor((Date.now() - startedMs) / 60000) : 0;
|
|
294
|
+
rows.push({
|
|
295
|
+
name: row.name ?? "unknown",
|
|
296
|
+
instance_id_short: row.instance_id.slice(0, 8),
|
|
297
|
+
age_min: ageMin,
|
|
298
|
+
files: row.files_touched.length,
|
|
299
|
+
task: row.task ?? null,
|
|
300
|
+
});
|
|
325
301
|
}
|
|
326
302
|
// Sort: file-holders first (more activity), then by recency (younger age first).
|
|
327
303
|
rows.sort((a, b) => b.files - a.files || a.age_min - b.age_min);
|
package/src/lib/council/index.ts
CHANGED
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
import { basename, resolve } from "node:path";
|
|
20
20
|
|
|
21
21
|
import { monorepoRoot } from "../../core/agents/index.ts";
|
|
22
|
+
import { readLiveCoordinationRows } from "../../core/agents/state/live-coordination-view.ts";
|
|
22
23
|
import { resolveBinName } from "../../core/config.ts";
|
|
23
24
|
import { ensureIdentity, lookupById as lookupIdentityById } from "../identities/index.js";
|
|
24
25
|
|
|
@@ -241,7 +242,7 @@ export function setCouncilSteward(councilId: string, steward: string | null): Co
|
|
|
241
242
|
export interface KnownAgent {
|
|
242
243
|
/** `agent-<Name>` canonical handle. */
|
|
243
244
|
name: string;
|
|
244
|
-
/** `active` = currently has
|
|
245
|
+
/** `active` = currently has an authority-eligible V3 generation. `stale` =
|
|
245
246
|
* recently ended (journal archived within the lookback window). */
|
|
246
247
|
state: "active" | "stale";
|
|
247
248
|
/** ISO timestamp of the most-recent signal. */
|
|
@@ -253,35 +254,22 @@ export interface KnownAgent {
|
|
|
253
254
|
const KNOWN_AGENT_STALE_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
|
|
254
255
|
|
|
255
256
|
/**
|
|
256
|
-
* Active
|
|
257
|
+
* Active V3 generations + recently-archived journals, deduped by name.
|
|
257
258
|
* Used by `agents council set-steward` to refuse arbitrary names;
|
|
258
259
|
* pass `--allow-unknown` to bypass when bootstrapping a new agent.
|
|
259
260
|
*/
|
|
260
261
|
export function listKnownAgents(): KnownAgent[] {
|
|
261
262
|
const root = monorepoRoot();
|
|
262
263
|
if (!root) return [];
|
|
263
|
-
const activeDir = resolve(root, ".harnery", "active");
|
|
264
264
|
const archiveDir = resolve(root, ".harnery", "journal", "archived");
|
|
265
265
|
const byName = new Map<string, KnownAgent>();
|
|
266
266
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
last_heartbeat?: string;
|
|
274
|
-
};
|
|
275
|
-
if (!hb.name) continue;
|
|
276
|
-
const name = hb.name.startsWith("agent-") ? hb.name : `agent-${hb.name}`;
|
|
277
|
-
const last_seen = hb.last_heartbeat ?? new Date().toISOString();
|
|
278
|
-
const existing = byName.get(name);
|
|
279
|
-
if (existing?.state !== "active") {
|
|
280
|
-
byName.set(name, { name, state: "active", last_seen });
|
|
281
|
-
}
|
|
282
|
-
} catch {
|
|
283
|
-
/* skip unreadable */
|
|
284
|
-
}
|
|
267
|
+
for (const row of readLiveCoordinationRows(root)) {
|
|
268
|
+
if (!row.name) continue;
|
|
269
|
+
const name = row.name.startsWith("agent-") ? row.name : `agent-${row.name}`;
|
|
270
|
+
const existing = byName.get(name);
|
|
271
|
+
if (existing?.state !== "active") {
|
|
272
|
+
byName.set(name, { name, state: "active", last_seen: row.last_heartbeat });
|
|
285
273
|
}
|
|
286
274
|
}
|
|
287
275
|
|