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/src/core/agents/cli.ts
CHANGED
|
@@ -7,10 +7,31 @@
|
|
|
7
7
|
* handlers; Phase 4 flips the default so `harn agents …` shims through here.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
10
11
|
import { appendFileSync, existsSync } from "node:fs";
|
|
11
12
|
import { appendFile, mkdir } from "node:fs/promises";
|
|
13
|
+
import { hostname } from "node:os";
|
|
12
14
|
import { dirname, join, resolve } from "node:path";
|
|
13
15
|
import { coordEnv } from "../../lib/env.ts";
|
|
16
|
+
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.ts";
|
|
17
|
+
import { acquireNoClobberLease } from "../workflow/workspaces/leases.ts";
|
|
18
|
+
|
|
19
|
+
function sharedDiagnostic(
|
|
20
|
+
root: string,
|
|
21
|
+
event: string,
|
|
22
|
+
fields: Record<string, unknown>,
|
|
23
|
+
error?: unknown,
|
|
24
|
+
): boolean {
|
|
25
|
+
if (coordEnv("SHARED_LOGS") === "0") return false;
|
|
26
|
+
try {
|
|
27
|
+
const logger = processLogger(root, "agent-coord");
|
|
28
|
+
if (error === undefined) logger.debug(event, legacyLogFields(fields));
|
|
29
|
+
else logger.error(event, legacyLogFields(fields), error);
|
|
30
|
+
return true;
|
|
31
|
+
} catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
14
35
|
|
|
15
36
|
function findCoordRoot(start: string): string | null {
|
|
16
37
|
// HARNERY_COORD_ROOT_OVERRIDE: the bash side's test-mode escape hatch. agent-coord
|
|
@@ -39,8 +60,6 @@ async function readStdin(): Promise<string> {
|
|
|
39
60
|
}
|
|
40
61
|
|
|
41
62
|
async function logNoop(root: string, subcommand: string, argv: string[]): Promise<void> {
|
|
42
|
-
const logPath = join(root, ".harnery", "debug", "agent-coord.ndjson");
|
|
43
|
-
await mkdir(dirname(logPath), { recursive: true });
|
|
44
63
|
const entry = {
|
|
45
64
|
ts: new Date().toISOString(),
|
|
46
65
|
note: "called, no-op",
|
|
@@ -50,6 +69,9 @@ async function logNoop(root: string, subcommand: string, argv: string[]): Promis
|
|
|
50
69
|
pid: process.pid,
|
|
51
70
|
ppid: process.ppid,
|
|
52
71
|
};
|
|
72
|
+
if (sharedDiagnostic(root, "agent_coord.noop", entry)) return;
|
|
73
|
+
const logPath = join(root, ".harnery", "debug", "agent-coord.ndjson");
|
|
74
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
53
75
|
await appendFile(logPath, `${JSON.stringify(entry)}\n`, "utf8");
|
|
54
76
|
}
|
|
55
77
|
|
|
@@ -63,8 +85,6 @@ async function logNoop(root: string, subcommand: string, argv: string[]): Promis
|
|
|
63
85
|
*/
|
|
64
86
|
async function handleVerdict(root: string): Promise<number> {
|
|
65
87
|
const raw = await readStdin();
|
|
66
|
-
const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
|
|
67
|
-
await mkdir(dirname(logPath), { recursive: true });
|
|
68
88
|
|
|
69
89
|
let parsed: { rule?: string } & Record<string, unknown> = {};
|
|
70
90
|
let parseErr: string | null = null;
|
|
@@ -109,15 +129,16 @@ async function handleVerdict(root: string): Promise<number> {
|
|
|
109
129
|
};
|
|
110
130
|
}
|
|
111
131
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
132
|
+
const diagnostic = { request_preview: raw.slice(0, 500), verdict };
|
|
133
|
+
if (!sharedDiagnostic(root, "agent_coord.verdict", diagnostic)) {
|
|
134
|
+
const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
|
|
135
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
136
|
+
await appendFile(
|
|
137
|
+
logPath,
|
|
138
|
+
`${JSON.stringify({ ts: new Date().toISOString(), ...diagnostic })}\n`,
|
|
139
|
+
"utf8",
|
|
140
|
+
);
|
|
141
|
+
}
|
|
121
142
|
|
|
122
143
|
process.stdout.write(`${JSON.stringify(verdict)}\n`);
|
|
123
144
|
return 0;
|
|
@@ -151,6 +172,64 @@ function adapterFromPlatform(platform: unknown): "claude-code" | "cursor" | "cod
|
|
|
151
172
|
return "claude-code";
|
|
152
173
|
}
|
|
153
174
|
|
|
175
|
+
const coordinationRetryCell = new Int32Array(new SharedArrayBuffer(4));
|
|
176
|
+
const COORDINATION_RETRY_ATTEMPTS = 240;
|
|
177
|
+
const COORDINATION_RETRY_DELAY_MS = 25;
|
|
178
|
+
|
|
179
|
+
function isRetryableCoordinationContention(error: unknown): boolean {
|
|
180
|
+
return (
|
|
181
|
+
error instanceof Error &&
|
|
182
|
+
error.message.includes(
|
|
183
|
+
"lease event-v3-coordination-producer is held by a live or unexpired owner",
|
|
184
|
+
)
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function waitForCoordinationLease(): void {
|
|
189
|
+
Atomics.wait(coordinationRetryCell, 0, 0, COORDINATION_RETRY_DELAY_MS);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function pidIsAlive(pid: number): boolean {
|
|
193
|
+
if (!Number.isSafeInteger(pid) || pid < 1) return false;
|
|
194
|
+
try {
|
|
195
|
+
process.kill(pid, 0);
|
|
196
|
+
return true;
|
|
197
|
+
} catch (error) {
|
|
198
|
+
return (error as NodeJS.ErrnoException).code !== "ESRCH";
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// The V3 producer lease begins after its caller has materialized and read the
|
|
203
|
+
// disposable heartbeat. Serialize that larger registration boundary per owner
|
|
204
|
+
// so overlapping first declarations cannot both derive state from an unnamed,
|
|
205
|
+
// missing heartbeat and then strand a conflicting authority transaction.
|
|
206
|
+
function acquireSetTaskLease(root: string, owner: string) {
|
|
207
|
+
const leasePath = join(root, ".harnery", "active", ".set-task-leases", `${owner}.lease`);
|
|
208
|
+
const authoritySha256 = createHash("sha256")
|
|
209
|
+
.update(resolve(root))
|
|
210
|
+
.update("\0")
|
|
211
|
+
.update(owner)
|
|
212
|
+
.digest("hex");
|
|
213
|
+
for (let attempt = 0; ; attempt += 1) {
|
|
214
|
+
try {
|
|
215
|
+
return acquireNoClobberLease({
|
|
216
|
+
path: leasePath,
|
|
217
|
+
scope: "agent-set-task",
|
|
218
|
+
authoritySha256,
|
|
219
|
+
staleAfterMs: 5_000,
|
|
220
|
+
validateStaleOwner: (leaseOwner) =>
|
|
221
|
+
leaseOwner.host === hostname() && !pidIsAlive(leaseOwner.pid),
|
|
222
|
+
});
|
|
223
|
+
} catch (error) {
|
|
224
|
+
const busy =
|
|
225
|
+
error instanceof Error &&
|
|
226
|
+
error.message.includes("lease agent-set-task is held by a live or unexpired owner");
|
|
227
|
+
if (!busy || attempt >= COORDINATION_RETRY_ATTEMPTS - 1) throw error;
|
|
228
|
+
waitForCoordinationLease();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
154
233
|
async function handleStateAction(root: string, action: string, rest: string[]): Promise<number> {
|
|
155
234
|
const writer = await import("./state/heartbeat-writer.ts");
|
|
156
235
|
const [owner, ...args] = rest;
|
|
@@ -162,36 +241,91 @@ async function handleStateAction(root: string, action: string, rest: string[]):
|
|
|
162
241
|
switch (action) {
|
|
163
242
|
case "set-task": {
|
|
164
243
|
const task = args.join(" ");
|
|
165
|
-
|
|
166
|
-
let hb: ReturnType<typeof writer.setTask>;
|
|
244
|
+
let setTaskLease: ReturnType<typeof acquireSetTaskLease>;
|
|
167
245
|
try {
|
|
168
|
-
|
|
169
|
-
recordLiveTaskChangeV3({
|
|
170
|
-
coordRoot: root,
|
|
171
|
-
owner,
|
|
172
|
-
nativeSessionId: before?.session_id ?? owner,
|
|
173
|
-
adapter: adapterFromPlatform(before?.platform),
|
|
174
|
-
task,
|
|
175
|
-
});
|
|
176
|
-
hb = writer.readHeartbeat(root, owner);
|
|
246
|
+
setTaskLease = acquireSetTaskLease(root, owner);
|
|
177
247
|
} catch (error) {
|
|
178
248
|
process.stderr.write(
|
|
179
|
-
`agent-coord set-task:
|
|
249
|
+
`agent-coord set-task: registration lease refused (${error instanceof Error ? error.message : String(error)})\n`,
|
|
180
250
|
);
|
|
181
251
|
return 1;
|
|
182
252
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
253
|
+
try {
|
|
254
|
+
let before = writer.readHeartbeat(root, owner);
|
|
255
|
+
const humanFacing =
|
|
256
|
+
before?.kind !== "subagent" && before?.kind !== "transient" && !before?.workflow_run_id;
|
|
257
|
+
// A mid-flight-onboarded generation can exist before SessionStart's
|
|
258
|
+
// assign-name step ran. Repair that private display metadata before the
|
|
259
|
+
// first non-empty task mints its operator-facing title. assignName is the
|
|
260
|
+
// same durable, idempotent pool path used by normal SessionStart.
|
|
261
|
+
if (task && before && humanFacing && !before.name?.trim()) {
|
|
262
|
+
const { assignName } = await import("./state/names.ts");
|
|
263
|
+
const name = assignName(root, owner, "session");
|
|
264
|
+
before = writer.setAssignedNameCache(root, owner, name, "session");
|
|
265
|
+
if (!before) {
|
|
266
|
+
process.stderr.write(
|
|
267
|
+
`agent-coord set-task: could not restore assigned name for ${owner}\n`,
|
|
268
|
+
);
|
|
269
|
+
return 1;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
let hb: ReturnType<typeof writer.setTask>;
|
|
273
|
+
try {
|
|
274
|
+
const { recordLiveTaskChangeV3 } = await import("./live-authority-v3.ts");
|
|
275
|
+
for (let attempt = 0; ; attempt += 1) {
|
|
276
|
+
try {
|
|
277
|
+
recordLiveTaskChangeV3({
|
|
278
|
+
coordRoot: root,
|
|
279
|
+
owner,
|
|
280
|
+
nativeSessionId: before?.session_id ?? owner,
|
|
281
|
+
adapter: adapterFromPlatform(before?.platform),
|
|
282
|
+
task,
|
|
283
|
+
});
|
|
284
|
+
break;
|
|
285
|
+
} catch (error) {
|
|
286
|
+
if (
|
|
287
|
+
!isRetryableCoordinationContention(error) ||
|
|
288
|
+
attempt >= COORDINATION_RETRY_ATTEMPTS - 1
|
|
289
|
+
) {
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
waitForCoordinationLease();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
hb = writer.readHeartbeat(root, owner);
|
|
296
|
+
const currentHumanFacing =
|
|
297
|
+
hb?.kind !== "subagent" && hb?.kind !== "transient" && !hb?.workflow_run_id;
|
|
298
|
+
if (
|
|
299
|
+
task &&
|
|
300
|
+
hb &&
|
|
301
|
+
currentHumanFacing &&
|
|
302
|
+
(!hb.name?.trim() || /^Agent unknown - /.test(hb.suggested_session_name ?? ""))
|
|
303
|
+
) {
|
|
304
|
+
const { assignName } = await import("./state/names.ts");
|
|
305
|
+
const name = hb.name?.trim() || assignName(root, owner, "session");
|
|
306
|
+
hb = writer.setAssignedNameCache(root, owner, name, "session");
|
|
307
|
+
}
|
|
308
|
+
} catch (error) {
|
|
309
|
+
process.stderr.write(
|
|
310
|
+
`agent-coord set-task: V3 authority refused (${error instanceof Error ? error.message : String(error)})\n`,
|
|
311
|
+
);
|
|
312
|
+
return 1;
|
|
313
|
+
}
|
|
314
|
+
if (!hb) {
|
|
315
|
+
// Name the RESOLVED root: when a nested .harnery/ shadows the real
|
|
316
|
+
// coordination home, the full path is what makes that diagnosable.
|
|
317
|
+
process.stderr.write(
|
|
318
|
+
`agent-coord set-task: no heartbeat at ${root}/.harnery/active/${owner}.json\n`,
|
|
319
|
+
);
|
|
320
|
+
return 1;
|
|
321
|
+
}
|
|
322
|
+
process.stdout.write(
|
|
323
|
+
`${JSON.stringify({ instance_id: owner, task: hb.task ?? null, cleared: !task })}\n`,
|
|
188
324
|
);
|
|
189
|
-
return
|
|
325
|
+
return 0;
|
|
326
|
+
} finally {
|
|
327
|
+
setTaskLease.release();
|
|
190
328
|
}
|
|
191
|
-
process.stdout.write(
|
|
192
|
-
`${JSON.stringify({ instance_id: owner, task: hb.task ?? null, cleared: !task })}\n`,
|
|
193
|
-
);
|
|
194
|
-
return 0;
|
|
195
329
|
}
|
|
196
330
|
case "release-claim": {
|
|
197
331
|
const path = args[0];
|
|
@@ -271,10 +405,10 @@ async function handleStateAction(root: string, action: string, rest: string[]):
|
|
|
271
405
|
adapter: adapterFromPlatform(adapter),
|
|
272
406
|
});
|
|
273
407
|
}
|
|
274
|
-
const {
|
|
275
|
-
"./state/live-coordination-
|
|
408
|
+
const { repairLiveCoordinationHeartbeat } = await import(
|
|
409
|
+
"./state/live-coordination-writer.ts"
|
|
276
410
|
);
|
|
277
|
-
hb =
|
|
411
|
+
hb = repairLiveCoordinationHeartbeat(
|
|
278
412
|
root,
|
|
279
413
|
owner,
|
|
280
414
|
sessionId ?? owner,
|
|
@@ -290,6 +424,66 @@ async function handleStateAction(root: string, action: string, rest: string[]):
|
|
|
290
424
|
process.stdout.write(`${JSON.stringify({ instance_id: owner, recreated: !!hb })}\n`);
|
|
291
425
|
return hb ? 0 : 1;
|
|
292
426
|
}
|
|
427
|
+
case "quarantine-authority-transaction": {
|
|
428
|
+
const adapter = args.find((a) => a.startsWith("--adapter="))?.slice("--adapter=".length);
|
|
429
|
+
const positional = args.filter((a) => !a.startsWith("--"));
|
|
430
|
+
const [transactionId, approvalRecordId, sessionId] = positional;
|
|
431
|
+
if (!transactionId || !approvalRecordId) {
|
|
432
|
+
process.stderr.write(
|
|
433
|
+
"agent-coord quarantine-authority-transaction: missing <transaction-id> or <approval-record-id>\n",
|
|
434
|
+
);
|
|
435
|
+
return 2;
|
|
436
|
+
}
|
|
437
|
+
try {
|
|
438
|
+
const { coordinationAuthorityStateDigestV3, liveCoordinationWriteModeV3 } = await import(
|
|
439
|
+
"./live-authority-v3.ts"
|
|
440
|
+
);
|
|
441
|
+
liveCoordinationWriteModeV3(root);
|
|
442
|
+
const { liveInstanceIdV3 } = await import("../events/v3/live-routing.ts");
|
|
443
|
+
const { repairLiveCoordinationHeartbeat } = await import(
|
|
444
|
+
"./state/live-coordination-writer.ts"
|
|
445
|
+
);
|
|
446
|
+
const heartbeat = repairLiveCoordinationHeartbeat(
|
|
447
|
+
root,
|
|
448
|
+
owner,
|
|
449
|
+
sessionId ?? owner,
|
|
450
|
+
adapterFromPlatform(adapter),
|
|
451
|
+
);
|
|
452
|
+
if (!heartbeat) {
|
|
453
|
+
throw new Error("authoritative coordination cache could not be materialized");
|
|
454
|
+
}
|
|
455
|
+
const { quarantineConflictingCoordinationTransactionV3 } = await import(
|
|
456
|
+
"../events/v3/coordination-transaction-recovery.ts"
|
|
457
|
+
);
|
|
458
|
+
const receipt = quarantineConflictingCoordinationTransactionV3(root, {
|
|
459
|
+
transaction_id: transactionId,
|
|
460
|
+
actor_instance_id: liveInstanceIdV3(owner),
|
|
461
|
+
observed_current_state_digest: coordinationAuthorityStateDigestV3(heartbeat),
|
|
462
|
+
approval_record_id: approvalRecordId,
|
|
463
|
+
});
|
|
464
|
+
const repaired = repairLiveCoordinationHeartbeat(
|
|
465
|
+
root,
|
|
466
|
+
owner,
|
|
467
|
+
sessionId ?? owner,
|
|
468
|
+
adapterFromPlatform(adapter),
|
|
469
|
+
);
|
|
470
|
+
process.stdout.write(
|
|
471
|
+
`${JSON.stringify({
|
|
472
|
+
instance_id: owner,
|
|
473
|
+
receipt,
|
|
474
|
+
heartbeat: repaired
|
|
475
|
+
? { task_state: repaired.task_state, files_touched: repaired.files_touched }
|
|
476
|
+
: null,
|
|
477
|
+
})}\n`,
|
|
478
|
+
);
|
|
479
|
+
return repaired ? 0 : 1;
|
|
480
|
+
} catch (error) {
|
|
481
|
+
process.stderr.write(
|
|
482
|
+
`agent-coord quarantine-authority-transaction: recovery refused (${error instanceof Error ? error.message : String(error)})\n`,
|
|
483
|
+
);
|
|
484
|
+
return 1;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
293
487
|
default:
|
|
294
488
|
process.stderr.write(`agent-coord: unknown state action ${action}\n`);
|
|
295
489
|
return 2;
|
|
@@ -567,6 +761,7 @@ async function handlePromptContext(root: string, rest: string[]): Promise<number
|
|
|
567
761
|
const agentName = args.name;
|
|
568
762
|
const sessionNameNudge = args["session-name-nudge"] === "true";
|
|
569
763
|
const taskNudge = args["task-nudge"] === "true";
|
|
764
|
+
const hostPromptReminder = args["host-prompt-reminder"] === "true";
|
|
570
765
|
const statusFooterNudge = args["status-footer-nudge"] === "true";
|
|
571
766
|
// Value is the adapter id; a bare flag (parsed as "true") still enables the
|
|
572
767
|
// reminder with the adapter-neutral wording.
|
|
@@ -574,7 +769,7 @@ async function handlePromptContext(root: string, rest: string[]): Promise<number
|
|
|
574
769
|
args["turn-ritual-nudge"] === "true" ? "generic" : args["turn-ritual-nudge"];
|
|
575
770
|
if (!instanceId) {
|
|
576
771
|
process.stderr.write(
|
|
577
|
-
"agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n",
|
|
772
|
+
"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",
|
|
578
773
|
);
|
|
579
774
|
return 2;
|
|
580
775
|
}
|
|
@@ -586,6 +781,7 @@ async function handlePromptContext(root: string, rest: string[]): Promise<number
|
|
|
586
781
|
agentName,
|
|
587
782
|
sessionNameNudge,
|
|
588
783
|
taskNudge,
|
|
784
|
+
hostPromptReminder,
|
|
589
785
|
statusFooterNudge,
|
|
590
786
|
turnRitualNudge,
|
|
591
787
|
});
|
|
@@ -804,12 +1000,15 @@ async function handleGitHook(fallbackRoot: string, rest: string[]): Promise<numb
|
|
|
804
1000
|
});
|
|
805
1001
|
// Forensics channel shared with the stdin `verdict` path.
|
|
806
1002
|
try {
|
|
807
|
-
const
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
logPath,
|
|
811
|
-
|
|
812
|
-
|
|
1003
|
+
const diagnostic = { via: "git-hook", staged, verdict: result };
|
|
1004
|
+
if (!sharedDiagnostic(root, "agent_coord.git_hook_verdict", diagnostic)) {
|
|
1005
|
+
const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
|
|
1006
|
+
await mkdir(dirname(logPath), { recursive: true });
|
|
1007
|
+
await appendFile(
|
|
1008
|
+
logPath,
|
|
1009
|
+
`${JSON.stringify({ ts: new Date().toISOString(), ...diagnostic })}\n`,
|
|
1010
|
+
);
|
|
1011
|
+
}
|
|
813
1012
|
} catch {
|
|
814
1013
|
/* diagnostics never break a verdict */
|
|
815
1014
|
}
|
|
@@ -894,7 +1093,8 @@ async function main(): Promise<number> {
|
|
|
894
1093
|
subcommand === "set-task" ||
|
|
895
1094
|
subcommand === "release-claim" ||
|
|
896
1095
|
subcommand === "heal-pidmap" ||
|
|
897
|
-
subcommand === "repair-coordination-cache"
|
|
1096
|
+
subcommand === "repair-coordination-cache" ||
|
|
1097
|
+
subcommand === "quarantine-authority-transaction"
|
|
898
1098
|
) {
|
|
899
1099
|
return handleStateAction(root, subcommand, rest);
|
|
900
1100
|
}
|
|
@@ -961,19 +1161,25 @@ async function main(): Promise<number> {
|
|
|
961
1161
|
}
|
|
962
1162
|
|
|
963
1163
|
main()
|
|
964
|
-
.then((code) =>
|
|
965
|
-
|
|
1164
|
+
.then(async (code) => {
|
|
1165
|
+
await closeProcessLoggers();
|
|
1166
|
+
process.exit(code);
|
|
1167
|
+
})
|
|
1168
|
+
.catch(async (err) => {
|
|
966
1169
|
try {
|
|
967
1170
|
const root = findCoordRoot(process.cwd());
|
|
968
1171
|
if (root) {
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
1172
|
+
if (!sharedDiagnostic(root, "agent_coord.error", {}, err)) {
|
|
1173
|
+
const path = join(root, ".harnery", "debug", "agent-coord.errors.ndjson");
|
|
1174
|
+
appendFileSync(
|
|
1175
|
+
path,
|
|
1176
|
+
`${JSON.stringify({ ts: new Date().toISOString(), error: String(err) })}\n`,
|
|
1177
|
+
);
|
|
1178
|
+
}
|
|
974
1179
|
}
|
|
975
1180
|
} catch {
|
|
976
1181
|
/* swallow */
|
|
977
1182
|
}
|
|
1183
|
+
await closeProcessLoggers();
|
|
978
1184
|
process.exit(0);
|
|
979
1185
|
});
|
|
@@ -347,9 +347,10 @@ function readPidmapRow(pidmapDir: string, pid: number): string | null {
|
|
|
347
347
|
* Prefer a row whose platform matches `HARNERY_AGENT_COORD_PLATFORM` (default
|
|
348
348
|
* `claude-code`); otherwise return the first owner seen on the walk.
|
|
349
349
|
*
|
|
350
|
-
* Subagents intentionally do not write pid-map entries; a Bash-tool
|
|
351
|
-
* from inside
|
|
352
|
-
*
|
|
350
|
+
* Subagents intentionally do not write pid-map entries; a bare Bash-tool
|
|
351
|
+
* ppid-walk from inside an unbridged child therefore resolves to the parent's
|
|
352
|
+
* pid-map entry. Native hook bridges supersede this fallback through the
|
|
353
|
+
* child session environment.
|
|
353
354
|
*/
|
|
354
355
|
export function resolveOwner(): string | null {
|
|
355
356
|
return resolveOwnerWithSource().owner;
|
|
@@ -381,9 +382,36 @@ export function resolveOwnerWithSource(): {
|
|
|
381
382
|
// Every supported adapter exports its native session id into subprocesses.
|
|
382
383
|
// Match it against the live V3 producer state, never a disposable cache.
|
|
383
384
|
if (shouldPreferSessionEnv()) {
|
|
384
|
-
const bySession =
|
|
385
|
+
const bySession = resolveOwnerBySessionEnvDetailed(root);
|
|
385
386
|
if (bySession) {
|
|
386
|
-
|
|
387
|
+
// Env vars cross process boundaries that session identity does not: a
|
|
388
|
+
// nested different-adapter child inherits its spawner's exported id (a
|
|
389
|
+
// Codex session's CODEX_THREAD_ID survives into a `claude -p` child's
|
|
390
|
+
// shells untouched), and that stale statement joins the spawner's live
|
|
391
|
+
// producer. The nearest token-verified pid-map anchor names the session
|
|
392
|
+
// whose tool environment this process actually runs in, so on a
|
|
393
|
+
// CROSS-adapter conflict the anchor wins — the anchoring adapter never
|
|
394
|
+
// stamps another adapter's variable, so a foreign-adapter id here is
|
|
395
|
+
// inherited context, while the anchor row is re-healed on every tool
|
|
396
|
+
// call. A SAME-adapter conflict keeps the env: the adapter stamps its
|
|
397
|
+
// own variable fresh per tool call, and the row may lag one heal (e.g.
|
|
398
|
+
// a session id change inside one process). Only per-session-process
|
|
399
|
+
// adapters may anchor (claude-code, codex) — Cursor sessions share one
|
|
400
|
+
// terminal process, so a verified Cursor row can belong to a sibling
|
|
401
|
+
// session. Unverified rows keep losing to the env too: without a start
|
|
402
|
+
// token the row is the guess the env ordering was introduced to beat.
|
|
403
|
+
// Never for bridge-marked children: a connector crosses a process-tree
|
|
404
|
+
// boundary, so an anchor in THIS tree is someone else's by definition.
|
|
405
|
+
const anchor = bridge ? null : nearestVerifiedSessionAnchor(root);
|
|
406
|
+
if (
|
|
407
|
+
anchor &&
|
|
408
|
+
anchor.owner !== bySession.owner &&
|
|
409
|
+
!bySession.adapters.includes(anchor.platform) &&
|
|
410
|
+
(anchor.platform === "claude-code" || anchor.platform === "codex")
|
|
411
|
+
) {
|
|
412
|
+
return { owner: anchor.owner, source: "pidmap" };
|
|
413
|
+
}
|
|
414
|
+
return { owner: bySession.owner, source: "session_env" };
|
|
387
415
|
}
|
|
388
416
|
}
|
|
389
417
|
|
|
@@ -410,6 +438,42 @@ export function resolveOwnerWithSource(): {
|
|
|
410
438
|
return { owner: null, source: "none" };
|
|
411
439
|
}
|
|
412
440
|
|
|
441
|
+
/**
|
|
442
|
+
* The nearest pid-map anchor on our own ppid chain whose start token PROVES the
|
|
443
|
+
* row still describes the process holding that pid, or null when the nearest
|
|
444
|
+
* row is unverified, recycled, or absent.
|
|
445
|
+
*
|
|
446
|
+
* Nearest matters: in a nested-agent tree (session A spawns a headless session
|
|
447
|
+
* B whose shell runs this code), both A's and B's adapter processes are
|
|
448
|
+
* ancestors, and only the innermost one owns this process's tool environment.
|
|
449
|
+
* Exported for unit testing with an injectable root.
|
|
450
|
+
*/
|
|
451
|
+
export function nearestVerifiedSessionAnchor(
|
|
452
|
+
root: string,
|
|
453
|
+
): { owner: string; platform: string } | null {
|
|
454
|
+
const pidmapDir = resolve(root, ".harnery", "pid-map");
|
|
455
|
+
if (!existsSync(pidmapDir)) return null;
|
|
456
|
+
let pid: number | null = process.pid;
|
|
457
|
+
for (let hop = 0; hop < 20; hop++) {
|
|
458
|
+
if (pid === null) break;
|
|
459
|
+
const row = readPidmapRow(pidmapDir, pid);
|
|
460
|
+
if (row) {
|
|
461
|
+
const owner = parsePidmapRowOwner(row);
|
|
462
|
+
if (owner && !pidWasRecycled(pid, row)) {
|
|
463
|
+
// A recycled row is about a dead process's tenure of this pid — walk
|
|
464
|
+
// past it like the owner walk does. A live row without a provable
|
|
465
|
+
// token match is the nearest anchor but not a VERIFIED one: stop and
|
|
466
|
+
// report none, so the session env keeps outranking guesses.
|
|
467
|
+
const token = parsePidmapRowStartToken(row);
|
|
468
|
+
if (!token || !pidStartToken(pid)) return null;
|
|
469
|
+
return { owner, platform: parsePidmapRowPlatform(row) };
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
pid = readPpid(pid);
|
|
473
|
+
}
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
|
|
413
477
|
/**
|
|
414
478
|
* Walk our own ppid chain for a pid-map row in ONE given root.
|
|
415
479
|
*
|
|
@@ -524,17 +588,37 @@ function shouldPreferSessionEnv(): boolean {
|
|
|
524
588
|
* Exported for unit testing with an injectable root.
|
|
525
589
|
*/
|
|
526
590
|
export function resolveOwnerBySessionEnv(root: string): string | null {
|
|
591
|
+
return resolveOwnerBySessionEnvDetailed(root)?.owner ?? null;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* `resolveOwnerBySessionEnv` plus WHICH adapter's producer state the session id
|
|
596
|
+
* joined. The caller uses the adapter to tell a same-adapter conflict (the env
|
|
597
|
+
* var is stamped fresh per tool call and outranks a possibly-lagging pid-map
|
|
598
|
+
* row) from a cross-adapter one (the var is inherited context from an outer
|
|
599
|
+
* session and the verified row wins).
|
|
600
|
+
*/
|
|
601
|
+
export function resolveOwnerBySessionEnvDetailed(
|
|
602
|
+
root: string,
|
|
603
|
+
): { owner: string; adapters: string[] } | null {
|
|
527
604
|
const sessionIds = sessionIdsFromEnv();
|
|
528
605
|
if (sessionIds.length === 0) return null;
|
|
529
606
|
const adapters = adapterCandidatesFromEnv();
|
|
530
|
-
const matches = new Set<string
|
|
607
|
+
const matches = new Map<string, Set<string>>();
|
|
531
608
|
for (const sessionId of sessionIds) {
|
|
532
609
|
for (const adapter of adapters) {
|
|
533
610
|
const state = readHookProducerStateV3(root, adapter, sessionId);
|
|
534
|
-
if (state && !state.terminal)
|
|
611
|
+
if (state && !state.terminal) {
|
|
612
|
+
const owner = nativeOwnerForV3Instance(root, state.instance_id);
|
|
613
|
+
const set = matches.get(owner) ?? new Set<string>();
|
|
614
|
+
set.add(adapter);
|
|
615
|
+
matches.set(owner, set);
|
|
616
|
+
}
|
|
535
617
|
}
|
|
536
618
|
}
|
|
537
|
-
|
|
619
|
+
if (matches.size !== 1) return null;
|
|
620
|
+
const [owner, adapterSet] = [...matches.entries()][0]!;
|
|
621
|
+
return { owner, adapters: [...adapterSet] };
|
|
538
622
|
}
|
|
539
623
|
|
|
540
624
|
/**
|