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
@@ -1,7 +1,7 @@
1
1
  import { spawnSync } from "node:child_process";
2
- import { HARNESS_SPECS } from "../hooks/harness/events.js";
2
+ import { ADAPTER_SPECS } from "../hooks/adapter/events.js";
3
3
  import { isAttestationCurrent, readAttestation } from "./attestation.js";
4
- import { HARNESS_CAPABILITY_DIMENSIONS } from "./types.js";
4
+ import { ADAPTER_CAPABILITY_DIMENSIONS } from "./types.js";
5
5
  const EMPTY_SUMMARY = {
6
6
  supported: 0,
7
7
  partial: 0,
@@ -43,17 +43,17 @@ function versionToken(value) {
43
43
  const match = value.match(/\d+(?:\.\d+)+(?:[-.][0-9a-z]+)*/i);
44
44
  return match ? match[0].toLowerCase() : null;
45
45
  }
46
- export function runHarnessBench(registry, opts = {}) {
47
- const ids = opts.harnesses?.length ? [...opts.harnesses] : registry.ids();
46
+ export function runAdapterBench(registry, opts = {}) {
47
+ const ids = opts.adapters?.length ? [...opts.adapters] : registry.ids();
48
48
  const dimensions = opts.dimensions?.length
49
49
  ? [...new Set(opts.dimensions)]
50
- : [...HARNESS_CAPABILITY_DIMENSIONS];
50
+ : [...ADAPTER_CAPABILITY_DIMENSIONS];
51
51
  const versionProbe = opts.versionProbe ?? probeBinaryVersion;
52
52
  const results = [];
53
53
  for (const id of ids) {
54
54
  const adapter = registry.require(id);
55
55
  results.push({
56
- harness: id,
56
+ adapter: id,
57
57
  dimension: "registration",
58
58
  declared: "supported",
59
59
  observed: "supported",
@@ -63,7 +63,7 @@ export function runHarnessBench(registry, opts = {}) {
63
63
  });
64
64
  const version = versionProbe(adapter.profile.binary);
65
65
  results.push({
66
- harness: id,
66
+ adapter: id,
67
67
  dimension: "binary",
68
68
  declared: "supported",
69
69
  observed: version ? "supported" : "skipped",
@@ -84,7 +84,7 @@ export function runHarnessBench(registry, opts = {}) {
84
84
  ? { observed: live, basis: "attested" }
85
85
  : observations[dimension];
86
86
  results.push({
87
- harness: id,
87
+ adapter: id,
88
88
  dimension,
89
89
  declared: claim.support,
90
90
  observed,
@@ -103,7 +103,7 @@ export function runHarnessBench(registry, opts = {}) {
103
103
  return {
104
104
  generatedAt: new Date().toISOString(),
105
105
  mode: "offline",
106
- harnesses: ids,
106
+ adapters: ids,
107
107
  results,
108
108
  summary,
109
109
  basisSummary,
@@ -121,7 +121,7 @@ export function runHarnessBench(registry, opts = {}) {
121
121
  * inferred from the installed one. */
122
122
  function contractResult(id, adapter, version) {
123
123
  const recorded = adapter.profile.verified;
124
- const base = { harness: id, dimension: "contract", declared: "supported" };
124
+ const base = { adapter: id, dimension: "contract", declared: "supported" };
125
125
  if (!version) {
126
126
  return {
127
127
  ...base,
@@ -209,8 +209,8 @@ function observeAdapter(adapter) {
209
209
  const finalMatches = normalized?.ok === fixture.ok && normalized?.text === fixture.text;
210
210
  const sessionObserved = normalized?.sessionId !== undefined ? "supported" : "unsupported";
211
211
  const costObserved = normalized?.costUsd !== undefined ? "supported" : "unsupported";
212
- const hookSpec = adapter.profile.id in HARNESS_SPECS
213
- ? HARNESS_SPECS[adapter.profile.id]
212
+ const hookSpec = adapter.profile.id in ADAPTER_SPECS
213
+ ? ADAPTER_SPECS[adapter.profile.id]
214
214
  : undefined;
215
215
  const hookSubcommands = new Set(hookSpec?.events.map((event) => event.subcommand) ?? []);
216
216
  return {
@@ -0,0 +1,13 @@
1
+ export type { Spawner, SpawnRequest, SpawnResult } from "../workflow/types.js";
2
+ export type { AdapterAttestationReport, AdapterAttestationResult, AttestationOutcome, RunAdapterAttestationOptions, } from "./attest.js";
3
+ export { ATTESTATION_PROMPT, runAdapterAttestation } from "./attest.js";
4
+ export type { AdapterAttestation, AttestableDimension, AttestationStoreOptions, } from "./attestation.js";
5
+ export { ATTESTABLE_DIMENSIONS, ATTESTATION_SCHEMA_VERSION, adapterProofInputs, attestationsDir, isAttestationCurrent, listAttestations, profileDigest, readAttestation, validateAttestation, writeAttestation, } from "./attestation.js";
6
+ export type { AdapterBenchOptions, AdapterBenchReport, BenchBasis, BenchDimension, BenchResult, BenchVerdict, } from "./bench.js";
7
+ export { probeBinaryVersion, runAdapterBench } from "./bench.js";
8
+ export type { BuiltinAdapterId } from "./profiles.js";
9
+ export { BUILTIN_ADAPTER_IDS, BUILTIN_ADAPTER_PROFILES, builtinAdapterProfile, isBuiltinAdapter, validateAdapterEffort, } from "./profiles.js";
10
+ export { AdapterRegistry, createBuiltinAdapterRegistry } from "./registry.js";
11
+ export type { Adapter, AdapterBenchFixture, AdapterCapabilities, AdapterCapabilityDimension, AdapterId, AdapterInvocation, AdapterProfile, AdapterRawResult, CapabilityClaim, CapabilitySupport, } from "./types.js";
12
+ export { ADAPTER_CAPABILITY_DIMENSIONS } from "./types.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EACV,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EACV,OAAO,EACP,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { ATTESTATION_PROMPT, runAdapterAttestation } from "./attest.js";
2
+ export { ATTESTABLE_DIMENSIONS, ATTESTATION_SCHEMA_VERSION, adapterProofInputs, attestationsDir, isAttestationCurrent, listAttestations, profileDigest, readAttestation, validateAttestation, writeAttestation, } from "./attestation.js";
3
+ export { probeBinaryVersion, runAdapterBench } from "./bench.js";
4
+ export { BUILTIN_ADAPTER_IDS, BUILTIN_ADAPTER_PROFILES, builtinAdapterProfile, isBuiltinAdapter, validateAdapterEffort, } from "./profiles.js";
5
+ export { AdapterRegistry, createBuiltinAdapterRegistry } from "./registry.js";
6
+ export { ADAPTER_CAPABILITY_DIMENSIONS } from "./types.js";
@@ -1,7 +1,7 @@
1
- import type { HarnessCapabilities, HarnessProfile } from "./types.js";
2
- /** The one built-in profile catalog. Adding a fourth harness starts here; CLI
1
+ import type { AdapterCapabilities, AdapterProfile } from "./types.js";
2
+ /** The one built-in profile catalog. Adding a fourth adapter starts here; CLI
3
3
  * choices, doctor metadata, workflow dispatch, and the bench derive from it. */
4
- export declare const BUILTIN_HARNESS_PROFILES: {
4
+ export declare const BUILTIN_ADAPTER_PROFILES: {
5
5
  readonly "claude-code": {
6
6
  readonly id: "claude-code";
7
7
  readonly displayName: "Claude Code";
@@ -17,7 +17,7 @@ export declare const BUILTIN_HARNESS_PROFILES: {
17
17
  readonly date: "2026-07-25";
18
18
  readonly version: "2.1.197 (Claude Code)";
19
19
  };
20
- readonly capabilities: HarnessCapabilities;
20
+ readonly capabilities: AdapterCapabilities;
21
21
  };
22
22
  readonly codex: {
23
23
  readonly id: "codex";
@@ -41,7 +41,7 @@ export declare const BUILTIN_HARNESS_PROFILES: {
41
41
  };
42
42
  readonly writableRoots: true;
43
43
  };
44
- readonly capabilities: HarnessCapabilities;
44
+ readonly capabilities: AdapterCapabilities;
45
45
  };
46
46
  readonly cursor: {
47
47
  readonly id: "cursor";
@@ -58,12 +58,12 @@ export declare const BUILTIN_HARNESS_PROFILES: {
58
58
  readonly date: "2026-07-25";
59
59
  readonly version: "2026.07.23-e383d2b";
60
60
  };
61
- readonly capabilities: HarnessCapabilities;
61
+ readonly capabilities: AdapterCapabilities;
62
62
  };
63
63
  };
64
- export type BuiltinHarnessId = keyof typeof BUILTIN_HARNESS_PROFILES;
65
- export declare const BUILTIN_HARNESS_IDS: readonly ("cursor" | "claude-code" | "codex")[];
66
- export declare function isBuiltinHarness(id: string): id is BuiltinHarnessId;
67
- export declare function builtinHarnessProfile(id: string): HarnessProfile | undefined;
68
- export declare function validateHarnessEffort(id: string, effort: string | undefined): void;
64
+ export type BuiltinAdapterId = keyof typeof BUILTIN_ADAPTER_PROFILES;
65
+ export declare const BUILTIN_ADAPTER_IDS: readonly ("claude-code" | "codex" | "cursor")[];
66
+ export declare function isBuiltinAdapter(id: string): id is BuiltinAdapterId;
67
+ export declare function builtinAdapterProfile(id: string): AdapterProfile | undefined;
68
+ export declare function validateAdapterEffort(id: string, effort: string | undefined): void;
69
69
  //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAmB,MAAM,YAAY,CAAC;AAgCvF;gFACgF;AAChF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Fc,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,wBAAwB,CAAC;AAErE,eAAO,MAAM,mBAAmB,iDAE/B,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,gBAAgB,CAEnE;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE5E;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUlF"}
@@ -22,13 +22,13 @@ function capabilities(overrides) {
22
22
  contextTelemetry: unknown("The workflow adapter does not expose live context usage."),
23
23
  preCompactionSignal: unknown("No compaction lifecycle probe has certified this adapter."),
24
24
  postCompactionSignal: unknown("No compaction lifecycle probe has certified this adapter."),
25
- compaction: unsupported("Harnery does not initiate native harness compaction."),
25
+ compaction: unsupported("Harnery does not initiate native adapter compaction."),
26
26
  ...overrides,
27
27
  };
28
28
  }
29
- /** The one built-in profile catalog. Adding a fourth harness starts here; CLI
29
+ /** The one built-in profile catalog. Adding a fourth adapter starts here; CLI
30
30
  * choices, doctor metadata, workflow dispatch, and the bench derive from it. */
31
- export const BUILTIN_HARNESS_PROFILES = {
31
+ export const BUILTIN_ADAPTER_PROFILES = {
32
32
  "claude-code": {
33
33
  id: "claude-code",
34
34
  displayName: "Claude Code",
@@ -104,19 +104,19 @@ export const BUILTIN_HARNESS_PROFILES = {
104
104
  }),
105
105
  },
106
106
  };
107
- export const BUILTIN_HARNESS_IDS = Object.freeze(Object.keys(BUILTIN_HARNESS_PROFILES));
108
- export function isBuiltinHarness(id) {
109
- return Object.hasOwn(BUILTIN_HARNESS_PROFILES, id);
107
+ export const BUILTIN_ADAPTER_IDS = Object.freeze(Object.keys(BUILTIN_ADAPTER_PROFILES));
108
+ export function isBuiltinAdapter(id) {
109
+ return Object.hasOwn(BUILTIN_ADAPTER_PROFILES, id);
110
110
  }
111
- export function builtinHarnessProfile(id) {
112
- return isBuiltinHarness(id) ? BUILTIN_HARNESS_PROFILES[id] : undefined;
111
+ export function builtinAdapterProfile(id) {
112
+ return isBuiltinAdapter(id) ? BUILTIN_ADAPTER_PROFILES[id] : undefined;
113
113
  }
114
- export function validateHarnessEffort(id, effort) {
114
+ export function validateAdapterEffort(id, effort) {
115
115
  if (!effort)
116
116
  return;
117
- const profile = builtinHarnessProfile(id);
117
+ const profile = builtinAdapterProfile(id);
118
118
  if (!profile)
119
- throw new Error(`unknown harness ${JSON.stringify(id)}`);
119
+ throw new Error(`unknown adapter ${JSON.stringify(id)}`);
120
120
  if (!profile.effortValues.includes(effort)) {
121
121
  const supportedValues = profile.effortValues.length ? profile.effortValues.join(", ") : "none";
122
122
  throw new Error(`effort ${JSON.stringify(effort)} is not supported by ${id}; supported values: ${supportedValues}`);
@@ -0,0 +1,15 @@
1
+ import type { Adapter, AdapterId } from "./types.js";
2
+ /** Mutable registry for embedders, initialized empty unless adapters are
3
+ * provided. Duplicate ids fail loud instead of silently replacing behavior. */
4
+ export declare class AdapterRegistry {
5
+ #private;
6
+ constructor(adapters?: Iterable<Adapter>);
7
+ register(adapter: Adapter): this;
8
+ get(id: AdapterId): Adapter | undefined;
9
+ require(id: AdapterId): Adapter;
10
+ list(): Adapter[];
11
+ ids(): AdapterId[];
12
+ spawners(): Record<AdapterId, Adapter["spawn"]>;
13
+ }
14
+ export declare function createBuiltinAdapterRegistry(): AdapterRegistry;
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/registry.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqErD;+EAC+E;AAC/E,qBAAa,eAAe;;gBAGd,QAAQ,GAAE,QAAQ,CAAC,OAAO,CAAM;IAI5C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAYhC,GAAG,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS;IAIvC,OAAO,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAU/B,IAAI,IAAI,OAAO,EAAE;IAIjB,GAAG,IAAI,SAAS,EAAE;IAIlB,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CAGhD;AAED,wBAAgB,4BAA4B,IAAI,eAAe,CAE9D"}
@@ -1,10 +1,10 @@
1
1
  import { buildClaudeInvocation, claudeCodeSpawner, normalizeClaudeResult, } from "../workflow/spawn-claude.js";
2
2
  import { buildCodexInvocation, codexSpawner, normalizeCodexResult, } from "../workflow/spawn-codex.js";
3
3
  import { buildCursorInvocation, cursorSpawner, normalizeCursorResult, } from "../workflow/spawn-cursor.js";
4
- import { BUILTIN_HARNESS_IDS, BUILTIN_HARNESS_PROFILES, } from "./profiles.js";
4
+ import { BUILTIN_ADAPTER_IDS, BUILTIN_ADAPTER_PROFILES, } from "./profiles.js";
5
5
  const BUILTIN_ADAPTERS = {
6
6
  "claude-code": {
7
- profile: BUILTIN_HARNESS_PROFILES["claude-code"],
7
+ profile: BUILTIN_ADAPTER_PROFILES["claude-code"],
8
8
  spawn: claudeCodeSpawner,
9
9
  buildInvocation: buildClaudeInvocation,
10
10
  normalizeResult: normalizeClaudeResult,
@@ -29,7 +29,7 @@ const BUILTIN_ADAPTERS = {
29
29
  },
30
30
  },
31
31
  codex: {
32
- profile: BUILTIN_HARNESS_PROFILES.codex,
32
+ profile: BUILTIN_ADAPTER_PROFILES.codex,
33
33
  spawn: codexSpawner,
34
34
  buildInvocation: buildCodexInvocation,
35
35
  normalizeResult: normalizeCodexResult,
@@ -45,7 +45,7 @@ const BUILTIN_ADAPTERS = {
45
45
  },
46
46
  },
47
47
  cursor: {
48
- profile: BUILTIN_HARNESS_PROFILES.cursor,
48
+ profile: BUILTIN_ADAPTER_PROFILES.cursor,
49
49
  spawn: cursorSpawner,
50
50
  buildInvocation: buildCursorInvocation,
51
51
  normalizeResult: normalizeCursorResult,
@@ -70,7 +70,7 @@ const BUILTIN_ADAPTERS = {
70
70
  };
71
71
  /** Mutable registry for embedders, initialized empty unless adapters are
72
72
  * provided. Duplicate ids fail loud instead of silently replacing behavior. */
73
- export class HarnessRegistry {
73
+ export class AdapterRegistry {
74
74
  #adapters = new Map();
75
75
  constructor(adapters = []) {
76
76
  for (const adapter of adapters)
@@ -79,11 +79,11 @@ export class HarnessRegistry {
79
79
  register(adapter) {
80
80
  const id = adapter.profile.id.trim();
81
81
  if (!id)
82
- throw new Error("harness adapter id cannot be empty");
82
+ throw new Error("adapter adapter id cannot be empty");
83
83
  if (this.#adapters.has(id))
84
- throw new Error(`harness adapter ${JSON.stringify(id)} is already registered`);
84
+ throw new Error(`adapter adapter ${JSON.stringify(id)} is already registered`);
85
85
  if (adapter.profile.binary.trim() === "") {
86
- throw new Error(`harness adapter ${JSON.stringify(id)} has no binary`);
86
+ throw new Error(`adapter adapter ${JSON.stringify(id)} has no binary`);
87
87
  }
88
88
  this.#adapters.set(id, adapter);
89
89
  return this;
@@ -94,7 +94,7 @@ export class HarnessRegistry {
94
94
  require(id) {
95
95
  const adapter = this.get(id);
96
96
  if (!adapter) {
97
- throw new Error(`unknown harness ${JSON.stringify(id)} (registered: ${this.ids().join(", ") || "none"})`);
97
+ throw new Error(`unknown adapter ${JSON.stringify(id)} (registered: ${this.ids().join(", ") || "none"})`);
98
98
  }
99
99
  return adapter;
100
100
  }
@@ -108,6 +108,6 @@ export class HarnessRegistry {
108
108
  return Object.fromEntries(this.list().map((adapter) => [adapter.profile.id, adapter.spawn]));
109
109
  }
110
110
  }
111
- export function createBuiltinHarnessRegistry() {
112
- return new HarnessRegistry(BUILTIN_HARNESS_IDS.map((id) => BUILTIN_ADAPTERS[id]));
111
+ export function createBuiltinAdapterRegistry() {
112
+ return new AdapterRegistry(BUILTIN_ADAPTER_IDS.map((id) => BUILTIN_ADAPTERS[id]));
113
113
  }
@@ -1,29 +1,29 @@
1
1
  import type { Spawner, SpawnRequest, SpawnResult } from "../workflow/types.js";
2
- /** Open harness identifier. Built-ins are registered at runtime rather than
2
+ /** Open adapter identifier. Built-ins are registered at runtime rather than
3
3
  * repeated through closed unions in every consumer. */
4
- export type HarnessId = string;
4
+ export type AdapterId = string;
5
5
  export type CapabilitySupport = "supported" | "partial" | "unsupported" | "unknown";
6
- export declare const HARNESS_CAPABILITY_DIMENSIONS: readonly ["invocation", "modelSelection", "effortSelection", "maxTurns", "finalResult", "sessionId", "cost", "toolEvidence", "policyMapping", "filesystemPolicyProjection", "interruption", "streaming", "steering", "resume", "images", "contextTelemetry", "preCompactionSignal", "postCompactionSignal", "compaction"];
7
- export type HarnessCapabilityDimension = (typeof HARNESS_CAPABILITY_DIMENSIONS)[number];
6
+ export declare const ADAPTER_CAPABILITY_DIMENSIONS: readonly ["invocation", "modelSelection", "effortSelection", "maxTurns", "finalResult", "sessionId", "cost", "toolEvidence", "policyMapping", "filesystemPolicyProjection", "interruption", "streaming", "steering", "resume", "images", "contextTelemetry", "preCompactionSignal", "postCompactionSignal", "compaction"];
7
+ export type AdapterCapabilityDimension = (typeof ADAPTER_CAPABILITY_DIMENSIONS)[number];
8
8
  export interface CapabilityClaim {
9
9
  support: CapabilitySupport;
10
10
  /** Operational qualification. Required for partial/unknown claims and useful
11
11
  * whenever "supported" has a narrower meaning than the vendor CLI itself. */
12
12
  note?: string;
13
13
  }
14
- export type HarnessCapabilities = Record<HarnessCapabilityDimension, CapabilityClaim>;
15
- /** What one harness can represent of a filesystem-policy projection
16
- * (ADR 0039). `null` means the harness does not distinguish that, which is a
17
- * fact about the harness rather than something to paper over: a projection the
14
+ export type AdapterCapabilities = Record<AdapterCapabilityDimension, CapabilityClaim>;
15
+ /** What one adapter can represent of a filesystem-policy projection
16
+ * (ADR 0039). `null` means the adapter does not distinguish that, which is a
17
+ * fact about the adapter rather than something to paper over: a projection the
18
18
  * adapter would silently drop must be refused instead. */
19
- export interface HarnessSandboxProjection {
19
+ export interface AdapterSandboxProjection {
20
20
  /** Native representation per canonical mode, or null when unrepresentable. */
21
21
  modes: Record<"read-only" | "workspace-write", string | null>;
22
- /** Whether the harness accepts an explicit writable-root set. */
22
+ /** Whether the adapter accepts an explicit writable-root set. */
23
23
  writableRoots: boolean;
24
24
  }
25
- export interface HarnessProfile {
26
- id: HarnessId;
25
+ export interface AdapterProfile {
26
+ id: AdapterId;
27
27
  displayName: string;
28
28
  binary: string;
29
29
  installHint: string;
@@ -33,7 +33,7 @@ export interface HarnessProfile {
33
33
  authModel: "own-auth";
34
34
  modelFamily: "claude" | "gpt" | "multi";
35
35
  effortValues: readonly string[];
36
- capabilities: HarnessCapabilities;
36
+ capabilities: AdapterCapabilities;
37
37
  /** The last real vendor CLI contract used to validate this declaration. */
38
38
  verified?: {
39
39
  date: string;
@@ -41,16 +41,16 @@ export interface HarnessProfile {
41
41
  };
42
42
  /** How this adapter projects host filesystem policy into the vendor's own
43
43
  * sandbox (ADR 0039). Absent means it cannot project any of it. */
44
- sandboxProjection?: HarnessSandboxProjection;
44
+ sandboxProjection?: AdapterSandboxProjection;
45
45
  }
46
46
  /** Fully planned child invocation. `resultFile` is used by adapters such as
47
47
  * Codex that deliver the authoritative final answer out-of-band. */
48
- export interface HarnessInvocation {
48
+ export interface AdapterInvocation {
49
49
  argv: string[];
50
50
  resultFile?: string;
51
51
  }
52
52
  /** Vendor subprocess material passed through an adapter's normalizer. */
53
- export interface HarnessRawResult {
53
+ export interface AdapterRawResult {
54
54
  stdout: string;
55
55
  stderr: string;
56
56
  exitCode: number;
@@ -67,8 +67,8 @@ export interface HarnessRawResult {
67
67
  * (run never started) rather than a work failure. Absent on ordinary exit. */
68
68
  spawnErrno?: string;
69
69
  }
70
- export interface HarnessBenchFixture {
71
- raw: HarnessRawResult;
70
+ export interface AdapterBenchFixture {
71
+ raw: AdapterRawResult;
72
72
  expected: Pick<SpawnResult, "ok" | "text"> & {
73
73
  sessionId?: string;
74
74
  costUsd?: number;
@@ -77,11 +77,11 @@ export interface HarnessBenchFixture {
77
77
  /** One registered executable adapter. The same planner and normalizer power
78
78
  * production workflow runs and the offline conformance bench, preventing the
79
79
  * bench from testing a parallel mock implementation. */
80
- export interface HarnessAdapter {
81
- profile: HarnessProfile;
80
+ export interface Adapter {
81
+ profile: AdapterProfile;
82
82
  spawn: Spawner;
83
- buildInvocation: (request: SpawnRequest, resultFile?: string) => HarnessInvocation;
84
- normalizeResult: (raw: HarnessRawResult) => SpawnResult;
85
- fixture: HarnessBenchFixture;
83
+ buildInvocation: (request: SpawnRequest, resultFile?: string) => AdapterInvocation;
84
+ normalizeResult: (raw: AdapterRawResult) => SpawnResult;
85
+ fixture: AdapterBenchFixture;
86
86
  }
87
87
  //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE/E;uDACuD;AACvD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAEpF,eAAO,MAAM,6BAA6B,2TAoBhC,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B;iFAC6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,EAAE,eAAe,CAAC,CAAC;AAEtF;;;0DAG0D;AAC1D,MAAM,WAAW,wBAAwB;IACvC,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,WAAW,GAAG,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9D,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACxC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,mBAAmB,CAAC;IAClC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C;uEACmE;IACnE,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;CAC9C;AAED;oEACoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;0BAGsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;kFAG8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,GAAG;QAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;wDAEwD;AACxD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACnF,eAAe,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,WAAW,CAAC;IACxD,OAAO,EAAE,mBAAmB,CAAC;CAC9B"}
@@ -1,4 +1,4 @@
1
- export const HARNESS_CAPABILITY_DIMENSIONS = [
1
+ export const ADAPTER_CAPABILITY_DIMENSIONS = [
2
2
  "invocation",
3
3
  "modelSelection",
4
4
  "effortSelection",
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Emit canonical events by spawning `agent-coord emit-event`. Used by every
3
- * `agents …` / `scratch` / `presence` write that has a canonical state event.
3
+ * `agents …` / `journal` / `presence` write that has a canonical state event.
4
4
  *
5
5
  * Soft-fails: never throws into the caller. A failed emit logs to stderr
6
6
  * (visible to operators in their terminal) but never breaks the CLI flow.
@@ -12,7 +12,7 @@ export interface CanonicalEmitInput {
12
12
  type: string;
13
13
  owner: string;
14
14
  session: string;
15
- harness: "claude-code" | "cursor" | "codex";
15
+ adapter: "claude-code" | "cursor" | "codex";
16
16
  data: Record<string, unknown>;
17
17
  turnId?: string;
18
18
  parentSessionId?: string;
@@ -21,22 +21,17 @@ export interface CanonicalEmitInput {
21
21
  /**
22
22
  * Resolve the coord root for a canonical emit.
23
23
  *
24
- * Order: explicit `HARNERY_COORD_ROOT_OVERRIDE` → git-superproject-aware
25
- * `monorepoRoot()` (must actually carry `.harnery/`) → cwd walk (non-git
26
- * hosts). The git-aware step is load-bearing: a shell cd'd into a nested
27
- * directory that carries its own `.harnery/` (e.g. an embedded harnery
28
- * checkout) made the old cwd-walk resolve the NESTED root, from which
29
- * `<root>/harnery/bin/agent-coord` doesn't exist — so `agents status` /
30
- * `set-task` emits silently vanished and the Stop-hook's rule 1/3
31
- * (`state.status_checked` in-turn) blocked turns that had done the ritual.
32
- * Same bug class as the coordHelperOpts root-pin fix; this closes the
33
- * emitCanonical instance of it.
24
+ * Delegates to `resolveCoordRoot()`, the single resolution the hooks and the
25
+ * CLI's reads also use. An emit resolved any other way is an emit the Stop hook
26
+ * cannot see: the hook reads `state.status_checked` from the stream under ITS
27
+ * root, so a divergent emit root blocks rule 1/3 on a turn that did run
28
+ * `agents status`, and no sequence of CLI commands can satisfy it.
34
29
  */
35
30
  export declare function resolveEmitRoot(start?: string): string | null;
36
31
  export declare function emitCanonical(input: CanonicalEmitInput): void;
37
32
  /**
38
33
  * Normalize the heartbeat's `platform` field (which uses snake_case
39
- * `claude_code`) to the canonical kebab-case Harness type.
34
+ * `claude_code`) to the canonical kebab-case Adapter type.
40
35
  */
41
- export declare function normalizeHarness(platform: string | undefined): "claude-code" | "cursor" | "codex";
36
+ export declare function normalizeAdapter(platform: string | undefined): "claude-code" | "cursor" | "codex";
42
37
  //# sourceMappingURL=canonical-emit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-emit.d.ts","sourceRoot":"","sources":["../../../src/core/agents/canonical-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAW5E;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAsC7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAIjG"}
1
+ {"version":3,"file":"canonical-emit.d.ts","sourceRoot":"","sources":["../../../src/core/agents/canonical-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAsC7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAIjG"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Emit canonical events by spawning `agent-coord emit-event`. Used by every
3
- * `agents …` / `scratch` / `presence` write that has a canonical state event.
3
+ * `agents …` / `journal` / `presence` write that has a canonical state event.
4
4
  *
5
5
  * Soft-fails: never throws into the caller. A failed emit logs to stderr
6
6
  * (visible to operators in their terminal) but never breaks the CLI flow.
@@ -9,44 +9,26 @@
9
9
  * latency budget per call.
10
10
  */
11
11
  import { spawnSync } from "node:child_process";
12
- import { existsSync } from "node:fs";
13
- import { dirname, join, resolve } from "node:path";
14
- import { monorepoRoot } from "./coord-client.js";
12
+ import { coordBinPath } from "./coord-bin.js";
13
+ import { resolveCoordRoot } from "./coord-client.js";
15
14
  /**
16
15
  * Resolve the coord root for a canonical emit.
17
16
  *
18
- * Order: explicit `HARNERY_COORD_ROOT_OVERRIDE` → git-superproject-aware
19
- * `monorepoRoot()` (must actually carry `.harnery/`) → cwd walk (non-git
20
- * hosts). The git-aware step is load-bearing: a shell cd'd into a nested
21
- * directory that carries its own `.harnery/` (e.g. an embedded harnery
22
- * checkout) made the old cwd-walk resolve the NESTED root, from which
23
- * `<root>/harnery/bin/agent-coord` doesn't exist — so `agents status` /
24
- * `set-task` emits silently vanished and the Stop-hook's rule 1/3
25
- * (`state.status_checked` in-turn) blocked turns that had done the ritual.
26
- * Same bug class as the coordHelperOpts root-pin fix; this closes the
27
- * emitCanonical instance of it.
17
+ * Delegates to `resolveCoordRoot()`, the single resolution the hooks and the
18
+ * CLI's reads also use. An emit resolved any other way is an emit the Stop hook
19
+ * cannot see: the hook reads `state.status_checked` from the stream under ITS
20
+ * root, so a divergent emit root blocks rule 1/3 on a turn that did run
21
+ * `agents status`, and no sequence of CLI commands can satisfy it.
28
22
  */
29
23
  export function resolveEmitRoot(start = process.cwd()) {
30
- const override = process.env.HARNERY_COORD_ROOT_OVERRIDE;
31
- if (override)
32
- return override;
33
- // Memoized per start-dir: the session-tee middleware resolves once per
34
- // emitted event, and monorepoRoot() spawns git — cache so a streaming
35
- // command doesn't pay 1-3 subprocess spawns per output line.
36
- if (cachedRoot && cachedRoot.start === start)
37
- return cachedRoot.root;
38
- const gitRoot = monorepoRoot();
39
- const root = gitRoot && existsSync(join(gitRoot, ".harnery")) ? gitRoot : findRepoRoot(start);
40
- cachedRoot = { start, root };
41
- return root;
24
+ return resolveCoordRoot(start);
42
25
  }
43
- let cachedRoot;
44
26
  export function emitCanonical(input) {
45
27
  const root = resolveEmitRoot();
46
28
  if (!root)
47
29
  return;
48
- const binary = resolve(root, "harnery", "bin", "agent-coord");
49
- if (!existsSync(binary))
30
+ const binary = coordBinPath("agent-coord", root);
31
+ if (!binary)
50
32
  return;
51
33
  try {
52
34
  const args = [
@@ -57,8 +39,8 @@ export function emitCanonical(input) {
57
39
  input.owner,
58
40
  "--session",
59
41
  input.session,
60
- "--harness",
61
- input.harness,
42
+ "--adapter",
43
+ input.adapter,
62
44
  "--data-json",
63
45
  JSON.stringify(input.data),
64
46
  ];
@@ -88,23 +70,12 @@ export function emitCanonical(input) {
88
70
  }
89
71
  /**
90
72
  * Normalize the heartbeat's `platform` field (which uses snake_case
91
- * `claude_code`) to the canonical kebab-case Harness type.
73
+ * `claude_code`) to the canonical kebab-case Adapter type.
92
74
  */
93
- export function normalizeHarness(platform) {
75
+ export function normalizeAdapter(platform) {
94
76
  if (platform === "cursor")
95
77
  return "cursor";
96
78
  if (platform === "codex")
97
79
  return "codex";
98
80
  return "claude-code";
99
81
  }
100
- function findRepoRoot(start) {
101
- let dir = resolve(start);
102
- while (true) {
103
- if (existsSync(join(dir, ".harnery")))
104
- return dir;
105
- const parent = dirname(dir);
106
- if (parent === dir)
107
- return null;
108
- dir = parent;
109
- }
110
- }
@@ -38,7 +38,7 @@ export function emitAndProject(input, opts = {}) {
38
38
  parent_session_id: envelope.parent_session_id,
39
39
  turn_id: envelope.turn_id,
40
40
  parent_turn_id: envelope.parent_turn_id,
41
- harness: envelope.harness,
41
+ adapter: envelope.adapter,
42
42
  source: envelope.source,
43
43
  data: envelope.data,
44
44
  },