harnery 0.34.1 → 0.36.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 (692) hide show
  1. package/dist/commander.d.ts +30 -5
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +124 -94
  4. package/dist/commands/agents.d.ts +37 -6
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +466 -371
  7. package/dist/commands/backup.d.ts.map +1 -1
  8. package/dist/commands/backup.js +10 -10
  9. package/dist/commands/browse-session.d.ts.map +1 -1
  10. package/dist/commands/browse-session.js +12 -0
  11. package/dist/commands/browse.d.ts +1 -1
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +31 -6
  14. package/dist/commands/conversations.d.ts +10 -0
  15. package/dist/commands/conversations.d.ts.map +1 -0
  16. package/dist/commands/conversations.js +201 -0
  17. package/dist/commands/decision.d.ts.map +1 -1
  18. package/dist/commands/decision.js +2 -2
  19. package/dist/commands/deinit.d.ts.map +1 -1
  20. package/dist/commands/deinit.js +5 -0
  21. package/dist/commands/docs.d.ts.map +1 -1
  22. package/dist/commands/docs.js +13 -2
  23. package/dist/commands/doctor.d.ts +5 -0
  24. package/dist/commands/doctor.d.ts.map +1 -1
  25. package/dist/commands/doctor.js +51 -7
  26. package/dist/commands/events.d.ts.map +1 -1
  27. package/dist/commands/events.js +18 -1
  28. package/dist/commands/fetch.js +6 -5
  29. package/dist/commands/files.d.ts +22 -0
  30. package/dist/commands/files.d.ts.map +1 -0
  31. package/dist/commands/files.js +113 -0
  32. package/dist/commands/governor.js +14 -12
  33. package/dist/commands/inbox.d.ts +5 -0
  34. package/dist/commands/inbox.d.ts.map +1 -0
  35. package/dist/commands/inbox.js +57 -0
  36. package/dist/commands/init.d.ts +4 -5
  37. package/dist/commands/init.d.ts.map +1 -1
  38. package/dist/commands/init.js +63 -13
  39. package/dist/commands/ledger-v3.d.ts.map +1 -1
  40. package/dist/commands/ledger-v3.js +347 -1
  41. package/dist/commands/logs.d.ts +4 -0
  42. package/dist/commands/logs.d.ts.map +1 -0
  43. package/dist/commands/logs.js +169 -0
  44. package/dist/commands/messages.d.ts +5 -0
  45. package/dist/commands/messages.d.ts.map +1 -0
  46. package/dist/commands/messages.js +45 -0
  47. package/dist/commands/outline.d.ts +1 -1
  48. package/dist/commands/outline.d.ts.map +1 -1
  49. package/dist/commands/outline.js +2 -2
  50. package/dist/commands/presence.d.ts.map +1 -1
  51. package/dist/commands/presence.js +2 -2
  52. package/dist/commands/read.d.ts +1 -1
  53. package/dist/commands/read.d.ts.map +1 -1
  54. package/dist/commands/read.js +2 -2
  55. package/dist/commands/semantic.d.ts +4 -0
  56. package/dist/commands/semantic.d.ts.map +1 -0
  57. package/dist/commands/semantic.js +199 -0
  58. package/dist/commands/storage.d.ts +4 -0
  59. package/dist/commands/storage.d.ts.map +1 -0
  60. package/dist/commands/storage.js +238 -0
  61. package/dist/commands/tunnel.d.ts +5 -1
  62. package/dist/commands/tunnel.d.ts.map +1 -1
  63. package/dist/commands/tunnel.js +44 -31
  64. package/dist/commands/web.d.ts +3 -0
  65. package/dist/commands/web.d.ts.map +1 -1
  66. package/dist/commands/web.js +84 -7
  67. package/dist/commands/work.js +3 -3
  68. package/dist/commands/workflow.js +13 -13
  69. package/dist/core/adapters/profiles.d.ts +1 -1
  70. package/dist/core/agents/canonical-emit.d.ts +3 -0
  71. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  72. package/dist/core/agents/canonical-emit.js +12 -0
  73. package/dist/core/agents/claim-path.d.ts +11 -0
  74. package/dist/core/agents/claim-path.d.ts.map +1 -0
  75. package/dist/core/agents/claim-path.js +22 -0
  76. package/dist/core/agents/cli.js +209 -39
  77. package/dist/core/agents/coord-client.d.ts +29 -3
  78. package/dist/core/agents/coord-client.d.ts.map +1 -1
  79. package/dist/core/agents/coord-client.js +88 -9
  80. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  81. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  82. package/dist/core/agents/live-authority-v3.js +245 -13
  83. package/dist/core/agents/live-lifecycle-v3.js +9 -4
  84. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  85. package/dist/core/agents/live-observation-v3.js +8 -3
  86. package/dist/core/agents/render/prompt-context.d.ts +9 -3
  87. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  88. package/dist/core/agents/render/prompt-context.js +36 -17
  89. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  90. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  91. package/dist/core/agents/rules/stop-hook.js +115 -22
  92. package/dist/core/agents/rules/verdict.d.ts +1 -0
  93. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  94. package/dist/core/agents/session-events.d.ts.map +1 -1
  95. package/dist/core/agents/session-events.js +4 -0
  96. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  97. package/dist/core/agents/session-finalizer-v3.js +5 -1
  98. package/dist/core/agents/session-name-display.d.ts +1 -0
  99. package/dist/core/agents/session-name-display.d.ts.map +1 -1
  100. package/dist/core/agents/session-name-display.js +8 -1
  101. package/dist/core/agents/state/activity-log.d.ts +3 -0
  102. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  103. package/dist/core/agents/state/activity-log.js +6 -3
  104. package/dist/core/agents/state/heartbeat-reader.d.ts +46 -0
  105. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
  106. package/dist/core/agents/state/heartbeat-reader.js +25 -0
  107. package/dist/core/agents/state/heartbeat-writer.d.ts +9 -48
  108. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  109. package/dist/core/agents/state/heartbeat-writer.js +34 -34
  110. package/dist/core/agents/state/live-coordination-view.d.ts +6 -8
  111. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  112. package/dist/core/agents/state/live-coordination-view.js +16 -67
  113. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  114. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  116. package/dist/core/agents/state/names.d.ts +9 -1
  117. package/dist/core/agents/state/names.d.ts.map +1 -1
  118. package/dist/core/agents/state/names.js +190 -182
  119. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  120. package/dist/core/agents/state/stale-sweep.js +23 -5
  121. package/dist/core/artifacts/constants.d.ts +5 -0
  122. package/dist/core/artifacts/constants.d.ts.map +1 -0
  123. package/dist/core/artifacts/constants.js +4 -0
  124. package/dist/core/artifacts/index.d.ts +24 -3
  125. package/dist/core/artifacts/index.d.ts.map +1 -1
  126. package/dist/core/artifacts/index.js +96 -8
  127. package/dist/core/config.d.ts +62 -4
  128. package/dist/core/config.d.ts.map +1 -1
  129. package/dist/core/config.js +98 -4
  130. package/dist/core/conversations/archive.d.ts +49 -0
  131. package/dist/core/conversations/archive.d.ts.map +1 -0
  132. package/dist/core/conversations/archive.js +136 -0
  133. package/dist/core/conversations/catalog.d.ts +10 -0
  134. package/dist/core/conversations/catalog.d.ts.map +1 -0
  135. package/dist/core/conversations/catalog.js +72 -0
  136. package/dist/core/conversations/context-pack.d.ts +6 -0
  137. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  138. package/dist/core/conversations/context-pack.js +60 -0
  139. package/dist/core/conversations/contract.d.ts +155 -0
  140. package/dist/core/conversations/contract.d.ts.map +1 -0
  141. package/dist/core/conversations/contract.js +1 -0
  142. package/dist/core/conversations/evaluation.d.ts +16 -0
  143. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  144. package/dist/core/conversations/evaluation.js +9 -0
  145. package/dist/core/conversations/index.d.ts +10 -0
  146. package/dist/core/conversations/index.d.ts.map +1 -0
  147. package/dist/core/conversations/index.js +9 -0
  148. package/dist/core/conversations/lifecycle.d.ts +28 -0
  149. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  150. package/dist/core/conversations/lifecycle.js +29 -0
  151. package/dist/core/conversations/normalize.d.ts +14 -0
  152. package/dist/core/conversations/normalize.d.ts.map +1 -0
  153. package/dist/core/conversations/normalize.js +82 -0
  154. package/dist/core/conversations/query.d.ts +8 -0
  155. package/dist/core/conversations/query.d.ts.map +1 -0
  156. package/dist/core/conversations/query.js +280 -0
  157. package/dist/core/conversations/search-index.d.ts +9 -0
  158. package/dist/core/conversations/search-index.d.ts.map +1 -0
  159. package/dist/core/conversations/search-index.js +29 -0
  160. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  161. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  162. package/dist/core/events/legacy-storage/canary.js +150 -0
  163. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  164. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  165. package/dist/core/events/legacy-storage/fence.js +115 -0
  166. package/dist/core/events/legacy-storage/index.d.ts +6 -0
  167. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  168. package/dist/core/events/legacy-storage/index.js +5 -0
  169. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  170. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  171. package/dist/core/events/legacy-storage/inventory.js +40 -0
  172. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  173. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  174. package/dist/core/events/legacy-storage/manifest.js +108 -0
  175. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  176. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  177. package/dist/core/events/legacy-storage/reader.js +154 -0
  178. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  179. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  180. package/dist/core/events/v3/authority-outbox.js +16 -3
  181. package/dist/core/events/v3/base-contract.d.ts +851 -16
  182. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  183. package/dist/core/events/v3/base-contract.js +50 -7
  184. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  185. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  186. package/dist/core/events/v3/bootstrap.js +167 -3
  187. package/dist/core/events/v3/capabilities.d.ts +11 -0
  188. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  189. package/dist/core/events/v3/capabilities.js +26 -3
  190. package/dist/core/events/v3/control-witness.d.ts +44 -0
  191. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  192. package/dist/core/events/v3/control-witness.js +233 -0
  193. package/dist/core/events/v3/control-writer.d.ts +4 -0
  194. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  195. package/dist/core/events/v3/control-writer.js +16 -0
  196. package/dist/core/events/v3/control.d.ts +8 -2
  197. package/dist/core/events/v3/control.d.ts.map +1 -1
  198. package/dist/core/events/v3/control.js +46 -18
  199. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  200. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  201. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  202. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  203. package/dist/core/events/v3/coordination-view.js +16 -1
  204. package/dist/core/events/v3/generated.d.ts +1 -1
  205. package/dist/core/events/v3/generated.js +1 -1
  206. package/dist/core/events/v3/index.d.ts +8 -5
  207. package/dist/core/events/v3/index.d.ts.map +1 -1
  208. package/dist/core/events/v3/index.js +7 -4
  209. package/dist/core/events/v3/latency.d.ts +31 -1
  210. package/dist/core/events/v3/latency.d.ts.map +1 -1
  211. package/dist/core/events/v3/latency.js +127 -3
  212. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  213. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  214. package/dist/core/events/v3/live-route-observer.js +58 -0
  215. package/dist/core/events/v3/live-routing.d.ts +42 -20
  216. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  217. package/dist/core/events/v3/live-routing.js +153 -41
  218. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
  219. package/dist/core/events/v3/producers/command-recorder.js +10 -1
  220. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  221. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  222. package/dist/core/events/v3/producers/coordination-recorder.js +90 -13
  223. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  224. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  226. package/dist/core/events/v3/producers/hook-base.d.ts +17 -1
  227. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  228. package/dist/core/events/v3/producers/hook-base.js +83 -2
  229. package/dist/core/events/v3/producers/intake.d.ts +13 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  231. package/dist/core/events/v3/producers/intake.js +36 -2
  232. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  233. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  235. package/dist/core/events/v3/producers/recorder.d.ts +117 -1
  236. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  237. package/dist/core/events/v3/producers/recorder.js +992 -27
  238. package/dist/core/events/v3/reader.d.ts +51 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -1
  240. package/dist/core/events/v3/reader.js +181 -1
  241. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  242. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  243. package/dist/core/events/v3/rotation-config.js +91 -0
  244. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  245. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  246. package/dist/core/events/v3/runtime-build.js +39 -0
  247. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  248. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  249. package/dist/core/events/v3/runtime-identity.js +18 -0
  250. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +52 -0
  251. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
  252. package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
  253. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  254. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  255. package/dist/core/events/v3/support-storage/classify.js +149 -0
  256. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  257. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  258. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  259. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  260. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  261. package/dist/core/events/v3/support-storage/index.js +9 -0
  262. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  263. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  264. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  265. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  266. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  267. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  268. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  269. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  270. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  271. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  272. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  273. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  274. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  275. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  276. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  277. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  278. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  279. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  280. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  281. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  282. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  283. package/dist/core/events/v3/turn-telemetry.d.ts +21 -6
  284. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  285. package/dist/core/events/v3/turn-telemetry.js +32 -2
  286. package/dist/core/events/v3/writer.d.ts +13 -1
  287. package/dist/core/events/v3/writer.d.ts.map +1 -1
  288. package/dist/core/events/v3/writer.js +126 -12
  289. package/dist/core/governor/plan-read.d.ts.map +1 -1
  290. package/dist/core/governor/plan-read.js +5 -21
  291. package/dist/core/governor/planning.js +6 -8
  292. package/dist/core/governor/service-read.d.ts +12 -0
  293. package/dist/core/governor/service-read.d.ts.map +1 -1
  294. package/dist/core/governor/service-read.js +266 -2
  295. package/dist/core/governor/service.d.ts +1 -0
  296. package/dist/core/governor/service.d.ts.map +1 -1
  297. package/dist/core/governor/service.js +53 -18
  298. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  299. package/dist/core/guard/evidence-v3.js +2 -0
  300. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  301. package/dist/core/hooks/adapter/events.js +1 -0
  302. package/dist/core/hooks/adapter/output.d.ts +4 -2
  303. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  304. package/dist/core/hooks/adapter/output.js +13 -5
  305. package/dist/core/hooks/adapter/parse.d.ts +3 -0
  306. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  307. package/dist/core/hooks/adapter/parse.js +14 -0
  308. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +142 -0
  309. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
  310. package/dist/core/hooks/adapter/runtime-telemetry.js +869 -0
  311. package/dist/core/hooks/cli.js +318 -61
  312. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  313. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  314. package/dist/core/hooks/effects/image-capture.js +4 -2
  315. package/dist/core/hooks/remediation-cap.d.ts +39 -0
  316. package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
  317. package/dist/core/hooks/remediation-cap.js +63 -0
  318. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  319. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  320. package/dist/core/hooks/resolve/coord-root.js +92 -11
  321. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  322. package/dist/core/hooks/resolve/owner.js +5 -0
  323. package/dist/core/hooks/resolve/transcript.d.ts +33 -9
  324. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  325. package/dist/core/hooks/resolve/transcript.js +33 -10
  326. package/dist/core/inbox/contract.d.ts +64 -0
  327. package/dist/core/inbox/contract.d.ts.map +1 -0
  328. package/dist/core/inbox/contract.js +13 -0
  329. package/dist/core/inbox/index.d.ts +5 -0
  330. package/dist/core/inbox/index.d.ts.map +1 -0
  331. package/dist/core/inbox/index.js +4 -0
  332. package/dist/core/inbox/lifecycle.d.ts +22 -0
  333. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  334. package/dist/core/inbox/lifecycle.js +41 -0
  335. package/dist/core/inbox/service.d.ts +36 -0
  336. package/dist/core/inbox/service.d.ts.map +1 -0
  337. package/dist/core/inbox/service.js +210 -0
  338. package/dist/core/inbox/watcher.d.ts +7 -0
  339. package/dist/core/inbox/watcher.d.ts.map +1 -0
  340. package/dist/core/inbox/watcher.js +26 -0
  341. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  342. package/dist/core/presence/codec-digest.js +14 -3
  343. package/dist/core/presence/relay-client.d.ts +1 -0
  344. package/dist/core/presence/relay-client.d.ts.map +1 -1
  345. package/dist/core/presence/relay-client.js +52 -8
  346. package/dist/core/semantic/adapters.d.ts +37 -0
  347. package/dist/core/semantic/adapters.d.ts.map +1 -0
  348. package/dist/core/semantic/adapters.js +360 -0
  349. package/dist/core/semantic/contract.d.ts +1072 -0
  350. package/dist/core/semantic/contract.d.ts.map +1 -0
  351. package/dist/core/semantic/contract.js +331 -0
  352. package/dist/core/semantic/evidence.d.ts +11 -0
  353. package/dist/core/semantic/evidence.d.ts.map +1 -0
  354. package/dist/core/semantic/evidence.js +262 -0
  355. package/dist/core/semantic/index.d.ts +14 -0
  356. package/dist/core/semantic/index.d.ts.map +1 -0
  357. package/dist/core/semantic/index.js +13 -0
  358. package/dist/core/semantic/once.d.ts +38 -0
  359. package/dist/core/semantic/once.d.ts.map +1 -0
  360. package/dist/core/semantic/once.js +364 -0
  361. package/dist/core/semantic/prompt.d.ts +12 -0
  362. package/dist/core/semantic/prompt.d.ts.map +1 -0
  363. package/dist/core/semantic/prompt.js +83 -0
  364. package/dist/core/semantic/review.d.ts +144 -0
  365. package/dist/core/semantic/review.d.ts.map +1 -0
  366. package/dist/core/semantic/review.js +544 -0
  367. package/dist/core/semantic/routes.d.ts +10 -0
  368. package/dist/core/semantic/routes.d.ts.map +1 -0
  369. package/dist/core/semantic/routes.js +21 -0
  370. package/dist/core/semantic/scheduler.d.ts +27 -0
  371. package/dist/core/semantic/scheduler.d.ts.map +1 -0
  372. package/dist/core/semantic/scheduler.js +91 -0
  373. package/dist/core/semantic/service-status.d.ts +51 -0
  374. package/dist/core/semantic/service-status.d.ts.map +1 -0
  375. package/dist/core/semantic/service-status.js +140 -0
  376. package/dist/core/semantic/service.d.ts +52 -0
  377. package/dist/core/semantic/service.d.ts.map +1 -0
  378. package/dist/core/semantic/service.js +559 -0
  379. package/dist/core/semantic/soak.d.ts +75 -0
  380. package/dist/core/semantic/soak.d.ts.map +1 -0
  381. package/dist/core/semantic/soak.js +476 -0
  382. package/dist/core/semantic/storage.d.ts +81 -0
  383. package/dist/core/semantic/storage.d.ts.map +1 -0
  384. package/dist/core/semantic/storage.js +180 -0
  385. package/dist/core/semantic/usage.d.ts +43 -0
  386. package/dist/core/semantic/usage.d.ts.map +1 -0
  387. package/dist/core/semantic/usage.js +193 -0
  388. package/dist/core/semantic/validate.d.ts +18 -0
  389. package/dist/core/semantic/validate.d.ts.map +1 -0
  390. package/dist/core/semantic/validate.js +207 -0
  391. package/dist/core/storage/buffer.d.ts +28 -0
  392. package/dist/core/storage/buffer.d.ts.map +1 -0
  393. package/dist/core/storage/buffer.js +101 -0
  394. package/dist/core/storage/builtins.d.ts +3 -0
  395. package/dist/core/storage/builtins.d.ts.map +1 -0
  396. package/dist/core/storage/builtins.js +683 -0
  397. package/dist/core/storage/catalog.d.ts +19 -0
  398. package/dist/core/storage/catalog.d.ts.map +1 -0
  399. package/dist/core/storage/catalog.js +365 -0
  400. package/dist/core/storage/config.d.ts +16 -0
  401. package/dist/core/storage/config.d.ts.map +1 -0
  402. package/dist/core/storage/config.js +311 -0
  403. package/dist/core/storage/contract.d.ts +275 -0
  404. package/dist/core/storage/contract.d.ts.map +1 -0
  405. package/dist/core/storage/contract.js +3 -0
  406. package/dist/core/storage/durable-history.d.ts +36 -0
  407. package/dist/core/storage/durable-history.d.ts.map +1 -0
  408. package/dist/core/storage/durable-history.js +606 -0
  409. package/dist/core/storage/health.d.ts +4 -0
  410. package/dist/core/storage/health.d.ts.map +1 -0
  411. package/dist/core/storage/health.js +65 -0
  412. package/dist/core/storage/index.d.ts +16 -0
  413. package/dist/core/storage/index.d.ts.map +1 -0
  414. package/dist/core/storage/index.js +15 -0
  415. package/dist/core/storage/inventory.d.ts +25 -0
  416. package/dist/core/storage/inventory.d.ts.map +1 -0
  417. package/dist/core/storage/inventory.js +666 -0
  418. package/dist/core/storage/jsonl.d.ts +52 -0
  419. package/dist/core/storage/jsonl.d.ts.map +1 -0
  420. package/dist/core/storage/jsonl.js +156 -0
  421. package/dist/core/storage/log-retention.d.ts +52 -0
  422. package/dist/core/storage/log-retention.d.ts.map +1 -0
  423. package/dist/core/storage/log-retention.js +419 -0
  424. package/dist/core/storage/logger.d.ts +82 -0
  425. package/dist/core/storage/logger.d.ts.map +1 -0
  426. package/dist/core/storage/logger.js +411 -0
  427. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  428. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  429. package/dist/core/storage/maintenance-providers.js +141 -0
  430. package/dist/core/storage/maintenance.d.ts +125 -0
  431. package/dist/core/storage/maintenance.d.ts.map +1 -0
  432. package/dist/core/storage/maintenance.js +609 -0
  433. package/dist/core/storage/metrics.d.ts +60 -0
  434. package/dist/core/storage/metrics.d.ts.map +1 -0
  435. package/dist/core/storage/metrics.js +134 -0
  436. package/dist/core/storage/policy.d.ts +7 -0
  437. package/dist/core/storage/policy.d.ts.map +1 -0
  438. package/dist/core/storage/policy.js +110 -0
  439. package/dist/core/storage/process-log.d.ts +38 -0
  440. package/dist/core/storage/process-log.d.ts.map +1 -0
  441. package/dist/core/storage/process-log.js +165 -0
  442. package/dist/core/storage/query.d.ts +34 -0
  443. package/dist/core/storage/query.d.ts.map +1 -0
  444. package/dist/core/storage/query.js +295 -0
  445. package/dist/core/storage/receipts.d.ts +23 -0
  446. package/dist/core/storage/receipts.d.ts.map +1 -0
  447. package/dist/core/storage/receipts.js +117 -0
  448. package/dist/core/storage/segments.d.ts +84 -0
  449. package/dist/core/storage/segments.d.ts.map +1 -0
  450. package/dist/core/storage/segments.js +542 -0
  451. package/dist/core/storage/sink-graph.d.ts +65 -0
  452. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  453. package/dist/core/storage/sink-graph.js +213 -0
  454. package/dist/core/storage/storm-control.d.ts +23 -0
  455. package/dist/core/storage/storm-control.d.ts.map +1 -0
  456. package/dist/core/storage/storm-control.js +59 -0
  457. package/dist/core/work/state.d.ts.map +1 -1
  458. package/dist/core/work/state.js +10 -14
  459. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  460. package/dist/core/workflow/live-session-v3.js +2 -1
  461. package/dist/index.d.ts +2 -0
  462. package/dist/index.d.ts.map +1 -1
  463. package/dist/index.js +2 -0
  464. package/dist/lazy-commands.d.ts +26 -0
  465. package/dist/lazy-commands.d.ts.map +1 -0
  466. package/dist/lazy-commands.js +210 -0
  467. package/dist/lib/browser/client.d.ts +11 -0
  468. package/dist/lib/browser/client.d.ts.map +1 -1
  469. package/dist/lib/browser/client.js +13 -0
  470. package/dist/lib/browser/index.d.ts +1 -0
  471. package/dist/lib/browser/index.d.ts.map +1 -1
  472. package/dist/lib/browser/standalone-html.d.ts +25 -0
  473. package/dist/lib/browser/standalone-html.d.ts.map +1 -0
  474. package/dist/lib/browser/standalone-html.js +284 -0
  475. package/dist/lib/docs-lint.d.ts +2 -0
  476. package/dist/lib/docs-lint.d.ts.map +1 -1
  477. package/dist/lib/docs-lint.js +45 -80
  478. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  479. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  480. package/dist/lib/docs-metadata-audit.js +13 -23
  481. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  482. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  483. package/dist/lib/docs-metadata-sync.js +28 -10
  484. package/dist/lib/docs-repository-view.d.ts +22 -0
  485. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  486. package/dist/lib/docs-repository-view.js +185 -0
  487. package/dist/lib/http/client.d.ts +11 -5
  488. package/dist/lib/http/client.d.ts.map +1 -1
  489. package/dist/lib/http/client.js +22 -4
  490. package/dist/lib/http/index.d.ts +1 -1
  491. package/dist/lib/http/index.d.ts.map +1 -1
  492. package/dist/lib/http/index.js +1 -1
  493. package/dist/lib/indexer-exclusions.d.ts +27 -0
  494. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  495. package/dist/lib/indexer-exclusions.js +176 -0
  496. package/dist/lib/instructions/apply.d.ts.map +1 -1
  497. package/dist/lib/instructions/apply.js +1 -0
  498. package/dist/lib/instructions/templates.d.ts +2 -0
  499. package/dist/lib/instructions/templates.d.ts.map +1 -1
  500. package/dist/lib/instructions/templates.js +149 -4
  501. package/dist/lib/local-file-url.d.ts +9 -0
  502. package/dist/lib/local-file-url.d.ts.map +1 -0
  503. package/dist/lib/local-file-url.js +20 -0
  504. package/dist/lib/web-performance.d.ts +118 -0
  505. package/dist/lib/web-performance.d.ts.map +1 -0
  506. package/dist/lib/web-performance.js +192 -0
  507. package/package.json +34 -2
  508. package/schemas/config.schema.json +58 -0
  509. package/schemas/event-v3.schema.json +3073 -581
  510. package/src/commander.ts +462 -93
  511. package/src/commands/agents.ts +617 -355
  512. package/src/commands/backup.ts +18 -14
  513. package/src/commands/browse-session.ts +12 -0
  514. package/src/commands/browse.ts +31 -9
  515. package/src/commands/conversations.ts +279 -0
  516. package/src/commands/decision.ts +8 -2
  517. package/src/commands/deinit.ts +6 -0
  518. package/src/commands/docs.ts +25 -6
  519. package/src/commands/doctor.ts +75 -9
  520. package/src/commands/events.ts +21 -1
  521. package/src/commands/fetch.ts +7 -6
  522. package/src/commands/files.ts +143 -0
  523. package/src/commands/governor.ts +13 -12
  524. package/src/commands/inbox.ts +61 -0
  525. package/src/commands/init.ts +78 -16
  526. package/src/commands/ledger-v3.ts +421 -1
  527. package/src/commands/logs.ts +224 -0
  528. package/src/commands/messages.ts +61 -0
  529. package/src/commands/outline.ts +6 -2
  530. package/src/commands/presence.ts +7 -2
  531. package/src/commands/read.ts +6 -2
  532. package/src/commands/semantic.ts +244 -0
  533. package/src/commands/storage.ts +310 -0
  534. package/src/commands/tunnel.ts +66 -52
  535. package/src/commands/web.ts +92 -7
  536. package/src/commands/work.ts +3 -3
  537. package/src/commands/workflow.ts +13 -13
  538. package/src/core/agents/canonical-emit.ts +15 -0
  539. package/src/core/agents/claim-path.ts +23 -0
  540. package/src/core/agents/cli.ts +259 -53
  541. package/src/core/agents/coord-client.ts +92 -8
  542. package/src/core/agents/live-authority-v3.ts +342 -14
  543. package/src/core/agents/live-lifecycle-v3.ts +14 -4
  544. package/src/core/agents/live-observation-v3.ts +13 -3
  545. package/src/core/agents/render/prompt-context.ts +40 -16
  546. package/src/core/agents/rules/stop-hook.ts +129 -25
  547. package/src/core/agents/rules/verdict.ts +1 -0
  548. package/src/core/agents/session-events.ts +4 -0
  549. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  550. package/src/core/agents/session-finalizer-v3.ts +4 -1
  551. package/src/core/agents/session-name-display.ts +9 -1
  552. package/src/core/agents/state/activity-log.ts +7 -2
  553. package/src/core/agents/state/heartbeat-reader.ts +69 -0
  554. package/src/core/agents/state/heartbeat-writer.ts +47 -84
  555. package/src/core/agents/state/live-coordination-view.ts +17 -81
  556. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  557. package/src/core/agents/state/names.ts +190 -182
  558. package/src/core/agents/state/stale-sweep.ts +25 -5
  559. package/src/core/artifacts/constants.ts +4 -0
  560. package/src/core/artifacts/index.ts +113 -8
  561. package/src/core/config.ts +126 -5
  562. package/src/core/conversations/archive.ts +237 -0
  563. package/src/core/conversations/catalog.ts +79 -0
  564. package/src/core/conversations/context-pack.ts +72 -0
  565. package/src/core/conversations/contract.ts +178 -0
  566. package/src/core/conversations/evaluation.ts +30 -0
  567. package/src/core/conversations/index.ts +9 -0
  568. package/src/core/conversations/lifecycle.ts +63 -0
  569. package/src/core/conversations/normalize.ts +105 -0
  570. package/src/core/conversations/query.ts +318 -0
  571. package/src/core/conversations/search-index.ts +48 -0
  572. package/src/core/events/legacy-storage/canary.ts +177 -0
  573. package/src/core/events/legacy-storage/fence.ts +129 -0
  574. package/src/core/events/legacy-storage/index.ts +5 -0
  575. package/src/core/events/legacy-storage/inventory.ts +51 -0
  576. package/src/core/events/legacy-storage/manifest.ts +136 -0
  577. package/src/core/events/legacy-storage/reader.ts +178 -0
  578. package/src/core/events/v3/authority-outbox.ts +22 -1
  579. package/src/core/events/v3/base-contract.ts +56 -7
  580. package/src/core/events/v3/bootstrap.ts +195 -2
  581. package/src/core/events/v3/capabilities.ts +37 -3
  582. package/src/core/events/v3/control-witness.ts +339 -0
  583. package/src/core/events/v3/control-writer.ts +16 -0
  584. package/src/core/events/v3/control.ts +54 -18
  585. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  586. package/src/core/events/v3/coordination-view.ts +17 -1
  587. package/src/core/events/v3/generated.ts +1 -1
  588. package/src/core/events/v3/index.ts +26 -2
  589. package/src/core/events/v3/latency.ts +213 -2
  590. package/src/core/events/v3/live-route-observer.ts +80 -0
  591. package/src/core/events/v3/live-routing.ts +182 -45
  592. package/src/core/events/v3/producers/command-recorder.ts +10 -1
  593. package/src/core/events/v3/producers/coordination-recorder.ts +112 -15
  594. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  595. package/src/core/events/v3/producers/hook-base.ts +116 -2
  596. package/src/core/events/v3/producers/intake.ts +48 -2
  597. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  598. package/src/core/events/v3/producers/recorder.ts +1403 -30
  599. package/src/core/events/v3/reader.ts +243 -2
  600. package/src/core/events/v3/rotation-config.ts +98 -0
  601. package/src/core/events/v3/runtime-build.ts +41 -0
  602. package/src/core/events/v3/runtime-identity.ts +16 -0
  603. package/src/core/events/v3/runtime-telemetry-capabilities.ts +143 -0
  604. package/src/core/events/v3/support-storage/classify.ts +209 -0
  605. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  606. package/src/core/events/v3/support-storage/index.ts +9 -0
  607. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  608. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  609. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  610. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  611. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  612. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  613. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  614. package/src/core/events/v3/turn-telemetry.ts +66 -5
  615. package/src/core/events/v3/writer.ts +168 -16
  616. package/src/core/governor/plan-read.ts +5 -18
  617. package/src/core/governor/planning.ts +5 -8
  618. package/src/core/governor/service-read.ts +320 -2
  619. package/src/core/governor/service.ts +49 -22
  620. package/src/core/guard/evidence-v3.ts +1 -0
  621. package/src/core/hooks/adapter/events.ts +1 -0
  622. package/src/core/hooks/adapter/output.ts +12 -5
  623. package/src/core/hooks/adapter/parse.ts +16 -0
  624. package/src/core/hooks/adapter/runtime-telemetry.ts +1200 -0
  625. package/src/core/hooks/cli.ts +342 -64
  626. package/src/core/hooks/effects/image-capture.ts +4 -1
  627. package/src/core/hooks/remediation-cap.ts +83 -0
  628. package/src/core/hooks/resolve/coord-root.ts +91 -11
  629. package/src/core/hooks/resolve/owner.ts +4 -0
  630. package/src/core/hooks/resolve/transcript.ts +55 -11
  631. package/src/core/inbox/contract.ts +81 -0
  632. package/src/core/inbox/index.ts +4 -0
  633. package/src/core/inbox/lifecycle.ts +104 -0
  634. package/src/core/inbox/service.ts +305 -0
  635. package/src/core/inbox/watcher.ts +36 -0
  636. package/src/core/presence/codec-digest.ts +15 -9
  637. package/src/core/presence/relay-client.ts +55 -7
  638. package/src/core/semantic/adapters.ts +452 -0
  639. package/src/core/semantic/contract.ts +430 -0
  640. package/src/core/semantic/evidence.ts +336 -0
  641. package/src/core/semantic/index.ts +201 -0
  642. package/src/core/semantic/once.ts +496 -0
  643. package/src/core/semantic/prompt.ts +96 -0
  644. package/src/core/semantic/review.ts +803 -0
  645. package/src/core/semantic/routes.ts +30 -0
  646. package/src/core/semantic/scheduler.ts +151 -0
  647. package/src/core/semantic/service-status.ts +212 -0
  648. package/src/core/semantic/service.ts +681 -0
  649. package/src/core/semantic/soak.ts +638 -0
  650. package/src/core/semantic/storage.ts +300 -0
  651. package/src/core/semantic/usage.ts +272 -0
  652. package/src/core/semantic/validate.ts +243 -0
  653. package/src/core/storage/buffer.ts +124 -0
  654. package/src/core/storage/builtins.ts +916 -0
  655. package/src/core/storage/catalog.ts +467 -0
  656. package/src/core/storage/config.ts +423 -0
  657. package/src/core/storage/contract.ts +342 -0
  658. package/src/core/storage/durable-history.ts +738 -0
  659. package/src/core/storage/health.ts +76 -0
  660. package/src/core/storage/index.ts +15 -0
  661. package/src/core/storage/inventory.ts +859 -0
  662. package/src/core/storage/jsonl.ts +213 -0
  663. package/src/core/storage/log-retention.ts +555 -0
  664. package/src/core/storage/logger.ts +546 -0
  665. package/src/core/storage/maintenance-providers.ts +200 -0
  666. package/src/core/storage/maintenance.ts +929 -0
  667. package/src/core/storage/metrics.ts +199 -0
  668. package/src/core/storage/policy.ts +141 -0
  669. package/src/core/storage/process-log.ts +203 -0
  670. package/src/core/storage/query.ts +360 -0
  671. package/src/core/storage/receipts.ts +162 -0
  672. package/src/core/storage/segments.ts +721 -0
  673. package/src/core/storage/sink-graph.ts +343 -0
  674. package/src/core/storage/storm-control.ts +91 -0
  675. package/src/core/work/state.ts +12 -21
  676. package/src/core/workflow/live-session-v3.ts +2 -4
  677. package/src/index.ts +2 -0
  678. package/src/lazy-commands.ts +294 -0
  679. package/src/lib/browser/client.ts +21 -0
  680. package/src/lib/browser/index.ts +4 -0
  681. package/src/lib/browser/standalone-html.ts +312 -0
  682. package/src/lib/docs-lint.ts +58 -77
  683. package/src/lib/docs-metadata-audit.ts +26 -21
  684. package/src/lib/docs-metadata-sync.ts +32 -9
  685. package/src/lib/docs-repository-view.ts +220 -0
  686. package/src/lib/http/client.ts +44 -8
  687. package/src/lib/http/index.ts +6 -1
  688. package/src/lib/indexer-exclusions.ts +173 -0
  689. package/src/lib/instructions/apply.ts +1 -0
  690. package/src/lib/instructions/templates.ts +154 -4
  691. package/src/lib/local-file-url.ts +31 -0
  692. package/src/lib/web-performance.ts +335 -0
@@ -16,36 +16,40 @@
16
16
  * `.harnery/debug/agent-hook.errors.ndjson` for audit but never break the
17
17
  * adapter flow.
18
18
  */
19
- import { spawnSync } from "node:child_process";
19
+ import { spawn, spawnSync } from "node:child_process";
20
20
  import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
21
21
  import { dirname, join } from "node:path";
22
22
  import { coordEnv } from "../../lib/env.js";
23
23
  import { buildInstructionBundle } from "../../lib/instructions/bundle.js";
24
24
  import { coordBinPath } from "../agents/coord-bin.js";
25
+ import { resolveCoordRoot } from "../agents/coord-client.js";
25
26
  import { classifyWriteClaimFinalization, formatWriteClaimFinalizationDenial, } from "../agents/finalization.js";
27
+ import { restoreLiveCoordinationStateAfterEpochV3 } from "../agents/live-authority-v3.js";
26
28
  import { evaluateStopHook, STOP_REMEDIATION_MARKER } from "../agents/rules/stop-hook.js";
27
- import { assistantTextStartsWithSessionNameBlock, isSessionNameRemediationCommand, sessionNameDisplayInstruction, sessionNameDisplayPending, toolResponseMintedSessionName, } from "../agents/session-name-display.js";
28
- import { stampSessionNameSeen } from "../agents/state/heartbeat-writer.js";
29
+ import { assistantTextStartsWithSessionNameBlock, isSessionNameRemediationCommand, sessionNameDisplayInstruction, sessionNameDisplayPending, sessionNameDisplayRecoveryInstruction, toolResponseMintedSessionName, } from "../agents/session-name-display.js";
30
+ import { readHeartbeat, stampSessionNameSeen } from "../agents/state/heartbeat-writer.js";
29
31
  import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.js";
32
+ import { ensureLiveCoordinationHeartbeat } from "../agents/state/live-coordination-writer.js";
30
33
  import { writePidmapRow } from "../agents/state/pidmap.js";
31
34
  import { agentsRequireGitFinalization, resolveBinName } from "../config.js";
32
35
  import { checkpointContext, completeContextRecovery, extractContextSample, markContextCompactionCompleted, prepareContextRecovery, readContextState, recordContextSample, } from "../context/index.js";
33
36
  import { tryWriteLiveDisplayV3 } from "../events/v3/live-feed.js";
34
- import { recordLiveHookSignalV3, resolveLiveEventLedgerRouteV3, } from "../events/v3/live-routing.js";
37
+ import { liveHookSignalDefersDrainV3, reconcileLivePendingRuntimeContextV3, recordLiveDelegatedChildSessionV3, recordLiveHookSignalV3, resolveLiveEventLedgerRouteV3, } from "../events/v3/live-routing.js";
35
38
  import { captureSpanClockV3 } from "../events/v3/span-state.js";
36
- import { fetchPresence } from "../presence/index.js";
39
+ import { ensureRelayDaemon, fetchPresence, publishPresence } from "../presence/index.js";
40
+ import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
37
41
  import { stableScopeId } from "../workflow/scope-id.js";
38
42
  import { detectAdapter, shouldSkipHookAdapter } from "./adapter/detect.js";
39
43
  import { extractBashCommand, extractToolDescription, normalizeEventName, parsePayload, } from "./adapter/parse.js";
44
+ import { discoverCodexSessionTranscript } from "./adapter/runtime-telemetry.js";
40
45
  import { codexWslFileLinkTelemetry, inspectCodexWslBridge, isWslUncPath, renderCodexWslFileLinkContext, } from "./codex-wsl-bridge.js";
41
46
  import { captureImages, detectPresence, imageJanitor, journalArchive, journalJanitor, journalRecoveryCue, playSound, recordImageArtifactsV3, resetSoundCounters, runSessionSyncExtension, soundForEvent, } from "./effects/index.js";
42
47
  import { toolInputHash, toolTargetHash } from "./events/input-hash.js";
43
48
  import { canonicalize } from "./guard-path.js";
44
49
  import { adapterPidFromEnv, parsePsChainLine, selectAnchorPid } from "./resolve/anchor.js";
45
- import { findCoordRoot } from "./resolve/coord-root.js";
46
50
  import { extractIntentComment, resolveIntent } from "./resolve/intent.js";
47
51
  import { resolveOwner } from "./resolve/owner.js";
48
- import { inspectSessionNameDisplayImmediately, scanAssistantTextIncludes, scanSessionNameDisplayedImmediately, scanStatusBoxPresent, scanTranscriptModel, } from "./resolve/transcript.js";
52
+ import { inspectSessionNameDisplayImmediately, scanAssistantStatusBoxPresent, scanSessionNameDisplayedImmediately, scanStatusBoxPresent, scanTranscriptRuntime, } from "./resolve/transcript.js";
49
53
  import { sessionNamePresence } from "./session-name-presence.js";
50
54
  import { unsafeCrossShellReason } from "./unsafe-cross-shell.js";
51
55
  function parseArgv(argv) {
@@ -67,6 +71,10 @@ function parseArgv(argv) {
67
71
  }
68
72
  return out;
69
73
  }
74
+ function extraArg(extra, name) {
75
+ const index = extra.indexOf(name);
76
+ return index >= 0 ? extra[index + 1] : undefined;
77
+ }
70
78
  async function readStdin() {
71
79
  if (process.stdin.isTTY)
72
80
  return "";
@@ -92,6 +100,15 @@ function childEnv(coordRoot) {
92
100
  return { ...process.env, HARNERY_COORD_ROOT_OVERRIDE: coordRoot };
93
101
  }
94
102
  function appendDebug(coordRoot, entry) {
103
+ if (coordEnv("SHARED_LOGS") !== "0") {
104
+ try {
105
+ processLogger(coordRoot, "agent-hook").debug("agent_hook.diagnostic", legacyLogFields(entry));
106
+ return;
107
+ }
108
+ catch {
109
+ /* fall through to the rollback writer */
110
+ }
111
+ }
95
112
  const path = join(coordRoot, ".harnery", "debug", "agent-hook.ndjson");
96
113
  try {
97
114
  mkdirSync(dirname(path), { recursive: true });
@@ -104,6 +121,15 @@ function appendDebug(coordRoot, entry) {
104
121
  function logError(coordRoot, err, context) {
105
122
  if (!coordRoot)
106
123
  return;
124
+ if (coordEnv("SHARED_LOGS") !== "0") {
125
+ try {
126
+ processLogger(coordRoot, "agent-hook").error("agent_hook.error", legacyLogFields(context), err);
127
+ return;
128
+ }
129
+ catch {
130
+ /* fall through to the rollback writer */
131
+ }
132
+ }
107
133
  const path = join(coordRoot, ".harnery", "debug", "agent-hook.errors.ndjson");
108
134
  try {
109
135
  mkdirSync(dirname(path), { recursive: true });
@@ -221,7 +247,7 @@ function buildEventData(eventType, ctx) {
221
247
  // Claude Code's SessionStart payload omits `model` (Codex + Cursor
222
248
  // supply it). Fall back to the transcript, populated on `resume`, and
223
249
  // backfilled later by `turn.completed` for a fresh startup session.
224
- model: p?.model ?? scanTranscriptModel(p?.transcript_path),
250
+ model: p?.model ?? scanTranscriptRuntime(p?.transcript_path)?.model,
225
251
  pid: adapterPid,
226
252
  source: p?.source,
227
253
  platform: adapterPlatform,
@@ -282,7 +308,7 @@ function buildEventData(eventType, ctx) {
282
308
  // Backfill the model for adapters that omit it at session.started
283
309
  // (Claude Code). The transcript is populated with assistant turns by
284
310
  // Stop-hook time, so this resolves even for fresh `startup` sessions.
285
- model: p?.model ?? scanTranscriptModel(p?.transcript_path),
311
+ model: p?.model ?? scanTranscriptRuntime(p?.transcript_path)?.model,
286
312
  // Phase 2: tool_call_count + text_length aren't cheaply available
287
313
  // from the Stop payload alone (they'd require a transcript scan that
288
314
  // races with the JSONL flush). Emit `-1` / `0` sentinels and let
@@ -296,22 +322,25 @@ function buildEventData(eventType, ctx) {
296
322
  // the verdict now sees because agent-hook emits this turn.completed itself
297
323
  // (the previous path passed those via the no-history fail-open).
298
324
  status_box_present: scanStatusBoxPresent(p?.transcript_path) || lastAssistantMessage.includes("┌─ agent-"),
299
- // Shadow measurement for the rule-2/3 detector: the loose scan above
325
+ // Assistant-text evidence for the rule-2/3 detector: the loose scan above
300
326
  // matches the box prefix ANYWHERE in the transcript tail, including
301
327
  // the tool_result row the status command itself writes, so it can
302
328
  // report a paste that never happened. The strict variant counts
303
329
  // assistant text only (same window, same scanner as the session-name
304
- // detection). Telemetry-only: the Stop verdict still reads
305
- // status_box_present. Once the divergence rate between the two fields
306
- // is known, the gate either flips to strict or the rule gets
307
- // reconsidered; either way this field decides it with data.
308
- status_box_present_strict: scanAssistantTextIncludes(p?.transcript_path, "┌─ agent-") ||
309
- lastAssistantMessage.includes("┌─ agent-"),
330
+ // detection). The Stop verdict enforces this field; the loose field is
331
+ // retained as diagnostic telemetry for the measured detector divergence.
332
+ status_box_present_strict: scanAssistantStatusBoxPresent(p?.transcript_path, lastAssistantMessage),
310
333
  // Whether the session's suggested name is satisfied as of this turn,
311
334
  // and which name that refers to. Reported on every stop while a name
312
335
  // exists (the stop-hook.session_name verdict reads it per turn); the
313
336
  // transcript scan itself stops once the name has been sighted.
314
- ...sessionNamePresence(ctx.coordRoot, ctx.instanceId, (name) => scanSessionNameDisplayedImmediately(p?.transcript_path, name, assistantTextStartsWithSessionNameBlock)),
337
+ ...sessionNamePresence(ctx.coordRoot, ctx.instanceId, (name) => scanSessionNameDisplayedImmediately(
338
+ // Codex stops carry no transcript_path; discover the rollout by
339
+ // session id so the naming ritual can verify and stamp there too.
340
+ p?.transcript_path ??
341
+ (ctx.adapter === "codex"
342
+ ? discoverCodexSessionTranscript(p?.session_id ?? ctx.instanceId)
343
+ : undefined), name, assistantTextStartsWithSessionNameBlock)),
315
344
  ...(fileLinkTelemetry ?? {}),
316
345
  stop_hook_active: p?.stop_hook_active,
317
346
  };
@@ -321,7 +350,8 @@ function buildEventData(eventType, ctx) {
321
350
  // Subagents inherit parent's name via the resolve-name session_id path
322
351
  // (agent-coord/state/names.ts → kind=transient). Use the call ID as the
323
352
  // instance_id input; assignName falls through to transient.
324
- const assigned = assignNameViaAgentCoord(ctx.coordRoot, ctx.instanceId, "subagent");
353
+ const childInstanceId = subagentCallId ?? ctx.instanceId;
354
+ const assigned = assignNameViaAgentCoord(ctx.coordRoot, childInstanceId, "subagent");
325
355
  return {
326
356
  agent_type: p?.raw.agent_type ??
327
357
  p?.raw.subagent_type ??
@@ -329,7 +359,7 @@ function buildEventData(eventType, ctx) {
329
359
  prompt_summary: p?.raw.prompt_summary,
330
360
  name: assigned?.name,
331
361
  kind: "subagent",
332
- agent_id: ctx.instanceId,
362
+ agent_id: childInstanceId,
333
363
  subagent_call_id: subagentCallId,
334
364
  parent_session_id: p?.parent_session_id,
335
365
  };
@@ -448,7 +478,7 @@ async function main() {
448
478
  // `--adapter cursor` dispatch of the same payload carries the session.
449
479
  if (shouldSkipHookAdapter(adapter, raw)) {
450
480
  if (coordEnv("AGENT_COORD_OFF") !== "1") {
451
- const coordRoot = findCoordRoot(process.cwd());
481
+ const coordRoot = resolveCoordRoot(process.cwd());
452
482
  if (coordRoot) {
453
483
  appendDebug(coordRoot, {
454
484
  ts: new Date().toISOString(),
@@ -472,17 +502,24 @@ async function main() {
472
502
  if (adapter === "claude-code" && eventName) {
473
503
  const s = soundForEvent(eventName);
474
504
  if (s) {
475
- const repoRoot = findCoordRoot(process.cwd());
505
+ const repoRoot = resolveCoordRoot(process.cwd());
476
506
  if (repoRoot) {
477
507
  let sid = "";
508
+ let stopContinuation = false;
478
509
  try {
479
510
  const j = JSON.parse(raw);
480
511
  sid = j.session_id ?? j.conversation_id ?? "";
512
+ // A stop with stop_hook_active is a remediation continuation of a
513
+ // turn that already chimed; replaying the sound on every bounce
514
+ // turns a blocked-stop loop into a repeating alarm.
515
+ stopContinuation = eventName === "stop" && j.stop_hook_active === true;
481
516
  }
482
517
  catch {
483
518
  // non-JSON payload: play unkeyed (rate-limit just won't dedup)
484
519
  }
485
- playSound(repoRoot, s.sound, sid, s.maxPlays);
520
+ if (!stopContinuation) {
521
+ playSound(repoRoot, s.sound, sid, s.maxPlays);
522
+ }
486
523
  }
487
524
  }
488
525
  }
@@ -492,9 +529,12 @@ async function main() {
492
529
  // bypass during incident triage.
493
530
  if (coordEnv("AGENT_COORD_OFF") === "1")
494
531
  return 0;
495
- const coordRoot = findCoordRoot(process.cwd());
532
+ const coordRoot = resolveCoordRoot(process.cwd());
496
533
  if (!coordRoot)
497
534
  return 0;
535
+ if (eventName === "runtime-context-retry") {
536
+ return runRuntimeContextRetryWorker(coordRoot, adapter, extra);
537
+ }
498
538
  const ledgerRoute = resolveLiveEventLedgerRouteV3(coordRoot);
499
539
  // Always log a breadcrumb, useful when an event_type maps to null or owner
500
540
  // resolution fails. Stays cheap (one append) and self-prunes via repo log
@@ -513,6 +553,30 @@ async function main() {
513
553
  appendDebug(coordRoot, { ...debugBase, skipped: "missing-event-or-adapter" });
514
554
  return 0;
515
555
  }
556
+ // Cursor's preToolUse `agent_message` is only the current narration before
557
+ // that tool. It is not a transcript and therefore cannot prove that an
558
+ // earlier assistant response omitted the required session-name block.
559
+ // afterAgentResponse is the one native boundary that carries the completed
560
+ // assistant text, so stamp a positive sighting here without retaining or
561
+ // emitting the response body into V3.
562
+ if (adapter === "cursor" && eventName === "after-agent-response") {
563
+ const payload = parsePayload(raw, adapter);
564
+ const owner = resolveOwner({ payload: payload?.raw ?? null, coordRoot });
565
+ if (!owner) {
566
+ appendDebug(coordRoot, { ...debugBase, skipped: "no-owner-resolved" });
567
+ return 0;
568
+ }
569
+ const name = sessionNameDisplayPending(readLiveCoordinationRow(coordRoot, owner.instance_id));
570
+ const text = typeof payload?.raw.text === "string" ? payload.raw.text : "";
571
+ if (name && assistantTextStartsWithSessionNameBlock(text, name)) {
572
+ stampSessionNameSeen(coordRoot, owner.instance_id, name);
573
+ appendDebug(coordRoot, { ...debugBase, effect: "session-name-display-stamped" });
574
+ }
575
+ else {
576
+ appendDebug(coordRoot, { ...debugBase, skipped: "no-session-name-sighting" });
577
+ }
578
+ return 0;
579
+ }
516
580
  const norm = normalizeEventName(eventName);
517
581
  if (!norm) {
518
582
  appendDebug(coordRoot, { ...debugBase, skipped: "non-canonical-event" });
@@ -532,6 +596,7 @@ async function main() {
532
596
  return 0;
533
597
  }
534
598
  const sessionId = payload?.session_id ?? payload?.conversation_id ?? owner.instance_id;
599
+ const priorCoordination = readHeartbeat(coordRoot, owner.instance_id);
535
600
  const data = buildEventData(norm.event_type, {
536
601
  coordRoot,
537
602
  payload,
@@ -571,6 +636,7 @@ async function main() {
571
636
  logError(coordRoot, err, { phase: "image-capture" });
572
637
  }
573
638
  }
639
+ const deferV3Drain = liveHookSignalDefersDrainV3(eventName, coordEnv("EXPERIMENT_DEFER_V3_DRAIN"));
574
640
  const v3Result = recordLiveHookSignalV3({
575
641
  coordRoot,
576
642
  route: ledgerRoute,
@@ -593,16 +659,60 @@ async function main() {
593
659
  monotonic_ns: hookClock.monotonic_ns,
594
660
  ...(stopRemediation ? { stop_remediation: true } : {}),
595
661
  ...(turnRitual ? { turn_ritual: turnRitual } : {}),
596
- ...(coordEnv("EXPERIMENT_DEFER_V3_DRAIN") === "1" ? { defer_drain: true } : {}),
662
+ ...(deferV3Drain ? { defer_drain: true } : {}),
597
663
  });
664
+ const recordedGenerationId = v3Result && "event" in v3Result && "generation_id" in v3Result.event.scope
665
+ ? v3Result.event.scope.generation_id
666
+ : undefined;
667
+ if (v3Result?.state === "recorded" || v3Result?.state === "already_started") {
668
+ try {
669
+ restoreLiveCoordinationStateAfterEpochV3({
670
+ coordRoot,
671
+ owner: owner.instance_id,
672
+ nativeSessionId: sessionId,
673
+ adapter,
674
+ prior: priorCoordination,
675
+ currentGenerationId: recordedGenerationId,
676
+ });
677
+ }
678
+ catch (error) {
679
+ logError(coordRoot, error, { phase: "epoch-coordination-restore" });
680
+ }
681
+ }
598
682
  const v3EventId = v3Result && "event" in v3Result
599
683
  ? v3Result.event.event_id
600
684
  : v3Result && "event_id" in v3Result
601
685
  ? v3Result.event_id
602
686
  : undefined;
687
+ if (norm.event_type === "agent.started" &&
688
+ payload &&
689
+ v3Result?.state === "recorded" &&
690
+ v3Result.event.event_type === "agent.started") {
691
+ try {
692
+ const childResult = recordLiveDelegatedChildSessionV3({
693
+ coordRoot,
694
+ route: ledgerRoute,
695
+ parentEvent: v3Result.event,
696
+ payload,
697
+ adapter,
698
+ ...(adapter === "codex" && isWslUncPath(payload.cwd)
699
+ ? { bridge: "codex-wsl" }
700
+ : {}),
701
+ monotonic_ns: hookClock.monotonic_ns,
702
+ });
703
+ const nativeChild = payload.subagent_id ?? payload.agent_id;
704
+ if (nativeChild &&
705
+ (childResult.state === "recorded" || childResult.state === "already_started")) {
706
+ ensureLiveCoordinationHeartbeat(coordRoot, nativeChild, sessionId, adapter, payload.model);
707
+ }
708
+ }
709
+ catch (err) {
710
+ logError(coordRoot, err, { phase: "subagent-child-session-start" });
711
+ }
712
+ }
603
713
  if (v3Result?.state === "recorded" && capturedImages.length > 0) {
604
714
  try {
605
- recordImageArtifactsV3(coordRoot, v3Result.event, capturedImages);
715
+ recordImageArtifactsV3(coordRoot, v3Result.event, capturedImages, ledgerRoute.genesis_id);
606
716
  }
607
717
  catch (err) {
608
718
  logError(coordRoot, err, { phase: "image-artifact-observation" });
@@ -693,6 +803,35 @@ async function main() {
693
803
  if (adapter === "claude-code")
694
804
  journalJanitor(coordRoot);
695
805
  imageJanitor(coordRoot);
806
+ // Session start is the only caller of the artifact janitor and the storage
807
+ // maintenance pass, so both load here instead of on every tool call.
808
+ const { autoCleanArtifacts } = await import("../artifacts/index.js");
809
+ const { createAutomaticMaintenanceComposition, runAutomaticMaintenancePass } = await import("../storage/maintenance-providers.js");
810
+ // Effect: throttled daily sweep of expired artifact workspaces (guarded,
811
+ // managed-expired only; see autoCleanArtifacts). Best-effort like every
812
+ // janitor here: a failure logs and never blocks session start.
813
+ try {
814
+ autoCleanArtifacts(coordRoot);
815
+ }
816
+ catch (err) {
817
+ logError(coordRoot, err, { phase: "artifact-auto-clean" });
818
+ }
819
+ // Plan one bounded, claim-first global slice from cached pressure only.
820
+ // Existing owner janitors above remain the only active executors until
821
+ // each provider receives a separate production activation.
822
+ try {
823
+ await runAutomaticMaintenancePass(createAutomaticMaintenanceComposition(coordRoot, {
824
+ journal: () => {
825
+ if (adapter === "claude-code")
826
+ journalJanitor(coordRoot);
827
+ },
828
+ images: () => imageJanitor(coordRoot),
829
+ artifacts: () => autoCleanArtifacts(coordRoot),
830
+ }));
831
+ }
832
+ catch (err) {
833
+ logError(coordRoot, err, { phase: "storage-maintenance-auto" });
834
+ }
696
835
  let recovery = null;
697
836
  if (payload?.source === "compact") {
698
837
  try {
@@ -719,10 +858,13 @@ async function main() {
719
858
  catch (err) {
720
859
  logError(coordRoot, err, { phase: "session-start-systemMessage" });
721
860
  }
722
- // Pull advisory cross-machine presence. V3 never publishes from the
723
- // disposable heartbeat cache.
861
+ // Cross-machine presence is derived from the authority-safe V3 projection,
862
+ // not the disposable heartbeat cache. Announce this session, pull peers,
863
+ // and keep the optional live relay connected.
724
864
  try {
865
+ publishPresence(coordRoot);
725
866
  fetchPresence(coordRoot);
867
+ ensureRelayDaemon(coordRoot);
726
868
  }
727
869
  catch (err) {
728
870
  logError(coordRoot, err, { phase: "session-start-presence" });
@@ -743,12 +885,21 @@ async function main() {
743
885
  journalArchive(coordRoot, owner.instance_id);
744
886
  runSessionSyncExtension(coordRoot, true);
745
887
  }
888
+ // Publish the post-cleanup V3 projection so remote machines see this
889
+ // session disappear without waiting for the stale window.
890
+ try {
891
+ publishPresence(coordRoot);
892
+ }
893
+ catch (err) {
894
+ logError(coordRoot, err, { phase: "session-end-presence" });
895
+ }
746
896
  }
747
- // Phase 8: SubagentStart: sync-project to create the subagent heartbeat,
748
- // log the lifecycle event, and emit a context message announcing the
749
- // subagent (claude-code + cursor; codex doesn't fan out subagents today).
897
+ // Phase 8: SubagentStart: the child generation was opened above from the
898
+ // native delegation identity. Refresh its disposable projection, log the
899
+ // lifecycle event, and emit a context message announcing the subagent.
750
900
  if (norm.event_type === "agent.started") {
751
901
  try {
902
+ const childInstanceId = data.agent_id ?? owner.instance_id;
752
903
  const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
753
904
  if (existsSync(agentCoordBin)) {
754
905
  spawnSync(agentCoordBin, ["project"], {
@@ -758,12 +909,12 @@ async function main() {
758
909
  });
759
910
  spawnSync(agentCoordBin, [
760
911
  "log",
761
- `SUBAGENT_START agent_type=${data.agent_type ?? "unknown"} agent_id=${owner.instance_id.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
912
+ `SUBAGENT_START agent_type=${data.agent_type ?? "unknown"} agent_id=${childInstanceId.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
762
913
  "--instance",
763
- owner.instance_id,
914
+ childInstanceId,
764
915
  ], { encoding: "utf8", timeout: 2000, env: childEnv(coordRoot) });
765
916
  }
766
- emitSubagentStartContext(coordRoot, owner.instance_id, sessionId, data, adapter);
917
+ emitSubagentStartContext(coordRoot, childInstanceId, sessionId, data, adapter);
767
918
  }
768
919
  catch (err) {
769
920
  logError(coordRoot, err, { phase: "subagent-start-project" });
@@ -772,16 +923,19 @@ async function main() {
772
923
  // Phase 8: SubagentStop: delete subagent heartbeat + log.
773
924
  if (norm.event_type === "agent.completed") {
774
925
  try {
775
- cleanupSessionEnd(coordRoot, owner.instance_id, data.reason ?? "unknown");
926
+ const childInstanceId = payload?.subagent_id ?? payload?.agent_id ?? owner.instance_id;
927
+ cleanupSessionEnd(coordRoot, childInstanceId, data.reason ?? "unknown");
776
928
  const agentCoordBin = coordBinPath("agent-coord", coordRoot) ?? "";
777
929
  if (existsSync(agentCoordBin)) {
778
930
  spawnSync(agentCoordBin, [
779
931
  "log",
780
- `SUBAGENT_STOP agent_id=${owner.instance_id.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
932
+ `SUBAGENT_STOP agent_id=${childInstanceId.slice(0, 8)} platform=${adapterPlatform(adapter)}`,
781
933
  "--instance",
782
- owner.instance_id,
934
+ childInstanceId,
783
935
  ], { encoding: "utf8", timeout: 2000, env: childEnv(coordRoot) });
784
936
  }
937
+ const { reconcileSessionFinalizationV3 } = await import("../agents/session-finalizer-v3.js");
938
+ reconcileSessionFinalizationV3(coordRoot, { archive_observations: [] });
785
939
  }
786
940
  catch (err) {
787
941
  logError(coordRoot, err, { phase: "subagent-stop-cleanup" });
@@ -841,6 +995,16 @@ async function main() {
841
995
  if (adapter === "claude-code") {
842
996
  runSessionSyncExtension(coordRoot, false);
843
997
  }
998
+ // Publish after the canonical turn event has landed so the blob carries
999
+ // current task, activity, and claim state. Re-ensure the relay here because
1000
+ // its daemon intentionally exits when a machine has no live sessions.
1001
+ try {
1002
+ publishPresence(coordRoot);
1003
+ ensureRelayDaemon(coordRoot);
1004
+ }
1005
+ catch (err) {
1006
+ logError(coordRoot, err, { phase: "stop-presence" });
1007
+ }
844
1008
  // Stop verdict (V3 ritual + task/status gate). Direct in-process call: the
845
1009
  // rule lives in Harnery. agent-hook already emitted this turn.completed
846
1010
  // with privacy-safe ritual observations, so the evidence is in the stream.
@@ -849,16 +1013,41 @@ async function main() {
849
1013
  instance_id: owner.instance_id,
850
1014
  session_id: sessionId,
851
1015
  adapter,
1016
+ stop_hook_active: payload?.stop_hook_active === true,
1017
+ status_box_present_strict: data.status_box_present_strict === true,
852
1018
  bypass: coordEnv("AGENT_COORD_BYPASS_STOP") === "1",
853
1019
  workflow_child: coordEnv("WORKFLOW_CHILD") === "1",
854
1020
  });
855
1021
  if (!verdict.allow) {
856
- // Adapter-aware enforcement channel: Claude Code honors exit-2 + stderr
857
- // as a turn block; Cursor ignores exit codes and re-prompts only via a
858
- // `followup_message` it auto-submits. Codex returned observe-only above.
859
- // emitStopBlock writes the right shape and returns the exit code to use.
860
- const { emitStopBlock } = await import("./adapter/output.js");
861
- return emitStopBlock(adapter, verdict, coordRoot);
1022
+ // Backstop for sessions whose evidence can never land (e.g. a headless
1023
+ // child whose status command resolves to a different owner): after
1024
+ // `cap` consecutive blocked stops in one cycle, allow the stop instead
1025
+ // of bouncing the model forever. Cycle boundaries come from the
1026
+ // adapter's continuation flag, so adapters without one are unaffected.
1027
+ const { recordRemediationBlock } = await import("./remediation-cap.js");
1028
+ const remediation = recordRemediationBlock(sessionId, payload?.stop_hook_active === true);
1029
+ if (remediation.exceeded) {
1030
+ appendDebug(coordRoot, {
1031
+ ...debugBase,
1032
+ skipped: "stop-remediation-cap-exhausted",
1033
+ blocked_rule: verdict.rule,
1034
+ blocked_count: remediation.count,
1035
+ session_id: sessionId,
1036
+ remediation_cycle_anchor: verdict.remediation_cycle_anchor,
1037
+ });
1038
+ }
1039
+ else {
1040
+ // Adapter-aware enforcement channel: Claude Code honors exit-2 + stderr
1041
+ // as a turn block; Cursor ignores exit codes and re-prompts only via a
1042
+ // `followup_message` it auto-submits. Codex returned observe-only above.
1043
+ // emitStopBlock writes the right shape and returns the exit code to use.
1044
+ const { emitStopBlock } = await import("./adapter/output.js");
1045
+ return emitStopBlock(adapter, verdict, coordRoot);
1046
+ }
1047
+ }
1048
+ else {
1049
+ const { clearRemediationCount } = await import("./remediation-cap.js");
1050
+ clearRemediationCount(sessionId);
862
1051
  }
863
1052
  // An explicit end requested from inside this turn cannot be authoritative
864
1053
  // until the adapter has committed turn.completed above. Reconcile only
@@ -873,6 +1062,8 @@ async function main() {
873
1062
  catch (err) {
874
1063
  logError(coordRoot, err, { phase: "stop-explicit-session-finalization" });
875
1064
  }
1065
+ if (adapter === "codex")
1066
+ scheduleCodexRuntimeContextRetry(coordRoot, sessionId);
876
1067
  }
877
1068
  // Phase 7: PreToolUse: heartbeat + pid-map self-heal on every tool call.
878
1069
  // Adapter-agnostic: both writes have the same shape regardless of who fired.
@@ -900,10 +1091,13 @@ async function main() {
900
1091
  // runs before a name exists; every later tool waits until the exact block
901
1092
  // is the first assistant text after the mint result. Cursor supplies
902
1093
  // agent_message directly; Claude Code and Codex are resolved from their
903
- // JSONL transcripts. Later commentary must not erase an already-correct
904
- // display, and an unreadable transcript must not deadlock every tool.
1094
+ // JSONL transcripts. Cursor's current narration can provide positive
1095
+ // evidence, but cannot disprove an earlier response; afterAgentResponse
1096
+ // stamps that durable sighting. Later commentary must not erase an
1097
+ // already-correct display, and unavailable evidence must not deadlock
1098
+ // every tool.
905
1099
  try {
906
- const displayAllowed = await enforcePendingSessionNameDisplay(coordRoot, owner.instance_id, adapter, payload);
1100
+ const displayAllowed = await enforcePendingSessionNameDisplay(coordRoot, owner.instance_id, adapter, payload, generationBoundHeartbeat(readHeartbeat(coordRoot, owner.instance_id), recordedGenerationId));
907
1101
  if (!displayAllowed)
908
1102
  return 0;
909
1103
  }
@@ -973,33 +1167,84 @@ async function main() {
973
1167
  }
974
1168
  return 0;
975
1169
  }
976
- async function enforcePendingSessionNameDisplay(coordRoot, instanceId, adapter, payload) {
977
- const name = sessionNameDisplayPending(readLiveCoordinationRow(coordRoot, instanceId));
1170
+ function scheduleCodexRuntimeContextRetry(coordRoot, nativeSessionId) {
1171
+ const modulePath = process.argv[1];
1172
+ if (!modulePath)
1173
+ return;
1174
+ try {
1175
+ const child = spawn(process.execPath, [modulePath, "runtime-context-retry", "--adapter", "codex", "--session-id", nativeSessionId], {
1176
+ cwd: coordRoot,
1177
+ detached: true,
1178
+ stdio: "ignore",
1179
+ env: childEnv(coordRoot),
1180
+ });
1181
+ child.unref();
1182
+ }
1183
+ catch (err) {
1184
+ logError(coordRoot, err, { phase: "runtime-context-retry-spawn" });
1185
+ }
1186
+ }
1187
+ async function runRuntimeContextRetryWorker(coordRoot, adapter, extra) {
1188
+ const nativeSessionId = extraArg(extra, "--session-id");
1189
+ if (adapter !== "codex" || !nativeSessionId)
1190
+ return 0;
1191
+ for (const [index, delayMs] of [400, 1_000].entries()) {
1192
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
1193
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
1194
+ if (route.state !== "v3")
1195
+ return 0;
1196
+ const result = reconcileLivePendingRuntimeContextV3({
1197
+ coordRoot,
1198
+ route,
1199
+ nativeSessionId,
1200
+ finalAttempt: index === 1,
1201
+ });
1202
+ if (result.state !== "pending" && result.state !== "busy")
1203
+ return 0;
1204
+ }
1205
+ return 0;
1206
+ }
1207
+ async function enforcePendingSessionNameDisplay(coordRoot, instanceId, adapter, payload, coordination) {
1208
+ const name = sessionNameDisplayPending(coordination);
978
1209
  if (!name)
979
1210
  return true;
980
1211
  const command = extractBashCommand(payload?.tool_name, payload?.tool_input);
981
1212
  if (isSessionNameRemediationCommand(command, resolveBinName(coordRoot)))
982
1213
  return true;
983
- const inspection = payload?.agent_message !== undefined
1214
+ const inspection = adapter === "cursor" && payload?.agent_message !== undefined
984
1215
  ? {
985
1216
  state: assistantTextStartsWithSessionNameBlock(payload.agent_message, name)
986
1217
  ? "present"
987
- : "absent",
988
- }
989
- : inspectSessionNameDisplayImmediately(payload?.transcript_path, name, assistantTextStartsWithSessionNameBlock);
1218
+ : "unavailable",
1219
+ }
1220
+ : inspectSessionNameDisplayImmediately(
1221
+ // Codex hook payloads omit transcript_path on every event, which
1222
+ // left this inspection permanently unavailable and the latch never
1223
+ // stamped. Discover the rollout by session id; the scan only runs
1224
+ // while a name is pending, so the latch closes after one success.
1225
+ payload?.transcript_path ??
1226
+ (adapter === "codex"
1227
+ ? discoverCodexSessionTranscript(payload?.session_id ?? instanceId)
1228
+ : undefined), name, assistantTextStartsWithSessionNameBlock);
990
1229
  if (inspection.state === "present") {
991
1230
  stampSessionNameSeen(coordRoot, instanceId, name);
992
1231
  return true;
993
1232
  }
994
1233
  if (inspection.state === "unavailable") {
995
- const { emitContext } = await import("./adapter/output.js");
996
- emitContext(adapter, "PreToolUse", "Harnery could not verify the pending session-name display because the adapter transcript is unavailable or not flushed yet. This tool is allowed so the session cannot deadlock; display the requested block before later work. Verification remains pending.");
1234
+ // PostToolUse already delivered the exact block for this mint. An
1235
+ // unavailable transcript cannot become evidence, and repeating a generic
1236
+ // reminder on every tool creates an unbounded Codex loop. Keep the latch
1237
+ // honestly pending and fail open without another instruction. A later
1238
+ // readable transcript can still verify it.
997
1239
  return true;
998
1240
  }
999
1241
  const { emitDeny } = await import("./adapter/output.js");
1000
- emitDeny(adapter, sessionNameDisplayInstruction(name));
1242
+ emitDeny(adapter, sessionNameDisplayRecoveryInstruction(name, resolveBinName(coordRoot)));
1001
1243
  return false;
1002
1244
  }
1245
+ function generationBoundHeartbeat(heartbeat, generationId) {
1246
+ return generationId && heartbeat?.v3_generation_id === generationId ? heartbeat : null;
1247
+ }
1003
1248
  async function runPreToolUseGuard(coordRoot, instanceId, sessionId, data, adapter) {
1004
1249
  const toolName = data.tool_name ?? "";
1005
1250
  const rawTargets = collectGuardTargets(toolName, data);
@@ -1322,17 +1567,25 @@ async function emitUserPromptSubmitSystemMessage(coordRoot, instanceId, sessionI
1322
1567
  // Every human-facing adapter gets the first-session naming reminder from
1323
1568
  // the shared hook path. Cursor + Codex additionally get ongoing set-task
1324
1569
  // staleness nudges; Claude Code enforces those via its Stop transcript.
1570
+ // Codex also gets the optional project-owned prompt reminder. Claude Code
1571
+ // already has native output-style reminders, so duplicating it would add
1572
+ // noise. Cursor's current beforeSubmitPrompt output can allow or block but
1573
+ // cannot inject model context; an Always Apply rule is its durable carrier.
1574
+ // Only the boolean route travels through argv, never the host's text.
1575
+ if (adapter === "codex")
1576
+ args.push("--host-prompt-reminder");
1325
1577
  // Codex gets a fresh status-footer reminder on every prompt. Its Stop hook
1326
1578
  // stays observe-only, so missing the footer never replaces the answer.
1327
- // Claude Code + Cursor (the Stop-ENFORCING adapters) get a fresh per-turn
1328
- // ritual reminder: satisfying the contract up front is far cheaper than
1329
- // the bounce-and-retry the Stop hook otherwise forces.
1579
+ // Claude Code gets a fresh per-turn ritual reminder: satisfying the
1580
+ // contract up front is far cheaper than the bounce-and-retry the Stop hook
1581
+ // otherwise forces. Cursor's beforeSubmitPrompt cannot inject context, so
1582
+ // its Stop follow-up remains the supported enforcement channel.
1330
1583
  args.push("--session-name-nudge");
1331
1584
  if (adapter === "cursor" || adapter === "codex")
1332
1585
  args.push("--task-nudge");
1333
1586
  if (adapter === "codex")
1334
1587
  args.push("--status-footer-nudge");
1335
- if (adapter === "claude-code" || adapter === "cursor")
1588
+ if (adapter === "claude-code")
1336
1589
  args.push("--turn-ritual-nudge", adapter);
1337
1590
  const result = spawnSync(agentCoordBin, args, { encoding: "utf8", timeout: 3000 });
1338
1591
  if (result.status === 0 && result.stdout)
@@ -1468,11 +1721,15 @@ function completeRecoveryInjection(coordRoot, instanceId, sessionId, recovery) {
1468
1721
  void recovery;
1469
1722
  }
1470
1723
  main()
1471
- .then((code) => process.exit(code))
1472
- .catch((err) => {
1473
- logError(findCoordRoot(process.cwd()), err, {
1724
+ .then(async (code) => {
1725
+ await closeProcessLoggers();
1726
+ process.exit(code);
1727
+ })
1728
+ .catch(async (err) => {
1729
+ logError(resolveCoordRoot(process.cwd()), err, {
1474
1730
  argv: process.argv.slice(2),
1475
1731
  pid: process.pid,
1476
1732
  });
1733
+ await closeProcessLoggers();
1477
1734
  process.exit(0);
1478
1735
  });