harnery 0.32.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/README.md +2 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +7 -1
- 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 +1408 -565
- 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 +2 -2
- package/dist/commands/claude-desktop.d.ts.map +1 -1
- package/dist/commands/claude-desktop.js +2 -2
- 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.d.ts +4 -2
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +55 -7
- 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 +10 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +233 -51
- package/dist/commands/instructions.d.ts +4 -0
- package/dist/commands/instructions.d.ts.map +1 -0
- package/dist/commands/instructions.js +100 -0
- 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 +15 -6
- 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 +27 -25
- package/dist/core/agents/cli.js +212 -235
- 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 -70
- 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 +5 -5
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +5 -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 +10 -4
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +61 -55
- 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 +15 -33
- 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 +29 -46
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +59 -199
- 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 +45 -0
- package/dist/core/agents/state/session-state.d.ts.map +1 -0
- package/dist/core/agents/state/session-state.js +90 -0
- 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 +13 -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 +64 -24
- 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 +345 -400
- package/dist/core/hooks/codex-authorization.d.ts +30 -0
- package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
- package/dist/core/hooks/codex-authorization.js +199 -0
- 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 +8 -3
- package/dist/core/presence/blob.d.ts.map +1 -1
- package/dist/core/presence/blob.js +54 -41
- 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/index.js +15 -1
- 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/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 +33 -0
- package/dist/lib/instructions/bundle.d.ts.map +1 -0
- package/dist/lib/instructions/bundle.js +149 -0
- 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 +27 -6
- 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 +7 -1
- package/src/commands/adapter.ts +2 -2
- package/src/commands/agents.ts +1737 -570
- 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 +7 -5
- 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 +73 -8
- package/src/commands/events.ts +256 -0
- package/src/commands/governor.ts +18 -4
- package/src/commands/init.ts +264 -57
- package/src/commands/instructions.ts +129 -0
- package/src/commands/journal.ts +4 -13
- package/src/commands/ledger-v3.ts +111 -0
- package/src/commands/presence.ts +18 -11
- 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 +39 -28
- package/src/core/agents/cli.ts +242 -263
- package/src/core/agents/codex-archive-v3.ts +138 -0
- package/src/core/agents/coord-client.ts +75 -177
- package/src/core/agents/finalization.ts +120 -38
- package/src/core/agents/index.ts +5 -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 +89 -55
- package/src/core/agents/render/session-context.ts +23 -32
- 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 +98 -242
- package/src/core/agents/state/live-coordination-view.ts +290 -0
- package/src/core/agents/state/session-state.ts +143 -0
- 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 +15 -6
- package/src/core/hooks/adapter/output.ts +7 -2
- package/src/core/hooks/adapter/parse.ts +81 -36
- package/src/core/hooks/adapter/wiring.ts +119 -13
- package/src/core/hooks/cli.ts +398 -422
- package/src/core/hooks/codex-authorization.ts +253 -0
- 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 +63 -38
- package/src/core/presence/codec-digest.ts +215 -0
- package/src/core/presence/index.ts +18 -1
- 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/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 +199 -0
- 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 -65
- package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
- package/dist/core/agents/state/heartbeat-projector.js +0 -527
- 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 -312
- 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 -582
- 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 -538
- 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,37 +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
|
-
/** Session name built on the first non-empty set-task; its presence means "this session has been named". 2026-08-09. */
|
|
79
|
-
suggested_session_name?: string;
|
|
80
|
-
/** Stamped by turn.stop once the suggested name is seen in assistant reply text. 2026-08-09. */
|
|
81
|
-
session_name_seen_at?: string;
|
|
82
|
-
/** Auto-generated per-turn summary written by the Stop hook via Haiku. 2026-05-23. */
|
|
83
|
-
turn_summary?: string | null;
|
|
84
|
-
/** UTC ISO-8601 timestamp when turn_summary was last refreshed. */
|
|
85
|
-
turn_summary_updated_at?: string | null;
|
|
86
|
-
/** Hook client: `claude-code` (default) or `cursor`. Cursor Phase 1. */
|
|
87
|
-
platform?: string;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
63
|
/**
|
|
91
64
|
* Resolve the monorepo root for coord-state purposes.
|
|
92
65
|
*
|
|
@@ -101,8 +74,8 @@ export function monorepoRoot(): string | null {
|
|
|
101
74
|
* THE coordination-root resolution. Every surface — the hooks, the CLI's reads,
|
|
102
75
|
* and the CLI's canonical emits — resolves through this one function, because a
|
|
103
76
|
* root the two layers disagree about is a root that silently breaks the
|
|
104
|
-
* end-of-turn rules: the hook evaluates `
|
|
105
|
-
* 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
|
|
106
79
|
* and rule 1/3 blocks a turn that did run `agents status`, with no sequence of
|
|
107
80
|
* CLI commands able to satisfy it.
|
|
108
81
|
*
|
|
@@ -157,7 +130,7 @@ export function resolveCoordRoot(start: string = process.cwd()): string | null {
|
|
|
157
130
|
if (ancestors.length > 0) return ancestors[0] as string;
|
|
158
131
|
if (gitRoots.length > 0) return gitRoots[0] as string;
|
|
159
132
|
// Nothing carries `.harnery/` yet. Hand back the enclosing checkout so a
|
|
160
|
-
// first run (`harn init`, agent-hook's session.
|
|
133
|
+
// first run (`harn init`, agent-hook's session.started) has somewhere to
|
|
161
134
|
// create it.
|
|
162
135
|
return gitToplevel(start);
|
|
163
136
|
}
|
|
@@ -184,7 +157,7 @@ function ancestorCoordRoots(start: string): string[] {
|
|
|
184
157
|
* Does this root's `.harnery/` already know the process asking?
|
|
185
158
|
*
|
|
186
159
|
* Two discriminators, both genuinely about *this* session: the adapter-exported
|
|
187
|
-
* session id matching
|
|
160
|
+
* session id matching live V3 producer state, and a pid-map row on our own ppid
|
|
188
161
|
* chain. Deliberately NOT the single-live-agent fallback that owner resolution
|
|
189
162
|
* ends with — a lone stranger in the wrong root is exactly how `whoami` came to
|
|
190
163
|
* report another agent's name and task as its own.
|
|
@@ -233,7 +206,7 @@ function gitToplevel(start: string): string | null {
|
|
|
233
206
|
}
|
|
234
207
|
|
|
235
208
|
function gitRevParse(cwd: string, flag: string): string | null {
|
|
236
|
-
const key = `${cwd}
|
|
209
|
+
const key = `${cwd}\0${flag}`;
|
|
237
210
|
const cached = gitRevParseCache.get(key);
|
|
238
211
|
if (cached !== undefined) return cached;
|
|
239
212
|
let value: string | null = null;
|
|
@@ -393,22 +366,20 @@ export function resolveOwnerWithSource(): {
|
|
|
393
366
|
owner: string | null;
|
|
394
367
|
source: "env" | "pidmap" | "pidmap_fallback" | "session_env" | "active_singleton" | "none";
|
|
395
368
|
} {
|
|
369
|
+
const bridge = process.env.HARNERY_AGENT_COORD_BRIDGE?.trim();
|
|
396
370
|
const envOwner = process.env.HARNERY_AGENT_COORD_OWNER?.trim();
|
|
397
|
-
|
|
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) {
|
|
398
375
|
return { owner: envOwner, source: "env" };
|
|
399
376
|
}
|
|
400
377
|
|
|
401
378
|
const root = monorepoRoot();
|
|
402
379
|
if (!root) return { owner: null, source: "none" };
|
|
403
380
|
|
|
404
|
-
// Every supported adapter exports its session id into
|
|
405
|
-
//
|
|
406
|
-
// session id it was minted under. Matching the two names us outright, even
|
|
407
|
-
// with many live agents, so it goes ahead of the ppid walk rather than
|
|
408
|
-
// catching what the walk drops. Cursor needed this first because its
|
|
409
|
-
// Glass/Agents UI runs several chats under one node ancestor, making that row
|
|
410
|
-
// last-writer-wins; pid recycling generalises the same hazard to every
|
|
411
|
-
// 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.
|
|
412
383
|
if (shouldPreferSessionEnv()) {
|
|
413
384
|
const bySession = resolveOwnerBySessionEnv(root);
|
|
414
385
|
if (bySession) {
|
|
@@ -416,12 +387,17 @@ export function resolveOwnerWithSource(): {
|
|
|
416
387
|
}
|
|
417
388
|
}
|
|
418
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
|
+
|
|
419
395
|
if (!existsSync(resolve(root, ".harnery", "pid-map"))) return { owner: null, source: "none" };
|
|
420
396
|
|
|
421
397
|
const byPidmap = resolveOwnerByPidmap(root);
|
|
422
398
|
if (byPidmap.owner) return byPidmap;
|
|
423
399
|
|
|
424
|
-
// Last resort: if exactly one
|
|
400
|
+
// Last resort: if exactly one V3 generation is live in this coord root, it's
|
|
425
401
|
// unambiguously us — resolve to it. This is what lets the bare `agents
|
|
426
402
|
// status` / `set-task` the stop hook recommends work without a `--session-id`
|
|
427
403
|
// flag in the common single-agent case. With 0 or 2+ live agents it would be
|
|
@@ -490,6 +466,18 @@ const SESSION_ID_ENV_VARS = [
|
|
|
490
466
|
] as const;
|
|
491
467
|
|
|
492
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
|
+
|
|
493
481
|
function sessionIdsFromEnv(): string[] {
|
|
494
482
|
for (const key of SESSION_ID_ENV_VARS) {
|
|
495
483
|
const v = process.env[key]?.trim();
|
|
@@ -520,7 +508,7 @@ function sessionIdFromEnv(): string | null {
|
|
|
520
508
|
* agent's name and file list.
|
|
521
509
|
*
|
|
522
510
|
* This only reorders the two. Session-env resolution still requires a live
|
|
523
|
-
*
|
|
511
|
+
* V3 producer carrying that session id, so when it does not match, the walk runs
|
|
524
512
|
* exactly as before.
|
|
525
513
|
*/
|
|
526
514
|
function shouldPreferSessionEnv(): boolean {
|
|
@@ -528,160 +516,70 @@ function shouldPreferSessionEnv(): boolean {
|
|
|
528
516
|
}
|
|
529
517
|
|
|
530
518
|
/**
|
|
531
|
-
* Resolve the owner by
|
|
532
|
-
*
|
|
533
|
-
*
|
|
534
|
-
*
|
|
535
|
-
* fallback applies, so a stale heartbeat from a prior session of the same id
|
|
536
|
-
* doesn't resolve. When legacy Cursor Glass state contains both the canonical
|
|
537
|
-
* bare id and its raw `bc-` alias, candidate order wins first; ties prefer a
|
|
538
|
-
* named heartbeat, then the newest heartbeat, with instance id as a stable
|
|
539
|
-
* 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.
|
|
540
523
|
*
|
|
541
524
|
* Exported for unit testing with an injectable root.
|
|
542
525
|
*/
|
|
543
526
|
export function resolveOwnerBySessionEnv(root: string): string | null {
|
|
544
527
|
const sessionIds = sessionIdsFromEnv();
|
|
545
528
|
if (sessionIds.length === 0) return null;
|
|
546
|
-
|
|
547
|
-
const
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
try {
|
|
553
|
-
files = readdirSync(activeDir);
|
|
554
|
-
} catch {
|
|
555
|
-
return null;
|
|
556
|
-
}
|
|
557
|
-
const matches: Array<{
|
|
558
|
-
instanceId: string;
|
|
559
|
-
sessionPreference: number;
|
|
560
|
-
hasName: boolean;
|
|
561
|
-
lastHeartbeatMs: number;
|
|
562
|
-
}> = [];
|
|
563
|
-
for (const file of files) {
|
|
564
|
-
if (!file.endsWith(".json")) continue;
|
|
565
|
-
try {
|
|
566
|
-
const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8"));
|
|
567
|
-
if (!parsed) continue;
|
|
568
|
-
const sessionPreference = sessionIds.indexOf(parsed.session_id);
|
|
569
|
-
if (sessionPreference === -1) continue;
|
|
570
|
-
if (typeof parsed.instance_id !== "string") continue;
|
|
571
|
-
const ts = Date.parse(parsed.last_heartbeat);
|
|
572
|
-
if (!Number.isFinite(ts) || ts < cutoffMs) continue;
|
|
573
|
-
matches.push({
|
|
574
|
-
instanceId: parsed.instance_id,
|
|
575
|
-
sessionPreference,
|
|
576
|
-
hasName: typeof parsed.name === "string" && parsed.name.trim().length > 0,
|
|
577
|
-
lastHeartbeatMs: ts,
|
|
578
|
-
});
|
|
579
|
-
} catch {
|
|
580
|
-
// 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));
|
|
581
535
|
}
|
|
582
536
|
}
|
|
583
|
-
matches.
|
|
584
|
-
(a, b) =>
|
|
585
|
-
a.sessionPreference - b.sessionPreference ||
|
|
586
|
-
Number(b.hasName) - Number(a.hasName) ||
|
|
587
|
-
b.lastHeartbeatMs - a.lastHeartbeatMs ||
|
|
588
|
-
a.instanceId.localeCompare(b.instanceId),
|
|
589
|
-
);
|
|
590
|
-
return matches[0]?.instanceId ?? null;
|
|
537
|
+
return matches.size === 1 ? [...matches][0]! : null;
|
|
591
538
|
}
|
|
592
539
|
|
|
593
540
|
/**
|
|
594
|
-
* Return the
|
|
595
|
-
* if there are zero or more than one.
|
|
596
|
-
* freshness window the rest of the agents surface applies (kept inline as a
|
|
597
|
-
* 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.
|
|
598
543
|
*
|
|
599
544
|
* Exported for unit testing with an injectable root (the caller in
|
|
600
545
|
* `resolveOwnerWithSource` passes `monorepoRoot()`).
|
|
601
546
|
*/
|
|
602
547
|
export function resolveSingleActiveOwner(root: string): string | null {
|
|
603
|
-
const
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
try {
|
|
610
|
-
files = readdirSync(activeDir);
|
|
611
|
-
} catch {
|
|
612
|
-
return null;
|
|
613
|
-
}
|
|
614
|
-
for (const file of files) {
|
|
615
|
-
if (!file.endsWith(".json")) continue;
|
|
616
|
-
try {
|
|
617
|
-
const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8"));
|
|
618
|
-
if (!parsed || typeof parsed.instance_id !== "string") continue;
|
|
619
|
-
const ts = Date.parse(parsed.last_heartbeat);
|
|
620
|
-
if (Number.isFinite(ts) && ts >= cutoffMs) live.push(parsed.instance_id);
|
|
621
|
-
} catch {
|
|
622
|
-
// skip malformed
|
|
623
|
-
}
|
|
624
|
-
if (live.length > 1) return null; // ambiguous; bail early
|
|
625
|
-
}
|
|
626
|
-
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;
|
|
627
554
|
}
|
|
628
555
|
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
* Phase 8 cleanup (2026-05-27): the v1/v2 dual-write bridge is gone; the
|
|
634
|
-
* projector writes additively-merged heartbeats directly to
|
|
635
|
-
* `.harnery/active/<id>.json` (the canonical location every reader expects).
|
|
636
|
-
*/
|
|
637
|
-
export function readHeartbeat(instanceId: string): Heartbeat | null {
|
|
638
|
-
if (!isSafeInstanceId(instanceId)) return null;
|
|
639
|
-
const root = monorepoRoot();
|
|
640
|
-
if (!root) return null;
|
|
641
|
-
const path = resolveContainedFile(resolve(root, ".harnery", "active"), `${instanceId}.json`);
|
|
642
|
-
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"];
|
|
643
560
|
}
|
|
644
561
|
|
|
645
|
-
function
|
|
646
|
-
|
|
562
|
+
function nativeOwnerForV3Instance(root: string, instanceId: string): string {
|
|
563
|
+
const activeDir = resolve(root, ".harnery", "active");
|
|
647
564
|
try {
|
|
648
|
-
const
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
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
|
+
}
|
|
652
578
|
}
|
|
653
|
-
return null;
|
|
654
579
|
} catch {
|
|
655
|
-
|
|
580
|
+
// The producer state remains authoritative; fall through to the canonical label.
|
|
656
581
|
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
/**
|
|
660
|
-
* Render the display form for an instance_id: `agent-<Name>` if the heartbeat
|
|
661
|
-
* carries a non-empty `.name`, else `agent-<8-char-hex-prefix>`.
|
|
662
|
-
*
|
|
663
|
-
* Hex fallback handles three cases cleanly:
|
|
664
|
-
* - heartbeat written before this feature shipped (no `name` field)
|
|
665
|
-
* - heartbeat pruned but instance_id still appears in older log lines
|
|
666
|
-
* - the narrow window between instance_id resolution and heartbeat read
|
|
667
|
-
*/
|
|
668
|
-
export function displayName(instanceId: string): string {
|
|
669
|
-
if (!instanceId) return "agent-unknown";
|
|
670
|
-
const hb = readHeartbeat(instanceId);
|
|
671
|
-
if (hb && typeof hb.name === "string" && hb.name.length > 0) {
|
|
672
|
-
return `agent-${hb.name}`;
|
|
673
|
-
}
|
|
674
|
-
return `agent-${instanceId.slice(0, 8)}`;
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
/**
|
|
678
|
-
* Convenience: resolve self via ppid walk, then render. Returns
|
|
679
|
-
* `agent-unknown` when the walk fails.
|
|
680
|
-
*/
|
|
681
|
-
export function selfDisplayName(): string {
|
|
682
|
-
const owner = resolveOwner();
|
|
683
|
-
if (!owner) return "agent-unknown";
|
|
684
|
-
return displayName(owner);
|
|
582
|
+
return instanceId.startsWith("inst_") ? instanceId.slice(5) : instanceId;
|
|
685
583
|
}
|
|
686
584
|
|
|
687
585
|
function readPpid(pid: number): number | null {
|