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
@@ -1,16 +1,9 @@
1
1
  /**
2
2
  * agent-hooks library exports.
3
3
  *
4
- * Phase 1 (skeleton): exposes only the canonical event schema types. Parsers,
5
- * resolvers, and emit helpers ship in Phase 2.
4
+ * Public hook types for the canonical V3 ledger.
6
5
  */
7
6
 
8
- export {
9
- type Adapter,
10
- type Event,
11
- type EventEnvelope,
12
- type EventType,
13
- type RedactionMarker,
14
- SCHEMA_VERSION,
15
- type Source,
16
- } from "./events/schema.ts";
7
+ export type { Adapter } from "../adapter.ts";
8
+ export type { EventV3 as Event } from "../events/v3/contract.ts";
9
+ export { EventV3Schema } from "../events/v3/contract.ts";
@@ -7,7 +7,7 @@ import { resolveCoordRoot } from "../../agents/coord-client.ts";
7
7
  * different roots. They used to: this walked up from `CLAUDE_PROJECT_DIR` or
8
8
  * cwd while the CLI's `monorepoRoot()` asked git for the superproject first, so
9
9
  * with a shell inside a submodule that carries its own `.harnery/`, the CLI's
10
- * `state.status_checked` landed in a stream this side never read and rule 1/3
10
+ * `coord.status_observed` landed in a stream this side never read and rule 1/3
11
11
  * blocked every turn.
12
12
  *
13
13
  * Resolution precedence (see `resolveCoordRoot` for the full rationale):
@@ -2,6 +2,8 @@ import { spawnSync } from "node:child_process";
2
2
  import { existsSync, readdirSync, readFileSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  import { coordEnv } from "../../../lib/env.ts";
5
+ import { resolveOwnerBySessionEnv } from "../../agents/coord-client.ts";
6
+ import { readLiveCoordinationRow } from "../../agents/state/live-coordination-view.ts";
5
7
  import { checkPidToken } from "../../agents/state/proc-start.ts";
6
8
 
7
9
  /**
@@ -9,20 +11,21 @@ import { checkPidToken } from "../../agents/state/proc-start.ts";
9
11
  *
10
12
  * Precedence:
11
13
  *
12
- * 1. `HARNERY_AGENT_COORD_OWNER` env var. Set by adapter adapters when they know
13
- * the owner identity at spawn time (Codex's apply_patch tool path uses
14
- * this).
15
- * 2. Hook payload fields, in order: `agent_id` → `subagent_id` →
16
- * `session_id` → `conversation_id`. agent_id wins for CC subagent
17
- * events; session_id is the parent-shape default.
18
- * 3. PID-map lookup at `.harnery/pid-map/<pid>` for our own pid, then ppid
14
+ * 1. Hook payload fields. Current live V3 authority breaks ties: a live
15
+ * child wins when it belongs to the payload session, otherwise the live
16
+ * session/conversation wins over a stale adapter `agent_id`. With no live
17
+ * evidence, the legacy `agent_id` → `subagent_id` → `session_id` →
18
+ * `conversation_id` order remains the startup fallback.
19
+ * 2. `HARNERY_AGENT_COORD_OWNER` outside bridge mode. Bridge-marked children
20
+ * ignore this unvalidated override.
21
+ * 3. Adapter-exported session identity matched to one live V3 generation.
22
+ * This is the only payload-free identity accepted in bridge mode.
23
+ * 4. PID-map lookup at `.harnery/pid-map/<pid>` for our own pid, then ppid
19
24
  * chain (up to 20 hops).
20
- * 4. `CODEX_THREAD_ID` env var, accepted only when a live heartbeat by that
21
- * id exists under `.harnery/active/`. Codex sessions use their thread id
22
- * as the heartbeat instance_id, and a Windows→WSL bridge forwards the
23
- * var into process trees that descend from no registered process — the
24
- * one place the pid walk can never land. Validated so a garbage value
25
- * cannot fabricate an identity.
25
+ *
26
+ * Bridge-marked children fail closed after tier 3. A connector crosses a
27
+ * process-tree boundary, so pid ancestry and singleton state are not evidence
28
+ * of its logical session.
26
29
  *
27
30
  * Returns null when nothing resolves. Callers must treat null as "no owner"
28
31
  * and skip the event (Phase 2 fail-safe; Phase 3 will mint a temporary owner
@@ -33,22 +36,46 @@ export function resolveOwner(opts: {
33
36
  coordRoot: string;
34
37
  }): {
35
38
  instance_id: string;
36
- source: "env" | "payload" | "pidmap-self" | "pidmap-ancestor" | "codex-env";
39
+ source: "env" | "payload" | "session_env" | "pidmap-self" | "pidmap-ancestor";
37
40
  } | null {
38
- const env = coordEnv("AGENT_COORD_OWNER");
39
- if (env && env.length > 0) {
40
- return { instance_id: env, source: "env" };
41
- }
42
-
43
41
  if (opts.payload) {
42
+ const value = (key: "agent_id" | "subagent_id" | "session_id" | "conversation_id") => {
43
+ const candidate = opts.payload?.[key];
44
+ return typeof candidate === "string" && candidate.length > 0 ? candidate : undefined;
45
+ };
46
+ const childId = value("subagent_id") ?? value("agent_id");
47
+ const sessionId = value("session_id") ?? value("conversation_id");
48
+ const child = childId ? readLiveCoordinationRow(opts.coordRoot, childId) : null;
49
+ const session = sessionId ? readLiveCoordinationRow(opts.coordRoot, sessionId) : null;
50
+
51
+ if (child && sessionId && (child.kind === "subagent" || child.session_id === sessionId)) {
52
+ return { instance_id: childId!, source: "payload" };
53
+ }
54
+ if (session) return { instance_id: sessionId!, source: "payload" };
55
+ if (child) return { instance_id: childId!, source: "payload" };
56
+
44
57
  for (const key of ["agent_id", "subagent_id", "session_id", "conversation_id"] as const) {
45
- const v = opts.payload[key];
46
- if (typeof v === "string" && v.length > 0) {
47
- return { instance_id: v, source: "payload" };
48
- }
58
+ const candidate = value(key);
59
+ if (candidate) return { instance_id: candidate, source: "payload" };
49
60
  }
50
61
  }
51
62
 
63
+ const bridge = coordEnv("AGENT_COORD_BRIDGE")?.trim();
64
+ const env = coordEnv("AGENT_COORD_OWNER");
65
+ if (env && env.length > 0 && !bridge) {
66
+ return { instance_id: env, source: "env" };
67
+ }
68
+
69
+ // A Windows-hosted Codex task can replace its WSL process tree during a
70
+ // repository refresh. The forwarded native thread id survives that boundary
71
+ // and is safe only after joining to exactly one nonterminal V3 producer.
72
+ // Resolve it before the bridge fail-closed branch; never fall through to the
73
+ // old pid map when the join fails.
74
+ const sessionOwner = resolveOwnerBySessionEnv(opts.coordRoot);
75
+ if (sessionOwner) return { instance_id: sessionOwner, source: "session_env" };
76
+
77
+ if (bridge) return null;
78
+
52
79
  // Pid-map ancestor walk. Start at own pid (the bash wrapper's bun child),
53
80
  // walk up through ppids. The pid-map is stamped keyed by the adapter PID, so
54
81
  // we'll usually find it 1-3 hops up.
@@ -85,18 +112,6 @@ export function resolveOwner(opts: {
85
112
  }
86
113
  }
87
114
 
88
- // Tier 4: Codex thread id, heartbeat-validated. Last because the pid map is
89
- // more specific when it answers — an inherited env var can outlive the
90
- // process tree it described, a live pid-map row cannot.
91
- const codexThreadId = process.env.CODEX_THREAD_ID?.trim();
92
- if (
93
- codexThreadId &&
94
- /^[A-Za-z0-9-]+$/.test(codexThreadId) &&
95
- existsSync(join(opts.coordRoot, ".harnery", "active", `${codexThreadId}.json`))
96
- ) {
97
- return { instance_id: codexThreadId, source: "codex-env" };
98
- }
99
-
100
115
  return null;
101
116
  }
102
117
 
@@ -143,17 +158,9 @@ export function readShellMarker(coordRoot: string, pid: number): string | null {
143
158
  }
144
159
  }
145
160
 
146
- /** Read the heartbeat-recorded `agent_id` for an owner if it exists. */
161
+ /** Read the V3-projected `agent_id` for an owner if it exists. */
147
162
  export function readAgentIdForOwner(coordRoot: string, instanceId: string): string | null {
148
- const path = join(coordRoot, ".harnery", "active", `${instanceId}.json`);
149
- if (!existsSync(path)) return null;
150
- try {
151
- const body = readFileSync(path, "utf8");
152
- const data = JSON.parse(body) as { agent_id?: string };
153
- return data.agent_id ?? null;
154
- } catch {
155
- return null;
156
- }
163
+ return readLiveCoordinationRow(coordRoot, instanceId)?.agent_id ?? null;
157
164
  }
158
165
 
159
166
  /** Diagnostic: list of pid-map entries (for debugging). */
@@ -3,7 +3,7 @@ import { basename, dirname, join } from "node:path";
3
3
 
4
4
  /**
5
5
  * Scan a CC-style JSONL transcript for the `┌─ agent-` status-box prefix in
6
- * the most-recent assistant turn. Used by `turn.stop` events to populate
6
+ * the most-recent assistant turn. Used by `turn.completed` events to populate
7
7
  * `status_box_present`.
8
8
  *
9
9
  * Cheap by default: caps the read at 256KB tailed from the file, since the
@@ -13,8 +13,9 @@ import { basename, dirname, join } from "node:path";
13
13
  * and Phase 5 verdict path catches the race via a single retry.
14
14
  */
15
15
  export function scanStatusBoxPresent(transcriptPath: string | undefined): boolean {
16
- if (!transcriptPath || !existsSync(transcriptPath)) return false;
17
- const text = tailText(transcriptPath);
16
+ const readablePath = resolveTranscriptPath(transcriptPath);
17
+ if (!readablePath) return false;
18
+ const text = tailText(readablePath);
18
19
  if (text === undefined) return false;
19
20
  // The box is rendered as a text content block by the assistant; we look
20
21
  // for the prefix on any line of the trailing window.
@@ -23,7 +24,7 @@ export function scanStatusBoxPresent(transcriptPath: string | undefined): boolea
23
24
 
24
25
  /**
25
26
  * Scan a CC-style JSONL transcript for a needle in ASSISTANT message text
26
- * blocks only. Used by `turn.stop` to detect the suggested session name in the
27
+ * blocks only. Used by `turn.completed` to detect the suggested session name in the
27
28
  * reply.
28
29
  *
29
30
  * The row filter is load-bearing: the transcript tail also carries the needle
@@ -39,8 +40,10 @@ export function scanAssistantTextIncludes(
39
40
  transcriptPath: string | undefined,
40
41
  needle: string,
41
42
  ): boolean {
42
- if (!transcriptPath || !needle || !existsSync(transcriptPath)) return false;
43
- const text = tailText(transcriptPath);
43
+ if (!needle) return false;
44
+ const readablePath = resolveTranscriptPath(transcriptPath);
45
+ if (!readablePath) return false;
46
+ const text = tailText(readablePath);
44
47
  if (!text) return false;
45
48
  for (const line of text.split("\n")) {
46
49
  // Cheap gate before parsing: most lines don't contain the needle at all.
@@ -71,11 +74,156 @@ export function scanAssistantTextIncludes(
71
74
  return false;
72
75
  }
73
76
 
77
+ /** Most recent user-visible assistant text across Claude Code and Codex JSONL. */
78
+ export function scanLatestAssistantText(transcriptPath: string | undefined): string | undefined {
79
+ const readablePath = resolveTranscriptPath(transcriptPath);
80
+ if (!readablePath) return undefined;
81
+ const text = tailText(readablePath);
82
+ if (!text) return undefined;
83
+ const lines = text.split("\n");
84
+ for (let i = lines.length - 1; i >= 0; i--) {
85
+ const row = parseTranscriptRow(lines[i]);
86
+ if (!row) continue;
87
+ const assistantText = assistantTextFromRow(row);
88
+ // Claude Code appends the current tool_use-only assistant row before
89
+ // PreToolUse fires. Skip rows with no user-visible text so the immediately
90
+ // preceding fenced block remains discoverable.
91
+ if (assistantText !== null && assistantText.trim().length > 0) return assistantText;
92
+ }
93
+ return undefined;
94
+ }
95
+
96
+ /**
97
+ * Verify that the first assistant message after the set-task result begins
98
+ * with the exact session-name block. This is the Stop-time fallback for a
99
+ * correctly displayed name followed by no further tool call. A name printed
100
+ * after later work does not pass.
101
+ */
102
+ export function scanSessionNameDisplayedImmediately(
103
+ transcriptPath: string | undefined,
104
+ name: string,
105
+ startsWithBlock: (text: string, expectedName: string) => boolean,
106
+ ): boolean {
107
+ return (
108
+ inspectSessionNameDisplayImmediately(transcriptPath, name, startsWithBlock).state === "present"
109
+ );
110
+ }
111
+
112
+ export type SessionNameDisplayInspection =
113
+ | { state: "present" }
114
+ | { state: "absent" }
115
+ | { state: "unavailable"; reason: "missing_transcript" | "transcript_not_ready" };
116
+
117
+ /**
118
+ * Inspect the ordered post-mint reply without conflating a malformed display
119
+ * with an unreadable transcript. PreToolUse can enforce the former, while the
120
+ * latter must remain an honest unsupported observation instead of deadlocking
121
+ * every tool behind evidence the adapter has not persisted yet.
122
+ */
123
+ export function inspectSessionNameDisplayImmediately(
124
+ transcriptPath: string | undefined,
125
+ name: string,
126
+ startsWithBlock: (text: string, expectedName: string) => boolean,
127
+ ): SessionNameDisplayInspection {
128
+ if (!name) return { state: "absent" };
129
+ const readablePath = resolveTranscriptPath(transcriptPath);
130
+ if (!readablePath) return { state: "unavailable", reason: "missing_transcript" };
131
+ const text = tailText(readablePath);
132
+ if (!text) return { state: "unavailable", reason: "transcript_not_ready" };
133
+ let sawMintResult = false;
134
+ for (const line of text.split("\n")) {
135
+ if (!sawMintResult) {
136
+ if (line.includes(name) && line.includes("suggested_session_name")) sawMintResult = true;
137
+ continue;
138
+ }
139
+ const row = parseTranscriptRow(line);
140
+ if (!row) continue;
141
+ const assistantText = assistantTextFromRow(row);
142
+ if (assistantText !== null) {
143
+ return { state: startsWithBlock(assistantText, name) ? "present" : "absent" };
144
+ }
145
+ }
146
+ return sawMintResult
147
+ ? { state: "unavailable", reason: "transcript_not_ready" }
148
+ : { state: "absent" };
149
+ }
150
+
151
+ /**
152
+ * Resolve a transcript path at the adapter boundary. Windows-native Codex can
153
+ * send `C:\...` while the managed hook executes inside WSL, where the same
154
+ * file is mounted at `/mnt/c/...`.
155
+ */
156
+ export function transcriptPathCandidates(transcriptPath: string | undefined): string[] {
157
+ if (!transcriptPath) return [];
158
+ const candidates = [transcriptPath];
159
+ const windowsDrive = /^([A-Za-z]):[\\/](.*)$/.exec(transcriptPath);
160
+ if (windowsDrive) {
161
+ candidates.push(
162
+ `/mnt/${windowsDrive[1]!.toLowerCase()}/${windowsDrive[2]!.replaceAll("\\", "/")}`,
163
+ );
164
+ }
165
+ return [...new Set(candidates)];
166
+ }
167
+
168
+ function resolveTranscriptPath(transcriptPath: string | undefined): string | undefined {
169
+ return transcriptPathCandidates(transcriptPath).find((candidate) => existsSync(candidate));
170
+ }
171
+
172
+ function parseTranscriptRow(line: string | undefined): Record<string, unknown> | null {
173
+ if (!line?.trim()) return null;
174
+ try {
175
+ const row = JSON.parse(line) as unknown;
176
+ return typeof row === "object" && row !== null ? (row as Record<string, unknown>) : null;
177
+ } catch {
178
+ return null;
179
+ }
180
+ }
181
+
182
+ /** null means this row is not an assistant message; an empty string is one with no text. */
183
+ function assistantTextFromRow(row: Record<string, unknown>): string | null {
184
+ if (row.type === "assistant") {
185
+ const message = objectValue(row.message);
186
+ return textFromContent(message?.content);
187
+ }
188
+
189
+ if (row.type === "response_item") {
190
+ const payload = objectValue(row.payload);
191
+ if (payload?.type !== "message" || payload.role !== "assistant") return null;
192
+ return textFromContent(payload.content);
193
+ }
194
+
195
+ if (row.type === "event_msg") {
196
+ const payload = objectValue(row.payload);
197
+ if (payload?.type !== "agent_message") return null;
198
+ return typeof payload.message === "string" ? payload.message : "";
199
+ }
200
+
201
+ return null;
202
+ }
203
+
204
+ function objectValue(value: unknown): Record<string, unknown> | null {
205
+ return typeof value === "object" && value !== null ? (value as Record<string, unknown>) : null;
206
+ }
207
+
208
+ function textFromContent(content: unknown): string {
209
+ if (typeof content === "string") return content;
210
+ if (!Array.isArray(content)) return "";
211
+ const parts: string[] = [];
212
+ for (const block of content) {
213
+ const value = objectValue(block);
214
+ if (!value) continue;
215
+ if ((value.type === "text" || value.type === "output_text") && typeof value.text === "string") {
216
+ parts.push(value.text);
217
+ }
218
+ }
219
+ return parts.join("\n");
220
+ }
221
+
74
222
  /**
75
223
  * Resolve the agent's model from a CC-style JSONL transcript by reading the
76
224
  * most-recent assistant message's `message.model`. Claude Code's SessionStart
77
225
  * payload omits `model` (Codex + Cursor supply it directly), so this is the
78
- * fallback that lets `session.start` / `turn.stop` populate the heartbeat's
226
+ * fallback that lets `session.started` / `turn.completed` populate the cache's
79
227
  * model field once the transcript has at least one assistant turn.
80
228
  *
81
229
  * Tail-reads the same 256KB window as the status-box scan and walks lines from
@@ -84,8 +232,9 @@ export function scanAssistantTextIncludes(
84
232
  * transcript is missing/empty (e.g. a fresh session's first SessionStart).
85
233
  */
86
234
  export function scanTranscriptModel(transcriptPath: string | undefined): string | undefined {
87
- if (!transcriptPath || !existsSync(transcriptPath)) return undefined;
88
- const text = tailText(transcriptPath);
235
+ const readablePath = resolveTranscriptPath(transcriptPath);
236
+ if (!readablePath) return undefined;
237
+ const text = tailText(readablePath);
89
238
  if (!text) return undefined;
90
239
  const lines = text.split("\n");
91
240
  for (let i = lines.length - 1; i >= 0; i--) {
@@ -146,15 +295,17 @@ export function detectForkParent(
146
295
  sessionId: string,
147
296
  ): string | undefined {
148
297
  try {
149
- if (!transcriptPath || !sessionId || !existsSync(transcriptPath)) return undefined;
150
- if (statSync(transcriptPath).size > FORK_SCAN_MAX_BYTES) return undefined;
151
- const own = readFileSync(transcriptPath, "utf8");
298
+ if (!sessionId) return undefined;
299
+ const readablePath = resolveTranscriptPath(transcriptPath);
300
+ if (!readablePath) return undefined;
301
+ if (statSync(readablePath).size > FORK_SCAN_MAX_BYTES) return undefined;
302
+ const own = readFileSync(readablePath, "utf8");
152
303
  const uuids = messageUuids(own);
153
304
  if (uuids.length === 0) return undefined;
154
305
  const sample = sampleEvenly(uuids, FORK_SAMPLE_SIZE);
155
306
 
156
- const dir = dirname(transcriptPath);
157
- const ownFile = basename(transcriptPath);
307
+ const dir = dirname(readablePath);
308
+ const ownFile = basename(readablePath);
158
309
  let best: { id: string; score: number; rows: number; mtimeMs: number } | null = null;
159
310
  for (const file of readdirSync(dir)) {
160
311
  if (file === ownFile || !SESSION_FILE_RE.test(file)) continue;
@@ -1,18 +1,17 @@
1
1
  /**
2
- * Session-name presence for `turn.stop`.
2
+ * Session-name presence for `turn.completed`.
3
3
  *
4
- * While the heartbeat carries a `suggested_session_name`, report whether the
5
- * naming ritual is satisfied: either this turn's reply shows the name, or an
6
- * earlier reply already did. Scanning covers assistant text blocks only (the
7
- * raw transcript tail also carries the name inside the set-task tool_result,
8
- * which must not count) plus the adapter-supplied last assistant message, for
9
- * stops that arrive without a transcript.
4
+ * While the current V3 coordination row carries a `suggested_session_name`, report whether the
5
+ * naming ritual is satisfied: either the immediate post-mint assistant text
6
+ * showed the exact block, or an earlier PreToolUse already stamped it. The
7
+ * transcript callback must enforce ordering and block shape; a late final
8
+ * answer or a tool result must not count.
10
9
  *
11
10
  * Two properties the stop-hook naming rule depends on:
12
11
  *
13
12
  * 1. Once a name is satisfied, every later stop keeps reporting `true` rather
14
- * than omitting the field. The rule wants an in-window `turn.stop` carrying
15
- * `session_name_present: true`; omitting it after the heartbeat stamp meant
13
+ * than omitting the field. The rule wants an in-window `turn.completed` carrying
14
+ * `session_name_present: true`; omitting it after the coordination stamp meant
16
15
  * nothing could ever re-emit the flag, so every subsequent reply blocked --
17
16
  * including the replies reproducing the exact name the rule asked for.
18
17
  * 2. The result names WHICH suggested name it covered, so a projector rebuild
@@ -23,7 +22,8 @@
23
22
  * Never throws: coordination telemetry must not take down a hook.
24
23
  */
25
24
 
26
- import { readHeartbeat, stampSessionNameSeen } from "../agents/state/heartbeat-writer.ts";
25
+ import { stampSessionNameSeen } from "../agents/state/heartbeat-writer.ts";
26
+ import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.ts";
27
27
 
28
28
  export interface SessionNamePresence {
29
29
  session_name_present?: boolean;
@@ -33,17 +33,16 @@ export interface SessionNamePresence {
33
33
  export function sessionNamePresence(
34
34
  coordRoot: string,
35
35
  instanceId: string,
36
- lastAssistantMessage: string,
37
36
  scanAssistantText: (name: string) => boolean,
38
37
  ): SessionNamePresence {
39
38
  try {
40
- const hb = readHeartbeat(coordRoot, instanceId);
41
- const name = hb?.suggested_session_name;
39
+ const row = readLiveCoordinationRow(coordRoot, instanceId);
40
+ const name = row?.suggested_session_name;
42
41
  if (!name) return {};
43
- if (hb?.session_name_seen_for === name) {
42
+ if (row?.session_name_seen_for === name) {
44
43
  return { session_name_present: true, session_name_present_for: name };
45
44
  }
46
- const present = scanAssistantText(name) || lastAssistantMessage.includes(name);
45
+ const present = scanAssistantText(name);
47
46
  if (present) stampSessionNameSeen(coordRoot, instanceId, name);
48
47
  return { session_name_present: present, session_name_present_for: name };
49
48
  } catch {
@@ -1,5 +1,5 @@
1
+ import type { Adapter } from "../adapter.ts";
1
2
  import { isWslUncPath } from "./codex-wsl-bridge.ts";
2
- import type { Adapter } from "./events/schema.ts";
3
3
 
4
4
  export interface CrossShellInspection {
5
5
  adapter: Adapter;
@@ -13,10 +13,13 @@ import { resolveMachineLabel } from "../../lib/machine.ts";
13
13
  import {
14
14
  assertSafeInstanceId,
15
15
  monorepoRoot,
16
- readHeartbeat,
17
16
  resolveContainedFile,
18
17
  resolveOwner,
19
18
  } from "../agents/index.ts";
19
+ import {
20
+ readLiveCoordinationRow,
21
+ readLiveCoordinationRows,
22
+ } from "../agents/state/live-coordination-view.ts";
20
23
 
21
24
  /**
22
25
  * Agent journal: per-agent markdown journal at `.harnery/journal/<instance_id>.md`.
@@ -313,7 +316,8 @@ export function appendEntry(
313
316
  category: JournalCategory,
314
317
  body: string,
315
318
  ): JournalDoc {
316
- const hb = readHeartbeat(instanceId);
319
+ const root = monorepoRoot();
320
+ const hb = root ? readLiveCoordinationRow(root, instanceId) : null;
317
321
  const path = journalPath(instanceId);
318
322
  let doc: JournalDoc;
319
323
  if (existsSync(path)) {
@@ -412,14 +416,15 @@ export function pruneArchives(days = ARCHIVE_RETENTION_DAYS): number {
412
416
  return deleted;
413
417
  }
414
418
 
415
- /** Sweep `.harnery/journal/<owner>.md` files whose corresponding heartbeat is gone. */
419
+ /** Sweep journals whose corresponding authoritative V3 generation is gone. */
416
420
  export function sweepOrphanJournals(): string[] {
417
421
  const dir = journalDir();
422
+ const root = monorepoRoot();
418
423
  const archived: string[] = [];
419
424
  for (const f of readdirSync(dir)) {
420
425
  if (!f.endsWith(".md")) continue;
421
426
  const instanceId = f.replace(/\.md$/, "");
422
- const hb = readHeartbeat(instanceId);
427
+ const hb = root ? readLiveCoordinationRow(root, instanceId) : null;
423
428
  if (!hb) {
424
429
  const dest = archiveJournal(instanceId);
425
430
  if (dest) archived.push(dest);
@@ -463,25 +468,13 @@ export function loadJournal(instanceId: string): JournalDoc | null {
463
468
  return parseJournal(path, readFileSync(path, "utf8"));
464
469
  }
465
470
 
466
- /** Resolve an agent name → instance_id by walking active heartbeats (case-insensitive). */
471
+ /** Resolve an agent name through the authority-safe V3 coordination projection. */
467
472
  export function resolveOwnerByName(name: string): string | null {
468
473
  const root = monorepoRoot();
469
474
  if (!root) return null;
470
- const activeDir = resolve(root, ".harnery", "active");
471
- if (!existsSync(activeDir)) return null;
472
- for (const f of readdirSync(activeDir)) {
473
- if (!f.endsWith(".json")) continue;
474
- try {
475
- const hb = JSON.parse(readFileSync(resolve(activeDir, f), "utf8")) as {
476
- instance_id?: string;
477
- name?: string;
478
- };
479
- if ((hb.name ?? "").toLowerCase() === name.toLowerCase()) {
480
- return hb.instance_id ?? null;
481
- }
482
- } catch {
483
- // skip
484
- }
485
- }
486
- return null;
475
+ return (
476
+ readLiveCoordinationRows(root).find(
477
+ (row) => (row.name ?? "").toLowerCase() === name.toLowerCase(),
478
+ )?.instance_id ?? null
479
+ );
487
480
  }