harnery 0.32.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +7 -1
- package/dist/commands/adapter.js +2 -2
- package/dist/commands/agents.d.ts +144 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +1408 -565
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +7 -6
- package/dist/commands/backup.d.ts +1 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +29 -16
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +234 -12
- package/dist/commands/checkpoint.d.ts.map +1 -1
- package/dist/commands/checkpoint.js +3 -2
- package/dist/commands/claude-desktop.d.ts +2 -2
- package/dist/commands/claude-desktop.d.ts.map +1 -1
- package/dist/commands/claude-desktop.js +2 -2
- package/dist/commands/context.js +1 -6
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +22 -38
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +91 -28
- package/dist/commands/doctor.d.ts +4 -2
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +55 -7
- package/dist/commands/events.d.ts +5 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +189 -0
- package/dist/commands/governor.d.ts.map +1 -1
- package/dist/commands/governor.js +13 -4
- package/dist/commands/init.d.ts +10 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +233 -51
- package/dist/commands/instructions.d.ts +4 -0
- package/dist/commands/instructions.d.ts.map +1 -0
- package/dist/commands/instructions.js +100 -0
- package/dist/commands/journal.d.ts.map +1 -1
- package/dist/commands/journal.js +4 -13
- package/dist/commands/ledger-v3.d.ts +5 -0
- package/dist/commands/ledger-v3.d.ts.map +1 -0
- package/dist/commands/ledger-v3.js +91 -0
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +15 -6
- package/dist/commands/sync.d.ts +1 -1
- package/dist/commands/sync.js +1 -1
- package/dist/commands/web.d.ts +6 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +67 -7
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +22 -5
- package/dist/core/adapter.d.ts +5 -0
- package/dist/core/adapter.d.ts.map +1 -0
- package/dist/core/adapter.js +1 -0
- package/dist/core/adapters/attest.d.ts +5 -2
- package/dist/core/adapters/attest.d.ts.map +1 -1
- package/dist/core/adapters/attest.js +8 -3
- package/dist/core/adapters/profiles.d.ts +6 -6
- package/dist/core/adapters/profiles.d.ts.map +1 -1
- package/dist/core/adapters/profiles.js +4 -4
- package/dist/core/agents/canonical-emit.d.ts +17 -15
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +27 -25
- package/dist/core/agents/cli.js +212 -235
- package/dist/core/agents/codex-archive-v3.d.ts +14 -0
- package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
- package/dist/core/agents/codex-archive-v3.js +110 -0
- package/dist/core/agents/coord-client.d.ts +19 -70
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +65 -155
- package/dist/core/agents/finalization.d.ts +4 -1
- package/dist/core/agents/finalization.d.ts.map +1 -1
- package/dist/core/agents/finalization.js +89 -32
- package/dist/core/agents/index.d.ts +5 -5
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +5 -5
- package/dist/core/agents/live-authority-v3.d.ts +59 -0
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
- package/dist/core/agents/live-authority-v3.js +233 -0
- package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
- package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
- package/dist/core/agents/live-lifecycle-v3.js +91 -0
- package/dist/core/agents/live-observation-v3.d.ts +25 -0
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
- package/dist/core/agents/live-observation-v3.js +157 -0
- package/dist/core/agents/render/prompt-context.d.ts +10 -4
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +61 -55
- package/dist/core/agents/render/session-context.d.ts +1 -1
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +15 -33
- package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
- package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/claim-conflict.js +79 -127
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +3 -18
- package/dist/core/agents/rules/stop-hook.d.ts +9 -50
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +193 -236
- package/dist/core/agents/session-events.d.ts +5 -7
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +127 -95
- package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
- package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
- package/dist/core/agents/session-finalization-state-v3.js +40 -0
- package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
- package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
- package/dist/core/agents/session-finalizer-v3.js +734 -0
- package/dist/core/agents/session-name-display.d.ts +40 -0
- package/dist/core/agents/session-name-display.d.ts.map +1 -0
- package/dist/core/agents/session-name-display.js +119 -0
- package/dist/core/agents/state/activity-log.d.ts +3 -3
- package/dist/core/agents/state/activity-log.d.ts.map +1 -1
- package/dist/core/agents/state/activity-log.js +7 -16
- package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +59 -199
- package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
- package/dist/core/agents/state/live-coordination-view.js +209 -0
- package/dist/core/agents/state/session-state.d.ts +45 -0
- package/dist/core/agents/state/session-state.d.ts.map +1 -0
- package/dist/core/agents/state/session-state.js +90 -0
- package/dist/core/agents/state/stale-sweep.d.ts +1 -1
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +26 -15
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +5 -7
- package/dist/core/config.d.ts +33 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +98 -2
- package/dist/core/context/index.d.ts +1 -4
- package/dist/core/context/index.d.ts.map +1 -1
- package/dist/core/context/index.js +9 -9
- package/dist/core/events/span-parent.d.ts +15 -0
- package/dist/core/events/span-parent.d.ts.map +1 -0
- package/dist/core/events/span-parent.js +34 -0
- package/dist/core/events/v3/advance.d.ts +14 -0
- package/dist/core/events/v3/advance.d.ts.map +1 -0
- package/dist/core/events/v3/advance.js +134 -0
- package/dist/core/events/v3/authority-outbox.d.ts +78 -0
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
- package/dist/core/events/v3/authority-outbox.js +399 -0
- package/dist/core/events/v3/base-builder.d.ts +20 -0
- package/dist/core/events/v3/base-builder.d.ts.map +1 -0
- package/dist/core/events/v3/base-builder.js +29 -0
- package/dist/core/events/v3/base-contract.d.ts +7576 -0
- package/dist/core/events/v3/base-contract.d.ts.map +1 -0
- package/dist/core/events/v3/base-contract.js +647 -0
- package/dist/core/events/v3/bootstrap.d.ts +34 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
- package/dist/core/events/v3/bootstrap.js +175 -0
- package/dist/core/events/v3/builder.d.ts +20 -0
- package/dist/core/events/v3/builder.d.ts.map +1 -0
- package/dist/core/events/v3/builder.js +28 -0
- package/dist/core/events/v3/canonical.d.ts +31 -0
- package/dist/core/events/v3/canonical.d.ts.map +1 -0
- package/dist/core/events/v3/canonical.js +100 -0
- package/dist/core/events/v3/capabilities.d.ts +31 -0
- package/dist/core/events/v3/capabilities.d.ts.map +1 -0
- package/dist/core/events/v3/capabilities.js +107 -0
- package/dist/core/events/v3/capability-drift.d.ts +22 -0
- package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
- package/dist/core/events/v3/capability-drift.js +134 -0
- package/dist/core/events/v3/catalog.d.ts +38 -0
- package/dist/core/events/v3/catalog.d.ts.map +1 -0
- package/dist/core/events/v3/catalog.js +135 -0
- package/dist/core/events/v3/clock-order.d.ts +34 -0
- package/dist/core/events/v3/clock-order.d.ts.map +1 -0
- package/dist/core/events/v3/clock-order.js +35 -0
- package/dist/core/events/v3/contract.d.ts +171 -0
- package/dist/core/events/v3/contract.d.ts.map +1 -0
- package/dist/core/events/v3/contract.js +180 -0
- package/dist/core/events/v3/control.d.ts +111 -0
- package/dist/core/events/v3/control.d.ts.map +1 -0
- package/dist/core/events/v3/control.js +419 -0
- package/dist/core/events/v3/coordination-view.d.ts +69 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
- package/dist/core/events/v3/coordination-view.js +119 -0
- package/dist/core/events/v3/economics.d.ts +77 -0
- package/dist/core/events/v3/economics.d.ts.map +1 -0
- package/dist/core/events/v3/economics.js +274 -0
- package/dist/core/events/v3/finalization-view.d.ts +26 -0
- package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
- package/dist/core/events/v3/finalization-view.js +37 -0
- package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
- package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
- package/dist/core/events/v3/fingerprint-keys.js +217 -0
- package/dist/core/events/v3/generated.d.ts +4 -0
- package/dist/core/events/v3/generated.d.ts.map +1 -0
- package/dist/core/events/v3/generated.js +47 -0
- package/dist/core/events/v3/ids.d.ts +9 -0
- package/dist/core/events/v3/ids.d.ts.map +1 -0
- package/dist/core/events/v3/ids.js +25 -0
- package/dist/core/events/v3/index.d.ts +35 -0
- package/dist/core/events/v3/index.d.ts.map +1 -0
- package/dist/core/events/v3/index.js +33 -0
- package/dist/core/events/v3/latency.d.ts +63 -0
- package/dist/core/events/v3/latency.d.ts.map +1 -0
- package/dist/core/events/v3/latency.js +412 -0
- package/dist/core/events/v3/live-feed.d.ts +45 -0
- package/dist/core/events/v3/live-feed.d.ts.map +1 -0
- package/dist/core/events/v3/live-feed.js +246 -0
- package/dist/core/events/v3/live-observation.d.ts +35 -0
- package/dist/core/events/v3/live-observation.d.ts.map +1 -0
- package/dist/core/events/v3/live-observation.js +1 -0
- package/dist/core/events/v3/live-routing.d.ts +57 -0
- package/dist/core/events/v3/live-routing.d.ts.map +1 -0
- package/dist/core/events/v3/live-routing.js +107 -0
- package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/command-recorder.js +477 -0
- package/dist/core/events/v3/producers/command.d.ts +50 -0
- package/dist/core/events/v3/producers/command.d.ts.map +1 -0
- package/dist/core/events/v3/producers/command.js +135 -0
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
- package/dist/core/events/v3/producers/coordination.d.ts +90 -0
- package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
- package/dist/core/events/v3/producers/coordination.js +229 -0
- package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
- package/dist/core/events/v3/producers/hook-base.js +424 -0
- package/dist/core/events/v3/producers/hook.d.ts +29 -0
- package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
- package/dist/core/events/v3/producers/hook.js +71 -0
- package/dist/core/events/v3/producers/intake.d.ts +65 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
- package/dist/core/events/v3/producers/intake.js +244 -0
- package/dist/core/events/v3/producers/recorder.d.ts +240 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/recorder.js +2176 -0
- package/dist/core/events/v3/projection.d.ts +101 -0
- package/dist/core/events/v3/projection.d.ts.map +1 -0
- package/dist/core/events/v3/projection.js +479 -0
- package/dist/core/events/v3/reader.d.ts +75 -0
- package/dist/core/events/v3/reader.d.ts.map +1 -0
- package/dist/core/events/v3/reader.js +778 -0
- package/dist/core/events/v3/recovery-record.d.ts +47 -0
- package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
- package/dist/core/events/v3/recovery-record.js +167 -0
- package/dist/core/events/v3/recovery.d.ts +22 -0
- package/dist/core/events/v3/recovery.d.ts.map +1 -0
- package/dist/core/events/v3/recovery.js +227 -0
- package/dist/core/events/v3/span-state.d.ts +52 -0
- package/dist/core/events/v3/span-state.d.ts.map +1 -0
- package/dist/core/events/v3/span-state.js +142 -0
- package/dist/core/events/v3/targets.d.ts +23 -0
- package/dist/core/events/v3/targets.d.ts.map +1 -0
- package/dist/core/events/v3/targets.js +134 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
- package/dist/core/events/v3/turn-telemetry.js +168 -0
- package/dist/core/events/v3/validate.d.ts +9 -0
- package/dist/core/events/v3/validate.d.ts.map +1 -0
- package/dist/core/events/v3/validate.js +281 -0
- package/dist/core/events/v3/writer.d.ts +56 -0
- package/dist/core/events/v3/writer.d.ts.map +1 -0
- package/dist/core/events/v3/writer.js +335 -0
- package/dist/core/governor/index.d.ts +1 -1
- package/dist/core/governor/index.d.ts.map +1 -1
- package/dist/core/governor/index.js +1 -1
- package/dist/core/governor/plan-api.d.ts +2 -1
- package/dist/core/governor/plan-api.d.ts.map +1 -1
- package/dist/core/governor/plan-api.js +6 -3
- package/dist/core/governor/read.d.ts +1 -1
- package/dist/core/governor/read.d.ts.map +1 -1
- package/dist/core/governor/read.js +1 -1
- package/dist/core/governor/state.d.ts +9 -0
- package/dist/core/governor/state.d.ts.map +1 -1
- package/dist/core/governor/state.js +40 -3
- package/dist/core/guard/config.d.ts +5 -0
- package/dist/core/guard/config.d.ts.map +1 -0
- package/dist/core/guard/config.js +157 -0
- package/dist/core/guard/coordinator.d.ts +14 -0
- package/dist/core/guard/coordinator.d.ts.map +1 -0
- package/dist/core/guard/coordinator.js +173 -0
- package/dist/core/guard/evaluator.d.ts +4 -0
- package/dist/core/guard/evaluator.d.ts.map +1 -0
- package/dist/core/guard/evaluator.js +242 -0
- package/dist/core/guard/evidence-v3.d.ts +15 -0
- package/dist/core/guard/evidence-v3.d.ts.map +1 -0
- package/dist/core/guard/evidence-v3.js +171 -0
- package/dist/core/guard/index.d.ts +10 -0
- package/dist/core/guard/index.d.ts.map +1 -0
- package/dist/core/guard/index.js +6 -0
- package/dist/core/guard/live-source-v3.d.ts +40 -0
- package/dist/core/guard/live-source-v3.d.ts.map +1 -0
- package/dist/core/guard/live-source-v3.js +128 -0
- package/dist/core/guard/storage.d.ts +27 -0
- package/dist/core/guard/storage.d.ts.map +1 -0
- package/dist/core/guard/storage.js +140 -0
- package/dist/core/guard/types.d.ts +119 -0
- package/dist/core/guard/types.d.ts.map +1 -0
- package/dist/core/guard/types.js +1 -0
- package/dist/core/hooks/adapter/detect.d.ts +18 -1
- package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
- package/dist/core/hooks/adapter/detect.js +29 -0
- package/dist/core/hooks/adapter/events.d.ts +7 -4
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +13 -4
- package/dist/core/hooks/adapter/output.d.ts +2 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.d.ts +7 -4
- package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.js +64 -24
- package/dist/core/hooks/adapter/wiring.d.ts +30 -4
- package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
- package/dist/core/hooks/adapter/wiring.js +89 -11
- package/dist/core/hooks/cli.d.ts +1 -1
- package/dist/core/hooks/cli.js +345 -400
- package/dist/core/hooks/codex-authorization.d.ts +30 -0
- package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
- package/dist/core/hooks/codex-authorization.js +199 -0
- package/dist/core/hooks/effects/image-capture.d.ts +20 -34
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +212 -221
- package/dist/core/hooks/effects/index.d.ts +1 -9
- package/dist/core/hooks/effects/index.d.ts.map +1 -1
- package/dist/core/hooks/effects/index.js +1 -24
- package/dist/core/hooks/events/input-hash.d.ts +7 -0
- package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
- package/dist/core/hooks/events/input-hash.js +43 -0
- package/dist/core/hooks/index.d.ts +4 -3
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/index.js +2 -3
- package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
- package/dist/core/hooks/resolve/coord-root.js +1 -1
- package/dist/core/hooks/resolve/owner.d.ts +16 -15
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +51 -42
- package/dist/core/hooks/resolve/transcript.d.ts +33 -3
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +155 -14
- package/dist/core/hooks/session-name-presence.d.ts +9 -10
- package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
- package/dist/core/hooks/session-name-presence.js +15 -15
- package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
- package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
- package/dist/core/journal/index.d.ts +2 -2
- package/dist/core/journal/index.d.ts.map +1 -1
- package/dist/core/journal/index.js +9 -22
- package/dist/core/presence/blob.d.ts +8 -3
- package/dist/core/presence/blob.d.ts.map +1 -1
- package/dist/core/presence/blob.js +54 -41
- package/dist/core/presence/codec-digest.d.ts +29 -0
- package/dist/core/presence/codec-digest.d.ts.map +1 -0
- package/dist/core/presence/codec-digest.js +170 -0
- package/dist/core/presence/index.js +15 -1
- package/dist/core/presence/relay-client.d.ts +1 -1
- package/dist/core/presence/relay-client.d.ts.map +1 -1
- package/dist/core/presence/relay-client.js +5 -5
- package/dist/core/work/index.d.ts +1 -1
- package/dist/core/work/index.d.ts.map +1 -1
- package/dist/core/work/index.js +1 -1
- package/dist/core/work/read.d.ts +1 -1
- package/dist/core/work/read.d.ts.map +1 -1
- package/dist/core/work/read.js +1 -1
- package/dist/core/work/runner.d.ts.map +1 -1
- package/dist/core/work/runner.js +6 -0
- package/dist/core/work/state.d.ts +9 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +17 -3
- package/dist/core/workflow/engine.js +24 -25
- package/dist/core/workflow/live-session-v3.d.ts +19 -0
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
- package/dist/core/workflow/live-session-v3.js +86 -0
- package/dist/core/workflow/scope-id.d.ts +3 -0
- package/dist/core/workflow/scope-id.d.ts.map +1 -0
- package/dist/core/workflow/scope-id.js +5 -0
- package/dist/core/workflow/workspaces/leases.d.ts +4 -0
- package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/leases.js +53 -19
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/browser/client.d.ts +41 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +203 -0
- package/dist/lib/browser/critique.d.ts +28 -2
- package/dist/lib/browser/critique.d.ts.map +1 -1
- package/dist/lib/browser/critique.js +74 -18
- package/dist/lib/browser/geometry.d.ts +1 -1
- package/dist/lib/browser/geometry.d.ts.map +1 -1
- package/dist/lib/browser/geometry.js +130 -6
- package/dist/lib/browser/index.d.ts +3 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +3 -0
- package/dist/lib/browser/qa-plan.d.ts +174 -0
- package/dist/lib/browser/qa-plan.d.ts.map +1 -0
- package/dist/lib/browser/qa-plan.js +321 -0
- package/dist/lib/browser/qa-reuse.d.ts +99 -0
- package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
- package/dist/lib/browser/qa-reuse.js +222 -0
- package/dist/lib/browser/qa-snapshot.d.ts +64 -0
- package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
- package/dist/lib/browser/qa-snapshot.js +171 -0
- package/dist/lib/browser/runts.d.ts.map +1 -1
- package/dist/lib/browser/runts.js +22 -1
- package/dist/lib/browser/tiling.d.ts +71 -0
- package/dist/lib/browser/tiling.d.ts.map +1 -0
- package/dist/lib/browser/tiling.js +118 -0
- package/dist/lib/context/index.d.ts +0 -3
- package/dist/lib/context/index.d.ts.map +1 -1
- package/dist/lib/context/index.js +20 -42
- package/dist/lib/council/index.d.ts +2 -2
- package/dist/lib/council/index.d.ts.map +1 -1
- package/dist/lib/council/index.js +9 -20
- package/dist/lib/docs-frontmatter.d.ts +1 -6
- package/dist/lib/docs-frontmatter.d.ts.map +1 -1
- package/dist/lib/docs-frontmatter.js +12 -78
- package/dist/lib/docs-index.d.ts +9 -0
- package/dist/lib/docs-index.d.ts.map +1 -1
- package/dist/lib/docs-index.js +32 -3
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +14 -30
- package/dist/lib/docs-metadata-audit.d.ts +19 -0
- package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
- package/dist/lib/docs-metadata-audit.js +132 -0
- package/dist/lib/docs-metadata-managed.d.ts +23 -0
- package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
- package/dist/lib/docs-metadata-managed.js +78 -0
- package/dist/lib/docs-metadata-sync.d.ts +20 -0
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
- package/dist/lib/docs-metadata-sync.js +222 -0
- package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
- package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
- package/dist/lib/docs-metadata-v2-schema.js +134 -0
- package/dist/lib/docs-metadata-v2.d.ts +21 -0
- package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
- package/dist/lib/docs-metadata-v2.js +424 -0
- package/dist/lib/docs-new.d.ts +11 -0
- package/dist/lib/docs-new.d.ts.map +1 -0
- package/dist/lib/docs-new.js +52 -0
- package/dist/lib/docs-sweep.d.ts.map +1 -1
- package/dist/lib/docs-sweep.js +45 -29
- package/dist/lib/headless/index.d.ts +98 -0
- package/dist/lib/headless/index.d.ts.map +1 -0
- package/dist/lib/headless/index.js +211 -0
- package/dist/lib/identities/assume.d.ts +4 -4
- package/dist/lib/identities/assume.d.ts.map +1 -1
- package/dist/lib/identities/assume.js +52 -68
- package/dist/lib/instructions/apply.d.ts +5 -4
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +32 -20
- package/dist/lib/instructions/bundle.d.ts +33 -0
- package/dist/lib/instructions/bundle.d.ts.map +1 -0
- package/dist/lib/instructions/bundle.js +149 -0
- package/dist/lib/instructions/splice.d.ts +0 -1
- package/dist/lib/instructions/splice.d.ts.map +1 -1
- package/dist/lib/instructions/splice.js +22 -6
- package/dist/lib/instructions/templates.d.ts +7 -5
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +79 -9
- package/package.json +27 -6
- package/schemas/config.schema.json +120 -2
- package/schemas/docs-metadata-v2.schema.json +441 -0
- package/schemas/event-v3.schema.json +24472 -0
- package/src/commander.ts +7 -1
- package/src/commands/adapter.ts +2 -2
- package/src/commands/agents.ts +1737 -570
- package/src/commands/artifacts.ts +7 -6
- package/src/commands/backup.ts +29 -21
- package/src/commands/browse.ts +349 -8
- package/src/commands/checkpoint.ts +4 -3
- package/src/commands/claude-desktop.ts +7 -5
- package/src/commands/context.ts +1 -6
- package/src/commands/decision.ts +27 -44
- package/src/commands/docs.ts +100 -33
- package/src/commands/doctor.ts +73 -8
- package/src/commands/events.ts +256 -0
- package/src/commands/governor.ts +18 -4
- package/src/commands/init.ts +264 -57
- package/src/commands/instructions.ts +129 -0
- package/src/commands/journal.ts +4 -13
- package/src/commands/ledger-v3.ts +111 -0
- package/src/commands/presence.ts +18 -11
- package/src/commands/sync.ts +1 -1
- package/src/commands/web.ts +67 -8
- package/src/commands/work.ts +28 -5
- package/src/core/adapter.ts +5 -0
- package/src/core/adapters/attest.ts +8 -3
- package/src/core/adapters/profiles.ts +4 -6
- package/src/core/agents/canonical-emit.ts +39 -28
- package/src/core/agents/cli.ts +242 -263
- package/src/core/agents/codex-archive-v3.ts +138 -0
- package/src/core/agents/coord-client.ts +75 -177
- package/src/core/agents/finalization.ts +120 -38
- package/src/core/agents/index.ts +5 -5
- package/src/core/agents/live-authority-v3.ts +375 -0
- package/src/core/agents/live-lifecycle-v3.ts +140 -0
- package/src/core/agents/live-observation-v3.ts +216 -0
- package/src/core/agents/render/prompt-context.ts +89 -55
- package/src/core/agents/render/session-context.ts +23 -32
- package/src/core/agents/rules/claim-conflict.ts +85 -126
- package/src/core/agents/rules/commit-conflict.ts +3 -14
- package/src/core/agents/rules/stop-hook.ts +239 -293
- package/src/core/agents/session-events.ts +137 -104
- package/src/core/agents/session-finalization-state-v3.ts +90 -0
- package/src/core/agents/session-finalizer-v3.ts +953 -0
- package/src/core/agents/session-name-display.ts +149 -0
- package/src/core/agents/state/activity-log.ts +6 -14
- package/src/core/agents/state/heartbeat-writer.ts +98 -242
- package/src/core/agents/state/live-coordination-view.ts +290 -0
- package/src/core/agents/state/session-state.ts +143 -0
- package/src/core/agents/state/stale-sweep.ts +40 -17
- package/src/core/artifacts/index.ts +4 -5
- package/src/core/config.ts +148 -3
- package/src/core/context/index.ts +9 -17
- package/src/core/events/span-parent.ts +46 -0
- package/src/core/events/v3/advance.ts +168 -0
- package/src/core/events/v3/authority-outbox.ts +548 -0
- package/src/core/events/v3/base-builder.ts +60 -0
- package/src/core/events/v3/base-contract.ts +882 -0
- package/src/core/events/v3/bootstrap.ts +226 -0
- package/src/core/events/v3/builder.ts +59 -0
- package/src/core/events/v3/canonical.ts +153 -0
- package/src/core/events/v3/capabilities.ts +171 -0
- package/src/core/events/v3/capability-drift.ts +177 -0
- package/src/core/events/v3/catalog.ts +202 -0
- package/src/core/events/v3/clock-order.ts +41 -0
- package/src/core/events/v3/contract.ts +365 -0
- package/src/core/events/v3/control.ts +576 -0
- package/src/core/events/v3/coordination-view.ts +193 -0
- package/src/core/events/v3/economics.ts +384 -0
- package/src/core/events/v3/finalization-view.ts +67 -0
- package/src/core/events/v3/fingerprint-keys.ts +260 -0
- package/src/core/events/v3/generated.ts +48 -0
- package/src/core/events/v3/ids.ts +33 -0
- package/src/core/events/v3/index.ts +322 -0
- package/src/core/events/v3/latency.ts +551 -0
- package/src/core/events/v3/live-feed.ts +319 -0
- package/src/core/events/v3/live-observation.ts +39 -0
- package/src/core/events/v3/live-routing.ts +135 -0
- package/src/core/events/v3/producers/command-recorder.ts +631 -0
- package/src/core/events/v3/producers/command.ts +201 -0
- package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
- package/src/core/events/v3/producers/coordination.ts +355 -0
- package/src/core/events/v3/producers/hook-base.ts +578 -0
- package/src/core/events/v3/producers/hook.ts +119 -0
- package/src/core/events/v3/producers/intake.ts +319 -0
- package/src/core/events/v3/producers/recorder.ts +2805 -0
- package/src/core/events/v3/projection.ts +653 -0
- package/src/core/events/v3/reader.ts +1127 -0
- package/src/core/events/v3/recovery-record.ts +244 -0
- package/src/core/events/v3/recovery.ts +271 -0
- package/src/core/events/v3/span-state.ts +187 -0
- package/src/core/events/v3/targets.ts +182 -0
- package/src/core/events/v3/turn-telemetry.ts +259 -0
- package/src/core/events/v3/validate.ts +361 -0
- package/src/core/events/v3/writer.ts +419 -0
- package/src/core/governor/index.ts +3 -0
- package/src/core/governor/plan-api.ts +10 -2
- package/src/core/governor/read.ts +3 -0
- package/src/core/governor/state.ts +52 -5
- package/src/core/guard/config.ts +206 -0
- package/src/core/guard/coordinator.ts +227 -0
- package/src/core/guard/evaluator.ts +343 -0
- package/src/core/guard/evidence-v3.ts +227 -0
- package/src/core/guard/index.ts +35 -0
- package/src/core/guard/live-source-v3.ts +204 -0
- package/src/core/guard/storage.ts +188 -0
- package/src/core/guard/types.ts +152 -0
- package/src/core/hooks/adapter/detect.ts +28 -1
- package/src/core/hooks/adapter/events.ts +15 -6
- package/src/core/hooks/adapter/output.ts +7 -2
- package/src/core/hooks/adapter/parse.ts +81 -36
- package/src/core/hooks/adapter/wiring.ts +119 -13
- package/src/core/hooks/cli.ts +398 -422
- package/src/core/hooks/codex-authorization.ts +253 -0
- package/src/core/hooks/effects/image-capture.ts +228 -238
- package/src/core/hooks/effects/index.ts +1 -36
- package/src/core/hooks/events/input-hash.ts +47 -0
- package/src/core/hooks/index.ts +4 -11
- package/src/core/hooks/resolve/coord-root.ts +1 -1
- package/src/core/hooks/resolve/owner.ts +52 -45
- package/src/core/hooks/resolve/transcript.ts +165 -14
- package/src/core/hooks/session-name-presence.ts +14 -15
- package/src/core/hooks/unsafe-cross-shell.ts +1 -1
- package/src/core/journal/index.ts +15 -22
- package/src/core/presence/blob.ts +63 -38
- package/src/core/presence/codec-digest.ts +215 -0
- package/src/core/presence/index.ts +18 -1
- package/src/core/presence/relay-client.ts +5 -5
- package/src/core/work/index.ts +3 -0
- package/src/core/work/read.ts +3 -0
- package/src/core/work/runner.ts +6 -0
- package/src/core/work/state.ts +27 -3
- package/src/core/workflow/engine.ts +24 -24
- package/src/core/workflow/live-session-v3.ts +126 -0
- package/src/core/workflow/scope-id.ts +6 -0
- package/src/core/workflow/workspaces/leases.ts +56 -19
- package/src/index.ts +1 -1
- package/src/lib/browser/client.ts +230 -0
- package/src/lib/browser/critique.ts +104 -27
- package/src/lib/browser/geometry.ts +143 -14
- package/src/lib/browser/index.ts +34 -0
- package/src/lib/browser/qa-plan.ts +501 -0
- package/src/lib/browser/qa-reuse.ts +306 -0
- package/src/lib/browser/qa-snapshot.ts +223 -0
- package/src/lib/browser/runts.ts +27 -2
- package/src/lib/browser/tiling.ts +164 -0
- package/src/lib/context/index.ts +22 -46
- package/src/lib/council/index.ts +9 -21
- package/src/lib/docs-frontmatter.ts +8 -79
- package/src/lib/docs-index.ts +33 -3
- package/src/lib/docs-lint.ts +15 -29
- package/src/lib/docs-metadata-audit.ts +166 -0
- package/src/lib/docs-metadata-managed.ts +83 -0
- package/src/lib/docs-metadata-sync.ts +262 -0
- package/src/lib/docs-metadata-v2-schema.ts +138 -0
- package/src/lib/docs-metadata-v2.ts +646 -0
- package/src/lib/docs-new.ts +63 -0
- package/src/lib/docs-sweep.ts +42 -28
- package/src/lib/headless/index.ts +287 -0
- package/src/lib/identities/assume.ts +67 -86
- package/src/lib/instructions/apply.ts +33 -20
- package/src/lib/instructions/bundle.ts +199 -0
- package/src/lib/instructions/splice.ts +21 -7
- package/src/lib/instructions/templates.ts +85 -13
- package/dist/core/agents/cli-emit.d.ts +0 -27
- package/dist/core/agents/cli-emit.d.ts.map +0 -1
- package/dist/core/agents/cli-emit.js +0 -57
- package/dist/core/agents/codex-replay.d.ts +0 -29
- package/dist/core/agents/codex-replay.d.ts.map +0 -1
- package/dist/core/agents/codex-replay.js +0 -138
- package/dist/core/agents/events/consume.d.ts +0 -82
- package/dist/core/agents/events/consume.d.ts.map +0 -1
- package/dist/core/agents/events/consume.js +0 -195
- package/dist/core/agents/events/emit.d.ts +0 -42
- package/dist/core/agents/events/emit.d.ts.map +0 -1
- package/dist/core/agents/events/emit.js +0 -75
- package/dist/core/agents/events/ulid.d.ts +0 -11
- package/dist/core/agents/events/ulid.d.ts.map +0 -1
- package/dist/core/agents/events/ulid.js +0 -47
- package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
- package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
- package/dist/core/agents/state/heartbeat-projector.js +0 -527
- package/dist/core/hooks/events/emit.d.ts +0 -31
- package/dist/core/hooks/events/emit.d.ts.map +0 -1
- package/dist/core/hooks/events/emit.js +0 -93
- package/dist/core/hooks/events/rotate.d.ts +0 -43
- package/dist/core/hooks/events/rotate.d.ts.map +0 -1
- package/dist/core/hooks/events/rotate.js +0 -142
- package/dist/core/hooks/events/schema.d.ts +0 -312
- package/dist/core/hooks/events/schema.d.ts.map +0 -1
- package/dist/core/hooks/events/schema.js +0 -12
- package/dist/core/hooks/events/ulid.d.ts +0 -10
- package/dist/core/hooks/events/ulid.d.ts.map +0 -1
- package/dist/core/hooks/events/ulid.js +0 -47
- package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
- package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
- package/dist/lib/docs-frontmatter-migrate.js +0 -364
- package/src/core/agents/cli-emit.ts +0 -64
- package/src/core/agents/codex-replay.ts +0 -163
- package/src/core/agents/events/consume.ts +0 -254
- package/src/core/agents/events/emit.ts +0 -115
- package/src/core/agents/events/ulid.ts +0 -51
- package/src/core/agents/state/heartbeat-projector.ts +0 -582
- package/src/core/hooks/events/emit.ts +0 -125
- package/src/core/hooks/events/rotate.ts +0 -151
- package/src/core/hooks/events/schema.ts +0 -538
- package/src/core/hooks/events/ulid.ts +0 -51
- package/src/lib/docs-frontmatter-migrate.ts +0 -427
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const TERMINAL_ACTIVITY_EVENTS = new Set([
|
|
2
|
+
"session.ended",
|
|
3
|
+
"agent.completed",
|
|
4
|
+
"turn.completed",
|
|
5
|
+
]);
|
|
6
|
+
/**
|
|
7
|
+
* Apply one canonical event to the two independent state axes.
|
|
8
|
+
*
|
|
9
|
+
* The table is deliberately evidence-only. Output chunks, post-tool events,
|
|
10
|
+
* narration, coordination commands, and elapsed time cannot clear an observed
|
|
11
|
+
* input wait. A command start only counts as progress when the session was
|
|
12
|
+
* already inside an open turn (`working` or `needs_input`).
|
|
13
|
+
*/
|
|
14
|
+
export function applySessionStateEvent(current, event) {
|
|
15
|
+
const next = { ...current };
|
|
16
|
+
if (event.event_type === "session.started" ||
|
|
17
|
+
event.event_type === "session.resumed" ||
|
|
18
|
+
event.event_type === "agent.started") {
|
|
19
|
+
setActivity(next, "idle", event);
|
|
20
|
+
}
|
|
21
|
+
else if (event.event_type === "turn.started" || event.event_type === "tool.requested") {
|
|
22
|
+
setActivity(next, "working", event);
|
|
23
|
+
}
|
|
24
|
+
else if (event.event_type === "wait.started") {
|
|
25
|
+
setActivity(next, "needs_input", event);
|
|
26
|
+
}
|
|
27
|
+
else if (event.event_type === "wait.ended") {
|
|
28
|
+
setActivity(next, "working", event);
|
|
29
|
+
}
|
|
30
|
+
else if (event.event_type === "command.started" &&
|
|
31
|
+
(current.activity === "working" || current.activity === "needs_input")) {
|
|
32
|
+
setActivity(next, "working", event);
|
|
33
|
+
}
|
|
34
|
+
else if (TERMINAL_ACTIVITY_EVENTS.has(event.event_type)) {
|
|
35
|
+
setActivity(next, "idle", event);
|
|
36
|
+
}
|
|
37
|
+
if (event.event_type === "coord.lifecycle_changed") {
|
|
38
|
+
const payload = event.payload ?? {};
|
|
39
|
+
const state = field(payload, "new_state");
|
|
40
|
+
if (state === "active" || state === "blocked" || state === "done") {
|
|
41
|
+
next.task_state = state;
|
|
42
|
+
next.task_state_updated_at = event.ts;
|
|
43
|
+
const reason = field(payload, "reason");
|
|
44
|
+
if (typeof reason === "string" && reason.length > 0) {
|
|
45
|
+
next.task_state_reason = reason;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
delete next.task_state_reason;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return next;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Rebuild both axes from canonical events after a heartbeat has disappeared.
|
|
56
|
+
* Events may be the whole ledger or an already-filtered session slice.
|
|
57
|
+
*/
|
|
58
|
+
export function foldSessionState(events, selector = {}) {
|
|
59
|
+
const ordered = events
|
|
60
|
+
.map((event, index) => ({ event, index }))
|
|
61
|
+
.filter(({ event }) => matches(event, selector))
|
|
62
|
+
.sort((a, b) => timestamp(a.event) - timestamp(b.event) || a.index - b.index);
|
|
63
|
+
let fields = {};
|
|
64
|
+
for (const { event } of ordered)
|
|
65
|
+
fields = applySessionStateEvent(fields, event);
|
|
66
|
+
return {
|
|
67
|
+
...fields,
|
|
68
|
+
activity: fields.activity ?? "unknown",
|
|
69
|
+
task_state: fields.task_state ?? "active",
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function setActivity(target, activity, event) {
|
|
73
|
+
target.activity = activity;
|
|
74
|
+
target.activity_updated_at = event.ts;
|
|
75
|
+
target.activity_source = event.event_type;
|
|
76
|
+
}
|
|
77
|
+
function matches(event, selector) {
|
|
78
|
+
if (selector.instance_id && event.instance_id !== selector.instance_id)
|
|
79
|
+
return false;
|
|
80
|
+
if (selector.session_id && event.session_id !== selector.session_id)
|
|
81
|
+
return false;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
function timestamp(event) {
|
|
85
|
+
const parsed = Date.parse(event.ts);
|
|
86
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
87
|
+
}
|
|
88
|
+
function field(data, key) {
|
|
89
|
+
return data[key];
|
|
90
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Stale-sweep: prune dead heartbeats + orphaned pid-map + .last-peer-hash
|
|
3
3
|
* files.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Runs after session.started to clean up crashed-peer detritus before the new
|
|
6
6
|
* session's UX layer reads peer state.
|
|
7
7
|
*
|
|
8
8
|
* Freshness threshold defaults to 600s; configurable via the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stale-sweep.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/stale-sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"stale-sweep.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/stale-sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoDH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG;IAC7C,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CA6IA"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Stale-sweep: prune dead heartbeats + orphaned pid-map + .last-peer-hash
|
|
3
3
|
* files.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Runs after session.started to clean up crashed-peer detritus before the new
|
|
6
6
|
* session's UX layer reads peer state.
|
|
7
7
|
*
|
|
8
8
|
* Freshness threshold defaults to 600s; configurable via the
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import { existsSync, readdirSync, readFileSync, statSync, unlinkSync } from "node:fs";
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
import { coordFreshnessSeconds } from "../../config.js";
|
|
15
|
-
import {
|
|
15
|
+
import { recordLiveSweepObservationV3 } from "../live-lifecycle-v3.js";
|
|
16
16
|
/** platform → adapter, for the swept-event envelope (mirrors heartbeat-writer's adapterOf). */
|
|
17
17
|
function adapterFromPlatform(platform) {
|
|
18
18
|
if (platform === "cursor")
|
|
@@ -21,21 +21,25 @@ function adapterFromPlatform(platform) {
|
|
|
21
21
|
return "codex";
|
|
22
22
|
return "claude-code";
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
24
|
+
/** Record the sweep before deleting authority state. V3 ambiguity fails closed. */
|
|
25
25
|
function emitSwept(coordRoot, instanceId, adapter, sessionId, reason, ageSecs) {
|
|
26
26
|
try {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
recordLiveSweepObservationV3({
|
|
28
|
+
coordRoot,
|
|
29
|
+
owner: instanceId,
|
|
30
|
+
nativeSessionId: sessionId,
|
|
31
31
|
adapter,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
observation: reason === "stale"
|
|
33
|
+
? "stale_heartbeat"
|
|
34
|
+
: reason === "unparseable"
|
|
35
|
+
? "unparseable_heartbeat"
|
|
36
|
+
: "missing_timestamp",
|
|
37
|
+
ageMs: Math.max(0, (ageSecs ?? 0) * 1_000),
|
|
35
38
|
});
|
|
39
|
+
return true;
|
|
36
40
|
}
|
|
37
41
|
catch {
|
|
38
|
-
|
|
42
|
+
return false;
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
/** File mtime in epoch-seconds, or +Infinity if it can't be read (treat as fresh → don't reap). */
|
|
@@ -54,7 +58,7 @@ export function staleSweep(coordRoot) {
|
|
|
54
58
|
const freshness = coordFreshnessSeconds(coordRoot);
|
|
55
59
|
const nowSec = Math.floor(Date.now() / 1000);
|
|
56
60
|
const cutoff = nowSec - freshness;
|
|
57
|
-
// 1. Prune stale
|
|
61
|
+
// 1. Prune stale rows from the disposable V3 coordination cache.
|
|
58
62
|
//
|
|
59
63
|
// Two deletion regimes, deliberately asymmetric:
|
|
60
64
|
// • Valid JSON with an OLD last_heartbeat → the legitimate dead/idle-agent
|
|
@@ -87,9 +91,12 @@ export function staleSweep(coordRoot) {
|
|
|
87
91
|
// Unparseable: only reap if the file itself is mtime-old.
|
|
88
92
|
if (mtimeSecs(path) < cutoff) {
|
|
89
93
|
try {
|
|
94
|
+
const ageSecs = nowSec - mtimeSecs(path);
|
|
95
|
+
if (!emitSwept(coordRoot, idFromFile, "claude-code", idFromFile, "unparseable", ageSecs)) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
90
98
|
unlinkSync(path);
|
|
91
99
|
heartbeatsRemoved.push(f);
|
|
92
|
-
emitSwept(coordRoot, idFromFile, "claude-code", idFromFile, "unparseable");
|
|
93
100
|
}
|
|
94
101
|
catch {
|
|
95
102
|
/* swallow */
|
|
@@ -106,9 +113,11 @@ export function staleSweep(coordRoot) {
|
|
|
106
113
|
if (!parsed.last_heartbeat || !Number.isFinite(ts)) {
|
|
107
114
|
// No / NaN last_heartbeat: can't trust content; gate on mtime.
|
|
108
115
|
if (mtimeSecs(path) < cutoff) {
|
|
116
|
+
if (!emitSwept(coordRoot, instanceId, adapter, sessionId, "missing_ts", nowSec - mtimeSecs(path))) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
109
119
|
unlinkSync(path);
|
|
110
120
|
heartbeatsRemoved.push(f);
|
|
111
|
-
emitSwept(coordRoot, instanceId, adapter, sessionId, "missing_ts");
|
|
112
121
|
}
|
|
113
122
|
else if (parsed.instance_id) {
|
|
114
123
|
liveInstanceIds.add(parsed.instance_id);
|
|
@@ -117,9 +126,11 @@ export function staleSweep(coordRoot) {
|
|
|
117
126
|
}
|
|
118
127
|
if (ts < cutoff) {
|
|
119
128
|
// Legitimate stale prune (valid timestamp, past the freshness cutoff).
|
|
129
|
+
if (!emitSwept(coordRoot, instanceId, adapter, sessionId, "stale", nowSec - ts)) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
120
132
|
unlinkSync(path);
|
|
121
133
|
heartbeatsRemoved.push(f);
|
|
122
|
-
emitSwept(coordRoot, instanceId, adapter, sessionId, "stale", nowSec - ts);
|
|
123
134
|
continue;
|
|
124
135
|
}
|
|
125
136
|
if (parsed.instance_id)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/artifacts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/artifacts/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { spawnSync } from "node:child_process";
|
|
|
11
11
|
import { randomUUID } from "node:crypto";
|
|
12
12
|
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
13
13
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
14
|
+
import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.js";
|
|
14
15
|
import { artifactDefaultRetentionDays } from "../config.js";
|
|
15
16
|
export const ARTIFACTS_DIR = join(".harnery", "artifacts");
|
|
16
17
|
export const ARTIFACT_MANIFEST = ".harnery-artifact.json";
|
|
@@ -311,14 +312,11 @@ function atomicWriteManifest(path, manifest) {
|
|
|
311
312
|
renameSync(tmp, target);
|
|
312
313
|
}
|
|
313
314
|
function ownerLiveness(repoRoot, instanceId, now, freshnessSeconds) {
|
|
314
|
-
const path = join(repoRoot, ".harnery", "active", `${instanceId}.json`);
|
|
315
|
-
if (!existsSync(path))
|
|
316
|
-
return "stale";
|
|
317
315
|
try {
|
|
318
|
-
const
|
|
319
|
-
if (
|
|
320
|
-
return "
|
|
321
|
-
const ts = Date.parse(
|
|
316
|
+
const row = readLiveCoordinationRow(repoRoot, instanceId);
|
|
317
|
+
if (!row)
|
|
318
|
+
return "stale";
|
|
319
|
+
const ts = Date.parse(row.last_heartbeat);
|
|
322
320
|
if (!Number.isFinite(ts))
|
|
323
321
|
return "unknown";
|
|
324
322
|
return now.getTime() - ts <= freshnessSeconds * 1000 ? "live" : "stale";
|
package/dist/core/config.d.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
|
|
@@ -21,6 +21,16 @@
|
|
|
21
21
|
export declare const DEFAULT_BIN_NAME = "harn";
|
|
22
22
|
/** Heartbeat-freshness default (seconds): the sweep window when nothing overrides it. */
|
|
23
23
|
export declare const DEFAULT_FRESHNESS_SECS = 600;
|
|
24
|
+
/** Mnemonic dashboard port: 4276 spells HARN on a phone keypad. */
|
|
25
|
+
export declare const DEFAULT_WEB_PORT = 4276;
|
|
26
|
+
export interface SessionFinalizationConfig {
|
|
27
|
+
archiveGraceSeconds: number;
|
|
28
|
+
idleObserveSeconds: number;
|
|
29
|
+
idleFinalizeSeconds: number;
|
|
30
|
+
cascadeGraceSeconds: number;
|
|
31
|
+
reconcileIntervalSeconds: number;
|
|
32
|
+
}
|
|
33
|
+
export declare const DEFAULT_SESSION_FINALIZATION_CONFIG: SessionFinalizationConfig;
|
|
24
34
|
export type AgentFinalizationDisposition = "git" | "output";
|
|
25
35
|
export interface AgentFinalizationRoot {
|
|
26
36
|
path: string;
|
|
@@ -28,6 +38,18 @@ export interface AgentFinalizationRoot {
|
|
|
28
38
|
}
|
|
29
39
|
/** Strip `//` and `/* */` comments from JSONC, ignoring comment-like runs inside strings. */
|
|
30
40
|
export declare function stripJsonComments(input: string): string;
|
|
41
|
+
export interface CoordRunQualityConfigSource {
|
|
42
|
+
value: unknown;
|
|
43
|
+
invalid: boolean;
|
|
44
|
+
/** Stable digest seed that contains no config values when parsing failed. */
|
|
45
|
+
digest_seed: unknown;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Effective user-plus-project `coord.run_quality` value with parse diagnostics.
|
|
49
|
+
* The ordinary config reader stays fail-soft; this one lets the guard visibly
|
|
50
|
+
* disable itself rather than silently substituting defaults for malformed JSONC.
|
|
51
|
+
*/
|
|
52
|
+
export declare function coordRunQualityConfigSource(root: string): CoordRunQualityConfigSource;
|
|
31
53
|
/**
|
|
32
54
|
* Resolve the host CLI's bin name for user-facing strings. Precedence:
|
|
33
55
|
* 1. `HARNERY_BIN` env (explicit per-process override)
|
|
@@ -120,6 +142,15 @@ export declare function presenceRelayUrl(coordRoot?: string | null): string | nu
|
|
|
120
142
|
* `coordRoot` is resolved via `findCoordRoot()` when not passed.
|
|
121
143
|
*/
|
|
122
144
|
export declare function coordFreshnessSeconds(coordRoot?: string | null): number;
|
|
145
|
+
/**
|
|
146
|
+
* Resolve the standalone dashboard port.
|
|
147
|
+
*
|
|
148
|
+
* Precedence: explicit `--port` flag, `HARNERY_WEB_PORT`, merged
|
|
149
|
+
* `.harnery/config.jsonc` `web.port`, then the mnemonic built-in default 4276.
|
|
150
|
+
*/
|
|
151
|
+
export declare function resolveWebPort(explicitPort?: string, coordRoot?: string | null): number;
|
|
152
|
+
/** Policy for converging independent termination signals on one finalizer. */
|
|
153
|
+
export declare function sessionFinalizationConfig(coordRoot?: string | null): SessionFinalizationConfig;
|
|
123
154
|
/**
|
|
124
155
|
* Default retention for a newly-created working artifact. Precedence:
|
|
125
156
|
* `HARNERY_ARTIFACT_RETENTION_DAYS` -> project/user config
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAEvC,yFAAyF;AACzF,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,MAAM,MAAM,4BAA4B,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,4BAA4B,CAAC;CAC3C;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.js
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
|
|
@@ -26,6 +26,15 @@ import { findCoordRoot } from "./hooks/resolve/coord-root.js";
|
|
|
26
26
|
export const DEFAULT_BIN_NAME = "harn";
|
|
27
27
|
/** Heartbeat-freshness default (seconds): the sweep window when nothing overrides it. */
|
|
28
28
|
export const DEFAULT_FRESHNESS_SECS = 600;
|
|
29
|
+
/** Mnemonic dashboard port: 4276 spells HARN on a phone keypad. */
|
|
30
|
+
export const DEFAULT_WEB_PORT = 4276;
|
|
31
|
+
export const DEFAULT_SESSION_FINALIZATION_CONFIG = {
|
|
32
|
+
archiveGraceSeconds: 600,
|
|
33
|
+
idleObserveSeconds: 3 * 24 * 60 * 60,
|
|
34
|
+
idleFinalizeSeconds: 7 * 24 * 60 * 60,
|
|
35
|
+
cascadeGraceSeconds: 60 * 60,
|
|
36
|
+
reconcileIntervalSeconds: 15 * 60,
|
|
37
|
+
};
|
|
29
38
|
/** Strip `//` and `/* */` comments from JSONC, ignoring comment-like runs inside strings. */
|
|
30
39
|
export function stripJsonComments(input) {
|
|
31
40
|
let out = "";
|
|
@@ -108,6 +117,49 @@ function parseConfigFile(p) {
|
|
|
108
117
|
}
|
|
109
118
|
return {};
|
|
110
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Effective user-plus-project `coord.run_quality` value with parse diagnostics.
|
|
122
|
+
* The ordinary config reader stays fail-soft; this one lets the guard visibly
|
|
123
|
+
* disable itself rather than silently substituting defaults for malformed JSONC.
|
|
124
|
+
*/
|
|
125
|
+
export function coordRunQualityConfigSource(root) {
|
|
126
|
+
const projectPath = join(root, ".harnery", "config.jsonc");
|
|
127
|
+
const userPath = userConfigPath();
|
|
128
|
+
const layers = [userPath, projectPath].map((path) => parseConfigLayer(path));
|
|
129
|
+
const invalid = layers.filter((layer) => layer.invalid);
|
|
130
|
+
if (invalid.length > 0) {
|
|
131
|
+
return {
|
|
132
|
+
value: undefined,
|
|
133
|
+
invalid: true,
|
|
134
|
+
digest_seed: invalid.map((layer) => ({
|
|
135
|
+
path_kind: layer.path_kind,
|
|
136
|
+
signature: layer.signature,
|
|
137
|
+
})),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const merged = mergeConfig(layers[0].config, layers[1].config);
|
|
141
|
+
return {
|
|
142
|
+
value: merged.coord?.run_quality,
|
|
143
|
+
invalid: false,
|
|
144
|
+
digest_seed: merged.coord?.run_quality,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function parseConfigLayer(path) {
|
|
148
|
+
const pathKind = path === userConfigPath() ? "user" : "project";
|
|
149
|
+
const signature = statSignature(path);
|
|
150
|
+
if (signature === null)
|
|
151
|
+
return { config: {}, invalid: false, path_kind: pathKind, signature };
|
|
152
|
+
try {
|
|
153
|
+
const value = JSON.parse(stripJsonComments(readFileSync(path, "utf8")));
|
|
154
|
+
if (isPlainObject(value)) {
|
|
155
|
+
return { config: value, invalid: false, path_kind: pathKind, signature };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// The guard reports one bounded health event for this file signature.
|
|
160
|
+
}
|
|
161
|
+
return { config: {}, invalid: true, path_kind: pathKind, signature };
|
|
162
|
+
}
|
|
111
163
|
function isPlainObject(v) {
|
|
112
164
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
113
165
|
}
|
|
@@ -358,6 +410,50 @@ export function coordFreshnessSeconds(coordRoot) {
|
|
|
358
410
|
return posIntOr(readConfig(root).coord?.freshness_seconds, DEFAULT_FRESHNESS_SECS);
|
|
359
411
|
return DEFAULT_FRESHNESS_SECS;
|
|
360
412
|
}
|
|
413
|
+
function parseWebPort(value, source) {
|
|
414
|
+
const port = typeof value === "number" ? value : Number(value);
|
|
415
|
+
if (!Number.isInteger(port) || port < 1024 || port > 65535) {
|
|
416
|
+
throw new RangeError(`${source} must be an integer from 1024 through 65535`);
|
|
417
|
+
}
|
|
418
|
+
return port;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Resolve the standalone dashboard port.
|
|
422
|
+
*
|
|
423
|
+
* Precedence: explicit `--port` flag, `HARNERY_WEB_PORT`, merged
|
|
424
|
+
* `.harnery/config.jsonc` `web.port`, then the mnemonic built-in default 4276.
|
|
425
|
+
*/
|
|
426
|
+
export function resolveWebPort(explicitPort, coordRoot) {
|
|
427
|
+
if (explicitPort !== undefined && explicitPort.trim() !== "") {
|
|
428
|
+
return parseWebPort(explicitPort, "--port");
|
|
429
|
+
}
|
|
430
|
+
const envPort = coordEnv("WEB_PORT");
|
|
431
|
+
if (envPort !== undefined && envPort.trim() !== "") {
|
|
432
|
+
return parseWebPort(envPort, "HARNERY_WEB_PORT");
|
|
433
|
+
}
|
|
434
|
+
const root = coordRoot ?? findCoordRoot();
|
|
435
|
+
const configuredPort = root ? readConfig(root).web?.port : undefined;
|
|
436
|
+
if (configuredPort !== undefined) {
|
|
437
|
+
return parseWebPort(configuredPort, "web.port");
|
|
438
|
+
}
|
|
439
|
+
return DEFAULT_WEB_PORT;
|
|
440
|
+
}
|
|
441
|
+
/** Policy for converging independent termination signals on one finalizer. */
|
|
442
|
+
export function sessionFinalizationConfig(coordRoot) {
|
|
443
|
+
const root = coordRoot ?? findCoordRoot();
|
|
444
|
+
const configured = root ? readConfig(root).coord?.finalization : undefined;
|
|
445
|
+
const defaults = DEFAULT_SESSION_FINALIZATION_CONFIG;
|
|
446
|
+
const archiveGraceSeconds = posIntOr(configured?.archive_grace_seconds, defaults.archiveGraceSeconds);
|
|
447
|
+
const idleObserveSeconds = posIntOr(configured?.idle_observe_seconds, defaults.idleObserveSeconds);
|
|
448
|
+
const idleFinalizeSeconds = Math.max(idleObserveSeconds, posIntOr(configured?.idle_finalize_seconds, defaults.idleFinalizeSeconds));
|
|
449
|
+
return {
|
|
450
|
+
archiveGraceSeconds,
|
|
451
|
+
idleObserveSeconds,
|
|
452
|
+
idleFinalizeSeconds,
|
|
453
|
+
cascadeGraceSeconds: posIntOr(configured?.cascade_grace_seconds, defaults.cascadeGraceSeconds),
|
|
454
|
+
reconcileIntervalSeconds: posIntOr(configured?.reconcile_interval_seconds, defaults.reconcileIntervalSeconds),
|
|
455
|
+
};
|
|
456
|
+
}
|
|
361
457
|
/**
|
|
362
458
|
* Default retention for a newly-created working artifact. Precedence:
|
|
363
459
|
* `HARNERY_ARTIFACT_RETENTION_DAYS` -> project/user config
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* context telemetry when the adapter exposes it, checkpoints external work
|
|
5
5
|
* state before compaction, and renders a verified recovery briefing after it.
|
|
6
6
|
*/
|
|
7
|
-
import type { Adapter } from "../
|
|
7
|
+
import type { Adapter } from "../adapter.js";
|
|
8
8
|
export declare const CONTEXT_SCHEMA_VERSION: 1;
|
|
9
9
|
export declare const MAX_CAPSULE_BYTES: number;
|
|
10
10
|
export type ContextSampleSource = "hook" | "native_event" | "result" | "transcript" | "estimate";
|
|
@@ -58,12 +58,9 @@ export interface ContinuityCapsule {
|
|
|
58
58
|
context?: ContextSample;
|
|
59
59
|
work: {
|
|
60
60
|
task?: string;
|
|
61
|
-
turn_summary?: string;
|
|
62
61
|
continuation_note?: string;
|
|
63
62
|
files_held: string[];
|
|
64
63
|
files_held_truncated?: boolean;
|
|
65
|
-
last_tool?: string;
|
|
66
|
-
last_tool_target?: string;
|
|
67
64
|
};
|
|
68
65
|
repo: RepoSnapshot;
|
|
69
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/context/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/context/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { spawnSync } from "node:child_process";
|
|
|
8
8
|
import { createHash, randomUUID } from "node:crypto";
|
|
9
9
|
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
10
10
|
import { dirname, join } from "node:path";
|
|
11
|
+
import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.js";
|
|
11
12
|
export const CONTEXT_SCHEMA_VERSION = 1;
|
|
12
13
|
export const MAX_CAPSULE_BYTES = 32 * 1024;
|
|
13
14
|
const MAX_SNAPSHOT_PATHS = 15;
|
|
@@ -214,17 +215,12 @@ export function renderRecoveryBriefing(capsule, liveRepo) {
|
|
|
214
215
|
];
|
|
215
216
|
if (capsule.work.task)
|
|
216
217
|
lines.push(`Task: ${capsule.work.task}`);
|
|
217
|
-
if (capsule.work.turn_summary)
|
|
218
|
-
lines.push(`Last progress: ${capsule.work.turn_summary}`);
|
|
219
218
|
if (capsule.work.continuation_note) {
|
|
220
219
|
lines.push(`Continuation note: ${capsule.work.continuation_note}`);
|
|
221
220
|
}
|
|
222
221
|
if (capsule.work.files_held.length > 0) {
|
|
223
222
|
lines.push(`Files held: ${capsule.work.files_held.join(", ")}`);
|
|
224
223
|
}
|
|
225
|
-
if (capsule.work.last_tool) {
|
|
226
|
-
lines.push(`Last tool: ${capsule.work.last_tool}${capsule.work.last_tool_target ? ` (${capsule.work.last_tool_target})` : ""}`);
|
|
227
|
-
}
|
|
228
224
|
const drift = [];
|
|
229
225
|
if (capsule.repo.branch && liveRepo.branch && capsule.repo.branch !== liveRepo.branch) {
|
|
230
226
|
drift.push(`branch changed ${capsule.repo.branch} -> ${liveRepo.branch}`);
|
|
@@ -275,16 +271,20 @@ function buildWorkSnapshot(heartbeat, continuationNote) {
|
|
|
275
271
|
: [];
|
|
276
272
|
return {
|
|
277
273
|
task: clampString(heartbeat?.task, 1_000),
|
|
278
|
-
turn_summary: clampString(heartbeat?.turn_summary, 3_000),
|
|
279
274
|
continuation_note: clampString(continuationNote, 3_000),
|
|
280
275
|
files_held: files.slice(0, MAX_SNAPSHOT_PATHS),
|
|
281
276
|
...(files.length > MAX_SNAPSHOT_PATHS ? { files_held_truncated: true } : {}),
|
|
282
|
-
last_tool: clampString(heartbeat?.last_tool, 200),
|
|
283
|
-
last_tool_target: clampString(heartbeat?.last_tool_target, 1_000),
|
|
284
277
|
};
|
|
285
278
|
}
|
|
286
279
|
function readHeartbeat(coordRoot, instanceId) {
|
|
287
|
-
|
|
280
|
+
const row = readLiveCoordinationRow(coordRoot, instanceId);
|
|
281
|
+
if (!row)
|
|
282
|
+
return null;
|
|
283
|
+
return {
|
|
284
|
+
model: row.model,
|
|
285
|
+
task: row.task,
|
|
286
|
+
files_touched: row.files_touched,
|
|
287
|
+
};
|
|
288
288
|
}
|
|
289
289
|
function newState(input) {
|
|
290
290
|
return {
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
* Choose a command's tool parent only when attribution cannot silently pick
|
|
9
|
+
* the wrong span. A single open tool is unambiguous. With parallel tools,
|
|
10
|
+
* exactly one shell-class span may be selected; every other case stays
|
|
11
|
+
* top-level so any over-count remains visible.
|
|
12
|
+
*/
|
|
13
|
+
export declare function selectCommandParentSpan(spans: readonly OpenToolSpanForCommandParent[], turnId: `tid_${string}`): `span_${string}` | undefined;
|
|
14
|
+
export declare function isShellToolName(name: string | undefined): boolean;
|
|
15
|
+
//# sourceMappingURL=span-parent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-parent.d.ts","sourceRoot":"","sources":["../../../src/core/events/span-parent.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,QAAQ,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,4BAA4B,EAAE,EAC9C,MAAM,EAAE,OAAO,MAAM,EAAE,GACtB,QAAQ,MAAM,EAAE,GAAG,SAAS,CAO9B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQjE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const SHELL_TOOL_NAMES = new Set([
|
|
2
|
+
"apply_patch",
|
|
3
|
+
"bash",
|
|
4
|
+
"exec",
|
|
5
|
+
"exec_command",
|
|
6
|
+
"execute",
|
|
7
|
+
"powershell",
|
|
8
|
+
"run_command",
|
|
9
|
+
"shell",
|
|
10
|
+
"terminal",
|
|
11
|
+
]);
|
|
12
|
+
/**
|
|
13
|
+
* Choose a command's tool parent only when attribution cannot silently pick
|
|
14
|
+
* the wrong span. A single open tool is unambiguous. With parallel tools,
|
|
15
|
+
* exactly one shell-class span may be selected; every other case stays
|
|
16
|
+
* top-level so any over-count remains visible.
|
|
17
|
+
*/
|
|
18
|
+
export function selectCommandParentSpan(spans, turnId) {
|
|
19
|
+
const open = spans.filter((span) => span.turn_id === turnId && span.requested_event_id !== undefined);
|
|
20
|
+
if (open.length === 1)
|
|
21
|
+
return open[0]?.span_id;
|
|
22
|
+
const shell = open.filter((span) => isShellToolName(span.tool_name));
|
|
23
|
+
return shell.length === 1 ? shell[0]?.span_id : undefined;
|
|
24
|
+
}
|
|
25
|
+
export function isShellToolName(name) {
|
|
26
|
+
if (!name)
|
|
27
|
+
return false;
|
|
28
|
+
const normalized = name
|
|
29
|
+
.trim()
|
|
30
|
+
.toLowerCase()
|
|
31
|
+
.replace(/^.*[.:/]/, "")
|
|
32
|
+
.replaceAll("-", "_");
|
|
33
|
+
return SHELL_TOOL_NAMES.has(normalized);
|
|
34
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TSchema } from "@sinclair/typebox";
|
|
2
|
+
export interface SchemaAdvanceEligibilityV3 {
|
|
3
|
+
eligible: boolean;
|
|
4
|
+
strict: boolean;
|
|
5
|
+
issues: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Mechanical half of ADR 0080's in-place advance gate. It proves that every
|
|
9
|
+
* value accepted by the prior JSON Schema remains accepted by the next schema.
|
|
10
|
+
* Semantic reinterpretations remain breaking even when this structural check
|
|
11
|
+
* passes and require genesis review.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateAdditiveSchemaAdvanceV3(prior: TSchema, next: TSchema): SchemaAdvanceEligibilityV3;
|
|
14
|
+
//# sourceMappingURL=advance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advance.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/advance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,OAAO,GACZ,0BAA0B,CAQ5B"}
|