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/hooks/cli.js
CHANGED
|
@@ -16,36 +16,40 @@
|
|
|
16
16
|
* `.harnery/debug/agent-hook.errors.ndjson` for audit but never break the
|
|
17
17
|
* adapter flow.
|
|
18
18
|
*/
|
|
19
|
-
import { spawnSync } from "node:child_process";
|
|
19
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
20
20
|
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
21
21
|
import { dirname, join } from "node:path";
|
|
22
22
|
import { coordEnv } from "../../lib/env.js";
|
|
23
23
|
import { buildInstructionBundle } from "../../lib/instructions/bundle.js";
|
|
24
24
|
import { coordBinPath } from "../agents/coord-bin.js";
|
|
25
|
+
import { resolveCoordRoot } from "../agents/coord-client.js";
|
|
25
26
|
import { classifyWriteClaimFinalization, formatWriteClaimFinalizationDenial, } from "../agents/finalization.js";
|
|
27
|
+
import { restoreLiveCoordinationStateAfterEpochV3 } from "../agents/live-authority-v3.js";
|
|
26
28
|
import { evaluateStopHook, STOP_REMEDIATION_MARKER } from "../agents/rules/stop-hook.js";
|
|
27
|
-
import { assistantTextStartsWithSessionNameBlock, isSessionNameRemediationCommand, sessionNameDisplayInstruction, sessionNameDisplayPending, toolResponseMintedSessionName, } from "../agents/session-name-display.js";
|
|
28
|
-
import { stampSessionNameSeen } from "../agents/state/heartbeat-writer.js";
|
|
29
|
+
import { assistantTextStartsWithSessionNameBlock, isSessionNameRemediationCommand, sessionNameDisplayInstruction, sessionNameDisplayPending, sessionNameDisplayRecoveryInstruction, toolResponseMintedSessionName, } from "../agents/session-name-display.js";
|
|
30
|
+
import { readHeartbeat, stampSessionNameSeen } from "../agents/state/heartbeat-writer.js";
|
|
29
31
|
import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.js";
|
|
32
|
+
import { ensureLiveCoordinationHeartbeat } from "../agents/state/live-coordination-writer.js";
|
|
30
33
|
import { writePidmapRow } from "../agents/state/pidmap.js";
|
|
31
34
|
import { agentsRequireGitFinalization, resolveBinName } from "../config.js";
|
|
32
35
|
import { checkpointContext, completeContextRecovery, extractContextSample, markContextCompactionCompleted, prepareContextRecovery, readContextState, recordContextSample, } from "../context/index.js";
|
|
33
36
|
import { tryWriteLiveDisplayV3 } from "../events/v3/live-feed.js";
|
|
34
|
-
import { recordLiveHookSignalV3, resolveLiveEventLedgerRouteV3, } from "../events/v3/live-routing.js";
|
|
37
|
+
import { liveHookSignalDefersDrainV3, reconcileLivePendingRuntimeContextV3, recordLiveDelegatedChildSessionV3, recordLiveHookSignalV3, resolveLiveEventLedgerRouteV3, } from "../events/v3/live-routing.js";
|
|
35
38
|
import { captureSpanClockV3 } from "../events/v3/span-state.js";
|
|
36
|
-
import { fetchPresence } from "../presence/index.js";
|
|
39
|
+
import { ensureRelayDaemon, fetchPresence, publishPresence } from "../presence/index.js";
|
|
40
|
+
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
|
|
37
41
|
import { stableScopeId } from "../workflow/scope-id.js";
|
|
38
42
|
import { detectAdapter, shouldSkipHookAdapter } from "./adapter/detect.js";
|
|
39
43
|
import { extractBashCommand, extractToolDescription, normalizeEventName, parsePayload, } from "./adapter/parse.js";
|
|
44
|
+
import { discoverCodexSessionTranscript } from "./adapter/runtime-telemetry.js";
|
|
40
45
|
import { codexWslFileLinkTelemetry, inspectCodexWslBridge, isWslUncPath, renderCodexWslFileLinkContext, } from "./codex-wsl-bridge.js";
|
|
41
46
|
import { captureImages, detectPresence, imageJanitor, journalArchive, journalJanitor, journalRecoveryCue, playSound, recordImageArtifactsV3, resetSoundCounters, runSessionSyncExtension, soundForEvent, } from "./effects/index.js";
|
|
42
47
|
import { toolInputHash, toolTargetHash } from "./events/input-hash.js";
|
|
43
48
|
import { canonicalize } from "./guard-path.js";
|
|
44
49
|
import { adapterPidFromEnv, parsePsChainLine, selectAnchorPid } from "./resolve/anchor.js";
|
|
45
|
-
import { findCoordRoot } from "./resolve/coord-root.js";
|
|
46
50
|
import { extractIntentComment, resolveIntent } from "./resolve/intent.js";
|
|
47
51
|
import { resolveOwner } from "./resolve/owner.js";
|
|
48
|
-
import { inspectSessionNameDisplayImmediately,
|
|
52
|
+
import { inspectSessionNameDisplayImmediately, scanAssistantStatusBoxPresent, scanSessionNameDisplayedImmediately, scanStatusBoxPresent, scanTranscriptRuntime, } from "./resolve/transcript.js";
|
|
49
53
|
import { sessionNamePresence } from "./session-name-presence.js";
|
|
50
54
|
import { unsafeCrossShellReason } from "./unsafe-cross-shell.js";
|
|
51
55
|
function parseArgv(argv) {
|
|
@@ -67,6 +71,10 @@ function parseArgv(argv) {
|
|
|
67
71
|
}
|
|
68
72
|
return out;
|
|
69
73
|
}
|
|
74
|
+
function extraArg(extra, name) {
|
|
75
|
+
const index = extra.indexOf(name);
|
|
76
|
+
return index >= 0 ? extra[index + 1] : undefined;
|
|
77
|
+
}
|
|
70
78
|
async function readStdin() {
|
|
71
79
|
if (process.stdin.isTTY)
|
|
72
80
|
return "";
|
|
@@ -92,6 +100,15 @@ function childEnv(coordRoot) {
|
|
|
92
100
|
return { ...process.env, HARNERY_COORD_ROOT_OVERRIDE: coordRoot };
|
|
93
101
|
}
|
|
94
102
|
function appendDebug(coordRoot, entry) {
|
|
103
|
+
if (coordEnv("SHARED_LOGS") !== "0") {
|
|
104
|
+
try {
|
|
105
|
+
processLogger(coordRoot, "agent-hook").debug("agent_hook.diagnostic", legacyLogFields(entry));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
/* fall through to the rollback writer */
|
|
110
|
+
}
|
|
111
|
+
}
|
|
95
112
|
const path = join(coordRoot, ".harnery", "debug", "agent-hook.ndjson");
|
|
96
113
|
try {
|
|
97
114
|
mkdirSync(dirname(path), { recursive: true });
|
|
@@ -104,6 +121,15 @@ function appendDebug(coordRoot, entry) {
|
|
|
104
121
|
function logError(coordRoot, err, context) {
|
|
105
122
|
if (!coordRoot)
|
|
106
123
|
return;
|
|
124
|
+
if (coordEnv("SHARED_LOGS") !== "0") {
|
|
125
|
+
try {
|
|
126
|
+
processLogger(coordRoot, "agent-hook").error("agent_hook.error", legacyLogFields(context), err);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
/* fall through to the rollback writer */
|
|
131
|
+
}
|
|
132
|
+
}
|
|
107
133
|
const path = join(coordRoot, ".harnery", "debug", "agent-hook.errors.ndjson");
|
|
108
134
|
try {
|
|
109
135
|
mkdirSync(dirname(path), { recursive: true });
|
|
@@ -221,7 +247,7 @@ function buildEventData(eventType, ctx) {
|
|
|
221
247
|
// Claude Code's SessionStart payload omits `model` (Codex + Cursor
|
|
222
248
|
// supply it). Fall back to the transcript, populated on `resume`, and
|
|
223
249
|
// backfilled later by `turn.completed` for a fresh startup session.
|
|
224
|
-
model: p?.model ??
|
|
250
|
+
model: p?.model ?? scanTranscriptRuntime(p?.transcript_path)?.model,
|
|
225
251
|
pid: adapterPid,
|
|
226
252
|
source: p?.source,
|
|
227
253
|
platform: adapterPlatform,
|
|
@@ -282,7 +308,7 @@ function buildEventData(eventType, ctx) {
|
|
|
282
308
|
// Backfill the model for adapters that omit it at session.started
|
|
283
309
|
// (Claude Code). The transcript is populated with assistant turns by
|
|
284
310
|
// Stop-hook time, so this resolves even for fresh `startup` sessions.
|
|
285
|
-
model: p?.model ??
|
|
311
|
+
model: p?.model ?? scanTranscriptRuntime(p?.transcript_path)?.model,
|
|
286
312
|
// Phase 2: tool_call_count + text_length aren't cheaply available
|
|
287
313
|
// from the Stop payload alone (they'd require a transcript scan that
|
|
288
314
|
// races with the JSONL flush). Emit `-1` / `0` sentinels and let
|
|
@@ -296,22 +322,25 @@ function buildEventData(eventType, ctx) {
|
|
|
296
322
|
// the verdict now sees because agent-hook emits this turn.completed itself
|
|
297
323
|
// (the previous path passed those via the no-history fail-open).
|
|
298
324
|
status_box_present: scanStatusBoxPresent(p?.transcript_path) || lastAssistantMessage.includes("┌─ agent-"),
|
|
299
|
-
//
|
|
325
|
+
// Assistant-text evidence for the rule-2/3 detector: the loose scan above
|
|
300
326
|
// matches the box prefix ANYWHERE in the transcript tail, including
|
|
301
327
|
// the tool_result row the status command itself writes, so it can
|
|
302
328
|
// report a paste that never happened. The strict variant counts
|
|
303
329
|
// assistant text only (same window, same scanner as the session-name
|
|
304
|
-
// detection).
|
|
305
|
-
//
|
|
306
|
-
|
|
307
|
-
// reconsidered; either way this field decides it with data.
|
|
308
|
-
status_box_present_strict: scanAssistantTextIncludes(p?.transcript_path, "┌─ agent-") ||
|
|
309
|
-
lastAssistantMessage.includes("┌─ agent-"),
|
|
330
|
+
// detection). The Stop verdict enforces this field; the loose field is
|
|
331
|
+
// retained as diagnostic telemetry for the measured detector divergence.
|
|
332
|
+
status_box_present_strict: scanAssistantStatusBoxPresent(p?.transcript_path, lastAssistantMessage),
|
|
310
333
|
// Whether the session's suggested name is satisfied as of this turn,
|
|
311
334
|
// and which name that refers to. Reported on every stop while a name
|
|
312
335
|
// exists (the stop-hook.session_name verdict reads it per turn); the
|
|
313
336
|
// transcript scan itself stops once the name has been sighted.
|
|
314
|
-
...sessionNamePresence(ctx.coordRoot, ctx.instanceId, (name) => scanSessionNameDisplayedImmediately(
|
|
337
|
+
...sessionNamePresence(ctx.coordRoot, ctx.instanceId, (name) => scanSessionNameDisplayedImmediately(
|
|
338
|
+
// Codex stops carry no transcript_path; discover the rollout by
|
|
339
|
+
// session id so the naming ritual can verify and stamp there too.
|
|
340
|
+
p?.transcript_path ??
|
|
341
|
+
(ctx.adapter === "codex"
|
|
342
|
+
? discoverCodexSessionTranscript(p?.session_id ?? ctx.instanceId)
|
|
343
|
+
: undefined), name, assistantTextStartsWithSessionNameBlock)),
|
|
315
344
|
...(fileLinkTelemetry ?? {}),
|
|
316
345
|
stop_hook_active: p?.stop_hook_active,
|
|
317
346
|
};
|
|
@@ -321,7 +350,8 @@ function buildEventData(eventType, ctx) {
|
|
|
321
350
|
// Subagents inherit parent's name via the resolve-name session_id path
|
|
322
351
|
// (agent-coord/state/names.ts → kind=transient). Use the call ID as the
|
|
323
352
|
// instance_id input; assignName falls through to transient.
|
|
324
|
-
const
|
|
353
|
+
const childInstanceId = subagentCallId ?? ctx.instanceId;
|
|
354
|
+
const assigned = assignNameViaAgentCoord(ctx.coordRoot, childInstanceId, "subagent");
|
|
325
355
|
return {
|
|
326
356
|
agent_type: p?.raw.agent_type ??
|
|
327
357
|
p?.raw.subagent_type ??
|
|
@@ -329,7 +359,7 @@ function buildEventData(eventType, ctx) {
|
|
|
329
359
|
prompt_summary: p?.raw.prompt_summary,
|
|
330
360
|
name: assigned?.name,
|
|
331
361
|
kind: "subagent",
|
|
332
|
-
agent_id:
|
|
362
|
+
agent_id: childInstanceId,
|
|
333
363
|
subagent_call_id: subagentCallId,
|
|
334
364
|
parent_session_id: p?.parent_session_id,
|
|
335
365
|
};
|
|
@@ -448,7 +478,7 @@ async function main() {
|
|
|
448
478
|
// `--adapter cursor` dispatch of the same payload carries the session.
|
|
449
479
|
if (shouldSkipHookAdapter(adapter, raw)) {
|
|
450
480
|
if (coordEnv("AGENT_COORD_OFF") !== "1") {
|
|
451
|
-
const coordRoot =
|
|
481
|
+
const coordRoot = resolveCoordRoot(process.cwd());
|
|
452
482
|
if (coordRoot) {
|
|
453
483
|
appendDebug(coordRoot, {
|
|
454
484
|
ts: new Date().toISOString(),
|
|
@@ -472,17 +502,24 @@ async function main() {
|
|
|
472
502
|
if (adapter === "claude-code" && eventName) {
|
|
473
503
|
const s = soundForEvent(eventName);
|
|
474
504
|
if (s) {
|
|
475
|
-
const repoRoot =
|
|
505
|
+
const repoRoot = resolveCoordRoot(process.cwd());
|
|
476
506
|
if (repoRoot) {
|
|
477
507
|
let sid = "";
|
|
508
|
+
let stopContinuation = false;
|
|
478
509
|
try {
|
|
479
510
|
const j = JSON.parse(raw);
|
|
480
511
|
sid = j.session_id ?? j.conversation_id ?? "";
|
|
512
|
+
// A stop with stop_hook_active is a remediation continuation of a
|
|
513
|
+
// turn that already chimed; replaying the sound on every bounce
|
|
514
|
+
// turns a blocked-stop loop into a repeating alarm.
|
|
515
|
+
stopContinuation = eventName === "stop" && j.stop_hook_active === true;
|
|
481
516
|
}
|
|
482
517
|
catch {
|
|
483
518
|
// non-JSON payload: play unkeyed (rate-limit just won't dedup)
|
|
484
519
|
}
|
|
485
|
-
|
|
520
|
+
if (!stopContinuation) {
|
|
521
|
+
playSound(repoRoot, s.sound, sid, s.maxPlays);
|
|
522
|
+
}
|
|
486
523
|
}
|
|
487
524
|
}
|
|
488
525
|
}
|
|
@@ -492,9 +529,12 @@ async function main() {
|
|
|
492
529
|
// bypass during incident triage.
|
|
493
530
|
if (coordEnv("AGENT_COORD_OFF") === "1")
|
|
494
531
|
return 0;
|
|
495
|
-
const coordRoot =
|
|
532
|
+
const coordRoot = resolveCoordRoot(process.cwd());
|
|
496
533
|
if (!coordRoot)
|
|
497
534
|
return 0;
|
|
535
|
+
if (eventName === "runtime-context-retry") {
|
|
536
|
+
return runRuntimeContextRetryWorker(coordRoot, adapter, extra);
|
|
537
|
+
}
|
|
498
538
|
const ledgerRoute = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
499
539
|
// Always log a breadcrumb, useful when an event_type maps to null or owner
|
|
500
540
|
// resolution fails. Stays cheap (one append) and self-prunes via repo log
|
|
@@ -513,6 +553,30 @@ async function main() {
|
|
|
513
553
|
appendDebug(coordRoot, { ...debugBase, skipped: "missing-event-or-adapter" });
|
|
514
554
|
return 0;
|
|
515
555
|
}
|
|
556
|
+
// Cursor's preToolUse `agent_message` is only the current narration before
|
|
557
|
+
// that tool. It is not a transcript and therefore cannot prove that an
|
|
558
|
+
// earlier assistant response omitted the required session-name block.
|
|
559
|
+
// afterAgentResponse is the one native boundary that carries the completed
|
|
560
|
+
// assistant text, so stamp a positive sighting here without retaining or
|
|
561
|
+
// emitting the response body into V3.
|
|
562
|
+
if (adapter === "cursor" && eventName === "after-agent-response") {
|
|
563
|
+
const payload = parsePayload(raw, adapter);
|
|
564
|
+
const owner = resolveOwner({ payload: payload?.raw ?? null, coordRoot });
|
|
565
|
+
if (!owner) {
|
|
566
|
+
appendDebug(coordRoot, { ...debugBase, skipped: "no-owner-resolved" });
|
|
567
|
+
return 0;
|
|
568
|
+
}
|
|
569
|
+
const name = sessionNameDisplayPending(readLiveCoordinationRow(coordRoot, owner.instance_id));
|
|
570
|
+
const text = typeof payload?.raw.text === "string" ? payload.raw.text : "";
|
|
571
|
+
if (name && assistantTextStartsWithSessionNameBlock(text, name)) {
|
|
572
|
+
stampSessionNameSeen(coordRoot, owner.instance_id, name);
|
|
573
|
+
appendDebug(coordRoot, { ...debugBase, effect: "session-name-display-stamped" });
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
appendDebug(coordRoot, { ...debugBase, skipped: "no-session-name-sighting" });
|
|
577
|
+
}
|
|
578
|
+
return 0;
|
|
579
|
+
}
|
|
516
580
|
const norm = normalizeEventName(eventName);
|
|
517
581
|
if (!norm) {
|
|
518
582
|
appendDebug(coordRoot, { ...debugBase, skipped: "non-canonical-event" });
|
|
@@ -532,6 +596,7 @@ async function main() {
|
|
|
532
596
|
return 0;
|
|
533
597
|
}
|
|
534
598
|
const sessionId = payload?.session_id ?? payload?.conversation_id ?? owner.instance_id;
|
|
599
|
+
const priorCoordination = readHeartbeat(coordRoot, owner.instance_id);
|
|
535
600
|
const data = buildEventData(norm.event_type, {
|
|
536
601
|
coordRoot,
|
|
537
602
|
payload,
|
|
@@ -571,6 +636,7 @@ async function main() {
|
|
|
571
636
|
logError(coordRoot, err, { phase: "image-capture" });
|
|
572
637
|
}
|
|
573
638
|
}
|
|
639
|
+
const deferV3Drain = liveHookSignalDefersDrainV3(eventName, coordEnv("EXPERIMENT_DEFER_V3_DRAIN"));
|
|
574
640
|
const v3Result = recordLiveHookSignalV3({
|
|
575
641
|
coordRoot,
|
|
576
642
|
route: ledgerRoute,
|
|
@@ -593,16 +659,60 @@ async function main() {
|
|
|
593
659
|
monotonic_ns: hookClock.monotonic_ns,
|
|
594
660
|
...(stopRemediation ? { stop_remediation: true } : {}),
|
|
595
661
|
...(turnRitual ? { turn_ritual: turnRitual } : {}),
|
|
596
|
-
...(
|
|
662
|
+
...(deferV3Drain ? { defer_drain: true } : {}),
|
|
597
663
|
});
|
|
664
|
+
const recordedGenerationId = v3Result && "event" in v3Result && "generation_id" in v3Result.event.scope
|
|
665
|
+
? v3Result.event.scope.generation_id
|
|
666
|
+
: undefined;
|
|
667
|
+
if (v3Result?.state === "recorded" || v3Result?.state === "already_started") {
|
|
668
|
+
try {
|
|
669
|
+
restoreLiveCoordinationStateAfterEpochV3({
|
|
670
|
+
coordRoot,
|
|
671
|
+
owner: owner.instance_id,
|
|
672
|
+
nativeSessionId: sessionId,
|
|
673
|
+
adapter,
|
|
674
|
+
prior: priorCoordination,
|
|
675
|
+
currentGenerationId: recordedGenerationId,
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
catch (error) {
|
|
679
|
+
logError(coordRoot, error, { phase: "epoch-coordination-restore" });
|
|
680
|
+
}
|
|
681
|
+
}
|
|
598
682
|
const v3EventId = v3Result && "event" in v3Result
|
|
599
683
|
? v3Result.event.event_id
|
|
600
684
|
: v3Result && "event_id" in v3Result
|
|
601
685
|
? v3Result.event_id
|
|
602
686
|
: undefined;
|
|
687
|
+
if (norm.event_type === "agent.started" &&
|
|
688
|
+
payload &&
|
|
689
|
+
v3Result?.state === "recorded" &&
|
|
690
|
+
v3Result.event.event_type === "agent.started") {
|
|
691
|
+
try {
|
|
692
|
+
const childResult = recordLiveDelegatedChildSessionV3({
|
|
693
|
+
coordRoot,
|
|
694
|
+
route: ledgerRoute,
|
|
695
|
+
parentEvent: v3Result.event,
|
|
696
|
+
payload,
|
|
697
|
+
adapter,
|
|
698
|
+
...(adapter === "codex" && isWslUncPath(payload.cwd)
|
|
699
|
+
? { bridge: "codex-wsl" }
|
|
700
|
+
: {}),
|
|
701
|
+
monotonic_ns: hookClock.monotonic_ns,
|
|
702
|
+
});
|
|
703
|
+
const nativeChild = payload.subagent_id ?? payload.agent_id;
|
|
704
|
+
if (nativeChild &&
|
|
705
|
+
(childResult.state === "recorded" || childResult.state === "already_started")) {
|
|
706
|
+
ensureLiveCoordinationHeartbeat(coordRoot, nativeChild, sessionId, adapter, payload.model);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
catch (err) {
|
|
710
|
+
logError(coordRoot, err, { phase: "subagent-child-session-start" });
|
|
711
|
+
}
|
|
712
|
+
}
|
|
603
713
|
if (v3Result?.state === "recorded" && capturedImages.length > 0) {
|
|
604
714
|
try {
|
|
605
|
-
recordImageArtifactsV3(coordRoot, v3Result.event, capturedImages);
|
|
715
|
+
recordImageArtifactsV3(coordRoot, v3Result.event, capturedImages, ledgerRoute.genesis_id);
|
|
606
716
|
}
|
|
607
717
|
catch (err) {
|
|
608
718
|
logError(coordRoot, err, { phase: "image-artifact-observation" });
|
|
@@ -693,6 +803,35 @@ async function main() {
|
|
|
693
803
|
if (adapter === "claude-code")
|
|
694
804
|
journalJanitor(coordRoot);
|
|
695
805
|
imageJanitor(coordRoot);
|
|
806
|
+
// Session start is the only caller of the artifact janitor and the storage
|
|
807
|
+
// maintenance pass, so both load here instead of on every tool call.
|
|
808
|
+
const { autoCleanArtifacts } = await import("../artifacts/index.js");
|
|
809
|
+
const { createAutomaticMaintenanceComposition, runAutomaticMaintenancePass } = await import("../storage/maintenance-providers.js");
|
|
810
|
+
// Effect: throttled daily sweep of expired artifact workspaces (guarded,
|
|
811
|
+
// managed-expired only; see autoCleanArtifacts). Best-effort like every
|
|
812
|
+
// janitor here: a failure logs and never blocks session start.
|
|
813
|
+
try {
|
|
814
|
+
autoCleanArtifacts(coordRoot);
|
|
815
|
+
}
|
|
816
|
+
catch (err) {
|
|
817
|
+
logError(coordRoot, err, { phase: "artifact-auto-clean" });
|
|
818
|
+
}
|
|
819
|
+
// Plan one bounded, claim-first global slice from cached pressure only.
|
|
820
|
+
// Existing owner janitors above remain the only active executors until
|
|
821
|
+
// each provider receives a separate production activation.
|
|
822
|
+
try {
|
|
823
|
+
await runAutomaticMaintenancePass(createAutomaticMaintenanceComposition(coordRoot, {
|
|
824
|
+
journal: () => {
|
|
825
|
+
if (adapter === "claude-code")
|
|
826
|
+
journalJanitor(coordRoot);
|
|
827
|
+
},
|
|
828
|
+
images: () => imageJanitor(coordRoot),
|
|
829
|
+
artifacts: () => autoCleanArtifacts(coordRoot),
|
|
830
|
+
}));
|
|
831
|
+
}
|
|
832
|
+
catch (err) {
|
|
833
|
+
logError(coordRoot, err, { phase: "storage-maintenance-auto" });
|
|
834
|
+
}
|
|
696
835
|
let recovery = null;
|
|
697
836
|
if (payload?.source === "compact") {
|
|
698
837
|
try {
|
|
@@ -719,10 +858,13 @@ async function main() {
|
|
|
719
858
|
catch (err) {
|
|
720
859
|
logError(coordRoot, err, { phase: "session-start-systemMessage" });
|
|
721
860
|
}
|
|
722
|
-
//
|
|
723
|
-
// disposable heartbeat cache.
|
|
861
|
+
// Cross-machine presence is derived from the authority-safe V3 projection,
|
|
862
|
+
// not the disposable heartbeat cache. Announce this session, pull peers,
|
|
863
|
+
// and keep the optional live relay connected.
|
|
724
864
|
try {
|
|
865
|
+
publishPresence(coordRoot);
|
|
725
866
|
fetchPresence(coordRoot);
|
|
867
|
+
ensureRelayDaemon(coordRoot);
|
|
726
868
|
}
|
|
727
869
|
catch (err) {
|
|
728
870
|
logError(coordRoot, err, { phase: "session-start-presence" });
|
|
@@ -743,12 +885,21 @@ async function main() {
|
|
|
743
885
|
journalArchive(coordRoot, owner.instance_id);
|
|
744
886
|
runSessionSyncExtension(coordRoot, true);
|
|
745
887
|
}
|
|
888
|
+
// Publish the post-cleanup V3 projection so remote machines see this
|
|
889
|
+
// session disappear without waiting for the stale window.
|
|
890
|
+
try {
|
|
891
|
+
publishPresence(coordRoot);
|
|
892
|
+
}
|
|
893
|
+
catch (err) {
|
|
894
|
+
logError(coordRoot, err, { phase: "session-end-presence" });
|
|
895
|
+
}
|
|
746
896
|
}
|
|
747
|
-
// Phase 8: SubagentStart:
|
|
748
|
-
//
|
|
749
|
-
//
|
|
897
|
+
// Phase 8: SubagentStart: the child generation was opened above from the
|
|
898
|
+
// native delegation identity. Refresh its disposable projection, log the
|
|
899
|
+
// lifecycle event, and emit a context message announcing the subagent.
|
|
750
900
|
if (norm.event_type === "agent.started") {
|
|
751
901
|
try {
|
|
902
|
+
const childInstanceId = data.agent_id ?? owner.instance_id;
|
|
752
903
|
const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
|
|
753
904
|
if (existsSync(agentCoordBin)) {
|
|
754
905
|
spawnSync(agentCoordBin, ["project"], {
|
|
@@ -758,12 +909,12 @@ async function main() {
|
|
|
758
909
|
});
|
|
759
910
|
spawnSync(agentCoordBin, [
|
|
760
911
|
"log",
|
|
761
|
-
`SUBAGENT_START agent_type=${data.agent_type ?? "unknown"} agent_id=${
|
|
912
|
+
`SUBAGENT_START agent_type=${data.agent_type ?? "unknown"} agent_id=${childInstanceId.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
|
|
762
913
|
"--instance",
|
|
763
|
-
|
|
914
|
+
childInstanceId,
|
|
764
915
|
], { encoding: "utf8", timeout: 2000, env: childEnv(coordRoot) });
|
|
765
916
|
}
|
|
766
|
-
emitSubagentStartContext(coordRoot,
|
|
917
|
+
emitSubagentStartContext(coordRoot, childInstanceId, sessionId, data, adapter);
|
|
767
918
|
}
|
|
768
919
|
catch (err) {
|
|
769
920
|
logError(coordRoot, err, { phase: "subagent-start-project" });
|
|
@@ -772,16 +923,19 @@ async function main() {
|
|
|
772
923
|
// Phase 8: SubagentStop: delete subagent heartbeat + log.
|
|
773
924
|
if (norm.event_type === "agent.completed") {
|
|
774
925
|
try {
|
|
775
|
-
|
|
926
|
+
const childInstanceId = payload?.subagent_id ?? payload?.agent_id ?? owner.instance_id;
|
|
927
|
+
cleanupSessionEnd(coordRoot, childInstanceId, data.reason ?? "unknown");
|
|
776
928
|
const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
|
|
777
929
|
if (existsSync(agentCoordBin)) {
|
|
778
930
|
spawnSync(agentCoordBin, [
|
|
779
931
|
"log",
|
|
780
|
-
`SUBAGENT_STOP agent_id=${
|
|
932
|
+
`SUBAGENT_STOP agent_id=${childInstanceId.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
|
|
781
933
|
"--instance",
|
|
782
|
-
|
|
934
|
+
childInstanceId,
|
|
783
935
|
], { encoding: "utf8", timeout: 2000, env: childEnv(coordRoot) });
|
|
784
936
|
}
|
|
937
|
+
const { reconcileSessionFinalizationV3 } = await import("../agents/session-finalizer-v3.js");
|
|
938
|
+
reconcileSessionFinalizationV3(coordRoot, { archive_observations: [] });
|
|
785
939
|
}
|
|
786
940
|
catch (err) {
|
|
787
941
|
logError(coordRoot, err, { phase: "subagent-stop-cleanup" });
|
|
@@ -841,6 +995,16 @@ async function main() {
|
|
|
841
995
|
if (adapter === "claude-code") {
|
|
842
996
|
runSessionSyncExtension(coordRoot, false);
|
|
843
997
|
}
|
|
998
|
+
// Publish after the canonical turn event has landed so the blob carries
|
|
999
|
+
// current task, activity, and claim state. Re-ensure the relay here because
|
|
1000
|
+
// its daemon intentionally exits when a machine has no live sessions.
|
|
1001
|
+
try {
|
|
1002
|
+
publishPresence(coordRoot);
|
|
1003
|
+
ensureRelayDaemon(coordRoot);
|
|
1004
|
+
}
|
|
1005
|
+
catch (err) {
|
|
1006
|
+
logError(coordRoot, err, { phase: "stop-presence" });
|
|
1007
|
+
}
|
|
844
1008
|
// Stop verdict (V3 ritual + task/status gate). Direct in-process call: the
|
|
845
1009
|
// rule lives in Harnery. agent-hook already emitted this turn.completed
|
|
846
1010
|
// with privacy-safe ritual observations, so the evidence is in the stream.
|
|
@@ -849,16 +1013,41 @@ async function main() {
|
|
|
849
1013
|
instance_id: owner.instance_id,
|
|
850
1014
|
session_id: sessionId,
|
|
851
1015
|
adapter,
|
|
1016
|
+
stop_hook_active: payload?.stop_hook_active === true,
|
|
1017
|
+
status_box_present_strict: data.status_box_present_strict === true,
|
|
852
1018
|
bypass: coordEnv("AGENT_COORD_BYPASS_STOP") === "1",
|
|
853
1019
|
workflow_child: coordEnv("WORKFLOW_CHILD") === "1",
|
|
854
1020
|
});
|
|
855
1021
|
if (!verdict.allow) {
|
|
856
|
-
//
|
|
857
|
-
//
|
|
858
|
-
// `
|
|
859
|
-
//
|
|
860
|
-
|
|
861
|
-
|
|
1022
|
+
// Backstop for sessions whose evidence can never land (e.g. a headless
|
|
1023
|
+
// child whose status command resolves to a different owner): after
|
|
1024
|
+
// `cap` consecutive blocked stops in one cycle, allow the stop instead
|
|
1025
|
+
// of bouncing the model forever. Cycle boundaries come from the
|
|
1026
|
+
// adapter's continuation flag, so adapters without one are unaffected.
|
|
1027
|
+
const { recordRemediationBlock } = await import("./remediation-cap.js");
|
|
1028
|
+
const remediation = recordRemediationBlock(sessionId, payload?.stop_hook_active === true);
|
|
1029
|
+
if (remediation.exceeded) {
|
|
1030
|
+
appendDebug(coordRoot, {
|
|
1031
|
+
...debugBase,
|
|
1032
|
+
skipped: "stop-remediation-cap-exhausted",
|
|
1033
|
+
blocked_rule: verdict.rule,
|
|
1034
|
+
blocked_count: remediation.count,
|
|
1035
|
+
session_id: sessionId,
|
|
1036
|
+
remediation_cycle_anchor: verdict.remediation_cycle_anchor,
|
|
1037
|
+
});
|
|
1038
|
+
}
|
|
1039
|
+
else {
|
|
1040
|
+
// Adapter-aware enforcement channel: Claude Code honors exit-2 + stderr
|
|
1041
|
+
// as a turn block; Cursor ignores exit codes and re-prompts only via a
|
|
1042
|
+
// `followup_message` it auto-submits. Codex returned observe-only above.
|
|
1043
|
+
// emitStopBlock writes the right shape and returns the exit code to use.
|
|
1044
|
+
const { emitStopBlock } = await import("./adapter/output.js");
|
|
1045
|
+
return emitStopBlock(adapter, verdict, coordRoot);
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
else {
|
|
1049
|
+
const { clearRemediationCount } = await import("./remediation-cap.js");
|
|
1050
|
+
clearRemediationCount(sessionId);
|
|
862
1051
|
}
|
|
863
1052
|
// An explicit end requested from inside this turn cannot be authoritative
|
|
864
1053
|
// until the adapter has committed turn.completed above. Reconcile only
|
|
@@ -873,6 +1062,8 @@ async function main() {
|
|
|
873
1062
|
catch (err) {
|
|
874
1063
|
logError(coordRoot, err, { phase: "stop-explicit-session-finalization" });
|
|
875
1064
|
}
|
|
1065
|
+
if (adapter === "codex")
|
|
1066
|
+
scheduleCodexRuntimeContextRetry(coordRoot, sessionId);
|
|
876
1067
|
}
|
|
877
1068
|
// Phase 7: PreToolUse: heartbeat + pid-map self-heal on every tool call.
|
|
878
1069
|
// Adapter-agnostic: both writes have the same shape regardless of who fired.
|
|
@@ -900,10 +1091,13 @@ async function main() {
|
|
|
900
1091
|
// runs before a name exists; every later tool waits until the exact block
|
|
901
1092
|
// is the first assistant text after the mint result. Cursor supplies
|
|
902
1093
|
// agent_message directly; Claude Code and Codex are resolved from their
|
|
903
|
-
// JSONL transcripts.
|
|
904
|
-
//
|
|
1094
|
+
// JSONL transcripts. Cursor's current narration can provide positive
|
|
1095
|
+
// evidence, but cannot disprove an earlier response; afterAgentResponse
|
|
1096
|
+
// stamps that durable sighting. Later commentary must not erase an
|
|
1097
|
+
// already-correct display, and unavailable evidence must not deadlock
|
|
1098
|
+
// every tool.
|
|
905
1099
|
try {
|
|
906
|
-
const displayAllowed = await enforcePendingSessionNameDisplay(coordRoot, owner.instance_id, adapter, payload);
|
|
1100
|
+
const displayAllowed = await enforcePendingSessionNameDisplay(coordRoot, owner.instance_id, adapter, payload, generationBoundHeartbeat(readHeartbeat(coordRoot, owner.instance_id), recordedGenerationId));
|
|
907
1101
|
if (!displayAllowed)
|
|
908
1102
|
return 0;
|
|
909
1103
|
}
|
|
@@ -973,33 +1167,84 @@ async function main() {
|
|
|
973
1167
|
}
|
|
974
1168
|
return 0;
|
|
975
1169
|
}
|
|
976
|
-
|
|
977
|
-
const
|
|
1170
|
+
function scheduleCodexRuntimeContextRetry(coordRoot, nativeSessionId) {
|
|
1171
|
+
const modulePath = process.argv[1];
|
|
1172
|
+
if (!modulePath)
|
|
1173
|
+
return;
|
|
1174
|
+
try {
|
|
1175
|
+
const child = spawn(process.execPath, [modulePath, "runtime-context-retry", "--adapter", "codex", "--session-id", nativeSessionId], {
|
|
1176
|
+
cwd: coordRoot,
|
|
1177
|
+
detached: true,
|
|
1178
|
+
stdio: "ignore",
|
|
1179
|
+
env: childEnv(coordRoot),
|
|
1180
|
+
});
|
|
1181
|
+
child.unref();
|
|
1182
|
+
}
|
|
1183
|
+
catch (err) {
|
|
1184
|
+
logError(coordRoot, err, { phase: "runtime-context-retry-spawn" });
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
async function runRuntimeContextRetryWorker(coordRoot, adapter, extra) {
|
|
1188
|
+
const nativeSessionId = extraArg(extra, "--session-id");
|
|
1189
|
+
if (adapter !== "codex" || !nativeSessionId)
|
|
1190
|
+
return 0;
|
|
1191
|
+
for (const [index, delayMs] of [400, 1_000].entries()) {
|
|
1192
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
1193
|
+
const route = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
1194
|
+
if (route.state !== "v3")
|
|
1195
|
+
return 0;
|
|
1196
|
+
const result = reconcileLivePendingRuntimeContextV3({
|
|
1197
|
+
coordRoot,
|
|
1198
|
+
route,
|
|
1199
|
+
nativeSessionId,
|
|
1200
|
+
finalAttempt: index === 1,
|
|
1201
|
+
});
|
|
1202
|
+
if (result.state !== "pending" && result.state !== "busy")
|
|
1203
|
+
return 0;
|
|
1204
|
+
}
|
|
1205
|
+
return 0;
|
|
1206
|
+
}
|
|
1207
|
+
async function enforcePendingSessionNameDisplay(coordRoot, instanceId, adapter, payload, coordination) {
|
|
1208
|
+
const name = sessionNameDisplayPending(coordination);
|
|
978
1209
|
if (!name)
|
|
979
1210
|
return true;
|
|
980
1211
|
const command = extractBashCommand(payload?.tool_name, payload?.tool_input);
|
|
981
1212
|
if (isSessionNameRemediationCommand(command, resolveBinName(coordRoot)))
|
|
982
1213
|
return true;
|
|
983
|
-
const inspection = payload?.agent_message !== undefined
|
|
1214
|
+
const inspection = adapter === "cursor" && payload?.agent_message !== undefined
|
|
984
1215
|
? {
|
|
985
1216
|
state: assistantTextStartsWithSessionNameBlock(payload.agent_message, name)
|
|
986
1217
|
? "present"
|
|
987
|
-
: "
|
|
988
|
-
}
|
|
989
|
-
: inspectSessionNameDisplayImmediately(
|
|
1218
|
+
: "unavailable",
|
|
1219
|
+
}
|
|
1220
|
+
: inspectSessionNameDisplayImmediately(
|
|
1221
|
+
// Codex hook payloads omit transcript_path on every event, which
|
|
1222
|
+
// left this inspection permanently unavailable and the latch never
|
|
1223
|
+
// stamped. Discover the rollout by session id; the scan only runs
|
|
1224
|
+
// while a name is pending, so the latch closes after one success.
|
|
1225
|
+
payload?.transcript_path ??
|
|
1226
|
+
(adapter === "codex"
|
|
1227
|
+
? discoverCodexSessionTranscript(payload?.session_id ?? instanceId)
|
|
1228
|
+
: undefined), name, assistantTextStartsWithSessionNameBlock);
|
|
990
1229
|
if (inspection.state === "present") {
|
|
991
1230
|
stampSessionNameSeen(coordRoot, instanceId, name);
|
|
992
1231
|
return true;
|
|
993
1232
|
}
|
|
994
1233
|
if (inspection.state === "unavailable") {
|
|
995
|
-
|
|
996
|
-
|
|
1234
|
+
// PostToolUse already delivered the exact block for this mint. An
|
|
1235
|
+
// unavailable transcript cannot become evidence, and repeating a generic
|
|
1236
|
+
// reminder on every tool creates an unbounded Codex loop. Keep the latch
|
|
1237
|
+
// honestly pending and fail open without another instruction. A later
|
|
1238
|
+
// readable transcript can still verify it.
|
|
997
1239
|
return true;
|
|
998
1240
|
}
|
|
999
1241
|
const { emitDeny } = await import("./adapter/output.js");
|
|
1000
|
-
emitDeny(adapter,
|
|
1242
|
+
emitDeny(adapter, sessionNameDisplayRecoveryInstruction(name, resolveBinName(coordRoot)));
|
|
1001
1243
|
return false;
|
|
1002
1244
|
}
|
|
1245
|
+
function generationBoundHeartbeat(heartbeat, generationId) {
|
|
1246
|
+
return generationId && heartbeat?.v3_generation_id === generationId ? heartbeat : null;
|
|
1247
|
+
}
|
|
1003
1248
|
async function runPreToolUseGuard(coordRoot, instanceId, sessionId, data, adapter) {
|
|
1004
1249
|
const toolName = data.tool_name ?? "";
|
|
1005
1250
|
const rawTargets = collectGuardTargets(toolName, data);
|
|
@@ -1322,17 +1567,25 @@ async function emitUserPromptSubmitSystemMessage(coordRoot, instanceId, sessionI
|
|
|
1322
1567
|
// Every human-facing adapter gets the first-session naming reminder from
|
|
1323
1568
|
// the shared hook path. Cursor + Codex additionally get ongoing set-task
|
|
1324
1569
|
// staleness nudges; Claude Code enforces those via its Stop transcript.
|
|
1570
|
+
// Codex also gets the optional project-owned prompt reminder. Claude Code
|
|
1571
|
+
// already has native output-style reminders, so duplicating it would add
|
|
1572
|
+
// noise. Cursor's current beforeSubmitPrompt output can allow or block but
|
|
1573
|
+
// cannot inject model context; an Always Apply rule is its durable carrier.
|
|
1574
|
+
// Only the boolean route travels through argv, never the host's text.
|
|
1575
|
+
if (adapter === "codex")
|
|
1576
|
+
args.push("--host-prompt-reminder");
|
|
1325
1577
|
// Codex gets a fresh status-footer reminder on every prompt. Its Stop hook
|
|
1326
1578
|
// stays observe-only, so missing the footer never replaces the answer.
|
|
1327
|
-
// Claude Code
|
|
1328
|
-
//
|
|
1329
|
-
//
|
|
1579
|
+
// Claude Code gets a fresh per-turn ritual reminder: satisfying the
|
|
1580
|
+
// contract up front is far cheaper than the bounce-and-retry the Stop hook
|
|
1581
|
+
// otherwise forces. Cursor's beforeSubmitPrompt cannot inject context, so
|
|
1582
|
+
// its Stop follow-up remains the supported enforcement channel.
|
|
1330
1583
|
args.push("--session-name-nudge");
|
|
1331
1584
|
if (adapter === "cursor" || adapter === "codex")
|
|
1332
1585
|
args.push("--task-nudge");
|
|
1333
1586
|
if (adapter === "codex")
|
|
1334
1587
|
args.push("--status-footer-nudge");
|
|
1335
|
-
if (adapter === "claude-code"
|
|
1588
|
+
if (adapter === "claude-code")
|
|
1336
1589
|
args.push("--turn-ritual-nudge", adapter);
|
|
1337
1590
|
const result = spawnSync(agentCoordBin, args, { encoding: "utf8", timeout: 3000 });
|
|
1338
1591
|
if (result.status === 0 && result.stdout)
|
|
@@ -1468,11 +1721,15 @@ function completeRecoveryInjection(coordRoot, instanceId, sessionId, recovery) {
|
|
|
1468
1721
|
void recovery;
|
|
1469
1722
|
}
|
|
1470
1723
|
main()
|
|
1471
|
-
.then((code) =>
|
|
1472
|
-
|
|
1473
|
-
|
|
1724
|
+
.then(async (code) => {
|
|
1725
|
+
await closeProcessLoggers();
|
|
1726
|
+
process.exit(code);
|
|
1727
|
+
})
|
|
1728
|
+
.catch(async (err) => {
|
|
1729
|
+
logError(resolveCoordRoot(process.cwd()), err, {
|
|
1474
1730
|
argv: process.argv.slice(2),
|
|
1475
1731
|
pid: process.pid,
|
|
1476
1732
|
});
|
|
1733
|
+
await closeProcessLoggers();
|
|
1477
1734
|
process.exit(0);
|
|
1478
1735
|
});
|