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,154 @@
1
+ import {
2
+ existsSync,
3
+ mkdirSync,
4
+ readFileSync,
5
+ renameSync,
6
+ unlinkSync,
7
+ writeFileSync,
8
+ } from "node:fs";
9
+ import { homedir } from "node:os";
10
+ import { dirname, join } from "node:path";
11
+ import { NO_DATA } from "./format.ts";
12
+
13
+ export type PresenceState = "mobile" | "office";
14
+ export type PresenceSource = "hook" | "cli";
15
+
16
+ export interface PresenceRecord {
17
+ state: PresenceState;
18
+ updated_at: string;
19
+ source: PresenceSource;
20
+ }
21
+
22
+ export interface PresenceRead {
23
+ state: PresenceState;
24
+ updated_at: string | null;
25
+ source: PresenceSource | null;
26
+ is_default: boolean;
27
+ }
28
+
29
+ const DEFAULT_STATE: PresenceState = "office";
30
+
31
+ export function presenceFilePath(): string {
32
+ return join(homedir(), ".claude", "presence");
33
+ }
34
+
35
+ export function readPresence(): PresenceRead {
36
+ const path = presenceFilePath();
37
+ if (!existsSync(path)) {
38
+ return { state: DEFAULT_STATE, updated_at: null, source: null, is_default: true };
39
+ }
40
+ try {
41
+ const raw = readFileSync(path, "utf8").trim();
42
+ const parsed = JSON.parse(raw) as Partial<PresenceRecord>;
43
+ const state =
44
+ parsed.state === "mobile" || parsed.state === "office" ? parsed.state : DEFAULT_STATE;
45
+ const source = parsed.source === "hook" || parsed.source === "cli" ? parsed.source : null;
46
+ return {
47
+ state,
48
+ updated_at: typeof parsed.updated_at === "string" ? parsed.updated_at : null,
49
+ source,
50
+ is_default: false,
51
+ };
52
+ } catch {
53
+ return { state: DEFAULT_STATE, updated_at: null, source: null, is_default: true };
54
+ }
55
+ }
56
+
57
+ export function writePresence(state: PresenceState, source: PresenceSource): PresenceRecord {
58
+ const path = presenceFilePath();
59
+ const dir = dirname(path);
60
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
61
+
62
+ const record: PresenceRecord = {
63
+ state,
64
+ updated_at: new Date().toISOString(),
65
+ source,
66
+ };
67
+ const tmp = `${path}.tmp.${process.pid}.${Date.now()}`;
68
+ writeFileSync(tmp, `${JSON.stringify(record)}\n`);
69
+ renameSync(tmp, path);
70
+ return record;
71
+ }
72
+
73
+ export function clearPresence(): boolean {
74
+ const path = presenceFilePath();
75
+ if (!existsSync(path)) return false;
76
+ unlinkSync(path);
77
+ return true;
78
+ }
79
+
80
+ const CURLY_RE = /[‘’“”]/;
81
+ const STRAIGHT_RE = /['"]/;
82
+ const FENCED_BACKTICK_RE = /^```[\s\S]*?^```/gm;
83
+ const FENCED_TILDE_RE = /^~~~[\s\S]*?^~~~/gm;
84
+ const BLOCK_QUOTE_RE = /^>.*$/gm;
85
+
86
+ /**
87
+ * Strip fenced code blocks and `>`-quoted lines from the prompt before
88
+ * scanning for quote characters. Pasted code or quoted prose with smart
89
+ * quotes is the most common contamination vector; it shouldn't influence
90
+ * presence inference. Inline code spans are intentionally left as-is.
91
+ */
92
+ export function preprocessForDetection(prompt: string): string {
93
+ return prompt
94
+ .replace(FENCED_BACKTICK_RE, "")
95
+ .replace(FENCED_TILDE_RE, "")
96
+ .replace(BLOCK_QUOTE_RE, "");
97
+ }
98
+
99
+ /**
100
+ * Apply the detection rules to a prompt. Returns the inferred state, or null
101
+ * if the prompt carries no actionable signal (mixed quotes, no quotes + not
102
+ * short-trailing-space, etc.), in which case the caller should preserve
103
+ * current state.
104
+ *
105
+ * Rule order (first match wins):
106
+ * 1. Both curly AND straight present -> null (mixed)
107
+ * 2. Curly only -> mobile
108
+ * 3. Straight only -> office
109
+ * 4. <100 chars and ends with space -> mobile
110
+ * 5. Otherwise -> null
111
+ */
112
+ export function detectFromPrompt(prompt: string): PresenceState | null {
113
+ const cleaned = preprocessForDetection(prompt);
114
+ const hasCurly = CURLY_RE.test(cleaned);
115
+ const hasStraight = STRAIGHT_RE.test(cleaned);
116
+
117
+ if (hasCurly && hasStraight) return null;
118
+ if (hasCurly) return "mobile";
119
+ if (hasStraight) return "office";
120
+ if (prompt.length < 100 && prompt.endsWith(" ")) return "mobile";
121
+ return null;
122
+ }
123
+
124
+ export interface DetectResult {
125
+ changed: boolean;
126
+ before: PresenceState;
127
+ after: PresenceState;
128
+ detected: PresenceState | null;
129
+ }
130
+
131
+ export function applyDetection(prompt: string): DetectResult {
132
+ const current = readPresence();
133
+ const detected = detectFromPrompt(prompt);
134
+ if (detected === null || detected === current.state) {
135
+ return { changed: false, before: current.state, after: current.state, detected };
136
+ }
137
+ writePresence(detected, "hook");
138
+ return { changed: true, before: current.state, after: detected, detected };
139
+ }
140
+
141
+ export function ageSeconds(updated_at: string | null): number | null {
142
+ if (!updated_at) return null;
143
+ const t = Date.parse(updated_at);
144
+ if (Number.isNaN(t)) return null;
145
+ return Math.max(0, Math.floor((Date.now() - t) / 1000));
146
+ }
147
+
148
+ export function formatAge(seconds: number | null): string {
149
+ if (seconds === null) return NO_DATA;
150
+ if (seconds < 60) return `${seconds}s`;
151
+ if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;
152
+ if (seconds < 86400) return `${Math.floor(seconds / 3600)}h`;
153
+ return `${Math.floor(seconds / 86400)}d`;
154
+ }
@@ -0,0 +1,156 @@
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
+
7
+ /**
8
+ * HTML → clean markdown via Readability (main-content extraction) +
9
+ * Turndown (HTML → markdown).
10
+ *
11
+ * The library backing the `read` command.
12
+ */
13
+
14
+ export interface ReadabilityOptions {
15
+ /** Base URL for resolving relative links. Default `http://local/`. */
16
+ url?: string;
17
+ /** CSS selector for content. Bypasses Readability when set. */
18
+ selector?: string;
19
+ /** Truncate output to N chars (0 = no limit). Default 100000. */
20
+ maxChars?: number;
21
+ /** Return cleaned HTML instead of markdown (debugging). */
22
+ raw?: boolean;
23
+ }
24
+
25
+ export interface ReadabilityResult {
26
+ /** Final output: markdown or cleaned HTML when `raw: true`. */
27
+ output: string;
28
+ /** Pre-truncation length so callers can report what was dropped. */
29
+ rawLength: number;
30
+ /** Article title from Readability (`null` when --selector is used). */
31
+ title: string | null;
32
+ }
33
+
34
+ const DEFAULT_MAX_CHARS = 100_000;
35
+
36
+ /**
37
+ * Convert raw HTML to clean markdown.
38
+ *
39
+ * Throws if input is empty, the selector matches nothing, or Readability
40
+ * fails to find a main article (caller should retry with `selector`).
41
+ */
42
+ export function htmlToMarkdown(html: string, opts: ReadabilityOptions = {}): ReadabilityResult {
43
+ if (!html.trim()) {
44
+ throw new Error("Empty HTML input");
45
+ }
46
+
47
+ const dom = new JSDOM(html, { url: opts.url ?? "http://local/" });
48
+ const doc = dom.window.document;
49
+ preprocessDom(doc);
50
+
51
+ let contentHtml: string;
52
+ let title: string | null = null;
53
+
54
+ if (opts.selector) {
55
+ const el = doc.querySelector(opts.selector);
56
+ if (!el) {
57
+ throw new Error(`Selector "${opts.selector}" matched nothing`);
58
+ }
59
+ contentHtml = el.outerHTML;
60
+ } else {
61
+ const article = new Readability(doc).parse();
62
+ if (!article) {
63
+ throw new Error(
64
+ "Readability found no main content. Try a CSS selector via the `selector` option.",
65
+ );
66
+ }
67
+ contentHtml = article.content ?? "";
68
+ title = article.title ?? null;
69
+ }
70
+
71
+ const maxChars = opts.maxChars ?? DEFAULT_MAX_CHARS;
72
+
73
+ if (opts.raw) {
74
+ const clean = postprocess(contentHtml, maxChars);
75
+ return { output: clean, rawLength: contentHtml.length, title };
76
+ }
77
+
78
+ const turndown = new TurndownService({
79
+ headingStyle: "atx",
80
+ codeBlockStyle: "fenced",
81
+ bulletListMarker: "-",
82
+ });
83
+ turndown.remove(["script", "style", "iframe", "noscript"]);
84
+ turndown.use(tables);
85
+ // GFM-spec strikethrough is `~~text~~`. turndown-plugin-gfm's bundled
86
+ // strikethrough emits single-tilde `~text~` for pre-spec compatibility,
87
+ // which most modern renderers (GitHub, VS Code, CommonMark with the
88
+ // strikethrough extension) don't recognize. Register our own.
89
+ turndown.addRule("strikethrough-gfm", {
90
+ filter: (node) =>
91
+ node.nodeName === "DEL" || node.nodeName === "S" || node.nodeName === "STRIKE",
92
+ replacement: (content) => `~~${content}~~`,
93
+ });
94
+ const markdown = turndown.turndown(contentHtml);
95
+ const out = postprocess(markdown, maxChars);
96
+ return { output: out, rawLength: markdown.length, title };
97
+ }
98
+
99
+ /**
100
+ * Two pre-Turndown / pre-Readability HTML fixups that target the
101
+ * highest-impact noise patterns we hit in real-world scrapes:
102
+ *
103
+ * 1. `<br>` inside table cells (`<th>`/`<td>`) → replace with a space.
104
+ * turndown-plugin-gfm emits literal `\n` for `<br>` and that breaks
105
+ * strict CommonMark renderers when it lands inside a markdown table
106
+ * cell. GitHub tolerates it but the resulting markdown is uglier.
107
+ *
108
+ * 2. `<pre>` containing element children (e.g. syntax-highlighting
109
+ * `<span>`-per-token) → collapse to plain textContent. Turndown's
110
+ * bare-`<pre>` path treats element-rich `<pre>` blocks as inline
111
+ * text and escapes `<`/`>`/`*`/etc, producing very noisy markdown
112
+ * that no longer round-trips as code. The textContent of any
113
+ * well-formed token-highlighted block IS the original code.
114
+ *
115
+ * Applied AFTER JSDOM parse but BEFORE Readability / selector extraction
116
+ * so both paths benefit. Both passes are no-ops on HTML that doesn't
117
+ * exhibit the pattern, so the cost on simple inputs is one DOM walk.
118
+ */
119
+ function preprocessDom(doc: Document): void {
120
+ // (1) Flatten <br> inside table cells.
121
+ for (const br of Array.from(doc.querySelectorAll("td br, th br"))) {
122
+ br.replaceWith(doc.createTextNode(" "));
123
+ }
124
+ // (2) Collapse element-rich <pre> blocks to <pre><code>textContent</code>
125
+ // so Turndown's fenced-code-block rule applies. Pure-text <pre> and
126
+ // canonical <pre><code>...</code></pre> wrappers are left alone;
127
+ // Turndown handles both correctly (the latter even with nested
128
+ // syntax-highlighting spans inside the <code>, since the rule keys
129
+ // on textContent). The bug case is element-rich <pre> WITHOUT a
130
+ // <code> wrapper (per-token <span>s as direct pre children), which
131
+ // Turndown otherwise treats as inline text and escapes every <, >,
132
+ // *, etc.
133
+ for (const pre of Array.from(doc.querySelectorAll("pre"))) {
134
+ if (pre.children.length === 0) continue;
135
+ if (pre.children.length === 1 && pre.children[0]?.nodeName === "CODE") continue;
136
+ const text = pre.textContent ?? "";
137
+ while (pre.firstChild) pre.removeChild(pre.firstChild);
138
+ const code = doc.createElement("code");
139
+ code.appendChild(doc.createTextNode(text));
140
+ pre.appendChild(code);
141
+ }
142
+ }
143
+
144
+ function postprocess(text: string, maxChars: number): string {
145
+ let out = text
146
+ .split("\n")
147
+ .map((line) => line.replace(/[ \t]+$/, ""))
148
+ .join("\n")
149
+ .replace(/\n{3,}/g, "\n\n")
150
+ .trim();
151
+
152
+ if (maxChars > 0 && out.length > maxChars) {
153
+ out = `${out.slice(0, maxChars)}\n\n... [truncated from ${text.length} to ${maxChars} chars]`;
154
+ }
155
+ return out;
156
+ }
@@ -0,0 +1,5 @@
1
+ export {
2
+ htmlToMarkdown,
3
+ type ReadabilityOptions,
4
+ type ReadabilityResult,
5
+ } from "./client.js";
@@ -0,0 +1,10 @@
1
+ declare module "turndown-plugin-gfm" {
2
+ import type TurndownService from "turndown";
3
+
4
+ type Plugin = (service: TurndownService) => void;
5
+ export const gfm: Plugin;
6
+ export const tables: Plugin;
7
+ export const strikethrough: Plugin;
8
+ export const taskListItems: Plugin;
9
+ export const highlightedCodeBlock: Plugin;
10
+ }