harnery 0.0.1 → 0.2.1

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 (445) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -2
  3. package/bin/agent-coord +42 -0
  4. package/bin/agent-hook +44 -0
  5. package/bin/harn +40 -0
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +18 -0
  9. package/dist/commander.d.ts +128 -0
  10. package/dist/commander.d.ts.map +1 -0
  11. package/dist/commander.js +126 -0
  12. package/dist/commands/agents.d.ts +18 -0
  13. package/dist/commands/agents.d.ts.map +1 -0
  14. package/dist/commands/agents.js +3946 -0
  15. package/dist/commands/backup.d.ts +22 -0
  16. package/dist/commands/backup.d.ts.map +1 -0
  17. package/dist/commands/backup.js +262 -0
  18. package/dist/commands/browse-ai.d.ts +4 -0
  19. package/dist/commands/browse-ai.d.ts.map +1 -0
  20. package/dist/commands/browse-ai.js +156 -0
  21. package/dist/commands/browse.d.ts +4 -0
  22. package/dist/commands/browse.d.ts.map +1 -0
  23. package/dist/commands/browse.js +590 -0
  24. package/dist/commands/callers.d.ts +4 -0
  25. package/dist/commands/callers.d.ts.map +1 -0
  26. package/dist/commands/callers.js +276 -0
  27. package/dist/commands/completion.d.ts +17 -0
  28. package/dist/commands/completion.d.ts.map +1 -0
  29. package/dist/commands/completion.js +158 -0
  30. package/dist/commands/config-get.d.ts +4 -0
  31. package/dist/commands/config-get.d.ts.map +1 -0
  32. package/dist/commands/config-get.js +131 -0
  33. package/dist/commands/context.d.ts +11 -0
  34. package/dist/commands/context.d.ts.map +1 -0
  35. package/dist/commands/context.js +185 -0
  36. package/dist/commands/cookies.d.ts +4 -0
  37. package/dist/commands/cookies.d.ts.map +1 -0
  38. package/dist/commands/cookies.js +140 -0
  39. package/dist/commands/docs.d.ts +4 -0
  40. package/dist/commands/docs.d.ts.map +1 -0
  41. package/dist/commands/docs.js +137 -0
  42. package/dist/commands/doctor.d.ts +25 -0
  43. package/dist/commands/doctor.d.ts.map +1 -0
  44. package/dist/commands/doctor.js +200 -0
  45. package/dist/commands/edit-batch.d.ts +18 -0
  46. package/dist/commands/edit-batch.d.ts.map +1 -0
  47. package/dist/commands/edit-batch.js +172 -0
  48. package/dist/commands/eml.d.ts +4 -0
  49. package/dist/commands/eml.d.ts.map +1 -0
  50. package/dist/commands/eml.js +428 -0
  51. package/dist/commands/env.d.ts +4 -0
  52. package/dist/commands/env.d.ts.map +1 -0
  53. package/dist/commands/env.js +201 -0
  54. package/dist/commands/fetch.d.ts +4 -0
  55. package/dist/commands/fetch.d.ts.map +1 -0
  56. package/dist/commands/fetch.js +99 -0
  57. package/dist/commands/file-history.d.ts +4 -0
  58. package/dist/commands/file-history.d.ts.map +1 -0
  59. package/dist/commands/file-history.js +152 -0
  60. package/dist/commands/grep.d.ts +4 -0
  61. package/dist/commands/grep.d.ts.map +1 -0
  62. package/dist/commands/grep.js +317 -0
  63. package/dist/commands/init.d.ts +82 -0
  64. package/dist/commands/init.d.ts.map +1 -0
  65. package/dist/commands/init.js +288 -0
  66. package/dist/commands/outline.d.ts +4 -0
  67. package/dist/commands/outline.d.ts.map +1 -0
  68. package/dist/commands/outline.js +509 -0
  69. package/dist/commands/presence.d.ts +12 -0
  70. package/dist/commands/presence.d.ts.map +1 -0
  71. package/dist/commands/presence.js +123 -0
  72. package/dist/commands/read.d.ts +7 -0
  73. package/dist/commands/read.d.ts.map +1 -0
  74. package/dist/commands/read.js +46 -0
  75. package/dist/commands/scratch.d.ts +4 -0
  76. package/dist/commands/scratch.d.ts.map +1 -0
  77. package/dist/commands/scratch.js +426 -0
  78. package/dist/commands/session.d.ts +4 -0
  79. package/dist/commands/session.d.ts.map +1 -0
  80. package/dist/commands/session.js +162 -0
  81. package/dist/commands/sync.d.ts +24 -0
  82. package/dist/commands/sync.d.ts.map +1 -0
  83. package/dist/commands/sync.js +275 -0
  84. package/dist/commands/toc.d.ts +5 -0
  85. package/dist/commands/toc.d.ts.map +1 -0
  86. package/dist/commands/toc.js +153 -0
  87. package/dist/commands/tokens.d.ts +4 -0
  88. package/dist/commands/tokens.d.ts.map +1 -0
  89. package/dist/commands/tokens.js +48 -0
  90. package/dist/commands/tunnel.d.ts +4 -0
  91. package/dist/commands/tunnel.d.ts.map +1 -0
  92. package/dist/commands/tunnel.js +513 -0
  93. package/dist/commands/uninstall.d.ts +22 -0
  94. package/dist/commands/uninstall.d.ts.map +1 -0
  95. package/dist/commands/uninstall.js +126 -0
  96. package/dist/commands/web.d.ts +4 -0
  97. package/dist/commands/web.d.ts.map +1 -0
  98. package/dist/commands/web.js +165 -0
  99. package/dist/core/agents/canonical-emit.d.ts +27 -0
  100. package/dist/core/agents/canonical-emit.d.ts.map +1 -0
  101. package/dist/core/agents/canonical-emit.js +72 -0
  102. package/dist/core/agents/cli-emit.d.ts +27 -0
  103. package/dist/core/agents/cli-emit.d.ts.map +1 -0
  104. package/dist/core/agents/cli-emit.js +57 -0
  105. package/dist/core/agents/cli.d.ts +10 -0
  106. package/dist/core/agents/cli.d.ts.map +1 -0
  107. package/dist/core/agents/cli.js +757 -0
  108. package/dist/core/agents/codex-replay.d.ts +29 -0
  109. package/dist/core/agents/codex-replay.d.ts.map +1 -0
  110. package/dist/core/agents/codex-replay.js +138 -0
  111. package/dist/core/agents/coord-client.d.ts +98 -0
  112. package/dist/core/agents/coord-client.d.ts.map +1 -0
  113. package/dist/core/agents/coord-client.js +212 -0
  114. package/dist/core/agents/events/consume.d.ts +59 -0
  115. package/dist/core/agents/events/consume.d.ts.map +1 -0
  116. package/dist/core/agents/events/consume.js +147 -0
  117. package/dist/core/agents/events/emit.d.ts +42 -0
  118. package/dist/core/agents/events/emit.d.ts.map +1 -0
  119. package/dist/core/agents/events/emit.js +70 -0
  120. package/dist/core/agents/events/ulid.d.ts +11 -0
  121. package/dist/core/agents/events/ulid.d.ts.map +1 -0
  122. package/dist/core/agents/events/ulid.js +47 -0
  123. package/dist/core/agents/index.d.ts +14 -0
  124. package/dist/core/agents/index.d.ts.map +1 -0
  125. package/dist/core/agents/index.js +13 -0
  126. package/dist/core/agents/paths.d.ts +6 -0
  127. package/dist/core/agents/paths.d.ts.map +1 -0
  128. package/dist/core/agents/paths.js +17 -0
  129. package/dist/core/agents/render/prompt-context.d.ts +43 -0
  130. package/dist/core/agents/render/prompt-context.d.ts.map +1 -0
  131. package/dist/core/agents/render/prompt-context.js +335 -0
  132. package/dist/core/agents/render/session-context.d.ts +39 -0
  133. package/dist/core/agents/render/session-context.d.ts.map +1 -0
  134. package/dist/core/agents/render/session-context.js +283 -0
  135. package/dist/core/agents/rules/claim-conflict.d.ts +35 -0
  136. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -0
  137. package/dist/core/agents/rules/claim-conflict.js +244 -0
  138. package/dist/core/agents/rules/commit-conflict.d.ts +59 -0
  139. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -0
  140. package/dist/core/agents/rules/commit-conflict.js +244 -0
  141. package/dist/core/agents/rules/stop-hook.d.ts +44 -0
  142. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -0
  143. package/dist/core/agents/rules/stop-hook.js +161 -0
  144. package/dist/core/agents/session-events.d.ts +41 -0
  145. package/dist/core/agents/session-events.d.ts.map +1 -0
  146. package/dist/core/agents/session-events.js +205 -0
  147. package/dist/core/agents/state/activity-log.d.ts +18 -0
  148. package/dist/core/agents/state/activity-log.d.ts.map +1 -0
  149. package/dist/core/agents/state/activity-log.js +34 -0
  150. package/dist/core/agents/state/council.d.ts +39 -0
  151. package/dist/core/agents/state/council.d.ts.map +1 -0
  152. package/dist/core/agents/state/council.js +216 -0
  153. package/dist/core/agents/state/heartbeat-projector.d.ts +59 -0
  154. package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -0
  155. package/dist/core/agents/state/heartbeat-projector.js +436 -0
  156. package/dist/core/agents/state/heartbeat-writer.d.ts +64 -0
  157. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -0
  158. package/dist/core/agents/state/heartbeat-writer.js +271 -0
  159. package/dist/core/agents/state/names.d.ts +35 -0
  160. package/dist/core/agents/state/names.d.ts.map +1 -0
  161. package/dist/core/agents/state/names.js +376 -0
  162. package/dist/core/agents/state/pidmap.d.ts +11 -0
  163. package/dist/core/agents/state/pidmap.d.ts.map +1 -0
  164. package/dist/core/agents/state/pidmap.js +32 -0
  165. package/dist/core/agents/state/scratch.d.ts +27 -0
  166. package/dist/core/agents/state/scratch.d.ts.map +1 -0
  167. package/dist/core/agents/state/scratch.js +90 -0
  168. package/dist/core/agents/state/shell-mutation.d.ts +17 -0
  169. package/dist/core/agents/state/shell-mutation.d.ts.map +1 -0
  170. package/dist/core/agents/state/shell-mutation.js +41 -0
  171. package/dist/core/agents/state/stale-sweep.d.ts +16 -0
  172. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -0
  173. package/dist/core/agents/state/stale-sweep.js +166 -0
  174. package/dist/core/config.d.ts +29 -0
  175. package/dist/core/config.d.ts.map +1 -0
  176. package/dist/core/config.js +108 -0
  177. package/dist/core/hooks/cli.d.ts +21 -0
  178. package/dist/core/hooks/cli.d.ts.map +1 -0
  179. package/dist/core/hooks/cli.js +1123 -0
  180. package/dist/core/hooks/effects/image-capture.d.ts +43 -0
  181. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -0
  182. package/dist/core/hooks/effects/image-capture.js +288 -0
  183. package/dist/core/hooks/effects/index.d.ts +64 -0
  184. package/dist/core/hooks/effects/index.d.ts.map +1 -0
  185. package/dist/core/hooks/effects/index.js +197 -0
  186. package/dist/core/hooks/events/emit.d.ts +31 -0
  187. package/dist/core/hooks/events/emit.d.ts.map +1 -0
  188. package/dist/core/hooks/events/emit.js +89 -0
  189. package/dist/core/hooks/events/schema.d.ts +235 -0
  190. package/dist/core/hooks/events/schema.d.ts.map +1 -0
  191. package/dist/core/hooks/events/schema.js +12 -0
  192. package/dist/core/hooks/events/ulid.d.ts +10 -0
  193. package/dist/core/hooks/events/ulid.d.ts.map +1 -0
  194. package/dist/core/hooks/events/ulid.js +47 -0
  195. package/dist/core/hooks/harness/detect.d.ts +9 -0
  196. package/dist/core/hooks/harness/detect.d.ts.map +1 -0
  197. package/dist/core/hooks/harness/detect.js +29 -0
  198. package/dist/core/hooks/harness/events.d.ts +45 -0
  199. package/dist/core/hooks/harness/events.d.ts.map +1 -0
  200. package/dist/core/hooks/harness/events.js +71 -0
  201. package/dist/core/hooks/harness/output.d.ts +46 -0
  202. package/dist/core/hooks/harness/output.d.ts.map +1 -0
  203. package/dist/core/hooks/harness/output.js +87 -0
  204. package/dist/core/hooks/harness/parse.d.ts +67 -0
  205. package/dist/core/hooks/harness/parse.d.ts.map +1 -0
  206. package/dist/core/hooks/harness/parse.js +132 -0
  207. package/dist/core/hooks/index.d.ts +8 -0
  208. package/dist/core/hooks/index.d.ts.map +1 -0
  209. package/dist/core/hooks/index.js +7 -0
  210. package/dist/core/hooks/resolve/anchor.d.ts +37 -0
  211. package/dist/core/hooks/resolve/anchor.d.ts.map +1 -0
  212. package/dist/core/hooks/resolve/anchor.js +48 -0
  213. package/dist/core/hooks/resolve/coord-root.d.ts +6 -0
  214. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -0
  215. package/dist/core/hooks/resolve/coord-root.js +27 -0
  216. package/dist/core/hooks/resolve/intent.d.ts +33 -0
  217. package/dist/core/hooks/resolve/intent.d.ts.map +1 -0
  218. package/dist/core/hooks/resolve/intent.js +79 -0
  219. package/dist/core/hooks/resolve/owner.d.ts +42 -0
  220. package/dist/core/hooks/resolve/owner.d.ts.map +1 -0
  221. package/dist/core/hooks/resolve/owner.js +140 -0
  222. package/dist/core/hooks/resolve/transcript.d.ts +26 -0
  223. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -0
  224. package/dist/core/hooks/resolve/transcript.js +73 -0
  225. package/dist/index.d.ts +15 -0
  226. package/dist/index.d.ts.map +1 -0
  227. package/dist/index.js +13 -0
  228. package/dist/lib/agent-browser/client.d.ts +99 -0
  229. package/dist/lib/agent-browser/client.d.ts.map +1 -0
  230. package/dist/lib/agent-browser/client.js +177 -0
  231. package/dist/lib/agent-browser/index.d.ts +2 -0
  232. package/dist/lib/agent-browser/index.d.ts.map +1 -0
  233. package/dist/lib/agent-browser/index.js +1 -0
  234. package/dist/lib/browser/client.d.ts +193 -0
  235. package/dist/lib/browser/client.d.ts.map +1 -0
  236. package/dist/lib/browser/client.js +325 -0
  237. package/dist/lib/browser/dev-overlay.d.ts +23 -0
  238. package/dist/lib/browser/dev-overlay.d.ts.map +1 -0
  239. package/dist/lib/browser/dev-overlay.js +153 -0
  240. package/dist/lib/browser/index.d.ts +5 -0
  241. package/dist/lib/browser/index.d.ts.map +1 -0
  242. package/dist/lib/browser/index.js +2 -0
  243. package/dist/lib/browser/layout.d.ts +79 -0
  244. package/dist/lib/browser/layout.d.ts.map +1 -0
  245. package/dist/lib/browser/layout.js +220 -0
  246. package/dist/lib/browser/visibility.d.ts +86 -0
  247. package/dist/lib/browser/visibility.d.ts.map +1 -0
  248. package/dist/lib/browser/visibility.js +333 -0
  249. package/dist/lib/browser/visual-diff.d.ts +38 -0
  250. package/dist/lib/browser/visual-diff.d.ts.map +1 -0
  251. package/dist/lib/browser/visual-diff.js +107 -0
  252. package/dist/lib/completion/bash.d.ts +25 -0
  253. package/dist/lib/completion/bash.d.ts.map +1 -0
  254. package/dist/lib/completion/bash.js +284 -0
  255. package/dist/lib/completion/fish.d.ts +16 -0
  256. package/dist/lib/completion/fish.d.ts.map +1 -0
  257. package/dist/lib/completion/fish.js +118 -0
  258. package/dist/lib/completion/index.d.ts +5 -0
  259. package/dist/lib/completion/index.d.ts.map +1 -0
  260. package/dist/lib/completion/index.js +4 -0
  261. package/dist/lib/completion/walk.d.ts +68 -0
  262. package/dist/lib/completion/walk.d.ts.map +1 -0
  263. package/dist/lib/completion/walk.js +102 -0
  264. package/dist/lib/completion/zsh.d.ts +13 -0
  265. package/dist/lib/completion/zsh.d.ts.map +1 -0
  266. package/dist/lib/completion/zsh.js +249 -0
  267. package/dist/lib/context/index.d.ts +107 -0
  268. package/dist/lib/context/index.d.ts.map +1 -0
  269. package/dist/lib/context/index.js +275 -0
  270. package/dist/lib/cookies/client.d.ts +131 -0
  271. package/dist/lib/cookies/client.d.ts.map +1 -0
  272. package/dist/lib/cookies/client.js +239 -0
  273. package/dist/lib/cookies/index.d.ts +2 -0
  274. package/dist/lib/cookies/index.d.ts.map +1 -0
  275. package/dist/lib/cookies/index.js +1 -0
  276. package/dist/lib/council/index.d.ts +266 -0
  277. package/dist/lib/council/index.d.ts.map +1 -0
  278. package/dist/lib/council/index.js +674 -0
  279. package/dist/lib/docs-index.d.ts +28 -0
  280. package/dist/lib/docs-index.d.ts.map +1 -0
  281. package/dist/lib/docs-index.js +169 -0
  282. package/dist/lib/docs-lint.d.ts +26 -0
  283. package/dist/lib/docs-lint.d.ts.map +1 -0
  284. package/dist/lib/docs-lint.js +378 -0
  285. package/dist/lib/docs-sweep.d.ts +34 -0
  286. package/dist/lib/docs-sweep.d.ts.map +1 -0
  287. package/dist/lib/docs-sweep.js +304 -0
  288. package/dist/lib/docs.d.ts +27 -0
  289. package/dist/lib/docs.d.ts.map +1 -0
  290. package/dist/lib/docs.js +142 -0
  291. package/dist/lib/env.d.ts +11 -0
  292. package/dist/lib/env.d.ts.map +1 -0
  293. package/dist/lib/env.js +12 -0
  294. package/dist/lib/exec.d.ts +32 -0
  295. package/dist/lib/exec.d.ts.map +1 -0
  296. package/dist/lib/exec.js +54 -0
  297. package/dist/lib/format.d.ts +29 -0
  298. package/dist/lib/format.d.ts.map +1 -0
  299. package/dist/lib/format.js +139 -0
  300. package/dist/lib/http/client.d.ts +56 -0
  301. package/dist/lib/http/client.d.ts.map +1 -0
  302. package/dist/lib/http/client.js +160 -0
  303. package/dist/lib/http/index.d.ts +2 -0
  304. package/dist/lib/http/index.d.ts.map +1 -0
  305. package/dist/lib/http/index.js +1 -0
  306. package/dist/lib/identities/index.d.ts +77 -0
  307. package/dist/lib/identities/index.d.ts.map +1 -0
  308. package/dist/lib/identities/index.js +190 -0
  309. package/dist/lib/machine.d.ts +19 -0
  310. package/dist/lib/machine.d.ts.map +1 -0
  311. package/dist/lib/machine.js +61 -0
  312. package/dist/lib/presence.d.ts +48 -0
  313. package/dist/lib/presence.d.ts.map +1 -0
  314. package/dist/lib/presence.js +123 -0
  315. package/dist/lib/readability/client.d.ts +39 -0
  316. package/dist/lib/readability/client.d.ts.map +1 -0
  317. package/dist/lib/readability/client.js +121 -0
  318. package/dist/lib/readability/index.d.ts +2 -0
  319. package/dist/lib/readability/index.d.ts.map +1 -0
  320. package/dist/lib/readability/index.js +1 -0
  321. package/dist/lib/scratch/index.d.ts +74 -0
  322. package/dist/lib/scratch/index.d.ts.map +1 -0
  323. package/dist/lib/scratch/index.js +393 -0
  324. package/dist/lib/tunnel/gate.d.ts +12 -0
  325. package/dist/lib/tunnel/gate.d.ts.map +1 -0
  326. package/dist/lib/tunnel/gate.js +101 -0
  327. package/dist/lib/tunnel/state.d.ts +34 -0
  328. package/dist/lib/tunnel/state.d.ts.map +1 -0
  329. package/dist/lib/tunnel/state.js +132 -0
  330. package/package.json +160 -8
  331. package/schemas/.gitkeep +0 -0
  332. package/schemas/config.schema.json +109 -0
  333. package/src/cli.ts +22 -0
  334. package/src/commander.ts +242 -0
  335. package/src/commands/.gitkeep +0 -0
  336. package/src/commands/agents.ts +4567 -0
  337. package/src/commands/backup.ts +305 -0
  338. package/src/commands/browse-ai.ts +198 -0
  339. package/src/commands/browse.ts +849 -0
  340. package/src/commands/callers.ts +363 -0
  341. package/src/commands/completion.ts +193 -0
  342. package/src/commands/config-get.ts +161 -0
  343. package/src/commands/context.ts +209 -0
  344. package/src/commands/cookies.ts +198 -0
  345. package/src/commands/docs.ts +174 -0
  346. package/src/commands/doctor.ts +231 -0
  347. package/src/commands/edit-batch.ts +233 -0
  348. package/src/commands/eml.ts +519 -0
  349. package/src/commands/env.ts +254 -0
  350. package/src/commands/fetch.ts +136 -0
  351. package/src/commands/file-history.ts +202 -0
  352. package/src/commands/grep.ts +371 -0
  353. package/src/commands/init.ts +335 -0
  354. package/src/commands/outline.ts +583 -0
  355. package/src/commands/presence.ts +152 -0
  356. package/src/commands/read.ts +64 -0
  357. package/src/commands/scratch.ts +445 -0
  358. package/src/commands/session.ts +187 -0
  359. package/src/commands/sync.ts +306 -0
  360. package/src/commands/toc.ts +218 -0
  361. package/src/commands/tokens.ts +79 -0
  362. package/src/commands/tunnel.ts +633 -0
  363. package/src/commands/uninstall.ts +144 -0
  364. package/src/commands/web.ts +193 -0
  365. package/src/core/agents/canonical-emit.ts +77 -0
  366. package/src/core/agents/cli-emit.ts +64 -0
  367. package/src/core/agents/cli.ts +838 -0
  368. package/src/core/agents/codex-replay.ts +163 -0
  369. package/src/core/agents/coord-client.ts +249 -0
  370. package/src/core/agents/events/consume.ts +196 -0
  371. package/src/core/agents/events/emit.ts +108 -0
  372. package/src/core/agents/events/ulid.ts +51 -0
  373. package/src/core/agents/index.ts +14 -0
  374. package/src/core/agents/paths.ts +16 -0
  375. package/src/core/agents/render/prompt-context.ts +401 -0
  376. package/src/core/agents/render/session-context.ts +341 -0
  377. package/src/core/agents/rules/claim-conflict.ts +282 -0
  378. package/src/core/agents/rules/commit-conflict.ts +303 -0
  379. package/src/core/agents/rules/stop-hook.ts +229 -0
  380. package/src/core/agents/session-events.ts +228 -0
  381. package/src/core/agents/state/activity-log.ts +33 -0
  382. package/src/core/agents/state/council.ts +265 -0
  383. package/src/core/agents/state/heartbeat-projector.ts +488 -0
  384. package/src/core/agents/state/heartbeat-writer.ts +333 -0
  385. package/src/core/agents/state/names.ts +399 -0
  386. package/src/core/agents/state/pidmap.ts +38 -0
  387. package/src/core/agents/state/scratch.ts +121 -0
  388. package/src/core/agents/state/shell-mutation.ts +44 -0
  389. package/src/core/agents/state/stale-sweep.ts +190 -0
  390. package/src/core/config.ts +111 -0
  391. package/src/core/hooks/cli.ts +1247 -0
  392. package/src/core/hooks/effects/image-capture.ts +330 -0
  393. package/src/core/hooks/effects/index.ts +210 -0
  394. package/src/core/hooks/events/emit.ts +120 -0
  395. package/src/core/hooks/events/schema.ts +430 -0
  396. package/src/core/hooks/events/ulid.ts +51 -0
  397. package/src/core/hooks/harness/detect.ts +30 -0
  398. package/src/core/hooks/harness/events.ts +102 -0
  399. package/src/core/hooks/harness/output.ts +100 -0
  400. package/src/core/hooks/harness/parse.ts +180 -0
  401. package/src/core/hooks/index.ts +16 -0
  402. package/src/core/hooks/resolve/anchor.ts +51 -0
  403. package/src/core/hooks/resolve/coord-root.ts +25 -0
  404. package/src/core/hooks/resolve/intent.ts +89 -0
  405. package/src/core/hooks/resolve/owner.ts +140 -0
  406. package/src/core/hooks/resolve/transcript.ts +72 -0
  407. package/src/hooks/.gitkeep +0 -0
  408. package/src/index.ts +15 -0
  409. package/src/lib/agent-browser/client.ts +239 -0
  410. package/src/lib/agent-browser/index.ts +1 -0
  411. package/src/lib/browser/client.ts +449 -0
  412. package/src/lib/browser/dev-overlay.ts +207 -0
  413. package/src/lib/browser/index.ts +24 -0
  414. package/src/lib/browser/layout.ts +288 -0
  415. package/src/lib/browser/visibility.ts +419 -0
  416. package/src/lib/browser/visual-diff.ts +150 -0
  417. package/src/lib/completion/bash.ts +291 -0
  418. package/src/lib/completion/fish.ts +134 -0
  419. package/src/lib/completion/index.ts +10 -0
  420. package/src/lib/completion/walk.ts +184 -0
  421. package/src/lib/completion/zsh.ts +262 -0
  422. package/src/lib/context/index.ts +386 -0
  423. package/src/lib/cookies/client.ts +301 -0
  424. package/src/lib/cookies/index.ts +13 -0
  425. package/src/lib/council/index.ts +803 -0
  426. package/src/lib/docs-index.ts +216 -0
  427. package/src/lib/docs-lint.ts +413 -0
  428. package/src/lib/docs-sweep.ts +348 -0
  429. package/src/lib/docs.ts +199 -0
  430. package/src/lib/env.ts +12 -0
  431. package/src/lib/exec.ts +74 -0
  432. package/src/lib/format.ts +147 -0
  433. package/src/lib/http/client.ts +211 -0
  434. package/src/lib/http/index.ts +1 -0
  435. package/src/lib/identities/index.ts +210 -0
  436. package/src/lib/machine.ts +61 -0
  437. package/src/lib/presence.ts +154 -0
  438. package/src/lib/readability/client.ts +169 -0
  439. package/src/lib/readability/index.ts +5 -0
  440. package/src/lib/readability/turndown-plugin-gfm.d.ts +10 -0
  441. package/src/lib/scratch/index.ts +470 -0
  442. package/src/lib/tunnel/gate.ts +113 -0
  443. package/src/lib/tunnel/state.ts +167 -0
  444. package/src/web/.gitkeep +0 -0
  445. package/index.js +0 -1
@@ -0,0 +1,436 @@
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
+ // Terminal events for an owner we've never seen must NOT seed a new heartbeat:
16
+ // that resurrects a dead agent as a nameless, started_at-less zombie (the
17
+ // `agent-unknown (20608d ago)` ghost). It happens when a subagent.stop /
18
+ // session.end drains without (or after) its matching start: seed() then
19
+ // apply(stop) writes a bare tombstone the sweep+readers then choke on. If
20
+ // there's no existing heartbeat and the first event we see for an owner is
21
+ // terminal, skip it entirely.
22
+ //
23
+ // `health.heartbeat_swept` is terminal for the same reason, and was the
24
+ // sharper bug: stale-sweep deletes a dead heartbeat then emits this event,
25
+ // which the projector replayed to RE-CREATE the very file the sweep just
26
+ // removed (minus files_touched, since no start event ever ran for it). The
27
+ // reader then flagged it "missing required fields", and the resurrected file,
28
+ // carrying a fresh last_heartbeat = the swept-event ts, survived one
29
+ // freshness window before the next sweep deleted-and-resurrected it again. A
30
+ // self-perpetuating zombie loop (same instance swept 18×). A swept event must
31
+ // never seed a heartbeat.
32
+ const TERMINAL = new Set(["session.end", "subagent.stop", "health.heartbeat_swept"]);
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 && TERMINAL.has(ev.event_type))
38
+ continue;
39
+ perOwner[ev.instance_id] = existing ?? seed(ev, coordRoot);
40
+ }
41
+ apply(perOwner[ev.instance_id], ev);
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
+ harness: ev.harness,
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
+ if (resolved.kind === "subagent")
96
+ hb.agent_id = ev.instance_id;
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) {
105
+ hb.last_heartbeat = ev.ts;
106
+ hb.last_event_id = ev.event_id;
107
+ hb.events_applied += 1;
108
+ hb.v2_meta.last_projected = new Date().toISOString();
109
+ if (ev.turn_id)
110
+ hb.last_turn_id = ev.turn_id;
111
+ const d = ev.data;
112
+ switch (ev.event_type) {
113
+ case "session.start":
114
+ hb.started_at = pickStr(d, "started_at") ?? ev.ts;
115
+ hb.harness = ev.harness;
116
+ {
117
+ const model = pickStr(d, "model");
118
+ if (model)
119
+ hb.model = model;
120
+ const platform = pickStr(d, "platform") ?? harnessToPlatform(ev.harness);
121
+ hb.platform = platform;
122
+ const name = pickStr(d, "name");
123
+ if (name)
124
+ hb.name = name;
125
+ const kind = pickStr(d, "kind");
126
+ if (kind === "session" || kind === "subagent" || kind === "transient") {
127
+ hb.kind = kind;
128
+ }
129
+ else if (!hb.kind) {
130
+ hb.kind = "session";
131
+ }
132
+ const agentId = pickStr(d, "agent_id");
133
+ if (agentId)
134
+ hb.agent_id = agentId;
135
+ const subagentCallId = pickStr(d, "subagent_call_id");
136
+ if (subagentCallId)
137
+ hb.subagent_call_id = subagentCallId;
138
+ const parentSession = pickStr(d, "parent_session_id");
139
+ if (parentSession)
140
+ hb.parent_session_id = parentSession;
141
+ if (!hb.files_touched)
142
+ hb.files_touched = [];
143
+ }
144
+ break;
145
+ case "session.end":
146
+ hb.ended_at = pickStr(d, "ended_at") ?? ev.ts;
147
+ hb.clean_exit = pickBool(d, "clean_exit");
148
+ break;
149
+ case "subagent.start": {
150
+ const name = pickStr(d, "name");
151
+ if (name)
152
+ hb.name = name;
153
+ hb.kind = "subagent";
154
+ const parentSession = pickStr(d, "parent_session_id");
155
+ if (parentSession)
156
+ hb.parent_session_id = parentSession;
157
+ const subagentCallId = pickStr(d, "subagent_call_id");
158
+ if (subagentCallId)
159
+ hb.subagent_call_id = subagentCallId;
160
+ hb.agent_id = ev.instance_id;
161
+ hb.started_at = ev.ts;
162
+ if (!hb.files_touched)
163
+ hb.files_touched = [];
164
+ hb.platform = harnessToPlatform(ev.harness);
165
+ break;
166
+ }
167
+ case "subagent.stop":
168
+ hb.ended_at = pickStr(d, "ended_at") ?? ev.ts;
169
+ hb.clean_exit = pickBool(d, "clean_exit") ?? true;
170
+ break;
171
+ case "user_prompt.submit":
172
+ hb.last_user_prompt_at = ev.ts;
173
+ break;
174
+ case "turn.stop":
175
+ hb.last_turn_stop_at = ev.ts;
176
+ hb.last_turn_status_box_present = pickBool(d, "status_box_present");
177
+ {
178
+ const summary = pickStr(d, "turn_summary");
179
+ if (summary) {
180
+ hb.turn_summary = summary;
181
+ hb.turn_summary_updated_at = ev.ts;
182
+ }
183
+ // Backfill model for harnesses that omit it at session.start (Claude
184
+ // Code). The Stop hook resolves it from the transcript by this point;
185
+ // only set when present so we never clobber a known model.
186
+ const model = pickStr(d, "model");
187
+ if (model)
188
+ hb.model = model;
189
+ }
190
+ break;
191
+ case "tool.pre_use": {
192
+ const toolName = pickStr(d, "tool_name");
193
+ hb.last_tool = toolName;
194
+ hb.last_tool_target = extractTarget(d);
195
+ hb.last_tool_at = ev.ts;
196
+ const intent = pickStr(d, "intent");
197
+ if (intent && intent !== "(no intent)") {
198
+ hb.last_intent = intent;
199
+ hb.last_intent_source = pickStr(d, "intent_source");
200
+ }
201
+ // Project files_touched: Edit / Write / NotebookEdit add their target.
202
+ if (toolName === "Edit" || toolName === "Write" || toolName === "NotebookEdit") {
203
+ const target = extractFilePath(d);
204
+ if (target) {
205
+ if (!hb.files_touched)
206
+ hb.files_touched = [];
207
+ if (!hb.files_touched.includes(target))
208
+ hb.files_touched.push(target);
209
+ }
210
+ }
211
+ break;
212
+ }
213
+ case "tool.post_use":
214
+ case "tool.post_use_failure":
215
+ hb.last_tool_at = ev.ts;
216
+ break;
217
+ case "state.task_set": {
218
+ const cleared = pickBool(d, "cleared");
219
+ const task = pickStr(d, "task");
220
+ if (cleared || !task) {
221
+ hb.task = undefined;
222
+ }
223
+ else {
224
+ hb.task = task;
225
+ }
226
+ hb.task_updated_at = ev.ts;
227
+ break;
228
+ }
229
+ case "state.status_checked":
230
+ hb.last_status_at = ev.ts;
231
+ break;
232
+ case "state.presence_change": {
233
+ const to = pickStr(d, "to");
234
+ if (to === "mobile" || to === "office")
235
+ hb.presence = to;
236
+ break;
237
+ }
238
+ case "claim.release": {
239
+ const path = pickStr(d, "path");
240
+ if (path && hb.files_touched) {
241
+ hb.files_touched = hb.files_touched.filter((p) => p !== path);
242
+ }
243
+ break;
244
+ }
245
+ }
246
+ }
247
+ function harnessToPlatform(harness) {
248
+ if (harness === "claude-code")
249
+ return "claude_code";
250
+ if (harness === "cursor")
251
+ return "cursor";
252
+ if (harness === "codex")
253
+ return "codex";
254
+ return harness;
255
+ }
256
+ function extractFilePath(data) {
257
+ const raw = data.tool_input;
258
+ if (typeof raw !== "string")
259
+ return undefined;
260
+ try {
261
+ const parsed = JSON.parse(raw);
262
+ return (pickStr(parsed, "file_path") ??
263
+ pickStr(parsed, "path") ??
264
+ pickStr(parsed, "notebook_path") ??
265
+ undefined);
266
+ }
267
+ catch {
268
+ return undefined;
269
+ }
270
+ }
271
+ function extractTarget(data) {
272
+ // tool_input is stringified JSON in our envelope; try to parse and pull a
273
+ // common target field (file_path, path, command).
274
+ const raw = data.tool_input;
275
+ if (typeof raw !== "string")
276
+ return undefined;
277
+ try {
278
+ const parsed = JSON.parse(raw);
279
+ return (pickStr(parsed, "file_path") ??
280
+ pickStr(parsed, "path") ??
281
+ pickStr(parsed, "notebook_path") ??
282
+ cleanCommand(pickStr(parsed, "command")) ??
283
+ undefined);
284
+ }
285
+ catch {
286
+ return undefined;
287
+ }
288
+ }
289
+ /**
290
+ * The repo mandates a `# intent: …` first-line comment on every Bash command,
291
+ * so a raw `command` payload starts with the intent prose, not the command.
292
+ * Stamping that into `last_tool_target` leaked the intent into the peer table
293
+ * and pushed the real command past the 60-char render slice. Skip leading
294
+ * comment-only lines so the target reflects what the agent is actually running.
295
+ */
296
+ function cleanCommand(command) {
297
+ if (command === undefined)
298
+ return undefined;
299
+ for (const line of command.split("\n")) {
300
+ const trimmed = line.trim();
301
+ if (!trimmed || trimmed.startsWith("#"))
302
+ continue;
303
+ return trimmed;
304
+ }
305
+ // All-comment / degenerate: fall back to the trimmed whole.
306
+ return command.trim() || undefined;
307
+ }
308
+ function readExisting(coordRoot, instanceId) {
309
+ const path = heartbeatPath(coordRoot, instanceId);
310
+ if (!existsSync(path))
311
+ return null;
312
+ try {
313
+ const raw = JSON.parse(readFileSync(path, "utf8"));
314
+ return coerceV2Heartbeat(raw, instanceId);
315
+ }
316
+ catch {
317
+ return null;
318
+ }
319
+ }
320
+ /**
321
+ * Restore the projector-owned invariant fields on a heartbeat read from disk.
322
+ *
323
+ * The active-heartbeat file has multiple producers: the projector (seed/apply,
324
+ * which set `v2_meta` + `events_applied`) AND the writer layer
325
+ * (heartbeat-writer.ts: healHeartbeat, setTask, stampToolActivity, …), which
326
+ * only knows the v1 shape and omits both. readExisting previously `as`-cast the
327
+ * raw JSON straight to V2Heartbeat, so a body recreated by `healHeartbeat`
328
+ * (e.g. a pruned Cursor session) reached apply() without `v2_meta` →
329
+ * `hb.v2_meta.last_projected = …` threw (caught + logged ~200×/day, phase
330
+ * "stop-projection"), and without `events_applied` → `events_applied += 1`
331
+ * silently went NaN. The read boundary is where untyped JSON becomes a typed
332
+ * V2Heartbeat, so it's where the type's required-field invariant must be
333
+ * re-established, covering every malformed producer, not just one symptom.
334
+ *
335
+ * Note `v2_meta` is NOT in writeHeartbeat's persisted allowlist, so it never
336
+ * lands on disk; it's ephemeral per-drain bookkeeping, which means readExisting
337
+ * must re-coerce it on EVERY read of an already-seen owner (not only for
338
+ * heal-written bodies). `events_applied` IS persisted, so coercing it to 0 only
339
+ * matters for bodies a writer produced without the field (e.g. healHeartbeat).
340
+ */
341
+ function coerceV2Heartbeat(raw, instanceId) {
342
+ const hb = raw;
343
+ if (!hb.instance_id)
344
+ hb.instance_id = instanceId;
345
+ if (typeof hb.events_applied !== "number" || Number.isNaN(hb.events_applied)) {
346
+ hb.events_applied = 0;
347
+ }
348
+ if (!hb.v2_meta) {
349
+ const nowIso = new Date().toISOString();
350
+ hb.v2_meta = {
351
+ schema_version: 1,
352
+ first_seen: hb.last_heartbeat ?? nowIso,
353
+ last_projected: nowIso,
354
+ };
355
+ }
356
+ return hb;
357
+ }
358
+ function writeHeartbeat(coordRoot, instanceId, hb) {
359
+ const path = heartbeatPath(coordRoot, instanceId);
360
+ try {
361
+ mkdirSync(dirname(path), { recursive: true });
362
+ // Additive merge with existing body so writes from sibling tools (e.g.
363
+ // `agent-coord set-task` that doesn't go through the canonical event
364
+ // stream) survive each projector run. Projected fields win on conflict.
365
+ let existing = {};
366
+ if (existsSync(path)) {
367
+ try {
368
+ existing = JSON.parse(readFileSync(path, "utf8"));
369
+ }
370
+ catch {
371
+ /* skip merge */
372
+ }
373
+ }
374
+ const merged = {
375
+ schema_version: 1,
376
+ ...existing,
377
+ instance_id: hb.instance_id,
378
+ session_id: hb.session_id,
379
+ last_heartbeat: hb.last_heartbeat,
380
+ last_event_id: hb.last_event_id,
381
+ events_applied: hb.events_applied,
382
+ };
383
+ setIfDefined(merged, "name", hb.name);
384
+ setIfDefined(merged, "kind", hb.kind);
385
+ setIfDefined(merged, "agent_id", hb.agent_id);
386
+ setIfDefined(merged, "subagent_call_id", hb.subagent_call_id);
387
+ setIfDefined(merged, "model", hb.model);
388
+ setIfDefined(merged, "platform", hb.platform);
389
+ setIfDefined(merged, "started_at", hb.started_at);
390
+ // files_touched is a required-array invariant for every reader
391
+ // (coord-reader.isHeartbeatShape, the web UI, stale-sweep). Seed paths that
392
+ // never hit a start event leave it undefined; default to [] so the writer
393
+ // can never emit a file that fails the reader's shape check. Belt to the
394
+ // TERMINAL guard's suspenders.
395
+ merged.files_touched = hb.files_touched ?? [];
396
+ setIfDefined(merged, "last_tool", hb.last_tool);
397
+ setIfDefined(merged, "last_tool_target", hb.last_tool_target);
398
+ setIfDefined(merged, "last_tool_at", hb.last_tool_at);
399
+ setIfDefined(merged, "task", hb.task);
400
+ setIfDefined(merged, "task_updated_at", hb.task_updated_at);
401
+ setIfDefined(merged, "last_status_at", hb.last_status_at);
402
+ setIfDefined(merged, "turn_summary", hb.turn_summary);
403
+ setIfDefined(merged, "turn_summary_updated_at", hb.turn_summary_updated_at);
404
+ setIfDefined(merged, "current_turn_id", hb.last_turn_id);
405
+ setIfDefined(merged, "parent_instance_id", hb.parent_session_id);
406
+ // Atomic temp+rename (same primitive as heartbeat-writer.ts:atomicWrite) so
407
+ // a concurrent reader (stale-sweep, `harn agents`, the web UI) never sees a
408
+ // half-written file. A plain in-place writeFileSync truncates-then-writes,
409
+ // exposing a partial-read window; stale-sweep deletes any heartbeat it
410
+ // fails to JSON.parse, so a partial read there would delete a live agent.
411
+ const tmp = `${path}.tmp.${process.pid}`;
412
+ writeFileSync(tmp, JSON.stringify(merged, null, 2), "utf8");
413
+ renameSync(tmp, path);
414
+ }
415
+ catch {
416
+ /* surfaced by caller via missing heartbeat file */
417
+ }
418
+ }
419
+ export function heartbeatPath(coordRoot, instanceId) {
420
+ return join(coordRoot, ".harnery", "active", `${instanceId}.json`);
421
+ }
422
+ /** Set a field only when value is defined (not null/undefined). Used by the
423
+ * additive merge so non-projected writes survive projector runs. */
424
+ function setIfDefined(target, key, value) {
425
+ if (value !== undefined && value !== null) {
426
+ target[key] = value;
427
+ }
428
+ }
429
+ function pickStr(o, k) {
430
+ const v = o[k];
431
+ return typeof v === "string" && v.length > 0 ? v : undefined;
432
+ }
433
+ function pickBool(o, k) {
434
+ const v = o[k];
435
+ return typeof v === "boolean" ? v : undefined;
436
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * TS implementation of the heartbeat-mutating actions. Replaces the previous
3
+ * flock-serialized bash writes with atomic temp+rename in Bun. Phase 6 of the
4
+ * agent-hooks/agent-coord refactor.
5
+ *
6
+ * Atomicity guarantee: every write goes via a `<path>.tmp.<pid>` sibling +
7
+ * `renameSync`. POSIX rename is atomic within a filesystem, so concurrent
8
+ * readers either see the pre-write file or the post-write file but never a
9
+ * half-written intermediate. Concurrent writers serialize via the rename
10
+ * (last write wins).
11
+ *
12
+ * Owner identity invariant: every action operates on `.harnery/active/<instance_id>.json`
13
+ * (the file IS the heartbeat). No mutations happen elsewhere.
14
+ */
15
+ export interface Heartbeat {
16
+ schema_version?: number;
17
+ instance_id: string;
18
+ name?: string;
19
+ kind?: string;
20
+ agent_id?: string;
21
+ session_id: string;
22
+ subagent_call_id?: string;
23
+ model?: string;
24
+ platform?: string;
25
+ started_at?: string;
26
+ last_heartbeat: string;
27
+ files_touched: string[];
28
+ task?: string;
29
+ task_updated_at?: string | null;
30
+ last_status_at?: string;
31
+ turn_summary?: string | null;
32
+ turn_summary_updated_at?: string | null;
33
+ last_tool?: string;
34
+ last_tool_target?: string;
35
+ last_tool_at?: string;
36
+ current_turn_id?: string;
37
+ parent_instance_id?: string;
38
+ [extra: string]: unknown;
39
+ }
40
+ export declare function readHeartbeat(coordRoot: string, instanceId: string): Heartbeat | null;
41
+ export declare function setTask(coordRoot: string, instanceId: string, task: string): Heartbeat | null;
42
+ export declare function stampStatusCheck(coordRoot: string, instanceId: string): Heartbeat | null;
43
+ export declare function setTurnSummary(coordRoot: string, instanceId: string, summary: string): Heartbeat | null;
44
+ export declare function releaseClaim(coordRoot: string, instanceId: string, path: string): Heartbeat | null;
45
+ /**
46
+ * Session-group-wide unclaim. Walks every heartbeat sharing `groupId`
47
+ * (parent's session_id == group_id;
48
+ * subagents inherit it) and removes the path from each one's files_touched.
49
+ * Idempotent: heartbeats that don't hold the path are untouched.
50
+ *
51
+ * This is the Option B fix for post-commit's pid-map attribution hole: a
52
+ * subagent-held claim that doesn't live on the parent's heartbeat still gets
53
+ * pruned because the walk covers the whole group.
54
+ */
55
+ export declare function groupUnclaim(coordRoot: string, groupId: string, path: string): void;
56
+ export declare function killHeartbeat(coordRoot: string, instanceId: string): boolean;
57
+ export declare function healPidmap(coordRoot: string, instanceId: string, pid: number): void;
58
+ export declare function healHeartbeat(coordRoot: string, instanceId: string, sessionId?: string, model?: string, harness?: string): Heartbeat | null;
59
+ /**
60
+ * Stamp the heartbeat with the most-recent tool name + target. Written from
61
+ * the post-tool-use hook.
62
+ */
63
+ export declare function stampToolActivity(coordRoot: string, instanceId: string, toolName: string, target: string): Heartbeat | null;
64
+ //# sourceMappingURL=heartbeat-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-writer.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA6DH,MAAM,WAAW,SAAS;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAiBD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQrF;AAeD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAS7F;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAKxF;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,SAAS,GAAG,IAAI,CAMlB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,IAAI,CAKlB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA4BnF;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAS5E;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAuBnF;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,SAAS,GAAG,IAAI,CAqDlB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,IAAI,CAOlB"}