harnery 0.30.0 → 0.31.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 (517) hide show
  1. package/README.md +4 -4
  2. package/dist/commander.d.ts +8 -0
  3. package/dist/commander.d.ts.map +1 -1
  4. package/dist/commander.js +14 -13
  5. package/dist/commands/adapter.d.ts +12 -0
  6. package/dist/commands/adapter.d.ts.map +1 -0
  7. package/dist/commands/{harness.js → adapter.js} +35 -35
  8. package/dist/commands/agents.d.ts +3 -2
  9. package/dist/commands/agents.d.ts.map +1 -1
  10. package/dist/commands/agents.js +185 -74
  11. package/dist/commands/artifacts.d.ts +4 -0
  12. package/dist/commands/artifacts.d.ts.map +1 -0
  13. package/dist/commands/artifacts.js +143 -0
  14. package/dist/commands/backup.d.ts +1 -1
  15. package/dist/commands/backup.d.ts.map +1 -1
  16. package/dist/commands/backup.js +5 -2
  17. package/dist/commands/browse.d.ts.map +1 -1
  18. package/dist/commands/browse.js +310 -7
  19. package/dist/commands/checkpoint.d.ts +12 -0
  20. package/dist/commands/checkpoint.d.ts.map +1 -0
  21. package/dist/commands/checkpoint.js +162 -0
  22. package/dist/commands/context.d.ts +2 -2
  23. package/dist/commands/context.d.ts.map +1 -1
  24. package/dist/commands/context.js +3 -151
  25. package/dist/commands/decision.d.ts.map +1 -1
  26. package/dist/commands/decision.js +31 -7
  27. package/dist/commands/deinit.d.ts +2 -2
  28. package/dist/commands/deinit.js +15 -15
  29. package/dist/commands/doctor.js +23 -23
  30. package/dist/commands/governor.d.ts +4 -0
  31. package/dist/commands/governor.d.ts.map +1 -0
  32. package/dist/commands/{supervisor.js → governor.js} +133 -108
  33. package/dist/commands/grep.d.ts +1 -1
  34. package/dist/commands/grep.d.ts.map +1 -1
  35. package/dist/commands/grep.js +19 -2
  36. package/dist/commands/init.d.ts +12 -12
  37. package/dist/commands/init.d.ts.map +1 -1
  38. package/dist/commands/init.js +44 -30
  39. package/dist/commands/{session.d.ts → journal.d.ts} +2 -2
  40. package/dist/commands/journal.d.ts.map +1 -0
  41. package/dist/commands/{scratch.js → journal.js} +47 -47
  42. package/dist/commands/policy.js +1 -1
  43. package/dist/commands/presence.js +2 -2
  44. package/dist/commands/sync.d.ts +1 -1
  45. package/dist/commands/sync.js +3 -3
  46. package/dist/commands/tunnel.d.ts +16 -0
  47. package/dist/commands/tunnel.d.ts.map +1 -1
  48. package/dist/commands/tunnel.js +213 -27
  49. package/dist/commands/web-fetch.js +1 -1
  50. package/dist/commands/web.d.ts +19 -0
  51. package/dist/commands/web.d.ts.map +1 -1
  52. package/dist/commands/web.js +51 -0
  53. package/dist/commands/work.d.ts.map +1 -1
  54. package/dist/commands/work.js +38 -22
  55. package/dist/commands/workflow.d.ts.map +1 -1
  56. package/dist/commands/workflow.js +35 -28
  57. package/dist/core/{harnesses → adapters}/attest-projection.d.ts +2 -2
  58. package/dist/core/adapters/attest-projection.d.ts.map +1 -0
  59. package/dist/core/{harnesses → adapters}/attest.d.ts +16 -16
  60. package/dist/core/adapters/attest.d.ts.map +1 -0
  61. package/dist/core/{harnesses → adapters}/attest.js +9 -9
  62. package/dist/core/{harnesses → adapters}/attestation.d.ts +16 -16
  63. package/dist/core/adapters/attestation.d.ts.map +1 -0
  64. package/dist/core/{harnesses → adapters}/attestation.js +20 -20
  65. package/dist/core/{harnesses → adapters}/bench.d.ts +12 -12
  66. package/dist/core/adapters/bench.d.ts.map +1 -0
  67. package/dist/core/{harnesses → adapters}/bench.js +12 -12
  68. package/dist/core/adapters/index.d.ts +13 -0
  69. package/dist/core/adapters/index.d.ts.map +1 -0
  70. package/dist/core/adapters/index.js +6 -0
  71. package/dist/core/{harnesses → adapters}/profiles.d.ts +11 -11
  72. package/dist/core/adapters/profiles.d.ts.map +1 -0
  73. package/dist/core/{harnesses → adapters}/profiles.js +11 -11
  74. package/dist/core/adapters/registry.d.ts +15 -0
  75. package/dist/core/adapters/registry.d.ts.map +1 -0
  76. package/dist/core/{harnesses → adapters}/registry.js +11 -11
  77. package/dist/core/{harnesses → adapters}/types.d.ts +23 -23
  78. package/dist/core/adapters/types.d.ts.map +1 -0
  79. package/dist/core/{harnesses → adapters}/types.js +1 -1
  80. package/dist/core/agents/canonical-emit.d.ts +9 -14
  81. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  82. package/dist/core/agents/canonical-emit.js +15 -44
  83. package/dist/core/agents/cli-emit.js +1 -1
  84. package/dist/core/agents/cli.js +30 -26
  85. package/dist/core/agents/codex-replay.d.ts +1 -1
  86. package/dist/core/agents/codex-replay.js +6 -6
  87. package/dist/core/agents/coord-bin.d.ts +33 -0
  88. package/dist/core/agents/coord-bin.d.ts.map +1 -0
  89. package/dist/core/agents/coord-bin.js +89 -0
  90. package/dist/core/agents/coord-client.d.ts +78 -8
  91. package/dist/core/agents/coord-client.d.ts.map +1 -1
  92. package/dist/core/agents/coord-client.js +303 -75
  93. package/dist/core/agents/events/consume.d.ts +1 -1
  94. package/dist/core/agents/events/emit.d.ts +5 -6
  95. package/dist/core/agents/events/emit.d.ts.map +1 -1
  96. package/dist/core/agents/events/emit.js +2 -2
  97. package/dist/core/agents/paths.d.ts +5 -2
  98. package/dist/core/agents/paths.d.ts.map +1 -1
  99. package/dist/core/agents/paths.js +7 -13
  100. package/dist/core/agents/render/prompt-context.d.ts +21 -9
  101. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  102. package/dist/core/agents/render/prompt-context.js +82 -30
  103. package/dist/core/agents/render/session-context.d.ts +1 -1
  104. package/dist/core/agents/render/session-context.js +5 -5
  105. package/dist/core/agents/rules/claim-conflict.d.ts +2 -6
  106. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  107. package/dist/core/agents/rules/claim-conflict.js +1 -1
  108. package/dist/core/agents/rules/commit-conflict.js +98 -22
  109. package/dist/core/agents/rules/stop-hook.d.ts +9 -9
  110. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  111. package/dist/core/agents/rules/stop-hook.js +23 -5
  112. package/dist/core/agents/rules/verdict.d.ts +14 -0
  113. package/dist/core/agents/rules/verdict.d.ts.map +1 -0
  114. package/dist/core/agents/rules/verdict.js +1 -0
  115. package/dist/core/agents/session-events.js +3 -3
  116. package/dist/core/agents/state/council.d.ts +1 -1
  117. package/dist/core/agents/state/council.js +1 -1
  118. package/dist/core/agents/state/heartbeat-projector.d.ts +3 -2
  119. package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -1
  120. package/dist/core/agents/state/heartbeat-projector.js +14 -10
  121. package/dist/core/agents/state/heartbeat-writer.d.ts +1 -1
  122. package/dist/core/agents/state/heartbeat-writer.js +12 -12
  123. package/dist/core/agents/state/{scratch.d.ts → journal.d.ts} +7 -7
  124. package/dist/core/agents/state/{scratch.d.ts.map → journal.d.ts.map} +1 -1
  125. package/dist/core/agents/state/{scratch.js → journal.js} +12 -12
  126. package/dist/core/agents/state/pidmap.d.ts +28 -4
  127. package/dist/core/agents/state/pidmap.d.ts.map +1 -1
  128. package/dist/core/agents/state/pidmap.js +130 -15
  129. package/dist/core/agents/state/proc-start.d.ts +95 -0
  130. package/dist/core/agents/state/proc-start.d.ts.map +1 -0
  131. package/dist/core/agents/state/proc-start.js +199 -0
  132. package/dist/core/agents/state/shell-mutation.d.ts +1 -1
  133. package/dist/core/agents/state/shell-mutation.js +1 -1
  134. package/dist/core/agents/state/stale-sweep.js +7 -7
  135. package/dist/core/artifacts/index.d.ts +86 -0
  136. package/dist/core/artifacts/index.d.ts.map +1 -0
  137. package/dist/core/artifacts/index.js +421 -0
  138. package/dist/core/config.d.ts +9 -2
  139. package/dist/core/config.d.ts.map +1 -1
  140. package/dist/core/config.js +26 -2
  141. package/dist/core/context/index.d.ts +12 -12
  142. package/dist/core/context/index.js +10 -10
  143. package/dist/core/governor/adapter-spread.d.ts +52 -0
  144. package/dist/core/governor/adapter-spread.d.ts.map +1 -0
  145. package/dist/core/governor/adapter-spread.js +52 -0
  146. package/dist/core/governor/index.d.ts +7 -0
  147. package/dist/core/governor/index.d.ts.map +1 -0
  148. package/dist/core/governor/index.js +6 -0
  149. package/dist/core/governor/plan-api.d.ts +38 -0
  150. package/dist/core/governor/plan-api.d.ts.map +1 -0
  151. package/dist/core/governor/plan-api.js +83 -0
  152. package/dist/core/governor/plan-read.d.ts +5 -0
  153. package/dist/core/governor/plan-read.d.ts.map +1 -0
  154. package/dist/core/{supervisor → governor}/plan-read.js +66 -52
  155. package/dist/core/{supervisor → governor}/plan-types.d.ts +57 -56
  156. package/dist/core/governor/plan-types.d.ts.map +1 -0
  157. package/dist/core/{supervisor → governor}/plan-types.js +4 -4
  158. package/dist/core/governor/planning.d.ts +48 -0
  159. package/dist/core/governor/planning.d.ts.map +1 -0
  160. package/dist/core/{supervisor → governor}/planning.js +125 -94
  161. package/dist/core/governor/read.d.ts +6 -0
  162. package/dist/core/governor/read.d.ts.map +1 -0
  163. package/dist/core/governor/read.js +4 -0
  164. package/dist/core/governor/runner.d.ts +37 -0
  165. package/dist/core/governor/runner.d.ts.map +1 -0
  166. package/dist/core/{supervisor → governor}/runner.js +15 -15
  167. package/dist/core/governor/service-read.d.ts +6 -0
  168. package/dist/core/governor/service-read.d.ts.map +1 -0
  169. package/dist/core/{supervisor → governor}/service-read.js +12 -12
  170. package/dist/core/governor/service.d.ts +114 -0
  171. package/dist/core/governor/service.d.ts.map +1 -0
  172. package/dist/core/{supervisor → governor}/service.js +57 -57
  173. package/dist/core/governor/state.d.ts +116 -0
  174. package/dist/core/governor/state.d.ts.map +1 -0
  175. package/dist/core/{supervisor → governor}/state.js +228 -108
  176. package/dist/core/hooks/adapter/detect.d.ts +9 -0
  177. package/dist/core/hooks/{harness → adapter}/detect.d.ts.map +1 -1
  178. package/dist/core/hooks/{harness → adapter}/detect.js +8 -8
  179. package/dist/core/hooks/{harness → adapter}/events.d.ts +15 -14
  180. package/dist/core/hooks/adapter/events.d.ts.map +1 -0
  181. package/dist/core/hooks/{harness → adapter}/events.js +5 -5
  182. package/dist/core/hooks/{harness → adapter}/output.d.ts +20 -14
  183. package/dist/core/hooks/adapter/output.d.ts.map +1 -0
  184. package/dist/core/hooks/{harness → adapter}/output.js +30 -22
  185. package/dist/core/hooks/{harness → adapter}/parse.d.ts +5 -5
  186. package/dist/core/hooks/{harness → adapter}/parse.d.ts.map +1 -1
  187. package/dist/core/hooks/{harness → adapter}/parse.js +4 -4
  188. package/dist/core/hooks/{harness → adapter}/wiring.d.ts +15 -15
  189. package/dist/core/hooks/{harness → adapter}/wiring.d.ts.map +1 -1
  190. package/dist/core/hooks/{harness → adapter}/wiring.js +13 -13
  191. package/dist/core/hooks/cli.d.ts +3 -3
  192. package/dist/core/hooks/cli.js +187 -162
  193. package/dist/core/hooks/effects/image-capture.d.ts +5 -5
  194. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  195. package/dist/core/hooks/effects/image-capture.js +3 -3
  196. package/dist/core/hooks/effects/index.d.ts +12 -12
  197. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  198. package/dist/core/hooks/effects/index.js +19 -19
  199. package/dist/core/hooks/events/emit.d.ts +2 -2
  200. package/dist/core/hooks/events/emit.d.ts.map +1 -1
  201. package/dist/core/hooks/events/emit.js +1 -1
  202. package/dist/core/hooks/events/rotate.js +1 -1
  203. package/dist/core/hooks/events/schema.d.ts +13 -5
  204. package/dist/core/hooks/events/schema.d.ts.map +1 -1
  205. package/dist/core/hooks/guard-path.d.ts +2 -2
  206. package/dist/core/hooks/guard-path.js +2 -2
  207. package/dist/core/hooks/index.d.ts +1 -1
  208. package/dist/core/hooks/index.d.ts.map +1 -1
  209. package/dist/core/hooks/resolve/anchor.d.ts +14 -5
  210. package/dist/core/hooks/resolve/anchor.d.ts.map +1 -1
  211. package/dist/core/hooks/resolve/anchor.js +64 -7
  212. package/dist/core/hooks/resolve/coord-root.d.ts +16 -11
  213. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  214. package/dist/core/hooks/resolve/coord-root.js +18 -43
  215. package/dist/core/hooks/resolve/intent.js +1 -1
  216. package/dist/core/hooks/resolve/owner.d.ts +1 -1
  217. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  218. package/dist/core/hooks/resolve/owner.js +11 -5
  219. package/dist/core/{scratch → journal}/index.d.ts +25 -25
  220. package/dist/core/{scratch → journal}/index.d.ts.map +1 -1
  221. package/dist/core/{scratch → journal}/index.js +38 -38
  222. package/dist/core/policy/evaluate.d.ts +1 -1
  223. package/dist/core/policy/evaluate.d.ts.map +1 -1
  224. package/dist/core/policy/evaluate.js +7 -7
  225. package/dist/core/policy/types.d.ts +3 -3
  226. package/dist/core/policy/types.d.ts.map +1 -1
  227. package/dist/core/work/state.d.ts +12 -4
  228. package/dist/core/work/state.d.ts.map +1 -1
  229. package/dist/core/work/state.js +50 -17
  230. package/dist/core/workflow/adapters.d.ts +17 -0
  231. package/dist/core/workflow/adapters.d.ts.map +1 -0
  232. package/dist/core/workflow/adapters.js +21 -0
  233. package/dist/core/workflow/approvals.js +6 -6
  234. package/dist/core/workflow/billing.d.ts +9 -9
  235. package/dist/core/workflow/billing.js +9 -9
  236. package/dist/core/workflow/child-env.d.ts +10 -2
  237. package/dist/core/workflow/child-env.d.ts.map +1 -1
  238. package/dist/core/workflow/child-env.js +12 -4
  239. package/dist/core/workflow/engine.d.ts +15 -5
  240. package/dist/core/workflow/engine.d.ts.map +1 -1
  241. package/dist/core/workflow/engine.js +138 -83
  242. package/dist/core/workflow/evidence-preflight.d.ts +24 -0
  243. package/dist/core/workflow/evidence-preflight.d.ts.map +1 -0
  244. package/dist/core/workflow/evidence-preflight.js +134 -0
  245. package/dist/core/workflow/index.d.ts +1 -1
  246. package/dist/core/workflow/index.d.ts.map +1 -1
  247. package/dist/core/workflow/proof.d.ts +11 -5
  248. package/dist/core/workflow/proof.d.ts.map +1 -1
  249. package/dist/core/workflow/proof.js +45 -36
  250. package/dist/core/workflow/run-state.d.ts +1 -1
  251. package/dist/core/workflow/run-state.js +7 -7
  252. package/dist/core/workflow/sandbox-projection.d.ts +6 -6
  253. package/dist/core/workflow/sandbox-projection.d.ts.map +1 -1
  254. package/dist/core/workflow/sandbox-projection.js +11 -11
  255. package/dist/core/workflow/spawn-claude.d.ts +3 -3
  256. package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
  257. package/dist/core/workflow/spawn-claude.js +9 -6
  258. package/dist/core/workflow/spawn-codex.d.ts +4 -4
  259. package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
  260. package/dist/core/workflow/spawn-codex.js +9 -6
  261. package/dist/core/workflow/spawn-cursor.d.ts +4 -4
  262. package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
  263. package/dist/core/workflow/spawn-cursor.js +9 -6
  264. package/dist/core/workflow/spawn-failure.d.ts +1 -1
  265. package/dist/core/workflow/spawn-failure.js +1 -1
  266. package/dist/core/workflow/specialists.js +2 -2
  267. package/dist/core/workflow/{journal.d.ts → transcript.d.ts} +8 -8
  268. package/dist/core/workflow/transcript.d.ts.map +1 -0
  269. package/dist/core/workflow/{journal.js → transcript.js} +14 -14
  270. package/dist/core/workflow/types.d.ts +98 -51
  271. package/dist/core/workflow/types.d.ts.map +1 -1
  272. package/dist/core/workflow/types.js +11 -1
  273. package/dist/core/workflow/validate.d.ts +1 -1
  274. package/dist/core/workflow/validate.js +1 -1
  275. package/dist/core/workflow/workspaces/cancellation.js +2 -2
  276. package/dist/core/workflow/workspaces/cleanup.js +2 -2
  277. package/dist/core/workflow/workspaces/execution.js +6 -6
  278. package/dist/core/workflow/workspaces/inspect.js +9 -9
  279. package/dist/core/workflow/workspaces/integration.js +14 -14
  280. package/dist/core/workflow/workspaces/lifecycle.d.ts +1 -1
  281. package/dist/core/workflow/workspaces/lifecycle.d.ts.map +1 -1
  282. package/dist/core/workflow/workspaces/lifecycle.js +9 -9
  283. package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
  284. package/dist/core/workflow/workspaces/local-git.js +39 -5
  285. package/dist/core/workflow/workspaces/recovery.js +3 -3
  286. package/dist/core/workflow/workspaces/state.d.ts +1 -1
  287. package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
  288. package/dist/core/workflow/workspaces/state.js +3 -3
  289. package/dist/core/workflow/workspaces/types.d.ts +1 -1
  290. package/dist/core/workflow/workspaces/types.d.ts.map +1 -1
  291. package/dist/lib/browser/asserts.d.ts +28 -0
  292. package/dist/lib/browser/asserts.d.ts.map +1 -0
  293. package/dist/lib/browser/asserts.js +152 -0
  294. package/dist/lib/browser/client.d.ts +49 -0
  295. package/dist/lib/browser/client.d.ts.map +1 -1
  296. package/dist/lib/browser/client.js +155 -14
  297. package/dist/lib/browser/content-checks.d.ts +108 -0
  298. package/dist/lib/browser/content-checks.d.ts.map +1 -0
  299. package/dist/lib/browser/content-checks.js +474 -0
  300. package/dist/lib/browser/critique.d.ts +91 -0
  301. package/dist/lib/browser/critique.d.ts.map +1 -0
  302. package/dist/lib/browser/critique.js +167 -0
  303. package/dist/lib/browser/geometry.d.ts +32 -0
  304. package/dist/lib/browser/geometry.d.ts.map +1 -1
  305. package/dist/lib/browser/geometry.js +244 -1
  306. package/dist/lib/browser/index.d.ts +4 -1
  307. package/dist/lib/browser/index.d.ts.map +1 -1
  308. package/dist/lib/browser/index.js +2 -0
  309. package/dist/lib/claude-desktop.d.ts.map +1 -1
  310. package/dist/lib/claude-desktop.js +4 -1
  311. package/dist/lib/context/index.js +9 -2
  312. package/dist/lib/council/index.d.ts +6 -6
  313. package/dist/lib/council/index.d.ts.map +1 -1
  314. package/dist/lib/council/index.js +8 -8
  315. package/dist/lib/identities/assume.d.ts +2 -2
  316. package/dist/lib/identities/assume.js +7 -7
  317. package/dist/lib/instructions/apply.d.ts +3 -3
  318. package/dist/lib/instructions/apply.d.ts.map +1 -1
  319. package/dist/lib/instructions/apply.js +75 -27
  320. package/dist/lib/instructions/host-addendum.d.ts +54 -0
  321. package/dist/lib/instructions/host-addendum.d.ts.map +1 -0
  322. package/dist/lib/instructions/host-addendum.js +107 -0
  323. package/dist/lib/instructions/templates.d.ts +10 -3
  324. package/dist/lib/instructions/templates.d.ts.map +1 -1
  325. package/dist/lib/instructions/templates.js +41 -12
  326. package/dist/lib/machine.d.ts +2 -2
  327. package/dist/lib/machine.js +2 -2
  328. package/package.json +26 -21
  329. package/schemas/config.schema.json +26 -1
  330. package/src/commander.ts +22 -13
  331. package/src/commands/{harness.ts → adapter.ts} +46 -46
  332. package/src/commands/agents.ts +200 -78
  333. package/src/commands/artifacts.ts +168 -0
  334. package/src/commands/backup.ts +47 -33
  335. package/src/commands/browse.ts +438 -2
  336. package/src/commands/checkpoint.ts +196 -0
  337. package/src/commands/context.ts +3 -176
  338. package/src/commands/decision.ts +41 -7
  339. package/src/commands/deinit.ts +16 -16
  340. package/src/commands/doctor.ts +28 -28
  341. package/src/commands/{supervisor.ts → governor.ts} +184 -154
  342. package/src/commands/grep.ts +19 -2
  343. package/src/commands/init.ts +50 -34
  344. package/src/commands/{scratch.ts → journal.ts} +60 -60
  345. package/src/commands/policy.ts +1 -1
  346. package/src/commands/presence.ts +2 -2
  347. package/src/commands/sync.ts +3 -3
  348. package/src/commands/tunnel.ts +256 -38
  349. package/src/commands/web-fetch.ts +1 -1
  350. package/src/commands/web.ts +56 -1
  351. package/src/commands/work.ts +50 -35
  352. package/src/commands/workflow.ts +43 -34
  353. package/src/core/{harnesses → adapters}/attest-projection.ts +2 -2
  354. package/src/core/{harnesses → adapters}/attest.ts +27 -27
  355. package/src/core/{harnesses → adapters}/attestation.ts +41 -41
  356. package/src/core/{harnesses → adapters}/bench.ts +34 -43
  357. package/src/core/adapters/index.ts +56 -0
  358. package/src/core/{harnesses → adapters}/profiles.ts +16 -16
  359. package/src/core/{harnesses → adapters}/registry.ts +23 -23
  360. package/src/core/{harnesses → adapters}/types.ts +23 -23
  361. package/src/core/agents/canonical-emit.ts +16 -43
  362. package/src/core/agents/cli-emit.ts +1 -1
  363. package/src/core/agents/cli.ts +30 -28
  364. package/src/core/agents/codex-replay.ts +6 -6
  365. package/src/core/agents/coord-bin.ts +92 -0
  366. package/src/core/agents/coord-client.ts +302 -78
  367. package/src/core/agents/events/consume.ts +1 -1
  368. package/src/core/agents/events/emit.ts +7 -6
  369. package/src/core/agents/paths.ts +7 -11
  370. package/src/core/agents/render/prompt-context.ts +107 -31
  371. package/src/core/agents/render/session-context.ts +6 -6
  372. package/src/core/agents/rules/claim-conflict.ts +4 -7
  373. package/src/core/agents/rules/commit-conflict.ts +103 -22
  374. package/src/core/agents/rules/stop-hook.ts +33 -17
  375. package/src/core/agents/rules/verdict.ts +13 -0
  376. package/src/core/agents/session-events.ts +4 -4
  377. package/src/core/agents/state/council.ts +1 -1
  378. package/src/core/agents/state/heartbeat-projector.ts +16 -12
  379. package/src/core/agents/state/heartbeat-writer.ts +12 -12
  380. package/src/core/agents/state/{scratch.ts → journal.ts} +12 -12
  381. package/src/core/agents/state/pidmap.ts +130 -15
  382. package/src/core/agents/state/proc-start.ts +208 -0
  383. package/src/core/agents/state/shell-mutation.ts +1 -1
  384. package/src/core/agents/state/stale-sweep.ts +7 -7
  385. package/src/core/artifacts/index.ts +557 -0
  386. package/src/core/config.ts +30 -2
  387. package/src/core/context/index.ts +15 -15
  388. package/src/core/governor/adapter-spread.ts +82 -0
  389. package/src/core/governor/index.ts +91 -0
  390. package/src/core/governor/plan-api.ts +115 -0
  391. package/src/core/{supervisor → governor}/plan-read.ts +112 -97
  392. package/src/core/{supervisor → governor}/plan-types.ts +59 -56
  393. package/src/core/{supervisor → governor}/planning.ts +223 -192
  394. package/src/core/governor/read.ts +59 -0
  395. package/src/core/{supervisor → governor}/runner.ts +39 -39
  396. package/src/core/{supervisor → governor}/service-read.ts +22 -22
  397. package/src/core/{supervisor → governor}/service.ts +117 -119
  398. package/src/core/{supervisor → governor}/state.ts +325 -167
  399. package/src/core/hooks/adapter/detect.ts +30 -0
  400. package/src/core/hooks/{harness → adapter}/events.ts +16 -14
  401. package/src/core/hooks/{harness → adapter}/output.ts +31 -23
  402. package/src/core/hooks/{harness → adapter}/parse.ts +5 -5
  403. package/src/core/hooks/{harness → adapter}/wiring.ts +21 -21
  404. package/src/core/hooks/cli.ts +197 -173
  405. package/src/core/hooks/effects/image-capture.ts +6 -6
  406. package/src/core/hooks/effects/index.ts +19 -19
  407. package/src/core/hooks/events/emit.ts +3 -3
  408. package/src/core/hooks/events/rotate.ts +1 -1
  409. package/src/core/hooks/events/schema.ts +15 -7
  410. package/src/core/hooks/guard-path.ts +2 -2
  411. package/src/core/hooks/index.ts +1 -1
  412. package/src/core/hooks/resolve/anchor.ts +63 -8
  413. package/src/core/hooks/resolve/coord-root.ts +18 -40
  414. package/src/core/hooks/resolve/intent.ts +1 -1
  415. package/src/core/hooks/resolve/owner.ts +11 -5
  416. package/src/core/{scratch → journal}/index.ts +53 -53
  417. package/src/core/policy/evaluate.ts +8 -8
  418. package/src/core/policy/types.ts +3 -3
  419. package/src/core/work/state.ts +65 -23
  420. package/src/core/workflow/adapters.ts +33 -0
  421. package/src/core/workflow/approvals.ts +7 -7
  422. package/src/core/workflow/billing.ts +12 -12
  423. package/src/core/workflow/child-env.ts +13 -4
  424. package/src/core/workflow/engine.ts +155 -90
  425. package/src/core/workflow/evidence-preflight.ts +165 -0
  426. package/src/core/workflow/index.ts +3 -3
  427. package/src/core/workflow/proof.ts +60 -50
  428. package/src/core/workflow/run-state.ts +7 -7
  429. package/src/core/workflow/sandbox-projection.ts +16 -16
  430. package/src/core/workflow/spawn-claude.ts +13 -10
  431. package/src/core/workflow/spawn-codex.ts +13 -10
  432. package/src/core/workflow/spawn-cursor.ts +13 -10
  433. package/src/core/workflow/spawn-failure.ts +1 -1
  434. package/src/core/workflow/specialists.ts +2 -2
  435. package/src/core/workflow/{journal.ts → transcript.ts} +16 -16
  436. package/src/core/workflow/types.ts +108 -51
  437. package/src/core/workflow/validate.ts +1 -1
  438. package/src/core/workflow/workspaces/cancellation.ts +2 -2
  439. package/src/core/workflow/workspaces/cleanup.ts +2 -2
  440. package/src/core/workflow/workspaces/execution.ts +6 -6
  441. package/src/core/workflow/workspaces/inspect.ts +14 -11
  442. package/src/core/workflow/workspaces/integration.ts +18 -14
  443. package/src/core/workflow/workspaces/lifecycle.ts +10 -10
  444. package/src/core/workflow/workspaces/local-git.ts +47 -5
  445. package/src/core/workflow/workspaces/recovery.ts +3 -3
  446. package/src/core/workflow/workspaces/state.ts +4 -3
  447. package/src/core/workflow/workspaces/types.ts +1 -1
  448. package/src/lib/browser/asserts.ts +177 -0
  449. package/src/lib/browser/client.ts +189 -14
  450. package/src/lib/browser/content-checks.ts +571 -0
  451. package/src/lib/browser/critique.ts +231 -0
  452. package/src/lib/browser/geometry.ts +297 -1
  453. package/src/lib/browser/index.ts +34 -0
  454. package/src/lib/claude-desktop.ts +4 -1
  455. package/src/lib/context/index.ts +11 -1
  456. package/src/lib/council/index.ts +9 -9
  457. package/src/lib/identities/assume.ts +7 -7
  458. package/src/lib/instructions/apply.ts +87 -25
  459. package/src/lib/instructions/host-addendum.ts +126 -0
  460. package/src/lib/instructions/templates.ts +44 -15
  461. package/src/lib/machine.ts +2 -2
  462. package/dist/commands/harness.d.ts +0 -12
  463. package/dist/commands/harness.d.ts.map +0 -1
  464. package/dist/commands/scratch.d.ts +0 -4
  465. package/dist/commands/scratch.d.ts.map +0 -1
  466. package/dist/commands/session.d.ts.map +0 -1
  467. package/dist/commands/session.js +0 -162
  468. package/dist/commands/supervisor.d.ts +0 -4
  469. package/dist/commands/supervisor.d.ts.map +0 -1
  470. package/dist/core/harnesses/attest-projection.d.ts.map +0 -1
  471. package/dist/core/harnesses/attest.d.ts.map +0 -1
  472. package/dist/core/harnesses/attestation.d.ts.map +0 -1
  473. package/dist/core/harnesses/bench.d.ts.map +0 -1
  474. package/dist/core/harnesses/index.d.ts +0 -13
  475. package/dist/core/harnesses/index.d.ts.map +0 -1
  476. package/dist/core/harnesses/index.js +0 -6
  477. package/dist/core/harnesses/profiles.d.ts.map +0 -1
  478. package/dist/core/harnesses/registry.d.ts +0 -15
  479. package/dist/core/harnesses/registry.d.ts.map +0 -1
  480. package/dist/core/harnesses/types.d.ts.map +0 -1
  481. package/dist/core/hooks/harness/detect.d.ts +0 -9
  482. package/dist/core/hooks/harness/events.d.ts.map +0 -1
  483. package/dist/core/hooks/harness/output.d.ts.map +0 -1
  484. package/dist/core/supervisor/index.d.ts +0 -7
  485. package/dist/core/supervisor/index.d.ts.map +0 -1
  486. package/dist/core/supervisor/index.js +0 -6
  487. package/dist/core/supervisor/plan-api.d.ts +0 -23
  488. package/dist/core/supervisor/plan-api.d.ts.map +0 -1
  489. package/dist/core/supervisor/plan-api.js +0 -50
  490. package/dist/core/supervisor/plan-read.d.ts +0 -5
  491. package/dist/core/supervisor/plan-read.d.ts.map +0 -1
  492. package/dist/core/supervisor/plan-types.d.ts.map +0 -1
  493. package/dist/core/supervisor/planning.d.ts +0 -33
  494. package/dist/core/supervisor/planning.d.ts.map +0 -1
  495. package/dist/core/supervisor/read.d.ts +0 -6
  496. package/dist/core/supervisor/read.d.ts.map +0 -1
  497. package/dist/core/supervisor/read.js +0 -4
  498. package/dist/core/supervisor/runner.d.ts +0 -37
  499. package/dist/core/supervisor/runner.d.ts.map +0 -1
  500. package/dist/core/supervisor/service-read.d.ts +0 -6
  501. package/dist/core/supervisor/service-read.d.ts.map +0 -1
  502. package/dist/core/supervisor/service.d.ts +0 -114
  503. package/dist/core/supervisor/service.d.ts.map +0 -1
  504. package/dist/core/supervisor/state.d.ts +0 -95
  505. package/dist/core/supervisor/state.d.ts.map +0 -1
  506. package/dist/core/workflow/harnesses.d.ts +0 -17
  507. package/dist/core/workflow/harnesses.d.ts.map +0 -1
  508. package/dist/core/workflow/harnesses.js +0 -21
  509. package/dist/core/workflow/journal.d.ts.map +0 -1
  510. package/src/commands/session.ts +0 -187
  511. package/src/core/harnesses/index.ts +0 -56
  512. package/src/core/hooks/harness/detect.ts +0 -30
  513. package/src/core/supervisor/index.ts +0 -89
  514. package/src/core/supervisor/plan-api.ts +0 -73
  515. package/src/core/supervisor/read.ts +0 -59
  516. package/src/core/workflow/harnesses.ts +0 -33
  517. /package/dist/core/{harnesses → adapters}/attest-projection.js +0 -0
@@ -162,12 +162,12 @@ async function emitClaimRelease(root, owner, hb, path, reason) {
162
162
  const { emit } = await import("./events/emit.js");
163
163
  const canonical = path.startsWith(`${root}/`) ? path.slice(root.length + 1) : path;
164
164
  const platform = hb.platform;
165
- const harness = platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code";
165
+ const adapter = platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code";
166
166
  emit(root, {
167
167
  event_type: "claim.release",
168
168
  instance_id: owner,
169
169
  session_id: hb.session_id ?? owner,
170
- harness,
170
+ adapter,
171
171
  source: "agent-coord",
172
172
  data: { path: canonical, reason },
173
173
  });
@@ -262,16 +262,16 @@ async function handleStateAction(root, action, rest) {
262
262
  return 0;
263
263
  }
264
264
  case "heal-heartbeat": {
265
- // harness arrives as a `--harness=<h>` flag (not positional) so the live
265
+ // adapter arrives as a `--adapter=<h>` flag (not positional) so the live
266
266
  // tool.pre_use heal and the manual `harn agents heal` path (which pass
267
267
  // different positional counts) can both supply it without arg-order
268
268
  // fragility. Positionals (sessionId, model) stay as-is once flags are
269
269
  // filtered out.
270
- const harness = args.find((a) => a.startsWith("--harness="))?.slice("--harness=".length);
270
+ const adapter = args.find((a) => a.startsWith("--adapter="))?.slice("--adapter=".length);
271
271
  const positional = args.filter((a) => !a.startsWith("--"));
272
272
  const sessionId = positional[0];
273
273
  const model = positional[1];
274
- const hb = writer.healHeartbeat(root, owner, sessionId, model, harness);
274
+ const hb = writer.healHeartbeat(root, owner, sessionId, model, adapter);
275
275
  process.stdout.write(`${JSON.stringify({ instance_id: owner, recreated: !!hb })}\n`);
276
276
  return hb ? 0 : 1;
277
277
  }
@@ -293,45 +293,45 @@ async function handleStateAction(root, action, rest) {
293
293
  return 2;
294
294
  }
295
295
  }
296
- async function handleScratchAction(root, action, rest) {
297
- const scratch = await import("./state/scratch.js");
298
- if (action === "append-scratch") {
296
+ async function handleJournalAction(root, action, rest) {
297
+ const journal = await import("./state/journal.js");
298
+ if (action === "append-journal") {
299
299
  const [owner, category, ...bodyParts] = rest;
300
300
  const body = bodyParts.join(" ");
301
301
  if (!owner || !category || !body) {
302
- process.stderr.write("agent-coord append-scratch <instance_id> <category> <body>\n");
302
+ process.stderr.write("agent-coord append-journal <instance_id> <category> <body>\n");
303
303
  return 2;
304
304
  }
305
- const result = scratch.appendScratch(root, owner, category, body);
305
+ const result = journal.appendJournal(root, owner, category, body);
306
306
  if (!result.ok) {
307
- process.stderr.write(`agent-coord append-scratch: ${result.reason}\n`);
307
+ process.stderr.write(`agent-coord append-journal: ${result.reason}\n`);
308
308
  return 1;
309
309
  }
310
310
  process.stdout.write(`${JSON.stringify({ instance_id: owner, category, path: result.path })}\n`);
311
311
  return 0;
312
312
  }
313
- if (action === "edit-scratchpad") {
313
+ if (action === "edit-journal") {
314
314
  const [owner, newBodyFile, ...summaryParts] = rest;
315
315
  const summary = summaryParts.join(" ");
316
316
  if (!owner || !newBodyFile) {
317
- process.stderr.write("agent-coord edit-scratchpad <instance_id> <new-body-file> [<summary>]\n");
317
+ process.stderr.write("agent-coord edit-journal <instance_id> <new-body-file> [<summary>]\n");
318
318
  return 2;
319
319
  }
320
320
  if (!existsSync(newBodyFile)) {
321
- process.stderr.write(`agent-coord edit-scratchpad: file not found: ${newBodyFile}\n`);
321
+ process.stderr.write(`agent-coord edit-journal: file not found: ${newBodyFile}\n`);
322
322
  return 2;
323
323
  }
324
324
  const { readFileSync } = await import("node:fs");
325
325
  const newBody = readFileSync(newBodyFile, "utf8");
326
- const result = scratch.editScratchpad(root, owner, newBody, summary);
326
+ const result = journal.editJournal(root, owner, newBody, summary);
327
327
  if (!result.ok) {
328
- process.stderr.write(`agent-coord edit-scratchpad: ${result.reason}\n`);
328
+ process.stderr.write(`agent-coord edit-journal: ${result.reason}\n`);
329
329
  return 1;
330
330
  }
331
331
  process.stdout.write(`${JSON.stringify({ instance_id: owner, path: result.path, archive_path: result.archivePath })}\n`);
332
332
  return 0;
333
333
  }
334
- process.stderr.write(`agent-coord: unknown scratch action ${action}\n`);
334
+ process.stderr.write(`agent-coord: unknown journal action ${action}\n`);
335
335
  return 2;
336
336
  }
337
337
  async function handleCouncilAction(root, action, rest) {
@@ -522,7 +522,7 @@ async function handleShellMutationClaimLog(root, rest) {
522
522
  // in a log file; now a canonical decision.warn so the
523
523
  // signal survives in events.ndjson. (The blocking claim-conflict path is
524
524
  // separate: claim.conflict / verdict, and unaffected.)
525
- const harness = platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code";
525
+ const adapter = platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code";
526
526
  const hb = owner ? readHeartbeat(root, owner) : null;
527
527
  for (const p of paths) {
528
528
  try {
@@ -530,7 +530,7 @@ async function handleShellMutationClaimLog(root, rest) {
530
530
  event_type: "decision.warn",
531
531
  instance_id: owner ?? "unknown",
532
532
  session_id: hb?.session_id ?? owner ?? "unknown",
533
- harness,
533
+ adapter,
534
534
  data: {
535
535
  rule: "shell_mutation_candidate",
536
536
  reason: `path=${p} cmd=${truncated} platform=${platform}`,
@@ -568,9 +568,11 @@ async function handlePromptContext(root, rest) {
568
568
  const instanceId = args.instance;
569
569
  const sessionId = args.session ?? instanceId;
570
570
  const agentName = args.name;
571
+ const sessionNameNudge = args["session-name-nudge"] === "true";
571
572
  const taskNudge = args["task-nudge"] === "true";
573
+ const statusFooterNudge = args["status-footer-nudge"] === "true";
572
574
  if (!instanceId) {
573
- process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--task-nudge]\n");
575
+ process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--status-footer-nudge]\n");
574
576
  return 2;
575
577
  }
576
578
  const { renderPromptContext } = await import("./render/prompt-context.js");
@@ -579,7 +581,9 @@ async function handlePromptContext(root, rest) {
579
581
  instanceId,
580
582
  sessionId: sessionId,
581
583
  agentName,
584
+ sessionNameNudge,
582
585
  taskNudge,
586
+ statusFooterNudge,
583
587
  });
584
588
  process.stdout.write(text);
585
589
  return 0;
@@ -689,10 +693,10 @@ async function handleEmitEvent(root, rest) {
689
693
  const eventType = args.type;
690
694
  const instanceId = args.owner;
691
695
  const sessionId = args.session;
692
- const harness = args.harness;
696
+ const adapter = args.adapter;
693
697
  const dataJson = args["data-json"] ?? "{}";
694
- if (!eventType || !instanceId || !sessionId || !harness) {
695
- process.stderr.write("agent-coord emit-event --type <T> --owner <id> --session <id> --harness <h> [--data-json '<json>']\n");
698
+ if (!eventType || !instanceId || !sessionId || !adapter) {
699
+ process.stderr.write("agent-coord emit-event --type <T> --owner <id> --session <id> --adapter <h> [--data-json '<json>']\n");
696
700
  return 2;
697
701
  }
698
702
  let data;
@@ -714,7 +718,7 @@ async function handleEmitEvent(root, rest) {
714
718
  event_type: eventType,
715
719
  instance_id: instanceId,
716
720
  session_id: sessionId,
717
- harness,
721
+ adapter,
718
722
  turn_id: args["turn-id"],
719
723
  parent_session_id: args["parent-session-id"],
720
724
  parent_turn_id: args["parent-turn-id"],
@@ -751,8 +755,8 @@ async function main() {
751
755
  subcommand === "stamp-tool-activity") {
752
756
  return handleStateAction(root, subcommand, rest);
753
757
  }
754
- if (subcommand === "append-scratch" || subcommand === "edit-scratchpad") {
755
- return handleScratchAction(root, subcommand, rest);
758
+ if (subcommand === "append-journal" || subcommand === "edit-journal") {
759
+ return handleJournalAction(root, subcommand, rest);
756
760
  }
757
761
  if (subcommand === "council-advance" ||
758
762
  subcommand === "council-close" ||
@@ -4,7 +4,7 @@
4
4
  * Production codex sessions emit canonical events from each `harn` invocation
5
5
  * via the in-process session-tee middleware (which calls `agent-coord
6
6
  * emit-event` for state.task_set / state.status_checked). But the codex
7
- * harness itself doesn't wire agent-hook on preToolUse, so user_prompt.submit
7
+ * adapter itself doesn't wire agent-hook on preToolUse, so user_prompt.submit
8
8
  * + tool.pre_use + turn.stop aren't emitted live.
9
9
  *
10
10
  * This module parses the Codex JSONL transcript at stop time and emits the
@@ -4,7 +4,7 @@
4
4
  * Production codex sessions emit canonical events from each `harn` invocation
5
5
  * via the in-process session-tee middleware (which calls `agent-coord
6
6
  * emit-event` for state.task_set / state.status_checked). But the codex
7
- * harness itself doesn't wire agent-hook on preToolUse, so user_prompt.submit
7
+ * adapter itself doesn't wire agent-hook on preToolUse, so user_prompt.submit
8
8
  * + tool.pre_use + turn.stop aren't emitted live.
9
9
  *
10
10
  * This module parses the Codex JSONL transcript at stop time and emits the
@@ -49,7 +49,7 @@ export function replayCodexJsonl(opts) {
49
49
  event_type: "user_prompt.submit",
50
50
  instance_id: instanceId,
51
51
  session_id: sessionId,
52
- harness: "codex",
52
+ adapter: "codex",
53
53
  ts,
54
54
  data: {
55
55
  prompt_text: clamp(entry.payload.message ?? "", 4000),
@@ -75,7 +75,7 @@ export function replayCodexJsonl(opts) {
75
75
  event_type: "tool.pre_use",
76
76
  instance_id: instanceId,
77
77
  session_id: sessionId,
78
- harness: "codex",
78
+ adapter: "codex",
79
79
  ts,
80
80
  data: {
81
81
  tool_name: name === "exec_command" ? "Bash" : name,
@@ -94,7 +94,7 @@ export function replayCodexJsonl(opts) {
94
94
  event_type: "state.status_checked",
95
95
  instance_id: instanceId,
96
96
  session_id: sessionId,
97
- harness: "codex",
97
+ adapter: "codex",
98
98
  ts,
99
99
  data: { source: "codex-replay" },
100
100
  });
@@ -105,7 +105,7 @@ export function replayCodexJsonl(opts) {
105
105
  event_type: "state.task_set",
106
106
  instance_id: instanceId,
107
107
  session_id: sessionId,
108
- harness: "codex",
108
+ adapter: "codex",
109
109
  ts,
110
110
  data: { source: "codex-replay" },
111
111
  });
@@ -121,7 +121,7 @@ export function replayCodexJsonl(opts) {
121
121
  event_type: "turn.stop",
122
122
  instance_id: instanceId,
123
123
  session_id: sessionId,
124
- harness: "codex",
124
+ adapter: "codex",
125
125
  data: {
126
126
  status_box_present: boxPresent,
127
127
  tool_call_count: -1,
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Locate harnery's own bundled coordination binaries (`agent-coord`,
3
+ * `agent-hook`, `harn`).
4
+ *
5
+ * Every coord-helper spawn used to build its path as
6
+ * `<coordRoot>/harnery/bin/<name>`, which only exists in one host layout: a
7
+ * superproject carrying harnery as a submodule at `harnery/`. That assumption
8
+ * was load-bearing in the worst way — because the path missed whenever the
9
+ * resolved root was anything else, root resolution itself was bent toward the
10
+ * git superproject to keep the spawns working, which is what split the CLI's
11
+ * root from the hook's and blocked end-of-turn rule 1/3. The same missing path
12
+ * also surfaced as a crash rather than an error: `spawnSync` on a nonexistent
13
+ * binary reports `status: null` and `stderr: null`, so a caller checking
14
+ * `status !== 0` then reading `stderr.trim()` threw "null is not an object".
15
+ *
16
+ * The binaries ship inside the harnery package, so the package is what knows
17
+ * where they are. Resolution walks up from this module to the package root,
18
+ * which covers every install shape: `src/` under Bun, `dist/` on Node, and
19
+ * `node_modules/harnery/`. The layout-specific paths remain as fallbacks so a
20
+ * host whose harnery copy is not the one executing (a vendored tree, a shim)
21
+ * still resolves.
22
+ */
23
+ export type CoordBinName = "agent-coord" | "agent-hook" | "harn";
24
+ /**
25
+ * Absolute path to one of harnery's bundled binaries, or null when no candidate
26
+ * exists on disk. Callers must handle null — a missing helper is a real state
27
+ * (a partially installed package) and silently spawning a nonexistent path is
28
+ * what produced the null-deref crash above.
29
+ */
30
+ export declare function coordBinPath(name: CoordBinName, coordRoot?: string | null): string | null;
31
+ /** Candidate paths for `name`, in resolution order. Exported for tests. */
32
+ export declare function coordBinCandidates(name: CoordBinName, coordRoot?: string | null): string[];
33
+ //# sourceMappingURL=coord-bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coord-bin.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-bin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAEjE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAKzF;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAuB1F"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Locate harnery's own bundled coordination binaries (`agent-coord`,
3
+ * `agent-hook`, `harn`).
4
+ *
5
+ * Every coord-helper spawn used to build its path as
6
+ * `<coordRoot>/harnery/bin/<name>`, which only exists in one host layout: a
7
+ * superproject carrying harnery as a submodule at `harnery/`. That assumption
8
+ * was load-bearing in the worst way — because the path missed whenever the
9
+ * resolved root was anything else, root resolution itself was bent toward the
10
+ * git superproject to keep the spawns working, which is what split the CLI's
11
+ * root from the hook's and blocked end-of-turn rule 1/3. The same missing path
12
+ * also surfaced as a crash rather than an error: `spawnSync` on a nonexistent
13
+ * binary reports `status: null` and `stderr: null`, so a caller checking
14
+ * `status !== 0` then reading `stderr.trim()` threw "null is not an object".
15
+ *
16
+ * The binaries ship inside the harnery package, so the package is what knows
17
+ * where they are. Resolution walks up from this module to the package root,
18
+ * which covers every install shape: `src/` under Bun, `dist/` on Node, and
19
+ * `node_modules/harnery/`. The layout-specific paths remain as fallbacks so a
20
+ * host whose harnery copy is not the one executing (a vendored tree, a shim)
21
+ * still resolves.
22
+ */
23
+ import { existsSync } from "node:fs";
24
+ import { dirname, join, resolve } from "node:path";
25
+ import { fileURLToPath } from "node:url";
26
+ import { coordEnv } from "../../lib/env.js";
27
+ /**
28
+ * Absolute path to one of harnery's bundled binaries, or null when no candidate
29
+ * exists on disk. Callers must handle null — a missing helper is a real state
30
+ * (a partially installed package) and silently spawning a nonexistent path is
31
+ * what produced the null-deref crash above.
32
+ */
33
+ export function coordBinPath(name, coordRoot) {
34
+ for (const candidate of coordBinCandidates(name, coordRoot)) {
35
+ if (existsSync(candidate))
36
+ return candidate;
37
+ }
38
+ return null;
39
+ }
40
+ /** Candidate paths for `name`, in resolution order. Exported for tests. */
41
+ export function coordBinCandidates(name, coordRoot) {
42
+ const candidates = [];
43
+ const push = (value) => {
44
+ if (value && !candidates.includes(value))
45
+ candidates.push(value);
46
+ };
47
+ // Explicit pin, for a host that relocates the binaries.
48
+ const pinned = coordEnv("BIN_DIR");
49
+ if (pinned)
50
+ push(join(pinned, name));
51
+ // The package this code is executing from.
52
+ const pkgRoot = packageRoot(name);
53
+ if (pkgRoot)
54
+ push(join(pkgRoot, "bin", name));
55
+ if (coordRoot) {
56
+ // Host layouts, in decreasing specificity: harnery as a submodule, as an
57
+ // installed dependency, or the coord root being harnery's own checkout.
58
+ push(resolve(coordRoot, "harnery", "bin", name));
59
+ push(resolve(coordRoot, "node_modules", "harnery", "bin", name));
60
+ push(resolve(coordRoot, "bin", name));
61
+ }
62
+ return candidates;
63
+ }
64
+ /**
65
+ * Walk up from this module to the directory holding `bin/<name>`.
66
+ *
67
+ * The walk keys on the binary itself rather than on `package.json`, because
68
+ * both `src/core/agents/` and the built `dist/core/agents/` sit under the same
69
+ * package root and only the binary's presence proves we found the right level.
70
+ */
71
+ function packageRoot(name) {
72
+ let dir;
73
+ try {
74
+ dir = dirname(fileURLToPath(import.meta.url));
75
+ }
76
+ catch {
77
+ // No import.meta (a CJS transpile); the coordRoot fallbacks still apply.
78
+ return null;
79
+ }
80
+ for (let hop = 0; hop < 8; hop++) {
81
+ if (existsSync(join(dir, "bin", name)))
82
+ return dir;
83
+ const parent = dirname(dir);
84
+ if (parent === dir)
85
+ break;
86
+ dir = parent;
87
+ }
88
+ return null;
89
+ }
@@ -38,7 +38,7 @@ export interface Heartbeat {
38
38
  last_tool_target?: string;
39
39
  /** Free-form task/intent string set via `harn agents set-task`. Phase 2. */
40
40
  task?: string;
41
- /** UTC ISO-8601 timestamp when task was last set/cleared. Used by harnesses without Stop enforcement to compute staleness. 2026-05-24. */
41
+ /** UTC ISO-8601 timestamp when task was last set/cleared. Used by adapters without Stop enforcement to compute staleness. 2026-05-24. */
42
42
  task_updated_at?: string | null;
43
43
  /** Auto-generated per-turn summary written by the Stop hook via Haiku. 2026-05-23. */
44
44
  turn_summary?: string | null;
@@ -50,18 +50,78 @@ export interface Heartbeat {
50
50
  /**
51
51
  * Resolve the monorepo root for coord-state purposes.
52
52
  *
53
- * Resolves the coordination root,
54
- * including the `--git-common-dir` fallback that strips
55
- * `<superproject>/.git/modules/<name>/` to recover the superproject for
56
- * submodule worktrees. Without that fallback, a TS coord caller running
57
- * inside a `harn worktree add-submodule` checkout would resolve a different
58
- * `.harnery/` than the bash hooks and the two layers would silently diverge.
53
+ * Thin alias for `resolveCoordRoot()`; kept because it is the name the CLI
54
+ * command modules and the vendored downstream consumer already import.
59
55
  */
60
56
  export declare function monorepoRoot(): string | null;
57
+ /**
58
+ * THE coordination-root resolution. Every surface — the hooks, the CLI's reads,
59
+ * and the CLI's canonical emits — resolves through this one function, because a
60
+ * root the two layers disagree about is a root that silently breaks the
61
+ * end-of-turn rules: the hook evaluates `state.status_checked` from the stream
62
+ * it reads, so an emit into a different `.harnery/events.ndjson` is invisible
63
+ * and rule 1/3 blocks a turn that did run `agents status`, with no sequence of
64
+ * CLI commands able to satisfy it.
65
+ *
66
+ * Precedence:
67
+ * 1. `HARNERY_COORD_ROOT_OVERRIDE` — explicit pin (tests, git hooks, and the
68
+ * root every coord-helper spawn pins for its child).
69
+ * 2. `CLAUDE_PROJECT_DIR` — the adapter stating which project it opened. Hook
70
+ * processes inherit the session's *shell* cwd, which follows `cd` into a
71
+ * subdirectory or submodule that may carry a `.harnery/` of its own (or
72
+ * none at all), so the adapter's own statement outranks the cwd walk.
73
+ * 3. The candidate root that already holds THIS session's heartbeat.
74
+ * 4. The nearest enclosing `.harnery/`, then a git-derived root.
75
+ *
76
+ * Step 3 is what makes CLI/hook disagreement structurally impossible rather
77
+ * than a coin flip. Choosing either root unconditionally is wrong in one
78
+ * direction each: preferring the git superproject strands a session whose
79
+ * adapter opened the submodule itself (its heartbeat lives in the submodule,
80
+ * so status/set-task wrote events the hook never read), while walking up from
81
+ * cwd alone strands the opposite case, a session opened on the superproject
82
+ * whose shell has cd'd into a submodule that carries its own `.harnery/`
83
+ * (regression-tested in tests/unit/coord-helper-root-pin.test.ts). The session's
84
+ * own heartbeat settles it: whichever root the hook registered this session in
85
+ * is the root the CLI must use, and the adapter-exported session id needed to
86
+ * recognize it is available to a plain tool-call subprocess even though
87
+ * `CLAUDE_PROJECT_DIR` is not.
88
+ */
89
+ export declare function resolveCoordRoot(start?: string): string | null;
90
+ /** Nearest enclosing directory carrying `.harnery/`, or null. */
91
+ export declare function nearestCoordRoot(start: string): string | null;
92
+ /**
93
+ * Does this root's `.harnery/` already know the process asking?
94
+ *
95
+ * Two discriminators, both genuinely about *this* session: the adapter-exported
96
+ * session id matching a live heartbeat, and a pid-map row on our own ppid
97
+ * chain. Deliberately NOT the single-live-agent fallback that owner resolution
98
+ * ends with — a lone stranger in the wrong root is exactly how `whoami` came to
99
+ * report another agent's name and task as its own.
100
+ */
101
+ export declare function rootKnowsSession(root: string): boolean;
61
102
  /** Parse owner from a pid-map row (`owner` or `owner\tplatform`). */
62
103
  export declare function parsePidmapRowOwner(row: string): string;
63
104
  /** Parse platform from a pid-map row; legacy rows default to `claude_code`. */
64
105
  export declare function parsePidmapRowPlatform(row: string): string;
106
+ /** Parse the start token from a pid-map row; rows written before it carry none. */
107
+ export declare function parsePidmapRowStartToken(row: string): string | undefined;
108
+ /**
109
+ * Is the process now holding `pid` the one this row was written for?
110
+ *
111
+ * A pid is a number the OS re-issues, and quickly: a `pid_max` of 99999 against
112
+ * ~100 new processes a second recycles the whole space about every quarter
113
+ * hour. Believing a row past that point resolves this session to whichever
114
+ * agent last held the number — which is what made `whoami` report a stranger's
115
+ * name and files. The start token settles it, since two processes may share a
116
+ * pid but never a pid and a start instant.
117
+ *
118
+ * Deliberately inlined rather than imported from `state/proc-start.ts`: this
119
+ * file is vendored verbatim into a downstream consumer and stays on node
120
+ * builtins only. The token is a wire format shared with that module and with
121
+ * the host's commit guard, so the copies must agree byte for byte; exported so
122
+ * a test can hold this one against `processStartToken` and fail on drift.
123
+ */
124
+ export declare function pidStartToken(pid: number): string | null;
65
125
  /**
66
126
  * Walk up the ppid chain looking for a pid-map entry. Returns
67
127
  * the resolved instance_id or null.
@@ -87,7 +147,17 @@ export declare function resolveOwnerWithSource(): {
87
147
  source: "env" | "pidmap" | "pidmap_fallback" | "session_env" | "active_singleton" | "none";
88
148
  };
89
149
  /**
90
- * Resolve the owner by matching the harness session-id env var against the
150
+ * Walk our own ppid chain for a pid-map row in ONE given root.
151
+ *
152
+ * Root-parameterized (rather than resolving the root itself) so root resolution
153
+ * can use it as a discriminator without recursing back into itself.
154
+ */
155
+ export declare function resolveOwnerByPidmap(root: string): {
156
+ owner: string | null;
157
+ source: "pidmap" | "pidmap_fallback" | "none";
158
+ };
159
+ /**
160
+ * Resolve the owner by matching the adapter session-id env var against the
91
161
  * `session_id` of a live heartbeat in this coord root. Returns the matching
92
162
  * `instance_id`, or null if there's no session-id env var or no live heartbeat
93
163
  * carries it. "Live" reuses the same 10-minute freshness window the singleton
@@ -1 +1 @@
1
- {"version":3,"file":"coord-client.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAWhE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAI5E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0IAA0I;IAC1I,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mEAAmE;IACnE,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CA0C5C;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI1D;AAaD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,iBAAiB,GAAG,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;CAC5F,CAkEA;AA4CD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2BpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBpE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMlE;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAIxC"}
1
+ {"version":3,"file":"coord-client.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAWhE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAI5E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yIAAyI;IACzI,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mEAAmE;IACnE,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CA+B7E;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAeD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAiED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2CxD;AAgCD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,iBAAiB,GAAG,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;CAC5F,CAwCA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,CAAC;CAC/C,CAyBA;AA0DD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2BpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBpE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMlE;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAIxC"}