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
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Incremental consumer for the canonical event stream at
|
|
3
|
-
* `.harnery/events.ndjson`.
|
|
4
|
-
*
|
|
5
|
-
* A small `.harnery/.events-cursor` file persists the last-projected event_id;
|
|
6
|
-
* subsequent runs skip everything up to and including that id and return only
|
|
7
|
-
* the new tail.
|
|
8
|
-
*
|
|
9
|
-
* Read strategy: the global cursor is advanced on every agent's turn.stop, so
|
|
10
|
-
* it almost always sits within the last few KB of the stream. We exploit that
|
|
11
|
-
* with a bounded **tail read** (reading only the last `tailBytes` of the file
|
|
12
|
-
* and locating the cursor there) which turns an O(file-size) read into
|
|
13
|
-
* O(window). If the cursor is older than the window (a long-idle system, or a
|
|
14
|
-
* cursor that's been rotated out) we fall back to a wider read that is itself
|
|
15
|
-
* capped (`fallbackCapBytes`): the stream is an append-only ledger that grows
|
|
16
|
-
* without bound, so a whole-file `readFileSync` throws V8's max-string-length
|
|
17
|
-
* error ("Cannot create a string longer than 0x1fffffe8 characters") once it
|
|
18
|
-
* passes ~512MB, which would abort the projection. Events older than the cap are
|
|
19
|
-
* stale for coord-state purposes, so a bounded replay is the correct fallback.
|
|
20
|
-
*
|
|
21
|
-
* Idempotency: projectors are idempotent by `event_id`. The
|
|
22
|
-
* cursor file makes this cheap (we never replay an already-projected event by
|
|
23
|
-
* accident) and the projector tolerates the rare full-replay (cursor rotated
|
|
24
|
-
* out) without double-applying.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import {
|
|
28
|
-
closeSync,
|
|
29
|
-
existsSync,
|
|
30
|
-
mkdirSync,
|
|
31
|
-
openSync,
|
|
32
|
-
readFileSync,
|
|
33
|
-
readSync,
|
|
34
|
-
statSync,
|
|
35
|
-
writeFileSync,
|
|
36
|
-
} from "node:fs";
|
|
37
|
-
import { dirname, join } from "node:path";
|
|
38
|
-
import { coordEnv } from "../../../lib/env.ts";
|
|
39
|
-
|
|
40
|
-
const STREAM_REL = ".harnery/events.ndjson";
|
|
41
|
-
const CURSOR_REL = ".harnery/.events-cursor";
|
|
42
|
-
const DEFAULT_TAIL_BYTES = 2 * 1024 * 1024; // 2 MiB, thousands of events of headroom
|
|
43
|
-
/** Cap for the fall-through read when the cursor misses the tail window. Well
|
|
44
|
-
* under V8's ~512MB max string length so it never throws on the unbounded
|
|
45
|
-
* ledger; comfortably larger than any realistic cursor drift (the global cursor
|
|
46
|
-
* advances on every agent's turn.stop, so it sits near EOF in practice). */
|
|
47
|
-
const DEFAULT_FALLBACK_CAP_BYTES = 64 * 1024 * 1024; // 64 MiB
|
|
48
|
-
|
|
49
|
-
export interface CanonicalEvent {
|
|
50
|
-
schema_version: number;
|
|
51
|
-
event_id: string;
|
|
52
|
-
event_type: string;
|
|
53
|
-
ts: string;
|
|
54
|
-
instance_id: string;
|
|
55
|
-
session_id: string;
|
|
56
|
-
parent_session_id?: string;
|
|
57
|
-
turn_id?: string;
|
|
58
|
-
parent_turn_id?: string;
|
|
59
|
-
adapter: string;
|
|
60
|
-
source: string;
|
|
61
|
-
data: Record<string, unknown>;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface ConsumeResult {
|
|
65
|
-
events: CanonicalEvent[];
|
|
66
|
-
/** event_id of the last event the caller successfully projected. */
|
|
67
|
-
lastEventId: string | null;
|
|
68
|
-
/** Total bytes in the stream file at read time (for diagnostics). */
|
|
69
|
-
streamBytes: number;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface ConsumeOpts {
|
|
73
|
-
/** Ignore the cursor and return everything, useful for backfill. */
|
|
74
|
-
replayAll?: boolean;
|
|
75
|
-
/**
|
|
76
|
-
* Tail-window size in bytes for the fast-path read. Defaults to
|
|
77
|
-
* `HARNERY_AGENT_COORD_TAIL_BYTES` env or 2 MiB. Mainly a test seam; production
|
|
78
|
-
* callers should leave it unset.
|
|
79
|
-
*/
|
|
80
|
-
tailBytes?: number;
|
|
81
|
-
/**
|
|
82
|
-
* Cap in bytes for the fall-through read (cursor missed the tail window).
|
|
83
|
-
* Defaults to `HARNERY_AGENT_COORD_FALLBACK_CAP_BYTES` env or 64 MiB. Bounds
|
|
84
|
-
* the read so the unbounded ledger can never overflow V8's max string length.
|
|
85
|
-
* Mainly a test seam; production callers should leave it unset.
|
|
86
|
-
*/
|
|
87
|
-
fallbackCapBytes?: number;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Read all events after the persisted cursor, in chronological (file) order.
|
|
92
|
-
*/
|
|
93
|
-
export function consumeSince(coordRoot: string, opts: ConsumeOpts = {}): ConsumeResult {
|
|
94
|
-
const streamPath = join(coordRoot, STREAM_REL);
|
|
95
|
-
if (!existsSync(streamPath)) {
|
|
96
|
-
return { events: [], lastEventId: null, streamBytes: 0 };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const cursor = opts.replayAll ? null : readCursor(coordRoot);
|
|
100
|
-
const fileSize = statSync(streamPath).size;
|
|
101
|
-
const windowBytes = resolveTailBytes(opts.tailBytes);
|
|
102
|
-
|
|
103
|
-
// Tail fast-path: a cursor exists and the file is larger than the window.
|
|
104
|
-
// Read only the trailing window, drop the (likely partial) first line, and
|
|
105
|
-
// look for the cursor. A hit returns just the new events without ever
|
|
106
|
-
// touching the bulk of the file.
|
|
107
|
-
if (cursor !== null && fileSize > windowBytes) {
|
|
108
|
-
const tail = readTailUtf8(streamPath, fileSize, windowBytes);
|
|
109
|
-
const firstNl = tail.indexOf("\n");
|
|
110
|
-
const usable = firstNl >= 0 ? tail.slice(firstNl + 1) : "";
|
|
111
|
-
const parsed = eventsAfterCursor(parseLines(usable), cursor);
|
|
112
|
-
if (parsed.foundCursor) {
|
|
113
|
-
return {
|
|
114
|
-
events: parsed.events,
|
|
115
|
-
lastEventId: parsed.events.at(-1)?.event_id ?? cursor,
|
|
116
|
-
streamBytes: fileSize,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
// Cursor older than the tail window → fall through to a full read.
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Bounded fall-through: first run, replayAll, small file, or cursor not found
|
|
123
|
-
// in the tail. This must NEVER read the whole file: the stream grows without
|
|
124
|
-
// bound and a >512MB readFileSync throws V8's max-string-length error, which
|
|
125
|
-
// would abort the projection. Read at most `cap` bytes from the tail; when we
|
|
126
|
-
// start mid-file, drop the (likely partial) first line.
|
|
127
|
-
const cap = resolveFallbackCap(opts.fallbackCapBytes);
|
|
128
|
-
const readBytes = Math.min(fileSize, cap);
|
|
129
|
-
let text = readTailUtf8(streamPath, fileSize, readBytes);
|
|
130
|
-
if (readBytes < fileSize) {
|
|
131
|
-
const firstNl = text.indexOf("\n");
|
|
132
|
-
text = firstNl >= 0 ? text.slice(firstNl + 1) : "";
|
|
133
|
-
}
|
|
134
|
-
const all = parseLines(text);
|
|
135
|
-
const parsed = eventsAfterCursor(all, cursor);
|
|
136
|
-
if (parsed.foundCursor) {
|
|
137
|
-
return {
|
|
138
|
-
events: parsed.events,
|
|
139
|
-
lastEventId: parsed.events.at(-1)?.event_id ?? cursor,
|
|
140
|
-
streamBytes: fileSize,
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// The cursor names an event older than the capped window (or rotated out), so
|
|
145
|
-
// replay what the window holds (safer than silent state drift; the projector
|
|
146
|
-
// is idempotent by event_id). lastEventId null keeps the cursor put.
|
|
147
|
-
return { events: all, lastEventId: null, streamBytes: fileSize };
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
function resolveFallbackCap(override?: number): number {
|
|
151
|
-
if (override !== undefined && override > 0) return override;
|
|
152
|
-
const env = coordEnv("AGENT_COORD_FALLBACK_CAP_BYTES");
|
|
153
|
-
const n = env ? Number(env) : Number.NaN;
|
|
154
|
-
return Number.isFinite(n) && n > 0 ? n : DEFAULT_FALLBACK_CAP_BYTES;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
function resolveTailBytes(override?: number): number {
|
|
158
|
-
if (override !== undefined && override > 0) return override;
|
|
159
|
-
const env = coordEnv("AGENT_COORD_TAIL_BYTES");
|
|
160
|
-
const n = env ? Number(env) : Number.NaN;
|
|
161
|
-
return Number.isFinite(n) && n > 0 ? n : DEFAULT_TAIL_BYTES;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Read at most `capBytes` from the tail of the event stream as UTF-8, dropping
|
|
166
|
-
* the (partial) leading line when the file is larger than the cap. Shared
|
|
167
|
-
* bounded reader for CLI consumers (`agents trace` / `agents health`) that must
|
|
168
|
-
* never `readFileSync` the whole unbounded ledger — a >512MB read throws V8's
|
|
169
|
-
* max-string-length error. `truncated` is true when older bytes were skipped, so
|
|
170
|
-
* callers can surface the cap rather than silently under-reporting.
|
|
171
|
-
*/
|
|
172
|
-
export function readStreamTailBounded(
|
|
173
|
-
streamPath: string,
|
|
174
|
-
capBytes: number,
|
|
175
|
-
): { text: string; truncated: boolean } {
|
|
176
|
-
if (!existsSync(streamPath)) return { text: "", truncated: false };
|
|
177
|
-
const fileSize = statSync(streamPath).size;
|
|
178
|
-
const readBytes = Math.min(fileSize, capBytes);
|
|
179
|
-
let text = readTailUtf8(streamPath, fileSize, readBytes);
|
|
180
|
-
const truncated = readBytes < fileSize;
|
|
181
|
-
if (truncated) {
|
|
182
|
-
const nl = text.indexOf("\n");
|
|
183
|
-
text = nl >= 0 ? text.slice(nl + 1) : "";
|
|
184
|
-
}
|
|
185
|
-
return { text, truncated };
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/** Read the trailing `windowBytes` of a file as UTF-8 without loading the rest. */
|
|
189
|
-
function readTailUtf8(streamPath: string, fileSize: number, windowBytes: number): string {
|
|
190
|
-
const start = Math.max(0, fileSize - windowBytes);
|
|
191
|
-
const len = fileSize - start;
|
|
192
|
-
const buf = Buffer.allocUnsafe(len);
|
|
193
|
-
const fd = openSync(streamPath, "r");
|
|
194
|
-
try {
|
|
195
|
-
let read = 0;
|
|
196
|
-
while (read < len) {
|
|
197
|
-
const n = readSync(fd, buf, read, len - read, start + read);
|
|
198
|
-
if (n === 0) break;
|
|
199
|
-
read += n;
|
|
200
|
-
}
|
|
201
|
-
return buf.toString("utf8", 0, read);
|
|
202
|
-
} finally {
|
|
203
|
-
closeSync(fd);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
function parseLines(raw: string): CanonicalEvent[] {
|
|
208
|
-
const out: CanonicalEvent[] = [];
|
|
209
|
-
for (const line of raw.split("\n")) {
|
|
210
|
-
if (!line.trim()) continue;
|
|
211
|
-
try {
|
|
212
|
-
out.push(JSON.parse(line) as CanonicalEvent);
|
|
213
|
-
} catch {
|
|
214
|
-
/* skip malformed line */
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return out;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Events strictly after `cursor` (or all events when `cursor` is null). When a
|
|
222
|
-
* non-null cursor isn't present in `all`, returns `foundCursor: false` so the
|
|
223
|
-
* caller can decide between a wider read and a full replay.
|
|
224
|
-
*/
|
|
225
|
-
function eventsAfterCursor(
|
|
226
|
-
all: CanonicalEvent[],
|
|
227
|
-
cursor: string | null,
|
|
228
|
-
): { events: CanonicalEvent[]; foundCursor: boolean } {
|
|
229
|
-
if (cursor === null) return { events: all, foundCursor: true };
|
|
230
|
-
const idx = all.findIndex((e) => e.event_id === cursor);
|
|
231
|
-
if (idx < 0) return { events: [], foundCursor: false };
|
|
232
|
-
return { events: all.slice(idx + 1), foundCursor: true };
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export function readCursor(coordRoot: string): string | null {
|
|
236
|
-
const path = join(coordRoot, CURSOR_REL);
|
|
237
|
-
if (!existsSync(path)) return null;
|
|
238
|
-
try {
|
|
239
|
-
const v = readFileSync(path, "utf8").trim();
|
|
240
|
-
return v.length > 0 ? v : null;
|
|
241
|
-
} catch {
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
export function writeCursor(coordRoot: string, eventId: string): void {
|
|
247
|
-
const path = join(coordRoot, CURSOR_REL);
|
|
248
|
-
try {
|
|
249
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
250
|
-
writeFileSync(path, eventId, "utf8");
|
|
251
|
-
} catch {
|
|
252
|
-
/* swallow; next run replays */
|
|
253
|
-
}
|
|
254
|
-
}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical-event writer for agent-coord. Mirrors the agent-hooks emitter:
|
|
3
|
-
* both modules write the same envelope shape to the same
|
|
4
|
-
* `.harnery/events.ndjson` file but stay independent (shared code limited to
|
|
5
|
-
* event/schema types).
|
|
6
|
-
*
|
|
7
|
-
* Phase 4: agent-coord uses this from CLI handlers (state.task_set,
|
|
8
|
-
* state.status_checked, state.journal_append, council.*, decision.*,
|
|
9
|
-
* presence.*).
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { appendFileSync, closeSync, mkdirSync, openSync } from "node:fs";
|
|
13
|
-
import { dirname, join } from "node:path";
|
|
14
|
-
import { maybeRotateEventStream } from "../../hooks/events/rotate.ts";
|
|
15
|
-
import { ulid } from "./ulid.ts";
|
|
16
|
-
|
|
17
|
-
const SCHEMA_VERSION = 1 as const;
|
|
18
|
-
const STREAM_FILE = ".harnery/events.ndjson";
|
|
19
|
-
const LOCK_FILE = ".harnery/events.ndjson.lock";
|
|
20
|
-
const MAX_LINE_BYTES = 64 * 1024;
|
|
21
|
-
|
|
22
|
-
export type { Adapter, Source } from "../../hooks/events/schema.ts";
|
|
23
|
-
|
|
24
|
-
import type { Adapter, Source } from "../../hooks/events/schema.ts";
|
|
25
|
-
|
|
26
|
-
export interface Envelope {
|
|
27
|
-
schema_version: typeof SCHEMA_VERSION;
|
|
28
|
-
event_id: string;
|
|
29
|
-
event_type: string;
|
|
30
|
-
ts: string;
|
|
31
|
-
instance_id: string;
|
|
32
|
-
session_id: string;
|
|
33
|
-
parent_session_id?: string;
|
|
34
|
-
turn_id?: string;
|
|
35
|
-
parent_turn_id?: string;
|
|
36
|
-
adapter: Adapter;
|
|
37
|
-
source: Source;
|
|
38
|
-
data: Record<string, unknown>;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface EmitInput {
|
|
42
|
-
event_type: string;
|
|
43
|
-
instance_id: string;
|
|
44
|
-
session_id: string;
|
|
45
|
-
adapter: Adapter;
|
|
46
|
-
source?: Source;
|
|
47
|
-
parent_session_id?: string;
|
|
48
|
-
turn_id?: string;
|
|
49
|
-
parent_turn_id?: string;
|
|
50
|
-
ts?: string;
|
|
51
|
-
data: Record<string, unknown>;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function buildEnvelope(input: EmitInput): Envelope {
|
|
55
|
-
return {
|
|
56
|
-
schema_version: SCHEMA_VERSION,
|
|
57
|
-
event_id: ulid(),
|
|
58
|
-
event_type: input.event_type,
|
|
59
|
-
ts: input.ts ?? new Date().toISOString(),
|
|
60
|
-
instance_id: input.instance_id,
|
|
61
|
-
session_id: input.session_id,
|
|
62
|
-
parent_session_id: input.parent_session_id,
|
|
63
|
-
turn_id: input.turn_id,
|
|
64
|
-
parent_turn_id: input.parent_turn_id,
|
|
65
|
-
adapter: input.adapter,
|
|
66
|
-
source: input.source ?? "agent-coord",
|
|
67
|
-
data: input.data,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export function emit(coordRoot: string, input: EmitInput): Envelope {
|
|
72
|
-
const envelope = buildEnvelope(input);
|
|
73
|
-
const streamPath = join(coordRoot, STREAM_FILE);
|
|
74
|
-
const lockPath = join(coordRoot, LOCK_FILE);
|
|
75
|
-
|
|
76
|
-
// Size-triggered rotation (shared with the agent-hooks emitter): roll the
|
|
77
|
-
// active file to a dated archive when it crosses the cap. Fail-soft.
|
|
78
|
-
maybeRotateEventStream(coordRoot);
|
|
79
|
-
|
|
80
|
-
ensureDir(dirname(streamPath));
|
|
81
|
-
ensureFile(lockPath);
|
|
82
|
-
|
|
83
|
-
let line = `${JSON.stringify(envelope)}\n`;
|
|
84
|
-
if (Buffer.byteLength(line, "utf8") > MAX_LINE_BYTES) {
|
|
85
|
-
line = `${JSON.stringify({
|
|
86
|
-
...envelope,
|
|
87
|
-
data: { __over_size_limit: true, original_bytes: Buffer.byteLength(line, "utf8") },
|
|
88
|
-
})}\n`;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const lockFd = openSync(lockPath, "r+");
|
|
92
|
-
try {
|
|
93
|
-
appendFileSync(streamPath, line, { encoding: "utf8", flag: "a" });
|
|
94
|
-
} finally {
|
|
95
|
-
closeSync(lockFd);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return envelope;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function ensureDir(path: string): void {
|
|
102
|
-
try {
|
|
103
|
-
mkdirSync(path, { recursive: true });
|
|
104
|
-
} catch {
|
|
105
|
-
/* swallow */
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function ensureFile(path: string): void {
|
|
110
|
-
try {
|
|
111
|
-
closeSync(openSync(path, "a"));
|
|
112
|
-
} catch {
|
|
113
|
-
/* swallow */
|
|
114
|
-
}
|
|
115
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tiny ULID generator. Crockford-base32, 10-char timestamp (48-bit ms epoch)
|
|
3
|
-
* + 16-char random (80-bit). 26 chars total, monotonically-sortable.
|
|
4
|
-
*
|
|
5
|
-
* Intentionally duplicated from the agent-hooks ULID generator: agent-hooks
|
|
6
|
-
* and agent-coord stay strictly-separated packages, sharing only event/schema
|
|
7
|
-
* types. The writer side reimplements per-module so neither depends on the
|
|
8
|
-
* other's runtime code.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
12
|
-
|
|
13
|
-
export function ulid(): string {
|
|
14
|
-
const ts = encodeTime(Date.now());
|
|
15
|
-
const rnd = encodeRandom();
|
|
16
|
-
return ts + rnd;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function encodeTime(ms: number): string {
|
|
20
|
-
let out = "";
|
|
21
|
-
let n = BigInt(ms);
|
|
22
|
-
const base = BigInt(32);
|
|
23
|
-
for (let i = 0; i < 10; i++) {
|
|
24
|
-
const mod = Number(n % base);
|
|
25
|
-
out = ALPHABET[mod] + out;
|
|
26
|
-
n = n / base;
|
|
27
|
-
}
|
|
28
|
-
return out;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function encodeRandom(): string {
|
|
32
|
-
const bytes = new Uint8Array(10);
|
|
33
|
-
crypto.getRandomValues(bytes);
|
|
34
|
-
let out = "";
|
|
35
|
-
let buf = 0n;
|
|
36
|
-
let bits = 0;
|
|
37
|
-
for (const b of bytes) {
|
|
38
|
-
buf = (buf << 8n) | BigInt(b);
|
|
39
|
-
bits += 8;
|
|
40
|
-
while (bits >= 5) {
|
|
41
|
-
bits -= 5;
|
|
42
|
-
const idx = Number((buf >> BigInt(bits)) & 0x1fn);
|
|
43
|
-
out += ALPHABET[idx];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (bits > 0) {
|
|
47
|
-
const idx = Number((buf << BigInt(5 - bits)) & 0x1fn);
|
|
48
|
-
out += ALPHABET[idx];
|
|
49
|
-
}
|
|
50
|
-
return out.slice(0, 16);
|
|
51
|
-
}
|