harnery 0.34.1 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/dist/commander.d.ts +30 -5
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +124 -94
  4. package/dist/commands/agents.d.ts +37 -6
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +466 -371
  7. package/dist/commands/backup.d.ts.map +1 -1
  8. package/dist/commands/backup.js +10 -10
  9. package/dist/commands/browse-session.d.ts.map +1 -1
  10. package/dist/commands/browse-session.js +12 -0
  11. package/dist/commands/browse.d.ts +1 -1
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +31 -6
  14. package/dist/commands/conversations.d.ts +10 -0
  15. package/dist/commands/conversations.d.ts.map +1 -0
  16. package/dist/commands/conversations.js +201 -0
  17. package/dist/commands/decision.d.ts.map +1 -1
  18. package/dist/commands/decision.js +2 -2
  19. package/dist/commands/deinit.d.ts.map +1 -1
  20. package/dist/commands/deinit.js +5 -0
  21. package/dist/commands/docs.d.ts.map +1 -1
  22. package/dist/commands/docs.js +13 -2
  23. package/dist/commands/doctor.d.ts +5 -0
  24. package/dist/commands/doctor.d.ts.map +1 -1
  25. package/dist/commands/doctor.js +51 -7
  26. package/dist/commands/events.d.ts.map +1 -1
  27. package/dist/commands/events.js +18 -1
  28. package/dist/commands/fetch.js +6 -5
  29. package/dist/commands/files.d.ts +22 -0
  30. package/dist/commands/files.d.ts.map +1 -0
  31. package/dist/commands/files.js +113 -0
  32. package/dist/commands/governor.js +14 -12
  33. package/dist/commands/inbox.d.ts +5 -0
  34. package/dist/commands/inbox.d.ts.map +1 -0
  35. package/dist/commands/inbox.js +57 -0
  36. package/dist/commands/init.d.ts +4 -5
  37. package/dist/commands/init.d.ts.map +1 -1
  38. package/dist/commands/init.js +63 -13
  39. package/dist/commands/ledger-v3.d.ts.map +1 -1
  40. package/dist/commands/ledger-v3.js +347 -1
  41. package/dist/commands/logs.d.ts +4 -0
  42. package/dist/commands/logs.d.ts.map +1 -0
  43. package/dist/commands/logs.js +169 -0
  44. package/dist/commands/messages.d.ts +5 -0
  45. package/dist/commands/messages.d.ts.map +1 -0
  46. package/dist/commands/messages.js +45 -0
  47. package/dist/commands/outline.d.ts +1 -1
  48. package/dist/commands/outline.d.ts.map +1 -1
  49. package/dist/commands/outline.js +2 -2
  50. package/dist/commands/presence.d.ts.map +1 -1
  51. package/dist/commands/presence.js +2 -2
  52. package/dist/commands/read.d.ts +1 -1
  53. package/dist/commands/read.d.ts.map +1 -1
  54. package/dist/commands/read.js +2 -2
  55. package/dist/commands/semantic.d.ts +4 -0
  56. package/dist/commands/semantic.d.ts.map +1 -0
  57. package/dist/commands/semantic.js +199 -0
  58. package/dist/commands/storage.d.ts +4 -0
  59. package/dist/commands/storage.d.ts.map +1 -0
  60. package/dist/commands/storage.js +238 -0
  61. package/dist/commands/tunnel.d.ts +5 -1
  62. package/dist/commands/tunnel.d.ts.map +1 -1
  63. package/dist/commands/tunnel.js +44 -31
  64. package/dist/commands/web.d.ts +3 -0
  65. package/dist/commands/web.d.ts.map +1 -1
  66. package/dist/commands/web.js +84 -7
  67. package/dist/commands/work.js +3 -3
  68. package/dist/commands/workflow.js +13 -13
  69. package/dist/core/adapters/profiles.d.ts +1 -1
  70. package/dist/core/agents/canonical-emit.d.ts +3 -0
  71. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  72. package/dist/core/agents/canonical-emit.js +12 -0
  73. package/dist/core/agents/claim-path.d.ts +11 -0
  74. package/dist/core/agents/claim-path.d.ts.map +1 -0
  75. package/dist/core/agents/claim-path.js +22 -0
  76. package/dist/core/agents/cli.js +209 -39
  77. package/dist/core/agents/coord-client.d.ts +29 -3
  78. package/dist/core/agents/coord-client.d.ts.map +1 -1
  79. package/dist/core/agents/coord-client.js +88 -9
  80. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  81. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  82. package/dist/core/agents/live-authority-v3.js +245 -13
  83. package/dist/core/agents/live-lifecycle-v3.js +9 -4
  84. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  85. package/dist/core/agents/live-observation-v3.js +8 -3
  86. package/dist/core/agents/render/prompt-context.d.ts +9 -3
  87. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  88. package/dist/core/agents/render/prompt-context.js +36 -17
  89. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  90. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  91. package/dist/core/agents/rules/stop-hook.js +115 -22
  92. package/dist/core/agents/rules/verdict.d.ts +1 -0
  93. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  94. package/dist/core/agents/session-events.d.ts.map +1 -1
  95. package/dist/core/agents/session-events.js +4 -0
  96. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  97. package/dist/core/agents/session-finalizer-v3.js +5 -1
  98. package/dist/core/agents/session-name-display.d.ts +1 -0
  99. package/dist/core/agents/session-name-display.d.ts.map +1 -1
  100. package/dist/core/agents/session-name-display.js +8 -1
  101. package/dist/core/agents/state/activity-log.d.ts +3 -0
  102. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  103. package/dist/core/agents/state/activity-log.js +6 -3
  104. package/dist/core/agents/state/heartbeat-reader.d.ts +46 -0
  105. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
  106. package/dist/core/agents/state/heartbeat-reader.js +25 -0
  107. package/dist/core/agents/state/heartbeat-writer.d.ts +9 -48
  108. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  109. package/dist/core/agents/state/heartbeat-writer.js +34 -34
  110. package/dist/core/agents/state/live-coordination-view.d.ts +6 -8
  111. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  112. package/dist/core/agents/state/live-coordination-view.js +16 -67
  113. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  114. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  116. package/dist/core/agents/state/names.d.ts +9 -1
  117. package/dist/core/agents/state/names.d.ts.map +1 -1
  118. package/dist/core/agents/state/names.js +190 -182
  119. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  120. package/dist/core/agents/state/stale-sweep.js +23 -5
  121. package/dist/core/artifacts/constants.d.ts +5 -0
  122. package/dist/core/artifacts/constants.d.ts.map +1 -0
  123. package/dist/core/artifacts/constants.js +4 -0
  124. package/dist/core/artifacts/index.d.ts +24 -3
  125. package/dist/core/artifacts/index.d.ts.map +1 -1
  126. package/dist/core/artifacts/index.js +96 -8
  127. package/dist/core/config.d.ts +62 -4
  128. package/dist/core/config.d.ts.map +1 -1
  129. package/dist/core/config.js +98 -4
  130. package/dist/core/conversations/archive.d.ts +49 -0
  131. package/dist/core/conversations/archive.d.ts.map +1 -0
  132. package/dist/core/conversations/archive.js +136 -0
  133. package/dist/core/conversations/catalog.d.ts +10 -0
  134. package/dist/core/conversations/catalog.d.ts.map +1 -0
  135. package/dist/core/conversations/catalog.js +72 -0
  136. package/dist/core/conversations/context-pack.d.ts +6 -0
  137. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  138. package/dist/core/conversations/context-pack.js +60 -0
  139. package/dist/core/conversations/contract.d.ts +155 -0
  140. package/dist/core/conversations/contract.d.ts.map +1 -0
  141. package/dist/core/conversations/contract.js +1 -0
  142. package/dist/core/conversations/evaluation.d.ts +16 -0
  143. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  144. package/dist/core/conversations/evaluation.js +9 -0
  145. package/dist/core/conversations/index.d.ts +10 -0
  146. package/dist/core/conversations/index.d.ts.map +1 -0
  147. package/dist/core/conversations/index.js +9 -0
  148. package/dist/core/conversations/lifecycle.d.ts +28 -0
  149. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  150. package/dist/core/conversations/lifecycle.js +29 -0
  151. package/dist/core/conversations/normalize.d.ts +14 -0
  152. package/dist/core/conversations/normalize.d.ts.map +1 -0
  153. package/dist/core/conversations/normalize.js +82 -0
  154. package/dist/core/conversations/query.d.ts +8 -0
  155. package/dist/core/conversations/query.d.ts.map +1 -0
  156. package/dist/core/conversations/query.js +280 -0
  157. package/dist/core/conversations/search-index.d.ts +9 -0
  158. package/dist/core/conversations/search-index.d.ts.map +1 -0
  159. package/dist/core/conversations/search-index.js +29 -0
  160. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  161. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  162. package/dist/core/events/legacy-storage/canary.js +150 -0
  163. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  164. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  165. package/dist/core/events/legacy-storage/fence.js +115 -0
  166. package/dist/core/events/legacy-storage/index.d.ts +6 -0
  167. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  168. package/dist/core/events/legacy-storage/index.js +5 -0
  169. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  170. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  171. package/dist/core/events/legacy-storage/inventory.js +40 -0
  172. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  173. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  174. package/dist/core/events/legacy-storage/manifest.js +108 -0
  175. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  176. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  177. package/dist/core/events/legacy-storage/reader.js +154 -0
  178. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  179. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  180. package/dist/core/events/v3/authority-outbox.js +16 -3
  181. package/dist/core/events/v3/base-contract.d.ts +851 -16
  182. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  183. package/dist/core/events/v3/base-contract.js +50 -7
  184. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  185. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  186. package/dist/core/events/v3/bootstrap.js +167 -3
  187. package/dist/core/events/v3/capabilities.d.ts +11 -0
  188. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  189. package/dist/core/events/v3/capabilities.js +26 -3
  190. package/dist/core/events/v3/control-witness.d.ts +44 -0
  191. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  192. package/dist/core/events/v3/control-witness.js +233 -0
  193. package/dist/core/events/v3/control-writer.d.ts +4 -0
  194. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  195. package/dist/core/events/v3/control-writer.js +16 -0
  196. package/dist/core/events/v3/control.d.ts +8 -2
  197. package/dist/core/events/v3/control.d.ts.map +1 -1
  198. package/dist/core/events/v3/control.js +46 -18
  199. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  200. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  201. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  202. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  203. package/dist/core/events/v3/coordination-view.js +16 -1
  204. package/dist/core/events/v3/generated.d.ts +1 -1
  205. package/dist/core/events/v3/generated.js +1 -1
  206. package/dist/core/events/v3/index.d.ts +8 -5
  207. package/dist/core/events/v3/index.d.ts.map +1 -1
  208. package/dist/core/events/v3/index.js +7 -4
  209. package/dist/core/events/v3/latency.d.ts +31 -1
  210. package/dist/core/events/v3/latency.d.ts.map +1 -1
  211. package/dist/core/events/v3/latency.js +127 -3
  212. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  213. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  214. package/dist/core/events/v3/live-route-observer.js +58 -0
  215. package/dist/core/events/v3/live-routing.d.ts +42 -20
  216. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  217. package/dist/core/events/v3/live-routing.js +153 -41
  218. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
  219. package/dist/core/events/v3/producers/command-recorder.js +10 -1
  220. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  221. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  222. package/dist/core/events/v3/producers/coordination-recorder.js +90 -13
  223. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  224. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  226. package/dist/core/events/v3/producers/hook-base.d.ts +17 -1
  227. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  228. package/dist/core/events/v3/producers/hook-base.js +83 -2
  229. package/dist/core/events/v3/producers/intake.d.ts +13 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  231. package/dist/core/events/v3/producers/intake.js +36 -2
  232. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  233. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  235. package/dist/core/events/v3/producers/recorder.d.ts +117 -1
  236. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  237. package/dist/core/events/v3/producers/recorder.js +992 -27
  238. package/dist/core/events/v3/reader.d.ts +51 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -1
  240. package/dist/core/events/v3/reader.js +181 -1
  241. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  242. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  243. package/dist/core/events/v3/rotation-config.js +91 -0
  244. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  245. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  246. package/dist/core/events/v3/runtime-build.js +39 -0
  247. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  248. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  249. package/dist/core/events/v3/runtime-identity.js +18 -0
  250. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +52 -0
  251. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
  252. package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
  253. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  254. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  255. package/dist/core/events/v3/support-storage/classify.js +149 -0
  256. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  257. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  258. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  259. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  260. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  261. package/dist/core/events/v3/support-storage/index.js +9 -0
  262. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  263. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  264. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  265. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  266. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  267. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  268. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  269. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  270. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  271. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  272. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  273. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  274. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  275. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  276. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  277. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  278. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  279. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  280. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  281. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  282. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  283. package/dist/core/events/v3/turn-telemetry.d.ts +21 -6
  284. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  285. package/dist/core/events/v3/turn-telemetry.js +32 -2
  286. package/dist/core/events/v3/writer.d.ts +13 -1
  287. package/dist/core/events/v3/writer.d.ts.map +1 -1
  288. package/dist/core/events/v3/writer.js +126 -12
  289. package/dist/core/governor/plan-read.d.ts.map +1 -1
  290. package/dist/core/governor/plan-read.js +5 -21
  291. package/dist/core/governor/planning.js +6 -8
  292. package/dist/core/governor/service-read.d.ts +12 -0
  293. package/dist/core/governor/service-read.d.ts.map +1 -1
  294. package/dist/core/governor/service-read.js +266 -2
  295. package/dist/core/governor/service.d.ts +1 -0
  296. package/dist/core/governor/service.d.ts.map +1 -1
  297. package/dist/core/governor/service.js +53 -18
  298. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  299. package/dist/core/guard/evidence-v3.js +2 -0
  300. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  301. package/dist/core/hooks/adapter/events.js +1 -0
  302. package/dist/core/hooks/adapter/output.d.ts +4 -2
  303. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  304. package/dist/core/hooks/adapter/output.js +13 -5
  305. package/dist/core/hooks/adapter/parse.d.ts +3 -0
  306. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  307. package/dist/core/hooks/adapter/parse.js +14 -0
  308. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +142 -0
  309. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
  310. package/dist/core/hooks/adapter/runtime-telemetry.js +869 -0
  311. package/dist/core/hooks/cli.js +318 -61
  312. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  313. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  314. package/dist/core/hooks/effects/image-capture.js +4 -2
  315. package/dist/core/hooks/remediation-cap.d.ts +39 -0
  316. package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
  317. package/dist/core/hooks/remediation-cap.js +63 -0
  318. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  319. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  320. package/dist/core/hooks/resolve/coord-root.js +92 -11
  321. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  322. package/dist/core/hooks/resolve/owner.js +5 -0
  323. package/dist/core/hooks/resolve/transcript.d.ts +33 -9
  324. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  325. package/dist/core/hooks/resolve/transcript.js +33 -10
  326. package/dist/core/inbox/contract.d.ts +64 -0
  327. package/dist/core/inbox/contract.d.ts.map +1 -0
  328. package/dist/core/inbox/contract.js +13 -0
  329. package/dist/core/inbox/index.d.ts +5 -0
  330. package/dist/core/inbox/index.d.ts.map +1 -0
  331. package/dist/core/inbox/index.js +4 -0
  332. package/dist/core/inbox/lifecycle.d.ts +22 -0
  333. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  334. package/dist/core/inbox/lifecycle.js +41 -0
  335. package/dist/core/inbox/service.d.ts +36 -0
  336. package/dist/core/inbox/service.d.ts.map +1 -0
  337. package/dist/core/inbox/service.js +210 -0
  338. package/dist/core/inbox/watcher.d.ts +7 -0
  339. package/dist/core/inbox/watcher.d.ts.map +1 -0
  340. package/dist/core/inbox/watcher.js +26 -0
  341. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  342. package/dist/core/presence/codec-digest.js +14 -3
  343. package/dist/core/presence/relay-client.d.ts +1 -0
  344. package/dist/core/presence/relay-client.d.ts.map +1 -1
  345. package/dist/core/presence/relay-client.js +52 -8
  346. package/dist/core/semantic/adapters.d.ts +37 -0
  347. package/dist/core/semantic/adapters.d.ts.map +1 -0
  348. package/dist/core/semantic/adapters.js +360 -0
  349. package/dist/core/semantic/contract.d.ts +1072 -0
  350. package/dist/core/semantic/contract.d.ts.map +1 -0
  351. package/dist/core/semantic/contract.js +331 -0
  352. package/dist/core/semantic/evidence.d.ts +11 -0
  353. package/dist/core/semantic/evidence.d.ts.map +1 -0
  354. package/dist/core/semantic/evidence.js +262 -0
  355. package/dist/core/semantic/index.d.ts +14 -0
  356. package/dist/core/semantic/index.d.ts.map +1 -0
  357. package/dist/core/semantic/index.js +13 -0
  358. package/dist/core/semantic/once.d.ts +38 -0
  359. package/dist/core/semantic/once.d.ts.map +1 -0
  360. package/dist/core/semantic/once.js +364 -0
  361. package/dist/core/semantic/prompt.d.ts +12 -0
  362. package/dist/core/semantic/prompt.d.ts.map +1 -0
  363. package/dist/core/semantic/prompt.js +83 -0
  364. package/dist/core/semantic/review.d.ts +144 -0
  365. package/dist/core/semantic/review.d.ts.map +1 -0
  366. package/dist/core/semantic/review.js +544 -0
  367. package/dist/core/semantic/routes.d.ts +10 -0
  368. package/dist/core/semantic/routes.d.ts.map +1 -0
  369. package/dist/core/semantic/routes.js +21 -0
  370. package/dist/core/semantic/scheduler.d.ts +27 -0
  371. package/dist/core/semantic/scheduler.d.ts.map +1 -0
  372. package/dist/core/semantic/scheduler.js +91 -0
  373. package/dist/core/semantic/service-status.d.ts +51 -0
  374. package/dist/core/semantic/service-status.d.ts.map +1 -0
  375. package/dist/core/semantic/service-status.js +140 -0
  376. package/dist/core/semantic/service.d.ts +52 -0
  377. package/dist/core/semantic/service.d.ts.map +1 -0
  378. package/dist/core/semantic/service.js +559 -0
  379. package/dist/core/semantic/soak.d.ts +75 -0
  380. package/dist/core/semantic/soak.d.ts.map +1 -0
  381. package/dist/core/semantic/soak.js +476 -0
  382. package/dist/core/semantic/storage.d.ts +81 -0
  383. package/dist/core/semantic/storage.d.ts.map +1 -0
  384. package/dist/core/semantic/storage.js +180 -0
  385. package/dist/core/semantic/usage.d.ts +43 -0
  386. package/dist/core/semantic/usage.d.ts.map +1 -0
  387. package/dist/core/semantic/usage.js +193 -0
  388. package/dist/core/semantic/validate.d.ts +18 -0
  389. package/dist/core/semantic/validate.d.ts.map +1 -0
  390. package/dist/core/semantic/validate.js +207 -0
  391. package/dist/core/storage/buffer.d.ts +28 -0
  392. package/dist/core/storage/buffer.d.ts.map +1 -0
  393. package/dist/core/storage/buffer.js +101 -0
  394. package/dist/core/storage/builtins.d.ts +3 -0
  395. package/dist/core/storage/builtins.d.ts.map +1 -0
  396. package/dist/core/storage/builtins.js +683 -0
  397. package/dist/core/storage/catalog.d.ts +19 -0
  398. package/dist/core/storage/catalog.d.ts.map +1 -0
  399. package/dist/core/storage/catalog.js +365 -0
  400. package/dist/core/storage/config.d.ts +16 -0
  401. package/dist/core/storage/config.d.ts.map +1 -0
  402. package/dist/core/storage/config.js +311 -0
  403. package/dist/core/storage/contract.d.ts +275 -0
  404. package/dist/core/storage/contract.d.ts.map +1 -0
  405. package/dist/core/storage/contract.js +3 -0
  406. package/dist/core/storage/durable-history.d.ts +36 -0
  407. package/dist/core/storage/durable-history.d.ts.map +1 -0
  408. package/dist/core/storage/durable-history.js +606 -0
  409. package/dist/core/storage/health.d.ts +4 -0
  410. package/dist/core/storage/health.d.ts.map +1 -0
  411. package/dist/core/storage/health.js +65 -0
  412. package/dist/core/storage/index.d.ts +16 -0
  413. package/dist/core/storage/index.d.ts.map +1 -0
  414. package/dist/core/storage/index.js +15 -0
  415. package/dist/core/storage/inventory.d.ts +25 -0
  416. package/dist/core/storage/inventory.d.ts.map +1 -0
  417. package/dist/core/storage/inventory.js +666 -0
  418. package/dist/core/storage/jsonl.d.ts +52 -0
  419. package/dist/core/storage/jsonl.d.ts.map +1 -0
  420. package/dist/core/storage/jsonl.js +156 -0
  421. package/dist/core/storage/log-retention.d.ts +52 -0
  422. package/dist/core/storage/log-retention.d.ts.map +1 -0
  423. package/dist/core/storage/log-retention.js +419 -0
  424. package/dist/core/storage/logger.d.ts +82 -0
  425. package/dist/core/storage/logger.d.ts.map +1 -0
  426. package/dist/core/storage/logger.js +411 -0
  427. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  428. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  429. package/dist/core/storage/maintenance-providers.js +141 -0
  430. package/dist/core/storage/maintenance.d.ts +125 -0
  431. package/dist/core/storage/maintenance.d.ts.map +1 -0
  432. package/dist/core/storage/maintenance.js +609 -0
  433. package/dist/core/storage/metrics.d.ts +60 -0
  434. package/dist/core/storage/metrics.d.ts.map +1 -0
  435. package/dist/core/storage/metrics.js +134 -0
  436. package/dist/core/storage/policy.d.ts +7 -0
  437. package/dist/core/storage/policy.d.ts.map +1 -0
  438. package/dist/core/storage/policy.js +110 -0
  439. package/dist/core/storage/process-log.d.ts +38 -0
  440. package/dist/core/storage/process-log.d.ts.map +1 -0
  441. package/dist/core/storage/process-log.js +165 -0
  442. package/dist/core/storage/query.d.ts +34 -0
  443. package/dist/core/storage/query.d.ts.map +1 -0
  444. package/dist/core/storage/query.js +295 -0
  445. package/dist/core/storage/receipts.d.ts +23 -0
  446. package/dist/core/storage/receipts.d.ts.map +1 -0
  447. package/dist/core/storage/receipts.js +117 -0
  448. package/dist/core/storage/segments.d.ts +84 -0
  449. package/dist/core/storage/segments.d.ts.map +1 -0
  450. package/dist/core/storage/segments.js +542 -0
  451. package/dist/core/storage/sink-graph.d.ts +65 -0
  452. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  453. package/dist/core/storage/sink-graph.js +213 -0
  454. package/dist/core/storage/storm-control.d.ts +23 -0
  455. package/dist/core/storage/storm-control.d.ts.map +1 -0
  456. package/dist/core/storage/storm-control.js +59 -0
  457. package/dist/core/work/state.d.ts.map +1 -1
  458. package/dist/core/work/state.js +10 -14
  459. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  460. package/dist/core/workflow/live-session-v3.js +2 -1
  461. package/dist/index.d.ts +2 -0
  462. package/dist/index.d.ts.map +1 -1
  463. package/dist/index.js +2 -0
  464. package/dist/lazy-commands.d.ts +26 -0
  465. package/dist/lazy-commands.d.ts.map +1 -0
  466. package/dist/lazy-commands.js +210 -0
  467. package/dist/lib/browser/client.d.ts +11 -0
  468. package/dist/lib/browser/client.d.ts.map +1 -1
  469. package/dist/lib/browser/client.js +13 -0
  470. package/dist/lib/browser/index.d.ts +1 -0
  471. package/dist/lib/browser/index.d.ts.map +1 -1
  472. package/dist/lib/browser/standalone-html.d.ts +25 -0
  473. package/dist/lib/browser/standalone-html.d.ts.map +1 -0
  474. package/dist/lib/browser/standalone-html.js +284 -0
  475. package/dist/lib/docs-lint.d.ts +2 -0
  476. package/dist/lib/docs-lint.d.ts.map +1 -1
  477. package/dist/lib/docs-lint.js +45 -80
  478. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  479. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  480. package/dist/lib/docs-metadata-audit.js +13 -23
  481. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  482. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  483. package/dist/lib/docs-metadata-sync.js +28 -10
  484. package/dist/lib/docs-repository-view.d.ts +22 -0
  485. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  486. package/dist/lib/docs-repository-view.js +185 -0
  487. package/dist/lib/http/client.d.ts +11 -5
  488. package/dist/lib/http/client.d.ts.map +1 -1
  489. package/dist/lib/http/client.js +22 -4
  490. package/dist/lib/http/index.d.ts +1 -1
  491. package/dist/lib/http/index.d.ts.map +1 -1
  492. package/dist/lib/http/index.js +1 -1
  493. package/dist/lib/indexer-exclusions.d.ts +27 -0
  494. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  495. package/dist/lib/indexer-exclusions.js +176 -0
  496. package/dist/lib/instructions/apply.d.ts.map +1 -1
  497. package/dist/lib/instructions/apply.js +1 -0
  498. package/dist/lib/instructions/templates.d.ts +2 -0
  499. package/dist/lib/instructions/templates.d.ts.map +1 -1
  500. package/dist/lib/instructions/templates.js +149 -4
  501. package/dist/lib/local-file-url.d.ts +9 -0
  502. package/dist/lib/local-file-url.d.ts.map +1 -0
  503. package/dist/lib/local-file-url.js +20 -0
  504. package/dist/lib/web-performance.d.ts +118 -0
  505. package/dist/lib/web-performance.d.ts.map +1 -0
  506. package/dist/lib/web-performance.js +192 -0
  507. package/package.json +34 -2
  508. package/schemas/config.schema.json +58 -0
  509. package/schemas/event-v3.schema.json +3073 -581
  510. package/src/commander.ts +462 -93
  511. package/src/commands/agents.ts +617 -355
  512. package/src/commands/backup.ts +18 -14
  513. package/src/commands/browse-session.ts +12 -0
  514. package/src/commands/browse.ts +31 -9
  515. package/src/commands/conversations.ts +279 -0
  516. package/src/commands/decision.ts +8 -2
  517. package/src/commands/deinit.ts +6 -0
  518. package/src/commands/docs.ts +25 -6
  519. package/src/commands/doctor.ts +75 -9
  520. package/src/commands/events.ts +21 -1
  521. package/src/commands/fetch.ts +7 -6
  522. package/src/commands/files.ts +143 -0
  523. package/src/commands/governor.ts +13 -12
  524. package/src/commands/inbox.ts +61 -0
  525. package/src/commands/init.ts +78 -16
  526. package/src/commands/ledger-v3.ts +421 -1
  527. package/src/commands/logs.ts +224 -0
  528. package/src/commands/messages.ts +61 -0
  529. package/src/commands/outline.ts +6 -2
  530. package/src/commands/presence.ts +7 -2
  531. package/src/commands/read.ts +6 -2
  532. package/src/commands/semantic.ts +244 -0
  533. package/src/commands/storage.ts +310 -0
  534. package/src/commands/tunnel.ts +66 -52
  535. package/src/commands/web.ts +92 -7
  536. package/src/commands/work.ts +3 -3
  537. package/src/commands/workflow.ts +13 -13
  538. package/src/core/agents/canonical-emit.ts +15 -0
  539. package/src/core/agents/claim-path.ts +23 -0
  540. package/src/core/agents/cli.ts +259 -53
  541. package/src/core/agents/coord-client.ts +92 -8
  542. package/src/core/agents/live-authority-v3.ts +342 -14
  543. package/src/core/agents/live-lifecycle-v3.ts +14 -4
  544. package/src/core/agents/live-observation-v3.ts +13 -3
  545. package/src/core/agents/render/prompt-context.ts +40 -16
  546. package/src/core/agents/rules/stop-hook.ts +129 -25
  547. package/src/core/agents/rules/verdict.ts +1 -0
  548. package/src/core/agents/session-events.ts +4 -0
  549. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  550. package/src/core/agents/session-finalizer-v3.ts +4 -1
  551. package/src/core/agents/session-name-display.ts +9 -1
  552. package/src/core/agents/state/activity-log.ts +7 -2
  553. package/src/core/agents/state/heartbeat-reader.ts +69 -0
  554. package/src/core/agents/state/heartbeat-writer.ts +47 -84
  555. package/src/core/agents/state/live-coordination-view.ts +17 -81
  556. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  557. package/src/core/agents/state/names.ts +190 -182
  558. package/src/core/agents/state/stale-sweep.ts +25 -5
  559. package/src/core/artifacts/constants.ts +4 -0
  560. package/src/core/artifacts/index.ts +113 -8
  561. package/src/core/config.ts +126 -5
  562. package/src/core/conversations/archive.ts +237 -0
  563. package/src/core/conversations/catalog.ts +79 -0
  564. package/src/core/conversations/context-pack.ts +72 -0
  565. package/src/core/conversations/contract.ts +178 -0
  566. package/src/core/conversations/evaluation.ts +30 -0
  567. package/src/core/conversations/index.ts +9 -0
  568. package/src/core/conversations/lifecycle.ts +63 -0
  569. package/src/core/conversations/normalize.ts +105 -0
  570. package/src/core/conversations/query.ts +318 -0
  571. package/src/core/conversations/search-index.ts +48 -0
  572. package/src/core/events/legacy-storage/canary.ts +177 -0
  573. package/src/core/events/legacy-storage/fence.ts +129 -0
  574. package/src/core/events/legacy-storage/index.ts +5 -0
  575. package/src/core/events/legacy-storage/inventory.ts +51 -0
  576. package/src/core/events/legacy-storage/manifest.ts +136 -0
  577. package/src/core/events/legacy-storage/reader.ts +178 -0
  578. package/src/core/events/v3/authority-outbox.ts +22 -1
  579. package/src/core/events/v3/base-contract.ts +56 -7
  580. package/src/core/events/v3/bootstrap.ts +195 -2
  581. package/src/core/events/v3/capabilities.ts +37 -3
  582. package/src/core/events/v3/control-witness.ts +339 -0
  583. package/src/core/events/v3/control-writer.ts +16 -0
  584. package/src/core/events/v3/control.ts +54 -18
  585. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  586. package/src/core/events/v3/coordination-view.ts +17 -1
  587. package/src/core/events/v3/generated.ts +1 -1
  588. package/src/core/events/v3/index.ts +26 -2
  589. package/src/core/events/v3/latency.ts +213 -2
  590. package/src/core/events/v3/live-route-observer.ts +80 -0
  591. package/src/core/events/v3/live-routing.ts +182 -45
  592. package/src/core/events/v3/producers/command-recorder.ts +10 -1
  593. package/src/core/events/v3/producers/coordination-recorder.ts +112 -15
  594. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  595. package/src/core/events/v3/producers/hook-base.ts +116 -2
  596. package/src/core/events/v3/producers/intake.ts +48 -2
  597. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  598. package/src/core/events/v3/producers/recorder.ts +1403 -30
  599. package/src/core/events/v3/reader.ts +243 -2
  600. package/src/core/events/v3/rotation-config.ts +98 -0
  601. package/src/core/events/v3/runtime-build.ts +41 -0
  602. package/src/core/events/v3/runtime-identity.ts +16 -0
  603. package/src/core/events/v3/runtime-telemetry-capabilities.ts +143 -0
  604. package/src/core/events/v3/support-storage/classify.ts +209 -0
  605. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  606. package/src/core/events/v3/support-storage/index.ts +9 -0
  607. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  608. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  609. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  610. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  611. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  612. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  613. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  614. package/src/core/events/v3/turn-telemetry.ts +66 -5
  615. package/src/core/events/v3/writer.ts +168 -16
  616. package/src/core/governor/plan-read.ts +5 -18
  617. package/src/core/governor/planning.ts +5 -8
  618. package/src/core/governor/service-read.ts +320 -2
  619. package/src/core/governor/service.ts +49 -22
  620. package/src/core/guard/evidence-v3.ts +1 -0
  621. package/src/core/hooks/adapter/events.ts +1 -0
  622. package/src/core/hooks/adapter/output.ts +12 -5
  623. package/src/core/hooks/adapter/parse.ts +16 -0
  624. package/src/core/hooks/adapter/runtime-telemetry.ts +1200 -0
  625. package/src/core/hooks/cli.ts +342 -64
  626. package/src/core/hooks/effects/image-capture.ts +4 -1
  627. package/src/core/hooks/remediation-cap.ts +83 -0
  628. package/src/core/hooks/resolve/coord-root.ts +91 -11
  629. package/src/core/hooks/resolve/owner.ts +4 -0
  630. package/src/core/hooks/resolve/transcript.ts +55 -11
  631. package/src/core/inbox/contract.ts +81 -0
  632. package/src/core/inbox/index.ts +4 -0
  633. package/src/core/inbox/lifecycle.ts +104 -0
  634. package/src/core/inbox/service.ts +305 -0
  635. package/src/core/inbox/watcher.ts +36 -0
  636. package/src/core/presence/codec-digest.ts +15 -9
  637. package/src/core/presence/relay-client.ts +55 -7
  638. package/src/core/semantic/adapters.ts +452 -0
  639. package/src/core/semantic/contract.ts +430 -0
  640. package/src/core/semantic/evidence.ts +336 -0
  641. package/src/core/semantic/index.ts +201 -0
  642. package/src/core/semantic/once.ts +496 -0
  643. package/src/core/semantic/prompt.ts +96 -0
  644. package/src/core/semantic/review.ts +803 -0
  645. package/src/core/semantic/routes.ts +30 -0
  646. package/src/core/semantic/scheduler.ts +151 -0
  647. package/src/core/semantic/service-status.ts +212 -0
  648. package/src/core/semantic/service.ts +681 -0
  649. package/src/core/semantic/soak.ts +638 -0
  650. package/src/core/semantic/storage.ts +300 -0
  651. package/src/core/semantic/usage.ts +272 -0
  652. package/src/core/semantic/validate.ts +243 -0
  653. package/src/core/storage/buffer.ts +124 -0
  654. package/src/core/storage/builtins.ts +916 -0
  655. package/src/core/storage/catalog.ts +467 -0
  656. package/src/core/storage/config.ts +423 -0
  657. package/src/core/storage/contract.ts +342 -0
  658. package/src/core/storage/durable-history.ts +738 -0
  659. package/src/core/storage/health.ts +76 -0
  660. package/src/core/storage/index.ts +15 -0
  661. package/src/core/storage/inventory.ts +859 -0
  662. package/src/core/storage/jsonl.ts +213 -0
  663. package/src/core/storage/log-retention.ts +555 -0
  664. package/src/core/storage/logger.ts +546 -0
  665. package/src/core/storage/maintenance-providers.ts +200 -0
  666. package/src/core/storage/maintenance.ts +929 -0
  667. package/src/core/storage/metrics.ts +199 -0
  668. package/src/core/storage/policy.ts +141 -0
  669. package/src/core/storage/process-log.ts +203 -0
  670. package/src/core/storage/query.ts +360 -0
  671. package/src/core/storage/receipts.ts +162 -0
  672. package/src/core/storage/segments.ts +721 -0
  673. package/src/core/storage/sink-graph.ts +343 -0
  674. package/src/core/storage/storm-control.ts +91 -0
  675. package/src/core/work/state.ts +12 -21
  676. package/src/core/workflow/live-session-v3.ts +2 -4
  677. package/src/index.ts +2 -0
  678. package/src/lazy-commands.ts +294 -0
  679. package/src/lib/browser/client.ts +21 -0
  680. package/src/lib/browser/index.ts +4 -0
  681. package/src/lib/browser/standalone-html.ts +312 -0
  682. package/src/lib/docs-lint.ts +58 -77
  683. package/src/lib/docs-metadata-audit.ts +26 -21
  684. package/src/lib/docs-metadata-sync.ts +32 -9
  685. package/src/lib/docs-repository-view.ts +220 -0
  686. package/src/lib/http/client.ts +44 -8
  687. package/src/lib/http/index.ts +6 -1
  688. package/src/lib/indexer-exclusions.ts +173 -0
  689. package/src/lib/instructions/apply.ts +1 -0
  690. package/src/lib/instructions/templates.ts +154 -4
  691. package/src/lib/local-file-url.ts +31 -0
  692. package/src/lib/web-performance.ts +335 -0
@@ -94,10 +94,13 @@ export function recordImageArtifactsV3(
94
94
  coordRoot: string,
95
95
  sourceEvent: EventV3,
96
96
  artifacts: readonly CapturedImageArtifact[],
97
+ expectedGenesisId?: `gex_${string}`,
97
98
  ): void {
98
99
  if (!("generation_id" in sourceEvent.scope) || !sourceEvent.attestation_id) return;
99
100
  for (const artifact of artifacts) {
100
- writeEventV3(coordRoot, buildImageArtifactEventV3(sourceEvent, artifact));
101
+ writeEventV3(coordRoot, buildImageArtifactEventV3(sourceEvent, artifact), {
102
+ ...(expectedGenesisId ? { expectedGenesisId } : {}),
103
+ });
101
104
  }
102
105
  }
103
106
 
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Per-session cap on consecutive blocked Stop remediations.
3
+ *
4
+ * The Stop verdict re-blocks until the ledger shows the end-of-turn evidence,
5
+ * which assumes the agent CAN produce it. A session whose evidence can never
6
+ * land (e.g. a headless child whose status command resolves to a different
7
+ * owner) bounces forever: every retry replays the stop cycle until the budget
8
+ * or the operator kills it. This counter is the backstop: once a single stop
9
+ * cycle has been blocked `cap` times in a row, the verdict is allowed through
10
+ * so the session can terminate.
11
+ *
12
+ * A "stop cycle" is delimited by the adapter's continuation flag (Claude
13
+ * Code's `stop_hook_active`): a stop without the flag starts a fresh cycle and
14
+ * resets the count. Adapters that never set the flag (Cursor) reset on every
15
+ * stop, so the cap never engages there and behavior is unchanged.
16
+ *
17
+ * State is a tmpdir counter file keyed by session id — deliberately outside
18
+ * the ledger, because remediation stops do not land fresh `turn.completed`
19
+ * events (the turn span is already closed), so ledger evidence cannot count
20
+ * them.
21
+ */
22
+
23
+ import { readFileSync, rmSync, writeFileSync } from "node:fs";
24
+ import os from "node:os";
25
+ import { join } from "node:path";
26
+
27
+ export const DEFAULT_STOP_REMEDIATION_CAP = 5;
28
+
29
+ function counterPath(sessionId: string): string {
30
+ const key = (sessionId || "default").replace(/[^A-Za-z0-9_-]/g, "_");
31
+ return join(os.tmpdir(), `harnery-stop-remediation-${key}.count`);
32
+ }
33
+
34
+ /**
35
+ * Record one blocked stop and report whether the cap is exhausted.
36
+ *
37
+ * Call only when the Stop verdict blocked. `continuation` is the adapter's
38
+ * "this stop follows a stop-hook block" flag; false starts a fresh cycle.
39
+ * Returns the retained block count and whether this cycle has already been
40
+ * blocked `cap` times, meaning the caller should allow the stop instead of
41
+ * blocking again.
42
+ */
43
+ export interface RemediationBlockRecord {
44
+ count: number;
45
+ exceeded: boolean;
46
+ }
47
+
48
+ export function recordRemediationBlock(
49
+ sessionId: string,
50
+ continuation: boolean,
51
+ cap = DEFAULT_STOP_REMEDIATION_CAP,
52
+ ): RemediationBlockRecord {
53
+ const path = counterPath(sessionId);
54
+ let count = 1;
55
+ if (continuation) {
56
+ let prior = 0;
57
+ try {
58
+ prior = Number.parseInt(readFileSync(path, "utf8"), 10);
59
+ } catch {
60
+ // No counter yet (cycle started before the counter existed): treat the
61
+ // continuation itself as evidence of one earlier blocked stop, so an
62
+ // already-running loop still converges on the cap.
63
+ prior = 1;
64
+ }
65
+ count = Number.isFinite(prior) && prior >= 0 ? prior + 1 : 1;
66
+ }
67
+ try {
68
+ writeFileSync(path, String(count), "utf8");
69
+ } catch {
70
+ // Counter IO must never turn into a block or a crash; fail open (no cap).
71
+ return { count, exceeded: false };
72
+ }
73
+ return { count, exceeded: count > cap };
74
+ }
75
+
76
+ /** Clear the cycle counter after an allowed stop. */
77
+ export function clearRemediationCount(sessionId: string): void {
78
+ try {
79
+ rmSync(counterPath(sessionId), { force: true });
80
+ } catch {
81
+ // best-effort
82
+ }
83
+ }
@@ -1,14 +1,16 @@
1
- import { resolveCoordRoot } from "../../agents/coord-client.ts";
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { dirname, join, resolve } from "node:path";
2
4
 
3
5
  /**
4
- * The hooks-side name for THE coordination-root resolution.
6
+ * Resolve the coordination root from path evidence only.
5
7
  *
6
- * Delegates to `resolveCoordRoot()` so the hooks and the CLI cannot resolve
7
- * different roots. They used to: this walked up from `CLAUDE_PROJECT_DIR` or
8
- * cwd while the CLI's `monorepoRoot()` asked git for the superproject first, so
9
- * with a shell inside a submodule that carries its own `.harnery/`, the CLI's
10
- * `coord.status_observed` landed in a stream this side never read and rule 1/3
11
- * blocked every turn.
8
+ * This path-only resolver deliberately does not inspect live producer state.
9
+ * Code that reads or writes coordination authority must use
10
+ * `resolveCoordRoot()` from `agents/coord-client.ts`, which disambiguates
11
+ * nested coordination roots through the registered session. Keeping the two
12
+ * responsibilities separate lets configuration and other path-only consumers
13
+ * avoid loading the event recorder and its contract graph.
12
14
  *
13
15
  * Resolution precedence (see `resolveCoordRoot` for the full rationale):
14
16
  * 1. HARNERY_COORD_ROOT_OVERRIDE — explicit pin (tests, git hooks).
@@ -17,9 +19,87 @@ import { resolveCoordRoot } from "../../agents/coord-client.ts";
17
19
  * submodules that may carry a `.harnery/` of their own (or none at all,
18
20
  * e.g. a journal dir under /tmp). The session's coordination home is the
19
21
  * project the adapter opened, not wherever the shell happens to sit.
20
- * 3. The root that already holds this session's heartbeat.
21
- * 4. The nearest enclosing `.harnery/`, then a git-derived root.
22
+ * 3. The nearest enclosing `.harnery/`.
23
+ * 4. A git-derived root when no `.harnery/` exists yet.
22
24
  */
23
25
  export function findCoordRoot(start: string = process.cwd()): string | null {
24
- return resolveCoordRoot(start);
26
+ const rootOverride = process.env.HARNERY_COORD_ROOT_OVERRIDE;
27
+ if (rootOverride) return rootOverride;
28
+
29
+ const projectDir = process.env.CLAUDE_PROJECT_DIR;
30
+ if (projectDir) {
31
+ const fromProject = nearestCoordRoot(projectDir);
32
+ if (fromProject) return fromProject;
33
+ }
34
+
35
+ const nearest = nearestCoordRoot(start);
36
+ if (nearest) return nearest;
37
+ return gitCoordRoots(start)[0] ?? gitToplevel(start);
25
38
  }
39
+
40
+ /** Nearest enclosing directory carrying `.harnery/`, or null. */
41
+ export function nearestCoordRoot(start: string): string | null {
42
+ return ancestorCoordRoots(start)[0] ?? null;
43
+ }
44
+
45
+ /** Every enclosing directory carrying `.harnery/`, nearest first. */
46
+ export function ancestorCoordRoots(start: string): string[] {
47
+ const found: string[] = [];
48
+ let dir = resolve(start);
49
+ while (true) {
50
+ if (existsSync(join(dir, ".harnery"))) found.push(dir);
51
+ const parent = dirname(dir);
52
+ if (parent === dir) break;
53
+ dir = parent;
54
+ }
55
+ return found;
56
+ }
57
+
58
+ /**
59
+ * Git-derived roots carrying `.harnery/`, in superproject-first order.
60
+ *
61
+ * Spawns use `start` as cwd so a call about another checkout cannot inherit
62
+ * this process's repository. The common-dir fallback recovers a superproject
63
+ * from a submodule worktree, where Git reports no direct superproject path.
64
+ */
65
+ export function gitCoordRoots(start: string): string[] {
66
+ const roots: string[] = [];
67
+ const push = (value: string | null) => {
68
+ if (value && existsSync(join(value, ".harnery")) && !roots.includes(value)) roots.push(value);
69
+ };
70
+
71
+ push(gitRevParse(start, "--show-superproject-working-tree"));
72
+ const common = gitRevParse(start, "--git-common-dir");
73
+ if (common) {
74
+ const index = common.indexOf("/.git/modules/");
75
+ if (index !== -1) push(common.substring(0, index));
76
+ }
77
+ push(gitToplevel(start));
78
+ return roots;
79
+ }
80
+
81
+ export function gitToplevel(start: string): string | null {
82
+ return gitRevParse(start, "--show-toplevel");
83
+ }
84
+
85
+ function gitRevParse(start: string, flag: string): string | null {
86
+ const key = `${start}\0${flag}`;
87
+ const cached = gitRevParseCache.get(key);
88
+ if (cached !== undefined) return cached;
89
+ let value: string | null = null;
90
+ try {
91
+ // A stale adapter project directory may no longer exist. Treat spawn
92
+ // failure as no path evidence instead of turning discovery into an error.
93
+ const result = spawnSync("git", ["rev-parse", flag], {
94
+ cwd: start,
95
+ encoding: "utf8",
96
+ });
97
+ if (result.status === 0) value = result.stdout.trim() || null;
98
+ } catch {
99
+ value = null;
100
+ }
101
+ gitRevParseCache.set(key, value);
102
+ return value;
103
+ }
104
+
105
+ const gitRevParseCache = new Map<string, string | null>();
@@ -45,6 +45,10 @@ export function resolveOwner(opts: {
45
45
  };
46
46
  const childId = value("subagent_id") ?? value("agent_id");
47
47
  const sessionId = value("session_id") ?? value("conversation_id");
48
+ // A payload with one unambiguous session identity needs no projection
49
+ // lookup. Live-authority tie-breaking matters only when the adapter also
50
+ // supplies a child candidate that could be stale or belong to the parent.
51
+ if (sessionId && !childId) return { instance_id: sessionId, source: "payload" };
48
52
  const child = childId ? readLiveCoordinationRow(opts.coordRoot, childId) : null;
49
53
  const session = sessionId ? readLiveCoordinationRow(opts.coordRoot, sessionId) : null;
50
54
 
@@ -3,6 +3,8 @@ import { basename, dirname, join } from "node:path";
3
3
 
4
4
  import { toolResponseMintedSessionName } from "../../agents/session-name-display.ts";
5
5
 
6
+ export const ASSISTANT_STATUS_BOX_PREFIX = "┌─ agent-";
7
+
6
8
  /**
7
9
  * Scan a CC-style JSONL transcript for the `┌─ agent-` status-box prefix in
8
10
  * the most-recent assistant turn. Used by `turn.completed` events to populate
@@ -76,6 +78,22 @@ export function scanAssistantTextIncludes(
76
78
  return false;
77
79
  }
78
80
 
81
+ /**
82
+ * Strict status-box evidence shared by turn telemetry and the Stop-time
83
+ * continuation fallback. Both inputs are assistant-only surfaces: the JSONL
84
+ * scanner rejects tool_result rows, while lastAssistantMessage comes directly
85
+ * from the adapter's completed assistant response.
86
+ */
87
+ export function scanAssistantStatusBoxPresent(
88
+ transcriptPath: string | undefined,
89
+ lastAssistantMessage: string | undefined,
90
+ ): boolean {
91
+ return (
92
+ scanAssistantTextIncludes(transcriptPath, ASSISTANT_STATUS_BOX_PREFIX) ||
93
+ lastAssistantMessage?.includes(ASSISTANT_STATUS_BOX_PREFIX) === true
94
+ );
95
+ }
96
+
79
97
  /** Most recent user-visible assistant text across Claude Code and Codex JSONL. */
80
98
  export function scanLatestAssistantText(transcriptPath: string | undefined): string | undefined {
81
99
  const readablePath = resolveTranscriptPath(transcriptPath);
@@ -225,19 +243,38 @@ function textFromContent(content: unknown): string {
225
243
  return parts.join("\n");
226
244
  }
227
245
 
246
+ /** Runtime identity read from one transcript row: the model plus the tuning
247
+ * values that row reported alongside it. */
248
+ export interface TranscriptRuntimeScan {
249
+ model: string;
250
+ /** CC stamps the effective effort level on each assistant row; absent when
251
+ * the model has no effort dial (verified: haiku rows omit it entirely). */
252
+ effort?: string;
253
+ /** CC reports the response speed tier inside `message.usage`. */
254
+ speed?: string;
255
+ }
256
+
228
257
  /**
229
- * Resolve the agent's model from a CC-style JSONL transcript by reading the
230
- * most-recent assistant message's `message.model`. Claude Code's SessionStart
231
- * payload omits `model` (Codex + Cursor supply it directly), so this is the
232
- * fallback that lets `session.started` / `turn.completed` populate the cache's
233
- * model field once the transcript has at least one assistant turn.
258
+ * Resolve the agent's runtime identity from a CC-style JSONL transcript by
259
+ * reading the most-recent assistant row. Claude Code's SessionStart payload
260
+ * omits `model` and `effort` (Codex + Cursor supply model directly), so this
261
+ * is the fallback that lets `session.started` / `turn.completed` populate
262
+ * model and tuning once the transcript has at least one assistant turn.
263
+ *
264
+ * Model, effort, and speed are read from the SAME row, never independently:
265
+ * effort varies with model inside one transcript (a mid-session model swap
266
+ * changes both), so pairing the newest model with a separately scanned newest
267
+ * effort can mislabel the session.
234
268
  *
235
269
  * Tail-reads the same 256KB window as the status-box scan and walks lines from
236
- * the end, returning the first real model id found. Synthetic placeholders
237
- * (`<synthetic>`) and empty values are skipped. Returns undefined when the
238
- * transcript is missing/empty (e.g. a fresh session's first SessionStart).
270
+ * the end, returning the first row with a real model id. Synthetic
271
+ * placeholders (`<synthetic>`) and empty values are skipped. Returns undefined
272
+ * when the transcript is missing/empty (e.g. a fresh session's first
273
+ * SessionStart).
239
274
  */
240
- export function scanTranscriptModel(transcriptPath: string | undefined): string | undefined {
275
+ export function scanTranscriptRuntime(
276
+ transcriptPath: string | undefined,
277
+ ): TranscriptRuntimeScan | undefined {
241
278
  const readablePath = resolveTranscriptPath(transcriptPath);
242
279
  if (!readablePath) return undefined;
243
280
  const text = tailText(readablePath);
@@ -248,12 +285,19 @@ export function scanTranscriptModel(transcriptPath: string | undefined): string
248
285
  if (!line?.includes('"model"')) continue;
249
286
  try {
250
287
  const obj = JSON.parse(line) as {
251
- message?: { model?: unknown };
288
+ effort?: unknown;
289
+ message?: { model?: unknown; usage?: { speed?: unknown } };
252
290
  model?: unknown;
253
291
  };
254
292
  const model = obj.message?.model ?? obj.model;
255
293
  if (typeof model === "string" && model.length > 0 && !model.startsWith("<")) {
256
- return model;
294
+ const effort = obj.effort;
295
+ const speed = obj.message?.usage?.speed;
296
+ return {
297
+ model,
298
+ ...(typeof effort === "string" && effort.length > 0 ? { effort } : {}),
299
+ ...(typeof speed === "string" && speed.length > 0 ? { speed } : {}),
300
+ };
257
301
  }
258
302
  } catch {
259
303
  // Partial/truncated first line of the tail window; skip it.
@@ -0,0 +1,81 @@
1
+ export const HARNERY_INBOX_RECORD_SCHEMA = "harnery.inbox-record/v1" as const;
2
+ export const HARNERY_INBOX_STATUS_SCHEMA = "harnery.inbox-status/v1" as const;
3
+
4
+ export interface HarneryInboxLimits {
5
+ max_message_body_bytes: number;
6
+ max_pending_count: number;
7
+ max_pending_bytes: number;
8
+ max_history_bytes: number;
9
+ max_history_records: number;
10
+ warning_pressure_ratio: number;
11
+ max_surface_count: number;
12
+ max_surface_bytes: number;
13
+ max_surface_tokens: number;
14
+ surfaced_grace_ms: number;
15
+ terminal_grace_ms: number;
16
+ }
17
+
18
+ export interface HarneryInboxMessageRecordV1 {
19
+ schema: typeof HARNERY_INBOX_RECORD_SCHEMA;
20
+ kind: "message";
21
+ message_id: string;
22
+ sender_instance_id: string;
23
+ sender_display_name: string;
24
+ recipient_instance_id: string;
25
+ recipient_display_name: string;
26
+ created_at: string;
27
+ body: string;
28
+ body_bytes: number;
29
+ }
30
+
31
+ export interface HarneryInboxSurfacedRecordV1 {
32
+ schema: typeof HARNERY_INBOX_RECORD_SCHEMA;
33
+ kind: "surfaced";
34
+ message_id: string;
35
+ surfaced_at: string;
36
+ }
37
+
38
+ export type HarneryInboxRecordV1 = HarneryInboxMessageRecordV1 | HarneryInboxSurfacedRecordV1;
39
+
40
+ export interface HarneryInboxStatusV1 {
41
+ schema: typeof HARNERY_INBOX_STATUS_SCHEMA;
42
+ recipient_instance_id: string;
43
+ pending_count: number;
44
+ pending_bytes: number;
45
+ total_history_bytes: number;
46
+ oldest_pending_at?: string;
47
+ pressure: "normal" | "warning" | "exhausted";
48
+ last_surface_at?: string;
49
+ last_compaction_at?: string;
50
+ }
51
+
52
+ export type HarneryInboxCapacityReason =
53
+ | "message_body_limit"
54
+ | "pending_count_limit"
55
+ | "pending_bytes_limit"
56
+ | "history_bytes_limit";
57
+
58
+ export class HarneryInboxCapacityError extends Error {
59
+ constructor(
60
+ readonly reason_code: HarneryInboxCapacityReason,
61
+ readonly current: number,
62
+ readonly limit: number,
63
+ ) {
64
+ super(
65
+ `inbox capacity ${reason_code}: ${current}/${limit}; use a managed artifact for larger payloads`,
66
+ );
67
+ }
68
+ }
69
+
70
+ export interface HarneryInboxSurfaceBudget {
71
+ max_count: number;
72
+ max_bytes: number;
73
+ max_tokens: number;
74
+ }
75
+
76
+ export interface HarneryInboxSurfaceResult {
77
+ emitted: readonly HarneryInboxMessageRecordV1[];
78
+ remaining_pending_count: number;
79
+ remaining_pending_bytes: number;
80
+ repeated_after_crash_possible: true;
81
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./contract.ts";
2
+ export * from "./lifecycle.ts";
3
+ export * from "./service.ts";
4
+ export * from "./watcher.ts";
@@ -0,0 +1,104 @@
1
+ import type { HarneryInboxLimits, HarneryInboxRecordV1 } from "./contract.ts";
2
+ import { project } from "./service.ts";
3
+
4
+ export const HARNERY_INBOX_COMPACTION_PLAN_SCHEMA = "harnery.inbox-compaction-plan/v1" as const;
5
+
6
+ export type HarneryRecipientLifecycle = "active" | "resumable" | "terminal";
7
+
8
+ export interface HarneryInboxCompactionPlan {
9
+ schema: typeof HARNERY_INBOX_COMPACTION_PLAN_SCHEMA;
10
+ recipient_instance_id: string;
11
+ action: "none" | "compact-surfaced" | "prune-terminal";
12
+ reason_code:
13
+ | "pending_protected"
14
+ | "active_recipient"
15
+ | "surfaced_grace"
16
+ | "terminal_grace"
17
+ | "eligible";
18
+ remove_record_count: number;
19
+ retained_record_count: number;
20
+ protected_pending_count: number;
21
+ dry_run: true;
22
+ }
23
+
24
+ export function planInboxCompaction(input: {
25
+ recipient_instance_id: string;
26
+ records: readonly HarneryInboxRecordV1[];
27
+ lifecycle: HarneryRecipientLifecycle;
28
+ terminal_at?: string;
29
+ now: Date;
30
+ limits: HarneryInboxLimits;
31
+ }): HarneryInboxCompactionPlan {
32
+ const projection = project(input.records);
33
+ const surfacedAt = new Map<string, number>();
34
+ for (const record of input.records) {
35
+ if (record.kind === "surfaced")
36
+ surfacedAt.set(record.message_id, Date.parse(record.surfaced_at));
37
+ }
38
+ const compactableIds = new Set(
39
+ [...surfacedAt]
40
+ .filter(([, timestamp]) => input.now.getTime() - timestamp >= input.limits.surfaced_grace_ms)
41
+ .map(([id]) => id),
42
+ );
43
+ const compactableRecords = input.records.filter((record) =>
44
+ compactableIds.has(record.message_id),
45
+ ).length;
46
+ if (input.lifecycle === "terminal") {
47
+ if (projection.pending.length > 0) {
48
+ return plan(
49
+ input,
50
+ "none",
51
+ "pending_protected",
52
+ 0,
53
+ input.records.length,
54
+ projection.pending.length,
55
+ );
56
+ }
57
+ const terminalAt = input.terminal_at ? Date.parse(input.terminal_at) : Number.NaN;
58
+ if (
59
+ !Number.isFinite(terminalAt) ||
60
+ input.now.getTime() - terminalAt < input.limits.terminal_grace_ms
61
+ ) {
62
+ return plan(input, "none", "terminal_grace", 0, input.records.length, 0);
63
+ }
64
+ return plan(input, "prune-terminal", "eligible", input.records.length, 0, 0);
65
+ }
66
+ if (compactableRecords === 0) {
67
+ return plan(
68
+ input,
69
+ "none",
70
+ surfacedAt.size > 0 ? "surfaced_grace" : "active_recipient",
71
+ 0,
72
+ input.records.length,
73
+ projection.pending.length,
74
+ );
75
+ }
76
+ return plan(
77
+ input,
78
+ "compact-surfaced",
79
+ "eligible",
80
+ compactableRecords,
81
+ input.records.length - compactableRecords,
82
+ projection.pending.length,
83
+ );
84
+ }
85
+
86
+ function plan(
87
+ input: { recipient_instance_id: string },
88
+ action: HarneryInboxCompactionPlan["action"],
89
+ reason_code: HarneryInboxCompactionPlan["reason_code"],
90
+ remove_record_count: number,
91
+ retained_record_count: number,
92
+ protected_pending_count: number,
93
+ ): HarneryInboxCompactionPlan {
94
+ return {
95
+ schema: HARNERY_INBOX_COMPACTION_PLAN_SCHEMA,
96
+ recipient_instance_id: input.recipient_instance_id,
97
+ action,
98
+ reason_code,
99
+ remove_record_count,
100
+ retained_record_count,
101
+ protected_pending_count,
102
+ dry_run: true,
103
+ };
104
+ }