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
package/src/core/config.ts
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
* Fields owned here: `binName` (host CLI name for agent-facing strings),
|
|
10
10
|
* `hooksSetupHint`, `agents`, `tools`, `workflow`, `skills`, `presence`, plus the tunable
|
|
11
11
|
* `coord` (heartbeat freshness), `artifacts` (working-file retention),
|
|
12
|
-
* `backup` (restic repo/password/prune policy),
|
|
13
|
-
* remote/prefix) sections. The `files` deny/override section
|
|
12
|
+
* `backup` (restic repo/password/prune policy), `sync` (rclone
|
|
13
|
+
* remote/prefix), and `web` (dashboard port) sections. The `files` deny/override section
|
|
14
14
|
* is parsed separately by `web/lib/files.ts`.
|
|
15
15
|
*
|
|
16
16
|
* Env vars and CLI flags override any config value per invocation (each accessor
|
|
@@ -30,6 +30,25 @@ export const DEFAULT_BIN_NAME = "harn";
|
|
|
30
30
|
/** Heartbeat-freshness default (seconds): the sweep window when nothing overrides it. */
|
|
31
31
|
export const DEFAULT_FRESHNESS_SECS = 600;
|
|
32
32
|
|
|
33
|
+
/** Mnemonic dashboard port: 4276 spells HARN on a phone keypad. */
|
|
34
|
+
export const DEFAULT_WEB_PORT = 4276;
|
|
35
|
+
|
|
36
|
+
export interface SessionFinalizationConfig {
|
|
37
|
+
archiveGraceSeconds: number;
|
|
38
|
+
idleObserveSeconds: number;
|
|
39
|
+
idleFinalizeSeconds: number;
|
|
40
|
+
cascadeGraceSeconds: number;
|
|
41
|
+
reconcileIntervalSeconds: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const DEFAULT_SESSION_FINALIZATION_CONFIG: SessionFinalizationConfig = {
|
|
45
|
+
archiveGraceSeconds: 600,
|
|
46
|
+
idleObserveSeconds: 3 * 24 * 60 * 60,
|
|
47
|
+
idleFinalizeSeconds: 7 * 24 * 60 * 60,
|
|
48
|
+
cascadeGraceSeconds: 60 * 60,
|
|
49
|
+
reconcileIntervalSeconds: 15 * 60,
|
|
50
|
+
};
|
|
51
|
+
|
|
33
52
|
export type AgentFinalizationDisposition = "git" | "output";
|
|
34
53
|
|
|
35
54
|
export interface AgentFinalizationRoot {
|
|
@@ -88,7 +107,17 @@ interface HarneryConfig {
|
|
|
88
107
|
* Coord-layer tunables. `freshness_seconds` is the heartbeat age above which
|
|
89
108
|
* the sweeper prunes an agent (default 600). Read via `coordFreshnessSeconds()`.
|
|
90
109
|
*/
|
|
91
|
-
coord?: {
|
|
110
|
+
coord?: {
|
|
111
|
+
freshness_seconds?: number;
|
|
112
|
+
run_quality?: unknown;
|
|
113
|
+
finalization?: {
|
|
114
|
+
archive_grace_seconds?: number;
|
|
115
|
+
idle_observe_seconds?: number;
|
|
116
|
+
idle_finalize_seconds?: number;
|
|
117
|
+
cascade_grace_seconds?: number;
|
|
118
|
+
reconcile_interval_seconds?: number;
|
|
119
|
+
};
|
|
120
|
+
};
|
|
92
121
|
/**
|
|
93
122
|
* Managed working-artifact defaults. `default_retention_days` is the
|
|
94
123
|
* create-time TTL when the caller does not pass `artifacts create --days`.
|
|
@@ -111,6 +140,8 @@ interface HarneryConfig {
|
|
|
111
140
|
* `~/.config/harnery/sync.json`, which is consulted as a lower-precedence fallback.
|
|
112
141
|
*/
|
|
113
142
|
sync?: { remote?: string; prefix?: string };
|
|
143
|
+
/** Standalone dashboard defaults. */
|
|
144
|
+
web?: { port?: number; bind?: string };
|
|
114
145
|
[k: string]: unknown;
|
|
115
146
|
}
|
|
116
147
|
|
|
@@ -194,6 +225,61 @@ function parseConfigFile(p: string): HarneryConfig {
|
|
|
194
225
|
return {};
|
|
195
226
|
}
|
|
196
227
|
|
|
228
|
+
export interface CoordRunQualityConfigSource {
|
|
229
|
+
value: unknown;
|
|
230
|
+
invalid: boolean;
|
|
231
|
+
/** Stable digest seed that contains no config values when parsing failed. */
|
|
232
|
+
digest_seed: unknown;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Effective user-plus-project `coord.run_quality` value with parse diagnostics.
|
|
237
|
+
* The ordinary config reader stays fail-soft; this one lets the guard visibly
|
|
238
|
+
* disable itself rather than silently substituting defaults for malformed JSONC.
|
|
239
|
+
*/
|
|
240
|
+
export function coordRunQualityConfigSource(root: string): CoordRunQualityConfigSource {
|
|
241
|
+
const projectPath = join(root, ".harnery", "config.jsonc");
|
|
242
|
+
const userPath = userConfigPath();
|
|
243
|
+
const layers = [userPath, projectPath].map((path) => parseConfigLayer(path));
|
|
244
|
+
const invalid = layers.filter((layer) => layer.invalid);
|
|
245
|
+
if (invalid.length > 0) {
|
|
246
|
+
return {
|
|
247
|
+
value: undefined,
|
|
248
|
+
invalid: true,
|
|
249
|
+
digest_seed: invalid.map((layer) => ({
|
|
250
|
+
path_kind: layer.path_kind,
|
|
251
|
+
signature: layer.signature,
|
|
252
|
+
})),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const merged = mergeConfig(layers[0]!.config, layers[1]!.config);
|
|
256
|
+
return {
|
|
257
|
+
value: merged.coord?.run_quality,
|
|
258
|
+
invalid: false,
|
|
259
|
+
digest_seed: merged.coord?.run_quality,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function parseConfigLayer(path: string): {
|
|
264
|
+
config: HarneryConfig;
|
|
265
|
+
invalid: boolean;
|
|
266
|
+
path_kind: "user" | "project";
|
|
267
|
+
signature: string | null;
|
|
268
|
+
} {
|
|
269
|
+
const pathKind = path === userConfigPath() ? "user" : "project";
|
|
270
|
+
const signature = statSignature(path);
|
|
271
|
+
if (signature === null) return { config: {}, invalid: false, path_kind: pathKind, signature };
|
|
272
|
+
try {
|
|
273
|
+
const value = JSON.parse(stripJsonComments(readFileSync(path, "utf8"))) as unknown;
|
|
274
|
+
if (isPlainObject(value)) {
|
|
275
|
+
return { config: value as HarneryConfig, invalid: false, path_kind: pathKind, signature };
|
|
276
|
+
}
|
|
277
|
+
} catch {
|
|
278
|
+
// The guard reports one bounded health event for this file signature.
|
|
279
|
+
}
|
|
280
|
+
return { config: {}, invalid: true, path_kind: pathKind, signature };
|
|
281
|
+
}
|
|
282
|
+
|
|
197
283
|
function isPlainObject(v: unknown): v is Record<string, unknown> {
|
|
198
284
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
199
285
|
}
|
|
@@ -445,6 +531,65 @@ export function coordFreshnessSeconds(coordRoot?: string | null): number {
|
|
|
445
531
|
return DEFAULT_FRESHNESS_SECS;
|
|
446
532
|
}
|
|
447
533
|
|
|
534
|
+
function parseWebPort(value: unknown, source: string): number {
|
|
535
|
+
const port = typeof value === "number" ? value : Number(value);
|
|
536
|
+
if (!Number.isInteger(port) || port < 1024 || port > 65535) {
|
|
537
|
+
throw new RangeError(`${source} must be an integer from 1024 through 65535`);
|
|
538
|
+
}
|
|
539
|
+
return port;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Resolve the standalone dashboard port.
|
|
544
|
+
*
|
|
545
|
+
* Precedence: explicit `--port` flag, `HARNERY_WEB_PORT`, merged
|
|
546
|
+
* `.harnery/config.jsonc` `web.port`, then the mnemonic built-in default 4276.
|
|
547
|
+
*/
|
|
548
|
+
export function resolveWebPort(explicitPort?: string, coordRoot?: string | null): number {
|
|
549
|
+
if (explicitPort !== undefined && explicitPort.trim() !== "") {
|
|
550
|
+
return parseWebPort(explicitPort, "--port");
|
|
551
|
+
}
|
|
552
|
+
const envPort = coordEnv("WEB_PORT");
|
|
553
|
+
if (envPort !== undefined && envPort.trim() !== "") {
|
|
554
|
+
return parseWebPort(envPort, "HARNERY_WEB_PORT");
|
|
555
|
+
}
|
|
556
|
+
const root = coordRoot ?? findCoordRoot();
|
|
557
|
+
const configuredPort = root ? readConfig(root).web?.port : undefined;
|
|
558
|
+
if (configuredPort !== undefined) {
|
|
559
|
+
return parseWebPort(configuredPort, "web.port");
|
|
560
|
+
}
|
|
561
|
+
return DEFAULT_WEB_PORT;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/** Policy for converging independent termination signals on one finalizer. */
|
|
565
|
+
export function sessionFinalizationConfig(coordRoot?: string | null): SessionFinalizationConfig {
|
|
566
|
+
const root = coordRoot ?? findCoordRoot();
|
|
567
|
+
const configured = root ? readConfig(root).coord?.finalization : undefined;
|
|
568
|
+
const defaults = DEFAULT_SESSION_FINALIZATION_CONFIG;
|
|
569
|
+
const archiveGraceSeconds = posIntOr(
|
|
570
|
+
configured?.archive_grace_seconds,
|
|
571
|
+
defaults.archiveGraceSeconds,
|
|
572
|
+
);
|
|
573
|
+
const idleObserveSeconds = posIntOr(
|
|
574
|
+
configured?.idle_observe_seconds,
|
|
575
|
+
defaults.idleObserveSeconds,
|
|
576
|
+
);
|
|
577
|
+
const idleFinalizeSeconds = Math.max(
|
|
578
|
+
idleObserveSeconds,
|
|
579
|
+
posIntOr(configured?.idle_finalize_seconds, defaults.idleFinalizeSeconds),
|
|
580
|
+
);
|
|
581
|
+
return {
|
|
582
|
+
archiveGraceSeconds,
|
|
583
|
+
idleObserveSeconds,
|
|
584
|
+
idleFinalizeSeconds,
|
|
585
|
+
cascadeGraceSeconds: posIntOr(configured?.cascade_grace_seconds, defaults.cascadeGraceSeconds),
|
|
586
|
+
reconcileIntervalSeconds: posIntOr(
|
|
587
|
+
configured?.reconcile_interval_seconds,
|
|
588
|
+
defaults.reconcileIntervalSeconds,
|
|
589
|
+
),
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
|
|
448
593
|
/**
|
|
449
594
|
* Default retention for a newly-created working artifact. Precedence:
|
|
450
595
|
* `HARNERY_ARTIFACT_RETENTION_DAYS` -> project/user config
|
|
@@ -9,7 +9,8 @@ import { spawnSync } from "node:child_process";
|
|
|
9
9
|
import { createHash, randomUUID } from "node:crypto";
|
|
10
10
|
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
11
11
|
import { dirname, join } from "node:path";
|
|
12
|
-
import type { Adapter } from "../
|
|
12
|
+
import type { Adapter } from "../adapter.ts";
|
|
13
|
+
import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.ts";
|
|
13
14
|
|
|
14
15
|
export const CONTEXT_SCHEMA_VERSION = 1 as const;
|
|
15
16
|
export const MAX_CAPSULE_BYTES = 32 * 1024;
|
|
@@ -71,12 +72,9 @@ export interface ContinuityCapsule {
|
|
|
71
72
|
context?: ContextSample;
|
|
72
73
|
work: {
|
|
73
74
|
task?: string;
|
|
74
|
-
turn_summary?: string;
|
|
75
75
|
continuation_note?: string;
|
|
76
76
|
files_held: string[];
|
|
77
77
|
files_held_truncated?: boolean;
|
|
78
|
-
last_tool?: string;
|
|
79
|
-
last_tool_target?: string;
|
|
80
78
|
};
|
|
81
79
|
repo: RepoSnapshot;
|
|
82
80
|
}
|
|
@@ -123,10 +121,7 @@ export interface PreparedContextRecovery {
|
|
|
123
121
|
interface HeartbeatSnapshot {
|
|
124
122
|
model?: string;
|
|
125
123
|
task?: string;
|
|
126
|
-
turn_summary?: string;
|
|
127
124
|
files_touched?: string[];
|
|
128
|
-
last_tool?: string;
|
|
129
|
-
last_tool_target?: string;
|
|
130
125
|
}
|
|
131
126
|
|
|
132
127
|
/** Parse the context-window shapes exposed by current adapter hook/status data. */
|
|
@@ -379,18 +374,12 @@ export function renderRecoveryBriefing(capsule: ContinuityCapsule, liveRepo: Rep
|
|
|
379
374
|
`[harnery context continuity] Recovered generation ${capsule.generation} after native context compaction.`,
|
|
380
375
|
];
|
|
381
376
|
if (capsule.work.task) lines.push(`Task: ${capsule.work.task}`);
|
|
382
|
-
if (capsule.work.turn_summary) lines.push(`Last progress: ${capsule.work.turn_summary}`);
|
|
383
377
|
if (capsule.work.continuation_note) {
|
|
384
378
|
lines.push(`Continuation note: ${capsule.work.continuation_note}`);
|
|
385
379
|
}
|
|
386
380
|
if (capsule.work.files_held.length > 0) {
|
|
387
381
|
lines.push(`Files held: ${capsule.work.files_held.join(", ")}`);
|
|
388
382
|
}
|
|
389
|
-
if (capsule.work.last_tool) {
|
|
390
|
-
lines.push(
|
|
391
|
-
`Last tool: ${capsule.work.last_tool}${capsule.work.last_tool_target ? ` (${capsule.work.last_tool_target})` : ""}`,
|
|
392
|
-
);
|
|
393
|
-
}
|
|
394
383
|
|
|
395
384
|
const drift: string[] = [];
|
|
396
385
|
if (capsule.repo.branch && liveRepo.branch && capsule.repo.branch !== liveRepo.branch) {
|
|
@@ -446,17 +435,20 @@ function buildWorkSnapshot(
|
|
|
446
435
|
: [];
|
|
447
436
|
return {
|
|
448
437
|
task: clampString(heartbeat?.task, 1_000),
|
|
449
|
-
turn_summary: clampString(heartbeat?.turn_summary, 3_000),
|
|
450
438
|
continuation_note: clampString(continuationNote, 3_000),
|
|
451
439
|
files_held: files.slice(0, MAX_SNAPSHOT_PATHS),
|
|
452
440
|
...(files.length > MAX_SNAPSHOT_PATHS ? { files_held_truncated: true } : {}),
|
|
453
|
-
last_tool: clampString(heartbeat?.last_tool, 200),
|
|
454
|
-
last_tool_target: clampString(heartbeat?.last_tool_target, 1_000),
|
|
455
441
|
};
|
|
456
442
|
}
|
|
457
443
|
|
|
458
444
|
function readHeartbeat(coordRoot: string, instanceId: string): HeartbeatSnapshot | null {
|
|
459
|
-
|
|
445
|
+
const row = readLiveCoordinationRow(coordRoot, instanceId);
|
|
446
|
+
if (!row) return null;
|
|
447
|
+
return {
|
|
448
|
+
model: row.model,
|
|
449
|
+
task: row.task,
|
|
450
|
+
files_touched: row.files_touched,
|
|
451
|
+
};
|
|
460
452
|
}
|
|
461
453
|
|
|
462
454
|
function newState(input: {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface OpenToolSpanForCommandParent {
|
|
2
|
+
span_id: `span_${string}`;
|
|
3
|
+
turn_id?: `tid_${string}`;
|
|
4
|
+
requested_event_id?: `evt_${string}`;
|
|
5
|
+
tool_name?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const SHELL_TOOL_NAMES = new Set([
|
|
9
|
+
"apply_patch",
|
|
10
|
+
"bash",
|
|
11
|
+
"exec",
|
|
12
|
+
"exec_command",
|
|
13
|
+
"execute",
|
|
14
|
+
"powershell",
|
|
15
|
+
"run_command",
|
|
16
|
+
"shell",
|
|
17
|
+
"terminal",
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Choose a command's tool parent only when attribution cannot silently pick
|
|
22
|
+
* the wrong span. A single open tool is unambiguous. With parallel tools,
|
|
23
|
+
* exactly one shell-class span may be selected; every other case stays
|
|
24
|
+
* top-level so any over-count remains visible.
|
|
25
|
+
*/
|
|
26
|
+
export function selectCommandParentSpan(
|
|
27
|
+
spans: readonly OpenToolSpanForCommandParent[],
|
|
28
|
+
turnId: `tid_${string}`,
|
|
29
|
+
): `span_${string}` | undefined {
|
|
30
|
+
const open = spans.filter(
|
|
31
|
+
(span) => span.turn_id === turnId && span.requested_event_id !== undefined,
|
|
32
|
+
);
|
|
33
|
+
if (open.length === 1) return open[0]?.span_id;
|
|
34
|
+
const shell = open.filter((span) => isShellToolName(span.tool_name));
|
|
35
|
+
return shell.length === 1 ? shell[0]?.span_id : undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function isShellToolName(name: string | undefined): boolean {
|
|
39
|
+
if (!name) return false;
|
|
40
|
+
const normalized = name
|
|
41
|
+
.trim()
|
|
42
|
+
.toLowerCase()
|
|
43
|
+
.replace(/^.*[.:/]/, "")
|
|
44
|
+
.replaceAll("-", "_");
|
|
45
|
+
return SHELL_TOOL_NAMES.has(normalized);
|
|
46
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { TSchema } from "@sinclair/typebox";
|
|
2
|
+
import { canonicalJsonV3 } from "./canonical.ts";
|
|
3
|
+
|
|
4
|
+
export interface SchemaAdvanceEligibilityV3 {
|
|
5
|
+
eligible: boolean;
|
|
6
|
+
strict: boolean;
|
|
7
|
+
issues: string[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Mechanical half of ADR 0080's in-place advance gate. It proves that every
|
|
12
|
+
* value accepted by the prior JSON Schema remains accepted by the next schema.
|
|
13
|
+
* Semantic reinterpretations remain breaking even when this structural check
|
|
14
|
+
* passes and require genesis review.
|
|
15
|
+
*/
|
|
16
|
+
export function validateAdditiveSchemaAdvanceV3(
|
|
17
|
+
prior: TSchema,
|
|
18
|
+
next: TSchema,
|
|
19
|
+
): SchemaAdvanceEligibilityV3 {
|
|
20
|
+
const issues: string[] = [];
|
|
21
|
+
const result = isSuperset(prior as JsonSchema, next as JsonSchema, "$", issues);
|
|
22
|
+
return {
|
|
23
|
+
eligible: result.compatible && result.strict,
|
|
24
|
+
strict: result.strict,
|
|
25
|
+
issues: [...new Set(issues)].sort(),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type JsonSchema = Record<string, unknown>;
|
|
30
|
+
type Compatibility = { compatible: boolean; strict: boolean };
|
|
31
|
+
|
|
32
|
+
function isSuperset(
|
|
33
|
+
prior: JsonSchema,
|
|
34
|
+
next: JsonSchema,
|
|
35
|
+
path: string,
|
|
36
|
+
issues: string[],
|
|
37
|
+
): Compatibility {
|
|
38
|
+
const priorAnyOf = schemaArray(prior.anyOf);
|
|
39
|
+
const nextAnyOf = schemaArray(next.anyOf);
|
|
40
|
+
if (priorAnyOf || nextAnyOf) {
|
|
41
|
+
if (!priorAnyOf || !nextAnyOf) return incompatible(path, "union_shape_changed", issues);
|
|
42
|
+
const used = new Set<number>();
|
|
43
|
+
let strict = nextAnyOf.length > priorAnyOf.length;
|
|
44
|
+
for (const [priorIndex, priorBranch] of priorAnyOf.entries()) {
|
|
45
|
+
let match: { index: number; result: Compatibility } | undefined;
|
|
46
|
+
for (const [nextIndex, nextBranch] of nextAnyOf.entries()) {
|
|
47
|
+
if (used.has(nextIndex)) continue;
|
|
48
|
+
const branchIssues: string[] = [];
|
|
49
|
+
const result = isSuperset(
|
|
50
|
+
priorBranch,
|
|
51
|
+
nextBranch,
|
|
52
|
+
`${path}/anyOf/${priorIndex}`,
|
|
53
|
+
branchIssues,
|
|
54
|
+
);
|
|
55
|
+
if (result.compatible) {
|
|
56
|
+
match = { index: nextIndex, result };
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!match)
|
|
61
|
+
return incompatible(`${path}/anyOf/${priorIndex}`, "branch_removed_or_narrowed", issues);
|
|
62
|
+
used.add(match.index);
|
|
63
|
+
strict ||= match.result.strict;
|
|
64
|
+
}
|
|
65
|
+
return { compatible: true, strict };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (prior.type === "object" || next.type === "object") {
|
|
69
|
+
if (prior.type !== "object" || next.type !== "object") {
|
|
70
|
+
return incompatible(path, "type_changed", issues);
|
|
71
|
+
}
|
|
72
|
+
if (prior.additionalProperties !== next.additionalProperties) {
|
|
73
|
+
return incompatible(path, "additional_properties_changed", issues);
|
|
74
|
+
}
|
|
75
|
+
const priorProperties = schemaMap(prior.properties);
|
|
76
|
+
const nextProperties = schemaMap(next.properties);
|
|
77
|
+
const priorRequired = stringSet(prior.required);
|
|
78
|
+
const nextRequired = stringSet(next.required);
|
|
79
|
+
let strict = false;
|
|
80
|
+
for (const name of priorRequired) {
|
|
81
|
+
if (!nextRequired.has(name)) strict = true;
|
|
82
|
+
}
|
|
83
|
+
for (const name of nextRequired) {
|
|
84
|
+
if (!priorRequired.has(name)) {
|
|
85
|
+
return incompatible(`${path}/properties/${name}`, "optional_became_required", issues);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
for (const [name, priorProperty] of Object.entries(priorProperties)) {
|
|
89
|
+
const nextProperty = nextProperties[name];
|
|
90
|
+
if (!nextProperty)
|
|
91
|
+
return incompatible(`${path}/properties/${name}`, "property_removed", issues);
|
|
92
|
+
const result = isSuperset(priorProperty, nextProperty, `${path}/properties/${name}`, issues);
|
|
93
|
+
if (!result.compatible) return result;
|
|
94
|
+
strict ||= result.strict;
|
|
95
|
+
}
|
|
96
|
+
for (const name of Object.keys(nextProperties)) {
|
|
97
|
+
if (!(name in priorProperties)) {
|
|
98
|
+
if (nextRequired.has(name)) {
|
|
99
|
+
return incompatible(`${path}/properties/${name}`, "new_property_is_required", issues);
|
|
100
|
+
}
|
|
101
|
+
strict = true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { compatible: true, strict };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (prior.type === "array" || next.type === "array") {
|
|
108
|
+
if (prior.type !== "array" || next.type !== "array")
|
|
109
|
+
return incompatible(path, "type_changed", issues);
|
|
110
|
+
if (number(next.minItems, 0) < number(prior.minItems, 0)) {
|
|
111
|
+
// A lower minimum broadens acceptance.
|
|
112
|
+
} else if (number(next.minItems, 0) > number(prior.minItems, 0)) {
|
|
113
|
+
return incompatible(path, "array_minimum_narrowed", issues);
|
|
114
|
+
}
|
|
115
|
+
const priorMax = number(prior.maxItems, Number.POSITIVE_INFINITY);
|
|
116
|
+
const nextMax = number(next.maxItems, Number.POSITIVE_INFINITY);
|
|
117
|
+
if (nextMax < priorMax) return incompatible(path, "array_maximum_narrowed", issues);
|
|
118
|
+
const priorItems = prior.items as JsonSchema | undefined;
|
|
119
|
+
const nextItems = next.items as JsonSchema | undefined;
|
|
120
|
+
if (!!priorItems !== !!nextItems) return incompatible(path, "array_items_changed", issues);
|
|
121
|
+
const itemResult =
|
|
122
|
+
priorItems && nextItems
|
|
123
|
+
? isSuperset(priorItems, nextItems, `${path}/items`, issues)
|
|
124
|
+
: { compatible: true, strict: false };
|
|
125
|
+
return {
|
|
126
|
+
compatible: itemResult.compatible,
|
|
127
|
+
strict:
|
|
128
|
+
itemResult.strict ||
|
|
129
|
+
number(next.minItems, 0) < number(prior.minItems, 0) ||
|
|
130
|
+
nextMax > priorMax,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const ignored = new Set(["$id", "title", "description"]);
|
|
135
|
+
const priorComparable = Object.fromEntries(
|
|
136
|
+
Object.entries(prior).filter(([key]) => !ignored.has(key)),
|
|
137
|
+
);
|
|
138
|
+
const nextComparable = Object.fromEntries(
|
|
139
|
+
Object.entries(next).filter(([key]) => !ignored.has(key)),
|
|
140
|
+
);
|
|
141
|
+
if (canonicalJsonV3(priorComparable) !== canonicalJsonV3(nextComparable)) {
|
|
142
|
+
return incompatible(path, "constraint_changed", issues);
|
|
143
|
+
}
|
|
144
|
+
return { compatible: true, strict: false };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function incompatible(path: string, reason: string, issues: string[]): Compatibility {
|
|
148
|
+
issues.push(`${path}:${reason}`);
|
|
149
|
+
return { compatible: false, strict: false };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function schemaArray(value: unknown): JsonSchema[] | undefined {
|
|
153
|
+
return Array.isArray(value) ? (value as JsonSchema[]) : undefined;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function schemaMap(value: unknown): Record<string, JsonSchema> {
|
|
157
|
+
return value && typeof value === "object" ? (value as Record<string, JsonSchema>) : {};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function stringSet(value: unknown): Set<string> {
|
|
161
|
+
return new Set(
|
|
162
|
+
Array.isArray(value) ? value.filter((item): item is string => typeof item === "string") : [],
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function number(value: unknown, fallback: number): number {
|
|
167
|
+
return typeof value === "number" ? value : fallback;
|
|
168
|
+
}
|