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,91 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { buildEventV3 } from "../events/v3/builder.js";
|
|
3
|
+
import { normalizeNativeIdV3 } from "../events/v3/canonical.js";
|
|
4
|
+
import { readEventV3ControlState } from "../events/v3/control.js";
|
|
5
|
+
import { fingerprintContextV3 } from "../events/v3/fingerprint-keys.js";
|
|
6
|
+
import { liveInstanceIdV3, livePlatformV3, resolveLiveEventLedgerRouteV3, } from "../events/v3/live-routing.js";
|
|
7
|
+
import { readHookProducerStateV3 } from "../events/v3/producers/recorder.js";
|
|
8
|
+
import { writeEventV3 } from "../events/v3/writer.js";
|
|
9
|
+
import { LiveCoordinationAuthorityV3Error } from "./live-authority-v3.js";
|
|
10
|
+
import { liveCoordinationAdapterV3 } from "./state/live-coordination-view.js";
|
|
11
|
+
export function recordLiveSweepObservationV3(input) {
|
|
12
|
+
return recordObservation(input, "lifecycle.sweep_observed", {
|
|
13
|
+
subject_instance_id: liveInstanceIdV3(input.owner),
|
|
14
|
+
observation: input.observation,
|
|
15
|
+
provisional: true,
|
|
16
|
+
age_ms: Math.max(0, Math.floor(input.ageMs)),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function recordLiveResumeObservationV3(input) {
|
|
20
|
+
const normalized = withAttestedAdapter(input);
|
|
21
|
+
const hook = requireHookState(normalized);
|
|
22
|
+
return recordObservation(normalized, "session.resumed", {
|
|
23
|
+
prior_generation_id: hook.generation_id,
|
|
24
|
+
continuity: "native",
|
|
25
|
+
evidence_reference: "heartbeat_recreated",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function recordObservation(input, eventType, payload) {
|
|
29
|
+
const route = resolveLiveEventLedgerRouteV3(input.coordRoot);
|
|
30
|
+
if (route.state === "blocked")
|
|
31
|
+
throw new LiveCoordinationAuthorityV3Error(route.reason);
|
|
32
|
+
input = withAttestedAdapter(input);
|
|
33
|
+
const control = readEventV3ControlState(input.coordRoot);
|
|
34
|
+
if (control.state !== route.mode) {
|
|
35
|
+
throw new LiveCoordinationAuthorityV3Error("control_state_changed");
|
|
36
|
+
}
|
|
37
|
+
const hook = requireHookState(input);
|
|
38
|
+
if (!hook.last_event_id)
|
|
39
|
+
throw new LiveCoordinationAuthorityV3Error("generation_has_no_event");
|
|
40
|
+
const rootId = control.genesis.event.scope.root_id;
|
|
41
|
+
const context = fingerprintContextV3(input.coordRoot, rootId, hook.generation_id, control.genesis.profile.privacy_key_epoch);
|
|
42
|
+
const nativeObservationId = `${eventType}\0${input.owner}\0${input.observedAt ?? "now"}\0${JSON.stringify(payload)}`;
|
|
43
|
+
const common = {
|
|
44
|
+
producer: {
|
|
45
|
+
producer_id: "prd_agent-coord-lifecycle",
|
|
46
|
+
boot_id: `boot_${randomUUID()}`,
|
|
47
|
+
sequence: 1,
|
|
48
|
+
component: "agent-coord",
|
|
49
|
+
build_id: route.build_id,
|
|
50
|
+
platform: livePlatformV3(),
|
|
51
|
+
},
|
|
52
|
+
scope: {
|
|
53
|
+
root_id: rootId,
|
|
54
|
+
instance_id: hook.instance_id,
|
|
55
|
+
session_id: hook.session_id,
|
|
56
|
+
generation_id: hook.generation_id,
|
|
57
|
+
},
|
|
58
|
+
attestation_id: hook.attestation_id,
|
|
59
|
+
links: { caused_by: [hook.last_event_id] },
|
|
60
|
+
provenance: {
|
|
61
|
+
source_event: `agent-coord.${eventType}`,
|
|
62
|
+
attestation: "derived",
|
|
63
|
+
confidence: "exact",
|
|
64
|
+
source_record_id: normalizeNativeIdV3(context, `agent-coord.${eventType}`, nativeObservationId),
|
|
65
|
+
attribution: {
|
|
66
|
+
method: "heartbeat_match",
|
|
67
|
+
state: "verified",
|
|
68
|
+
observer_instance_id: hook.instance_id,
|
|
69
|
+
subject_instance_id: hook.instance_id,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
observed_at: input.observedAt,
|
|
73
|
+
monotonic_ns: process.hrtime.bigint().toString(),
|
|
74
|
+
};
|
|
75
|
+
const event = buildEventV3(eventType, { ...common, payload });
|
|
76
|
+
writeEventV3(input.coordRoot, event);
|
|
77
|
+
return { state: "recorded", event };
|
|
78
|
+
}
|
|
79
|
+
function withAttestedAdapter(input) {
|
|
80
|
+
const adapter = liveCoordinationAdapterV3(input.coordRoot, input.owner);
|
|
81
|
+
if (!adapter)
|
|
82
|
+
return input;
|
|
83
|
+
return { ...input, adapter };
|
|
84
|
+
}
|
|
85
|
+
function requireHookState(input) {
|
|
86
|
+
const hook = readHookProducerStateV3(input.coordRoot, input.adapter, input.nativeSessionId);
|
|
87
|
+
if (!hook || hook.instance_id !== liveInstanceIdV3(input.owner)) {
|
|
88
|
+
throw new LiveCoordinationAuthorityV3Error("hook_generation_not_joinable");
|
|
89
|
+
}
|
|
90
|
+
return hook;
|
|
91
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Adapter } from "../adapter.js";
|
|
2
|
+
import type { EventTypeV3, EventV3 } from "../events/v3/contract.js";
|
|
3
|
+
import type { LiveCoordinationObservationV3 } from "../events/v3/live-observation.js";
|
|
4
|
+
export type { LiveCoordinationObservationV3 } from "../events/v3/live-observation.js";
|
|
5
|
+
export interface RecordLiveCoordinationObservationV3Input {
|
|
6
|
+
coordRoot: string;
|
|
7
|
+
owner: string;
|
|
8
|
+
nativeSessionId: string;
|
|
9
|
+
adapter: Adapter;
|
|
10
|
+
observation: LiveCoordinationObservationV3;
|
|
11
|
+
observationId?: string;
|
|
12
|
+
observedAt?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RecordLiveCoordinationObservationV3Result {
|
|
15
|
+
state: "recorded";
|
|
16
|
+
event: EventV3;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Append a non-authority coordination observation against one attested live
|
|
20
|
+
* generation. Raw message and record bodies are used only to derive keyed
|
|
21
|
+
* fingerprints or content digests; they never enter the ledger payload.
|
|
22
|
+
*/
|
|
23
|
+
export declare function recordLiveCoordinationObservationV3(input: RecordLiveCoordinationObservationV3Input): RecordLiveCoordinationObservationV3Result;
|
|
24
|
+
export type LiveCoordinationObservationEventTypeV3 = Extract<EventTypeV3, LiveCoordinationObservationV3["event_type"]>;
|
|
25
|
+
//# sourceMappingURL=live-observation-v3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-observation-v3.d.ts","sourceRoot":"","sources":["../../../src/core/agents/live-observation-v3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAQ7C,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAIrE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAWtF,YAAY,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAEtF,MAAM,WAAW,wCAAwC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,6BAA6B,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yCAAyC;IACxD,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,wCAAwC,GAC9C,yCAAyC,CAkJ3C;AAkBD,MAAM,MAAM,sCAAsC,GAAG,OAAO,CAC1D,WAAW,EACX,6BAA6B,CAAC,YAAY,CAAC,CAC5C,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { buildEventV3 } from "../events/v3/builder.js";
|
|
3
|
+
import { canonicalJsonV3, fingerprintV3, normalizeNativeIdV3, sha256V3, } from "../events/v3/canonical.js";
|
|
4
|
+
import { readEventV3ControlState } from "../events/v3/control.js";
|
|
5
|
+
import { readCoordinationViewV3 } from "../events/v3/coordination-view.js";
|
|
6
|
+
import { fingerprintContextV3 } from "../events/v3/fingerprint-keys.js";
|
|
7
|
+
import { liveInstanceIdV3, livePlatformV3, resolveLiveEventLedgerRouteV3, } from "../events/v3/live-routing.js";
|
|
8
|
+
import { readHookProducerStateV3 } from "../events/v3/producers/recorder.js";
|
|
9
|
+
import { writeEventV3 } from "../events/v3/writer.js";
|
|
10
|
+
import { LiveCoordinationAuthorityV3Error } from "./live-authority-v3.js";
|
|
11
|
+
import { liveCoordinationAdapterV3 } from "./state/live-coordination-view.js";
|
|
12
|
+
/**
|
|
13
|
+
* Append a non-authority coordination observation against one attested live
|
|
14
|
+
* generation. Raw message and record bodies are used only to derive keyed
|
|
15
|
+
* fingerprints or content digests; they never enter the ledger payload.
|
|
16
|
+
*/
|
|
17
|
+
export function recordLiveCoordinationObservationV3(input) {
|
|
18
|
+
const route = resolveLiveEventLedgerRouteV3(input.coordRoot);
|
|
19
|
+
if (route.state === "blocked")
|
|
20
|
+
throw new LiveCoordinationAuthorityV3Error(route.reason);
|
|
21
|
+
const control = readEventV3ControlState(input.coordRoot);
|
|
22
|
+
if (control.state !== route.mode) {
|
|
23
|
+
throw new LiveCoordinationAuthorityV3Error("control_state_changed");
|
|
24
|
+
}
|
|
25
|
+
const adapter = liveCoordinationAdapterV3(input.coordRoot, input.owner) ?? input.adapter;
|
|
26
|
+
const hook = readHookProducerStateV3(input.coordRoot, adapter, input.nativeSessionId);
|
|
27
|
+
if (!hook ||
|
|
28
|
+
hook.terminal ||
|
|
29
|
+
!hook.last_event_id ||
|
|
30
|
+
hook.instance_id !== liveInstanceIdV3(input.owner)) {
|
|
31
|
+
throw new LiveCoordinationAuthorityV3Error("hook_generation_not_joinable");
|
|
32
|
+
}
|
|
33
|
+
const rootId = control.genesis.event.scope.root_id;
|
|
34
|
+
const fingerprintContext = fingerprintContextV3(input.coordRoot, rootId, hook.generation_id, control.genesis.profile.privacy_key_epoch);
|
|
35
|
+
const observationId = input.observationId ?? `${input.observation.event_type}-${randomUUID()}`;
|
|
36
|
+
const subject = "subject" in input.observation && input.observation.subject
|
|
37
|
+
? liveInstanceIdV3(input.observation.subject)
|
|
38
|
+
: hook.instance_id;
|
|
39
|
+
const common = {
|
|
40
|
+
producer: {
|
|
41
|
+
producer_id: "prd_agent-coord-observation",
|
|
42
|
+
boot_id: `boot_${randomUUID()}`,
|
|
43
|
+
sequence: 1,
|
|
44
|
+
component: "agent-coord",
|
|
45
|
+
build_id: route.build_id,
|
|
46
|
+
platform: livePlatformV3(),
|
|
47
|
+
},
|
|
48
|
+
scope: {
|
|
49
|
+
root_id: rootId,
|
|
50
|
+
instance_id: hook.instance_id,
|
|
51
|
+
session_id: hook.session_id,
|
|
52
|
+
generation_id: hook.generation_id,
|
|
53
|
+
},
|
|
54
|
+
attestation_id: hook.attestation_id,
|
|
55
|
+
links: { caused_by: [hook.last_event_id] },
|
|
56
|
+
provenance: {
|
|
57
|
+
source_event: `agent-coord.${input.observation.event_type}`,
|
|
58
|
+
attestation: "derived",
|
|
59
|
+
confidence: "exact",
|
|
60
|
+
source_record_id: normalizeNativeIdV3(fingerprintContext, "agent-coord.observation", observationId),
|
|
61
|
+
attribution: {
|
|
62
|
+
method: "session_env",
|
|
63
|
+
state: "verified",
|
|
64
|
+
observer_instance_id: hook.instance_id,
|
|
65
|
+
subject_instance_id: subject,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
observed_at: input.observedAt,
|
|
69
|
+
monotonic_ns: process.hrtime.bigint().toString(),
|
|
70
|
+
};
|
|
71
|
+
const observation = input.observation;
|
|
72
|
+
let event;
|
|
73
|
+
switch (observation.event_type) {
|
|
74
|
+
case "coord.status_observed":
|
|
75
|
+
event = buildEventV3("coord.status_observed", {
|
|
76
|
+
...common,
|
|
77
|
+
payload: {
|
|
78
|
+
observer_instance_id: hook.instance_id,
|
|
79
|
+
subject_instance_id: subject,
|
|
80
|
+
status: safeToken(observation.status),
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
break;
|
|
84
|
+
case "coord.presence_changed": {
|
|
85
|
+
// The ledger projection, not the independently versioned presence file,
|
|
86
|
+
// owns the canonical prior state. Omitting an unknown first prior keeps
|
|
87
|
+
// the transition honest and avoids manufacturing a history.
|
|
88
|
+
const projectedPrior = readCoordinationViewV3(input.coordRoot).instances[hook.instance_id]
|
|
89
|
+
?.presence_state;
|
|
90
|
+
event = buildEventV3("coord.presence_changed", {
|
|
91
|
+
...common,
|
|
92
|
+
payload: {
|
|
93
|
+
actor_instance_id: hook.instance_id,
|
|
94
|
+
subject_instance_id: hook.instance_id,
|
|
95
|
+
...(projectedPrior ? { prior_state: safeToken(projectedPrior) } : {}),
|
|
96
|
+
new_state: safeToken(observation.new_state),
|
|
97
|
+
reason: reasonCode(observation.reason),
|
|
98
|
+
authority: {},
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case "coord.message_observed":
|
|
104
|
+
event = buildEventV3("coord.message_observed", {
|
|
105
|
+
...common,
|
|
106
|
+
payload: {
|
|
107
|
+
message_id: safeToken(observation.message_id ?? `msg_${randomUUID()}`),
|
|
108
|
+
direction: observation.direction,
|
|
109
|
+
peer_instance_id: subject,
|
|
110
|
+
body_length: Buffer.byteLength(observation.body, "utf8"),
|
|
111
|
+
body_fingerprint: fingerprintV3(fingerprintContext, "coord.message.body", observation.body, "generation"),
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
break;
|
|
115
|
+
case "council.state_changed":
|
|
116
|
+
event = buildEventV3("council.state_changed", {
|
|
117
|
+
...common,
|
|
118
|
+
payload: {
|
|
119
|
+
council_id: safeToken(observation.council_id),
|
|
120
|
+
...(observation.prior_state ? { prior_state: safeToken(observation.prior_state) } : {}),
|
|
121
|
+
new_state: safeToken(observation.new_state),
|
|
122
|
+
record_digest: sha256V3(canonicalJsonV3(observation.record)),
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
break;
|
|
126
|
+
case "decision.state_changed": {
|
|
127
|
+
const projectedDecisionPrior = readCoordinationViewV3(input.coordRoot).decisions[observation.decision_id];
|
|
128
|
+
event = buildEventV3("decision.state_changed", {
|
|
129
|
+
...common,
|
|
130
|
+
payload: {
|
|
131
|
+
decision_id: safeToken(observation.decision_id),
|
|
132
|
+
...(projectedDecisionPrior ? { prior_state: safeToken(projectedDecisionPrior) } : {}),
|
|
133
|
+
new_state: safeToken(observation.new_state),
|
|
134
|
+
record_digest: sha256V3(canonicalJsonV3(observation.record)),
|
|
135
|
+
authority: { record_id: safeToken(observation.decision_id) },
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
writeEventV3(input.coordRoot, event);
|
|
142
|
+
return { state: "recorded", event };
|
|
143
|
+
}
|
|
144
|
+
function safeToken(value) {
|
|
145
|
+
const normalized = value.normalize("NFC");
|
|
146
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._:/+-]{0,127}$/.test(normalized)) {
|
|
147
|
+
throw new LiveCoordinationAuthorityV3Error(`invalid_safe_token:${value}`);
|
|
148
|
+
}
|
|
149
|
+
return normalized;
|
|
150
|
+
}
|
|
151
|
+
function reasonCode(value) {
|
|
152
|
+
const normalized = value.normalize("NFC");
|
|
153
|
+
if (!/^[a-z0-9][a-z0-9._-]{0,79}$/.test(normalized)) {
|
|
154
|
+
throw new LiveCoordinationAuthorityV3Error(`invalid_reason_code:${value}`);
|
|
155
|
+
}
|
|
156
|
+
return normalized;
|
|
157
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* council-pending hash-dedup, the cross-adapter first-session naming nudge,
|
|
4
4
|
* the Cursor/Codex set-task staleness nudge, and the Codex status-footer
|
|
5
5
|
* reminder.
|
|
6
|
-
* agent-hook's
|
|
6
|
+
* agent-hook's turn.started post-emit handler calls this
|
|
7
7
|
* and forwards the result as the adapter-shaped additionalContext payload.
|
|
8
8
|
*
|
|
9
9
|
* Four subsections combined into one additionalContext payload:
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
* + sorted(files_touched) + platform, sorted by instance_id).
|
|
13
13
|
* 2. Council pending: pending open-council IDs hashed; re-emits when the
|
|
14
14
|
* ID set changes.
|
|
15
|
-
* 3. Focus nudge. Until the session has
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* 3. Focus nudge. Until the session has displayed its current suggested
|
|
16
|
+
* name, tells every adapter on every prompt to send the exact fenced block
|
|
17
|
+
* before prose or another tool call.
|
|
18
18
|
* Cursor/Codex additionally get the existing unset/stale-task reminder
|
|
19
19
|
* because their Stop hooks do not enforce task declarations as reliably
|
|
20
20
|
* as Claude Code's.
|
|
@@ -43,6 +43,12 @@ export interface PromptContextOpts {
|
|
|
43
43
|
/** When true, append the non-deduplicated Codex status-footer reminder.
|
|
44
44
|
* The caller enables this only for human-facing Codex sessions. */
|
|
45
45
|
statusFooterNudge?: boolean;
|
|
46
|
+
/** Adapter id whose Stop hook ENFORCES the end-of-turn ritual (task_set +
|
|
47
|
+
* status check). When set, append a fresh per-prompt reminder of that
|
|
48
|
+
* contract so the model satisfies it before ending the turn instead of
|
|
49
|
+
* being bounced into a retry. Not hash-deduped, same rationale as the
|
|
50
|
+
* status footer. */
|
|
51
|
+
turnRitualNudge?: string;
|
|
46
52
|
}
|
|
47
53
|
/**
|
|
48
54
|
* Build the combined UserPromptSubmit additionalContext string. Returns "" when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-context.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/render/prompt-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;
|
|
1
|
+
{"version":3,"file":"prompt-context.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/render/prompt-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AA4CH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;8EAC0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;kFAC8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;uEACmE;IACnE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;wBAIoB;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAqDnE"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* council-pending hash-dedup, the cross-adapter first-session naming nudge,
|
|
4
4
|
* the Cursor/Codex set-task staleness nudge, and the Codex status-footer
|
|
5
5
|
* reminder.
|
|
6
|
-
* agent-hook's
|
|
6
|
+
* agent-hook's turn.started post-emit handler calls this
|
|
7
7
|
* and forwards the result as the adapter-shaped additionalContext payload.
|
|
8
8
|
*
|
|
9
9
|
* Four subsections combined into one additionalContext payload:
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
* + sorted(files_touched) + platform, sorted by instance_id).
|
|
13
13
|
* 2. Council pending: pending open-council IDs hashed; re-emits when the
|
|
14
14
|
* ID set changes.
|
|
15
|
-
* 3. Focus nudge. Until the session has
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* 3. Focus nudge. Until the session has displayed its current suggested
|
|
16
|
+
* name, tells every adapter on every prompt to send the exact fenced block
|
|
17
|
+
* before prose or another tool call.
|
|
18
18
|
* Cursor/Codex additionally get the existing unset/stale-task reminder
|
|
19
19
|
* because their Stop hooks do not enforce task declarations as reliably
|
|
20
20
|
* as Claude Code's.
|
|
@@ -35,6 +35,8 @@ import { join } from "node:path";
|
|
|
35
35
|
import { coordEnv } from "../../../lib/env.js";
|
|
36
36
|
import { endOfTurnStatusCommand, resolveBinName } from "../../config.js";
|
|
37
37
|
import { readRemoteMachines } from "../../presence/index.js";
|
|
38
|
+
import { sessionNameDisplayBlock, sessionNameDisplayPending } from "../session-name-display.js";
|
|
39
|
+
import { readLiveCoordinationRow, readLiveCoordinationRows, } from "../state/live-coordination-view.js";
|
|
38
40
|
import { formatPendingCouncils } from "./session-context.js";
|
|
39
41
|
/**
|
|
40
42
|
* Build the combined UserPromptSubmit additionalContext string. Returns "" when
|
|
@@ -45,7 +47,7 @@ import { formatPendingCouncils } from "./session-context.js";
|
|
|
45
47
|
* councils are pending, matching the bash behavior).
|
|
46
48
|
*/
|
|
47
49
|
export function renderPromptContext(opts) {
|
|
48
|
-
const { coordRoot, instanceId, sessionId, agentName, sessionNameNudge, taskNudge, statusFooterNudge, } = opts;
|
|
50
|
+
const { coordRoot, instanceId, sessionId, agentName, sessionNameNudge, taskNudge, statusFooterNudge, turnRitualNudge, } = opts;
|
|
49
51
|
const sections = [];
|
|
50
52
|
// 1. Peer table with hash dedup.
|
|
51
53
|
const peerTable = computePeerTableIfChanged(coordRoot, instanceId, sessionId);
|
|
@@ -76,10 +78,34 @@ export function renderPromptContext(opts) {
|
|
|
76
78
|
if (statusMsg)
|
|
77
79
|
sections.push(statusMsg);
|
|
78
80
|
}
|
|
81
|
+
// 5. Adapters whose Stop hook ENFORCES the turn ritual get a fresh reminder
|
|
82
|
+
// on every prompt. Reminding before the reply is drafted is far cheaper than
|
|
83
|
+
// the bounce-and-retry the Stop hook otherwise forces: enforcement-only
|
|
84
|
+
// compliance was measured missing on a double-digit share of turns. Not
|
|
85
|
+
// hash-deduped for the same reason as the Codex footer.
|
|
86
|
+
if (turnRitualNudge) {
|
|
87
|
+
const ritualMsg = renderTurnRitualReminder(coordRoot, instanceId, turnRitualNudge);
|
|
88
|
+
if (ritualMsg)
|
|
89
|
+
sections.push(ritualMsg);
|
|
90
|
+
}
|
|
79
91
|
return sections.join("\n\n");
|
|
80
92
|
}
|
|
93
|
+
function renderTurnRitualReminder(coordRoot, selfInstanceId, adapter) {
|
|
94
|
+
const hb = readLiveCoordinationRow(coordRoot, selfInstanceId);
|
|
95
|
+
if (!hb || hb.kind === "subagent" || hb.kind === "transient" || hb.workflow_run_id)
|
|
96
|
+
return "";
|
|
97
|
+
const bin = resolveBinName(coordRoot);
|
|
98
|
+
const statusCommand = endOfTurnStatusCommand(coordRoot);
|
|
99
|
+
// Claude Code renders the status box only if the reply carries it; Cursor
|
|
100
|
+
// shows the box inline on its own, so it is never asked for a second copy.
|
|
101
|
+
const paste = adapter === "claude-code"
|
|
102
|
+
? " and paste its output verbatim in a fenced code block at the end of your reply"
|
|
103
|
+
: "";
|
|
104
|
+
return (`Turn ritual (Stop-enforced): on any turn that uses tools, run \`${bin} agents set-task "<short focus>"\` at some point during the turn (required every turn, even when the focus is unchanged; pass an empty string when there is no meaningful focus), then make \`${statusCommand}\` your final tool call${paste}. ` +
|
|
105
|
+
"A turn that ends without these is bounced by the Stop hook and costs a retry.");
|
|
106
|
+
}
|
|
81
107
|
function renderStatusFooterReminder(coordRoot, selfInstanceId) {
|
|
82
|
-
const hb =
|
|
108
|
+
const hb = readLiveCoordinationRow(coordRoot, selfInstanceId);
|
|
83
109
|
if (!hb || hb.kind === "subagent" || hb.kind === "transient" || hb.workflow_run_id)
|
|
84
110
|
return "";
|
|
85
111
|
const statusCommand = endOfTurnStatusCommand(coordRoot);
|
|
@@ -94,16 +120,9 @@ function renderStatusFooterReminder(coordRoot, selfInstanceId) {
|
|
|
94
120
|
* `agents set-task` uses for `first_of_session`; clears still stamp the field.
|
|
95
121
|
*/
|
|
96
122
|
function computeFocusNudgeIfChanged(coordRoot, selfInstanceId, opts) {
|
|
97
|
-
const
|
|
98
|
-
if (!
|
|
123
|
+
const hb = readLiveCoordinationRow(coordRoot, selfInstanceId);
|
|
124
|
+
if (!hb)
|
|
99
125
|
return "";
|
|
100
|
-
let hb;
|
|
101
|
-
try {
|
|
102
|
-
hb = JSON.parse(readFileSync(hbPath, "utf8"));
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
return "";
|
|
106
|
-
}
|
|
107
126
|
const hashFile = join(coordRoot, ".harnery", `.last-task-nudge-hash.${selfInstanceId}`);
|
|
108
127
|
// Subagents and workflow children have no human-owned session/tab to rename.
|
|
109
128
|
if (hb.kind === "subagent" || hb.kind === "transient" || hb.workflow_run_id) {
|
|
@@ -116,14 +135,16 @@ function computeFocusNudgeIfChanged(coordRoot, selfInstanceId, opts) {
|
|
|
116
135
|
let needsNudge = false;
|
|
117
136
|
let message = "";
|
|
118
137
|
let nudgeKind = "";
|
|
119
|
-
|
|
138
|
+
const pendingSessionName = sessionNameDisplayPending(hb);
|
|
139
|
+
if (opts.sessionNameNudge && (!hb.suggested_session_name || pendingSessionName)) {
|
|
120
140
|
// Keyed on "a name was ever produced", not task_updated_at: a bare clear
|
|
121
141
|
// as the first declaration must not end the naming window.
|
|
122
142
|
needsNudge = true;
|
|
123
143
|
nudgeKind = "session-name";
|
|
124
|
-
message =
|
|
125
|
-
`This session
|
|
126
|
-
|
|
144
|
+
message = pendingSessionName
|
|
145
|
+
? `This session name is still pending display. Before any prose or another tool call, send this exact block as your next assistant text:\n\n${sessionNameDisplayBlock(pendingSessionName)}`
|
|
146
|
+
: `This session has no name yet: run \`${bin} agents set-task "<2-5 word session topic>"\` as your first tool call. ` +
|
|
147
|
+
"When it returns `first_of_session: true`, send its `suggested_session_name` as the exact fenced block requested by the PostToolUse instruction before any prose or another tool call. " +
|
|
127
148
|
"Then continue with the task; that `set-task` also satisfies this turn's focus declaration.";
|
|
128
149
|
}
|
|
129
150
|
else if (opts.taskNudge && !taskValue) {
|
|
@@ -169,28 +190,20 @@ function computeFocusNudgeIfChanged(coordRoot, selfInstanceId, opts) {
|
|
|
169
190
|
return message;
|
|
170
191
|
}
|
|
171
192
|
function computePeerTableIfChanged(coordRoot, selfInstanceId, selfSessionIdFallback) {
|
|
172
|
-
const activeDir = join(coordRoot, ".harnery", "active");
|
|
173
|
-
if (!existsSync(activeDir))
|
|
174
|
-
return "";
|
|
175
193
|
// Read self heartbeat for session_id (group key); fall back to the caller's hint.
|
|
176
194
|
let mySessionId = selfSessionIdFallback;
|
|
177
|
-
const
|
|
195
|
+
const rows = readLiveCoordinationRows(coordRoot);
|
|
196
|
+
const selfHb = readLiveCoordinationRow(coordRoot, selfInstanceId);
|
|
178
197
|
if (selfHb?.session_id)
|
|
179
198
|
mySessionId = selfHb.session_id;
|
|
180
199
|
if (!mySessionId)
|
|
181
200
|
return "";
|
|
182
|
-
// Collect
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
if (!f.endsWith(".json"))
|
|
186
|
-
continue;
|
|
187
|
-
const hb = readHeartbeat(join(activeDir, f));
|
|
188
|
-
if (!hb?.instance_id || hb.instance_id === selfInstanceId)
|
|
189
|
-
continue;
|
|
190
|
-
peers.push(hb);
|
|
191
|
-
}
|
|
201
|
+
// Collect peers from the selected ledger route. Under V3 this is the
|
|
202
|
+
// canonical projection, never the legacy active directory.
|
|
203
|
+
const peers = rows.filter((heartbeat) => heartbeat.instance_id && heartbeat.instance_id !== selfInstanceId);
|
|
192
204
|
// Cross-machine presence (ADR 0016): sessions on other machines, from the
|
|
193
|
-
// locally-fetched presence refs. Advisory
|
|
205
|
+
// locally-fetched presence refs. Advisory only; remote presence never grants
|
|
206
|
+
// claim authority.
|
|
194
207
|
const remote = readRemoteMachinesSafe(coordRoot);
|
|
195
208
|
if (peers.length === 0 && remote.length === 0)
|
|
196
209
|
return "";
|
|
@@ -204,6 +217,9 @@ function computePeerTableIfChanged(coordRoot, selfInstanceId, selfSessionIdFallb
|
|
|
204
217
|
started_at: p.started_at ?? null,
|
|
205
218
|
files_touched: Array.from(p.files_touched ?? []).sort(),
|
|
206
219
|
platform: p.platform ?? null,
|
|
220
|
+
activity: p.activity ?? "unknown",
|
|
221
|
+
task_state: p.task_state ?? "active",
|
|
222
|
+
task_state_reason: p.task_state_reason ?? null,
|
|
207
223
|
}))
|
|
208
224
|
.sort((a, b) => (a.instance_id ?? "").localeCompare(b.instance_id ?? ""));
|
|
209
225
|
// Remote basis: machine + per-agent identity/task/files (published_at is
|
|
@@ -214,6 +230,9 @@ function computePeerTableIfChanged(coordRoot, selfInstanceId, selfSessionIdFallb
|
|
|
214
230
|
instance_id: a.instance_id,
|
|
215
231
|
name: a.name ?? null,
|
|
216
232
|
task: a.task ?? null,
|
|
233
|
+
activity: a.activity,
|
|
234
|
+
task_state: a.task_state,
|
|
235
|
+
task_state_reason: a.task_state_reason ?? null,
|
|
217
236
|
files_touched: Array.from(a.files_touched ?? []).sort(),
|
|
218
237
|
})),
|
|
219
238
|
}));
|
|
@@ -309,14 +328,6 @@ function computeCouncilPendingIfChanged(coordRoot, selfInstanceId, agentName) {
|
|
|
309
328
|
return formatPendingCouncils(coordRoot, agentName);
|
|
310
329
|
}
|
|
311
330
|
/* ---------- helpers ---------- */
|
|
312
|
-
function readHeartbeat(path) {
|
|
313
|
-
try {
|
|
314
|
-
return JSON.parse(readFileSync(path, "utf8"));
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
return null;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
331
|
function safeRead(path) {
|
|
321
332
|
try {
|
|
322
333
|
return readFileSync(path, "utf8").trim();
|
|
@@ -393,17 +404,22 @@ function renderSubtable(rows, header, nowSec) {
|
|
|
393
404
|
}
|
|
394
405
|
function formatRow(r, nowSec) {
|
|
395
406
|
const taskPart = r.task ? ` "${r.task.slice(0, 60)}"` : "";
|
|
407
|
+
const statePart = formatState(r);
|
|
396
408
|
// Fall back started_at → last_heartbeat; if neither is a valid timestamp,
|
|
397
409
|
// show "age unknown" rather than the epoch-derived "20608d ago" ghost.
|
|
398
410
|
const startedSec = parseIsoSec(r.started_at) ?? parseIsoSec(r.last_heartbeat);
|
|
399
411
|
const ageFrom = startedSec === null ? "age unknown" : fmtAge(nowSec - startedSec);
|
|
400
412
|
const filesPart = fmtFiles(r.display_files);
|
|
401
|
-
const lastActivity = fmtLastActivity(r, nowSec);
|
|
402
|
-
const turnSummary = r.turn_summary ? `\n last turn: ${r.turn_summary.slice(0, 80)}` : "";
|
|
403
413
|
// Prefer a short instance_id over a bare "unknown" so an incomplete row is
|
|
404
414
|
// still identifiable.
|
|
405
415
|
const label = r.name ?? (r.instance_id ? r.instance_id.slice(0, 8) : "unknown");
|
|
406
|
-
return ` - agent-${label}${taskPart} (${
|
|
416
|
+
return ` - agent-${label}${taskPart} (${statePart}, ${ageFrom}, ${filesPart})`;
|
|
417
|
+
}
|
|
418
|
+
function formatState(r) {
|
|
419
|
+
const activity = r.activity ?? "unknown";
|
|
420
|
+
const lifecycle = r.task_state ?? "active";
|
|
421
|
+
const reason = lifecycle === "blocked" && r.task_state_reason ? `: ${r.task_state_reason.slice(0, 80)}` : "";
|
|
422
|
+
return `activity=${activity}, lifecycle=${lifecycle}${reason}`;
|
|
407
423
|
}
|
|
408
424
|
function fmtFiles(files) {
|
|
409
425
|
if (files.length === 0)
|
|
@@ -412,16 +428,6 @@ function fmtFiles(files) {
|
|
|
412
428
|
return `holds: ${files.join(", ")}`;
|
|
413
429
|
return `holds: ${files.slice(0, 3).join(", ")}, +${files.length - 3} more`;
|
|
414
430
|
}
|
|
415
|
-
function fmtLastActivity(r, nowSec) {
|
|
416
|
-
if (!r.last_tool)
|
|
417
|
-
return "";
|
|
418
|
-
const lastTs = parseIsoSec(r.last_heartbeat) ?? parseIsoSec(r.started_at);
|
|
419
|
-
const tail = r.last_tool_target ? ` ${r.last_tool_target.slice(0, 60)}` : "";
|
|
420
|
-
// No valid timestamp → render the tool without an absurd age.
|
|
421
|
-
if (lastTs === null)
|
|
422
|
-
return `, last: ${r.last_tool}${tail}`;
|
|
423
|
-
return `, last: ${r.last_tool}${tail} ${fmtAge(nowSec - lastTs)}`;
|
|
424
|
-
}
|
|
425
431
|
/** Epoch-seconds for an ISO string, or null when missing/unparseable (so callers
|
|
426
432
|
* can render "age unknown" instead of an epoch-derived absurd age). */
|
|
427
433
|
function parseIsoSec(iso) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SessionStart UX renderer: combines the peer table, the wiring check, and
|
|
3
|
-
* the pending-council formatter so agent-hook session.
|
|
3
|
+
* the pending-council formatter so agent-hook session.started can emit the
|
|
4
4
|
* combined `systemMessage` JSON directly.
|
|
5
5
|
*
|
|
6
6
|
* Outputs a Claude Code SessionStart hookSpecificOutput.additionalContext
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-context.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/render/session-context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAyC,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"session-context.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/render/session-context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAyC,QAAQ,EAAE,MAAM,SAAS,CAAC;AAwB1E,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;+BAC2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CA6E7D;AAkID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBvD;AA0DD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAiDlF;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,iBAAW,CAAC"}
|