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
|
@@ -9,8 +9,8 @@ import { spawnSync } from "node:child_process";
|
|
|
9
9
|
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
10
10
|
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
11
11
|
import { agentsFinalizationRoots } from "../config.js";
|
|
12
|
-
import {
|
|
13
|
-
|
|
12
|
+
import { readFinalizationScopeV3 } from "../events/v3/finalization-view.js";
|
|
13
|
+
import { liveInstanceIdV3, resolveLiveEventLedgerRouteV3 } from "../events/v3/live-routing.js";
|
|
14
14
|
const GIT_DISCOVERY_VARS = [
|
|
15
15
|
"GIT_DIR",
|
|
16
16
|
"GIT_WORK_TREE",
|
|
@@ -26,32 +26,17 @@ const GIT_DISCOVERY_VARS = [
|
|
|
26
26
|
* a commit. Current heartbeat claims describe dirty ownership; this history is
|
|
27
27
|
* what keeps the touched repository in scope until its commits are pushed.
|
|
28
28
|
*/
|
|
29
|
-
export function readSessionWriteClaims(coordRoot, instanceId,
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (event.instance_id !== instanceId || event.session_id !== sessionId)
|
|
40
|
-
continue;
|
|
41
|
-
if (event.event_type === "session.start")
|
|
42
|
-
sawSessionStart = true;
|
|
43
|
-
if (event.event_type === "claim.acquire" &&
|
|
44
|
-
event.data?.mode === "write" &&
|
|
45
|
-
typeof event.data.path === "string") {
|
|
46
|
-
paths.add(event.data.path);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
// Ignore malformed and crash-truncated event lines, matching the
|
|
51
|
-
// canonical stream consumer's recovery behavior.
|
|
52
|
-
}
|
|
29
|
+
export function readSessionWriteClaims(coordRoot, instanceId, _sessionId) {
|
|
30
|
+
const route = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
31
|
+
if (route.state === "blocked")
|
|
32
|
+
return { paths: [], complete: false };
|
|
33
|
+
try {
|
|
34
|
+
const scope = readFinalizationScopeV3(coordRoot, liveInstanceIdV3(instanceId));
|
|
35
|
+
return { paths: scope.files_touched, complete: true };
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return { paths: [], complete: false };
|
|
53
39
|
}
|
|
54
|
-
return { paths: [...paths], complete: !truncated || sawSessionStart };
|
|
55
40
|
}
|
|
56
41
|
function git(args, cwd) {
|
|
57
42
|
const env = { ...process.env };
|
|
@@ -303,6 +288,50 @@ function repoSyncState(repoRoot) {
|
|
|
303
288
|
return "unverifiable";
|
|
304
289
|
return containing.stdout.trim().length > 0 ? "synced" : "unpushed";
|
|
305
290
|
}
|
|
291
|
+
function repoIsBehindUpstream(repoRoot) {
|
|
292
|
+
if (!repoHasRemote(repoRoot))
|
|
293
|
+
return false;
|
|
294
|
+
const upstream = git(["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}"], repoRoot);
|
|
295
|
+
if (upstream.status !== 0)
|
|
296
|
+
return false;
|
|
297
|
+
const behind = git(["rev-list", "--count", "HEAD..@{upstream}"], repoRoot);
|
|
298
|
+
return behind.status === 0 && Number.parseInt(behind.stdout.trim(), 10) > 0;
|
|
299
|
+
}
|
|
300
|
+
function rootSubmoduleFreshness(repoRoot) {
|
|
301
|
+
const modules = git(["config", "--file", ".gitmodules", "--get-regexp", "^submodule\\..*\\.path$"], repoRoot);
|
|
302
|
+
if (modules.status !== 0 || modules.stdout.trim().length === 0) {
|
|
303
|
+
return { stale: [], diverged: [] };
|
|
304
|
+
}
|
|
305
|
+
const stale = [];
|
|
306
|
+
const diverged = [];
|
|
307
|
+
for (const line of modules.stdout.trim().split("\n")) {
|
|
308
|
+
const path = line.trim().split(/\s+/).at(-1);
|
|
309
|
+
if (!path)
|
|
310
|
+
continue;
|
|
311
|
+
const target = git(["rev-parse", `HEAD:${path}`], repoRoot);
|
|
312
|
+
const checkout = git(["rev-parse", "HEAD"], join(repoRoot, path));
|
|
313
|
+
if (target.status !== 0 || checkout.status !== 0) {
|
|
314
|
+
stale.push(path);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
const targetSha = target.stdout.trim();
|
|
318
|
+
const checkoutSha = checkout.stdout.trim();
|
|
319
|
+
if (targetSha === checkoutSha)
|
|
320
|
+
continue;
|
|
321
|
+
const checkoutBehind = git(["merge-base", "--is-ancestor", checkoutSha, targetSha], join(repoRoot, path));
|
|
322
|
+
if (checkoutBehind.status === 0) {
|
|
323
|
+
stale.push(path);
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
const checkoutAhead = git(["merge-base", "--is-ancestor", targetSha, checkoutSha], join(repoRoot, path));
|
|
327
|
+
// A checkout ahead of its gitlink is in-flight local work. Its owning
|
|
328
|
+
// session is responsible for the eventual pointer bump; unrelated turns
|
|
329
|
+
// must not be blocked globally while that work is active.
|
|
330
|
+
if (checkoutAhead.status !== 0)
|
|
331
|
+
diverged.push(path);
|
|
332
|
+
}
|
|
333
|
+
return { stale: stale.sort(), diverged: diverged.sort() };
|
|
334
|
+
}
|
|
306
335
|
/** Compare gitlink commits without treating dirty contents inside the child as a pointer change. */
|
|
307
336
|
function gitlinkIsDirty(parentRoot, gitlink) {
|
|
308
337
|
const head = git(["rev-parse", `HEAD:${gitlink}`], parentRoot);
|
|
@@ -318,6 +347,9 @@ function gitlinkIsDirty(parentRoot, gitlink) {
|
|
|
318
347
|
/** Check that this session's held paths are committed and their repositories are pushed. */
|
|
319
348
|
export function checkGitFinalization(coordRoot, heldPaths, options = {}) {
|
|
320
349
|
const root = resolve(coordRoot);
|
|
350
|
+
// Repository discovery resolves symlinks. Use the same physical base for
|
|
351
|
+
// display labels so macOS /var -> /private/var aliases stay repo-relative.
|
|
352
|
+
const labelRoot = physicalPath(root) ?? root;
|
|
321
353
|
const repos = new Map();
|
|
322
354
|
const hostOutputPaths = new Set();
|
|
323
355
|
const unsupportedPaths = [];
|
|
@@ -346,42 +378,50 @@ export function checkGitFinalization(coordRoot, heldPaths, options = {}) {
|
|
|
346
378
|
for (const repoPath of work.paths) {
|
|
347
379
|
if (work.gitlinks.has(repoPath)) {
|
|
348
380
|
if (gitlinkIsDirty(work.root, repoPath)) {
|
|
349
|
-
const label = repoLabel(
|
|
381
|
+
const label = repoLabel(labelRoot, work.root);
|
|
350
382
|
dirtyPaths.add(label === "." ? repoPath : `${label}/${repoPath}`);
|
|
351
383
|
}
|
|
352
384
|
continue;
|
|
353
385
|
}
|
|
354
386
|
const status = git(["status", "--porcelain=v1", "--untracked-files=all", "--", repoPath], work.root);
|
|
355
387
|
if (status.status !== 0) {
|
|
356
|
-
unverifiablePaths.push(join(repoLabel(
|
|
388
|
+
unverifiablePaths.push(join(repoLabel(labelRoot, work.root), repoPath).replaceAll("\\", "/"));
|
|
357
389
|
}
|
|
358
390
|
else if (status.stdout.length > 0) {
|
|
359
|
-
const label = repoLabel(
|
|
391
|
+
const label = repoLabel(labelRoot, work.root);
|
|
360
392
|
dirtyPaths.add(label === "." ? repoPath : `${label}/${repoPath}`);
|
|
361
393
|
}
|
|
362
394
|
}
|
|
363
395
|
const syncState = repoSyncState(work.root);
|
|
364
|
-
const label = repoLabel(
|
|
396
|
+
const label = repoLabel(labelRoot, work.root);
|
|
365
397
|
if (syncState === "unpushed")
|
|
366
398
|
unpushedRepos.push(label);
|
|
367
399
|
if (syncState === "unverifiable")
|
|
368
400
|
unverifiableRepos.push(label);
|
|
369
401
|
}
|
|
402
|
+
const behindRepos = repoIsBehindUpstream(root) ? ["."] : [];
|
|
403
|
+
const submoduleFreshness = rootSubmoduleFreshness(root);
|
|
370
404
|
const result = {
|
|
371
405
|
ok: false,
|
|
372
406
|
claim_history_complete: options.claimHistoryComplete ?? true,
|
|
373
407
|
dirty_paths: [...dirtyPaths].sort(),
|
|
374
408
|
unpushed_repos: [...new Set(unpushedRepos)].sort(),
|
|
409
|
+
behind_repos: behindRepos,
|
|
410
|
+
stale_submodules: submoduleFreshness.stale,
|
|
411
|
+
diverged_submodules: submoduleFreshness.diverged,
|
|
375
412
|
host_output_paths: [...hostOutputPaths].sort(),
|
|
376
413
|
unsupported_paths: unsupportedPaths.sort((a, b) => a.path.localeCompare(b.path) || a.reason.localeCompare(b.reason)),
|
|
377
414
|
unverifiable_paths: [...new Set(unverifiablePaths)].sort(),
|
|
378
415
|
unverifiable_repos: [...new Set(unverifiableRepos)].sort(),
|
|
379
|
-
repos_checked: [...repos.keys()].map((repo) => repoLabel(
|
|
416
|
+
repos_checked: [...repos.keys()].map((repo) => repoLabel(labelRoot, repo)).sort(),
|
|
380
417
|
};
|
|
381
418
|
result.ok =
|
|
382
419
|
result.claim_history_complete &&
|
|
383
420
|
result.dirty_paths.length === 0 &&
|
|
384
421
|
result.unpushed_repos.length === 0 &&
|
|
422
|
+
result.behind_repos.length === 0 &&
|
|
423
|
+
result.stale_submodules.length === 0 &&
|
|
424
|
+
result.diverged_submodules.length === 0 &&
|
|
385
425
|
result.unsupported_paths.length === 0 &&
|
|
386
426
|
result.unverifiable_paths.length === 0 &&
|
|
387
427
|
result.unverifiable_repos.length === 0;
|
|
@@ -398,6 +438,15 @@ export function formatGitFinalizationFailure(result, bin) {
|
|
|
398
438
|
if (result.unpushed_repos.length > 0) {
|
|
399
439
|
lines.push("Repositories with commits not on their remote:", ...result.unpushed_repos.map((repo) => ` - ${repo}`));
|
|
400
440
|
}
|
|
441
|
+
if (result.behind_repos.length > 0) {
|
|
442
|
+
lines.push("Repositories behind their upstream:", ...result.behind_repos.map((repo) => ` - ${repo}`));
|
|
443
|
+
}
|
|
444
|
+
if (result.stale_submodules.length > 0) {
|
|
445
|
+
lines.push("Submodule checkouts behind their parent gitlinks:", ...result.stale_submodules.map((path) => ` - ${path}`));
|
|
446
|
+
}
|
|
447
|
+
if (result.diverged_submodules.length > 0) {
|
|
448
|
+
lines.push("Submodule checkouts diverged from their parent gitlinks:", ...result.diverged_submodules.map((path) => ` - ${path}`));
|
|
449
|
+
}
|
|
401
450
|
if (result.unsupported_paths.length > 0) {
|
|
402
451
|
lines.push("Paths without an authorized end-turn disposition:", ...result.unsupported_paths.map(({ path, reason }) => ` - ${path}: ${unsupportedReasonMessage(reason)}`));
|
|
403
452
|
}
|
|
@@ -409,10 +458,18 @@ export function formatGitFinalizationFailure(result, bin) {
|
|
|
409
458
|
}
|
|
410
459
|
if (result.dirty_paths.length > 0 ||
|
|
411
460
|
result.unpushed_repos.length > 0 ||
|
|
461
|
+
result.behind_repos.length > 0 ||
|
|
462
|
+
result.stale_submodules.length > 0 ||
|
|
463
|
+
result.diverged_submodules.length > 0 ||
|
|
412
464
|
result.unverifiable_paths.length > 0 ||
|
|
413
465
|
result.unverifiable_repos.length > 0) {
|
|
414
466
|
lines.push(`Commit and push the owned Git work, then rerun \`${bin} agents status --end-turn\`.`);
|
|
415
467
|
}
|
|
468
|
+
if (result.behind_repos.length > 0 ||
|
|
469
|
+
result.stale_submodules.length > 0 ||
|
|
470
|
+
result.diverged_submodules.length > 0) {
|
|
471
|
+
lines.push("Run the host repository's safe sync command, resolve any reported submodule state, then rerun the guarded status.");
|
|
472
|
+
}
|
|
416
473
|
if (result.unsupported_paths.length > 0) {
|
|
417
474
|
lines.push("For a legacy claim, add the containing Git repository or intentional non-Git output root to the project's `agents.finalizationRoots`, then rerun the guarded status. For new work, start the task from the target Git project or configure that root before editing.");
|
|
418
475
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* agent-coord library public exports.
|
|
3
3
|
*
|
|
4
|
-
* `coord-client`:
|
|
5
|
-
*
|
|
6
|
-
* Imported by every TS caller that needs to read coord state.
|
|
4
|
+
* `coord-client`: V3 producer identity resolution, ppid-map attribution, and
|
|
5
|
+
* coordination-root discovery.
|
|
7
6
|
*
|
|
8
|
-
* `canonical-emit`:
|
|
9
|
-
* spawns `bin/agent-coord emit-event` and never blocks the caller.
|
|
7
|
+
* `canonical-emit`: canonical V3 observation helpers.
|
|
10
8
|
*/
|
|
11
9
|
export * from "./canonical-emit.js";
|
|
12
10
|
export * from "./coord-client.js";
|
|
11
|
+
export * from "./live-observation-v3.js";
|
|
13
12
|
export * from "./session-events.js";
|
|
13
|
+
export * from "./state/session-state.js";
|
|
14
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* agent-coord library public exports.
|
|
3
3
|
*
|
|
4
|
-
* `coord-client`:
|
|
5
|
-
*
|
|
6
|
-
* Imported by every TS caller that needs to read coord state.
|
|
4
|
+
* `coord-client`: V3 producer identity resolution, ppid-map attribution, and
|
|
5
|
+
* coordination-root discovery.
|
|
7
6
|
*
|
|
8
|
-
* `canonical-emit`:
|
|
9
|
-
* spawns `bin/agent-coord emit-event` and never blocks the caller.
|
|
7
|
+
* `canonical-emit`: canonical V3 observation helpers.
|
|
10
8
|
*/
|
|
11
9
|
export * from "./canonical-emit.js";
|
|
12
10
|
export * from "./coord-client.js";
|
|
11
|
+
export * from "./live-observation-v3.js";
|
|
13
12
|
export * from "./session-events.js";
|
|
13
|
+
export * from "./state/session-state.js";
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Adapter } from "../adapter.js";
|
|
2
|
+
import type { EventV3WriteMode } from "../events/v3/control.js";
|
|
3
|
+
import { type RecordCoordinationAuthorityV3Result } from "../events/v3/producers/coordination-recorder.js";
|
|
4
|
+
export declare const LIVE_COORDINATION_V3_PRODUCER_ID: "prd_agent-coord";
|
|
5
|
+
export declare class LiveCoordinationAuthorityV3Error extends Error {
|
|
6
|
+
readonly reason: string;
|
|
7
|
+
constructor(reason: string);
|
|
8
|
+
}
|
|
9
|
+
export type LiveCoordinationAuthorityV3Result = {
|
|
10
|
+
state: "unchanged";
|
|
11
|
+
} | {
|
|
12
|
+
state: "recorded";
|
|
13
|
+
result: RecordCoordinationAuthorityV3Result;
|
|
14
|
+
};
|
|
15
|
+
export interface ReopenedLiveCoordinationGenerationV3 {
|
|
16
|
+
state: "reopened";
|
|
17
|
+
adapter: Adapter;
|
|
18
|
+
prior_generation_id: `gen_${string}`;
|
|
19
|
+
generation_id: `gen_${string}`;
|
|
20
|
+
}
|
|
21
|
+
interface LiveAuthorityBaseV3 {
|
|
22
|
+
coordRoot: string;
|
|
23
|
+
owner: string;
|
|
24
|
+
subject?: string;
|
|
25
|
+
nativeSessionId: string;
|
|
26
|
+
adapter: Adapter;
|
|
27
|
+
observationId?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Open a fresh derived generation for a human-facing session that is executing
|
|
31
|
+
* again after an authoritative terminal. The terminal generation is never
|
|
32
|
+
* changed or reused.
|
|
33
|
+
*/
|
|
34
|
+
export declare function reopenLiveCoordinationGenerationV3(input: {
|
|
35
|
+
coordRoot: string;
|
|
36
|
+
owner: string;
|
|
37
|
+
nativeSessionId: string;
|
|
38
|
+
}): ReopenedLiveCoordinationGenerationV3;
|
|
39
|
+
export declare function recordLiveTaskChangeV3(input: LiveAuthorityBaseV3 & {
|
|
40
|
+
task: string;
|
|
41
|
+
}): LiveCoordinationAuthorityV3Result;
|
|
42
|
+
export declare function recordLiveLifecycleChangeV3(input: LiveAuthorityBaseV3 & {
|
|
43
|
+
state: "active" | "blocked" | "done";
|
|
44
|
+
reason?: string;
|
|
45
|
+
suggestedSessionName?: string;
|
|
46
|
+
observedAt?: string;
|
|
47
|
+
}): LiveCoordinationAuthorityV3Result;
|
|
48
|
+
export declare function recordLiveClaimChangeV3(input: LiveAuthorityBaseV3 & {
|
|
49
|
+
operation: "acquired" | "released";
|
|
50
|
+
path: string;
|
|
51
|
+
access?: "read" | "write";
|
|
52
|
+
}): LiveCoordinationAuthorityV3Result;
|
|
53
|
+
export declare function recordLiveIdentityChangeV3(input: LiveAuthorityBaseV3 & {
|
|
54
|
+
name: string;
|
|
55
|
+
identityId: string;
|
|
56
|
+
}): LiveCoordinationAuthorityV3Result;
|
|
57
|
+
export declare function liveCoordinationWriteModeV3(coordRoot: string): EventV3WriteMode;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=live-authority-v3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-authority-v3.d.ts","sourceRoot":"","sources":["../../../src/core/agents/live-authority-v3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAehE,OAAO,EACL,KAAK,mCAAmC,EAEzC,MAAM,iDAAiD,CAAC;AAoBzD,eAAO,MAAM,gCAAgC,EAAG,iBAA0B,CAAC;AAE3E,qBAAa,gCAAiC,SAAQ,KAAK;aAC7B,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI3C;AAED,MAAM,MAAM,iCAAiC,GACzC;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,mCAAmC,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,oCAAoC;IACnD,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,OAAO,MAAM,EAAE,CAAC;IACrC,aAAa,EAAE,OAAO,MAAM,EAAE,CAAC;CAChC;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,KAAK,EAAE;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,oCAAoC,CAkDvC;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5C,iCAAiC,CAiCnC;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,mBAAmB,GAAG;IAC3B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,iCAAiC,CAmCnC;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,mBAAmB,GAAG;IAC3B,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B,GACA,iCAAiC,CAuCnC;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAChE,iCAAiC,CAuBnC;AAuDD,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAI/E"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { canonicalJsonV3, sha256V3 } from "../events/v3/canonical.js";
|
|
3
|
+
import { readCoordinationViewV3, requireAuthoritySafeCoordinationViewV3, } from "../events/v3/coordination-view.js";
|
|
4
|
+
import { LIVE_HOOK_V3_PRODUCER_ID, liveInstanceIdV3, livePlatformV3, resolveLiveEventLedgerRouteV3, } from "../events/v3/live-routing.js";
|
|
5
|
+
import { recordCoordinationAuthorityV3, } from "../events/v3/producers/coordination-recorder.js";
|
|
6
|
+
import { readTerminalHookProducerStateV3, recordHookSignalV3, } from "../events/v3/producers/recorder.js";
|
|
7
|
+
import { acquireClaim, readHeartbeat, releaseClaim, setIdentityCache, setLifecycleCache, setTask, } from "./state/heartbeat-writer.js";
|
|
8
|
+
import { ensureLiveCoordinationHeartbeat, liveCoordinationAdapterV3, } from "./state/live-coordination-view.js";
|
|
9
|
+
import { recordNameAssumption } from "./state/names.js";
|
|
10
|
+
export const LIVE_COORDINATION_V3_PRODUCER_ID = "prd_agent-coord";
|
|
11
|
+
export class LiveCoordinationAuthorityV3Error extends Error {
|
|
12
|
+
reason;
|
|
13
|
+
constructor(reason) {
|
|
14
|
+
super(`event_v3_coordination_authority:${reason}`);
|
|
15
|
+
this.reason = reason;
|
|
16
|
+
this.name = "LiveCoordinationAuthorityV3Error";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Open a fresh derived generation for a human-facing session that is executing
|
|
21
|
+
* again after an authoritative terminal. The terminal generation is never
|
|
22
|
+
* changed or reused.
|
|
23
|
+
*/
|
|
24
|
+
export function reopenLiveCoordinationGenerationV3(input) {
|
|
25
|
+
const route = resolveLiveEventLedgerRouteV3(input.coordRoot);
|
|
26
|
+
if (route.state === "blocked")
|
|
27
|
+
throw new LiveCoordinationAuthorityV3Error(route.reason);
|
|
28
|
+
const instanceId = liveInstanceIdV3(input.owner);
|
|
29
|
+
const terminal = readTerminalHookProducerStateV3(input.coordRoot, input.nativeSessionId, instanceId);
|
|
30
|
+
if (!terminal) {
|
|
31
|
+
throw new LiveCoordinationAuthorityV3Error("terminal_generation_identity_missing");
|
|
32
|
+
}
|
|
33
|
+
const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(input.coordRoot));
|
|
34
|
+
const terminalView = view.terminal_generations[terminal.generation_id];
|
|
35
|
+
if (!terminalView || terminalView.instance_id !== instanceId) {
|
|
36
|
+
throw new LiveCoordinationAuthorityV3Error("terminal_generation_authority_missing");
|
|
37
|
+
}
|
|
38
|
+
if (terminalView.parent_generation_id || terminalView.delegation_id || terminalView.workflow_id) {
|
|
39
|
+
throw new LiveCoordinationAuthorityV3Error("lifecycle_not_human_facing");
|
|
40
|
+
}
|
|
41
|
+
const reopened = recordHookSignalV3({
|
|
42
|
+
coordRoot: input.coordRoot,
|
|
43
|
+
mode: route.mode,
|
|
44
|
+
signal: "session-start",
|
|
45
|
+
payload: { raw: {}, session_id: input.nativeSessionId },
|
|
46
|
+
adapter: terminal.adapter,
|
|
47
|
+
instance_id: instanceId,
|
|
48
|
+
producer_id: LIVE_HOOK_V3_PRODUCER_ID,
|
|
49
|
+
build_id: route.build_id,
|
|
50
|
+
platform: livePlatformV3(),
|
|
51
|
+
session_start_derivation: "approved_lifecycle_reopen",
|
|
52
|
+
});
|
|
53
|
+
if (reopened.state !== "recorded" && reopened.state !== "already_started") {
|
|
54
|
+
throw new LiveCoordinationAuthorityV3Error(`generation_reopen_failed:${reopened.state}`);
|
|
55
|
+
}
|
|
56
|
+
const heartbeat = ensureLiveCoordinationHeartbeat(input.coordRoot, input.owner, input.nativeSessionId, terminal.adapter);
|
|
57
|
+
if (!heartbeat) {
|
|
58
|
+
throw new LiveCoordinationAuthorityV3Error("reopened_generation_materialization_failed");
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
state: "reopened",
|
|
62
|
+
adapter: terminal.adapter,
|
|
63
|
+
prior_generation_id: terminal.generation_id,
|
|
64
|
+
generation_id: heartbeat.v3_generation_id,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function recordLiveTaskChangeV3(input) {
|
|
68
|
+
liveCoordinationWriteModeV3(input.coordRoot);
|
|
69
|
+
const before = requireHeartbeat(input, input.subject ?? input.owner);
|
|
70
|
+
const cleared = input.task.length === 0;
|
|
71
|
+
const desired = {
|
|
72
|
+
...before,
|
|
73
|
+
task: undefined,
|
|
74
|
+
v3_task_state: cleared ? "cleared" : "set",
|
|
75
|
+
};
|
|
76
|
+
// A task declaration is also per-turn ritual evidence. Record repeated
|
|
77
|
+
// declarations, including cleared -> cleared, even when the disposable view
|
|
78
|
+
// does not change. Otherwise a conversational Cursor remediation turn can
|
|
79
|
+
// run `set-task ""` exactly as instructed and still loop forever because no
|
|
80
|
+
// coord.task_changed event reaches the verdict window.
|
|
81
|
+
return recordLiveAuthority(input, "task-changed", {
|
|
82
|
+
native_observation_id: input.observationId ?? `task-${randomUUID()}`,
|
|
83
|
+
state: cleared ? "cleared" : "set",
|
|
84
|
+
...(cleared ? {} : { task: input.task }),
|
|
85
|
+
}, before, desired, () => {
|
|
86
|
+
// The canonical event records only the privacy-safe set/cleared state.
|
|
87
|
+
// Task prose and its operator-facing suggested name live exclusively in
|
|
88
|
+
// this generation-bound disposable cache; they never enter the ledger.
|
|
89
|
+
if (!setTask(input.coordRoot, input.subject ?? input.owner, input.task)) {
|
|
90
|
+
throw new LiveCoordinationAuthorityV3Error("task_materialization_failed");
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function recordLiveLifecycleChangeV3(input) {
|
|
95
|
+
liveCoordinationWriteModeV3(input.coordRoot);
|
|
96
|
+
const subject = input.subject ?? input.owner;
|
|
97
|
+
const before = requireHeartbeat(input, subject);
|
|
98
|
+
const desired = {
|
|
99
|
+
...before,
|
|
100
|
+
task_state: input.state,
|
|
101
|
+
task_state_reason: input.state === "active" ? undefined : input.reason,
|
|
102
|
+
...(input.suggestedSessionName ? { suggested_session_name: input.suggestedSessionName } : {}),
|
|
103
|
+
};
|
|
104
|
+
if (authorityStateDigest(before) === authorityStateDigest(desired))
|
|
105
|
+
return { state: "unchanged" };
|
|
106
|
+
return recordLiveAuthority(input, "lifecycle-changed", {
|
|
107
|
+
native_observation_id: input.observationId ?? `lifecycle-${randomUUID()}`,
|
|
108
|
+
state: input.state,
|
|
109
|
+
...(input.reason ? { reason_code: `operator_${input.state}` } : {}),
|
|
110
|
+
}, before, desired, () => {
|
|
111
|
+
if (!setLifecycleCache(input.coordRoot, subject, input.state, input.reason, input.suggestedSessionName)) {
|
|
112
|
+
throw new LiveCoordinationAuthorityV3Error("lifecycle_materialization_failed");
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export function recordLiveClaimChangeV3(input) {
|
|
117
|
+
liveCoordinationWriteModeV3(input.coordRoot);
|
|
118
|
+
const subject = input.subject ?? input.owner;
|
|
119
|
+
const before = requireHeartbeat(input, subject);
|
|
120
|
+
const canonical = canonicalClaimPath(input.coordRoot, input.path);
|
|
121
|
+
const desiredFiles = input.operation === "acquired"
|
|
122
|
+
? [
|
|
123
|
+
...new Set([
|
|
124
|
+
...(before.files_touched ?? []).map((path) => canonicalClaimPath(input.coordRoot, path)),
|
|
125
|
+
canonical,
|
|
126
|
+
]),
|
|
127
|
+
].sort()
|
|
128
|
+
: (before.files_touched ?? []).filter((path) => canonicalClaimPath(input.coordRoot, path) !== canonical);
|
|
129
|
+
const desired = { ...before, files_touched: desiredFiles };
|
|
130
|
+
if (authorityStateDigest(before) === authorityStateDigest(desired))
|
|
131
|
+
return { state: "unchanged" };
|
|
132
|
+
return recordLiveAuthority(input, "claim-changed", {
|
|
133
|
+
native_observation_id: input.observationId ?? `claim-${randomUUID()}`,
|
|
134
|
+
operation: input.operation,
|
|
135
|
+
target: canonical,
|
|
136
|
+
access: input.access ?? "write",
|
|
137
|
+
}, before, desired, () => {
|
|
138
|
+
const result = input.operation === "acquired"
|
|
139
|
+
? acquireClaim(input.coordRoot, subject, canonical)
|
|
140
|
+
: releaseClaim(input.coordRoot, subject, canonical);
|
|
141
|
+
if (!result)
|
|
142
|
+
throw new LiveCoordinationAuthorityV3Error("claim_materialization_failed");
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
export function recordLiveIdentityChangeV3(input) {
|
|
146
|
+
liveCoordinationWriteModeV3(input.coordRoot);
|
|
147
|
+
const subject = input.subject ?? input.owner;
|
|
148
|
+
const before = requireHeartbeat(input, subject);
|
|
149
|
+
const desired = { ...before, name: input.name, agent_id: input.identityId };
|
|
150
|
+
if (authorityStateDigest(before) === authorityStateDigest(desired))
|
|
151
|
+
return { state: "unchanged" };
|
|
152
|
+
return recordLiveAuthority(input, "identity-attested", {
|
|
153
|
+
native_observation_id: input.observationId ?? `identity-${randomUUID()}`,
|
|
154
|
+
identity_id: input.identityId,
|
|
155
|
+
method: "operator_assumption",
|
|
156
|
+
}, before, desired, () => {
|
|
157
|
+
recordNameAssumption(input.coordRoot, subject, input.name, input.identityId, "session");
|
|
158
|
+
if (!setIdentityCache(input.coordRoot, subject, input.name, input.identityId)) {
|
|
159
|
+
throw new LiveCoordinationAuthorityV3Error("identity_materialization_failed");
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function recordLiveAuthority(input, signal, observation, expected, desired, apply) {
|
|
164
|
+
const route = resolveLiveEventLedgerRouteV3(input.coordRoot);
|
|
165
|
+
if (route.state === "blocked")
|
|
166
|
+
throw new LiveCoordinationAuthorityV3Error(route.reason);
|
|
167
|
+
const adapter = liveCoordinationAdapterV3(input.coordRoot, input.owner);
|
|
168
|
+
if (!adapter)
|
|
169
|
+
throw new LiveCoordinationAuthorityV3Error("actor_generation_missing");
|
|
170
|
+
const subject = input.subject ?? input.owner;
|
|
171
|
+
const result = recordAuthority({
|
|
172
|
+
coordRoot: input.coordRoot,
|
|
173
|
+
mode: route.mode,
|
|
174
|
+
signal,
|
|
175
|
+
observation,
|
|
176
|
+
adapter,
|
|
177
|
+
native_actor_session_id: input.nativeSessionId,
|
|
178
|
+
actor_instance_id: liveInstanceIdV3(input.owner),
|
|
179
|
+
subject_instance_id: liveInstanceIdV3(subject),
|
|
180
|
+
producer_id: LIVE_COORDINATION_V3_PRODUCER_ID,
|
|
181
|
+
build_id: route.build_id,
|
|
182
|
+
platform: livePlatformV3(),
|
|
183
|
+
expected_prior_state_digest: authorityStateDigest(expected),
|
|
184
|
+
desired_state_digest: authorityStateDigest(desired),
|
|
185
|
+
reconciler: {
|
|
186
|
+
readStateDigest: () => {
|
|
187
|
+
const heartbeat = readHeartbeat(input.coordRoot, subject);
|
|
188
|
+
if (!heartbeat || heartbeat.v3_generation_id !== expected.v3_generation_id) {
|
|
189
|
+
throw new LiveCoordinationAuthorityV3Error(`heartbeat_generation_mismatch:${subject}`);
|
|
190
|
+
}
|
|
191
|
+
return authorityStateDigest(heartbeat);
|
|
192
|
+
},
|
|
193
|
+
apply: (_mutation) => apply(),
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
if (result.state === "gate_closed" || result.state === "generation_unavailable") {
|
|
197
|
+
throw new LiveCoordinationAuthorityV3Error(`${result.state}:${result.reason}`);
|
|
198
|
+
}
|
|
199
|
+
if (result.state === "pending_transaction") {
|
|
200
|
+
throw new LiveCoordinationAuthorityV3Error(`pending_transaction:${result.transaction_id}`);
|
|
201
|
+
}
|
|
202
|
+
return { state: "recorded", result };
|
|
203
|
+
}
|
|
204
|
+
function recordAuthority(input) {
|
|
205
|
+
return recordCoordinationAuthorityV3(input);
|
|
206
|
+
}
|
|
207
|
+
export function liveCoordinationWriteModeV3(coordRoot) {
|
|
208
|
+
const route = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
209
|
+
if (route.state === "blocked")
|
|
210
|
+
throw new LiveCoordinationAuthorityV3Error(route.reason);
|
|
211
|
+
return route.mode;
|
|
212
|
+
}
|
|
213
|
+
function requireHeartbeat(input, owner) {
|
|
214
|
+
const heartbeat = ensureLiveCoordinationHeartbeat(input.coordRoot, owner, owner === input.owner ? input.nativeSessionId : owner, input.adapter);
|
|
215
|
+
if (!heartbeat)
|
|
216
|
+
throw new LiveCoordinationAuthorityV3Error(`heartbeat_missing:${owner}`);
|
|
217
|
+
return heartbeat;
|
|
218
|
+
}
|
|
219
|
+
function authorityStateDigest(heartbeat) {
|
|
220
|
+
return sha256V3(canonicalJsonV3({
|
|
221
|
+
instance_id: heartbeat.v3_instance_id ?? heartbeat.instance_id,
|
|
222
|
+
generation_id: heartbeat.v3_generation_id ?? null,
|
|
223
|
+
task_state: heartbeat.v3_task_state ?? (heartbeat.task ? "set" : "cleared"),
|
|
224
|
+
lifecycle_state: heartbeat.task_state ?? "active",
|
|
225
|
+
task_state_reason: heartbeat.task_state_reason ?? null,
|
|
226
|
+
files_touched: [...new Set(heartbeat.files_touched ?? [])].sort(),
|
|
227
|
+
identity_id: heartbeat.agent_id ?? null,
|
|
228
|
+
display_name: heartbeat.name ?? null,
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
function canonicalClaimPath(coordRoot, path) {
|
|
232
|
+
return path.startsWith(`${coordRoot}/`) ? path.slice(coordRoot.length + 1) : path;
|
|
233
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Adapter } from "../adapter.js";
|
|
2
|
+
import type { EventV3 } from "../events/v3/contract.js";
|
|
3
|
+
export type LiveLifecycleObservationV3Result = {
|
|
4
|
+
state: "recorded";
|
|
5
|
+
event: EventV3;
|
|
6
|
+
};
|
|
7
|
+
interface LiveLifecycleObservationBaseV3 {
|
|
8
|
+
coordRoot: string;
|
|
9
|
+
owner: string;
|
|
10
|
+
nativeSessionId: string;
|
|
11
|
+
adapter: Adapter;
|
|
12
|
+
observedAt?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function recordLiveSweepObservationV3(input: LiveLifecycleObservationBaseV3 & {
|
|
15
|
+
observation: "stale_heartbeat" | "killed" | "unparseable_heartbeat" | "missing_timestamp";
|
|
16
|
+
ageMs: number;
|
|
17
|
+
}): LiveLifecycleObservationV3Result;
|
|
18
|
+
export declare function recordLiveResumeObservationV3(input: LiveLifecycleObservationBaseV3): LiveLifecycleObservationV3Result;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=live-lifecycle-v3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-lifecycle-v3.d.ts","sourceRoot":"","sources":["../../../src/core/agents/live-lifecycle-v3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAaxD,MAAM,MAAM,gCAAgC,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAErF,UAAU,8BAA8B;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,8BAA8B,GAAG;IACtC,WAAW,EAAE,iBAAiB,GAAG,QAAQ,GAAG,uBAAuB,GAAG,mBAAmB,CAAC;IAC1F,KAAK,EAAE,MAAM,CAAC;CACf,GACA,gCAAgC,CAOlC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,8BAA8B,GACpC,gCAAgC,CAQlC"}
|