harnery 0.33.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/dist/commander.d.ts.map +1 -1
  2. package/dist/commander.js +4 -0
  3. package/dist/commands/adapter.js +2 -2
  4. package/dist/commands/agents.d.ts +144 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +1220 -588
  7. package/dist/commands/artifacts.d.ts.map +1 -1
  8. package/dist/commands/artifacts.js +7 -6
  9. package/dist/commands/backup.d.ts +1 -1
  10. package/dist/commands/backup.d.ts.map +1 -1
  11. package/dist/commands/backup.js +29 -16
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +234 -12
  14. package/dist/commands/checkpoint.d.ts.map +1 -1
  15. package/dist/commands/checkpoint.js +3 -2
  16. package/dist/commands/claude-desktop.d.ts +1 -1
  17. package/dist/commands/claude-desktop.d.ts.map +1 -1
  18. package/dist/commands/claude-desktop.js +3 -74
  19. package/dist/commands/context.js +1 -6
  20. package/dist/commands/decision.d.ts.map +1 -1
  21. package/dist/commands/decision.js +22 -38
  22. package/dist/commands/docs.d.ts.map +1 -1
  23. package/dist/commands/docs.js +91 -28
  24. package/dist/commands/doctor.js +10 -1
  25. package/dist/commands/events.d.ts +5 -0
  26. package/dist/commands/events.d.ts.map +1 -0
  27. package/dist/commands/events.js +189 -0
  28. package/dist/commands/governor.d.ts.map +1 -1
  29. package/dist/commands/governor.js +13 -4
  30. package/dist/commands/init.d.ts +9 -2
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +223 -51
  33. package/dist/commands/journal.d.ts.map +1 -1
  34. package/dist/commands/journal.js +4 -13
  35. package/dist/commands/ledger-v3.d.ts +5 -0
  36. package/dist/commands/ledger-v3.d.ts.map +1 -0
  37. package/dist/commands/ledger-v3.js +91 -0
  38. package/dist/commands/presence.d.ts.map +1 -1
  39. package/dist/commands/presence.js +11 -5
  40. package/dist/commands/sync.d.ts +1 -1
  41. package/dist/commands/sync.js +1 -1
  42. package/dist/commands/web.d.ts +6 -0
  43. package/dist/commands/web.d.ts.map +1 -1
  44. package/dist/commands/web.js +67 -7
  45. package/dist/commands/work.d.ts.map +1 -1
  46. package/dist/commands/work.js +22 -5
  47. package/dist/core/adapter.d.ts +5 -0
  48. package/dist/core/adapter.d.ts.map +1 -0
  49. package/dist/core/adapter.js +1 -0
  50. package/dist/core/adapters/attest.d.ts +5 -2
  51. package/dist/core/adapters/attest.d.ts.map +1 -1
  52. package/dist/core/adapters/attest.js +8 -3
  53. package/dist/core/adapters/profiles.d.ts +6 -6
  54. package/dist/core/adapters/profiles.d.ts.map +1 -1
  55. package/dist/core/adapters/profiles.js +4 -4
  56. package/dist/core/agents/canonical-emit.d.ts +17 -15
  57. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  58. package/dist/core/agents/canonical-emit.js +22 -22
  59. package/dist/core/agents/cli.js +207 -234
  60. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  61. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  62. package/dist/core/agents/codex-archive-v3.js +110 -0
  63. package/dist/core/agents/coord-client.d.ts +19 -81
  64. package/dist/core/agents/coord-client.d.ts.map +1 -1
  65. package/dist/core/agents/coord-client.js +65 -155
  66. package/dist/core/agents/finalization.d.ts +4 -1
  67. package/dist/core/agents/finalization.d.ts.map +1 -1
  68. package/dist/core/agents/finalization.js +89 -32
  69. package/dist/core/agents/index.d.ts +4 -5
  70. package/dist/core/agents/index.d.ts.map +1 -1
  71. package/dist/core/agents/index.js +4 -5
  72. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  73. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  74. package/dist/core/agents/live-authority-v3.js +233 -0
  75. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  76. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  77. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  78. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  79. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-observation-v3.js +157 -0
  81. package/dist/core/agents/render/prompt-context.d.ts +4 -4
  82. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  83. package/dist/core/agents/render/prompt-context.js +23 -58
  84. package/dist/core/agents/render/session-context.d.ts +1 -1
  85. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  86. package/dist/core/agents/render/session-context.js +8 -32
  87. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  88. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  89. package/dist/core/agents/rules/claim-conflict.js +79 -127
  90. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  91. package/dist/core/agents/rules/commit-conflict.js +3 -18
  92. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  93. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  94. package/dist/core/agents/rules/stop-hook.js +193 -236
  95. package/dist/core/agents/session-events.d.ts +5 -7
  96. package/dist/core/agents/session-events.d.ts.map +1 -1
  97. package/dist/core/agents/session-events.js +127 -95
  98. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  99. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  100. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  101. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  102. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  103. package/dist/core/agents/session-finalizer-v3.js +734 -0
  104. package/dist/core/agents/session-name-display.d.ts +40 -0
  105. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  106. package/dist/core/agents/session-name-display.js +119 -0
  107. package/dist/core/agents/state/activity-log.d.ts +3 -3
  108. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  109. package/dist/core/agents/state/activity-log.js +7 -16
  110. package/dist/core/agents/state/heartbeat-writer.d.ts +23 -55
  111. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  112. package/dist/core/agents/state/heartbeat-writer.js +56 -228
  113. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  114. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-view.js +209 -0
  116. package/dist/core/agents/state/session-state.d.ts +4 -3
  117. package/dist/core/agents/state/session-state.d.ts.map +1 -1
  118. package/dist/core/agents/state/session-state.js +18 -9
  119. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  120. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  121. package/dist/core/agents/state/stale-sweep.js +26 -15
  122. package/dist/core/artifacts/index.d.ts.map +1 -1
  123. package/dist/core/artifacts/index.js +5 -7
  124. package/dist/core/config.d.ts +33 -2
  125. package/dist/core/config.d.ts.map +1 -1
  126. package/dist/core/config.js +98 -2
  127. package/dist/core/context/index.d.ts +1 -4
  128. package/dist/core/context/index.d.ts.map +1 -1
  129. package/dist/core/context/index.js +9 -9
  130. package/dist/core/events/span-parent.d.ts +15 -0
  131. package/dist/core/events/span-parent.d.ts.map +1 -0
  132. package/dist/core/events/span-parent.js +34 -0
  133. package/dist/core/events/v3/advance.d.ts +14 -0
  134. package/dist/core/events/v3/advance.d.ts.map +1 -0
  135. package/dist/core/events/v3/advance.js +134 -0
  136. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  137. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  138. package/dist/core/events/v3/authority-outbox.js +399 -0
  139. package/dist/core/events/v3/base-builder.d.ts +20 -0
  140. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  141. package/dist/core/events/v3/base-builder.js +29 -0
  142. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  143. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  144. package/dist/core/events/v3/base-contract.js +647 -0
  145. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  146. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  147. package/dist/core/events/v3/bootstrap.js +175 -0
  148. package/dist/core/events/v3/builder.d.ts +20 -0
  149. package/dist/core/events/v3/builder.d.ts.map +1 -0
  150. package/dist/core/events/v3/builder.js +28 -0
  151. package/dist/core/events/v3/canonical.d.ts +31 -0
  152. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  153. package/dist/core/events/v3/canonical.js +100 -0
  154. package/dist/core/events/v3/capabilities.d.ts +31 -0
  155. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  156. package/dist/core/events/v3/capabilities.js +107 -0
  157. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  158. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  159. package/dist/core/events/v3/capability-drift.js +134 -0
  160. package/dist/core/events/v3/catalog.d.ts +38 -0
  161. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  162. package/dist/core/events/v3/catalog.js +135 -0
  163. package/dist/core/events/v3/clock-order.d.ts +34 -0
  164. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  165. package/dist/core/events/v3/clock-order.js +35 -0
  166. package/dist/core/events/v3/contract.d.ts +171 -0
  167. package/dist/core/events/v3/contract.d.ts.map +1 -0
  168. package/dist/core/events/v3/contract.js +180 -0
  169. package/dist/core/events/v3/control.d.ts +111 -0
  170. package/dist/core/events/v3/control.d.ts.map +1 -0
  171. package/dist/core/events/v3/control.js +419 -0
  172. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  173. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  174. package/dist/core/events/v3/coordination-view.js +119 -0
  175. package/dist/core/events/v3/economics.d.ts +77 -0
  176. package/dist/core/events/v3/economics.d.ts.map +1 -0
  177. package/dist/core/events/v3/economics.js +274 -0
  178. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  179. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/finalization-view.js +37 -0
  181. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  182. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  183. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  184. package/dist/core/events/v3/generated.d.ts +4 -0
  185. package/dist/core/events/v3/generated.d.ts.map +1 -0
  186. package/dist/core/events/v3/generated.js +47 -0
  187. package/dist/core/events/v3/ids.d.ts +9 -0
  188. package/dist/core/events/v3/ids.d.ts.map +1 -0
  189. package/dist/core/events/v3/ids.js +25 -0
  190. package/dist/core/events/v3/index.d.ts +35 -0
  191. package/dist/core/events/v3/index.d.ts.map +1 -0
  192. package/dist/core/events/v3/index.js +33 -0
  193. package/dist/core/events/v3/latency.d.ts +63 -0
  194. package/dist/core/events/v3/latency.d.ts.map +1 -0
  195. package/dist/core/events/v3/latency.js +412 -0
  196. package/dist/core/events/v3/live-feed.d.ts +45 -0
  197. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  198. package/dist/core/events/v3/live-feed.js +246 -0
  199. package/dist/core/events/v3/live-observation.d.ts +35 -0
  200. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  201. package/dist/core/events/v3/live-observation.js +1 -0
  202. package/dist/core/events/v3/live-routing.d.ts +57 -0
  203. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-routing.js +107 -0
  205. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  206. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  207. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  208. package/dist/core/events/v3/producers/command.d.ts +50 -0
  209. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  210. package/dist/core/events/v3/producers/command.js +135 -0
  211. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  212. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  214. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  215. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/coordination.js +229 -0
  217. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  218. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/hook-base.js +424 -0
  220. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  221. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/hook.js +71 -0
  223. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  224. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/intake.js +244 -0
  226. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  227. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/recorder.js +2176 -0
  229. package/dist/core/events/v3/projection.d.ts +101 -0
  230. package/dist/core/events/v3/projection.d.ts.map +1 -0
  231. package/dist/core/events/v3/projection.js +479 -0
  232. package/dist/core/events/v3/reader.d.ts +75 -0
  233. package/dist/core/events/v3/reader.d.ts.map +1 -0
  234. package/dist/core/events/v3/reader.js +778 -0
  235. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  236. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  237. package/dist/core/events/v3/recovery-record.js +167 -0
  238. package/dist/core/events/v3/recovery.d.ts +22 -0
  239. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  240. package/dist/core/events/v3/recovery.js +227 -0
  241. package/dist/core/events/v3/span-state.d.ts +52 -0
  242. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  243. package/dist/core/events/v3/span-state.js +142 -0
  244. package/dist/core/events/v3/targets.d.ts +23 -0
  245. package/dist/core/events/v3/targets.d.ts.map +1 -0
  246. package/dist/core/events/v3/targets.js +134 -0
  247. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  248. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  249. package/dist/core/events/v3/turn-telemetry.js +168 -0
  250. package/dist/core/events/v3/validate.d.ts +9 -0
  251. package/dist/core/events/v3/validate.d.ts.map +1 -0
  252. package/dist/core/events/v3/validate.js +281 -0
  253. package/dist/core/events/v3/writer.d.ts +56 -0
  254. package/dist/core/events/v3/writer.d.ts.map +1 -0
  255. package/dist/core/events/v3/writer.js +335 -0
  256. package/dist/core/governor/index.d.ts +1 -1
  257. package/dist/core/governor/index.d.ts.map +1 -1
  258. package/dist/core/governor/index.js +1 -1
  259. package/dist/core/governor/plan-api.d.ts +2 -1
  260. package/dist/core/governor/plan-api.d.ts.map +1 -1
  261. package/dist/core/governor/plan-api.js +6 -3
  262. package/dist/core/governor/read.d.ts +1 -1
  263. package/dist/core/governor/read.d.ts.map +1 -1
  264. package/dist/core/governor/read.js +1 -1
  265. package/dist/core/governor/state.d.ts +9 -0
  266. package/dist/core/governor/state.d.ts.map +1 -1
  267. package/dist/core/governor/state.js +40 -3
  268. package/dist/core/guard/config.d.ts +5 -0
  269. package/dist/core/guard/config.d.ts.map +1 -0
  270. package/dist/core/guard/config.js +157 -0
  271. package/dist/core/guard/coordinator.d.ts +14 -0
  272. package/dist/core/guard/coordinator.d.ts.map +1 -0
  273. package/dist/core/guard/coordinator.js +173 -0
  274. package/dist/core/guard/evaluator.d.ts +4 -0
  275. package/dist/core/guard/evaluator.d.ts.map +1 -0
  276. package/dist/core/guard/evaluator.js +242 -0
  277. package/dist/core/guard/evidence-v3.d.ts +15 -0
  278. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  279. package/dist/core/guard/evidence-v3.js +171 -0
  280. package/dist/core/guard/index.d.ts +10 -0
  281. package/dist/core/guard/index.d.ts.map +1 -0
  282. package/dist/core/guard/index.js +6 -0
  283. package/dist/core/guard/live-source-v3.d.ts +40 -0
  284. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  285. package/dist/core/guard/live-source-v3.js +128 -0
  286. package/dist/core/guard/storage.d.ts +27 -0
  287. package/dist/core/guard/storage.d.ts.map +1 -0
  288. package/dist/core/guard/storage.js +140 -0
  289. package/dist/core/guard/types.d.ts +119 -0
  290. package/dist/core/guard/types.d.ts.map +1 -0
  291. package/dist/core/guard/types.js +1 -0
  292. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  293. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  294. package/dist/core/hooks/adapter/detect.js +29 -0
  295. package/dist/core/hooks/adapter/events.d.ts +7 -4
  296. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  297. package/dist/core/hooks/adapter/events.js +12 -4
  298. package/dist/core/hooks/adapter/output.d.ts +2 -2
  299. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  301. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  302. package/dist/core/hooks/adapter/parse.js +63 -25
  303. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  304. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  305. package/dist/core/hooks/adapter/wiring.js +89 -11
  306. package/dist/core/hooks/cli.d.ts +1 -1
  307. package/dist/core/hooks/cli.js +305 -444
  308. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  309. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  310. package/dist/core/hooks/effects/image-capture.js +212 -221
  311. package/dist/core/hooks/effects/index.d.ts +1 -9
  312. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  313. package/dist/core/hooks/effects/index.js +1 -24
  314. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  315. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  316. package/dist/core/hooks/events/input-hash.js +43 -0
  317. package/dist/core/hooks/index.d.ts +4 -3
  318. package/dist/core/hooks/index.d.ts.map +1 -1
  319. package/dist/core/hooks/index.js +2 -3
  320. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  321. package/dist/core/hooks/resolve/coord-root.js +1 -1
  322. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  323. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  324. package/dist/core/hooks/resolve/owner.js +51 -42
  325. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  326. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  327. package/dist/core/hooks/resolve/transcript.js +155 -14
  328. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  329. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  330. package/dist/core/hooks/session-name-presence.js +15 -15
  331. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  332. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  333. package/dist/core/journal/index.d.ts +2 -2
  334. package/dist/core/journal/index.d.ts.map +1 -1
  335. package/dist/core/journal/index.js +9 -22
  336. package/dist/core/presence/blob.d.ts +4 -3
  337. package/dist/core/presence/blob.d.ts.map +1 -1
  338. package/dist/core/presence/blob.js +45 -44
  339. package/dist/core/presence/codec-digest.d.ts +29 -0
  340. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  341. package/dist/core/presence/codec-digest.js +170 -0
  342. package/dist/core/presence/relay-client.d.ts +1 -1
  343. package/dist/core/presence/relay-client.d.ts.map +1 -1
  344. package/dist/core/presence/relay-client.js +5 -5
  345. package/dist/core/work/index.d.ts +1 -1
  346. package/dist/core/work/index.d.ts.map +1 -1
  347. package/dist/core/work/index.js +1 -1
  348. package/dist/core/work/read.d.ts +1 -1
  349. package/dist/core/work/read.d.ts.map +1 -1
  350. package/dist/core/work/read.js +1 -1
  351. package/dist/core/work/runner.d.ts.map +1 -1
  352. package/dist/core/work/runner.js +6 -0
  353. package/dist/core/work/state.d.ts +9 -0
  354. package/dist/core/work/state.d.ts.map +1 -1
  355. package/dist/core/work/state.js +17 -3
  356. package/dist/core/workflow/engine.js +24 -25
  357. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  358. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  359. package/dist/core/workflow/live-session-v3.js +86 -0
  360. package/dist/core/workflow/scope-id.d.ts +3 -0
  361. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  362. package/dist/core/workflow/scope-id.js +5 -0
  363. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  364. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  365. package/dist/core/workflow/workspaces/leases.js +53 -19
  366. package/dist/index.d.ts +1 -1
  367. package/dist/index.js +1 -1
  368. package/dist/lib/browser/client.d.ts +41 -0
  369. package/dist/lib/browser/client.d.ts.map +1 -1
  370. package/dist/lib/browser/client.js +203 -0
  371. package/dist/lib/browser/critique.d.ts +28 -2
  372. package/dist/lib/browser/critique.d.ts.map +1 -1
  373. package/dist/lib/browser/critique.js +74 -18
  374. package/dist/lib/browser/geometry.d.ts +1 -1
  375. package/dist/lib/browser/geometry.d.ts.map +1 -1
  376. package/dist/lib/browser/geometry.js +130 -6
  377. package/dist/lib/browser/index.d.ts +3 -0
  378. package/dist/lib/browser/index.d.ts.map +1 -1
  379. package/dist/lib/browser/index.js +3 -0
  380. package/dist/lib/browser/qa-plan.d.ts +174 -0
  381. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  382. package/dist/lib/browser/qa-plan.js +321 -0
  383. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  384. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  385. package/dist/lib/browser/qa-reuse.js +222 -0
  386. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  387. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  388. package/dist/lib/browser/qa-snapshot.js +171 -0
  389. package/dist/lib/browser/runts.d.ts.map +1 -1
  390. package/dist/lib/browser/runts.js +22 -1
  391. package/dist/lib/browser/tiling.d.ts +71 -0
  392. package/dist/lib/browser/tiling.d.ts.map +1 -0
  393. package/dist/lib/browser/tiling.js +118 -0
  394. package/dist/lib/claude-desktop.d.ts +0 -47
  395. package/dist/lib/claude-desktop.d.ts.map +1 -1
  396. package/dist/lib/claude-desktop.js +1 -169
  397. package/dist/lib/context/index.d.ts +0 -3
  398. package/dist/lib/context/index.d.ts.map +1 -1
  399. package/dist/lib/context/index.js +20 -42
  400. package/dist/lib/council/index.d.ts +2 -2
  401. package/dist/lib/council/index.d.ts.map +1 -1
  402. package/dist/lib/council/index.js +9 -20
  403. package/dist/lib/docs-frontmatter.d.ts +1 -6
  404. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  405. package/dist/lib/docs-frontmatter.js +12 -78
  406. package/dist/lib/docs-index.d.ts +9 -0
  407. package/dist/lib/docs-index.d.ts.map +1 -1
  408. package/dist/lib/docs-index.js +32 -3
  409. package/dist/lib/docs-lint.d.ts.map +1 -1
  410. package/dist/lib/docs-lint.js +14 -30
  411. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  412. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  413. package/dist/lib/docs-metadata-audit.js +132 -0
  414. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  415. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  416. package/dist/lib/docs-metadata-managed.js +78 -0
  417. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  418. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  419. package/dist/lib/docs-metadata-sync.js +222 -0
  420. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  421. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  422. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  423. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  424. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  425. package/dist/lib/docs-metadata-v2.js +424 -0
  426. package/dist/lib/docs-new.d.ts +11 -0
  427. package/dist/lib/docs-new.d.ts.map +1 -0
  428. package/dist/lib/docs-new.js +52 -0
  429. package/dist/lib/docs-sweep.d.ts.map +1 -1
  430. package/dist/lib/docs-sweep.js +45 -29
  431. package/dist/lib/headless/index.d.ts +98 -0
  432. package/dist/lib/headless/index.d.ts.map +1 -0
  433. package/dist/lib/headless/index.js +211 -0
  434. package/dist/lib/identities/assume.d.ts +4 -4
  435. package/dist/lib/identities/assume.d.ts.map +1 -1
  436. package/dist/lib/identities/assume.js +52 -68
  437. package/dist/lib/instructions/apply.d.ts +5 -4
  438. package/dist/lib/instructions/apply.d.ts.map +1 -1
  439. package/dist/lib/instructions/apply.js +32 -20
  440. package/dist/lib/instructions/bundle.d.ts +1 -1
  441. package/dist/lib/instructions/bundle.d.ts.map +1 -1
  442. package/dist/lib/instructions/bundle.js +1 -1
  443. package/dist/lib/instructions/splice.d.ts +0 -1
  444. package/dist/lib/instructions/splice.d.ts.map +1 -1
  445. package/dist/lib/instructions/splice.js +22 -6
  446. package/dist/lib/instructions/templates.d.ts +7 -5
  447. package/dist/lib/instructions/templates.d.ts.map +1 -1
  448. package/dist/lib/instructions/templates.js +79 -9
  449. package/package.json +26 -5
  450. package/schemas/config.schema.json +120 -2
  451. package/schemas/docs-metadata-v2.schema.json +441 -0
  452. package/schemas/event-v3.schema.json +24472 -0
  453. package/src/commander.ts +4 -0
  454. package/src/commands/adapter.ts +2 -2
  455. package/src/commands/agents.ts +1512 -592
  456. package/src/commands/artifacts.ts +7 -6
  457. package/src/commands/backup.ts +29 -21
  458. package/src/commands/browse.ts +349 -8
  459. package/src/commands/checkpoint.ts +4 -3
  460. package/src/commands/claude-desktop.ts +2 -101
  461. package/src/commands/context.ts +1 -6
  462. package/src/commands/decision.ts +27 -44
  463. package/src/commands/docs.ts +100 -33
  464. package/src/commands/doctor.ts +14 -1
  465. package/src/commands/events.ts +256 -0
  466. package/src/commands/governor.ts +18 -4
  467. package/src/commands/init.ts +253 -57
  468. package/src/commands/instructions.ts +1 -1
  469. package/src/commands/journal.ts +4 -13
  470. package/src/commands/ledger-v3.ts +111 -0
  471. package/src/commands/presence.ts +11 -10
  472. package/src/commands/sync.ts +1 -1
  473. package/src/commands/web.ts +67 -8
  474. package/src/commands/work.ts +28 -5
  475. package/src/core/adapter.ts +5 -0
  476. package/src/core/adapters/attest.ts +8 -3
  477. package/src/core/adapters/profiles.ts +4 -6
  478. package/src/core/agents/canonical-emit.ts +34 -25
  479. package/src/core/agents/cli.ts +236 -262
  480. package/src/core/agents/codex-archive-v3.ts +138 -0
  481. package/src/core/agents/coord-client.ts +75 -188
  482. package/src/core/agents/finalization.ts +120 -38
  483. package/src/core/agents/index.ts +4 -5
  484. package/src/core/agents/live-authority-v3.ts +375 -0
  485. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  486. package/src/core/agents/live-observation-v3.ts +216 -0
  487. package/src/core/agents/render/prompt-context.ts +29 -60
  488. package/src/core/agents/render/session-context.ts +10 -31
  489. package/src/core/agents/rules/claim-conflict.ts +85 -126
  490. package/src/core/agents/rules/commit-conflict.ts +3 -14
  491. package/src/core/agents/rules/stop-hook.ts +239 -293
  492. package/src/core/agents/session-events.ts +137 -104
  493. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  494. package/src/core/agents/session-finalizer-v3.ts +953 -0
  495. package/src/core/agents/session-name-display.ts +149 -0
  496. package/src/core/agents/state/activity-log.ts +6 -14
  497. package/src/core/agents/state/heartbeat-writer.ts +82 -277
  498. package/src/core/agents/state/live-coordination-view.ts +290 -0
  499. package/src/core/agents/state/session-state.ts +24 -12
  500. package/src/core/agents/state/stale-sweep.ts +40 -17
  501. package/src/core/artifacts/index.ts +4 -5
  502. package/src/core/config.ts +148 -3
  503. package/src/core/context/index.ts +9 -17
  504. package/src/core/events/span-parent.ts +46 -0
  505. package/src/core/events/v3/advance.ts +168 -0
  506. package/src/core/events/v3/authority-outbox.ts +548 -0
  507. package/src/core/events/v3/base-builder.ts +60 -0
  508. package/src/core/events/v3/base-contract.ts +882 -0
  509. package/src/core/events/v3/bootstrap.ts +226 -0
  510. package/src/core/events/v3/builder.ts +59 -0
  511. package/src/core/events/v3/canonical.ts +153 -0
  512. package/src/core/events/v3/capabilities.ts +171 -0
  513. package/src/core/events/v3/capability-drift.ts +177 -0
  514. package/src/core/events/v3/catalog.ts +202 -0
  515. package/src/core/events/v3/clock-order.ts +41 -0
  516. package/src/core/events/v3/contract.ts +365 -0
  517. package/src/core/events/v3/control.ts +576 -0
  518. package/src/core/events/v3/coordination-view.ts +193 -0
  519. package/src/core/events/v3/economics.ts +384 -0
  520. package/src/core/events/v3/finalization-view.ts +67 -0
  521. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  522. package/src/core/events/v3/generated.ts +48 -0
  523. package/src/core/events/v3/ids.ts +33 -0
  524. package/src/core/events/v3/index.ts +322 -0
  525. package/src/core/events/v3/latency.ts +551 -0
  526. package/src/core/events/v3/live-feed.ts +319 -0
  527. package/src/core/events/v3/live-observation.ts +39 -0
  528. package/src/core/events/v3/live-routing.ts +135 -0
  529. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  530. package/src/core/events/v3/producers/command.ts +201 -0
  531. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  532. package/src/core/events/v3/producers/coordination.ts +355 -0
  533. package/src/core/events/v3/producers/hook-base.ts +578 -0
  534. package/src/core/events/v3/producers/hook.ts +119 -0
  535. package/src/core/events/v3/producers/intake.ts +319 -0
  536. package/src/core/events/v3/producers/recorder.ts +2805 -0
  537. package/src/core/events/v3/projection.ts +653 -0
  538. package/src/core/events/v3/reader.ts +1127 -0
  539. package/src/core/events/v3/recovery-record.ts +244 -0
  540. package/src/core/events/v3/recovery.ts +271 -0
  541. package/src/core/events/v3/span-state.ts +187 -0
  542. package/src/core/events/v3/targets.ts +182 -0
  543. package/src/core/events/v3/turn-telemetry.ts +259 -0
  544. package/src/core/events/v3/validate.ts +361 -0
  545. package/src/core/events/v3/writer.ts +419 -0
  546. package/src/core/governor/index.ts +3 -0
  547. package/src/core/governor/plan-api.ts +10 -2
  548. package/src/core/governor/read.ts +3 -0
  549. package/src/core/governor/state.ts +52 -5
  550. package/src/core/guard/config.ts +206 -0
  551. package/src/core/guard/coordinator.ts +227 -0
  552. package/src/core/guard/evaluator.ts +343 -0
  553. package/src/core/guard/evidence-v3.ts +227 -0
  554. package/src/core/guard/index.ts +35 -0
  555. package/src/core/guard/live-source-v3.ts +204 -0
  556. package/src/core/guard/storage.ts +188 -0
  557. package/src/core/guard/types.ts +152 -0
  558. package/src/core/hooks/adapter/detect.ts +28 -1
  559. package/src/core/hooks/adapter/events.ts +14 -6
  560. package/src/core/hooks/adapter/output.ts +7 -2
  561. package/src/core/hooks/adapter/parse.ts +80 -38
  562. package/src/core/hooks/adapter/wiring.ts +119 -13
  563. package/src/core/hooks/cli.ts +351 -466
  564. package/src/core/hooks/effects/image-capture.ts +228 -238
  565. package/src/core/hooks/effects/index.ts +1 -36
  566. package/src/core/hooks/events/input-hash.ts +47 -0
  567. package/src/core/hooks/index.ts +4 -11
  568. package/src/core/hooks/resolve/coord-root.ts +1 -1
  569. package/src/core/hooks/resolve/owner.ts +52 -45
  570. package/src/core/hooks/resolve/transcript.ts +165 -14
  571. package/src/core/hooks/session-name-presence.ts +14 -15
  572. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  573. package/src/core/journal/index.ts +15 -22
  574. package/src/core/presence/blob.ts +48 -41
  575. package/src/core/presence/codec-digest.ts +215 -0
  576. package/src/core/presence/relay-client.ts +5 -5
  577. package/src/core/work/index.ts +3 -0
  578. package/src/core/work/read.ts +3 -0
  579. package/src/core/work/runner.ts +6 -0
  580. package/src/core/work/state.ts +27 -3
  581. package/src/core/workflow/engine.ts +24 -24
  582. package/src/core/workflow/live-session-v3.ts +126 -0
  583. package/src/core/workflow/scope-id.ts +6 -0
  584. package/src/core/workflow/workspaces/leases.ts +56 -19
  585. package/src/index.ts +1 -1
  586. package/src/lib/browser/client.ts +230 -0
  587. package/src/lib/browser/critique.ts +104 -27
  588. package/src/lib/browser/geometry.ts +143 -14
  589. package/src/lib/browser/index.ts +34 -0
  590. package/src/lib/browser/qa-plan.ts +501 -0
  591. package/src/lib/browser/qa-reuse.ts +306 -0
  592. package/src/lib/browser/qa-snapshot.ts +223 -0
  593. package/src/lib/browser/runts.ts +27 -2
  594. package/src/lib/browser/tiling.ts +164 -0
  595. package/src/lib/claude-desktop.ts +1 -232
  596. package/src/lib/context/index.ts +22 -46
  597. package/src/lib/council/index.ts +9 -21
  598. package/src/lib/docs-frontmatter.ts +8 -79
  599. package/src/lib/docs-index.ts +33 -3
  600. package/src/lib/docs-lint.ts +15 -29
  601. package/src/lib/docs-metadata-audit.ts +166 -0
  602. package/src/lib/docs-metadata-managed.ts +83 -0
  603. package/src/lib/docs-metadata-sync.ts +262 -0
  604. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  605. package/src/lib/docs-metadata-v2.ts +646 -0
  606. package/src/lib/docs-new.ts +63 -0
  607. package/src/lib/docs-sweep.ts +42 -28
  608. package/src/lib/headless/index.ts +287 -0
  609. package/src/lib/identities/assume.ts +67 -86
  610. package/src/lib/instructions/apply.ts +33 -20
  611. package/src/lib/instructions/bundle.ts +2 -2
  612. package/src/lib/instructions/splice.ts +21 -7
  613. package/src/lib/instructions/templates.ts +85 -13
  614. package/dist/core/agents/cli-emit.d.ts +0 -27
  615. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  616. package/dist/core/agents/cli-emit.js +0 -57
  617. package/dist/core/agents/codex-replay.d.ts +0 -29
  618. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  619. package/dist/core/agents/codex-replay.js +0 -138
  620. package/dist/core/agents/events/consume.d.ts +0 -82
  621. package/dist/core/agents/events/consume.d.ts.map +0 -1
  622. package/dist/core/agents/events/consume.js +0 -195
  623. package/dist/core/agents/events/emit.d.ts +0 -42
  624. package/dist/core/agents/events/emit.d.ts.map +0 -1
  625. package/dist/core/agents/events/emit.js +0 -75
  626. package/dist/core/agents/events/ulid.d.ts +0 -11
  627. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  628. package/dist/core/agents/events/ulid.js +0 -47
  629. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -76
  630. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  631. package/dist/core/agents/state/heartbeat-projector.js +0 -581
  632. package/dist/core/hooks/events/emit.d.ts +0 -31
  633. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  634. package/dist/core/hooks/events/emit.js +0 -93
  635. package/dist/core/hooks/events/rotate.d.ts +0 -43
  636. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  637. package/dist/core/hooks/events/rotate.js +0 -142
  638. package/dist/core/hooks/events/schema.d.ts +0 -341
  639. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  640. package/dist/core/hooks/events/schema.js +0 -12
  641. package/dist/core/hooks/events/ulid.d.ts +0 -10
  642. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  643. package/dist/core/hooks/events/ulid.js +0 -47
  644. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  645. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  646. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  647. package/src/core/agents/cli-emit.ts +0 -64
  648. package/src/core/agents/codex-replay.ts +0 -163
  649. package/src/core/agents/events/consume.ts +0 -254
  650. package/src/core/agents/events/emit.ts +0 -115
  651. package/src/core/agents/events/ulid.ts +0 -51
  652. package/src/core/agents/state/heartbeat-projector.ts +0 -645
  653. package/src/core/hooks/events/emit.ts +0 -125
  654. package/src/core/hooks/events/rotate.ts +0 -151
  655. package/src/core/hooks/events/schema.ts +0 -582
  656. package/src/core/hooks/events/ulid.ts +0 -51
  657. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -9,8 +9,8 @@ import { spawnSync } from "node:child_process";
9
9
  import { existsSync, realpathSync, statSync } from "node:fs";
10
10
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
11
11
  import { agentsFinalizationRoots } from "../config.js";
12
- import { readStreamTailBounded } from "./events/consume.js";
13
- const CLAIM_HISTORY_CAP_BYTES = 128 * 1024 * 1024;
12
+ import { readFinalizationScopeV3 } from "../events/v3/finalization-view.js";
13
+ import { liveInstanceIdV3, resolveLiveEventLedgerRouteV3 } from "../events/v3/live-routing.js";
14
14
  const GIT_DISCOVERY_VARS = [
15
15
  "GIT_DIR",
16
16
  "GIT_WORK_TREE",
@@ -26,32 +26,17 @@ const GIT_DISCOVERY_VARS = [
26
26
  * a commit. Current heartbeat claims describe dirty ownership; this history is
27
27
  * what keeps the touched repository in scope until its commits are pushed.
28
28
  */
29
- export function readSessionWriteClaims(coordRoot, instanceId, sessionId) {
30
- const streamPath = join(coordRoot, ".harnery", "events.ndjson");
31
- const { text, truncated } = readStreamTailBounded(streamPath, CLAIM_HISTORY_CAP_BYTES);
32
- const paths = new Set();
33
- let sawSessionStart = false;
34
- for (const line of text.split("\n")) {
35
- if (line.trim().length === 0)
36
- continue;
37
- try {
38
- const event = JSON.parse(line);
39
- if (event.instance_id !== instanceId || event.session_id !== sessionId)
40
- continue;
41
- if (event.event_type === "session.start")
42
- sawSessionStart = true;
43
- if (event.event_type === "claim.acquire" &&
44
- event.data?.mode === "write" &&
45
- typeof event.data.path === "string") {
46
- paths.add(event.data.path);
47
- }
48
- }
49
- catch {
50
- // Ignore malformed and crash-truncated event lines, matching the
51
- // canonical stream consumer's recovery behavior.
52
- }
29
+ export function readSessionWriteClaims(coordRoot, instanceId, _sessionId) {
30
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
31
+ if (route.state === "blocked")
32
+ return { paths: [], complete: false };
33
+ try {
34
+ const scope = readFinalizationScopeV3(coordRoot, liveInstanceIdV3(instanceId));
35
+ return { paths: scope.files_touched, complete: true };
36
+ }
37
+ catch {
38
+ return { paths: [], complete: false };
53
39
  }
54
- return { paths: [...paths], complete: !truncated || sawSessionStart };
55
40
  }
56
41
  function git(args, cwd) {
57
42
  const env = { ...process.env };
@@ -303,6 +288,50 @@ function repoSyncState(repoRoot) {
303
288
  return "unverifiable";
304
289
  return containing.stdout.trim().length > 0 ? "synced" : "unpushed";
305
290
  }
291
+ function repoIsBehindUpstream(repoRoot) {
292
+ if (!repoHasRemote(repoRoot))
293
+ return false;
294
+ const upstream = git(["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}"], repoRoot);
295
+ if (upstream.status !== 0)
296
+ return false;
297
+ const behind = git(["rev-list", "--count", "HEAD..@{upstream}"], repoRoot);
298
+ return behind.status === 0 && Number.parseInt(behind.stdout.trim(), 10) > 0;
299
+ }
300
+ function rootSubmoduleFreshness(repoRoot) {
301
+ const modules = git(["config", "--file", ".gitmodules", "--get-regexp", "^submodule\\..*\\.path$"], repoRoot);
302
+ if (modules.status !== 0 || modules.stdout.trim().length === 0) {
303
+ return { stale: [], diverged: [] };
304
+ }
305
+ const stale = [];
306
+ const diverged = [];
307
+ for (const line of modules.stdout.trim().split("\n")) {
308
+ const path = line.trim().split(/\s+/).at(-1);
309
+ if (!path)
310
+ continue;
311
+ const target = git(["rev-parse", `HEAD:${path}`], repoRoot);
312
+ const checkout = git(["rev-parse", "HEAD"], join(repoRoot, path));
313
+ if (target.status !== 0 || checkout.status !== 0) {
314
+ stale.push(path);
315
+ continue;
316
+ }
317
+ const targetSha = target.stdout.trim();
318
+ const checkoutSha = checkout.stdout.trim();
319
+ if (targetSha === checkoutSha)
320
+ continue;
321
+ const checkoutBehind = git(["merge-base", "--is-ancestor", checkoutSha, targetSha], join(repoRoot, path));
322
+ if (checkoutBehind.status === 0) {
323
+ stale.push(path);
324
+ continue;
325
+ }
326
+ const checkoutAhead = git(["merge-base", "--is-ancestor", targetSha, checkoutSha], join(repoRoot, path));
327
+ // A checkout ahead of its gitlink is in-flight local work. Its owning
328
+ // session is responsible for the eventual pointer bump; unrelated turns
329
+ // must not be blocked globally while that work is active.
330
+ if (checkoutAhead.status !== 0)
331
+ diverged.push(path);
332
+ }
333
+ return { stale: stale.sort(), diverged: diverged.sort() };
334
+ }
306
335
  /** Compare gitlink commits without treating dirty contents inside the child as a pointer change. */
307
336
  function gitlinkIsDirty(parentRoot, gitlink) {
308
337
  const head = git(["rev-parse", `HEAD:${gitlink}`], parentRoot);
@@ -318,6 +347,9 @@ function gitlinkIsDirty(parentRoot, gitlink) {
318
347
  /** Check that this session's held paths are committed and their repositories are pushed. */
319
348
  export function checkGitFinalization(coordRoot, heldPaths, options = {}) {
320
349
  const root = resolve(coordRoot);
350
+ // Repository discovery resolves symlinks. Use the same physical base for
351
+ // display labels so macOS /var -> /private/var aliases stay repo-relative.
352
+ const labelRoot = physicalPath(root) ?? root;
321
353
  const repos = new Map();
322
354
  const hostOutputPaths = new Set();
323
355
  const unsupportedPaths = [];
@@ -346,42 +378,50 @@ export function checkGitFinalization(coordRoot, heldPaths, options = {}) {
346
378
  for (const repoPath of work.paths) {
347
379
  if (work.gitlinks.has(repoPath)) {
348
380
  if (gitlinkIsDirty(work.root, repoPath)) {
349
- const label = repoLabel(root, work.root);
381
+ const label = repoLabel(labelRoot, work.root);
350
382
  dirtyPaths.add(label === "." ? repoPath : `${label}/${repoPath}`);
351
383
  }
352
384
  continue;
353
385
  }
354
386
  const status = git(["status", "--porcelain=v1", "--untracked-files=all", "--", repoPath], work.root);
355
387
  if (status.status !== 0) {
356
- unverifiablePaths.push(join(repoLabel(root, work.root), repoPath).replaceAll("\\", "/"));
388
+ unverifiablePaths.push(join(repoLabel(labelRoot, work.root), repoPath).replaceAll("\\", "/"));
357
389
  }
358
390
  else if (status.stdout.length > 0) {
359
- const label = repoLabel(root, work.root);
391
+ const label = repoLabel(labelRoot, work.root);
360
392
  dirtyPaths.add(label === "." ? repoPath : `${label}/${repoPath}`);
361
393
  }
362
394
  }
363
395
  const syncState = repoSyncState(work.root);
364
- const label = repoLabel(root, work.root);
396
+ const label = repoLabel(labelRoot, work.root);
365
397
  if (syncState === "unpushed")
366
398
  unpushedRepos.push(label);
367
399
  if (syncState === "unverifiable")
368
400
  unverifiableRepos.push(label);
369
401
  }
402
+ const behindRepos = repoIsBehindUpstream(root) ? ["."] : [];
403
+ const submoduleFreshness = rootSubmoduleFreshness(root);
370
404
  const result = {
371
405
  ok: false,
372
406
  claim_history_complete: options.claimHistoryComplete ?? true,
373
407
  dirty_paths: [...dirtyPaths].sort(),
374
408
  unpushed_repos: [...new Set(unpushedRepos)].sort(),
409
+ behind_repos: behindRepos,
410
+ stale_submodules: submoduleFreshness.stale,
411
+ diverged_submodules: submoduleFreshness.diverged,
375
412
  host_output_paths: [...hostOutputPaths].sort(),
376
413
  unsupported_paths: unsupportedPaths.sort((a, b) => a.path.localeCompare(b.path) || a.reason.localeCompare(b.reason)),
377
414
  unverifiable_paths: [...new Set(unverifiablePaths)].sort(),
378
415
  unverifiable_repos: [...new Set(unverifiableRepos)].sort(),
379
- repos_checked: [...repos.keys()].map((repo) => repoLabel(root, repo)).sort(),
416
+ repos_checked: [...repos.keys()].map((repo) => repoLabel(labelRoot, repo)).sort(),
380
417
  };
381
418
  result.ok =
382
419
  result.claim_history_complete &&
383
420
  result.dirty_paths.length === 0 &&
384
421
  result.unpushed_repos.length === 0 &&
422
+ result.behind_repos.length === 0 &&
423
+ result.stale_submodules.length === 0 &&
424
+ result.diverged_submodules.length === 0 &&
385
425
  result.unsupported_paths.length === 0 &&
386
426
  result.unverifiable_paths.length === 0 &&
387
427
  result.unverifiable_repos.length === 0;
@@ -398,6 +438,15 @@ export function formatGitFinalizationFailure(result, bin) {
398
438
  if (result.unpushed_repos.length > 0) {
399
439
  lines.push("Repositories with commits not on their remote:", ...result.unpushed_repos.map((repo) => ` - ${repo}`));
400
440
  }
441
+ if (result.behind_repos.length > 0) {
442
+ lines.push("Repositories behind their upstream:", ...result.behind_repos.map((repo) => ` - ${repo}`));
443
+ }
444
+ if (result.stale_submodules.length > 0) {
445
+ lines.push("Submodule checkouts behind their parent gitlinks:", ...result.stale_submodules.map((path) => ` - ${path}`));
446
+ }
447
+ if (result.diverged_submodules.length > 0) {
448
+ lines.push("Submodule checkouts diverged from their parent gitlinks:", ...result.diverged_submodules.map((path) => ` - ${path}`));
449
+ }
401
450
  if (result.unsupported_paths.length > 0) {
402
451
  lines.push("Paths without an authorized end-turn disposition:", ...result.unsupported_paths.map(({ path, reason }) => ` - ${path}: ${unsupportedReasonMessage(reason)}`));
403
452
  }
@@ -409,10 +458,18 @@ export function formatGitFinalizationFailure(result, bin) {
409
458
  }
410
459
  if (result.dirty_paths.length > 0 ||
411
460
  result.unpushed_repos.length > 0 ||
461
+ result.behind_repos.length > 0 ||
462
+ result.stale_submodules.length > 0 ||
463
+ result.diverged_submodules.length > 0 ||
412
464
  result.unverifiable_paths.length > 0 ||
413
465
  result.unverifiable_repos.length > 0) {
414
466
  lines.push(`Commit and push the owned Git work, then rerun \`${bin} agents status --end-turn\`.`);
415
467
  }
468
+ if (result.behind_repos.length > 0 ||
469
+ result.stale_submodules.length > 0 ||
470
+ result.diverged_submodules.length > 0) {
471
+ lines.push("Run the host repository's safe sync command, resolve any reported submodule state, then rerun the guarded status.");
472
+ }
416
473
  if (result.unsupported_paths.length > 0) {
417
474
  lines.push("For a legacy claim, add the containing Git repository or intentional non-Git output root to the project's `agents.finalizationRoots`, then rerun the guarded status. For new work, start the task from the target Git project or configure that root before editing.");
418
475
  }
@@ -1,15 +1,14 @@
1
1
  /**
2
2
  * agent-coord library public exports.
3
3
  *
4
- * `coord-client`: coordination helpers
5
- * (Heartbeat reader, owner-resolver via ppid-walk, monorepo-root finder).
6
- * Imported by every TS caller that needs to read coord state.
4
+ * `coord-client`: V3 producer identity resolution, ppid-map attribution, and
5
+ * coordination-root discovery.
7
6
  *
8
- * `canonical-emit`: fire-and-forget client for the canonical event stream;
9
- * spawns `bin/agent-coord emit-event` and never blocks the caller.
7
+ * `canonical-emit`: canonical V3 observation helpers.
10
8
  */
11
9
  export * from "./canonical-emit.js";
12
10
  export * from "./coord-client.js";
11
+ export * from "./live-observation-v3.js";
13
12
  export * from "./session-events.js";
14
13
  export * from "./state/session-state.js";
15
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
@@ -1,14 +1,13 @@
1
1
  /**
2
2
  * agent-coord library public exports.
3
3
  *
4
- * `coord-client`: coordination helpers
5
- * (Heartbeat reader, owner-resolver via ppid-walk, monorepo-root finder).
6
- * Imported by every TS caller that needs to read coord state.
4
+ * `coord-client`: V3 producer identity resolution, ppid-map attribution, and
5
+ * coordination-root discovery.
7
6
  *
8
- * `canonical-emit`: fire-and-forget client for the canonical event stream;
9
- * spawns `bin/agent-coord emit-event` and never blocks the caller.
7
+ * `canonical-emit`: canonical V3 observation helpers.
10
8
  */
11
9
  export * from "./canonical-emit.js";
12
10
  export * from "./coord-client.js";
11
+ export * from "./live-observation-v3.js";
13
12
  export * from "./session-events.js";
14
13
  export * from "./state/session-state.js";
@@ -0,0 +1,59 @@
1
+ import type { Adapter } from "../adapter.js";
2
+ import type { EventV3WriteMode } from "../events/v3/control.js";
3
+ import { type RecordCoordinationAuthorityV3Result } from "../events/v3/producers/coordination-recorder.js";
4
+ export declare const LIVE_COORDINATION_V3_PRODUCER_ID: "prd_agent-coord";
5
+ export declare class LiveCoordinationAuthorityV3Error extends Error {
6
+ readonly reason: string;
7
+ constructor(reason: string);
8
+ }
9
+ export type LiveCoordinationAuthorityV3Result = {
10
+ state: "unchanged";
11
+ } | {
12
+ state: "recorded";
13
+ result: RecordCoordinationAuthorityV3Result;
14
+ };
15
+ export interface ReopenedLiveCoordinationGenerationV3 {
16
+ state: "reopened";
17
+ adapter: Adapter;
18
+ prior_generation_id: `gen_${string}`;
19
+ generation_id: `gen_${string}`;
20
+ }
21
+ interface LiveAuthorityBaseV3 {
22
+ coordRoot: string;
23
+ owner: string;
24
+ subject?: string;
25
+ nativeSessionId: string;
26
+ adapter: Adapter;
27
+ observationId?: string;
28
+ }
29
+ /**
30
+ * Open a fresh derived generation for a human-facing session that is executing
31
+ * again after an authoritative terminal. The terminal generation is never
32
+ * changed or reused.
33
+ */
34
+ export declare function reopenLiveCoordinationGenerationV3(input: {
35
+ coordRoot: string;
36
+ owner: string;
37
+ nativeSessionId: string;
38
+ }): ReopenedLiveCoordinationGenerationV3;
39
+ export declare function recordLiveTaskChangeV3(input: LiveAuthorityBaseV3 & {
40
+ task: string;
41
+ }): LiveCoordinationAuthorityV3Result;
42
+ export declare function recordLiveLifecycleChangeV3(input: LiveAuthorityBaseV3 & {
43
+ state: "active" | "blocked" | "done";
44
+ reason?: string;
45
+ suggestedSessionName?: string;
46
+ observedAt?: string;
47
+ }): LiveCoordinationAuthorityV3Result;
48
+ export declare function recordLiveClaimChangeV3(input: LiveAuthorityBaseV3 & {
49
+ operation: "acquired" | "released";
50
+ path: string;
51
+ access?: "read" | "write";
52
+ }): LiveCoordinationAuthorityV3Result;
53
+ export declare function recordLiveIdentityChangeV3(input: LiveAuthorityBaseV3 & {
54
+ name: string;
55
+ identityId: string;
56
+ }): LiveCoordinationAuthorityV3Result;
57
+ export declare function liveCoordinationWriteModeV3(coordRoot: string): EventV3WriteMode;
58
+ export {};
59
+ //# sourceMappingURL=live-authority-v3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-authority-v3.d.ts","sourceRoot":"","sources":["../../../src/core/agents/live-authority-v3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAehE,OAAO,EACL,KAAK,mCAAmC,EAEzC,MAAM,iDAAiD,CAAC;AAoBzD,eAAO,MAAM,gCAAgC,EAAG,iBAA0B,CAAC;AAE3E,qBAAa,gCAAiC,SAAQ,KAAK;aAC7B,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI3C;AAED,MAAM,MAAM,iCAAiC,GACzC;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,mCAAmC,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,oCAAoC;IACnD,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,OAAO,MAAM,EAAE,CAAC;IACrC,aAAa,EAAE,OAAO,MAAM,EAAE,CAAC;CAChC;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,KAAK,EAAE;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,oCAAoC,CAkDvC;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5C,iCAAiC,CAiCnC;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,mBAAmB,GAAG;IAC3B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,iCAAiC,CAmCnC;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,mBAAmB,GAAG;IAC3B,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B,GACA,iCAAiC,CAuCnC;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAChE,iCAAiC,CAuBnC;AAuDD,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAI/E"}
@@ -0,0 +1,233 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { canonicalJsonV3, sha256V3 } from "../events/v3/canonical.js";
3
+ import { readCoordinationViewV3, requireAuthoritySafeCoordinationViewV3, } from "../events/v3/coordination-view.js";
4
+ import { LIVE_HOOK_V3_PRODUCER_ID, liveInstanceIdV3, livePlatformV3, resolveLiveEventLedgerRouteV3, } from "../events/v3/live-routing.js";
5
+ import { recordCoordinationAuthorityV3, } from "../events/v3/producers/coordination-recorder.js";
6
+ import { readTerminalHookProducerStateV3, recordHookSignalV3, } from "../events/v3/producers/recorder.js";
7
+ import { acquireClaim, readHeartbeat, releaseClaim, setIdentityCache, setLifecycleCache, setTask, } from "./state/heartbeat-writer.js";
8
+ import { ensureLiveCoordinationHeartbeat, liveCoordinationAdapterV3, } from "./state/live-coordination-view.js";
9
+ import { recordNameAssumption } from "./state/names.js";
10
+ export const LIVE_COORDINATION_V3_PRODUCER_ID = "prd_agent-coord";
11
+ export class LiveCoordinationAuthorityV3Error extends Error {
12
+ reason;
13
+ constructor(reason) {
14
+ super(`event_v3_coordination_authority:${reason}`);
15
+ this.reason = reason;
16
+ this.name = "LiveCoordinationAuthorityV3Error";
17
+ }
18
+ }
19
+ /**
20
+ * Open a fresh derived generation for a human-facing session that is executing
21
+ * again after an authoritative terminal. The terminal generation is never
22
+ * changed or reused.
23
+ */
24
+ export function reopenLiveCoordinationGenerationV3(input) {
25
+ const route = resolveLiveEventLedgerRouteV3(input.coordRoot);
26
+ if (route.state === "blocked")
27
+ throw new LiveCoordinationAuthorityV3Error(route.reason);
28
+ const instanceId = liveInstanceIdV3(input.owner);
29
+ const terminal = readTerminalHookProducerStateV3(input.coordRoot, input.nativeSessionId, instanceId);
30
+ if (!terminal) {
31
+ throw new LiveCoordinationAuthorityV3Error("terminal_generation_identity_missing");
32
+ }
33
+ const view = requireAuthoritySafeCoordinationViewV3(readCoordinationViewV3(input.coordRoot));
34
+ const terminalView = view.terminal_generations[terminal.generation_id];
35
+ if (!terminalView || terminalView.instance_id !== instanceId) {
36
+ throw new LiveCoordinationAuthorityV3Error("terminal_generation_authority_missing");
37
+ }
38
+ if (terminalView.parent_generation_id || terminalView.delegation_id || terminalView.workflow_id) {
39
+ throw new LiveCoordinationAuthorityV3Error("lifecycle_not_human_facing");
40
+ }
41
+ const reopened = recordHookSignalV3({
42
+ coordRoot: input.coordRoot,
43
+ mode: route.mode,
44
+ signal: "session-start",
45
+ payload: { raw: {}, session_id: input.nativeSessionId },
46
+ adapter: terminal.adapter,
47
+ instance_id: instanceId,
48
+ producer_id: LIVE_HOOK_V3_PRODUCER_ID,
49
+ build_id: route.build_id,
50
+ platform: livePlatformV3(),
51
+ session_start_derivation: "approved_lifecycle_reopen",
52
+ });
53
+ if (reopened.state !== "recorded" && reopened.state !== "already_started") {
54
+ throw new LiveCoordinationAuthorityV3Error(`generation_reopen_failed:${reopened.state}`);
55
+ }
56
+ const heartbeat = ensureLiveCoordinationHeartbeat(input.coordRoot, input.owner, input.nativeSessionId, terminal.adapter);
57
+ if (!heartbeat) {
58
+ throw new LiveCoordinationAuthorityV3Error("reopened_generation_materialization_failed");
59
+ }
60
+ return {
61
+ state: "reopened",
62
+ adapter: terminal.adapter,
63
+ prior_generation_id: terminal.generation_id,
64
+ generation_id: heartbeat.v3_generation_id,
65
+ };
66
+ }
67
+ export function recordLiveTaskChangeV3(input) {
68
+ liveCoordinationWriteModeV3(input.coordRoot);
69
+ const before = requireHeartbeat(input, input.subject ?? input.owner);
70
+ const cleared = input.task.length === 0;
71
+ const desired = {
72
+ ...before,
73
+ task: undefined,
74
+ v3_task_state: cleared ? "cleared" : "set",
75
+ };
76
+ // A task declaration is also per-turn ritual evidence. Record repeated
77
+ // declarations, including cleared -> cleared, even when the disposable view
78
+ // does not change. Otherwise a conversational Cursor remediation turn can
79
+ // run `set-task ""` exactly as instructed and still loop forever because no
80
+ // coord.task_changed event reaches the verdict window.
81
+ return recordLiveAuthority(input, "task-changed", {
82
+ native_observation_id: input.observationId ?? `task-${randomUUID()}`,
83
+ state: cleared ? "cleared" : "set",
84
+ ...(cleared ? {} : { task: input.task }),
85
+ }, before, desired, () => {
86
+ // The canonical event records only the privacy-safe set/cleared state.
87
+ // Task prose and its operator-facing suggested name live exclusively in
88
+ // this generation-bound disposable cache; they never enter the ledger.
89
+ if (!setTask(input.coordRoot, input.subject ?? input.owner, input.task)) {
90
+ throw new LiveCoordinationAuthorityV3Error("task_materialization_failed");
91
+ }
92
+ });
93
+ }
94
+ export function recordLiveLifecycleChangeV3(input) {
95
+ liveCoordinationWriteModeV3(input.coordRoot);
96
+ const subject = input.subject ?? input.owner;
97
+ const before = requireHeartbeat(input, subject);
98
+ const desired = {
99
+ ...before,
100
+ task_state: input.state,
101
+ task_state_reason: input.state === "active" ? undefined : input.reason,
102
+ ...(input.suggestedSessionName ? { suggested_session_name: input.suggestedSessionName } : {}),
103
+ };
104
+ if (authorityStateDigest(before) === authorityStateDigest(desired))
105
+ return { state: "unchanged" };
106
+ return recordLiveAuthority(input, "lifecycle-changed", {
107
+ native_observation_id: input.observationId ?? `lifecycle-${randomUUID()}`,
108
+ state: input.state,
109
+ ...(input.reason ? { reason_code: `operator_${input.state}` } : {}),
110
+ }, before, desired, () => {
111
+ if (!setLifecycleCache(input.coordRoot, subject, input.state, input.reason, input.suggestedSessionName)) {
112
+ throw new LiveCoordinationAuthorityV3Error("lifecycle_materialization_failed");
113
+ }
114
+ });
115
+ }
116
+ export function recordLiveClaimChangeV3(input) {
117
+ liveCoordinationWriteModeV3(input.coordRoot);
118
+ const subject = input.subject ?? input.owner;
119
+ const before = requireHeartbeat(input, subject);
120
+ const canonical = canonicalClaimPath(input.coordRoot, input.path);
121
+ const desiredFiles = input.operation === "acquired"
122
+ ? [
123
+ ...new Set([
124
+ ...(before.files_touched ?? []).map((path) => canonicalClaimPath(input.coordRoot, path)),
125
+ canonical,
126
+ ]),
127
+ ].sort()
128
+ : (before.files_touched ?? []).filter((path) => canonicalClaimPath(input.coordRoot, path) !== canonical);
129
+ const desired = { ...before, files_touched: desiredFiles };
130
+ if (authorityStateDigest(before) === authorityStateDigest(desired))
131
+ return { state: "unchanged" };
132
+ return recordLiveAuthority(input, "claim-changed", {
133
+ native_observation_id: input.observationId ?? `claim-${randomUUID()}`,
134
+ operation: input.operation,
135
+ target: canonical,
136
+ access: input.access ?? "write",
137
+ }, before, desired, () => {
138
+ const result = input.operation === "acquired"
139
+ ? acquireClaim(input.coordRoot, subject, canonical)
140
+ : releaseClaim(input.coordRoot, subject, canonical);
141
+ if (!result)
142
+ throw new LiveCoordinationAuthorityV3Error("claim_materialization_failed");
143
+ });
144
+ }
145
+ export function recordLiveIdentityChangeV3(input) {
146
+ liveCoordinationWriteModeV3(input.coordRoot);
147
+ const subject = input.subject ?? input.owner;
148
+ const before = requireHeartbeat(input, subject);
149
+ const desired = { ...before, name: input.name, agent_id: input.identityId };
150
+ if (authorityStateDigest(before) === authorityStateDigest(desired))
151
+ return { state: "unchanged" };
152
+ return recordLiveAuthority(input, "identity-attested", {
153
+ native_observation_id: input.observationId ?? `identity-${randomUUID()}`,
154
+ identity_id: input.identityId,
155
+ method: "operator_assumption",
156
+ }, before, desired, () => {
157
+ recordNameAssumption(input.coordRoot, subject, input.name, input.identityId, "session");
158
+ if (!setIdentityCache(input.coordRoot, subject, input.name, input.identityId)) {
159
+ throw new LiveCoordinationAuthorityV3Error("identity_materialization_failed");
160
+ }
161
+ });
162
+ }
163
+ function recordLiveAuthority(input, signal, observation, expected, desired, apply) {
164
+ const route = resolveLiveEventLedgerRouteV3(input.coordRoot);
165
+ if (route.state === "blocked")
166
+ throw new LiveCoordinationAuthorityV3Error(route.reason);
167
+ const adapter = liveCoordinationAdapterV3(input.coordRoot, input.owner);
168
+ if (!adapter)
169
+ throw new LiveCoordinationAuthorityV3Error("actor_generation_missing");
170
+ const subject = input.subject ?? input.owner;
171
+ const result = recordAuthority({
172
+ coordRoot: input.coordRoot,
173
+ mode: route.mode,
174
+ signal,
175
+ observation,
176
+ adapter,
177
+ native_actor_session_id: input.nativeSessionId,
178
+ actor_instance_id: liveInstanceIdV3(input.owner),
179
+ subject_instance_id: liveInstanceIdV3(subject),
180
+ producer_id: LIVE_COORDINATION_V3_PRODUCER_ID,
181
+ build_id: route.build_id,
182
+ platform: livePlatformV3(),
183
+ expected_prior_state_digest: authorityStateDigest(expected),
184
+ desired_state_digest: authorityStateDigest(desired),
185
+ reconciler: {
186
+ readStateDigest: () => {
187
+ const heartbeat = readHeartbeat(input.coordRoot, subject);
188
+ if (!heartbeat || heartbeat.v3_generation_id !== expected.v3_generation_id) {
189
+ throw new LiveCoordinationAuthorityV3Error(`heartbeat_generation_mismatch:${subject}`);
190
+ }
191
+ return authorityStateDigest(heartbeat);
192
+ },
193
+ apply: (_mutation) => apply(),
194
+ },
195
+ });
196
+ if (result.state === "gate_closed" || result.state === "generation_unavailable") {
197
+ throw new LiveCoordinationAuthorityV3Error(`${result.state}:${result.reason}`);
198
+ }
199
+ if (result.state === "pending_transaction") {
200
+ throw new LiveCoordinationAuthorityV3Error(`pending_transaction:${result.transaction_id}`);
201
+ }
202
+ return { state: "recorded", result };
203
+ }
204
+ function recordAuthority(input) {
205
+ return recordCoordinationAuthorityV3(input);
206
+ }
207
+ export function liveCoordinationWriteModeV3(coordRoot) {
208
+ const route = resolveLiveEventLedgerRouteV3(coordRoot);
209
+ if (route.state === "blocked")
210
+ throw new LiveCoordinationAuthorityV3Error(route.reason);
211
+ return route.mode;
212
+ }
213
+ function requireHeartbeat(input, owner) {
214
+ const heartbeat = ensureLiveCoordinationHeartbeat(input.coordRoot, owner, owner === input.owner ? input.nativeSessionId : owner, input.adapter);
215
+ if (!heartbeat)
216
+ throw new LiveCoordinationAuthorityV3Error(`heartbeat_missing:${owner}`);
217
+ return heartbeat;
218
+ }
219
+ function authorityStateDigest(heartbeat) {
220
+ return sha256V3(canonicalJsonV3({
221
+ instance_id: heartbeat.v3_instance_id ?? heartbeat.instance_id,
222
+ generation_id: heartbeat.v3_generation_id ?? null,
223
+ task_state: heartbeat.v3_task_state ?? (heartbeat.task ? "set" : "cleared"),
224
+ lifecycle_state: heartbeat.task_state ?? "active",
225
+ task_state_reason: heartbeat.task_state_reason ?? null,
226
+ files_touched: [...new Set(heartbeat.files_touched ?? [])].sort(),
227
+ identity_id: heartbeat.agent_id ?? null,
228
+ display_name: heartbeat.name ?? null,
229
+ }));
230
+ }
231
+ function canonicalClaimPath(coordRoot, path) {
232
+ return path.startsWith(`${coordRoot}/`) ? path.slice(coordRoot.length + 1) : path;
233
+ }
@@ -0,0 +1,20 @@
1
+ import type { Adapter } from "../adapter.js";
2
+ import type { EventV3 } from "../events/v3/contract.js";
3
+ export type LiveLifecycleObservationV3Result = {
4
+ state: "recorded";
5
+ event: EventV3;
6
+ };
7
+ interface LiveLifecycleObservationBaseV3 {
8
+ coordRoot: string;
9
+ owner: string;
10
+ nativeSessionId: string;
11
+ adapter: Adapter;
12
+ observedAt?: string;
13
+ }
14
+ export declare function recordLiveSweepObservationV3(input: LiveLifecycleObservationBaseV3 & {
15
+ observation: "stale_heartbeat" | "killed" | "unparseable_heartbeat" | "missing_timestamp";
16
+ ageMs: number;
17
+ }): LiveLifecycleObservationV3Result;
18
+ export declare function recordLiveResumeObservationV3(input: LiveLifecycleObservationBaseV3): LiveLifecycleObservationV3Result;
19
+ export {};
20
+ //# sourceMappingURL=live-lifecycle-v3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-lifecycle-v3.d.ts","sourceRoot":"","sources":["../../../src/core/agents/live-lifecycle-v3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAaxD,MAAM,MAAM,gCAAgC,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAErF,UAAU,8BAA8B;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,8BAA8B,GAAG;IACtC,WAAW,EAAE,iBAAiB,GAAG,QAAQ,GAAG,uBAAuB,GAAG,mBAAmB,CAAC;IAC1F,KAAK,EAAE,MAAM,CAAC;CACf,GACA,gCAAgC,CAOlC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,8BAA8B,GACpC,gCAAgC,CAQlC"}