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
@@ -0,0 +1,164 @@
1
+ // Content-aware band placement for the vision critique tiler.
2
+ //
3
+ // Fixed-height bands cut whatever sits at the boundary — half a heading, a
4
+ // sliced table row, the middle of an image — and the critique rubric then has
5
+ // to tell the model to ignore slice-edge clipping, which costs sensitivity on
6
+ // every tile. This module snaps each cut into nearby content gaps instead:
7
+ // the caller extracts "visual atoms" (text line boxes, replaced elements,
8
+ // small bordered boxes) from the live page, and `snappedBandRects` places
9
+ // each seam at the cheapest cut inside a bounded search window above the
10
+ // fixed target. A clean seam (nothing straddles it) needs only a token
11
+ // overlap; a dirty seam (unavoidable content, e.g. an element taller than
12
+ // the band) keeps the caller's full overlap so the rubric mitigation still
13
+ // applies there.
14
+ //
15
+ // Measured on a mixed fixture (prose, cards, 60-row table, an 1800px chart):
16
+ // hard-atom slices per page dropped 9 → 1 on desktop and 4 → 2 on mobile at
17
+ // an unchanged tile count, with every band height within [50%, 100%] of the
18
+ // budget. The remaining slice was inside the over-tall chart, where no clean
19
+ // cut exists — exactly the case the dirty-seam fallback covers.
20
+ //
21
+ // Pure math, no DOM access: atoms come in as plain rect spans so the module
22
+ // stays testable and portable. Atom extraction lives on the browser client.
23
+
24
+ export interface VisualAtom {
25
+ /** hard: cutting through it visibly breaks content. soft: looks untidy. */
26
+ kind: "text-line" | "replaced" | "box";
27
+ /** Document-space vertical span (CSS px scaled to image px by the caller). */
28
+ top: number;
29
+ bottom: number;
30
+ }
31
+
32
+ export interface SnapSeam {
33
+ /** Document-space y of the cut. */
34
+ y: number;
35
+ /** Weighted atoms the cut passes through; 0 = clean. */
36
+ cost: number;
37
+ /** Hard atoms (text lines, replaced elements) the cut passes through. */
38
+ hard: number;
39
+ clean: boolean;
40
+ }
41
+
42
+ export interface SnapOptions {
43
+ bandHeight: number;
44
+ /** Overlap applied below a dirty seam (the legacy constant, e.g. 120). */
45
+ overlap: number;
46
+ /** Overlap applied below a clean seam. Default 16. */
47
+ cleanOverlap?: number;
48
+ /** Fraction of bandHeight the seam may move up from its target. Default 0.3. */
49
+ slackRatio?: number;
50
+ /** Minimum band height as a fraction of bandHeight. Default 0.5. */
51
+ minBandRatio?: number;
52
+ }
53
+
54
+ const HARD_WEIGHT = 10;
55
+ const SOFT_WEIGHT = 1;
56
+ const EDGE_MARGIN = 4; // grazing an atom edge this closely counts as crossing
57
+ const CANDIDATE_STEP = 2; // px between scored cut candidates
58
+
59
+ /** Weighted cost of a horizontal cut at document-space y. */
60
+ export function cutCost(atoms: VisualAtom[], y: number): { cost: number; hard: number } {
61
+ let cost = 0;
62
+ let hard = 0;
63
+ for (const a of atoms) {
64
+ if (y > a.top - EDGE_MARGIN && y < a.bottom + EDGE_MARGIN) {
65
+ if (a.kind === "box") {
66
+ cost += SOFT_WEIGHT;
67
+ } else {
68
+ cost += HARD_WEIGHT;
69
+ hard++;
70
+ }
71
+ }
72
+ }
73
+ return { cost, hard };
74
+ }
75
+
76
+ /**
77
+ * Cut the vertical span [top, bottom) into bands whose seams snap into
78
+ * content gaps. Seams only move UP from their fixed target (never down), so
79
+ * band height is bounded by `bandHeight` above and `minBandRatio` below.
80
+ * Returns full-width rects in the caller's coordinate space plus the seam
81
+ * record for logging/telemetry.
82
+ */
83
+ export function snappedBandRects(
84
+ top: number,
85
+ bottom: number,
86
+ x: number,
87
+ width: number,
88
+ atoms: VisualAtom[],
89
+ opts: SnapOptions,
90
+ ): {
91
+ rects: Array<{ index: number; x: number; y: number; width: number; height: number }>;
92
+ seams: SnapSeam[];
93
+ } {
94
+ const rects: Array<{ index: number; x: number; y: number; width: number; height: number }> = [];
95
+ const seams: SnapSeam[] = [];
96
+ const span = bottom - top;
97
+ if (span <= 0 || width <= 0) return { rects, seams };
98
+
99
+ const cleanOverlap = opts.cleanOverlap ?? 16;
100
+ const slack = Math.round(opts.bandHeight * (opts.slackRatio ?? 0.3));
101
+ const minBand = Math.round(opts.bandHeight * (opts.minBandRatio ?? 0.5));
102
+
103
+ let bandTop = top;
104
+ let index = 0;
105
+ while (bandTop + opts.bandHeight < bottom) {
106
+ const target = bandTop + opts.bandHeight;
107
+ const lo = Math.max(bandTop + minBand, target - slack);
108
+
109
+ // Score candidates, find the minimal cost in the window.
110
+ const costs: Array<{ y: number; cost: number; hard: number }> = [];
111
+ let minCost = Number.POSITIVE_INFINITY;
112
+ for (let y = lo; y <= target; y += CANDIDATE_STEP) {
113
+ const c = cutCost(atoms, y);
114
+ costs.push({ y, ...c });
115
+ if (c.cost < minCost) minCost = c.cost;
116
+ }
117
+
118
+ // Snap to the center of the widest minimal-cost run; ties resolve toward
119
+ // the target (later run wins on >=) so bands stay as tall as possible.
120
+ let runStart = -1;
121
+ let best = { start: 0, end: costs.length - 1, len: 0 };
122
+ for (let i = 0; i <= costs.length; i++) {
123
+ const inRun = i < costs.length && costs[i].cost === minCost;
124
+ if (inRun && runStart === -1) runStart = i;
125
+ if (!inRun && runStart !== -1) {
126
+ const len = i - runStart;
127
+ if (len >= best.len) best = { start: runStart, end: i - 1, len };
128
+ runStart = -1;
129
+ }
130
+ }
131
+ const pick = costs[Math.floor((best.start + best.end) / 2)];
132
+ const clean = pick.cost === 0;
133
+ seams.push({ y: pick.y, cost: pick.cost, hard: pick.hard, clean });
134
+ rects.push({ index, x, y: bandTop, width, height: pick.y - bandTop });
135
+ index++;
136
+ bandTop = pick.y - (clean ? cleanOverlap : opts.overlap);
137
+ }
138
+ rects.push({ index, x, y: bandTop, width, height: bottom - bandTop });
139
+ return { rects, seams };
140
+ }
141
+
142
+ /**
143
+ * Split one element rect into internally-banded sub-rects when it is taller
144
+ * than the band budget. Selector-mode tiles previously shipped over-tall
145
+ * elements as one giant tile that the vision provider downscales; banding
146
+ * inside the element keeps every sub-tile at full resolution. Elements within
147
+ * 1.25x of the budget stay whole — a slightly-over tile beats a degenerate
148
+ * split.
149
+ */
150
+ export function bandOversizedRect(
151
+ rect: { label: string; x: number; y: number; width: number; height: number },
152
+ atoms: VisualAtom[],
153
+ opts: SnapOptions,
154
+ ): Array<{ label: string; x: number; y: number; width: number; height: number }> {
155
+ if (rect.height <= opts.bandHeight * 1.25) return [rect];
156
+ const { rects } = snappedBandRects(rect.y, rect.y + rect.height, rect.x, rect.width, atoms, opts);
157
+ return rects.map((r, i) => ({
158
+ label: `${rect.label} (${i + 1}/${rects.length})`,
159
+ x: r.x,
160
+ y: r.y,
161
+ width: r.width,
162
+ height: r.height,
163
+ }));
164
+ }
@@ -1,19 +1,6 @@
1
- import { randomUUID } from "node:crypto";
2
- import {
3
- copyFileSync,
4
- createReadStream,
5
- existsSync,
6
- mkdirSync,
7
- readdirSync,
8
- readFileSync,
9
- renameSync,
10
- statSync,
11
- unlinkSync,
12
- writeFileSync,
13
- } from "node:fs";
1
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync } from "node:fs";
14
2
  import { homedir } from "node:os";
15
3
  import { basename, dirname, join } from "node:path";
16
- import { createInterface } from "node:readline";
17
4
 
18
5
  /**
19
6
  * Claude desktop app session-index access.
@@ -80,49 +67,6 @@ export interface MirrorPlan {
80
67
  skippedArchived: number;
81
68
  }
82
69
 
83
- export type DesktopLifecycleState = "active" | "blocked" | "done";
84
-
85
- export interface DesktopLifecycleRecord {
86
- state: DesktopLifecycleState;
87
- updatedAt: string;
88
- instanceId: string | null;
89
- sessionId: string | null;
90
- reason: string | null;
91
- }
92
-
93
- export type DesktopTidySource = "lifecycle" | "legacy-prefix";
94
-
95
- export interface DesktopTidyAction {
96
- entry: DesktopSessionEntry;
97
- source: DesktopTidySource;
98
- lifecycle: DesktopLifecycleRecord | null;
99
- }
100
-
101
- export type DesktopTidySkipReason =
102
- | "already_archived"
103
- | "blocked_title"
104
- | "lifecycle_active"
105
- | "lifecycle_blocked"
106
- | "unmatched";
107
-
108
- export interface DesktopTidySkip {
109
- entry: DesktopSessionEntry;
110
- reason: DesktopTidySkipReason;
111
- lifecycle: DesktopLifecycleRecord | null;
112
- }
113
-
114
- export interface DesktopTidyPlan {
115
- actions: DesktopTidyAction[];
116
- skipped: DesktopTidySkip[];
117
- }
118
-
119
- export interface DesktopTidyOptions {
120
- /** Restrict entries to accounts whose UUID starts with one of these prefixes. */
121
- accounts?: string[];
122
- /** Accept an unmatched historical `[DONE]` title as a compatibility fallback. */
123
- includeLegacyPrefix?: boolean;
124
- }
125
-
126
70
  const SESSIONS_DIRNAME = "claude-code-sessions";
127
71
 
128
72
  function isWsl(): boolean {
@@ -350,178 +294,3 @@ export function applyMirror(plan: MirrorPlan): { copied: number } {
350
294
  }
351
295
  return { copied };
352
296
  }
353
-
354
- /**
355
- * Read the latest durable lifecycle declaration for every Harnery session.
356
- *
357
- * The canonical ledger rotates into `events-*.ndjson` archives. Stream each
358
- * file rather than loading the whole history into one string, then compare
359
- * event timestamps because adapter replay may append an older event later.
360
- * Records are indexed by both session_id and instance_id so a desktop
361
- * cliSessionId can match either identity shape used by older adapters.
362
- */
363
- export async function readDesktopLifecycleIndex(
364
- coordRoot: string,
365
- ): Promise<Map<string, DesktopLifecycleRecord>> {
366
- const coordDir = join(coordRoot, ".harnery");
367
- const archives = safeReaddir(coordDir)
368
- .filter((name) => name.startsWith("events-") && name.endsWith(".ndjson"))
369
- .sort();
370
- const files = [...archives, "events.ndjson"]
371
- .map((name) => join(coordDir, name))
372
- .filter((path) => existsSync(path));
373
-
374
- const records = new Map<string, DesktopLifecycleRecord>();
375
- const timestamps = new Map<string, number>();
376
-
377
- for (const file of files) {
378
- let lines: ReturnType<typeof createInterface> | null = null;
379
- try {
380
- lines = createInterface({
381
- input: createReadStream(file, { encoding: "utf8" }),
382
- crlfDelay: Infinity,
383
- });
384
- for await (const line of lines) {
385
- if (!line.trim()) continue;
386
- let raw: unknown;
387
- try {
388
- raw = JSON.parse(line);
389
- } catch {
390
- continue;
391
- }
392
- if (!raw || typeof raw !== "object") continue;
393
- const event = raw as Record<string, unknown>;
394
- if (event.event_type !== "state.task_state" || typeof event.ts !== "string") continue;
395
- const data = event.data;
396
- if (!data || typeof data !== "object") continue;
397
- const state = (data as Record<string, unknown>).state;
398
- if (state !== "active" && state !== "blocked" && state !== "done") continue;
399
-
400
- const instanceId = typeof event.instance_id === "string" ? event.instance_id : null;
401
- const sessionId = typeof event.session_id === "string" ? event.session_id : null;
402
- const reasonValue = (data as Record<string, unknown>).reason;
403
- const record: DesktopLifecycleRecord = {
404
- state,
405
- updatedAt: event.ts,
406
- instanceId,
407
- sessionId,
408
- reason: typeof reasonValue === "string" && reasonValue.length > 0 ? reasonValue : null,
409
- };
410
- const timestamp = Number.isFinite(Date.parse(event.ts)) ? Date.parse(event.ts) : 0;
411
- for (const key of new Set(
412
- [sessionId, instanceId].filter((value): value is string => !!value),
413
- )) {
414
- const priorTimestamp = timestamps.get(key);
415
- if (priorTimestamp !== undefined && priorTimestamp > timestamp) continue;
416
- timestamps.set(key, timestamp);
417
- records.set(key, record);
418
- }
419
- }
420
- } catch {
421
- // A missing or concurrently rotated event file cannot make tidy unsafe:
422
- // absent lifecycle evidence leaves entries unmatched and therefore skipped.
423
- } finally {
424
- lines?.close();
425
- }
426
- }
427
-
428
- return records;
429
- }
430
-
431
- /** Select desktop entries whose durable lifecycle is done. */
432
- export function planTidy(
433
- accounts: DesktopAccount[],
434
- lifecycleBySession: ReadonlyMap<string, DesktopLifecycleRecord>,
435
- opts: DesktopTidyOptions = {},
436
- ): DesktopTidyPlan {
437
- const selectedAccounts = accounts.filter(
438
- (account) =>
439
- !opts.accounts?.length ||
440
- opts.accounts.some((prefix) => account.accountUuid.startsWith(prefix)),
441
- );
442
- const actions: DesktopTidyAction[] = [];
443
- const skipped: DesktopTidySkip[] = [];
444
-
445
- for (const account of selectedAccounts) {
446
- for (const entry of account.entries) {
447
- const lifecycle = lifecycleForEntry(entry, lifecycleBySession);
448
- if (entry.isArchived) {
449
- skipped.push({ entry, reason: "already_archived", lifecycle });
450
- continue;
451
- }
452
- if (hasLifecyclePrefix(entry.title, "BLOCKED")) {
453
- skipped.push({ entry, reason: "blocked_title", lifecycle });
454
- continue;
455
- }
456
- if (lifecycle) {
457
- if (lifecycle.state === "done") {
458
- actions.push({ entry, source: "lifecycle", lifecycle });
459
- } else {
460
- skipped.push({ entry, reason: `lifecycle_${lifecycle.state}`, lifecycle });
461
- }
462
- continue;
463
- }
464
- if (opts.includeLegacyPrefix && hasLifecyclePrefix(entry.title, "DONE")) {
465
- actions.push({ entry, source: "legacy-prefix", lifecycle: null });
466
- } else {
467
- skipped.push({ entry, reason: "unmatched", lifecycle: null });
468
- }
469
- }
470
- }
471
-
472
- return { actions, skipped };
473
- }
474
-
475
- /** Apply a tidy plan with same-directory temp files and atomic renames. */
476
- export function applyTidy(plan: DesktopTidyPlan): { archived: number; alreadyArchived: number } {
477
- let archived = 0;
478
- let alreadyArchived = 0;
479
- for (const action of plan.actions) {
480
- if (archiveEntry(action.entry.file)) archived++;
481
- else alreadyArchived++;
482
- }
483
- return { archived, alreadyArchived };
484
- }
485
-
486
- function lifecycleForEntry(
487
- entry: DesktopSessionEntry,
488
- lifecycleBySession: ReadonlyMap<string, DesktopLifecycleRecord>,
489
- ): DesktopLifecycleRecord | null {
490
- if (entry.cliSessionId) {
491
- const lifecycle = lifecycleBySession.get(entry.cliSessionId);
492
- if (lifecycle) return lifecycle;
493
- }
494
- return entry.sessionId ? (lifecycleBySession.get(entry.sessionId) ?? null) : null;
495
- }
496
-
497
- function hasLifecyclePrefix(title: string | null, state: "BLOCKED" | "DONE"): boolean {
498
- if (!title) return false;
499
- return new RegExp(`^\\s*\\[${state}\\](?:\\s*-|\\s|$)`, "i").test(title);
500
- }
501
-
502
- function archiveEntry(file: string): boolean {
503
- const text = readFileSync(file, "utf8");
504
- const raw = JSON.parse(text) as unknown;
505
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
506
- throw new Error(`desktop entry is not a JSON object: ${file}`);
507
- }
508
- const entry = raw as Record<string, unknown>;
509
- if (entry.isArchived === true) return false;
510
- entry.isArchived = true;
511
-
512
- const pretty = text.includes("\n");
513
- const trailingNewline = text.endsWith("\n") ? "\n" : "";
514
- const next = `${JSON.stringify(entry, null, pretty ? 2 : undefined)}${trailingNewline}`;
515
- const temp = join(dirname(file), `.${basename(file)}.${process.pid}.${randomUUID()}.tmp`);
516
- try {
517
- writeFileSync(temp, next, { encoding: "utf8", mode: statSync(file).mode });
518
- renameSync(temp, file);
519
- } finally {
520
- try {
521
- unlinkSync(temp);
522
- } catch {
523
- // rename already consumed the temp file, or creation failed before it existed
524
- }
525
- }
526
- return true;
527
- }
@@ -1,11 +1,10 @@
1
- import { existsSync, readdirSync, readFileSync } from "node:fs";
1
+ import { existsSync } from "node:fs";
2
2
  import { resolve } from "node:path";
3
+ import { monorepoRoot, resolveOwner } from "../../core/agents/index.ts";
3
4
  import {
4
- type Heartbeat,
5
- monorepoRoot,
6
- readHeartbeat,
7
- resolveOwner,
8
- } from "../../core/agents/index.ts";
5
+ readLiveCoordinationRow,
6
+ readLiveCoordinationRows,
7
+ } from "../../core/agents/state/live-coordination-view.ts";
9
8
  import { exec } from "../exec.ts";
10
9
  import { NO_DATA } from "../format.ts";
11
10
 
@@ -78,8 +77,6 @@ export interface SelfSection {
78
77
  instance_id: string;
79
78
  session_age_secs: number;
80
79
  task: string | null;
81
- last_tool: string | null;
82
- last_tool_target: string | null;
83
80
  files_held: string[];
84
81
  }
85
82
 
@@ -113,7 +110,6 @@ export interface PeersSection {
113
110
  instance_id_short: string;
114
111
  age_min: number;
115
112
  files: number;
116
- last_tool: string | null;
117
113
  task: string | null;
118
114
  }[];
119
115
  }
@@ -155,19 +151,14 @@ export async function buildContext(opts: ContextOptions = {}): Promise<ContextRe
155
151
  function buildSelf(): SelfSection {
156
152
  const owner = resolveOwner();
157
153
  if (!owner) throw new Error("not in an agent session (no pid-map entry)");
158
- const hb = readHeartbeat(owner);
159
- // Full id, never abbreviated: this message exists to hand the reader an id to
160
- // pass back (to `agents heal --owner`, say), and an 8-char prefix is not that
161
- // id. Healing the truncated form writes `.harnery/active/<prefix>.json`, a
162
- // heartbeat no reader ever resolves — so the session still looks unhealable
163
- // and now has a junk file shadowing it. Same rule as `noHeartbeatMessage` in
164
- // the agents command.
154
+ const root = monorepoRoot();
155
+ const hb = root ? readLiveCoordinationRow(root, owner) : null;
156
+ // Full id, never abbreviated: command surfaces pass this identity back to
157
+ // the authority-safe V3 coordination projection.
165
158
  if (!hb) {
166
- throw new Error(
167
- `pid-map resolved owner=${owner} but no heartbeat exists at .harnery/active/${owner}.json`,
168
- );
159
+ throw new Error(`pid-map resolved owner=${owner} but no live V3 generation exists for it`);
169
160
  }
170
- const startedMs = Date.parse(hb.started_at);
161
+ const startedMs = Date.parse(hb.started_at ?? "");
171
162
  const ageSecs = Number.isFinite(startedMs)
172
163
  ? Math.max(0, Math.floor((Date.now() - startedMs) / 1000))
173
164
  : 0;
@@ -176,8 +167,6 @@ function buildSelf(): SelfSection {
176
167
  instance_id: hb.instance_id,
177
168
  session_age_secs: ageSecs,
178
169
  task: hb.task ?? null,
179
- last_tool: hb.last_tool ?? null,
180
- last_tool_target: hb.last_tool_target ?? null,
181
170
  files_held: hb.files_touched ?? [],
182
171
  };
183
172
  }
@@ -296,32 +285,19 @@ async function statusFor(name: string, cwd: string): Promise<SubmoduleStatus> {
296
285
  function buildPeers(): PeersSection {
297
286
  const root = monorepoRoot();
298
287
  if (!root) throw new Error("coord_root() returned null");
299
- const activeDir = resolve(root, ".harnery", "active");
300
- if (!existsSync(activeDir)) return { rows: [] };
301
288
  const myOwner = resolveOwner();
302
- // No freshness filter; matches the SessionStart/UserPromptSubmit snapshot.
303
- // Stale entries get swept by the SessionStart janitor on the next session start.
304
289
  const rows: PeersSection["rows"] = [];
305
- for (const f of readdirSync(activeDir)) {
306
- if (!f.endsWith(".json")) continue;
307
- try {
308
- const hb = JSON.parse(readFileSync(resolve(activeDir, f), "utf8")) as Heartbeat;
309
- if (!hb || typeof hb.instance_id !== "string") continue;
310
- if (hb.instance_id === myOwner) continue;
311
- if ((hb.kind ?? "") === "transient") continue;
312
- const startedMs = Date.parse(hb.started_at);
313
- const ageMin = Number.isFinite(startedMs) ? Math.floor((Date.now() - startedMs) / 60000) : 0;
314
- rows.push({
315
- name: hb.name ?? "unknown",
316
- instance_id_short: hb.instance_id.slice(0, 8),
317
- age_min: ageMin,
318
- files: hb.files_touched?.length ?? 0,
319
- last_tool: hb.last_tool ?? null,
320
- task: hb.task ?? null,
321
- });
322
- } catch {
323
- // skip
324
- }
290
+ for (const row of readLiveCoordinationRows(root)) {
291
+ if (row.instance_id === myOwner || row.kind === "transient") continue;
292
+ const startedMs = Date.parse(row.started_at ?? row.last_heartbeat);
293
+ const ageMin = Number.isFinite(startedMs) ? Math.floor((Date.now() - startedMs) / 60000) : 0;
294
+ rows.push({
295
+ name: row.name ?? "unknown",
296
+ instance_id_short: row.instance_id.slice(0, 8),
297
+ age_min: ageMin,
298
+ files: row.files_touched.length,
299
+ task: row.task ?? null,
300
+ });
325
301
  }
326
302
  // Sort: file-holders first (more activity), then by recency (younger age first).
327
303
  rows.sort((a, b) => b.files - a.files || a.age_min - b.age_min);
@@ -19,6 +19,7 @@ import {
19
19
  import { basename, resolve } from "node:path";
20
20
 
21
21
  import { monorepoRoot } from "../../core/agents/index.ts";
22
+ import { readLiveCoordinationRows } from "../../core/agents/state/live-coordination-view.ts";
22
23
  import { resolveBinName } from "../../core/config.ts";
23
24
  import { ensureIdentity, lookupById as lookupIdentityById } from "../identities/index.js";
24
25
 
@@ -241,7 +242,7 @@ export function setCouncilSteward(councilId: string, steward: string | null): Co
241
242
  export interface KnownAgent {
242
243
  /** `agent-<Name>` canonical handle. */
243
244
  name: string;
244
- /** `active` = currently has a heartbeat in `.harnery/active/`. `stale` =
245
+ /** `active` = currently has an authority-eligible V3 generation. `stale` =
245
246
  * recently ended (journal archived within the lookback window). */
246
247
  state: "active" | "stale";
247
248
  /** ISO timestamp of the most-recent signal. */
@@ -253,35 +254,22 @@ export interface KnownAgent {
253
254
  const KNOWN_AGENT_STALE_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
254
255
 
255
256
  /**
256
- * Active heartbeats + recently-archived journals, deduped by name.
257
+ * Active V3 generations + recently-archived journals, deduped by name.
257
258
  * Used by `agents council set-steward` to refuse arbitrary names;
258
259
  * pass `--allow-unknown` to bypass when bootstrapping a new agent.
259
260
  */
260
261
  export function listKnownAgents(): KnownAgent[] {
261
262
  const root = monorepoRoot();
262
263
  if (!root) return [];
263
- const activeDir = resolve(root, ".harnery", "active");
264
264
  const archiveDir = resolve(root, ".harnery", "journal", "archived");
265
265
  const byName = new Map<string, KnownAgent>();
266
266
 
267
- if (existsSync(activeDir)) {
268
- for (const f of readdirSync(activeDir)) {
269
- if (!f.endsWith(".json")) continue;
270
- try {
271
- const hb = JSON.parse(readFileSync(resolve(activeDir, f), "utf8")) as {
272
- name?: string;
273
- last_heartbeat?: string;
274
- };
275
- if (!hb.name) continue;
276
- const name = hb.name.startsWith("agent-") ? hb.name : `agent-${hb.name}`;
277
- const last_seen = hb.last_heartbeat ?? new Date().toISOString();
278
- const existing = byName.get(name);
279
- if (existing?.state !== "active") {
280
- byName.set(name, { name, state: "active", last_seen });
281
- }
282
- } catch {
283
- /* skip unreadable */
284
- }
267
+ for (const row of readLiveCoordinationRows(root)) {
268
+ if (!row.name) continue;
269
+ const name = row.name.startsWith("agent-") ? row.name : `agent-${row.name}`;
270
+ const existing = byName.get(name);
271
+ if (existing?.state !== "active") {
272
+ byName.set(name, { name, state: "active", last_seen: row.last_heartbeat });
285
273
  }
286
274
  }
287
275