harnery 0.34.1 → 0.36.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/dist/commander.d.ts +30 -5
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +124 -94
- package/dist/commands/agents.d.ts +37 -6
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +466 -371
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +10 -10
- package/dist/commands/browse-session.d.ts.map +1 -1
- package/dist/commands/browse-session.js +12 -0
- package/dist/commands/browse.d.ts +1 -1
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +31 -6
- package/dist/commands/conversations.d.ts +10 -0
- package/dist/commands/conversations.d.ts.map +1 -0
- package/dist/commands/conversations.js +201 -0
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +2 -2
- package/dist/commands/deinit.d.ts.map +1 -1
- package/dist/commands/deinit.js +5 -0
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +13 -2
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +51 -7
- package/dist/commands/events.d.ts.map +1 -1
- package/dist/commands/events.js +18 -1
- package/dist/commands/fetch.js +6 -5
- package/dist/commands/files.d.ts +22 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +113 -0
- package/dist/commands/governor.js +14 -12
- package/dist/commands/inbox.d.ts +5 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +57 -0
- package/dist/commands/init.d.ts +4 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +63 -13
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +347 -1
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +169 -0
- package/dist/commands/messages.d.ts +5 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +45 -0
- package/dist/commands/outline.d.ts +1 -1
- package/dist/commands/outline.d.ts.map +1 -1
- package/dist/commands/outline.js +2 -2
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +2 -2
- package/dist/commands/read.d.ts +1 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +2 -2
- package/dist/commands/semantic.d.ts +4 -0
- package/dist/commands/semantic.d.ts.map +1 -0
- package/dist/commands/semantic.js +199 -0
- package/dist/commands/storage.d.ts +4 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +238 -0
- package/dist/commands/tunnel.d.ts +5 -1
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +44 -31
- package/dist/commands/web.d.ts +3 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +84 -7
- package/dist/commands/work.js +3 -3
- package/dist/commands/workflow.js +13 -13
- package/dist/core/adapters/profiles.d.ts +1 -1
- package/dist/core/agents/canonical-emit.d.ts +3 -0
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +12 -0
- package/dist/core/agents/claim-path.d.ts +11 -0
- package/dist/core/agents/claim-path.d.ts.map +1 -0
- package/dist/core/agents/claim-path.js +22 -0
- package/dist/core/agents/cli.js +209 -39
- package/dist/core/agents/coord-client.d.ts +29 -3
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +88 -9
- package/dist/core/agents/live-authority-v3.d.ts +47 -1
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +245 -13
- package/dist/core/agents/live-lifecycle-v3.js +9 -4
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
- package/dist/core/agents/live-observation-v3.js +8 -3
- package/dist/core/agents/render/prompt-context.d.ts +9 -3
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +36 -17
- package/dist/core/agents/rules/stop-hook.d.ts +2 -0
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +115 -22
- package/dist/core/agents/rules/verdict.d.ts +1 -0
- package/dist/core/agents/rules/verdict.d.ts.map +1 -1
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +4 -0
- package/dist/core/agents/session-finalization-state-v3.js +1 -1
- package/dist/core/agents/session-finalizer-v3.js +5 -1
- package/dist/core/agents/session-name-display.d.ts +1 -0
- package/dist/core/agents/session-name-display.d.ts.map +1 -1
- package/dist/core/agents/session-name-display.js +8 -1
- package/dist/core/agents/state/activity-log.d.ts +3 -0
- package/dist/core/agents/state/activity-log.d.ts.map +1 -1
- package/dist/core/agents/state/activity-log.js +6 -3
- package/dist/core/agents/state/heartbeat-reader.d.ts +46 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/agents/state/heartbeat-reader.js +25 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts +9 -48
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +34 -34
- package/dist/core/agents/state/live-coordination-view.d.ts +6 -8
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +16 -67
- package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
- package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
- package/dist/core/agents/state/live-coordination-writer.js +92 -0
- package/dist/core/agents/state/names.d.ts +9 -1
- package/dist/core/agents/state/names.d.ts.map +1 -1
- package/dist/core/agents/state/names.js +190 -182
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +23 -5
- package/dist/core/artifacts/constants.d.ts +5 -0
- package/dist/core/artifacts/constants.d.ts.map +1 -0
- package/dist/core/artifacts/constants.js +4 -0
- package/dist/core/artifacts/index.d.ts +24 -3
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +96 -8
- package/dist/core/config.d.ts +62 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +98 -4
- package/dist/core/conversations/archive.d.ts +49 -0
- package/dist/core/conversations/archive.d.ts.map +1 -0
- package/dist/core/conversations/archive.js +136 -0
- package/dist/core/conversations/catalog.d.ts +10 -0
- package/dist/core/conversations/catalog.d.ts.map +1 -0
- package/dist/core/conversations/catalog.js +72 -0
- package/dist/core/conversations/context-pack.d.ts +6 -0
- package/dist/core/conversations/context-pack.d.ts.map +1 -0
- package/dist/core/conversations/context-pack.js +60 -0
- package/dist/core/conversations/contract.d.ts +155 -0
- package/dist/core/conversations/contract.d.ts.map +1 -0
- package/dist/core/conversations/contract.js +1 -0
- package/dist/core/conversations/evaluation.d.ts +16 -0
- package/dist/core/conversations/evaluation.d.ts.map +1 -0
- package/dist/core/conversations/evaluation.js +9 -0
- package/dist/core/conversations/index.d.ts +10 -0
- package/dist/core/conversations/index.d.ts.map +1 -0
- package/dist/core/conversations/index.js +9 -0
- package/dist/core/conversations/lifecycle.d.ts +28 -0
- package/dist/core/conversations/lifecycle.d.ts.map +1 -0
- package/dist/core/conversations/lifecycle.js +29 -0
- package/dist/core/conversations/normalize.d.ts +14 -0
- package/dist/core/conversations/normalize.d.ts.map +1 -0
- package/dist/core/conversations/normalize.js +82 -0
- package/dist/core/conversations/query.d.ts +8 -0
- package/dist/core/conversations/query.d.ts.map +1 -0
- package/dist/core/conversations/query.js +280 -0
- package/dist/core/conversations/search-index.d.ts +9 -0
- package/dist/core/conversations/search-index.d.ts.map +1 -0
- package/dist/core/conversations/search-index.js +29 -0
- package/dist/core/events/legacy-storage/canary.d.ts +18 -0
- package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/canary.js +150 -0
- package/dist/core/events/legacy-storage/fence.d.ts +15 -0
- package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/fence.js +115 -0
- package/dist/core/events/legacy-storage/index.d.ts +6 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/index.js +5 -0
- package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
- package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/inventory.js +40 -0
- package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
- package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/manifest.js +108 -0
- package/dist/core/events/legacy-storage/reader.d.ts +15 -0
- package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/reader.js +154 -0
- package/dist/core/events/v3/authority-outbox.d.ts +7 -2
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
- package/dist/core/events/v3/authority-outbox.js +16 -3
- package/dist/core/events/v3/base-contract.d.ts +851 -16
- package/dist/core/events/v3/base-contract.d.ts.map +1 -1
- package/dist/core/events/v3/base-contract.js +50 -7
- package/dist/core/events/v3/bootstrap.d.ts +39 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +167 -3
- package/dist/core/events/v3/capabilities.d.ts +11 -0
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +26 -3
- package/dist/core/events/v3/control-witness.d.ts +44 -0
- package/dist/core/events/v3/control-witness.d.ts.map +1 -0
- package/dist/core/events/v3/control-witness.js +233 -0
- package/dist/core/events/v3/control-writer.d.ts +4 -0
- package/dist/core/events/v3/control-writer.d.ts.map +1 -0
- package/dist/core/events/v3/control-writer.js +16 -0
- package/dist/core/events/v3/control.d.ts +8 -2
- package/dist/core/events/v3/control.d.ts.map +1 -1
- package/dist/core/events/v3/control.js +46 -18
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
- package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
- package/dist/core/events/v3/coordination-view.js +16 -1
- package/dist/core/events/v3/generated.d.ts +1 -1
- package/dist/core/events/v3/generated.js +1 -1
- package/dist/core/events/v3/index.d.ts +8 -5
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +7 -4
- package/dist/core/events/v3/latency.d.ts +31 -1
- package/dist/core/events/v3/latency.d.ts.map +1 -1
- package/dist/core/events/v3/latency.js +127 -3
- package/dist/core/events/v3/live-route-observer.d.ts +31 -0
- package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
- package/dist/core/events/v3/live-route-observer.js +58 -0
- package/dist/core/events/v3/live-routing.d.ts +42 -20
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +153 -41
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/command-recorder.js +10 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +90 -13
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
- package/dist/core/events/v3/producers/hook-base.d.ts +17 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +83 -2
- package/dist/core/events/v3/producers/intake.d.ts +13 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +36 -2
- package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
- package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
- package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
- package/dist/core/events/v3/producers/recorder.d.ts +117 -1
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +992 -27
- package/dist/core/events/v3/reader.d.ts +51 -0
- package/dist/core/events/v3/reader.d.ts.map +1 -1
- package/dist/core/events/v3/reader.js +181 -1
- package/dist/core/events/v3/rotation-config.d.ts +9 -0
- package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
- package/dist/core/events/v3/rotation-config.js +91 -0
- package/dist/core/events/v3/runtime-build.d.ts +11 -0
- package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-build.js +39 -0
- package/dist/core/events/v3/runtime-identity.d.ts +5 -0
- package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-identity.js +18 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +52 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
- package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
- package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/classify.js +149 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/eligibility.js +35 -0
- package/dist/core/events/v3/support-storage/index.d.ts +10 -0
- package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/index.js +9 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/inventory.js +94 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/maintenance.js +352 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/recovery.js +22 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +21 -6
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
- package/dist/core/events/v3/turn-telemetry.js +32 -2
- package/dist/core/events/v3/writer.d.ts +13 -1
- package/dist/core/events/v3/writer.d.ts.map +1 -1
- package/dist/core/events/v3/writer.js +126 -12
- package/dist/core/governor/plan-read.d.ts.map +1 -1
- package/dist/core/governor/plan-read.js +5 -21
- package/dist/core/governor/planning.js +6 -8
- package/dist/core/governor/service-read.d.ts +12 -0
- package/dist/core/governor/service-read.d.ts.map +1 -1
- package/dist/core/governor/service-read.js +266 -2
- package/dist/core/governor/service.d.ts +1 -0
- package/dist/core/governor/service.d.ts.map +1 -1
- package/dist/core/governor/service.js +53 -18
- package/dist/core/guard/evidence-v3.d.ts.map +1 -1
- package/dist/core/guard/evidence-v3.js +2 -0
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +1 -0
- package/dist/core/hooks/adapter/output.d.ts +4 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +13 -5
- package/dist/core/hooks/adapter/parse.d.ts +3 -0
- package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.js +14 -0
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts +142 -0
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
- package/dist/core/hooks/adapter/runtime-telemetry.js +869 -0
- package/dist/core/hooks/cli.js +318 -61
- package/dist/core/hooks/effects/image-capture.d.ts +1 -1
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +4 -2
- package/dist/core/hooks/remediation-cap.d.ts +39 -0
- package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
- package/dist/core/hooks/remediation-cap.js +63 -0
- package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
- package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
- package/dist/core/hooks/resolve/coord-root.js +92 -11
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +5 -0
- package/dist/core/hooks/resolve/transcript.d.ts +33 -9
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +33 -10
- package/dist/core/inbox/contract.d.ts +64 -0
- package/dist/core/inbox/contract.d.ts.map +1 -0
- package/dist/core/inbox/contract.js +13 -0
- package/dist/core/inbox/index.d.ts +5 -0
- package/dist/core/inbox/index.d.ts.map +1 -0
- package/dist/core/inbox/index.js +4 -0
- package/dist/core/inbox/lifecycle.d.ts +22 -0
- package/dist/core/inbox/lifecycle.d.ts.map +1 -0
- package/dist/core/inbox/lifecycle.js +41 -0
- package/dist/core/inbox/service.d.ts +36 -0
- package/dist/core/inbox/service.d.ts.map +1 -0
- package/dist/core/inbox/service.js +210 -0
- package/dist/core/inbox/watcher.d.ts +7 -0
- package/dist/core/inbox/watcher.d.ts.map +1 -0
- package/dist/core/inbox/watcher.js +26 -0
- package/dist/core/presence/codec-digest.d.ts.map +1 -1
- package/dist/core/presence/codec-digest.js +14 -3
- package/dist/core/presence/relay-client.d.ts +1 -0
- package/dist/core/presence/relay-client.d.ts.map +1 -1
- package/dist/core/presence/relay-client.js +52 -8
- package/dist/core/semantic/adapters.d.ts +37 -0
- package/dist/core/semantic/adapters.d.ts.map +1 -0
- package/dist/core/semantic/adapters.js +360 -0
- package/dist/core/semantic/contract.d.ts +1072 -0
- package/dist/core/semantic/contract.d.ts.map +1 -0
- package/dist/core/semantic/contract.js +331 -0
- package/dist/core/semantic/evidence.d.ts +11 -0
- package/dist/core/semantic/evidence.d.ts.map +1 -0
- package/dist/core/semantic/evidence.js +262 -0
- package/dist/core/semantic/index.d.ts +14 -0
- package/dist/core/semantic/index.d.ts.map +1 -0
- package/dist/core/semantic/index.js +13 -0
- package/dist/core/semantic/once.d.ts +38 -0
- package/dist/core/semantic/once.d.ts.map +1 -0
- package/dist/core/semantic/once.js +364 -0
- package/dist/core/semantic/prompt.d.ts +12 -0
- package/dist/core/semantic/prompt.d.ts.map +1 -0
- package/dist/core/semantic/prompt.js +83 -0
- package/dist/core/semantic/review.d.ts +144 -0
- package/dist/core/semantic/review.d.ts.map +1 -0
- package/dist/core/semantic/review.js +544 -0
- package/dist/core/semantic/routes.d.ts +10 -0
- package/dist/core/semantic/routes.d.ts.map +1 -0
- package/dist/core/semantic/routes.js +21 -0
- package/dist/core/semantic/scheduler.d.ts +27 -0
- package/dist/core/semantic/scheduler.d.ts.map +1 -0
- package/dist/core/semantic/scheduler.js +91 -0
- package/dist/core/semantic/service-status.d.ts +51 -0
- package/dist/core/semantic/service-status.d.ts.map +1 -0
- package/dist/core/semantic/service-status.js +140 -0
- package/dist/core/semantic/service.d.ts +52 -0
- package/dist/core/semantic/service.d.ts.map +1 -0
- package/dist/core/semantic/service.js +559 -0
- package/dist/core/semantic/soak.d.ts +75 -0
- package/dist/core/semantic/soak.d.ts.map +1 -0
- package/dist/core/semantic/soak.js +476 -0
- package/dist/core/semantic/storage.d.ts +81 -0
- package/dist/core/semantic/storage.d.ts.map +1 -0
- package/dist/core/semantic/storage.js +180 -0
- package/dist/core/semantic/usage.d.ts +43 -0
- package/dist/core/semantic/usage.d.ts.map +1 -0
- package/dist/core/semantic/usage.js +193 -0
- package/dist/core/semantic/validate.d.ts +18 -0
- package/dist/core/semantic/validate.d.ts.map +1 -0
- package/dist/core/semantic/validate.js +207 -0
- package/dist/core/storage/buffer.d.ts +28 -0
- package/dist/core/storage/buffer.d.ts.map +1 -0
- package/dist/core/storage/buffer.js +101 -0
- package/dist/core/storage/builtins.d.ts +3 -0
- package/dist/core/storage/builtins.d.ts.map +1 -0
- package/dist/core/storage/builtins.js +683 -0
- package/dist/core/storage/catalog.d.ts +19 -0
- package/dist/core/storage/catalog.d.ts.map +1 -0
- package/dist/core/storage/catalog.js +365 -0
- package/dist/core/storage/config.d.ts +16 -0
- package/dist/core/storage/config.d.ts.map +1 -0
- package/dist/core/storage/config.js +311 -0
- package/dist/core/storage/contract.d.ts +275 -0
- package/dist/core/storage/contract.d.ts.map +1 -0
- package/dist/core/storage/contract.js +3 -0
- package/dist/core/storage/durable-history.d.ts +36 -0
- package/dist/core/storage/durable-history.d.ts.map +1 -0
- package/dist/core/storage/durable-history.js +606 -0
- package/dist/core/storage/health.d.ts +4 -0
- package/dist/core/storage/health.d.ts.map +1 -0
- package/dist/core/storage/health.js +65 -0
- package/dist/core/storage/index.d.ts +16 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +15 -0
- package/dist/core/storage/inventory.d.ts +25 -0
- package/dist/core/storage/inventory.d.ts.map +1 -0
- package/dist/core/storage/inventory.js +666 -0
- package/dist/core/storage/jsonl.d.ts +52 -0
- package/dist/core/storage/jsonl.d.ts.map +1 -0
- package/dist/core/storage/jsonl.js +156 -0
- package/dist/core/storage/log-retention.d.ts +52 -0
- package/dist/core/storage/log-retention.d.ts.map +1 -0
- package/dist/core/storage/log-retention.js +419 -0
- package/dist/core/storage/logger.d.ts +82 -0
- package/dist/core/storage/logger.d.ts.map +1 -0
- package/dist/core/storage/logger.js +411 -0
- package/dist/core/storage/maintenance-providers.d.ts +26 -0
- package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
- package/dist/core/storage/maintenance-providers.js +141 -0
- package/dist/core/storage/maintenance.d.ts +125 -0
- package/dist/core/storage/maintenance.d.ts.map +1 -0
- package/dist/core/storage/maintenance.js +609 -0
- package/dist/core/storage/metrics.d.ts +60 -0
- package/dist/core/storage/metrics.d.ts.map +1 -0
- package/dist/core/storage/metrics.js +134 -0
- package/dist/core/storage/policy.d.ts +7 -0
- package/dist/core/storage/policy.d.ts.map +1 -0
- package/dist/core/storage/policy.js +110 -0
- package/dist/core/storage/process-log.d.ts +38 -0
- package/dist/core/storage/process-log.d.ts.map +1 -0
- package/dist/core/storage/process-log.js +165 -0
- package/dist/core/storage/query.d.ts +34 -0
- package/dist/core/storage/query.d.ts.map +1 -0
- package/dist/core/storage/query.js +295 -0
- package/dist/core/storage/receipts.d.ts +23 -0
- package/dist/core/storage/receipts.d.ts.map +1 -0
- package/dist/core/storage/receipts.js +117 -0
- package/dist/core/storage/segments.d.ts +84 -0
- package/dist/core/storage/segments.d.ts.map +1 -0
- package/dist/core/storage/segments.js +542 -0
- package/dist/core/storage/sink-graph.d.ts +65 -0
- package/dist/core/storage/sink-graph.d.ts.map +1 -0
- package/dist/core/storage/sink-graph.js +213 -0
- package/dist/core/storage/storm-control.d.ts +23 -0
- package/dist/core/storage/storm-control.d.ts.map +1 -0
- package/dist/core/storage/storm-control.js +59 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +10 -14
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lazy-commands.d.ts +26 -0
- package/dist/lazy-commands.d.ts.map +1 -0
- package/dist/lazy-commands.js +210 -0
- package/dist/lib/browser/client.d.ts +11 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +13 -0
- package/dist/lib/browser/index.d.ts +1 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/standalone-html.d.ts +25 -0
- package/dist/lib/browser/standalone-html.d.ts.map +1 -0
- package/dist/lib/browser/standalone-html.js +284 -0
- package/dist/lib/docs-lint.d.ts +2 -0
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +45 -80
- package/dist/lib/docs-metadata-audit.d.ts +3 -0
- package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
- package/dist/lib/docs-metadata-audit.js +13 -23
- package/dist/lib/docs-metadata-sync.d.ts +1 -0
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
- package/dist/lib/docs-metadata-sync.js +28 -10
- package/dist/lib/docs-repository-view.d.ts +22 -0
- package/dist/lib/docs-repository-view.d.ts.map +1 -0
- package/dist/lib/docs-repository-view.js +185 -0
- package/dist/lib/http/client.d.ts +11 -5
- package/dist/lib/http/client.d.ts.map +1 -1
- package/dist/lib/http/client.js +22 -4
- package/dist/lib/http/index.d.ts +1 -1
- package/dist/lib/http/index.d.ts.map +1 -1
- package/dist/lib/http/index.js +1 -1
- package/dist/lib/indexer-exclusions.d.ts +27 -0
- package/dist/lib/indexer-exclusions.d.ts.map +1 -0
- package/dist/lib/indexer-exclusions.js +176 -0
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +1 -0
- package/dist/lib/instructions/templates.d.ts +2 -0
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +149 -4
- package/dist/lib/local-file-url.d.ts +9 -0
- package/dist/lib/local-file-url.d.ts.map +1 -0
- package/dist/lib/local-file-url.js +20 -0
- package/dist/lib/web-performance.d.ts +118 -0
- package/dist/lib/web-performance.d.ts.map +1 -0
- package/dist/lib/web-performance.js +192 -0
- package/package.json +34 -2
- package/schemas/config.schema.json +58 -0
- package/schemas/event-v3.schema.json +3073 -581
- package/src/commander.ts +462 -93
- package/src/commands/agents.ts +617 -355
- package/src/commands/backup.ts +18 -14
- package/src/commands/browse-session.ts +12 -0
- package/src/commands/browse.ts +31 -9
- package/src/commands/conversations.ts +279 -0
- package/src/commands/decision.ts +8 -2
- package/src/commands/deinit.ts +6 -0
- package/src/commands/docs.ts +25 -6
- package/src/commands/doctor.ts +75 -9
- package/src/commands/events.ts +21 -1
- package/src/commands/fetch.ts +7 -6
- package/src/commands/files.ts +143 -0
- package/src/commands/governor.ts +13 -12
- package/src/commands/inbox.ts +61 -0
- package/src/commands/init.ts +78 -16
- package/src/commands/ledger-v3.ts +421 -1
- package/src/commands/logs.ts +224 -0
- package/src/commands/messages.ts +61 -0
- package/src/commands/outline.ts +6 -2
- package/src/commands/presence.ts +7 -2
- package/src/commands/read.ts +6 -2
- package/src/commands/semantic.ts +244 -0
- package/src/commands/storage.ts +310 -0
- package/src/commands/tunnel.ts +66 -52
- package/src/commands/web.ts +92 -7
- package/src/commands/work.ts +3 -3
- package/src/commands/workflow.ts +13 -13
- package/src/core/agents/canonical-emit.ts +15 -0
- package/src/core/agents/claim-path.ts +23 -0
- package/src/core/agents/cli.ts +259 -53
- package/src/core/agents/coord-client.ts +92 -8
- package/src/core/agents/live-authority-v3.ts +342 -14
- package/src/core/agents/live-lifecycle-v3.ts +14 -4
- package/src/core/agents/live-observation-v3.ts +13 -3
- package/src/core/agents/render/prompt-context.ts +40 -16
- package/src/core/agents/rules/stop-hook.ts +129 -25
- package/src/core/agents/rules/verdict.ts +1 -0
- package/src/core/agents/session-events.ts +4 -0
- package/src/core/agents/session-finalization-state-v3.ts +1 -1
- package/src/core/agents/session-finalizer-v3.ts +4 -1
- package/src/core/agents/session-name-display.ts +9 -1
- package/src/core/agents/state/activity-log.ts +7 -2
- package/src/core/agents/state/heartbeat-reader.ts +69 -0
- package/src/core/agents/state/heartbeat-writer.ts +47 -84
- package/src/core/agents/state/live-coordination-view.ts +17 -81
- package/src/core/agents/state/live-coordination-writer.ts +141 -0
- package/src/core/agents/state/names.ts +190 -182
- package/src/core/agents/state/stale-sweep.ts +25 -5
- package/src/core/artifacts/constants.ts +4 -0
- package/src/core/artifacts/index.ts +113 -8
- package/src/core/config.ts +126 -5
- package/src/core/conversations/archive.ts +237 -0
- package/src/core/conversations/catalog.ts +79 -0
- package/src/core/conversations/context-pack.ts +72 -0
- package/src/core/conversations/contract.ts +178 -0
- package/src/core/conversations/evaluation.ts +30 -0
- package/src/core/conversations/index.ts +9 -0
- package/src/core/conversations/lifecycle.ts +63 -0
- package/src/core/conversations/normalize.ts +105 -0
- package/src/core/conversations/query.ts +318 -0
- package/src/core/conversations/search-index.ts +48 -0
- package/src/core/events/legacy-storage/canary.ts +177 -0
- package/src/core/events/legacy-storage/fence.ts +129 -0
- package/src/core/events/legacy-storage/index.ts +5 -0
- package/src/core/events/legacy-storage/inventory.ts +51 -0
- package/src/core/events/legacy-storage/manifest.ts +136 -0
- package/src/core/events/legacy-storage/reader.ts +178 -0
- package/src/core/events/v3/authority-outbox.ts +22 -1
- package/src/core/events/v3/base-contract.ts +56 -7
- package/src/core/events/v3/bootstrap.ts +195 -2
- package/src/core/events/v3/capabilities.ts +37 -3
- package/src/core/events/v3/control-witness.ts +339 -0
- package/src/core/events/v3/control-writer.ts +16 -0
- package/src/core/events/v3/control.ts +54 -18
- package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
- package/src/core/events/v3/coordination-view.ts +17 -1
- package/src/core/events/v3/generated.ts +1 -1
- package/src/core/events/v3/index.ts +26 -2
- package/src/core/events/v3/latency.ts +213 -2
- package/src/core/events/v3/live-route-observer.ts +80 -0
- package/src/core/events/v3/live-routing.ts +182 -45
- package/src/core/events/v3/producers/command-recorder.ts +10 -1
- package/src/core/events/v3/producers/coordination-recorder.ts +112 -15
- package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
- package/src/core/events/v3/producers/hook-base.ts +116 -2
- package/src/core/events/v3/producers/intake.ts +48 -2
- package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
- package/src/core/events/v3/producers/recorder.ts +1403 -30
- package/src/core/events/v3/reader.ts +243 -2
- package/src/core/events/v3/rotation-config.ts +98 -0
- package/src/core/events/v3/runtime-build.ts +41 -0
- package/src/core/events/v3/runtime-identity.ts +16 -0
- package/src/core/events/v3/runtime-telemetry-capabilities.ts +143 -0
- package/src/core/events/v3/support-storage/classify.ts +209 -0
- package/src/core/events/v3/support-storage/eligibility.ts +58 -0
- package/src/core/events/v3/support-storage/index.ts +9 -0
- package/src/core/events/v3/support-storage/inventory.ts +135 -0
- package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
- package/src/core/events/v3/support-storage/maintenance.ts +501 -0
- package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
- package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
- package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
- package/src/core/events/v3/support-storage/recovery.ts +43 -0
- package/src/core/events/v3/turn-telemetry.ts +66 -5
- package/src/core/events/v3/writer.ts +168 -16
- package/src/core/governor/plan-read.ts +5 -18
- package/src/core/governor/planning.ts +5 -8
- package/src/core/governor/service-read.ts +320 -2
- package/src/core/governor/service.ts +49 -22
- package/src/core/guard/evidence-v3.ts +1 -0
- package/src/core/hooks/adapter/events.ts +1 -0
- package/src/core/hooks/adapter/output.ts +12 -5
- package/src/core/hooks/adapter/parse.ts +16 -0
- package/src/core/hooks/adapter/runtime-telemetry.ts +1200 -0
- package/src/core/hooks/cli.ts +342 -64
- package/src/core/hooks/effects/image-capture.ts +4 -1
- package/src/core/hooks/remediation-cap.ts +83 -0
- package/src/core/hooks/resolve/coord-root.ts +91 -11
- package/src/core/hooks/resolve/owner.ts +4 -0
- package/src/core/hooks/resolve/transcript.ts +55 -11
- package/src/core/inbox/contract.ts +81 -0
- package/src/core/inbox/index.ts +4 -0
- package/src/core/inbox/lifecycle.ts +104 -0
- package/src/core/inbox/service.ts +305 -0
- package/src/core/inbox/watcher.ts +36 -0
- package/src/core/presence/codec-digest.ts +15 -9
- package/src/core/presence/relay-client.ts +55 -7
- package/src/core/semantic/adapters.ts +452 -0
- package/src/core/semantic/contract.ts +430 -0
- package/src/core/semantic/evidence.ts +336 -0
- package/src/core/semantic/index.ts +201 -0
- package/src/core/semantic/once.ts +496 -0
- package/src/core/semantic/prompt.ts +96 -0
- package/src/core/semantic/review.ts +803 -0
- package/src/core/semantic/routes.ts +30 -0
- package/src/core/semantic/scheduler.ts +151 -0
- package/src/core/semantic/service-status.ts +212 -0
- package/src/core/semantic/service.ts +681 -0
- package/src/core/semantic/soak.ts +638 -0
- package/src/core/semantic/storage.ts +300 -0
- package/src/core/semantic/usage.ts +272 -0
- package/src/core/semantic/validate.ts +243 -0
- package/src/core/storage/buffer.ts +124 -0
- package/src/core/storage/builtins.ts +916 -0
- package/src/core/storage/catalog.ts +467 -0
- package/src/core/storage/config.ts +423 -0
- package/src/core/storage/contract.ts +342 -0
- package/src/core/storage/durable-history.ts +738 -0
- package/src/core/storage/health.ts +76 -0
- package/src/core/storage/index.ts +15 -0
- package/src/core/storage/inventory.ts +859 -0
- package/src/core/storage/jsonl.ts +213 -0
- package/src/core/storage/log-retention.ts +555 -0
- package/src/core/storage/logger.ts +546 -0
- package/src/core/storage/maintenance-providers.ts +200 -0
- package/src/core/storage/maintenance.ts +929 -0
- package/src/core/storage/metrics.ts +199 -0
- package/src/core/storage/policy.ts +141 -0
- package/src/core/storage/process-log.ts +203 -0
- package/src/core/storage/query.ts +360 -0
- package/src/core/storage/receipts.ts +162 -0
- package/src/core/storage/segments.ts +721 -0
- package/src/core/storage/sink-graph.ts +343 -0
- package/src/core/storage/storm-control.ts +91 -0
- package/src/core/work/state.ts +12 -21
- package/src/core/workflow/live-session-v3.ts +2 -4
- package/src/index.ts +2 -0
- package/src/lazy-commands.ts +294 -0
- package/src/lib/browser/client.ts +21 -0
- package/src/lib/browser/index.ts +4 -0
- package/src/lib/browser/standalone-html.ts +312 -0
- package/src/lib/docs-lint.ts +58 -77
- package/src/lib/docs-metadata-audit.ts +26 -21
- package/src/lib/docs-metadata-sync.ts +32 -9
- package/src/lib/docs-repository-view.ts +220 -0
- package/src/lib/http/client.ts +44 -8
- package/src/lib/http/index.ts +6 -1
- package/src/lib/indexer-exclusions.ts +173 -0
- package/src/lib/instructions/apply.ts +1 -0
- package/src/lib/instructions/templates.ts +154 -4
- package/src/lib/local-file-url.ts +31 -0
- package/src/lib/web-performance.ts +335 -0
package/dist/core/agents/cli.js
CHANGED
|
@@ -6,10 +6,29 @@
|
|
|
6
6
|
* Phase 2 replaces the no-op branches with real state projection + CLI
|
|
7
7
|
* handlers; Phase 4 flips the default so `harn agents …` shims through here.
|
|
8
8
|
*/
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
9
10
|
import { appendFileSync, existsSync } from "node:fs";
|
|
10
11
|
import { appendFile, mkdir } from "node:fs/promises";
|
|
12
|
+
import { hostname } from "node:os";
|
|
11
13
|
import { dirname, join, resolve } from "node:path";
|
|
12
14
|
import { coordEnv } from "../../lib/env.js";
|
|
15
|
+
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
|
|
16
|
+
import { acquireNoClobberLease } from "../workflow/workspaces/leases.js";
|
|
17
|
+
function sharedDiagnostic(root, event, fields, error) {
|
|
18
|
+
if (coordEnv("SHARED_LOGS") === "0")
|
|
19
|
+
return false;
|
|
20
|
+
try {
|
|
21
|
+
const logger = processLogger(root, "agent-coord");
|
|
22
|
+
if (error === undefined)
|
|
23
|
+
logger.debug(event, legacyLogFields(fields));
|
|
24
|
+
else
|
|
25
|
+
logger.error(event, legacyLogFields(fields), error);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
13
32
|
function findCoordRoot(start) {
|
|
14
33
|
// HARNERY_COORD_ROOT_OVERRIDE: the bash side's test-mode escape hatch. agent-coord
|
|
15
34
|
// honors the same env so sandboxed test runs don't get derailed when cwd
|
|
@@ -39,8 +58,6 @@ async function readStdin() {
|
|
|
39
58
|
return Buffer.concat(chunks).toString("utf8");
|
|
40
59
|
}
|
|
41
60
|
async function logNoop(root, subcommand, argv) {
|
|
42
|
-
const logPath = join(root, ".harnery", "debug", "agent-coord.ndjson");
|
|
43
|
-
await mkdir(dirname(logPath), { recursive: true });
|
|
44
61
|
const entry = {
|
|
45
62
|
ts: new Date().toISOString(),
|
|
46
63
|
note: "called, no-op",
|
|
@@ -50,6 +67,10 @@ async function logNoop(root, subcommand, argv) {
|
|
|
50
67
|
pid: process.pid,
|
|
51
68
|
ppid: process.ppid,
|
|
52
69
|
};
|
|
70
|
+
if (sharedDiagnostic(root, "agent_coord.noop", entry))
|
|
71
|
+
return;
|
|
72
|
+
const logPath = join(root, ".harnery", "debug", "agent-coord.ndjson");
|
|
73
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
53
74
|
await appendFile(logPath, `${JSON.stringify(entry)}\n`, "utf8");
|
|
54
75
|
}
|
|
55
76
|
/**
|
|
@@ -62,8 +83,6 @@ async function logNoop(root, subcommand, argv) {
|
|
|
62
83
|
*/
|
|
63
84
|
async function handleVerdict(root) {
|
|
64
85
|
const raw = await readStdin();
|
|
65
|
-
const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
|
|
66
|
-
await mkdir(dirname(logPath), { recursive: true });
|
|
67
86
|
let parsed = {};
|
|
68
87
|
let parseErr = null;
|
|
69
88
|
try {
|
|
@@ -103,11 +122,12 @@ async function handleVerdict(root) {
|
|
|
103
122
|
reason: `no evaluator for rule=${parsed.rule ?? "<missing>"} (fail-open)`,
|
|
104
123
|
};
|
|
105
124
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
125
|
+
const diagnostic = { request_preview: raw.slice(0, 500), verdict };
|
|
126
|
+
if (!sharedDiagnostic(root, "agent_coord.verdict", diagnostic)) {
|
|
127
|
+
const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
|
|
128
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
129
|
+
await appendFile(logPath, `${JSON.stringify({ ts: new Date().toISOString(), ...diagnostic })}\n`, "utf8");
|
|
130
|
+
}
|
|
111
131
|
process.stdout.write(`${JSON.stringify(verdict)}\n`);
|
|
112
132
|
return 0;
|
|
113
133
|
}
|
|
@@ -139,6 +159,57 @@ function adapterFromPlatform(platform) {
|
|
|
139
159
|
return "codex";
|
|
140
160
|
return "claude-code";
|
|
141
161
|
}
|
|
162
|
+
const coordinationRetryCell = new Int32Array(new SharedArrayBuffer(4));
|
|
163
|
+
const COORDINATION_RETRY_ATTEMPTS = 240;
|
|
164
|
+
const COORDINATION_RETRY_DELAY_MS = 25;
|
|
165
|
+
function isRetryableCoordinationContention(error) {
|
|
166
|
+
return (error instanceof Error &&
|
|
167
|
+
error.message.includes("lease event-v3-coordination-producer is held by a live or unexpired owner"));
|
|
168
|
+
}
|
|
169
|
+
function waitForCoordinationLease() {
|
|
170
|
+
Atomics.wait(coordinationRetryCell, 0, 0, COORDINATION_RETRY_DELAY_MS);
|
|
171
|
+
}
|
|
172
|
+
function pidIsAlive(pid) {
|
|
173
|
+
if (!Number.isSafeInteger(pid) || pid < 1)
|
|
174
|
+
return false;
|
|
175
|
+
try {
|
|
176
|
+
process.kill(pid, 0);
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
return error.code !== "ESRCH";
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// The V3 producer lease begins after its caller has materialized and read the
|
|
184
|
+
// disposable heartbeat. Serialize that larger registration boundary per owner
|
|
185
|
+
// so overlapping first declarations cannot both derive state from an unnamed,
|
|
186
|
+
// missing heartbeat and then strand a conflicting authority transaction.
|
|
187
|
+
function acquireSetTaskLease(root, owner) {
|
|
188
|
+
const leasePath = join(root, ".harnery", "active", ".set-task-leases", `${owner}.lease`);
|
|
189
|
+
const authoritySha256 = createHash("sha256")
|
|
190
|
+
.update(resolve(root))
|
|
191
|
+
.update("\0")
|
|
192
|
+
.update(owner)
|
|
193
|
+
.digest("hex");
|
|
194
|
+
for (let attempt = 0;; attempt += 1) {
|
|
195
|
+
try {
|
|
196
|
+
return acquireNoClobberLease({
|
|
197
|
+
path: leasePath,
|
|
198
|
+
scope: "agent-set-task",
|
|
199
|
+
authoritySha256,
|
|
200
|
+
staleAfterMs: 5_000,
|
|
201
|
+
validateStaleOwner: (leaseOwner) => leaseOwner.host === hostname() && !pidIsAlive(leaseOwner.pid),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
const busy = error instanceof Error &&
|
|
206
|
+
error.message.includes("lease agent-set-task is held by a live or unexpired owner");
|
|
207
|
+
if (!busy || attempt >= COORDINATION_RETRY_ATTEMPTS - 1)
|
|
208
|
+
throw error;
|
|
209
|
+
waitForCoordinationLease();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
142
213
|
async function handleStateAction(root, action, rest) {
|
|
143
214
|
const writer = await import("./state/heartbeat-writer.js");
|
|
144
215
|
const [owner, ...args] = rest;
|
|
@@ -149,31 +220,79 @@ async function handleStateAction(root, action, rest) {
|
|
|
149
220
|
switch (action) {
|
|
150
221
|
case "set-task": {
|
|
151
222
|
const task = args.join(" ");
|
|
152
|
-
|
|
153
|
-
let hb;
|
|
223
|
+
let setTaskLease;
|
|
154
224
|
try {
|
|
155
|
-
|
|
156
|
-
recordLiveTaskChangeV3({
|
|
157
|
-
coordRoot: root,
|
|
158
|
-
owner,
|
|
159
|
-
nativeSessionId: before?.session_id ?? owner,
|
|
160
|
-
adapter: adapterFromPlatform(before?.platform),
|
|
161
|
-
task,
|
|
162
|
-
});
|
|
163
|
-
hb = writer.readHeartbeat(root, owner);
|
|
225
|
+
setTaskLease = acquireSetTaskLease(root, owner);
|
|
164
226
|
}
|
|
165
227
|
catch (error) {
|
|
166
|
-
process.stderr.write(`agent-coord set-task:
|
|
228
|
+
process.stderr.write(`agent-coord set-task: registration lease refused (${error instanceof Error ? error.message : String(error)})\n`);
|
|
167
229
|
return 1;
|
|
168
230
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
231
|
+
try {
|
|
232
|
+
let before = writer.readHeartbeat(root, owner);
|
|
233
|
+
const humanFacing = before?.kind !== "subagent" && before?.kind !== "transient" && !before?.workflow_run_id;
|
|
234
|
+
// A mid-flight-onboarded generation can exist before SessionStart's
|
|
235
|
+
// assign-name step ran. Repair that private display metadata before the
|
|
236
|
+
// first non-empty task mints its operator-facing title. assignName is the
|
|
237
|
+
// same durable, idempotent pool path used by normal SessionStart.
|
|
238
|
+
if (task && before && humanFacing && !before.name?.trim()) {
|
|
239
|
+
const { assignName } = await import("./state/names.js");
|
|
240
|
+
const name = assignName(root, owner, "session");
|
|
241
|
+
before = writer.setAssignedNameCache(root, owner, name, "session");
|
|
242
|
+
if (!before) {
|
|
243
|
+
process.stderr.write(`agent-coord set-task: could not restore assigned name for ${owner}\n`);
|
|
244
|
+
return 1;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
let hb;
|
|
248
|
+
try {
|
|
249
|
+
const { recordLiveTaskChangeV3 } = await import("./live-authority-v3.js");
|
|
250
|
+
for (let attempt = 0;; attempt += 1) {
|
|
251
|
+
try {
|
|
252
|
+
recordLiveTaskChangeV3({
|
|
253
|
+
coordRoot: root,
|
|
254
|
+
owner,
|
|
255
|
+
nativeSessionId: before?.session_id ?? owner,
|
|
256
|
+
adapter: adapterFromPlatform(before?.platform),
|
|
257
|
+
task,
|
|
258
|
+
});
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
if (!isRetryableCoordinationContention(error) ||
|
|
263
|
+
attempt >= COORDINATION_RETRY_ATTEMPTS - 1) {
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
waitForCoordinationLease();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
hb = writer.readHeartbeat(root, owner);
|
|
270
|
+
const currentHumanFacing = hb?.kind !== "subagent" && hb?.kind !== "transient" && !hb?.workflow_run_id;
|
|
271
|
+
if (task &&
|
|
272
|
+
hb &&
|
|
273
|
+
currentHumanFacing &&
|
|
274
|
+
(!hb.name?.trim() || /^Agent unknown - /.test(hb.suggested_session_name ?? ""))) {
|
|
275
|
+
const { assignName } = await import("./state/names.js");
|
|
276
|
+
const name = hb.name?.trim() || assignName(root, owner, "session");
|
|
277
|
+
hb = writer.setAssignedNameCache(root, owner, name, "session");
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
process.stderr.write(`agent-coord set-task: V3 authority refused (${error instanceof Error ? error.message : String(error)})\n`);
|
|
282
|
+
return 1;
|
|
283
|
+
}
|
|
284
|
+
if (!hb) {
|
|
285
|
+
// Name the RESOLVED root: when a nested .harnery/ shadows the real
|
|
286
|
+
// coordination home, the full path is what makes that diagnosable.
|
|
287
|
+
process.stderr.write(`agent-coord set-task: no heartbeat at ${root}/.harnery/active/${owner}.json\n`);
|
|
288
|
+
return 1;
|
|
289
|
+
}
|
|
290
|
+
process.stdout.write(`${JSON.stringify({ instance_id: owner, task: hb.task ?? null, cleared: !task })}\n`);
|
|
291
|
+
return 0;
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
setTaskLease.release();
|
|
174
295
|
}
|
|
175
|
-
process.stdout.write(`${JSON.stringify({ instance_id: owner, task: hb.task ?? null, cleared: !task })}\n`);
|
|
176
|
-
return 0;
|
|
177
296
|
}
|
|
178
297
|
case "release-claim": {
|
|
179
298
|
const path = args[0];
|
|
@@ -250,8 +369,8 @@ async function handleStateAction(root, action, rest) {
|
|
|
250
369
|
adapter: adapterFromPlatform(adapter),
|
|
251
370
|
});
|
|
252
371
|
}
|
|
253
|
-
const {
|
|
254
|
-
hb =
|
|
372
|
+
const { repairLiveCoordinationHeartbeat } = await import("./state/live-coordination-writer.js");
|
|
373
|
+
hb = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, adapterFromPlatform(adapter), model);
|
|
255
374
|
}
|
|
256
375
|
catch (error) {
|
|
257
376
|
process.stderr.write(`agent-coord repair-coordination-cache: V3 route refused (${error instanceof Error ? error.message : String(error)})\n`);
|
|
@@ -260,6 +379,45 @@ async function handleStateAction(root, action, rest) {
|
|
|
260
379
|
process.stdout.write(`${JSON.stringify({ instance_id: owner, recreated: !!hb })}\n`);
|
|
261
380
|
return hb ? 0 : 1;
|
|
262
381
|
}
|
|
382
|
+
case "quarantine-authority-transaction": {
|
|
383
|
+
const adapter = args.find((a) => a.startsWith("--adapter="))?.slice("--adapter=".length);
|
|
384
|
+
const positional = args.filter((a) => !a.startsWith("--"));
|
|
385
|
+
const [transactionId, approvalRecordId, sessionId] = positional;
|
|
386
|
+
if (!transactionId || !approvalRecordId) {
|
|
387
|
+
process.stderr.write("agent-coord quarantine-authority-transaction: missing <transaction-id> or <approval-record-id>\n");
|
|
388
|
+
return 2;
|
|
389
|
+
}
|
|
390
|
+
try {
|
|
391
|
+
const { coordinationAuthorityStateDigestV3, liveCoordinationWriteModeV3 } = await import("./live-authority-v3.js");
|
|
392
|
+
liveCoordinationWriteModeV3(root);
|
|
393
|
+
const { liveInstanceIdV3 } = await import("../events/v3/live-routing.js");
|
|
394
|
+
const { repairLiveCoordinationHeartbeat } = await import("./state/live-coordination-writer.js");
|
|
395
|
+
const heartbeat = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, adapterFromPlatform(adapter));
|
|
396
|
+
if (!heartbeat) {
|
|
397
|
+
throw new Error("authoritative coordination cache could not be materialized");
|
|
398
|
+
}
|
|
399
|
+
const { quarantineConflictingCoordinationTransactionV3 } = await import("../events/v3/coordination-transaction-recovery.js");
|
|
400
|
+
const receipt = quarantineConflictingCoordinationTransactionV3(root, {
|
|
401
|
+
transaction_id: transactionId,
|
|
402
|
+
actor_instance_id: liveInstanceIdV3(owner),
|
|
403
|
+
observed_current_state_digest: coordinationAuthorityStateDigestV3(heartbeat),
|
|
404
|
+
approval_record_id: approvalRecordId,
|
|
405
|
+
});
|
|
406
|
+
const repaired = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, adapterFromPlatform(adapter));
|
|
407
|
+
process.stdout.write(`${JSON.stringify({
|
|
408
|
+
instance_id: owner,
|
|
409
|
+
receipt,
|
|
410
|
+
heartbeat: repaired
|
|
411
|
+
? { task_state: repaired.task_state, files_touched: repaired.files_touched }
|
|
412
|
+
: null,
|
|
413
|
+
})}\n`);
|
|
414
|
+
return repaired ? 0 : 1;
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
process.stderr.write(`agent-coord quarantine-authority-transaction: recovery refused (${error instanceof Error ? error.message : String(error)})\n`);
|
|
418
|
+
return 1;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
263
421
|
default:
|
|
264
422
|
process.stderr.write(`agent-coord: unknown state action ${action}\n`);
|
|
265
423
|
return 2;
|
|
@@ -515,12 +673,13 @@ async function handlePromptContext(root, rest) {
|
|
|
515
673
|
const agentName = args.name;
|
|
516
674
|
const sessionNameNudge = args["session-name-nudge"] === "true";
|
|
517
675
|
const taskNudge = args["task-nudge"] === "true";
|
|
676
|
+
const hostPromptReminder = args["host-prompt-reminder"] === "true";
|
|
518
677
|
const statusFooterNudge = args["status-footer-nudge"] === "true";
|
|
519
678
|
// Value is the adapter id; a bare flag (parsed as "true") still enables the
|
|
520
679
|
// reminder with the adapter-neutral wording.
|
|
521
680
|
const turnRitualNudge = args["turn-ritual-nudge"] === "true" ? "generic" : args["turn-ritual-nudge"];
|
|
522
681
|
if (!instanceId) {
|
|
523
|
-
process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n");
|
|
682
|
+
process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--host-prompt-reminder] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n");
|
|
524
683
|
return 2;
|
|
525
684
|
}
|
|
526
685
|
const { renderPromptContext } = await import("./render/prompt-context.js");
|
|
@@ -531,6 +690,7 @@ async function handlePromptContext(root, rest) {
|
|
|
531
690
|
agentName,
|
|
532
691
|
sessionNameNudge,
|
|
533
692
|
taskNudge,
|
|
693
|
+
hostPromptReminder,
|
|
534
694
|
statusFooterNudge,
|
|
535
695
|
turnRitualNudge,
|
|
536
696
|
});
|
|
@@ -726,9 +886,12 @@ async function handleGitHook(fallbackRoot, rest) {
|
|
|
726
886
|
});
|
|
727
887
|
// Forensics channel shared with the stdin `verdict` path.
|
|
728
888
|
try {
|
|
729
|
-
const
|
|
730
|
-
|
|
731
|
-
|
|
889
|
+
const diagnostic = { via: "git-hook", staged, verdict: result };
|
|
890
|
+
if (!sharedDiagnostic(root, "agent_coord.git_hook_verdict", diagnostic)) {
|
|
891
|
+
const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
|
|
892
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
893
|
+
await appendFile(logPath, `${JSON.stringify({ ts: new Date().toISOString(), ...diagnostic })}\n`);
|
|
894
|
+
}
|
|
732
895
|
}
|
|
733
896
|
catch {
|
|
734
897
|
/* diagnostics never break a verdict */
|
|
@@ -809,7 +972,8 @@ async function main() {
|
|
|
809
972
|
if (subcommand === "set-task" ||
|
|
810
973
|
subcommand === "release-claim" ||
|
|
811
974
|
subcommand === "heal-pidmap" ||
|
|
812
|
-
subcommand === "repair-coordination-cache"
|
|
975
|
+
subcommand === "repair-coordination-cache" ||
|
|
976
|
+
subcommand === "quarantine-authority-transaction") {
|
|
813
977
|
return handleStateAction(root, subcommand, rest);
|
|
814
978
|
}
|
|
815
979
|
if (subcommand === "append-journal" || subcommand === "edit-journal") {
|
|
@@ -859,17 +1023,23 @@ async function main() {
|
|
|
859
1023
|
return 0;
|
|
860
1024
|
}
|
|
861
1025
|
main()
|
|
862
|
-
.then((code) =>
|
|
863
|
-
|
|
1026
|
+
.then(async (code) => {
|
|
1027
|
+
await closeProcessLoggers();
|
|
1028
|
+
process.exit(code);
|
|
1029
|
+
})
|
|
1030
|
+
.catch(async (err) => {
|
|
864
1031
|
try {
|
|
865
1032
|
const root = findCoordRoot(process.cwd());
|
|
866
1033
|
if (root) {
|
|
867
|
-
|
|
868
|
-
|
|
1034
|
+
if (!sharedDiagnostic(root, "agent_coord.error", {}, err)) {
|
|
1035
|
+
const path = join(root, ".harnery", "debug", "agent-coord.errors.ndjson");
|
|
1036
|
+
appendFileSync(path, `${JSON.stringify({ ts: new Date().toISOString(), error: String(err) })}\n`);
|
|
1037
|
+
}
|
|
869
1038
|
}
|
|
870
1039
|
}
|
|
871
1040
|
catch {
|
|
872
1041
|
/* swallow */
|
|
873
1042
|
}
|
|
1043
|
+
await closeProcessLoggers();
|
|
874
1044
|
process.exit(0);
|
|
875
1045
|
});
|
|
@@ -104,9 +104,10 @@ export declare function pidStartToken(pid: number): string | null;
|
|
|
104
104
|
* Prefer a row whose platform matches `HARNERY_AGENT_COORD_PLATFORM` (default
|
|
105
105
|
* `claude-code`); otherwise return the first owner seen on the walk.
|
|
106
106
|
*
|
|
107
|
-
* Subagents intentionally do not write pid-map entries; a Bash-tool
|
|
108
|
-
* from inside
|
|
109
|
-
*
|
|
107
|
+
* Subagents intentionally do not write pid-map entries; a bare Bash-tool
|
|
108
|
+
* ppid-walk from inside an unbridged child therefore resolves to the parent's
|
|
109
|
+
* pid-map entry. Native hook bridges supersede this fallback through the
|
|
110
|
+
* child session environment.
|
|
110
111
|
*/
|
|
111
112
|
export declare function resolveOwner(): string | null;
|
|
112
113
|
/**
|
|
@@ -120,6 +121,20 @@ export declare function resolveOwnerWithSource(): {
|
|
|
120
121
|
owner: string | null;
|
|
121
122
|
source: "env" | "pidmap" | "pidmap_fallback" | "session_env" | "active_singleton" | "none";
|
|
122
123
|
};
|
|
124
|
+
/**
|
|
125
|
+
* The nearest pid-map anchor on our own ppid chain whose start token PROVES the
|
|
126
|
+
* row still describes the process holding that pid, or null when the nearest
|
|
127
|
+
* row is unverified, recycled, or absent.
|
|
128
|
+
*
|
|
129
|
+
* Nearest matters: in a nested-agent tree (session A spawns a headless session
|
|
130
|
+
* B whose shell runs this code), both A's and B's adapter processes are
|
|
131
|
+
* ancestors, and only the innermost one owns this process's tool environment.
|
|
132
|
+
* Exported for unit testing with an injectable root.
|
|
133
|
+
*/
|
|
134
|
+
export declare function nearestVerifiedSessionAnchor(root: string): {
|
|
135
|
+
owner: string;
|
|
136
|
+
platform: string;
|
|
137
|
+
} | null;
|
|
123
138
|
/**
|
|
124
139
|
* Walk our own ppid chain for a pid-map row in ONE given root.
|
|
125
140
|
*
|
|
@@ -149,6 +164,17 @@ export declare function sessionIdentityFromEnv(): string | null;
|
|
|
149
164
|
* Exported for unit testing with an injectable root.
|
|
150
165
|
*/
|
|
151
166
|
export declare function resolveOwnerBySessionEnv(root: string): string | null;
|
|
167
|
+
/**
|
|
168
|
+
* `resolveOwnerBySessionEnv` plus WHICH adapter's producer state the session id
|
|
169
|
+
* joined. The caller uses the adapter to tell a same-adapter conflict (the env
|
|
170
|
+
* var is stamped fresh per tool call and outranks a possibly-lagging pid-map
|
|
171
|
+
* row) from a cross-adapter one (the var is inherited context from an outer
|
|
172
|
+
* session and the verified row wins).
|
|
173
|
+
*/
|
|
174
|
+
export declare function resolveOwnerBySessionEnvDetailed(root: string): {
|
|
175
|
+
owner: string;
|
|
176
|
+
adapters: string[];
|
|
177
|
+
} | null;
|
|
152
178
|
/**
|
|
153
179
|
* Return the native instance label of the sole live V3 generation in this
|
|
154
180
|
* coord root, or null if there are zero or more than one.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coord-client.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAWhE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAI5E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CA+B7E;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAeD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAiED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2CxD;AAgCD
|
|
1
|
+
{"version":3,"file":"coord-client.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAWhE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAI5E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CA+B7E;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAeD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAiED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2CxD;AAgCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,iBAAiB,GAAG,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;CAC5F,CAsEA;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsB5C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,CAAC;CAC/C,CAyBA;AAqBD,sFAAsF;AACtF;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD;AAuCD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAmB9C;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpE"}
|
|
@@ -339,9 +339,10 @@ function readPidmapRow(pidmapDir, pid) {
|
|
|
339
339
|
* Prefer a row whose platform matches `HARNERY_AGENT_COORD_PLATFORM` (default
|
|
340
340
|
* `claude-code`); otherwise return the first owner seen on the walk.
|
|
341
341
|
*
|
|
342
|
-
* Subagents intentionally do not write pid-map entries; a Bash-tool
|
|
343
|
-
* from inside
|
|
344
|
-
*
|
|
342
|
+
* Subagents intentionally do not write pid-map entries; a bare Bash-tool
|
|
343
|
+
* ppid-walk from inside an unbridged child therefore resolves to the parent's
|
|
344
|
+
* pid-map entry. Native hook bridges supersede this fallback through the
|
|
345
|
+
* child session environment.
|
|
345
346
|
*/
|
|
346
347
|
export function resolveOwner() {
|
|
347
348
|
return resolveOwnerWithSource().owner;
|
|
@@ -368,9 +369,34 @@ export function resolveOwnerWithSource() {
|
|
|
368
369
|
// Every supported adapter exports its native session id into subprocesses.
|
|
369
370
|
// Match it against the live V3 producer state, never a disposable cache.
|
|
370
371
|
if (shouldPreferSessionEnv()) {
|
|
371
|
-
const bySession =
|
|
372
|
+
const bySession = resolveOwnerBySessionEnvDetailed(root);
|
|
372
373
|
if (bySession) {
|
|
373
|
-
|
|
374
|
+
// Env vars cross process boundaries that session identity does not: a
|
|
375
|
+
// nested different-adapter child inherits its spawner's exported id (a
|
|
376
|
+
// Codex session's CODEX_THREAD_ID survives into a `claude -p` child's
|
|
377
|
+
// shells untouched), and that stale statement joins the spawner's live
|
|
378
|
+
// producer. The nearest token-verified pid-map anchor names the session
|
|
379
|
+
// whose tool environment this process actually runs in, so on a
|
|
380
|
+
// CROSS-adapter conflict the anchor wins — the anchoring adapter never
|
|
381
|
+
// stamps another adapter's variable, so a foreign-adapter id here is
|
|
382
|
+
// inherited context, while the anchor row is re-healed on every tool
|
|
383
|
+
// call. A SAME-adapter conflict keeps the env: the adapter stamps its
|
|
384
|
+
// own variable fresh per tool call, and the row may lag one heal (e.g.
|
|
385
|
+
// a session id change inside one process). Only per-session-process
|
|
386
|
+
// adapters may anchor (claude-code, codex) — Cursor sessions share one
|
|
387
|
+
// terminal process, so a verified Cursor row can belong to a sibling
|
|
388
|
+
// session. Unverified rows keep losing to the env too: without a start
|
|
389
|
+
// token the row is the guess the env ordering was introduced to beat.
|
|
390
|
+
// Never for bridge-marked children: a connector crosses a process-tree
|
|
391
|
+
// boundary, so an anchor in THIS tree is someone else's by definition.
|
|
392
|
+
const anchor = bridge ? null : nearestVerifiedSessionAnchor(root);
|
|
393
|
+
if (anchor &&
|
|
394
|
+
anchor.owner !== bySession.owner &&
|
|
395
|
+
!bySession.adapters.includes(anchor.platform) &&
|
|
396
|
+
(anchor.platform === "claude-code" || anchor.platform === "codex")) {
|
|
397
|
+
return { owner: anchor.owner, source: "pidmap" };
|
|
398
|
+
}
|
|
399
|
+
return { owner: bySession.owner, source: "session_env" };
|
|
374
400
|
}
|
|
375
401
|
}
|
|
376
402
|
// Connector children cross process-tree boundaries where pid ancestry is
|
|
@@ -394,6 +420,42 @@ export function resolveOwnerWithSource() {
|
|
|
394
420
|
}
|
|
395
421
|
return { owner: null, source: "none" };
|
|
396
422
|
}
|
|
423
|
+
/**
|
|
424
|
+
* The nearest pid-map anchor on our own ppid chain whose start token PROVES the
|
|
425
|
+
* row still describes the process holding that pid, or null when the nearest
|
|
426
|
+
* row is unverified, recycled, or absent.
|
|
427
|
+
*
|
|
428
|
+
* Nearest matters: in a nested-agent tree (session A spawns a headless session
|
|
429
|
+
* B whose shell runs this code), both A's and B's adapter processes are
|
|
430
|
+
* ancestors, and only the innermost one owns this process's tool environment.
|
|
431
|
+
* Exported for unit testing with an injectable root.
|
|
432
|
+
*/
|
|
433
|
+
export function nearestVerifiedSessionAnchor(root) {
|
|
434
|
+
const pidmapDir = resolve(root, ".harnery", "pid-map");
|
|
435
|
+
if (!existsSync(pidmapDir))
|
|
436
|
+
return null;
|
|
437
|
+
let pid = process.pid;
|
|
438
|
+
for (let hop = 0; hop < 20; hop++) {
|
|
439
|
+
if (pid === null)
|
|
440
|
+
break;
|
|
441
|
+
const row = readPidmapRow(pidmapDir, pid);
|
|
442
|
+
if (row) {
|
|
443
|
+
const owner = parsePidmapRowOwner(row);
|
|
444
|
+
if (owner && !pidWasRecycled(pid, row)) {
|
|
445
|
+
// A recycled row is about a dead process's tenure of this pid — walk
|
|
446
|
+
// past it like the owner walk does. A live row without a provable
|
|
447
|
+
// token match is the nearest anchor but not a VERIFIED one: stop and
|
|
448
|
+
// report none, so the session env keeps outranking guesses.
|
|
449
|
+
const token = parsePidmapRowStartToken(row);
|
|
450
|
+
if (!token || !pidStartToken(pid))
|
|
451
|
+
return null;
|
|
452
|
+
return { owner, platform: parsePidmapRowPlatform(row) };
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
pid = readPpid(pid);
|
|
456
|
+
}
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
397
459
|
/**
|
|
398
460
|
* Walk our own ppid chain for a pid-map row in ONE given root.
|
|
399
461
|
*
|
|
@@ -501,19 +563,36 @@ function shouldPreferSessionEnv() {
|
|
|
501
563
|
* Exported for unit testing with an injectable root.
|
|
502
564
|
*/
|
|
503
565
|
export function resolveOwnerBySessionEnv(root) {
|
|
566
|
+
return resolveOwnerBySessionEnvDetailed(root)?.owner ?? null;
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* `resolveOwnerBySessionEnv` plus WHICH adapter's producer state the session id
|
|
570
|
+
* joined. The caller uses the adapter to tell a same-adapter conflict (the env
|
|
571
|
+
* var is stamped fresh per tool call and outranks a possibly-lagging pid-map
|
|
572
|
+
* row) from a cross-adapter one (the var is inherited context from an outer
|
|
573
|
+
* session and the verified row wins).
|
|
574
|
+
*/
|
|
575
|
+
export function resolveOwnerBySessionEnvDetailed(root) {
|
|
504
576
|
const sessionIds = sessionIdsFromEnv();
|
|
505
577
|
if (sessionIds.length === 0)
|
|
506
578
|
return null;
|
|
507
579
|
const adapters = adapterCandidatesFromEnv();
|
|
508
|
-
const matches = new
|
|
580
|
+
const matches = new Map();
|
|
509
581
|
for (const sessionId of sessionIds) {
|
|
510
582
|
for (const adapter of adapters) {
|
|
511
583
|
const state = readHookProducerStateV3(root, adapter, sessionId);
|
|
512
|
-
if (state && !state.terminal)
|
|
513
|
-
|
|
584
|
+
if (state && !state.terminal) {
|
|
585
|
+
const owner = nativeOwnerForV3Instance(root, state.instance_id);
|
|
586
|
+
const set = matches.get(owner) ?? new Set();
|
|
587
|
+
set.add(adapter);
|
|
588
|
+
matches.set(owner, set);
|
|
589
|
+
}
|
|
514
590
|
}
|
|
515
591
|
}
|
|
516
|
-
|
|
592
|
+
if (matches.size !== 1)
|
|
593
|
+
return null;
|
|
594
|
+
const [owner, adapterSet] = [...matches.entries()][0];
|
|
595
|
+
return { owner, adapters: [...adapterSet] };
|
|
517
596
|
}
|
|
518
597
|
/**
|
|
519
598
|
* Return the native instance label of the sole live V3 generation in this
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Adapter } from "../adapter.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type EventV3WriteMode } from "../events/v3/control.js";
|
|
3
3
|
import { type RecordCoordinationAuthorityV3Result } from "../events/v3/producers/coordination-recorder.js";
|
|
4
|
+
import { type Heartbeat } from "./state/heartbeat-writer.js";
|
|
4
5
|
export declare const LIVE_COORDINATION_V3_PRODUCER_ID: "prd_agent-coord";
|
|
5
6
|
export declare class LiveCoordinationAuthorityV3Error extends Error {
|
|
6
7
|
readonly reason: string;
|
|
@@ -18,6 +19,18 @@ export interface ReopenedLiveCoordinationGenerationV3 {
|
|
|
18
19
|
prior_generation_id: `gen_${string}`;
|
|
19
20
|
generation_id: `gen_${string}`;
|
|
20
21
|
}
|
|
22
|
+
export interface BootstrappedLiveCoordinationAuthorityV3 {
|
|
23
|
+
state: "created" | "reused";
|
|
24
|
+
adapter: Adapter;
|
|
25
|
+
generation_id: `gen_${string}`;
|
|
26
|
+
heartbeat: Heartbeat;
|
|
27
|
+
}
|
|
28
|
+
export interface RestoredLiveCoordinationStateV3 {
|
|
29
|
+
state: "unchanged" | "restored";
|
|
30
|
+
task: boolean;
|
|
31
|
+
claims: number;
|
|
32
|
+
lifecycle: boolean;
|
|
33
|
+
}
|
|
21
34
|
interface LiveAuthorityBaseV3 {
|
|
22
35
|
coordRoot: string;
|
|
23
36
|
owner: string;
|
|
@@ -26,6 +39,38 @@ interface LiveAuthorityBaseV3 {
|
|
|
26
39
|
adapter: Adapter;
|
|
27
40
|
observationId?: string;
|
|
28
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Establish the missing generation authority for one adapter-native session,
|
|
44
|
+
* then reconstruct its disposable heartbeat cache.
|
|
45
|
+
*
|
|
46
|
+
* This is intentionally narrower than mid-flight hook onboarding. The caller
|
|
47
|
+
* must supply an already validated native session, adapter, and current
|
|
48
|
+
* instance identity. Existing authority is reused only when all three bind to
|
|
49
|
+
* the same non-terminal producer generation. A terminal generation, an
|
|
50
|
+
* adapter/session collision, or any disagreement between private producer
|
|
51
|
+
* control and the public projection fails closed. No turn is synthesized.
|
|
52
|
+
*/
|
|
53
|
+
export declare function bootstrapLiveCoordinationAuthorityV3(input: {
|
|
54
|
+
coordRoot: string;
|
|
55
|
+
owner: string;
|
|
56
|
+
nativeSessionId: string;
|
|
57
|
+
adapter: Adapter;
|
|
58
|
+
}): BootstrappedLiveCoordinationAuthorityV3;
|
|
59
|
+
/**
|
|
60
|
+
* Reapply private, generation-bound coordination state after a runtime epoch
|
|
61
|
+
* replaces the canonical ledger. The old heartbeat is only accepted for the
|
|
62
|
+
* same native session and a different V3 generation. Its task prose and
|
|
63
|
+
* lifecycle reason remain in the disposable cache; canonical events retain
|
|
64
|
+
* only the privacy-safe authority signals.
|
|
65
|
+
*/
|
|
66
|
+
export declare function restoreLiveCoordinationStateAfterEpochV3(input: {
|
|
67
|
+
coordRoot: string;
|
|
68
|
+
owner: string;
|
|
69
|
+
nativeSessionId: string;
|
|
70
|
+
adapter: Adapter;
|
|
71
|
+
prior: Heartbeat | null;
|
|
72
|
+
currentGenerationId?: `gen_${string}`;
|
|
73
|
+
}): RestoredLiveCoordinationStateV3;
|
|
29
74
|
/**
|
|
30
75
|
* Open a fresh derived generation for a human-facing session that is executing
|
|
31
76
|
* again after an authoritative terminal. The terminal generation is never
|
|
@@ -55,5 +100,6 @@ export declare function recordLiveIdentityChangeV3(input: LiveAuthorityBaseV3 &
|
|
|
55
100
|
identityId: string;
|
|
56
101
|
}): LiveCoordinationAuthorityV3Result;
|
|
57
102
|
export declare function liveCoordinationWriteModeV3(coordRoot: string): EventV3WriteMode;
|
|
103
|
+
export declare function coordinationAuthorityStateDigestV3(heartbeat: Heartbeat): `sha256:${string}`;
|
|
58
104
|
export {};
|
|
59
105
|
//# sourceMappingURL=live-authority-v3.d.ts.map
|
|
@@ -1 +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,
|
|
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,EAAE,KAAK,gBAAgB,EAA2B,MAAM,yBAAyB,CAAC;AAgBzF,OAAO,EACL,KAAK,mCAAmC,EAEzC,MAAM,iDAAiD,CAAC;AASzD,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,6BAA6B,CAAC;AAQrC,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,MAAM,WAAW,uCAAuC;IACtD,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;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;;;;;;;;;;GAUG;AACH,wBAAgB,oCAAoC,CAAC,KAAK,EAAE;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,uCAAuC,CA6H1C;AAqED;;;;;;GAMG;AACH,wBAAgB,wCAAwC,CAAC,KAAK,EAAE;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;CACvC,GAAG,+BAA+B,CAmFlC;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,CAoCnC;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,CAwCnC;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAChE,iCAAiC,CAwBnC;AAuDD,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAI/E;AAaD,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,MAAM,EAAE,CAa3F"}
|