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,7 +1,6 @@
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
- export { SCHEMA_VERSION, } from "./events/schema.js";
6
+ export { EventV3Schema } from "../events/v3/contract.js";
@@ -5,7 +5,7 @@
5
5
  * different roots. They used to: this walked up from `CLAUDE_PROJECT_DIR` or
6
6
  * cwd while the CLI's `monorepoRoot()` asked git for the superproject first, so
7
7
  * with a shell inside a submodule that carries its own `.harnery/`, the CLI's
8
- * `state.status_checked` landed in a stream this side never read and rule 1/3
8
+ * `coord.status_observed` landed in a stream this side never read and rule 1/3
9
9
  * blocked every turn.
10
10
  *
11
11
  * Resolution precedence (see `resolveCoordRoot` for the full rationale):
@@ -6,7 +6,7 @@ import { resolveCoordRoot } from "../../agents/coord-client.js";
6
6
  * different roots. They used to: this walked up from `CLAUDE_PROJECT_DIR` or
7
7
  * cwd while the CLI's `monorepoRoot()` asked git for the superproject first, so
8
8
  * with a shell inside a submodule that carries its own `.harnery/`, the CLI's
9
- * `state.status_checked` landed in a stream this side never read and rule 1/3
9
+ * `coord.status_observed` landed in a stream this side never read and rule 1/3
10
10
  * blocked every turn.
11
11
  *
12
12
  * Resolution precedence (see `resolveCoordRoot` for the full rationale):
@@ -3,20 +3,21 @@
3
3
  *
4
4
  * Precedence:
5
5
  *
6
- * 1. `HARNERY_AGENT_COORD_OWNER` env var. Set by adapter adapters when they know
7
- * the owner identity at spawn time (Codex's apply_patch tool path uses
8
- * this).
9
- * 2. Hook payload fields, in order: `agent_id` → `subagent_id` →
10
- * `session_id` → `conversation_id`. agent_id wins for CC subagent
11
- * events; session_id is the parent-shape default.
12
- * 3. PID-map lookup at `.harnery/pid-map/<pid>` for our own pid, then ppid
6
+ * 1. Hook payload fields. Current live V3 authority breaks ties: a live
7
+ * child wins when it belongs to the payload session, otherwise the live
8
+ * session/conversation wins over a stale adapter `agent_id`. With no live
9
+ * evidence, the legacy `agent_id` → `subagent_id` → `session_id` →
10
+ * `conversation_id` order remains the startup fallback.
11
+ * 2. `HARNERY_AGENT_COORD_OWNER` outside bridge mode. Bridge-marked children
12
+ * ignore this unvalidated override.
13
+ * 3. Adapter-exported session identity matched to one live V3 generation.
14
+ * This is the only payload-free identity accepted in bridge mode.
15
+ * 4. PID-map lookup at `.harnery/pid-map/<pid>` for our own pid, then ppid
13
16
  * chain (up to 20 hops).
14
- * 4. `CODEX_THREAD_ID` env var, accepted only when a live heartbeat by that
15
- * id exists under `.harnery/active/`. Codex sessions use their thread id
16
- * as the heartbeat instance_id, and a Windows→WSL bridge forwards the
17
- * var into process trees that descend from no registered process — the
18
- * one place the pid walk can never land. Validated so a garbage value
19
- * cannot fabricate an identity.
17
+ *
18
+ * Bridge-marked children fail closed after tier 3. A connector crosses a
19
+ * process-tree boundary, so pid ancestry and singleton state are not evidence
20
+ * of its logical session.
20
21
  *
21
22
  * Returns null when nothing resolves. Callers must treat null as "no owner"
22
23
  * and skip the event (Phase 2 fail-safe; Phase 3 will mint a temporary owner
@@ -27,7 +28,7 @@ export declare function resolveOwner(opts: {
27
28
  coordRoot: string;
28
29
  }): {
29
30
  instance_id: string;
30
- source: "env" | "payload" | "pidmap-self" | "pidmap-ancestor" | "codex-env";
31
+ source: "env" | "payload" | "session_env" | "pidmap-self" | "pidmap-ancestor";
31
32
  } | null;
32
33
  /**
33
34
  * Find the parent owner for a subagent invocation. The per-shell marker at
@@ -38,7 +39,7 @@ export declare function resolveOwner(opts: {
38
39
  * cases. Phase 2 callers can pass through.
39
40
  */
40
41
  export declare function readShellMarker(coordRoot: string, pid: number): string | null;
41
- /** Read the heartbeat-recorded `agent_id` for an owner if it exists. */
42
+ /** Read the V3-projected `agent_id` for an owner if it exists. */
42
43
  export declare function readAgentIdForOwner(coordRoot: string, instanceId: string): string | null;
43
44
  /** Diagnostic: list of pid-map entries (for debugging). */
44
45
  export declare function listPidmap(coordRoot: string): Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/owner.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,aAAa,GAAG,iBAAiB,GAAG,WAAW,CAAC;CAC7E,GAAG,IAAI,CAgEP;AA2BD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUxF;AAED,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBnF"}
1
+ {"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/owner.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,GAAG,iBAAiB,CAAC;CAC/E,GAAG,IAAI,CA4EP;AA2BD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAExF;AAED,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBnF"}
@@ -2,44 +2,72 @@ 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.js";
5
+ import { resolveOwnerBySessionEnv } from "../../agents/coord-client.js";
6
+ import { readLiveCoordinationRow } from "../../agents/state/live-coordination-view.js";
5
7
  import { checkPidToken } from "../../agents/state/proc-start.js";
6
8
  /**
7
9
  * Resolve the canonical `instance_id` for the current hook invocation.
8
10
  *
9
11
  * Precedence:
10
12
  *
11
- * 1. `HARNERY_AGENT_COORD_OWNER` env var. Set by adapter adapters when they know
12
- * the owner identity at spawn time (Codex's apply_patch tool path uses
13
- * this).
14
- * 2. Hook payload fields, in order: `agent_id` → `subagent_id` →
15
- * `session_id` → `conversation_id`. agent_id wins for CC subagent
16
- * events; session_id is the parent-shape default.
17
- * 3. PID-map lookup at `.harnery/pid-map/<pid>` for our own pid, then ppid
13
+ * 1. Hook payload fields. Current live V3 authority breaks ties: a live
14
+ * child wins when it belongs to the payload session, otherwise the live
15
+ * session/conversation wins over a stale adapter `agent_id`. With no live
16
+ * evidence, the legacy `agent_id` → `subagent_id` → `session_id` →
17
+ * `conversation_id` order remains the startup fallback.
18
+ * 2. `HARNERY_AGENT_COORD_OWNER` outside bridge mode. Bridge-marked children
19
+ * ignore this unvalidated override.
20
+ * 3. Adapter-exported session identity matched to one live V3 generation.
21
+ * This is the only payload-free identity accepted in bridge mode.
22
+ * 4. PID-map lookup at `.harnery/pid-map/<pid>` for our own pid, then ppid
18
23
  * chain (up to 20 hops).
19
- * 4. `CODEX_THREAD_ID` env var, accepted only when a live heartbeat by that
20
- * id exists under `.harnery/active/`. Codex sessions use their thread id
21
- * as the heartbeat instance_id, and a Windows→WSL bridge forwards the
22
- * var into process trees that descend from no registered process — the
23
- * one place the pid walk can never land. Validated so a garbage value
24
- * cannot fabricate an identity.
24
+ *
25
+ * Bridge-marked children fail closed after tier 3. A connector crosses a
26
+ * process-tree boundary, so pid ancestry and singleton state are not evidence
27
+ * of its logical session.
25
28
  *
26
29
  * Returns null when nothing resolves. Callers must treat null as "no owner"
27
30
  * and skip the event (Phase 2 fail-safe; Phase 3 will mint a temporary owner
28
31
  * for orphan events).
29
32
  */
30
33
  export function resolveOwner(opts) {
31
- const env = coordEnv("AGENT_COORD_OWNER");
32
- if (env && env.length > 0) {
33
- return { instance_id: env, source: "env" };
34
- }
35
34
  if (opts.payload) {
35
+ const value = (key) => {
36
+ const candidate = opts.payload?.[key];
37
+ return typeof candidate === "string" && candidate.length > 0 ? candidate : undefined;
38
+ };
39
+ const childId = value("subagent_id") ?? value("agent_id");
40
+ const sessionId = value("session_id") ?? value("conversation_id");
41
+ const child = childId ? readLiveCoordinationRow(opts.coordRoot, childId) : null;
42
+ const session = sessionId ? readLiveCoordinationRow(opts.coordRoot, sessionId) : null;
43
+ if (child && sessionId && (child.kind === "subagent" || child.session_id === sessionId)) {
44
+ return { instance_id: childId, source: "payload" };
45
+ }
46
+ if (session)
47
+ return { instance_id: sessionId, source: "payload" };
48
+ if (child)
49
+ return { instance_id: childId, source: "payload" };
36
50
  for (const key of ["agent_id", "subagent_id", "session_id", "conversation_id"]) {
37
- const v = opts.payload[key];
38
- if (typeof v === "string" && v.length > 0) {
39
- return { instance_id: v, source: "payload" };
40
- }
51
+ const candidate = value(key);
52
+ if (candidate)
53
+ return { instance_id: candidate, source: "payload" };
41
54
  }
42
55
  }
56
+ const bridge = coordEnv("AGENT_COORD_BRIDGE")?.trim();
57
+ const env = coordEnv("AGENT_COORD_OWNER");
58
+ if (env && env.length > 0 && !bridge) {
59
+ return { instance_id: env, source: "env" };
60
+ }
61
+ // A Windows-hosted Codex task can replace its WSL process tree during a
62
+ // repository refresh. The forwarded native thread id survives that boundary
63
+ // and is safe only after joining to exactly one nonterminal V3 producer.
64
+ // Resolve it before the bridge fail-closed branch; never fall through to the
65
+ // old pid map when the join fails.
66
+ const sessionOwner = resolveOwnerBySessionEnv(opts.coordRoot);
67
+ if (sessionOwner)
68
+ return { instance_id: sessionOwner, source: "session_env" };
69
+ if (bridge)
70
+ return null;
43
71
  // Pid-map ancestor walk. Start at own pid (the bash wrapper's bun child),
44
72
  // walk up through ppids. The pid-map is stamped keyed by the adapter PID, so
45
73
  // we'll usually find it 1-3 hops up.
@@ -77,15 +105,6 @@ export function resolveOwner(opts) {
77
105
  hops++;
78
106
  }
79
107
  }
80
- // Tier 4: Codex thread id, heartbeat-validated. Last because the pid map is
81
- // more specific when it answers — an inherited env var can outlive the
82
- // process tree it described, a live pid-map row cannot.
83
- const codexThreadId = process.env.CODEX_THREAD_ID?.trim();
84
- if (codexThreadId &&
85
- /^[A-Za-z0-9-]+$/.test(codexThreadId) &&
86
- existsSync(join(opts.coordRoot, ".harnery", "active", `${codexThreadId}.json`))) {
87
- return { instance_id: codexThreadId, source: "codex-env" };
88
- }
89
108
  return null;
90
109
  }
91
110
  function readPpid(pid) {
@@ -135,19 +154,9 @@ export function readShellMarker(coordRoot, pid) {
135
154
  return null;
136
155
  }
137
156
  }
138
- /** Read the heartbeat-recorded `agent_id` for an owner if it exists. */
157
+ /** Read the V3-projected `agent_id` for an owner if it exists. */
139
158
  export function readAgentIdForOwner(coordRoot, instanceId) {
140
- const path = join(coordRoot, ".harnery", "active", `${instanceId}.json`);
141
- if (!existsSync(path))
142
- return null;
143
- try {
144
- const body = readFileSync(path, "utf8");
145
- const data = JSON.parse(body);
146
- return data.agent_id ?? null;
147
- }
148
- catch {
149
- return null;
150
- }
159
+ return readLiveCoordinationRow(coordRoot, instanceId)?.agent_id ?? null;
151
160
  }
152
161
  /** Diagnostic: list of pid-map entries (for debugging). */
153
162
  export function listPidmap(coordRoot) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Scan a CC-style JSONL transcript for the `┌─ agent-` status-box prefix in
3
- * the most-recent assistant turn. Used by `turn.stop` events to populate
3
+ * the most-recent assistant turn. Used by `turn.completed` events to populate
4
4
  * `status_box_present`.
5
5
  *
6
6
  * Cheap by default: caps the read at 256KB tailed from the file, since the
@@ -12,7 +12,7 @@
12
12
  export declare function scanStatusBoxPresent(transcriptPath: string | undefined): boolean;
13
13
  /**
14
14
  * Scan a CC-style JSONL transcript for a needle in ASSISTANT message text
15
- * blocks only. Used by `turn.stop` to detect the suggested session name in the
15
+ * blocks only. Used by `turn.completed` to detect the suggested session name in the
16
16
  * reply.
17
17
  *
18
18
  * The row filter is load-bearing: the transcript tail also carries the needle
@@ -25,11 +25,41 @@ export declare function scanStatusBoxPresent(transcriptPath: string | undefined)
25
25
  * truncated JSON row, which the per-line parse guard skips.
26
26
  */
27
27
  export declare function scanAssistantTextIncludes(transcriptPath: string | undefined, needle: string): boolean;
28
+ /** Most recent user-visible assistant text across Claude Code and Codex JSONL. */
29
+ export declare function scanLatestAssistantText(transcriptPath: string | undefined): string | undefined;
30
+ /**
31
+ * Verify that the first assistant message after the set-task result begins
32
+ * with the exact session-name block. This is the Stop-time fallback for a
33
+ * correctly displayed name followed by no further tool call. A name printed
34
+ * after later work does not pass.
35
+ */
36
+ export declare function scanSessionNameDisplayedImmediately(transcriptPath: string | undefined, name: string, startsWithBlock: (text: string, expectedName: string) => boolean): boolean;
37
+ export type SessionNameDisplayInspection = {
38
+ state: "present";
39
+ } | {
40
+ state: "absent";
41
+ } | {
42
+ state: "unavailable";
43
+ reason: "missing_transcript" | "transcript_not_ready";
44
+ };
45
+ /**
46
+ * Inspect the ordered post-mint reply without conflating a malformed display
47
+ * with an unreadable transcript. PreToolUse can enforce the former, while the
48
+ * latter must remain an honest unsupported observation instead of deadlocking
49
+ * every tool behind evidence the adapter has not persisted yet.
50
+ */
51
+ export declare function inspectSessionNameDisplayImmediately(transcriptPath: string | undefined, name: string, startsWithBlock: (text: string, expectedName: string) => boolean): SessionNameDisplayInspection;
52
+ /**
53
+ * Resolve a transcript path at the adapter boundary. Windows-native Codex can
54
+ * send `C:\...` while the managed hook executes inside WSL, where the same
55
+ * file is mounted at `/mnt/c/...`.
56
+ */
57
+ export declare function transcriptPathCandidates(transcriptPath: string | undefined): string[];
28
58
  /**
29
59
  * Resolve the agent's model from a CC-style JSONL transcript by reading the
30
60
  * most-recent assistant message's `message.model`. Claude Code's SessionStart
31
61
  * payload omits `model` (Codex + Cursor supply it directly), so this is the
32
- * fallback that lets `session.start` / `turn.stop` populate the heartbeat's
62
+ * fallback that lets `session.started` / `turn.completed` populate the cache's
33
63
  * model field once the transcript has at least one assistant turn.
34
64
  *
35
65
  * Tail-reads the same 256KB window as the status-box scan and walks lines from
@@ -1 +1 @@
1
- {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/transcript.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOhF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,MAAM,EAAE,MAAM,GACb,OAAO,CA+BT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAsB1F;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAgDpB"}
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/transcript.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQhF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAiCT;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAgB9F;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CACjD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,OAAO,CAIT;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GACnB;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,oBAAoB,GAAG,sBAAsB,CAAA;CAAE,CAAC;AAEpF;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,4BAA4B,CAsB9B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAUrF;AAwDD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAuB1F;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAkDpB"}
@@ -2,7 +2,7 @@ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
2
  import { basename, dirname, join } from "node:path";
3
3
  /**
4
4
  * Scan a CC-style JSONL transcript for the `┌─ agent-` status-box prefix in
5
- * the most-recent assistant turn. Used by `turn.stop` events to populate
5
+ * the most-recent assistant turn. Used by `turn.completed` events to populate
6
6
  * `status_box_present`.
7
7
  *
8
8
  * Cheap by default: caps the read at 256KB tailed from the file, since the
@@ -12,9 +12,10 @@ import { basename, dirname, join } from "node:path";
12
12
  * and Phase 5 verdict path catches the race via a single retry.
13
13
  */
14
14
  export function scanStatusBoxPresent(transcriptPath) {
15
- if (!transcriptPath || !existsSync(transcriptPath))
15
+ const readablePath = resolveTranscriptPath(transcriptPath);
16
+ if (!readablePath)
16
17
  return false;
17
- const text = tailText(transcriptPath);
18
+ const text = tailText(readablePath);
18
19
  if (text === undefined)
19
20
  return false;
20
21
  // The box is rendered as a text content block by the assistant; we look
@@ -23,7 +24,7 @@ export function scanStatusBoxPresent(transcriptPath) {
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
@@ -36,9 +37,12 @@ export function scanStatusBoxPresent(transcriptPath) {
36
37
  * truncated JSON row, which the per-line parse guard skips.
37
38
  */
38
39
  export function scanAssistantTextIncludes(transcriptPath, needle) {
39
- if (!transcriptPath || !needle || !existsSync(transcriptPath))
40
+ if (!needle)
40
41
  return false;
41
- const text = tailText(transcriptPath);
42
+ const readablePath = resolveTranscriptPath(transcriptPath);
43
+ if (!readablePath)
44
+ return false;
45
+ const text = tailText(readablePath);
42
46
  if (!text)
43
47
  return false;
44
48
  for (const line of text.split("\n")) {
@@ -72,11 +76,144 @@ export function scanAssistantTextIncludes(transcriptPath, needle) {
72
76
  }
73
77
  return false;
74
78
  }
79
+ /** Most recent user-visible assistant text across Claude Code and Codex JSONL. */
80
+ export function scanLatestAssistantText(transcriptPath) {
81
+ const readablePath = resolveTranscriptPath(transcriptPath);
82
+ if (!readablePath)
83
+ return undefined;
84
+ const text = tailText(readablePath);
85
+ if (!text)
86
+ return undefined;
87
+ const lines = text.split("\n");
88
+ for (let i = lines.length - 1; i >= 0; i--) {
89
+ const row = parseTranscriptRow(lines[i]);
90
+ if (!row)
91
+ continue;
92
+ const assistantText = assistantTextFromRow(row);
93
+ // Claude Code appends the current tool_use-only assistant row before
94
+ // PreToolUse fires. Skip rows with no user-visible text so the immediately
95
+ // preceding fenced block remains discoverable.
96
+ if (assistantText !== null && assistantText.trim().length > 0)
97
+ return assistantText;
98
+ }
99
+ return undefined;
100
+ }
101
+ /**
102
+ * Verify that the first assistant message after the set-task result begins
103
+ * with the exact session-name block. This is the Stop-time fallback for a
104
+ * correctly displayed name followed by no further tool call. A name printed
105
+ * after later work does not pass.
106
+ */
107
+ export function scanSessionNameDisplayedImmediately(transcriptPath, name, startsWithBlock) {
108
+ return (inspectSessionNameDisplayImmediately(transcriptPath, name, startsWithBlock).state === "present");
109
+ }
110
+ /**
111
+ * Inspect the ordered post-mint reply without conflating a malformed display
112
+ * with an unreadable transcript. PreToolUse can enforce the former, while the
113
+ * latter must remain an honest unsupported observation instead of deadlocking
114
+ * every tool behind evidence the adapter has not persisted yet.
115
+ */
116
+ export function inspectSessionNameDisplayImmediately(transcriptPath, name, startsWithBlock) {
117
+ if (!name)
118
+ return { state: "absent" };
119
+ const readablePath = resolveTranscriptPath(transcriptPath);
120
+ if (!readablePath)
121
+ return { state: "unavailable", reason: "missing_transcript" };
122
+ const text = tailText(readablePath);
123
+ if (!text)
124
+ return { state: "unavailable", reason: "transcript_not_ready" };
125
+ let sawMintResult = false;
126
+ for (const line of text.split("\n")) {
127
+ if (!sawMintResult) {
128
+ if (line.includes(name) && line.includes("suggested_session_name"))
129
+ sawMintResult = true;
130
+ continue;
131
+ }
132
+ const row = parseTranscriptRow(line);
133
+ if (!row)
134
+ continue;
135
+ const assistantText = assistantTextFromRow(row);
136
+ if (assistantText !== null) {
137
+ return { state: startsWithBlock(assistantText, name) ? "present" : "absent" };
138
+ }
139
+ }
140
+ return sawMintResult
141
+ ? { state: "unavailable", reason: "transcript_not_ready" }
142
+ : { state: "absent" };
143
+ }
144
+ /**
145
+ * Resolve a transcript path at the adapter boundary. Windows-native Codex can
146
+ * send `C:\...` while the managed hook executes inside WSL, where the same
147
+ * file is mounted at `/mnt/c/...`.
148
+ */
149
+ export function transcriptPathCandidates(transcriptPath) {
150
+ if (!transcriptPath)
151
+ return [];
152
+ const candidates = [transcriptPath];
153
+ const windowsDrive = /^([A-Za-z]):[\\/](.*)$/.exec(transcriptPath);
154
+ if (windowsDrive) {
155
+ candidates.push(`/mnt/${windowsDrive[1].toLowerCase()}/${windowsDrive[2].replaceAll("\\", "/")}`);
156
+ }
157
+ return [...new Set(candidates)];
158
+ }
159
+ function resolveTranscriptPath(transcriptPath) {
160
+ return transcriptPathCandidates(transcriptPath).find((candidate) => existsSync(candidate));
161
+ }
162
+ function parseTranscriptRow(line) {
163
+ if (!line?.trim())
164
+ return null;
165
+ try {
166
+ const row = JSON.parse(line);
167
+ return typeof row === "object" && row !== null ? row : null;
168
+ }
169
+ catch {
170
+ return null;
171
+ }
172
+ }
173
+ /** null means this row is not an assistant message; an empty string is one with no text. */
174
+ function assistantTextFromRow(row) {
175
+ if (row.type === "assistant") {
176
+ const message = objectValue(row.message);
177
+ return textFromContent(message?.content);
178
+ }
179
+ if (row.type === "response_item") {
180
+ const payload = objectValue(row.payload);
181
+ if (payload?.type !== "message" || payload.role !== "assistant")
182
+ return null;
183
+ return textFromContent(payload.content);
184
+ }
185
+ if (row.type === "event_msg") {
186
+ const payload = objectValue(row.payload);
187
+ if (payload?.type !== "agent_message")
188
+ return null;
189
+ return typeof payload.message === "string" ? payload.message : "";
190
+ }
191
+ return null;
192
+ }
193
+ function objectValue(value) {
194
+ return typeof value === "object" && value !== null ? value : null;
195
+ }
196
+ function textFromContent(content) {
197
+ if (typeof content === "string")
198
+ return content;
199
+ if (!Array.isArray(content))
200
+ return "";
201
+ const parts = [];
202
+ for (const block of content) {
203
+ const value = objectValue(block);
204
+ if (!value)
205
+ continue;
206
+ if ((value.type === "text" || value.type === "output_text") && typeof value.text === "string") {
207
+ parts.push(value.text);
208
+ }
209
+ }
210
+ return parts.join("\n");
211
+ }
75
212
  /**
76
213
  * Resolve the agent's model from a CC-style JSONL transcript by reading the
77
214
  * most-recent assistant message's `message.model`. Claude Code's SessionStart
78
215
  * payload omits `model` (Codex + Cursor supply it directly), so this is the
79
- * fallback that lets `session.start` / `turn.stop` populate the heartbeat's
216
+ * fallback that lets `session.started` / `turn.completed` populate the cache's
80
217
  * model field once the transcript has at least one assistant turn.
81
218
  *
82
219
  * Tail-reads the same 256KB window as the status-box scan and walks lines from
@@ -85,9 +222,10 @@ export function scanAssistantTextIncludes(transcriptPath, needle) {
85
222
  * transcript is missing/empty (e.g. a fresh session's first SessionStart).
86
223
  */
87
224
  export function scanTranscriptModel(transcriptPath) {
88
- if (!transcriptPath || !existsSync(transcriptPath))
225
+ const readablePath = resolveTranscriptPath(transcriptPath);
226
+ if (!readablePath)
89
227
  return undefined;
90
- const text = tailText(transcriptPath);
228
+ const text = tailText(readablePath);
91
229
  if (!text)
92
230
  return undefined;
93
231
  const lines = text.split("\n");
@@ -143,17 +281,20 @@ const FORK_SAMPLE_SIZE = 24;
143
281
  */
144
282
  export function detectForkParent(transcriptPath, sessionId) {
145
283
  try {
146
- if (!transcriptPath || !sessionId || !existsSync(transcriptPath))
284
+ if (!sessionId)
285
+ return undefined;
286
+ const readablePath = resolveTranscriptPath(transcriptPath);
287
+ if (!readablePath)
147
288
  return undefined;
148
- if (statSync(transcriptPath).size > FORK_SCAN_MAX_BYTES)
289
+ if (statSync(readablePath).size > FORK_SCAN_MAX_BYTES)
149
290
  return undefined;
150
- const own = readFileSync(transcriptPath, "utf8");
291
+ const own = readFileSync(readablePath, "utf8");
151
292
  const uuids = messageUuids(own);
152
293
  if (uuids.length === 0)
153
294
  return undefined;
154
295
  const sample = sampleEvenly(uuids, FORK_SAMPLE_SIZE);
155
- const dir = dirname(transcriptPath);
156
- const ownFile = basename(transcriptPath);
296
+ const dir = dirname(readablePath);
297
+ const ownFile = basename(readablePath);
157
298
  let best = null;
158
299
  for (const file of readdirSync(dir)) {
159
300
  if (file === ownFile || !SESSION_FILE_RE.test(file))
@@ -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
@@ -26,5 +25,5 @@ export interface SessionNamePresence {
26
25
  session_name_present?: boolean;
27
26
  session_name_present_for?: string;
28
27
  }
29
- export declare function sessionNamePresence(coordRoot: string, instanceId: string, lastAssistantMessage: string, scanAssistantText: (name: string) => boolean): SessionNamePresence;
28
+ export declare function sessionNamePresence(coordRoot: string, instanceId: string, scanAssistantText: (name: string) => boolean): SessionNamePresence;
30
29
  //# sourceMappingURL=session-name-presence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-name-presence.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/session-name-presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,MAAM,EAC5B,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAC3C,mBAAmB,CAcrB"}
1
+ {"version":3,"file":"session-name-presence.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/session-name-presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAC3C,mBAAmB,CAcrB"}
@@ -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
@@ -22,17 +21,18 @@
22
21
  *
23
22
  * Never throws: coordination telemetry must not take down a hook.
24
23
  */
25
- import { readHeartbeat, stampSessionNameSeen } from "../agents/state/heartbeat-writer.js";
26
- export function sessionNamePresence(coordRoot, instanceId, lastAssistantMessage, scanAssistantText) {
24
+ import { stampSessionNameSeen } from "../agents/state/heartbeat-writer.js";
25
+ import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.js";
26
+ export function sessionNamePresence(coordRoot, instanceId, scanAssistantText) {
27
27
  try {
28
- const hb = readHeartbeat(coordRoot, instanceId);
29
- const name = hb?.suggested_session_name;
28
+ const row = readLiveCoordinationRow(coordRoot, instanceId);
29
+ const name = row?.suggested_session_name;
30
30
  if (!name)
31
31
  return {};
32
- if (hb?.session_name_seen_for === name) {
32
+ if (row?.session_name_seen_for === name) {
33
33
  return { session_name_present: true, session_name_present_for: name };
34
34
  }
35
- const present = scanAssistantText(name) || lastAssistantMessage.includes(name);
35
+ const present = scanAssistantText(name);
36
36
  if (present)
37
37
  stampSessionNameSeen(coordRoot, instanceId, name);
38
38
  return { session_name_present: present, session_name_present_for: name };
@@ -1,4 +1,4 @@
1
- import type { Adapter } from "./events/schema.js";
1
+ import type { Adapter } from "../adapter.js";
2
2
  export interface CrossShellInspection {
3
3
  adapter: Adapter;
4
4
  cwd: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"unsafe-cross-shell.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/unsafe-cross-shell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AA8ID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAKjF"}
1
+ {"version":3,"file":"unsafe-cross-shell.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/unsafe-cross-shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AA8ID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI,CAKjF"}