harnery 0.35.0 → 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 (616) 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 -96
  4. package/dist/commands/agents.d.ts +23 -3
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +379 -198
  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 +5 -4
  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/deinit.d.ts.map +1 -1
  18. package/dist/commands/deinit.js +5 -0
  19. package/dist/commands/docs.d.ts.map +1 -1
  20. package/dist/commands/docs.js +13 -2
  21. package/dist/commands/doctor.d.ts +5 -0
  22. package/dist/commands/doctor.d.ts.map +1 -1
  23. package/dist/commands/doctor.js +51 -7
  24. package/dist/commands/fetch.js +6 -5
  25. package/dist/commands/files.d.ts +22 -0
  26. package/dist/commands/files.d.ts.map +1 -0
  27. package/dist/commands/files.js +113 -0
  28. package/dist/commands/governor.js +14 -12
  29. package/dist/commands/inbox.d.ts +5 -0
  30. package/dist/commands/inbox.d.ts.map +1 -0
  31. package/dist/commands/inbox.js +57 -0
  32. package/dist/commands/init.d.ts +4 -5
  33. package/dist/commands/init.d.ts.map +1 -1
  34. package/dist/commands/init.js +63 -13
  35. package/dist/commands/ledger-v3.d.ts.map +1 -1
  36. package/dist/commands/ledger-v3.js +347 -1
  37. package/dist/commands/logs.d.ts +4 -0
  38. package/dist/commands/logs.d.ts.map +1 -0
  39. package/dist/commands/logs.js +169 -0
  40. package/dist/commands/messages.d.ts +5 -0
  41. package/dist/commands/messages.d.ts.map +1 -0
  42. package/dist/commands/messages.js +45 -0
  43. package/dist/commands/outline.d.ts +1 -1
  44. package/dist/commands/outline.d.ts.map +1 -1
  45. package/dist/commands/outline.js +2 -2
  46. package/dist/commands/read.d.ts +1 -1
  47. package/dist/commands/read.d.ts.map +1 -1
  48. package/dist/commands/read.js +2 -2
  49. package/dist/commands/semantic.d.ts.map +1 -1
  50. package/dist/commands/semantic.js +54 -2
  51. package/dist/commands/storage.d.ts +4 -0
  52. package/dist/commands/storage.d.ts.map +1 -0
  53. package/dist/commands/storage.js +238 -0
  54. package/dist/commands/tunnel.d.ts +5 -1
  55. package/dist/commands/tunnel.d.ts.map +1 -1
  56. package/dist/commands/tunnel.js +44 -31
  57. package/dist/commands/web.d.ts +3 -0
  58. package/dist/commands/web.d.ts.map +1 -1
  59. package/dist/commands/web.js +67 -7
  60. package/dist/commands/work.js +3 -3
  61. package/dist/commands/workflow.js +13 -13
  62. package/dist/core/adapters/profiles.d.ts +1 -1
  63. package/dist/core/agents/cli.js +209 -39
  64. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  65. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  66. package/dist/core/agents/live-authority-v3.js +244 -10
  67. package/dist/core/agents/live-lifecycle-v3.js +6 -1
  68. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  69. package/dist/core/agents/live-observation-v3.js +6 -1
  70. package/dist/core/agents/render/prompt-context.d.ts +9 -3
  71. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  72. package/dist/core/agents/render/prompt-context.js +24 -7
  73. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  74. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  75. package/dist/core/agents/rules/stop-hook.js +94 -13
  76. package/dist/core/agents/rules/verdict.d.ts +1 -0
  77. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  78. package/dist/core/agents/session-events.d.ts.map +1 -1
  79. package/dist/core/agents/session-events.js +4 -0
  80. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  81. package/dist/core/agents/session-finalizer-v3.js +5 -1
  82. package/dist/core/agents/state/activity-log.d.ts +3 -0
  83. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  84. package/dist/core/agents/state/activity-log.js +6 -3
  85. package/dist/core/agents/state/heartbeat-writer.d.ts +6 -0
  86. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  87. package/dist/core/agents/state/heartbeat-writer.js +18 -0
  88. package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
  89. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  90. package/dist/core/agents/state/live-coordination-view.js +15 -90
  91. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  92. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  93. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  94. package/dist/core/artifacts/index.d.ts +21 -0
  95. package/dist/core/artifacts/index.d.ts.map +1 -1
  96. package/dist/core/artifacts/index.js +46 -1
  97. package/dist/core/config.d.ts +62 -4
  98. package/dist/core/config.d.ts.map +1 -1
  99. package/dist/core/config.js +98 -4
  100. package/dist/core/conversations/archive.d.ts +49 -0
  101. package/dist/core/conversations/archive.d.ts.map +1 -0
  102. package/dist/core/conversations/archive.js +136 -0
  103. package/dist/core/conversations/catalog.d.ts +10 -0
  104. package/dist/core/conversations/catalog.d.ts.map +1 -0
  105. package/dist/core/conversations/catalog.js +72 -0
  106. package/dist/core/conversations/context-pack.d.ts +6 -0
  107. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  108. package/dist/core/conversations/context-pack.js +60 -0
  109. package/dist/core/conversations/contract.d.ts +155 -0
  110. package/dist/core/conversations/contract.d.ts.map +1 -0
  111. package/dist/core/conversations/contract.js +1 -0
  112. package/dist/core/conversations/evaluation.d.ts +16 -0
  113. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  114. package/dist/core/conversations/evaluation.js +9 -0
  115. package/dist/core/conversations/index.d.ts +10 -0
  116. package/dist/core/conversations/index.d.ts.map +1 -0
  117. package/dist/core/conversations/index.js +9 -0
  118. package/dist/core/conversations/lifecycle.d.ts +28 -0
  119. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  120. package/dist/core/conversations/lifecycle.js +29 -0
  121. package/dist/core/conversations/normalize.d.ts +14 -0
  122. package/dist/core/conversations/normalize.d.ts.map +1 -0
  123. package/dist/core/conversations/normalize.js +82 -0
  124. package/dist/core/conversations/query.d.ts +8 -0
  125. package/dist/core/conversations/query.d.ts.map +1 -0
  126. package/dist/core/conversations/query.js +280 -0
  127. package/dist/core/conversations/search-index.d.ts +9 -0
  128. package/dist/core/conversations/search-index.d.ts.map +1 -0
  129. package/dist/core/conversations/search-index.js +29 -0
  130. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  131. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  132. package/dist/core/events/legacy-storage/canary.js +150 -0
  133. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  134. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  135. package/dist/core/events/legacy-storage/fence.js +115 -0
  136. package/dist/core/events/legacy-storage/index.d.ts +6 -0
  137. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  138. package/dist/core/events/legacy-storage/index.js +5 -0
  139. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  140. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  141. package/dist/core/events/legacy-storage/inventory.js +40 -0
  142. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  143. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  144. package/dist/core/events/legacy-storage/manifest.js +108 -0
  145. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  146. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  147. package/dist/core/events/legacy-storage/reader.js +154 -0
  148. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  149. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  150. package/dist/core/events/v3/authority-outbox.js +16 -3
  151. package/dist/core/events/v3/base-contract.d.ts +81 -41
  152. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  153. package/dist/core/events/v3/base-contract.js +17 -7
  154. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  155. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  156. package/dist/core/events/v3/bootstrap.js +167 -3
  157. package/dist/core/events/v3/capabilities.js +3 -3
  158. package/dist/core/events/v3/control-witness.d.ts +44 -0
  159. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  160. package/dist/core/events/v3/control-witness.js +233 -0
  161. package/dist/core/events/v3/control-writer.d.ts +4 -0
  162. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  163. package/dist/core/events/v3/control-writer.js +16 -0
  164. package/dist/core/events/v3/control.d.ts +8 -2
  165. package/dist/core/events/v3/control.d.ts.map +1 -1
  166. package/dist/core/events/v3/control.js +46 -18
  167. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  168. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  169. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  170. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  171. package/dist/core/events/v3/coordination-view.js +16 -1
  172. package/dist/core/events/v3/generated.d.ts +1 -1
  173. package/dist/core/events/v3/generated.js +1 -1
  174. package/dist/core/events/v3/index.d.ts +4 -2
  175. package/dist/core/events/v3/index.d.ts.map +1 -1
  176. package/dist/core/events/v3/index.js +3 -1
  177. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  178. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  179. package/dist/core/events/v3/live-route-observer.js +58 -0
  180. package/dist/core/events/v3/live-routing.d.ts +13 -21
  181. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  182. package/dist/core/events/v3/live-routing.js +45 -41
  183. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  184. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  185. package/dist/core/events/v3/producers/coordination-recorder.js +76 -10
  186. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  187. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  188. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  189. package/dist/core/events/v3/producers/hook-base.js +1 -1
  190. package/dist/core/events/v3/producers/intake.d.ts +7 -0
  191. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  192. package/dist/core/events/v3/producers/intake.js +25 -2
  193. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  194. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  195. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  196. package/dist/core/events/v3/producers/recorder.d.ts +55 -1
  197. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  198. package/dist/core/events/v3/producers/recorder.js +353 -24
  199. package/dist/core/events/v3/reader.d.ts +51 -0
  200. package/dist/core/events/v3/reader.d.ts.map +1 -1
  201. package/dist/core/events/v3/reader.js +181 -1
  202. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  203. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  204. package/dist/core/events/v3/rotation-config.js +91 -0
  205. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  206. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  207. package/dist/core/events/v3/runtime-build.js +39 -0
  208. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  209. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  210. package/dist/core/events/v3/runtime-identity.js +18 -0
  211. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +6 -5
  212. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
  213. package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
  214. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  215. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  216. package/dist/core/events/v3/support-storage/classify.js +149 -0
  217. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  218. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  219. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  220. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  221. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  222. package/dist/core/events/v3/support-storage/index.js +9 -0
  223. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  224. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  225. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  226. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  227. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  228. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  229. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  230. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  231. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  232. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  233. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  234. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  235. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  236. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  237. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  238. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  239. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  240. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  241. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  242. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  243. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  244. package/dist/core/events/v3/turn-telemetry.d.ts +14 -8
  245. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  246. package/dist/core/events/v3/turn-telemetry.js +32 -2
  247. package/dist/core/events/v3/writer.d.ts +13 -1
  248. package/dist/core/events/v3/writer.d.ts.map +1 -1
  249. package/dist/core/events/v3/writer.js +126 -12
  250. package/dist/core/governor/plan-read.d.ts.map +1 -1
  251. package/dist/core/governor/plan-read.js +5 -21
  252. package/dist/core/governor/planning.js +6 -8
  253. package/dist/core/governor/service-read.d.ts +12 -0
  254. package/dist/core/governor/service-read.d.ts.map +1 -1
  255. package/dist/core/governor/service-read.js +266 -2
  256. package/dist/core/governor/service.d.ts +1 -0
  257. package/dist/core/governor/service.d.ts.map +1 -1
  258. package/dist/core/governor/service.js +53 -18
  259. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  260. package/dist/core/guard/evidence-v3.js +2 -0
  261. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  262. package/dist/core/hooks/adapter/events.js +1 -0
  263. package/dist/core/hooks/adapter/output.d.ts +4 -2
  264. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  265. package/dist/core/hooks/adapter/output.js +13 -5
  266. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
  267. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
  268. package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
  269. package/dist/core/hooks/cli.js +212 -30
  270. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  271. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  272. package/dist/core/hooks/effects/image-capture.js +4 -2
  273. package/dist/core/hooks/remediation-cap.d.ts +8 -3
  274. package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
  275. package/dist/core/hooks/remediation-cap.js +3 -11
  276. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  277. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  278. package/dist/core/hooks/resolve/coord-root.js +92 -11
  279. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  280. package/dist/core/hooks/resolve/owner.js +5 -0
  281. package/dist/core/hooks/resolve/transcript.d.ts +8 -0
  282. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  283. package/dist/core/hooks/resolve/transcript.js +11 -0
  284. package/dist/core/inbox/contract.d.ts +64 -0
  285. package/dist/core/inbox/contract.d.ts.map +1 -0
  286. package/dist/core/inbox/contract.js +13 -0
  287. package/dist/core/inbox/index.d.ts +5 -0
  288. package/dist/core/inbox/index.d.ts.map +1 -0
  289. package/dist/core/inbox/index.js +4 -0
  290. package/dist/core/inbox/lifecycle.d.ts +22 -0
  291. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  292. package/dist/core/inbox/lifecycle.js +41 -0
  293. package/dist/core/inbox/service.d.ts +36 -0
  294. package/dist/core/inbox/service.d.ts.map +1 -0
  295. package/dist/core/inbox/service.js +210 -0
  296. package/dist/core/inbox/watcher.d.ts +7 -0
  297. package/dist/core/inbox/watcher.d.ts.map +1 -0
  298. package/dist/core/inbox/watcher.js +26 -0
  299. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  300. package/dist/core/presence/codec-digest.js +14 -3
  301. package/dist/core/presence/relay-client.d.ts +1 -0
  302. package/dist/core/presence/relay-client.d.ts.map +1 -1
  303. package/dist/core/presence/relay-client.js +52 -8
  304. package/dist/core/semantic/adapters.d.ts +11 -8
  305. package/dist/core/semantic/adapters.d.ts.map +1 -1
  306. package/dist/core/semantic/adapters.js +169 -31
  307. package/dist/core/semantic/contract.d.ts +532 -48
  308. package/dist/core/semantic/contract.d.ts.map +1 -1
  309. package/dist/core/semantic/contract.js +104 -3
  310. package/dist/core/semantic/index.d.ts +7 -3
  311. package/dist/core/semantic/index.d.ts.map +1 -1
  312. package/dist/core/semantic/index.js +7 -3
  313. package/dist/core/semantic/once.d.ts +6 -1
  314. package/dist/core/semantic/once.d.ts.map +1 -1
  315. package/dist/core/semantic/once.js +80 -9
  316. package/dist/core/semantic/prompt.d.ts.map +1 -1
  317. package/dist/core/semantic/prompt.js +14 -1
  318. package/dist/core/semantic/review.d.ts +144 -0
  319. package/dist/core/semantic/review.d.ts.map +1 -0
  320. package/dist/core/semantic/review.js +544 -0
  321. package/dist/core/semantic/routes.d.ts +10 -0
  322. package/dist/core/semantic/routes.d.ts.map +1 -0
  323. package/dist/core/semantic/routes.js +21 -0
  324. package/dist/core/semantic/scheduler.d.ts +14 -3
  325. package/dist/core/semantic/scheduler.d.ts.map +1 -1
  326. package/dist/core/semantic/scheduler.js +30 -6
  327. package/dist/core/semantic/service-status.d.ts +20 -0
  328. package/dist/core/semantic/service-status.d.ts.map +1 -1
  329. package/dist/core/semantic/service-status.js +60 -4
  330. package/dist/core/semantic/service.d.ts +1 -0
  331. package/dist/core/semantic/service.d.ts.map +1 -1
  332. package/dist/core/semantic/service.js +104 -15
  333. package/dist/core/semantic/soak.d.ts +75 -0
  334. package/dist/core/semantic/soak.d.ts.map +1 -0
  335. package/dist/core/semantic/soak.js +476 -0
  336. package/dist/core/semantic/storage.d.ts +11 -1
  337. package/dist/core/semantic/storage.d.ts.map +1 -1
  338. package/dist/core/semantic/storage.js +4 -3
  339. package/dist/core/semantic/usage.d.ts +43 -0
  340. package/dist/core/semantic/usage.d.ts.map +1 -0
  341. package/dist/core/semantic/usage.js +193 -0
  342. package/dist/core/semantic/validate.d.ts +3 -1
  343. package/dist/core/semantic/validate.d.ts.map +1 -1
  344. package/dist/core/semantic/validate.js +34 -1
  345. package/dist/core/storage/buffer.d.ts +28 -0
  346. package/dist/core/storage/buffer.d.ts.map +1 -0
  347. package/dist/core/storage/buffer.js +101 -0
  348. package/dist/core/storage/builtins.d.ts +3 -0
  349. package/dist/core/storage/builtins.d.ts.map +1 -0
  350. package/dist/core/storage/builtins.js +683 -0
  351. package/dist/core/storage/catalog.d.ts +19 -0
  352. package/dist/core/storage/catalog.d.ts.map +1 -0
  353. package/dist/core/storage/catalog.js +365 -0
  354. package/dist/core/storage/config.d.ts +16 -0
  355. package/dist/core/storage/config.d.ts.map +1 -0
  356. package/dist/core/storage/config.js +311 -0
  357. package/dist/core/storage/contract.d.ts +275 -0
  358. package/dist/core/storage/contract.d.ts.map +1 -0
  359. package/dist/core/storage/contract.js +3 -0
  360. package/dist/core/storage/durable-history.d.ts +36 -0
  361. package/dist/core/storage/durable-history.d.ts.map +1 -0
  362. package/dist/core/storage/durable-history.js +606 -0
  363. package/dist/core/storage/health.d.ts +4 -0
  364. package/dist/core/storage/health.d.ts.map +1 -0
  365. package/dist/core/storage/health.js +65 -0
  366. package/dist/core/storage/index.d.ts +16 -0
  367. package/dist/core/storage/index.d.ts.map +1 -0
  368. package/dist/core/storage/index.js +15 -0
  369. package/dist/core/storage/inventory.d.ts +25 -0
  370. package/dist/core/storage/inventory.d.ts.map +1 -0
  371. package/dist/core/storage/inventory.js +666 -0
  372. package/dist/core/storage/jsonl.d.ts +52 -0
  373. package/dist/core/storage/jsonl.d.ts.map +1 -0
  374. package/dist/core/storage/jsonl.js +156 -0
  375. package/dist/core/storage/log-retention.d.ts +52 -0
  376. package/dist/core/storage/log-retention.d.ts.map +1 -0
  377. package/dist/core/storage/log-retention.js +419 -0
  378. package/dist/core/storage/logger.d.ts +82 -0
  379. package/dist/core/storage/logger.d.ts.map +1 -0
  380. package/dist/core/storage/logger.js +411 -0
  381. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  382. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  383. package/dist/core/storage/maintenance-providers.js +141 -0
  384. package/dist/core/storage/maintenance.d.ts +125 -0
  385. package/dist/core/storage/maintenance.d.ts.map +1 -0
  386. package/dist/core/storage/maintenance.js +609 -0
  387. package/dist/core/storage/metrics.d.ts +60 -0
  388. package/dist/core/storage/metrics.d.ts.map +1 -0
  389. package/dist/core/storage/metrics.js +134 -0
  390. package/dist/core/storage/policy.d.ts +7 -0
  391. package/dist/core/storage/policy.d.ts.map +1 -0
  392. package/dist/core/storage/policy.js +110 -0
  393. package/dist/core/storage/process-log.d.ts +38 -0
  394. package/dist/core/storage/process-log.d.ts.map +1 -0
  395. package/dist/core/storage/process-log.js +165 -0
  396. package/dist/core/storage/query.d.ts +34 -0
  397. package/dist/core/storage/query.d.ts.map +1 -0
  398. package/dist/core/storage/query.js +295 -0
  399. package/dist/core/storage/receipts.d.ts +23 -0
  400. package/dist/core/storage/receipts.d.ts.map +1 -0
  401. package/dist/core/storage/receipts.js +117 -0
  402. package/dist/core/storage/segments.d.ts +84 -0
  403. package/dist/core/storage/segments.d.ts.map +1 -0
  404. package/dist/core/storage/segments.js +542 -0
  405. package/dist/core/storage/sink-graph.d.ts +65 -0
  406. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  407. package/dist/core/storage/sink-graph.js +213 -0
  408. package/dist/core/storage/storm-control.d.ts +23 -0
  409. package/dist/core/storage/storm-control.d.ts.map +1 -0
  410. package/dist/core/storage/storm-control.js +59 -0
  411. package/dist/core/work/state.d.ts.map +1 -1
  412. package/dist/core/work/state.js +10 -14
  413. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  414. package/dist/core/workflow/live-session-v3.js +2 -1
  415. package/dist/index.d.ts +2 -0
  416. package/dist/index.d.ts.map +1 -1
  417. package/dist/index.js +2 -0
  418. package/dist/lazy-commands.d.ts +26 -0
  419. package/dist/lazy-commands.d.ts.map +1 -0
  420. package/dist/lazy-commands.js +210 -0
  421. package/dist/lib/docs-lint.d.ts +2 -0
  422. package/dist/lib/docs-lint.d.ts.map +1 -1
  423. package/dist/lib/docs-lint.js +45 -80
  424. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  425. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  426. package/dist/lib/docs-metadata-audit.js +13 -23
  427. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  428. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  429. package/dist/lib/docs-metadata-sync.js +28 -10
  430. package/dist/lib/docs-repository-view.d.ts +22 -0
  431. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  432. package/dist/lib/docs-repository-view.js +185 -0
  433. package/dist/lib/http/client.d.ts +11 -5
  434. package/dist/lib/http/client.d.ts.map +1 -1
  435. package/dist/lib/http/client.js +22 -4
  436. package/dist/lib/http/index.d.ts +1 -1
  437. package/dist/lib/http/index.d.ts.map +1 -1
  438. package/dist/lib/http/index.js +1 -1
  439. package/dist/lib/indexer-exclusions.d.ts +27 -0
  440. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  441. package/dist/lib/indexer-exclusions.js +176 -0
  442. package/dist/lib/instructions/templates.d.ts.map +1 -1
  443. package/dist/lib/instructions/templates.js +5 -0
  444. package/dist/lib/local-file-url.d.ts +9 -0
  445. package/dist/lib/local-file-url.d.ts.map +1 -0
  446. package/dist/lib/local-file-url.js +20 -0
  447. package/dist/lib/web-performance.d.ts +118 -0
  448. package/dist/lib/web-performance.d.ts.map +1 -0
  449. package/dist/lib/web-performance.js +192 -0
  450. package/package.json +29 -2
  451. package/schemas/config.schema.json +58 -0
  452. package/schemas/event-v3.schema.json +324 -112
  453. package/src/commander.ts +462 -95
  454. package/src/commands/agents.ts +517 -190
  455. package/src/commands/backup.ts +18 -14
  456. package/src/commands/browse-session.ts +12 -0
  457. package/src/commands/browse.ts +6 -7
  458. package/src/commands/conversations.ts +279 -0
  459. package/src/commands/deinit.ts +6 -0
  460. package/src/commands/docs.ts +25 -6
  461. package/src/commands/doctor.ts +75 -9
  462. package/src/commands/fetch.ts +7 -6
  463. package/src/commands/files.ts +143 -0
  464. package/src/commands/governor.ts +13 -12
  465. package/src/commands/inbox.ts +61 -0
  466. package/src/commands/init.ts +78 -16
  467. package/src/commands/ledger-v3.ts +421 -1
  468. package/src/commands/logs.ts +224 -0
  469. package/src/commands/messages.ts +61 -0
  470. package/src/commands/outline.ts +6 -2
  471. package/src/commands/read.ts +6 -2
  472. package/src/commands/semantic.ts +66 -1
  473. package/src/commands/storage.ts +310 -0
  474. package/src/commands/tunnel.ts +66 -52
  475. package/src/commands/web.ts +77 -7
  476. package/src/commands/work.ts +3 -3
  477. package/src/commands/workflow.ts +13 -13
  478. package/src/core/agents/cli.ts +259 -53
  479. package/src/core/agents/live-authority-v3.ts +341 -10
  480. package/src/core/agents/live-lifecycle-v3.ts +6 -1
  481. package/src/core/agents/live-observation-v3.ts +6 -1
  482. package/src/core/agents/render/prompt-context.ts +27 -6
  483. package/src/core/agents/rules/stop-hook.ts +107 -16
  484. package/src/core/agents/rules/verdict.ts +1 -0
  485. package/src/core/agents/session-events.ts +4 -0
  486. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  487. package/src/core/agents/session-finalizer-v3.ts +4 -1
  488. package/src/core/agents/state/activity-log.ts +7 -2
  489. package/src/core/agents/state/heartbeat-writer.ts +27 -0
  490. package/src/core/agents/state/live-coordination-view.ts +16 -105
  491. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  492. package/src/core/artifacts/index.ts +64 -1
  493. package/src/core/config.ts +126 -5
  494. package/src/core/conversations/archive.ts +237 -0
  495. package/src/core/conversations/catalog.ts +79 -0
  496. package/src/core/conversations/context-pack.ts +72 -0
  497. package/src/core/conversations/contract.ts +178 -0
  498. package/src/core/conversations/evaluation.ts +30 -0
  499. package/src/core/conversations/index.ts +9 -0
  500. package/src/core/conversations/lifecycle.ts +63 -0
  501. package/src/core/conversations/normalize.ts +105 -0
  502. package/src/core/conversations/query.ts +318 -0
  503. package/src/core/conversations/search-index.ts +48 -0
  504. package/src/core/events/legacy-storage/canary.ts +177 -0
  505. package/src/core/events/legacy-storage/fence.ts +129 -0
  506. package/src/core/events/legacy-storage/index.ts +5 -0
  507. package/src/core/events/legacy-storage/inventory.ts +51 -0
  508. package/src/core/events/legacy-storage/manifest.ts +136 -0
  509. package/src/core/events/legacy-storage/reader.ts +178 -0
  510. package/src/core/events/v3/authority-outbox.ts +22 -1
  511. package/src/core/events/v3/base-contract.ts +17 -7
  512. package/src/core/events/v3/bootstrap.ts +195 -2
  513. package/src/core/events/v3/capabilities.ts +3 -3
  514. package/src/core/events/v3/control-witness.ts +339 -0
  515. package/src/core/events/v3/control-writer.ts +16 -0
  516. package/src/core/events/v3/control.ts +54 -18
  517. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  518. package/src/core/events/v3/coordination-view.ts +17 -1
  519. package/src/core/events/v3/generated.ts +1 -1
  520. package/src/core/events/v3/index.ts +5 -2
  521. package/src/core/events/v3/live-route-observer.ts +80 -0
  522. package/src/core/events/v3/live-routing.ts +64 -46
  523. package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
  524. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  525. package/src/core/events/v3/producers/hook-base.ts +1 -1
  526. package/src/core/events/v3/producers/intake.ts +30 -2
  527. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  528. package/src/core/events/v3/producers/recorder.ts +571 -33
  529. package/src/core/events/v3/reader.ts +243 -2
  530. package/src/core/events/v3/rotation-config.ts +98 -0
  531. package/src/core/events/v3/runtime-build.ts +41 -0
  532. package/src/core/events/v3/runtime-identity.ts +16 -0
  533. package/src/core/events/v3/runtime-telemetry-capabilities.ts +14 -8
  534. package/src/core/events/v3/support-storage/classify.ts +209 -0
  535. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  536. package/src/core/events/v3/support-storage/index.ts +9 -0
  537. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  538. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  539. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  540. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  541. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  542. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  543. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  544. package/src/core/events/v3/turn-telemetry.ts +58 -7
  545. package/src/core/events/v3/writer.ts +168 -16
  546. package/src/core/governor/plan-read.ts +5 -18
  547. package/src/core/governor/planning.ts +5 -8
  548. package/src/core/governor/service-read.ts +320 -2
  549. package/src/core/governor/service.ts +49 -22
  550. package/src/core/guard/evidence-v3.ts +1 -0
  551. package/src/core/hooks/adapter/events.ts +1 -0
  552. package/src/core/hooks/adapter/output.ts +12 -5
  553. package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
  554. package/src/core/hooks/cli.ts +226 -32
  555. package/src/core/hooks/effects/image-capture.ts +4 -1
  556. package/src/core/hooks/remediation-cap.ts +12 -6
  557. package/src/core/hooks/resolve/coord-root.ts +91 -11
  558. package/src/core/hooks/resolve/owner.ts +4 -0
  559. package/src/core/hooks/resolve/transcript.ts +18 -0
  560. package/src/core/inbox/contract.ts +81 -0
  561. package/src/core/inbox/index.ts +4 -0
  562. package/src/core/inbox/lifecycle.ts +104 -0
  563. package/src/core/inbox/service.ts +305 -0
  564. package/src/core/inbox/watcher.ts +36 -0
  565. package/src/core/presence/codec-digest.ts +15 -9
  566. package/src/core/presence/relay-client.ts +55 -7
  567. package/src/core/semantic/adapters.ts +200 -41
  568. package/src/core/semantic/contract.ts +135 -3
  569. package/src/core/semantic/index.ts +76 -2
  570. package/src/core/semantic/once.ts +93 -7
  571. package/src/core/semantic/prompt.ts +13 -1
  572. package/src/core/semantic/review.ts +803 -0
  573. package/src/core/semantic/routes.ts +30 -0
  574. package/src/core/semantic/scheduler.ts +49 -5
  575. package/src/core/semantic/service-status.ts +99 -5
  576. package/src/core/semantic/service.ts +116 -15
  577. package/src/core/semantic/soak.ts +638 -0
  578. package/src/core/semantic/storage.ts +20 -6
  579. package/src/core/semantic/usage.ts +272 -0
  580. package/src/core/semantic/validate.ts +31 -0
  581. package/src/core/storage/buffer.ts +124 -0
  582. package/src/core/storage/builtins.ts +916 -0
  583. package/src/core/storage/catalog.ts +467 -0
  584. package/src/core/storage/config.ts +423 -0
  585. package/src/core/storage/contract.ts +342 -0
  586. package/src/core/storage/durable-history.ts +738 -0
  587. package/src/core/storage/health.ts +76 -0
  588. package/src/core/storage/index.ts +15 -0
  589. package/src/core/storage/inventory.ts +859 -0
  590. package/src/core/storage/jsonl.ts +213 -0
  591. package/src/core/storage/log-retention.ts +555 -0
  592. package/src/core/storage/logger.ts +546 -0
  593. package/src/core/storage/maintenance-providers.ts +200 -0
  594. package/src/core/storage/maintenance.ts +929 -0
  595. package/src/core/storage/metrics.ts +199 -0
  596. package/src/core/storage/policy.ts +141 -0
  597. package/src/core/storage/process-log.ts +203 -0
  598. package/src/core/storage/query.ts +360 -0
  599. package/src/core/storage/receipts.ts +162 -0
  600. package/src/core/storage/segments.ts +721 -0
  601. package/src/core/storage/sink-graph.ts +343 -0
  602. package/src/core/storage/storm-control.ts +91 -0
  603. package/src/core/work/state.ts +12 -21
  604. package/src/core/workflow/live-session-v3.ts +2 -4
  605. package/src/index.ts +2 -0
  606. package/src/lazy-commands.ts +294 -0
  607. package/src/lib/docs-lint.ts +58 -77
  608. package/src/lib/docs-metadata-audit.ts +26 -21
  609. package/src/lib/docs-metadata-sync.ts +32 -9
  610. package/src/lib/docs-repository-view.ts +220 -0
  611. package/src/lib/http/client.ts +44 -8
  612. package/src/lib/http/index.ts +6 -1
  613. package/src/lib/indexer-exclusions.ts +173 -0
  614. package/src/lib/instructions/templates.ts +5 -0
  615. package/src/lib/local-file-url.ts +31 -0
  616. package/src/lib/web-performance.ts +335 -0
@@ -62,13 +62,21 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
62
62
  const ownerEvents = events.filter((event) => event.scope.instance_id === owner &&
63
63
  "generation_id" in event.scope &&
64
64
  event.scope.generation_id === generationId);
65
+ const fallbackStartMs = Math.max(0, endMs - 5 * 60 * 1000);
66
+ const claudeContinuation = req.adapter === "claude-code" && req.stop_hook_active === true;
67
+ const resolvedStart = resolveTurnStart(ownerEvents, endMs, claudeContinuation);
68
+ const resolvedStartMs = eventTimeMs(resolvedStart);
65
69
  const startMs = req.turn_window?.start_ms ??
66
- resolveTurnStartMs(ownerEvents, endMs, Math.max(0, endMs - 5 * 60 * 1000));
70
+ (Number.isFinite(resolvedStartMs) ? resolvedStartMs : fallbackStartMs);
67
71
  const inTurn = ownerEvents.filter((event) => {
68
72
  const time = eventTimeMs(event);
69
73
  return Number.isFinite(time) && time >= startMs && time <= endMs;
70
74
  });
71
- const usedTool = inTurn.some((event) => event.event_type === "tool.requested");
75
+ const policyEvents = claudeContinuation && resolvedStart
76
+ ? originalTurnEvents(ownerEvents, resolvedStart, endMs)
77
+ : inTurn;
78
+ const usedTool = policyEvents.some((event) => event.event_type === "tool.requested");
79
+ const cycleAnchor = remediationCycleAnchor(resolvedStart, startMs);
72
80
  const statusEvents = inTurn.filter((event) => event.event_type === "coord.status_observed" && event.payload.subject_instance_id === owner);
73
81
  const statusChecked = statusEvents.length > 0;
74
82
  const requiredStatusChecked = agentsRequireGitFinalization(coordRoot)
@@ -79,10 +87,18 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
79
87
  const turnTerminals = inTurn.filter((event) => event.event_type === "turn.completed");
80
88
  const latestTerminal = turnTerminals.at(-1);
81
89
  const latestBox = observedBoolean(latestTerminal?.payload.ritual?.status_box_present_strict);
82
- if (req.adapter !== "cursor" && latestBox === undefined) {
90
+ const strictBoxObservations = turnTerminals
91
+ .map((event) => observedBoolean(event.payload.ritual?.status_box_present_strict))
92
+ .filter((value) => value !== undefined);
93
+ const currentStrictBox = claudeContinuation ? req.status_box_present_strict : undefined;
94
+ if (req.adapter !== "cursor" && latestBox === undefined && currentStrictBox === undefined) {
83
95
  return evidenceUnavailable("turn.completed has no observed V3 assistant-text status-box result; Stop remains fail-open");
84
96
  }
85
- const ackPresent = req.adapter === "cursor" ? requiredStatusChecked : latestBox === true;
97
+ const ackPresent = req.adapter === "cursor"
98
+ ? requiredStatusChecked
99
+ : claudeContinuation
100
+ ? strictBoxObservations.includes(true) || currentStrictBox === true
101
+ : latestBox === true;
86
102
  const ackBlock = req.adapter === "cursor"
87
103
  ? () => rule13Block(coordRoot, req.session_id)
88
104
  : () => rule23Block(coordRoot, req.session_id);
@@ -90,7 +106,7 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
90
106
  // task or final-status mutations. This preserves the pre-V3 policy exactly.
91
107
  if (!usedTool) {
92
108
  if (!ackPresent)
93
- return ackBlock();
109
+ return withCycleAnchor(ackBlock(), cycleAnchor);
94
110
  return {
95
111
  allow: true,
96
112
  exit_code: 0,
@@ -98,12 +114,17 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
98
114
  reason: "no tool calls this turn; task and final-status mutations were not required",
99
115
  };
100
116
  }
117
+ // Collect EVERY missing signal before returning. Reporting them one at a
118
+ // time made each additional missing signal cost a whole continuation, and
119
+ // every continuation forks a fresh hook process: on a busy multi-agent host
120
+ // the ritual's own enforcement became part of the hook load it polices.
121
+ const pending = [];
101
122
  if (!requiredStatusChecked)
102
- return rule13Block(coordRoot, req.session_id);
123
+ pending.push(rule13Block(coordRoot, req.session_id));
103
124
  if (!ackPresent)
104
- return ackBlock();
125
+ pending.push(ackBlock());
105
126
  if (!taskSet)
106
- return rule33Block(coordRoot, req.session_id);
127
+ pending.push(rule33Block(coordRoot, req.session_id));
107
128
  // Claude Code can prove session-name presentation from assistant-only text.
108
129
  // Cursor cannot expose that text and Codex returned observe-only above.
109
130
  if (req.adapter !== "cursor") {
@@ -113,9 +134,12 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
113
134
  if (naming.some(({ required }) => required) &&
114
135
  !naming.some(({ present }) => present) &&
115
136
  !sessionNameSeenStamped(coordRoot, req.instance_id)) {
116
- return sessionNameBlock(coordRoot, req.instance_id);
137
+ pending.push(sessionNameBlock(coordRoot, req.instance_id));
117
138
  }
118
139
  }
140
+ const blocked = mergeStopBlocks(pending);
141
+ if (blocked)
142
+ return withCycleAnchor(blocked, cycleAnchor);
119
143
  return { allow: true, exit_code: 0, rule: "stop-hook.pass" };
120
144
  }
121
145
  function unconditionalVerdict(req) {
@@ -145,22 +169,48 @@ function unconditionalVerdict(req) {
145
169
  }
146
170
  return undefined;
147
171
  }
148
- function resolveTurnStartMs(ownerEvents, nowMs, fallbackMs) {
172
+ function resolveTurnStart(ownerEvents, nowMs, claudeContinuation) {
149
173
  const turns = ownerEvents.filter((event) => event.event_type === "turn.started" && eventTimeMs(event) <= nowMs);
150
174
  if (turns.length === 0)
151
- return fallbackMs;
175
+ return undefined;
152
176
  let index = turns.length - 1;
153
177
  let hops = 0;
154
178
  while (index > 0 && hops < MAX_REMEDIATION_WALK_BACK) {
155
179
  const turn = turns[index];
156
- if (!turn?.payload.stop_remediation)
180
+ const continuesCycle = claudeContinuation
181
+ ? turn?.provenance.source_event === "claude-code.recovery" &&
182
+ turn.provenance.attestation === "derived"
183
+ : turn?.payload.stop_remediation === true;
184
+ if (!continuesCycle)
157
185
  break;
158
186
  index -= 1;
159
187
  hops += 1;
160
188
  }
161
- return eventTimeMs(turns[index]);
189
+ return turns[index];
190
+ }
191
+ function originalTurnEvents(ownerEvents, turnStart, endMs) {
192
+ if (!turnStart)
193
+ return [];
194
+ const startMs = eventTimeMs(turnStart);
195
+ const terminal = ownerEvents.find((event) => event.event_type === "turn.completed" && eventTimeMs(event) >= startMs);
196
+ const policyEndMs = terminal ? eventTimeMs(terminal) : endMs;
197
+ return ownerEvents.filter((event) => {
198
+ const time = eventTimeMs(event);
199
+ return time >= startMs && time <= policyEndMs;
200
+ });
201
+ }
202
+ function remediationCycleAnchor(turnStart, startMs) {
203
+ if (turnStart && "turn_id" in turnStart.scope && turnStart.scope.turn_id) {
204
+ return turnStart.scope.turn_id;
205
+ }
206
+ return new Date(startMs).toISOString();
207
+ }
208
+ function withCycleAnchor(verdict, anchor) {
209
+ return { ...verdict, remediation_cycle_anchor: anchor };
162
210
  }
163
211
  function eventTimeMs(event) {
212
+ if (!event)
213
+ return Number.NaN;
164
214
  return Date.parse(event.time.observed_at);
165
215
  }
166
216
  function observedBoolean(value) {
@@ -204,6 +254,37 @@ function evidenceUnavailable(reason) {
204
254
  function sessionIdSuffix(sessionId) {
205
255
  return sessionId ? ` --session-id ${sessionId}` : "";
206
256
  }
257
+ /**
258
+ * Fold every failing end-of-turn signal into ONE verdict.
259
+ *
260
+ * The verdict keeps the first failure's rule id, so the `blocked_rule`
261
+ * telemetry and the adapter's `rule=` stderr contract are unchanged; the
262
+ * reason enumerates the rest so a single continuation can repair all of them.
263
+ * Cursor maps the acknowledgement onto rule 1/3, so identical rules dedupe.
264
+ */
265
+ function mergeStopBlocks(blocks) {
266
+ let primary;
267
+ const seen = new Set();
268
+ const reasons = [];
269
+ for (const block of blocks) {
270
+ if (seen.has(block.rule))
271
+ continue;
272
+ seen.add(block.rule);
273
+ if (!primary)
274
+ primary = block;
275
+ if (block.reason)
276
+ reasons.push(block.reason);
277
+ }
278
+ if (!primary)
279
+ return undefined;
280
+ if (reasons.length < 2)
281
+ return primary;
282
+ const numbered = reasons.map((reason, index) => `${index + 1}. ${reason}`).join("\n");
283
+ return {
284
+ ...primary,
285
+ reason: `End-of-turn ritual: ${reasons.length} signals are missing from this turn. Repair ALL of them in this continuation, then stop.\n${numbered}`,
286
+ };
287
+ }
207
288
  function rule13Block(coordRoot, sessionId) {
208
289
  const missingEvidence = agentsRequireGitFinalization(coordRoot)
209
290
  ? "no end_turn_checked coord.status_observed event found in this turn"
@@ -10,5 +10,6 @@ export type VerdictResult = {
10
10
  exit_code: 0 | 2;
11
11
  rule: string;
12
12
  reason?: string;
13
+ remediation_cycle_anchor?: string;
13
14
  };
14
15
  //# sourceMappingURL=verdict.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/verdict.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
1
+ {"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/verdict.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../src/core/agents/session-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,mDAAmD;AACnD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,mBAAmB,CAAC;AAEnG;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE;AAkID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,IAAI,CAEN;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAO,GAAG,MAAM,CAGxD"}
1
+ {"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../src/core/agents/session-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,mDAAmD;AACnD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,mBAAmB,CAAC;AAEnG;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE;AAsID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,IAAI,CAEN;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAO,GAAG,MAAM,CAGxD"}
@@ -95,6 +95,10 @@ function recordCommandObservation(type, fields) {
95
95
  monotonic_ns: process.hrtime.bigint().toString(),
96
96
  });
97
97
  if (result.state === "generation_unavailable") {
98
+ const expectedLifecycleReopenGap = result.reason === "turn_not_started" &&
99
+ hook.session_start_derivation === "approved_lifecycle_reopen";
100
+ if (expectedLifecycleReopenGap)
101
+ return;
98
102
  writeProducerDiagnosticV3(coordRoot, "command_emit_unjoinable", {
99
103
  type,
100
104
  instance_id: instanceId,
@@ -1,6 +1,6 @@
1
1
  import { existsSync, lstatSync, readdirSync, readFileSync } from "node:fs";
2
2
  import { join, resolve } from "node:path";
3
- import { EVENT_V3_LEDGER_RELATIVE_ROOT } from "../events/v3/writer.js";
3
+ import { EVENT_V3_LEDGER_RELATIVE_ROOT } from "../events/v3/reader.js";
4
4
  export const SESSION_FINALIZATION_REQUEST_FORMAT_V3 = "harnery-v3-session-finalization-request";
5
5
  export const SESSION_FINALIZATION_REQUEST_VERSION_V3 = 1;
6
6
  export function sessionFinalizationRequestDirectoryV3(coordRoot) {
@@ -526,7 +526,11 @@ function ensureRequest(coordRoot, record, input) {
526
526
  };
527
527
  const observation = buildObservationEvent(coordRoot, record, request, input);
528
528
  request.observation_event_id = observation.event_id;
529
- writeEventV3(coordRoot, observation);
529
+ const durability = writeEventV3(coordRoot, observation, {
530
+ expectedGenesisId: input.route.genesis_id,
531
+ });
532
+ if (durability.state === "epoch_replaced")
533
+ return null;
530
534
  writeRequest(coordRoot, request, true);
531
535
  return request;
532
536
  }
@@ -15,4 +15,7 @@
15
15
  * coord_owner_short). Returns `agent-unknown` when instanceId is null.
16
16
  */
17
17
  export declare function resolveShortName(coordRoot: string, instanceId: string | null): string;
18
+ /** Build a collision-resistant agent label even when identity onboarding has
19
+ * not produced a usable display name yet. */
20
+ export declare function agentDisplayName(instanceId: string, name?: string | null): string;
18
21
  //# sourceMappingURL=activity-log.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-log.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/activity-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAKrF"}
1
+ {"version":3,"file":"activity-log.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/activity-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIrF;AAED;6CAC6C;AAC7C,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEjF"}
@@ -19,7 +19,10 @@ export function resolveShortName(coordRoot, instanceId) {
19
19
  if (!instanceId)
20
20
  return "agent-unknown";
21
21
  const row = readLiveCoordinationRow(coordRoot, instanceId);
22
- if (row?.name)
23
- return `agent-${row.name}`;
24
- return `agent-${instanceId.slice(0, 8)}`;
22
+ return agentDisplayName(instanceId, row?.name);
23
+ }
24
+ /** Build a collision-resistant agent label even when identity onboarding has
25
+ * not produced a usable display name yet. */
26
+ export function agentDisplayName(instanceId, name) {
27
+ return `agent-${name?.trim() || instanceId.slice(0, 8) || "unknown"}`;
25
28
  }
@@ -21,6 +21,12 @@ export declare function setLifecycleCache(coordRoot: string, instanceId: string,
21
21
  export declare function setTask(coordRoot: string, instanceId: string, task: string): Heartbeat | null;
22
22
  /** Update the disposable identity cache after a canonical V3 attestation. */
23
23
  export declare function setIdentityCache(coordRoot: string, instanceId: string, name: string, agentId: string): Heartbeat | null;
24
+ /** Restore the pool-assigned display name on a generation that was
25
+ * materialized before the adapter's normal SessionStart naming path ran.
26
+ * The durable assignment lives in `.name-history`; this only repairs the
27
+ * disposable generation cache and deliberately leaves durable persona state
28
+ * (`agent_id`) untouched. */
29
+ export declare function setAssignedNameCache(coordRoot: string, instanceId: string, name: string, kind?: "session" | "subagent" | "transient"): Heartbeat | null;
24
30
  /**
25
31
  * Build the copy-pasteable session name from the coord identity + the agent's
26
32
  * description parts. Pure (no coord-state reads) so it's unit-testable; collapses
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-writer.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,EAAE,KAAK,SAAS,EAAgC,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAatE,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,oBAAoB,CAAC,EAAE,MAAM,GAC5B,SAAS,GAAG,IAAI,CAQlB;AAeD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAoB7F;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,SAAS,GAAG,IAAI,CAOlB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GACzB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKvD;AAED,2EAA2E;AAC3E,wBAAgB,2BAA2B,CACzC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,KAAK,EAAE,SAAS,GACf,MAAM,GAAG,IAAI,CAOf;AAED;;;;4EAI4E;AAC5E,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,SAAS,GAAG,IAAI,CAMlB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAQlB;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAWlB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,eAAe,EAAE,CA6BnB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CASrF;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAiBnF"}
1
+ {"version":3,"file":"heartbeat-writer.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,EAAE,KAAK,SAAS,EAAgC,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAatE,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,oBAAoB,CAAC,EAAE,MAAM,GAC5B,SAAS,GAAG,IAAI,CAQlB;AAeD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAoB7F;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,SAAS,GAAG,IAAI,CAOlB;AAED;;;;6BAI6B;AAC7B,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,SAAS,GAAG,UAAU,GAAG,WAAuB,GACrD,SAAS,GAAG,IAAI,CAelB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GACzB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKvD;AAED,2EAA2E;AAC3E,wBAAgB,2BAA2B,CACzC,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,KAAK,EAAE,SAAS,GACf,MAAM,GAAG,IAAI,CAOf;AAED;;;;4EAI4E;AAC5E,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,SAAS,GAAG,IAAI,CAMlB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAQlB;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAWlB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,eAAe,EAAE,CA6BnB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CASrF;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAiBnF"}
@@ -76,6 +76,24 @@ export function setIdentityCache(coordRoot, instanceId, name, agentId) {
76
76
  atomicWrite(heartbeatPath(coordRoot, instanceId), JSON.stringify(heartbeat, null, 2));
77
77
  return heartbeat;
78
78
  }
79
+ /** Restore the pool-assigned display name on a generation that was
80
+ * materialized before the adapter's normal SessionStart naming path ran.
81
+ * The durable assignment lives in `.name-history`; this only repairs the
82
+ * disposable generation cache and deliberately leaves durable persona state
83
+ * (`agent_id`) untouched. */
84
+ export function setAssignedNameCache(coordRoot, instanceId, name, kind = "session") {
85
+ return mutate(coordRoot, instanceId, (heartbeat) => {
86
+ const suggestedSessionName = heartbeat.suggested_session_name?.replace(/^(\[DONE\]\s+)?Agent unknown( - .+)$/, `$1Agent ${name}$2`);
87
+ return {
88
+ ...heartbeat,
89
+ name,
90
+ kind: heartbeat.kind ?? kind,
91
+ ...(suggestedSessionName && suggestedSessionName !== heartbeat.suggested_session_name
92
+ ? { suggested_session_name: suggestedSessionName }
93
+ : {}),
94
+ };
95
+ });
96
+ }
79
97
  /**
80
98
  * Build the copy-pasteable session name from the coord identity + the agent's
81
99
  * description parts. Pure (no coord-state reads) so it's unit-testable; collapses
@@ -1,4 +1,5 @@
1
1
  import type { Adapter } from "../../adapter.js";
2
+ import { type CoordinationGenerationViewV3 } from "../../events/v3/coordination-view.js";
2
3
  import { type Heartbeat } from "./heartbeat-reader.js";
3
4
  /**
4
5
  * Heartbeat files are disposable V3 caches. These bindings prevent a stale
@@ -21,11 +22,8 @@ export declare function readLiveCoordinationRow(coordRoot: string, nativeInstanc
21
22
  * callers must never substitute another adapter when this function succeeds.
22
23
  */
23
24
  export declare function liveCoordinationAdapterV3(coordRoot: string, nativeInstanceId: string): Adapter | null;
24
- /**
25
- * Ensure the current V3 generation has a mutation target. The resulting file
26
- * is explicitly generation-bound and disposable: V3 remains the source of
27
- * truth, while the cache gives the crash-safe authority outbox an atomic local
28
- * state to reconcile.
29
- */
30
- export declare function ensureLiveCoordinationHeartbeat(coordRoot: string, nativeInstanceId: string, nativeSessionId: string, _adapter: Adapter, model?: string): Heartbeat | null;
25
+ export declare function isCurrentV3HeartbeatCache(cache: Heartbeat | null | undefined, generation: CoordinationGenerationViewV3): cache is Heartbeat;
26
+ export declare function projectHeartbeatV3(coordRoot: string, generation: CoordinationGenerationViewV3, cache: Heartbeat | undefined, nativeInstanceId: string | undefined, parent?: CoordinationGenerationViewV3): V3HeartbeatMaterialization;
27
+ export declare function observedAdapterV3(generation: CoordinationGenerationViewV3): string | undefined;
28
+ export declare function isAdapterV3(value: string | undefined): value is Adapter;
31
29
  //# sourceMappingURL=live-coordination-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"live-coordination-view.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/live-coordination-view.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAYhD,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AAGtE;;;GAGG;AACH,MAAM,WAAW,0BAA2B,SAAQ,SAAS;IAC3D,cAAc,EAAE,CAAC,CAAC;IAClB,cAAc,EAAE,QAAQ,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,OAAO,MAAM,EAAE,CAAC;IAClC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,yEAAyE;AACzE,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,0BAA0B,EAAE,CA2BxF;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB,0BAA0B,GAAG,IAAI,CAuBnC;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB,OAAO,GAAG,IAAI,CAWhB;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,OAAO,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,SAAS,GAAG,IAAI,CAyDlB"}
1
+ {"version":3,"file":"live-coordination-view.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/live-coordination-view.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,KAAK,4BAA4B,EAIlC,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AAGtE;;;GAGG;AACH,MAAM,WAAW,0BAA2B,SAAQ,SAAS;IAC3D,cAAc,EAAE,CAAC,CAAC;IAClB,cAAc,EAAE,QAAQ,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,OAAO,MAAM,EAAE,CAAC;IAClC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,KAAK,GAAG,SAAS,CAAC;CAClC;AAED,yEAAyE;AACzE,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,0BAA0B,EAAE,CA2BxF;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB,0BAA0B,GAAG,IAAI,CAuBnC;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB,OAAO,GAAG,IAAI,CAWhB;AA8BD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EACnC,UAAU,EAAE,4BAA4B,GACvC,KAAK,IAAI,SAAS,CAMpB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,4BAA4B,EACxC,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,MAAM,CAAC,EAAE,4BAA4B,GACpC,0BAA0B,CAqD5B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,4BAA4B,GAAG,MAAM,GAAG,SAAS,CAG9F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,OAAO,CAEvE"}
@@ -1,12 +1,12 @@
1
- import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
2
- import { dirname, join } from "node:path";
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
3
  import { readCoordinationViewV3, requireAuthoritySafeCoordinationViewV3, } from "../../events/v3/coordination-view.js";
4
- import { liveInstanceIdV3, nativeInstanceIdV3, resolveLiveEventLedgerRouteV3, } from "../../events/v3/live-routing.js";
4
+ import { liveInstanceIdV3, nativeInstanceIdV3, observeLiveEventLedgerRouteV3, } from "../../events/v3/live-route-observer.js";
5
5
  import { readHeartbeat } from "./heartbeat-reader.js";
6
6
  import { resolveName } from "./names.js";
7
7
  /** Read the live coordination rows through the hard-cut ledger route. */
8
8
  export function readLiveCoordinationRows(coordRoot) {
9
- const route = resolveLiveEventLedgerRouteV3(coordRoot);
9
+ const route = observeLiveEventLedgerRouteV3(coordRoot);
10
10
  if (route.state === "blocked")
11
11
  return [];
12
12
  let view;
@@ -29,7 +29,7 @@ export function readLiveCoordinationRows(coordRoot) {
29
29
  }
30
30
  /** Read one current row from the authority-safe V3 projection. */
31
31
  export function readLiveCoordinationRow(coordRoot, nativeInstanceId) {
32
- const route = resolveLiveEventLedgerRouteV3(coordRoot);
32
+ const route = observeLiveEventLedgerRouteV3(coordRoot);
33
33
  if (route.state === "blocked")
34
34
  return null;
35
35
  try {
@@ -41,7 +41,7 @@ export function readLiveCoordinationRow(coordRoot, nativeInstanceId) {
41
41
  const parent = generation.parent_generation_id
42
42
  ? Object.values(view.instances).find((candidate) => candidate.generation_id === generation.parent_generation_id)
43
43
  : undefined;
44
- return projectHeartbeatV3(coordRoot, generation, isCurrentCache(cache, generation) ? cache : undefined, nativeInstanceId, parent);
44
+ return projectHeartbeatV3(coordRoot, generation, isCurrentV3HeartbeatCache(cache, generation) ? cache : undefined, nativeInstanceId, parent);
45
45
  }
46
46
  catch {
47
47
  return null;
@@ -53,84 +53,19 @@ export function readLiveCoordinationRow(coordRoot, nativeInstanceId) {
53
53
  * callers must never substitute another adapter when this function succeeds.
54
54
  */
55
55
  export function liveCoordinationAdapterV3(coordRoot, nativeInstanceId) {
56
- const route = resolveLiveEventLedgerRouteV3(coordRoot);
56
+ const route = observeLiveEventLedgerRouteV3(coordRoot);
57
57
  if (route.state === "blocked")
58
58
  throw new Error(`event_v3_coordination_view:${route.reason}`);
59
59
  const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
60
60
  const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
61
61
  if (!generation?.authority_eligible)
62
62
  return null;
63
- const adapter = observedAdapter(generation);
64
- if (!isAdapter(adapter)) {
63
+ const adapter = observedAdapterV3(generation);
64
+ if (!isAdapterV3(adapter)) {
65
65
  throw new Error("event_v3_coordination_view:adapter_not_observed");
66
66
  }
67
67
  return adapter;
68
68
  }
69
- /**
70
- * Ensure the current V3 generation has a mutation target. The resulting file
71
- * is explicitly generation-bound and disposable: V3 remains the source of
72
- * truth, while the cache gives the crash-safe authority outbox an atomic local
73
- * state to reconcile.
74
- */
75
- export function ensureLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, _adapter, model) {
76
- const route = resolveLiveEventLedgerRouteV3(coordRoot);
77
- if (route.state === "blocked")
78
- throw new Error(`event_v3_coordination_view:${route.reason}`);
79
- const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
80
- const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
81
- if (!generation?.authority_eligible)
82
- return null;
83
- const generationAdapter = observedAdapter(generation);
84
- if (!isAdapter(generationAdapter)) {
85
- throw new Error("event_v3_coordination_view:adapter_not_observed");
86
- }
87
- const current = readHeartbeat(coordRoot, nativeInstanceId);
88
- if (isCurrentCache(current, generation) && current.platform === generationAdapter)
89
- return current;
90
- const resolved = resolveName(coordRoot, nativeInstanceId, nativeSessionId);
91
- const projected = projectHeartbeatV3(coordRoot, generation, undefined, nativeInstanceId);
92
- // A generation reopen (resume, mid-flight onboarding) discards the stale
93
- // cache, but the adapter tab it names is unchanged: same native session,
94
- // same agent identity. Rebuilding without the naming evidence re-mints a
95
- // fresh suggested name on the next set-task, so a multi-day session
96
- // accumulates titles it is asked to display over and over. Carry the
97
- // naming evidence across generations; everything else re-projects from V3.
98
- // Same native session id means the same adapter tab; drop the carry only
99
- // when the durable identity observably changed (a reassumed name would make
100
- // the old "Agent <name> - …" block wrong for the new owner).
101
- const identityUnchanged = !resolved?.name || !current?.name || resolved.name === current.name;
102
- const carriedNaming = current && current.session_id === nativeSessionId && identityUnchanged
103
- ? {
104
- ...(current.suggested_session_name
105
- ? { suggested_session_name: current.suggested_session_name }
106
- : {}),
107
- ...(current.session_name_seen_for
108
- ? { session_name_seen_for: current.session_name_seen_for }
109
- : {}),
110
- ...(current.session_name_seen_at
111
- ? { session_name_seen_at: current.session_name_seen_at }
112
- : {}),
113
- }
114
- : {};
115
- const materialized = {
116
- ...projected,
117
- ...carriedNaming,
118
- schema_version: 2,
119
- instance_id: nativeInstanceId,
120
- session_id: nativeSessionId,
121
- name: resolved?.name ?? "",
122
- kind: resolved?.kind ?? projected.kind,
123
- agent_id: resolved?.agent_id ?? (resolved?.kind === "subagent" ? nativeInstanceId : ""),
124
- model: projected.model ?? model ?? "",
125
- platform: generationAdapter,
126
- v3_instance_id: generation.instance_id,
127
- v3_generation_id: generation.generation_id,
128
- v3_projection_event_id: generation.last_event_id,
129
- v3_task_state: generation.task_state === "set" ? "set" : "cleared",
130
- };
131
- writeHeartbeatCache(coordRoot, nativeInstanceId, materialized);
132
- return materialized;
133
- }
134
69
  function readCacheRows(coordRoot) {
135
70
  const dir = join(coordRoot, ".harnery", "active");
136
71
  if (!existsSync(dir))
@@ -152,15 +87,15 @@ function readV3Caches(coordRoot) {
152
87
  return readCacheRows(coordRoot).filter((row) => row.schema_version === 2 && typeof row.v3_generation_id === "string");
153
88
  }
154
89
  function matchingCache(caches, generation) {
155
- return caches.find((cache) => isCurrentCache(cache, generation));
90
+ return caches.find((cache) => isCurrentV3HeartbeatCache(cache, generation));
156
91
  }
157
- function isCurrentCache(cache, generation) {
92
+ export function isCurrentV3HeartbeatCache(cache, generation) {
158
93
  return (cache?.schema_version === 2 &&
159
94
  cache.v3_instance_id === generation.instance_id &&
160
95
  cache.v3_generation_id === generation.generation_id);
161
96
  }
162
- function projectHeartbeatV3(coordRoot, generation, cache, nativeInstanceId, parent) {
163
- const adapter = observedAdapter(generation) ?? cache?.platform ?? "unknown";
97
+ export function projectHeartbeatV3(coordRoot, generation, cache, nativeInstanceId, parent) {
98
+ const adapter = observedAdapterV3(generation) ?? cache?.platform ?? "unknown";
164
99
  const model = observedModel(generation) ?? cache?.model ?? "";
165
100
  const instanceId = nativeInstanceId ?? cache?.instance_id ?? nativeInstanceIdV3(generation.instance_id);
166
101
  const durableIdentity = resolveName(coordRoot, instanceId, cache?.session_id ?? generation.session_id);
@@ -207,11 +142,11 @@ function projectHeartbeatV3(coordRoot, generation, cache, nativeInstanceId, pare
207
142
  v3_task_state: taskIsSet ? "set" : "cleared",
208
143
  };
209
144
  }
210
- function observedAdapter(generation) {
145
+ export function observedAdapterV3(generation) {
211
146
  const observation = generation.runtime_attestation.adapter;
212
147
  return observation.state === "observed" ? observation.value.id : undefined;
213
148
  }
214
- function isAdapter(value) {
149
+ export function isAdapterV3(value) {
215
150
  return value === "claude-code" || value === "cursor" || value === "codex";
216
151
  }
217
152
  function observedModel(generation) {
@@ -221,13 +156,3 @@ function observedModel(generation) {
221
156
  function isLifecycleState(value) {
222
157
  return value === "active" || value === "blocked" || value === "done";
223
158
  }
224
- function writeHeartbeatCache(coordRoot, instanceId, heartbeat) {
225
- if (!/^[a-zA-Z0-9._-]{1,128}$/.test(instanceId)) {
226
- throw new Error("instance_id is unsafe for heartbeat materialization");
227
- }
228
- const path = join(coordRoot, ".harnery", "active", `${instanceId}.json`);
229
- mkdirSync(dirname(path), { recursive: true });
230
- const temporary = `${path}.tmp.${process.pid}`;
231
- writeFileSync(temporary, JSON.stringify(heartbeat, null, 2), "utf8");
232
- renameSync(temporary, path);
233
- }
@@ -0,0 +1,12 @@
1
+ import type { Adapter } from "../../adapter.js";
2
+ import { type Heartbeat } from "./heartbeat-reader.js";
3
+ /**
4
+ * Ensure the current V3 generation has a mutation target. The resulting file
5
+ * is explicitly generation-bound and disposable: V3 remains the source of
6
+ * truth, while the cache gives the crash-safe authority outbox an atomic local
7
+ * state to reconcile.
8
+ */
9
+ export declare function ensureLiveCoordinationHeartbeat(coordRoot: string, nativeInstanceId: string, nativeSessionId: string, _adapter: Adapter, model?: string): Heartbeat | null;
10
+ /** Rebuild a disposable cache from V3 even when its generation markers look current. */
11
+ export declare function repairLiveCoordinationHeartbeat(coordRoot: string, nativeInstanceId: string, nativeSessionId: string, adapter: Adapter, model?: string): Heartbeat | null;
12
+ //# sourceMappingURL=live-coordination-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-coordination-writer.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/live-coordination-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMhD,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AAUtE;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,OAAO,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,SAAS,GAAG,IAAI,CASlB;AAED,wFAAwF;AACxF,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,SAAS,GAAG,IAAI,CASlB"}
@@ -0,0 +1,92 @@
1
+ import { mkdirSync, renameSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { readCoordinationViewV3, requireAuthoritySafeCoordinationViewV3, } from "../../events/v3/coordination-view.js";
4
+ import { liveInstanceIdV3, resolveLiveEventLedgerRouteV3 } from "../../events/v3/live-routing.js";
5
+ import { readHeartbeat } from "./heartbeat-reader.js";
6
+ import { isAdapterV3, isCurrentV3HeartbeatCache, observedAdapterV3, projectHeartbeatV3, } from "./live-coordination-view.js";
7
+ import { resolveName } from "./names.js";
8
+ /**
9
+ * Ensure the current V3 generation has a mutation target. The resulting file
10
+ * is explicitly generation-bound and disposable: V3 remains the source of
11
+ * truth, while the cache gives the crash-safe authority outbox an atomic local
12
+ * state to reconcile.
13
+ */
14
+ export function ensureLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, _adapter, model) {
15
+ return materializeLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, _adapter, model, false);
16
+ }
17
+ /** Rebuild a disposable cache from V3 even when its generation markers look current. */
18
+ export function repairLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, adapter, model) {
19
+ return materializeLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, adapter, model, true);
20
+ }
21
+ function materializeLiveCoordinationHeartbeat(coordRoot, nativeInstanceId, nativeSessionId, _adapter, model, force) {
22
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
23
+ if (route.state === "blocked")
24
+ throw new Error(`event_v3_coordination_view:${route.reason}`);
25
+ const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(coordRoot));
26
+ const generation = view.instances[liveInstanceIdV3(nativeInstanceId)];
27
+ if (!generation?.authority_eligible)
28
+ return null;
29
+ const generationAdapter = observedAdapterV3(generation);
30
+ if (!isAdapterV3(generationAdapter)) {
31
+ throw new Error("event_v3_coordination_view:adapter_not_observed");
32
+ }
33
+ const current = readHeartbeat(coordRoot, nativeInstanceId);
34
+ if (!force &&
35
+ isCurrentV3HeartbeatCache(current, generation) &&
36
+ current.platform === generationAdapter) {
37
+ return current;
38
+ }
39
+ const resolved = resolveName(coordRoot, nativeInstanceId, nativeSessionId);
40
+ const projected = projectHeartbeatV3(coordRoot, generation, undefined, nativeInstanceId);
41
+ // A generation reopen (resume, mid-flight onboarding) discards the stale
42
+ // cache, but the adapter tab it names is unchanged: same native session,
43
+ // same agent identity. Rebuilding without the naming evidence re-mints a
44
+ // fresh suggested name on the next set-task, so a multi-day session
45
+ // accumulates titles it is asked to display over and over. Carry the
46
+ // naming evidence across generations; everything else re-projects from V3.
47
+ // Same native session id means the same adapter tab; drop the carry only
48
+ // when the durable identity observably changed (a reassumed name would make
49
+ // the old "Agent <name> - …" block wrong for the new owner).
50
+ const identityUnchanged = !resolved?.name || !current?.name || resolved.name === current.name;
51
+ const carriedNaming = current && current.session_id === nativeSessionId && identityUnchanged
52
+ ? {
53
+ ...(current.suggested_session_name
54
+ ? { suggested_session_name: current.suggested_session_name }
55
+ : {}),
56
+ ...(current.session_name_seen_for
57
+ ? { session_name_seen_for: current.session_name_seen_for }
58
+ : {}),
59
+ ...(current.session_name_seen_at
60
+ ? { session_name_seen_at: current.session_name_seen_at }
61
+ : {}),
62
+ }
63
+ : {};
64
+ const materialized = {
65
+ ...projected,
66
+ ...carriedNaming,
67
+ schema_version: 2,
68
+ instance_id: nativeInstanceId,
69
+ session_id: nativeSessionId,
70
+ name: resolved?.name ?? "",
71
+ kind: resolved?.kind ?? projected.kind,
72
+ agent_id: resolved?.agent_id ?? (resolved?.kind === "subagent" ? nativeInstanceId : ""),
73
+ model: projected.model ?? model ?? "",
74
+ platform: generationAdapter,
75
+ v3_instance_id: generation.instance_id,
76
+ v3_generation_id: generation.generation_id,
77
+ v3_projection_event_id: generation.last_event_id,
78
+ v3_task_state: generation.task_state === "set" ? "set" : "cleared",
79
+ };
80
+ writeHeartbeatCache(coordRoot, nativeInstanceId, materialized);
81
+ return materialized;
82
+ }
83
+ function writeHeartbeatCache(coordRoot, instanceId, heartbeat) {
84
+ if (!/^[a-zA-Z0-9._-]{1,128}$/.test(instanceId)) {
85
+ throw new Error("instance_id is unsafe for heartbeat materialization");
86
+ }
87
+ const path = join(coordRoot, ".harnery", "active", `${instanceId}.json`);
88
+ mkdirSync(dirname(path), { recursive: true });
89
+ const temporary = `${path}.tmp.${process.pid}`;
90
+ writeFileSync(temporary, JSON.stringify(heartbeat, null, 2), "utf8");
91
+ renameSync(temporary, path);
92
+ }