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