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
@@ -0,0 +1,138 @@
1
+ import { copyFileSync, existsSync, mkdtempSync, readdirSync, rmSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { homedir, tmpdir } from "node:os";
4
+ import { basename, join } from "node:path";
5
+ import { normalizeNativeIdV3 } from "../events/v3/canonical.ts";
6
+ import { readEventV3ControlState } from "../events/v3/control.ts";
7
+ import { fingerprintContextV3 } from "../events/v3/fingerprint-keys.ts";
8
+ import { listHookProducerStateRecordsV3 } from "../events/v3/producers/recorder.ts";
9
+ import type { SessionArchiveObservationV3 } from "./session-finalizer-v3.ts";
10
+
11
+ const require = createRequire(import.meta.url);
12
+
13
+ type SqliteDatabase = {
14
+ query: (sql: string) => { all: () => unknown[] };
15
+ close: () => void;
16
+ };
17
+
18
+ /** bun:sqlite is Bun-only. The web dashboard runs under Node and must be able
19
+ * to import this module without crashing; a missing engine returns no rows. */
20
+ function openReadonlyDatabase(path: string): SqliteDatabase | null {
21
+ try {
22
+ const { Database } = require("bun:sqlite") as {
23
+ Database: new (
24
+ filename: string,
25
+ options?: { readonly?: boolean; strict?: boolean },
26
+ ) => SqliteDatabase;
27
+ };
28
+ return new Database(path, { readonly: true, strict: true });
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+
34
+ export interface CodexArchiveScanResultV3 {
35
+ observations: SessionArchiveObservationV3[];
36
+ diagnostics: string[];
37
+ }
38
+
39
+ /**
40
+ * Read only Codex's durable lifecycle columns. Conversation content, titles,
41
+ * working directories, and model metadata never leave the adapter database.
42
+ */
43
+ export function readCodexArchiveObservationsV3(
44
+ coordRoot: string,
45
+ options: { databasePath?: string; observedAt?: string } = {},
46
+ ): CodexArchiveScanResultV3 {
47
+ const diagnostics: string[] = [];
48
+ const databasePath = options.databasePath ?? locateCodexStateDatabase();
49
+ if (!databasePath) return { observations: [], diagnostics: ["codex_state_database_missing"] };
50
+ const control = readEventV3ControlState(coordRoot);
51
+ if (control.state !== "candidate" && control.state !== "active") {
52
+ return { observations: [], diagnostics: ["event_v3_control_unavailable"] };
53
+ }
54
+ const context = fingerprintContextV3(
55
+ coordRoot,
56
+ control.genesis.event.scope.root_id as `root_${string}`,
57
+ undefined,
58
+ control.genesis.profile.privacy_key_epoch,
59
+ );
60
+ const liveCodexStateIds = new Set(
61
+ listHookProducerStateRecordsV3(coordRoot)
62
+ .filter(({ state }) => state.adapter === "codex")
63
+ .map(({ path }) => basename(path, ".json")),
64
+ );
65
+ const snapshotDir = mkdtempSync(join(tmpdir(), "harnery-codex-state-"));
66
+ const snapshotPath = join(snapshotDir, basename(databasePath));
67
+ try {
68
+ copyFileSync(databasePath, snapshotPath);
69
+ for (const suffix of ["-wal", "-shm"]) {
70
+ const source = `${databasePath}${suffix}`;
71
+ if (existsSync(source)) copyFileSync(source, `${snapshotPath}${suffix}`);
72
+ }
73
+ const db = openReadonlyDatabase(snapshotPath);
74
+ if (!db) {
75
+ diagnostics.push("codex_archive_sqlite_unavailable");
76
+ return { observations: [], diagnostics };
77
+ }
78
+ try {
79
+ const rows = db
80
+ .query("SELECT id, archived, archived_at, updated_at_ms FROM threads")
81
+ .all() as Array<{
82
+ id: string;
83
+ archived: number;
84
+ archived_at: number | null;
85
+ updated_at_ms: number;
86
+ }>;
87
+ return {
88
+ observations: rows
89
+ .filter((row) =>
90
+ liveCodexStateIds.has(normalizeNativeIdV3(context, "codex.session", row.id)),
91
+ )
92
+ .map((row) => ({
93
+ adapter: "codex" as const,
94
+ native_session_id: row.id,
95
+ archived: row.archived === 1,
96
+ observed_at:
97
+ epochToIso(row.archived_at) ??
98
+ epochToIso(row.updated_at_ms) ??
99
+ options.observedAt ??
100
+ new Date().toISOString(),
101
+ })),
102
+ diagnostics,
103
+ };
104
+ } finally {
105
+ db.close();
106
+ }
107
+ } catch (error) {
108
+ diagnostics.push(`codex_archive_scan_failed:${(error as Error).message}`);
109
+ return { observations: [], diagnostics };
110
+ } finally {
111
+ rmSync(snapshotDir, { recursive: true, force: true });
112
+ }
113
+ }
114
+
115
+ function locateCodexStateDatabase(): string | null {
116
+ const explicit = process.env.HARNERY_CODEX_STATE_DB?.trim();
117
+ if (explicit && existsSync(explicit)) return explicit;
118
+ for (const candidate of [
119
+ join(homedir(), ".codex", "state_5.sqlite"),
120
+ join(homedir(), ".codex", "sqlite", "state_5.sqlite"),
121
+ ]) {
122
+ if (existsSync(candidate)) return candidate;
123
+ }
124
+ const usersRoot = "/mnt/c/Users";
125
+ if (!existsSync(usersRoot)) return null;
126
+ for (const user of readdirSync(usersRoot).sort()) {
127
+ const candidate = join(usersRoot, user, ".codex", "state_5.sqlite");
128
+ if (existsSync(candidate)) return candidate;
129
+ }
130
+ return null;
131
+ }
132
+
133
+ function epochToIso(value: number | null): string | null {
134
+ if (value === null || !Number.isFinite(value) || value <= 0) return null;
135
+ const milliseconds = value < 10_000_000_000 ? value * 1_000 : value;
136
+ const date = new Date(milliseconds);
137
+ return Number.isNaN(date.getTime()) ? null : date.toISOString();
138
+ }
@@ -10,6 +10,10 @@
10
10
  import { spawnSync } from "node:child_process";
11
11
  import { existsSync, readdirSync, readFileSync } from "node:fs";
12
12
  import { dirname, join, resolve, sep } from "node:path";
13
+ import {
14
+ listHookProducerStateRecordsV3,
15
+ readHookProducerStateV3,
16
+ } from "../events/v3/producers/recorder.ts";
13
17
 
14
18
  // NOTE: kept dependency-free (node builtins only); this file is vendored verbatim into
15
19
  // a downstream consumer, so it cannot import the coordEnv helper.
@@ -56,48 +60,6 @@ export function resolveContainedFile(directory: string, fileName: string): strin
56
60
  return candidate;
57
61
  }
58
62
 
59
- export interface Heartbeat {
60
- instance_id: string;
61
- name?: string;
62
- kind?: string;
63
- session_id: string;
64
- agent_id: string;
65
- model: string;
66
- started_at: string;
67
- last_heartbeat: string;
68
- files_touched: string[];
69
- agent_type?: string;
70
- /** Most recent tool name stamped by the PostToolUse hook. Phase 1. */
71
- last_tool?: string;
72
- /** Short string identifying what the last tool acted on (file path, command head, URL). Phase 1. */
73
- last_tool_target?: string;
74
- /** Free-form task/intent string set via `harn agents set-task`. Phase 2. */
75
- task?: string;
76
- /** UTC ISO-8601 timestamp when task was last set/cleared. Used by adapters without Stop enforcement to compute staleness. 2026-05-24. */
77
- task_updated_at?: string | null;
78
- /** Current evidence-derived activity axis. */
79
- activity?: "unknown" | "working" | "needs_input" | "idle";
80
- activity_updated_at?: string;
81
- activity_source?: string;
82
- /** Explicit task lifecycle axis. */
83
- task_state?: "active" | "blocked" | "done";
84
- task_state_updated_at?: string;
85
- task_state_reason?: string;
86
- /** Session name built on the first non-empty set-task; its presence means "this session has been named". 2026-08-09. */
87
- suggested_session_name?: string;
88
- /** Stamped by turn.stop once the suggested name is seen in assistant reply text. 2026-08-09. */
89
- session_name_seen_at?: string;
90
- /** Which suggested name the latest sighting covered. */
91
- session_name_seen_for?: string;
92
- /** Auto-generated per-turn summary written by the Stop hook via Haiku. 2026-05-23. */
93
- turn_summary?: string | null;
94
- /** UTC ISO-8601 timestamp when turn_summary was last refreshed. */
95
- turn_summary_updated_at?: string | null;
96
- /** Hook client: `claude-code` (default) or `cursor`. Cursor Phase 1. */
97
- platform?: string;
98
- workflow_run_id?: string;
99
- }
100
-
101
63
  /**
102
64
  * Resolve the monorepo root for coord-state purposes.
103
65
  *
@@ -112,8 +74,8 @@ export function monorepoRoot(): string | null {
112
74
  * THE coordination-root resolution. Every surface — the hooks, the CLI's reads,
113
75
  * and the CLI's canonical emits — resolves through this one function, because a
114
76
  * root the two layers disagree about is a root that silently breaks the
115
- * end-of-turn rules: the hook evaluates `state.status_checked` from the stream
116
- * it reads, so an emit into a different `.harnery/events.ndjson` is invisible
77
+ * end-of-turn rules: the hook evaluates `coord.status_observed` from the stream
78
+ * it reads, so an emit into a different V3 ledger root is invisible
117
79
  * and rule 1/3 blocks a turn that did run `agents status`, with no sequence of
118
80
  * CLI commands able to satisfy it.
119
81
  *
@@ -168,7 +130,7 @@ export function resolveCoordRoot(start: string = process.cwd()): string | null {
168
130
  if (ancestors.length > 0) return ancestors[0] as string;
169
131
  if (gitRoots.length > 0) return gitRoots[0] as string;
170
132
  // Nothing carries `.harnery/` yet. Hand back the enclosing checkout so a
171
- // first run (`harn init`, agent-hook's session.start) has somewhere to
133
+ // first run (`harn init`, agent-hook's session.started) has somewhere to
172
134
  // create it.
173
135
  return gitToplevel(start);
174
136
  }
@@ -195,7 +157,7 @@ function ancestorCoordRoots(start: string): string[] {
195
157
  * Does this root's `.harnery/` already know the process asking?
196
158
  *
197
159
  * Two discriminators, both genuinely about *this* session: the adapter-exported
198
- * session id matching a live heartbeat, and a pid-map row on our own ppid
160
+ * session id matching live V3 producer state, and a pid-map row on our own ppid
199
161
  * chain. Deliberately NOT the single-live-agent fallback that owner resolution
200
162
  * ends with — a lone stranger in the wrong root is exactly how `whoami` came to
201
163
  * report another agent's name and task as its own.
@@ -244,7 +206,7 @@ function gitToplevel(start: string): string | null {
244
206
  }
245
207
 
246
208
  function gitRevParse(cwd: string, flag: string): string | null {
247
- const key = `${cwd}${flag}`;
209
+ const key = `${cwd}\0${flag}`;
248
210
  const cached = gitRevParseCache.get(key);
249
211
  if (cached !== undefined) return cached;
250
212
  let value: string | null = null;
@@ -404,22 +366,20 @@ export function resolveOwnerWithSource(): {
404
366
  owner: string | null;
405
367
  source: "env" | "pidmap" | "pidmap_fallback" | "session_env" | "active_singleton" | "none";
406
368
  } {
369
+ const bridge = process.env.HARNERY_AGENT_COORD_BRIDGE?.trim();
407
370
  const envOwner = process.env.HARNERY_AGENT_COORD_OWNER?.trim();
408
- if (envOwner) {
371
+ // A bridge-marked child must prove identity through a live V3 producer. An
372
+ // inherited owner override is only a string, so trusting it here would let a
373
+ // stale or foreign environment bypass the bridge's fail-closed contract.
374
+ if (envOwner && !bridge) {
409
375
  return { owner: envOwner, source: "env" };
410
376
  }
411
377
 
412
378
  const root = monorepoRoot();
413
379
  if (!root) return { owner: null, source: "none" };
414
380
 
415
- // Every supported adapter exports its session id into the env of the
416
- // subprocess it spawns for a tool call, and each heartbeat records the
417
- // session id it was minted under. Matching the two names us outright, even
418
- // with many live agents, so it goes ahead of the ppid walk rather than
419
- // catching what the walk drops. Cursor needed this first because its
420
- // Glass/Agents UI runs several chats under one node ancestor, making that row
421
- // last-writer-wins; pid recycling generalises the same hazard to every
422
- // adapter.
381
+ // Every supported adapter exports its native session id into subprocesses.
382
+ // Match it against the live V3 producer state, never a disposable cache.
423
383
  if (shouldPreferSessionEnv()) {
424
384
  const bySession = resolveOwnerBySessionEnv(root);
425
385
  if (bySession) {
@@ -427,12 +387,17 @@ export function resolveOwnerWithSource(): {
427
387
  }
428
388
  }
429
389
 
390
+ // Connector children cross process-tree boundaries where pid ancestry is
391
+ // not logical session identity. Once marked, a missing V3 generation is
392
+ // terminal: never guess through pid-map or singleton fallback.
393
+ if (bridge) return { owner: null, source: "none" };
394
+
430
395
  if (!existsSync(resolve(root, ".harnery", "pid-map"))) return { owner: null, source: "none" };
431
396
 
432
397
  const byPidmap = resolveOwnerByPidmap(root);
433
398
  if (byPidmap.owner) return byPidmap;
434
399
 
435
- // Last resort: if exactly one agent is live in this coord root, it's
400
+ // Last resort: if exactly one V3 generation is live in this coord root, it's
436
401
  // unambiguously us — resolve to it. This is what lets the bare `agents
437
402
  // status` / `set-task` the stop hook recommends work without a `--session-id`
438
403
  // flag in the common single-agent case. With 0 or 2+ live agents it would be
@@ -501,6 +466,18 @@ const SESSION_ID_ENV_VARS = [
501
466
  ] as const;
502
467
 
503
468
  /** Read normalized candidates from the first non-empty adapter session-id env var. */
469
+ /**
470
+ * First adapter/bridge-stamped session id from the environment, WITHOUT the
471
+ * live-heartbeat validation resolveOwnerBySessionEnv applies. A fresh session
472
+ * has no heartbeat until its first set-task, so heartbeat-validated resolution
473
+ * returns null there by design; commands that REGISTER a session (set-task)
474
+ * may use this id directly — it carries the same trust as an explicit
475
+ * `--session-id` argument, because the adapter or connector stamped it.
476
+ */
477
+ export function sessionIdentityFromEnv(): string | null {
478
+ return sessionIdsFromEnv()[0] ?? null;
479
+ }
480
+
504
481
  function sessionIdsFromEnv(): string[] {
505
482
  for (const key of SESSION_ID_ENV_VARS) {
506
483
  const v = process.env[key]?.trim();
@@ -531,7 +508,7 @@ function sessionIdFromEnv(): string | null {
531
508
  * agent's name and file list.
532
509
  *
533
510
  * This only reorders the two. Session-env resolution still requires a live
534
- * heartbeat carrying that session id, so when it does not match, the walk runs
511
+ * V3 producer carrying that session id, so when it does not match, the walk runs
535
512
  * exactly as before.
536
513
  */
537
514
  function shouldPreferSessionEnv(): boolean {
@@ -539,160 +516,70 @@ function shouldPreferSessionEnv(): boolean {
539
516
  }
540
517
 
541
518
  /**
542
- * Resolve the owner by matching the adapter session-id env var against the
543
- * `session_id` of a live heartbeat in this coord root. Returns the matching
544
- * `instance_id`, or null if there's no session-id env var or no live heartbeat
545
- * carries it. "Live" reuses the same 10-minute freshness window the singleton
546
- * fallback applies, so a stale heartbeat from a prior session of the same id
547
- * doesn't resolve. When legacy Cursor Glass state contains both the canonical
548
- * bare id and its raw `bc-` alias, candidate order wins first; ties prefer a
549
- * named heartbeat, then the newest heartbeat, with instance id as a stable
550
- * final tie-breaker. Filesystem enumeration order never decides identity.
519
+ * Resolve the owner by joining adapter session environment to the live V3
520
+ * hook-producer state. A missing, terminal, or ambiguous generation fails
521
+ * closed. The disposable cache is consulted only to recover the native
522
+ * instance label bound to an already-authoritative canonical instance.
551
523
  *
552
524
  * Exported for unit testing with an injectable root.
553
525
  */
554
526
  export function resolveOwnerBySessionEnv(root: string): string | null {
555
527
  const sessionIds = sessionIdsFromEnv();
556
528
  if (sessionIds.length === 0) return null;
557
-
558
- const activeDir = resolve(root, ".harnery", "active");
559
- if (!existsSync(activeDir)) return null;
560
- const FRESHNESS_SECS = 600;
561
- const cutoffMs = Date.now() - FRESHNESS_SECS * 1000;
562
- let files: string[];
563
- try {
564
- files = readdirSync(activeDir);
565
- } catch {
566
- return null;
567
- }
568
- const matches: Array<{
569
- instanceId: string;
570
- sessionPreference: number;
571
- hasName: boolean;
572
- lastHeartbeatMs: number;
573
- }> = [];
574
- for (const file of files) {
575
- if (!file.endsWith(".json")) continue;
576
- try {
577
- const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8"));
578
- if (!parsed) continue;
579
- const sessionPreference = sessionIds.indexOf(parsed.session_id);
580
- if (sessionPreference === -1) continue;
581
- if (typeof parsed.instance_id !== "string") continue;
582
- const ts = Date.parse(parsed.last_heartbeat);
583
- if (!Number.isFinite(ts) || ts < cutoffMs) continue;
584
- matches.push({
585
- instanceId: parsed.instance_id,
586
- sessionPreference,
587
- hasName: typeof parsed.name === "string" && parsed.name.trim().length > 0,
588
- lastHeartbeatMs: ts,
589
- });
590
- } catch {
591
- // skip malformed
529
+ const adapters = adapterCandidatesFromEnv();
530
+ const matches = new Set<string>();
531
+ for (const sessionId of sessionIds) {
532
+ for (const adapter of adapters) {
533
+ const state = readHookProducerStateV3(root, adapter, sessionId);
534
+ if (state && !state.terminal) matches.add(nativeOwnerForV3Instance(root, state.instance_id));
592
535
  }
593
536
  }
594
- matches.sort(
595
- (a, b) =>
596
- a.sessionPreference - b.sessionPreference ||
597
- Number(b.hasName) - Number(a.hasName) ||
598
- b.lastHeartbeatMs - a.lastHeartbeatMs ||
599
- a.instanceId.localeCompare(b.instanceId),
600
- );
601
- return matches[0]?.instanceId ?? null;
537
+ return matches.size === 1 ? [...matches][0]! : null;
602
538
  }
603
539
 
604
540
  /**
605
- * Return the instance_id of the sole live agent in this coord root, or null
606
- * if there are zero or more than one. "Live" reuses the 10-minute heartbeat
607
- * freshness window the rest of the agents surface applies (kept inline as a
608
- * literal so this file stays node-builtins-only for vendored downstream use).
541
+ * Return the native instance label of the sole live V3 generation in this
542
+ * coord root, or null if there are zero or more than one.
609
543
  *
610
544
  * Exported for unit testing with an injectable root (the caller in
611
545
  * `resolveOwnerWithSource` passes `monorepoRoot()`).
612
546
  */
613
547
  export function resolveSingleActiveOwner(root: string): string | null {
614
- const activeDir = resolve(root, ".harnery", "active");
615
- if (!existsSync(activeDir)) return null;
616
- const FRESHNESS_SECS = 600;
617
- const cutoffMs = Date.now() - FRESHNESS_SECS * 1000;
618
- const live: string[] = [];
619
- let files: string[];
620
- try {
621
- files = readdirSync(activeDir);
622
- } catch {
623
- return null;
624
- }
625
- for (const file of files) {
626
- if (!file.endsWith(".json")) continue;
627
- try {
628
- const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8"));
629
- if (!parsed || typeof parsed.instance_id !== "string") continue;
630
- const ts = Date.parse(parsed.last_heartbeat);
631
- if (Number.isFinite(ts) && ts >= cutoffMs) live.push(parsed.instance_id);
632
- } catch {
633
- // skip malformed
634
- }
635
- if (live.length > 1) return null; // ambiguous; bail early
636
- }
637
- return live.length === 1 ? live[0]! : null;
548
+ const live = new Set(
549
+ listHookProducerStateRecordsV3(root, { includeTerminal: false }).map(({ state }) =>
550
+ nativeOwnerForV3Instance(root, state.instance_id),
551
+ ),
552
+ );
553
+ return live.size === 1 ? [...live][0]! : null;
638
554
  }
639
555
 
640
- /**
641
- * Read and parse a heartbeat file. Returns null if the file is missing,
642
- * unreadable, or contains malformed JSON. Does not throw.
643
- *
644
- * Phase 8 cleanup (2026-05-27): the v1/v2 dual-write bridge is gone; the
645
- * projector writes additively-merged heartbeats directly to
646
- * `.harnery/active/<id>.json` (the canonical location every reader expects).
647
- */
648
- export function readHeartbeat(instanceId: string): Heartbeat | null {
649
- if (!isSafeInstanceId(instanceId)) return null;
650
- const root = monorepoRoot();
651
- if (!root) return null;
652
- const path = resolveContainedFile(resolve(root, ".harnery", "active"), `${instanceId}.json`);
653
- return readJsonHeartbeatFile(path);
556
+ function adapterCandidatesFromEnv(): Array<"claude-code" | "codex" | "cursor"> {
557
+ const value = process.env.HARNERY_AGENT_COORD_PLATFORM?.trim();
558
+ if (value === "claude-code" || value === "codex" || value === "cursor") return [value];
559
+ return ["claude-code", "codex", "cursor"];
654
560
  }
655
561
 
656
- function readJsonHeartbeatFile(path: string): Heartbeat | null {
657
- if (!existsSync(path)) return null;
562
+ function nativeOwnerForV3Instance(root: string, instanceId: string): string {
563
+ const activeDir = resolve(root, ".harnery", "active");
658
564
  try {
659
- const raw = readFileSync(path, "utf8");
660
- const parsed = JSON.parse(raw);
661
- if (parsed && typeof parsed === "object" && typeof parsed.instance_id === "string") {
662
- return parsed as Heartbeat;
565
+ for (const file of readdirSync(activeDir)) {
566
+ if (!file.endsWith(".json")) continue;
567
+ const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8")) as Record<
568
+ string,
569
+ unknown
570
+ >;
571
+ if (
572
+ parsed.schema_version === 2 &&
573
+ parsed.v3_instance_id === instanceId &&
574
+ typeof parsed.instance_id === "string"
575
+ ) {
576
+ return parsed.instance_id;
577
+ }
663
578
  }
664
- return null;
665
579
  } catch {
666
- return null;
580
+ // The producer state remains authoritative; fall through to the canonical label.
667
581
  }
668
- }
669
-
670
- /**
671
- * Render the display form for an instance_id: `agent-<Name>` if the heartbeat
672
- * carries a non-empty `.name`, else `agent-<8-char-hex-prefix>`.
673
- *
674
- * Hex fallback handles three cases cleanly:
675
- * - heartbeat written before this feature shipped (no `name` field)
676
- * - heartbeat pruned but instance_id still appears in older log lines
677
- * - the narrow window between instance_id resolution and heartbeat read
678
- */
679
- export function displayName(instanceId: string): string {
680
- if (!instanceId) return "agent-unknown";
681
- const hb = readHeartbeat(instanceId);
682
- if (hb && typeof hb.name === "string" && hb.name.length > 0) {
683
- return `agent-${hb.name}`;
684
- }
685
- return `agent-${instanceId.slice(0, 8)}`;
686
- }
687
-
688
- /**
689
- * Convenience: resolve self via ppid walk, then render. Returns
690
- * `agent-unknown` when the walk fails.
691
- */
692
- export function selfDisplayName(): string {
693
- const owner = resolveOwner();
694
- if (!owner) return "agent-unknown";
695
- return displayName(owner);
582
+ return instanceId.startsWith("inst_") ? instanceId.slice(5) : instanceId;
696
583
  }
697
584
 
698
585
  function readPpid(pid: number): number | null {