harnery 0.33.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 (657) hide show
  1. package/dist/commander.d.ts.map +1 -1
  2. package/dist/commander.js +4 -0
  3. package/dist/commands/adapter.js +2 -2
  4. package/dist/commands/agents.d.ts +144 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +1220 -588
  7. package/dist/commands/artifacts.d.ts.map +1 -1
  8. package/dist/commands/artifacts.js +7 -6
  9. package/dist/commands/backup.d.ts +1 -1
  10. package/dist/commands/backup.d.ts.map +1 -1
  11. package/dist/commands/backup.js +29 -16
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +234 -12
  14. package/dist/commands/checkpoint.d.ts.map +1 -1
  15. package/dist/commands/checkpoint.js +3 -2
  16. package/dist/commands/claude-desktop.d.ts +1 -1
  17. package/dist/commands/claude-desktop.d.ts.map +1 -1
  18. package/dist/commands/claude-desktop.js +3 -74
  19. package/dist/commands/context.js +1 -6
  20. package/dist/commands/decision.d.ts.map +1 -1
  21. package/dist/commands/decision.js +22 -38
  22. package/dist/commands/docs.d.ts.map +1 -1
  23. package/dist/commands/docs.js +91 -28
  24. package/dist/commands/doctor.js +10 -1
  25. package/dist/commands/events.d.ts +5 -0
  26. package/dist/commands/events.d.ts.map +1 -0
  27. package/dist/commands/events.js +189 -0
  28. package/dist/commands/governor.d.ts.map +1 -1
  29. package/dist/commands/governor.js +13 -4
  30. package/dist/commands/init.d.ts +9 -2
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +223 -51
  33. package/dist/commands/journal.d.ts.map +1 -1
  34. package/dist/commands/journal.js +4 -13
  35. package/dist/commands/ledger-v3.d.ts +5 -0
  36. package/dist/commands/ledger-v3.d.ts.map +1 -0
  37. package/dist/commands/ledger-v3.js +91 -0
  38. package/dist/commands/presence.d.ts.map +1 -1
  39. package/dist/commands/presence.js +11 -5
  40. package/dist/commands/sync.d.ts +1 -1
  41. package/dist/commands/sync.js +1 -1
  42. package/dist/commands/web.d.ts +6 -0
  43. package/dist/commands/web.d.ts.map +1 -1
  44. package/dist/commands/web.js +67 -7
  45. package/dist/commands/work.d.ts.map +1 -1
  46. package/dist/commands/work.js +22 -5
  47. package/dist/core/adapter.d.ts +5 -0
  48. package/dist/core/adapter.d.ts.map +1 -0
  49. package/dist/core/adapter.js +1 -0
  50. package/dist/core/adapters/attest.d.ts +5 -2
  51. package/dist/core/adapters/attest.d.ts.map +1 -1
  52. package/dist/core/adapters/attest.js +8 -3
  53. package/dist/core/adapters/profiles.d.ts +6 -6
  54. package/dist/core/adapters/profiles.d.ts.map +1 -1
  55. package/dist/core/adapters/profiles.js +4 -4
  56. package/dist/core/agents/canonical-emit.d.ts +17 -15
  57. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  58. package/dist/core/agents/canonical-emit.js +22 -22
  59. package/dist/core/agents/cli.js +207 -234
  60. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  61. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  62. package/dist/core/agents/codex-archive-v3.js +110 -0
  63. package/dist/core/agents/coord-client.d.ts +19 -81
  64. package/dist/core/agents/coord-client.d.ts.map +1 -1
  65. package/dist/core/agents/coord-client.js +65 -155
  66. package/dist/core/agents/finalization.d.ts +4 -1
  67. package/dist/core/agents/finalization.d.ts.map +1 -1
  68. package/dist/core/agents/finalization.js +89 -32
  69. package/dist/core/agents/index.d.ts +4 -5
  70. package/dist/core/agents/index.d.ts.map +1 -1
  71. package/dist/core/agents/index.js +4 -5
  72. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  73. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  74. package/dist/core/agents/live-authority-v3.js +233 -0
  75. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  76. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  77. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  78. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  79. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-observation-v3.js +157 -0
  81. package/dist/core/agents/render/prompt-context.d.ts +4 -4
  82. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  83. package/dist/core/agents/render/prompt-context.js +23 -58
  84. package/dist/core/agents/render/session-context.d.ts +1 -1
  85. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  86. package/dist/core/agents/render/session-context.js +8 -32
  87. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  88. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  89. package/dist/core/agents/rules/claim-conflict.js +79 -127
  90. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  91. package/dist/core/agents/rules/commit-conflict.js +3 -18
  92. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  93. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  94. package/dist/core/agents/rules/stop-hook.js +193 -236
  95. package/dist/core/agents/session-events.d.ts +5 -7
  96. package/dist/core/agents/session-events.d.ts.map +1 -1
  97. package/dist/core/agents/session-events.js +127 -95
  98. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  99. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  100. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  101. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  102. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  103. package/dist/core/agents/session-finalizer-v3.js +734 -0
  104. package/dist/core/agents/session-name-display.d.ts +40 -0
  105. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  106. package/dist/core/agents/session-name-display.js +119 -0
  107. package/dist/core/agents/state/activity-log.d.ts +3 -3
  108. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  109. package/dist/core/agents/state/activity-log.js +7 -16
  110. package/dist/core/agents/state/heartbeat-writer.d.ts +23 -55
  111. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  112. package/dist/core/agents/state/heartbeat-writer.js +56 -228
  113. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  114. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-view.js +209 -0
  116. package/dist/core/agents/state/session-state.d.ts +4 -3
  117. package/dist/core/agents/state/session-state.d.ts.map +1 -1
  118. package/dist/core/agents/state/session-state.js +18 -9
  119. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  120. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  121. package/dist/core/agents/state/stale-sweep.js +26 -15
  122. package/dist/core/artifacts/index.d.ts.map +1 -1
  123. package/dist/core/artifacts/index.js +5 -7
  124. package/dist/core/config.d.ts +33 -2
  125. package/dist/core/config.d.ts.map +1 -1
  126. package/dist/core/config.js +98 -2
  127. package/dist/core/context/index.d.ts +1 -4
  128. package/dist/core/context/index.d.ts.map +1 -1
  129. package/dist/core/context/index.js +9 -9
  130. package/dist/core/events/span-parent.d.ts +15 -0
  131. package/dist/core/events/span-parent.d.ts.map +1 -0
  132. package/dist/core/events/span-parent.js +34 -0
  133. package/dist/core/events/v3/advance.d.ts +14 -0
  134. package/dist/core/events/v3/advance.d.ts.map +1 -0
  135. package/dist/core/events/v3/advance.js +134 -0
  136. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  137. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  138. package/dist/core/events/v3/authority-outbox.js +399 -0
  139. package/dist/core/events/v3/base-builder.d.ts +20 -0
  140. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  141. package/dist/core/events/v3/base-builder.js +29 -0
  142. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  143. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  144. package/dist/core/events/v3/base-contract.js +647 -0
  145. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  146. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  147. package/dist/core/events/v3/bootstrap.js +175 -0
  148. package/dist/core/events/v3/builder.d.ts +20 -0
  149. package/dist/core/events/v3/builder.d.ts.map +1 -0
  150. package/dist/core/events/v3/builder.js +28 -0
  151. package/dist/core/events/v3/canonical.d.ts +31 -0
  152. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  153. package/dist/core/events/v3/canonical.js +100 -0
  154. package/dist/core/events/v3/capabilities.d.ts +31 -0
  155. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  156. package/dist/core/events/v3/capabilities.js +107 -0
  157. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  158. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  159. package/dist/core/events/v3/capability-drift.js +134 -0
  160. package/dist/core/events/v3/catalog.d.ts +38 -0
  161. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  162. package/dist/core/events/v3/catalog.js +135 -0
  163. package/dist/core/events/v3/clock-order.d.ts +34 -0
  164. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  165. package/dist/core/events/v3/clock-order.js +35 -0
  166. package/dist/core/events/v3/contract.d.ts +171 -0
  167. package/dist/core/events/v3/contract.d.ts.map +1 -0
  168. package/dist/core/events/v3/contract.js +180 -0
  169. package/dist/core/events/v3/control.d.ts +111 -0
  170. package/dist/core/events/v3/control.d.ts.map +1 -0
  171. package/dist/core/events/v3/control.js +419 -0
  172. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  173. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  174. package/dist/core/events/v3/coordination-view.js +119 -0
  175. package/dist/core/events/v3/economics.d.ts +77 -0
  176. package/dist/core/events/v3/economics.d.ts.map +1 -0
  177. package/dist/core/events/v3/economics.js +274 -0
  178. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  179. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/finalization-view.js +37 -0
  181. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  182. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  183. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  184. package/dist/core/events/v3/generated.d.ts +4 -0
  185. package/dist/core/events/v3/generated.d.ts.map +1 -0
  186. package/dist/core/events/v3/generated.js +47 -0
  187. package/dist/core/events/v3/ids.d.ts +9 -0
  188. package/dist/core/events/v3/ids.d.ts.map +1 -0
  189. package/dist/core/events/v3/ids.js +25 -0
  190. package/dist/core/events/v3/index.d.ts +35 -0
  191. package/dist/core/events/v3/index.d.ts.map +1 -0
  192. package/dist/core/events/v3/index.js +33 -0
  193. package/dist/core/events/v3/latency.d.ts +63 -0
  194. package/dist/core/events/v3/latency.d.ts.map +1 -0
  195. package/dist/core/events/v3/latency.js +412 -0
  196. package/dist/core/events/v3/live-feed.d.ts +45 -0
  197. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  198. package/dist/core/events/v3/live-feed.js +246 -0
  199. package/dist/core/events/v3/live-observation.d.ts +35 -0
  200. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  201. package/dist/core/events/v3/live-observation.js +1 -0
  202. package/dist/core/events/v3/live-routing.d.ts +57 -0
  203. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-routing.js +107 -0
  205. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  206. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  207. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  208. package/dist/core/events/v3/producers/command.d.ts +50 -0
  209. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  210. package/dist/core/events/v3/producers/command.js +135 -0
  211. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  212. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  214. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  215. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/coordination.js +229 -0
  217. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  218. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/hook-base.js +424 -0
  220. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  221. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/hook.js +71 -0
  223. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  224. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/intake.js +244 -0
  226. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  227. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/recorder.js +2176 -0
  229. package/dist/core/events/v3/projection.d.ts +101 -0
  230. package/dist/core/events/v3/projection.d.ts.map +1 -0
  231. package/dist/core/events/v3/projection.js +479 -0
  232. package/dist/core/events/v3/reader.d.ts +75 -0
  233. package/dist/core/events/v3/reader.d.ts.map +1 -0
  234. package/dist/core/events/v3/reader.js +778 -0
  235. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  236. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  237. package/dist/core/events/v3/recovery-record.js +167 -0
  238. package/dist/core/events/v3/recovery.d.ts +22 -0
  239. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  240. package/dist/core/events/v3/recovery.js +227 -0
  241. package/dist/core/events/v3/span-state.d.ts +52 -0
  242. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  243. package/dist/core/events/v3/span-state.js +142 -0
  244. package/dist/core/events/v3/targets.d.ts +23 -0
  245. package/dist/core/events/v3/targets.d.ts.map +1 -0
  246. package/dist/core/events/v3/targets.js +134 -0
  247. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  248. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  249. package/dist/core/events/v3/turn-telemetry.js +168 -0
  250. package/dist/core/events/v3/validate.d.ts +9 -0
  251. package/dist/core/events/v3/validate.d.ts.map +1 -0
  252. package/dist/core/events/v3/validate.js +281 -0
  253. package/dist/core/events/v3/writer.d.ts +56 -0
  254. package/dist/core/events/v3/writer.d.ts.map +1 -0
  255. package/dist/core/events/v3/writer.js +335 -0
  256. package/dist/core/governor/index.d.ts +1 -1
  257. package/dist/core/governor/index.d.ts.map +1 -1
  258. package/dist/core/governor/index.js +1 -1
  259. package/dist/core/governor/plan-api.d.ts +2 -1
  260. package/dist/core/governor/plan-api.d.ts.map +1 -1
  261. package/dist/core/governor/plan-api.js +6 -3
  262. package/dist/core/governor/read.d.ts +1 -1
  263. package/dist/core/governor/read.d.ts.map +1 -1
  264. package/dist/core/governor/read.js +1 -1
  265. package/dist/core/governor/state.d.ts +9 -0
  266. package/dist/core/governor/state.d.ts.map +1 -1
  267. package/dist/core/governor/state.js +40 -3
  268. package/dist/core/guard/config.d.ts +5 -0
  269. package/dist/core/guard/config.d.ts.map +1 -0
  270. package/dist/core/guard/config.js +157 -0
  271. package/dist/core/guard/coordinator.d.ts +14 -0
  272. package/dist/core/guard/coordinator.d.ts.map +1 -0
  273. package/dist/core/guard/coordinator.js +173 -0
  274. package/dist/core/guard/evaluator.d.ts +4 -0
  275. package/dist/core/guard/evaluator.d.ts.map +1 -0
  276. package/dist/core/guard/evaluator.js +242 -0
  277. package/dist/core/guard/evidence-v3.d.ts +15 -0
  278. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  279. package/dist/core/guard/evidence-v3.js +171 -0
  280. package/dist/core/guard/index.d.ts +10 -0
  281. package/dist/core/guard/index.d.ts.map +1 -0
  282. package/dist/core/guard/index.js +6 -0
  283. package/dist/core/guard/live-source-v3.d.ts +40 -0
  284. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  285. package/dist/core/guard/live-source-v3.js +128 -0
  286. package/dist/core/guard/storage.d.ts +27 -0
  287. package/dist/core/guard/storage.d.ts.map +1 -0
  288. package/dist/core/guard/storage.js +140 -0
  289. package/dist/core/guard/types.d.ts +119 -0
  290. package/dist/core/guard/types.d.ts.map +1 -0
  291. package/dist/core/guard/types.js +1 -0
  292. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  293. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  294. package/dist/core/hooks/adapter/detect.js +29 -0
  295. package/dist/core/hooks/adapter/events.d.ts +7 -4
  296. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  297. package/dist/core/hooks/adapter/events.js +12 -4
  298. package/dist/core/hooks/adapter/output.d.ts +2 -2
  299. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  301. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  302. package/dist/core/hooks/adapter/parse.js +63 -25
  303. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  304. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  305. package/dist/core/hooks/adapter/wiring.js +89 -11
  306. package/dist/core/hooks/cli.d.ts +1 -1
  307. package/dist/core/hooks/cli.js +305 -444
  308. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  309. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  310. package/dist/core/hooks/effects/image-capture.js +212 -221
  311. package/dist/core/hooks/effects/index.d.ts +1 -9
  312. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  313. package/dist/core/hooks/effects/index.js +1 -24
  314. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  315. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  316. package/dist/core/hooks/events/input-hash.js +43 -0
  317. package/dist/core/hooks/index.d.ts +4 -3
  318. package/dist/core/hooks/index.d.ts.map +1 -1
  319. package/dist/core/hooks/index.js +2 -3
  320. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  321. package/dist/core/hooks/resolve/coord-root.js +1 -1
  322. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  323. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  324. package/dist/core/hooks/resolve/owner.js +51 -42
  325. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  326. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  327. package/dist/core/hooks/resolve/transcript.js +155 -14
  328. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  329. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  330. package/dist/core/hooks/session-name-presence.js +15 -15
  331. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  332. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  333. package/dist/core/journal/index.d.ts +2 -2
  334. package/dist/core/journal/index.d.ts.map +1 -1
  335. package/dist/core/journal/index.js +9 -22
  336. package/dist/core/presence/blob.d.ts +4 -3
  337. package/dist/core/presence/blob.d.ts.map +1 -1
  338. package/dist/core/presence/blob.js +45 -44
  339. package/dist/core/presence/codec-digest.d.ts +29 -0
  340. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  341. package/dist/core/presence/codec-digest.js +170 -0
  342. package/dist/core/presence/relay-client.d.ts +1 -1
  343. package/dist/core/presence/relay-client.d.ts.map +1 -1
  344. package/dist/core/presence/relay-client.js +5 -5
  345. package/dist/core/work/index.d.ts +1 -1
  346. package/dist/core/work/index.d.ts.map +1 -1
  347. package/dist/core/work/index.js +1 -1
  348. package/dist/core/work/read.d.ts +1 -1
  349. package/dist/core/work/read.d.ts.map +1 -1
  350. package/dist/core/work/read.js +1 -1
  351. package/dist/core/work/runner.d.ts.map +1 -1
  352. package/dist/core/work/runner.js +6 -0
  353. package/dist/core/work/state.d.ts +9 -0
  354. package/dist/core/work/state.d.ts.map +1 -1
  355. package/dist/core/work/state.js +17 -3
  356. package/dist/core/workflow/engine.js +24 -25
  357. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  358. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  359. package/dist/core/workflow/live-session-v3.js +86 -0
  360. package/dist/core/workflow/scope-id.d.ts +3 -0
  361. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  362. package/dist/core/workflow/scope-id.js +5 -0
  363. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  364. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  365. package/dist/core/workflow/workspaces/leases.js +53 -19
  366. package/dist/index.d.ts +1 -1
  367. package/dist/index.js +1 -1
  368. package/dist/lib/browser/client.d.ts +41 -0
  369. package/dist/lib/browser/client.d.ts.map +1 -1
  370. package/dist/lib/browser/client.js +203 -0
  371. package/dist/lib/browser/critique.d.ts +28 -2
  372. package/dist/lib/browser/critique.d.ts.map +1 -1
  373. package/dist/lib/browser/critique.js +74 -18
  374. package/dist/lib/browser/geometry.d.ts +1 -1
  375. package/dist/lib/browser/geometry.d.ts.map +1 -1
  376. package/dist/lib/browser/geometry.js +130 -6
  377. package/dist/lib/browser/index.d.ts +3 -0
  378. package/dist/lib/browser/index.d.ts.map +1 -1
  379. package/dist/lib/browser/index.js +3 -0
  380. package/dist/lib/browser/qa-plan.d.ts +174 -0
  381. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  382. package/dist/lib/browser/qa-plan.js +321 -0
  383. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  384. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  385. package/dist/lib/browser/qa-reuse.js +222 -0
  386. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  387. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  388. package/dist/lib/browser/qa-snapshot.js +171 -0
  389. package/dist/lib/browser/runts.d.ts.map +1 -1
  390. package/dist/lib/browser/runts.js +22 -1
  391. package/dist/lib/browser/tiling.d.ts +71 -0
  392. package/dist/lib/browser/tiling.d.ts.map +1 -0
  393. package/dist/lib/browser/tiling.js +118 -0
  394. package/dist/lib/claude-desktop.d.ts +0 -47
  395. package/dist/lib/claude-desktop.d.ts.map +1 -1
  396. package/dist/lib/claude-desktop.js +1 -169
  397. package/dist/lib/context/index.d.ts +0 -3
  398. package/dist/lib/context/index.d.ts.map +1 -1
  399. package/dist/lib/context/index.js +20 -42
  400. package/dist/lib/council/index.d.ts +2 -2
  401. package/dist/lib/council/index.d.ts.map +1 -1
  402. package/dist/lib/council/index.js +9 -20
  403. package/dist/lib/docs-frontmatter.d.ts +1 -6
  404. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  405. package/dist/lib/docs-frontmatter.js +12 -78
  406. package/dist/lib/docs-index.d.ts +9 -0
  407. package/dist/lib/docs-index.d.ts.map +1 -1
  408. package/dist/lib/docs-index.js +32 -3
  409. package/dist/lib/docs-lint.d.ts.map +1 -1
  410. package/dist/lib/docs-lint.js +14 -30
  411. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  412. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  413. package/dist/lib/docs-metadata-audit.js +132 -0
  414. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  415. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  416. package/dist/lib/docs-metadata-managed.js +78 -0
  417. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  418. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  419. package/dist/lib/docs-metadata-sync.js +222 -0
  420. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  421. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  422. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  423. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  424. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  425. package/dist/lib/docs-metadata-v2.js +424 -0
  426. package/dist/lib/docs-new.d.ts +11 -0
  427. package/dist/lib/docs-new.d.ts.map +1 -0
  428. package/dist/lib/docs-new.js +52 -0
  429. package/dist/lib/docs-sweep.d.ts.map +1 -1
  430. package/dist/lib/docs-sweep.js +45 -29
  431. package/dist/lib/headless/index.d.ts +98 -0
  432. package/dist/lib/headless/index.d.ts.map +1 -0
  433. package/dist/lib/headless/index.js +211 -0
  434. package/dist/lib/identities/assume.d.ts +4 -4
  435. package/dist/lib/identities/assume.d.ts.map +1 -1
  436. package/dist/lib/identities/assume.js +52 -68
  437. package/dist/lib/instructions/apply.d.ts +5 -4
  438. package/dist/lib/instructions/apply.d.ts.map +1 -1
  439. package/dist/lib/instructions/apply.js +32 -20
  440. package/dist/lib/instructions/bundle.d.ts +1 -1
  441. package/dist/lib/instructions/bundle.d.ts.map +1 -1
  442. package/dist/lib/instructions/bundle.js +1 -1
  443. package/dist/lib/instructions/splice.d.ts +0 -1
  444. package/dist/lib/instructions/splice.d.ts.map +1 -1
  445. package/dist/lib/instructions/splice.js +22 -6
  446. package/dist/lib/instructions/templates.d.ts +7 -5
  447. package/dist/lib/instructions/templates.d.ts.map +1 -1
  448. package/dist/lib/instructions/templates.js +79 -9
  449. package/package.json +26 -5
  450. package/schemas/config.schema.json +120 -2
  451. package/schemas/docs-metadata-v2.schema.json +441 -0
  452. package/schemas/event-v3.schema.json +24472 -0
  453. package/src/commander.ts +4 -0
  454. package/src/commands/adapter.ts +2 -2
  455. package/src/commands/agents.ts +1512 -592
  456. package/src/commands/artifacts.ts +7 -6
  457. package/src/commands/backup.ts +29 -21
  458. package/src/commands/browse.ts +349 -8
  459. package/src/commands/checkpoint.ts +4 -3
  460. package/src/commands/claude-desktop.ts +2 -101
  461. package/src/commands/context.ts +1 -6
  462. package/src/commands/decision.ts +27 -44
  463. package/src/commands/docs.ts +100 -33
  464. package/src/commands/doctor.ts +14 -1
  465. package/src/commands/events.ts +256 -0
  466. package/src/commands/governor.ts +18 -4
  467. package/src/commands/init.ts +253 -57
  468. package/src/commands/instructions.ts +1 -1
  469. package/src/commands/journal.ts +4 -13
  470. package/src/commands/ledger-v3.ts +111 -0
  471. package/src/commands/presence.ts +11 -10
  472. package/src/commands/sync.ts +1 -1
  473. package/src/commands/web.ts +67 -8
  474. package/src/commands/work.ts +28 -5
  475. package/src/core/adapter.ts +5 -0
  476. package/src/core/adapters/attest.ts +8 -3
  477. package/src/core/adapters/profiles.ts +4 -6
  478. package/src/core/agents/canonical-emit.ts +34 -25
  479. package/src/core/agents/cli.ts +236 -262
  480. package/src/core/agents/codex-archive-v3.ts +138 -0
  481. package/src/core/agents/coord-client.ts +75 -188
  482. package/src/core/agents/finalization.ts +120 -38
  483. package/src/core/agents/index.ts +4 -5
  484. package/src/core/agents/live-authority-v3.ts +375 -0
  485. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  486. package/src/core/agents/live-observation-v3.ts +216 -0
  487. package/src/core/agents/render/prompt-context.ts +29 -60
  488. package/src/core/agents/render/session-context.ts +10 -31
  489. package/src/core/agents/rules/claim-conflict.ts +85 -126
  490. package/src/core/agents/rules/commit-conflict.ts +3 -14
  491. package/src/core/agents/rules/stop-hook.ts +239 -293
  492. package/src/core/agents/session-events.ts +137 -104
  493. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  494. package/src/core/agents/session-finalizer-v3.ts +953 -0
  495. package/src/core/agents/session-name-display.ts +149 -0
  496. package/src/core/agents/state/activity-log.ts +6 -14
  497. package/src/core/agents/state/heartbeat-writer.ts +82 -277
  498. package/src/core/agents/state/live-coordination-view.ts +290 -0
  499. package/src/core/agents/state/session-state.ts +24 -12
  500. package/src/core/agents/state/stale-sweep.ts +40 -17
  501. package/src/core/artifacts/index.ts +4 -5
  502. package/src/core/config.ts +148 -3
  503. package/src/core/context/index.ts +9 -17
  504. package/src/core/events/span-parent.ts +46 -0
  505. package/src/core/events/v3/advance.ts +168 -0
  506. package/src/core/events/v3/authority-outbox.ts +548 -0
  507. package/src/core/events/v3/base-builder.ts +60 -0
  508. package/src/core/events/v3/base-contract.ts +882 -0
  509. package/src/core/events/v3/bootstrap.ts +226 -0
  510. package/src/core/events/v3/builder.ts +59 -0
  511. package/src/core/events/v3/canonical.ts +153 -0
  512. package/src/core/events/v3/capabilities.ts +171 -0
  513. package/src/core/events/v3/capability-drift.ts +177 -0
  514. package/src/core/events/v3/catalog.ts +202 -0
  515. package/src/core/events/v3/clock-order.ts +41 -0
  516. package/src/core/events/v3/contract.ts +365 -0
  517. package/src/core/events/v3/control.ts +576 -0
  518. package/src/core/events/v3/coordination-view.ts +193 -0
  519. package/src/core/events/v3/economics.ts +384 -0
  520. package/src/core/events/v3/finalization-view.ts +67 -0
  521. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  522. package/src/core/events/v3/generated.ts +48 -0
  523. package/src/core/events/v3/ids.ts +33 -0
  524. package/src/core/events/v3/index.ts +322 -0
  525. package/src/core/events/v3/latency.ts +551 -0
  526. package/src/core/events/v3/live-feed.ts +319 -0
  527. package/src/core/events/v3/live-observation.ts +39 -0
  528. package/src/core/events/v3/live-routing.ts +135 -0
  529. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  530. package/src/core/events/v3/producers/command.ts +201 -0
  531. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  532. package/src/core/events/v3/producers/coordination.ts +355 -0
  533. package/src/core/events/v3/producers/hook-base.ts +578 -0
  534. package/src/core/events/v3/producers/hook.ts +119 -0
  535. package/src/core/events/v3/producers/intake.ts +319 -0
  536. package/src/core/events/v3/producers/recorder.ts +2805 -0
  537. package/src/core/events/v3/projection.ts +653 -0
  538. package/src/core/events/v3/reader.ts +1127 -0
  539. package/src/core/events/v3/recovery-record.ts +244 -0
  540. package/src/core/events/v3/recovery.ts +271 -0
  541. package/src/core/events/v3/span-state.ts +187 -0
  542. package/src/core/events/v3/targets.ts +182 -0
  543. package/src/core/events/v3/turn-telemetry.ts +259 -0
  544. package/src/core/events/v3/validate.ts +361 -0
  545. package/src/core/events/v3/writer.ts +419 -0
  546. package/src/core/governor/index.ts +3 -0
  547. package/src/core/governor/plan-api.ts +10 -2
  548. package/src/core/governor/read.ts +3 -0
  549. package/src/core/governor/state.ts +52 -5
  550. package/src/core/guard/config.ts +206 -0
  551. package/src/core/guard/coordinator.ts +227 -0
  552. package/src/core/guard/evaluator.ts +343 -0
  553. package/src/core/guard/evidence-v3.ts +227 -0
  554. package/src/core/guard/index.ts +35 -0
  555. package/src/core/guard/live-source-v3.ts +204 -0
  556. package/src/core/guard/storage.ts +188 -0
  557. package/src/core/guard/types.ts +152 -0
  558. package/src/core/hooks/adapter/detect.ts +28 -1
  559. package/src/core/hooks/adapter/events.ts +14 -6
  560. package/src/core/hooks/adapter/output.ts +7 -2
  561. package/src/core/hooks/adapter/parse.ts +80 -38
  562. package/src/core/hooks/adapter/wiring.ts +119 -13
  563. package/src/core/hooks/cli.ts +351 -466
  564. package/src/core/hooks/effects/image-capture.ts +228 -238
  565. package/src/core/hooks/effects/index.ts +1 -36
  566. package/src/core/hooks/events/input-hash.ts +47 -0
  567. package/src/core/hooks/index.ts +4 -11
  568. package/src/core/hooks/resolve/coord-root.ts +1 -1
  569. package/src/core/hooks/resolve/owner.ts +52 -45
  570. package/src/core/hooks/resolve/transcript.ts +165 -14
  571. package/src/core/hooks/session-name-presence.ts +14 -15
  572. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  573. package/src/core/journal/index.ts +15 -22
  574. package/src/core/presence/blob.ts +48 -41
  575. package/src/core/presence/codec-digest.ts +215 -0
  576. package/src/core/presence/relay-client.ts +5 -5
  577. package/src/core/work/index.ts +3 -0
  578. package/src/core/work/read.ts +3 -0
  579. package/src/core/work/runner.ts +6 -0
  580. package/src/core/work/state.ts +27 -3
  581. package/src/core/workflow/engine.ts +24 -24
  582. package/src/core/workflow/live-session-v3.ts +126 -0
  583. package/src/core/workflow/scope-id.ts +6 -0
  584. package/src/core/workflow/workspaces/leases.ts +56 -19
  585. package/src/index.ts +1 -1
  586. package/src/lib/browser/client.ts +230 -0
  587. package/src/lib/browser/critique.ts +104 -27
  588. package/src/lib/browser/geometry.ts +143 -14
  589. package/src/lib/browser/index.ts +34 -0
  590. package/src/lib/browser/qa-plan.ts +501 -0
  591. package/src/lib/browser/qa-reuse.ts +306 -0
  592. package/src/lib/browser/qa-snapshot.ts +223 -0
  593. package/src/lib/browser/runts.ts +27 -2
  594. package/src/lib/browser/tiling.ts +164 -0
  595. package/src/lib/claude-desktop.ts +1 -232
  596. package/src/lib/context/index.ts +22 -46
  597. package/src/lib/council/index.ts +9 -21
  598. package/src/lib/docs-frontmatter.ts +8 -79
  599. package/src/lib/docs-index.ts +33 -3
  600. package/src/lib/docs-lint.ts +15 -29
  601. package/src/lib/docs-metadata-audit.ts +166 -0
  602. package/src/lib/docs-metadata-managed.ts +83 -0
  603. package/src/lib/docs-metadata-sync.ts +262 -0
  604. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  605. package/src/lib/docs-metadata-v2.ts +646 -0
  606. package/src/lib/docs-new.ts +63 -0
  607. package/src/lib/docs-sweep.ts +42 -28
  608. package/src/lib/headless/index.ts +287 -0
  609. package/src/lib/identities/assume.ts +67 -86
  610. package/src/lib/instructions/apply.ts +33 -20
  611. package/src/lib/instructions/bundle.ts +2 -2
  612. package/src/lib/instructions/splice.ts +21 -7
  613. package/src/lib/instructions/templates.ts +85 -13
  614. package/dist/core/agents/cli-emit.d.ts +0 -27
  615. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  616. package/dist/core/agents/cli-emit.js +0 -57
  617. package/dist/core/agents/codex-replay.d.ts +0 -29
  618. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  619. package/dist/core/agents/codex-replay.js +0 -138
  620. package/dist/core/agents/events/consume.d.ts +0 -82
  621. package/dist/core/agents/events/consume.d.ts.map +0 -1
  622. package/dist/core/agents/events/consume.js +0 -195
  623. package/dist/core/agents/events/emit.d.ts +0 -42
  624. package/dist/core/agents/events/emit.d.ts.map +0 -1
  625. package/dist/core/agents/events/emit.js +0 -75
  626. package/dist/core/agents/events/ulid.d.ts +0 -11
  627. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  628. package/dist/core/agents/events/ulid.js +0 -47
  629. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -76
  630. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  631. package/dist/core/agents/state/heartbeat-projector.js +0 -581
  632. package/dist/core/hooks/events/emit.d.ts +0 -31
  633. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  634. package/dist/core/hooks/events/emit.js +0 -93
  635. package/dist/core/hooks/events/rotate.d.ts +0 -43
  636. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  637. package/dist/core/hooks/events/rotate.js +0 -142
  638. package/dist/core/hooks/events/schema.d.ts +0 -341
  639. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  640. package/dist/core/hooks/events/schema.js +0 -12
  641. package/dist/core/hooks/events/ulid.d.ts +0 -10
  642. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  643. package/dist/core/hooks/events/ulid.js +0 -47
  644. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  645. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  646. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  647. package/src/core/agents/cli-emit.ts +0 -64
  648. package/src/core/agents/codex-replay.ts +0 -163
  649. package/src/core/agents/events/consume.ts +0 -254
  650. package/src/core/agents/events/emit.ts +0 -115
  651. package/src/core/agents/events/ulid.ts +0 -51
  652. package/src/core/agents/state/heartbeat-projector.ts +0 -645
  653. package/src/core/hooks/events/emit.ts +0 -125
  654. package/src/core/hooks/events/rotate.ts +0 -151
  655. package/src/core/hooks/events/schema.ts +0 -582
  656. package/src/core/hooks/events/ulid.ts +0 -51
  657. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -6,10 +6,10 @@
6
6
  */
7
7
 
8
8
  import { createHash } from "node:crypto";
9
- import { existsSync, readdirSync, readFileSync } from "node:fs";
10
- import { join } from "node:path";
11
9
  import { resolveMachineLabel } from "../../lib/machine.ts";
10
+ import { readLiveCoordinationRows } from "../agents/state/live-coordination-view.ts";
12
11
  import type { AgentActivity, TaskState } from "../agents/state/session-state.ts";
12
+ import { buildPresenceCodecDigests, type PresenceCodecDigest } from "./codec-digest.ts";
13
13
 
14
14
  /** Mirror of the local heartbeat freshness window (commands/agents.ts). */
15
15
  const FRESHNESS_SECS = 600;
@@ -28,11 +28,11 @@ export interface PresenceAgent {
28
28
  activity: AgentActivity;
29
29
  task_state: TaskState;
30
30
  task_state_reason?: string;
31
- turn_summary?: string;
32
31
  files_touched?: string[];
33
- last_tool?: string;
34
32
  started_at?: string;
35
33
  last_heartbeat?: string;
34
+ /** Strict content-free activity evidence for remote Codec panels. */
35
+ codec?: PresenceCodecDigest;
36
36
  }
37
37
 
38
38
  export interface PresenceBlob {
@@ -51,7 +51,7 @@ export interface BuiltBlob {
51
51
  }
52
52
 
53
53
  /**
54
- * Build this machine's presence blob from `.harnery/active/` heartbeats.
54
+ * Build this machine's presence blob from the authority-safe V3 projection.
55
55
  * Includes live sessions + subagents; excludes kind=transient stubs (they are
56
56
  * fold-artifacts of the local claim model, not sessions) and anything past the
57
57
  * freshness window.
@@ -59,41 +59,32 @@ export interface BuiltBlob {
59
59
  export function buildPresenceBlob(coordRoot: string, now: Date = new Date()): BuiltBlob {
60
60
  const machine = resolveMachineLabel();
61
61
  const agents: PresenceAgent[] = [];
62
- const activeDir = join(coordRoot, ".harnery", "active");
62
+ const codecDigests = buildPresenceCodecDigests(coordRoot);
63
63
  const cutoffMs = now.getTime() - FRESHNESS_SECS * 1000;
64
64
 
65
- if (existsSync(activeDir)) {
66
- for (const f of readdirSync(activeDir)) {
67
- if (!f.endsWith(".json")) continue;
68
- let hb: Record<string, unknown>;
69
- try {
70
- hb = JSON.parse(readFileSync(join(activeDir, f), "utf8")) as Record<string, unknown>;
71
- } catch {
72
- continue;
73
- }
74
- if (typeof hb.instance_id !== "string") continue;
75
- if ((hb.kind as string | undefined) === "transient") continue;
76
- const ts = Date.parse((hb.last_heartbeat as string | undefined) ?? "");
77
- if (!Number.isFinite(ts) || ts < cutoffMs) continue;
78
- agents.push({
79
- instance_id: hb.instance_id,
80
- name: strOr(hb.name),
81
- kind: strOr(hb.kind),
82
- session_id: strOr(hb.session_id),
83
- platform: strOr(hb.platform),
84
- task: strOr(hb.task),
85
- activity: activityOrUnknown(hb.activity),
86
- task_state: taskStateOrActive(hb.task_state),
87
- task_state_reason: clamp(strOr(hb.task_state_reason), 160),
88
- turn_summary: clamp(strOr(hb.turn_summary), 160),
89
- files_touched: Array.isArray(hb.files_touched)
90
- ? (hb.files_touched as string[]).slice(0, MAX_FILES_PER_AGENT)
91
- : undefined,
92
- last_tool: strOr(hb.last_tool),
93
- started_at: strOr(hb.started_at),
94
- last_heartbeat: strOr(hb.last_heartbeat),
95
- });
96
- }
65
+ for (const row of readLiveCoordinationRows(coordRoot)) {
66
+ if (row.kind === "transient") continue;
67
+ const ts = Date.parse(row.last_heartbeat);
68
+ if (!Number.isFinite(ts) || ts < cutoffMs) continue;
69
+ agents.push({
70
+ instance_id: row.instance_id,
71
+ name: strOr(row.name),
72
+ kind: strOr(row.kind),
73
+ session_id: strOr(row.session_id),
74
+ platform: strOr(row.platform),
75
+ task: strOr(row.task),
76
+ activity: activityOrUnknown(row.activity),
77
+ task_state: taskStateOrActive(row.task_state),
78
+ task_state_reason: clamp(strOr(row.task_state_reason), 160),
79
+ files_touched: row.files_touched.slice(0, MAX_FILES_PER_AGENT),
80
+ started_at: strOr(row.started_at),
81
+ last_heartbeat: row.last_heartbeat,
82
+ codec:
83
+ codecDigests.get(row.instance_id) ??
84
+ codecDigests.get(
85
+ row.instance_id.startsWith("inst_") ? row.instance_id : `inst_${row.instance_id}`,
86
+ ),
87
+ });
97
88
  }
98
89
 
99
90
  agents.sort((a, b) => a.instance_id.localeCompare(b.instance_id));
@@ -107,8 +98,8 @@ export function buildPresenceBlob(coordRoot: string, now: Date = new Date()): Bu
107
98
  };
108
99
 
109
100
  // Basis: the fields whose change should trigger a re-publish. Timestamps
110
- // and last_tool are excluded (pure churn); task/turn_summary/files are the
111
- // signal peers actually read.
101
+ // Observation timestamps are excluded as pure churn; task/lifecycle/files
102
+ // are the signals peers actually read.
112
103
  const basis = capped.map((a) => ({
113
104
  i: a.instance_id,
114
105
  n: a.name ?? null,
@@ -117,8 +108,8 @@ export function buildPresenceBlob(coordRoot: string, now: Date = new Date()): Bu
117
108
  a: a.activity,
118
109
  l: a.task_state,
119
110
  r: a.task_state_reason ?? null,
120
- s: a.turn_summary ?? null,
121
111
  f: [...(a.files_touched ?? [])].sort(),
112
+ c: codecBasis(a.codec),
122
113
  }));
123
114
  const basisHash = createHash("sha256").update(JSON.stringify(basis)).digest("hex").slice(0, 16);
124
115
 
@@ -141,3 +132,19 @@ function clamp(v: string | undefined, max: number): string | undefined {
141
132
  if (!v) return undefined;
142
133
  return v.length > max ? v.slice(0, max) : v;
143
134
  }
135
+
136
+ function codecBasis(codec: PresenceCodecDigest | undefined): unknown {
137
+ if (!codec) return null;
138
+ return {
139
+ o: codec.operation
140
+ ? { category: codec.operation.category, label: codec.operation.label }
141
+ : null,
142
+ c: codec.context
143
+ ? { used_percent: codec.context.used_percent, confidence: codec.context.confidence }
144
+ : null,
145
+ a: codec.recent_actions.map((action) => ({
146
+ category: action.category,
147
+ outcome: action.outcome,
148
+ })),
149
+ };
150
+ }
@@ -0,0 +1,215 @@
1
+ import type { EventV3 } from "../events/v3/contract.ts";
2
+ import { readLedgerV3 } from "../events/v3/reader.ts";
3
+
4
+ export type PresenceCodecCategory =
5
+ | "research"
6
+ | "diagnostic"
7
+ | "build"
8
+ | "edit"
9
+ | "test"
10
+ | "coordinate"
11
+ | "other";
12
+
13
+ export interface PresenceCodecAction {
14
+ category: PresenceCodecCategory;
15
+ outcome: "ok" | "error" | "unknown";
16
+ event_id: string;
17
+ observed_at: string;
18
+ }
19
+
20
+ export interface PresenceCodecDigest {
21
+ schema_version: 1;
22
+ observed_at: string;
23
+ operation?: {
24
+ category: PresenceCodecCategory;
25
+ label: string;
26
+ event_id: string;
27
+ observed_at: string;
28
+ };
29
+ context?: {
30
+ used_percent: number;
31
+ confidence: "exact" | "reported" | "estimated";
32
+ event_id: string;
33
+ observed_at: string;
34
+ };
35
+ recent_actions: PresenceCodecAction[];
36
+ }
37
+
38
+ interface Slot {
39
+ observedAt?: string;
40
+ open: Map<string, NonNullable<PresenceCodecDigest["operation"]>>;
41
+ context?: PresenceCodecDigest["context"];
42
+ actions: PresenceCodecAction[];
43
+ }
44
+
45
+ const MAX_LEDGER_ROWS = 5_000;
46
+ const MAX_ACTIONS = 3;
47
+
48
+ /** Build a strict, content-free per-instance digest for encrypted presence. */
49
+ export function buildPresenceCodecDigests(coordRoot: string): Map<string, PresenceCodecDigest> {
50
+ const read = readLedgerV3(coordRoot);
51
+ if (!read.complete) return new Map();
52
+ return projectPresenceCodecDigests(read.events.slice(-MAX_LEDGER_ROWS).map((row) => row.event));
53
+ }
54
+
55
+ export function projectPresenceCodecDigests(
56
+ events: readonly EventV3[],
57
+ ): Map<string, PresenceCodecDigest> {
58
+ const slots = new Map<string, Slot>();
59
+ const get = (instanceId: string) => {
60
+ let slot = slots.get(instanceId);
61
+ if (!slot) {
62
+ slot = { open: new Map(), actions: [] };
63
+ slots.set(instanceId, slot);
64
+ }
65
+ return slot;
66
+ };
67
+
68
+ for (const event of events) {
69
+ if (!("instance_id" in event.scope)) continue;
70
+ const slot = get(event.scope.instance_id);
71
+ slot.observedAt = event.time.observed_at;
72
+ const spanId = (event.links as { span_id?: string }).span_id;
73
+ switch (event.event_type) {
74
+ case "tool.requested":
75
+ if (spanId) {
76
+ slot.open.set(spanId, {
77
+ category: categorize(event.payload.tool.namespace, event.payload.tool.name),
78
+ label: operationLabel(event.payload.tool.namespace, event.payload.tool.name),
79
+ event_id: event.event_id,
80
+ observed_at: event.time.observed_at,
81
+ });
82
+ }
83
+ break;
84
+ case "command.started":
85
+ if (spanId) {
86
+ slot.open.set(spanId, {
87
+ category: "diagnostic",
88
+ label: "Running a command",
89
+ event_id: event.event_id,
90
+ observed_at: event.time.observed_at,
91
+ });
92
+ }
93
+ break;
94
+ case "wait.started":
95
+ slot.open.set(event.payload.wait_id, {
96
+ category: "coordinate",
97
+ label: "Waiting",
98
+ event_id: event.event_id,
99
+ observed_at: event.time.observed_at,
100
+ });
101
+ break;
102
+ case "tool.completed":
103
+ case "command.completed":
104
+ if (spanId) slot.open.delete(spanId);
105
+ pushAction(slot, {
106
+ category:
107
+ event.event_type === "tool.completed"
108
+ ? categorize(event.payload.tool.namespace, event.payload.tool.name)
109
+ : "diagnostic",
110
+ outcome: outcome(event.payload.outcome),
111
+ event_id: event.event_id,
112
+ observed_at: event.time.observed_at,
113
+ });
114
+ break;
115
+ case "wait.ended":
116
+ slot.open.delete(event.payload.wait_id);
117
+ pushAction(slot, {
118
+ category: "coordinate",
119
+ outcome: outcome(event.payload.outcome),
120
+ event_id: event.event_id,
121
+ observed_at: event.time.observed_at,
122
+ });
123
+ break;
124
+ case "progress.observed":
125
+ pushAction(slot, {
126
+ category: progressCategory(event.payload.kind),
127
+ outcome: "ok",
128
+ event_id: event.event_id,
129
+ observed_at: event.time.observed_at,
130
+ });
131
+ break;
132
+ case "context.observed": {
133
+ const measurement = event.payload.measurement;
134
+ if (measurement.state === "observed" && measurement.value.limit_tokens > 0) {
135
+ slot.context = {
136
+ used_percent: Math.min(
137
+ 100,
138
+ Math.max(
139
+ 0,
140
+ Math.round((measurement.value.used_tokens / measurement.value.limit_tokens) * 100),
141
+ ),
142
+ ),
143
+ confidence: measurement.confidence === "exact" ? "exact" : "reported",
144
+ event_id: event.event_id,
145
+ observed_at: event.time.observed_at,
146
+ };
147
+ }
148
+ break;
149
+ }
150
+ case "turn.completed":
151
+ case "session.ended":
152
+ case "agent.completed":
153
+ slot.open.clear();
154
+ break;
155
+ default:
156
+ break;
157
+ }
158
+ }
159
+
160
+ const digests = new Map<string, PresenceCodecDigest>();
161
+ for (const [instanceId, slot] of slots) {
162
+ if (!slot.observedAt) continue;
163
+ const operation = [...slot.open.values()].at(-1);
164
+ digests.set(instanceId, {
165
+ schema_version: 1,
166
+ observed_at: slot.observedAt,
167
+ ...(operation ? { operation } : {}),
168
+ ...(slot.context ? { context: slot.context } : {}),
169
+ recent_actions: slot.actions,
170
+ });
171
+ }
172
+ return digests;
173
+ }
174
+
175
+ function pushAction(slot: Slot, action: PresenceCodecAction): void {
176
+ slot.actions.push(action);
177
+ if (slot.actions.length > MAX_ACTIONS) slot.actions.shift();
178
+ }
179
+
180
+ function outcome(value: string): PresenceCodecAction["outcome"] {
181
+ return value === "succeeded" ? "ok" : value === "failed" ? "error" : "unknown";
182
+ }
183
+
184
+ function categorize(namespace: string, name: string): PresenceCodecCategory {
185
+ const key = `${namespace}/${name}`.toLowerCase();
186
+ if (/agent|message|plan|workflow|council|decide/.test(key)) return "coordinate";
187
+ if (/patch|edit|write|create/.test(key)) return "edit";
188
+ if (/test|playwright|vitest|jest/.test(key)) return "test";
189
+ if (/publish|deploy|image|document|spreadsheet|presentation/.test(key)) return "build";
190
+ if (/search|read|grep|glob|fetch|browser|view/.test(key)) return "research";
191
+ if (/exec|command|shell|bash|terminal/.test(key)) return "diagnostic";
192
+ return "other";
193
+ }
194
+
195
+ function operationLabel(namespace: string, name: string): string {
196
+ const category = categorize(namespace, name);
197
+ return {
198
+ research: "Researching",
199
+ diagnostic: "Running a command",
200
+ build: "Building",
201
+ edit: "Editing files",
202
+ test: "Testing",
203
+ coordinate: "Coordinating",
204
+ other: "Working",
205
+ }[category];
206
+ }
207
+
208
+ function progressCategory(kind: string): PresenceCodecCategory {
209
+ if (kind === "write") return "edit";
210
+ if (kind === "test") return "test";
211
+ if (kind === "commit" || kind === "deploy" || kind === "publication") return "build";
212
+ if (kind === "review") return "coordinate";
213
+ if (kind === "artifact") return "build";
214
+ return "other";
215
+ }
@@ -9,7 +9,7 @@
9
9
  * - derives the room credentials from the repo identity (root-commit SHA +
10
10
  * origin URL + optional committed `.harnery/presence-salt`)
11
11
  * - holds the socket open with auto-reconnect + jittered backoff
12
- * - watches `.harnery/active/` and publishes the encrypted presence blob on
12
+ * - watches the active V3 ledger and publishes the encrypted presence blob on
13
13
  * change (debounced), plus a 60s keepalive so peers' staleness math works
14
14
  * - decrypts received peer frames and writes them to
15
15
  * `.harnery/presence/remote/<machine>.json`, where `readRemoteMachines`
@@ -36,6 +36,7 @@ import {
36
36
  import { join } from "node:path";
37
37
  import { resolveMachineLabel } from "../../lib/machine.ts";
38
38
  import { presenceRelayUrl } from "../config.ts";
39
+ import { eventV3ActiveWatchPath } from "../events/v3/reader.ts";
39
40
  import { buildPresenceBlob, type PresenceBlob } from "./blob.ts";
40
41
  import { originUrl, rootCommitSha, sanitizeRefComponent } from "./git.ts";
41
42
  import {
@@ -259,12 +260,11 @@ export async function runRelayDaemon(coordRoot: string): Promise<number> {
259
260
 
260
261
  connect();
261
262
 
262
- // Publish on heartbeat change (debounced).
263
+ // Publish on canonical V3 ledger change (debounced).
263
264
  let debounce: ReturnType<typeof setTimeout> | null = null;
264
- const activeDir = join(coordRoot, ".harnery", "active");
265
- mkdirSync(activeDir, { recursive: true });
265
+ const activeLedger = eventV3ActiveWatchPath(coordRoot);
266
266
  try {
267
- watch(activeDir, () => {
267
+ watch(activeLedger, () => {
268
268
  if (debounce) clearTimeout(debounce);
269
269
  debounce = setTimeout(() => void publishNow(), WATCH_DEBOUNCE_MS);
270
270
  });
@@ -6,6 +6,7 @@ export {
6
6
  cancelWorkItem,
7
7
  createWorkItem,
8
8
  listWorkItems,
9
+ listWorkItemsWithWarnings,
9
10
  newWorkId,
10
11
  openOperatorFindings,
11
12
  readWorkItem,
@@ -19,6 +20,8 @@ export {
19
20
  type WorkEvent,
20
21
  type WorkEventType,
21
22
  type WorkIntent,
23
+ type WorkListResult,
24
+ type WorkListWarning,
22
25
  type WorkNextAction,
23
26
  type WorkProjection,
24
27
  type WorkRecord,
@@ -1,6 +1,7 @@
1
1
  export {
2
2
  assertWorkId,
3
3
  listWorkItems,
4
+ listWorkItemsWithWarnings,
4
5
  readWorkItem,
5
6
  WORK_EVENT_SCHEMA_VERSION,
6
7
  WORK_INTENT_SCHEMA_VERSION,
@@ -9,6 +10,8 @@ export {
9
10
  type WorkEvent,
10
11
  type WorkEventType,
11
12
  type WorkIntent,
13
+ type WorkListResult,
14
+ type WorkListWarning,
12
15
  type WorkNextAction,
13
16
  type WorkProjection,
14
17
  type WorkRecord,
@@ -1,6 +1,7 @@
1
1
  import { resolve } from "node:path";
2
2
  import { runWorkflow } from "../workflow/engine.ts";
3
3
  import { readWorkflowProof } from "../workflow/proof.ts";
4
+ import { readWorkflowRunManifest } from "../workflow/run-state.ts";
4
5
  import type {
5
6
  EngineOpts,
6
7
  RunReport,
@@ -80,10 +81,14 @@ export async function runWorkItem(input: RunWorkItemInput): Promise<RunReport> {
80
81
  const attempt = record.projection.attempts_used + 1;
81
82
  const trigger = input.retry ? "retry" : "initial";
82
83
  let prior: WorkflowAttemptContext["prior"];
84
+ let specialists = input.engine.specialists;
83
85
  if (trigger === "retry") {
84
86
  if (!latest) {
85
87
  throw new Error(`work item ${input.workId} has no prior attempt to retry`);
86
88
  }
89
+ if (specialists === undefined && latest.proof_path) {
90
+ specialists = readWorkflowRunManifest(coordRoot, latest.run_id).execution.specialists;
91
+ }
87
92
  prior = priorContext(coordRoot, latest);
88
93
  }
89
94
  const open = openOperatorFindings(coordRoot, input.workId);
@@ -110,6 +115,7 @@ export async function runWorkItem(input: RunWorkItemInput): Promise<RunReport> {
110
115
  });
111
116
  return await runWorkflow(record.intent.workflow.path, {
112
117
  ...input.engine,
118
+ specialists,
113
119
  coordRoot,
114
120
  runId,
115
121
  workItemId: input.workId,
@@ -181,6 +181,16 @@ export interface WorkRecord {
181
181
  projection: WorkProjection;
182
182
  }
183
183
 
184
+ export interface WorkListWarning {
185
+ work_id: string;
186
+ reason: string;
187
+ }
188
+
189
+ export interface WorkListResult {
190
+ records: WorkRecord[];
191
+ warnings: WorkListWarning[];
192
+ }
193
+
184
194
  export interface CreateWorkItemInput {
185
195
  coordRoot: string;
186
196
  title: string;
@@ -271,14 +281,28 @@ export function readWorkItem(coordRoot: string, workId: string): WorkRecord {
271
281
  }
272
282
 
273
283
  export function listWorkItems(coordRoot: string): WorkRecord[] {
284
+ return listWorkItemsWithWarnings(coordRoot).records;
285
+ }
286
+
287
+ export function listWorkItemsWithWarnings(coordRoot: string): WorkListResult {
274
288
  const base = join(resolve(coordRoot), ".harnery", "work");
275
- if (!existsSync(base)) return [];
289
+ if (!existsSync(base)) return { records: [], warnings: [] };
276
290
  const records: WorkRecord[] = [];
291
+ const warnings: WorkListWarning[] = [];
277
292
  for (const name of readdirSync(base)) {
278
293
  if (!WORK_ID.test(name) || !existsSync(join(base, name, "intent.json"))) continue;
279
- records.push(readWorkItem(coordRoot, name));
294
+ try {
295
+ records.push(readWorkItem(coordRoot, name));
296
+ } catch (error) {
297
+ warnings.push({
298
+ work_id: name,
299
+ reason: error instanceof Error ? error.message : String(error),
300
+ });
301
+ }
280
302
  }
281
- return records.sort((a, b) => b.intent.created_at.localeCompare(a.intent.created_at));
303
+ records.sort((a, b) => b.intent.created_at.localeCompare(a.intent.created_at));
304
+ warnings.sort((a, b) => a.work_id.localeCompare(b.work_id));
305
+ return { records, warnings };
282
306
  }
283
307
 
284
308
  export function reconcileWorkItem(coordRoot: string, workId: string, actor?: string): WorkRecord {
@@ -21,7 +21,6 @@ import { createHash, randomBytes } from "node:crypto";
21
21
  import { existsSync, mkdirSync, readFileSync, statSync } from "node:fs";
22
22
  import { isAbsolute, join, resolve } from "node:path";
23
23
  import { pathToFileURL } from "node:url";
24
- import { killHeartbeat, registerWorkflowChild } from "../agents/state/heartbeat-writer.ts";
25
24
  import { snapshotRepo } from "../context/index.ts";
26
25
  import type {
27
26
  ExternalMutationRequest,
@@ -41,6 +40,7 @@ import { freezeWorkflowAttemptContext } from "./attempt-context.ts";
41
40
  import { type BillingProbe, probeBilling } from "./billing.ts";
42
41
  import { stableDigest } from "./durable-record.ts";
43
42
  import { evidencePreflightError } from "./evidence-preflight.ts";
43
+ import { endWorkflowChildSessionV3, startWorkflowChildSessionV3 } from "./live-session-v3.ts";
44
44
  import {
45
45
  buildWorkflowProof,
46
46
  createEvidenceRecord,
@@ -947,23 +947,18 @@ async function executeWorkflow(
947
947
  });
948
948
  log(`[${name}] ${currentStage || "(no stage)"} → ${id} [${adapter}] ${label}`);
949
949
 
950
- // Register the child ourselves rather than trusting its adapter to fire
951
- // Harnery's hooks. Headless `codex exec` fires none, so codex children
952
- // were invisible to `harn agents list` and the run page for the whole
953
- // duration of a stage. The engine knows everything the heartbeat needs.
954
- // Best-effort: coordination visibility must never fail a run.
955
- try {
956
- registerWorkflowChild(opts.coordRoot, {
957
- instanceId: childInstanceId(runId, id),
958
- runId,
959
- agentId: id,
960
- adapter,
961
- label,
962
- model: agentOpts.model,
963
- });
964
- } catch {
965
- /* visibility is not worth failing a spawn over */
966
- }
950
+ // Headless children do not reliably fire adapter hooks. The engine owns
951
+ // their canonical V3 start so every dispatched child has an auditable
952
+ // generation before it begins work.
953
+ startWorkflowChildSessionV3({
954
+ coordRoot: opts.coordRoot,
955
+ instanceId: childInstanceId(runId, id),
956
+ runId,
957
+ agentId: id,
958
+ adapter,
959
+ label,
960
+ model: agentOpts.model,
961
+ });
967
962
 
968
963
  let attemptPrompt = dispatchPrompt;
969
964
  let last: SpawnResult | null = null;
@@ -1077,13 +1072,18 @@ async function executeWorkflow(
1077
1072
  throw error;
1078
1073
  } finally {
1079
1074
  reservedCostUsd = Math.max(0, reservedCostUsd - reservedForDispatch);
1080
- // Deregister on every exit path, including throw. A child heartbeat that
1081
- // outlives its process reads as a live agent forever and blocks peers on
1082
- // its stale claims. The transcript remains the durable record.
1075
+ // Record the canonical terminal before removing the disposable cache.
1083
1076
  try {
1084
- killHeartbeat(opts.coordRoot, childInstanceId(runId, id));
1085
- } catch {
1086
- /* already gone, or swept */
1077
+ endWorkflowChildSessionV3({
1078
+ coordRoot: opts.coordRoot,
1079
+ instanceId: childInstanceId(runId, id),
1080
+ runId,
1081
+ agentId: id,
1082
+ adapter,
1083
+ cleanExit: agentProof.status === "succeeded",
1084
+ });
1085
+ } catch (error) {
1086
+ log(`[${name}] V3 terminal recording failed: ${(error as Error).message}`);
1087
1087
  }
1088
1088
  release();
1089
1089
  }