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,138 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdtempSync, readdirSync, rmSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { homedir, tmpdir } from "node:os";
|
|
4
|
+
import { basename, join } from "node:path";
|
|
5
|
+
import { normalizeNativeIdV3 } from "../events/v3/canonical.ts";
|
|
6
|
+
import { readEventV3ControlState } from "../events/v3/control.ts";
|
|
7
|
+
import { fingerprintContextV3 } from "../events/v3/fingerprint-keys.ts";
|
|
8
|
+
import { listHookProducerStateRecordsV3 } from "../events/v3/producers/recorder.ts";
|
|
9
|
+
import type { SessionArchiveObservationV3 } from "./session-finalizer-v3.ts";
|
|
10
|
+
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
|
|
13
|
+
type SqliteDatabase = {
|
|
14
|
+
query: (sql: string) => { all: () => unknown[] };
|
|
15
|
+
close: () => void;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** bun:sqlite is Bun-only. The web dashboard runs under Node and must be able
|
|
19
|
+
* to import this module without crashing; a missing engine returns no rows. */
|
|
20
|
+
function openReadonlyDatabase(path: string): SqliteDatabase | null {
|
|
21
|
+
try {
|
|
22
|
+
const { Database } = require("bun:sqlite") as {
|
|
23
|
+
Database: new (
|
|
24
|
+
filename: string,
|
|
25
|
+
options?: { readonly?: boolean; strict?: boolean },
|
|
26
|
+
) => SqliteDatabase;
|
|
27
|
+
};
|
|
28
|
+
return new Database(path, { readonly: true, strict: true });
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface CodexArchiveScanResultV3 {
|
|
35
|
+
observations: SessionArchiveObservationV3[];
|
|
36
|
+
diagnostics: string[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Read only Codex's durable lifecycle columns. Conversation content, titles,
|
|
41
|
+
* working directories, and model metadata never leave the adapter database.
|
|
42
|
+
*/
|
|
43
|
+
export function readCodexArchiveObservationsV3(
|
|
44
|
+
coordRoot: string,
|
|
45
|
+
options: { databasePath?: string; observedAt?: string } = {},
|
|
46
|
+
): CodexArchiveScanResultV3 {
|
|
47
|
+
const diagnostics: string[] = [];
|
|
48
|
+
const databasePath = options.databasePath ?? locateCodexStateDatabase();
|
|
49
|
+
if (!databasePath) return { observations: [], diagnostics: ["codex_state_database_missing"] };
|
|
50
|
+
const control = readEventV3ControlState(coordRoot);
|
|
51
|
+
if (control.state !== "candidate" && control.state !== "active") {
|
|
52
|
+
return { observations: [], diagnostics: ["event_v3_control_unavailable"] };
|
|
53
|
+
}
|
|
54
|
+
const context = fingerprintContextV3(
|
|
55
|
+
coordRoot,
|
|
56
|
+
control.genesis.event.scope.root_id as `root_${string}`,
|
|
57
|
+
undefined,
|
|
58
|
+
control.genesis.profile.privacy_key_epoch,
|
|
59
|
+
);
|
|
60
|
+
const liveCodexStateIds = new Set(
|
|
61
|
+
listHookProducerStateRecordsV3(coordRoot)
|
|
62
|
+
.filter(({ state }) => state.adapter === "codex")
|
|
63
|
+
.map(({ path }) => basename(path, ".json")),
|
|
64
|
+
);
|
|
65
|
+
const snapshotDir = mkdtempSync(join(tmpdir(), "harnery-codex-state-"));
|
|
66
|
+
const snapshotPath = join(snapshotDir, basename(databasePath));
|
|
67
|
+
try {
|
|
68
|
+
copyFileSync(databasePath, snapshotPath);
|
|
69
|
+
for (const suffix of ["-wal", "-shm"]) {
|
|
70
|
+
const source = `${databasePath}${suffix}`;
|
|
71
|
+
if (existsSync(source)) copyFileSync(source, `${snapshotPath}${suffix}`);
|
|
72
|
+
}
|
|
73
|
+
const db = openReadonlyDatabase(snapshotPath);
|
|
74
|
+
if (!db) {
|
|
75
|
+
diagnostics.push("codex_archive_sqlite_unavailable");
|
|
76
|
+
return { observations: [], diagnostics };
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const rows = db
|
|
80
|
+
.query("SELECT id, archived, archived_at, updated_at_ms FROM threads")
|
|
81
|
+
.all() as Array<{
|
|
82
|
+
id: string;
|
|
83
|
+
archived: number;
|
|
84
|
+
archived_at: number | null;
|
|
85
|
+
updated_at_ms: number;
|
|
86
|
+
}>;
|
|
87
|
+
return {
|
|
88
|
+
observations: rows
|
|
89
|
+
.filter((row) =>
|
|
90
|
+
liveCodexStateIds.has(normalizeNativeIdV3(context, "codex.session", row.id)),
|
|
91
|
+
)
|
|
92
|
+
.map((row) => ({
|
|
93
|
+
adapter: "codex" as const,
|
|
94
|
+
native_session_id: row.id,
|
|
95
|
+
archived: row.archived === 1,
|
|
96
|
+
observed_at:
|
|
97
|
+
epochToIso(row.archived_at) ??
|
|
98
|
+
epochToIso(row.updated_at_ms) ??
|
|
99
|
+
options.observedAt ??
|
|
100
|
+
new Date().toISOString(),
|
|
101
|
+
})),
|
|
102
|
+
diagnostics,
|
|
103
|
+
};
|
|
104
|
+
} finally {
|
|
105
|
+
db.close();
|
|
106
|
+
}
|
|
107
|
+
} catch (error) {
|
|
108
|
+
diagnostics.push(`codex_archive_scan_failed:${(error as Error).message}`);
|
|
109
|
+
return { observations: [], diagnostics };
|
|
110
|
+
} finally {
|
|
111
|
+
rmSync(snapshotDir, { recursive: true, force: true });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function locateCodexStateDatabase(): string | null {
|
|
116
|
+
const explicit = process.env.HARNERY_CODEX_STATE_DB?.trim();
|
|
117
|
+
if (explicit && existsSync(explicit)) return explicit;
|
|
118
|
+
for (const candidate of [
|
|
119
|
+
join(homedir(), ".codex", "state_5.sqlite"),
|
|
120
|
+
join(homedir(), ".codex", "sqlite", "state_5.sqlite"),
|
|
121
|
+
]) {
|
|
122
|
+
if (existsSync(candidate)) return candidate;
|
|
123
|
+
}
|
|
124
|
+
const usersRoot = "/mnt/c/Users";
|
|
125
|
+
if (!existsSync(usersRoot)) return null;
|
|
126
|
+
for (const user of readdirSync(usersRoot).sort()) {
|
|
127
|
+
const candidate = join(usersRoot, user, ".codex", "state_5.sqlite");
|
|
128
|
+
if (existsSync(candidate)) return candidate;
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function epochToIso(value: number | null): string | null {
|
|
134
|
+
if (value === null || !Number.isFinite(value) || value <= 0) return null;
|
|
135
|
+
const milliseconds = value < 10_000_000_000 ? value * 1_000 : value;
|
|
136
|
+
const date = new Date(milliseconds);
|
|
137
|
+
return Number.isNaN(date.getTime()) ? null : date.toISOString();
|
|
138
|
+
}
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
import { spawnSync } from "node:child_process";
|
|
11
11
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
12
12
|
import { dirname, join, resolve, sep } from "node:path";
|
|
13
|
+
import {
|
|
14
|
+
listHookProducerStateRecordsV3,
|
|
15
|
+
readHookProducerStateV3,
|
|
16
|
+
} from "../events/v3/producers/recorder.ts";
|
|
13
17
|
|
|
14
18
|
// NOTE: kept dependency-free (node builtins only); this file is vendored verbatim into
|
|
15
19
|
// a downstream consumer, so it cannot import the coordEnv helper.
|
|
@@ -56,48 +60,6 @@ export function resolveContainedFile(directory: string, fileName: string): strin
|
|
|
56
60
|
return candidate;
|
|
57
61
|
}
|
|
58
62
|
|
|
59
|
-
export interface Heartbeat {
|
|
60
|
-
instance_id: string;
|
|
61
|
-
name?: string;
|
|
62
|
-
kind?: string;
|
|
63
|
-
session_id: string;
|
|
64
|
-
agent_id: string;
|
|
65
|
-
model: string;
|
|
66
|
-
started_at: string;
|
|
67
|
-
last_heartbeat: string;
|
|
68
|
-
files_touched: string[];
|
|
69
|
-
agent_type?: string;
|
|
70
|
-
/** Most recent tool name stamped by the PostToolUse hook. Phase 1. */
|
|
71
|
-
last_tool?: string;
|
|
72
|
-
/** Short string identifying what the last tool acted on (file path, command head, URL). Phase 1. */
|
|
73
|
-
last_tool_target?: string;
|
|
74
|
-
/** Free-form task/intent string set via `harn agents set-task`. Phase 2. */
|
|
75
|
-
task?: string;
|
|
76
|
-
/** UTC ISO-8601 timestamp when task was last set/cleared. Used by adapters without Stop enforcement to compute staleness. 2026-05-24. */
|
|
77
|
-
task_updated_at?: string | null;
|
|
78
|
-
/** Current evidence-derived activity axis. */
|
|
79
|
-
activity?: "unknown" | "working" | "needs_input" | "idle";
|
|
80
|
-
activity_updated_at?: string;
|
|
81
|
-
activity_source?: string;
|
|
82
|
-
/** Explicit task lifecycle axis. */
|
|
83
|
-
task_state?: "active" | "blocked" | "done";
|
|
84
|
-
task_state_updated_at?: string;
|
|
85
|
-
task_state_reason?: string;
|
|
86
|
-
/** Session name built on the first non-empty set-task; its presence means "this session has been named". 2026-08-09. */
|
|
87
|
-
suggested_session_name?: string;
|
|
88
|
-
/** Stamped by turn.stop once the suggested name is seen in assistant reply text. 2026-08-09. */
|
|
89
|
-
session_name_seen_at?: string;
|
|
90
|
-
/** Which suggested name the latest sighting covered. */
|
|
91
|
-
session_name_seen_for?: string;
|
|
92
|
-
/** Auto-generated per-turn summary written by the Stop hook via Haiku. 2026-05-23. */
|
|
93
|
-
turn_summary?: string | null;
|
|
94
|
-
/** UTC ISO-8601 timestamp when turn_summary was last refreshed. */
|
|
95
|
-
turn_summary_updated_at?: string | null;
|
|
96
|
-
/** Hook client: `claude-code` (default) or `cursor`. Cursor Phase 1. */
|
|
97
|
-
platform?: string;
|
|
98
|
-
workflow_run_id?: string;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
63
|
/**
|
|
102
64
|
* Resolve the monorepo root for coord-state purposes.
|
|
103
65
|
*
|
|
@@ -112,8 +74,8 @@ export function monorepoRoot(): string | null {
|
|
|
112
74
|
* THE coordination-root resolution. Every surface — the hooks, the CLI's reads,
|
|
113
75
|
* and the CLI's canonical emits — resolves through this one function, because a
|
|
114
76
|
* root the two layers disagree about is a root that silently breaks the
|
|
115
|
-
* end-of-turn rules: the hook evaluates `
|
|
116
|
-
* it reads, so an emit into a different
|
|
77
|
+
* end-of-turn rules: the hook evaluates `coord.status_observed` from the stream
|
|
78
|
+
* it reads, so an emit into a different V3 ledger root is invisible
|
|
117
79
|
* and rule 1/3 blocks a turn that did run `agents status`, with no sequence of
|
|
118
80
|
* CLI commands able to satisfy it.
|
|
119
81
|
*
|
|
@@ -168,7 +130,7 @@ export function resolveCoordRoot(start: string = process.cwd()): string | null {
|
|
|
168
130
|
if (ancestors.length > 0) return ancestors[0] as string;
|
|
169
131
|
if (gitRoots.length > 0) return gitRoots[0] as string;
|
|
170
132
|
// Nothing carries `.harnery/` yet. Hand back the enclosing checkout so a
|
|
171
|
-
// first run (`harn init`, agent-hook's session.
|
|
133
|
+
// first run (`harn init`, agent-hook's session.started) has somewhere to
|
|
172
134
|
// create it.
|
|
173
135
|
return gitToplevel(start);
|
|
174
136
|
}
|
|
@@ -195,7 +157,7 @@ function ancestorCoordRoots(start: string): string[] {
|
|
|
195
157
|
* Does this root's `.harnery/` already know the process asking?
|
|
196
158
|
*
|
|
197
159
|
* Two discriminators, both genuinely about *this* session: the adapter-exported
|
|
198
|
-
* session id matching
|
|
160
|
+
* session id matching live V3 producer state, and a pid-map row on our own ppid
|
|
199
161
|
* chain. Deliberately NOT the single-live-agent fallback that owner resolution
|
|
200
162
|
* ends with — a lone stranger in the wrong root is exactly how `whoami` came to
|
|
201
163
|
* report another agent's name and task as its own.
|
|
@@ -244,7 +206,7 @@ function gitToplevel(start: string): string | null {
|
|
|
244
206
|
}
|
|
245
207
|
|
|
246
208
|
function gitRevParse(cwd: string, flag: string): string | null {
|
|
247
|
-
const key = `${cwd}
|
|
209
|
+
const key = `${cwd}\0${flag}`;
|
|
248
210
|
const cached = gitRevParseCache.get(key);
|
|
249
211
|
if (cached !== undefined) return cached;
|
|
250
212
|
let value: string | null = null;
|
|
@@ -404,22 +366,20 @@ export function resolveOwnerWithSource(): {
|
|
|
404
366
|
owner: string | null;
|
|
405
367
|
source: "env" | "pidmap" | "pidmap_fallback" | "session_env" | "active_singleton" | "none";
|
|
406
368
|
} {
|
|
369
|
+
const bridge = process.env.HARNERY_AGENT_COORD_BRIDGE?.trim();
|
|
407
370
|
const envOwner = process.env.HARNERY_AGENT_COORD_OWNER?.trim();
|
|
408
|
-
|
|
371
|
+
// A bridge-marked child must prove identity through a live V3 producer. An
|
|
372
|
+
// inherited owner override is only a string, so trusting it here would let a
|
|
373
|
+
// stale or foreign environment bypass the bridge's fail-closed contract.
|
|
374
|
+
if (envOwner && !bridge) {
|
|
409
375
|
return { owner: envOwner, source: "env" };
|
|
410
376
|
}
|
|
411
377
|
|
|
412
378
|
const root = monorepoRoot();
|
|
413
379
|
if (!root) return { owner: null, source: "none" };
|
|
414
380
|
|
|
415
|
-
// Every supported adapter exports its session id into
|
|
416
|
-
//
|
|
417
|
-
// session id it was minted under. Matching the two names us outright, even
|
|
418
|
-
// with many live agents, so it goes ahead of the ppid walk rather than
|
|
419
|
-
// catching what the walk drops. Cursor needed this first because its
|
|
420
|
-
// Glass/Agents UI runs several chats under one node ancestor, making that row
|
|
421
|
-
// last-writer-wins; pid recycling generalises the same hazard to every
|
|
422
|
-
// adapter.
|
|
381
|
+
// Every supported adapter exports its native session id into subprocesses.
|
|
382
|
+
// Match it against the live V3 producer state, never a disposable cache.
|
|
423
383
|
if (shouldPreferSessionEnv()) {
|
|
424
384
|
const bySession = resolveOwnerBySessionEnv(root);
|
|
425
385
|
if (bySession) {
|
|
@@ -427,12 +387,17 @@ export function resolveOwnerWithSource(): {
|
|
|
427
387
|
}
|
|
428
388
|
}
|
|
429
389
|
|
|
390
|
+
// Connector children cross process-tree boundaries where pid ancestry is
|
|
391
|
+
// not logical session identity. Once marked, a missing V3 generation is
|
|
392
|
+
// terminal: never guess through pid-map or singleton fallback.
|
|
393
|
+
if (bridge) return { owner: null, source: "none" };
|
|
394
|
+
|
|
430
395
|
if (!existsSync(resolve(root, ".harnery", "pid-map"))) return { owner: null, source: "none" };
|
|
431
396
|
|
|
432
397
|
const byPidmap = resolveOwnerByPidmap(root);
|
|
433
398
|
if (byPidmap.owner) return byPidmap;
|
|
434
399
|
|
|
435
|
-
// Last resort: if exactly one
|
|
400
|
+
// Last resort: if exactly one V3 generation is live in this coord root, it's
|
|
436
401
|
// unambiguously us — resolve to it. This is what lets the bare `agents
|
|
437
402
|
// status` / `set-task` the stop hook recommends work without a `--session-id`
|
|
438
403
|
// flag in the common single-agent case. With 0 or 2+ live agents it would be
|
|
@@ -501,6 +466,18 @@ const SESSION_ID_ENV_VARS = [
|
|
|
501
466
|
] as const;
|
|
502
467
|
|
|
503
468
|
/** Read normalized candidates from the first non-empty adapter session-id env var. */
|
|
469
|
+
/**
|
|
470
|
+
* First adapter/bridge-stamped session id from the environment, WITHOUT the
|
|
471
|
+
* live-heartbeat validation resolveOwnerBySessionEnv applies. A fresh session
|
|
472
|
+
* has no heartbeat until its first set-task, so heartbeat-validated resolution
|
|
473
|
+
* returns null there by design; commands that REGISTER a session (set-task)
|
|
474
|
+
* may use this id directly — it carries the same trust as an explicit
|
|
475
|
+
* `--session-id` argument, because the adapter or connector stamped it.
|
|
476
|
+
*/
|
|
477
|
+
export function sessionIdentityFromEnv(): string | null {
|
|
478
|
+
return sessionIdsFromEnv()[0] ?? null;
|
|
479
|
+
}
|
|
480
|
+
|
|
504
481
|
function sessionIdsFromEnv(): string[] {
|
|
505
482
|
for (const key of SESSION_ID_ENV_VARS) {
|
|
506
483
|
const v = process.env[key]?.trim();
|
|
@@ -531,7 +508,7 @@ function sessionIdFromEnv(): string | null {
|
|
|
531
508
|
* agent's name and file list.
|
|
532
509
|
*
|
|
533
510
|
* This only reorders the two. Session-env resolution still requires a live
|
|
534
|
-
*
|
|
511
|
+
* V3 producer carrying that session id, so when it does not match, the walk runs
|
|
535
512
|
* exactly as before.
|
|
536
513
|
*/
|
|
537
514
|
function shouldPreferSessionEnv(): boolean {
|
|
@@ -539,160 +516,70 @@ function shouldPreferSessionEnv(): boolean {
|
|
|
539
516
|
}
|
|
540
517
|
|
|
541
518
|
/**
|
|
542
|
-
* Resolve the owner by
|
|
543
|
-
*
|
|
544
|
-
*
|
|
545
|
-
*
|
|
546
|
-
* fallback applies, so a stale heartbeat from a prior session of the same id
|
|
547
|
-
* doesn't resolve. When legacy Cursor Glass state contains both the canonical
|
|
548
|
-
* bare id and its raw `bc-` alias, candidate order wins first; ties prefer a
|
|
549
|
-
* named heartbeat, then the newest heartbeat, with instance id as a stable
|
|
550
|
-
* final tie-breaker. Filesystem enumeration order never decides identity.
|
|
519
|
+
* Resolve the owner by joining adapter session environment to the live V3
|
|
520
|
+
* hook-producer state. A missing, terminal, or ambiguous generation fails
|
|
521
|
+
* closed. The disposable cache is consulted only to recover the native
|
|
522
|
+
* instance label bound to an already-authoritative canonical instance.
|
|
551
523
|
*
|
|
552
524
|
* Exported for unit testing with an injectable root.
|
|
553
525
|
*/
|
|
554
526
|
export function resolveOwnerBySessionEnv(root: string): string | null {
|
|
555
527
|
const sessionIds = sessionIdsFromEnv();
|
|
556
528
|
if (sessionIds.length === 0) return null;
|
|
557
|
-
|
|
558
|
-
const
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
try {
|
|
564
|
-
files = readdirSync(activeDir);
|
|
565
|
-
} catch {
|
|
566
|
-
return null;
|
|
567
|
-
}
|
|
568
|
-
const matches: Array<{
|
|
569
|
-
instanceId: string;
|
|
570
|
-
sessionPreference: number;
|
|
571
|
-
hasName: boolean;
|
|
572
|
-
lastHeartbeatMs: number;
|
|
573
|
-
}> = [];
|
|
574
|
-
for (const file of files) {
|
|
575
|
-
if (!file.endsWith(".json")) continue;
|
|
576
|
-
try {
|
|
577
|
-
const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8"));
|
|
578
|
-
if (!parsed) continue;
|
|
579
|
-
const sessionPreference = sessionIds.indexOf(parsed.session_id);
|
|
580
|
-
if (sessionPreference === -1) continue;
|
|
581
|
-
if (typeof parsed.instance_id !== "string") continue;
|
|
582
|
-
const ts = Date.parse(parsed.last_heartbeat);
|
|
583
|
-
if (!Number.isFinite(ts) || ts < cutoffMs) continue;
|
|
584
|
-
matches.push({
|
|
585
|
-
instanceId: parsed.instance_id,
|
|
586
|
-
sessionPreference,
|
|
587
|
-
hasName: typeof parsed.name === "string" && parsed.name.trim().length > 0,
|
|
588
|
-
lastHeartbeatMs: ts,
|
|
589
|
-
});
|
|
590
|
-
} catch {
|
|
591
|
-
// skip malformed
|
|
529
|
+
const adapters = adapterCandidatesFromEnv();
|
|
530
|
+
const matches = new Set<string>();
|
|
531
|
+
for (const sessionId of sessionIds) {
|
|
532
|
+
for (const adapter of adapters) {
|
|
533
|
+
const state = readHookProducerStateV3(root, adapter, sessionId);
|
|
534
|
+
if (state && !state.terminal) matches.add(nativeOwnerForV3Instance(root, state.instance_id));
|
|
592
535
|
}
|
|
593
536
|
}
|
|
594
|
-
matches.
|
|
595
|
-
(a, b) =>
|
|
596
|
-
a.sessionPreference - b.sessionPreference ||
|
|
597
|
-
Number(b.hasName) - Number(a.hasName) ||
|
|
598
|
-
b.lastHeartbeatMs - a.lastHeartbeatMs ||
|
|
599
|
-
a.instanceId.localeCompare(b.instanceId),
|
|
600
|
-
);
|
|
601
|
-
return matches[0]?.instanceId ?? null;
|
|
537
|
+
return matches.size === 1 ? [...matches][0]! : null;
|
|
602
538
|
}
|
|
603
539
|
|
|
604
540
|
/**
|
|
605
|
-
* Return the
|
|
606
|
-
* if there are zero or more than one.
|
|
607
|
-
* freshness window the rest of the agents surface applies (kept inline as a
|
|
608
|
-
* literal so this file stays node-builtins-only for vendored downstream use).
|
|
541
|
+
* Return the native instance label of the sole live V3 generation in this
|
|
542
|
+
* coord root, or null if there are zero or more than one.
|
|
609
543
|
*
|
|
610
544
|
* Exported for unit testing with an injectable root (the caller in
|
|
611
545
|
* `resolveOwnerWithSource` passes `monorepoRoot()`).
|
|
612
546
|
*/
|
|
613
547
|
export function resolveSingleActiveOwner(root: string): string | null {
|
|
614
|
-
const
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
try {
|
|
621
|
-
files = readdirSync(activeDir);
|
|
622
|
-
} catch {
|
|
623
|
-
return null;
|
|
624
|
-
}
|
|
625
|
-
for (const file of files) {
|
|
626
|
-
if (!file.endsWith(".json")) continue;
|
|
627
|
-
try {
|
|
628
|
-
const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8"));
|
|
629
|
-
if (!parsed || typeof parsed.instance_id !== "string") continue;
|
|
630
|
-
const ts = Date.parse(parsed.last_heartbeat);
|
|
631
|
-
if (Number.isFinite(ts) && ts >= cutoffMs) live.push(parsed.instance_id);
|
|
632
|
-
} catch {
|
|
633
|
-
// skip malformed
|
|
634
|
-
}
|
|
635
|
-
if (live.length > 1) return null; // ambiguous; bail early
|
|
636
|
-
}
|
|
637
|
-
return live.length === 1 ? live[0]! : null;
|
|
548
|
+
const live = new Set(
|
|
549
|
+
listHookProducerStateRecordsV3(root, { includeTerminal: false }).map(({ state }) =>
|
|
550
|
+
nativeOwnerForV3Instance(root, state.instance_id),
|
|
551
|
+
),
|
|
552
|
+
);
|
|
553
|
+
return live.size === 1 ? [...live][0]! : null;
|
|
638
554
|
}
|
|
639
555
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
* Phase 8 cleanup (2026-05-27): the v1/v2 dual-write bridge is gone; the
|
|
645
|
-
* projector writes additively-merged heartbeats directly to
|
|
646
|
-
* `.harnery/active/<id>.json` (the canonical location every reader expects).
|
|
647
|
-
*/
|
|
648
|
-
export function readHeartbeat(instanceId: string): Heartbeat | null {
|
|
649
|
-
if (!isSafeInstanceId(instanceId)) return null;
|
|
650
|
-
const root = monorepoRoot();
|
|
651
|
-
if (!root) return null;
|
|
652
|
-
const path = resolveContainedFile(resolve(root, ".harnery", "active"), `${instanceId}.json`);
|
|
653
|
-
return readJsonHeartbeatFile(path);
|
|
556
|
+
function adapterCandidatesFromEnv(): Array<"claude-code" | "codex" | "cursor"> {
|
|
557
|
+
const value = process.env.HARNERY_AGENT_COORD_PLATFORM?.trim();
|
|
558
|
+
if (value === "claude-code" || value === "codex" || value === "cursor") return [value];
|
|
559
|
+
return ["claude-code", "codex", "cursor"];
|
|
654
560
|
}
|
|
655
561
|
|
|
656
|
-
function
|
|
657
|
-
|
|
562
|
+
function nativeOwnerForV3Instance(root: string, instanceId: string): string {
|
|
563
|
+
const activeDir = resolve(root, ".harnery", "active");
|
|
658
564
|
try {
|
|
659
|
-
const
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
565
|
+
for (const file of readdirSync(activeDir)) {
|
|
566
|
+
if (!file.endsWith(".json")) continue;
|
|
567
|
+
const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8")) as Record<
|
|
568
|
+
string,
|
|
569
|
+
unknown
|
|
570
|
+
>;
|
|
571
|
+
if (
|
|
572
|
+
parsed.schema_version === 2 &&
|
|
573
|
+
parsed.v3_instance_id === instanceId &&
|
|
574
|
+
typeof parsed.instance_id === "string"
|
|
575
|
+
) {
|
|
576
|
+
return parsed.instance_id;
|
|
577
|
+
}
|
|
663
578
|
}
|
|
664
|
-
return null;
|
|
665
579
|
} catch {
|
|
666
|
-
|
|
580
|
+
// The producer state remains authoritative; fall through to the canonical label.
|
|
667
581
|
}
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
/**
|
|
671
|
-
* Render the display form for an instance_id: `agent-<Name>` if the heartbeat
|
|
672
|
-
* carries a non-empty `.name`, else `agent-<8-char-hex-prefix>`.
|
|
673
|
-
*
|
|
674
|
-
* Hex fallback handles three cases cleanly:
|
|
675
|
-
* - heartbeat written before this feature shipped (no `name` field)
|
|
676
|
-
* - heartbeat pruned but instance_id still appears in older log lines
|
|
677
|
-
* - the narrow window between instance_id resolution and heartbeat read
|
|
678
|
-
*/
|
|
679
|
-
export function displayName(instanceId: string): string {
|
|
680
|
-
if (!instanceId) return "agent-unknown";
|
|
681
|
-
const hb = readHeartbeat(instanceId);
|
|
682
|
-
if (hb && typeof hb.name === "string" && hb.name.length > 0) {
|
|
683
|
-
return `agent-${hb.name}`;
|
|
684
|
-
}
|
|
685
|
-
return `agent-${instanceId.slice(0, 8)}`;
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
/**
|
|
689
|
-
* Convenience: resolve self via ppid walk, then render. Returns
|
|
690
|
-
* `agent-unknown` when the walk fails.
|
|
691
|
-
*/
|
|
692
|
-
export function selfDisplayName(): string {
|
|
693
|
-
const owner = resolveOwner();
|
|
694
|
-
if (!owner) return "agent-unknown";
|
|
695
|
-
return displayName(owner);
|
|
582
|
+
return instanceId.startsWith("inst_") ? instanceId.slice(5) : instanceId;
|
|
696
583
|
}
|
|
697
584
|
|
|
698
585
|
function readPpid(pid: number): number | null {
|