harnery 0.32.0 → 0.34.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 (665) hide show
  1. package/README.md +2 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +7 -1
  4. package/dist/commands/adapter.js +2 -2
  5. package/dist/commands/agents.d.ts +144 -1
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +1408 -565
  8. package/dist/commands/artifacts.d.ts.map +1 -1
  9. package/dist/commands/artifacts.js +7 -6
  10. package/dist/commands/backup.d.ts +1 -1
  11. package/dist/commands/backup.d.ts.map +1 -1
  12. package/dist/commands/backup.js +29 -16
  13. package/dist/commands/browse.d.ts.map +1 -1
  14. package/dist/commands/browse.js +234 -12
  15. package/dist/commands/checkpoint.d.ts.map +1 -1
  16. package/dist/commands/checkpoint.js +3 -2
  17. package/dist/commands/claude-desktop.d.ts +2 -2
  18. package/dist/commands/claude-desktop.d.ts.map +1 -1
  19. package/dist/commands/claude-desktop.js +2 -2
  20. package/dist/commands/context.js +1 -6
  21. package/dist/commands/decision.d.ts.map +1 -1
  22. package/dist/commands/decision.js +22 -38
  23. package/dist/commands/docs.d.ts.map +1 -1
  24. package/dist/commands/docs.js +91 -28
  25. package/dist/commands/doctor.d.ts +4 -2
  26. package/dist/commands/doctor.d.ts.map +1 -1
  27. package/dist/commands/doctor.js +55 -7
  28. package/dist/commands/events.d.ts +5 -0
  29. package/dist/commands/events.d.ts.map +1 -0
  30. package/dist/commands/events.js +189 -0
  31. package/dist/commands/governor.d.ts.map +1 -1
  32. package/dist/commands/governor.js +13 -4
  33. package/dist/commands/init.d.ts +10 -2
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +233 -51
  36. package/dist/commands/instructions.d.ts +4 -0
  37. package/dist/commands/instructions.d.ts.map +1 -0
  38. package/dist/commands/instructions.js +100 -0
  39. package/dist/commands/journal.d.ts.map +1 -1
  40. package/dist/commands/journal.js +4 -13
  41. package/dist/commands/ledger-v3.d.ts +5 -0
  42. package/dist/commands/ledger-v3.d.ts.map +1 -0
  43. package/dist/commands/ledger-v3.js +91 -0
  44. package/dist/commands/presence.d.ts.map +1 -1
  45. package/dist/commands/presence.js +15 -6
  46. package/dist/commands/sync.d.ts +1 -1
  47. package/dist/commands/sync.js +1 -1
  48. package/dist/commands/web.d.ts +6 -0
  49. package/dist/commands/web.d.ts.map +1 -1
  50. package/dist/commands/web.js +67 -7
  51. package/dist/commands/work.d.ts.map +1 -1
  52. package/dist/commands/work.js +22 -5
  53. package/dist/core/adapter.d.ts +5 -0
  54. package/dist/core/adapter.d.ts.map +1 -0
  55. package/dist/core/adapter.js +1 -0
  56. package/dist/core/adapters/attest.d.ts +5 -2
  57. package/dist/core/adapters/attest.d.ts.map +1 -1
  58. package/dist/core/adapters/attest.js +8 -3
  59. package/dist/core/adapters/profiles.d.ts +6 -6
  60. package/dist/core/adapters/profiles.d.ts.map +1 -1
  61. package/dist/core/adapters/profiles.js +4 -4
  62. package/dist/core/agents/canonical-emit.d.ts +17 -15
  63. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  64. package/dist/core/agents/canonical-emit.js +27 -25
  65. package/dist/core/agents/cli.js +212 -235
  66. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  67. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  68. package/dist/core/agents/codex-archive-v3.js +110 -0
  69. package/dist/core/agents/coord-client.d.ts +19 -70
  70. package/dist/core/agents/coord-client.d.ts.map +1 -1
  71. package/dist/core/agents/coord-client.js +65 -155
  72. package/dist/core/agents/finalization.d.ts +4 -1
  73. package/dist/core/agents/finalization.d.ts.map +1 -1
  74. package/dist/core/agents/finalization.js +89 -32
  75. package/dist/core/agents/index.d.ts +5 -5
  76. package/dist/core/agents/index.d.ts.map +1 -1
  77. package/dist/core/agents/index.js +5 -5
  78. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  79. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-authority-v3.js +233 -0
  81. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  82. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  83. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  84. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  85. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  86. package/dist/core/agents/live-observation-v3.js +157 -0
  87. package/dist/core/agents/render/prompt-context.d.ts +10 -4
  88. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  89. package/dist/core/agents/render/prompt-context.js +61 -55
  90. package/dist/core/agents/render/session-context.d.ts +1 -1
  91. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  92. package/dist/core/agents/render/session-context.js +15 -33
  93. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  94. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  95. package/dist/core/agents/rules/claim-conflict.js +79 -127
  96. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  97. package/dist/core/agents/rules/commit-conflict.js +3 -18
  98. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  99. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  100. package/dist/core/agents/rules/stop-hook.js +193 -236
  101. package/dist/core/agents/session-events.d.ts +5 -7
  102. package/dist/core/agents/session-events.d.ts.map +1 -1
  103. package/dist/core/agents/session-events.js +127 -95
  104. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  105. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  106. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  107. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  108. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  109. package/dist/core/agents/session-finalizer-v3.js +734 -0
  110. package/dist/core/agents/session-name-display.d.ts +40 -0
  111. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  112. package/dist/core/agents/session-name-display.js +119 -0
  113. package/dist/core/agents/state/activity-log.d.ts +3 -3
  114. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  115. package/dist/core/agents/state/activity-log.js +7 -16
  116. package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
  117. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  118. package/dist/core/agents/state/heartbeat-writer.js +59 -199
  119. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  120. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  121. package/dist/core/agents/state/live-coordination-view.js +209 -0
  122. package/dist/core/agents/state/session-state.d.ts +45 -0
  123. package/dist/core/agents/state/session-state.d.ts.map +1 -0
  124. package/dist/core/agents/state/session-state.js +90 -0
  125. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  126. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  127. package/dist/core/agents/state/stale-sweep.js +26 -15
  128. package/dist/core/artifacts/index.d.ts.map +1 -1
  129. package/dist/core/artifacts/index.js +5 -7
  130. package/dist/core/config.d.ts +33 -2
  131. package/dist/core/config.d.ts.map +1 -1
  132. package/dist/core/config.js +98 -2
  133. package/dist/core/context/index.d.ts +1 -4
  134. package/dist/core/context/index.d.ts.map +1 -1
  135. package/dist/core/context/index.js +9 -9
  136. package/dist/core/events/span-parent.d.ts +15 -0
  137. package/dist/core/events/span-parent.d.ts.map +1 -0
  138. package/dist/core/events/span-parent.js +34 -0
  139. package/dist/core/events/v3/advance.d.ts +14 -0
  140. package/dist/core/events/v3/advance.d.ts.map +1 -0
  141. package/dist/core/events/v3/advance.js +134 -0
  142. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  143. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  144. package/dist/core/events/v3/authority-outbox.js +399 -0
  145. package/dist/core/events/v3/base-builder.d.ts +20 -0
  146. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  147. package/dist/core/events/v3/base-builder.js +29 -0
  148. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  149. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  150. package/dist/core/events/v3/base-contract.js +647 -0
  151. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  152. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  153. package/dist/core/events/v3/bootstrap.js +175 -0
  154. package/dist/core/events/v3/builder.d.ts +20 -0
  155. package/dist/core/events/v3/builder.d.ts.map +1 -0
  156. package/dist/core/events/v3/builder.js +28 -0
  157. package/dist/core/events/v3/canonical.d.ts +31 -0
  158. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  159. package/dist/core/events/v3/canonical.js +100 -0
  160. package/dist/core/events/v3/capabilities.d.ts +31 -0
  161. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  162. package/dist/core/events/v3/capabilities.js +107 -0
  163. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  164. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  165. package/dist/core/events/v3/capability-drift.js +134 -0
  166. package/dist/core/events/v3/catalog.d.ts +38 -0
  167. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  168. package/dist/core/events/v3/catalog.js +135 -0
  169. package/dist/core/events/v3/clock-order.d.ts +34 -0
  170. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  171. package/dist/core/events/v3/clock-order.js +35 -0
  172. package/dist/core/events/v3/contract.d.ts +171 -0
  173. package/dist/core/events/v3/contract.d.ts.map +1 -0
  174. package/dist/core/events/v3/contract.js +180 -0
  175. package/dist/core/events/v3/control.d.ts +111 -0
  176. package/dist/core/events/v3/control.d.ts.map +1 -0
  177. package/dist/core/events/v3/control.js +419 -0
  178. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  179. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/coordination-view.js +119 -0
  181. package/dist/core/events/v3/economics.d.ts +77 -0
  182. package/dist/core/events/v3/economics.d.ts.map +1 -0
  183. package/dist/core/events/v3/economics.js +274 -0
  184. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  185. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  186. package/dist/core/events/v3/finalization-view.js +37 -0
  187. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  188. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  189. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  190. package/dist/core/events/v3/generated.d.ts +4 -0
  191. package/dist/core/events/v3/generated.d.ts.map +1 -0
  192. package/dist/core/events/v3/generated.js +47 -0
  193. package/dist/core/events/v3/ids.d.ts +9 -0
  194. package/dist/core/events/v3/ids.d.ts.map +1 -0
  195. package/dist/core/events/v3/ids.js +25 -0
  196. package/dist/core/events/v3/index.d.ts +35 -0
  197. package/dist/core/events/v3/index.d.ts.map +1 -0
  198. package/dist/core/events/v3/index.js +33 -0
  199. package/dist/core/events/v3/latency.d.ts +63 -0
  200. package/dist/core/events/v3/latency.d.ts.map +1 -0
  201. package/dist/core/events/v3/latency.js +412 -0
  202. package/dist/core/events/v3/live-feed.d.ts +45 -0
  203. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-feed.js +246 -0
  205. package/dist/core/events/v3/live-observation.d.ts +35 -0
  206. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  207. package/dist/core/events/v3/live-observation.js +1 -0
  208. package/dist/core/events/v3/live-routing.d.ts +57 -0
  209. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  210. package/dist/core/events/v3/live-routing.js +107 -0
  211. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  212. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  214. package/dist/core/events/v3/producers/command.d.ts +50 -0
  215. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/command.js +135 -0
  217. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  218. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  220. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  221. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/coordination.js +229 -0
  223. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  224. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/hook-base.js +424 -0
  226. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  227. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/hook.js +71 -0
  229. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  231. package/dist/core/events/v3/producers/intake.js +244 -0
  232. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  233. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/recorder.js +2176 -0
  235. package/dist/core/events/v3/projection.d.ts +101 -0
  236. package/dist/core/events/v3/projection.d.ts.map +1 -0
  237. package/dist/core/events/v3/projection.js +479 -0
  238. package/dist/core/events/v3/reader.d.ts +75 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -0
  240. package/dist/core/events/v3/reader.js +778 -0
  241. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  242. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  243. package/dist/core/events/v3/recovery-record.js +167 -0
  244. package/dist/core/events/v3/recovery.d.ts +22 -0
  245. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  246. package/dist/core/events/v3/recovery.js +227 -0
  247. package/dist/core/events/v3/span-state.d.ts +52 -0
  248. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  249. package/dist/core/events/v3/span-state.js +142 -0
  250. package/dist/core/events/v3/targets.d.ts +23 -0
  251. package/dist/core/events/v3/targets.d.ts.map +1 -0
  252. package/dist/core/events/v3/targets.js +134 -0
  253. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  254. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  255. package/dist/core/events/v3/turn-telemetry.js +168 -0
  256. package/dist/core/events/v3/validate.d.ts +9 -0
  257. package/dist/core/events/v3/validate.d.ts.map +1 -0
  258. package/dist/core/events/v3/validate.js +281 -0
  259. package/dist/core/events/v3/writer.d.ts +56 -0
  260. package/dist/core/events/v3/writer.d.ts.map +1 -0
  261. package/dist/core/events/v3/writer.js +335 -0
  262. package/dist/core/governor/index.d.ts +1 -1
  263. package/dist/core/governor/index.d.ts.map +1 -1
  264. package/dist/core/governor/index.js +1 -1
  265. package/dist/core/governor/plan-api.d.ts +2 -1
  266. package/dist/core/governor/plan-api.d.ts.map +1 -1
  267. package/dist/core/governor/plan-api.js +6 -3
  268. package/dist/core/governor/read.d.ts +1 -1
  269. package/dist/core/governor/read.d.ts.map +1 -1
  270. package/dist/core/governor/read.js +1 -1
  271. package/dist/core/governor/state.d.ts +9 -0
  272. package/dist/core/governor/state.d.ts.map +1 -1
  273. package/dist/core/governor/state.js +40 -3
  274. package/dist/core/guard/config.d.ts +5 -0
  275. package/dist/core/guard/config.d.ts.map +1 -0
  276. package/dist/core/guard/config.js +157 -0
  277. package/dist/core/guard/coordinator.d.ts +14 -0
  278. package/dist/core/guard/coordinator.d.ts.map +1 -0
  279. package/dist/core/guard/coordinator.js +173 -0
  280. package/dist/core/guard/evaluator.d.ts +4 -0
  281. package/dist/core/guard/evaluator.d.ts.map +1 -0
  282. package/dist/core/guard/evaluator.js +242 -0
  283. package/dist/core/guard/evidence-v3.d.ts +15 -0
  284. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  285. package/dist/core/guard/evidence-v3.js +171 -0
  286. package/dist/core/guard/index.d.ts +10 -0
  287. package/dist/core/guard/index.d.ts.map +1 -0
  288. package/dist/core/guard/index.js +6 -0
  289. package/dist/core/guard/live-source-v3.d.ts +40 -0
  290. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  291. package/dist/core/guard/live-source-v3.js +128 -0
  292. package/dist/core/guard/storage.d.ts +27 -0
  293. package/dist/core/guard/storage.d.ts.map +1 -0
  294. package/dist/core/guard/storage.js +140 -0
  295. package/dist/core/guard/types.d.ts +119 -0
  296. package/dist/core/guard/types.d.ts.map +1 -0
  297. package/dist/core/guard/types.js +1 -0
  298. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  299. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/detect.js +29 -0
  301. package/dist/core/hooks/adapter/events.d.ts +7 -4
  302. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  303. package/dist/core/hooks/adapter/events.js +13 -4
  304. package/dist/core/hooks/adapter/output.d.ts +2 -2
  305. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  306. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  307. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  308. package/dist/core/hooks/adapter/parse.js +64 -24
  309. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  310. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  311. package/dist/core/hooks/adapter/wiring.js +89 -11
  312. package/dist/core/hooks/cli.d.ts +1 -1
  313. package/dist/core/hooks/cli.js +345 -400
  314. package/dist/core/hooks/codex-authorization.d.ts +30 -0
  315. package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
  316. package/dist/core/hooks/codex-authorization.js +199 -0
  317. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  318. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  319. package/dist/core/hooks/effects/image-capture.js +212 -221
  320. package/dist/core/hooks/effects/index.d.ts +1 -9
  321. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  322. package/dist/core/hooks/effects/index.js +1 -24
  323. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  324. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  325. package/dist/core/hooks/events/input-hash.js +43 -0
  326. package/dist/core/hooks/index.d.ts +4 -3
  327. package/dist/core/hooks/index.d.ts.map +1 -1
  328. package/dist/core/hooks/index.js +2 -3
  329. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  330. package/dist/core/hooks/resolve/coord-root.js +1 -1
  331. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  332. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  333. package/dist/core/hooks/resolve/owner.js +51 -42
  334. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  335. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  336. package/dist/core/hooks/resolve/transcript.js +155 -14
  337. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  338. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  339. package/dist/core/hooks/session-name-presence.js +15 -15
  340. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  341. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  342. package/dist/core/journal/index.d.ts +2 -2
  343. package/dist/core/journal/index.d.ts.map +1 -1
  344. package/dist/core/journal/index.js +9 -22
  345. package/dist/core/presence/blob.d.ts +8 -3
  346. package/dist/core/presence/blob.d.ts.map +1 -1
  347. package/dist/core/presence/blob.js +54 -41
  348. package/dist/core/presence/codec-digest.d.ts +29 -0
  349. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  350. package/dist/core/presence/codec-digest.js +170 -0
  351. package/dist/core/presence/index.js +15 -1
  352. package/dist/core/presence/relay-client.d.ts +1 -1
  353. package/dist/core/presence/relay-client.d.ts.map +1 -1
  354. package/dist/core/presence/relay-client.js +5 -5
  355. package/dist/core/work/index.d.ts +1 -1
  356. package/dist/core/work/index.d.ts.map +1 -1
  357. package/dist/core/work/index.js +1 -1
  358. package/dist/core/work/read.d.ts +1 -1
  359. package/dist/core/work/read.d.ts.map +1 -1
  360. package/dist/core/work/read.js +1 -1
  361. package/dist/core/work/runner.d.ts.map +1 -1
  362. package/dist/core/work/runner.js +6 -0
  363. package/dist/core/work/state.d.ts +9 -0
  364. package/dist/core/work/state.d.ts.map +1 -1
  365. package/dist/core/work/state.js +17 -3
  366. package/dist/core/workflow/engine.js +24 -25
  367. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  368. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  369. package/dist/core/workflow/live-session-v3.js +86 -0
  370. package/dist/core/workflow/scope-id.d.ts +3 -0
  371. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  372. package/dist/core/workflow/scope-id.js +5 -0
  373. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  374. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  375. package/dist/core/workflow/workspaces/leases.js +53 -19
  376. package/dist/index.d.ts +1 -1
  377. package/dist/index.js +1 -1
  378. package/dist/lib/browser/client.d.ts +41 -0
  379. package/dist/lib/browser/client.d.ts.map +1 -1
  380. package/dist/lib/browser/client.js +203 -0
  381. package/dist/lib/browser/critique.d.ts +28 -2
  382. package/dist/lib/browser/critique.d.ts.map +1 -1
  383. package/dist/lib/browser/critique.js +74 -18
  384. package/dist/lib/browser/geometry.d.ts +1 -1
  385. package/dist/lib/browser/geometry.d.ts.map +1 -1
  386. package/dist/lib/browser/geometry.js +130 -6
  387. package/dist/lib/browser/index.d.ts +3 -0
  388. package/dist/lib/browser/index.d.ts.map +1 -1
  389. package/dist/lib/browser/index.js +3 -0
  390. package/dist/lib/browser/qa-plan.d.ts +174 -0
  391. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  392. package/dist/lib/browser/qa-plan.js +321 -0
  393. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  394. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  395. package/dist/lib/browser/qa-reuse.js +222 -0
  396. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  397. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  398. package/dist/lib/browser/qa-snapshot.js +171 -0
  399. package/dist/lib/browser/runts.d.ts.map +1 -1
  400. package/dist/lib/browser/runts.js +22 -1
  401. package/dist/lib/browser/tiling.d.ts +71 -0
  402. package/dist/lib/browser/tiling.d.ts.map +1 -0
  403. package/dist/lib/browser/tiling.js +118 -0
  404. package/dist/lib/context/index.d.ts +0 -3
  405. package/dist/lib/context/index.d.ts.map +1 -1
  406. package/dist/lib/context/index.js +20 -42
  407. package/dist/lib/council/index.d.ts +2 -2
  408. package/dist/lib/council/index.d.ts.map +1 -1
  409. package/dist/lib/council/index.js +9 -20
  410. package/dist/lib/docs-frontmatter.d.ts +1 -6
  411. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  412. package/dist/lib/docs-frontmatter.js +12 -78
  413. package/dist/lib/docs-index.d.ts +9 -0
  414. package/dist/lib/docs-index.d.ts.map +1 -1
  415. package/dist/lib/docs-index.js +32 -3
  416. package/dist/lib/docs-lint.d.ts.map +1 -1
  417. package/dist/lib/docs-lint.js +14 -30
  418. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  419. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  420. package/dist/lib/docs-metadata-audit.js +132 -0
  421. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  422. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  423. package/dist/lib/docs-metadata-managed.js +78 -0
  424. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  425. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  426. package/dist/lib/docs-metadata-sync.js +222 -0
  427. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  428. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  429. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  430. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  431. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  432. package/dist/lib/docs-metadata-v2.js +424 -0
  433. package/dist/lib/docs-new.d.ts +11 -0
  434. package/dist/lib/docs-new.d.ts.map +1 -0
  435. package/dist/lib/docs-new.js +52 -0
  436. package/dist/lib/docs-sweep.d.ts.map +1 -1
  437. package/dist/lib/docs-sweep.js +45 -29
  438. package/dist/lib/headless/index.d.ts +98 -0
  439. package/dist/lib/headless/index.d.ts.map +1 -0
  440. package/dist/lib/headless/index.js +211 -0
  441. package/dist/lib/identities/assume.d.ts +4 -4
  442. package/dist/lib/identities/assume.d.ts.map +1 -1
  443. package/dist/lib/identities/assume.js +52 -68
  444. package/dist/lib/instructions/apply.d.ts +5 -4
  445. package/dist/lib/instructions/apply.d.ts.map +1 -1
  446. package/dist/lib/instructions/apply.js +32 -20
  447. package/dist/lib/instructions/bundle.d.ts +33 -0
  448. package/dist/lib/instructions/bundle.d.ts.map +1 -0
  449. package/dist/lib/instructions/bundle.js +149 -0
  450. package/dist/lib/instructions/splice.d.ts +0 -1
  451. package/dist/lib/instructions/splice.d.ts.map +1 -1
  452. package/dist/lib/instructions/splice.js +22 -6
  453. package/dist/lib/instructions/templates.d.ts +7 -5
  454. package/dist/lib/instructions/templates.d.ts.map +1 -1
  455. package/dist/lib/instructions/templates.js +79 -9
  456. package/package.json +27 -6
  457. package/schemas/config.schema.json +120 -2
  458. package/schemas/docs-metadata-v2.schema.json +441 -0
  459. package/schemas/event-v3.schema.json +24472 -0
  460. package/src/commander.ts +7 -1
  461. package/src/commands/adapter.ts +2 -2
  462. package/src/commands/agents.ts +1737 -570
  463. package/src/commands/artifacts.ts +7 -6
  464. package/src/commands/backup.ts +29 -21
  465. package/src/commands/browse.ts +349 -8
  466. package/src/commands/checkpoint.ts +4 -3
  467. package/src/commands/claude-desktop.ts +7 -5
  468. package/src/commands/context.ts +1 -6
  469. package/src/commands/decision.ts +27 -44
  470. package/src/commands/docs.ts +100 -33
  471. package/src/commands/doctor.ts +73 -8
  472. package/src/commands/events.ts +256 -0
  473. package/src/commands/governor.ts +18 -4
  474. package/src/commands/init.ts +264 -57
  475. package/src/commands/instructions.ts +129 -0
  476. package/src/commands/journal.ts +4 -13
  477. package/src/commands/ledger-v3.ts +111 -0
  478. package/src/commands/presence.ts +18 -11
  479. package/src/commands/sync.ts +1 -1
  480. package/src/commands/web.ts +67 -8
  481. package/src/commands/work.ts +28 -5
  482. package/src/core/adapter.ts +5 -0
  483. package/src/core/adapters/attest.ts +8 -3
  484. package/src/core/adapters/profiles.ts +4 -6
  485. package/src/core/agents/canonical-emit.ts +39 -28
  486. package/src/core/agents/cli.ts +242 -263
  487. package/src/core/agents/codex-archive-v3.ts +138 -0
  488. package/src/core/agents/coord-client.ts +75 -177
  489. package/src/core/agents/finalization.ts +120 -38
  490. package/src/core/agents/index.ts +5 -5
  491. package/src/core/agents/live-authority-v3.ts +375 -0
  492. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  493. package/src/core/agents/live-observation-v3.ts +216 -0
  494. package/src/core/agents/render/prompt-context.ts +89 -55
  495. package/src/core/agents/render/session-context.ts +23 -32
  496. package/src/core/agents/rules/claim-conflict.ts +85 -126
  497. package/src/core/agents/rules/commit-conflict.ts +3 -14
  498. package/src/core/agents/rules/stop-hook.ts +239 -293
  499. package/src/core/agents/session-events.ts +137 -104
  500. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  501. package/src/core/agents/session-finalizer-v3.ts +953 -0
  502. package/src/core/agents/session-name-display.ts +149 -0
  503. package/src/core/agents/state/activity-log.ts +6 -14
  504. package/src/core/agents/state/heartbeat-writer.ts +98 -242
  505. package/src/core/agents/state/live-coordination-view.ts +290 -0
  506. package/src/core/agents/state/session-state.ts +143 -0
  507. package/src/core/agents/state/stale-sweep.ts +40 -17
  508. package/src/core/artifacts/index.ts +4 -5
  509. package/src/core/config.ts +148 -3
  510. package/src/core/context/index.ts +9 -17
  511. package/src/core/events/span-parent.ts +46 -0
  512. package/src/core/events/v3/advance.ts +168 -0
  513. package/src/core/events/v3/authority-outbox.ts +548 -0
  514. package/src/core/events/v3/base-builder.ts +60 -0
  515. package/src/core/events/v3/base-contract.ts +882 -0
  516. package/src/core/events/v3/bootstrap.ts +226 -0
  517. package/src/core/events/v3/builder.ts +59 -0
  518. package/src/core/events/v3/canonical.ts +153 -0
  519. package/src/core/events/v3/capabilities.ts +171 -0
  520. package/src/core/events/v3/capability-drift.ts +177 -0
  521. package/src/core/events/v3/catalog.ts +202 -0
  522. package/src/core/events/v3/clock-order.ts +41 -0
  523. package/src/core/events/v3/contract.ts +365 -0
  524. package/src/core/events/v3/control.ts +576 -0
  525. package/src/core/events/v3/coordination-view.ts +193 -0
  526. package/src/core/events/v3/economics.ts +384 -0
  527. package/src/core/events/v3/finalization-view.ts +67 -0
  528. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  529. package/src/core/events/v3/generated.ts +48 -0
  530. package/src/core/events/v3/ids.ts +33 -0
  531. package/src/core/events/v3/index.ts +322 -0
  532. package/src/core/events/v3/latency.ts +551 -0
  533. package/src/core/events/v3/live-feed.ts +319 -0
  534. package/src/core/events/v3/live-observation.ts +39 -0
  535. package/src/core/events/v3/live-routing.ts +135 -0
  536. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  537. package/src/core/events/v3/producers/command.ts +201 -0
  538. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  539. package/src/core/events/v3/producers/coordination.ts +355 -0
  540. package/src/core/events/v3/producers/hook-base.ts +578 -0
  541. package/src/core/events/v3/producers/hook.ts +119 -0
  542. package/src/core/events/v3/producers/intake.ts +319 -0
  543. package/src/core/events/v3/producers/recorder.ts +2805 -0
  544. package/src/core/events/v3/projection.ts +653 -0
  545. package/src/core/events/v3/reader.ts +1127 -0
  546. package/src/core/events/v3/recovery-record.ts +244 -0
  547. package/src/core/events/v3/recovery.ts +271 -0
  548. package/src/core/events/v3/span-state.ts +187 -0
  549. package/src/core/events/v3/targets.ts +182 -0
  550. package/src/core/events/v3/turn-telemetry.ts +259 -0
  551. package/src/core/events/v3/validate.ts +361 -0
  552. package/src/core/events/v3/writer.ts +419 -0
  553. package/src/core/governor/index.ts +3 -0
  554. package/src/core/governor/plan-api.ts +10 -2
  555. package/src/core/governor/read.ts +3 -0
  556. package/src/core/governor/state.ts +52 -5
  557. package/src/core/guard/config.ts +206 -0
  558. package/src/core/guard/coordinator.ts +227 -0
  559. package/src/core/guard/evaluator.ts +343 -0
  560. package/src/core/guard/evidence-v3.ts +227 -0
  561. package/src/core/guard/index.ts +35 -0
  562. package/src/core/guard/live-source-v3.ts +204 -0
  563. package/src/core/guard/storage.ts +188 -0
  564. package/src/core/guard/types.ts +152 -0
  565. package/src/core/hooks/adapter/detect.ts +28 -1
  566. package/src/core/hooks/adapter/events.ts +15 -6
  567. package/src/core/hooks/adapter/output.ts +7 -2
  568. package/src/core/hooks/adapter/parse.ts +81 -36
  569. package/src/core/hooks/adapter/wiring.ts +119 -13
  570. package/src/core/hooks/cli.ts +398 -422
  571. package/src/core/hooks/codex-authorization.ts +253 -0
  572. package/src/core/hooks/effects/image-capture.ts +228 -238
  573. package/src/core/hooks/effects/index.ts +1 -36
  574. package/src/core/hooks/events/input-hash.ts +47 -0
  575. package/src/core/hooks/index.ts +4 -11
  576. package/src/core/hooks/resolve/coord-root.ts +1 -1
  577. package/src/core/hooks/resolve/owner.ts +52 -45
  578. package/src/core/hooks/resolve/transcript.ts +165 -14
  579. package/src/core/hooks/session-name-presence.ts +14 -15
  580. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  581. package/src/core/journal/index.ts +15 -22
  582. package/src/core/presence/blob.ts +63 -38
  583. package/src/core/presence/codec-digest.ts +215 -0
  584. package/src/core/presence/index.ts +18 -1
  585. package/src/core/presence/relay-client.ts +5 -5
  586. package/src/core/work/index.ts +3 -0
  587. package/src/core/work/read.ts +3 -0
  588. package/src/core/work/runner.ts +6 -0
  589. package/src/core/work/state.ts +27 -3
  590. package/src/core/workflow/engine.ts +24 -24
  591. package/src/core/workflow/live-session-v3.ts +126 -0
  592. package/src/core/workflow/scope-id.ts +6 -0
  593. package/src/core/workflow/workspaces/leases.ts +56 -19
  594. package/src/index.ts +1 -1
  595. package/src/lib/browser/client.ts +230 -0
  596. package/src/lib/browser/critique.ts +104 -27
  597. package/src/lib/browser/geometry.ts +143 -14
  598. package/src/lib/browser/index.ts +34 -0
  599. package/src/lib/browser/qa-plan.ts +501 -0
  600. package/src/lib/browser/qa-reuse.ts +306 -0
  601. package/src/lib/browser/qa-snapshot.ts +223 -0
  602. package/src/lib/browser/runts.ts +27 -2
  603. package/src/lib/browser/tiling.ts +164 -0
  604. package/src/lib/context/index.ts +22 -46
  605. package/src/lib/council/index.ts +9 -21
  606. package/src/lib/docs-frontmatter.ts +8 -79
  607. package/src/lib/docs-index.ts +33 -3
  608. package/src/lib/docs-lint.ts +15 -29
  609. package/src/lib/docs-metadata-audit.ts +166 -0
  610. package/src/lib/docs-metadata-managed.ts +83 -0
  611. package/src/lib/docs-metadata-sync.ts +262 -0
  612. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  613. package/src/lib/docs-metadata-v2.ts +646 -0
  614. package/src/lib/docs-new.ts +63 -0
  615. package/src/lib/docs-sweep.ts +42 -28
  616. package/src/lib/headless/index.ts +287 -0
  617. package/src/lib/identities/assume.ts +67 -86
  618. package/src/lib/instructions/apply.ts +33 -20
  619. package/src/lib/instructions/bundle.ts +199 -0
  620. package/src/lib/instructions/splice.ts +21 -7
  621. package/src/lib/instructions/templates.ts +85 -13
  622. package/dist/core/agents/cli-emit.d.ts +0 -27
  623. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  624. package/dist/core/agents/cli-emit.js +0 -57
  625. package/dist/core/agents/codex-replay.d.ts +0 -29
  626. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  627. package/dist/core/agents/codex-replay.js +0 -138
  628. package/dist/core/agents/events/consume.d.ts +0 -82
  629. package/dist/core/agents/events/consume.d.ts.map +0 -1
  630. package/dist/core/agents/events/consume.js +0 -195
  631. package/dist/core/agents/events/emit.d.ts +0 -42
  632. package/dist/core/agents/events/emit.d.ts.map +0 -1
  633. package/dist/core/agents/events/emit.js +0 -75
  634. package/dist/core/agents/events/ulid.d.ts +0 -11
  635. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  636. package/dist/core/agents/events/ulid.js +0 -47
  637. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
  638. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  639. package/dist/core/agents/state/heartbeat-projector.js +0 -527
  640. package/dist/core/hooks/events/emit.d.ts +0 -31
  641. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  642. package/dist/core/hooks/events/emit.js +0 -93
  643. package/dist/core/hooks/events/rotate.d.ts +0 -43
  644. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  645. package/dist/core/hooks/events/rotate.js +0 -142
  646. package/dist/core/hooks/events/schema.d.ts +0 -312
  647. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  648. package/dist/core/hooks/events/schema.js +0 -12
  649. package/dist/core/hooks/events/ulid.d.ts +0 -10
  650. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  651. package/dist/core/hooks/events/ulid.js +0 -47
  652. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  653. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  654. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  655. package/src/core/agents/cli-emit.ts +0 -64
  656. package/src/core/agents/codex-replay.ts +0 -163
  657. package/src/core/agents/events/consume.ts +0 -254
  658. package/src/core/agents/events/emit.ts +0 -115
  659. package/src/core/agents/events/ulid.ts +0 -51
  660. package/src/core/agents/state/heartbeat-projector.ts +0 -582
  661. package/src/core/hooks/events/emit.ts +0 -125
  662. package/src/core/hooks/events/rotate.ts +0 -151
  663. package/src/core/hooks/events/schema.ts +0 -538
  664. package/src/core/hooks/events/ulid.ts +0 -51
  665. 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++) {
@@ -620,9 +568,13 @@ async function handlePromptContext(root: string, rest: string[]): Promise<number
620
568
  const sessionNameNudge = args["session-name-nudge"] === "true";
621
569
  const taskNudge = args["task-nudge"] === "true";
622
570
  const statusFooterNudge = args["status-footer-nudge"] === "true";
571
+ // Value is the adapter id; a bare flag (parsed as "true") still enables the
572
+ // reminder with the adapter-neutral wording.
573
+ const turnRitualNudge =
574
+ args["turn-ritual-nudge"] === "true" ? "generic" : args["turn-ritual-nudge"];
623
575
  if (!instanceId) {
624
576
  process.stderr.write(
625
- "agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--status-footer-nudge]\n",
577
+ "agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n",
626
578
  );
627
579
  return 2;
628
580
  }
@@ -635,6 +587,7 @@ async function handlePromptContext(root: string, rest: string[]): Promise<number
635
587
  sessionNameNudge,
636
588
  taskNudge,
637
589
  statusFooterNudge,
590
+ turnRitualNudge,
638
591
  });
639
592
  process.stdout.write(text);
640
593
  return 0;
@@ -677,43 +630,6 @@ async function handleSessionContext(root: string, rest: string[]): Promise<numbe
677
630
  return 0;
678
631
  }
679
632
 
680
- async function handleCodexReplay(root: string, rest: string[]): Promise<number> {
681
- const args: Record<string, string> = {};
682
- for (let i = 0; i < rest.length; i++) {
683
- const a = rest[i]!;
684
- if (a.startsWith("--")) {
685
- const key = a.slice(2);
686
- const val = rest[i + 1];
687
- if (val === undefined || val.startsWith("--")) {
688
- args[key] = "true";
689
- } else {
690
- args[key] = val;
691
- i++;
692
- }
693
- }
694
- }
695
- const jsonlPath = args.jsonl;
696
- const sessionId = args.session;
697
- const instanceId = args.owner ?? sessionId;
698
- const lastMsg = args["last-message"];
699
- if (!jsonlPath || !sessionId) {
700
- process.stderr.write(
701
- "agent-coord codex-replay --jsonl <path> --session <id> [--owner <id>] [--last-message <text>]\n",
702
- );
703
- return 2;
704
- }
705
- const { replayCodexJsonl } = await import("./codex-replay.ts");
706
- const result = replayCodexJsonl({
707
- coordRoot: root,
708
- jsonlPath,
709
- sessionId,
710
- instanceId: instanceId!,
711
- lastAssistantMessage: lastMsg,
712
- });
713
- process.stdout.write(`${JSON.stringify({ session_id: sessionId, emitted: result.emitted })}\n`);
714
- return 0;
715
- }
716
-
717
633
  async function handleResolveName(root: string, rest: string[]): Promise<number> {
718
634
  const { resolveName } = await import("./state/names.ts");
719
635
  const [owner, session] = rest;
@@ -733,7 +649,6 @@ async function handleResolveName(root: string, rest: string[]): Promise<number>
733
649
  }
734
650
 
735
651
  async function handleEmitEvent(root: string, rest: string[]): Promise<number> {
736
- const { emitAndProject } = await import("./cli-emit.ts");
737
652
  const args: Record<string, string> = {};
738
653
  for (let i = 0; i < rest.length; i++) {
739
654
  const a = rest[i]!;
@@ -753,11 +668,11 @@ async function handleEmitEvent(root: string, rest: string[]): Promise<number> {
753
668
  const instanceId = args.owner;
754
669
  const sessionId = args.session;
755
670
  const adapter = args.adapter as "claude-code" | "cursor" | "codex" | undefined;
756
- const dataJson = args["data-json"] ?? "{}";
671
+ const dataJson = args["data-stdin"] === "true" ? await readStdin() : "";
757
672
 
758
- if (!eventType || !instanceId || !sessionId || !adapter) {
673
+ if (!eventType || !instanceId || !sessionId || !adapter || !dataJson) {
759
674
  process.stderr.write(
760
- "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",
761
676
  );
762
677
  return 2;
763
678
  }
@@ -768,37 +683,88 @@ async function handleEmitEvent(root: string, rest: string[]): Promise<number> {
768
683
  if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
769
684
  data = parsed as Record<string, unknown>;
770
685
  } else {
771
- 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");
772
687
  return 2;
773
688
  }
774
689
  } catch (err) {
775
690
  process.stderr.write(
776
- `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`,
777
692
  );
778
693
  return 2;
779
694
  }
780
695
 
781
- const result = emitAndProject(
782
- {
783
- event_type: eventType,
784
- instance_id: instanceId,
785
- session_id: sessionId,
786
- adapter,
787
- turn_id: args["turn-id"],
788
- parent_session_id: args["parent-session-id"],
789
- parent_turn_id: args["parent-turn-id"],
790
- data,
791
- },
792
- { coordRoot: root },
793
- );
794
-
795
- if (!result) {
796
- 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
+ );
797
702
  return 1;
798
703
  }
799
-
800
- process.stdout.write(`${JSON.stringify(result.envelope)}\n`);
801
- 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;
802
768
  }
803
769
 
804
770
  /**
@@ -871,14 +837,26 @@ async function handleGitHook(fallbackRoot: string, rest: string[]): Promise<numb
871
837
  : gh.collectCheckoutRemoved(cwd, rest[1] ?? "", rest[2] ?? "");
872
838
  if (paths.length === 0) return 0;
873
839
  const { resolveOwner } = await import("../hooks/resolve/owner.ts");
874
- const owner = resolveOwner({ payload: null, coordRoot: root })?.instance_id;
840
+ const owner = resolveOwner({
841
+ payload: null,
842
+ coordRoot: root,
843
+ })?.instance_id;
875
844
  if (!owner) return 0;
876
- const { groupUnclaim } = await import("./state/heartbeat-writer.ts");
877
- 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");
878
847
  for (const path of paths) {
879
848
  try {
880
- for (const hit of groupUnclaim(root, owner, path)) {
881
- 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
+ });
882
860
  }
883
861
  } catch {
884
862
  /* best-effort */
@@ -914,12 +892,9 @@ async function main(): Promise<number> {
914
892
 
915
893
  if (
916
894
  subcommand === "set-task" ||
917
- subcommand === "set-turn-summary" ||
918
895
  subcommand === "release-claim" ||
919
- subcommand === "kill-heartbeat" ||
920
896
  subcommand === "heal-pidmap" ||
921
- subcommand === "heal-heartbeat" ||
922
- subcommand === "stamp-tool-activity"
897
+ subcommand === "repair-coordination-cache"
923
898
  ) {
924
899
  return handleStateAction(root, subcommand, rest);
925
900
  }
@@ -947,14 +922,18 @@ async function main(): Promise<number> {
947
922
  return handleResolveName(root, rest);
948
923
  }
949
924
 
950
- if (subcommand === "codex-replay") {
951
- return handleCodexReplay(root, rest);
952
- }
953
-
954
925
  if (subcommand === "stale-sweep") {
955
926
  return handleStaleSweep(root, rest);
956
927
  }
957
928
 
929
+ if (subcommand === "reconcile-finalization") {
930
+ return handleReconcileFinalization(root);
931
+ }
932
+
933
+ if (subcommand === "end-session") {
934
+ return handleEndSession(root, rest);
935
+ }
936
+
958
937
  if (subcommand === "session-context") {
959
938
  return handleSessionContext(root, rest);
960
939
  }