harnery 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (665) hide show
  1. package/README.md +2 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +7 -1
  4. package/dist/commands/adapter.js +2 -2
  5. package/dist/commands/agents.d.ts +144 -1
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +1408 -565
  8. package/dist/commands/artifacts.d.ts.map +1 -1
  9. package/dist/commands/artifacts.js +7 -6
  10. package/dist/commands/backup.d.ts +1 -1
  11. package/dist/commands/backup.d.ts.map +1 -1
  12. package/dist/commands/backup.js +29 -16
  13. package/dist/commands/browse.d.ts.map +1 -1
  14. package/dist/commands/browse.js +234 -12
  15. package/dist/commands/checkpoint.d.ts.map +1 -1
  16. package/dist/commands/checkpoint.js +3 -2
  17. package/dist/commands/claude-desktop.d.ts +2 -2
  18. package/dist/commands/claude-desktop.d.ts.map +1 -1
  19. package/dist/commands/claude-desktop.js +2 -2
  20. package/dist/commands/context.js +1 -6
  21. package/dist/commands/decision.d.ts.map +1 -1
  22. package/dist/commands/decision.js +22 -38
  23. package/dist/commands/docs.d.ts.map +1 -1
  24. package/dist/commands/docs.js +91 -28
  25. package/dist/commands/doctor.d.ts +4 -2
  26. package/dist/commands/doctor.d.ts.map +1 -1
  27. package/dist/commands/doctor.js +55 -7
  28. package/dist/commands/events.d.ts +5 -0
  29. package/dist/commands/events.d.ts.map +1 -0
  30. package/dist/commands/events.js +189 -0
  31. package/dist/commands/governor.d.ts.map +1 -1
  32. package/dist/commands/governor.js +13 -4
  33. package/dist/commands/init.d.ts +10 -2
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +233 -51
  36. package/dist/commands/instructions.d.ts +4 -0
  37. package/dist/commands/instructions.d.ts.map +1 -0
  38. package/dist/commands/instructions.js +100 -0
  39. package/dist/commands/journal.d.ts.map +1 -1
  40. package/dist/commands/journal.js +4 -13
  41. package/dist/commands/ledger-v3.d.ts +5 -0
  42. package/dist/commands/ledger-v3.d.ts.map +1 -0
  43. package/dist/commands/ledger-v3.js +91 -0
  44. package/dist/commands/presence.d.ts.map +1 -1
  45. package/dist/commands/presence.js +15 -6
  46. package/dist/commands/sync.d.ts +1 -1
  47. package/dist/commands/sync.js +1 -1
  48. package/dist/commands/web.d.ts +6 -0
  49. package/dist/commands/web.d.ts.map +1 -1
  50. package/dist/commands/web.js +67 -7
  51. package/dist/commands/work.d.ts.map +1 -1
  52. package/dist/commands/work.js +22 -5
  53. package/dist/core/adapter.d.ts +5 -0
  54. package/dist/core/adapter.d.ts.map +1 -0
  55. package/dist/core/adapter.js +1 -0
  56. package/dist/core/adapters/attest.d.ts +5 -2
  57. package/dist/core/adapters/attest.d.ts.map +1 -1
  58. package/dist/core/adapters/attest.js +8 -3
  59. package/dist/core/adapters/profiles.d.ts +6 -6
  60. package/dist/core/adapters/profiles.d.ts.map +1 -1
  61. package/dist/core/adapters/profiles.js +4 -4
  62. package/dist/core/agents/canonical-emit.d.ts +17 -15
  63. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  64. package/dist/core/agents/canonical-emit.js +27 -25
  65. package/dist/core/agents/cli.js +212 -235
  66. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  67. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  68. package/dist/core/agents/codex-archive-v3.js +110 -0
  69. package/dist/core/agents/coord-client.d.ts +19 -70
  70. package/dist/core/agents/coord-client.d.ts.map +1 -1
  71. package/dist/core/agents/coord-client.js +65 -155
  72. package/dist/core/agents/finalization.d.ts +4 -1
  73. package/dist/core/agents/finalization.d.ts.map +1 -1
  74. package/dist/core/agents/finalization.js +89 -32
  75. package/dist/core/agents/index.d.ts +5 -5
  76. package/dist/core/agents/index.d.ts.map +1 -1
  77. package/dist/core/agents/index.js +5 -5
  78. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  79. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-authority-v3.js +233 -0
  81. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  82. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  83. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  84. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  85. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  86. package/dist/core/agents/live-observation-v3.js +157 -0
  87. package/dist/core/agents/render/prompt-context.d.ts +10 -4
  88. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  89. package/dist/core/agents/render/prompt-context.js +61 -55
  90. package/dist/core/agents/render/session-context.d.ts +1 -1
  91. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  92. package/dist/core/agents/render/session-context.js +15 -33
  93. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  94. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  95. package/dist/core/agents/rules/claim-conflict.js +79 -127
  96. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  97. package/dist/core/agents/rules/commit-conflict.js +3 -18
  98. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  99. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  100. package/dist/core/agents/rules/stop-hook.js +193 -236
  101. package/dist/core/agents/session-events.d.ts +5 -7
  102. package/dist/core/agents/session-events.d.ts.map +1 -1
  103. package/dist/core/agents/session-events.js +127 -95
  104. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  105. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  106. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  107. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  108. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  109. package/dist/core/agents/session-finalizer-v3.js +734 -0
  110. package/dist/core/agents/session-name-display.d.ts +40 -0
  111. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  112. package/dist/core/agents/session-name-display.js +119 -0
  113. package/dist/core/agents/state/activity-log.d.ts +3 -3
  114. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  115. package/dist/core/agents/state/activity-log.js +7 -16
  116. package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
  117. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  118. package/dist/core/agents/state/heartbeat-writer.js +59 -199
  119. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  120. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  121. package/dist/core/agents/state/live-coordination-view.js +209 -0
  122. package/dist/core/agents/state/session-state.d.ts +45 -0
  123. package/dist/core/agents/state/session-state.d.ts.map +1 -0
  124. package/dist/core/agents/state/session-state.js +90 -0
  125. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  126. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  127. package/dist/core/agents/state/stale-sweep.js +26 -15
  128. package/dist/core/artifacts/index.d.ts.map +1 -1
  129. package/dist/core/artifacts/index.js +5 -7
  130. package/dist/core/config.d.ts +33 -2
  131. package/dist/core/config.d.ts.map +1 -1
  132. package/dist/core/config.js +98 -2
  133. package/dist/core/context/index.d.ts +1 -4
  134. package/dist/core/context/index.d.ts.map +1 -1
  135. package/dist/core/context/index.js +9 -9
  136. package/dist/core/events/span-parent.d.ts +15 -0
  137. package/dist/core/events/span-parent.d.ts.map +1 -0
  138. package/dist/core/events/span-parent.js +34 -0
  139. package/dist/core/events/v3/advance.d.ts +14 -0
  140. package/dist/core/events/v3/advance.d.ts.map +1 -0
  141. package/dist/core/events/v3/advance.js +134 -0
  142. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  143. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  144. package/dist/core/events/v3/authority-outbox.js +399 -0
  145. package/dist/core/events/v3/base-builder.d.ts +20 -0
  146. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  147. package/dist/core/events/v3/base-builder.js +29 -0
  148. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  149. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  150. package/dist/core/events/v3/base-contract.js +647 -0
  151. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  152. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  153. package/dist/core/events/v3/bootstrap.js +175 -0
  154. package/dist/core/events/v3/builder.d.ts +20 -0
  155. package/dist/core/events/v3/builder.d.ts.map +1 -0
  156. package/dist/core/events/v3/builder.js +28 -0
  157. package/dist/core/events/v3/canonical.d.ts +31 -0
  158. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  159. package/dist/core/events/v3/canonical.js +100 -0
  160. package/dist/core/events/v3/capabilities.d.ts +31 -0
  161. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  162. package/dist/core/events/v3/capabilities.js +107 -0
  163. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  164. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  165. package/dist/core/events/v3/capability-drift.js +134 -0
  166. package/dist/core/events/v3/catalog.d.ts +38 -0
  167. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  168. package/dist/core/events/v3/catalog.js +135 -0
  169. package/dist/core/events/v3/clock-order.d.ts +34 -0
  170. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  171. package/dist/core/events/v3/clock-order.js +35 -0
  172. package/dist/core/events/v3/contract.d.ts +171 -0
  173. package/dist/core/events/v3/contract.d.ts.map +1 -0
  174. package/dist/core/events/v3/contract.js +180 -0
  175. package/dist/core/events/v3/control.d.ts +111 -0
  176. package/dist/core/events/v3/control.d.ts.map +1 -0
  177. package/dist/core/events/v3/control.js +419 -0
  178. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  179. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/coordination-view.js +119 -0
  181. package/dist/core/events/v3/economics.d.ts +77 -0
  182. package/dist/core/events/v3/economics.d.ts.map +1 -0
  183. package/dist/core/events/v3/economics.js +274 -0
  184. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  185. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  186. package/dist/core/events/v3/finalization-view.js +37 -0
  187. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  188. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  189. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  190. package/dist/core/events/v3/generated.d.ts +4 -0
  191. package/dist/core/events/v3/generated.d.ts.map +1 -0
  192. package/dist/core/events/v3/generated.js +47 -0
  193. package/dist/core/events/v3/ids.d.ts +9 -0
  194. package/dist/core/events/v3/ids.d.ts.map +1 -0
  195. package/dist/core/events/v3/ids.js +25 -0
  196. package/dist/core/events/v3/index.d.ts +35 -0
  197. package/dist/core/events/v3/index.d.ts.map +1 -0
  198. package/dist/core/events/v3/index.js +33 -0
  199. package/dist/core/events/v3/latency.d.ts +63 -0
  200. package/dist/core/events/v3/latency.d.ts.map +1 -0
  201. package/dist/core/events/v3/latency.js +412 -0
  202. package/dist/core/events/v3/live-feed.d.ts +45 -0
  203. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-feed.js +246 -0
  205. package/dist/core/events/v3/live-observation.d.ts +35 -0
  206. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  207. package/dist/core/events/v3/live-observation.js +1 -0
  208. package/dist/core/events/v3/live-routing.d.ts +57 -0
  209. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  210. package/dist/core/events/v3/live-routing.js +107 -0
  211. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  212. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  214. package/dist/core/events/v3/producers/command.d.ts +50 -0
  215. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/command.js +135 -0
  217. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  218. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  220. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  221. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/coordination.js +229 -0
  223. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  224. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/hook-base.js +424 -0
  226. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  227. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/hook.js +71 -0
  229. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  231. package/dist/core/events/v3/producers/intake.js +244 -0
  232. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  233. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/recorder.js +2176 -0
  235. package/dist/core/events/v3/projection.d.ts +101 -0
  236. package/dist/core/events/v3/projection.d.ts.map +1 -0
  237. package/dist/core/events/v3/projection.js +479 -0
  238. package/dist/core/events/v3/reader.d.ts +75 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -0
  240. package/dist/core/events/v3/reader.js +778 -0
  241. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  242. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  243. package/dist/core/events/v3/recovery-record.js +167 -0
  244. package/dist/core/events/v3/recovery.d.ts +22 -0
  245. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  246. package/dist/core/events/v3/recovery.js +227 -0
  247. package/dist/core/events/v3/span-state.d.ts +52 -0
  248. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  249. package/dist/core/events/v3/span-state.js +142 -0
  250. package/dist/core/events/v3/targets.d.ts +23 -0
  251. package/dist/core/events/v3/targets.d.ts.map +1 -0
  252. package/dist/core/events/v3/targets.js +134 -0
  253. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  254. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  255. package/dist/core/events/v3/turn-telemetry.js +168 -0
  256. package/dist/core/events/v3/validate.d.ts +9 -0
  257. package/dist/core/events/v3/validate.d.ts.map +1 -0
  258. package/dist/core/events/v3/validate.js +281 -0
  259. package/dist/core/events/v3/writer.d.ts +56 -0
  260. package/dist/core/events/v3/writer.d.ts.map +1 -0
  261. package/dist/core/events/v3/writer.js +335 -0
  262. package/dist/core/governor/index.d.ts +1 -1
  263. package/dist/core/governor/index.d.ts.map +1 -1
  264. package/dist/core/governor/index.js +1 -1
  265. package/dist/core/governor/plan-api.d.ts +2 -1
  266. package/dist/core/governor/plan-api.d.ts.map +1 -1
  267. package/dist/core/governor/plan-api.js +6 -3
  268. package/dist/core/governor/read.d.ts +1 -1
  269. package/dist/core/governor/read.d.ts.map +1 -1
  270. package/dist/core/governor/read.js +1 -1
  271. package/dist/core/governor/state.d.ts +9 -0
  272. package/dist/core/governor/state.d.ts.map +1 -1
  273. package/dist/core/governor/state.js +40 -3
  274. package/dist/core/guard/config.d.ts +5 -0
  275. package/dist/core/guard/config.d.ts.map +1 -0
  276. package/dist/core/guard/config.js +157 -0
  277. package/dist/core/guard/coordinator.d.ts +14 -0
  278. package/dist/core/guard/coordinator.d.ts.map +1 -0
  279. package/dist/core/guard/coordinator.js +173 -0
  280. package/dist/core/guard/evaluator.d.ts +4 -0
  281. package/dist/core/guard/evaluator.d.ts.map +1 -0
  282. package/dist/core/guard/evaluator.js +242 -0
  283. package/dist/core/guard/evidence-v3.d.ts +15 -0
  284. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  285. package/dist/core/guard/evidence-v3.js +171 -0
  286. package/dist/core/guard/index.d.ts +10 -0
  287. package/dist/core/guard/index.d.ts.map +1 -0
  288. package/dist/core/guard/index.js +6 -0
  289. package/dist/core/guard/live-source-v3.d.ts +40 -0
  290. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  291. package/dist/core/guard/live-source-v3.js +128 -0
  292. package/dist/core/guard/storage.d.ts +27 -0
  293. package/dist/core/guard/storage.d.ts.map +1 -0
  294. package/dist/core/guard/storage.js +140 -0
  295. package/dist/core/guard/types.d.ts +119 -0
  296. package/dist/core/guard/types.d.ts.map +1 -0
  297. package/dist/core/guard/types.js +1 -0
  298. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  299. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/detect.js +29 -0
  301. package/dist/core/hooks/adapter/events.d.ts +7 -4
  302. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  303. package/dist/core/hooks/adapter/events.js +13 -4
  304. package/dist/core/hooks/adapter/output.d.ts +2 -2
  305. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  306. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  307. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  308. package/dist/core/hooks/adapter/parse.js +64 -24
  309. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  310. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  311. package/dist/core/hooks/adapter/wiring.js +89 -11
  312. package/dist/core/hooks/cli.d.ts +1 -1
  313. package/dist/core/hooks/cli.js +345 -400
  314. package/dist/core/hooks/codex-authorization.d.ts +30 -0
  315. package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
  316. package/dist/core/hooks/codex-authorization.js +199 -0
  317. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  318. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  319. package/dist/core/hooks/effects/image-capture.js +212 -221
  320. package/dist/core/hooks/effects/index.d.ts +1 -9
  321. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  322. package/dist/core/hooks/effects/index.js +1 -24
  323. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  324. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  325. package/dist/core/hooks/events/input-hash.js +43 -0
  326. package/dist/core/hooks/index.d.ts +4 -3
  327. package/dist/core/hooks/index.d.ts.map +1 -1
  328. package/dist/core/hooks/index.js +2 -3
  329. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  330. package/dist/core/hooks/resolve/coord-root.js +1 -1
  331. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  332. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  333. package/dist/core/hooks/resolve/owner.js +51 -42
  334. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  335. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  336. package/dist/core/hooks/resolve/transcript.js +155 -14
  337. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  338. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  339. package/dist/core/hooks/session-name-presence.js +15 -15
  340. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  341. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  342. package/dist/core/journal/index.d.ts +2 -2
  343. package/dist/core/journal/index.d.ts.map +1 -1
  344. package/dist/core/journal/index.js +9 -22
  345. package/dist/core/presence/blob.d.ts +8 -3
  346. package/dist/core/presence/blob.d.ts.map +1 -1
  347. package/dist/core/presence/blob.js +54 -41
  348. package/dist/core/presence/codec-digest.d.ts +29 -0
  349. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  350. package/dist/core/presence/codec-digest.js +170 -0
  351. package/dist/core/presence/index.js +15 -1
  352. package/dist/core/presence/relay-client.d.ts +1 -1
  353. package/dist/core/presence/relay-client.d.ts.map +1 -1
  354. package/dist/core/presence/relay-client.js +5 -5
  355. package/dist/core/work/index.d.ts +1 -1
  356. package/dist/core/work/index.d.ts.map +1 -1
  357. package/dist/core/work/index.js +1 -1
  358. package/dist/core/work/read.d.ts +1 -1
  359. package/dist/core/work/read.d.ts.map +1 -1
  360. package/dist/core/work/read.js +1 -1
  361. package/dist/core/work/runner.d.ts.map +1 -1
  362. package/dist/core/work/runner.js +6 -0
  363. package/dist/core/work/state.d.ts +9 -0
  364. package/dist/core/work/state.d.ts.map +1 -1
  365. package/dist/core/work/state.js +17 -3
  366. package/dist/core/workflow/engine.js +24 -25
  367. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  368. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  369. package/dist/core/workflow/live-session-v3.js +86 -0
  370. package/dist/core/workflow/scope-id.d.ts +3 -0
  371. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  372. package/dist/core/workflow/scope-id.js +5 -0
  373. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  374. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  375. package/dist/core/workflow/workspaces/leases.js +53 -19
  376. package/dist/index.d.ts +1 -1
  377. package/dist/index.js +1 -1
  378. package/dist/lib/browser/client.d.ts +41 -0
  379. package/dist/lib/browser/client.d.ts.map +1 -1
  380. package/dist/lib/browser/client.js +203 -0
  381. package/dist/lib/browser/critique.d.ts +28 -2
  382. package/dist/lib/browser/critique.d.ts.map +1 -1
  383. package/dist/lib/browser/critique.js +74 -18
  384. package/dist/lib/browser/geometry.d.ts +1 -1
  385. package/dist/lib/browser/geometry.d.ts.map +1 -1
  386. package/dist/lib/browser/geometry.js +130 -6
  387. package/dist/lib/browser/index.d.ts +3 -0
  388. package/dist/lib/browser/index.d.ts.map +1 -1
  389. package/dist/lib/browser/index.js +3 -0
  390. package/dist/lib/browser/qa-plan.d.ts +174 -0
  391. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  392. package/dist/lib/browser/qa-plan.js +321 -0
  393. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  394. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  395. package/dist/lib/browser/qa-reuse.js +222 -0
  396. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  397. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  398. package/dist/lib/browser/qa-snapshot.js +171 -0
  399. package/dist/lib/browser/runts.d.ts.map +1 -1
  400. package/dist/lib/browser/runts.js +22 -1
  401. package/dist/lib/browser/tiling.d.ts +71 -0
  402. package/dist/lib/browser/tiling.d.ts.map +1 -0
  403. package/dist/lib/browser/tiling.js +118 -0
  404. package/dist/lib/context/index.d.ts +0 -3
  405. package/dist/lib/context/index.d.ts.map +1 -1
  406. package/dist/lib/context/index.js +20 -42
  407. package/dist/lib/council/index.d.ts +2 -2
  408. package/dist/lib/council/index.d.ts.map +1 -1
  409. package/dist/lib/council/index.js +9 -20
  410. package/dist/lib/docs-frontmatter.d.ts +1 -6
  411. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  412. package/dist/lib/docs-frontmatter.js +12 -78
  413. package/dist/lib/docs-index.d.ts +9 -0
  414. package/dist/lib/docs-index.d.ts.map +1 -1
  415. package/dist/lib/docs-index.js +32 -3
  416. package/dist/lib/docs-lint.d.ts.map +1 -1
  417. package/dist/lib/docs-lint.js +14 -30
  418. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  419. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  420. package/dist/lib/docs-metadata-audit.js +132 -0
  421. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  422. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  423. package/dist/lib/docs-metadata-managed.js +78 -0
  424. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  425. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  426. package/dist/lib/docs-metadata-sync.js +222 -0
  427. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  428. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  429. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  430. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  431. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  432. package/dist/lib/docs-metadata-v2.js +424 -0
  433. package/dist/lib/docs-new.d.ts +11 -0
  434. package/dist/lib/docs-new.d.ts.map +1 -0
  435. package/dist/lib/docs-new.js +52 -0
  436. package/dist/lib/docs-sweep.d.ts.map +1 -1
  437. package/dist/lib/docs-sweep.js +45 -29
  438. package/dist/lib/headless/index.d.ts +98 -0
  439. package/dist/lib/headless/index.d.ts.map +1 -0
  440. package/dist/lib/headless/index.js +211 -0
  441. package/dist/lib/identities/assume.d.ts +4 -4
  442. package/dist/lib/identities/assume.d.ts.map +1 -1
  443. package/dist/lib/identities/assume.js +52 -68
  444. package/dist/lib/instructions/apply.d.ts +5 -4
  445. package/dist/lib/instructions/apply.d.ts.map +1 -1
  446. package/dist/lib/instructions/apply.js +32 -20
  447. package/dist/lib/instructions/bundle.d.ts +33 -0
  448. package/dist/lib/instructions/bundle.d.ts.map +1 -0
  449. package/dist/lib/instructions/bundle.js +149 -0
  450. package/dist/lib/instructions/splice.d.ts +0 -1
  451. package/dist/lib/instructions/splice.d.ts.map +1 -1
  452. package/dist/lib/instructions/splice.js +22 -6
  453. package/dist/lib/instructions/templates.d.ts +7 -5
  454. package/dist/lib/instructions/templates.d.ts.map +1 -1
  455. package/dist/lib/instructions/templates.js +79 -9
  456. package/package.json +27 -6
  457. package/schemas/config.schema.json +120 -2
  458. package/schemas/docs-metadata-v2.schema.json +441 -0
  459. package/schemas/event-v3.schema.json +24472 -0
  460. package/src/commander.ts +7 -1
  461. package/src/commands/adapter.ts +2 -2
  462. package/src/commands/agents.ts +1737 -570
  463. package/src/commands/artifacts.ts +7 -6
  464. package/src/commands/backup.ts +29 -21
  465. package/src/commands/browse.ts +349 -8
  466. package/src/commands/checkpoint.ts +4 -3
  467. package/src/commands/claude-desktop.ts +7 -5
  468. package/src/commands/context.ts +1 -6
  469. package/src/commands/decision.ts +27 -44
  470. package/src/commands/docs.ts +100 -33
  471. package/src/commands/doctor.ts +73 -8
  472. package/src/commands/events.ts +256 -0
  473. package/src/commands/governor.ts +18 -4
  474. package/src/commands/init.ts +264 -57
  475. package/src/commands/instructions.ts +129 -0
  476. package/src/commands/journal.ts +4 -13
  477. package/src/commands/ledger-v3.ts +111 -0
  478. package/src/commands/presence.ts +18 -11
  479. package/src/commands/sync.ts +1 -1
  480. package/src/commands/web.ts +67 -8
  481. package/src/commands/work.ts +28 -5
  482. package/src/core/adapter.ts +5 -0
  483. package/src/core/adapters/attest.ts +8 -3
  484. package/src/core/adapters/profiles.ts +4 -6
  485. package/src/core/agents/canonical-emit.ts +39 -28
  486. package/src/core/agents/cli.ts +242 -263
  487. package/src/core/agents/codex-archive-v3.ts +138 -0
  488. package/src/core/agents/coord-client.ts +75 -177
  489. package/src/core/agents/finalization.ts +120 -38
  490. package/src/core/agents/index.ts +5 -5
  491. package/src/core/agents/live-authority-v3.ts +375 -0
  492. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  493. package/src/core/agents/live-observation-v3.ts +216 -0
  494. package/src/core/agents/render/prompt-context.ts +89 -55
  495. package/src/core/agents/render/session-context.ts +23 -32
  496. package/src/core/agents/rules/claim-conflict.ts +85 -126
  497. package/src/core/agents/rules/commit-conflict.ts +3 -14
  498. package/src/core/agents/rules/stop-hook.ts +239 -293
  499. package/src/core/agents/session-events.ts +137 -104
  500. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  501. package/src/core/agents/session-finalizer-v3.ts +953 -0
  502. package/src/core/agents/session-name-display.ts +149 -0
  503. package/src/core/agents/state/activity-log.ts +6 -14
  504. package/src/core/agents/state/heartbeat-writer.ts +98 -242
  505. package/src/core/agents/state/live-coordination-view.ts +290 -0
  506. package/src/core/agents/state/session-state.ts +143 -0
  507. package/src/core/agents/state/stale-sweep.ts +40 -17
  508. package/src/core/artifacts/index.ts +4 -5
  509. package/src/core/config.ts +148 -3
  510. package/src/core/context/index.ts +9 -17
  511. package/src/core/events/span-parent.ts +46 -0
  512. package/src/core/events/v3/advance.ts +168 -0
  513. package/src/core/events/v3/authority-outbox.ts +548 -0
  514. package/src/core/events/v3/base-builder.ts +60 -0
  515. package/src/core/events/v3/base-contract.ts +882 -0
  516. package/src/core/events/v3/bootstrap.ts +226 -0
  517. package/src/core/events/v3/builder.ts +59 -0
  518. package/src/core/events/v3/canonical.ts +153 -0
  519. package/src/core/events/v3/capabilities.ts +171 -0
  520. package/src/core/events/v3/capability-drift.ts +177 -0
  521. package/src/core/events/v3/catalog.ts +202 -0
  522. package/src/core/events/v3/clock-order.ts +41 -0
  523. package/src/core/events/v3/contract.ts +365 -0
  524. package/src/core/events/v3/control.ts +576 -0
  525. package/src/core/events/v3/coordination-view.ts +193 -0
  526. package/src/core/events/v3/economics.ts +384 -0
  527. package/src/core/events/v3/finalization-view.ts +67 -0
  528. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  529. package/src/core/events/v3/generated.ts +48 -0
  530. package/src/core/events/v3/ids.ts +33 -0
  531. package/src/core/events/v3/index.ts +322 -0
  532. package/src/core/events/v3/latency.ts +551 -0
  533. package/src/core/events/v3/live-feed.ts +319 -0
  534. package/src/core/events/v3/live-observation.ts +39 -0
  535. package/src/core/events/v3/live-routing.ts +135 -0
  536. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  537. package/src/core/events/v3/producers/command.ts +201 -0
  538. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  539. package/src/core/events/v3/producers/coordination.ts +355 -0
  540. package/src/core/events/v3/producers/hook-base.ts +578 -0
  541. package/src/core/events/v3/producers/hook.ts +119 -0
  542. package/src/core/events/v3/producers/intake.ts +319 -0
  543. package/src/core/events/v3/producers/recorder.ts +2805 -0
  544. package/src/core/events/v3/projection.ts +653 -0
  545. package/src/core/events/v3/reader.ts +1127 -0
  546. package/src/core/events/v3/recovery-record.ts +244 -0
  547. package/src/core/events/v3/recovery.ts +271 -0
  548. package/src/core/events/v3/span-state.ts +187 -0
  549. package/src/core/events/v3/targets.ts +182 -0
  550. package/src/core/events/v3/turn-telemetry.ts +259 -0
  551. package/src/core/events/v3/validate.ts +361 -0
  552. package/src/core/events/v3/writer.ts +419 -0
  553. package/src/core/governor/index.ts +3 -0
  554. package/src/core/governor/plan-api.ts +10 -2
  555. package/src/core/governor/read.ts +3 -0
  556. package/src/core/governor/state.ts +52 -5
  557. package/src/core/guard/config.ts +206 -0
  558. package/src/core/guard/coordinator.ts +227 -0
  559. package/src/core/guard/evaluator.ts +343 -0
  560. package/src/core/guard/evidence-v3.ts +227 -0
  561. package/src/core/guard/index.ts +35 -0
  562. package/src/core/guard/live-source-v3.ts +204 -0
  563. package/src/core/guard/storage.ts +188 -0
  564. package/src/core/guard/types.ts +152 -0
  565. package/src/core/hooks/adapter/detect.ts +28 -1
  566. package/src/core/hooks/adapter/events.ts +15 -6
  567. package/src/core/hooks/adapter/output.ts +7 -2
  568. package/src/core/hooks/adapter/parse.ts +81 -36
  569. package/src/core/hooks/adapter/wiring.ts +119 -13
  570. package/src/core/hooks/cli.ts +398 -422
  571. package/src/core/hooks/codex-authorization.ts +253 -0
  572. package/src/core/hooks/effects/image-capture.ts +228 -238
  573. package/src/core/hooks/effects/index.ts +1 -36
  574. package/src/core/hooks/events/input-hash.ts +47 -0
  575. package/src/core/hooks/index.ts +4 -11
  576. package/src/core/hooks/resolve/coord-root.ts +1 -1
  577. package/src/core/hooks/resolve/owner.ts +52 -45
  578. package/src/core/hooks/resolve/transcript.ts +165 -14
  579. package/src/core/hooks/session-name-presence.ts +14 -15
  580. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  581. package/src/core/journal/index.ts +15 -22
  582. package/src/core/presence/blob.ts +63 -38
  583. package/src/core/presence/codec-digest.ts +215 -0
  584. package/src/core/presence/index.ts +18 -1
  585. package/src/core/presence/relay-client.ts +5 -5
  586. package/src/core/work/index.ts +3 -0
  587. package/src/core/work/read.ts +3 -0
  588. package/src/core/work/runner.ts +6 -0
  589. package/src/core/work/state.ts +27 -3
  590. package/src/core/workflow/engine.ts +24 -24
  591. package/src/core/workflow/live-session-v3.ts +126 -0
  592. package/src/core/workflow/scope-id.ts +6 -0
  593. package/src/core/workflow/workspaces/leases.ts +56 -19
  594. package/src/index.ts +1 -1
  595. package/src/lib/browser/client.ts +230 -0
  596. package/src/lib/browser/critique.ts +104 -27
  597. package/src/lib/browser/geometry.ts +143 -14
  598. package/src/lib/browser/index.ts +34 -0
  599. package/src/lib/browser/qa-plan.ts +501 -0
  600. package/src/lib/browser/qa-reuse.ts +306 -0
  601. package/src/lib/browser/qa-snapshot.ts +223 -0
  602. package/src/lib/browser/runts.ts +27 -2
  603. package/src/lib/browser/tiling.ts +164 -0
  604. package/src/lib/context/index.ts +22 -46
  605. package/src/lib/council/index.ts +9 -21
  606. package/src/lib/docs-frontmatter.ts +8 -79
  607. package/src/lib/docs-index.ts +33 -3
  608. package/src/lib/docs-lint.ts +15 -29
  609. package/src/lib/docs-metadata-audit.ts +166 -0
  610. package/src/lib/docs-metadata-managed.ts +83 -0
  611. package/src/lib/docs-metadata-sync.ts +262 -0
  612. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  613. package/src/lib/docs-metadata-v2.ts +646 -0
  614. package/src/lib/docs-new.ts +63 -0
  615. package/src/lib/docs-sweep.ts +42 -28
  616. package/src/lib/headless/index.ts +287 -0
  617. package/src/lib/identities/assume.ts +67 -86
  618. package/src/lib/instructions/apply.ts +33 -20
  619. package/src/lib/instructions/bundle.ts +199 -0
  620. package/src/lib/instructions/splice.ts +21 -7
  621. package/src/lib/instructions/templates.ts +85 -13
  622. package/dist/core/agents/cli-emit.d.ts +0 -27
  623. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  624. package/dist/core/agents/cli-emit.js +0 -57
  625. package/dist/core/agents/codex-replay.d.ts +0 -29
  626. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  627. package/dist/core/agents/codex-replay.js +0 -138
  628. package/dist/core/agents/events/consume.d.ts +0 -82
  629. package/dist/core/agents/events/consume.d.ts.map +0 -1
  630. package/dist/core/agents/events/consume.js +0 -195
  631. package/dist/core/agents/events/emit.d.ts +0 -42
  632. package/dist/core/agents/events/emit.d.ts.map +0 -1
  633. package/dist/core/agents/events/emit.js +0 -75
  634. package/dist/core/agents/events/ulid.d.ts +0 -11
  635. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  636. package/dist/core/agents/events/ulid.js +0 -47
  637. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
  638. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  639. package/dist/core/agents/state/heartbeat-projector.js +0 -527
  640. package/dist/core/hooks/events/emit.d.ts +0 -31
  641. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  642. package/dist/core/hooks/events/emit.js +0 -93
  643. package/dist/core/hooks/events/rotate.d.ts +0 -43
  644. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  645. package/dist/core/hooks/events/rotate.js +0 -142
  646. package/dist/core/hooks/events/schema.d.ts +0 -312
  647. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  648. package/dist/core/hooks/events/schema.js +0 -12
  649. package/dist/core/hooks/events/ulid.d.ts +0 -10
  650. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  651. package/dist/core/hooks/events/ulid.js +0 -47
  652. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  653. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  654. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  655. package/src/core/agents/cli-emit.ts +0 -64
  656. package/src/core/agents/codex-replay.ts +0 -163
  657. package/src/core/agents/events/consume.ts +0 -254
  658. package/src/core/agents/events/emit.ts +0 -115
  659. package/src/core/agents/events/ulid.ts +0 -51
  660. package/src/core/agents/state/heartbeat-projector.ts +0 -582
  661. package/src/core/hooks/events/emit.ts +0 -125
  662. package/src/core/hooks/events/rotate.ts +0 -151
  663. package/src/core/hooks/events/schema.ts +0 -538
  664. package/src/core/hooks/events/ulid.ts +0 -51
  665. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -9,8 +9,8 @@
9
9
  * Fields owned here: `binName` (host CLI name for agent-facing strings),
10
10
  * `hooksSetupHint`, `agents`, `tools`, `workflow`, `skills`, `presence`, plus the tunable
11
11
  * `coord` (heartbeat freshness), `artifacts` (working-file retention),
12
- * `backup` (restic repo/password/prune policy), and `sync` (rclone
13
- * remote/prefix) sections. The `files` deny/override section
12
+ * `backup` (restic repo/password/prune policy), `sync` (rclone
13
+ * remote/prefix), and `web` (dashboard port) sections. The `files` deny/override section
14
14
  * is parsed separately by `web/lib/files.ts`.
15
15
  *
16
16
  * Env vars and CLI flags override any config value per invocation (each accessor
@@ -30,6 +30,25 @@ export const DEFAULT_BIN_NAME = "harn";
30
30
  /** Heartbeat-freshness default (seconds): the sweep window when nothing overrides it. */
31
31
  export const DEFAULT_FRESHNESS_SECS = 600;
32
32
 
33
+ /** Mnemonic dashboard port: 4276 spells HARN on a phone keypad. */
34
+ export const DEFAULT_WEB_PORT = 4276;
35
+
36
+ export interface SessionFinalizationConfig {
37
+ archiveGraceSeconds: number;
38
+ idleObserveSeconds: number;
39
+ idleFinalizeSeconds: number;
40
+ cascadeGraceSeconds: number;
41
+ reconcileIntervalSeconds: number;
42
+ }
43
+
44
+ export const DEFAULT_SESSION_FINALIZATION_CONFIG: SessionFinalizationConfig = {
45
+ archiveGraceSeconds: 600,
46
+ idleObserveSeconds: 3 * 24 * 60 * 60,
47
+ idleFinalizeSeconds: 7 * 24 * 60 * 60,
48
+ cascadeGraceSeconds: 60 * 60,
49
+ reconcileIntervalSeconds: 15 * 60,
50
+ };
51
+
33
52
  export type AgentFinalizationDisposition = "git" | "output";
34
53
 
35
54
  export interface AgentFinalizationRoot {
@@ -88,7 +107,17 @@ interface HarneryConfig {
88
107
  * Coord-layer tunables. `freshness_seconds` is the heartbeat age above which
89
108
  * the sweeper prunes an agent (default 600). Read via `coordFreshnessSeconds()`.
90
109
  */
91
- coord?: { freshness_seconds?: number };
110
+ coord?: {
111
+ freshness_seconds?: number;
112
+ run_quality?: unknown;
113
+ finalization?: {
114
+ archive_grace_seconds?: number;
115
+ idle_observe_seconds?: number;
116
+ idle_finalize_seconds?: number;
117
+ cascade_grace_seconds?: number;
118
+ reconcile_interval_seconds?: number;
119
+ };
120
+ };
92
121
  /**
93
122
  * Managed working-artifact defaults. `default_retention_days` is the
94
123
  * create-time TTL when the caller does not pass `artifacts create --days`.
@@ -111,6 +140,8 @@ interface HarneryConfig {
111
140
  * `~/.config/harnery/sync.json`, which is consulted as a lower-precedence fallback.
112
141
  */
113
142
  sync?: { remote?: string; prefix?: string };
143
+ /** Standalone dashboard defaults. */
144
+ web?: { port?: number; bind?: string };
114
145
  [k: string]: unknown;
115
146
  }
116
147
 
@@ -194,6 +225,61 @@ function parseConfigFile(p: string): HarneryConfig {
194
225
  return {};
195
226
  }
196
227
 
228
+ export interface CoordRunQualityConfigSource {
229
+ value: unknown;
230
+ invalid: boolean;
231
+ /** Stable digest seed that contains no config values when parsing failed. */
232
+ digest_seed: unknown;
233
+ }
234
+
235
+ /**
236
+ * Effective user-plus-project `coord.run_quality` value with parse diagnostics.
237
+ * The ordinary config reader stays fail-soft; this one lets the guard visibly
238
+ * disable itself rather than silently substituting defaults for malformed JSONC.
239
+ */
240
+ export function coordRunQualityConfigSource(root: string): CoordRunQualityConfigSource {
241
+ const projectPath = join(root, ".harnery", "config.jsonc");
242
+ const userPath = userConfigPath();
243
+ const layers = [userPath, projectPath].map((path) => parseConfigLayer(path));
244
+ const invalid = layers.filter((layer) => layer.invalid);
245
+ if (invalid.length > 0) {
246
+ return {
247
+ value: undefined,
248
+ invalid: true,
249
+ digest_seed: invalid.map((layer) => ({
250
+ path_kind: layer.path_kind,
251
+ signature: layer.signature,
252
+ })),
253
+ };
254
+ }
255
+ const merged = mergeConfig(layers[0]!.config, layers[1]!.config);
256
+ return {
257
+ value: merged.coord?.run_quality,
258
+ invalid: false,
259
+ digest_seed: merged.coord?.run_quality,
260
+ };
261
+ }
262
+
263
+ function parseConfigLayer(path: string): {
264
+ config: HarneryConfig;
265
+ invalid: boolean;
266
+ path_kind: "user" | "project";
267
+ signature: string | null;
268
+ } {
269
+ const pathKind = path === userConfigPath() ? "user" : "project";
270
+ const signature = statSignature(path);
271
+ if (signature === null) return { config: {}, invalid: false, path_kind: pathKind, signature };
272
+ try {
273
+ const value = JSON.parse(stripJsonComments(readFileSync(path, "utf8"))) as unknown;
274
+ if (isPlainObject(value)) {
275
+ return { config: value as HarneryConfig, invalid: false, path_kind: pathKind, signature };
276
+ }
277
+ } catch {
278
+ // The guard reports one bounded health event for this file signature.
279
+ }
280
+ return { config: {}, invalid: true, path_kind: pathKind, signature };
281
+ }
282
+
197
283
  function isPlainObject(v: unknown): v is Record<string, unknown> {
198
284
  return typeof v === "object" && v !== null && !Array.isArray(v);
199
285
  }
@@ -445,6 +531,65 @@ export function coordFreshnessSeconds(coordRoot?: string | null): number {
445
531
  return DEFAULT_FRESHNESS_SECS;
446
532
  }
447
533
 
534
+ function parseWebPort(value: unknown, source: string): number {
535
+ const port = typeof value === "number" ? value : Number(value);
536
+ if (!Number.isInteger(port) || port < 1024 || port > 65535) {
537
+ throw new RangeError(`${source} must be an integer from 1024 through 65535`);
538
+ }
539
+ return port;
540
+ }
541
+
542
+ /**
543
+ * Resolve the standalone dashboard port.
544
+ *
545
+ * Precedence: explicit `--port` flag, `HARNERY_WEB_PORT`, merged
546
+ * `.harnery/config.jsonc` `web.port`, then the mnemonic built-in default 4276.
547
+ */
548
+ export function resolveWebPort(explicitPort?: string, coordRoot?: string | null): number {
549
+ if (explicitPort !== undefined && explicitPort.trim() !== "") {
550
+ return parseWebPort(explicitPort, "--port");
551
+ }
552
+ const envPort = coordEnv("WEB_PORT");
553
+ if (envPort !== undefined && envPort.trim() !== "") {
554
+ return parseWebPort(envPort, "HARNERY_WEB_PORT");
555
+ }
556
+ const root = coordRoot ?? findCoordRoot();
557
+ const configuredPort = root ? readConfig(root).web?.port : undefined;
558
+ if (configuredPort !== undefined) {
559
+ return parseWebPort(configuredPort, "web.port");
560
+ }
561
+ return DEFAULT_WEB_PORT;
562
+ }
563
+
564
+ /** Policy for converging independent termination signals on one finalizer. */
565
+ export function sessionFinalizationConfig(coordRoot?: string | null): SessionFinalizationConfig {
566
+ const root = coordRoot ?? findCoordRoot();
567
+ const configured = root ? readConfig(root).coord?.finalization : undefined;
568
+ const defaults = DEFAULT_SESSION_FINALIZATION_CONFIG;
569
+ const archiveGraceSeconds = posIntOr(
570
+ configured?.archive_grace_seconds,
571
+ defaults.archiveGraceSeconds,
572
+ );
573
+ const idleObserveSeconds = posIntOr(
574
+ configured?.idle_observe_seconds,
575
+ defaults.idleObserveSeconds,
576
+ );
577
+ const idleFinalizeSeconds = Math.max(
578
+ idleObserveSeconds,
579
+ posIntOr(configured?.idle_finalize_seconds, defaults.idleFinalizeSeconds),
580
+ );
581
+ return {
582
+ archiveGraceSeconds,
583
+ idleObserveSeconds,
584
+ idleFinalizeSeconds,
585
+ cascadeGraceSeconds: posIntOr(configured?.cascade_grace_seconds, defaults.cascadeGraceSeconds),
586
+ reconcileIntervalSeconds: posIntOr(
587
+ configured?.reconcile_interval_seconds,
588
+ defaults.reconcileIntervalSeconds,
589
+ ),
590
+ };
591
+ }
592
+
448
593
  /**
449
594
  * Default retention for a newly-created working artifact. Precedence:
450
595
  * `HARNERY_ARTIFACT_RETENTION_DAYS` -> project/user config
@@ -9,7 +9,8 @@ import { spawnSync } from "node:child_process";
9
9
  import { createHash, randomUUID } from "node:crypto";
10
10
  import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
11
11
  import { dirname, join } from "node:path";
12
- import type { Adapter } from "../hooks/events/schema.ts";
12
+ import type { Adapter } from "../adapter.ts";
13
+ import { readLiveCoordinationRow } from "../agents/state/live-coordination-view.ts";
13
14
 
14
15
  export const CONTEXT_SCHEMA_VERSION = 1 as const;
15
16
  export const MAX_CAPSULE_BYTES = 32 * 1024;
@@ -71,12 +72,9 @@ export interface ContinuityCapsule {
71
72
  context?: ContextSample;
72
73
  work: {
73
74
  task?: string;
74
- turn_summary?: string;
75
75
  continuation_note?: string;
76
76
  files_held: string[];
77
77
  files_held_truncated?: boolean;
78
- last_tool?: string;
79
- last_tool_target?: string;
80
78
  };
81
79
  repo: RepoSnapshot;
82
80
  }
@@ -123,10 +121,7 @@ export interface PreparedContextRecovery {
123
121
  interface HeartbeatSnapshot {
124
122
  model?: string;
125
123
  task?: string;
126
- turn_summary?: string;
127
124
  files_touched?: string[];
128
- last_tool?: string;
129
- last_tool_target?: string;
130
125
  }
131
126
 
132
127
  /** Parse the context-window shapes exposed by current adapter hook/status data. */
@@ -379,18 +374,12 @@ export function renderRecoveryBriefing(capsule: ContinuityCapsule, liveRepo: Rep
379
374
  `[harnery context continuity] Recovered generation ${capsule.generation} after native context compaction.`,
380
375
  ];
381
376
  if (capsule.work.task) lines.push(`Task: ${capsule.work.task}`);
382
- if (capsule.work.turn_summary) lines.push(`Last progress: ${capsule.work.turn_summary}`);
383
377
  if (capsule.work.continuation_note) {
384
378
  lines.push(`Continuation note: ${capsule.work.continuation_note}`);
385
379
  }
386
380
  if (capsule.work.files_held.length > 0) {
387
381
  lines.push(`Files held: ${capsule.work.files_held.join(", ")}`);
388
382
  }
389
- if (capsule.work.last_tool) {
390
- lines.push(
391
- `Last tool: ${capsule.work.last_tool}${capsule.work.last_tool_target ? ` (${capsule.work.last_tool_target})` : ""}`,
392
- );
393
- }
394
383
 
395
384
  const drift: string[] = [];
396
385
  if (capsule.repo.branch && liveRepo.branch && capsule.repo.branch !== liveRepo.branch) {
@@ -446,17 +435,20 @@ function buildWorkSnapshot(
446
435
  : [];
447
436
  return {
448
437
  task: clampString(heartbeat?.task, 1_000),
449
- turn_summary: clampString(heartbeat?.turn_summary, 3_000),
450
438
  continuation_note: clampString(continuationNote, 3_000),
451
439
  files_held: files.slice(0, MAX_SNAPSHOT_PATHS),
452
440
  ...(files.length > MAX_SNAPSHOT_PATHS ? { files_held_truncated: true } : {}),
453
- last_tool: clampString(heartbeat?.last_tool, 200),
454
- last_tool_target: clampString(heartbeat?.last_tool_target, 1_000),
455
441
  };
456
442
  }
457
443
 
458
444
  function readHeartbeat(coordRoot: string, instanceId: string): HeartbeatSnapshot | null {
459
- return readJson<HeartbeatSnapshot>(join(coordRoot, ".harnery", "active", `${instanceId}.json`));
445
+ const row = readLiveCoordinationRow(coordRoot, instanceId);
446
+ if (!row) return null;
447
+ return {
448
+ model: row.model,
449
+ task: row.task,
450
+ files_touched: row.files_touched,
451
+ };
460
452
  }
461
453
 
462
454
  function newState(input: {
@@ -0,0 +1,46 @@
1
+ export interface OpenToolSpanForCommandParent {
2
+ span_id: `span_${string}`;
3
+ turn_id?: `tid_${string}`;
4
+ requested_event_id?: `evt_${string}`;
5
+ tool_name?: string;
6
+ }
7
+
8
+ const SHELL_TOOL_NAMES = new Set([
9
+ "apply_patch",
10
+ "bash",
11
+ "exec",
12
+ "exec_command",
13
+ "execute",
14
+ "powershell",
15
+ "run_command",
16
+ "shell",
17
+ "terminal",
18
+ ]);
19
+
20
+ /**
21
+ * Choose a command's tool parent only when attribution cannot silently pick
22
+ * the wrong span. A single open tool is unambiguous. With parallel tools,
23
+ * exactly one shell-class span may be selected; every other case stays
24
+ * top-level so any over-count remains visible.
25
+ */
26
+ export function selectCommandParentSpan(
27
+ spans: readonly OpenToolSpanForCommandParent[],
28
+ turnId: `tid_${string}`,
29
+ ): `span_${string}` | undefined {
30
+ const open = spans.filter(
31
+ (span) => span.turn_id === turnId && span.requested_event_id !== undefined,
32
+ );
33
+ if (open.length === 1) return open[0]?.span_id;
34
+ const shell = open.filter((span) => isShellToolName(span.tool_name));
35
+ return shell.length === 1 ? shell[0]?.span_id : undefined;
36
+ }
37
+
38
+ export function isShellToolName(name: string | undefined): boolean {
39
+ if (!name) return false;
40
+ const normalized = name
41
+ .trim()
42
+ .toLowerCase()
43
+ .replace(/^.*[.:/]/, "")
44
+ .replaceAll("-", "_");
45
+ return SHELL_TOOL_NAMES.has(normalized);
46
+ }
@@ -0,0 +1,168 @@
1
+ import type { TSchema } from "@sinclair/typebox";
2
+ import { canonicalJsonV3 } from "./canonical.ts";
3
+
4
+ export interface SchemaAdvanceEligibilityV3 {
5
+ eligible: boolean;
6
+ strict: boolean;
7
+ issues: string[];
8
+ }
9
+
10
+ /**
11
+ * Mechanical half of ADR 0080's in-place advance gate. It proves that every
12
+ * value accepted by the prior JSON Schema remains accepted by the next schema.
13
+ * Semantic reinterpretations remain breaking even when this structural check
14
+ * passes and require genesis review.
15
+ */
16
+ export function validateAdditiveSchemaAdvanceV3(
17
+ prior: TSchema,
18
+ next: TSchema,
19
+ ): SchemaAdvanceEligibilityV3 {
20
+ const issues: string[] = [];
21
+ const result = isSuperset(prior as JsonSchema, next as JsonSchema, "$", issues);
22
+ return {
23
+ eligible: result.compatible && result.strict,
24
+ strict: result.strict,
25
+ issues: [...new Set(issues)].sort(),
26
+ };
27
+ }
28
+
29
+ type JsonSchema = Record<string, unknown>;
30
+ type Compatibility = { compatible: boolean; strict: boolean };
31
+
32
+ function isSuperset(
33
+ prior: JsonSchema,
34
+ next: JsonSchema,
35
+ path: string,
36
+ issues: string[],
37
+ ): Compatibility {
38
+ const priorAnyOf = schemaArray(prior.anyOf);
39
+ const nextAnyOf = schemaArray(next.anyOf);
40
+ if (priorAnyOf || nextAnyOf) {
41
+ if (!priorAnyOf || !nextAnyOf) return incompatible(path, "union_shape_changed", issues);
42
+ const used = new Set<number>();
43
+ let strict = nextAnyOf.length > priorAnyOf.length;
44
+ for (const [priorIndex, priorBranch] of priorAnyOf.entries()) {
45
+ let match: { index: number; result: Compatibility } | undefined;
46
+ for (const [nextIndex, nextBranch] of nextAnyOf.entries()) {
47
+ if (used.has(nextIndex)) continue;
48
+ const branchIssues: string[] = [];
49
+ const result = isSuperset(
50
+ priorBranch,
51
+ nextBranch,
52
+ `${path}/anyOf/${priorIndex}`,
53
+ branchIssues,
54
+ );
55
+ if (result.compatible) {
56
+ match = { index: nextIndex, result };
57
+ break;
58
+ }
59
+ }
60
+ if (!match)
61
+ return incompatible(`${path}/anyOf/${priorIndex}`, "branch_removed_or_narrowed", issues);
62
+ used.add(match.index);
63
+ strict ||= match.result.strict;
64
+ }
65
+ return { compatible: true, strict };
66
+ }
67
+
68
+ if (prior.type === "object" || next.type === "object") {
69
+ if (prior.type !== "object" || next.type !== "object") {
70
+ return incompatible(path, "type_changed", issues);
71
+ }
72
+ if (prior.additionalProperties !== next.additionalProperties) {
73
+ return incompatible(path, "additional_properties_changed", issues);
74
+ }
75
+ const priorProperties = schemaMap(prior.properties);
76
+ const nextProperties = schemaMap(next.properties);
77
+ const priorRequired = stringSet(prior.required);
78
+ const nextRequired = stringSet(next.required);
79
+ let strict = false;
80
+ for (const name of priorRequired) {
81
+ if (!nextRequired.has(name)) strict = true;
82
+ }
83
+ for (const name of nextRequired) {
84
+ if (!priorRequired.has(name)) {
85
+ return incompatible(`${path}/properties/${name}`, "optional_became_required", issues);
86
+ }
87
+ }
88
+ for (const [name, priorProperty] of Object.entries(priorProperties)) {
89
+ const nextProperty = nextProperties[name];
90
+ if (!nextProperty)
91
+ return incompatible(`${path}/properties/${name}`, "property_removed", issues);
92
+ const result = isSuperset(priorProperty, nextProperty, `${path}/properties/${name}`, issues);
93
+ if (!result.compatible) return result;
94
+ strict ||= result.strict;
95
+ }
96
+ for (const name of Object.keys(nextProperties)) {
97
+ if (!(name in priorProperties)) {
98
+ if (nextRequired.has(name)) {
99
+ return incompatible(`${path}/properties/${name}`, "new_property_is_required", issues);
100
+ }
101
+ strict = true;
102
+ }
103
+ }
104
+ return { compatible: true, strict };
105
+ }
106
+
107
+ if (prior.type === "array" || next.type === "array") {
108
+ if (prior.type !== "array" || next.type !== "array")
109
+ return incompatible(path, "type_changed", issues);
110
+ if (number(next.minItems, 0) < number(prior.minItems, 0)) {
111
+ // A lower minimum broadens acceptance.
112
+ } else if (number(next.minItems, 0) > number(prior.minItems, 0)) {
113
+ return incompatible(path, "array_minimum_narrowed", issues);
114
+ }
115
+ const priorMax = number(prior.maxItems, Number.POSITIVE_INFINITY);
116
+ const nextMax = number(next.maxItems, Number.POSITIVE_INFINITY);
117
+ if (nextMax < priorMax) return incompatible(path, "array_maximum_narrowed", issues);
118
+ const priorItems = prior.items as JsonSchema | undefined;
119
+ const nextItems = next.items as JsonSchema | undefined;
120
+ if (!!priorItems !== !!nextItems) return incompatible(path, "array_items_changed", issues);
121
+ const itemResult =
122
+ priorItems && nextItems
123
+ ? isSuperset(priorItems, nextItems, `${path}/items`, issues)
124
+ : { compatible: true, strict: false };
125
+ return {
126
+ compatible: itemResult.compatible,
127
+ strict:
128
+ itemResult.strict ||
129
+ number(next.minItems, 0) < number(prior.minItems, 0) ||
130
+ nextMax > priorMax,
131
+ };
132
+ }
133
+
134
+ const ignored = new Set(["$id", "title", "description"]);
135
+ const priorComparable = Object.fromEntries(
136
+ Object.entries(prior).filter(([key]) => !ignored.has(key)),
137
+ );
138
+ const nextComparable = Object.fromEntries(
139
+ Object.entries(next).filter(([key]) => !ignored.has(key)),
140
+ );
141
+ if (canonicalJsonV3(priorComparable) !== canonicalJsonV3(nextComparable)) {
142
+ return incompatible(path, "constraint_changed", issues);
143
+ }
144
+ return { compatible: true, strict: false };
145
+ }
146
+
147
+ function incompatible(path: string, reason: string, issues: string[]): Compatibility {
148
+ issues.push(`${path}:${reason}`);
149
+ return { compatible: false, strict: false };
150
+ }
151
+
152
+ function schemaArray(value: unknown): JsonSchema[] | undefined {
153
+ return Array.isArray(value) ? (value as JsonSchema[]) : undefined;
154
+ }
155
+
156
+ function schemaMap(value: unknown): Record<string, JsonSchema> {
157
+ return value && typeof value === "object" ? (value as Record<string, JsonSchema>) : {};
158
+ }
159
+
160
+ function stringSet(value: unknown): Set<string> {
161
+ return new Set(
162
+ Array.isArray(value) ? value.filter((item): item is string => typeof item === "string") : [],
163
+ );
164
+ }
165
+
166
+ function number(value: unknown, fallback: number): number {
167
+ return typeof value === "number" ? value : fallback;
168
+ }