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
@@ -0,0 +1,290 @@
1
+ import {
2
+ existsSync,
3
+ mkdirSync,
4
+ readdirSync,
5
+ readFileSync,
6
+ renameSync,
7
+ writeFileSync,
8
+ } from "node:fs";
9
+ import { dirname, join } from "node:path";
10
+ import type { Adapter } from "../../adapter.ts";
11
+ import {
12
+ type CoordinationGenerationViewV3,
13
+ type CoordinationViewV3,
14
+ readCoordinationViewV3,
15
+ requireAuthoritySafeCoordinationViewV3,
16
+ } from "../../events/v3/coordination-view.ts";
17
+ import {
18
+ liveInstanceIdV3,
19
+ nativeInstanceIdV3,
20
+ resolveLiveEventLedgerRouteV3,
21
+ } from "../../events/v3/live-routing.ts";
22
+ import { type Heartbeat, readHeartbeat } from "./heartbeat-writer.ts";
23
+ import { resolveName } from "./names.ts";
24
+
25
+ /**
26
+ * Heartbeat files are disposable V3 caches. These bindings prevent a stale
27
+ * row from a prior generation from being mistaken for current authority.
28
+ */
29
+ export interface V3HeartbeatMaterialization extends Heartbeat {
30
+ schema_version: 2;
31
+ v3_instance_id: `inst_${string}`;
32
+ v3_generation_id: `gen_${string}`;
33
+ v3_projection_event_id: string;
34
+ v3_task_state: "set" | "cleared";
35
+ }
36
+
37
+ /** Read the live coordination rows through the hard-cut ledger route. */
38
+ export function readLiveCoordinationRows(coordRoot: string): V3HeartbeatMaterialization[] {
39
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
40
+ if (route.state === "blocked") return [];
41
+ let view: CoordinationViewV3;
42
+ try {
43
+ view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
44
+ } catch {
45
+ return [];
46
+ }
47
+ const caches = readV3Caches(coordRoot);
48
+ const byGeneration = new Map(
49
+ Object.values(view.instances).map((generation) => [generation.generation_id, generation]),
50
+ );
51
+ return Object.values(view.instances)
52
+ .filter((generation) => generation.authority_eligible)
53
+ .map((generation) => {
54
+ const parent = generation.parent_generation_id
55
+ ? byGeneration.get(generation.parent_generation_id)
56
+ : undefined;
57
+ return projectHeartbeatV3(
58
+ coordRoot,
59
+ generation,
60
+ matchingCache(caches, generation),
61
+ undefined,
62
+ parent,
63
+ );
64
+ });
65
+ }
66
+
67
+ /** Read one current row from the authority-safe V3 projection. */
68
+ export function readLiveCoordinationRow(
69
+ coordRoot: string,
70
+ nativeInstanceId: string,
71
+ ): V3HeartbeatMaterialization | null {
72
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
73
+ if (route.state === "blocked") return null;
74
+ try {
75
+ const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
76
+ const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
77
+ if (!generation?.authority_eligible) return null;
78
+ const cache = readHeartbeat(coordRoot, nativeInstanceId);
79
+ const parent = generation.parent_generation_id
80
+ ? Object.values(view.instances).find(
81
+ (candidate) => candidate.generation_id === generation.parent_generation_id,
82
+ )
83
+ : undefined;
84
+ return projectHeartbeatV3(
85
+ coordRoot,
86
+ generation,
87
+ isCurrentCache(cache, generation) ? cache : undefined,
88
+ nativeInstanceId,
89
+ parent,
90
+ );
91
+ } catch {
92
+ return null;
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Resolve the adapter from the current authority-safe V3 generation. A live
98
+ * V3 generation is stronger evidence than a missing or stale heartbeat, so
99
+ * callers must never substitute another adapter when this function succeeds.
100
+ */
101
+ export function liveCoordinationAdapterV3(
102
+ coordRoot: string,
103
+ nativeInstanceId: string,
104
+ ): Adapter | null {
105
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
106
+ if (route.state === "blocked") throw new Error(`event_v3_coordination_view:${route.reason}`);
107
+ const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
108
+ const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
109
+ if (!generation?.authority_eligible) return null;
110
+ const adapter = observedAdapter(generation);
111
+ if (!isAdapter(adapter)) {
112
+ throw new Error("event_v3_coordination_view:adapter_not_observed");
113
+ }
114
+ return adapter;
115
+ }
116
+
117
+ /**
118
+ * Ensure the current V3 generation has a mutation target. The resulting file
119
+ * is explicitly generation-bound and disposable: V3 remains the source of
120
+ * truth, while the cache gives the crash-safe authority outbox an atomic local
121
+ * state to reconcile.
122
+ */
123
+ export function ensureLiveCoordinationHeartbeat(
124
+ coordRoot: string,
125
+ nativeInstanceId: string,
126
+ nativeSessionId: string,
127
+ _adapter: Adapter,
128
+ model?: string,
129
+ ): Heartbeat | null {
130
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
131
+ if (route.state === "blocked") throw new Error(`event_v3_coordination_view:${route.reason}`);
132
+ const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
133
+ const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
134
+ if (!generation?.authority_eligible) return null;
135
+ const generationAdapter = observedAdapter(generation);
136
+ if (!isAdapter(generationAdapter)) {
137
+ throw new Error("event_v3_coordination_view:adapter_not_observed");
138
+ }
139
+ const current = readHeartbeat(coordRoot, nativeInstanceId);
140
+ if (isCurrentCache(current, generation) && current.platform === generationAdapter) return current;
141
+
142
+ const resolved = resolveName(coordRoot, nativeInstanceId, nativeSessionId);
143
+ const projected = projectHeartbeatV3(coordRoot, generation, undefined, nativeInstanceId);
144
+ const materialized: V3HeartbeatMaterialization = {
145
+ ...projected,
146
+ schema_version: 2,
147
+ instance_id: nativeInstanceId,
148
+ session_id: nativeSessionId,
149
+ name: resolved?.name ?? "",
150
+ kind: resolved?.kind ?? projected.kind,
151
+ agent_id: resolved?.agent_id ?? (resolved?.kind === "subagent" ? nativeInstanceId : ""),
152
+ model: projected.model ?? model ?? "",
153
+ platform: generationAdapter,
154
+ v3_instance_id: generation.instance_id as `inst_${string}`,
155
+ v3_generation_id: generation.generation_id as `gen_${string}`,
156
+ v3_projection_event_id: generation.last_event_id,
157
+ v3_task_state: generation.task_state === "set" ? "set" : "cleared",
158
+ };
159
+ writeHeartbeatCache(coordRoot, nativeInstanceId, materialized);
160
+ return materialized;
161
+ }
162
+
163
+ function readCacheRows(coordRoot: string): Heartbeat[] {
164
+ const dir = join(coordRoot, ".harnery", "active");
165
+ if (!existsSync(dir)) return [];
166
+ const rows: Heartbeat[] = [];
167
+ for (const file of readdirSync(dir)) {
168
+ if (!file.endsWith(".json")) continue;
169
+ try {
170
+ rows.push(JSON.parse(readFileSync(join(dir, file), "utf8")) as Heartbeat);
171
+ } catch {
172
+ // A partial heartbeat is ignored exactly as before.
173
+ }
174
+ }
175
+ return rows;
176
+ }
177
+
178
+ function readV3Caches(coordRoot: string): Heartbeat[] {
179
+ return readCacheRows(coordRoot).filter(
180
+ (row) => row.schema_version === 2 && typeof row.v3_generation_id === "string",
181
+ );
182
+ }
183
+
184
+ function matchingCache(
185
+ caches: Heartbeat[],
186
+ generation: CoordinationGenerationViewV3,
187
+ ): Heartbeat | undefined {
188
+ return caches.find((cache) => isCurrentCache(cache, generation));
189
+ }
190
+
191
+ function isCurrentCache(
192
+ cache: Heartbeat | null | undefined,
193
+ generation: CoordinationGenerationViewV3,
194
+ ): cache is Heartbeat {
195
+ return (
196
+ cache?.schema_version === 2 &&
197
+ cache.v3_instance_id === generation.instance_id &&
198
+ cache.v3_generation_id === generation.generation_id
199
+ );
200
+ }
201
+
202
+ function projectHeartbeatV3(
203
+ coordRoot: string,
204
+ generation: CoordinationGenerationViewV3,
205
+ cache: Heartbeat | undefined,
206
+ nativeInstanceId: string | undefined,
207
+ parent?: CoordinationGenerationViewV3,
208
+ ): V3HeartbeatMaterialization {
209
+ const adapter = observedAdapter(generation) ?? cache?.platform ?? "unknown";
210
+ const model = observedModel(generation) ?? cache?.model ?? "";
211
+ const instanceId =
212
+ nativeInstanceId ?? cache?.instance_id ?? nativeInstanceIdV3(generation.instance_id);
213
+ const durableIdentity = resolveName(
214
+ coordRoot,
215
+ instanceId,
216
+ cache?.session_id ?? generation.session_id,
217
+ );
218
+ const taskIsSet = generation.task_state === "set";
219
+ const lifecycle = isLifecycleState(generation.lifecycle_state)
220
+ ? generation.lifecycle_state
221
+ : "active";
222
+ return {
223
+ schema_version: 2,
224
+ instance_id: instanceId,
225
+ session_id: parent?.session_id ?? generation.session_id,
226
+ native_session_id: cache?.session_id,
227
+ name: cache?.name || durableIdentity?.name,
228
+ kind:
229
+ cache?.kind ??
230
+ durableIdentity?.kind ??
231
+ (generation.parent_generation_id || generation.delegation_id
232
+ ? "subagent"
233
+ : generation.workflow_id
234
+ ? "workflow-child"
235
+ : "session"),
236
+ agent_id: cache?.agent_id ?? durableIdentity?.agent_id,
237
+ model,
238
+ platform: adapter,
239
+ started_at: generation.started_at,
240
+ last_heartbeat: generation.last_observed_at,
241
+ files_touched: generation.files_touched,
242
+ ...(taskIsSet && cache?.task ? { task: cache.task } : {}),
243
+ task_updated_at: taskIsSet ? cache?.task_updated_at : null,
244
+ activity: generation.activity === "terminal" ? "idle" : generation.activity,
245
+ activity_updated_at: generation.last_observed_at,
246
+ activity_source: "event-v3-coordination-view",
247
+ task_state: lifecycle,
248
+ task_state_updated_at: generation.lifecycle_state_updated_at,
249
+ task_state_reason: lifecycle === "blocked" ? cache?.task_state_reason : undefined,
250
+ suggested_session_name: cache?.suggested_session_name,
251
+ session_name_seen_at: cache?.session_name_seen_at,
252
+ session_name_seen_for: cache?.session_name_seen_for,
253
+ workflow_run_id: generation.run_id,
254
+ workflow_agent_id: generation.workflow_agent_id,
255
+ parent_instance_id: parent ? nativeInstanceIdV3(parent.instance_id) : undefined,
256
+ v3_instance_id: generation.instance_id as `inst_${string}`,
257
+ v3_generation_id: generation.generation_id as `gen_${string}`,
258
+ v3_projection_event_id: generation.last_event_id,
259
+ v3_task_state: taskIsSet ? "set" : "cleared",
260
+ };
261
+ }
262
+
263
+ function observedAdapter(generation: CoordinationGenerationViewV3): string | undefined {
264
+ const observation = generation.runtime_attestation.adapter;
265
+ return observation.state === "observed" ? observation.value.id : undefined;
266
+ }
267
+
268
+ function isAdapter(value: string | undefined): value is Adapter {
269
+ return value === "claude-code" || value === "cursor" || value === "codex";
270
+ }
271
+
272
+ function observedModel(generation: CoordinationGenerationViewV3): string | undefined {
273
+ const observation = generation.runtime_attestation.model;
274
+ return observation.state === "observed" ? observation.value.id : undefined;
275
+ }
276
+
277
+ function isLifecycleState(value: string | undefined): value is "active" | "blocked" | "done" {
278
+ return value === "active" || value === "blocked" || value === "done";
279
+ }
280
+
281
+ function writeHeartbeatCache(coordRoot: string, instanceId: string, heartbeat: Heartbeat): void {
282
+ if (!/^[a-zA-Z0-9._-]{1,128}$/.test(instanceId)) {
283
+ throw new Error("instance_id is unsafe for heartbeat materialization");
284
+ }
285
+ const path = join(coordRoot, ".harnery", "active", `${instanceId}.json`);
286
+ mkdirSync(dirname(path), { recursive: true });
287
+ const temporary = `${path}.tmp.${process.pid}`;
288
+ writeFileSync(temporary, JSON.stringify(heartbeat, null, 2), "utf8");
289
+ renameSync(temporary, path);
290
+ }
@@ -0,0 +1,143 @@
1
+ /** What the agent is doing now. `unknown` is evidence-safe, not an error. */
2
+ export type AgentActivity = "unknown" | "working" | "needs_input" | "idle";
3
+
4
+ /** Whether the declared task remains open. Activity never changes this axis. */
5
+ export type TaskState = "active" | "blocked" | "done";
6
+
7
+ /** Raw fields stored in the disposable V3 coordination cache and rebuilt from canonical events. */
8
+ export interface SessionStateFields {
9
+ activity?: AgentActivity;
10
+ activity_updated_at?: string;
11
+ activity_source?: string;
12
+ task_state?: TaskState;
13
+ task_state_updated_at?: string;
14
+ task_state_reason?: string;
15
+ }
16
+
17
+ /** Reader-facing state with compatibility defaults applied. */
18
+ export interface SessionState extends SessionStateFields {
19
+ activity: AgentActivity;
20
+ task_state: TaskState;
21
+ }
22
+
23
+ export interface SessionStateSelector {
24
+ instance_id?: string;
25
+ session_id?: string;
26
+ }
27
+
28
+ export interface SessionStateEvidenceEvent {
29
+ event_type: EventTypeV3;
30
+ ts: string;
31
+ payload?: Record<string, unknown>;
32
+ instance_id?: string;
33
+ session_id?: string;
34
+ }
35
+
36
+ const TERMINAL_ACTIVITY_EVENTS: ReadonlySet<EventTypeV3> = new Set([
37
+ "session.ended",
38
+ "agent.completed",
39
+ "turn.completed",
40
+ ]);
41
+
42
+ /**
43
+ * Apply one canonical event to the two independent state axes.
44
+ *
45
+ * The table is deliberately evidence-only. Output chunks, post-tool events,
46
+ * narration, coordination commands, and elapsed time cannot clear an observed
47
+ * input wait. A command start only counts as progress when the session was
48
+ * already inside an open turn (`working` or `needs_input`).
49
+ */
50
+ export function applySessionStateEvent(
51
+ current: Readonly<SessionStateFields>,
52
+ event: SessionStateEvidenceEvent,
53
+ ): SessionStateFields {
54
+ const next: SessionStateFields = { ...current };
55
+
56
+ if (
57
+ event.event_type === "session.started" ||
58
+ event.event_type === "session.resumed" ||
59
+ event.event_type === "agent.started"
60
+ ) {
61
+ setActivity(next, "idle", event);
62
+ } else if (event.event_type === "turn.started" || event.event_type === "tool.requested") {
63
+ setActivity(next, "working", event);
64
+ } else if (event.event_type === "wait.started") {
65
+ setActivity(next, "needs_input", event);
66
+ } else if (event.event_type === "wait.ended") {
67
+ setActivity(next, "working", event);
68
+ } else if (
69
+ event.event_type === "command.started" &&
70
+ (current.activity === "working" || current.activity === "needs_input")
71
+ ) {
72
+ setActivity(next, "working", event);
73
+ } else if (TERMINAL_ACTIVITY_EVENTS.has(event.event_type)) {
74
+ setActivity(next, "idle", event);
75
+ }
76
+
77
+ if (event.event_type === "coord.lifecycle_changed") {
78
+ const payload = event.payload ?? {};
79
+ const state = field(payload, "new_state");
80
+ if (state === "active" || state === "blocked" || state === "done") {
81
+ next.task_state = state;
82
+ next.task_state_updated_at = event.ts;
83
+ const reason = field(payload, "reason");
84
+ if (typeof reason === "string" && reason.length > 0) {
85
+ next.task_state_reason = reason;
86
+ } else {
87
+ delete next.task_state_reason;
88
+ }
89
+ }
90
+ }
91
+
92
+ return next;
93
+ }
94
+
95
+ /**
96
+ * Rebuild both axes from canonical events after a heartbeat has disappeared.
97
+ * Events may be the whole ledger or an already-filtered session slice.
98
+ */
99
+ export function foldSessionState(
100
+ events: readonly SessionStateEvidenceEvent[],
101
+ selector: SessionStateSelector = {},
102
+ ): SessionState {
103
+ const ordered = events
104
+ .map((event, index) => ({ event, index }))
105
+ .filter(({ event }) => matches(event, selector))
106
+ .sort((a, b) => timestamp(a.event) - timestamp(b.event) || a.index - b.index);
107
+
108
+ let fields: SessionStateFields = {};
109
+ for (const { event } of ordered) fields = applySessionStateEvent(fields, event);
110
+
111
+ return {
112
+ ...fields,
113
+ activity: fields.activity ?? "unknown",
114
+ task_state: fields.task_state ?? "active",
115
+ };
116
+ }
117
+
118
+ function setActivity(
119
+ target: SessionStateFields,
120
+ activity: AgentActivity,
121
+ event: SessionStateEvidenceEvent,
122
+ ): void {
123
+ target.activity = activity;
124
+ target.activity_updated_at = event.ts;
125
+ target.activity_source = event.event_type;
126
+ }
127
+
128
+ function matches(event: SessionStateEvidenceEvent, selector: SessionStateSelector): boolean {
129
+ if (selector.instance_id && event.instance_id !== selector.instance_id) return false;
130
+ if (selector.session_id && event.session_id !== selector.session_id) return false;
131
+ return true;
132
+ }
133
+
134
+ function timestamp(event: SessionStateEvidenceEvent): number {
135
+ const parsed = Date.parse(event.ts);
136
+ return Number.isFinite(parsed) ? parsed : 0;
137
+ }
138
+
139
+ function field(data: Record<string, unknown>, key: string): unknown {
140
+ return data[key];
141
+ }
142
+
143
+ import type { EventTypeV3 } from "../../events/v3/contract.ts";
@@ -2,7 +2,7 @@
2
2
  * Stale-sweep: prune dead heartbeats + orphaned pid-map + .last-peer-hash
3
3
  * files.
4
4
  *
5
- * Fires at session.start to clean up crashed-peer detritus before the new
5
+ * Runs after session.started to clean up crashed-peer detritus before the new
6
6
  * session's UX layer reads peer state.
7
7
  *
8
8
  * Freshness threshold defaults to 600s; configurable via the
@@ -13,7 +13,7 @@
13
13
  import { existsSync, readdirSync, readFileSync, statSync, unlinkSync } from "node:fs";
14
14
  import { join } from "node:path";
15
15
  import { coordFreshnessSeconds } from "../../config.ts";
16
- import { emit } from "../events/emit.ts";
16
+ import { recordLiveSweepObservationV3 } from "../live-lifecycle-v3.ts";
17
17
 
18
18
  /** platform → adapter, for the swept-event envelope (mirrors heartbeat-writer's adapterOf). */
19
19
  function adapterFromPlatform(platform: unknown): "claude-code" | "cursor" | "codex" {
@@ -22,7 +22,7 @@ function adapterFromPlatform(platform: unknown): "claude-code" | "cursor" | "cod
22
22
  return "claude-code";
23
23
  }
24
24
 
25
- /** Emit a best-effort health.heartbeat_swept event. Telemetry only, never throws. */
25
+ /** Record the sweep before deleting authority state. V3 ambiguity fails closed. */
26
26
  function emitSwept(
27
27
  coordRoot: string,
28
28
  instanceId: string,
@@ -30,19 +30,24 @@ function emitSwept(
30
30
  sessionId: string,
31
31
  reason: "stale" | "unparseable" | "missing_ts",
32
32
  ageSecs?: number,
33
- ): void {
33
+ ): boolean {
34
34
  try {
35
- emit(coordRoot, {
36
- event_type: "health.heartbeat_swept",
37
- instance_id: instanceId,
38
- session_id: sessionId,
35
+ recordLiveSweepObservationV3({
36
+ coordRoot,
37
+ owner: instanceId,
38
+ nativeSessionId: sessionId,
39
39
  adapter,
40
- source: "agent-coord",
41
- data: { reason, ...(ageSecs !== undefined ? { age_secs: ageSecs } : {}) },
42
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
43
- } as Parameters<typeof emit>[1]);
40
+ observation:
41
+ reason === "stale"
42
+ ? "stale_heartbeat"
43
+ : reason === "unparseable"
44
+ ? "unparseable_heartbeat"
45
+ : "missing_timestamp",
46
+ ageMs: Math.max(0, (ageSecs ?? 0) * 1_000),
47
+ });
48
+ return true;
44
49
  } catch {
45
- /* telemetry only, never break the sweep */
50
+ return false;
46
51
  }
47
52
  }
48
53
 
@@ -68,7 +73,7 @@ export function staleSweep(coordRoot: string): {
68
73
  const nowSec = Math.floor(Date.now() / 1000);
69
74
  const cutoff = nowSec - freshness;
70
75
 
71
- // 1. Prune stale heartbeats from the canonical `.harnery/active/` dir.
76
+ // 1. Prune stale rows from the disposable V3 coordination cache.
72
77
  //
73
78
  // Two deletion regimes, deliberately asymmetric:
74
79
  // • Valid JSON with an OLD last_heartbeat → the legitimate dead/idle-agent
@@ -105,9 +110,14 @@ export function staleSweep(coordRoot: string): {
105
110
  // Unparseable: only reap if the file itself is mtime-old.
106
111
  if (mtimeSecs(path) < cutoff) {
107
112
  try {
113
+ const ageSecs = nowSec - mtimeSecs(path);
114
+ if (
115
+ !emitSwept(coordRoot, idFromFile, "claude-code", idFromFile, "unparseable", ageSecs)
116
+ ) {
117
+ continue;
118
+ }
108
119
  unlinkSync(path);
109
120
  heartbeatsRemoved.push(f);
110
- emitSwept(coordRoot, idFromFile, "claude-code", idFromFile, "unparseable");
111
121
  } catch {
112
122
  /* swallow */
113
123
  }
@@ -125,9 +135,20 @@ export function staleSweep(coordRoot: string): {
125
135
  if (!parsed.last_heartbeat || !Number.isFinite(ts)) {
126
136
  // No / NaN last_heartbeat: can't trust content; gate on mtime.
127
137
  if (mtimeSecs(path) < cutoff) {
138
+ if (
139
+ !emitSwept(
140
+ coordRoot,
141
+ instanceId,
142
+ adapter,
143
+ sessionId,
144
+ "missing_ts",
145
+ nowSec - mtimeSecs(path),
146
+ )
147
+ ) {
148
+ continue;
149
+ }
128
150
  unlinkSync(path);
129
151
  heartbeatsRemoved.push(f);
130
- emitSwept(coordRoot, instanceId, adapter, sessionId, "missing_ts");
131
152
  } else if (parsed.instance_id) {
132
153
  liveInstanceIds.add(parsed.instance_id);
133
154
  }
@@ -136,9 +157,11 @@ export function staleSweep(coordRoot: string): {
136
157
 
137
158
  if (ts < cutoff) {
138
159
  // Legitimate stale prune (valid timestamp, past the freshness cutoff).
160
+ if (!emitSwept(coordRoot, instanceId, adapter, sessionId, "stale", nowSec - ts)) {
161
+ continue;
162
+ }
139
163
  unlinkSync(path);
140
164
  heartbeatsRemoved.push(f);
141
- emitSwept(coordRoot, instanceId, adapter, sessionId, "stale", nowSec - ts);
142
165
  continue;
143
166
  }
144
167
 
@@ -22,6 +22,7 @@ import {
22
22
  writeFileSync,
23
23
  } from "node:fs";
24
24
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
25
+ import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.ts";
25
26
  import { artifactDefaultRetentionDays } from "../config.ts";
26
27
 
27
28
  export const ARTIFACTS_DIR = join(".harnery", "artifacts");
@@ -437,12 +438,10 @@ function ownerLiveness(
437
438
  now: Date,
438
439
  freshnessSeconds: number,
439
440
  ): "live" | "stale" | "unknown" {
440
- const path = join(repoRoot, ".harnery", "active", `${instanceId}.json`);
441
- if (!existsSync(path)) return "stale";
442
441
  try {
443
- const hb = JSON.parse(readFileSync(path, "utf8")) as { last_heartbeat?: unknown };
444
- if (typeof hb.last_heartbeat !== "string") return "unknown";
445
- const ts = Date.parse(hb.last_heartbeat);
442
+ const row = readLiveCoordinationRow(repoRoot, instanceId);
443
+ if (!row) return "stale";
444
+ const ts = Date.parse(row.last_heartbeat);
446
445
  if (!Number.isFinite(ts)) return "unknown";
447
446
  return now.getTime() - ts <= freshnessSeconds * 1000 ? "live" : "stale";
448
447
  } catch {