harnery 0.35.0 → 0.37.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 +128 -96
- package/dist/commands/agents.d.ts +23 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +464 -242
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +26 -1
- 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 +16 -4
- 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/deinit.d.ts.map +1 -1
- package/dist/commands/deinit.js +5 -0
- package/dist/commands/diagnostics.d.ts +4 -0
- package/dist/commands/diagnostics.d.ts.map +1 -0
- package/dist/commands/diagnostics.js +229 -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/fetch.js +6 -5
- package/dist/commands/files.d.ts +34 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +166 -0
- package/dist/commands/governor.d.ts.map +1 -1
- package/dist/commands/governor.js +18 -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 +417 -2
- 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/qa-run.d.ts +4 -0
- package/dist/commands/qa-run.d.ts.map +1 -0
- package/dist/commands/qa-run.js +141 -0
- 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/resources.d.ts +4 -0
- package/dist/commands/resources.d.ts.map +1 -0
- package/dist/commands/resources.js +29 -0
- package/dist/commands/semantic.d.ts.map +1 -1
- package/dist/commands/semantic.js +54 -2
- 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/supervisor.d.ts +4 -0
- package/dist/commands/supervisor.d.ts.map +1 -0
- package/dist/commands/supervisor.js +101 -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.d.ts.map +1 -1
- package/dist/commands/workflow.js +17 -13
- package/dist/core/adapters/profiles.d.ts +1 -1
- package/dist/core/agents/cli.js +215 -41
- package/dist/core/agents/health.d.ts +17 -0
- package/dist/core/agents/health.d.ts.map +1 -0
- package/dist/core/agents/health.js +109 -0
- 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 +244 -10
- package/dist/core/agents/live-lifecycle-v3.js +6 -1
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
- package/dist/core/agents/live-observation-v3.js +6 -1
- package/dist/core/agents/mailbox.d.ts +92 -0
- package/dist/core/agents/mailbox.d.ts.map +1 -0
- package/dist/core/agents/mailbox.js +325 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts +44 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts.map +1 -0
- package/dist/core/agents/reconcile-coordination-v3.js +58 -0
- package/dist/core/agents/render/prompt-context.d.ts +14 -3
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +54 -16
- package/dist/core/agents/render/session-context.d.ts +8 -0
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +34 -3
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +50 -1
- 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 +93 -16
- 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 +9 -2
- 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-writer.d.ts +6 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +18 -0
- package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +15 -90
- 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/artifacts/index.d.ts +47 -1
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +191 -6
- package/dist/core/config.d.ts +74 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +141 -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/diagnostics/advice.d.ts +9 -0
- package/dist/core/diagnostics/advice.d.ts.map +1 -0
- package/dist/core/diagnostics/advice.js +112 -0
- package/dist/core/diagnostics/bundle.d.ts +35 -0
- package/dist/core/diagnostics/bundle.d.ts.map +1 -0
- package/dist/core/diagnostics/bundle.js +874 -0
- package/dist/core/diagnostics/comparison.d.ts +5 -0
- package/dist/core/diagnostics/comparison.d.ts.map +1 -0
- package/dist/core/diagnostics/comparison.js +444 -0
- package/dist/core/diagnostics/contract.d.ts +245 -0
- package/dist/core/diagnostics/contract.d.ts.map +1 -0
- package/dist/core/diagnostics/contract.js +18 -0
- package/dist/core/diagnostics/identity.d.ts +3 -0
- package/dist/core/diagnostics/identity.d.ts.map +1 -0
- package/dist/core/diagnostics/identity.js +10 -0
- package/dist/core/diagnostics/index.d.ts +8 -0
- package/dist/core/diagnostics/index.d.ts.map +1 -0
- package/dist/core/diagnostics/index.js +7 -0
- package/dist/core/diagnostics/replay.d.ts +8 -0
- package/dist/core/diagnostics/replay.d.ts.map +1 -0
- package/dist/core/diagnostics/replay.js +213 -0
- package/dist/core/diagnostics/sanitize.d.ts +9 -0
- package/dist/core/diagnostics/sanitize.d.ts.map +1 -0
- package/dist/core/diagnostics/sanitize.js +84 -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/compression.d.ts +13 -0
- package/dist/core/events/legacy-storage/compression.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/compression.js +107 -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 +7 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/index.js +6 -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/archive-retention.d.ts +33 -0
- package/dist/core/events/v3/archive-retention.d.ts.map +1 -0
- package/dist/core/events/v3/archive-retention.js +195 -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 +81 -41
- package/dist/core/events/v3/base-contract.d.ts.map +1 -1
- package/dist/core/events/v3/base-contract.js +17 -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 +1 -1
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +4 -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 +5 -2
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +4 -1
- 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 +13 -21
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +46 -41
- 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 +76 -10
- 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 +1 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +14 -3
- package/dist/core/events/v3/producers/intake.d.ts +7 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +26 -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 +71 -1
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +441 -25
- 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 +6 -5
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
- 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 +14 -8
- 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 +12 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +23 -5
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
- package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
- package/dist/core/hooks/cli.js +380 -207
- 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/health.d.ts +59 -0
- package/dist/core/hooks/health.d.ts.map +1 -0
- package/dist/core/hooks/health.js +84 -0
- package/dist/core/hooks/remediation-cap.d.ts +8 -3
- package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
- package/dist/core/hooks/remediation-cap.js +3 -11
- 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 +8 -0
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +11 -0
- 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/resources/contract.d.ts +90 -0
- package/dist/core/resources/contract.d.ts.map +1 -0
- package/dist/core/resources/contract.js +2 -0
- package/dist/core/resources/index.d.ts +6 -0
- package/dist/core/resources/index.d.ts.map +1 -0
- package/dist/core/resources/index.js +5 -0
- package/dist/core/resources/sampler.d.ts +27 -0
- package/dist/core/resources/sampler.d.ts.map +1 -0
- package/dist/core/resources/sampler.js +357 -0
- package/dist/core/resources/service-status.d.ts +3 -0
- package/dist/core/resources/service-status.d.ts.map +1 -0
- package/dist/core/resources/service-status.js +48 -0
- package/dist/core/resources/service.d.ts +26 -0
- package/dist/core/resources/service.d.ts.map +1 -0
- package/dist/core/resources/service.js +292 -0
- package/dist/core/resources/storage.d.ts +13 -0
- package/dist/core/resources/storage.d.ts.map +1 -0
- package/dist/core/resources/storage.js +30 -0
- package/dist/core/semantic/adapters.d.ts +11 -8
- package/dist/core/semantic/adapters.d.ts.map +1 -1
- package/dist/core/semantic/adapters.js +169 -31
- package/dist/core/semantic/contract.d.ts +532 -48
- package/dist/core/semantic/contract.d.ts.map +1 -1
- package/dist/core/semantic/contract.js +104 -3
- package/dist/core/semantic/index.d.ts +7 -3
- package/dist/core/semantic/index.d.ts.map +1 -1
- package/dist/core/semantic/index.js +7 -3
- package/dist/core/semantic/once.d.ts +6 -1
- package/dist/core/semantic/once.d.ts.map +1 -1
- package/dist/core/semantic/once.js +80 -9
- package/dist/core/semantic/prompt.d.ts.map +1 -1
- package/dist/core/semantic/prompt.js +14 -1
- 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 +14 -3
- package/dist/core/semantic/scheduler.d.ts.map +1 -1
- package/dist/core/semantic/scheduler.js +30 -6
- package/dist/core/semantic/service-status.d.ts +20 -0
- package/dist/core/semantic/service-status.d.ts.map +1 -1
- package/dist/core/semantic/service-status.js +60 -4
- package/dist/core/semantic/service.d.ts +1 -0
- package/dist/core/semantic/service.d.ts.map +1 -1
- package/dist/core/semantic/service.js +104 -15
- 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 +11 -1
- package/dist/core/semantic/storage.d.ts.map +1 -1
- package/dist/core/semantic/storage.js +4 -3
- 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 +3 -1
- package/dist/core/semantic/validate.d.ts.map +1 -1
- package/dist/core/semantic/validate.js +34 -1
- package/dist/core/storage/atomic-json.d.ts +3 -0
- package/dist/core/storage/atomic-json.d.ts.map +1 -0
- package/dist/core/storage/atomic-json.js +15 -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 +722 -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 +84 -0
- package/dist/core/storage/logger.d.ts.map +1 -0
- package/dist/core/storage/logger.js +413 -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 +48 -0
- package/dist/core/storage/query.d.ts.map +1 -0
- package/dist/core/storage/query.js +346 -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/supervisor/activity.d.ts +4 -0
- package/dist/core/supervisor/activity.d.ts.map +1 -0
- package/dist/core/supervisor/activity.js +141 -0
- package/dist/core/supervisor/contract.d.ts +268 -0
- package/dist/core/supervisor/contract.d.ts.map +1 -0
- package/dist/core/supervisor/contract.js +35 -0
- package/dist/core/supervisor/explanations.d.ts +4 -0
- package/dist/core/supervisor/explanations.d.ts.map +1 -0
- package/dist/core/supervisor/explanations.js +71 -0
- package/dist/core/supervisor/findings.d.ts +20 -0
- package/dist/core/supervisor/findings.d.ts.map +1 -0
- package/dist/core/supervisor/findings.js +399 -0
- package/dist/core/supervisor/history.d.ts +9 -0
- package/dist/core/supervisor/history.d.ts.map +1 -0
- package/dist/core/supervisor/history.js +46 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts +14 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-alerts.js +70 -0
- package/dist/core/supervisor/hook-health-storage.d.ts +5 -0
- package/dist/core/supervisor/hook-health-storage.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-storage.js +24 -0
- package/dist/core/supervisor/hook-health.d.ts +72 -0
- package/dist/core/supervisor/hook-health.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health.js +203 -0
- package/dist/core/supervisor/hooks.d.ts +10 -0
- package/dist/core/supervisor/hooks.d.ts.map +1 -0
- package/dist/core/supervisor/hooks.js +28 -0
- package/dist/core/supervisor/index.d.ts +15 -0
- package/dist/core/supervisor/index.d.ts.map +1 -0
- package/dist/core/supervisor/index.js +14 -0
- package/dist/core/supervisor/log-feed.d.ts +9 -0
- package/dist/core/supervisor/log-feed.d.ts.map +1 -0
- package/dist/core/supervisor/log-feed.js +103 -0
- package/dist/core/supervisor/service.d.ts +29 -0
- package/dist/core/supervisor/service.d.ts.map +1 -0
- package/dist/core/supervisor/service.js +450 -0
- package/dist/core/supervisor/services.d.ts +11 -0
- package/dist/core/supervisor/services.d.ts.map +1 -0
- package/dist/core/supervisor/services.js +155 -0
- package/dist/core/supervisor/status.d.ts +3 -0
- package/dist/core/supervisor/status.d.ts.map +1 -0
- package/dist/core/supervisor/status.js +48 -0
- package/dist/core/supervisor/storage.d.ts +30 -0
- package/dist/core/supervisor/storage.d.ts.map +1 -0
- package/dist/core/supervisor/storage.js +73 -0
- package/dist/core/supervisor/timeline.d.ts +3 -0
- package/dist/core/supervisor/timeline.d.ts.map +1 -0
- package/dist/core/supervisor/timeline.js +87 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +10 -14
- package/dist/core/workflow/admission.d.ts +23 -0
- package/dist/core/workflow/admission.d.ts.map +1 -0
- package/dist/core/workflow/admission.js +136 -0
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +77 -2
- package/dist/core/workflow/index.d.ts +3 -2
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/index.js +2 -1
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -1
- package/dist/core/workflow/proof.d.ts +2 -1
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +39 -1
- package/dist/core/workflow/run-state.d.ts +3 -2
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +8 -1
- package/dist/core/workflow/types.d.ts +33 -1
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/types.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 +5 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +1 -0
- package/dist/lib/browser/index.d.ts +2 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -0
- package/dist/lib/browser/qa-run-contracts.d.ts +173 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -0
- package/dist/lib/browser/qa-run-contracts.js +226 -0
- package/dist/lib/browser/qa-run.d.ts +51 -0
- package/dist/lib/browser/qa-run.d.ts.map +1 -0
- package/dist/lib/browser/qa-run.js +684 -0
- package/dist/lib/coord-root-id.d.ts +9 -0
- package/dist/lib/coord-root-id.d.ts.map +1 -0
- package/dist/lib/coord-root-id.js +17 -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 +3 -1
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +74 -3
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +11 -0
- 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 +40 -2
- package/schemas/config.schema.json +58 -0
- package/schemas/event-v3.schema.json +324 -112
- package/src/commander.ts +488 -95
- package/src/commands/agents.ts +617 -237
- package/src/commands/artifacts.ts +40 -2
- package/src/commands/backup.ts +18 -14
- package/src/commands/browse-session.ts +12 -0
- package/src/commands/browse.ts +21 -7
- package/src/commands/conversations.ts +279 -0
- package/src/commands/deinit.ts +6 -0
- package/src/commands/diagnostics.ts +271 -0
- package/src/commands/docs.ts +25 -6
- package/src/commands/doctor.ts +75 -9
- package/src/commands/fetch.ts +7 -6
- package/src/commands/files.ts +243 -0
- package/src/commands/governor.ts +21 -12
- package/src/commands/inbox.ts +61 -0
- package/src/commands/init.ts +78 -16
- package/src/commands/ledger-v3.ts +503 -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/qa-run.ts +184 -0
- package/src/commands/read.ts +6 -2
- package/src/commands/resources.ts +38 -0
- package/src/commands/semantic.ts +66 -1
- package/src/commands/storage.ts +310 -0
- package/src/commands/supervisor.ts +141 -0
- package/src/commands/tunnel.ts +66 -52
- package/src/commands/web.ts +96 -7
- package/src/commands/work.ts +3 -3
- package/src/commands/workflow.ts +21 -13
- package/src/core/agents/cli.ts +265 -55
- package/src/core/agents/health.ts +142 -0
- package/src/core/agents/live-authority-v3.ts +341 -10
- package/src/core/agents/live-lifecycle-v3.ts +6 -1
- package/src/core/agents/live-observation-v3.ts +6 -1
- package/src/core/agents/mailbox.ts +373 -0
- package/src/core/agents/reconcile-coordination-v3.ts +77 -0
- package/src/core/agents/render/prompt-context.ts +66 -15
- package/src/core/agents/render/session-context.ts +37 -3
- package/src/core/agents/rules/commit-conflict.ts +58 -1
- package/src/core/agents/rules/stop-hook.ts +105 -20
- 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 +8 -2
- package/src/core/agents/state/activity-log.ts +7 -2
- package/src/core/agents/state/heartbeat-writer.ts +27 -0
- package/src/core/agents/state/live-coordination-view.ts +16 -105
- package/src/core/agents/state/live-coordination-writer.ts +141 -0
- package/src/core/artifacts/index.ts +260 -11
- package/src/core/config.ts +235 -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/diagnostics/advice.ts +147 -0
- package/src/core/diagnostics/bundle.ts +1142 -0
- package/src/core/diagnostics/comparison.ts +565 -0
- package/src/core/diagnostics/contract.ts +311 -0
- package/src/core/diagnostics/identity.ts +11 -0
- package/src/core/diagnostics/index.ts +7 -0
- package/src/core/diagnostics/replay.ts +314 -0
- package/src/core/diagnostics/sanitize.ts +97 -0
- package/src/core/events/legacy-storage/canary.ts +177 -0
- package/src/core/events/legacy-storage/compression.ts +130 -0
- package/src/core/events/legacy-storage/fence.ts +129 -0
- package/src/core/events/legacy-storage/index.ts +6 -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/archive-retention.ts +251 -0
- package/src/core/events/v3/authority-outbox.ts +22 -1
- package/src/core/events/v3/base-contract.ts +17 -7
- package/src/core/events/v3/bootstrap.ts +195 -2
- package/src/core/events/v3/capabilities.ts +5 -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 +14 -2
- package/src/core/events/v3/live-route-observer.ts +80 -0
- package/src/core/events/v3/live-routing.ts +65 -46
- package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
- package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
- package/src/core/events/v3/producers/hook-base.ts +15 -3
- package/src/core/events/v3/producers/intake.ts +31 -2
- package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
- package/src/core/events/v3/producers/recorder.ts +681 -34
- 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 +14 -8
- 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 +58 -7
- 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 +23 -5
- package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
- package/src/core/hooks/cli.ts +404 -233
- package/src/core/hooks/effects/image-capture.ts +4 -1
- package/src/core/hooks/health.ts +146 -0
- package/src/core/hooks/remediation-cap.ts +12 -6
- 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 +18 -0
- 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/resources/contract.ts +98 -0
- package/src/core/resources/index.ts +5 -0
- package/src/core/resources/sampler.ts +458 -0
- package/src/core/resources/service-status.ts +62 -0
- package/src/core/resources/service.ts +337 -0
- package/src/core/resources/storage.ts +44 -0
- package/src/core/semantic/adapters.ts +200 -41
- package/src/core/semantic/contract.ts +135 -3
- package/src/core/semantic/index.ts +76 -2
- package/src/core/semantic/once.ts +93 -7
- package/src/core/semantic/prompt.ts +13 -1
- package/src/core/semantic/review.ts +803 -0
- package/src/core/semantic/routes.ts +30 -0
- package/src/core/semantic/scheduler.ts +49 -5
- package/src/core/semantic/service-status.ts +99 -5
- package/src/core/semantic/service.ts +116 -15
- package/src/core/semantic/soak.ts +638 -0
- package/src/core/semantic/storage.ts +20 -6
- package/src/core/semantic/usage.ts +272 -0
- package/src/core/semantic/validate.ts +31 -0
- package/src/core/storage/atomic-json.ts +15 -0
- package/src/core/storage/buffer.ts +124 -0
- package/src/core/storage/builtins.ts +972 -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 +548 -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 +418 -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/supervisor/activity.ts +193 -0
- package/src/core/supervisor/contract.ts +312 -0
- package/src/core/supervisor/explanations.ts +104 -0
- package/src/core/supervisor/findings.ts +788 -0
- package/src/core/supervisor/history.ts +61 -0
- package/src/core/supervisor/hook-health-alerts.ts +108 -0
- package/src/core/supervisor/hook-health-storage.ts +25 -0
- package/src/core/supervisor/hook-health.ts +301 -0
- package/src/core/supervisor/hooks.ts +35 -0
- package/src/core/supervisor/index.ts +14 -0
- package/src/core/supervisor/log-feed.ts +131 -0
- package/src/core/supervisor/service.ts +511 -0
- package/src/core/supervisor/services.ts +203 -0
- package/src/core/supervisor/status.ts +59 -0
- package/src/core/supervisor/storage.ts +126 -0
- package/src/core/supervisor/timeline.ts +133 -0
- package/src/core/work/state.ts +12 -21
- package/src/core/workflow/admission.ts +215 -0
- package/src/core/workflow/engine.ts +93 -1
- package/src/core/workflow/index.ts +10 -0
- package/src/core/workflow/live-session-v3.ts +2 -4
- package/src/core/workflow/proof.ts +54 -1
- package/src/core/workflow/run-state.ts +13 -1
- package/src/core/workflow/types.ts +39 -1
- package/src/index.ts +2 -0
- package/src/lazy-commands.ts +294 -0
- package/src/lib/browser/client.ts +6 -0
- package/src/lib/browser/index.ts +29 -0
- package/src/lib/browser/qa-run-contracts.ts +380 -0
- package/src/lib/browser/qa-run.ts +784 -0
- package/src/lib/coord-root-id.ts +23 -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 +81 -2
- package/src/lib/instructions/templates.ts +11 -0
- package/src/lib/local-file-url.ts +31 -0
- package/src/lib/web-performance.ts +335 -0
package/src/core/hooks/cli.ts
CHANGED
|
@@ -17,19 +17,23 @@
|
|
|
17
17
|
* adapter flow.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import { spawnSync } from "node:child_process";
|
|
20
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
21
21
|
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
22
22
|
import { dirname, join } from "node:path";
|
|
23
23
|
import { coordEnv } from "../../lib/env.ts";
|
|
24
24
|
import { buildInstructionBundle } from "../../lib/instructions/bundle.ts";
|
|
25
25
|
import type { Adapter } from "../adapter.ts";
|
|
26
|
-
import {
|
|
26
|
+
import { resolveCoordRoot } from "../agents/coord-client.ts";
|
|
27
27
|
import {
|
|
28
28
|
type ClaimFinalizationDecision,
|
|
29
29
|
type ClaimFinalizationDescriptor,
|
|
30
30
|
classifyWriteClaimFinalization,
|
|
31
31
|
formatWriteClaimFinalizationDenial,
|
|
32
32
|
} from "../agents/finalization.ts";
|
|
33
|
+
import {
|
|
34
|
+
recordLiveClaimChangeV3,
|
|
35
|
+
restoreLiveCoordinationStateAfterEpochV3,
|
|
36
|
+
} from "../agents/live-authority-v3.ts";
|
|
33
37
|
import { evaluateStopHook, STOP_REMEDIATION_MARKER } from "../agents/rules/stop-hook.ts";
|
|
34
38
|
import {
|
|
35
39
|
assistantTextStartsWithSessionNameBlock,
|
|
@@ -39,11 +43,11 @@ import {
|
|
|
39
43
|
sessionNameDisplayRecoveryInstruction,
|
|
40
44
|
toolResponseMintedSessionName,
|
|
41
45
|
} from "../agents/session-name-display.ts";
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
} from "../agents/state/
|
|
46
|
+
import type { Heartbeat } from "../agents/state/heartbeat-reader.ts";
|
|
47
|
+
import { readHeartbeat, stampSessionNameSeen } from "../agents/state/heartbeat-writer.ts";
|
|
48
|
+
import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.ts";
|
|
49
|
+
import { ensureLiveCoordinationHeartbeat } from "../agents/state/live-coordination-writer.ts";
|
|
50
|
+
import { assignName } from "../agents/state/names.ts";
|
|
47
51
|
import { writePidmapRow } from "../agents/state/pidmap.ts";
|
|
48
52
|
import { agentsRequireGitFinalization, resolveBinName } from "../config.ts";
|
|
49
53
|
import {
|
|
@@ -59,12 +63,14 @@ import {
|
|
|
59
63
|
import { tryWriteLiveDisplayV3 } from "../events/v3/live-feed.ts";
|
|
60
64
|
import {
|
|
61
65
|
liveHookSignalDefersDrainV3,
|
|
66
|
+
reconcileLivePendingRuntimeContextV3,
|
|
62
67
|
recordLiveDelegatedChildSessionV3,
|
|
63
68
|
recordLiveHookSignalV3,
|
|
64
69
|
resolveLiveEventLedgerRouteV3,
|
|
65
70
|
} from "../events/v3/live-routing.ts";
|
|
66
71
|
import { captureSpanClockV3 } from "../events/v3/span-state.ts";
|
|
67
|
-
import { fetchPresence } from "../presence/index.ts";
|
|
72
|
+
import { ensureRelayDaemon, fetchPresence, publishPresence } from "../presence/index.ts";
|
|
73
|
+
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.ts";
|
|
68
74
|
import { stableScopeId } from "../workflow/scope-id.ts";
|
|
69
75
|
import { detectAdapter, shouldSkipHookAdapter } from "./adapter/detect.ts";
|
|
70
76
|
import {
|
|
@@ -97,13 +103,19 @@ import {
|
|
|
97
103
|
} from "./effects/index.ts";
|
|
98
104
|
import { toolInputHash, toolTargetHash } from "./events/input-hash.ts";
|
|
99
105
|
import { canonicalize } from "./guard-path.ts";
|
|
106
|
+
import {
|
|
107
|
+
beginHookHealth,
|
|
108
|
+
type HookHealthState,
|
|
109
|
+
observeHookDebug,
|
|
110
|
+
observeHookError,
|
|
111
|
+
writeHookHealthCompletion,
|
|
112
|
+
} from "./health.ts";
|
|
100
113
|
import { adapterPidFromEnv, parsePsChainLine, selectAnchorPid } from "./resolve/anchor.ts";
|
|
101
|
-
import { findCoordRoot } from "./resolve/coord-root.ts";
|
|
102
114
|
import { extractIntentComment, resolveIntent } from "./resolve/intent.ts";
|
|
103
115
|
import { resolveOwner } from "./resolve/owner.ts";
|
|
104
116
|
import {
|
|
105
117
|
inspectSessionNameDisplayImmediately,
|
|
106
|
-
|
|
118
|
+
scanAssistantStatusBoxPresent,
|
|
107
119
|
scanSessionNameDisplayedImmediately,
|
|
108
120
|
scanStatusBoxPresent,
|
|
109
121
|
scanTranscriptRuntime,
|
|
@@ -116,6 +128,8 @@ interface Argv {
|
|
|
116
128
|
extra: string[];
|
|
117
129
|
}
|
|
118
130
|
|
|
131
|
+
let hookHealthState: HookHealthState | undefined;
|
|
132
|
+
|
|
119
133
|
function parseArgv(argv: string[]): Argv {
|
|
120
134
|
const out: Argv = { eventName: null, extra: [] };
|
|
121
135
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -134,6 +148,11 @@ function parseArgv(argv: string[]): Argv {
|
|
|
134
148
|
return out;
|
|
135
149
|
}
|
|
136
150
|
|
|
151
|
+
function extraArg(extra: string[], name: string): string | undefined {
|
|
152
|
+
const index = extra.indexOf(name);
|
|
153
|
+
return index >= 0 ? extra[index + 1] : undefined;
|
|
154
|
+
}
|
|
155
|
+
|
|
137
156
|
async function readStdin(): Promise<string> {
|
|
138
157
|
if (process.stdin.isTTY) return "";
|
|
139
158
|
try {
|
|
@@ -148,17 +167,24 @@ async function readStdin(): Promise<string> {
|
|
|
148
167
|
}
|
|
149
168
|
|
|
150
169
|
/**
|
|
151
|
-
* Env for
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* without the pin a child could write state to a different .harnery than the
|
|
155
|
-
* one this hook resolved.
|
|
170
|
+
* Env for a detached hook retry worker, with the coord root pinned. The hook
|
|
171
|
+
* may run with the session shell's cwd (inside a submodule or journal dir), so
|
|
172
|
+
* the worker must retain the root this process already resolved.
|
|
156
173
|
*/
|
|
157
174
|
function childEnv(coordRoot: string): NodeJS.ProcessEnv {
|
|
158
175
|
return { ...process.env, HARNERY_COORD_ROOT_OVERRIDE: coordRoot };
|
|
159
176
|
}
|
|
160
177
|
|
|
161
178
|
function appendDebug(coordRoot: string, entry: Record<string, unknown>): void {
|
|
179
|
+
observeHookDebug(hookHealthState, entry);
|
|
180
|
+
if (coordEnv("SHARED_LOGS") !== "0") {
|
|
181
|
+
try {
|
|
182
|
+
processLogger(coordRoot, "agent-hook").debug("agent_hook.diagnostic", legacyLogFields(entry));
|
|
183
|
+
return;
|
|
184
|
+
} catch {
|
|
185
|
+
/* fall through to the rollback writer */
|
|
186
|
+
}
|
|
187
|
+
}
|
|
162
188
|
const path = join(coordRoot, ".harnery", "debug", "agent-hook.ndjson");
|
|
163
189
|
try {
|
|
164
190
|
mkdirSync(dirname(path), { recursive: true });
|
|
@@ -169,7 +195,20 @@ function appendDebug(coordRoot: string, entry: Record<string, unknown>): void {
|
|
|
169
195
|
}
|
|
170
196
|
|
|
171
197
|
function logError(coordRoot: string | null, err: unknown, context: Record<string, unknown>): void {
|
|
198
|
+
observeHookError(hookHealthState, context.phase);
|
|
172
199
|
if (!coordRoot) return;
|
|
200
|
+
if (coordEnv("SHARED_LOGS") !== "0") {
|
|
201
|
+
try {
|
|
202
|
+
processLogger(coordRoot, "agent-hook").error(
|
|
203
|
+
"agent_hook.error",
|
|
204
|
+
legacyLogFields(context),
|
|
205
|
+
err,
|
|
206
|
+
);
|
|
207
|
+
return;
|
|
208
|
+
} catch {
|
|
209
|
+
/* fall through to the rollback writer */
|
|
210
|
+
}
|
|
211
|
+
}
|
|
173
212
|
const path = join(coordRoot, ".harnery", "debug", "agent-hook.errors.ndjson");
|
|
174
213
|
try {
|
|
175
214
|
mkdirSync(dirname(path), { recursive: true });
|
|
@@ -189,38 +228,18 @@ function logError(coordRoot: string | null, err: unknown, context: Record<string
|
|
|
189
228
|
}
|
|
190
229
|
|
|
191
230
|
/**
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* session.started emission never breaks the adapter flow.
|
|
195
|
-
*
|
|
196
|
-
* Lives at agent-hooks side (not agent-coord) to keep emitter/consumer
|
|
197
|
-
* separation: we spawn rather than import.
|
|
231
|
+
* Mint or recover the hurricane-style name for this owner in-process. Returns
|
|
232
|
+
* null on any failure so session.started emission never breaks adapter flow.
|
|
198
233
|
*/
|
|
199
|
-
function
|
|
234
|
+
function assignNameInProcess(
|
|
200
235
|
coordRoot: string,
|
|
201
236
|
instanceId: string,
|
|
202
237
|
kind: "session" | "subagent" | "transient",
|
|
203
238
|
forkedFrom?: string,
|
|
204
239
|
): { name: string; kind: string } | null {
|
|
205
|
-
const binary = coordBinPath("agent-coord", coordRoot) ?? "";
|
|
206
|
-
if (!existsSync(binary)) return null;
|
|
207
240
|
try {
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
const result = spawnSync(binary, args, {
|
|
211
|
-
encoding: "utf8",
|
|
212
|
-
timeout: 2000,
|
|
213
|
-
env: childEnv(coordRoot),
|
|
214
|
-
});
|
|
215
|
-
if (result.status !== 0 || !result.stdout) return null;
|
|
216
|
-
const parsed = JSON.parse(result.stdout.trim()) as {
|
|
217
|
-
name?: string;
|
|
218
|
-
kind?: string;
|
|
219
|
-
};
|
|
220
|
-
if (parsed.name && parsed.kind) {
|
|
221
|
-
return { name: parsed.name, kind: parsed.kind };
|
|
222
|
-
}
|
|
223
|
-
return null;
|
|
241
|
+
const name = assignName(coordRoot, instanceId, kind, forkedFrom ? { forkedFrom } : undefined);
|
|
242
|
+
return { name, kind };
|
|
224
243
|
} catch {
|
|
225
244
|
return null;
|
|
226
245
|
}
|
|
@@ -294,14 +313,9 @@ function buildEventData(
|
|
|
294
313
|
// tool.requested heal path instead. The forkedFrom plumbing below stays
|
|
295
314
|
// for adapters that DO report a parent at session start.
|
|
296
315
|
const forkedFrom: string | undefined = undefined;
|
|
297
|
-
// Assign (or recover) name + kind
|
|
316
|
+
// Assign (or recover) name + kind in-process. Idempotent: resume
|
|
298
317
|
// returns the original name; new owner consumes a counter slot.
|
|
299
|
-
const assigned =
|
|
300
|
-
ctx.coordRoot,
|
|
301
|
-
ctx.instanceId,
|
|
302
|
-
"session",
|
|
303
|
-
forkedFrom,
|
|
304
|
-
);
|
|
318
|
+
const assigned = assignNameInProcess(ctx.coordRoot, ctx.instanceId, "session", forkedFrom);
|
|
305
319
|
// Write the adapter pid-map row so `harn agents whoami` ppid-walks find
|
|
306
320
|
// this owner. Prefer the payload pid (the actual claude binary), then the
|
|
307
321
|
// anchor walk (the `node` ancestor for Cursor, which has no payload pid),
|
|
@@ -369,7 +383,7 @@ function buildEventData(
|
|
|
369
383
|
ctx.adapter === "cursor" &&
|
|
370
384
|
!readLiveCoordinationRow(ctx.coordRoot, ctx.instanceId)?.name
|
|
371
385
|
) {
|
|
372
|
-
|
|
386
|
+
assignNameInProcess(ctx.coordRoot, ctx.instanceId, "session");
|
|
373
387
|
}
|
|
374
388
|
const prompt = p?.prompt ?? "";
|
|
375
389
|
const { value, truncated } = clampString(prompt, 4000);
|
|
@@ -408,9 +422,10 @@ function buildEventData(
|
|
|
408
422
|
// assistant text only (same window, same scanner as the session-name
|
|
409
423
|
// detection). The Stop verdict enforces this field; the loose field is
|
|
410
424
|
// retained as diagnostic telemetry for the measured detector divergence.
|
|
411
|
-
status_box_present_strict:
|
|
412
|
-
|
|
413
|
-
lastAssistantMessage
|
|
425
|
+
status_box_present_strict: scanAssistantStatusBoxPresent(
|
|
426
|
+
p?.transcript_path,
|
|
427
|
+
lastAssistantMessage,
|
|
428
|
+
),
|
|
414
429
|
// Whether the session's suggested name is satisfied as of this turn,
|
|
415
430
|
// and which name that refers to. Reported on every stop while a name
|
|
416
431
|
// exists (the stop-hook.session_name verdict reads it per turn); the
|
|
@@ -439,7 +454,7 @@ function buildEventData(
|
|
|
439
454
|
// (agent-coord/state/names.ts → kind=transient). Use the call ID as the
|
|
440
455
|
// instance_id input; assignName falls through to transient.
|
|
441
456
|
const childInstanceId = subagentCallId ?? ctx.instanceId;
|
|
442
|
-
const assigned =
|
|
457
|
+
const assigned = assignNameInProcess(ctx.coordRoot, childInstanceId, "subagent");
|
|
443
458
|
return {
|
|
444
459
|
agent_type:
|
|
445
460
|
(p?.raw.agent_type as string | undefined) ??
|
|
@@ -569,10 +584,18 @@ function numberField(value: unknown): number | undefined {
|
|
|
569
584
|
|
|
570
585
|
async function main(): Promise<number> {
|
|
571
586
|
const hookStartedAt = performance.now();
|
|
587
|
+
const hookStartedRss = process.memoryUsage().rss;
|
|
572
588
|
const hookClock = captureSpanClockV3();
|
|
573
589
|
const { eventName, extra } = parseArgv(process.argv.slice(2));
|
|
574
590
|
const adapter = detectAdapter(process.argv.slice(2));
|
|
575
591
|
const raw = await readStdin();
|
|
592
|
+
hookHealthState = beginHookHealth({
|
|
593
|
+
started_at_ms: hookStartedAt,
|
|
594
|
+
started_rss_bytes: hookStartedRss,
|
|
595
|
+
event_name: eventName,
|
|
596
|
+
adapter,
|
|
597
|
+
payload_bytes: raw.length,
|
|
598
|
+
});
|
|
576
599
|
|
|
577
600
|
// Cursor executes the Claude Code project hooks too on hosts wired for both
|
|
578
601
|
// adapters, piping them its own payload (identifiable by the top-level
|
|
@@ -582,8 +605,9 @@ async function main(): Promise<number> {
|
|
|
582
605
|
// `--adapter cursor` dispatch of the same payload carries the session.
|
|
583
606
|
if (shouldSkipHookAdapter(adapter, raw)) {
|
|
584
607
|
if (coordEnv("AGENT_COORD_OFF") !== "1") {
|
|
585
|
-
const coordRoot =
|
|
608
|
+
const coordRoot = resolveCoordRoot(process.cwd());
|
|
586
609
|
if (coordRoot) {
|
|
610
|
+
hookHealthState.coord_root = coordRoot;
|
|
587
611
|
appendDebug(coordRoot, {
|
|
588
612
|
ts: new Date().toISOString(),
|
|
589
613
|
event_name: eventName,
|
|
@@ -607,7 +631,7 @@ async function main(): Promise<number> {
|
|
|
607
631
|
if (adapter === "claude-code" && eventName) {
|
|
608
632
|
const s = soundForEvent(eventName);
|
|
609
633
|
if (s) {
|
|
610
|
-
const repoRoot =
|
|
634
|
+
const repoRoot = resolveCoordRoot(process.cwd());
|
|
611
635
|
if (repoRoot) {
|
|
612
636
|
let sid = "";
|
|
613
637
|
let stopContinuation = false;
|
|
@@ -638,8 +662,12 @@ async function main(): Promise<number> {
|
|
|
638
662
|
// bypass during incident triage.
|
|
639
663
|
if (coordEnv("AGENT_COORD_OFF") === "1") return 0;
|
|
640
664
|
|
|
641
|
-
const coordRoot =
|
|
665
|
+
const coordRoot = resolveCoordRoot(process.cwd());
|
|
642
666
|
if (!coordRoot) return 0;
|
|
667
|
+
hookHealthState.coord_root = coordRoot;
|
|
668
|
+
if (eventName === "runtime-context-retry") {
|
|
669
|
+
return runRuntimeContextRetryWorker(coordRoot, adapter, extra);
|
|
670
|
+
}
|
|
643
671
|
const ledgerRoute = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
644
672
|
|
|
645
673
|
// Always log a breadcrumb, useful when an event_type maps to null or owner
|
|
@@ -661,6 +689,78 @@ async function main(): Promise<number> {
|
|
|
661
689
|
return 0;
|
|
662
690
|
}
|
|
663
691
|
|
|
692
|
+
// Cursor's preToolUse `agent_message` is only the current narration before
|
|
693
|
+
// that tool. It is not a transcript and therefore cannot prove that an
|
|
694
|
+
// earlier assistant response omitted the required session-name block.
|
|
695
|
+
// afterAgentResponse is the one native boundary that carries the completed
|
|
696
|
+
// assistant text. Preserve only privacy-safe ritual booleans in the V3
|
|
697
|
+
// producer's open-turn state; Stop consumes them into the authoritative
|
|
698
|
+
// turn.completed event. The response body never enters V3 or heartbeat.
|
|
699
|
+
if (adapter === "cursor" && eventName === "after-agent-response") {
|
|
700
|
+
const payload = parsePayload(raw, adapter);
|
|
701
|
+
const owner = resolveOwner({ payload: payload?.raw ?? null, coordRoot });
|
|
702
|
+
if (!owner) {
|
|
703
|
+
appendDebug(coordRoot, { ...debugBase, skipped: "no-owner-resolved" });
|
|
704
|
+
return 0;
|
|
705
|
+
}
|
|
706
|
+
const name = sessionNameDisplayPending(readLiveCoordinationRow(coordRoot, owner.instance_id));
|
|
707
|
+
const text = typeof payload?.raw.text === "string" ? payload.raw.text : "";
|
|
708
|
+
if (name && assistantTextStartsWithSessionNameBlock(text, name)) {
|
|
709
|
+
stampSessionNameSeen(coordRoot, owner.instance_id, name);
|
|
710
|
+
appendDebug(coordRoot, { ...debugBase, effect: "session-name-display-stamped" });
|
|
711
|
+
} else {
|
|
712
|
+
appendDebug(coordRoot, { ...debugBase, skipped: "no-session-name-sighting" });
|
|
713
|
+
}
|
|
714
|
+
if (ledgerRoute.state === "blocked") {
|
|
715
|
+
appendDebug(coordRoot, {
|
|
716
|
+
...debugBase,
|
|
717
|
+
skipped: "v3-control-blocked",
|
|
718
|
+
reason: ledgerRoute.reason,
|
|
719
|
+
owner_source: owner.source,
|
|
720
|
+
});
|
|
721
|
+
return 0;
|
|
722
|
+
}
|
|
723
|
+
const statusBoxPresentStrict = scanAssistantStatusBoxPresent(undefined, text);
|
|
724
|
+
// The hook parser needs the completed reply long enough to scan it, but
|
|
725
|
+
// durable hook intake must never retain that body. Keep every other native
|
|
726
|
+
// field so turn correlation remains available to the producer.
|
|
727
|
+
const { text: _completedReply, ...privacySafeRaw } = payload?.raw ?? {};
|
|
728
|
+
const privacySafePayload = payload ? { ...payload, raw: privacySafeRaw } : null;
|
|
729
|
+
const v3Result = recordLiveHookSignalV3({
|
|
730
|
+
coordRoot,
|
|
731
|
+
route: ledgerRoute,
|
|
732
|
+
eventName,
|
|
733
|
+
payload: privacySafePayload,
|
|
734
|
+
adapter,
|
|
735
|
+
instanceId: owner.instance_id,
|
|
736
|
+
hook_name: eventName,
|
|
737
|
+
hook_duration_ms: Math.max(0, Math.floor(performance.now() - hookStartedAt)),
|
|
738
|
+
monotonic_ns: hookClock.monotonic_ns,
|
|
739
|
+
turn_ritual: {
|
|
740
|
+
status_box_present: statusBoxPresentStrict,
|
|
741
|
+
status_box_present_strict: statusBoxPresentStrict,
|
|
742
|
+
session_name_required: name !== undefined,
|
|
743
|
+
session_name_present: name ? assistantTextStartsWithSessionNameBlock(text, name) : false,
|
|
744
|
+
},
|
|
745
|
+
});
|
|
746
|
+
observeHookDebug(hookHealthState, { event_v3_state: v3Result.state });
|
|
747
|
+
appendDebug(coordRoot, {
|
|
748
|
+
...debugBase,
|
|
749
|
+
effect: "cursor-response-ritual-observed",
|
|
750
|
+
owner_source: owner.source,
|
|
751
|
+
event_v3_state: v3Result.state,
|
|
752
|
+
...(v3Result.state === "observed"
|
|
753
|
+
? {
|
|
754
|
+
generation_id: v3Result.generation_id,
|
|
755
|
+
turn_id: v3Result.turn_id,
|
|
756
|
+
response_observed_at: v3Result.observed_at,
|
|
757
|
+
status_box_present_strict: statusBoxPresentStrict,
|
|
758
|
+
}
|
|
759
|
+
: {}),
|
|
760
|
+
});
|
|
761
|
+
return 0;
|
|
762
|
+
}
|
|
763
|
+
|
|
664
764
|
const norm = normalizeEventName(eventName);
|
|
665
765
|
if (!norm) {
|
|
666
766
|
appendDebug(coordRoot, { ...debugBase, skipped: "non-canonical-event" });
|
|
@@ -680,8 +780,10 @@ async function main(): Promise<number> {
|
|
|
680
780
|
});
|
|
681
781
|
return 0;
|
|
682
782
|
}
|
|
783
|
+
hookHealthState.owner_id = owner.instance_id;
|
|
683
784
|
|
|
684
785
|
const sessionId = payload?.session_id ?? payload?.conversation_id ?? owner.instance_id;
|
|
786
|
+
const priorCoordination = readHeartbeat(coordRoot, owner.instance_id);
|
|
685
787
|
|
|
686
788
|
const data = buildEventData(norm.event_type, {
|
|
687
789
|
coordRoot,
|
|
@@ -756,6 +858,27 @@ async function main(): Promise<number> {
|
|
|
756
858
|
...(turnRitual ? { turn_ritual: turnRitual } : {}),
|
|
757
859
|
...(deferV3Drain ? { defer_drain: true } : {}),
|
|
758
860
|
});
|
|
861
|
+
observeHookDebug(hookHealthState, {
|
|
862
|
+
...(v3Result ? { event_v3_state: v3Result.state } : {}),
|
|
863
|
+
});
|
|
864
|
+
const recordedGenerationId =
|
|
865
|
+
v3Result && "event" in v3Result && "generation_id" in v3Result.event.scope
|
|
866
|
+
? (v3Result.event.scope.generation_id as `gen_${string}`)
|
|
867
|
+
: undefined;
|
|
868
|
+
if (v3Result?.state === "recorded" || v3Result?.state === "already_started") {
|
|
869
|
+
try {
|
|
870
|
+
restoreLiveCoordinationStateAfterEpochV3({
|
|
871
|
+
coordRoot,
|
|
872
|
+
owner: owner.instance_id,
|
|
873
|
+
nativeSessionId: sessionId,
|
|
874
|
+
adapter,
|
|
875
|
+
prior: priorCoordination,
|
|
876
|
+
currentGenerationId: recordedGenerationId,
|
|
877
|
+
});
|
|
878
|
+
} catch (error) {
|
|
879
|
+
logError(coordRoot, error, { phase: "epoch-coordination-restore" });
|
|
880
|
+
}
|
|
881
|
+
}
|
|
759
882
|
const v3EventId =
|
|
760
883
|
v3Result && "event" in v3Result
|
|
761
884
|
? v3Result.event.event_id
|
|
@@ -795,7 +918,7 @@ async function main(): Promise<number> {
|
|
|
795
918
|
|
|
796
919
|
if (v3Result?.state === "recorded" && capturedImages.length > 0) {
|
|
797
920
|
try {
|
|
798
|
-
recordImageArtifactsV3(coordRoot, v3Result.event, capturedImages);
|
|
921
|
+
recordImageArtifactsV3(coordRoot, v3Result.event, capturedImages, ledgerRoute.genesis_id);
|
|
799
922
|
} catch (err) {
|
|
800
923
|
logError(coordRoot, err, { phase: "image-artifact-observation" });
|
|
801
924
|
}
|
|
@@ -889,6 +1012,44 @@ async function main(): Promise<number> {
|
|
|
889
1012
|
// session-start additionalContext inside emitSessionStartSystemMessage.
|
|
890
1013
|
if (adapter === "claude-code") journalJanitor(coordRoot);
|
|
891
1014
|
imageJanitor(coordRoot);
|
|
1015
|
+
// Session start is the only caller of the artifact janitor and the storage
|
|
1016
|
+
// maintenance pass, so both load here instead of on every tool call.
|
|
1017
|
+
const { autoCleanArtifacts } = await import("../artifacts/index.ts");
|
|
1018
|
+
const { autoCleanEventV3Archives } = await import("../events/v3/archive-retention.ts");
|
|
1019
|
+
const { createAutomaticMaintenanceComposition, runAutomaticMaintenancePass } = await import(
|
|
1020
|
+
"../storage/maintenance-providers.ts"
|
|
1021
|
+
);
|
|
1022
|
+
// Effect: throttled daily sweep of expired artifact workspaces (guarded,
|
|
1023
|
+
// managed-expired only; see autoCleanArtifacts). Best-effort like every
|
|
1024
|
+
// janitor here: a failure logs and never blocks session start.
|
|
1025
|
+
try {
|
|
1026
|
+
autoCleanArtifacts(coordRoot);
|
|
1027
|
+
} catch (err) {
|
|
1028
|
+
logError(coordRoot, err, { phase: "artifact-auto-clean" });
|
|
1029
|
+
}
|
|
1030
|
+
// Effect: apply the same daily throttle to closed V3 epochs. The newest
|
|
1031
|
+
// recovery epochs remain protected by the archive retention policy.
|
|
1032
|
+
try {
|
|
1033
|
+
autoCleanEventV3Archives(coordRoot);
|
|
1034
|
+
} catch (err) {
|
|
1035
|
+
logError(coordRoot, err, { phase: "event-v3-archive-auto-clean" });
|
|
1036
|
+
}
|
|
1037
|
+
// Plan one bounded, claim-first global slice from cached pressure only.
|
|
1038
|
+
// Existing owner janitors above remain the only active executors until
|
|
1039
|
+
// each provider receives a separate production activation.
|
|
1040
|
+
try {
|
|
1041
|
+
await runAutomaticMaintenancePass(
|
|
1042
|
+
createAutomaticMaintenanceComposition(coordRoot, {
|
|
1043
|
+
journal: () => {
|
|
1044
|
+
if (adapter === "claude-code") journalJanitor(coordRoot);
|
|
1045
|
+
},
|
|
1046
|
+
images: () => imageJanitor(coordRoot),
|
|
1047
|
+
artifacts: () => autoCleanArtifacts(coordRoot),
|
|
1048
|
+
}),
|
|
1049
|
+
);
|
|
1050
|
+
} catch (err) {
|
|
1051
|
+
logError(coordRoot, err, { phase: "storage-maintenance-auto" });
|
|
1052
|
+
}
|
|
892
1053
|
let recovery: PreparedContextRecovery | null = null;
|
|
893
1054
|
if (payload?.source === "compact") {
|
|
894
1055
|
try {
|
|
@@ -920,10 +1081,13 @@ async function main(): Promise<number> {
|
|
|
920
1081
|
} catch (err) {
|
|
921
1082
|
logError(coordRoot, err, { phase: "session-start-systemMessage" });
|
|
922
1083
|
}
|
|
923
|
-
//
|
|
924
|
-
// disposable heartbeat cache.
|
|
1084
|
+
// Cross-machine presence is derived from the authority-safe V3 projection,
|
|
1085
|
+
// not the disposable heartbeat cache. Announce this session, pull peers,
|
|
1086
|
+
// and keep the optional live relay connected.
|
|
925
1087
|
try {
|
|
1088
|
+
publishPresence(coordRoot);
|
|
926
1089
|
fetchPresence(coordRoot);
|
|
1090
|
+
ensureRelayDaemon(coordRoot);
|
|
927
1091
|
} catch (err) {
|
|
928
1092
|
logError(coordRoot, err, { phase: "session-start-presence" });
|
|
929
1093
|
}
|
|
@@ -933,7 +1097,7 @@ async function main(): Promise<number> {
|
|
|
933
1097
|
// agnostic since v0.5.0.
|
|
934
1098
|
if (norm.event_type === "session.ended") {
|
|
935
1099
|
try {
|
|
936
|
-
cleanupSessionEnd(coordRoot, owner.instance_id
|
|
1100
|
+
cleanupSessionEnd(coordRoot, owner.instance_id);
|
|
937
1101
|
} catch (err) {
|
|
938
1102
|
logError(coordRoot, err, { phase: "session-end-cleanup" });
|
|
939
1103
|
}
|
|
@@ -943,6 +1107,13 @@ async function main(): Promise<number> {
|
|
|
943
1107
|
journalArchive(coordRoot, owner.instance_id);
|
|
944
1108
|
runSessionSyncExtension(coordRoot, true);
|
|
945
1109
|
}
|
|
1110
|
+
// Publish the post-cleanup V3 projection so remote machines see this
|
|
1111
|
+
// session disappear without waiting for the stale window.
|
|
1112
|
+
try {
|
|
1113
|
+
publishPresence(coordRoot);
|
|
1114
|
+
} catch (err) {
|
|
1115
|
+
logError(coordRoot, err, { phase: "session-end-presence" });
|
|
1116
|
+
}
|
|
946
1117
|
}
|
|
947
1118
|
|
|
948
1119
|
// Phase 8: SubagentStart: the child generation was opened above from the
|
|
@@ -951,27 +1122,9 @@ async function main(): Promise<number> {
|
|
|
951
1122
|
if (norm.event_type === "agent.started") {
|
|
952
1123
|
try {
|
|
953
1124
|
const childInstanceId = (data.agent_id as string | undefined) ?? owner.instance_id;
|
|
954
|
-
|
|
955
|
-
if (existsSync(agentCoordBin)) {
|
|
956
|
-
spawnSync(agentCoordBin, ["project"], {
|
|
957
|
-
encoding: "utf8",
|
|
958
|
-
timeout: 3000,
|
|
959
|
-
env: childEnv(coordRoot),
|
|
960
|
-
});
|
|
961
|
-
spawnSync(
|
|
962
|
-
agentCoordBin,
|
|
963
|
-
[
|
|
964
|
-
"log",
|
|
965
|
-
`SUBAGENT_START agent_type=${(data.agent_type as string) ?? "unknown"} agent_id=${childInstanceId.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
|
|
966
|
-
"--instance",
|
|
967
|
-
childInstanceId,
|
|
968
|
-
],
|
|
969
|
-
{ encoding: "utf8", timeout: 2000, env: childEnv(coordRoot) },
|
|
970
|
-
);
|
|
971
|
-
}
|
|
972
|
-
emitSubagentStartContext(coordRoot, childInstanceId, sessionId, data, adapter);
|
|
1125
|
+
await emitSubagentStartContext(coordRoot, childInstanceId, sessionId, data, adapter);
|
|
973
1126
|
} catch (err) {
|
|
974
|
-
logError(coordRoot, err, { phase: "subagent-start-
|
|
1127
|
+
logError(coordRoot, err, { phase: "subagent-start-context" });
|
|
975
1128
|
}
|
|
976
1129
|
}
|
|
977
1130
|
|
|
@@ -979,20 +1132,7 @@ async function main(): Promise<number> {
|
|
|
979
1132
|
if (norm.event_type === "agent.completed") {
|
|
980
1133
|
try {
|
|
981
1134
|
const childInstanceId = payload?.subagent_id ?? payload?.agent_id ?? owner.instance_id;
|
|
982
|
-
cleanupSessionEnd(coordRoot, childInstanceId
|
|
983
|
-
const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
|
|
984
|
-
if (existsSync(agentCoordBin)) {
|
|
985
|
-
spawnSync(
|
|
986
|
-
agentCoordBin,
|
|
987
|
-
[
|
|
988
|
-
"log",
|
|
989
|
-
`SUBAGENT_STOP agent_id=${childInstanceId.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
|
|
990
|
-
"--instance",
|
|
991
|
-
childInstanceId,
|
|
992
|
-
],
|
|
993
|
-
{ encoding: "utf8", timeout: 2000, env: childEnv(coordRoot) },
|
|
994
|
-
);
|
|
995
|
-
}
|
|
1135
|
+
cleanupSessionEnd(coordRoot, childInstanceId);
|
|
996
1136
|
const { reconcileSessionFinalizationV3 } = await import("../agents/session-finalizer-v3.ts");
|
|
997
1137
|
reconcileSessionFinalizationV3(coordRoot, { archive_observations: [] });
|
|
998
1138
|
} catch (err) {
|
|
@@ -1061,6 +1201,16 @@ async function main(): Promise<number> {
|
|
|
1061
1201
|
runSessionSyncExtension(coordRoot, false);
|
|
1062
1202
|
}
|
|
1063
1203
|
|
|
1204
|
+
// Publish after the canonical turn event has landed so the blob carries
|
|
1205
|
+
// current task, activity, and claim state. Re-ensure the relay here because
|
|
1206
|
+
// its daemon intentionally exits when a machine has no live sessions.
|
|
1207
|
+
try {
|
|
1208
|
+
publishPresence(coordRoot);
|
|
1209
|
+
ensureRelayDaemon(coordRoot);
|
|
1210
|
+
} catch (err) {
|
|
1211
|
+
logError(coordRoot, err, { phase: "stop-presence" });
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1064
1214
|
// Stop verdict (V3 ritual + task/status gate). Direct in-process call: the
|
|
1065
1215
|
// rule lives in Harnery. agent-hook already emitted this turn.completed
|
|
1066
1216
|
// with privacy-safe ritual observations, so the evidence is in the stream.
|
|
@@ -1069,6 +1219,8 @@ async function main(): Promise<number> {
|
|
|
1069
1219
|
instance_id: owner.instance_id,
|
|
1070
1220
|
session_id: sessionId,
|
|
1071
1221
|
adapter,
|
|
1222
|
+
stop_hook_active: payload?.stop_hook_active === true,
|
|
1223
|
+
status_box_present_strict: data.status_box_present_strict === true,
|
|
1072
1224
|
bypass: coordEnv("AGENT_COORD_BYPASS_STOP") === "1",
|
|
1073
1225
|
workflow_child: coordEnv("WORKFLOW_CHILD") === "1",
|
|
1074
1226
|
});
|
|
@@ -1078,13 +1230,16 @@ async function main(): Promise<number> {
|
|
|
1078
1230
|
// `cap` consecutive blocked stops in one cycle, allow the stop instead
|
|
1079
1231
|
// of bouncing the model forever. Cycle boundaries come from the
|
|
1080
1232
|
// adapter's continuation flag, so adapters without one are unaffected.
|
|
1081
|
-
const {
|
|
1082
|
-
|
|
1233
|
+
const { recordRemediationBlock } = await import("./remediation-cap.ts");
|
|
1234
|
+
const remediation = recordRemediationBlock(sessionId, payload?.stop_hook_active === true);
|
|
1235
|
+
if (remediation.exceeded) {
|
|
1083
1236
|
appendDebug(coordRoot, {
|
|
1084
1237
|
...debugBase,
|
|
1085
1238
|
skipped: "stop-remediation-cap-exhausted",
|
|
1086
1239
|
blocked_rule: verdict.rule,
|
|
1240
|
+
blocked_count: remediation.count,
|
|
1087
1241
|
session_id: sessionId,
|
|
1242
|
+
remediation_cycle_anchor: verdict.remediation_cycle_anchor,
|
|
1088
1243
|
});
|
|
1089
1244
|
} else {
|
|
1090
1245
|
// Adapter-aware enforcement channel: Claude Code honors exit-2 + stderr
|
|
@@ -1113,6 +1268,7 @@ async function main(): Promise<number> {
|
|
|
1113
1268
|
} catch (err) {
|
|
1114
1269
|
logError(coordRoot, err, { phase: "stop-explicit-session-finalization" });
|
|
1115
1270
|
}
|
|
1271
|
+
if (adapter === "codex") scheduleCodexRuntimeContextRetry(coordRoot, sessionId);
|
|
1116
1272
|
}
|
|
1117
1273
|
|
|
1118
1274
|
// Phase 7: PreToolUse: heartbeat + pid-map self-heal on every tool call.
|
|
@@ -1141,14 +1297,18 @@ async function main(): Promise<number> {
|
|
|
1141
1297
|
// runs before a name exists; every later tool waits until the exact block
|
|
1142
1298
|
// is the first assistant text after the mint result. Cursor supplies
|
|
1143
1299
|
// agent_message directly; Claude Code and Codex are resolved from their
|
|
1144
|
-
// JSONL transcripts.
|
|
1145
|
-
//
|
|
1300
|
+
// JSONL transcripts. Cursor's current narration can provide positive
|
|
1301
|
+
// evidence, but cannot disprove an earlier response; afterAgentResponse
|
|
1302
|
+
// stamps that durable sighting. Later commentary must not erase an
|
|
1303
|
+
// already-correct display, and unavailable evidence must not deadlock
|
|
1304
|
+
// every tool.
|
|
1146
1305
|
try {
|
|
1147
1306
|
const displayAllowed = await enforcePendingSessionNameDisplay(
|
|
1148
1307
|
coordRoot,
|
|
1149
1308
|
owner.instance_id,
|
|
1150
1309
|
adapter,
|
|
1151
1310
|
payload,
|
|
1311
|
+
generationBoundHeartbeat(readHeartbeat(coordRoot, owner.instance_id), recordedGenerationId),
|
|
1152
1312
|
);
|
|
1153
1313
|
if (!displayAllowed) return 0;
|
|
1154
1314
|
} catch (err) {
|
|
@@ -1225,13 +1385,56 @@ async function main(): Promise<number> {
|
|
|
1225
1385
|
return 0;
|
|
1226
1386
|
}
|
|
1227
1387
|
|
|
1388
|
+
function scheduleCodexRuntimeContextRetry(coordRoot: string, nativeSessionId: string): void {
|
|
1389
|
+
const modulePath = process.argv[1];
|
|
1390
|
+
if (!modulePath) return;
|
|
1391
|
+
try {
|
|
1392
|
+
const child = spawn(
|
|
1393
|
+
process.execPath,
|
|
1394
|
+
[modulePath, "runtime-context-retry", "--adapter", "codex", "--session-id", nativeSessionId],
|
|
1395
|
+
{
|
|
1396
|
+
cwd: coordRoot,
|
|
1397
|
+
detached: true,
|
|
1398
|
+
stdio: "ignore",
|
|
1399
|
+
env: childEnv(coordRoot),
|
|
1400
|
+
},
|
|
1401
|
+
);
|
|
1402
|
+
child.unref();
|
|
1403
|
+
} catch (err) {
|
|
1404
|
+
logError(coordRoot, err, { phase: "runtime-context-retry-spawn" });
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
async function runRuntimeContextRetryWorker(
|
|
1409
|
+
coordRoot: string,
|
|
1410
|
+
adapter: Adapter | null,
|
|
1411
|
+
extra: string[],
|
|
1412
|
+
): Promise<number> {
|
|
1413
|
+
const nativeSessionId = extraArg(extra, "--session-id");
|
|
1414
|
+
if (adapter !== "codex" || !nativeSessionId) return 0;
|
|
1415
|
+
for (const [index, delayMs] of [400, 1_000].entries()) {
|
|
1416
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
1417
|
+
const route = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
1418
|
+
if (route.state !== "v3") return 0;
|
|
1419
|
+
const result = reconcileLivePendingRuntimeContextV3({
|
|
1420
|
+
coordRoot,
|
|
1421
|
+
route,
|
|
1422
|
+
nativeSessionId,
|
|
1423
|
+
finalAttempt: index === 1,
|
|
1424
|
+
});
|
|
1425
|
+
if (result.state !== "pending" && result.state !== "busy") return 0;
|
|
1426
|
+
}
|
|
1427
|
+
return 0;
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1228
1430
|
async function enforcePendingSessionNameDisplay(
|
|
1229
1431
|
coordRoot: string,
|
|
1230
1432
|
instanceId: string,
|
|
1231
1433
|
adapter: Adapter,
|
|
1232
1434
|
payload: ParsedPayload | null,
|
|
1435
|
+
coordination: Heartbeat | null,
|
|
1233
1436
|
): Promise<boolean> {
|
|
1234
|
-
const name = sessionNameDisplayPending(
|
|
1437
|
+
const name = sessionNameDisplayPending(coordination);
|
|
1235
1438
|
if (!name) return true;
|
|
1236
1439
|
|
|
1237
1440
|
const command = extractBashCommand(payload?.tool_name, payload?.tool_input);
|
|
@@ -1242,7 +1445,7 @@ async function enforcePendingSessionNameDisplay(
|
|
|
1242
1445
|
? {
|
|
1243
1446
|
state: assistantTextStartsWithSessionNameBlock(payload.agent_message, name)
|
|
1244
1447
|
? ("present" as const)
|
|
1245
|
-
: ("
|
|
1448
|
+
: ("unavailable" as const),
|
|
1246
1449
|
}
|
|
1247
1450
|
: inspectSessionNameDisplayImmediately(
|
|
1248
1451
|
// Codex hook payloads omit transcript_path on every event, which
|
|
@@ -1275,6 +1478,13 @@ async function enforcePendingSessionNameDisplay(
|
|
|
1275
1478
|
return false;
|
|
1276
1479
|
}
|
|
1277
1480
|
|
|
1481
|
+
function generationBoundHeartbeat(
|
|
1482
|
+
heartbeat: Heartbeat | null,
|
|
1483
|
+
generationId: `gen_${string}` | undefined,
|
|
1484
|
+
): Heartbeat | null {
|
|
1485
|
+
return generationId && heartbeat?.v3_generation_id === generationId ? heartbeat : null;
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1278
1488
|
async function runPreToolUseGuard(
|
|
1279
1489
|
coordRoot: string,
|
|
1280
1490
|
instanceId: string,
|
|
@@ -1310,42 +1520,19 @@ async function runPreToolUseGuard(
|
|
|
1310
1520
|
}
|
|
1311
1521
|
if (targets.length === 0) return true;
|
|
1312
1522
|
|
|
1313
|
-
const
|
|
1314
|
-
if (!existsSync(agentCoordBin)) {
|
|
1315
|
-
if (agentsRequireGitFinalization(coordRoot)) {
|
|
1316
|
-
const { emitDeny } = await import("./adapter/output.ts");
|
|
1317
|
-
emitDeny(
|
|
1318
|
-
adapter,
|
|
1319
|
-
"Harnery denied the write before mutation because the claim coordinator is unavailable; repair the project's Harnery installation and retry.",
|
|
1320
|
-
);
|
|
1321
|
-
return false;
|
|
1322
|
-
}
|
|
1323
|
-
return true;
|
|
1324
|
-
}
|
|
1523
|
+
const { evaluateClaim } = await import("../agents/rules/claim-conflict.ts");
|
|
1325
1524
|
|
|
1326
1525
|
// For apply_patch (multi-file), collect siblings so the deny reason names
|
|
1327
1526
|
// them. For single-file tools the array has one entry.
|
|
1328
1527
|
for (const target of targets) {
|
|
1329
|
-
const verdictReq = JSON.stringify({
|
|
1330
|
-
rule: "claim",
|
|
1331
|
-
instance_id: instanceId,
|
|
1332
|
-
session_id: sessionId,
|
|
1333
|
-
path: target.path,
|
|
1334
|
-
});
|
|
1335
|
-
const result = spawnSync(agentCoordBin, ["verdict"], {
|
|
1336
|
-
input: verdictReq,
|
|
1337
|
-
encoding: "utf8",
|
|
1338
|
-
timeout: 3000,
|
|
1339
|
-
env: childEnv(coordRoot),
|
|
1340
|
-
});
|
|
1341
|
-
if (result.status !== 0 || !result.stdout) continue;
|
|
1342
|
-
let parsed: { allow?: boolean; reason?: string } = {};
|
|
1343
1528
|
try {
|
|
1344
|
-
parsed =
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1529
|
+
const parsed = evaluateClaim(coordRoot, {
|
|
1530
|
+
rule: "claim",
|
|
1531
|
+
instance_id: instanceId,
|
|
1532
|
+
session_id: sessionId,
|
|
1533
|
+
path: target.path,
|
|
1534
|
+
});
|
|
1535
|
+
if (parsed.allow !== false) continue;
|
|
1349
1536
|
let reason =
|
|
1350
1537
|
parsed.reason ?? `Path ${target.path} is currently being edited by another agent.`;
|
|
1351
1538
|
if (targets.length > 1) {
|
|
@@ -1361,7 +1548,7 @@ async function runPreToolUseGuard(
|
|
|
1361
1548
|
const { emitDeny } = await import("./adapter/output.ts");
|
|
1362
1549
|
emitDeny(adapter, reason);
|
|
1363
1550
|
return false;
|
|
1364
|
-
}
|
|
1551
|
+
} catch {}
|
|
1365
1552
|
}
|
|
1366
1553
|
return true;
|
|
1367
1554
|
}
|
|
@@ -1564,16 +1751,23 @@ function releaseClaimOnFailure(
|
|
|
1564
1751
|
const row = readLiveCoordinationRow(coordRoot, instanceId);
|
|
1565
1752
|
if (!row?.files_touched?.includes(canonical)) return;
|
|
1566
1753
|
|
|
1567
|
-
const
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1754
|
+
const before = readHeartbeat(coordRoot, instanceId);
|
|
1755
|
+
try {
|
|
1756
|
+
recordLiveClaimChangeV3({
|
|
1757
|
+
coordRoot,
|
|
1758
|
+
owner: instanceId,
|
|
1759
|
+
nativeSessionId: before?.session_id ?? instanceId,
|
|
1760
|
+
adapter: adapterFromPlatform(before?.platform),
|
|
1761
|
+
operation: "released",
|
|
1762
|
+
path: canonical,
|
|
1763
|
+
access: "write",
|
|
1764
|
+
});
|
|
1765
|
+
} catch {
|
|
1766
|
+
/* best-effort release must not break adapter flow */
|
|
1767
|
+
}
|
|
1574
1768
|
}
|
|
1575
1769
|
|
|
1576
|
-
function cleanupSessionEnd(coordRoot: string, instanceId: string
|
|
1770
|
+
function cleanupSessionEnd(coordRoot: string, instanceId: string): void {
|
|
1577
1771
|
// Sweep pid-map entries pointing to this instance
|
|
1578
1772
|
const pidmapDir = join(coordRoot, ".harnery", "pid-map");
|
|
1579
1773
|
if (existsSync(pidmapDir)) {
|
|
@@ -1595,15 +1789,6 @@ function cleanupSessionEnd(coordRoot: string, instanceId: string, reason: string
|
|
|
1595
1789
|
/* swallow */
|
|
1596
1790
|
}
|
|
1597
1791
|
}
|
|
1598
|
-
// Activity log
|
|
1599
|
-
const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
|
|
1600
|
-
if (existsSync(agentCoordBin)) {
|
|
1601
|
-
spawnSync(
|
|
1602
|
-
agentCoordBin,
|
|
1603
|
-
["log", `SESSION_END reason=${reason}`, "--instance", instanceId],
|
|
1604
|
-
{ encoding: "utf8", timeout: 2000 },
|
|
1605
|
-
);
|
|
1606
|
-
}
|
|
1607
1792
|
}
|
|
1608
1793
|
|
|
1609
1794
|
async function emitUserPromptSubmitSystemMessage(
|
|
@@ -1614,27 +1799,18 @@ async function emitUserPromptSubmitSystemMessage(
|
|
|
1614
1799
|
workspaceCwd?: string,
|
|
1615
1800
|
recoveryBriefing = "",
|
|
1616
1801
|
): Promise<boolean> {
|
|
1617
|
-
const
|
|
1618
|
-
let additionalContext =
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
// the bounce-and-retry the Stop hook otherwise forces.
|
|
1630
|
-
args.push("--session-name-nudge");
|
|
1631
|
-
if (adapter === "cursor" || adapter === "codex") args.push("--task-nudge");
|
|
1632
|
-
if (adapter === "codex") args.push("--status-footer-nudge");
|
|
1633
|
-
if (adapter === "claude-code" || adapter === "cursor")
|
|
1634
|
-
args.push("--turn-ritual-nudge", adapter);
|
|
1635
|
-
const result = spawnSync(agentCoordBin, args, { encoding: "utf8", timeout: 3000 });
|
|
1636
|
-
if (result.status === 0 && result.stdout) additionalContext = result.stdout.trim();
|
|
1637
|
-
}
|
|
1802
|
+
const { renderPromptContext } = await import("../agents/render/prompt-context.ts");
|
|
1803
|
+
let additionalContext = renderPromptContext({
|
|
1804
|
+
coordRoot,
|
|
1805
|
+
instanceId,
|
|
1806
|
+
sessionId,
|
|
1807
|
+
adapter,
|
|
1808
|
+
sessionNameNudge: true,
|
|
1809
|
+
taskNudge: adapter === "cursor" || adapter === "codex",
|
|
1810
|
+
hostPromptReminder: adapter === "codex",
|
|
1811
|
+
statusFooterNudge: adapter === "codex",
|
|
1812
|
+
turnRitualNudge: adapter === "claude-code" ? adapter : undefined,
|
|
1813
|
+
}).trim();
|
|
1638
1814
|
if (adapter === "codex") {
|
|
1639
1815
|
const fileLinkContext = renderCodexWslFileLinkContext(coordRoot, workspaceCwd);
|
|
1640
1816
|
if (fileLinkContext) {
|
|
@@ -1651,14 +1827,14 @@ async function emitUserPromptSubmitSystemMessage(
|
|
|
1651
1827
|
return true;
|
|
1652
1828
|
}
|
|
1653
1829
|
|
|
1654
|
-
function emitSubagentStartContext(
|
|
1830
|
+
async function emitSubagentStartContext(
|
|
1655
1831
|
coordRoot: string,
|
|
1656
1832
|
instanceId: string,
|
|
1657
1833
|
sessionId: string,
|
|
1658
1834
|
data: Record<string, unknown>,
|
|
1659
1835
|
adapter: Adapter,
|
|
1660
|
-
): void {
|
|
1661
|
-
// Look up the subagent's assigned name (just-written by
|
|
1836
|
+
): Promise<void> {
|
|
1837
|
+
// Look up the subagent's assigned name (just-written by the in-process name
|
|
1662
1838
|
// in session.started data) + the parent's short id for the "you are a subagent
|
|
1663
1839
|
// of X" framing.
|
|
1664
1840
|
const subagentName = (data.name as string | undefined) ?? "";
|
|
@@ -1671,23 +1847,20 @@ function emitSubagentStartContext(
|
|
|
1671
1847
|
// Render peer table inline since the subagent might want to know who else
|
|
1672
1848
|
// is around. Reuse prompt-context (which dedups against the per-owner hash);
|
|
1673
1849
|
// first call will always emit.
|
|
1674
|
-
const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
|
|
1675
1850
|
let combined = message;
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
}
|
|
1851
|
+
const { renderPromptContext } = await import("../agents/render/prompt-context.ts");
|
|
1852
|
+
const context = renderPromptContext({
|
|
1853
|
+
coordRoot,
|
|
1854
|
+
instanceId,
|
|
1855
|
+
sessionId,
|
|
1856
|
+
agentName: subagentName,
|
|
1857
|
+
}).trim();
|
|
1858
|
+
if (context) combined = `${message}\n\n${context}`;
|
|
1685
1859
|
|
|
1686
1860
|
// Use SubagentStart event-name in CC's hookSpecificOutput shape; cursor's
|
|
1687
1861
|
// flat `additional_context` works the same way.
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
});
|
|
1862
|
+
const { emitContext } = await import("./adapter/output.ts");
|
|
1863
|
+
emitContext(adapter, "SubagentStart", combined);
|
|
1691
1864
|
}
|
|
1692
1865
|
|
|
1693
1866
|
function adapterPlatform(adapter: Adapter): string {
|
|
@@ -1695,6 +1868,12 @@ function adapterPlatform(adapter: Adapter): string {
|
|
|
1695
1868
|
return adapter;
|
|
1696
1869
|
}
|
|
1697
1870
|
|
|
1871
|
+
function adapterFromPlatform(platform: unknown): Adapter {
|
|
1872
|
+
if (platform === "cursor") return "cursor";
|
|
1873
|
+
if (platform === "codex") return "codex";
|
|
1874
|
+
return "claude-code";
|
|
1875
|
+
}
|
|
1876
|
+
|
|
1698
1877
|
async function emitSessionStartSystemMessage(
|
|
1699
1878
|
coordRoot: string,
|
|
1700
1879
|
instanceId: string,
|
|
@@ -1703,53 +1882,29 @@ async function emitSessionStartSystemMessage(
|
|
|
1703
1882
|
adapter: Adapter,
|
|
1704
1883
|
recoveryBriefing = "",
|
|
1705
1884
|
): Promise<boolean> {
|
|
1706
|
-
const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
|
|
1707
1885
|
const workflowChild = coordEnv("WORKFLOW_CHILD") === "1";
|
|
1708
1886
|
let additionalContext = "";
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
"
|
|
1729
|
-
|
|
1730
|
-
"--instance",
|
|
1731
|
-
instanceId,
|
|
1732
|
-
],
|
|
1733
|
-
{ encoding: "utf8", timeout: 2000 },
|
|
1734
|
-
);
|
|
1735
|
-
|
|
1736
|
-
// Workflow children retain lifecycle/event capture but do not receive
|
|
1737
|
-
// operator-facing peer, council, or init-remediation context. Injecting
|
|
1738
|
-
// that context can make a bounded child follow housekeeping instructions
|
|
1739
|
-
// instead of its assigned prompt.
|
|
1740
|
-
if (!workflowChild) {
|
|
1741
|
-
const agentName = (emittedData.name as string | undefined) ?? "";
|
|
1742
|
-
const args = ["session-context", "--instance", instanceId, "--session", sessionId];
|
|
1743
|
-
if (agentName) args.push("--name", agentName);
|
|
1744
|
-
// The "You are agent-X." prefix in session-context renders unqualified by
|
|
1745
|
-
// default (claude-code-style). For cursor/codex the bash dispatchers add
|
|
1746
|
-
// a "(Cursor)" / "(Codex)" suffix; pass it through as --platform-label.
|
|
1747
|
-
if (adapter !== "claude-code") {
|
|
1748
|
-
args.push("--platform-label", platform === "cursor" ? "Cursor" : "Codex");
|
|
1749
|
-
}
|
|
1750
|
-
const result = spawnSync(agentCoordBin, args, { encoding: "utf8", timeout: 3000 });
|
|
1751
|
-
if (result.status === 0 && result.stdout) additionalContext = result.stdout.trim();
|
|
1752
|
-
}
|
|
1887
|
+
// Opportunistic reconciliation makes normal session starts a failsafe for
|
|
1888
|
+
// archive, idle, cascade, and host lifecycle observations. It also runs the
|
|
1889
|
+
// stale cache sweep through the shared ADR 0077 composition.
|
|
1890
|
+
const { reconcileCoordinationV3 } = await import("../agents/reconcile-coordination-v3.ts");
|
|
1891
|
+
reconcileCoordinationV3(coordRoot);
|
|
1892
|
+
|
|
1893
|
+
// Workflow children retain lifecycle/event capture but do not receive
|
|
1894
|
+
// operator-facing peer, council, or init-remediation context. Injecting
|
|
1895
|
+
// that context can make a bounded child follow housekeeping instructions
|
|
1896
|
+
// instead of its assigned prompt.
|
|
1897
|
+
if (!workflowChild) {
|
|
1898
|
+
const agentName = (emittedData.name as string | undefined) ?? "";
|
|
1899
|
+
const { renderSessionContext } = await import("../agents/render/session-context.ts");
|
|
1900
|
+
additionalContext = renderSessionContext({
|
|
1901
|
+
coordRoot,
|
|
1902
|
+
instanceId,
|
|
1903
|
+
sessionId,
|
|
1904
|
+
agentName: agentName || undefined,
|
|
1905
|
+
platformLabel:
|
|
1906
|
+
adapter === "claude-code" ? undefined : adapter === "cursor" ? "Cursor" : "Codex",
|
|
1907
|
+
}).trim();
|
|
1753
1908
|
}
|
|
1754
1909
|
|
|
1755
1910
|
// Effect (claude-code): merge the journal recovery cue into the session-start
|
|
@@ -1796,11 +1951,27 @@ function completeRecoveryInjection(
|
|
|
1796
1951
|
}
|
|
1797
1952
|
|
|
1798
1953
|
main()
|
|
1799
|
-
.then((code) =>
|
|
1800
|
-
|
|
1801
|
-
|
|
1954
|
+
.then(async (code) => {
|
|
1955
|
+
writeHookHealthCompletion(hookHealthState, {
|
|
1956
|
+
finished_at_ms: performance.now(),
|
|
1957
|
+
finished_rss_bytes: process.memoryUsage().rss,
|
|
1958
|
+
pid: process.pid,
|
|
1959
|
+
});
|
|
1960
|
+
await closeProcessLoggers();
|
|
1961
|
+
process.exit(code);
|
|
1962
|
+
})
|
|
1963
|
+
.catch(async (err) => {
|
|
1964
|
+
logError(resolveCoordRoot(process.cwd()), err, {
|
|
1802
1965
|
argv: process.argv.slice(2),
|
|
1803
1966
|
pid: process.pid,
|
|
1967
|
+
phase: "top-level",
|
|
1968
|
+
});
|
|
1969
|
+
writeHookHealthCompletion(hookHealthState, {
|
|
1970
|
+
finished_at_ms: performance.now(),
|
|
1971
|
+
finished_rss_bytes: process.memoryUsage().rss,
|
|
1972
|
+
pid: process.pid,
|
|
1973
|
+
faulted: true,
|
|
1804
1974
|
});
|
|
1975
|
+
await closeProcessLoggers();
|
|
1805
1976
|
process.exit(0);
|
|
1806
1977
|
});
|