harnery 0.34.1 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/dist/commander.d.ts +30 -5
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +124 -94
  4. package/dist/commands/agents.d.ts +37 -6
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +466 -371
  7. package/dist/commands/backup.d.ts.map +1 -1
  8. package/dist/commands/backup.js +10 -10
  9. package/dist/commands/browse-session.d.ts.map +1 -1
  10. package/dist/commands/browse-session.js +12 -0
  11. package/dist/commands/browse.d.ts +1 -1
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +31 -6
  14. package/dist/commands/conversations.d.ts +10 -0
  15. package/dist/commands/conversations.d.ts.map +1 -0
  16. package/dist/commands/conversations.js +201 -0
  17. package/dist/commands/decision.d.ts.map +1 -1
  18. package/dist/commands/decision.js +2 -2
  19. package/dist/commands/deinit.d.ts.map +1 -1
  20. package/dist/commands/deinit.js +5 -0
  21. package/dist/commands/docs.d.ts.map +1 -1
  22. package/dist/commands/docs.js +13 -2
  23. package/dist/commands/doctor.d.ts +5 -0
  24. package/dist/commands/doctor.d.ts.map +1 -1
  25. package/dist/commands/doctor.js +51 -7
  26. package/dist/commands/events.d.ts.map +1 -1
  27. package/dist/commands/events.js +18 -1
  28. package/dist/commands/fetch.js +6 -5
  29. package/dist/commands/files.d.ts +22 -0
  30. package/dist/commands/files.d.ts.map +1 -0
  31. package/dist/commands/files.js +113 -0
  32. package/dist/commands/governor.js +14 -12
  33. package/dist/commands/inbox.d.ts +5 -0
  34. package/dist/commands/inbox.d.ts.map +1 -0
  35. package/dist/commands/inbox.js +57 -0
  36. package/dist/commands/init.d.ts +4 -5
  37. package/dist/commands/init.d.ts.map +1 -1
  38. package/dist/commands/init.js +63 -13
  39. package/dist/commands/ledger-v3.d.ts.map +1 -1
  40. package/dist/commands/ledger-v3.js +347 -1
  41. package/dist/commands/logs.d.ts +4 -0
  42. package/dist/commands/logs.d.ts.map +1 -0
  43. package/dist/commands/logs.js +169 -0
  44. package/dist/commands/messages.d.ts +5 -0
  45. package/dist/commands/messages.d.ts.map +1 -0
  46. package/dist/commands/messages.js +45 -0
  47. package/dist/commands/outline.d.ts +1 -1
  48. package/dist/commands/outline.d.ts.map +1 -1
  49. package/dist/commands/outline.js +2 -2
  50. package/dist/commands/presence.d.ts.map +1 -1
  51. package/dist/commands/presence.js +2 -2
  52. package/dist/commands/read.d.ts +1 -1
  53. package/dist/commands/read.d.ts.map +1 -1
  54. package/dist/commands/read.js +2 -2
  55. package/dist/commands/semantic.d.ts +4 -0
  56. package/dist/commands/semantic.d.ts.map +1 -0
  57. package/dist/commands/semantic.js +199 -0
  58. package/dist/commands/storage.d.ts +4 -0
  59. package/dist/commands/storage.d.ts.map +1 -0
  60. package/dist/commands/storage.js +238 -0
  61. package/dist/commands/tunnel.d.ts +5 -1
  62. package/dist/commands/tunnel.d.ts.map +1 -1
  63. package/dist/commands/tunnel.js +44 -31
  64. package/dist/commands/web.d.ts +3 -0
  65. package/dist/commands/web.d.ts.map +1 -1
  66. package/dist/commands/web.js +84 -7
  67. package/dist/commands/work.js +3 -3
  68. package/dist/commands/workflow.js +13 -13
  69. package/dist/core/adapters/profiles.d.ts +1 -1
  70. package/dist/core/agents/canonical-emit.d.ts +3 -0
  71. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  72. package/dist/core/agents/canonical-emit.js +12 -0
  73. package/dist/core/agents/claim-path.d.ts +11 -0
  74. package/dist/core/agents/claim-path.d.ts.map +1 -0
  75. package/dist/core/agents/claim-path.js +22 -0
  76. package/dist/core/agents/cli.js +209 -39
  77. package/dist/core/agents/coord-client.d.ts +29 -3
  78. package/dist/core/agents/coord-client.d.ts.map +1 -1
  79. package/dist/core/agents/coord-client.js +88 -9
  80. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  81. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  82. package/dist/core/agents/live-authority-v3.js +245 -13
  83. package/dist/core/agents/live-lifecycle-v3.js +9 -4
  84. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  85. package/dist/core/agents/live-observation-v3.js +8 -3
  86. package/dist/core/agents/render/prompt-context.d.ts +9 -3
  87. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  88. package/dist/core/agents/render/prompt-context.js +36 -17
  89. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  90. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  91. package/dist/core/agents/rules/stop-hook.js +115 -22
  92. package/dist/core/agents/rules/verdict.d.ts +1 -0
  93. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  94. package/dist/core/agents/session-events.d.ts.map +1 -1
  95. package/dist/core/agents/session-events.js +4 -0
  96. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  97. package/dist/core/agents/session-finalizer-v3.js +5 -1
  98. package/dist/core/agents/session-name-display.d.ts +1 -0
  99. package/dist/core/agents/session-name-display.d.ts.map +1 -1
  100. package/dist/core/agents/session-name-display.js +8 -1
  101. package/dist/core/agents/state/activity-log.d.ts +3 -0
  102. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  103. package/dist/core/agents/state/activity-log.js +6 -3
  104. package/dist/core/agents/state/heartbeat-reader.d.ts +46 -0
  105. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
  106. package/dist/core/agents/state/heartbeat-reader.js +25 -0
  107. package/dist/core/agents/state/heartbeat-writer.d.ts +9 -48
  108. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  109. package/dist/core/agents/state/heartbeat-writer.js +34 -34
  110. package/dist/core/agents/state/live-coordination-view.d.ts +6 -8
  111. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  112. package/dist/core/agents/state/live-coordination-view.js +16 -67
  113. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  114. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  116. package/dist/core/agents/state/names.d.ts +9 -1
  117. package/dist/core/agents/state/names.d.ts.map +1 -1
  118. package/dist/core/agents/state/names.js +190 -182
  119. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  120. package/dist/core/agents/state/stale-sweep.js +23 -5
  121. package/dist/core/artifacts/constants.d.ts +5 -0
  122. package/dist/core/artifacts/constants.d.ts.map +1 -0
  123. package/dist/core/artifacts/constants.js +4 -0
  124. package/dist/core/artifacts/index.d.ts +24 -3
  125. package/dist/core/artifacts/index.d.ts.map +1 -1
  126. package/dist/core/artifacts/index.js +96 -8
  127. package/dist/core/config.d.ts +62 -4
  128. package/dist/core/config.d.ts.map +1 -1
  129. package/dist/core/config.js +98 -4
  130. package/dist/core/conversations/archive.d.ts +49 -0
  131. package/dist/core/conversations/archive.d.ts.map +1 -0
  132. package/dist/core/conversations/archive.js +136 -0
  133. package/dist/core/conversations/catalog.d.ts +10 -0
  134. package/dist/core/conversations/catalog.d.ts.map +1 -0
  135. package/dist/core/conversations/catalog.js +72 -0
  136. package/dist/core/conversations/context-pack.d.ts +6 -0
  137. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  138. package/dist/core/conversations/context-pack.js +60 -0
  139. package/dist/core/conversations/contract.d.ts +155 -0
  140. package/dist/core/conversations/contract.d.ts.map +1 -0
  141. package/dist/core/conversations/contract.js +1 -0
  142. package/dist/core/conversations/evaluation.d.ts +16 -0
  143. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  144. package/dist/core/conversations/evaluation.js +9 -0
  145. package/dist/core/conversations/index.d.ts +10 -0
  146. package/dist/core/conversations/index.d.ts.map +1 -0
  147. package/dist/core/conversations/index.js +9 -0
  148. package/dist/core/conversations/lifecycle.d.ts +28 -0
  149. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  150. package/dist/core/conversations/lifecycle.js +29 -0
  151. package/dist/core/conversations/normalize.d.ts +14 -0
  152. package/dist/core/conversations/normalize.d.ts.map +1 -0
  153. package/dist/core/conversations/normalize.js +82 -0
  154. package/dist/core/conversations/query.d.ts +8 -0
  155. package/dist/core/conversations/query.d.ts.map +1 -0
  156. package/dist/core/conversations/query.js +280 -0
  157. package/dist/core/conversations/search-index.d.ts +9 -0
  158. package/dist/core/conversations/search-index.d.ts.map +1 -0
  159. package/dist/core/conversations/search-index.js +29 -0
  160. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  161. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  162. package/dist/core/events/legacy-storage/canary.js +150 -0
  163. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  164. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  165. package/dist/core/events/legacy-storage/fence.js +115 -0
  166. package/dist/core/events/legacy-storage/index.d.ts +6 -0
  167. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  168. package/dist/core/events/legacy-storage/index.js +5 -0
  169. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  170. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  171. package/dist/core/events/legacy-storage/inventory.js +40 -0
  172. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  173. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  174. package/dist/core/events/legacy-storage/manifest.js +108 -0
  175. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  176. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  177. package/dist/core/events/legacy-storage/reader.js +154 -0
  178. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  179. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  180. package/dist/core/events/v3/authority-outbox.js +16 -3
  181. package/dist/core/events/v3/base-contract.d.ts +851 -16
  182. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  183. package/dist/core/events/v3/base-contract.js +50 -7
  184. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  185. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  186. package/dist/core/events/v3/bootstrap.js +167 -3
  187. package/dist/core/events/v3/capabilities.d.ts +11 -0
  188. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  189. package/dist/core/events/v3/capabilities.js +26 -3
  190. package/dist/core/events/v3/control-witness.d.ts +44 -0
  191. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  192. package/dist/core/events/v3/control-witness.js +233 -0
  193. package/dist/core/events/v3/control-writer.d.ts +4 -0
  194. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  195. package/dist/core/events/v3/control-writer.js +16 -0
  196. package/dist/core/events/v3/control.d.ts +8 -2
  197. package/dist/core/events/v3/control.d.ts.map +1 -1
  198. package/dist/core/events/v3/control.js +46 -18
  199. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  200. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  201. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  202. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  203. package/dist/core/events/v3/coordination-view.js +16 -1
  204. package/dist/core/events/v3/generated.d.ts +1 -1
  205. package/dist/core/events/v3/generated.js +1 -1
  206. package/dist/core/events/v3/index.d.ts +8 -5
  207. package/dist/core/events/v3/index.d.ts.map +1 -1
  208. package/dist/core/events/v3/index.js +7 -4
  209. package/dist/core/events/v3/latency.d.ts +31 -1
  210. package/dist/core/events/v3/latency.d.ts.map +1 -1
  211. package/dist/core/events/v3/latency.js +127 -3
  212. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  213. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  214. package/dist/core/events/v3/live-route-observer.js +58 -0
  215. package/dist/core/events/v3/live-routing.d.ts +42 -20
  216. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  217. package/dist/core/events/v3/live-routing.js +153 -41
  218. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
  219. package/dist/core/events/v3/producers/command-recorder.js +10 -1
  220. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  221. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  222. package/dist/core/events/v3/producers/coordination-recorder.js +90 -13
  223. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  224. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  226. package/dist/core/events/v3/producers/hook-base.d.ts +17 -1
  227. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  228. package/dist/core/events/v3/producers/hook-base.js +83 -2
  229. package/dist/core/events/v3/producers/intake.d.ts +13 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  231. package/dist/core/events/v3/producers/intake.js +36 -2
  232. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  233. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  235. package/dist/core/events/v3/producers/recorder.d.ts +117 -1
  236. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  237. package/dist/core/events/v3/producers/recorder.js +992 -27
  238. package/dist/core/events/v3/reader.d.ts +51 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -1
  240. package/dist/core/events/v3/reader.js +181 -1
  241. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  242. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  243. package/dist/core/events/v3/rotation-config.js +91 -0
  244. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  245. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  246. package/dist/core/events/v3/runtime-build.js +39 -0
  247. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  248. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  249. package/dist/core/events/v3/runtime-identity.js +18 -0
  250. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +52 -0
  251. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
  252. package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
  253. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  254. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  255. package/dist/core/events/v3/support-storage/classify.js +149 -0
  256. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  257. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  258. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  259. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  260. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  261. package/dist/core/events/v3/support-storage/index.js +9 -0
  262. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  263. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  264. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  265. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  266. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  267. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  268. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  269. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  270. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  271. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  272. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  273. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  274. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  275. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  276. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  277. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  278. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  279. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  280. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  281. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  282. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  283. package/dist/core/events/v3/turn-telemetry.d.ts +21 -6
  284. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  285. package/dist/core/events/v3/turn-telemetry.js +32 -2
  286. package/dist/core/events/v3/writer.d.ts +13 -1
  287. package/dist/core/events/v3/writer.d.ts.map +1 -1
  288. package/dist/core/events/v3/writer.js +126 -12
  289. package/dist/core/governor/plan-read.d.ts.map +1 -1
  290. package/dist/core/governor/plan-read.js +5 -21
  291. package/dist/core/governor/planning.js +6 -8
  292. package/dist/core/governor/service-read.d.ts +12 -0
  293. package/dist/core/governor/service-read.d.ts.map +1 -1
  294. package/dist/core/governor/service-read.js +266 -2
  295. package/dist/core/governor/service.d.ts +1 -0
  296. package/dist/core/governor/service.d.ts.map +1 -1
  297. package/dist/core/governor/service.js +53 -18
  298. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  299. package/dist/core/guard/evidence-v3.js +2 -0
  300. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  301. package/dist/core/hooks/adapter/events.js +1 -0
  302. package/dist/core/hooks/adapter/output.d.ts +4 -2
  303. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  304. package/dist/core/hooks/adapter/output.js +13 -5
  305. package/dist/core/hooks/adapter/parse.d.ts +3 -0
  306. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  307. package/dist/core/hooks/adapter/parse.js +14 -0
  308. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +142 -0
  309. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
  310. package/dist/core/hooks/adapter/runtime-telemetry.js +869 -0
  311. package/dist/core/hooks/cli.js +318 -61
  312. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  313. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  314. package/dist/core/hooks/effects/image-capture.js +4 -2
  315. package/dist/core/hooks/remediation-cap.d.ts +39 -0
  316. package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
  317. package/dist/core/hooks/remediation-cap.js +63 -0
  318. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  319. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  320. package/dist/core/hooks/resolve/coord-root.js +92 -11
  321. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  322. package/dist/core/hooks/resolve/owner.js +5 -0
  323. package/dist/core/hooks/resolve/transcript.d.ts +33 -9
  324. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  325. package/dist/core/hooks/resolve/transcript.js +33 -10
  326. package/dist/core/inbox/contract.d.ts +64 -0
  327. package/dist/core/inbox/contract.d.ts.map +1 -0
  328. package/dist/core/inbox/contract.js +13 -0
  329. package/dist/core/inbox/index.d.ts +5 -0
  330. package/dist/core/inbox/index.d.ts.map +1 -0
  331. package/dist/core/inbox/index.js +4 -0
  332. package/dist/core/inbox/lifecycle.d.ts +22 -0
  333. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  334. package/dist/core/inbox/lifecycle.js +41 -0
  335. package/dist/core/inbox/service.d.ts +36 -0
  336. package/dist/core/inbox/service.d.ts.map +1 -0
  337. package/dist/core/inbox/service.js +210 -0
  338. package/dist/core/inbox/watcher.d.ts +7 -0
  339. package/dist/core/inbox/watcher.d.ts.map +1 -0
  340. package/dist/core/inbox/watcher.js +26 -0
  341. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  342. package/dist/core/presence/codec-digest.js +14 -3
  343. package/dist/core/presence/relay-client.d.ts +1 -0
  344. package/dist/core/presence/relay-client.d.ts.map +1 -1
  345. package/dist/core/presence/relay-client.js +52 -8
  346. package/dist/core/semantic/adapters.d.ts +37 -0
  347. package/dist/core/semantic/adapters.d.ts.map +1 -0
  348. package/dist/core/semantic/adapters.js +360 -0
  349. package/dist/core/semantic/contract.d.ts +1072 -0
  350. package/dist/core/semantic/contract.d.ts.map +1 -0
  351. package/dist/core/semantic/contract.js +331 -0
  352. package/dist/core/semantic/evidence.d.ts +11 -0
  353. package/dist/core/semantic/evidence.d.ts.map +1 -0
  354. package/dist/core/semantic/evidence.js +262 -0
  355. package/dist/core/semantic/index.d.ts +14 -0
  356. package/dist/core/semantic/index.d.ts.map +1 -0
  357. package/dist/core/semantic/index.js +13 -0
  358. package/dist/core/semantic/once.d.ts +38 -0
  359. package/dist/core/semantic/once.d.ts.map +1 -0
  360. package/dist/core/semantic/once.js +364 -0
  361. package/dist/core/semantic/prompt.d.ts +12 -0
  362. package/dist/core/semantic/prompt.d.ts.map +1 -0
  363. package/dist/core/semantic/prompt.js +83 -0
  364. package/dist/core/semantic/review.d.ts +144 -0
  365. package/dist/core/semantic/review.d.ts.map +1 -0
  366. package/dist/core/semantic/review.js +544 -0
  367. package/dist/core/semantic/routes.d.ts +10 -0
  368. package/dist/core/semantic/routes.d.ts.map +1 -0
  369. package/dist/core/semantic/routes.js +21 -0
  370. package/dist/core/semantic/scheduler.d.ts +27 -0
  371. package/dist/core/semantic/scheduler.d.ts.map +1 -0
  372. package/dist/core/semantic/scheduler.js +91 -0
  373. package/dist/core/semantic/service-status.d.ts +51 -0
  374. package/dist/core/semantic/service-status.d.ts.map +1 -0
  375. package/dist/core/semantic/service-status.js +140 -0
  376. package/dist/core/semantic/service.d.ts +52 -0
  377. package/dist/core/semantic/service.d.ts.map +1 -0
  378. package/dist/core/semantic/service.js +559 -0
  379. package/dist/core/semantic/soak.d.ts +75 -0
  380. package/dist/core/semantic/soak.d.ts.map +1 -0
  381. package/dist/core/semantic/soak.js +476 -0
  382. package/dist/core/semantic/storage.d.ts +81 -0
  383. package/dist/core/semantic/storage.d.ts.map +1 -0
  384. package/dist/core/semantic/storage.js +180 -0
  385. package/dist/core/semantic/usage.d.ts +43 -0
  386. package/dist/core/semantic/usage.d.ts.map +1 -0
  387. package/dist/core/semantic/usage.js +193 -0
  388. package/dist/core/semantic/validate.d.ts +18 -0
  389. package/dist/core/semantic/validate.d.ts.map +1 -0
  390. package/dist/core/semantic/validate.js +207 -0
  391. package/dist/core/storage/buffer.d.ts +28 -0
  392. package/dist/core/storage/buffer.d.ts.map +1 -0
  393. package/dist/core/storage/buffer.js +101 -0
  394. package/dist/core/storage/builtins.d.ts +3 -0
  395. package/dist/core/storage/builtins.d.ts.map +1 -0
  396. package/dist/core/storage/builtins.js +683 -0
  397. package/dist/core/storage/catalog.d.ts +19 -0
  398. package/dist/core/storage/catalog.d.ts.map +1 -0
  399. package/dist/core/storage/catalog.js +365 -0
  400. package/dist/core/storage/config.d.ts +16 -0
  401. package/dist/core/storage/config.d.ts.map +1 -0
  402. package/dist/core/storage/config.js +311 -0
  403. package/dist/core/storage/contract.d.ts +275 -0
  404. package/dist/core/storage/contract.d.ts.map +1 -0
  405. package/dist/core/storage/contract.js +3 -0
  406. package/dist/core/storage/durable-history.d.ts +36 -0
  407. package/dist/core/storage/durable-history.d.ts.map +1 -0
  408. package/dist/core/storage/durable-history.js +606 -0
  409. package/dist/core/storage/health.d.ts +4 -0
  410. package/dist/core/storage/health.d.ts.map +1 -0
  411. package/dist/core/storage/health.js +65 -0
  412. package/dist/core/storage/index.d.ts +16 -0
  413. package/dist/core/storage/index.d.ts.map +1 -0
  414. package/dist/core/storage/index.js +15 -0
  415. package/dist/core/storage/inventory.d.ts +25 -0
  416. package/dist/core/storage/inventory.d.ts.map +1 -0
  417. package/dist/core/storage/inventory.js +666 -0
  418. package/dist/core/storage/jsonl.d.ts +52 -0
  419. package/dist/core/storage/jsonl.d.ts.map +1 -0
  420. package/dist/core/storage/jsonl.js +156 -0
  421. package/dist/core/storage/log-retention.d.ts +52 -0
  422. package/dist/core/storage/log-retention.d.ts.map +1 -0
  423. package/dist/core/storage/log-retention.js +419 -0
  424. package/dist/core/storage/logger.d.ts +82 -0
  425. package/dist/core/storage/logger.d.ts.map +1 -0
  426. package/dist/core/storage/logger.js +411 -0
  427. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  428. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  429. package/dist/core/storage/maintenance-providers.js +141 -0
  430. package/dist/core/storage/maintenance.d.ts +125 -0
  431. package/dist/core/storage/maintenance.d.ts.map +1 -0
  432. package/dist/core/storage/maintenance.js +609 -0
  433. package/dist/core/storage/metrics.d.ts +60 -0
  434. package/dist/core/storage/metrics.d.ts.map +1 -0
  435. package/dist/core/storage/metrics.js +134 -0
  436. package/dist/core/storage/policy.d.ts +7 -0
  437. package/dist/core/storage/policy.d.ts.map +1 -0
  438. package/dist/core/storage/policy.js +110 -0
  439. package/dist/core/storage/process-log.d.ts +38 -0
  440. package/dist/core/storage/process-log.d.ts.map +1 -0
  441. package/dist/core/storage/process-log.js +165 -0
  442. package/dist/core/storage/query.d.ts +34 -0
  443. package/dist/core/storage/query.d.ts.map +1 -0
  444. package/dist/core/storage/query.js +295 -0
  445. package/dist/core/storage/receipts.d.ts +23 -0
  446. package/dist/core/storage/receipts.d.ts.map +1 -0
  447. package/dist/core/storage/receipts.js +117 -0
  448. package/dist/core/storage/segments.d.ts +84 -0
  449. package/dist/core/storage/segments.d.ts.map +1 -0
  450. package/dist/core/storage/segments.js +542 -0
  451. package/dist/core/storage/sink-graph.d.ts +65 -0
  452. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  453. package/dist/core/storage/sink-graph.js +213 -0
  454. package/dist/core/storage/storm-control.d.ts +23 -0
  455. package/dist/core/storage/storm-control.d.ts.map +1 -0
  456. package/dist/core/storage/storm-control.js +59 -0
  457. package/dist/core/work/state.d.ts.map +1 -1
  458. package/dist/core/work/state.js +10 -14
  459. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  460. package/dist/core/workflow/live-session-v3.js +2 -1
  461. package/dist/index.d.ts +2 -0
  462. package/dist/index.d.ts.map +1 -1
  463. package/dist/index.js +2 -0
  464. package/dist/lazy-commands.d.ts +26 -0
  465. package/dist/lazy-commands.d.ts.map +1 -0
  466. package/dist/lazy-commands.js +210 -0
  467. package/dist/lib/browser/client.d.ts +11 -0
  468. package/dist/lib/browser/client.d.ts.map +1 -1
  469. package/dist/lib/browser/client.js +13 -0
  470. package/dist/lib/browser/index.d.ts +1 -0
  471. package/dist/lib/browser/index.d.ts.map +1 -1
  472. package/dist/lib/browser/standalone-html.d.ts +25 -0
  473. package/dist/lib/browser/standalone-html.d.ts.map +1 -0
  474. package/dist/lib/browser/standalone-html.js +284 -0
  475. package/dist/lib/docs-lint.d.ts +2 -0
  476. package/dist/lib/docs-lint.d.ts.map +1 -1
  477. package/dist/lib/docs-lint.js +45 -80
  478. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  479. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  480. package/dist/lib/docs-metadata-audit.js +13 -23
  481. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  482. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  483. package/dist/lib/docs-metadata-sync.js +28 -10
  484. package/dist/lib/docs-repository-view.d.ts +22 -0
  485. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  486. package/dist/lib/docs-repository-view.js +185 -0
  487. package/dist/lib/http/client.d.ts +11 -5
  488. package/dist/lib/http/client.d.ts.map +1 -1
  489. package/dist/lib/http/client.js +22 -4
  490. package/dist/lib/http/index.d.ts +1 -1
  491. package/dist/lib/http/index.d.ts.map +1 -1
  492. package/dist/lib/http/index.js +1 -1
  493. package/dist/lib/indexer-exclusions.d.ts +27 -0
  494. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  495. package/dist/lib/indexer-exclusions.js +176 -0
  496. package/dist/lib/instructions/apply.d.ts.map +1 -1
  497. package/dist/lib/instructions/apply.js +1 -0
  498. package/dist/lib/instructions/templates.d.ts +2 -0
  499. package/dist/lib/instructions/templates.d.ts.map +1 -1
  500. package/dist/lib/instructions/templates.js +149 -4
  501. package/dist/lib/local-file-url.d.ts +9 -0
  502. package/dist/lib/local-file-url.d.ts.map +1 -0
  503. package/dist/lib/local-file-url.js +20 -0
  504. package/dist/lib/web-performance.d.ts +118 -0
  505. package/dist/lib/web-performance.d.ts.map +1 -0
  506. package/dist/lib/web-performance.js +192 -0
  507. package/package.json +34 -2
  508. package/schemas/config.schema.json +58 -0
  509. package/schemas/event-v3.schema.json +3073 -581
  510. package/src/commander.ts +462 -93
  511. package/src/commands/agents.ts +617 -355
  512. package/src/commands/backup.ts +18 -14
  513. package/src/commands/browse-session.ts +12 -0
  514. package/src/commands/browse.ts +31 -9
  515. package/src/commands/conversations.ts +279 -0
  516. package/src/commands/decision.ts +8 -2
  517. package/src/commands/deinit.ts +6 -0
  518. package/src/commands/docs.ts +25 -6
  519. package/src/commands/doctor.ts +75 -9
  520. package/src/commands/events.ts +21 -1
  521. package/src/commands/fetch.ts +7 -6
  522. package/src/commands/files.ts +143 -0
  523. package/src/commands/governor.ts +13 -12
  524. package/src/commands/inbox.ts +61 -0
  525. package/src/commands/init.ts +78 -16
  526. package/src/commands/ledger-v3.ts +421 -1
  527. package/src/commands/logs.ts +224 -0
  528. package/src/commands/messages.ts +61 -0
  529. package/src/commands/outline.ts +6 -2
  530. package/src/commands/presence.ts +7 -2
  531. package/src/commands/read.ts +6 -2
  532. package/src/commands/semantic.ts +244 -0
  533. package/src/commands/storage.ts +310 -0
  534. package/src/commands/tunnel.ts +66 -52
  535. package/src/commands/web.ts +92 -7
  536. package/src/commands/work.ts +3 -3
  537. package/src/commands/workflow.ts +13 -13
  538. package/src/core/agents/canonical-emit.ts +15 -0
  539. package/src/core/agents/claim-path.ts +23 -0
  540. package/src/core/agents/cli.ts +259 -53
  541. package/src/core/agents/coord-client.ts +92 -8
  542. package/src/core/agents/live-authority-v3.ts +342 -14
  543. package/src/core/agents/live-lifecycle-v3.ts +14 -4
  544. package/src/core/agents/live-observation-v3.ts +13 -3
  545. package/src/core/agents/render/prompt-context.ts +40 -16
  546. package/src/core/agents/rules/stop-hook.ts +129 -25
  547. package/src/core/agents/rules/verdict.ts +1 -0
  548. package/src/core/agents/session-events.ts +4 -0
  549. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  550. package/src/core/agents/session-finalizer-v3.ts +4 -1
  551. package/src/core/agents/session-name-display.ts +9 -1
  552. package/src/core/agents/state/activity-log.ts +7 -2
  553. package/src/core/agents/state/heartbeat-reader.ts +69 -0
  554. package/src/core/agents/state/heartbeat-writer.ts +47 -84
  555. package/src/core/agents/state/live-coordination-view.ts +17 -81
  556. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  557. package/src/core/agents/state/names.ts +190 -182
  558. package/src/core/agents/state/stale-sweep.ts +25 -5
  559. package/src/core/artifacts/constants.ts +4 -0
  560. package/src/core/artifacts/index.ts +113 -8
  561. package/src/core/config.ts +126 -5
  562. package/src/core/conversations/archive.ts +237 -0
  563. package/src/core/conversations/catalog.ts +79 -0
  564. package/src/core/conversations/context-pack.ts +72 -0
  565. package/src/core/conversations/contract.ts +178 -0
  566. package/src/core/conversations/evaluation.ts +30 -0
  567. package/src/core/conversations/index.ts +9 -0
  568. package/src/core/conversations/lifecycle.ts +63 -0
  569. package/src/core/conversations/normalize.ts +105 -0
  570. package/src/core/conversations/query.ts +318 -0
  571. package/src/core/conversations/search-index.ts +48 -0
  572. package/src/core/events/legacy-storage/canary.ts +177 -0
  573. package/src/core/events/legacy-storage/fence.ts +129 -0
  574. package/src/core/events/legacy-storage/index.ts +5 -0
  575. package/src/core/events/legacy-storage/inventory.ts +51 -0
  576. package/src/core/events/legacy-storage/manifest.ts +136 -0
  577. package/src/core/events/legacy-storage/reader.ts +178 -0
  578. package/src/core/events/v3/authority-outbox.ts +22 -1
  579. package/src/core/events/v3/base-contract.ts +56 -7
  580. package/src/core/events/v3/bootstrap.ts +195 -2
  581. package/src/core/events/v3/capabilities.ts +37 -3
  582. package/src/core/events/v3/control-witness.ts +339 -0
  583. package/src/core/events/v3/control-writer.ts +16 -0
  584. package/src/core/events/v3/control.ts +54 -18
  585. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  586. package/src/core/events/v3/coordination-view.ts +17 -1
  587. package/src/core/events/v3/generated.ts +1 -1
  588. package/src/core/events/v3/index.ts +26 -2
  589. package/src/core/events/v3/latency.ts +213 -2
  590. package/src/core/events/v3/live-route-observer.ts +80 -0
  591. package/src/core/events/v3/live-routing.ts +182 -45
  592. package/src/core/events/v3/producers/command-recorder.ts +10 -1
  593. package/src/core/events/v3/producers/coordination-recorder.ts +112 -15
  594. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  595. package/src/core/events/v3/producers/hook-base.ts +116 -2
  596. package/src/core/events/v3/producers/intake.ts +48 -2
  597. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  598. package/src/core/events/v3/producers/recorder.ts +1403 -30
  599. package/src/core/events/v3/reader.ts +243 -2
  600. package/src/core/events/v3/rotation-config.ts +98 -0
  601. package/src/core/events/v3/runtime-build.ts +41 -0
  602. package/src/core/events/v3/runtime-identity.ts +16 -0
  603. package/src/core/events/v3/runtime-telemetry-capabilities.ts +143 -0
  604. package/src/core/events/v3/support-storage/classify.ts +209 -0
  605. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  606. package/src/core/events/v3/support-storage/index.ts +9 -0
  607. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  608. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  609. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  610. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  611. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  612. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  613. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  614. package/src/core/events/v3/turn-telemetry.ts +66 -5
  615. package/src/core/events/v3/writer.ts +168 -16
  616. package/src/core/governor/plan-read.ts +5 -18
  617. package/src/core/governor/planning.ts +5 -8
  618. package/src/core/governor/service-read.ts +320 -2
  619. package/src/core/governor/service.ts +49 -22
  620. package/src/core/guard/evidence-v3.ts +1 -0
  621. package/src/core/hooks/adapter/events.ts +1 -0
  622. package/src/core/hooks/adapter/output.ts +12 -5
  623. package/src/core/hooks/adapter/parse.ts +16 -0
  624. package/src/core/hooks/adapter/runtime-telemetry.ts +1200 -0
  625. package/src/core/hooks/cli.ts +342 -64
  626. package/src/core/hooks/effects/image-capture.ts +4 -1
  627. package/src/core/hooks/remediation-cap.ts +83 -0
  628. package/src/core/hooks/resolve/coord-root.ts +91 -11
  629. package/src/core/hooks/resolve/owner.ts +4 -0
  630. package/src/core/hooks/resolve/transcript.ts +55 -11
  631. package/src/core/inbox/contract.ts +81 -0
  632. package/src/core/inbox/index.ts +4 -0
  633. package/src/core/inbox/lifecycle.ts +104 -0
  634. package/src/core/inbox/service.ts +305 -0
  635. package/src/core/inbox/watcher.ts +36 -0
  636. package/src/core/presence/codec-digest.ts +15 -9
  637. package/src/core/presence/relay-client.ts +55 -7
  638. package/src/core/semantic/adapters.ts +452 -0
  639. package/src/core/semantic/contract.ts +430 -0
  640. package/src/core/semantic/evidence.ts +336 -0
  641. package/src/core/semantic/index.ts +201 -0
  642. package/src/core/semantic/once.ts +496 -0
  643. package/src/core/semantic/prompt.ts +96 -0
  644. package/src/core/semantic/review.ts +803 -0
  645. package/src/core/semantic/routes.ts +30 -0
  646. package/src/core/semantic/scheduler.ts +151 -0
  647. package/src/core/semantic/service-status.ts +212 -0
  648. package/src/core/semantic/service.ts +681 -0
  649. package/src/core/semantic/soak.ts +638 -0
  650. package/src/core/semantic/storage.ts +300 -0
  651. package/src/core/semantic/usage.ts +272 -0
  652. package/src/core/semantic/validate.ts +243 -0
  653. package/src/core/storage/buffer.ts +124 -0
  654. package/src/core/storage/builtins.ts +916 -0
  655. package/src/core/storage/catalog.ts +467 -0
  656. package/src/core/storage/config.ts +423 -0
  657. package/src/core/storage/contract.ts +342 -0
  658. package/src/core/storage/durable-history.ts +738 -0
  659. package/src/core/storage/health.ts +76 -0
  660. package/src/core/storage/index.ts +15 -0
  661. package/src/core/storage/inventory.ts +859 -0
  662. package/src/core/storage/jsonl.ts +213 -0
  663. package/src/core/storage/log-retention.ts +555 -0
  664. package/src/core/storage/logger.ts +546 -0
  665. package/src/core/storage/maintenance-providers.ts +200 -0
  666. package/src/core/storage/maintenance.ts +929 -0
  667. package/src/core/storage/metrics.ts +199 -0
  668. package/src/core/storage/policy.ts +141 -0
  669. package/src/core/storage/process-log.ts +203 -0
  670. package/src/core/storage/query.ts +360 -0
  671. package/src/core/storage/receipts.ts +162 -0
  672. package/src/core/storage/segments.ts +721 -0
  673. package/src/core/storage/sink-graph.ts +343 -0
  674. package/src/core/storage/storm-control.ts +91 -0
  675. package/src/core/work/state.ts +12 -21
  676. package/src/core/workflow/live-session-v3.ts +2 -4
  677. package/src/index.ts +2 -0
  678. package/src/lazy-commands.ts +294 -0
  679. package/src/lib/browser/client.ts +21 -0
  680. package/src/lib/browser/index.ts +4 -0
  681. package/src/lib/browser/standalone-html.ts +312 -0
  682. package/src/lib/docs-lint.ts +58 -77
  683. package/src/lib/docs-metadata-audit.ts +26 -21
  684. package/src/lib/docs-metadata-sync.ts +32 -9
  685. package/src/lib/docs-repository-view.ts +220 -0
  686. package/src/lib/http/client.ts +44 -8
  687. package/src/lib/http/index.ts +6 -1
  688. package/src/lib/indexer-exclusions.ts +173 -0
  689. package/src/lib/instructions/apply.ts +1 -0
  690. package/src/lib/instructions/templates.ts +154 -4
  691. package/src/lib/local-file-url.ts +31 -0
  692. package/src/lib/web-performance.ts +335 -0
@@ -7,10 +7,31 @@
7
7
  * handlers; Phase 4 flips the default so `harn agents …` shims through here.
8
8
  */
9
9
 
10
+ import { createHash } from "node:crypto";
10
11
  import { appendFileSync, existsSync } from "node:fs";
11
12
  import { appendFile, mkdir } from "node:fs/promises";
13
+ import { hostname } from "node:os";
12
14
  import { dirname, join, resolve } from "node:path";
13
15
  import { coordEnv } from "../../lib/env.ts";
16
+ import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.ts";
17
+ import { acquireNoClobberLease } from "../workflow/workspaces/leases.ts";
18
+
19
+ function sharedDiagnostic(
20
+ root: string,
21
+ event: string,
22
+ fields: Record<string, unknown>,
23
+ error?: unknown,
24
+ ): boolean {
25
+ if (coordEnv("SHARED_LOGS") === "0") return false;
26
+ try {
27
+ const logger = processLogger(root, "agent-coord");
28
+ if (error === undefined) logger.debug(event, legacyLogFields(fields));
29
+ else logger.error(event, legacyLogFields(fields), error);
30
+ return true;
31
+ } catch {
32
+ return false;
33
+ }
34
+ }
14
35
 
15
36
  function findCoordRoot(start: string): string | null {
16
37
  // HARNERY_COORD_ROOT_OVERRIDE: the bash side's test-mode escape hatch. agent-coord
@@ -39,8 +60,6 @@ async function readStdin(): Promise<string> {
39
60
  }
40
61
 
41
62
  async function logNoop(root: string, subcommand: string, argv: string[]): Promise<void> {
42
- const logPath = join(root, ".harnery", "debug", "agent-coord.ndjson");
43
- await mkdir(dirname(logPath), { recursive: true });
44
63
  const entry = {
45
64
  ts: new Date().toISOString(),
46
65
  note: "called, no-op",
@@ -50,6 +69,9 @@ async function logNoop(root: string, subcommand: string, argv: string[]): Promis
50
69
  pid: process.pid,
51
70
  ppid: process.ppid,
52
71
  };
72
+ if (sharedDiagnostic(root, "agent_coord.noop", entry)) return;
73
+ const logPath = join(root, ".harnery", "debug", "agent-coord.ndjson");
74
+ await mkdir(dirname(logPath), { recursive: true });
53
75
  await appendFile(logPath, `${JSON.stringify(entry)}\n`, "utf8");
54
76
  }
55
77
 
@@ -63,8 +85,6 @@ async function logNoop(root: string, subcommand: string, argv: string[]): Promis
63
85
  */
64
86
  async function handleVerdict(root: string): Promise<number> {
65
87
  const raw = await readStdin();
66
- const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
67
- await mkdir(dirname(logPath), { recursive: true });
68
88
 
69
89
  let parsed: { rule?: string } & Record<string, unknown> = {};
70
90
  let parseErr: string | null = null;
@@ -109,15 +129,16 @@ async function handleVerdict(root: string): Promise<number> {
109
129
  };
110
130
  }
111
131
 
112
- await appendFile(
113
- logPath,
114
- `${JSON.stringify({
115
- ts: new Date().toISOString(),
116
- request_preview: raw.slice(0, 500),
117
- verdict,
118
- })}\n`,
119
- "utf8",
120
- );
132
+ const diagnostic = { request_preview: raw.slice(0, 500), verdict };
133
+ if (!sharedDiagnostic(root, "agent_coord.verdict", diagnostic)) {
134
+ const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
135
+ await mkdir(dirname(logPath), { recursive: true });
136
+ await appendFile(
137
+ logPath,
138
+ `${JSON.stringify({ ts: new Date().toISOString(), ...diagnostic })}\n`,
139
+ "utf8",
140
+ );
141
+ }
121
142
 
122
143
  process.stdout.write(`${JSON.stringify(verdict)}\n`);
123
144
  return 0;
@@ -151,6 +172,64 @@ function adapterFromPlatform(platform: unknown): "claude-code" | "cursor" | "cod
151
172
  return "claude-code";
152
173
  }
153
174
 
175
+ const coordinationRetryCell = new Int32Array(new SharedArrayBuffer(4));
176
+ const COORDINATION_RETRY_ATTEMPTS = 240;
177
+ const COORDINATION_RETRY_DELAY_MS = 25;
178
+
179
+ function isRetryableCoordinationContention(error: unknown): boolean {
180
+ return (
181
+ error instanceof Error &&
182
+ error.message.includes(
183
+ "lease event-v3-coordination-producer is held by a live or unexpired owner",
184
+ )
185
+ );
186
+ }
187
+
188
+ function waitForCoordinationLease(): void {
189
+ Atomics.wait(coordinationRetryCell, 0, 0, COORDINATION_RETRY_DELAY_MS);
190
+ }
191
+
192
+ function pidIsAlive(pid: number): boolean {
193
+ if (!Number.isSafeInteger(pid) || pid < 1) return false;
194
+ try {
195
+ process.kill(pid, 0);
196
+ return true;
197
+ } catch (error) {
198
+ return (error as NodeJS.ErrnoException).code !== "ESRCH";
199
+ }
200
+ }
201
+
202
+ // The V3 producer lease begins after its caller has materialized and read the
203
+ // disposable heartbeat. Serialize that larger registration boundary per owner
204
+ // so overlapping first declarations cannot both derive state from an unnamed,
205
+ // missing heartbeat and then strand a conflicting authority transaction.
206
+ function acquireSetTaskLease(root: string, owner: string) {
207
+ const leasePath = join(root, ".harnery", "active", ".set-task-leases", `${owner}.lease`);
208
+ const authoritySha256 = createHash("sha256")
209
+ .update(resolve(root))
210
+ .update("\0")
211
+ .update(owner)
212
+ .digest("hex");
213
+ for (let attempt = 0; ; attempt += 1) {
214
+ try {
215
+ return acquireNoClobberLease({
216
+ path: leasePath,
217
+ scope: "agent-set-task",
218
+ authoritySha256,
219
+ staleAfterMs: 5_000,
220
+ validateStaleOwner: (leaseOwner) =>
221
+ leaseOwner.host === hostname() && !pidIsAlive(leaseOwner.pid),
222
+ });
223
+ } catch (error) {
224
+ const busy =
225
+ error instanceof Error &&
226
+ error.message.includes("lease agent-set-task is held by a live or unexpired owner");
227
+ if (!busy || attempt >= COORDINATION_RETRY_ATTEMPTS - 1) throw error;
228
+ waitForCoordinationLease();
229
+ }
230
+ }
231
+ }
232
+
154
233
  async function handleStateAction(root: string, action: string, rest: string[]): Promise<number> {
155
234
  const writer = await import("./state/heartbeat-writer.ts");
156
235
  const [owner, ...args] = rest;
@@ -162,36 +241,91 @@ async function handleStateAction(root: string, action: string, rest: string[]):
162
241
  switch (action) {
163
242
  case "set-task": {
164
243
  const task = args.join(" ");
165
- const before = writer.readHeartbeat(root, owner);
166
- let hb: ReturnType<typeof writer.setTask>;
244
+ let setTaskLease: ReturnType<typeof acquireSetTaskLease>;
167
245
  try {
168
- const { recordLiveTaskChangeV3 } = await import("./live-authority-v3.ts");
169
- recordLiveTaskChangeV3({
170
- coordRoot: root,
171
- owner,
172
- nativeSessionId: before?.session_id ?? owner,
173
- adapter: adapterFromPlatform(before?.platform),
174
- task,
175
- });
176
- hb = writer.readHeartbeat(root, owner);
246
+ setTaskLease = acquireSetTaskLease(root, owner);
177
247
  } catch (error) {
178
248
  process.stderr.write(
179
- `agent-coord set-task: V3 authority refused (${error instanceof Error ? error.message : String(error)})\n`,
249
+ `agent-coord set-task: registration lease refused (${error instanceof Error ? error.message : String(error)})\n`,
180
250
  );
181
251
  return 1;
182
252
  }
183
- if (!hb) {
184
- // Name the RESOLVED root: when a nested .harnery/ shadows the real
185
- // coordination home, the full path is what makes that diagnosable.
186
- process.stderr.write(
187
- `agent-coord set-task: no heartbeat at ${root}/.harnery/active/${owner}.json\n`,
253
+ try {
254
+ let before = writer.readHeartbeat(root, owner);
255
+ const humanFacing =
256
+ before?.kind !== "subagent" && before?.kind !== "transient" && !before?.workflow_run_id;
257
+ // A mid-flight-onboarded generation can exist before SessionStart's
258
+ // assign-name step ran. Repair that private display metadata before the
259
+ // first non-empty task mints its operator-facing title. assignName is the
260
+ // same durable, idempotent pool path used by normal SessionStart.
261
+ if (task && before && humanFacing && !before.name?.trim()) {
262
+ const { assignName } = await import("./state/names.ts");
263
+ const name = assignName(root, owner, "session");
264
+ before = writer.setAssignedNameCache(root, owner, name, "session");
265
+ if (!before) {
266
+ process.stderr.write(
267
+ `agent-coord set-task: could not restore assigned name for ${owner}\n`,
268
+ );
269
+ return 1;
270
+ }
271
+ }
272
+ let hb: ReturnType<typeof writer.setTask>;
273
+ try {
274
+ const { recordLiveTaskChangeV3 } = await import("./live-authority-v3.ts");
275
+ for (let attempt = 0; ; attempt += 1) {
276
+ try {
277
+ recordLiveTaskChangeV3({
278
+ coordRoot: root,
279
+ owner,
280
+ nativeSessionId: before?.session_id ?? owner,
281
+ adapter: adapterFromPlatform(before?.platform),
282
+ task,
283
+ });
284
+ break;
285
+ } catch (error) {
286
+ if (
287
+ !isRetryableCoordinationContention(error) ||
288
+ attempt >= COORDINATION_RETRY_ATTEMPTS - 1
289
+ ) {
290
+ throw error;
291
+ }
292
+ waitForCoordinationLease();
293
+ }
294
+ }
295
+ hb = writer.readHeartbeat(root, owner);
296
+ const currentHumanFacing =
297
+ hb?.kind !== "subagent" && hb?.kind !== "transient" && !hb?.workflow_run_id;
298
+ if (
299
+ task &&
300
+ hb &&
301
+ currentHumanFacing &&
302
+ (!hb.name?.trim() || /^Agent unknown - /.test(hb.suggested_session_name ?? ""))
303
+ ) {
304
+ const { assignName } = await import("./state/names.ts");
305
+ const name = hb.name?.trim() || assignName(root, owner, "session");
306
+ hb = writer.setAssignedNameCache(root, owner, name, "session");
307
+ }
308
+ } catch (error) {
309
+ process.stderr.write(
310
+ `agent-coord set-task: V3 authority refused (${error instanceof Error ? error.message : String(error)})\n`,
311
+ );
312
+ return 1;
313
+ }
314
+ if (!hb) {
315
+ // Name the RESOLVED root: when a nested .harnery/ shadows the real
316
+ // coordination home, the full path is what makes that diagnosable.
317
+ process.stderr.write(
318
+ `agent-coord set-task: no heartbeat at ${root}/.harnery/active/${owner}.json\n`,
319
+ );
320
+ return 1;
321
+ }
322
+ process.stdout.write(
323
+ `${JSON.stringify({ instance_id: owner, task: hb.task ?? null, cleared: !task })}\n`,
188
324
  );
189
- return 1;
325
+ return 0;
326
+ } finally {
327
+ setTaskLease.release();
190
328
  }
191
- process.stdout.write(
192
- `${JSON.stringify({ instance_id: owner, task: hb.task ?? null, cleared: !task })}\n`,
193
- );
194
- return 0;
195
329
  }
196
330
  case "release-claim": {
197
331
  const path = args[0];
@@ -271,10 +405,10 @@ async function handleStateAction(root: string, action: string, rest: string[]):
271
405
  adapter: adapterFromPlatform(adapter),
272
406
  });
273
407
  }
274
- const { ensureLiveCoordinationHeartbeat } = await import(
275
- "./state/live-coordination-view.ts"
408
+ const { repairLiveCoordinationHeartbeat } = await import(
409
+ "./state/live-coordination-writer.ts"
276
410
  );
277
- hb = ensureLiveCoordinationHeartbeat(
411
+ hb = repairLiveCoordinationHeartbeat(
278
412
  root,
279
413
  owner,
280
414
  sessionId ?? owner,
@@ -290,6 +424,66 @@ async function handleStateAction(root: string, action: string, rest: string[]):
290
424
  process.stdout.write(`${JSON.stringify({ instance_id: owner, recreated: !!hb })}\n`);
291
425
  return hb ? 0 : 1;
292
426
  }
427
+ case "quarantine-authority-transaction": {
428
+ const adapter = args.find((a) => a.startsWith("--adapter="))?.slice("--adapter=".length);
429
+ const positional = args.filter((a) => !a.startsWith("--"));
430
+ const [transactionId, approvalRecordId, sessionId] = positional;
431
+ if (!transactionId || !approvalRecordId) {
432
+ process.stderr.write(
433
+ "agent-coord quarantine-authority-transaction: missing <transaction-id> or <approval-record-id>\n",
434
+ );
435
+ return 2;
436
+ }
437
+ try {
438
+ const { coordinationAuthorityStateDigestV3, liveCoordinationWriteModeV3 } = await import(
439
+ "./live-authority-v3.ts"
440
+ );
441
+ liveCoordinationWriteModeV3(root);
442
+ const { liveInstanceIdV3 } = await import("../events/v3/live-routing.ts");
443
+ const { repairLiveCoordinationHeartbeat } = await import(
444
+ "./state/live-coordination-writer.ts"
445
+ );
446
+ const heartbeat = repairLiveCoordinationHeartbeat(
447
+ root,
448
+ owner,
449
+ sessionId ?? owner,
450
+ adapterFromPlatform(adapter),
451
+ );
452
+ if (!heartbeat) {
453
+ throw new Error("authoritative coordination cache could not be materialized");
454
+ }
455
+ const { quarantineConflictingCoordinationTransactionV3 } = await import(
456
+ "../events/v3/coordination-transaction-recovery.ts"
457
+ );
458
+ const receipt = quarantineConflictingCoordinationTransactionV3(root, {
459
+ transaction_id: transactionId,
460
+ actor_instance_id: liveInstanceIdV3(owner),
461
+ observed_current_state_digest: coordinationAuthorityStateDigestV3(heartbeat),
462
+ approval_record_id: approvalRecordId,
463
+ });
464
+ const repaired = repairLiveCoordinationHeartbeat(
465
+ root,
466
+ owner,
467
+ sessionId ?? owner,
468
+ adapterFromPlatform(adapter),
469
+ );
470
+ process.stdout.write(
471
+ `${JSON.stringify({
472
+ instance_id: owner,
473
+ receipt,
474
+ heartbeat: repaired
475
+ ? { task_state: repaired.task_state, files_touched: repaired.files_touched }
476
+ : null,
477
+ })}\n`,
478
+ );
479
+ return repaired ? 0 : 1;
480
+ } catch (error) {
481
+ process.stderr.write(
482
+ `agent-coord quarantine-authority-transaction: recovery refused (${error instanceof Error ? error.message : String(error)})\n`,
483
+ );
484
+ return 1;
485
+ }
486
+ }
293
487
  default:
294
488
  process.stderr.write(`agent-coord: unknown state action ${action}\n`);
295
489
  return 2;
@@ -567,6 +761,7 @@ async function handlePromptContext(root: string, rest: string[]): Promise<number
567
761
  const agentName = args.name;
568
762
  const sessionNameNudge = args["session-name-nudge"] === "true";
569
763
  const taskNudge = args["task-nudge"] === "true";
764
+ const hostPromptReminder = args["host-prompt-reminder"] === "true";
570
765
  const statusFooterNudge = args["status-footer-nudge"] === "true";
571
766
  // Value is the adapter id; a bare flag (parsed as "true") still enables the
572
767
  // reminder with the adapter-neutral wording.
@@ -574,7 +769,7 @@ async function handlePromptContext(root: string, rest: string[]): Promise<number
574
769
  args["turn-ritual-nudge"] === "true" ? "generic" : args["turn-ritual-nudge"];
575
770
  if (!instanceId) {
576
771
  process.stderr.write(
577
- "agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n",
772
+ "agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--host-prompt-reminder] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n",
578
773
  );
579
774
  return 2;
580
775
  }
@@ -586,6 +781,7 @@ async function handlePromptContext(root: string, rest: string[]): Promise<number
586
781
  agentName,
587
782
  sessionNameNudge,
588
783
  taskNudge,
784
+ hostPromptReminder,
589
785
  statusFooterNudge,
590
786
  turnRitualNudge,
591
787
  });
@@ -804,12 +1000,15 @@ async function handleGitHook(fallbackRoot: string, rest: string[]): Promise<numb
804
1000
  });
805
1001
  // Forensics channel shared with the stdin `verdict` path.
806
1002
  try {
807
- const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
808
- await mkdir(dirname(logPath), { recursive: true });
809
- await appendFile(
810
- logPath,
811
- `${JSON.stringify({ ts: new Date().toISOString(), via: "git-hook", staged, verdict: result })}\n`,
812
- );
1003
+ const diagnostic = { via: "git-hook", staged, verdict: result };
1004
+ if (!sharedDiagnostic(root, "agent_coord.git_hook_verdict", diagnostic)) {
1005
+ const logPath = join(root, ".harnery", "debug", "agent-coord-verdict.ndjson");
1006
+ await mkdir(dirname(logPath), { recursive: true });
1007
+ await appendFile(
1008
+ logPath,
1009
+ `${JSON.stringify({ ts: new Date().toISOString(), ...diagnostic })}\n`,
1010
+ );
1011
+ }
813
1012
  } catch {
814
1013
  /* diagnostics never break a verdict */
815
1014
  }
@@ -894,7 +1093,8 @@ async function main(): Promise<number> {
894
1093
  subcommand === "set-task" ||
895
1094
  subcommand === "release-claim" ||
896
1095
  subcommand === "heal-pidmap" ||
897
- subcommand === "repair-coordination-cache"
1096
+ subcommand === "repair-coordination-cache" ||
1097
+ subcommand === "quarantine-authority-transaction"
898
1098
  ) {
899
1099
  return handleStateAction(root, subcommand, rest);
900
1100
  }
@@ -961,19 +1161,25 @@ async function main(): Promise<number> {
961
1161
  }
962
1162
 
963
1163
  main()
964
- .then((code) => process.exit(code))
965
- .catch((err) => {
1164
+ .then(async (code) => {
1165
+ await closeProcessLoggers();
1166
+ process.exit(code);
1167
+ })
1168
+ .catch(async (err) => {
966
1169
  try {
967
1170
  const root = findCoordRoot(process.cwd());
968
1171
  if (root) {
969
- const path = join(root, ".harnery", "debug", "agent-coord.errors.ndjson");
970
- appendFileSync(
971
- path,
972
- `${JSON.stringify({ ts: new Date().toISOString(), error: String(err) })}\n`,
973
- );
1172
+ if (!sharedDiagnostic(root, "agent_coord.error", {}, err)) {
1173
+ const path = join(root, ".harnery", "debug", "agent-coord.errors.ndjson");
1174
+ appendFileSync(
1175
+ path,
1176
+ `${JSON.stringify({ ts: new Date().toISOString(), error: String(err) })}\n`,
1177
+ );
1178
+ }
974
1179
  }
975
1180
  } catch {
976
1181
  /* swallow */
977
1182
  }
1183
+ await closeProcessLoggers();
978
1184
  process.exit(0);
979
1185
  });
@@ -347,9 +347,10 @@ function readPidmapRow(pidmapDir: string, pid: number): string | null {
347
347
  * Prefer a row whose platform matches `HARNERY_AGENT_COORD_PLATFORM` (default
348
348
  * `claude-code`); otherwise return the first owner seen on the walk.
349
349
  *
350
- * Subagents intentionally do not write pid-map entries; a Bash-tool ppid-walk
351
- * from inside a subagent therefore resolves to the *parent's* pid-map entry.
352
- * v1 ships this behavior; a real subagent-aware bridge is out of scope.
350
+ * Subagents intentionally do not write pid-map entries; a bare Bash-tool
351
+ * ppid-walk from inside an unbridged child therefore resolves to the parent's
352
+ * pid-map entry. Native hook bridges supersede this fallback through the
353
+ * child session environment.
353
354
  */
354
355
  export function resolveOwner(): string | null {
355
356
  return resolveOwnerWithSource().owner;
@@ -381,9 +382,36 @@ export function resolveOwnerWithSource(): {
381
382
  // Every supported adapter exports its native session id into subprocesses.
382
383
  // Match it against the live V3 producer state, never a disposable cache.
383
384
  if (shouldPreferSessionEnv()) {
384
- const bySession = resolveOwnerBySessionEnv(root);
385
+ const bySession = resolveOwnerBySessionEnvDetailed(root);
385
386
  if (bySession) {
386
- return { owner: bySession, source: "session_env" };
387
+ // Env vars cross process boundaries that session identity does not: a
388
+ // nested different-adapter child inherits its spawner's exported id (a
389
+ // Codex session's CODEX_THREAD_ID survives into a `claude -p` child's
390
+ // shells untouched), and that stale statement joins the spawner's live
391
+ // producer. The nearest token-verified pid-map anchor names the session
392
+ // whose tool environment this process actually runs in, so on a
393
+ // CROSS-adapter conflict the anchor wins — the anchoring adapter never
394
+ // stamps another adapter's variable, so a foreign-adapter id here is
395
+ // inherited context, while the anchor row is re-healed on every tool
396
+ // call. A SAME-adapter conflict keeps the env: the adapter stamps its
397
+ // own variable fresh per tool call, and the row may lag one heal (e.g.
398
+ // a session id change inside one process). Only per-session-process
399
+ // adapters may anchor (claude-code, codex) — Cursor sessions share one
400
+ // terminal process, so a verified Cursor row can belong to a sibling
401
+ // session. Unverified rows keep losing to the env too: without a start
402
+ // token the row is the guess the env ordering was introduced to beat.
403
+ // Never for bridge-marked children: a connector crosses a process-tree
404
+ // boundary, so an anchor in THIS tree is someone else's by definition.
405
+ const anchor = bridge ? null : nearestVerifiedSessionAnchor(root);
406
+ if (
407
+ anchor &&
408
+ anchor.owner !== bySession.owner &&
409
+ !bySession.adapters.includes(anchor.platform) &&
410
+ (anchor.platform === "claude-code" || anchor.platform === "codex")
411
+ ) {
412
+ return { owner: anchor.owner, source: "pidmap" };
413
+ }
414
+ return { owner: bySession.owner, source: "session_env" };
387
415
  }
388
416
  }
389
417
 
@@ -410,6 +438,42 @@ export function resolveOwnerWithSource(): {
410
438
  return { owner: null, source: "none" };
411
439
  }
412
440
 
441
+ /**
442
+ * The nearest pid-map anchor on our own ppid chain whose start token PROVES the
443
+ * row still describes the process holding that pid, or null when the nearest
444
+ * row is unverified, recycled, or absent.
445
+ *
446
+ * Nearest matters: in a nested-agent tree (session A spawns a headless session
447
+ * B whose shell runs this code), both A's and B's adapter processes are
448
+ * ancestors, and only the innermost one owns this process's tool environment.
449
+ * Exported for unit testing with an injectable root.
450
+ */
451
+ export function nearestVerifiedSessionAnchor(
452
+ root: string,
453
+ ): { owner: string; platform: string } | null {
454
+ const pidmapDir = resolve(root, ".harnery", "pid-map");
455
+ if (!existsSync(pidmapDir)) return null;
456
+ let pid: number | null = process.pid;
457
+ for (let hop = 0; hop < 20; hop++) {
458
+ if (pid === null) break;
459
+ const row = readPidmapRow(pidmapDir, pid);
460
+ if (row) {
461
+ const owner = parsePidmapRowOwner(row);
462
+ if (owner && !pidWasRecycled(pid, row)) {
463
+ // A recycled row is about a dead process's tenure of this pid — walk
464
+ // past it like the owner walk does. A live row without a provable
465
+ // token match is the nearest anchor but not a VERIFIED one: stop and
466
+ // report none, so the session env keeps outranking guesses.
467
+ const token = parsePidmapRowStartToken(row);
468
+ if (!token || !pidStartToken(pid)) return null;
469
+ return { owner, platform: parsePidmapRowPlatform(row) };
470
+ }
471
+ }
472
+ pid = readPpid(pid);
473
+ }
474
+ return null;
475
+ }
476
+
413
477
  /**
414
478
  * Walk our own ppid chain for a pid-map row in ONE given root.
415
479
  *
@@ -524,17 +588,37 @@ function shouldPreferSessionEnv(): boolean {
524
588
  * Exported for unit testing with an injectable root.
525
589
  */
526
590
  export function resolveOwnerBySessionEnv(root: string): string | null {
591
+ return resolveOwnerBySessionEnvDetailed(root)?.owner ?? null;
592
+ }
593
+
594
+ /**
595
+ * `resolveOwnerBySessionEnv` plus WHICH adapter's producer state the session id
596
+ * joined. The caller uses the adapter to tell a same-adapter conflict (the env
597
+ * var is stamped fresh per tool call and outranks a possibly-lagging pid-map
598
+ * row) from a cross-adapter one (the var is inherited context from an outer
599
+ * session and the verified row wins).
600
+ */
601
+ export function resolveOwnerBySessionEnvDetailed(
602
+ root: string,
603
+ ): { owner: string; adapters: string[] } | null {
527
604
  const sessionIds = sessionIdsFromEnv();
528
605
  if (sessionIds.length === 0) return null;
529
606
  const adapters = adapterCandidatesFromEnv();
530
- const matches = new Set<string>();
607
+ const matches = new Map<string, Set<string>>();
531
608
  for (const sessionId of sessionIds) {
532
609
  for (const adapter of adapters) {
533
610
  const state = readHookProducerStateV3(root, adapter, sessionId);
534
- if (state && !state.terminal) matches.add(nativeOwnerForV3Instance(root, state.instance_id));
611
+ if (state && !state.terminal) {
612
+ const owner = nativeOwnerForV3Instance(root, state.instance_id);
613
+ const set = matches.get(owner) ?? new Set<string>();
614
+ set.add(adapter);
615
+ matches.set(owner, set);
616
+ }
535
617
  }
536
618
  }
537
- return matches.size === 1 ? [...matches][0]! : null;
619
+ if (matches.size !== 1) return null;
620
+ const [owner, adapterSet] = [...matches.entries()][0]!;
621
+ return { owner, adapters: [...adapterSet] };
538
622
  }
539
623
 
540
624
  /**