harnery 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (665) hide show
  1. package/README.md +2 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +7 -1
  4. package/dist/commands/adapter.js +2 -2
  5. package/dist/commands/agents.d.ts +144 -1
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +1408 -565
  8. package/dist/commands/artifacts.d.ts.map +1 -1
  9. package/dist/commands/artifacts.js +7 -6
  10. package/dist/commands/backup.d.ts +1 -1
  11. package/dist/commands/backup.d.ts.map +1 -1
  12. package/dist/commands/backup.js +29 -16
  13. package/dist/commands/browse.d.ts.map +1 -1
  14. package/dist/commands/browse.js +234 -12
  15. package/dist/commands/checkpoint.d.ts.map +1 -1
  16. package/dist/commands/checkpoint.js +3 -2
  17. package/dist/commands/claude-desktop.d.ts +2 -2
  18. package/dist/commands/claude-desktop.d.ts.map +1 -1
  19. package/dist/commands/claude-desktop.js +2 -2
  20. package/dist/commands/context.js +1 -6
  21. package/dist/commands/decision.d.ts.map +1 -1
  22. package/dist/commands/decision.js +22 -38
  23. package/dist/commands/docs.d.ts.map +1 -1
  24. package/dist/commands/docs.js +91 -28
  25. package/dist/commands/doctor.d.ts +4 -2
  26. package/dist/commands/doctor.d.ts.map +1 -1
  27. package/dist/commands/doctor.js +55 -7
  28. package/dist/commands/events.d.ts +5 -0
  29. package/dist/commands/events.d.ts.map +1 -0
  30. package/dist/commands/events.js +189 -0
  31. package/dist/commands/governor.d.ts.map +1 -1
  32. package/dist/commands/governor.js +13 -4
  33. package/dist/commands/init.d.ts +10 -2
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +233 -51
  36. package/dist/commands/instructions.d.ts +4 -0
  37. package/dist/commands/instructions.d.ts.map +1 -0
  38. package/dist/commands/instructions.js +100 -0
  39. package/dist/commands/journal.d.ts.map +1 -1
  40. package/dist/commands/journal.js +4 -13
  41. package/dist/commands/ledger-v3.d.ts +5 -0
  42. package/dist/commands/ledger-v3.d.ts.map +1 -0
  43. package/dist/commands/ledger-v3.js +91 -0
  44. package/dist/commands/presence.d.ts.map +1 -1
  45. package/dist/commands/presence.js +15 -6
  46. package/dist/commands/sync.d.ts +1 -1
  47. package/dist/commands/sync.js +1 -1
  48. package/dist/commands/web.d.ts +6 -0
  49. package/dist/commands/web.d.ts.map +1 -1
  50. package/dist/commands/web.js +67 -7
  51. package/dist/commands/work.d.ts.map +1 -1
  52. package/dist/commands/work.js +22 -5
  53. package/dist/core/adapter.d.ts +5 -0
  54. package/dist/core/adapter.d.ts.map +1 -0
  55. package/dist/core/adapter.js +1 -0
  56. package/dist/core/adapters/attest.d.ts +5 -2
  57. package/dist/core/adapters/attest.d.ts.map +1 -1
  58. package/dist/core/adapters/attest.js +8 -3
  59. package/dist/core/adapters/profiles.d.ts +6 -6
  60. package/dist/core/adapters/profiles.d.ts.map +1 -1
  61. package/dist/core/adapters/profiles.js +4 -4
  62. package/dist/core/agents/canonical-emit.d.ts +17 -15
  63. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  64. package/dist/core/agents/canonical-emit.js +27 -25
  65. package/dist/core/agents/cli.js +212 -235
  66. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  67. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  68. package/dist/core/agents/codex-archive-v3.js +110 -0
  69. package/dist/core/agents/coord-client.d.ts +19 -70
  70. package/dist/core/agents/coord-client.d.ts.map +1 -1
  71. package/dist/core/agents/coord-client.js +65 -155
  72. package/dist/core/agents/finalization.d.ts +4 -1
  73. package/dist/core/agents/finalization.d.ts.map +1 -1
  74. package/dist/core/agents/finalization.js +89 -32
  75. package/dist/core/agents/index.d.ts +5 -5
  76. package/dist/core/agents/index.d.ts.map +1 -1
  77. package/dist/core/agents/index.js +5 -5
  78. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  79. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-authority-v3.js +233 -0
  81. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  82. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  83. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  84. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  85. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  86. package/dist/core/agents/live-observation-v3.js +157 -0
  87. package/dist/core/agents/render/prompt-context.d.ts +10 -4
  88. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  89. package/dist/core/agents/render/prompt-context.js +61 -55
  90. package/dist/core/agents/render/session-context.d.ts +1 -1
  91. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  92. package/dist/core/agents/render/session-context.js +15 -33
  93. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  94. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  95. package/dist/core/agents/rules/claim-conflict.js +79 -127
  96. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  97. package/dist/core/agents/rules/commit-conflict.js +3 -18
  98. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  99. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  100. package/dist/core/agents/rules/stop-hook.js +193 -236
  101. package/dist/core/agents/session-events.d.ts +5 -7
  102. package/dist/core/agents/session-events.d.ts.map +1 -1
  103. package/dist/core/agents/session-events.js +127 -95
  104. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  105. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  106. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  107. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  108. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  109. package/dist/core/agents/session-finalizer-v3.js +734 -0
  110. package/dist/core/agents/session-name-display.d.ts +40 -0
  111. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  112. package/dist/core/agents/session-name-display.js +119 -0
  113. package/dist/core/agents/state/activity-log.d.ts +3 -3
  114. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  115. package/dist/core/agents/state/activity-log.js +7 -16
  116. package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
  117. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  118. package/dist/core/agents/state/heartbeat-writer.js +59 -199
  119. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  120. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  121. package/dist/core/agents/state/live-coordination-view.js +209 -0
  122. package/dist/core/agents/state/session-state.d.ts +45 -0
  123. package/dist/core/agents/state/session-state.d.ts.map +1 -0
  124. package/dist/core/agents/state/session-state.js +90 -0
  125. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  126. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  127. package/dist/core/agents/state/stale-sweep.js +26 -15
  128. package/dist/core/artifacts/index.d.ts.map +1 -1
  129. package/dist/core/artifacts/index.js +5 -7
  130. package/dist/core/config.d.ts +33 -2
  131. package/dist/core/config.d.ts.map +1 -1
  132. package/dist/core/config.js +98 -2
  133. package/dist/core/context/index.d.ts +1 -4
  134. package/dist/core/context/index.d.ts.map +1 -1
  135. package/dist/core/context/index.js +9 -9
  136. package/dist/core/events/span-parent.d.ts +15 -0
  137. package/dist/core/events/span-parent.d.ts.map +1 -0
  138. package/dist/core/events/span-parent.js +34 -0
  139. package/dist/core/events/v3/advance.d.ts +14 -0
  140. package/dist/core/events/v3/advance.d.ts.map +1 -0
  141. package/dist/core/events/v3/advance.js +134 -0
  142. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  143. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  144. package/dist/core/events/v3/authority-outbox.js +399 -0
  145. package/dist/core/events/v3/base-builder.d.ts +20 -0
  146. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  147. package/dist/core/events/v3/base-builder.js +29 -0
  148. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  149. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  150. package/dist/core/events/v3/base-contract.js +647 -0
  151. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  152. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  153. package/dist/core/events/v3/bootstrap.js +175 -0
  154. package/dist/core/events/v3/builder.d.ts +20 -0
  155. package/dist/core/events/v3/builder.d.ts.map +1 -0
  156. package/dist/core/events/v3/builder.js +28 -0
  157. package/dist/core/events/v3/canonical.d.ts +31 -0
  158. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  159. package/dist/core/events/v3/canonical.js +100 -0
  160. package/dist/core/events/v3/capabilities.d.ts +31 -0
  161. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  162. package/dist/core/events/v3/capabilities.js +107 -0
  163. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  164. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  165. package/dist/core/events/v3/capability-drift.js +134 -0
  166. package/dist/core/events/v3/catalog.d.ts +38 -0
  167. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  168. package/dist/core/events/v3/catalog.js +135 -0
  169. package/dist/core/events/v3/clock-order.d.ts +34 -0
  170. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  171. package/dist/core/events/v3/clock-order.js +35 -0
  172. package/dist/core/events/v3/contract.d.ts +171 -0
  173. package/dist/core/events/v3/contract.d.ts.map +1 -0
  174. package/dist/core/events/v3/contract.js +180 -0
  175. package/dist/core/events/v3/control.d.ts +111 -0
  176. package/dist/core/events/v3/control.d.ts.map +1 -0
  177. package/dist/core/events/v3/control.js +419 -0
  178. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  179. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/coordination-view.js +119 -0
  181. package/dist/core/events/v3/economics.d.ts +77 -0
  182. package/dist/core/events/v3/economics.d.ts.map +1 -0
  183. package/dist/core/events/v3/economics.js +274 -0
  184. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  185. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  186. package/dist/core/events/v3/finalization-view.js +37 -0
  187. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  188. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  189. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  190. package/dist/core/events/v3/generated.d.ts +4 -0
  191. package/dist/core/events/v3/generated.d.ts.map +1 -0
  192. package/dist/core/events/v3/generated.js +47 -0
  193. package/dist/core/events/v3/ids.d.ts +9 -0
  194. package/dist/core/events/v3/ids.d.ts.map +1 -0
  195. package/dist/core/events/v3/ids.js +25 -0
  196. package/dist/core/events/v3/index.d.ts +35 -0
  197. package/dist/core/events/v3/index.d.ts.map +1 -0
  198. package/dist/core/events/v3/index.js +33 -0
  199. package/dist/core/events/v3/latency.d.ts +63 -0
  200. package/dist/core/events/v3/latency.d.ts.map +1 -0
  201. package/dist/core/events/v3/latency.js +412 -0
  202. package/dist/core/events/v3/live-feed.d.ts +45 -0
  203. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-feed.js +246 -0
  205. package/dist/core/events/v3/live-observation.d.ts +35 -0
  206. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  207. package/dist/core/events/v3/live-observation.js +1 -0
  208. package/dist/core/events/v3/live-routing.d.ts +57 -0
  209. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  210. package/dist/core/events/v3/live-routing.js +107 -0
  211. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  212. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  214. package/dist/core/events/v3/producers/command.d.ts +50 -0
  215. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/command.js +135 -0
  217. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  218. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  220. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  221. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/coordination.js +229 -0
  223. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  224. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/hook-base.js +424 -0
  226. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  227. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/hook.js +71 -0
  229. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  231. package/dist/core/events/v3/producers/intake.js +244 -0
  232. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  233. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/recorder.js +2176 -0
  235. package/dist/core/events/v3/projection.d.ts +101 -0
  236. package/dist/core/events/v3/projection.d.ts.map +1 -0
  237. package/dist/core/events/v3/projection.js +479 -0
  238. package/dist/core/events/v3/reader.d.ts +75 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -0
  240. package/dist/core/events/v3/reader.js +778 -0
  241. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  242. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  243. package/dist/core/events/v3/recovery-record.js +167 -0
  244. package/dist/core/events/v3/recovery.d.ts +22 -0
  245. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  246. package/dist/core/events/v3/recovery.js +227 -0
  247. package/dist/core/events/v3/span-state.d.ts +52 -0
  248. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  249. package/dist/core/events/v3/span-state.js +142 -0
  250. package/dist/core/events/v3/targets.d.ts +23 -0
  251. package/dist/core/events/v3/targets.d.ts.map +1 -0
  252. package/dist/core/events/v3/targets.js +134 -0
  253. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  254. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  255. package/dist/core/events/v3/turn-telemetry.js +168 -0
  256. package/dist/core/events/v3/validate.d.ts +9 -0
  257. package/dist/core/events/v3/validate.d.ts.map +1 -0
  258. package/dist/core/events/v3/validate.js +281 -0
  259. package/dist/core/events/v3/writer.d.ts +56 -0
  260. package/dist/core/events/v3/writer.d.ts.map +1 -0
  261. package/dist/core/events/v3/writer.js +335 -0
  262. package/dist/core/governor/index.d.ts +1 -1
  263. package/dist/core/governor/index.d.ts.map +1 -1
  264. package/dist/core/governor/index.js +1 -1
  265. package/dist/core/governor/plan-api.d.ts +2 -1
  266. package/dist/core/governor/plan-api.d.ts.map +1 -1
  267. package/dist/core/governor/plan-api.js +6 -3
  268. package/dist/core/governor/read.d.ts +1 -1
  269. package/dist/core/governor/read.d.ts.map +1 -1
  270. package/dist/core/governor/read.js +1 -1
  271. package/dist/core/governor/state.d.ts +9 -0
  272. package/dist/core/governor/state.d.ts.map +1 -1
  273. package/dist/core/governor/state.js +40 -3
  274. package/dist/core/guard/config.d.ts +5 -0
  275. package/dist/core/guard/config.d.ts.map +1 -0
  276. package/dist/core/guard/config.js +157 -0
  277. package/dist/core/guard/coordinator.d.ts +14 -0
  278. package/dist/core/guard/coordinator.d.ts.map +1 -0
  279. package/dist/core/guard/coordinator.js +173 -0
  280. package/dist/core/guard/evaluator.d.ts +4 -0
  281. package/dist/core/guard/evaluator.d.ts.map +1 -0
  282. package/dist/core/guard/evaluator.js +242 -0
  283. package/dist/core/guard/evidence-v3.d.ts +15 -0
  284. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  285. package/dist/core/guard/evidence-v3.js +171 -0
  286. package/dist/core/guard/index.d.ts +10 -0
  287. package/dist/core/guard/index.d.ts.map +1 -0
  288. package/dist/core/guard/index.js +6 -0
  289. package/dist/core/guard/live-source-v3.d.ts +40 -0
  290. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  291. package/dist/core/guard/live-source-v3.js +128 -0
  292. package/dist/core/guard/storage.d.ts +27 -0
  293. package/dist/core/guard/storage.d.ts.map +1 -0
  294. package/dist/core/guard/storage.js +140 -0
  295. package/dist/core/guard/types.d.ts +119 -0
  296. package/dist/core/guard/types.d.ts.map +1 -0
  297. package/dist/core/guard/types.js +1 -0
  298. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  299. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/detect.js +29 -0
  301. package/dist/core/hooks/adapter/events.d.ts +7 -4
  302. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  303. package/dist/core/hooks/adapter/events.js +13 -4
  304. package/dist/core/hooks/adapter/output.d.ts +2 -2
  305. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  306. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  307. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  308. package/dist/core/hooks/adapter/parse.js +64 -24
  309. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  310. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  311. package/dist/core/hooks/adapter/wiring.js +89 -11
  312. package/dist/core/hooks/cli.d.ts +1 -1
  313. package/dist/core/hooks/cli.js +345 -400
  314. package/dist/core/hooks/codex-authorization.d.ts +30 -0
  315. package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
  316. package/dist/core/hooks/codex-authorization.js +199 -0
  317. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  318. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  319. package/dist/core/hooks/effects/image-capture.js +212 -221
  320. package/dist/core/hooks/effects/index.d.ts +1 -9
  321. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  322. package/dist/core/hooks/effects/index.js +1 -24
  323. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  324. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  325. package/dist/core/hooks/events/input-hash.js +43 -0
  326. package/dist/core/hooks/index.d.ts +4 -3
  327. package/dist/core/hooks/index.d.ts.map +1 -1
  328. package/dist/core/hooks/index.js +2 -3
  329. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  330. package/dist/core/hooks/resolve/coord-root.js +1 -1
  331. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  332. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  333. package/dist/core/hooks/resolve/owner.js +51 -42
  334. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  335. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  336. package/dist/core/hooks/resolve/transcript.js +155 -14
  337. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  338. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  339. package/dist/core/hooks/session-name-presence.js +15 -15
  340. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  341. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  342. package/dist/core/journal/index.d.ts +2 -2
  343. package/dist/core/journal/index.d.ts.map +1 -1
  344. package/dist/core/journal/index.js +9 -22
  345. package/dist/core/presence/blob.d.ts +8 -3
  346. package/dist/core/presence/blob.d.ts.map +1 -1
  347. package/dist/core/presence/blob.js +54 -41
  348. package/dist/core/presence/codec-digest.d.ts +29 -0
  349. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  350. package/dist/core/presence/codec-digest.js +170 -0
  351. package/dist/core/presence/index.js +15 -1
  352. package/dist/core/presence/relay-client.d.ts +1 -1
  353. package/dist/core/presence/relay-client.d.ts.map +1 -1
  354. package/dist/core/presence/relay-client.js +5 -5
  355. package/dist/core/work/index.d.ts +1 -1
  356. package/dist/core/work/index.d.ts.map +1 -1
  357. package/dist/core/work/index.js +1 -1
  358. package/dist/core/work/read.d.ts +1 -1
  359. package/dist/core/work/read.d.ts.map +1 -1
  360. package/dist/core/work/read.js +1 -1
  361. package/dist/core/work/runner.d.ts.map +1 -1
  362. package/dist/core/work/runner.js +6 -0
  363. package/dist/core/work/state.d.ts +9 -0
  364. package/dist/core/work/state.d.ts.map +1 -1
  365. package/dist/core/work/state.js +17 -3
  366. package/dist/core/workflow/engine.js +24 -25
  367. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  368. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  369. package/dist/core/workflow/live-session-v3.js +86 -0
  370. package/dist/core/workflow/scope-id.d.ts +3 -0
  371. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  372. package/dist/core/workflow/scope-id.js +5 -0
  373. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  374. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  375. package/dist/core/workflow/workspaces/leases.js +53 -19
  376. package/dist/index.d.ts +1 -1
  377. package/dist/index.js +1 -1
  378. package/dist/lib/browser/client.d.ts +41 -0
  379. package/dist/lib/browser/client.d.ts.map +1 -1
  380. package/dist/lib/browser/client.js +203 -0
  381. package/dist/lib/browser/critique.d.ts +28 -2
  382. package/dist/lib/browser/critique.d.ts.map +1 -1
  383. package/dist/lib/browser/critique.js +74 -18
  384. package/dist/lib/browser/geometry.d.ts +1 -1
  385. package/dist/lib/browser/geometry.d.ts.map +1 -1
  386. package/dist/lib/browser/geometry.js +130 -6
  387. package/dist/lib/browser/index.d.ts +3 -0
  388. package/dist/lib/browser/index.d.ts.map +1 -1
  389. package/dist/lib/browser/index.js +3 -0
  390. package/dist/lib/browser/qa-plan.d.ts +174 -0
  391. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  392. package/dist/lib/browser/qa-plan.js +321 -0
  393. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  394. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  395. package/dist/lib/browser/qa-reuse.js +222 -0
  396. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  397. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  398. package/dist/lib/browser/qa-snapshot.js +171 -0
  399. package/dist/lib/browser/runts.d.ts.map +1 -1
  400. package/dist/lib/browser/runts.js +22 -1
  401. package/dist/lib/browser/tiling.d.ts +71 -0
  402. package/dist/lib/browser/tiling.d.ts.map +1 -0
  403. package/dist/lib/browser/tiling.js +118 -0
  404. package/dist/lib/context/index.d.ts +0 -3
  405. package/dist/lib/context/index.d.ts.map +1 -1
  406. package/dist/lib/context/index.js +20 -42
  407. package/dist/lib/council/index.d.ts +2 -2
  408. package/dist/lib/council/index.d.ts.map +1 -1
  409. package/dist/lib/council/index.js +9 -20
  410. package/dist/lib/docs-frontmatter.d.ts +1 -6
  411. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  412. package/dist/lib/docs-frontmatter.js +12 -78
  413. package/dist/lib/docs-index.d.ts +9 -0
  414. package/dist/lib/docs-index.d.ts.map +1 -1
  415. package/dist/lib/docs-index.js +32 -3
  416. package/dist/lib/docs-lint.d.ts.map +1 -1
  417. package/dist/lib/docs-lint.js +14 -30
  418. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  419. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  420. package/dist/lib/docs-metadata-audit.js +132 -0
  421. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  422. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  423. package/dist/lib/docs-metadata-managed.js +78 -0
  424. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  425. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  426. package/dist/lib/docs-metadata-sync.js +222 -0
  427. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  428. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  429. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  430. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  431. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  432. package/dist/lib/docs-metadata-v2.js +424 -0
  433. package/dist/lib/docs-new.d.ts +11 -0
  434. package/dist/lib/docs-new.d.ts.map +1 -0
  435. package/dist/lib/docs-new.js +52 -0
  436. package/dist/lib/docs-sweep.d.ts.map +1 -1
  437. package/dist/lib/docs-sweep.js +45 -29
  438. package/dist/lib/headless/index.d.ts +98 -0
  439. package/dist/lib/headless/index.d.ts.map +1 -0
  440. package/dist/lib/headless/index.js +211 -0
  441. package/dist/lib/identities/assume.d.ts +4 -4
  442. package/dist/lib/identities/assume.d.ts.map +1 -1
  443. package/dist/lib/identities/assume.js +52 -68
  444. package/dist/lib/instructions/apply.d.ts +5 -4
  445. package/dist/lib/instructions/apply.d.ts.map +1 -1
  446. package/dist/lib/instructions/apply.js +32 -20
  447. package/dist/lib/instructions/bundle.d.ts +33 -0
  448. package/dist/lib/instructions/bundle.d.ts.map +1 -0
  449. package/dist/lib/instructions/bundle.js +149 -0
  450. package/dist/lib/instructions/splice.d.ts +0 -1
  451. package/dist/lib/instructions/splice.d.ts.map +1 -1
  452. package/dist/lib/instructions/splice.js +22 -6
  453. package/dist/lib/instructions/templates.d.ts +7 -5
  454. package/dist/lib/instructions/templates.d.ts.map +1 -1
  455. package/dist/lib/instructions/templates.js +79 -9
  456. package/package.json +27 -6
  457. package/schemas/config.schema.json +120 -2
  458. package/schemas/docs-metadata-v2.schema.json +441 -0
  459. package/schemas/event-v3.schema.json +24472 -0
  460. package/src/commander.ts +7 -1
  461. package/src/commands/adapter.ts +2 -2
  462. package/src/commands/agents.ts +1737 -570
  463. package/src/commands/artifacts.ts +7 -6
  464. package/src/commands/backup.ts +29 -21
  465. package/src/commands/browse.ts +349 -8
  466. package/src/commands/checkpoint.ts +4 -3
  467. package/src/commands/claude-desktop.ts +7 -5
  468. package/src/commands/context.ts +1 -6
  469. package/src/commands/decision.ts +27 -44
  470. package/src/commands/docs.ts +100 -33
  471. package/src/commands/doctor.ts +73 -8
  472. package/src/commands/events.ts +256 -0
  473. package/src/commands/governor.ts +18 -4
  474. package/src/commands/init.ts +264 -57
  475. package/src/commands/instructions.ts +129 -0
  476. package/src/commands/journal.ts +4 -13
  477. package/src/commands/ledger-v3.ts +111 -0
  478. package/src/commands/presence.ts +18 -11
  479. package/src/commands/sync.ts +1 -1
  480. package/src/commands/web.ts +67 -8
  481. package/src/commands/work.ts +28 -5
  482. package/src/core/adapter.ts +5 -0
  483. package/src/core/adapters/attest.ts +8 -3
  484. package/src/core/adapters/profiles.ts +4 -6
  485. package/src/core/agents/canonical-emit.ts +39 -28
  486. package/src/core/agents/cli.ts +242 -263
  487. package/src/core/agents/codex-archive-v3.ts +138 -0
  488. package/src/core/agents/coord-client.ts +75 -177
  489. package/src/core/agents/finalization.ts +120 -38
  490. package/src/core/agents/index.ts +5 -5
  491. package/src/core/agents/live-authority-v3.ts +375 -0
  492. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  493. package/src/core/agents/live-observation-v3.ts +216 -0
  494. package/src/core/agents/render/prompt-context.ts +89 -55
  495. package/src/core/agents/render/session-context.ts +23 -32
  496. package/src/core/agents/rules/claim-conflict.ts +85 -126
  497. package/src/core/agents/rules/commit-conflict.ts +3 -14
  498. package/src/core/agents/rules/stop-hook.ts +239 -293
  499. package/src/core/agents/session-events.ts +137 -104
  500. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  501. package/src/core/agents/session-finalizer-v3.ts +953 -0
  502. package/src/core/agents/session-name-display.ts +149 -0
  503. package/src/core/agents/state/activity-log.ts +6 -14
  504. package/src/core/agents/state/heartbeat-writer.ts +98 -242
  505. package/src/core/agents/state/live-coordination-view.ts +290 -0
  506. package/src/core/agents/state/session-state.ts +143 -0
  507. package/src/core/agents/state/stale-sweep.ts +40 -17
  508. package/src/core/artifacts/index.ts +4 -5
  509. package/src/core/config.ts +148 -3
  510. package/src/core/context/index.ts +9 -17
  511. package/src/core/events/span-parent.ts +46 -0
  512. package/src/core/events/v3/advance.ts +168 -0
  513. package/src/core/events/v3/authority-outbox.ts +548 -0
  514. package/src/core/events/v3/base-builder.ts +60 -0
  515. package/src/core/events/v3/base-contract.ts +882 -0
  516. package/src/core/events/v3/bootstrap.ts +226 -0
  517. package/src/core/events/v3/builder.ts +59 -0
  518. package/src/core/events/v3/canonical.ts +153 -0
  519. package/src/core/events/v3/capabilities.ts +171 -0
  520. package/src/core/events/v3/capability-drift.ts +177 -0
  521. package/src/core/events/v3/catalog.ts +202 -0
  522. package/src/core/events/v3/clock-order.ts +41 -0
  523. package/src/core/events/v3/contract.ts +365 -0
  524. package/src/core/events/v3/control.ts +576 -0
  525. package/src/core/events/v3/coordination-view.ts +193 -0
  526. package/src/core/events/v3/economics.ts +384 -0
  527. package/src/core/events/v3/finalization-view.ts +67 -0
  528. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  529. package/src/core/events/v3/generated.ts +48 -0
  530. package/src/core/events/v3/ids.ts +33 -0
  531. package/src/core/events/v3/index.ts +322 -0
  532. package/src/core/events/v3/latency.ts +551 -0
  533. package/src/core/events/v3/live-feed.ts +319 -0
  534. package/src/core/events/v3/live-observation.ts +39 -0
  535. package/src/core/events/v3/live-routing.ts +135 -0
  536. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  537. package/src/core/events/v3/producers/command.ts +201 -0
  538. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  539. package/src/core/events/v3/producers/coordination.ts +355 -0
  540. package/src/core/events/v3/producers/hook-base.ts +578 -0
  541. package/src/core/events/v3/producers/hook.ts +119 -0
  542. package/src/core/events/v3/producers/intake.ts +319 -0
  543. package/src/core/events/v3/producers/recorder.ts +2805 -0
  544. package/src/core/events/v3/projection.ts +653 -0
  545. package/src/core/events/v3/reader.ts +1127 -0
  546. package/src/core/events/v3/recovery-record.ts +244 -0
  547. package/src/core/events/v3/recovery.ts +271 -0
  548. package/src/core/events/v3/span-state.ts +187 -0
  549. package/src/core/events/v3/targets.ts +182 -0
  550. package/src/core/events/v3/turn-telemetry.ts +259 -0
  551. package/src/core/events/v3/validate.ts +361 -0
  552. package/src/core/events/v3/writer.ts +419 -0
  553. package/src/core/governor/index.ts +3 -0
  554. package/src/core/governor/plan-api.ts +10 -2
  555. package/src/core/governor/read.ts +3 -0
  556. package/src/core/governor/state.ts +52 -5
  557. package/src/core/guard/config.ts +206 -0
  558. package/src/core/guard/coordinator.ts +227 -0
  559. package/src/core/guard/evaluator.ts +343 -0
  560. package/src/core/guard/evidence-v3.ts +227 -0
  561. package/src/core/guard/index.ts +35 -0
  562. package/src/core/guard/live-source-v3.ts +204 -0
  563. package/src/core/guard/storage.ts +188 -0
  564. package/src/core/guard/types.ts +152 -0
  565. package/src/core/hooks/adapter/detect.ts +28 -1
  566. package/src/core/hooks/adapter/events.ts +15 -6
  567. package/src/core/hooks/adapter/output.ts +7 -2
  568. package/src/core/hooks/adapter/parse.ts +81 -36
  569. package/src/core/hooks/adapter/wiring.ts +119 -13
  570. package/src/core/hooks/cli.ts +398 -422
  571. package/src/core/hooks/codex-authorization.ts +253 -0
  572. package/src/core/hooks/effects/image-capture.ts +228 -238
  573. package/src/core/hooks/effects/index.ts +1 -36
  574. package/src/core/hooks/events/input-hash.ts +47 -0
  575. package/src/core/hooks/index.ts +4 -11
  576. package/src/core/hooks/resolve/coord-root.ts +1 -1
  577. package/src/core/hooks/resolve/owner.ts +52 -45
  578. package/src/core/hooks/resolve/transcript.ts +165 -14
  579. package/src/core/hooks/session-name-presence.ts +14 -15
  580. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  581. package/src/core/journal/index.ts +15 -22
  582. package/src/core/presence/blob.ts +63 -38
  583. package/src/core/presence/codec-digest.ts +215 -0
  584. package/src/core/presence/index.ts +18 -1
  585. package/src/core/presence/relay-client.ts +5 -5
  586. package/src/core/work/index.ts +3 -0
  587. package/src/core/work/read.ts +3 -0
  588. package/src/core/work/runner.ts +6 -0
  589. package/src/core/work/state.ts +27 -3
  590. package/src/core/workflow/engine.ts +24 -24
  591. package/src/core/workflow/live-session-v3.ts +126 -0
  592. package/src/core/workflow/scope-id.ts +6 -0
  593. package/src/core/workflow/workspaces/leases.ts +56 -19
  594. package/src/index.ts +1 -1
  595. package/src/lib/browser/client.ts +230 -0
  596. package/src/lib/browser/critique.ts +104 -27
  597. package/src/lib/browser/geometry.ts +143 -14
  598. package/src/lib/browser/index.ts +34 -0
  599. package/src/lib/browser/qa-plan.ts +501 -0
  600. package/src/lib/browser/qa-reuse.ts +306 -0
  601. package/src/lib/browser/qa-snapshot.ts +223 -0
  602. package/src/lib/browser/runts.ts +27 -2
  603. package/src/lib/browser/tiling.ts +164 -0
  604. package/src/lib/context/index.ts +22 -46
  605. package/src/lib/council/index.ts +9 -21
  606. package/src/lib/docs-frontmatter.ts +8 -79
  607. package/src/lib/docs-index.ts +33 -3
  608. package/src/lib/docs-lint.ts +15 -29
  609. package/src/lib/docs-metadata-audit.ts +166 -0
  610. package/src/lib/docs-metadata-managed.ts +83 -0
  611. package/src/lib/docs-metadata-sync.ts +262 -0
  612. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  613. package/src/lib/docs-metadata-v2.ts +646 -0
  614. package/src/lib/docs-new.ts +63 -0
  615. package/src/lib/docs-sweep.ts +42 -28
  616. package/src/lib/headless/index.ts +287 -0
  617. package/src/lib/identities/assume.ts +67 -86
  618. package/src/lib/instructions/apply.ts +33 -20
  619. package/src/lib/instructions/bundle.ts +199 -0
  620. package/src/lib/instructions/splice.ts +21 -7
  621. package/src/lib/instructions/templates.ts +85 -13
  622. package/dist/core/agents/cli-emit.d.ts +0 -27
  623. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  624. package/dist/core/agents/cli-emit.js +0 -57
  625. package/dist/core/agents/codex-replay.d.ts +0 -29
  626. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  627. package/dist/core/agents/codex-replay.js +0 -138
  628. package/dist/core/agents/events/consume.d.ts +0 -82
  629. package/dist/core/agents/events/consume.d.ts.map +0 -1
  630. package/dist/core/agents/events/consume.js +0 -195
  631. package/dist/core/agents/events/emit.d.ts +0 -42
  632. package/dist/core/agents/events/emit.d.ts.map +0 -1
  633. package/dist/core/agents/events/emit.js +0 -75
  634. package/dist/core/agents/events/ulid.d.ts +0 -11
  635. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  636. package/dist/core/agents/events/ulid.js +0 -47
  637. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
  638. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  639. package/dist/core/agents/state/heartbeat-projector.js +0 -527
  640. package/dist/core/hooks/events/emit.d.ts +0 -31
  641. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  642. package/dist/core/hooks/events/emit.js +0 -93
  643. package/dist/core/hooks/events/rotate.d.ts +0 -43
  644. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  645. package/dist/core/hooks/events/rotate.js +0 -142
  646. package/dist/core/hooks/events/schema.d.ts +0 -312
  647. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  648. package/dist/core/hooks/events/schema.js +0 -12
  649. package/dist/core/hooks/events/ulid.d.ts +0 -10
  650. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  651. package/dist/core/hooks/events/ulid.js +0 -47
  652. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  653. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  654. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  655. package/src/core/agents/cli-emit.ts +0 -64
  656. package/src/core/agents/codex-replay.ts +0 -163
  657. package/src/core/agents/events/consume.ts +0 -254
  658. package/src/core/agents/events/emit.ts +0 -115
  659. package/src/core/agents/events/ulid.ts +0 -51
  660. package/src/core/agents/state/heartbeat-projector.ts +0 -582
  661. package/src/core/hooks/events/emit.ts +0 -125
  662. package/src/core/hooks/events/rotate.ts +0 -151
  663. package/src/core/hooks/events/schema.ts +0 -538
  664. package/src/core/hooks/events/ulid.ts +0 -51
  665. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -1,65 +0,0 @@
1
- /**
2
- * Heartbeat projector. Reads canonical events from the consumer and projects
3
- * them into per-owner state files under `.harnery/active/<id>.json`, the same
4
- * canonical location every reader (this library, hooks, the web UI, etc.)
5
- * expects.
6
- *
7
- * Projection writes a single file, additively merged with any existing body
8
- * so writes from sibling tools (e.g. `agent-coord set-task` that doesn't go
9
- * through the canonical event stream) survive each projector run.
10
- */
11
- import type { CanonicalEvent } from "../events/consume.js";
12
- export interface V2Heartbeat {
13
- instance_id: string;
14
- session_id: string;
15
- adapter: string;
16
- agent_id?: string;
17
- name?: string;
18
- kind?: "session" | "subagent" | "transient";
19
- model?: string;
20
- platform?: string;
21
- subagent_call_id?: string;
22
- parent_session_id?: string;
23
- /** Set iff this owner is a `workflow run` child (joins to the run transcript). */
24
- workflow_run_id?: string;
25
- workflow_agent_id?: string;
26
- started_at?: string;
27
- last_heartbeat: string;
28
- last_tool?: string;
29
- last_tool_target?: string;
30
- last_tool_at?: string;
31
- task?: string;
32
- task_updated_at?: string;
33
- suggested_session_name?: string;
34
- session_name_seen_at?: string;
35
- session_name_seen_for?: string;
36
- last_status_at?: string;
37
- presence?: "mobile" | "office";
38
- last_intent?: string;
39
- last_intent_source?: string;
40
- last_turn_id?: string;
41
- last_user_prompt_at?: string;
42
- last_turn_stop_at?: string;
43
- last_turn_status_box_present?: boolean;
44
- ended_at?: string;
45
- clean_exit?: boolean;
46
- files_touched?: string[];
47
- turn_summary?: string;
48
- turn_summary_updated_at?: string;
49
- /** ULID of the last event applied for this owner; idempotency anchor. */
50
- last_event_id: string;
51
- /** Count of events applied for this owner since the projector first saw it. */
52
- events_applied: number;
53
- /** Internal projection metadata. */
54
- v2_meta: {
55
- schema_version: 1;
56
- first_seen: string;
57
- last_projected: string;
58
- };
59
- }
60
- export declare function projectHeartbeats(coordRoot: string, events: readonly CanonicalEvent[]): {
61
- written: string[];
62
- perOwner: Record<string, V2Heartbeat>;
63
- };
64
- export declare function heartbeatPath(coordRoot: string, instanceId: string): string;
65
- //# sourceMappingURL=heartbeat-projector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"heartbeat-projector.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-projector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,OAAO,EAAE;QACP,cAAc,EAAE,CAAC,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,cAAc,EAAE,GAChC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;CAAE,CAoD9D;AAsbD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3E"}
@@ -1,527 +0,0 @@
1
- /**
2
- * Heartbeat projector. Reads canonical events from the consumer and projects
3
- * them into per-owner state files under `.harnery/active/<id>.json`, the same
4
- * canonical location every reader (this library, hooks, the web UI, etc.)
5
- * expects.
6
- *
7
- * Projection writes a single file, additively merged with any existing body
8
- * so writes from sibling tools (e.g. `agent-coord set-task` that doesn't go
9
- * through the canonical event stream) survive each projector run.
10
- */
11
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
12
- import { dirname, join } from "node:path";
13
- export function projectHeartbeats(coordRoot, events) {
14
- const perOwner = {};
15
- // Events that must NOT seed a heartbeat for an owner with no live file.
16
- // Terminal lifecycle events (session.end / subagent.stop /
17
- // health.heartbeat_swept) used to be the whole set — a stop without a
18
- // matching start resurrected a nameless `agent-unknown` tombstone, and a
19
- // lone health.heartbeat_swept re-created the file stale-sweep had just
20
- // deleted (self-perpetuating zombie loop, same instance swept 18×).
21
- //
22
- // `claim.release` joins them: kill-heartbeat unlinks the file THEN emits
23
- // claim.release for each held path so replay honors the drop. Projecting
24
- // those releases alone used to seed a fresh heartbeat (name recovered from
25
- // .name-history, last_heartbeat = release ts), undoing the kill. Side-effect
26
- // events must never birth an owner.
27
- const NEVER_SEED = new Set([
28
- "session.end",
29
- "subagent.stop",
30
- "health.heartbeat_swept",
31
- "claim.release",
32
- ]);
33
- // Seed from any existing v2 files so a partial replay doesn't reset state.
34
- for (const ev of events) {
35
- if (!perOwner[ev.instance_id]) {
36
- const existing = readExisting(coordRoot, ev.instance_id);
37
- if (!existing && NEVER_SEED.has(ev.event_type))
38
- continue;
39
- perOwner[ev.instance_id] = existing ?? seed(ev, coordRoot);
40
- }
41
- apply(perOwner[ev.instance_id], ev, coordRoot);
42
- }
43
- const written = [];
44
- for (const [instance_id, hb] of Object.entries(perOwner)) {
45
- // Mid-batch terminal guard: the replay variant of the seed-time TERMINAL
46
- // skip above. A drain that replays a COMPLETED run end-to-end (shared
47
- // cursor lagging another consumer, replayAll) seeds from the start event,
48
- // applies the whole history INCLUDING the terminal stop, then lands here
49
- // and would re-create the heartbeat the end-hook already unlinked, a
50
- // zombie that reads as a live agent for a full staleness window (observed:
51
- // a finished subagent's heartbeat resurrected 4m after its stop by a
52
- // sibling's spawn drain). `ended_at` is only ever set by apply() in this
53
- // batch, it is not in writeHeartbeat's persisted allowlist, so it can't
54
- // arrive from disk. If the batch saw the owner end and no heartbeat file
55
- // exists now, there is nothing live to update: skip. An EXISTING file
56
- // still gets the terminal write (tombstone semantics, locked by the
57
- // "session.end on an EXISTING heartbeat still applies" test).
58
- if (hb.ended_at && !existsSync(heartbeatPath(coordRoot, instance_id)))
59
- continue;
60
- writeHeartbeat(coordRoot, instance_id, hb);
61
- written.push(instance_id);
62
- }
63
- return { written, perOwner };
64
- }
65
- function seed(ev, coordRoot) {
66
- const nowIso = new Date().toISOString();
67
- const hb = {
68
- instance_id: ev.instance_id,
69
- session_id: ev.session_id,
70
- adapter: ev.adapter,
71
- last_heartbeat: ev.ts,
72
- last_event_id: ev.event_id,
73
- events_applied: 0,
74
- v2_meta: {
75
- schema_version: 1,
76
- first_seen: nowIso,
77
- last_projected: nowIso,
78
- },
79
- };
80
- // Recover identity from the durable `.name-history`. That file is written
81
- // in-process at session.start / subagent.start time, BEFORE any projection,
82
- // keyed by instance_id, surviving sweeps. Without this, seeding from a
83
- // non-start event (a tool/turn whose start was never in a projected batch,
84
- // e.g. the owner id resolved differently at start than later) produced a
85
- // nameless `agent-unknown` heartbeat. Mirrors heartbeat-writer.healHeartbeat
86
- // so BOTH heartbeat producers resolve identity the same way. Best-effort: a
87
- // names.ts failure must never break projection (a past
88
- // stop-projection crash that stalled the whole drain).
89
- try {
90
- const { resolveName } = require("./names.ts");
91
- const resolved = resolveName(coordRoot, ev.instance_id, ev.session_id);
92
- if (resolved) {
93
- hb.name = resolved.name;
94
- hb.kind = resolved.kind;
95
- hb.agent_id =
96
- resolved.agent_id ?? (resolved.kind === "subagent" ? ev.instance_id : undefined);
97
- }
98
- }
99
- catch {
100
- /* name-history unavailable: seed stays nameless; sweep + render guards cope */
101
- }
102
- return hb;
103
- }
104
- function apply(hb, ev, coordRoot) {
105
- // Sweep telemetry must not refresh liveness. apply() used to stamp
106
- // last_heartbeat = ev.ts for every event, so a drain that replayed
107
- // [session.start … tools … health.heartbeat_swept] wrote a heartbeat whose
108
- // last_heartbeat was the swept ts — looking freshly alive for another
109
- // freshness window, which the next sweep deleted-and-re-emitted. Record the
110
- // event for audit (last_event_id / events_applied) but keep the prior
111
- // liveness stamp; also set ended_at so the mid-batch write guard skips
112
- // re-creating a file the sweep/kill already removed.
113
- const isSweepTelemetry = ev.event_type === "health.heartbeat_swept";
114
- if (!isSweepTelemetry) {
115
- hb.last_heartbeat = ev.ts;
116
- }
117
- else if (!hb.last_heartbeat) {
118
- hb.last_heartbeat = ev.ts;
119
- }
120
- hb.last_event_id = ev.event_id;
121
- hb.events_applied += 1;
122
- hb.v2_meta.last_projected = new Date().toISOString();
123
- if (ev.turn_id)
124
- hb.last_turn_id = ev.turn_id;
125
- const d = ev.data;
126
- switch (ev.event_type) {
127
- case "session.start":
128
- hb.started_at = pickStr(d, "started_at") ?? ev.ts;
129
- hb.adapter = ev.adapter;
130
- {
131
- const model = pickStr(d, "model");
132
- if (model)
133
- hb.model = model;
134
- const platform = pickStr(d, "platform") ?? adapterToPlatform(ev.adapter);
135
- hb.platform = platform;
136
- const name = pickStr(d, "name");
137
- if (name)
138
- hb.name = name;
139
- const kind = pickStr(d, "kind");
140
- if (kind === "session" || kind === "subagent" || kind === "transient") {
141
- hb.kind = kind;
142
- }
143
- else if (!hb.kind) {
144
- hb.kind = "session";
145
- }
146
- const agentId = pickStr(d, "agent_id");
147
- if (agentId)
148
- hb.agent_id = agentId;
149
- const subagentCallId = pickStr(d, "subagent_call_id");
150
- if (subagentCallId)
151
- hb.subagent_call_id = subagentCallId;
152
- const parentSession = pickStr(d, "parent_session_id");
153
- if (parentSession)
154
- hb.parent_session_id = parentSession;
155
- const workflowRunId = pickStr(d, "workflow_run_id");
156
- if (workflowRunId)
157
- hb.workflow_run_id = workflowRunId;
158
- const workflowAgentId = pickStr(d, "workflow_agent_id");
159
- if (workflowAgentId)
160
- hb.workflow_agent_id = workflowAgentId;
161
- if (!hb.files_touched)
162
- hb.files_touched = [];
163
- }
164
- break;
165
- case "session.end":
166
- hb.ended_at = pickStr(d, "ended_at") ?? ev.ts;
167
- hb.clean_exit = pickBool(d, "clean_exit");
168
- break;
169
- case "health.heartbeat_swept":
170
- hb.ended_at = ev.ts;
171
- break;
172
- case "subagent.start": {
173
- const name = pickStr(d, "name");
174
- if (name)
175
- hb.name = name;
176
- hb.kind = "subagent";
177
- const parentSession = pickStr(d, "parent_session_id");
178
- if (parentSession)
179
- hb.parent_session_id = parentSession;
180
- const subagentCallId = pickStr(d, "subagent_call_id");
181
- if (subagentCallId)
182
- hb.subagent_call_id = subagentCallId;
183
- hb.agent_id = ev.instance_id;
184
- hb.started_at = ev.ts;
185
- if (!hb.files_touched)
186
- hb.files_touched = [];
187
- hb.platform = adapterToPlatform(ev.adapter);
188
- break;
189
- }
190
- case "subagent.stop":
191
- hb.ended_at = pickStr(d, "ended_at") ?? ev.ts;
192
- hb.clean_exit = pickBool(d, "clean_exit") ?? true;
193
- break;
194
- case "user_prompt.submit":
195
- hb.last_user_prompt_at = ev.ts;
196
- break;
197
- case "turn.stop":
198
- hb.last_turn_stop_at = ev.ts;
199
- hb.last_turn_status_box_present = pickBool(d, "status_box_present");
200
- // Rebuild fidelity for the naming ritual: the live stamp is written by
201
- // the Stop hook (stampSessionNameSeen); reproduce it from the event so a
202
- // full projector rebuild doesn't re-open a satisfied naming window.
203
- if (d.session_name_present === true) {
204
- hb.session_name_seen_at ??= ev.ts;
205
- // Attribute the sighting to the name the scan actually covered. Reading
206
- // the name current at this point in the replay instead re-attributed an
207
- // old sighting to a re-minted name, which faked "already seen" for a
208
- // name no reply had shown. An event without the field predates it, so
209
- // leave the attribution unset and let the next stop re-scan.
210
- hb.session_name_seen_for = pickStr(d, "session_name_present_for");
211
- }
212
- {
213
- const summary = pickStr(d, "turn_summary");
214
- if (summary) {
215
- hb.turn_summary = summary;
216
- hb.turn_summary_updated_at = ev.ts;
217
- }
218
- // Backfill model for adapters that omit it at session.start (Claude
219
- // Code). The Stop hook resolves it from the transcript by this point;
220
- // only set when present so we never clobber a known model.
221
- const model = pickStr(d, "model");
222
- if (model)
223
- hb.model = model;
224
- }
225
- break;
226
- case "tool.pre_use": {
227
- const toolName = pickStr(d, "tool_name");
228
- hb.last_tool = toolName;
229
- hb.last_tool_target = extractTarget(d);
230
- hb.last_tool_at = ev.ts;
231
- const intent = pickStr(d, "intent");
232
- if (intent && intent !== "(no intent)") {
233
- hb.last_intent = intent;
234
- hb.last_intent_source = pickStr(d, "intent_source");
235
- }
236
- // Project files_touched: Edit / Write / NotebookEdit add their target.
237
- if (toolName === "Edit" || toolName === "Write" || toolName === "NotebookEdit") {
238
- const target = extractFilePath(d);
239
- if (target) {
240
- // Canonicalize to repo-relative before storing: the claim guard
241
- // writes canonical paths directly, so an absolute entry here would
242
- // double-count the same file (inflated "N files" display) and
243
- // defeat exact-match pruning on commit.
244
- const canonical = target.startsWith(`${coordRoot}/`)
245
- ? target.slice(coordRoot.length + 1)
246
- : target;
247
- if (!hb.files_touched)
248
- hb.files_touched = [];
249
- if (!hb.files_touched.includes(canonical))
250
- hb.files_touched.push(canonical);
251
- }
252
- }
253
- break;
254
- }
255
- case "tool.post_use":
256
- case "tool.post_use_failure":
257
- hb.last_tool_at = ev.ts;
258
- break;
259
- case "state.task_set": {
260
- const cleared = pickBool(d, "cleared");
261
- const task = pickStr(d, "task");
262
- if (cleared || !task) {
263
- hb.task = undefined;
264
- }
265
- else {
266
- hb.task = task;
267
- }
268
- hb.task_updated_at = ev.ts;
269
- // Rebuild fidelity: the naming call carries the name it produced.
270
- const suggested = pickStr(d, "suggested_session_name");
271
- if (suggested && !hb.suggested_session_name) {
272
- hb.suggested_session_name = suggested;
273
- }
274
- break;
275
- }
276
- case "state.status_checked":
277
- hb.last_status_at = ev.ts;
278
- break;
279
- case "identity.assumed": {
280
- const name = pickStr(d, "name");
281
- const agentId = pickStr(d, "agent_id");
282
- if (name)
283
- hb.name = name;
284
- if (agentId)
285
- hb.agent_id = agentId;
286
- break;
287
- }
288
- case "state.presence_change": {
289
- const to = pickStr(d, "to");
290
- if (to === "mobile" || to === "office")
291
- hb.presence = to;
292
- break;
293
- }
294
- case "claim.acquire": {
295
- const path = pickStr(d, "path");
296
- const mode = pickStr(d, "mode");
297
- if (path && mode === "write") {
298
- const canonical = path.startsWith(`${coordRoot}/`)
299
- ? path.slice(coordRoot.length + 1)
300
- : path;
301
- if (!hb.files_touched)
302
- hb.files_touched = [];
303
- if (!hb.files_touched.includes(canonical))
304
- hb.files_touched.push(canonical);
305
- }
306
- break;
307
- }
308
- case "claim.release": {
309
- const path = pickStr(d, "path");
310
- if (path && hb.files_touched) {
311
- // files_touched holds a mix of absolute-under-coordRoot and canonical
312
- // repo-relative entries (Edit events report absolute; release-claim
313
- // canonicalizes to relative). Normalize both sides so a release
314
- // subtracts regardless of form — an exact-string compare silently
315
- // no-ops on the mismatch and the claim resurrects on the next replay.
316
- const norm = (p) => p.startsWith(`${coordRoot}/`) ? p.slice(coordRoot.length + 1) : p;
317
- const target = norm(path);
318
- hb.files_touched = hb.files_touched.filter((p) => norm(p) !== target);
319
- }
320
- break;
321
- }
322
- }
323
- }
324
- function adapterToPlatform(adapter) {
325
- if (adapter === "claude-code")
326
- return "claude-code";
327
- if (adapter === "cursor")
328
- return "cursor";
329
- if (adapter === "codex")
330
- return "codex";
331
- return adapter;
332
- }
333
- function extractFilePath(data) {
334
- const raw = data.tool_input;
335
- if (typeof raw !== "string")
336
- return undefined;
337
- try {
338
- const parsed = JSON.parse(raw);
339
- return (pickStr(parsed, "file_path") ??
340
- pickStr(parsed, "path") ??
341
- pickStr(parsed, "notebook_path") ??
342
- undefined);
343
- }
344
- catch {
345
- return undefined;
346
- }
347
- }
348
- function extractTarget(data) {
349
- // tool_input is stringified JSON in our envelope; try to parse and pull a
350
- // common target field (file_path, path, command).
351
- const raw = data.tool_input;
352
- if (typeof raw !== "string")
353
- return undefined;
354
- try {
355
- const parsed = JSON.parse(raw);
356
- return (pickStr(parsed, "file_path") ??
357
- pickStr(parsed, "path") ??
358
- pickStr(parsed, "notebook_path") ??
359
- cleanCommand(pickStr(parsed, "command")) ??
360
- undefined);
361
- }
362
- catch {
363
- return undefined;
364
- }
365
- }
366
- /**
367
- * The repo mandates a `# intent: …` first-line comment on every Bash command,
368
- * so a raw `command` payload starts with the intent prose, not the command.
369
- * Stamping that into `last_tool_target` leaked the intent into the peer table
370
- * and pushed the real command past the 60-char render slice. Skip leading
371
- * comment-only lines so the target reflects what the agent is actually running.
372
- */
373
- function cleanCommand(command) {
374
- if (command === undefined)
375
- return undefined;
376
- for (const line of command.split("\n")) {
377
- const trimmed = line.trim();
378
- if (!trimmed || trimmed.startsWith("#"))
379
- continue;
380
- return trimmed;
381
- }
382
- // All-comment / degenerate: fall back to the trimmed whole.
383
- return command.trim() || undefined;
384
- }
385
- function readExisting(coordRoot, instanceId) {
386
- const path = heartbeatPath(coordRoot, instanceId);
387
- if (!existsSync(path))
388
- return null;
389
- try {
390
- const raw = JSON.parse(readFileSync(path, "utf8"));
391
- return coerceV2Heartbeat(raw, instanceId);
392
- }
393
- catch {
394
- return null;
395
- }
396
- }
397
- /**
398
- * Restore the projector-owned invariant fields on a heartbeat read from disk.
399
- *
400
- * The active-heartbeat file has multiple producers: the projector (seed/apply,
401
- * which set `v2_meta` + `events_applied`) AND the writer layer
402
- * (heartbeat-writer.ts: healHeartbeat, setTask, stampToolActivity, …), which
403
- * only knows the v1 shape and omits both. readExisting previously `as`-cast the
404
- * raw JSON straight to V2Heartbeat, so a body recreated by `healHeartbeat`
405
- * (e.g. a pruned Cursor session) reached apply() without `v2_meta` →
406
- * `hb.v2_meta.last_projected = …` threw (caught + logged ~200×/day, phase
407
- * "stop-projection"), and without `events_applied` → `events_applied += 1`
408
- * silently went NaN. The read boundary is where untyped JSON becomes a typed
409
- * V2Heartbeat, so it's where the type's required-field invariant must be
410
- * re-established, covering every malformed producer, not just one symptom.
411
- *
412
- * Note `v2_meta` is NOT in writeHeartbeat's persisted allowlist, so it never
413
- * lands on disk; it's ephemeral per-drain bookkeeping, which means readExisting
414
- * must re-coerce it on EVERY read of an already-seen owner (not only for
415
- * heal-written bodies). `events_applied` IS persisted, so coercing it to 0 only
416
- * matters for bodies a writer produced without the field (e.g. healHeartbeat).
417
- */
418
- function coerceV2Heartbeat(raw, instanceId) {
419
- const hb = raw;
420
- if (!hb.instance_id)
421
- hb.instance_id = instanceId;
422
- if (typeof hb.events_applied !== "number" || Number.isNaN(hb.events_applied)) {
423
- hb.events_applied = 0;
424
- }
425
- if (!hb.v2_meta) {
426
- const nowIso = new Date().toISOString();
427
- hb.v2_meta = {
428
- schema_version: 1,
429
- first_seen: hb.last_heartbeat ?? nowIso,
430
- last_projected: nowIso,
431
- };
432
- }
433
- return hb;
434
- }
435
- function writeHeartbeat(coordRoot, instanceId, hb) {
436
- const path = heartbeatPath(coordRoot, instanceId);
437
- try {
438
- mkdirSync(dirname(path), { recursive: true });
439
- // Additive merge with existing body so writes from sibling tools (e.g.
440
- // `agent-coord set-task` that doesn't go through the canonical event
441
- // stream) survive each projector run. Projected fields win on conflict.
442
- let existing = {};
443
- if (existsSync(path)) {
444
- try {
445
- existing = JSON.parse(readFileSync(path, "utf8"));
446
- }
447
- catch {
448
- /* skip merge */
449
- }
450
- }
451
- const merged = {
452
- schema_version: 1,
453
- ...existing,
454
- instance_id: hb.instance_id,
455
- session_id: hb.session_id,
456
- last_heartbeat: hb.last_heartbeat,
457
- last_event_id: hb.last_event_id,
458
- events_applied: hb.events_applied,
459
- };
460
- setIfDefined(merged, "name", hb.name);
461
- setIfDefined(merged, "kind", hb.kind);
462
- setIfDefined(merged, "agent_id", hb.agent_id);
463
- setIfDefined(merged, "subagent_call_id", hb.subagent_call_id);
464
- setIfDefined(merged, "workflow_run_id", hb.workflow_run_id);
465
- setIfDefined(merged, "workflow_agent_id", hb.workflow_agent_id);
466
- setIfDefined(merged, "model", hb.model);
467
- setIfDefined(merged, "platform", hb.platform);
468
- setIfDefined(merged, "started_at", hb.started_at);
469
- // files_touched is a required-array invariant for every reader
470
- // (coord-reader.isHeartbeatShape, the web UI, stale-sweep). Seed paths that
471
- // never hit a start event leave it undefined; default to [] so the writer
472
- // can never emit a file that fails the reader's shape check. Belt to the
473
- // TERMINAL guard's suspenders.
474
- merged.files_touched = hb.files_touched ?? [];
475
- setIfDefined(merged, "last_tool", hb.last_tool);
476
- setIfDefined(merged, "last_tool_target", hb.last_tool_target);
477
- setIfDefined(merged, "last_tool_at", hb.last_tool_at);
478
- setIfDefined(merged, "task", hb.task);
479
- setIfDefined(merged, "task_updated_at", hb.task_updated_at);
480
- setIfDefined(merged, "suggested_session_name", hb.suggested_session_name);
481
- setIfDefined(merged, "session_name_seen_at", hb.session_name_seen_at);
482
- if (hb.session_name_seen_for) {
483
- merged.session_name_seen_for = hb.session_name_seen_for;
484
- }
485
- else {
486
- // Unlike most projected fields, an absent attribution is meaningful: a
487
- // legacy sighting cannot prove which suggested name it covered. Remove a
488
- // stale value inherited through the additive merge so the next stop
489
- // scans the current name instead of treating it as already satisfied.
490
- delete merged.session_name_seen_for;
491
- }
492
- setIfDefined(merged, "last_status_at", hb.last_status_at);
493
- setIfDefined(merged, "turn_summary", hb.turn_summary);
494
- setIfDefined(merged, "turn_summary_updated_at", hb.turn_summary_updated_at);
495
- setIfDefined(merged, "current_turn_id", hb.last_turn_id);
496
- setIfDefined(merged, "parent_instance_id", hb.parent_session_id);
497
- // Atomic temp+rename (same primitive as heartbeat-writer.ts:atomicWrite) so
498
- // a concurrent reader (stale-sweep, `harn agents`, the web UI) never sees a
499
- // half-written file. A plain in-place writeFileSync truncates-then-writes,
500
- // exposing a partial-read window; stale-sweep deletes any heartbeat it
501
- // fails to JSON.parse, so a partial read there would delete a live agent.
502
- const tmp = `${path}.tmp.${process.pid}`;
503
- writeFileSync(tmp, JSON.stringify(merged, null, 2), "utf8");
504
- renameSync(tmp, path);
505
- }
506
- catch {
507
- /* surfaced by caller via missing heartbeat file */
508
- }
509
- }
510
- export function heartbeatPath(coordRoot, instanceId) {
511
- return join(coordRoot, ".harnery", "active", `${instanceId}.json`);
512
- }
513
- /** Set a field only when value is defined (not null/undefined). Used by the
514
- * additive merge so non-projected writes survive projector runs. */
515
- function setIfDefined(target, key, value) {
516
- if (value !== undefined && value !== null) {
517
- target[key] = value;
518
- }
519
- }
520
- function pickStr(o, k) {
521
- const v = o[k];
522
- return typeof v === "string" && v.length > 0 ? v : undefined;
523
- }
524
- function pickBool(o, k) {
525
- const v = o[k];
526
- return typeof v === "boolean" ? v : undefined;
527
- }
@@ -1,31 +0,0 @@
1
- import { type Adapter, type EventEnvelope, type EventType, type Source } from "./schema.js";
2
- export interface EmitInput<TType extends EventType, TData> {
3
- event_type: TType;
4
- instance_id: string;
5
- session_id: string;
6
- adapter: Adapter;
7
- source?: Source;
8
- parent_session_id?: string;
9
- turn_id?: string;
10
- parent_turn_id?: string;
11
- ts?: string;
12
- data: TData;
13
- }
14
- /**
15
- * Build a canonical envelope around the caller's `data` payload. Pure;
16
- * doesn't touch the filesystem. Useful for tests + replay fixtures.
17
- */
18
- export declare function buildEnvelope<TType extends EventType, TData>(input: EmitInput<TType, TData>): EventEnvelope<TType, TData>;
19
- /**
20
- * Append one canonical event to `.harnery/events.ndjson` under a file lock.
21
- * Append-only, one JSON object per line, lock-serialized.
22
- *
23
- * Synchronous because hooks are short-lived processes: we want the append to
24
- * land before the binary exits, and async/await across a tiny write is just
25
- * latency for no benefit.
26
- *
27
- * Returns the envelope so callers can chain off it (debug logs, post-emit
28
- * verdict requests).
29
- */
30
- export declare function emit<TType extends EventType, TData>(coordRoot: string, input: EmitInput<TType, TData>): EventEnvelope<TType, TData>;
31
- //# sourceMappingURL=emit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/events/emit.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,SAAS,EAEd,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAQrB,MAAM,WAAW,SAAS,CAAC,KAAK,SAAS,SAAS,EAAE,KAAK;IACvD,UAAU,EAAE,KAAK,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,KAAK,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,SAAS,SAAS,EAAE,KAAK,EAC1D,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,GAC7B,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAe7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,IAAI,CAAC,KAAK,SAAS,SAAS,EAAE,KAAK,EACjD,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,GAC7B,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAyC7B"}