harnery 0.35.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/dist/commander.d.ts +30 -5
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +124 -96
  4. package/dist/commands/agents.d.ts +23 -3
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +379 -198
  7. package/dist/commands/backup.d.ts.map +1 -1
  8. package/dist/commands/backup.js +10 -10
  9. package/dist/commands/browse-session.d.ts.map +1 -1
  10. package/dist/commands/browse-session.js +12 -0
  11. package/dist/commands/browse.d.ts +1 -1
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +5 -4
  14. package/dist/commands/conversations.d.ts +10 -0
  15. package/dist/commands/conversations.d.ts.map +1 -0
  16. package/dist/commands/conversations.js +201 -0
  17. package/dist/commands/deinit.d.ts.map +1 -1
  18. package/dist/commands/deinit.js +5 -0
  19. package/dist/commands/docs.d.ts.map +1 -1
  20. package/dist/commands/docs.js +13 -2
  21. package/dist/commands/doctor.d.ts +5 -0
  22. package/dist/commands/doctor.d.ts.map +1 -1
  23. package/dist/commands/doctor.js +51 -7
  24. package/dist/commands/fetch.js +6 -5
  25. package/dist/commands/files.d.ts +22 -0
  26. package/dist/commands/files.d.ts.map +1 -0
  27. package/dist/commands/files.js +113 -0
  28. package/dist/commands/governor.js +14 -12
  29. package/dist/commands/inbox.d.ts +5 -0
  30. package/dist/commands/inbox.d.ts.map +1 -0
  31. package/dist/commands/inbox.js +57 -0
  32. package/dist/commands/init.d.ts +4 -5
  33. package/dist/commands/init.d.ts.map +1 -1
  34. package/dist/commands/init.js +63 -13
  35. package/dist/commands/ledger-v3.d.ts.map +1 -1
  36. package/dist/commands/ledger-v3.js +347 -1
  37. package/dist/commands/logs.d.ts +4 -0
  38. package/dist/commands/logs.d.ts.map +1 -0
  39. package/dist/commands/logs.js +169 -0
  40. package/dist/commands/messages.d.ts +5 -0
  41. package/dist/commands/messages.d.ts.map +1 -0
  42. package/dist/commands/messages.js +45 -0
  43. package/dist/commands/outline.d.ts +1 -1
  44. package/dist/commands/outline.d.ts.map +1 -1
  45. package/dist/commands/outline.js +2 -2
  46. package/dist/commands/read.d.ts +1 -1
  47. package/dist/commands/read.d.ts.map +1 -1
  48. package/dist/commands/read.js +2 -2
  49. package/dist/commands/semantic.d.ts.map +1 -1
  50. package/dist/commands/semantic.js +54 -2
  51. package/dist/commands/storage.d.ts +4 -0
  52. package/dist/commands/storage.d.ts.map +1 -0
  53. package/dist/commands/storage.js +238 -0
  54. package/dist/commands/tunnel.d.ts +5 -1
  55. package/dist/commands/tunnel.d.ts.map +1 -1
  56. package/dist/commands/tunnel.js +44 -31
  57. package/dist/commands/web.d.ts +3 -0
  58. package/dist/commands/web.d.ts.map +1 -1
  59. package/dist/commands/web.js +67 -7
  60. package/dist/commands/work.js +3 -3
  61. package/dist/commands/workflow.js +13 -13
  62. package/dist/core/adapters/profiles.d.ts +1 -1
  63. package/dist/core/agents/cli.js +209 -39
  64. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  65. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  66. package/dist/core/agents/live-authority-v3.js +244 -10
  67. package/dist/core/agents/live-lifecycle-v3.js +6 -1
  68. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  69. package/dist/core/agents/live-observation-v3.js +6 -1
  70. package/dist/core/agents/render/prompt-context.d.ts +9 -3
  71. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  72. package/dist/core/agents/render/prompt-context.js +24 -7
  73. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  74. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  75. package/dist/core/agents/rules/stop-hook.js +94 -13
  76. package/dist/core/agents/rules/verdict.d.ts +1 -0
  77. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  78. package/dist/core/agents/session-events.d.ts.map +1 -1
  79. package/dist/core/agents/session-events.js +4 -0
  80. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  81. package/dist/core/agents/session-finalizer-v3.js +5 -1
  82. package/dist/core/agents/state/activity-log.d.ts +3 -0
  83. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  84. package/dist/core/agents/state/activity-log.js +6 -3
  85. package/dist/core/agents/state/heartbeat-writer.d.ts +6 -0
  86. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  87. package/dist/core/agents/state/heartbeat-writer.js +18 -0
  88. package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
  89. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  90. package/dist/core/agents/state/live-coordination-view.js +15 -90
  91. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  92. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  93. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  94. package/dist/core/artifacts/index.d.ts +21 -0
  95. package/dist/core/artifacts/index.d.ts.map +1 -1
  96. package/dist/core/artifacts/index.js +46 -1
  97. package/dist/core/config.d.ts +62 -4
  98. package/dist/core/config.d.ts.map +1 -1
  99. package/dist/core/config.js +98 -4
  100. package/dist/core/conversations/archive.d.ts +49 -0
  101. package/dist/core/conversations/archive.d.ts.map +1 -0
  102. package/dist/core/conversations/archive.js +136 -0
  103. package/dist/core/conversations/catalog.d.ts +10 -0
  104. package/dist/core/conversations/catalog.d.ts.map +1 -0
  105. package/dist/core/conversations/catalog.js +72 -0
  106. package/dist/core/conversations/context-pack.d.ts +6 -0
  107. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  108. package/dist/core/conversations/context-pack.js +60 -0
  109. package/dist/core/conversations/contract.d.ts +155 -0
  110. package/dist/core/conversations/contract.d.ts.map +1 -0
  111. package/dist/core/conversations/contract.js +1 -0
  112. package/dist/core/conversations/evaluation.d.ts +16 -0
  113. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  114. package/dist/core/conversations/evaluation.js +9 -0
  115. package/dist/core/conversations/index.d.ts +10 -0
  116. package/dist/core/conversations/index.d.ts.map +1 -0
  117. package/dist/core/conversations/index.js +9 -0
  118. package/dist/core/conversations/lifecycle.d.ts +28 -0
  119. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  120. package/dist/core/conversations/lifecycle.js +29 -0
  121. package/dist/core/conversations/normalize.d.ts +14 -0
  122. package/dist/core/conversations/normalize.d.ts.map +1 -0
  123. package/dist/core/conversations/normalize.js +82 -0
  124. package/dist/core/conversations/query.d.ts +8 -0
  125. package/dist/core/conversations/query.d.ts.map +1 -0
  126. package/dist/core/conversations/query.js +280 -0
  127. package/dist/core/conversations/search-index.d.ts +9 -0
  128. package/dist/core/conversations/search-index.d.ts.map +1 -0
  129. package/dist/core/conversations/search-index.js +29 -0
  130. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  131. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  132. package/dist/core/events/legacy-storage/canary.js +150 -0
  133. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  134. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  135. package/dist/core/events/legacy-storage/fence.js +115 -0
  136. package/dist/core/events/legacy-storage/index.d.ts +6 -0
  137. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  138. package/dist/core/events/legacy-storage/index.js +5 -0
  139. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  140. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  141. package/dist/core/events/legacy-storage/inventory.js +40 -0
  142. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  143. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  144. package/dist/core/events/legacy-storage/manifest.js +108 -0
  145. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  146. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  147. package/dist/core/events/legacy-storage/reader.js +154 -0
  148. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  149. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  150. package/dist/core/events/v3/authority-outbox.js +16 -3
  151. package/dist/core/events/v3/base-contract.d.ts +81 -41
  152. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  153. package/dist/core/events/v3/base-contract.js +17 -7
  154. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  155. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  156. package/dist/core/events/v3/bootstrap.js +167 -3
  157. package/dist/core/events/v3/capabilities.js +3 -3
  158. package/dist/core/events/v3/control-witness.d.ts +44 -0
  159. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  160. package/dist/core/events/v3/control-witness.js +233 -0
  161. package/dist/core/events/v3/control-writer.d.ts +4 -0
  162. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  163. package/dist/core/events/v3/control-writer.js +16 -0
  164. package/dist/core/events/v3/control.d.ts +8 -2
  165. package/dist/core/events/v3/control.d.ts.map +1 -1
  166. package/dist/core/events/v3/control.js +46 -18
  167. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  168. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  169. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  170. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  171. package/dist/core/events/v3/coordination-view.js +16 -1
  172. package/dist/core/events/v3/generated.d.ts +1 -1
  173. package/dist/core/events/v3/generated.js +1 -1
  174. package/dist/core/events/v3/index.d.ts +4 -2
  175. package/dist/core/events/v3/index.d.ts.map +1 -1
  176. package/dist/core/events/v3/index.js +3 -1
  177. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  178. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  179. package/dist/core/events/v3/live-route-observer.js +58 -0
  180. package/dist/core/events/v3/live-routing.d.ts +13 -21
  181. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  182. package/dist/core/events/v3/live-routing.js +45 -41
  183. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  184. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  185. package/dist/core/events/v3/producers/coordination-recorder.js +76 -10
  186. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  187. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  188. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  189. package/dist/core/events/v3/producers/hook-base.js +1 -1
  190. package/dist/core/events/v3/producers/intake.d.ts +7 -0
  191. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  192. package/dist/core/events/v3/producers/intake.js +25 -2
  193. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  194. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  195. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  196. package/dist/core/events/v3/producers/recorder.d.ts +55 -1
  197. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  198. package/dist/core/events/v3/producers/recorder.js +353 -24
  199. package/dist/core/events/v3/reader.d.ts +51 -0
  200. package/dist/core/events/v3/reader.d.ts.map +1 -1
  201. package/dist/core/events/v3/reader.js +181 -1
  202. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  203. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  204. package/dist/core/events/v3/rotation-config.js +91 -0
  205. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  206. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  207. package/dist/core/events/v3/runtime-build.js +39 -0
  208. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  209. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  210. package/dist/core/events/v3/runtime-identity.js +18 -0
  211. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +6 -5
  212. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
  213. package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
  214. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  215. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  216. package/dist/core/events/v3/support-storage/classify.js +149 -0
  217. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  218. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  219. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  220. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  221. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  222. package/dist/core/events/v3/support-storage/index.js +9 -0
  223. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  224. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  225. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  226. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  227. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  228. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  229. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  230. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  231. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  232. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  233. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  234. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  235. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  236. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  237. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  238. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  239. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  240. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  241. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  242. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  243. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  244. package/dist/core/events/v3/turn-telemetry.d.ts +14 -8
  245. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  246. package/dist/core/events/v3/turn-telemetry.js +32 -2
  247. package/dist/core/events/v3/writer.d.ts +13 -1
  248. package/dist/core/events/v3/writer.d.ts.map +1 -1
  249. package/dist/core/events/v3/writer.js +126 -12
  250. package/dist/core/governor/plan-read.d.ts.map +1 -1
  251. package/dist/core/governor/plan-read.js +5 -21
  252. package/dist/core/governor/planning.js +6 -8
  253. package/dist/core/governor/service-read.d.ts +12 -0
  254. package/dist/core/governor/service-read.d.ts.map +1 -1
  255. package/dist/core/governor/service-read.js +266 -2
  256. package/dist/core/governor/service.d.ts +1 -0
  257. package/dist/core/governor/service.d.ts.map +1 -1
  258. package/dist/core/governor/service.js +53 -18
  259. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  260. package/dist/core/guard/evidence-v3.js +2 -0
  261. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  262. package/dist/core/hooks/adapter/events.js +1 -0
  263. package/dist/core/hooks/adapter/output.d.ts +4 -2
  264. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  265. package/dist/core/hooks/adapter/output.js +13 -5
  266. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
  267. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
  268. package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
  269. package/dist/core/hooks/cli.js +212 -30
  270. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  271. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  272. package/dist/core/hooks/effects/image-capture.js +4 -2
  273. package/dist/core/hooks/remediation-cap.d.ts +8 -3
  274. package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
  275. package/dist/core/hooks/remediation-cap.js +3 -11
  276. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  277. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  278. package/dist/core/hooks/resolve/coord-root.js +92 -11
  279. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  280. package/dist/core/hooks/resolve/owner.js +5 -0
  281. package/dist/core/hooks/resolve/transcript.d.ts +8 -0
  282. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  283. package/dist/core/hooks/resolve/transcript.js +11 -0
  284. package/dist/core/inbox/contract.d.ts +64 -0
  285. package/dist/core/inbox/contract.d.ts.map +1 -0
  286. package/dist/core/inbox/contract.js +13 -0
  287. package/dist/core/inbox/index.d.ts +5 -0
  288. package/dist/core/inbox/index.d.ts.map +1 -0
  289. package/dist/core/inbox/index.js +4 -0
  290. package/dist/core/inbox/lifecycle.d.ts +22 -0
  291. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  292. package/dist/core/inbox/lifecycle.js +41 -0
  293. package/dist/core/inbox/service.d.ts +36 -0
  294. package/dist/core/inbox/service.d.ts.map +1 -0
  295. package/dist/core/inbox/service.js +210 -0
  296. package/dist/core/inbox/watcher.d.ts +7 -0
  297. package/dist/core/inbox/watcher.d.ts.map +1 -0
  298. package/dist/core/inbox/watcher.js +26 -0
  299. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  300. package/dist/core/presence/codec-digest.js +14 -3
  301. package/dist/core/presence/relay-client.d.ts +1 -0
  302. package/dist/core/presence/relay-client.d.ts.map +1 -1
  303. package/dist/core/presence/relay-client.js +52 -8
  304. package/dist/core/semantic/adapters.d.ts +11 -8
  305. package/dist/core/semantic/adapters.d.ts.map +1 -1
  306. package/dist/core/semantic/adapters.js +169 -31
  307. package/dist/core/semantic/contract.d.ts +532 -48
  308. package/dist/core/semantic/contract.d.ts.map +1 -1
  309. package/dist/core/semantic/contract.js +104 -3
  310. package/dist/core/semantic/index.d.ts +7 -3
  311. package/dist/core/semantic/index.d.ts.map +1 -1
  312. package/dist/core/semantic/index.js +7 -3
  313. package/dist/core/semantic/once.d.ts +6 -1
  314. package/dist/core/semantic/once.d.ts.map +1 -1
  315. package/dist/core/semantic/once.js +80 -9
  316. package/dist/core/semantic/prompt.d.ts.map +1 -1
  317. package/dist/core/semantic/prompt.js +14 -1
  318. package/dist/core/semantic/review.d.ts +144 -0
  319. package/dist/core/semantic/review.d.ts.map +1 -0
  320. package/dist/core/semantic/review.js +544 -0
  321. package/dist/core/semantic/routes.d.ts +10 -0
  322. package/dist/core/semantic/routes.d.ts.map +1 -0
  323. package/dist/core/semantic/routes.js +21 -0
  324. package/dist/core/semantic/scheduler.d.ts +14 -3
  325. package/dist/core/semantic/scheduler.d.ts.map +1 -1
  326. package/dist/core/semantic/scheduler.js +30 -6
  327. package/dist/core/semantic/service-status.d.ts +20 -0
  328. package/dist/core/semantic/service-status.d.ts.map +1 -1
  329. package/dist/core/semantic/service-status.js +60 -4
  330. package/dist/core/semantic/service.d.ts +1 -0
  331. package/dist/core/semantic/service.d.ts.map +1 -1
  332. package/dist/core/semantic/service.js +104 -15
  333. package/dist/core/semantic/soak.d.ts +75 -0
  334. package/dist/core/semantic/soak.d.ts.map +1 -0
  335. package/dist/core/semantic/soak.js +476 -0
  336. package/dist/core/semantic/storage.d.ts +11 -1
  337. package/dist/core/semantic/storage.d.ts.map +1 -1
  338. package/dist/core/semantic/storage.js +4 -3
  339. package/dist/core/semantic/usage.d.ts +43 -0
  340. package/dist/core/semantic/usage.d.ts.map +1 -0
  341. package/dist/core/semantic/usage.js +193 -0
  342. package/dist/core/semantic/validate.d.ts +3 -1
  343. package/dist/core/semantic/validate.d.ts.map +1 -1
  344. package/dist/core/semantic/validate.js +34 -1
  345. package/dist/core/storage/buffer.d.ts +28 -0
  346. package/dist/core/storage/buffer.d.ts.map +1 -0
  347. package/dist/core/storage/buffer.js +101 -0
  348. package/dist/core/storage/builtins.d.ts +3 -0
  349. package/dist/core/storage/builtins.d.ts.map +1 -0
  350. package/dist/core/storage/builtins.js +683 -0
  351. package/dist/core/storage/catalog.d.ts +19 -0
  352. package/dist/core/storage/catalog.d.ts.map +1 -0
  353. package/dist/core/storage/catalog.js +365 -0
  354. package/dist/core/storage/config.d.ts +16 -0
  355. package/dist/core/storage/config.d.ts.map +1 -0
  356. package/dist/core/storage/config.js +311 -0
  357. package/dist/core/storage/contract.d.ts +275 -0
  358. package/dist/core/storage/contract.d.ts.map +1 -0
  359. package/dist/core/storage/contract.js +3 -0
  360. package/dist/core/storage/durable-history.d.ts +36 -0
  361. package/dist/core/storage/durable-history.d.ts.map +1 -0
  362. package/dist/core/storage/durable-history.js +606 -0
  363. package/dist/core/storage/health.d.ts +4 -0
  364. package/dist/core/storage/health.d.ts.map +1 -0
  365. package/dist/core/storage/health.js +65 -0
  366. package/dist/core/storage/index.d.ts +16 -0
  367. package/dist/core/storage/index.d.ts.map +1 -0
  368. package/dist/core/storage/index.js +15 -0
  369. package/dist/core/storage/inventory.d.ts +25 -0
  370. package/dist/core/storage/inventory.d.ts.map +1 -0
  371. package/dist/core/storage/inventory.js +666 -0
  372. package/dist/core/storage/jsonl.d.ts +52 -0
  373. package/dist/core/storage/jsonl.d.ts.map +1 -0
  374. package/dist/core/storage/jsonl.js +156 -0
  375. package/dist/core/storage/log-retention.d.ts +52 -0
  376. package/dist/core/storage/log-retention.d.ts.map +1 -0
  377. package/dist/core/storage/log-retention.js +419 -0
  378. package/dist/core/storage/logger.d.ts +82 -0
  379. package/dist/core/storage/logger.d.ts.map +1 -0
  380. package/dist/core/storage/logger.js +411 -0
  381. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  382. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  383. package/dist/core/storage/maintenance-providers.js +141 -0
  384. package/dist/core/storage/maintenance.d.ts +125 -0
  385. package/dist/core/storage/maintenance.d.ts.map +1 -0
  386. package/dist/core/storage/maintenance.js +609 -0
  387. package/dist/core/storage/metrics.d.ts +60 -0
  388. package/dist/core/storage/metrics.d.ts.map +1 -0
  389. package/dist/core/storage/metrics.js +134 -0
  390. package/dist/core/storage/policy.d.ts +7 -0
  391. package/dist/core/storage/policy.d.ts.map +1 -0
  392. package/dist/core/storage/policy.js +110 -0
  393. package/dist/core/storage/process-log.d.ts +38 -0
  394. package/dist/core/storage/process-log.d.ts.map +1 -0
  395. package/dist/core/storage/process-log.js +165 -0
  396. package/dist/core/storage/query.d.ts +34 -0
  397. package/dist/core/storage/query.d.ts.map +1 -0
  398. package/dist/core/storage/query.js +295 -0
  399. package/dist/core/storage/receipts.d.ts +23 -0
  400. package/dist/core/storage/receipts.d.ts.map +1 -0
  401. package/dist/core/storage/receipts.js +117 -0
  402. package/dist/core/storage/segments.d.ts +84 -0
  403. package/dist/core/storage/segments.d.ts.map +1 -0
  404. package/dist/core/storage/segments.js +542 -0
  405. package/dist/core/storage/sink-graph.d.ts +65 -0
  406. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  407. package/dist/core/storage/sink-graph.js +213 -0
  408. package/dist/core/storage/storm-control.d.ts +23 -0
  409. package/dist/core/storage/storm-control.d.ts.map +1 -0
  410. package/dist/core/storage/storm-control.js +59 -0
  411. package/dist/core/work/state.d.ts.map +1 -1
  412. package/dist/core/work/state.js +10 -14
  413. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  414. package/dist/core/workflow/live-session-v3.js +2 -1
  415. package/dist/index.d.ts +2 -0
  416. package/dist/index.d.ts.map +1 -1
  417. package/dist/index.js +2 -0
  418. package/dist/lazy-commands.d.ts +26 -0
  419. package/dist/lazy-commands.d.ts.map +1 -0
  420. package/dist/lazy-commands.js +210 -0
  421. package/dist/lib/docs-lint.d.ts +2 -0
  422. package/dist/lib/docs-lint.d.ts.map +1 -1
  423. package/dist/lib/docs-lint.js +45 -80
  424. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  425. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  426. package/dist/lib/docs-metadata-audit.js +13 -23
  427. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  428. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  429. package/dist/lib/docs-metadata-sync.js +28 -10
  430. package/dist/lib/docs-repository-view.d.ts +22 -0
  431. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  432. package/dist/lib/docs-repository-view.js +185 -0
  433. package/dist/lib/http/client.d.ts +11 -5
  434. package/dist/lib/http/client.d.ts.map +1 -1
  435. package/dist/lib/http/client.js +22 -4
  436. package/dist/lib/http/index.d.ts +1 -1
  437. package/dist/lib/http/index.d.ts.map +1 -1
  438. package/dist/lib/http/index.js +1 -1
  439. package/dist/lib/indexer-exclusions.d.ts +27 -0
  440. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  441. package/dist/lib/indexer-exclusions.js +176 -0
  442. package/dist/lib/instructions/templates.d.ts.map +1 -1
  443. package/dist/lib/instructions/templates.js +5 -0
  444. package/dist/lib/local-file-url.d.ts +9 -0
  445. package/dist/lib/local-file-url.d.ts.map +1 -0
  446. package/dist/lib/local-file-url.js +20 -0
  447. package/dist/lib/web-performance.d.ts +118 -0
  448. package/dist/lib/web-performance.d.ts.map +1 -0
  449. package/dist/lib/web-performance.js +192 -0
  450. package/package.json +29 -2
  451. package/schemas/config.schema.json +58 -0
  452. package/schemas/event-v3.schema.json +324 -112
  453. package/src/commander.ts +462 -95
  454. package/src/commands/agents.ts +517 -190
  455. package/src/commands/backup.ts +18 -14
  456. package/src/commands/browse-session.ts +12 -0
  457. package/src/commands/browse.ts +6 -7
  458. package/src/commands/conversations.ts +279 -0
  459. package/src/commands/deinit.ts +6 -0
  460. package/src/commands/docs.ts +25 -6
  461. package/src/commands/doctor.ts +75 -9
  462. package/src/commands/fetch.ts +7 -6
  463. package/src/commands/files.ts +143 -0
  464. package/src/commands/governor.ts +13 -12
  465. package/src/commands/inbox.ts +61 -0
  466. package/src/commands/init.ts +78 -16
  467. package/src/commands/ledger-v3.ts +421 -1
  468. package/src/commands/logs.ts +224 -0
  469. package/src/commands/messages.ts +61 -0
  470. package/src/commands/outline.ts +6 -2
  471. package/src/commands/read.ts +6 -2
  472. package/src/commands/semantic.ts +66 -1
  473. package/src/commands/storage.ts +310 -0
  474. package/src/commands/tunnel.ts +66 -52
  475. package/src/commands/web.ts +77 -7
  476. package/src/commands/work.ts +3 -3
  477. package/src/commands/workflow.ts +13 -13
  478. package/src/core/agents/cli.ts +259 -53
  479. package/src/core/agents/live-authority-v3.ts +341 -10
  480. package/src/core/agents/live-lifecycle-v3.ts +6 -1
  481. package/src/core/agents/live-observation-v3.ts +6 -1
  482. package/src/core/agents/render/prompt-context.ts +27 -6
  483. package/src/core/agents/rules/stop-hook.ts +107 -16
  484. package/src/core/agents/rules/verdict.ts +1 -0
  485. package/src/core/agents/session-events.ts +4 -0
  486. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  487. package/src/core/agents/session-finalizer-v3.ts +4 -1
  488. package/src/core/agents/state/activity-log.ts +7 -2
  489. package/src/core/agents/state/heartbeat-writer.ts +27 -0
  490. package/src/core/agents/state/live-coordination-view.ts +16 -105
  491. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  492. package/src/core/artifacts/index.ts +64 -1
  493. package/src/core/config.ts +126 -5
  494. package/src/core/conversations/archive.ts +237 -0
  495. package/src/core/conversations/catalog.ts +79 -0
  496. package/src/core/conversations/context-pack.ts +72 -0
  497. package/src/core/conversations/contract.ts +178 -0
  498. package/src/core/conversations/evaluation.ts +30 -0
  499. package/src/core/conversations/index.ts +9 -0
  500. package/src/core/conversations/lifecycle.ts +63 -0
  501. package/src/core/conversations/normalize.ts +105 -0
  502. package/src/core/conversations/query.ts +318 -0
  503. package/src/core/conversations/search-index.ts +48 -0
  504. package/src/core/events/legacy-storage/canary.ts +177 -0
  505. package/src/core/events/legacy-storage/fence.ts +129 -0
  506. package/src/core/events/legacy-storage/index.ts +5 -0
  507. package/src/core/events/legacy-storage/inventory.ts +51 -0
  508. package/src/core/events/legacy-storage/manifest.ts +136 -0
  509. package/src/core/events/legacy-storage/reader.ts +178 -0
  510. package/src/core/events/v3/authority-outbox.ts +22 -1
  511. package/src/core/events/v3/base-contract.ts +17 -7
  512. package/src/core/events/v3/bootstrap.ts +195 -2
  513. package/src/core/events/v3/capabilities.ts +3 -3
  514. package/src/core/events/v3/control-witness.ts +339 -0
  515. package/src/core/events/v3/control-writer.ts +16 -0
  516. package/src/core/events/v3/control.ts +54 -18
  517. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  518. package/src/core/events/v3/coordination-view.ts +17 -1
  519. package/src/core/events/v3/generated.ts +1 -1
  520. package/src/core/events/v3/index.ts +5 -2
  521. package/src/core/events/v3/live-route-observer.ts +80 -0
  522. package/src/core/events/v3/live-routing.ts +64 -46
  523. package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
  524. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  525. package/src/core/events/v3/producers/hook-base.ts +1 -1
  526. package/src/core/events/v3/producers/intake.ts +30 -2
  527. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  528. package/src/core/events/v3/producers/recorder.ts +571 -33
  529. package/src/core/events/v3/reader.ts +243 -2
  530. package/src/core/events/v3/rotation-config.ts +98 -0
  531. package/src/core/events/v3/runtime-build.ts +41 -0
  532. package/src/core/events/v3/runtime-identity.ts +16 -0
  533. package/src/core/events/v3/runtime-telemetry-capabilities.ts +14 -8
  534. package/src/core/events/v3/support-storage/classify.ts +209 -0
  535. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  536. package/src/core/events/v3/support-storage/index.ts +9 -0
  537. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  538. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  539. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  540. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  541. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  542. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  543. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  544. package/src/core/events/v3/turn-telemetry.ts +58 -7
  545. package/src/core/events/v3/writer.ts +168 -16
  546. package/src/core/governor/plan-read.ts +5 -18
  547. package/src/core/governor/planning.ts +5 -8
  548. package/src/core/governor/service-read.ts +320 -2
  549. package/src/core/governor/service.ts +49 -22
  550. package/src/core/guard/evidence-v3.ts +1 -0
  551. package/src/core/hooks/adapter/events.ts +1 -0
  552. package/src/core/hooks/adapter/output.ts +12 -5
  553. package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
  554. package/src/core/hooks/cli.ts +226 -32
  555. package/src/core/hooks/effects/image-capture.ts +4 -1
  556. package/src/core/hooks/remediation-cap.ts +12 -6
  557. package/src/core/hooks/resolve/coord-root.ts +91 -11
  558. package/src/core/hooks/resolve/owner.ts +4 -0
  559. package/src/core/hooks/resolve/transcript.ts +18 -0
  560. package/src/core/inbox/contract.ts +81 -0
  561. package/src/core/inbox/index.ts +4 -0
  562. package/src/core/inbox/lifecycle.ts +104 -0
  563. package/src/core/inbox/service.ts +305 -0
  564. package/src/core/inbox/watcher.ts +36 -0
  565. package/src/core/presence/codec-digest.ts +15 -9
  566. package/src/core/presence/relay-client.ts +55 -7
  567. package/src/core/semantic/adapters.ts +200 -41
  568. package/src/core/semantic/contract.ts +135 -3
  569. package/src/core/semantic/index.ts +76 -2
  570. package/src/core/semantic/once.ts +93 -7
  571. package/src/core/semantic/prompt.ts +13 -1
  572. package/src/core/semantic/review.ts +803 -0
  573. package/src/core/semantic/routes.ts +30 -0
  574. package/src/core/semantic/scheduler.ts +49 -5
  575. package/src/core/semantic/service-status.ts +99 -5
  576. package/src/core/semantic/service.ts +116 -15
  577. package/src/core/semantic/soak.ts +638 -0
  578. package/src/core/semantic/storage.ts +20 -6
  579. package/src/core/semantic/usage.ts +272 -0
  580. package/src/core/semantic/validate.ts +31 -0
  581. package/src/core/storage/buffer.ts +124 -0
  582. package/src/core/storage/builtins.ts +916 -0
  583. package/src/core/storage/catalog.ts +467 -0
  584. package/src/core/storage/config.ts +423 -0
  585. package/src/core/storage/contract.ts +342 -0
  586. package/src/core/storage/durable-history.ts +738 -0
  587. package/src/core/storage/health.ts +76 -0
  588. package/src/core/storage/index.ts +15 -0
  589. package/src/core/storage/inventory.ts +859 -0
  590. package/src/core/storage/jsonl.ts +213 -0
  591. package/src/core/storage/log-retention.ts +555 -0
  592. package/src/core/storage/logger.ts +546 -0
  593. package/src/core/storage/maintenance-providers.ts +200 -0
  594. package/src/core/storage/maintenance.ts +929 -0
  595. package/src/core/storage/metrics.ts +199 -0
  596. package/src/core/storage/policy.ts +141 -0
  597. package/src/core/storage/process-log.ts +203 -0
  598. package/src/core/storage/query.ts +360 -0
  599. package/src/core/storage/receipts.ts +162 -0
  600. package/src/core/storage/segments.ts +721 -0
  601. package/src/core/storage/sink-graph.ts +343 -0
  602. package/src/core/storage/storm-control.ts +91 -0
  603. package/src/core/work/state.ts +12 -21
  604. package/src/core/workflow/live-session-v3.ts +2 -4
  605. package/src/index.ts +2 -0
  606. package/src/lazy-commands.ts +294 -0
  607. package/src/lib/docs-lint.ts +58 -77
  608. package/src/lib/docs-metadata-audit.ts +26 -21
  609. package/src/lib/docs-metadata-sync.ts +32 -9
  610. package/src/lib/docs-repository-view.ts +220 -0
  611. package/src/lib/http/client.ts +44 -8
  612. package/src/lib/http/index.ts +6 -1
  613. package/src/lib/indexer-exclusions.ts +173 -0
  614. package/src/lib/instructions/templates.ts +5 -0
  615. package/src/lib/local-file-url.ts +31 -0
  616. package/src/lib/web-performance.ts +335 -0
@@ -1,13 +1,15 @@
1
- import { resolveCoordRoot } from "../../agents/coord-client.js";
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { dirname, join, resolve } from "node:path";
2
4
  /**
3
- * The hooks-side name for THE coordination-root resolution.
5
+ * Resolve the coordination root from path evidence only.
4
6
  *
5
- * Delegates to `resolveCoordRoot()` so the hooks and the CLI cannot resolve
6
- * different roots. They used to: this walked up from `CLAUDE_PROJECT_DIR` or
7
- * cwd while the CLI's `monorepoRoot()` asked git for the superproject first, so
8
- * with a shell inside a submodule that carries its own `.harnery/`, the CLI's
9
- * `coord.status_observed` landed in a stream this side never read and rule 1/3
10
- * blocked every turn.
7
+ * This path-only resolver deliberately does not inspect live producer state.
8
+ * Code that reads or writes coordination authority must use
9
+ * `resolveCoordRoot()` from `agents/coord-client.ts`, which disambiguates
10
+ * nested coordination roots through the registered session. Keeping the two
11
+ * responsibilities separate lets configuration and other path-only consumers
12
+ * avoid loading the event recorder and its contract graph.
11
13
  *
12
14
  * Resolution precedence (see `resolveCoordRoot` for the full rationale):
13
15
  * 1. HARNERY_COORD_ROOT_OVERRIDE — explicit pin (tests, git hooks).
@@ -16,9 +18,88 @@ import { resolveCoordRoot } from "../../agents/coord-client.js";
16
18
  * submodules that may carry a `.harnery/` of their own (or none at all,
17
19
  * e.g. a journal dir under /tmp). The session's coordination home is the
18
20
  * project the adapter opened, not wherever the shell happens to sit.
19
- * 3. The root that already holds this session's heartbeat.
20
- * 4. The nearest enclosing `.harnery/`, then a git-derived root.
21
+ * 3. The nearest enclosing `.harnery/`.
22
+ * 4. A git-derived root when no `.harnery/` exists yet.
21
23
  */
22
24
  export function findCoordRoot(start = process.cwd()) {
23
- return resolveCoordRoot(start);
25
+ const rootOverride = process.env.HARNERY_COORD_ROOT_OVERRIDE;
26
+ if (rootOverride)
27
+ return rootOverride;
28
+ const projectDir = process.env.CLAUDE_PROJECT_DIR;
29
+ if (projectDir) {
30
+ const fromProject = nearestCoordRoot(projectDir);
31
+ if (fromProject)
32
+ return fromProject;
33
+ }
34
+ const nearest = nearestCoordRoot(start);
35
+ if (nearest)
36
+ return nearest;
37
+ return gitCoordRoots(start)[0] ?? gitToplevel(start);
24
38
  }
39
+ /** Nearest enclosing directory carrying `.harnery/`, or null. */
40
+ export function nearestCoordRoot(start) {
41
+ return ancestorCoordRoots(start)[0] ?? null;
42
+ }
43
+ /** Every enclosing directory carrying `.harnery/`, nearest first. */
44
+ export function ancestorCoordRoots(start) {
45
+ const found = [];
46
+ let dir = resolve(start);
47
+ while (true) {
48
+ if (existsSync(join(dir, ".harnery")))
49
+ found.push(dir);
50
+ const parent = dirname(dir);
51
+ if (parent === dir)
52
+ break;
53
+ dir = parent;
54
+ }
55
+ return found;
56
+ }
57
+ /**
58
+ * Git-derived roots carrying `.harnery/`, in superproject-first order.
59
+ *
60
+ * Spawns use `start` as cwd so a call about another checkout cannot inherit
61
+ * this process's repository. The common-dir fallback recovers a superproject
62
+ * from a submodule worktree, where Git reports no direct superproject path.
63
+ */
64
+ export function gitCoordRoots(start) {
65
+ const roots = [];
66
+ const push = (value) => {
67
+ if (value && existsSync(join(value, ".harnery")) && !roots.includes(value))
68
+ roots.push(value);
69
+ };
70
+ push(gitRevParse(start, "--show-superproject-working-tree"));
71
+ const common = gitRevParse(start, "--git-common-dir");
72
+ if (common) {
73
+ const index = common.indexOf("/.git/modules/");
74
+ if (index !== -1)
75
+ push(common.substring(0, index));
76
+ }
77
+ push(gitToplevel(start));
78
+ return roots;
79
+ }
80
+ export function gitToplevel(start) {
81
+ return gitRevParse(start, "--show-toplevel");
82
+ }
83
+ function gitRevParse(start, flag) {
84
+ const key = `${start}\0${flag}`;
85
+ const cached = gitRevParseCache.get(key);
86
+ if (cached !== undefined)
87
+ return cached;
88
+ let value = null;
89
+ try {
90
+ // A stale adapter project directory may no longer exist. Treat spawn
91
+ // failure as no path evidence instead of turning discovery into an error.
92
+ const result = spawnSync("git", ["rev-parse", flag], {
93
+ cwd: start,
94
+ encoding: "utf8",
95
+ });
96
+ if (result.status === 0)
97
+ value = result.stdout.trim() || null;
98
+ }
99
+ catch {
100
+ value = null;
101
+ }
102
+ gitRevParseCache.set(key, value);
103
+ return value;
104
+ }
105
+ const gitRevParseCache = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/owner.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,GAAG,iBAAiB,CAAC;CAC/E,GAAG,IAAI,CA4EP;AA2BD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAExF;AAED,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBnF"}
1
+ {"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/owner.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,GAAG,iBAAiB,CAAC;CAC/E,GAAG,IAAI,CAgFP;AA2BD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAExF;AAED,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBnF"}
@@ -38,6 +38,11 @@ export function resolveOwner(opts) {
38
38
  };
39
39
  const childId = value("subagent_id") ?? value("agent_id");
40
40
  const sessionId = value("session_id") ?? value("conversation_id");
41
+ // A payload with one unambiguous session identity needs no projection
42
+ // lookup. Live-authority tie-breaking matters only when the adapter also
43
+ // supplies a child candidate that could be stale or belong to the parent.
44
+ if (sessionId && !childId)
45
+ return { instance_id: sessionId, source: "payload" };
41
46
  const child = childId ? readLiveCoordinationRow(opts.coordRoot, childId) : null;
42
47
  const session = sessionId ? readLiveCoordinationRow(opts.coordRoot, sessionId) : null;
43
48
  if (child && sessionId && (child.kind === "subagent" || child.session_id === sessionId)) {
@@ -1,3 +1,4 @@
1
+ export declare const ASSISTANT_STATUS_BOX_PREFIX = "\u250C\u2500 agent-";
1
2
  /**
2
3
  * Scan a CC-style JSONL transcript for the `┌─ agent-` status-box prefix in
3
4
  * the most-recent assistant turn. Used by `turn.completed` events to populate
@@ -25,6 +26,13 @@ export declare function scanStatusBoxPresent(transcriptPath: string | undefined)
25
26
  * truncated JSON row, which the per-line parse guard skips.
26
27
  */
27
28
  export declare function scanAssistantTextIncludes(transcriptPath: string | undefined, needle: string): boolean;
29
+ /**
30
+ * Strict status-box evidence shared by turn telemetry and the Stop-time
31
+ * continuation fallback. Both inputs are assistant-only surfaces: the JSONL
32
+ * scanner rejects tool_result rows, while lastAssistantMessage comes directly
33
+ * from the adapter's completed assistant response.
34
+ */
35
+ export declare function scanAssistantStatusBoxPresent(transcriptPath: string | undefined, lastAssistantMessage: string | undefined): boolean;
28
36
  /** Most recent user-visible assistant text across Claude Code and Codex JSONL. */
29
37
  export declare function scanLatestAssistantText(transcriptPath: string | undefined): string | undefined;
30
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/transcript.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQhF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAiCT;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAgB9F;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CACjD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,OAAO,CAIT;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GACnB;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,oBAAoB,GAAG,sBAAsB,CAAA;CAAE,CAAC;AAEpF;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,4BAA4B,CA0B9B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAUrF;AAwDD;4CAC4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd;+EAC2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,qBAAqB,GAAG,SAAS,CA8BnC;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAkDpB"}
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/transcript.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,2BAA2B,wBAAc,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQhF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAiCT;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,oBAAoB,EAAE,MAAM,GAAG,SAAS,GACvC,OAAO,CAKT;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAgB9F;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CACjD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,OAAO,CAIT;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GACnB;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,oBAAoB,GAAG,sBAAsB,CAAA;CAAE,CAAC;AAEpF;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,4BAA4B,CA0B9B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAUrF;AAwDD;4CAC4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd;+EAC2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,qBAAqB,GAAG,SAAS,CA8BnC;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAkDpB"}
@@ -1,6 +1,7 @@
1
1
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
2
  import { basename, dirname, join } from "node:path";
3
3
  import { toolResponseMintedSessionName } from "../../agents/session-name-display.js";
4
+ export const ASSISTANT_STATUS_BOX_PREFIX = "┌─ agent-";
4
5
  /**
5
6
  * Scan a CC-style JSONL transcript for the `┌─ agent-` status-box prefix in
6
7
  * the most-recent assistant turn. Used by `turn.completed` events to populate
@@ -77,6 +78,16 @@ export function scanAssistantTextIncludes(transcriptPath, needle) {
77
78
  }
78
79
  return false;
79
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(transcriptPath, lastAssistantMessage) {
88
+ return (scanAssistantTextIncludes(transcriptPath, ASSISTANT_STATUS_BOX_PREFIX) ||
89
+ lastAssistantMessage?.includes(ASSISTANT_STATUS_BOX_PREFIX) === true);
90
+ }
80
91
  /** Most recent user-visible assistant text across Claude Code and Codex JSONL. */
81
92
  export function scanLatestAssistantText(transcriptPath) {
82
93
  const readablePath = resolveTranscriptPath(transcriptPath);
@@ -0,0 +1,64 @@
1
+ export declare const HARNERY_INBOX_RECORD_SCHEMA: "harnery.inbox-record/v1";
2
+ export declare const HARNERY_INBOX_STATUS_SCHEMA: "harnery.inbox-status/v1";
3
+ export interface HarneryInboxLimits {
4
+ max_message_body_bytes: number;
5
+ max_pending_count: number;
6
+ max_pending_bytes: number;
7
+ max_history_bytes: number;
8
+ max_history_records: number;
9
+ warning_pressure_ratio: number;
10
+ max_surface_count: number;
11
+ max_surface_bytes: number;
12
+ max_surface_tokens: number;
13
+ surfaced_grace_ms: number;
14
+ terminal_grace_ms: number;
15
+ }
16
+ export interface HarneryInboxMessageRecordV1 {
17
+ schema: typeof HARNERY_INBOX_RECORD_SCHEMA;
18
+ kind: "message";
19
+ message_id: string;
20
+ sender_instance_id: string;
21
+ sender_display_name: string;
22
+ recipient_instance_id: string;
23
+ recipient_display_name: string;
24
+ created_at: string;
25
+ body: string;
26
+ body_bytes: number;
27
+ }
28
+ export interface HarneryInboxSurfacedRecordV1 {
29
+ schema: typeof HARNERY_INBOX_RECORD_SCHEMA;
30
+ kind: "surfaced";
31
+ message_id: string;
32
+ surfaced_at: string;
33
+ }
34
+ export type HarneryInboxRecordV1 = HarneryInboxMessageRecordV1 | HarneryInboxSurfacedRecordV1;
35
+ export interface HarneryInboxStatusV1 {
36
+ schema: typeof HARNERY_INBOX_STATUS_SCHEMA;
37
+ recipient_instance_id: string;
38
+ pending_count: number;
39
+ pending_bytes: number;
40
+ total_history_bytes: number;
41
+ oldest_pending_at?: string;
42
+ pressure: "normal" | "warning" | "exhausted";
43
+ last_surface_at?: string;
44
+ last_compaction_at?: string;
45
+ }
46
+ export type HarneryInboxCapacityReason = "message_body_limit" | "pending_count_limit" | "pending_bytes_limit" | "history_bytes_limit";
47
+ export declare class HarneryInboxCapacityError extends Error {
48
+ readonly reason_code: HarneryInboxCapacityReason;
49
+ readonly current: number;
50
+ readonly limit: number;
51
+ constructor(reason_code: HarneryInboxCapacityReason, current: number, limit: number);
52
+ }
53
+ export interface HarneryInboxSurfaceBudget {
54
+ max_count: number;
55
+ max_bytes: number;
56
+ max_tokens: number;
57
+ }
58
+ export interface HarneryInboxSurfaceResult {
59
+ emitted: readonly HarneryInboxMessageRecordV1[];
60
+ remaining_pending_count: number;
61
+ remaining_pending_bytes: number;
62
+ repeated_after_crash_possible: true;
63
+ }
64
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/core/inbox/contract.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,EAAG,yBAAkC,CAAC;AAC9E,eAAO,MAAM,2BAA2B,EAAG,yBAAkC,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,2BAA2B,CAAC;IAC3C,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,OAAO,2BAA2B,CAAC;IAC3C,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,2BAA2B,GAAG,4BAA4B,CAAC;AAE9F,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,2BAA2B,CAAC;IAC3C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,0BAA0B,GAClC,oBAAoB,GACpB,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,qBAAa,yBAA0B,SAAQ,KAAK;IAEhD,QAAQ,CAAC,WAAW,EAAE,0BAA0B;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAFb,WAAW,EAAE,0BAA0B,EACvC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;CAMzB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAChD,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;IAChC,6BAA6B,EAAE,IAAI,CAAC;CACrC"}
@@ -0,0 +1,13 @@
1
+ export const HARNERY_INBOX_RECORD_SCHEMA = "harnery.inbox-record/v1";
2
+ export const HARNERY_INBOX_STATUS_SCHEMA = "harnery.inbox-status/v1";
3
+ export class HarneryInboxCapacityError extends Error {
4
+ reason_code;
5
+ current;
6
+ limit;
7
+ constructor(reason_code, current, limit) {
8
+ super(`inbox capacity ${reason_code}: ${current}/${limit}; use a managed artifact for larger payloads`);
9
+ this.reason_code = reason_code;
10
+ this.current = current;
11
+ this.limit = limit;
12
+ }
13
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./contract.js";
2
+ export * from "./lifecycle.js";
3
+ export * from "./service.js";
4
+ export * from "./watcher.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/inbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./contract.js";
2
+ export * from "./lifecycle.js";
3
+ export * from "./service.js";
4
+ export * from "./watcher.js";
@@ -0,0 +1,22 @@
1
+ import type { HarneryInboxLimits, HarneryInboxRecordV1 } from "./contract.js";
2
+ export declare const HARNERY_INBOX_COMPACTION_PLAN_SCHEMA: "harnery.inbox-compaction-plan/v1";
3
+ export type HarneryRecipientLifecycle = "active" | "resumable" | "terminal";
4
+ export interface HarneryInboxCompactionPlan {
5
+ schema: typeof HARNERY_INBOX_COMPACTION_PLAN_SCHEMA;
6
+ recipient_instance_id: string;
7
+ action: "none" | "compact-surfaced" | "prune-terminal";
8
+ reason_code: "pending_protected" | "active_recipient" | "surfaced_grace" | "terminal_grace" | "eligible";
9
+ remove_record_count: number;
10
+ retained_record_count: number;
11
+ protected_pending_count: number;
12
+ dry_run: true;
13
+ }
14
+ export declare function planInboxCompaction(input: {
15
+ recipient_instance_id: string;
16
+ records: readonly HarneryInboxRecordV1[];
17
+ lifecycle: HarneryRecipientLifecycle;
18
+ terminal_at?: string;
19
+ now: Date;
20
+ limits: HarneryInboxLimits;
21
+ }): HarneryInboxCompactionPlan;
22
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/core/inbox/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAG9E,eAAO,MAAM,oCAAoC,EAAG,kCAA2C,CAAC;AAEhG,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAE5E,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,OAAO,oCAAoC,CAAC;IACpD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;IACvD,WAAW,EACP,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,UAAU,CAAC;IACf,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,IAAI,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACzC,SAAS,EAAE,yBAAyB,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,kBAAkB,CAAC;CAC5B,GAAG,0BAA0B,CAqD7B"}
@@ -0,0 +1,41 @@
1
+ import { project } from "./service.js";
2
+ export const HARNERY_INBOX_COMPACTION_PLAN_SCHEMA = "harnery.inbox-compaction-plan/v1";
3
+ export function planInboxCompaction(input) {
4
+ const projection = project(input.records);
5
+ const surfacedAt = new Map();
6
+ for (const record of input.records) {
7
+ if (record.kind === "surfaced")
8
+ surfacedAt.set(record.message_id, Date.parse(record.surfaced_at));
9
+ }
10
+ const compactableIds = new Set([...surfacedAt]
11
+ .filter(([, timestamp]) => input.now.getTime() - timestamp >= input.limits.surfaced_grace_ms)
12
+ .map(([id]) => id));
13
+ const compactableRecords = input.records.filter((record) => compactableIds.has(record.message_id)).length;
14
+ if (input.lifecycle === "terminal") {
15
+ if (projection.pending.length > 0) {
16
+ return plan(input, "none", "pending_protected", 0, input.records.length, projection.pending.length);
17
+ }
18
+ const terminalAt = input.terminal_at ? Date.parse(input.terminal_at) : Number.NaN;
19
+ if (!Number.isFinite(terminalAt) ||
20
+ input.now.getTime() - terminalAt < input.limits.terminal_grace_ms) {
21
+ return plan(input, "none", "terminal_grace", 0, input.records.length, 0);
22
+ }
23
+ return plan(input, "prune-terminal", "eligible", input.records.length, 0, 0);
24
+ }
25
+ if (compactableRecords === 0) {
26
+ return plan(input, "none", surfacedAt.size > 0 ? "surfaced_grace" : "active_recipient", 0, input.records.length, projection.pending.length);
27
+ }
28
+ return plan(input, "compact-surfaced", "eligible", compactableRecords, input.records.length - compactableRecords, projection.pending.length);
29
+ }
30
+ function plan(input, action, reason_code, remove_record_count, retained_record_count, protected_pending_count) {
31
+ return {
32
+ schema: HARNERY_INBOX_COMPACTION_PLAN_SCHEMA,
33
+ recipient_instance_id: input.recipient_instance_id,
34
+ action,
35
+ reason_code,
36
+ remove_record_count,
37
+ retained_record_count,
38
+ protected_pending_count,
39
+ dry_run: true,
40
+ };
41
+ }
@@ -0,0 +1,36 @@
1
+ import { type HarneryInboxLimits, type HarneryInboxMessageRecordV1, type HarneryInboxRecordV1, type HarneryInboxStatusV1, type HarneryInboxSurfaceBudget, type HarneryInboxSurfaceResult } from "./contract.js";
2
+ export interface HarneryInboxServiceOptions {
3
+ coord_root: string;
4
+ limits: HarneryInboxLimits;
5
+ now?: () => Date;
6
+ id?: () => string;
7
+ }
8
+ export interface HarneryInboxSendInput {
9
+ sender_instance_id: string;
10
+ sender_display_name: string;
11
+ recipient_instance_id: string;
12
+ recipient_display_name: string;
13
+ body: string;
14
+ }
15
+ export interface HarneryInboxSendReceipt {
16
+ state: "queued";
17
+ message_id: string;
18
+ body_bytes: number;
19
+ synced: true;
20
+ }
21
+ export declare class HarneryInboxService {
22
+ #private;
23
+ constructor(options: HarneryInboxServiceOptions);
24
+ send(input: HarneryInboxSendInput): HarneryInboxSendReceipt;
25
+ records(recipientInstanceId: string): HarneryInboxRecordV1[];
26
+ pending(recipientInstanceId: string): HarneryInboxMessageRecordV1[];
27
+ status(recipientInstanceId: string): HarneryInboxStatusV1;
28
+ surface(recipientInstanceId: string, emit: (messages: readonly HarneryInboxMessageRecordV1[]) => Promise<void> | void, budget?: HarneryInboxSurfaceBudget): Promise<HarneryInboxSurfaceResult>;
29
+ }
30
+ export declare function inboxPath(coordRoot: string, recipientInstanceId: string): string;
31
+ export declare function project(records: readonly HarneryInboxRecordV1[]): {
32
+ pending: HarneryInboxMessageRecordV1[];
33
+ surfaced: ReadonlySet<string>;
34
+ lastSurfaceAt?: string;
35
+ };
36
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/inbox/service.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,QAAQ,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,IAAI,CAAC;CACd;AAED,qBAAa,mBAAmB;;gBAGlB,OAAO,EAAE,0BAA0B;IAK/C,IAAI,CAAC,KAAK,EAAE,qBAAqB,GAAG,uBAAuB;IA2C3D,OAAO,CAAC,mBAAmB,EAAE,MAAM,GAAG,oBAAoB,EAAE;IAO5D,OAAO,CAAC,mBAAmB,EAAE,MAAM,GAAG,2BAA2B,EAAE;IAInE,MAAM,CAAC,mBAAmB,EAAE,MAAM,GAAG,oBAAoB;IA0BnD,OAAO,CACX,mBAAmB,EAAE,MAAM,EAC3B,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,2BAA2B,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAChF,MAAM,GAAE,yBAIP,GACA,OAAO,CAAC,yBAAyB,CAAC;CAoCtC;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,GAAG;IACjE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACvC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAsBA"}
@@ -0,0 +1,210 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { existsSync, statSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { readCrashSafeJsonlFile, updateCrashSafeJsonlFile } from "../storage/durable-history.js";
5
+ import { HARNERY_INBOX_RECORD_SCHEMA, HARNERY_INBOX_STATUS_SCHEMA, HarneryInboxCapacityError, } from "./contract.js";
6
+ export class HarneryInboxService {
7
+ #options;
8
+ constructor(options) {
9
+ validateLimits(options.limits);
10
+ this.#options = options;
11
+ }
12
+ send(input) {
13
+ const recipient = opaqueId(input.recipient_instance_id, "recipient instance");
14
+ const bodyBytes = Buffer.byteLength(input.body);
15
+ const limits = this.#options.limits;
16
+ if (bodyBytes === 0 || bodyBytes > limits.max_message_body_bytes) {
17
+ throw new HarneryInboxCapacityError("message_body_limit", bodyBytes, limits.max_message_body_bytes);
18
+ }
19
+ const record = {
20
+ schema: HARNERY_INBOX_RECORD_SCHEMA,
21
+ kind: "message",
22
+ message_id: `msg_${this.#options.id?.() ?? randomUUID()}`,
23
+ sender_instance_id: opaqueId(input.sender_instance_id, "sender instance"),
24
+ sender_display_name: boundedDisplay(input.sender_display_name),
25
+ recipient_instance_id: recipient,
26
+ recipient_display_name: boundedDisplay(input.recipient_display_name),
27
+ created_at: now(this.#options).toISOString(),
28
+ body: input.body,
29
+ body_bytes: bodyBytes,
30
+ };
31
+ const path = inboxPath(this.#options.coord_root, recipient);
32
+ return updateCrashSafeJsonlFile(path, readOptions(limits), (records) => {
33
+ const projection = project(records);
34
+ capacityCheck(projection, record, path, limits);
35
+ return {
36
+ append: [record],
37
+ result: {
38
+ state: "queued",
39
+ message_id: record.message_id,
40
+ body_bytes: bodyBytes,
41
+ synced: true,
42
+ },
43
+ };
44
+ });
45
+ }
46
+ records(recipientInstanceId) {
47
+ return readCrashSafeJsonlFile(inboxPath(this.#options.coord_root, opaqueId(recipientInstanceId, "recipient instance")), readOptions(this.#options.limits));
48
+ }
49
+ pending(recipientInstanceId) {
50
+ return project(this.records(recipientInstanceId)).pending;
51
+ }
52
+ status(recipientInstanceId) {
53
+ const recipient = opaqueId(recipientInstanceId, "recipient instance");
54
+ const path = inboxPath(this.#options.coord_root, recipient);
55
+ const projection = project(this.records(recipient));
56
+ const pendingBytes = projection.pending.reduce((sum, record) => sum + record.body_bytes, 0);
57
+ const ratio = Math.max(projection.pending.length / this.#options.limits.max_pending_count, pendingBytes / this.#options.limits.max_pending_bytes);
58
+ return {
59
+ schema: HARNERY_INBOX_STATUS_SCHEMA,
60
+ recipient_instance_id: recipient,
61
+ pending_count: projection.pending.length,
62
+ pending_bytes: pendingBytes,
63
+ total_history_bytes: existsSync(path) ? statSync(path).size : 0,
64
+ ...(projection.pending[0] ? { oldest_pending_at: projection.pending[0].created_at } : {}),
65
+ pressure: ratio >= 1
66
+ ? "exhausted"
67
+ : ratio >= this.#options.limits.warning_pressure_ratio
68
+ ? "warning"
69
+ : "normal",
70
+ ...(projection.lastSurfaceAt ? { last_surface_at: projection.lastSurfaceAt } : {}),
71
+ };
72
+ }
73
+ async surface(recipientInstanceId, emit, budget = {
74
+ max_count: this.#options.limits.max_surface_count,
75
+ max_bytes: this.#options.limits.max_surface_bytes,
76
+ max_tokens: this.#options.limits.max_surface_tokens,
77
+ }) {
78
+ validateSurfaceBudget(budget);
79
+ const recipient = opaqueId(recipientInstanceId, "recipient instance");
80
+ const selected = selectOldestFitting(this.pending(recipient), budget);
81
+ await emit(selected);
82
+ if (selected.length > 0) {
83
+ const surfacedAt = now(this.#options).toISOString();
84
+ updateCrashSafeJsonlFile(inboxPath(this.#options.coord_root, recipient), readOptions(this.#options.limits), (records) => {
85
+ const stillPending = new Set(project(records).pending.map(({ message_id }) => message_id));
86
+ return {
87
+ append: selected
88
+ .filter(({ message_id }) => stillPending.has(message_id))
89
+ .map(({ message_id }) => ({
90
+ schema: HARNERY_INBOX_RECORD_SCHEMA,
91
+ kind: "surfaced",
92
+ message_id,
93
+ surfaced_at: surfacedAt,
94
+ })),
95
+ result: undefined,
96
+ };
97
+ });
98
+ }
99
+ const remaining = this.pending(recipient);
100
+ return {
101
+ emitted: selected,
102
+ remaining_pending_count: remaining.length,
103
+ remaining_pending_bytes: remaining.reduce((sum, record) => sum + record.body_bytes, 0),
104
+ repeated_after_crash_possible: true,
105
+ };
106
+ }
107
+ }
108
+ export function inboxPath(coordRoot, recipientInstanceId) {
109
+ const id = opaqueId(recipientInstanceId, "recipient instance");
110
+ return join(resolve(coordRoot), ".harnery", "inbox", `${id}.jsonl`);
111
+ }
112
+ export function project(records) {
113
+ const messages = new Map();
114
+ const surfaced = new Set();
115
+ let lastSurfaceAt;
116
+ for (const record of records) {
117
+ validateRecord(record);
118
+ if (record.kind === "message") {
119
+ if (messages.has(record.message_id))
120
+ throw new Error(`duplicate inbox message ${record.message_id}`);
121
+ messages.set(record.message_id, record);
122
+ }
123
+ else {
124
+ if (!messages.has(record.message_id))
125
+ throw new Error(`surfaced marker precedes ${record.message_id}`);
126
+ surfaced.add(record.message_id);
127
+ if (!lastSurfaceAt || record.surfaced_at > lastSurfaceAt)
128
+ lastSurfaceAt = record.surfaced_at;
129
+ }
130
+ }
131
+ return {
132
+ pending: [...messages.values()].filter(({ message_id }) => !surfaced.has(message_id)),
133
+ surfaced,
134
+ ...(lastSurfaceAt ? { lastSurfaceAt } : {}),
135
+ };
136
+ }
137
+ function selectOldestFitting(pending, budget) {
138
+ const selected = [];
139
+ let bytes = 0;
140
+ let tokens = 0;
141
+ for (const record of pending) {
142
+ const recordTokens = Math.ceil(record.body_bytes / 4);
143
+ if (selected.length >= budget.max_count ||
144
+ bytes + record.body_bytes > budget.max_bytes ||
145
+ tokens + recordTokens > budget.max_tokens) {
146
+ break;
147
+ }
148
+ selected.push(record);
149
+ bytes += record.body_bytes;
150
+ tokens += recordTokens;
151
+ }
152
+ return selected;
153
+ }
154
+ function capacityCheck(projection, record, path, limits) {
155
+ const pendingBytes = projection.pending.reduce((sum, item) => sum + item.body_bytes, 0);
156
+ if (projection.pending.length + 1 > limits.max_pending_count) {
157
+ throw new HarneryInboxCapacityError("pending_count_limit", projection.pending.length, limits.max_pending_count);
158
+ }
159
+ if (pendingBytes + record.body_bytes > limits.max_pending_bytes) {
160
+ throw new HarneryInboxCapacityError("pending_bytes_limit", pendingBytes, limits.max_pending_bytes);
161
+ }
162
+ const nextHistoryBytes = (existsSync(path) ? statSync(path).size : 0) + Buffer.byteLength(`${JSON.stringify(record)}\n`);
163
+ if (nextHistoryBytes > limits.max_history_bytes) {
164
+ throw new HarneryInboxCapacityError("history_bytes_limit", nextHistoryBytes, limits.max_history_bytes);
165
+ }
166
+ }
167
+ function readOptions(limits) {
168
+ return {
169
+ max_record_bytes: Math.max(limits.max_message_body_bytes * 2, 4_096),
170
+ max_records: limits.max_history_records,
171
+ };
172
+ }
173
+ function now(options) {
174
+ return options.now?.() ?? new Date();
175
+ }
176
+ function opaqueId(value, field) {
177
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/.test(value))
178
+ throw new Error(`invalid ${field} id`);
179
+ return value;
180
+ }
181
+ function boundedDisplay(value) {
182
+ const result = value.trim();
183
+ if (result.length === 0 || Buffer.byteLength(result) > 256)
184
+ throw new Error("invalid display name");
185
+ return result;
186
+ }
187
+ function validateRecord(record) {
188
+ if (record.schema !== HARNERY_INBOX_RECORD_SCHEMA)
189
+ throw new Error("unknown inbox record schema");
190
+ if (record.kind === "message" && Buffer.byteLength(record.body) !== record.body_bytes) {
191
+ throw new Error(`inbox message ${record.message_id} has invalid body_bytes`);
192
+ }
193
+ }
194
+ function validateLimits(limits) {
195
+ for (const [field, value] of Object.entries(limits)) {
196
+ if (field === "warning_pressure_ratio")
197
+ continue;
198
+ if (!Number.isSafeInteger(value) || value <= 0)
199
+ throw new Error(`invalid inbox limit ${field}`);
200
+ }
201
+ if (limits.warning_pressure_ratio <= 0 || limits.warning_pressure_ratio >= 1) {
202
+ throw new Error("warning_pressure_ratio must be between zero and one");
203
+ }
204
+ }
205
+ function validateSurfaceBudget(budget) {
206
+ for (const value of Object.values(budget)) {
207
+ if (!Number.isSafeInteger(value) || value <= 0)
208
+ throw new Error("invalid inbox surface budget");
209
+ }
210
+ }
@@ -0,0 +1,7 @@
1
+ import type { HarneryInboxMessageRecordV1 } from "./contract.js";
2
+ import type { HarneryInboxService } from "./service.js";
3
+ export declare function watchInbox(service: HarneryInboxService, recipientInstanceId: string, options: {
4
+ signal: AbortSignal;
5
+ poll_ms?: number;
6
+ }): AsyncGenerator<HarneryInboxMessageRecordV1>;
7
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/core/inbox/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,wBAAuB,UAAU,CAC/B,OAAO,EAAE,mBAAmB,EAC5B,mBAAmB,EAAE,MAAM,EAC3B,OAAO,EAAE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD,cAAc,CAAC,2BAA2B,CAAC,CAc7C"}
@@ -0,0 +1,26 @@
1
+ export async function* watchInbox(service, recipientInstanceId, options) {
2
+ const seen = new Set();
3
+ while (!options.signal.aborted) {
4
+ try {
5
+ for (const message of service.pending(recipientInstanceId)) {
6
+ if (seen.has(message.message_id))
7
+ continue;
8
+ seen.add(message.message_id);
9
+ yield message;
10
+ }
11
+ }
12
+ catch {
13
+ // A transient missing or incomplete source is retried; no cursor is advanced.
14
+ }
15
+ await delay(options.poll_ms ?? 250, options.signal);
16
+ }
17
+ }
18
+ function delay(ms, signal) {
19
+ return new Promise((resolve) => {
20
+ const timer = setTimeout(resolve, ms);
21
+ signal.addEventListener("abort", () => {
22
+ clearTimeout(timer);
23
+ resolve();
24
+ }, { once: true });
25
+ });
26
+ }