harnery 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (665) hide show
  1. package/README.md +2 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +7 -1
  4. package/dist/commands/adapter.js +2 -2
  5. package/dist/commands/agents.d.ts +144 -1
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +1408 -565
  8. package/dist/commands/artifacts.d.ts.map +1 -1
  9. package/dist/commands/artifacts.js +7 -6
  10. package/dist/commands/backup.d.ts +1 -1
  11. package/dist/commands/backup.d.ts.map +1 -1
  12. package/dist/commands/backup.js +29 -16
  13. package/dist/commands/browse.d.ts.map +1 -1
  14. package/dist/commands/browse.js +234 -12
  15. package/dist/commands/checkpoint.d.ts.map +1 -1
  16. package/dist/commands/checkpoint.js +3 -2
  17. package/dist/commands/claude-desktop.d.ts +2 -2
  18. package/dist/commands/claude-desktop.d.ts.map +1 -1
  19. package/dist/commands/claude-desktop.js +2 -2
  20. package/dist/commands/context.js +1 -6
  21. package/dist/commands/decision.d.ts.map +1 -1
  22. package/dist/commands/decision.js +22 -38
  23. package/dist/commands/docs.d.ts.map +1 -1
  24. package/dist/commands/docs.js +91 -28
  25. package/dist/commands/doctor.d.ts +4 -2
  26. package/dist/commands/doctor.d.ts.map +1 -1
  27. package/dist/commands/doctor.js +55 -7
  28. package/dist/commands/events.d.ts +5 -0
  29. package/dist/commands/events.d.ts.map +1 -0
  30. package/dist/commands/events.js +189 -0
  31. package/dist/commands/governor.d.ts.map +1 -1
  32. package/dist/commands/governor.js +13 -4
  33. package/dist/commands/init.d.ts +10 -2
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +233 -51
  36. package/dist/commands/instructions.d.ts +4 -0
  37. package/dist/commands/instructions.d.ts.map +1 -0
  38. package/dist/commands/instructions.js +100 -0
  39. package/dist/commands/journal.d.ts.map +1 -1
  40. package/dist/commands/journal.js +4 -13
  41. package/dist/commands/ledger-v3.d.ts +5 -0
  42. package/dist/commands/ledger-v3.d.ts.map +1 -0
  43. package/dist/commands/ledger-v3.js +91 -0
  44. package/dist/commands/presence.d.ts.map +1 -1
  45. package/dist/commands/presence.js +15 -6
  46. package/dist/commands/sync.d.ts +1 -1
  47. package/dist/commands/sync.js +1 -1
  48. package/dist/commands/web.d.ts +6 -0
  49. package/dist/commands/web.d.ts.map +1 -1
  50. package/dist/commands/web.js +67 -7
  51. package/dist/commands/work.d.ts.map +1 -1
  52. package/dist/commands/work.js +22 -5
  53. package/dist/core/adapter.d.ts +5 -0
  54. package/dist/core/adapter.d.ts.map +1 -0
  55. package/dist/core/adapter.js +1 -0
  56. package/dist/core/adapters/attest.d.ts +5 -2
  57. package/dist/core/adapters/attest.d.ts.map +1 -1
  58. package/dist/core/adapters/attest.js +8 -3
  59. package/dist/core/adapters/profiles.d.ts +6 -6
  60. package/dist/core/adapters/profiles.d.ts.map +1 -1
  61. package/dist/core/adapters/profiles.js +4 -4
  62. package/dist/core/agents/canonical-emit.d.ts +17 -15
  63. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  64. package/dist/core/agents/canonical-emit.js +27 -25
  65. package/dist/core/agents/cli.js +212 -235
  66. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  67. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  68. package/dist/core/agents/codex-archive-v3.js +110 -0
  69. package/dist/core/agents/coord-client.d.ts +19 -70
  70. package/dist/core/agents/coord-client.d.ts.map +1 -1
  71. package/dist/core/agents/coord-client.js +65 -155
  72. package/dist/core/agents/finalization.d.ts +4 -1
  73. package/dist/core/agents/finalization.d.ts.map +1 -1
  74. package/dist/core/agents/finalization.js +89 -32
  75. package/dist/core/agents/index.d.ts +5 -5
  76. package/dist/core/agents/index.d.ts.map +1 -1
  77. package/dist/core/agents/index.js +5 -5
  78. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  79. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-authority-v3.js +233 -0
  81. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  82. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  83. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  84. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  85. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  86. package/dist/core/agents/live-observation-v3.js +157 -0
  87. package/dist/core/agents/render/prompt-context.d.ts +10 -4
  88. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  89. package/dist/core/agents/render/prompt-context.js +61 -55
  90. package/dist/core/agents/render/session-context.d.ts +1 -1
  91. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  92. package/dist/core/agents/render/session-context.js +15 -33
  93. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  94. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  95. package/dist/core/agents/rules/claim-conflict.js +79 -127
  96. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  97. package/dist/core/agents/rules/commit-conflict.js +3 -18
  98. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  99. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  100. package/dist/core/agents/rules/stop-hook.js +193 -236
  101. package/dist/core/agents/session-events.d.ts +5 -7
  102. package/dist/core/agents/session-events.d.ts.map +1 -1
  103. package/dist/core/agents/session-events.js +127 -95
  104. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  105. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  106. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  107. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  108. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  109. package/dist/core/agents/session-finalizer-v3.js +734 -0
  110. package/dist/core/agents/session-name-display.d.ts +40 -0
  111. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  112. package/dist/core/agents/session-name-display.js +119 -0
  113. package/dist/core/agents/state/activity-log.d.ts +3 -3
  114. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  115. package/dist/core/agents/state/activity-log.js +7 -16
  116. package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
  117. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  118. package/dist/core/agents/state/heartbeat-writer.js +59 -199
  119. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  120. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  121. package/dist/core/agents/state/live-coordination-view.js +209 -0
  122. package/dist/core/agents/state/session-state.d.ts +45 -0
  123. package/dist/core/agents/state/session-state.d.ts.map +1 -0
  124. package/dist/core/agents/state/session-state.js +90 -0
  125. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  126. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  127. package/dist/core/agents/state/stale-sweep.js +26 -15
  128. package/dist/core/artifacts/index.d.ts.map +1 -1
  129. package/dist/core/artifacts/index.js +5 -7
  130. package/dist/core/config.d.ts +33 -2
  131. package/dist/core/config.d.ts.map +1 -1
  132. package/dist/core/config.js +98 -2
  133. package/dist/core/context/index.d.ts +1 -4
  134. package/dist/core/context/index.d.ts.map +1 -1
  135. package/dist/core/context/index.js +9 -9
  136. package/dist/core/events/span-parent.d.ts +15 -0
  137. package/dist/core/events/span-parent.d.ts.map +1 -0
  138. package/dist/core/events/span-parent.js +34 -0
  139. package/dist/core/events/v3/advance.d.ts +14 -0
  140. package/dist/core/events/v3/advance.d.ts.map +1 -0
  141. package/dist/core/events/v3/advance.js +134 -0
  142. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  143. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  144. package/dist/core/events/v3/authority-outbox.js +399 -0
  145. package/dist/core/events/v3/base-builder.d.ts +20 -0
  146. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  147. package/dist/core/events/v3/base-builder.js +29 -0
  148. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  149. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  150. package/dist/core/events/v3/base-contract.js +647 -0
  151. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  152. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  153. package/dist/core/events/v3/bootstrap.js +175 -0
  154. package/dist/core/events/v3/builder.d.ts +20 -0
  155. package/dist/core/events/v3/builder.d.ts.map +1 -0
  156. package/dist/core/events/v3/builder.js +28 -0
  157. package/dist/core/events/v3/canonical.d.ts +31 -0
  158. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  159. package/dist/core/events/v3/canonical.js +100 -0
  160. package/dist/core/events/v3/capabilities.d.ts +31 -0
  161. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  162. package/dist/core/events/v3/capabilities.js +107 -0
  163. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  164. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  165. package/dist/core/events/v3/capability-drift.js +134 -0
  166. package/dist/core/events/v3/catalog.d.ts +38 -0
  167. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  168. package/dist/core/events/v3/catalog.js +135 -0
  169. package/dist/core/events/v3/clock-order.d.ts +34 -0
  170. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  171. package/dist/core/events/v3/clock-order.js +35 -0
  172. package/dist/core/events/v3/contract.d.ts +171 -0
  173. package/dist/core/events/v3/contract.d.ts.map +1 -0
  174. package/dist/core/events/v3/contract.js +180 -0
  175. package/dist/core/events/v3/control.d.ts +111 -0
  176. package/dist/core/events/v3/control.d.ts.map +1 -0
  177. package/dist/core/events/v3/control.js +419 -0
  178. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  179. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/coordination-view.js +119 -0
  181. package/dist/core/events/v3/economics.d.ts +77 -0
  182. package/dist/core/events/v3/economics.d.ts.map +1 -0
  183. package/dist/core/events/v3/economics.js +274 -0
  184. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  185. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  186. package/dist/core/events/v3/finalization-view.js +37 -0
  187. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  188. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  189. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  190. package/dist/core/events/v3/generated.d.ts +4 -0
  191. package/dist/core/events/v3/generated.d.ts.map +1 -0
  192. package/dist/core/events/v3/generated.js +47 -0
  193. package/dist/core/events/v3/ids.d.ts +9 -0
  194. package/dist/core/events/v3/ids.d.ts.map +1 -0
  195. package/dist/core/events/v3/ids.js +25 -0
  196. package/dist/core/events/v3/index.d.ts +35 -0
  197. package/dist/core/events/v3/index.d.ts.map +1 -0
  198. package/dist/core/events/v3/index.js +33 -0
  199. package/dist/core/events/v3/latency.d.ts +63 -0
  200. package/dist/core/events/v3/latency.d.ts.map +1 -0
  201. package/dist/core/events/v3/latency.js +412 -0
  202. package/dist/core/events/v3/live-feed.d.ts +45 -0
  203. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-feed.js +246 -0
  205. package/dist/core/events/v3/live-observation.d.ts +35 -0
  206. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  207. package/dist/core/events/v3/live-observation.js +1 -0
  208. package/dist/core/events/v3/live-routing.d.ts +57 -0
  209. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  210. package/dist/core/events/v3/live-routing.js +107 -0
  211. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  212. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  214. package/dist/core/events/v3/producers/command.d.ts +50 -0
  215. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/command.js +135 -0
  217. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  218. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  220. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  221. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/coordination.js +229 -0
  223. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  224. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/hook-base.js +424 -0
  226. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  227. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/hook.js +71 -0
  229. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  231. package/dist/core/events/v3/producers/intake.js +244 -0
  232. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  233. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/recorder.js +2176 -0
  235. package/dist/core/events/v3/projection.d.ts +101 -0
  236. package/dist/core/events/v3/projection.d.ts.map +1 -0
  237. package/dist/core/events/v3/projection.js +479 -0
  238. package/dist/core/events/v3/reader.d.ts +75 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -0
  240. package/dist/core/events/v3/reader.js +778 -0
  241. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  242. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  243. package/dist/core/events/v3/recovery-record.js +167 -0
  244. package/dist/core/events/v3/recovery.d.ts +22 -0
  245. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  246. package/dist/core/events/v3/recovery.js +227 -0
  247. package/dist/core/events/v3/span-state.d.ts +52 -0
  248. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  249. package/dist/core/events/v3/span-state.js +142 -0
  250. package/dist/core/events/v3/targets.d.ts +23 -0
  251. package/dist/core/events/v3/targets.d.ts.map +1 -0
  252. package/dist/core/events/v3/targets.js +134 -0
  253. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  254. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  255. package/dist/core/events/v3/turn-telemetry.js +168 -0
  256. package/dist/core/events/v3/validate.d.ts +9 -0
  257. package/dist/core/events/v3/validate.d.ts.map +1 -0
  258. package/dist/core/events/v3/validate.js +281 -0
  259. package/dist/core/events/v3/writer.d.ts +56 -0
  260. package/dist/core/events/v3/writer.d.ts.map +1 -0
  261. package/dist/core/events/v3/writer.js +335 -0
  262. package/dist/core/governor/index.d.ts +1 -1
  263. package/dist/core/governor/index.d.ts.map +1 -1
  264. package/dist/core/governor/index.js +1 -1
  265. package/dist/core/governor/plan-api.d.ts +2 -1
  266. package/dist/core/governor/plan-api.d.ts.map +1 -1
  267. package/dist/core/governor/plan-api.js +6 -3
  268. package/dist/core/governor/read.d.ts +1 -1
  269. package/dist/core/governor/read.d.ts.map +1 -1
  270. package/dist/core/governor/read.js +1 -1
  271. package/dist/core/governor/state.d.ts +9 -0
  272. package/dist/core/governor/state.d.ts.map +1 -1
  273. package/dist/core/governor/state.js +40 -3
  274. package/dist/core/guard/config.d.ts +5 -0
  275. package/dist/core/guard/config.d.ts.map +1 -0
  276. package/dist/core/guard/config.js +157 -0
  277. package/dist/core/guard/coordinator.d.ts +14 -0
  278. package/dist/core/guard/coordinator.d.ts.map +1 -0
  279. package/dist/core/guard/coordinator.js +173 -0
  280. package/dist/core/guard/evaluator.d.ts +4 -0
  281. package/dist/core/guard/evaluator.d.ts.map +1 -0
  282. package/dist/core/guard/evaluator.js +242 -0
  283. package/dist/core/guard/evidence-v3.d.ts +15 -0
  284. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  285. package/dist/core/guard/evidence-v3.js +171 -0
  286. package/dist/core/guard/index.d.ts +10 -0
  287. package/dist/core/guard/index.d.ts.map +1 -0
  288. package/dist/core/guard/index.js +6 -0
  289. package/dist/core/guard/live-source-v3.d.ts +40 -0
  290. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  291. package/dist/core/guard/live-source-v3.js +128 -0
  292. package/dist/core/guard/storage.d.ts +27 -0
  293. package/dist/core/guard/storage.d.ts.map +1 -0
  294. package/dist/core/guard/storage.js +140 -0
  295. package/dist/core/guard/types.d.ts +119 -0
  296. package/dist/core/guard/types.d.ts.map +1 -0
  297. package/dist/core/guard/types.js +1 -0
  298. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  299. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/detect.js +29 -0
  301. package/dist/core/hooks/adapter/events.d.ts +7 -4
  302. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  303. package/dist/core/hooks/adapter/events.js +13 -4
  304. package/dist/core/hooks/adapter/output.d.ts +2 -2
  305. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  306. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  307. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  308. package/dist/core/hooks/adapter/parse.js +64 -24
  309. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  310. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  311. package/dist/core/hooks/adapter/wiring.js +89 -11
  312. package/dist/core/hooks/cli.d.ts +1 -1
  313. package/dist/core/hooks/cli.js +345 -400
  314. package/dist/core/hooks/codex-authorization.d.ts +30 -0
  315. package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
  316. package/dist/core/hooks/codex-authorization.js +199 -0
  317. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  318. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  319. package/dist/core/hooks/effects/image-capture.js +212 -221
  320. package/dist/core/hooks/effects/index.d.ts +1 -9
  321. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  322. package/dist/core/hooks/effects/index.js +1 -24
  323. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  324. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  325. package/dist/core/hooks/events/input-hash.js +43 -0
  326. package/dist/core/hooks/index.d.ts +4 -3
  327. package/dist/core/hooks/index.d.ts.map +1 -1
  328. package/dist/core/hooks/index.js +2 -3
  329. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  330. package/dist/core/hooks/resolve/coord-root.js +1 -1
  331. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  332. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  333. package/dist/core/hooks/resolve/owner.js +51 -42
  334. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  335. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  336. package/dist/core/hooks/resolve/transcript.js +155 -14
  337. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  338. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  339. package/dist/core/hooks/session-name-presence.js +15 -15
  340. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  341. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  342. package/dist/core/journal/index.d.ts +2 -2
  343. package/dist/core/journal/index.d.ts.map +1 -1
  344. package/dist/core/journal/index.js +9 -22
  345. package/dist/core/presence/blob.d.ts +8 -3
  346. package/dist/core/presence/blob.d.ts.map +1 -1
  347. package/dist/core/presence/blob.js +54 -41
  348. package/dist/core/presence/codec-digest.d.ts +29 -0
  349. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  350. package/dist/core/presence/codec-digest.js +170 -0
  351. package/dist/core/presence/index.js +15 -1
  352. package/dist/core/presence/relay-client.d.ts +1 -1
  353. package/dist/core/presence/relay-client.d.ts.map +1 -1
  354. package/dist/core/presence/relay-client.js +5 -5
  355. package/dist/core/work/index.d.ts +1 -1
  356. package/dist/core/work/index.d.ts.map +1 -1
  357. package/dist/core/work/index.js +1 -1
  358. package/dist/core/work/read.d.ts +1 -1
  359. package/dist/core/work/read.d.ts.map +1 -1
  360. package/dist/core/work/read.js +1 -1
  361. package/dist/core/work/runner.d.ts.map +1 -1
  362. package/dist/core/work/runner.js +6 -0
  363. package/dist/core/work/state.d.ts +9 -0
  364. package/dist/core/work/state.d.ts.map +1 -1
  365. package/dist/core/work/state.js +17 -3
  366. package/dist/core/workflow/engine.js +24 -25
  367. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  368. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  369. package/dist/core/workflow/live-session-v3.js +86 -0
  370. package/dist/core/workflow/scope-id.d.ts +3 -0
  371. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  372. package/dist/core/workflow/scope-id.js +5 -0
  373. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  374. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  375. package/dist/core/workflow/workspaces/leases.js +53 -19
  376. package/dist/index.d.ts +1 -1
  377. package/dist/index.js +1 -1
  378. package/dist/lib/browser/client.d.ts +41 -0
  379. package/dist/lib/browser/client.d.ts.map +1 -1
  380. package/dist/lib/browser/client.js +203 -0
  381. package/dist/lib/browser/critique.d.ts +28 -2
  382. package/dist/lib/browser/critique.d.ts.map +1 -1
  383. package/dist/lib/browser/critique.js +74 -18
  384. package/dist/lib/browser/geometry.d.ts +1 -1
  385. package/dist/lib/browser/geometry.d.ts.map +1 -1
  386. package/dist/lib/browser/geometry.js +130 -6
  387. package/dist/lib/browser/index.d.ts +3 -0
  388. package/dist/lib/browser/index.d.ts.map +1 -1
  389. package/dist/lib/browser/index.js +3 -0
  390. package/dist/lib/browser/qa-plan.d.ts +174 -0
  391. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  392. package/dist/lib/browser/qa-plan.js +321 -0
  393. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  394. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  395. package/dist/lib/browser/qa-reuse.js +222 -0
  396. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  397. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  398. package/dist/lib/browser/qa-snapshot.js +171 -0
  399. package/dist/lib/browser/runts.d.ts.map +1 -1
  400. package/dist/lib/browser/runts.js +22 -1
  401. package/dist/lib/browser/tiling.d.ts +71 -0
  402. package/dist/lib/browser/tiling.d.ts.map +1 -0
  403. package/dist/lib/browser/tiling.js +118 -0
  404. package/dist/lib/context/index.d.ts +0 -3
  405. package/dist/lib/context/index.d.ts.map +1 -1
  406. package/dist/lib/context/index.js +20 -42
  407. package/dist/lib/council/index.d.ts +2 -2
  408. package/dist/lib/council/index.d.ts.map +1 -1
  409. package/dist/lib/council/index.js +9 -20
  410. package/dist/lib/docs-frontmatter.d.ts +1 -6
  411. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  412. package/dist/lib/docs-frontmatter.js +12 -78
  413. package/dist/lib/docs-index.d.ts +9 -0
  414. package/dist/lib/docs-index.d.ts.map +1 -1
  415. package/dist/lib/docs-index.js +32 -3
  416. package/dist/lib/docs-lint.d.ts.map +1 -1
  417. package/dist/lib/docs-lint.js +14 -30
  418. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  419. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  420. package/dist/lib/docs-metadata-audit.js +132 -0
  421. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  422. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  423. package/dist/lib/docs-metadata-managed.js +78 -0
  424. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  425. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  426. package/dist/lib/docs-metadata-sync.js +222 -0
  427. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  428. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  429. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  430. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  431. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  432. package/dist/lib/docs-metadata-v2.js +424 -0
  433. package/dist/lib/docs-new.d.ts +11 -0
  434. package/dist/lib/docs-new.d.ts.map +1 -0
  435. package/dist/lib/docs-new.js +52 -0
  436. package/dist/lib/docs-sweep.d.ts.map +1 -1
  437. package/dist/lib/docs-sweep.js +45 -29
  438. package/dist/lib/headless/index.d.ts +98 -0
  439. package/dist/lib/headless/index.d.ts.map +1 -0
  440. package/dist/lib/headless/index.js +211 -0
  441. package/dist/lib/identities/assume.d.ts +4 -4
  442. package/dist/lib/identities/assume.d.ts.map +1 -1
  443. package/dist/lib/identities/assume.js +52 -68
  444. package/dist/lib/instructions/apply.d.ts +5 -4
  445. package/dist/lib/instructions/apply.d.ts.map +1 -1
  446. package/dist/lib/instructions/apply.js +32 -20
  447. package/dist/lib/instructions/bundle.d.ts +33 -0
  448. package/dist/lib/instructions/bundle.d.ts.map +1 -0
  449. package/dist/lib/instructions/bundle.js +149 -0
  450. package/dist/lib/instructions/splice.d.ts +0 -1
  451. package/dist/lib/instructions/splice.d.ts.map +1 -1
  452. package/dist/lib/instructions/splice.js +22 -6
  453. package/dist/lib/instructions/templates.d.ts +7 -5
  454. package/dist/lib/instructions/templates.d.ts.map +1 -1
  455. package/dist/lib/instructions/templates.js +79 -9
  456. package/package.json +27 -6
  457. package/schemas/config.schema.json +120 -2
  458. package/schemas/docs-metadata-v2.schema.json +441 -0
  459. package/schemas/event-v3.schema.json +24472 -0
  460. package/src/commander.ts +7 -1
  461. package/src/commands/adapter.ts +2 -2
  462. package/src/commands/agents.ts +1737 -570
  463. package/src/commands/artifacts.ts +7 -6
  464. package/src/commands/backup.ts +29 -21
  465. package/src/commands/browse.ts +349 -8
  466. package/src/commands/checkpoint.ts +4 -3
  467. package/src/commands/claude-desktop.ts +7 -5
  468. package/src/commands/context.ts +1 -6
  469. package/src/commands/decision.ts +27 -44
  470. package/src/commands/docs.ts +100 -33
  471. package/src/commands/doctor.ts +73 -8
  472. package/src/commands/events.ts +256 -0
  473. package/src/commands/governor.ts +18 -4
  474. package/src/commands/init.ts +264 -57
  475. package/src/commands/instructions.ts +129 -0
  476. package/src/commands/journal.ts +4 -13
  477. package/src/commands/ledger-v3.ts +111 -0
  478. package/src/commands/presence.ts +18 -11
  479. package/src/commands/sync.ts +1 -1
  480. package/src/commands/web.ts +67 -8
  481. package/src/commands/work.ts +28 -5
  482. package/src/core/adapter.ts +5 -0
  483. package/src/core/adapters/attest.ts +8 -3
  484. package/src/core/adapters/profiles.ts +4 -6
  485. package/src/core/agents/canonical-emit.ts +39 -28
  486. package/src/core/agents/cli.ts +242 -263
  487. package/src/core/agents/codex-archive-v3.ts +138 -0
  488. package/src/core/agents/coord-client.ts +75 -177
  489. package/src/core/agents/finalization.ts +120 -38
  490. package/src/core/agents/index.ts +5 -5
  491. package/src/core/agents/live-authority-v3.ts +375 -0
  492. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  493. package/src/core/agents/live-observation-v3.ts +216 -0
  494. package/src/core/agents/render/prompt-context.ts +89 -55
  495. package/src/core/agents/render/session-context.ts +23 -32
  496. package/src/core/agents/rules/claim-conflict.ts +85 -126
  497. package/src/core/agents/rules/commit-conflict.ts +3 -14
  498. package/src/core/agents/rules/stop-hook.ts +239 -293
  499. package/src/core/agents/session-events.ts +137 -104
  500. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  501. package/src/core/agents/session-finalizer-v3.ts +953 -0
  502. package/src/core/agents/session-name-display.ts +149 -0
  503. package/src/core/agents/state/activity-log.ts +6 -14
  504. package/src/core/agents/state/heartbeat-writer.ts +98 -242
  505. package/src/core/agents/state/live-coordination-view.ts +290 -0
  506. package/src/core/agents/state/session-state.ts +143 -0
  507. package/src/core/agents/state/stale-sweep.ts +40 -17
  508. package/src/core/artifacts/index.ts +4 -5
  509. package/src/core/config.ts +148 -3
  510. package/src/core/context/index.ts +9 -17
  511. package/src/core/events/span-parent.ts +46 -0
  512. package/src/core/events/v3/advance.ts +168 -0
  513. package/src/core/events/v3/authority-outbox.ts +548 -0
  514. package/src/core/events/v3/base-builder.ts +60 -0
  515. package/src/core/events/v3/base-contract.ts +882 -0
  516. package/src/core/events/v3/bootstrap.ts +226 -0
  517. package/src/core/events/v3/builder.ts +59 -0
  518. package/src/core/events/v3/canonical.ts +153 -0
  519. package/src/core/events/v3/capabilities.ts +171 -0
  520. package/src/core/events/v3/capability-drift.ts +177 -0
  521. package/src/core/events/v3/catalog.ts +202 -0
  522. package/src/core/events/v3/clock-order.ts +41 -0
  523. package/src/core/events/v3/contract.ts +365 -0
  524. package/src/core/events/v3/control.ts +576 -0
  525. package/src/core/events/v3/coordination-view.ts +193 -0
  526. package/src/core/events/v3/economics.ts +384 -0
  527. package/src/core/events/v3/finalization-view.ts +67 -0
  528. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  529. package/src/core/events/v3/generated.ts +48 -0
  530. package/src/core/events/v3/ids.ts +33 -0
  531. package/src/core/events/v3/index.ts +322 -0
  532. package/src/core/events/v3/latency.ts +551 -0
  533. package/src/core/events/v3/live-feed.ts +319 -0
  534. package/src/core/events/v3/live-observation.ts +39 -0
  535. package/src/core/events/v3/live-routing.ts +135 -0
  536. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  537. package/src/core/events/v3/producers/command.ts +201 -0
  538. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  539. package/src/core/events/v3/producers/coordination.ts +355 -0
  540. package/src/core/events/v3/producers/hook-base.ts +578 -0
  541. package/src/core/events/v3/producers/hook.ts +119 -0
  542. package/src/core/events/v3/producers/intake.ts +319 -0
  543. package/src/core/events/v3/producers/recorder.ts +2805 -0
  544. package/src/core/events/v3/projection.ts +653 -0
  545. package/src/core/events/v3/reader.ts +1127 -0
  546. package/src/core/events/v3/recovery-record.ts +244 -0
  547. package/src/core/events/v3/recovery.ts +271 -0
  548. package/src/core/events/v3/span-state.ts +187 -0
  549. package/src/core/events/v3/targets.ts +182 -0
  550. package/src/core/events/v3/turn-telemetry.ts +259 -0
  551. package/src/core/events/v3/validate.ts +361 -0
  552. package/src/core/events/v3/writer.ts +419 -0
  553. package/src/core/governor/index.ts +3 -0
  554. package/src/core/governor/plan-api.ts +10 -2
  555. package/src/core/governor/read.ts +3 -0
  556. package/src/core/governor/state.ts +52 -5
  557. package/src/core/guard/config.ts +206 -0
  558. package/src/core/guard/coordinator.ts +227 -0
  559. package/src/core/guard/evaluator.ts +343 -0
  560. package/src/core/guard/evidence-v3.ts +227 -0
  561. package/src/core/guard/index.ts +35 -0
  562. package/src/core/guard/live-source-v3.ts +204 -0
  563. package/src/core/guard/storage.ts +188 -0
  564. package/src/core/guard/types.ts +152 -0
  565. package/src/core/hooks/adapter/detect.ts +28 -1
  566. package/src/core/hooks/adapter/events.ts +15 -6
  567. package/src/core/hooks/adapter/output.ts +7 -2
  568. package/src/core/hooks/adapter/parse.ts +81 -36
  569. package/src/core/hooks/adapter/wiring.ts +119 -13
  570. package/src/core/hooks/cli.ts +398 -422
  571. package/src/core/hooks/codex-authorization.ts +253 -0
  572. package/src/core/hooks/effects/image-capture.ts +228 -238
  573. package/src/core/hooks/effects/index.ts +1 -36
  574. package/src/core/hooks/events/input-hash.ts +47 -0
  575. package/src/core/hooks/index.ts +4 -11
  576. package/src/core/hooks/resolve/coord-root.ts +1 -1
  577. package/src/core/hooks/resolve/owner.ts +52 -45
  578. package/src/core/hooks/resolve/transcript.ts +165 -14
  579. package/src/core/hooks/session-name-presence.ts +14 -15
  580. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  581. package/src/core/journal/index.ts +15 -22
  582. package/src/core/presence/blob.ts +63 -38
  583. package/src/core/presence/codec-digest.ts +215 -0
  584. package/src/core/presence/index.ts +18 -1
  585. package/src/core/presence/relay-client.ts +5 -5
  586. package/src/core/work/index.ts +3 -0
  587. package/src/core/work/read.ts +3 -0
  588. package/src/core/work/runner.ts +6 -0
  589. package/src/core/work/state.ts +27 -3
  590. package/src/core/workflow/engine.ts +24 -24
  591. package/src/core/workflow/live-session-v3.ts +126 -0
  592. package/src/core/workflow/scope-id.ts +6 -0
  593. package/src/core/workflow/workspaces/leases.ts +56 -19
  594. package/src/index.ts +1 -1
  595. package/src/lib/browser/client.ts +230 -0
  596. package/src/lib/browser/critique.ts +104 -27
  597. package/src/lib/browser/geometry.ts +143 -14
  598. package/src/lib/browser/index.ts +34 -0
  599. package/src/lib/browser/qa-plan.ts +501 -0
  600. package/src/lib/browser/qa-reuse.ts +306 -0
  601. package/src/lib/browser/qa-snapshot.ts +223 -0
  602. package/src/lib/browser/runts.ts +27 -2
  603. package/src/lib/browser/tiling.ts +164 -0
  604. package/src/lib/context/index.ts +22 -46
  605. package/src/lib/council/index.ts +9 -21
  606. package/src/lib/docs-frontmatter.ts +8 -79
  607. package/src/lib/docs-index.ts +33 -3
  608. package/src/lib/docs-lint.ts +15 -29
  609. package/src/lib/docs-metadata-audit.ts +166 -0
  610. package/src/lib/docs-metadata-managed.ts +83 -0
  611. package/src/lib/docs-metadata-sync.ts +262 -0
  612. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  613. package/src/lib/docs-metadata-v2.ts +646 -0
  614. package/src/lib/docs-new.ts +63 -0
  615. package/src/lib/docs-sweep.ts +42 -28
  616. package/src/lib/headless/index.ts +287 -0
  617. package/src/lib/identities/assume.ts +67 -86
  618. package/src/lib/instructions/apply.ts +33 -20
  619. package/src/lib/instructions/bundle.ts +199 -0
  620. package/src/lib/instructions/splice.ts +21 -7
  621. package/src/lib/instructions/templates.ts +85 -13
  622. package/dist/core/agents/cli-emit.d.ts +0 -27
  623. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  624. package/dist/core/agents/cli-emit.js +0 -57
  625. package/dist/core/agents/codex-replay.d.ts +0 -29
  626. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  627. package/dist/core/agents/codex-replay.js +0 -138
  628. package/dist/core/agents/events/consume.d.ts +0 -82
  629. package/dist/core/agents/events/consume.d.ts.map +0 -1
  630. package/dist/core/agents/events/consume.js +0 -195
  631. package/dist/core/agents/events/emit.d.ts +0 -42
  632. package/dist/core/agents/events/emit.d.ts.map +0 -1
  633. package/dist/core/agents/events/emit.js +0 -75
  634. package/dist/core/agents/events/ulid.d.ts +0 -11
  635. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  636. package/dist/core/agents/events/ulid.js +0 -47
  637. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
  638. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  639. package/dist/core/agents/state/heartbeat-projector.js +0 -527
  640. package/dist/core/hooks/events/emit.d.ts +0 -31
  641. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  642. package/dist/core/hooks/events/emit.js +0 -93
  643. package/dist/core/hooks/events/rotate.d.ts +0 -43
  644. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  645. package/dist/core/hooks/events/rotate.js +0 -142
  646. package/dist/core/hooks/events/schema.d.ts +0 -312
  647. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  648. package/dist/core/hooks/events/schema.js +0 -12
  649. package/dist/core/hooks/events/ulid.d.ts +0 -10
  650. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  651. package/dist/core/hooks/events/ulid.js +0 -47
  652. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  653. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  654. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  655. package/src/core/agents/cli-emit.ts +0 -64
  656. package/src/core/agents/codex-replay.ts +0 -163
  657. package/src/core/agents/events/consume.ts +0 -254
  658. package/src/core/agents/events/emit.ts +0 -115
  659. package/src/core/agents/events/ulid.ts +0 -51
  660. package/src/core/agents/state/heartbeat-projector.ts +0 -582
  661. package/src/core/hooks/events/emit.ts +0 -125
  662. package/src/core/hooks/events/rotate.ts +0 -151
  663. package/src/core/hooks/events/schema.ts +0 -538
  664. package/src/core/hooks/events/ulid.ts +0 -51
  665. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -0,0 +1,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,37 +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
- /** Session name built on the first non-empty set-task; its presence means "this session has been named". 2026-08-09. */
79
- suggested_session_name?: string;
80
- /** Stamped by turn.stop once the suggested name is seen in assistant reply text. 2026-08-09. */
81
- session_name_seen_at?: string;
82
- /** Auto-generated per-turn summary written by the Stop hook via Haiku. 2026-05-23. */
83
- turn_summary?: string | null;
84
- /** UTC ISO-8601 timestamp when turn_summary was last refreshed. */
85
- turn_summary_updated_at?: string | null;
86
- /** Hook client: `claude-code` (default) or `cursor`. Cursor Phase 1. */
87
- platform?: string;
88
- }
89
-
90
63
  /**
91
64
  * Resolve the monorepo root for coord-state purposes.
92
65
  *
@@ -101,8 +74,8 @@ export function monorepoRoot(): string | null {
101
74
  * THE coordination-root resolution. Every surface — the hooks, the CLI's reads,
102
75
  * and the CLI's canonical emits — resolves through this one function, because a
103
76
  * root the two layers disagree about is a root that silently breaks the
104
- * end-of-turn rules: the hook evaluates `state.status_checked` from the stream
105
- * 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
106
79
  * and rule 1/3 blocks a turn that did run `agents status`, with no sequence of
107
80
  * CLI commands able to satisfy it.
108
81
  *
@@ -157,7 +130,7 @@ export function resolveCoordRoot(start: string = process.cwd()): string | null {
157
130
  if (ancestors.length > 0) return ancestors[0] as string;
158
131
  if (gitRoots.length > 0) return gitRoots[0] as string;
159
132
  // Nothing carries `.harnery/` yet. Hand back the enclosing checkout so a
160
- // 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
161
134
  // create it.
162
135
  return gitToplevel(start);
163
136
  }
@@ -184,7 +157,7 @@ function ancestorCoordRoots(start: string): string[] {
184
157
  * Does this root's `.harnery/` already know the process asking?
185
158
  *
186
159
  * Two discriminators, both genuinely about *this* session: the adapter-exported
187
- * 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
188
161
  * chain. Deliberately NOT the single-live-agent fallback that owner resolution
189
162
  * ends with — a lone stranger in the wrong root is exactly how `whoami` came to
190
163
  * report another agent's name and task as its own.
@@ -233,7 +206,7 @@ function gitToplevel(start: string): string | null {
233
206
  }
234
207
 
235
208
  function gitRevParse(cwd: string, flag: string): string | null {
236
- const key = `${cwd}${flag}`;
209
+ const key = `${cwd}\0${flag}`;
237
210
  const cached = gitRevParseCache.get(key);
238
211
  if (cached !== undefined) return cached;
239
212
  let value: string | null = null;
@@ -393,22 +366,20 @@ export function resolveOwnerWithSource(): {
393
366
  owner: string | null;
394
367
  source: "env" | "pidmap" | "pidmap_fallback" | "session_env" | "active_singleton" | "none";
395
368
  } {
369
+ const bridge = process.env.HARNERY_AGENT_COORD_BRIDGE?.trim();
396
370
  const envOwner = process.env.HARNERY_AGENT_COORD_OWNER?.trim();
397
- 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) {
398
375
  return { owner: envOwner, source: "env" };
399
376
  }
400
377
 
401
378
  const root = monorepoRoot();
402
379
  if (!root) return { owner: null, source: "none" };
403
380
 
404
- // Every supported adapter exports its session id into the env of the
405
- // subprocess it spawns for a tool call, and each heartbeat records the
406
- // session id it was minted under. Matching the two names us outright, even
407
- // with many live agents, so it goes ahead of the ppid walk rather than
408
- // catching what the walk drops. Cursor needed this first because its
409
- // Glass/Agents UI runs several chats under one node ancestor, making that row
410
- // last-writer-wins; pid recycling generalises the same hazard to every
411
- // 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.
412
383
  if (shouldPreferSessionEnv()) {
413
384
  const bySession = resolveOwnerBySessionEnv(root);
414
385
  if (bySession) {
@@ -416,12 +387,17 @@ export function resolveOwnerWithSource(): {
416
387
  }
417
388
  }
418
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
+
419
395
  if (!existsSync(resolve(root, ".harnery", "pid-map"))) return { owner: null, source: "none" };
420
396
 
421
397
  const byPidmap = resolveOwnerByPidmap(root);
422
398
  if (byPidmap.owner) return byPidmap;
423
399
 
424
- // 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
425
401
  // unambiguously us — resolve to it. This is what lets the bare `agents
426
402
  // status` / `set-task` the stop hook recommends work without a `--session-id`
427
403
  // flag in the common single-agent case. With 0 or 2+ live agents it would be
@@ -490,6 +466,18 @@ const SESSION_ID_ENV_VARS = [
490
466
  ] as const;
491
467
 
492
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
+
493
481
  function sessionIdsFromEnv(): string[] {
494
482
  for (const key of SESSION_ID_ENV_VARS) {
495
483
  const v = process.env[key]?.trim();
@@ -520,7 +508,7 @@ function sessionIdFromEnv(): string | null {
520
508
  * agent's name and file list.
521
509
  *
522
510
  * This only reorders the two. Session-env resolution still requires a live
523
- * 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
524
512
  * exactly as before.
525
513
  */
526
514
  function shouldPreferSessionEnv(): boolean {
@@ -528,160 +516,70 @@ function shouldPreferSessionEnv(): boolean {
528
516
  }
529
517
 
530
518
  /**
531
- * Resolve the owner by matching the adapter session-id env var against the
532
- * `session_id` of a live heartbeat in this coord root. Returns the matching
533
- * `instance_id`, or null if there's no session-id env var or no live heartbeat
534
- * carries it. "Live" reuses the same 10-minute freshness window the singleton
535
- * fallback applies, so a stale heartbeat from a prior session of the same id
536
- * doesn't resolve. When legacy Cursor Glass state contains both the canonical
537
- * bare id and its raw `bc-` alias, candidate order wins first; ties prefer a
538
- * named heartbeat, then the newest heartbeat, with instance id as a stable
539
- * 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.
540
523
  *
541
524
  * Exported for unit testing with an injectable root.
542
525
  */
543
526
  export function resolveOwnerBySessionEnv(root: string): string | null {
544
527
  const sessionIds = sessionIdsFromEnv();
545
528
  if (sessionIds.length === 0) return null;
546
-
547
- const activeDir = resolve(root, ".harnery", "active");
548
- if (!existsSync(activeDir)) return null;
549
- const FRESHNESS_SECS = 600;
550
- const cutoffMs = Date.now() - FRESHNESS_SECS * 1000;
551
- let files: string[];
552
- try {
553
- files = readdirSync(activeDir);
554
- } catch {
555
- return null;
556
- }
557
- const matches: Array<{
558
- instanceId: string;
559
- sessionPreference: number;
560
- hasName: boolean;
561
- lastHeartbeatMs: number;
562
- }> = [];
563
- for (const file of files) {
564
- if (!file.endsWith(".json")) continue;
565
- try {
566
- const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8"));
567
- if (!parsed) continue;
568
- const sessionPreference = sessionIds.indexOf(parsed.session_id);
569
- if (sessionPreference === -1) continue;
570
- if (typeof parsed.instance_id !== "string") continue;
571
- const ts = Date.parse(parsed.last_heartbeat);
572
- if (!Number.isFinite(ts) || ts < cutoffMs) continue;
573
- matches.push({
574
- instanceId: parsed.instance_id,
575
- sessionPreference,
576
- hasName: typeof parsed.name === "string" && parsed.name.trim().length > 0,
577
- lastHeartbeatMs: ts,
578
- });
579
- } catch {
580
- // 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));
581
535
  }
582
536
  }
583
- matches.sort(
584
- (a, b) =>
585
- a.sessionPreference - b.sessionPreference ||
586
- Number(b.hasName) - Number(a.hasName) ||
587
- b.lastHeartbeatMs - a.lastHeartbeatMs ||
588
- a.instanceId.localeCompare(b.instanceId),
589
- );
590
- return matches[0]?.instanceId ?? null;
537
+ return matches.size === 1 ? [...matches][0]! : null;
591
538
  }
592
539
 
593
540
  /**
594
- * Return the instance_id of the sole live agent in this coord root, or null
595
- * if there are zero or more than one. "Live" reuses the 10-minute heartbeat
596
- * freshness window the rest of the agents surface applies (kept inline as a
597
- * 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.
598
543
  *
599
544
  * Exported for unit testing with an injectable root (the caller in
600
545
  * `resolveOwnerWithSource` passes `monorepoRoot()`).
601
546
  */
602
547
  export function resolveSingleActiveOwner(root: string): string | null {
603
- const activeDir = resolve(root, ".harnery", "active");
604
- if (!existsSync(activeDir)) return null;
605
- const FRESHNESS_SECS = 600;
606
- const cutoffMs = Date.now() - FRESHNESS_SECS * 1000;
607
- const live: string[] = [];
608
- let files: string[];
609
- try {
610
- files = readdirSync(activeDir);
611
- } catch {
612
- return null;
613
- }
614
- for (const file of files) {
615
- if (!file.endsWith(".json")) continue;
616
- try {
617
- const parsed = JSON.parse(readFileSync(resolve(activeDir, file), "utf8"));
618
- if (!parsed || typeof parsed.instance_id !== "string") continue;
619
- const ts = Date.parse(parsed.last_heartbeat);
620
- if (Number.isFinite(ts) && ts >= cutoffMs) live.push(parsed.instance_id);
621
- } catch {
622
- // skip malformed
623
- }
624
- if (live.length > 1) return null; // ambiguous; bail early
625
- }
626
- 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;
627
554
  }
628
555
 
629
- /**
630
- * Read and parse a heartbeat file. Returns null if the file is missing,
631
- * unreadable, or contains malformed JSON. Does not throw.
632
- *
633
- * Phase 8 cleanup (2026-05-27): the v1/v2 dual-write bridge is gone; the
634
- * projector writes additively-merged heartbeats directly to
635
- * `.harnery/active/<id>.json` (the canonical location every reader expects).
636
- */
637
- export function readHeartbeat(instanceId: string): Heartbeat | null {
638
- if (!isSafeInstanceId(instanceId)) return null;
639
- const root = monorepoRoot();
640
- if (!root) return null;
641
- const path = resolveContainedFile(resolve(root, ".harnery", "active"), `${instanceId}.json`);
642
- 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"];
643
560
  }
644
561
 
645
- function readJsonHeartbeatFile(path: string): Heartbeat | null {
646
- if (!existsSync(path)) return null;
562
+ function nativeOwnerForV3Instance(root: string, instanceId: string): string {
563
+ const activeDir = resolve(root, ".harnery", "active");
647
564
  try {
648
- const raw = readFileSync(path, "utf8");
649
- const parsed = JSON.parse(raw);
650
- if (parsed && typeof parsed === "object" && typeof parsed.instance_id === "string") {
651
- 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
+ }
652
578
  }
653
- return null;
654
579
  } catch {
655
- return null;
580
+ // The producer state remains authoritative; fall through to the canonical label.
656
581
  }
657
- }
658
-
659
- /**
660
- * Render the display form for an instance_id: `agent-<Name>` if the heartbeat
661
- * carries a non-empty `.name`, else `agent-<8-char-hex-prefix>`.
662
- *
663
- * Hex fallback handles three cases cleanly:
664
- * - heartbeat written before this feature shipped (no `name` field)
665
- * - heartbeat pruned but instance_id still appears in older log lines
666
- * - the narrow window between instance_id resolution and heartbeat read
667
- */
668
- export function displayName(instanceId: string): string {
669
- if (!instanceId) return "agent-unknown";
670
- const hb = readHeartbeat(instanceId);
671
- if (hb && typeof hb.name === "string" && hb.name.length > 0) {
672
- return `agent-${hb.name}`;
673
- }
674
- return `agent-${instanceId.slice(0, 8)}`;
675
- }
676
-
677
- /**
678
- * Convenience: resolve self via ppid walk, then render. Returns
679
- * `agent-unknown` when the walk fails.
680
- */
681
- export function selfDisplayName(): string {
682
- const owner = resolveOwner();
683
- if (!owner) return "agent-unknown";
684
- return displayName(owner);
582
+ return instanceId.startsWith("inst_") ? instanceId.slice(5) : instanceId;
685
583
  }
686
584
 
687
585
  function readPpid(pid: number): number | null {