harnery 0.0.1 → 0.2.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 (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 +494 -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 +32 -0
  316. package/dist/lib/readability/client.d.ts.map +1 -0
  317. package/dist/lib/readability/client.js +119 -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 +564 -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 +156 -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,61 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { hostname } from "node:os";
3
+ import { resolve } from "node:path";
4
+ import { coordEnv } from "./env.js";
5
+ /**
6
+ * Resolve a human-friendly label for the current machine. Used to tag
7
+ * coordination artifacts (scratch-doc headers, session telemetry) by the host
8
+ * they originated on.
9
+ *
10
+ * Precedence (first non-empty wins):
11
+ * 1. HARNERY_MACHINE env var: transient / per-launch / CI override
12
+ * 2. ~/.config/harnery/machine file: persistent, harness-neutral identity
13
+ * 3. os.hostname() (normalized): automatic floor; never empty
14
+ *
15
+ * The env var sits on top for ad-hoc overrides; the file is the durable home for
16
+ * a machine's name (it survives across Claude Code / Cursor / Codex and GUI
17
+ * launches that don't inherit a shell rc); hostname guarantees a real answer
18
+ * with zero configuration.
19
+ */
20
+ export function resolveMachineLabel() {
21
+ const fromEnv = coordEnv("MACHINE")?.trim();
22
+ if (fromEnv)
23
+ return fromEnv;
24
+ const fromFile = readMachineFile();
25
+ if (fromFile)
26
+ return fromFile;
27
+ return normalizeHost(hostname());
28
+ }
29
+ /** Absolute path of the machine-label file, honoring XDG_CONFIG_HOME. */
30
+ export function machineFilePath() {
31
+ const home = process.env.HOME ?? process.env.USERPROFILE;
32
+ if (!home)
33
+ return null;
34
+ const configHome = process.env.XDG_CONFIG_HOME?.trim() || resolve(home, ".config");
35
+ return resolve(configHome, "harnery", "machine");
36
+ }
37
+ /** First non-empty, non-comment line of the machine-label file, or null. */
38
+ function readMachineFile() {
39
+ const path = machineFilePath();
40
+ if (!path || !existsSync(path))
41
+ return null;
42
+ try {
43
+ for (const line of readFileSync(path, "utf8").split("\n")) {
44
+ const trimmed = line.trim();
45
+ if (trimmed && !trimmed.startsWith("#"))
46
+ return trimmed;
47
+ }
48
+ }
49
+ catch {
50
+ /* unreadable; fall through to hostname */
51
+ }
52
+ return null;
53
+ }
54
+ /** Lowercase, strip a trailing `.local` (macOS mDNS suffix). Never empty. */
55
+ function normalizeHost(raw) {
56
+ const cleaned = raw
57
+ .trim()
58
+ .replace(/\.local$/i, "")
59
+ .toLowerCase();
60
+ return cleaned || "unknown";
61
+ }
@@ -0,0 +1,48 @@
1
+ export type PresenceState = "mobile" | "office";
2
+ export type PresenceSource = "hook" | "cli";
3
+ export interface PresenceRecord {
4
+ state: PresenceState;
5
+ updated_at: string;
6
+ source: PresenceSource;
7
+ }
8
+ export interface PresenceRead {
9
+ state: PresenceState;
10
+ updated_at: string | null;
11
+ source: PresenceSource | null;
12
+ is_default: boolean;
13
+ }
14
+ export declare function presenceFilePath(): string;
15
+ export declare function readPresence(): PresenceRead;
16
+ export declare function writePresence(state: PresenceState, source: PresenceSource): PresenceRecord;
17
+ export declare function clearPresence(): boolean;
18
+ /**
19
+ * Strip fenced code blocks and `>`-quoted lines from the prompt before
20
+ * scanning for quote characters. Pasted code or quoted prose with smart
21
+ * quotes is the most common contamination vector; it shouldn't influence
22
+ * presence inference. Inline code spans are intentionally left as-is.
23
+ */
24
+ export declare function preprocessForDetection(prompt: string): string;
25
+ /**
26
+ * Apply the detection rules to a prompt. Returns the inferred state, or null
27
+ * if the prompt carries no actionable signal (mixed quotes, no quotes + not
28
+ * short-trailing-space, etc.), in which case the caller should preserve
29
+ * current state.
30
+ *
31
+ * Rule order (first match wins):
32
+ * 1. Both curly AND straight present -> null (mixed)
33
+ * 2. Curly only -> mobile
34
+ * 3. Straight only -> office
35
+ * 4. <100 chars and ends with space -> mobile
36
+ * 5. Otherwise -> null
37
+ */
38
+ export declare function detectFromPrompt(prompt: string): PresenceState | null;
39
+ export interface DetectResult {
40
+ changed: boolean;
41
+ before: PresenceState;
42
+ after: PresenceState;
43
+ detected: PresenceState | null;
44
+ }
45
+ export declare function applyDetection(prompt: string): DetectResult;
46
+ export declare function ageSeconds(updated_at: string | null): number | null;
47
+ export declare function formatAge(seconds: number | null): string;
48
+ //# sourceMappingURL=presence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/lib/presence.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;CACrB;AAID,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,YAAY,IAAI,YAAY,CAoB3C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,cAAc,CAc1F;AAED,wBAAgB,aAAa,IAAI,OAAO,CAKvC;AAQD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUrE;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAQ3D;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMxD"}
@@ -0,0 +1,123 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { NO_DATA } from "./format.js";
5
+ const DEFAULT_STATE = "office";
6
+ export function presenceFilePath() {
7
+ return join(homedir(), ".claude", "presence");
8
+ }
9
+ export function readPresence() {
10
+ const path = presenceFilePath();
11
+ if (!existsSync(path)) {
12
+ return { state: DEFAULT_STATE, updated_at: null, source: null, is_default: true };
13
+ }
14
+ try {
15
+ const raw = readFileSync(path, "utf8").trim();
16
+ const parsed = JSON.parse(raw);
17
+ const state = parsed.state === "mobile" || parsed.state === "office" ? parsed.state : DEFAULT_STATE;
18
+ const source = parsed.source === "hook" || parsed.source === "cli" ? parsed.source : null;
19
+ return {
20
+ state,
21
+ updated_at: typeof parsed.updated_at === "string" ? parsed.updated_at : null,
22
+ source,
23
+ is_default: false,
24
+ };
25
+ }
26
+ catch {
27
+ return { state: DEFAULT_STATE, updated_at: null, source: null, is_default: true };
28
+ }
29
+ }
30
+ export function writePresence(state, source) {
31
+ const path = presenceFilePath();
32
+ const dir = dirname(path);
33
+ if (!existsSync(dir))
34
+ mkdirSync(dir, { recursive: true });
35
+ const record = {
36
+ state,
37
+ updated_at: new Date().toISOString(),
38
+ source,
39
+ };
40
+ const tmp = `${path}.tmp.${process.pid}.${Date.now()}`;
41
+ writeFileSync(tmp, `${JSON.stringify(record)}\n`);
42
+ renameSync(tmp, path);
43
+ return record;
44
+ }
45
+ export function clearPresence() {
46
+ const path = presenceFilePath();
47
+ if (!existsSync(path))
48
+ return false;
49
+ unlinkSync(path);
50
+ return true;
51
+ }
52
+ const CURLY_RE = /[‘’“”]/;
53
+ const STRAIGHT_RE = /['"]/;
54
+ const FENCED_BACKTICK_RE = /^```[\s\S]*?^```/gm;
55
+ const FENCED_TILDE_RE = /^~~~[\s\S]*?^~~~/gm;
56
+ const BLOCK_QUOTE_RE = /^>.*$/gm;
57
+ /**
58
+ * Strip fenced code blocks and `>`-quoted lines from the prompt before
59
+ * scanning for quote characters. Pasted code or quoted prose with smart
60
+ * quotes is the most common contamination vector; it shouldn't influence
61
+ * presence inference. Inline code spans are intentionally left as-is.
62
+ */
63
+ export function preprocessForDetection(prompt) {
64
+ return prompt
65
+ .replace(FENCED_BACKTICK_RE, "")
66
+ .replace(FENCED_TILDE_RE, "")
67
+ .replace(BLOCK_QUOTE_RE, "");
68
+ }
69
+ /**
70
+ * Apply the detection rules to a prompt. Returns the inferred state, or null
71
+ * if the prompt carries no actionable signal (mixed quotes, no quotes + not
72
+ * short-trailing-space, etc.), in which case the caller should preserve
73
+ * current state.
74
+ *
75
+ * Rule order (first match wins):
76
+ * 1. Both curly AND straight present -> null (mixed)
77
+ * 2. Curly only -> mobile
78
+ * 3. Straight only -> office
79
+ * 4. <100 chars and ends with space -> mobile
80
+ * 5. Otherwise -> null
81
+ */
82
+ export function detectFromPrompt(prompt) {
83
+ const cleaned = preprocessForDetection(prompt);
84
+ const hasCurly = CURLY_RE.test(cleaned);
85
+ const hasStraight = STRAIGHT_RE.test(cleaned);
86
+ if (hasCurly && hasStraight)
87
+ return null;
88
+ if (hasCurly)
89
+ return "mobile";
90
+ if (hasStraight)
91
+ return "office";
92
+ if (prompt.length < 100 && prompt.endsWith(" "))
93
+ return "mobile";
94
+ return null;
95
+ }
96
+ export function applyDetection(prompt) {
97
+ const current = readPresence();
98
+ const detected = detectFromPrompt(prompt);
99
+ if (detected === null || detected === current.state) {
100
+ return { changed: false, before: current.state, after: current.state, detected };
101
+ }
102
+ writePresence(detected, "hook");
103
+ return { changed: true, before: current.state, after: detected, detected };
104
+ }
105
+ export function ageSeconds(updated_at) {
106
+ if (!updated_at)
107
+ return null;
108
+ const t = Date.parse(updated_at);
109
+ if (Number.isNaN(t))
110
+ return null;
111
+ return Math.max(0, Math.floor((Date.now() - t) / 1000));
112
+ }
113
+ export function formatAge(seconds) {
114
+ if (seconds === null)
115
+ return NO_DATA;
116
+ if (seconds < 60)
117
+ return `${seconds}s`;
118
+ if (seconds < 3600)
119
+ return `${Math.floor(seconds / 60)}m`;
120
+ if (seconds < 86400)
121
+ return `${Math.floor(seconds / 3600)}h`;
122
+ return `${Math.floor(seconds / 86400)}d`;
123
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * HTML → clean markdown via Readability (main-content extraction) +
3
+ * Turndown (HTML → markdown).
4
+ *
5
+ * The library backing the `read` command.
6
+ */
7
+ export interface ReadabilityOptions {
8
+ /** Base URL for resolving relative links. Default `http://local/`. */
9
+ url?: string;
10
+ /** CSS selector for content. Bypasses Readability when set. */
11
+ selector?: string;
12
+ /** Truncate output to N chars (0 = no limit). Default 100000. */
13
+ maxChars?: number;
14
+ /** Return cleaned HTML instead of markdown (debugging). */
15
+ raw?: boolean;
16
+ }
17
+ export interface ReadabilityResult {
18
+ /** Final output: markdown or cleaned HTML when `raw: true`. */
19
+ output: string;
20
+ /** Pre-truncation length so callers can report what was dropped. */
21
+ rawLength: number;
22
+ /** Article title from Readability (`null` when --selector is used). */
23
+ title: string | null;
24
+ }
25
+ /**
26
+ * Convert raw HTML to clean markdown.
27
+ *
28
+ * Throws if input is empty, the selector matches nothing, or Readability
29
+ * fails to find a main article (caller should retry with `selector`).
30
+ */
31
+ export declare function htmlToMarkdown(html: string, opts?: ReadabilityOptions): ReadabilityResult;
32
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/lib/readability/client.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,iBAAiB,CAuD7F"}
@@ -0,0 +1,119 @@
1
+ /// <reference path="./turndown-plugin-gfm.d.ts" />
2
+ import { Readability } from "@mozilla/readability";
3
+ import { JSDOM } from "jsdom";
4
+ import TurndownService from "turndown";
5
+ import { tables } from "turndown-plugin-gfm";
6
+ const DEFAULT_MAX_CHARS = 100_000;
7
+ /**
8
+ * Convert raw HTML to clean markdown.
9
+ *
10
+ * Throws if input is empty, the selector matches nothing, or Readability
11
+ * fails to find a main article (caller should retry with `selector`).
12
+ */
13
+ export function htmlToMarkdown(html, opts = {}) {
14
+ if (!html.trim()) {
15
+ throw new Error("Empty HTML input");
16
+ }
17
+ const dom = new JSDOM(html, { url: opts.url ?? "http://local/" });
18
+ const doc = dom.window.document;
19
+ preprocessDom(doc);
20
+ let contentHtml;
21
+ let title = null;
22
+ if (opts.selector) {
23
+ const el = doc.querySelector(opts.selector);
24
+ if (!el) {
25
+ throw new Error(`Selector "${opts.selector}" matched nothing`);
26
+ }
27
+ contentHtml = el.outerHTML;
28
+ }
29
+ else {
30
+ const article = new Readability(doc).parse();
31
+ if (!article) {
32
+ throw new Error("Readability found no main content. Try a CSS selector via the `selector` option.");
33
+ }
34
+ contentHtml = article.content ?? "";
35
+ title = article.title ?? null;
36
+ }
37
+ const maxChars = opts.maxChars ?? DEFAULT_MAX_CHARS;
38
+ if (opts.raw) {
39
+ const clean = postprocess(contentHtml, maxChars);
40
+ return { output: clean, rawLength: contentHtml.length, title };
41
+ }
42
+ const turndown = new TurndownService({
43
+ headingStyle: "atx",
44
+ codeBlockStyle: "fenced",
45
+ bulletListMarker: "-",
46
+ });
47
+ turndown.remove(["script", "style", "iframe", "noscript"]);
48
+ turndown.use(tables);
49
+ // GFM-spec strikethrough is `~~text~~`. turndown-plugin-gfm's bundled
50
+ // strikethrough emits single-tilde `~text~` for pre-spec compatibility,
51
+ // which most modern renderers (GitHub, VS Code, CommonMark with the
52
+ // strikethrough extension) don't recognize. Register our own.
53
+ turndown.addRule("strikethrough-gfm", {
54
+ filter: (node) => node.nodeName === "DEL" || node.nodeName === "S" || node.nodeName === "STRIKE",
55
+ replacement: (content) => `~~${content}~~`,
56
+ });
57
+ const markdown = turndown.turndown(contentHtml);
58
+ const out = postprocess(markdown, maxChars);
59
+ return { output: out, rawLength: markdown.length, title };
60
+ }
61
+ /**
62
+ * Two pre-Turndown / pre-Readability HTML fixups that target the
63
+ * highest-impact noise patterns we hit in real-world scrapes:
64
+ *
65
+ * 1. `<br>` inside table cells (`<th>`/`<td>`) → replace with a space.
66
+ * turndown-plugin-gfm emits literal `\n` for `<br>` and that breaks
67
+ * strict CommonMark renderers when it lands inside a markdown table
68
+ * cell. GitHub tolerates it but the resulting markdown is uglier.
69
+ *
70
+ * 2. `<pre>` containing element children (e.g. syntax-highlighting
71
+ * `<span>`-per-token) → collapse to plain textContent. Turndown's
72
+ * bare-`<pre>` path treats element-rich `<pre>` blocks as inline
73
+ * text and escapes `<`/`>`/`*`/etc, producing very noisy markdown
74
+ * that no longer round-trips as code. The textContent of any
75
+ * well-formed token-highlighted block IS the original code.
76
+ *
77
+ * Applied AFTER JSDOM parse but BEFORE Readability / selector extraction
78
+ * so both paths benefit. Both passes are no-ops on HTML that doesn't
79
+ * exhibit the pattern, so the cost on simple inputs is one DOM walk.
80
+ */
81
+ function preprocessDom(doc) {
82
+ // (1) Flatten <br> inside table cells.
83
+ for (const br of Array.from(doc.querySelectorAll("td br, th br"))) {
84
+ br.replaceWith(doc.createTextNode(" "));
85
+ }
86
+ // (2) Collapse element-rich <pre> blocks to <pre><code>textContent</code>
87
+ // so Turndown's fenced-code-block rule applies. Pure-text <pre> and
88
+ // canonical <pre><code>...</code></pre> wrappers are left alone;
89
+ // Turndown handles both correctly (the latter even with nested
90
+ // syntax-highlighting spans inside the <code>, since the rule keys
91
+ // on textContent). The bug case is element-rich <pre> WITHOUT a
92
+ // <code> wrapper (per-token <span>s as direct pre children), which
93
+ // Turndown otherwise treats as inline text and escapes every <, >,
94
+ // *, etc.
95
+ for (const pre of Array.from(doc.querySelectorAll("pre"))) {
96
+ if (pre.children.length === 0)
97
+ continue;
98
+ if (pre.children.length === 1 && pre.children[0]?.nodeName === "CODE")
99
+ continue;
100
+ const text = pre.textContent ?? "";
101
+ while (pre.firstChild)
102
+ pre.removeChild(pre.firstChild);
103
+ const code = doc.createElement("code");
104
+ code.appendChild(doc.createTextNode(text));
105
+ pre.appendChild(code);
106
+ }
107
+ }
108
+ function postprocess(text, maxChars) {
109
+ let out = text
110
+ .split("\n")
111
+ .map((line) => line.replace(/[ \t]+$/, ""))
112
+ .join("\n")
113
+ .replace(/\n{3,}/g, "\n\n")
114
+ .trim();
115
+ if (maxChars > 0 && out.length > maxChars) {
116
+ out = `${out.slice(0, maxChars)}\n\n... [truncated from ${text.length} to ${maxChars} chars]`;
117
+ }
118
+ return out;
119
+ }
@@ -0,0 +1,2 @@
1
+ export { htmlToMarkdown, type ReadabilityOptions, type ReadabilityResult, } from "./client.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/readability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export { htmlToMarkdown, } from "./client.js";
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Agent scratchpad: per-agent markdown journal at `.harnery/scratch/<instance_id>.md`.
3
+ *
4
+ * Rules:
5
+ * - Single writer (the agent itself, via this lib). Peers read but never write.
6
+ * - Append-only, newest entry first. Atomic temp-file + rename on each write.
7
+ * - Strict entry-header format: `## <Chicago datetime> · <category>`. The
8
+ * linter enforces this so format violations are impossible at the write path.
9
+ * - 50 KB hard cap; auto-prunes oldest entries when exceeded.
10
+ * - SessionEnd hook archives to `.harnery/scratch/archived/<instance_id>-<ts>.md`;
11
+ * SessionStart janitor deletes archives older than 7 days + surfaces the
12
+ * most-recent archive as a recovery cue.
13
+ */
14
+ export declare const SCRATCH_CATEGORIES: readonly ["note", "plan", "decision", "blocker", "question", "done", "handoff"];
15
+ export type ScratchCategory = (typeof SCRATCH_CATEGORIES)[number];
16
+ export declare const MAX_SCRATCH_BYTES: number;
17
+ export declare const WARN_SCRATCH_BYTES: number;
18
+ export declare const ARCHIVE_RETENTION_DAYS = 7;
19
+ /** Entry-header regex: `## 2026-05-15 1:48 AM CDT · note` */
20
+ export declare const ENTRY_HEADER_RE: RegExp;
21
+ /** First line of every scratchpad file: this prefix followed by the agent name. */
22
+ export declare const SCRATCHPAD_HEADER_PREFIX = "# Scratchpad: agent-";
23
+ export interface ScratchEntry {
24
+ ts_iso: string;
25
+ ts_display: string;
26
+ category: ScratchCategory;
27
+ body: string;
28
+ }
29
+ export interface ScratchHeader {
30
+ name: string;
31
+ session_id: string;
32
+ machine: string;
33
+ started: string;
34
+ last_updated: string;
35
+ }
36
+ export interface ScratchDoc {
37
+ path: string;
38
+ header: ScratchHeader;
39
+ entries: ScratchEntry[];
40
+ bytes: number;
41
+ }
42
+ export declare function scratchDir(): string;
43
+ export declare function archiveDir(): string;
44
+ export declare function scratchPath(instanceId: string): string;
45
+ /** Format `Date` as `2026-05-15 1:48 AM CDT`, what we write into the file. */
46
+ export declare function formatChicago(d?: Date): string;
47
+ /** Parse a scratchpad file (or empty content) into a structured doc. */
48
+ export declare function parseScratch(path: string, content: string): ScratchDoc;
49
+ /** Serialize a parsed doc back to markdown. */
50
+ export declare function serializeScratch(doc: ScratchDoc): string;
51
+ export interface LintIssue {
52
+ line: number;
53
+ message: string;
54
+ }
55
+ export declare function lintScratch(content: string, byteCap?: number): LintIssue[];
56
+ export declare function appendEntry(instanceId: string, category: ScratchCategory, body: string): ScratchDoc;
57
+ /** Move `<owner>.md` → `archived/<owner>-<ts>.md`. No-op if missing. Returns archive path (or null). */
58
+ export declare function archiveScratch(instanceId: string): string | null;
59
+ /** Delete archives older than `days`. Returns number deleted. */
60
+ export declare function pruneArchives(days?: number): number;
61
+ /** Sweep `.harnery/scratch/<owner>.md` files whose corresponding heartbeat is gone. */
62
+ export declare function sweepOrphanScratchpads(): string[];
63
+ /** List archive files sorted by mtime descending. */
64
+ export declare function listArchives(): {
65
+ path: string;
66
+ basename: string;
67
+ mtimeMs: number;
68
+ bytes: number;
69
+ }[];
70
+ export declare function currentOwnerOrThrow(): string;
71
+ export declare function loadScratch(instanceId: string): ScratchDoc | null;
72
+ /** Resolve an agent name → instance_id by walking active heartbeats (case-insensitive). */
73
+ export declare function resolveOwnerByName(name: string): string | null;
74
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/scratch/index.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,kBAAkB,iFAQrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAC3C,eAAO,MAAM,kBAAkB,QAAY,CAAC;AAC5C,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,6DAA6D;AAC7D,eAAO,MAAM,eAAe,QACyF,CAAC;AAEtH,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAInC;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD;AAeD,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,CAAC,GAAE,IAAiB,GAAG,MAAM,CAW1D;AAID,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CA+DtE;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAkBxD;AAmBD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,SAAoB,GAAG,SAAS,EAAE,CA2DrF;AAID,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,MAAM,GACX,UAAU,CAgEZ;AAID,wGAAwG;AACxG,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOhE;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,IAAI,SAAyB,GAAG,MAAM,CAkBnE;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAajD;AAED,qDAAqD;AACrD,wBAAgB,YAAY,IAAI;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,EAAE,CAWF;AAID,wBAAgB,mBAAmB,IAAI,MAAM,CAM5C;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAIjE;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB9D"}