harnery 0.33.0 → 0.34.1

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 (657) hide show
  1. package/dist/commander.d.ts.map +1 -1
  2. package/dist/commander.js +4 -0
  3. package/dist/commands/adapter.js +2 -2
  4. package/dist/commands/agents.d.ts +144 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +1237 -590
  7. package/dist/commands/artifacts.d.ts.map +1 -1
  8. package/dist/commands/artifacts.js +7 -6
  9. package/dist/commands/backup.d.ts +1 -1
  10. package/dist/commands/backup.d.ts.map +1 -1
  11. package/dist/commands/backup.js +29 -16
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +234 -12
  14. package/dist/commands/checkpoint.d.ts.map +1 -1
  15. package/dist/commands/checkpoint.js +3 -2
  16. package/dist/commands/claude-desktop.d.ts +1 -1
  17. package/dist/commands/claude-desktop.d.ts.map +1 -1
  18. package/dist/commands/claude-desktop.js +3 -74
  19. package/dist/commands/context.js +1 -6
  20. package/dist/commands/decision.d.ts.map +1 -1
  21. package/dist/commands/decision.js +22 -38
  22. package/dist/commands/docs.d.ts.map +1 -1
  23. package/dist/commands/docs.js +91 -28
  24. package/dist/commands/doctor.js +10 -1
  25. package/dist/commands/events.d.ts +5 -0
  26. package/dist/commands/events.d.ts.map +1 -0
  27. package/dist/commands/events.js +189 -0
  28. package/dist/commands/governor.d.ts.map +1 -1
  29. package/dist/commands/governor.js +13 -4
  30. package/dist/commands/init.d.ts +9 -2
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +223 -51
  33. package/dist/commands/journal.d.ts.map +1 -1
  34. package/dist/commands/journal.js +4 -13
  35. package/dist/commands/ledger-v3.d.ts +5 -0
  36. package/dist/commands/ledger-v3.d.ts.map +1 -0
  37. package/dist/commands/ledger-v3.js +91 -0
  38. package/dist/commands/presence.d.ts.map +1 -1
  39. package/dist/commands/presence.js +11 -5
  40. package/dist/commands/sync.d.ts +1 -1
  41. package/dist/commands/sync.js +1 -1
  42. package/dist/commands/web.d.ts +6 -0
  43. package/dist/commands/web.d.ts.map +1 -1
  44. package/dist/commands/web.js +67 -7
  45. package/dist/commands/work.d.ts.map +1 -1
  46. package/dist/commands/work.js +22 -5
  47. package/dist/core/adapter.d.ts +5 -0
  48. package/dist/core/adapter.d.ts.map +1 -0
  49. package/dist/core/adapter.js +1 -0
  50. package/dist/core/adapters/attest.d.ts +5 -2
  51. package/dist/core/adapters/attest.d.ts.map +1 -1
  52. package/dist/core/adapters/attest.js +8 -3
  53. package/dist/core/adapters/profiles.d.ts +6 -6
  54. package/dist/core/adapters/profiles.d.ts.map +1 -1
  55. package/dist/core/adapters/profiles.js +4 -4
  56. package/dist/core/agents/canonical-emit.d.ts +17 -15
  57. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  58. package/dist/core/agents/canonical-emit.js +22 -22
  59. package/dist/core/agents/cli.js +207 -234
  60. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  61. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  62. package/dist/core/agents/codex-archive-v3.js +110 -0
  63. package/dist/core/agents/coord-client.d.ts +19 -81
  64. package/dist/core/agents/coord-client.d.ts.map +1 -1
  65. package/dist/core/agents/coord-client.js +65 -155
  66. package/dist/core/agents/finalization.d.ts +4 -1
  67. package/dist/core/agents/finalization.d.ts.map +1 -1
  68. package/dist/core/agents/finalization.js +89 -32
  69. package/dist/core/agents/index.d.ts +4 -5
  70. package/dist/core/agents/index.d.ts.map +1 -1
  71. package/dist/core/agents/index.js +4 -5
  72. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  73. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  74. package/dist/core/agents/live-authority-v3.js +233 -0
  75. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  76. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  77. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  78. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  79. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-observation-v3.js +157 -0
  81. package/dist/core/agents/render/prompt-context.d.ts +4 -4
  82. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  83. package/dist/core/agents/render/prompt-context.js +23 -58
  84. package/dist/core/agents/render/session-context.d.ts +1 -1
  85. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  86. package/dist/core/agents/render/session-context.js +8 -32
  87. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  88. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  89. package/dist/core/agents/rules/claim-conflict.js +79 -127
  90. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  91. package/dist/core/agents/rules/commit-conflict.js +3 -18
  92. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  93. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  94. package/dist/core/agents/rules/stop-hook.js +193 -236
  95. package/dist/core/agents/session-events.d.ts +5 -7
  96. package/dist/core/agents/session-events.d.ts.map +1 -1
  97. package/dist/core/agents/session-events.js +127 -95
  98. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  99. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  100. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  101. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  102. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  103. package/dist/core/agents/session-finalizer-v3.js +734 -0
  104. package/dist/core/agents/session-name-display.d.ts +40 -0
  105. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  106. package/dist/core/agents/session-name-display.js +119 -0
  107. package/dist/core/agents/state/activity-log.d.ts +3 -3
  108. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  109. package/dist/core/agents/state/activity-log.js +7 -16
  110. package/dist/core/agents/state/heartbeat-writer.d.ts +23 -55
  111. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  112. package/dist/core/agents/state/heartbeat-writer.js +56 -228
  113. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  114. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-view.js +209 -0
  116. package/dist/core/agents/state/session-state.d.ts +4 -3
  117. package/dist/core/agents/state/session-state.d.ts.map +1 -1
  118. package/dist/core/agents/state/session-state.js +18 -9
  119. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  120. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  121. package/dist/core/agents/state/stale-sweep.js +26 -15
  122. package/dist/core/artifacts/index.d.ts.map +1 -1
  123. package/dist/core/artifacts/index.js +5 -7
  124. package/dist/core/config.d.ts +33 -2
  125. package/dist/core/config.d.ts.map +1 -1
  126. package/dist/core/config.js +98 -2
  127. package/dist/core/context/index.d.ts +1 -4
  128. package/dist/core/context/index.d.ts.map +1 -1
  129. package/dist/core/context/index.js +9 -9
  130. package/dist/core/events/span-parent.d.ts +15 -0
  131. package/dist/core/events/span-parent.d.ts.map +1 -0
  132. package/dist/core/events/span-parent.js +34 -0
  133. package/dist/core/events/v3/advance.d.ts +14 -0
  134. package/dist/core/events/v3/advance.d.ts.map +1 -0
  135. package/dist/core/events/v3/advance.js +134 -0
  136. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  137. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  138. package/dist/core/events/v3/authority-outbox.js +399 -0
  139. package/dist/core/events/v3/base-builder.d.ts +20 -0
  140. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  141. package/dist/core/events/v3/base-builder.js +29 -0
  142. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  143. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  144. package/dist/core/events/v3/base-contract.js +647 -0
  145. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  146. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  147. package/dist/core/events/v3/bootstrap.js +175 -0
  148. package/dist/core/events/v3/builder.d.ts +20 -0
  149. package/dist/core/events/v3/builder.d.ts.map +1 -0
  150. package/dist/core/events/v3/builder.js +28 -0
  151. package/dist/core/events/v3/canonical.d.ts +31 -0
  152. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  153. package/dist/core/events/v3/canonical.js +100 -0
  154. package/dist/core/events/v3/capabilities.d.ts +31 -0
  155. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  156. package/dist/core/events/v3/capabilities.js +107 -0
  157. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  158. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  159. package/dist/core/events/v3/capability-drift.js +134 -0
  160. package/dist/core/events/v3/catalog.d.ts +38 -0
  161. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  162. package/dist/core/events/v3/catalog.js +135 -0
  163. package/dist/core/events/v3/clock-order.d.ts +34 -0
  164. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  165. package/dist/core/events/v3/clock-order.js +35 -0
  166. package/dist/core/events/v3/contract.d.ts +171 -0
  167. package/dist/core/events/v3/contract.d.ts.map +1 -0
  168. package/dist/core/events/v3/contract.js +180 -0
  169. package/dist/core/events/v3/control.d.ts +111 -0
  170. package/dist/core/events/v3/control.d.ts.map +1 -0
  171. package/dist/core/events/v3/control.js +419 -0
  172. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  173. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  174. package/dist/core/events/v3/coordination-view.js +119 -0
  175. package/dist/core/events/v3/economics.d.ts +77 -0
  176. package/dist/core/events/v3/economics.d.ts.map +1 -0
  177. package/dist/core/events/v3/economics.js +274 -0
  178. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  179. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/finalization-view.js +37 -0
  181. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  182. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  183. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  184. package/dist/core/events/v3/generated.d.ts +4 -0
  185. package/dist/core/events/v3/generated.d.ts.map +1 -0
  186. package/dist/core/events/v3/generated.js +47 -0
  187. package/dist/core/events/v3/ids.d.ts +9 -0
  188. package/dist/core/events/v3/ids.d.ts.map +1 -0
  189. package/dist/core/events/v3/ids.js +25 -0
  190. package/dist/core/events/v3/index.d.ts +35 -0
  191. package/dist/core/events/v3/index.d.ts.map +1 -0
  192. package/dist/core/events/v3/index.js +33 -0
  193. package/dist/core/events/v3/latency.d.ts +63 -0
  194. package/dist/core/events/v3/latency.d.ts.map +1 -0
  195. package/dist/core/events/v3/latency.js +412 -0
  196. package/dist/core/events/v3/live-feed.d.ts +45 -0
  197. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  198. package/dist/core/events/v3/live-feed.js +246 -0
  199. package/dist/core/events/v3/live-observation.d.ts +35 -0
  200. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  201. package/dist/core/events/v3/live-observation.js +1 -0
  202. package/dist/core/events/v3/live-routing.d.ts +57 -0
  203. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-routing.js +107 -0
  205. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  206. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  207. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  208. package/dist/core/events/v3/producers/command.d.ts +50 -0
  209. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  210. package/dist/core/events/v3/producers/command.js +135 -0
  211. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  212. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  214. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  215. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/coordination.js +229 -0
  217. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  218. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/hook-base.js +424 -0
  220. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  221. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/hook.js +71 -0
  223. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  224. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/intake.js +244 -0
  226. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  227. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/recorder.js +2176 -0
  229. package/dist/core/events/v3/projection.d.ts +101 -0
  230. package/dist/core/events/v3/projection.d.ts.map +1 -0
  231. package/dist/core/events/v3/projection.js +479 -0
  232. package/dist/core/events/v3/reader.d.ts +75 -0
  233. package/dist/core/events/v3/reader.d.ts.map +1 -0
  234. package/dist/core/events/v3/reader.js +778 -0
  235. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  236. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  237. package/dist/core/events/v3/recovery-record.js +167 -0
  238. package/dist/core/events/v3/recovery.d.ts +22 -0
  239. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  240. package/dist/core/events/v3/recovery.js +227 -0
  241. package/dist/core/events/v3/span-state.d.ts +52 -0
  242. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  243. package/dist/core/events/v3/span-state.js +142 -0
  244. package/dist/core/events/v3/targets.d.ts +23 -0
  245. package/dist/core/events/v3/targets.d.ts.map +1 -0
  246. package/dist/core/events/v3/targets.js +134 -0
  247. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  248. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  249. package/dist/core/events/v3/turn-telemetry.js +168 -0
  250. package/dist/core/events/v3/validate.d.ts +9 -0
  251. package/dist/core/events/v3/validate.d.ts.map +1 -0
  252. package/dist/core/events/v3/validate.js +281 -0
  253. package/dist/core/events/v3/writer.d.ts +56 -0
  254. package/dist/core/events/v3/writer.d.ts.map +1 -0
  255. package/dist/core/events/v3/writer.js +335 -0
  256. package/dist/core/governor/index.d.ts +1 -1
  257. package/dist/core/governor/index.d.ts.map +1 -1
  258. package/dist/core/governor/index.js +1 -1
  259. package/dist/core/governor/plan-api.d.ts +2 -1
  260. package/dist/core/governor/plan-api.d.ts.map +1 -1
  261. package/dist/core/governor/plan-api.js +6 -3
  262. package/dist/core/governor/read.d.ts +1 -1
  263. package/dist/core/governor/read.d.ts.map +1 -1
  264. package/dist/core/governor/read.js +1 -1
  265. package/dist/core/governor/state.d.ts +9 -0
  266. package/dist/core/governor/state.d.ts.map +1 -1
  267. package/dist/core/governor/state.js +40 -3
  268. package/dist/core/guard/config.d.ts +5 -0
  269. package/dist/core/guard/config.d.ts.map +1 -0
  270. package/dist/core/guard/config.js +157 -0
  271. package/dist/core/guard/coordinator.d.ts +14 -0
  272. package/dist/core/guard/coordinator.d.ts.map +1 -0
  273. package/dist/core/guard/coordinator.js +173 -0
  274. package/dist/core/guard/evaluator.d.ts +4 -0
  275. package/dist/core/guard/evaluator.d.ts.map +1 -0
  276. package/dist/core/guard/evaluator.js +242 -0
  277. package/dist/core/guard/evidence-v3.d.ts +15 -0
  278. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  279. package/dist/core/guard/evidence-v3.js +171 -0
  280. package/dist/core/guard/index.d.ts +10 -0
  281. package/dist/core/guard/index.d.ts.map +1 -0
  282. package/dist/core/guard/index.js +6 -0
  283. package/dist/core/guard/live-source-v3.d.ts +40 -0
  284. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  285. package/dist/core/guard/live-source-v3.js +128 -0
  286. package/dist/core/guard/storage.d.ts +27 -0
  287. package/dist/core/guard/storage.d.ts.map +1 -0
  288. package/dist/core/guard/storage.js +140 -0
  289. package/dist/core/guard/types.d.ts +119 -0
  290. package/dist/core/guard/types.d.ts.map +1 -0
  291. package/dist/core/guard/types.js +1 -0
  292. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  293. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  294. package/dist/core/hooks/adapter/detect.js +29 -0
  295. package/dist/core/hooks/adapter/events.d.ts +7 -4
  296. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  297. package/dist/core/hooks/adapter/events.js +12 -4
  298. package/dist/core/hooks/adapter/output.d.ts +2 -2
  299. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  301. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  302. package/dist/core/hooks/adapter/parse.js +63 -25
  303. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  304. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  305. package/dist/core/hooks/adapter/wiring.js +89 -11
  306. package/dist/core/hooks/cli.d.ts +1 -1
  307. package/dist/core/hooks/cli.js +306 -444
  308. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  309. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  310. package/dist/core/hooks/effects/image-capture.js +212 -221
  311. package/dist/core/hooks/effects/index.d.ts +1 -9
  312. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  313. package/dist/core/hooks/effects/index.js +1 -24
  314. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  315. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  316. package/dist/core/hooks/events/input-hash.js +43 -0
  317. package/dist/core/hooks/index.d.ts +4 -3
  318. package/dist/core/hooks/index.d.ts.map +1 -1
  319. package/dist/core/hooks/index.js +2 -3
  320. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  321. package/dist/core/hooks/resolve/coord-root.js +1 -1
  322. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  323. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  324. package/dist/core/hooks/resolve/owner.js +51 -42
  325. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  326. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  327. package/dist/core/hooks/resolve/transcript.js +161 -14
  328. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  329. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  330. package/dist/core/hooks/session-name-presence.js +15 -15
  331. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  332. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  333. package/dist/core/journal/index.d.ts +2 -2
  334. package/dist/core/journal/index.d.ts.map +1 -1
  335. package/dist/core/journal/index.js +9 -22
  336. package/dist/core/presence/blob.d.ts +4 -3
  337. package/dist/core/presence/blob.d.ts.map +1 -1
  338. package/dist/core/presence/blob.js +45 -44
  339. package/dist/core/presence/codec-digest.d.ts +29 -0
  340. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  341. package/dist/core/presence/codec-digest.js +170 -0
  342. package/dist/core/presence/relay-client.d.ts +1 -1
  343. package/dist/core/presence/relay-client.d.ts.map +1 -1
  344. package/dist/core/presence/relay-client.js +5 -5
  345. package/dist/core/work/index.d.ts +1 -1
  346. package/dist/core/work/index.d.ts.map +1 -1
  347. package/dist/core/work/index.js +1 -1
  348. package/dist/core/work/read.d.ts +1 -1
  349. package/dist/core/work/read.d.ts.map +1 -1
  350. package/dist/core/work/read.js +1 -1
  351. package/dist/core/work/runner.d.ts.map +1 -1
  352. package/dist/core/work/runner.js +6 -0
  353. package/dist/core/work/state.d.ts +9 -0
  354. package/dist/core/work/state.d.ts.map +1 -1
  355. package/dist/core/work/state.js +17 -3
  356. package/dist/core/workflow/engine.js +24 -25
  357. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  358. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  359. package/dist/core/workflow/live-session-v3.js +86 -0
  360. package/dist/core/workflow/scope-id.d.ts +3 -0
  361. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  362. package/dist/core/workflow/scope-id.js +5 -0
  363. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  364. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  365. package/dist/core/workflow/workspaces/leases.js +53 -19
  366. package/dist/index.d.ts +1 -1
  367. package/dist/index.js +1 -1
  368. package/dist/lib/browser/client.d.ts +41 -0
  369. package/dist/lib/browser/client.d.ts.map +1 -1
  370. package/dist/lib/browser/client.js +203 -0
  371. package/dist/lib/browser/critique.d.ts +28 -2
  372. package/dist/lib/browser/critique.d.ts.map +1 -1
  373. package/dist/lib/browser/critique.js +74 -18
  374. package/dist/lib/browser/geometry.d.ts +1 -1
  375. package/dist/lib/browser/geometry.d.ts.map +1 -1
  376. package/dist/lib/browser/geometry.js +130 -6
  377. package/dist/lib/browser/index.d.ts +3 -0
  378. package/dist/lib/browser/index.d.ts.map +1 -1
  379. package/dist/lib/browser/index.js +3 -0
  380. package/dist/lib/browser/qa-plan.d.ts +174 -0
  381. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  382. package/dist/lib/browser/qa-plan.js +321 -0
  383. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  384. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  385. package/dist/lib/browser/qa-reuse.js +222 -0
  386. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  387. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  388. package/dist/lib/browser/qa-snapshot.js +171 -0
  389. package/dist/lib/browser/runts.d.ts.map +1 -1
  390. package/dist/lib/browser/runts.js +22 -1
  391. package/dist/lib/browser/tiling.d.ts +71 -0
  392. package/dist/lib/browser/tiling.d.ts.map +1 -0
  393. package/dist/lib/browser/tiling.js +118 -0
  394. package/dist/lib/claude-desktop.d.ts +0 -47
  395. package/dist/lib/claude-desktop.d.ts.map +1 -1
  396. package/dist/lib/claude-desktop.js +1 -169
  397. package/dist/lib/context/index.d.ts +0 -3
  398. package/dist/lib/context/index.d.ts.map +1 -1
  399. package/dist/lib/context/index.js +20 -42
  400. package/dist/lib/council/index.d.ts +2 -2
  401. package/dist/lib/council/index.d.ts.map +1 -1
  402. package/dist/lib/council/index.js +9 -20
  403. package/dist/lib/docs-frontmatter.d.ts +1 -6
  404. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  405. package/dist/lib/docs-frontmatter.js +12 -78
  406. package/dist/lib/docs-index.d.ts +9 -0
  407. package/dist/lib/docs-index.d.ts.map +1 -1
  408. package/dist/lib/docs-index.js +32 -3
  409. package/dist/lib/docs-lint.d.ts.map +1 -1
  410. package/dist/lib/docs-lint.js +14 -30
  411. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  412. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  413. package/dist/lib/docs-metadata-audit.js +132 -0
  414. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  415. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  416. package/dist/lib/docs-metadata-managed.js +78 -0
  417. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  418. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  419. package/dist/lib/docs-metadata-sync.js +222 -0
  420. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  421. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  422. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  423. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  424. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  425. package/dist/lib/docs-metadata-v2.js +424 -0
  426. package/dist/lib/docs-new.d.ts +11 -0
  427. package/dist/lib/docs-new.d.ts.map +1 -0
  428. package/dist/lib/docs-new.js +52 -0
  429. package/dist/lib/docs-sweep.d.ts.map +1 -1
  430. package/dist/lib/docs-sweep.js +45 -29
  431. package/dist/lib/headless/index.d.ts +98 -0
  432. package/dist/lib/headless/index.d.ts.map +1 -0
  433. package/dist/lib/headless/index.js +211 -0
  434. package/dist/lib/identities/assume.d.ts +4 -4
  435. package/dist/lib/identities/assume.d.ts.map +1 -1
  436. package/dist/lib/identities/assume.js +52 -68
  437. package/dist/lib/instructions/apply.d.ts +5 -4
  438. package/dist/lib/instructions/apply.d.ts.map +1 -1
  439. package/dist/lib/instructions/apply.js +32 -20
  440. package/dist/lib/instructions/bundle.d.ts +1 -1
  441. package/dist/lib/instructions/bundle.d.ts.map +1 -1
  442. package/dist/lib/instructions/bundle.js +1 -1
  443. package/dist/lib/instructions/splice.d.ts +0 -1
  444. package/dist/lib/instructions/splice.d.ts.map +1 -1
  445. package/dist/lib/instructions/splice.js +22 -6
  446. package/dist/lib/instructions/templates.d.ts +7 -5
  447. package/dist/lib/instructions/templates.d.ts.map +1 -1
  448. package/dist/lib/instructions/templates.js +79 -9
  449. package/package.json +26 -5
  450. package/schemas/config.schema.json +120 -2
  451. package/schemas/docs-metadata-v2.schema.json +441 -0
  452. package/schemas/event-v3.schema.json +24472 -0
  453. package/src/commander.ts +4 -0
  454. package/src/commands/adapter.ts +2 -2
  455. package/src/commands/agents.ts +1530 -593
  456. package/src/commands/artifacts.ts +7 -6
  457. package/src/commands/backup.ts +29 -21
  458. package/src/commands/browse.ts +349 -8
  459. package/src/commands/checkpoint.ts +4 -3
  460. package/src/commands/claude-desktop.ts +2 -101
  461. package/src/commands/context.ts +1 -6
  462. package/src/commands/decision.ts +27 -44
  463. package/src/commands/docs.ts +100 -33
  464. package/src/commands/doctor.ts +14 -1
  465. package/src/commands/events.ts +256 -0
  466. package/src/commands/governor.ts +18 -4
  467. package/src/commands/init.ts +253 -57
  468. package/src/commands/instructions.ts +1 -1
  469. package/src/commands/journal.ts +4 -13
  470. package/src/commands/ledger-v3.ts +111 -0
  471. package/src/commands/presence.ts +11 -10
  472. package/src/commands/sync.ts +1 -1
  473. package/src/commands/web.ts +67 -8
  474. package/src/commands/work.ts +28 -5
  475. package/src/core/adapter.ts +5 -0
  476. package/src/core/adapters/attest.ts +8 -3
  477. package/src/core/adapters/profiles.ts +4 -6
  478. package/src/core/agents/canonical-emit.ts +34 -25
  479. package/src/core/agents/cli.ts +236 -262
  480. package/src/core/agents/codex-archive-v3.ts +138 -0
  481. package/src/core/agents/coord-client.ts +75 -188
  482. package/src/core/agents/finalization.ts +120 -38
  483. package/src/core/agents/index.ts +4 -5
  484. package/src/core/agents/live-authority-v3.ts +375 -0
  485. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  486. package/src/core/agents/live-observation-v3.ts +216 -0
  487. package/src/core/agents/render/prompt-context.ts +29 -60
  488. package/src/core/agents/render/session-context.ts +10 -31
  489. package/src/core/agents/rules/claim-conflict.ts +85 -126
  490. package/src/core/agents/rules/commit-conflict.ts +3 -14
  491. package/src/core/agents/rules/stop-hook.ts +239 -293
  492. package/src/core/agents/session-events.ts +137 -104
  493. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  494. package/src/core/agents/session-finalizer-v3.ts +953 -0
  495. package/src/core/agents/session-name-display.ts +149 -0
  496. package/src/core/agents/state/activity-log.ts +6 -14
  497. package/src/core/agents/state/heartbeat-writer.ts +82 -277
  498. package/src/core/agents/state/live-coordination-view.ts +290 -0
  499. package/src/core/agents/state/session-state.ts +24 -12
  500. package/src/core/agents/state/stale-sweep.ts +40 -17
  501. package/src/core/artifacts/index.ts +4 -5
  502. package/src/core/config.ts +148 -3
  503. package/src/core/context/index.ts +9 -17
  504. package/src/core/events/span-parent.ts +46 -0
  505. package/src/core/events/v3/advance.ts +168 -0
  506. package/src/core/events/v3/authority-outbox.ts +548 -0
  507. package/src/core/events/v3/base-builder.ts +60 -0
  508. package/src/core/events/v3/base-contract.ts +882 -0
  509. package/src/core/events/v3/bootstrap.ts +226 -0
  510. package/src/core/events/v3/builder.ts +59 -0
  511. package/src/core/events/v3/canonical.ts +153 -0
  512. package/src/core/events/v3/capabilities.ts +171 -0
  513. package/src/core/events/v3/capability-drift.ts +177 -0
  514. package/src/core/events/v3/catalog.ts +202 -0
  515. package/src/core/events/v3/clock-order.ts +41 -0
  516. package/src/core/events/v3/contract.ts +365 -0
  517. package/src/core/events/v3/control.ts +576 -0
  518. package/src/core/events/v3/coordination-view.ts +193 -0
  519. package/src/core/events/v3/economics.ts +384 -0
  520. package/src/core/events/v3/finalization-view.ts +67 -0
  521. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  522. package/src/core/events/v3/generated.ts +48 -0
  523. package/src/core/events/v3/ids.ts +33 -0
  524. package/src/core/events/v3/index.ts +322 -0
  525. package/src/core/events/v3/latency.ts +551 -0
  526. package/src/core/events/v3/live-feed.ts +319 -0
  527. package/src/core/events/v3/live-observation.ts +39 -0
  528. package/src/core/events/v3/live-routing.ts +135 -0
  529. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  530. package/src/core/events/v3/producers/command.ts +201 -0
  531. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  532. package/src/core/events/v3/producers/coordination.ts +355 -0
  533. package/src/core/events/v3/producers/hook-base.ts +578 -0
  534. package/src/core/events/v3/producers/hook.ts +119 -0
  535. package/src/core/events/v3/producers/intake.ts +319 -0
  536. package/src/core/events/v3/producers/recorder.ts +2805 -0
  537. package/src/core/events/v3/projection.ts +653 -0
  538. package/src/core/events/v3/reader.ts +1127 -0
  539. package/src/core/events/v3/recovery-record.ts +244 -0
  540. package/src/core/events/v3/recovery.ts +271 -0
  541. package/src/core/events/v3/span-state.ts +187 -0
  542. package/src/core/events/v3/targets.ts +182 -0
  543. package/src/core/events/v3/turn-telemetry.ts +259 -0
  544. package/src/core/events/v3/validate.ts +361 -0
  545. package/src/core/events/v3/writer.ts +419 -0
  546. package/src/core/governor/index.ts +3 -0
  547. package/src/core/governor/plan-api.ts +10 -2
  548. package/src/core/governor/read.ts +3 -0
  549. package/src/core/governor/state.ts +52 -5
  550. package/src/core/guard/config.ts +206 -0
  551. package/src/core/guard/coordinator.ts +227 -0
  552. package/src/core/guard/evaluator.ts +343 -0
  553. package/src/core/guard/evidence-v3.ts +227 -0
  554. package/src/core/guard/index.ts +35 -0
  555. package/src/core/guard/live-source-v3.ts +204 -0
  556. package/src/core/guard/storage.ts +188 -0
  557. package/src/core/guard/types.ts +152 -0
  558. package/src/core/hooks/adapter/detect.ts +28 -1
  559. package/src/core/hooks/adapter/events.ts +14 -6
  560. package/src/core/hooks/adapter/output.ts +7 -2
  561. package/src/core/hooks/adapter/parse.ts +80 -38
  562. package/src/core/hooks/adapter/wiring.ts +119 -13
  563. package/src/core/hooks/cli.ts +352 -466
  564. package/src/core/hooks/effects/image-capture.ts +228 -238
  565. package/src/core/hooks/effects/index.ts +1 -36
  566. package/src/core/hooks/events/input-hash.ts +47 -0
  567. package/src/core/hooks/index.ts +4 -11
  568. package/src/core/hooks/resolve/coord-root.ts +1 -1
  569. package/src/core/hooks/resolve/owner.ts +52 -45
  570. package/src/core/hooks/resolve/transcript.ts +171 -14
  571. package/src/core/hooks/session-name-presence.ts +14 -15
  572. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  573. package/src/core/journal/index.ts +15 -22
  574. package/src/core/presence/blob.ts +48 -41
  575. package/src/core/presence/codec-digest.ts +215 -0
  576. package/src/core/presence/relay-client.ts +5 -5
  577. package/src/core/work/index.ts +3 -0
  578. package/src/core/work/read.ts +3 -0
  579. package/src/core/work/runner.ts +6 -0
  580. package/src/core/work/state.ts +27 -3
  581. package/src/core/workflow/engine.ts +24 -24
  582. package/src/core/workflow/live-session-v3.ts +126 -0
  583. package/src/core/workflow/scope-id.ts +6 -0
  584. package/src/core/workflow/workspaces/leases.ts +56 -19
  585. package/src/index.ts +1 -1
  586. package/src/lib/browser/client.ts +230 -0
  587. package/src/lib/browser/critique.ts +104 -27
  588. package/src/lib/browser/geometry.ts +143 -14
  589. package/src/lib/browser/index.ts +34 -0
  590. package/src/lib/browser/qa-plan.ts +501 -0
  591. package/src/lib/browser/qa-reuse.ts +306 -0
  592. package/src/lib/browser/qa-snapshot.ts +223 -0
  593. package/src/lib/browser/runts.ts +27 -2
  594. package/src/lib/browser/tiling.ts +164 -0
  595. package/src/lib/claude-desktop.ts +1 -232
  596. package/src/lib/context/index.ts +22 -46
  597. package/src/lib/council/index.ts +9 -21
  598. package/src/lib/docs-frontmatter.ts +8 -79
  599. package/src/lib/docs-index.ts +33 -3
  600. package/src/lib/docs-lint.ts +15 -29
  601. package/src/lib/docs-metadata-audit.ts +166 -0
  602. package/src/lib/docs-metadata-managed.ts +83 -0
  603. package/src/lib/docs-metadata-sync.ts +262 -0
  604. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  605. package/src/lib/docs-metadata-v2.ts +646 -0
  606. package/src/lib/docs-new.ts +63 -0
  607. package/src/lib/docs-sweep.ts +42 -28
  608. package/src/lib/headless/index.ts +287 -0
  609. package/src/lib/identities/assume.ts +67 -86
  610. package/src/lib/instructions/apply.ts +33 -20
  611. package/src/lib/instructions/bundle.ts +2 -2
  612. package/src/lib/instructions/splice.ts +21 -7
  613. package/src/lib/instructions/templates.ts +85 -13
  614. package/dist/core/agents/cli-emit.d.ts +0 -27
  615. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  616. package/dist/core/agents/cli-emit.js +0 -57
  617. package/dist/core/agents/codex-replay.d.ts +0 -29
  618. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  619. package/dist/core/agents/codex-replay.js +0 -138
  620. package/dist/core/agents/events/consume.d.ts +0 -82
  621. package/dist/core/agents/events/consume.d.ts.map +0 -1
  622. package/dist/core/agents/events/consume.js +0 -195
  623. package/dist/core/agents/events/emit.d.ts +0 -42
  624. package/dist/core/agents/events/emit.d.ts.map +0 -1
  625. package/dist/core/agents/events/emit.js +0 -75
  626. package/dist/core/agents/events/ulid.d.ts +0 -11
  627. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  628. package/dist/core/agents/events/ulid.js +0 -47
  629. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -76
  630. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  631. package/dist/core/agents/state/heartbeat-projector.js +0 -581
  632. package/dist/core/hooks/events/emit.d.ts +0 -31
  633. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  634. package/dist/core/hooks/events/emit.js +0 -93
  635. package/dist/core/hooks/events/rotate.d.ts +0 -43
  636. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  637. package/dist/core/hooks/events/rotate.js +0 -142
  638. package/dist/core/hooks/events/schema.d.ts +0 -341
  639. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  640. package/dist/core/hooks/events/schema.js +0 -12
  641. package/dist/core/hooks/events/ulid.d.ts +0 -10
  642. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  643. package/dist/core/hooks/events/ulid.js +0 -47
  644. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  645. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  646. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  647. package/src/core/agents/cli-emit.ts +0 -64
  648. package/src/core/agents/codex-replay.ts +0 -163
  649. package/src/core/agents/events/consume.ts +0 -254
  650. package/src/core/agents/events/emit.ts +0 -115
  651. package/src/core/agents/events/ulid.ts +0 -51
  652. package/src/core/agents/state/heartbeat-projector.ts +0 -645
  653. package/src/core/hooks/events/emit.ts +0 -125
  654. package/src/core/hooks/events/rotate.ts +0 -151
  655. package/src/core/hooks/events/schema.ts +0 -582
  656. package/src/core/hooks/events/ulid.ts +0 -51
  657. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -124,32 +124,25 @@ async function handleVerdict(root: string): Promise<number> {
124
124
  }
125
125
 
126
126
  async function handleProject(root: string, rest: string[]): Promise<number> {
127
- const { consumeSince, writeCursor } = await import("./events/consume.ts");
128
- const { projectHeartbeats } = await import("./state/heartbeat-projector.ts");
129
- const replayAll = rest.includes("--replay-all");
130
- const result = consumeSince(root, { replayAll });
131
- const project = projectHeartbeats(root, result.events);
127
+ const { resolveLiveEventLedgerRouteV3 } = await import("../events/v3/live-routing.ts");
128
+ const route = resolveLiveEventLedgerRouteV3(root);
129
+ if (route.state === "blocked") {
130
+ process.stderr.write(`agent-coord project: V3 route is unsafe (${route.reason})\n`);
131
+ return 1;
132
+ }
133
+ const { readCoordinationViewV3 } = await import("../events/v3/coordination-view.ts");
134
+ const view = readCoordinationViewV3(root);
132
135
  const report = {
133
- events_consumed: result.events.length,
134
- stream_bytes: result.streamBytes,
135
- owners_projected: project.written.length,
136
- owners: project.written,
137
- cursor: result.lastEventId,
138
- replayed_all: replayAll,
136
+ contract_major: 2,
137
+ source_complete: view.source_complete,
138
+ authority_safe: view.authority_safe,
139
+ owners_projected: Object.keys(view.instances).length,
140
+ owners: Object.keys(view.instances).sort(),
141
+ diagnostics: view.diagnostics,
142
+ materialized: false,
139
143
  };
140
- if (result.lastEventId) writeCursor(root, result.lastEventId);
141
- if (rest.includes("--json")) {
142
- process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
143
- } else {
144
- process.stdout.write(
145
- `projected ${report.events_consumed} events across ${report.owners_projected} owners\n cursor → ${report.cursor ?? "<none>"}\n${
146
- report.owners.length
147
- ? ` owners: ${report.owners.map((o) => o.slice(0, 8)).join(", ")}\n`
148
- : ""
149
- }`,
150
- );
151
- }
152
- return 0;
144
+ process.stdout.write(`${JSON.stringify(report, null, rest.includes("--json") ? 2 : 0)}\n`);
145
+ return view.authority_safe ? 0 : 1;
153
146
  }
154
147
 
155
148
  function adapterFromPlatform(platform: unknown): "claude-code" | "cursor" | "codex" {
@@ -158,72 +151,6 @@ function adapterFromPlatform(platform: unknown): "claude-code" | "cursor" | "cod
158
151
  return "claude-code";
159
152
  }
160
153
 
161
- /**
162
- * Append a canonical `health.heartbeat_swept` event after an operator kill.
163
- * Same envelope stale-sweep emits, so the projector's terminal / ended_at
164
- * guards treat kill and sweep identically. Soft-fails: the unlink already
165
- * happened.
166
- */
167
- async function emitHeartbeatSwept(
168
- root: string,
169
- owner: string,
170
- hb: { session_id?: string; platform?: string; last_heartbeat?: string },
171
- ): Promise<void> {
172
- try {
173
- const { emit } = await import("./events/emit.ts");
174
- let ageSecs: number | undefined;
175
- if (hb.last_heartbeat) {
176
- const ts = Date.parse(hb.last_heartbeat);
177
- if (Number.isFinite(ts)) {
178
- ageSecs = Math.max(0, Math.floor((Date.now() - ts) / 1000));
179
- }
180
- }
181
- emit(root, {
182
- event_type: "health.heartbeat_swept",
183
- instance_id: owner,
184
- session_id: hb.session_id ?? owner,
185
- adapter: adapterFromPlatform(hb.platform),
186
- source: "agent-coord",
187
- data: {
188
- reason: "killed",
189
- ...(ageSecs !== undefined ? { age_secs: ageSecs } : {}),
190
- },
191
- });
192
- } catch {
193
- /* soft-fail: never break the caller */
194
- }
195
- }
196
-
197
- /**
198
- * Append a canonical `claim.release` event for a path dropped from an owner's
199
- * files_touched. The path is canonicalized to repo-relative (matching the
200
- * projector's normalization) so the subtraction matches on replay regardless
201
- * of the form the caller passed. Soft-fails: a failed emit must never break
202
- * the release/kill flow — the file mutation already happened.
203
- */
204
- async function emitClaimRelease(
205
- root: string,
206
- owner: string,
207
- hb: { session_id?: string; platform?: string },
208
- path: string,
209
- reason: "explicit" | "heal" | "commit" | "checkout",
210
- ): Promise<void> {
211
- try {
212
- const { emit } = await import("./events/emit.ts");
213
- const canonical = path.startsWith(`${root}/`) ? path.slice(root.length + 1) : path;
214
- emit(root, {
215
- event_type: "claim.release",
216
- instance_id: owner,
217
- session_id: hb.session_id ?? owner,
218
- adapter: adapterFromPlatform(hb.platform),
219
- source: "agent-coord",
220
- data: { path: canonical, reason },
221
- });
222
- } catch {
223
- /* soft-fail: never break the caller */
224
- }
225
- }
226
-
227
154
  async function handleStateAction(root: string, action: string, rest: string[]): Promise<number> {
228
155
  const writer = await import("./state/heartbeat-writer.ts");
229
156
  const [owner, ...args] = rest;
@@ -235,7 +162,24 @@ async function handleStateAction(root: string, action: string, rest: string[]):
235
162
  switch (action) {
236
163
  case "set-task": {
237
164
  const task = args.join(" ");
238
- const hb = writer.setTask(root, owner, task);
165
+ const before = writer.readHeartbeat(root, owner);
166
+ let hb: ReturnType<typeof writer.setTask>;
167
+ 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);
177
+ } catch (error) {
178
+ process.stderr.write(
179
+ `agent-coord set-task: V3 authority refused (${error instanceof Error ? error.message : String(error)})\n`,
180
+ );
181
+ return 1;
182
+ }
239
183
  if (!hb) {
240
184
  // Name the RESOLVED root: when a nested .harnery/ shadows the real
241
185
  // coordination home, the full path is what makes that diagnosable.
@@ -249,15 +193,6 @@ async function handleStateAction(root: string, action: string, rest: string[]):
249
193
  );
250
194
  return 0;
251
195
  }
252
- case "set-turn-summary": {
253
- const summary = args.join(" ");
254
- const hb = writer.setTurnSummary(root, owner, summary);
255
- if (!hb) return 1;
256
- process.stdout.write(
257
- `${JSON.stringify({ instance_id: owner, turn_summary: hb.turn_summary })}\n`,
258
- );
259
- return 0;
260
- }
261
196
  case "release-claim": {
262
197
  const path = args[0];
263
198
  if (!path) {
@@ -265,47 +200,31 @@ async function handleStateAction(root: string, action: string, rest: string[]):
265
200
  return 2;
266
201
  }
267
202
  const before = writer.readHeartbeat(root, owner);
268
- const hb = writer.releaseClaim(root, owner, path);
269
- if (!hb) return 1;
270
- // Durability: the projector rebuilds files_touched by replaying the
271
- // permanent Edit/Write events, so a file-only release is silently
272
- // reverted by the next full replay. Emitting claim.release puts the
273
- // subtraction into the stream so every future replay honors it. Only
274
- // emit when the release actually removed a held path (idempotent
275
- // re-releases stay quiet).
276
- const heldBefore = before?.files_touched?.length ?? 0;
277
- const heldAfter = hb.files_touched?.length ?? 0;
278
- if (heldBefore > heldAfter) {
279
- await emitClaimRelease(root, owner, before ?? hb, path, "explicit");
203
+ let hb: ReturnType<typeof writer.releaseClaim>;
204
+ try {
205
+ const { recordLiveClaimChangeV3 } = await import("./live-authority-v3.ts");
206
+ recordLiveClaimChangeV3({
207
+ coordRoot: root,
208
+ owner,
209
+ nativeSessionId: before?.session_id ?? owner,
210
+ adapter: adapterFromPlatform(before?.platform),
211
+ operation: "released",
212
+ path,
213
+ access: "write",
214
+ });
215
+ hb = writer.readHeartbeat(root, owner);
216
+ } catch (error) {
217
+ process.stderr.write(
218
+ `agent-coord release-claim: V3 authority refused (${error instanceof Error ? error.message : String(error)})\n`,
219
+ );
220
+ return 1;
280
221
  }
222
+ if (!hb) return 1;
281
223
  process.stdout.write(
282
224
  `${JSON.stringify({ instance_id: owner, files_touched: hb.files_touched })}\n`,
283
225
  );
284
226
  return 0;
285
227
  }
286
- case "kill-heartbeat": {
287
- // Read held claims BEFORE the unlink so they can be released durably —
288
- // killing only the file leaves the claims resurrectable from the
289
- // permanent Edit/Write events on the next full replay (observed: a
290
- // 6-day-dead agent's claims returning after its heartbeat was killed).
291
- //
292
- // Also emit health.heartbeat_swept so the stream records a terminal
293
- // marker. Without it, a later drain that replays [session.start …
294
- // tools … claim.release] treats the owner as still in-flight and
295
- // re-creates the file (kill→resurrect loop observed 2026-08-03: 21
296
- // killed zombies back within a minute via claim.release seeding +
297
- // historical replay).
298
- const before = writer.readHeartbeat(root, owner);
299
- const ok = writer.killHeartbeat(root, owner);
300
- if (ok && before) {
301
- await emitHeartbeatSwept(root, owner, before);
302
- for (const held of before.files_touched ?? []) {
303
- await emitClaimRelease(root, owner, before, held, "heal");
304
- }
305
- }
306
- process.stdout.write(`${JSON.stringify({ instance_id: owner, removed: ok })}\n`);
307
- return ok ? 0 : 1;
308
- }
309
228
  case "heal-pidmap": {
310
229
  const pidArg = args[0];
311
230
  const pid = pidArg ? Number(pidArg) : process.ppid;
@@ -313,48 +232,64 @@ async function handleStateAction(root: string, action: string, rest: string[]):
313
232
  process.stderr.write(`agent-coord heal-pidmap: invalid pid ${pidArg}\n`);
314
233
  return 2;
315
234
  }
316
- writer.healPidmap(root, owner, pid);
235
+ try {
236
+ const { liveCoordinationWriteModeV3 } = await import("./live-authority-v3.ts");
237
+ liveCoordinationWriteModeV3(root);
238
+ writer.healPidmap(root, owner, pid);
239
+ } catch (error) {
240
+ process.stderr.write(
241
+ `agent-coord heal-pidmap: V3 route refused (${error instanceof Error ? error.message : String(error)})\n`,
242
+ );
243
+ return 1;
244
+ }
317
245
  process.stdout.write(`${JSON.stringify({ instance_id: owner, pid })}\n`);
318
246
  return 0;
319
247
  }
320
- case "heal-heartbeat": {
248
+ case "repair-coordination-cache": {
321
249
  // adapter arrives as a `--adapter=<h>` flag (not positional) so the live
322
- // tool.pre_use heal and the manual `harn agents heal` path (which pass
250
+ // tool.requested repair and the manual `harn agents heal` path (which pass
323
251
  // different positional counts) can both supply it without arg-order
324
252
  // fragility. Positionals (sessionId, model) stay as-is once flags are
325
253
  // filtered out.
326
254
  const adapter = args.find((a) => a.startsWith("--adapter="))?.slice("--adapter=".length);
327
- const forkedFrom = args
328
- .find((a) => a.startsWith("--forked-from="))
329
- ?.slice("--forked-from=".length);
330
255
  const positional = args.filter((a) => !a.startsWith("--"));
331
256
  const sessionId = positional[0];
332
257
  const model = positional[1];
333
- const hb = writer.healHeartbeat(
334
- root,
335
- owner,
336
- sessionId,
337
- model,
338
- adapter,
339
- forkedFrom ? { forkedFrom } : undefined,
340
- );
258
+ let hb: import("./state/heartbeat-writer.ts").Heartbeat | null;
259
+ try {
260
+ const { liveCoordinationWriteModeV3 } = await import("./live-authority-v3.ts");
261
+ liveCoordinationWriteModeV3(root);
262
+ const { readCoordinationViewV3 } = await import("../events/v3/coordination-view.ts");
263
+ const { liveInstanceIdV3 } = await import("../events/v3/live-routing.ts");
264
+ const projected = readCoordinationViewV3(root).instances[liveInstanceIdV3(owner)];
265
+ if (projected?.provisional_termination) {
266
+ const { recordLiveResumeObservationV3 } = await import("./live-lifecycle-v3.ts");
267
+ recordLiveResumeObservationV3({
268
+ coordRoot: root,
269
+ owner,
270
+ nativeSessionId: sessionId ?? owner,
271
+ adapter: adapterFromPlatform(adapter),
272
+ });
273
+ }
274
+ const { ensureLiveCoordinationHeartbeat } = await import(
275
+ "./state/live-coordination-view.ts"
276
+ );
277
+ hb = ensureLiveCoordinationHeartbeat(
278
+ root,
279
+ owner,
280
+ sessionId ?? owner,
281
+ adapterFromPlatform(adapter),
282
+ model,
283
+ );
284
+ } catch (error) {
285
+ process.stderr.write(
286
+ `agent-coord repair-coordination-cache: V3 route refused (${error instanceof Error ? error.message : String(error)})\n`,
287
+ );
288
+ return 1;
289
+ }
341
290
  process.stdout.write(`${JSON.stringify({ instance_id: owner, recreated: !!hb })}\n`);
342
291
  return hb ? 0 : 1;
343
292
  }
344
- case "stamp-tool-activity": {
345
- const toolName = args[0] ?? "";
346
- const target = args.slice(1).join(" ");
347
- const hb = writer.stampToolActivity(root, owner, toolName, target);
348
- if (!hb) return 1;
349
- process.stdout.write(
350
- `${JSON.stringify({
351
- instance_id: owner,
352
- last_tool: hb.last_tool,
353
- last_tool_target: hb.last_tool_target,
354
- })}\n`,
355
- );
356
- return 0;
357
- }
358
293
  default:
359
294
  process.stderr.write(`agent-coord: unknown state action ${action}\n`);
360
295
  return 2;
@@ -563,32 +498,11 @@ async function handleShellMutationClaimLog(root: string, rest: string[]): Promis
563
498
  const platform = args.platform ?? "unknown";
564
499
  const owner = args.owner ?? null;
565
500
  const { shellMutationPaths } = await import("./state/shell-mutation.ts");
566
- const { emit } = await import("./events/emit.ts");
567
- const { readHeartbeat } = await import("./state/heartbeat-writer.ts");
568
501
  const paths = shellMutationPaths(cmd, root);
569
502
  const truncated = cmd.length > 80 ? cmd.slice(0, 80) : cmd;
570
- // Warn-only peer-shell-mutation signal. Formerly a SHELL_CLAIM_CANDIDATE line
571
- // in a log file; now a canonical decision.warn so the
572
- // signal survives in events.ndjson. (The blocking claim-conflict path is
573
- // separate: claim.conflict / verdict, and unaffected.)
574
- const adapter = platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code";
575
- const hb = owner ? readHeartbeat(root, owner) : null;
576
- for (const p of paths) {
577
- try {
578
- emit(root, {
579
- event_type: "decision.warn",
580
- instance_id: owner ?? "unknown",
581
- session_id: hb?.session_id ?? owner ?? "unknown",
582
- adapter,
583
- data: {
584
- rule: "shell_mutation_candidate",
585
- reason: `path=${p} cmd=${truncated} platform=${platform}`,
586
- },
587
- });
588
- } catch {
589
- /* telemetry only, never break the dispatcher */
590
- }
591
- }
503
+ process.stdout.write(
504
+ `${JSON.stringify({ schema_version: 2, owner, platform, command_preview: truncated, paths })}\n`,
505
+ );
592
506
  return 0;
593
507
  }
594
508
 
@@ -599,6 +513,40 @@ async function handleStaleSweep(root: string, _rest: string[]): Promise<number>
599
513
  return 0;
600
514
  }
601
515
 
516
+ async function handleReconcileFinalization(root: string): Promise<number> {
517
+ const { reconcileSessionFinalizationV3 } = await import("./session-finalizer-v3.ts");
518
+ const result = reconcileSessionFinalizationV3(root);
519
+ process.stdout.write(`${JSON.stringify(result)}\n`);
520
+ return result.diagnostics.some((item) => item === "ledger_not_authority_safe") ? 2 : 0;
521
+ }
522
+
523
+ async function handleEndSession(root: string, rest: string[]): Promise<number> {
524
+ const instanceId = rest[0];
525
+ if (!instanceId || !/^inst_[A-Za-z0-9._-]+$/.test(instanceId)) return 2;
526
+ const { listHookProducerStateRecordsV3 } = await import("../events/v3/producers/recorder.ts");
527
+ const record = listHookProducerStateRecordsV3(root, { includeTerminal: false }).find(
528
+ ({ state }) => state.instance_id === instanceId,
529
+ );
530
+ if (!record) return 2;
531
+ const { requestSessionEndExplicitV3 } = await import("./session-finalizer-v3.ts");
532
+ const result = requestSessionEndExplicitV3({
533
+ coordRoot: root,
534
+ instance_id: record.state.instance_id,
535
+ generation_id: record.state.generation_id,
536
+ outcome: "interrupted",
537
+ coordination_finalized: false,
538
+ });
539
+ process.stdout.write(`${JSON.stringify(result)}\n`);
540
+ return result.state === "recorded" ||
541
+ result.state === "already_ended" ||
542
+ result.state === "queued" ||
543
+ result.state === "already_requested"
544
+ ? 0
545
+ : result.state === "delegated_work_open"
546
+ ? 3
547
+ : 2;
548
+ }
549
+
602
550
  async function handlePromptContext(root: string, rest: string[]): Promise<number> {
603
551
  const args: Record<string, string> = {};
604
552
  for (let i = 0; i < rest.length; i++) {
@@ -682,43 +630,6 @@ async function handleSessionContext(root: string, rest: string[]): Promise<numbe
682
630
  return 0;
683
631
  }
684
632
 
685
- async function handleCodexReplay(root: string, rest: string[]): Promise<number> {
686
- const args: Record<string, string> = {};
687
- for (let i = 0; i < rest.length; i++) {
688
- const a = rest[i]!;
689
- if (a.startsWith("--")) {
690
- const key = a.slice(2);
691
- const val = rest[i + 1];
692
- if (val === undefined || val.startsWith("--")) {
693
- args[key] = "true";
694
- } else {
695
- args[key] = val;
696
- i++;
697
- }
698
- }
699
- }
700
- const jsonlPath = args.jsonl;
701
- const sessionId = args.session;
702
- const instanceId = args.owner ?? sessionId;
703
- const lastMsg = args["last-message"];
704
- if (!jsonlPath || !sessionId) {
705
- process.stderr.write(
706
- "agent-coord codex-replay --jsonl <path> --session <id> [--owner <id>] [--last-message <text>]\n",
707
- );
708
- return 2;
709
- }
710
- const { replayCodexJsonl } = await import("./codex-replay.ts");
711
- const result = replayCodexJsonl({
712
- coordRoot: root,
713
- jsonlPath,
714
- sessionId,
715
- instanceId: instanceId!,
716
- lastAssistantMessage: lastMsg,
717
- });
718
- process.stdout.write(`${JSON.stringify({ session_id: sessionId, emitted: result.emitted })}\n`);
719
- return 0;
720
- }
721
-
722
633
  async function handleResolveName(root: string, rest: string[]): Promise<number> {
723
634
  const { resolveName } = await import("./state/names.ts");
724
635
  const [owner, session] = rest;
@@ -738,7 +649,6 @@ async function handleResolveName(root: string, rest: string[]): Promise<number>
738
649
  }
739
650
 
740
651
  async function handleEmitEvent(root: string, rest: string[]): Promise<number> {
741
- const { emitAndProject } = await import("./cli-emit.ts");
742
652
  const args: Record<string, string> = {};
743
653
  for (let i = 0; i < rest.length; i++) {
744
654
  const a = rest[i]!;
@@ -758,11 +668,11 @@ async function handleEmitEvent(root: string, rest: string[]): Promise<number> {
758
668
  const instanceId = args.owner;
759
669
  const sessionId = args.session;
760
670
  const adapter = args.adapter as "claude-code" | "cursor" | "codex" | undefined;
761
- const dataJson = args["data-json"] ?? "{}";
671
+ const dataJson = args["data-stdin"] === "true" ? await readStdin() : "";
762
672
 
763
- if (!eventType || !instanceId || !sessionId || !adapter) {
673
+ if (!eventType || !instanceId || !sessionId || !adapter || !dataJson) {
764
674
  process.stderr.write(
765
- "agent-coord emit-event --type <T> --owner <id> --session <id> --adapter <h> [--data-json '<json>']\n",
675
+ "agent-coord emit-event --type <V3_TYPE> --owner <id> --session <id> --adapter <h> --data-stdin\n",
766
676
  );
767
677
  return 2;
768
678
  }
@@ -773,37 +683,88 @@ async function handleEmitEvent(root: string, rest: string[]): Promise<number> {
773
683
  if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
774
684
  data = parsed as Record<string, unknown>;
775
685
  } else {
776
- process.stderr.write("agent-coord emit-event: --data-json must encode an object\n");
686
+ process.stderr.write("agent-coord emit-event: stdin must encode an object\n");
777
687
  return 2;
778
688
  }
779
689
  } catch (err) {
780
690
  process.stderr.write(
781
- `agent-coord emit-event: invalid --data-json (${err instanceof Error ? err.message : String(err)})\n`,
691
+ `agent-coord emit-event: invalid stdin JSON (${err instanceof Error ? err.message : String(err)})\n`,
782
692
  );
783
693
  return 2;
784
694
  }
785
695
 
786
- const result = emitAndProject(
787
- {
788
- event_type: eventType,
789
- instance_id: instanceId,
790
- session_id: sessionId,
791
- adapter,
792
- turn_id: args["turn-id"],
793
- parent_session_id: args["parent-session-id"],
794
- parent_turn_id: args["parent-turn-id"],
795
- data,
796
- },
797
- { coordRoot: root },
798
- );
799
-
800
- if (!result) {
801
- process.stderr.write("agent-coord emit-event: emission failed\n");
696
+ const { resolveLiveEventLedgerRouteV3 } = await import("../events/v3/live-routing.ts");
697
+ const ledgerRoute = resolveLiveEventLedgerRouteV3(root);
698
+ if (ledgerRoute.state === "blocked") {
699
+ process.stderr.write(
700
+ `agent-coord emit-event: V3 ledger route is unsafe (${ledgerRoute.reason})\n`,
701
+ );
802
702
  return 1;
803
703
  }
804
-
805
- process.stdout.write(`${JSON.stringify(result.envelope)}\n`);
806
- return 0;
704
+ if (data.event_type !== eventType) {
705
+ process.stderr.write("agent-coord emit-event: envelope type does not match stdin event_type\n");
706
+ return 2;
707
+ }
708
+ if (eventType === "coord.lifecycle_changed") {
709
+ const state = data.new_state;
710
+ if (state !== "active" && state !== "blocked" && state !== "done") {
711
+ process.stderr.write("agent-coord emit-event: invalid V3 lifecycle state\n");
712
+ return 2;
713
+ }
714
+ const { recordLiveLifecycleChangeV3 } = await import("./live-authority-v3.ts");
715
+ try {
716
+ const routed = recordLiveLifecycleChangeV3({
717
+ coordRoot: root,
718
+ owner: instanceId,
719
+ nativeSessionId: sessionId,
720
+ adapter,
721
+ state,
722
+ reason: typeof data.reason === "string" && data.reason.length > 0 ? data.reason : undefined,
723
+ suggestedSessionName:
724
+ typeof data.suggested_session_name === "string" && data.suggested_session_name.length > 0
725
+ ? data.suggested_session_name
726
+ : undefined,
727
+ });
728
+ process.stdout.write(
729
+ `${JSON.stringify({ schema_version: 2, event_type: "coord.lifecycle_changed", state: routed.state })}\n`,
730
+ );
731
+ return 0;
732
+ } catch (error) {
733
+ process.stderr.write(
734
+ `agent-coord emit-event: V3 lifecycle authority refused (${error instanceof Error ? error.message : String(error)})\n`,
735
+ );
736
+ return 1;
737
+ }
738
+ }
739
+ if (
740
+ eventType === "coord.status_observed" ||
741
+ eventType === "coord.presence_changed" ||
742
+ eventType === "coord.message_observed" ||
743
+ eventType === "council.state_changed" ||
744
+ eventType === "decision.state_changed"
745
+ ) {
746
+ const { recordLiveCoordinationObservationV3 } = await import("./live-observation-v3.ts");
747
+ try {
748
+ const routed = recordLiveCoordinationObservationV3({
749
+ coordRoot: root,
750
+ owner: instanceId,
751
+ nativeSessionId: sessionId,
752
+ adapter,
753
+ observation: data as never,
754
+ });
755
+ process.stdout.write(
756
+ `${JSON.stringify({ schema_version: 2, event_type: routed.event.event_type, event_id: routed.event.event_id })}\n`,
757
+ );
758
+ return 0;
759
+ } catch (error) {
760
+ process.stderr.write(
761
+ `agent-coord emit-event: V3 observation refused (${error instanceof Error ? error.message : String(error)})\n`,
762
+ );
763
+ return 1;
764
+ }
765
+ }
766
+ process.stderr.write(`agent-coord emit-event: unsupported V3 event type ${eventType}\n`);
767
+ return 2;
807
768
  }
808
769
 
809
770
  /**
@@ -876,14 +837,26 @@ async function handleGitHook(fallbackRoot: string, rest: string[]): Promise<numb
876
837
  : gh.collectCheckoutRemoved(cwd, rest[1] ?? "", rest[2] ?? "");
877
838
  if (paths.length === 0) return 0;
878
839
  const { resolveOwner } = await import("../hooks/resolve/owner.ts");
879
- const owner = resolveOwner({ payload: null, coordRoot: root })?.instance_id;
840
+ const owner = resolveOwner({
841
+ payload: null,
842
+ coordRoot: root,
843
+ })?.instance_id;
880
844
  if (!owner) return 0;
881
- const { groupUnclaim } = await import("./state/heartbeat-writer.ts");
882
- const reason = event === "post-commit" ? ("commit" as const) : ("checkout" as const);
845
+ const { findGroupClaims } = await import("./state/heartbeat-writer.ts");
846
+ const { recordLiveClaimChangeV3 } = await import("./live-authority-v3.ts");
883
847
  for (const path of paths) {
884
848
  try {
885
- for (const hit of groupUnclaim(root, owner, path)) {
886
- await emitClaimRelease(root, hit.instance_id, hit, path, reason);
849
+ for (const hit of findGroupClaims(root, owner, path)) {
850
+ recordLiveClaimChangeV3({
851
+ coordRoot: root,
852
+ owner,
853
+ subject: hit.instance_id,
854
+ nativeSessionId: hit.session_id ?? owner,
855
+ adapter: adapterFromPlatform(hit.platform),
856
+ operation: "released",
857
+ path,
858
+ access: "write",
859
+ });
887
860
  }
888
861
  } catch {
889
862
  /* best-effort */
@@ -919,12 +892,9 @@ async function main(): Promise<number> {
919
892
 
920
893
  if (
921
894
  subcommand === "set-task" ||
922
- subcommand === "set-turn-summary" ||
923
895
  subcommand === "release-claim" ||
924
- subcommand === "kill-heartbeat" ||
925
896
  subcommand === "heal-pidmap" ||
926
- subcommand === "heal-heartbeat" ||
927
- subcommand === "stamp-tool-activity"
897
+ subcommand === "repair-coordination-cache"
928
898
  ) {
929
899
  return handleStateAction(root, subcommand, rest);
930
900
  }
@@ -952,14 +922,18 @@ async function main(): Promise<number> {
952
922
  return handleResolveName(root, rest);
953
923
  }
954
924
 
955
- if (subcommand === "codex-replay") {
956
- return handleCodexReplay(root, rest);
957
- }
958
-
959
925
  if (subcommand === "stale-sweep") {
960
926
  return handleStaleSweep(root, rest);
961
927
  }
962
928
 
929
+ if (subcommand === "reconcile-finalization") {
930
+ return handleReconcileFinalization(root);
931
+ }
932
+
933
+ if (subcommand === "end-session") {
934
+ return handleEndSession(root, rest);
935
+ }
936
+
963
937
  if (subcommand === "session-context") {
964
938
  return handleSessionContext(root, rest);
965
939
  }