harnery 0.29.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) 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 +61 -60
  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/init.d.ts +12 -12
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +44 -30
  36. package/dist/commands/{session.d.ts → journal.d.ts} +2 -2
  37. package/dist/commands/journal.d.ts.map +1 -0
  38. package/dist/commands/{scratch.js → journal.js} +47 -47
  39. package/dist/commands/policy.js +1 -1
  40. package/dist/commands/presence.js +2 -2
  41. package/dist/commands/sync.d.ts +1 -1
  42. package/dist/commands/sync.js +3 -3
  43. package/dist/commands/tunnel.d.ts +16 -0
  44. package/dist/commands/tunnel.d.ts.map +1 -1
  45. package/dist/commands/tunnel.js +193 -23
  46. package/dist/commands/web-fetch.js +1 -1
  47. package/dist/commands/web.d.ts +19 -0
  48. package/dist/commands/web.d.ts.map +1 -1
  49. package/dist/commands/web.js +51 -0
  50. package/dist/commands/work.d.ts +2 -1
  51. package/dist/commands/work.d.ts.map +1 -1
  52. package/dist/commands/work.js +55 -25
  53. package/dist/commands/workflow.d.ts.map +1 -1
  54. package/dist/commands/workflow.js +35 -28
  55. package/dist/core/{harnesses → adapters}/attest-projection.d.ts +2 -2
  56. package/dist/core/adapters/attest-projection.d.ts.map +1 -0
  57. package/dist/core/{harnesses → adapters}/attest.d.ts +16 -16
  58. package/dist/core/adapters/attest.d.ts.map +1 -0
  59. package/dist/core/{harnesses → adapters}/attest.js +9 -9
  60. package/dist/core/{harnesses → adapters}/attestation.d.ts +16 -16
  61. package/dist/core/adapters/attestation.d.ts.map +1 -0
  62. package/dist/core/{harnesses → adapters}/attestation.js +20 -20
  63. package/dist/core/{harnesses → adapters}/bench.d.ts +12 -12
  64. package/dist/core/adapters/bench.d.ts.map +1 -0
  65. package/dist/core/{harnesses → adapters}/bench.js +12 -12
  66. package/dist/core/adapters/index.d.ts +13 -0
  67. package/dist/core/adapters/index.d.ts.map +1 -0
  68. package/dist/core/adapters/index.js +6 -0
  69. package/dist/core/{harnesses → adapters}/profiles.d.ts +11 -11
  70. package/dist/core/adapters/profiles.d.ts.map +1 -0
  71. package/dist/core/{harnesses → adapters}/profiles.js +11 -11
  72. package/dist/core/adapters/registry.d.ts +15 -0
  73. package/dist/core/adapters/registry.d.ts.map +1 -0
  74. package/dist/core/{harnesses → adapters}/registry.js +11 -11
  75. package/dist/core/{harnesses → adapters}/types.d.ts +28 -23
  76. package/dist/core/adapters/types.d.ts.map +1 -0
  77. package/dist/core/{harnesses → adapters}/types.js +1 -1
  78. package/dist/core/agents/canonical-emit.d.ts +4 -4
  79. package/dist/core/agents/canonical-emit.js +5 -5
  80. package/dist/core/agents/cli-emit.js +1 -1
  81. package/dist/core/agents/cli.js +30 -26
  82. package/dist/core/agents/codex-replay.d.ts +1 -1
  83. package/dist/core/agents/codex-replay.js +6 -6
  84. package/dist/core/agents/coord-client.d.ts +21 -2
  85. package/dist/core/agents/coord-client.d.ts.map +1 -1
  86. package/dist/core/agents/coord-client.js +122 -27
  87. package/dist/core/agents/events/consume.d.ts +1 -1
  88. package/dist/core/agents/events/emit.d.ts +5 -6
  89. package/dist/core/agents/events/emit.d.ts.map +1 -1
  90. package/dist/core/agents/events/emit.js +2 -2
  91. package/dist/core/agents/render/prompt-context.d.ts +21 -9
  92. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  93. package/dist/core/agents/render/prompt-context.js +82 -30
  94. package/dist/core/agents/render/session-context.d.ts +1 -1
  95. package/dist/core/agents/render/session-context.js +5 -5
  96. package/dist/core/agents/rules/claim-conflict.d.ts +2 -6
  97. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  98. package/dist/core/agents/rules/claim-conflict.js +1 -1
  99. package/dist/core/agents/rules/commit-conflict.js +98 -22
  100. package/dist/core/agents/rules/stop-hook.d.ts +9 -9
  101. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  102. package/dist/core/agents/rules/stop-hook.js +23 -5
  103. package/dist/core/agents/rules/verdict.d.ts +14 -0
  104. package/dist/core/agents/rules/verdict.d.ts.map +1 -0
  105. package/dist/core/agents/rules/verdict.js +1 -0
  106. package/dist/core/agents/session-events.js +3 -3
  107. package/dist/core/agents/state/council.d.ts +1 -1
  108. package/dist/core/agents/state/council.js +1 -1
  109. package/dist/core/agents/state/heartbeat-projector.d.ts +3 -2
  110. package/dist/core/agents/state/heartbeat-projector.d.ts.map +1 -1
  111. package/dist/core/agents/state/heartbeat-projector.js +14 -10
  112. package/dist/core/agents/state/heartbeat-writer.d.ts +1 -1
  113. package/dist/core/agents/state/heartbeat-writer.js +12 -12
  114. package/dist/core/agents/state/{scratch.d.ts → journal.d.ts} +7 -7
  115. package/dist/core/agents/state/{scratch.d.ts.map → journal.d.ts.map} +1 -1
  116. package/dist/core/agents/state/{scratch.js → journal.js} +12 -12
  117. package/dist/core/agents/state/pidmap.d.ts +28 -4
  118. package/dist/core/agents/state/pidmap.d.ts.map +1 -1
  119. package/dist/core/agents/state/pidmap.js +130 -15
  120. package/dist/core/agents/state/proc-start.d.ts +95 -0
  121. package/dist/core/agents/state/proc-start.d.ts.map +1 -0
  122. package/dist/core/agents/state/proc-start.js +199 -0
  123. package/dist/core/agents/state/shell-mutation.d.ts +1 -1
  124. package/dist/core/agents/state/shell-mutation.js +1 -1
  125. package/dist/core/agents/state/stale-sweep.js +7 -7
  126. package/dist/core/artifacts/index.d.ts +86 -0
  127. package/dist/core/artifacts/index.d.ts.map +1 -0
  128. package/dist/core/artifacts/index.js +421 -0
  129. package/dist/core/config.d.ts +9 -2
  130. package/dist/core/config.d.ts.map +1 -1
  131. package/dist/core/config.js +26 -2
  132. package/dist/core/context/index.d.ts +12 -12
  133. package/dist/core/context/index.js +10 -10
  134. package/dist/core/governor/adapter-spread.d.ts +52 -0
  135. package/dist/core/governor/adapter-spread.d.ts.map +1 -0
  136. package/dist/core/governor/adapter-spread.js +52 -0
  137. package/dist/core/governor/index.d.ts +7 -0
  138. package/dist/core/governor/index.d.ts.map +1 -0
  139. package/dist/core/governor/index.js +6 -0
  140. package/dist/core/governor/plan-api.d.ts +38 -0
  141. package/dist/core/governor/plan-api.d.ts.map +1 -0
  142. package/dist/core/governor/plan-api.js +83 -0
  143. package/dist/core/governor/plan-read.d.ts +5 -0
  144. package/dist/core/governor/plan-read.d.ts.map +1 -0
  145. package/dist/core/{supervisor → governor}/plan-read.js +71 -51
  146. package/dist/core/governor/plan-types.d.ts +181 -0
  147. package/dist/core/governor/plan-types.d.ts.map +1 -0
  148. package/dist/core/{supervisor → governor}/plan-types.js +4 -4
  149. package/dist/core/governor/planning.d.ts +48 -0
  150. package/dist/core/governor/planning.d.ts.map +1 -0
  151. package/dist/core/{supervisor → governor}/planning.js +143 -94
  152. package/dist/core/governor/read.d.ts +6 -0
  153. package/dist/core/governor/read.d.ts.map +1 -0
  154. package/dist/core/governor/read.js +4 -0
  155. package/dist/core/governor/runner.d.ts +37 -0
  156. package/dist/core/governor/runner.d.ts.map +1 -0
  157. package/dist/core/{supervisor → governor}/runner.js +15 -15
  158. package/dist/core/governor/service-read.d.ts +6 -0
  159. package/dist/core/governor/service-read.d.ts.map +1 -0
  160. package/dist/core/{supervisor → governor}/service-read.js +12 -12
  161. package/dist/core/governor/service.d.ts +114 -0
  162. package/dist/core/governor/service.d.ts.map +1 -0
  163. package/dist/core/{supervisor → governor}/service.js +57 -57
  164. package/dist/core/governor/state.d.ts +116 -0
  165. package/dist/core/governor/state.d.ts.map +1 -0
  166. package/dist/core/{supervisor → governor}/state.js +290 -116
  167. package/dist/core/hooks/adapter/detect.d.ts +9 -0
  168. package/dist/core/hooks/{harness → adapter}/detect.d.ts.map +1 -1
  169. package/dist/core/hooks/{harness → adapter}/detect.js +8 -8
  170. package/dist/core/hooks/{harness → adapter}/events.d.ts +15 -14
  171. package/dist/core/hooks/adapter/events.d.ts.map +1 -0
  172. package/dist/core/hooks/{harness → adapter}/events.js +5 -5
  173. package/dist/core/hooks/{harness → adapter}/output.d.ts +20 -14
  174. package/dist/core/hooks/adapter/output.d.ts.map +1 -0
  175. package/dist/core/hooks/{harness → adapter}/output.js +30 -22
  176. package/dist/core/hooks/{harness → adapter}/parse.d.ts +5 -5
  177. package/dist/core/hooks/{harness → adapter}/parse.d.ts.map +1 -1
  178. package/dist/core/hooks/{harness → adapter}/parse.js +4 -4
  179. package/dist/core/hooks/{harness → adapter}/wiring.d.ts +15 -15
  180. package/dist/core/hooks/{harness → adapter}/wiring.d.ts.map +1 -1
  181. package/dist/core/hooks/{harness → adapter}/wiring.js +13 -13
  182. package/dist/core/hooks/cli.d.ts +3 -3
  183. package/dist/core/hooks/cli.js +175 -151
  184. package/dist/core/hooks/effects/image-capture.d.ts +5 -5
  185. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  186. package/dist/core/hooks/effects/image-capture.js +3 -3
  187. package/dist/core/hooks/effects/index.d.ts +12 -12
  188. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  189. package/dist/core/hooks/effects/index.js +17 -17
  190. package/dist/core/hooks/events/emit.d.ts +2 -2
  191. package/dist/core/hooks/events/emit.d.ts.map +1 -1
  192. package/dist/core/hooks/events/emit.js +1 -1
  193. package/dist/core/hooks/events/rotate.js +1 -1
  194. package/dist/core/hooks/events/schema.d.ts +13 -5
  195. package/dist/core/hooks/events/schema.d.ts.map +1 -1
  196. package/dist/core/hooks/guard-path.d.ts +2 -2
  197. package/dist/core/hooks/guard-path.js +2 -2
  198. package/dist/core/hooks/index.d.ts +1 -1
  199. package/dist/core/hooks/index.d.ts.map +1 -1
  200. package/dist/core/hooks/resolve/anchor.d.ts +14 -5
  201. package/dist/core/hooks/resolve/anchor.d.ts.map +1 -1
  202. package/dist/core/hooks/resolve/anchor.js +64 -7
  203. package/dist/core/hooks/resolve/coord-root.d.ts +3 -3
  204. package/dist/core/hooks/resolve/coord-root.js +4 -4
  205. package/dist/core/hooks/resolve/intent.js +1 -1
  206. package/dist/core/hooks/resolve/owner.d.ts +1 -1
  207. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  208. package/dist/core/hooks/resolve/owner.js +11 -5
  209. package/dist/core/{scratch → journal}/index.d.ts +25 -25
  210. package/dist/core/{scratch → journal}/index.d.ts.map +1 -1
  211. package/dist/core/{scratch → journal}/index.js +38 -38
  212. package/dist/core/policy/evaluate.d.ts +1 -1
  213. package/dist/core/policy/evaluate.d.ts.map +1 -1
  214. package/dist/core/policy/evaluate.js +7 -7
  215. package/dist/core/policy/types.d.ts +3 -3
  216. package/dist/core/policy/types.d.ts.map +1 -1
  217. package/dist/core/work/runner.d.ts.map +1 -1
  218. package/dist/core/work/runner.js +11 -2
  219. package/dist/core/work/state.d.ts +28 -3
  220. package/dist/core/work/state.d.ts.map +1 -1
  221. package/dist/core/work/state.js +148 -16
  222. package/dist/core/workflow/adapters.d.ts +17 -0
  223. package/dist/core/workflow/adapters.d.ts.map +1 -0
  224. package/dist/core/workflow/adapters.js +21 -0
  225. package/dist/core/workflow/approvals.js +6 -6
  226. package/dist/core/workflow/billing.d.ts +9 -9
  227. package/dist/core/workflow/billing.js +9 -9
  228. package/dist/core/workflow/child-env.d.ts +10 -2
  229. package/dist/core/workflow/child-env.d.ts.map +1 -1
  230. package/dist/core/workflow/child-env.js +12 -4
  231. package/dist/core/workflow/engine.d.ts +15 -5
  232. package/dist/core/workflow/engine.d.ts.map +1 -1
  233. package/dist/core/workflow/engine.js +151 -83
  234. package/dist/core/workflow/evidence-preflight.d.ts +24 -0
  235. package/dist/core/workflow/evidence-preflight.d.ts.map +1 -0
  236. package/dist/core/workflow/evidence-preflight.js +134 -0
  237. package/dist/core/workflow/index.d.ts +3 -2
  238. package/dist/core/workflow/index.d.ts.map +1 -1
  239. package/dist/core/workflow/index.js +2 -1
  240. package/dist/core/workflow/proof.d.ts +28 -5
  241. package/dist/core/workflow/proof.d.ts.map +1 -1
  242. package/dist/core/workflow/proof.js +77 -34
  243. package/dist/core/workflow/run-state.d.ts +1 -1
  244. package/dist/core/workflow/run-state.js +7 -7
  245. package/dist/core/workflow/sandbox-projection.d.ts +6 -6
  246. package/dist/core/workflow/sandbox-projection.d.ts.map +1 -1
  247. package/dist/core/workflow/sandbox-projection.js +11 -11
  248. package/dist/core/workflow/spawn-claude.d.ts +3 -3
  249. package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
  250. package/dist/core/workflow/spawn-claude.js +28 -8
  251. package/dist/core/workflow/spawn-codex.d.ts +4 -4
  252. package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
  253. package/dist/core/workflow/spawn-codex.js +26 -8
  254. package/dist/core/workflow/spawn-cursor.d.ts +4 -4
  255. package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
  256. package/dist/core/workflow/spawn-cursor.js +27 -8
  257. package/dist/core/workflow/spawn-failure.d.ts +15 -1
  258. package/dist/core/workflow/spawn-failure.d.ts.map +1 -1
  259. package/dist/core/workflow/spawn-failure.js +35 -1
  260. package/dist/core/workflow/specialists.js +2 -2
  261. package/dist/core/workflow/{journal.d.ts → transcript.d.ts} +8 -8
  262. package/dist/core/workflow/transcript.d.ts.map +1 -0
  263. package/dist/core/workflow/{journal.js → transcript.js} +14 -14
  264. package/dist/core/workflow/types.d.ts +119 -46
  265. package/dist/core/workflow/types.d.ts.map +1 -1
  266. package/dist/core/workflow/types.js +11 -1
  267. package/dist/core/workflow/validate.d.ts +1 -1
  268. package/dist/core/workflow/validate.js +1 -1
  269. package/dist/core/workflow/workspaces/cancellation.js +2 -2
  270. package/dist/core/workflow/workspaces/cleanup.js +2 -2
  271. package/dist/core/workflow/workspaces/execution.js +6 -6
  272. package/dist/core/workflow/workspaces/inspect.js +9 -9
  273. package/dist/core/workflow/workspaces/integration.js +14 -14
  274. package/dist/core/workflow/workspaces/lifecycle.d.ts +1 -1
  275. package/dist/core/workflow/workspaces/lifecycle.d.ts.map +1 -1
  276. package/dist/core/workflow/workspaces/lifecycle.js +9 -9
  277. package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
  278. package/dist/core/workflow/workspaces/local-git.js +39 -5
  279. package/dist/core/workflow/workspaces/recovery.js +3 -3
  280. package/dist/core/workflow/workspaces/state.d.ts +1 -1
  281. package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
  282. package/dist/core/workflow/workspaces/state.js +3 -3
  283. package/dist/core/workflow/workspaces/types.d.ts +1 -1
  284. package/dist/core/workflow/workspaces/types.d.ts.map +1 -1
  285. package/dist/lib/browser/asserts.d.ts +28 -0
  286. package/dist/lib/browser/asserts.d.ts.map +1 -0
  287. package/dist/lib/browser/asserts.js +152 -0
  288. package/dist/lib/browser/client.d.ts +49 -0
  289. package/dist/lib/browser/client.d.ts.map +1 -1
  290. package/dist/lib/browser/client.js +155 -14
  291. package/dist/lib/browser/content-checks.d.ts +108 -0
  292. package/dist/lib/browser/content-checks.d.ts.map +1 -0
  293. package/dist/lib/browser/content-checks.js +474 -0
  294. package/dist/lib/browser/critique.d.ts +91 -0
  295. package/dist/lib/browser/critique.d.ts.map +1 -0
  296. package/dist/lib/browser/critique.js +167 -0
  297. package/dist/lib/browser/geometry.d.ts +32 -0
  298. package/dist/lib/browser/geometry.d.ts.map +1 -1
  299. package/dist/lib/browser/geometry.js +244 -1
  300. package/dist/lib/browser/index.d.ts +4 -1
  301. package/dist/lib/browser/index.d.ts.map +1 -1
  302. package/dist/lib/browser/index.js +2 -0
  303. package/dist/lib/claude-desktop.d.ts.map +1 -1
  304. package/dist/lib/claude-desktop.js +4 -1
  305. package/dist/lib/council/index.d.ts +6 -6
  306. package/dist/lib/council/index.d.ts.map +1 -1
  307. package/dist/lib/council/index.js +8 -8
  308. package/dist/lib/exec.d.ts +7 -0
  309. package/dist/lib/exec.d.ts.map +1 -1
  310. package/dist/lib/exec.js +6 -3
  311. package/dist/lib/identities/assume.d.ts +2 -2
  312. package/dist/lib/identities/assume.js +7 -7
  313. package/dist/lib/instructions/apply.d.ts +3 -3
  314. package/dist/lib/instructions/apply.d.ts.map +1 -1
  315. package/dist/lib/instructions/apply.js +75 -27
  316. package/dist/lib/instructions/host-addendum.d.ts +54 -0
  317. package/dist/lib/instructions/host-addendum.d.ts.map +1 -0
  318. package/dist/lib/instructions/host-addendum.js +107 -0
  319. package/dist/lib/instructions/templates.d.ts +10 -3
  320. package/dist/lib/instructions/templates.d.ts.map +1 -1
  321. package/dist/lib/instructions/templates.js +41 -12
  322. package/dist/lib/machine.d.ts +2 -2
  323. package/dist/lib/machine.js +2 -2
  324. package/package.json +26 -21
  325. package/schemas/config.schema.json +26 -1
  326. package/src/commander.ts +22 -13
  327. package/src/commands/{harness.ts → adapter.ts} +46 -46
  328. package/src/commands/agents.ts +71 -64
  329. package/src/commands/artifacts.ts +168 -0
  330. package/src/commands/backup.ts +47 -33
  331. package/src/commands/browse.ts +438 -2
  332. package/src/commands/checkpoint.ts +196 -0
  333. package/src/commands/context.ts +3 -176
  334. package/src/commands/decision.ts +41 -7
  335. package/src/commands/deinit.ts +16 -16
  336. package/src/commands/doctor.ts +28 -28
  337. package/src/commands/{supervisor.ts → governor.ts} +184 -154
  338. package/src/commands/init.ts +50 -34
  339. package/src/commands/{scratch.ts → journal.ts} +60 -60
  340. package/src/commands/policy.ts +1 -1
  341. package/src/commands/presence.ts +2 -2
  342. package/src/commands/sync.ts +3 -3
  343. package/src/commands/tunnel.ts +237 -34
  344. package/src/commands/web-fetch.ts +1 -1
  345. package/src/commands/web.ts +56 -1
  346. package/src/commands/work.ts +72 -38
  347. package/src/commands/workflow.ts +43 -34
  348. package/src/core/{harnesses → adapters}/attest-projection.ts +2 -2
  349. package/src/core/{harnesses → adapters}/attest.ts +27 -27
  350. package/src/core/{harnesses → adapters}/attestation.ts +41 -41
  351. package/src/core/{harnesses → adapters}/bench.ts +34 -43
  352. package/src/core/adapters/index.ts +56 -0
  353. package/src/core/{harnesses → adapters}/profiles.ts +16 -16
  354. package/src/core/{harnesses → adapters}/registry.ts +23 -23
  355. package/src/core/{harnesses → adapters}/types.ts +28 -23
  356. package/src/core/agents/canonical-emit.ts +6 -6
  357. package/src/core/agents/cli-emit.ts +1 -1
  358. package/src/core/agents/cli.ts +30 -28
  359. package/src/core/agents/codex-replay.ts +6 -6
  360. package/src/core/agents/coord-client.ts +119 -28
  361. package/src/core/agents/events/consume.ts +1 -1
  362. package/src/core/agents/events/emit.ts +7 -6
  363. package/src/core/agents/render/prompt-context.ts +107 -31
  364. package/src/core/agents/render/session-context.ts +6 -6
  365. package/src/core/agents/rules/claim-conflict.ts +4 -7
  366. package/src/core/agents/rules/commit-conflict.ts +103 -22
  367. package/src/core/agents/rules/stop-hook.ts +33 -17
  368. package/src/core/agents/rules/verdict.ts +13 -0
  369. package/src/core/agents/session-events.ts +4 -4
  370. package/src/core/agents/state/council.ts +1 -1
  371. package/src/core/agents/state/heartbeat-projector.ts +16 -12
  372. package/src/core/agents/state/heartbeat-writer.ts +12 -12
  373. package/src/core/agents/state/{scratch.ts → journal.ts} +12 -12
  374. package/src/core/agents/state/pidmap.ts +130 -15
  375. package/src/core/agents/state/proc-start.ts +208 -0
  376. package/src/core/agents/state/shell-mutation.ts +1 -1
  377. package/src/core/agents/state/stale-sweep.ts +7 -7
  378. package/src/core/artifacts/index.ts +557 -0
  379. package/src/core/config.ts +30 -2
  380. package/src/core/context/index.ts +15 -15
  381. package/src/core/governor/adapter-spread.ts +82 -0
  382. package/src/core/governor/index.ts +91 -0
  383. package/src/core/governor/plan-api.ts +115 -0
  384. package/src/core/{supervisor → governor}/plan-read.ts +120 -96
  385. package/src/core/{supervisor → governor}/plan-types.ts +64 -50
  386. package/src/core/{supervisor → governor}/planning.ts +240 -188
  387. package/src/core/governor/read.ts +59 -0
  388. package/src/core/{supervisor → governor}/runner.ts +39 -39
  389. package/src/core/{supervisor → governor}/service-read.ts +22 -22
  390. package/src/core/{supervisor → governor}/service.ts +117 -119
  391. package/src/core/{supervisor → governor}/state.ts +389 -174
  392. package/src/core/hooks/adapter/detect.ts +30 -0
  393. package/src/core/hooks/{harness → adapter}/events.ts +16 -14
  394. package/src/core/hooks/{harness → adapter}/output.ts +31 -23
  395. package/src/core/hooks/{harness → adapter}/parse.ts +5 -5
  396. package/src/core/hooks/{harness → adapter}/wiring.ts +21 -21
  397. package/src/core/hooks/cli.ts +185 -162
  398. package/src/core/hooks/effects/image-capture.ts +6 -6
  399. package/src/core/hooks/effects/index.ts +17 -17
  400. package/src/core/hooks/events/emit.ts +3 -3
  401. package/src/core/hooks/events/rotate.ts +1 -1
  402. package/src/core/hooks/events/schema.ts +15 -7
  403. package/src/core/hooks/guard-path.ts +2 -2
  404. package/src/core/hooks/index.ts +1 -1
  405. package/src/core/hooks/resolve/anchor.ts +63 -8
  406. package/src/core/hooks/resolve/coord-root.ts +4 -4
  407. package/src/core/hooks/resolve/intent.ts +1 -1
  408. package/src/core/hooks/resolve/owner.ts +11 -5
  409. package/src/core/{scratch → journal}/index.ts +53 -53
  410. package/src/core/policy/evaluate.ts +8 -8
  411. package/src/core/policy/types.ts +3 -3
  412. package/src/core/work/runner.ts +11 -2
  413. package/src/core/work/state.ts +185 -21
  414. package/src/core/workflow/adapters.ts +33 -0
  415. package/src/core/workflow/approvals.ts +7 -7
  416. package/src/core/workflow/billing.ts +12 -12
  417. package/src/core/workflow/child-env.ts +13 -4
  418. package/src/core/workflow/engine.ts +166 -90
  419. package/src/core/workflow/evidence-preflight.ts +165 -0
  420. package/src/core/workflow/index.ts +6 -3
  421. package/src/core/workflow/proof.ts +94 -48
  422. package/src/core/workflow/run-state.ts +7 -7
  423. package/src/core/workflow/sandbox-projection.ts +16 -16
  424. package/src/core/workflow/spawn-claude.ts +34 -12
  425. package/src/core/workflow/spawn-codex.ts +30 -12
  426. package/src/core/workflow/spawn-cursor.ts +31 -12
  427. package/src/core/workflow/spawn-failure.ts +41 -1
  428. package/src/core/workflow/specialists.ts +2 -2
  429. package/src/core/workflow/{journal.ts → transcript.ts} +16 -16
  430. package/src/core/workflow/types.ts +130 -46
  431. package/src/core/workflow/validate.ts +1 -1
  432. package/src/core/workflow/workspaces/cancellation.ts +2 -2
  433. package/src/core/workflow/workspaces/cleanup.ts +2 -2
  434. package/src/core/workflow/workspaces/execution.ts +6 -6
  435. package/src/core/workflow/workspaces/inspect.ts +14 -11
  436. package/src/core/workflow/workspaces/integration.ts +18 -14
  437. package/src/core/workflow/workspaces/lifecycle.ts +10 -10
  438. package/src/core/workflow/workspaces/local-git.ts +47 -5
  439. package/src/core/workflow/workspaces/recovery.ts +3 -3
  440. package/src/core/workflow/workspaces/state.ts +4 -3
  441. package/src/core/workflow/workspaces/types.ts +1 -1
  442. package/src/lib/browser/asserts.ts +177 -0
  443. package/src/lib/browser/client.ts +189 -14
  444. package/src/lib/browser/content-checks.ts +571 -0
  445. package/src/lib/browser/critique.ts +231 -0
  446. package/src/lib/browser/geometry.ts +297 -1
  447. package/src/lib/browser/index.ts +34 -0
  448. package/src/lib/claude-desktop.ts +4 -1
  449. package/src/lib/council/index.ts +9 -9
  450. package/src/lib/exec.ts +13 -3
  451. package/src/lib/identities/assume.ts +7 -7
  452. package/src/lib/instructions/apply.ts +87 -25
  453. package/src/lib/instructions/host-addendum.ts +126 -0
  454. package/src/lib/instructions/templates.ts +44 -15
  455. package/src/lib/machine.ts +2 -2
  456. package/dist/commands/harness.d.ts +0 -12
  457. package/dist/commands/harness.d.ts.map +0 -1
  458. package/dist/commands/scratch.d.ts +0 -4
  459. package/dist/commands/scratch.d.ts.map +0 -1
  460. package/dist/commands/session.d.ts.map +0 -1
  461. package/dist/commands/session.js +0 -162
  462. package/dist/commands/supervisor.d.ts +0 -4
  463. package/dist/commands/supervisor.d.ts.map +0 -1
  464. package/dist/core/harnesses/attest-projection.d.ts.map +0 -1
  465. package/dist/core/harnesses/attest.d.ts.map +0 -1
  466. package/dist/core/harnesses/attestation.d.ts.map +0 -1
  467. package/dist/core/harnesses/bench.d.ts.map +0 -1
  468. package/dist/core/harnesses/index.d.ts +0 -13
  469. package/dist/core/harnesses/index.d.ts.map +0 -1
  470. package/dist/core/harnesses/index.js +0 -6
  471. package/dist/core/harnesses/profiles.d.ts.map +0 -1
  472. package/dist/core/harnesses/registry.d.ts +0 -15
  473. package/dist/core/harnesses/registry.d.ts.map +0 -1
  474. package/dist/core/harnesses/types.d.ts.map +0 -1
  475. package/dist/core/hooks/harness/detect.d.ts +0 -9
  476. package/dist/core/hooks/harness/events.d.ts.map +0 -1
  477. package/dist/core/hooks/harness/output.d.ts.map +0 -1
  478. package/dist/core/supervisor/index.d.ts +0 -7
  479. package/dist/core/supervisor/index.d.ts.map +0 -1
  480. package/dist/core/supervisor/index.js +0 -6
  481. package/dist/core/supervisor/plan-api.d.ts +0 -23
  482. package/dist/core/supervisor/plan-api.d.ts.map +0 -1
  483. package/dist/core/supervisor/plan-api.js +0 -50
  484. package/dist/core/supervisor/plan-read.d.ts +0 -5
  485. package/dist/core/supervisor/plan-read.d.ts.map +0 -1
  486. package/dist/core/supervisor/plan-types.d.ts +0 -170
  487. package/dist/core/supervisor/plan-types.d.ts.map +0 -1
  488. package/dist/core/supervisor/planning.d.ts +0 -33
  489. package/dist/core/supervisor/planning.d.ts.map +0 -1
  490. package/dist/core/supervisor/read.d.ts +0 -6
  491. package/dist/core/supervisor/read.d.ts.map +0 -1
  492. package/dist/core/supervisor/read.js +0 -4
  493. package/dist/core/supervisor/runner.d.ts +0 -37
  494. package/dist/core/supervisor/runner.d.ts.map +0 -1
  495. package/dist/core/supervisor/service-read.d.ts +0 -6
  496. package/dist/core/supervisor/service-read.d.ts.map +0 -1
  497. package/dist/core/supervisor/service.d.ts +0 -114
  498. package/dist/core/supervisor/service.d.ts.map +0 -1
  499. package/dist/core/supervisor/state.d.ts +0 -95
  500. package/dist/core/supervisor/state.d.ts.map +0 -1
  501. package/dist/core/workflow/harnesses.d.ts +0 -17
  502. package/dist/core/workflow/harnesses.d.ts.map +0 -1
  503. package/dist/core/workflow/harnesses.js +0 -21
  504. package/dist/core/workflow/journal.d.ts.map +0 -1
  505. package/src/commands/session.ts +0 -187
  506. package/src/core/harnesses/index.ts +0 -56
  507. package/src/core/hooks/harness/detect.ts +0 -30
  508. package/src/core/supervisor/index.ts +0 -89
  509. package/src/core/supervisor/plan-api.ts +0 -73
  510. package/src/core/supervisor/read.ts +0 -59
  511. package/src/core/workflow/harnesses.ts +0 -33
  512. /package/dist/core/{harnesses → adapters}/attest-projection.js +0 -0
@@ -17,15 +17,16 @@ import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync,
17
17
  import { homedir, tmpdir } from "node:os";
18
18
  import { basename, join, resolve } from "node:path";
19
19
  import { readStreamTailBounded } from "../core/agents/events/consume.js";
20
- import { emitCanonical, monorepoRoot, normalizeHarness, readHeartbeat, resolveOwner, resolveOwnerBySessionEnv, resolveOwnerWithSource, } from "../core/agents/index.js";
20
+ import { emitCanonical, monorepoRoot, normalizeAdapter, readHeartbeat, resolveOwner, resolveOwnerBySessionEnv, resolveOwnerWithSource, } from "../core/agents/index.js";
21
21
  import { coordFreshnessSeconds, resolveBinName } from "../core/config.js";
22
22
  import { readRemoteMachines } from "../core/presence/index.js";
23
+ import { registerContextCommand } from "./context.js";
23
24
  /** Cap for CLI scans of the unbounded event ledger (`trace` / `health`). Well
24
25
  * under V8's ~512MB max string length so a `readFileSync` of the whole file can
25
26
  * never throw; covers ample recent history for a diagnostic scan. */
26
27
  const STREAM_SCAN_CAP_BYTES = 128 * 1024 * 1024; // 128 MiB
27
28
  import { parsePsChainLine } from "../core/hooks/resolve/anchor.js";
28
- import { appendEntry, resolveOwnerByName } from "../core/scratch/index.js";
29
+ import { appendEntry, resolveOwnerByName } from "../core/journal/index.js";
29
30
  import { buildCouncilId, buildInviteMarkdown, COUNCIL_SCHEMA_VERSION, contributorsInRound, councilBodyDir, councilsArchiveDir, deleteArchivedCouncil, effectiveSteward, findManifestByPartialId, listKnownAgents, listManifests, moveFromArchive, moveToArchive, normalizeAgentName, pendingCouncilsForMember, readArchivedManifest, readManifest, readRoundPrompts, roundDir, setCouncilSteward, writeContribution, writeManifest, writePrompt, } from "../lib/council/index.js";
30
31
  import { assumeIdentity, IdentityAssumeError } from "../lib/identities/assume.js";
31
32
  import { displayName as displayAgentName, ensureIdentity, listIdentities, lookupById as lookupIdentityById, lookupByName as lookupIdentityByName, } from "../lib/identities/index.js";
@@ -63,11 +64,12 @@ function formatPlatformLabel(platform) {
63
64
  return "CC";
64
65
  }
65
66
  let emit;
66
- export function registerAgentsCommand(program, emitParam) {
67
+ export function registerAgentsCommand(program, emitParam, programContext) {
67
68
  emit = emitParam;
68
69
  const cmd = program
69
70
  .command("agents")
70
- .description("Query the multi-agent coordination layer (whoami / list / status / health)");
71
+ .description("The live agent sessions in this project: who is running now, what they hold, and their coordination state (whoami / list / status / health).");
72
+ registerContextCommand(cmd, emitParam, programContext);
71
73
  cmd
72
74
  .command("whoami")
73
75
  .description("Print the current agent's name + instance_id + files claimed")
@@ -97,7 +99,7 @@ export function registerAgentsCommand(program, emitParam) {
97
99
  cmd
98
100
  .command("suggest-name [description...]")
99
101
  .description('Reprint a session name ("Agent <you> - <description>") for the operator to set as their ' +
100
- "harness tab title. With no arg, derives it from your current task. The primary naming path " +
102
+ "adapter tab title. With no arg, derives it from your current task. The primary naming path " +
101
103
  "is set-task (it suggests a name on the first focus declaration); reach for this to reprint " +
102
104
  "or re-suggest after a topic pivot. Read-only.")
103
105
  .option("--json", "JSON output instead of the bare name")
@@ -154,7 +156,7 @@ export function registerAgentsCommand(program, emitParam) {
154
156
  });
155
157
  cmd
156
158
  .command("ping <name> <message...>")
157
- .description("Append a 'handoff' entry to a peer agent's scratchpad. Body prefixed with " +
159
+ .description("Append a 'handoff' entry to a peer agent's journal. Body prefixed with " +
158
160
  "`from agent-<me>:`. Use to leave actionable coordination notes for peers " +
159
161
  "currently holding files you need.")
160
162
  .option("--json", "JSON output")
@@ -194,17 +196,17 @@ export function registerAgentsCommand(program, emitParam) {
194
196
  runHealth(opts);
195
197
  });
196
198
  cmd
197
- .command("harness-probe <id>")
198
- .description("Harness wiring probe: ppid chain, comm names, pid-map anchor, sample payload paths. " +
199
+ .command("adapter-probe <id>")
200
+ .description("Adapter wiring probe: ppid chain, comm names, pid-map anchor, sample payload paths. " +
199
201
  "With --replay-samples, also replays every checked-in sample payload against the live " +
200
202
  "adapter in an isolated sandbox to catch adapter / payload-shape drift. " +
201
203
  "Complements heal-events (drift telemetry). Id: claude_code | cursor.")
202
204
  .option("--json", "JSON envelope output")
203
- .option("--replay-samples", "Replay docs/api/<harness>-hooks/samples/*.json against the live adapter in an isolated sandbox. " +
205
+ .option("--replay-samples", "Replay docs/api/<adapter>-hooks/samples/*.json against the live adapter in an isolated sandbox. " +
204
206
  "Exits non-zero if any sample crashes the adapter.")
205
207
  .option("--sample <path>", "Replay only the named sample file (basename match). Implies --replay-samples.")
206
208
  .action((id, opts) => {
207
- runHarnessProbe(id, opts);
209
+ runAdapterProbe(id, opts);
208
210
  });
209
211
  cmd
210
212
  .command("heal")
@@ -226,7 +228,6 @@ export function registerAgentsCommand(program, emitParam) {
226
228
  .action((opts) => {
227
229
  runHeal(opts);
228
230
  });
229
- registerCouncilCommands(cmd);
230
231
  registerIdentityCommands(cmd);
231
232
  }
232
233
  function registerIdentityCommands(parent) {
@@ -368,7 +369,7 @@ function runIdentityAssume(target, opts) {
368
369
  process.exit(1);
369
370
  }
370
371
  }
371
- function registerCouncilCommands(parent) {
372
+ export function registerCouncilCommands(parent) {
372
373
  const council = parent
373
374
  .command("council")
374
375
  .description("Multi-agent deliberation: convene a temporary group around an " +
@@ -453,7 +454,7 @@ function registerCouncilCommands(parent) {
453
454
  "(or omit [steward]) to drop the field and revert to the default " +
454
455
  "(the convener). Refuses to mutate archived councils. By default, " +
455
456
  "rejects names not in the known-agents list (active heartbeats + " +
456
- "scratchpads archived in the last 30 days); pass --allow-unknown " +
457
+ "journals archived in the last 30 days); pass --allow-unknown " +
457
458
  "to bypass when bootstrapping.")
458
459
  .option("--clear", "Clear the steward field, reverting to created_by default")
459
460
  .option("--allow-unknown", "Skip the known-agents check (bootstrap an agent that hasn't run yet)")
@@ -467,7 +468,7 @@ function registerCouncilCommands(parent) {
467
468
  "Pass either --message <inline> or --file <path>. Writes to " +
468
469
  ".harnery/councils/<id>/round-<N>/<agent-Name>.md. Pass --as <member> " +
469
470
  "to contribute under a council seat name that differs from the running " +
470
- "agent's heartbeat name (useful for cross-harness councils where each " +
471
+ "agent's heartbeat name (useful for cross-adapter councils where each " +
471
472
  "reviewer has a different auto-generated session name).")
472
473
  .option("--message <text>", "Inline contribution text (caps at 4KB)")
473
474
  .option("--file <path>", "Path to a file containing the contribution")
@@ -1023,7 +1024,7 @@ function ensureCursorSession(root) {
1023
1024
  composer_mode: "agent",
1024
1025
  is_background_agent: false,
1025
1026
  });
1026
- spawnSync("bash", [agentHook, "session-start", "--harness", "cursor"], {
1027
+ spawnSync("bash", [agentHook, "session-start", "--adapter", "cursor"], {
1027
1028
  input: payload,
1028
1029
  cwd: root,
1029
1030
  encoding: "utf8",
@@ -1122,11 +1123,11 @@ function runSetTask(task, opts) {
1122
1123
  type: "state.task_set",
1123
1124
  owner: myOwner,
1124
1125
  session: hb?.session_id ?? myOwner,
1125
- harness: normalizeHarness(hb?.platform),
1126
+ adapter: normalizeAdapter(hb?.platform),
1126
1127
  data: { task, cleared: !task || task.length === 0 },
1127
1128
  });
1128
1129
  // On the first focus declaration of a session, surface a suggested session
1129
- // name for the operator to set as their harness tab title. Read the result
1130
+ // name for the operator to set as their adapter tab title. Read the result
1130
1131
  // (`suggested_session_name`) and reproduce it in a fenced code block so the
1131
1132
  // UI's Copy button hands over the exact string. null on every later call.
1132
1133
  const built = firstOfSession && !opts?.sessionId ? buildSuggestedName(hb?.name ?? "unknown", [task]) : null;
@@ -1254,7 +1255,7 @@ function runStatus(opts) {
1254
1255
  type: "state.status_checked",
1255
1256
  owner: myOwner,
1256
1257
  session: hb.session_id ?? myOwner,
1257
- harness: normalizeHarness(hb.platform),
1258
+ adapter: normalizeAdapter(hb.platform),
1258
1259
  data: {
1259
1260
  format: opts.json ? "json" : "box",
1260
1261
  agent_count: 0, // computed below, not yet available here; Phase 5 verdict reads owner-scope only
@@ -1721,14 +1722,14 @@ function readCanonicalEventsInWindow(root, cutoffMs) {
1721
1722
  }
1722
1723
  return out;
1723
1724
  }
1724
- /** harness ("claude-code") → legacy platform label ("claude_code") so the
1725
+ /** adapter ("claude-code") → legacy platform label ("claude_code") so the
1725
1726
  * existing formatPlatformLabel rendering keeps working unchanged. */
1726
- function harnessToPlatform(harness) {
1727
- if (harness === "claude-code")
1727
+ function adapterToPlatform(adapter) {
1728
+ if (adapter === "claude-code")
1728
1729
  return "claude_code";
1729
- if (harness === "cursor")
1730
+ if (adapter === "cursor")
1730
1731
  return "cursor";
1731
- if (harness === "codex")
1732
+ if (adapter === "codex")
1732
1733
  return "codex";
1733
1734
  return "claude_code";
1734
1735
  }
@@ -1750,7 +1751,7 @@ function canonicalToHealEvent(ev, nameById) {
1750
1751
  agent,
1751
1752
  kind,
1752
1753
  reason,
1753
- platform: harnessToPlatform(ev.harness),
1754
+ platform: adapterToPlatform(ev.adapter),
1754
1755
  };
1755
1756
  if (kind === "pidmap" && data.pid !== undefined && data.pid !== null) {
1756
1757
  out.pid = String(data.pid);
@@ -2508,14 +2509,14 @@ function renderHealthBox(report) {
2508
2509
  }
2509
2510
  }
2510
2511
  }
2511
- function runHarnessProbe(id, opts) {
2512
+ function runAdapterProbe(id, opts) {
2512
2513
  if (opts.json)
2513
2514
  emit.config({ format: "json" });
2514
- const harness = id.trim();
2515
- if (harness !== "claude_code" && harness !== "cursor") {
2515
+ const adapter = id.trim();
2516
+ if (adapter !== "claude_code" && adapter !== "cursor") {
2516
2517
  emit.error({
2517
- code: "bad_harness",
2518
- message: "harness id must be claude_code or cursor",
2518
+ code: "bad_adapter",
2519
+ message: "adapter id must be claude_code or cursor",
2519
2520
  });
2520
2521
  process.exit(1);
2521
2522
  }
@@ -2527,13 +2528,13 @@ function runHarnessProbe(id, opts) {
2527
2528
  });
2528
2529
  process.exit(1);
2529
2530
  }
2530
- const subagentDir = harness === "cursor" ? ".harnery/.cursor-subagent-map" : `.harnery/.subagent-map/${harness}`;
2531
- const sampleDir = harness === "cursor" ? "docs/api/cursor-hooks/samples" : "docs/api/claude-code-hooks/samples";
2532
- const dispatchEntry = harness === "cursor"
2533
- ? "harnery/bin/agent-hook session-start --harness cursor"
2534
- : "harnery/bin/agent-hook session-start --harness claude-code";
2531
+ const subagentDir = adapter === "cursor" ? ".harnery/.cursor-subagent-map" : `.harnery/.subagent-map/${adapter}`;
2532
+ const sampleDir = adapter === "cursor" ? "docs/api/cursor-hooks/samples" : "docs/api/claude-code-hooks/samples";
2533
+ const dispatchEntry = adapter === "cursor"
2534
+ ? "harnery/bin/agent-hook session-start --adapter cursor"
2535
+ : "harnery/bin/agent-hook session-start --adapter claude-code";
2535
2536
  // TS-native probe. The owner + anchor-pid resolution it reports lives in
2536
- // `findHarnessAnchorPid` (core/hooks/cli.ts, the /proc walk mirrored below)
2537
+ // `findAdapterAnchorPid` (core/hooks/cli.ts, the /proc walk mirrored below)
2537
2538
  // and `resolveOwner` here, so the probe reports exactly what the live hot
2538
2539
  // path resolves.
2539
2540
  const anchorTokens = new Set(["claude", "claude-code", "cursor", "codex"]);
@@ -2573,7 +2574,7 @@ function runHarnessProbe(id, opts) {
2573
2574
  walkPid = ppid;
2574
2575
  }
2575
2576
  const data = {
2576
- harness,
2577
+ adapter,
2577
2578
  anchor_pid: anchorPid,
2578
2579
  hook_pid: String(process.pid),
2579
2580
  resolved_owner: resolveOwner() ?? "",
@@ -2581,13 +2582,13 @@ function runHarnessProbe(id, opts) {
2581
2582
  subagent_map_dir: subagentDir,
2582
2583
  sample_ref: sampleDir,
2583
2584
  dispatch_entry: dispatchEntry,
2584
- note: "heal-events counts drift; harness-probe answers wiring",
2585
+ note: "heal-events counts drift; adapter-probe answers wiring",
2585
2586
  };
2586
2587
  const wantReplay = opts.replaySamples || !!opts.sample;
2587
2588
  let samples = [];
2588
2589
  let replayExitCode = 0;
2589
2590
  if (wantReplay) {
2590
- const result = replayHarnessSamples(harness, root, sampleDir, opts.sample);
2591
+ const result = replayAdapterSamples(adapter, root, sampleDir, opts.sample);
2591
2592
  samples = result.samples;
2592
2593
  replayExitCode = result.exitCode;
2593
2594
  data.samples = samples;
@@ -2596,7 +2597,7 @@ function runHarnessProbe(id, opts) {
2596
2597
  emit.data(data);
2597
2598
  if (process.stdout.isTTY && !opts.json) {
2598
2599
  const lines = [
2599
- `Harness probe: ${harness}`,
2600
+ `Adapter probe: ${adapter}`,
2600
2601
  ` anchor_pid: ${String(data.anchor_pid) || "(empty, expected in sandbox/non-IDE)"}`,
2601
2602
  ` hook_pid: ${String(data.hook_pid)}`,
2602
2603
  ` resolved_owner: ${String(data.resolved_owner) || "(none)"}`,
@@ -2636,11 +2637,11 @@ function runHarnessProbe(id, opts) {
2636
2637
  }
2637
2638
  }
2638
2639
  /**
2639
- * Replay every JSON fixture in <root>/<sampleDir> against the live harness
2640
+ * Replay every JSON fixture in <root>/<sampleDir> against the live adapter
2640
2641
  * dispatcher in an isolated sandbox.
2641
2642
  *
2642
2643
  * Sandbox isolation strategy:
2643
- * - mkdtempSync(tmpdir(), "harn-harness-probe-") creates a non-git tmp dir.
2644
+ * - mkdtempSync(tmpdir(), "harn-adapter-probe-") creates a non-git tmp dir.
2644
2645
  * - The dispatcher's coord-root resolution falls back to
2645
2646
  * `HARNERY_COORD_ROOT_OVERRIDE` when git rev-parse fails. We set it to the sandbox.
2646
2647
  * - We rewrite the payload's `cwd` field (Cursor cds to it) to the sandbox,
@@ -2652,7 +2653,7 @@ function runHarnessProbe(id, opts) {
2652
2653
  * payload with `.hook_event_name`. Event name resolution falls back to the
2653
2654
  * filename (without `.json`) when neither field exists.
2654
2655
  */
2655
- function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
2656
+ function replayAdapterSamples(adapter, root, relativeSampleDir, filter) {
2656
2657
  const sampleDir = resolve(root, relativeSampleDir);
2657
2658
  if (!existsSync(sampleDir)) {
2658
2659
  return {
@@ -2673,7 +2674,7 @@ function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
2673
2674
  };
2674
2675
  }
2675
2676
  // agent-hook is the single entry point. Replay sample payloads against it,
2676
- // mapping the harness-native hook_event_name to the agent-hook CLI subcommand.
2677
+ // mapping the adapter-native hook_event_name to the agent-hook CLI subcommand.
2677
2678
  const agentHook = resolve(root, "harnery/bin/agent-hook");
2678
2679
  if (!existsSync(agentHook)) {
2679
2680
  return {
@@ -2711,8 +2712,8 @@ function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
2711
2712
  stopFailure: "stop-failure",
2712
2713
  StopFailure: "stop-failure",
2713
2714
  };
2714
- const harnessFlag = harness === "claude_code" ? "claude-code" : harness;
2715
- const sandbox = mkdtempSync(join(tmpdir(), "harn-harness-probe-"));
2715
+ const adapterFlag = adapter === "claude_code" ? "claude-code" : adapter;
2716
+ const sandbox = mkdtempSync(join(tmpdir(), "harn-adapter-probe-"));
2716
2717
  const results = [];
2717
2718
  try {
2718
2719
  for (const file of fixtures) {
@@ -2749,7 +2750,7 @@ function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
2749
2750
  payloadObj.workspace_roots = [sandbox];
2750
2751
  }
2751
2752
  const subcommand = EVENT_SUBCOMMAND[event] ?? event;
2752
- const dispatch = spawnSync("bash", [agentHook, subcommand, "--harness", harnessFlag], {
2753
+ const dispatch = spawnSync("bash", [agentHook, subcommand, "--adapter", adapterFlag], {
2753
2754
  cwd: sandbox,
2754
2755
  encoding: "utf8",
2755
2756
  input: JSON.stringify(payloadObj),
@@ -2757,8 +2758,8 @@ function replayHarnessSamples(harness, root, relativeSampleDir, filter) {
2757
2758
  env: {
2758
2759
  ...process.env,
2759
2760
  HARNERY_COORD_ROOT_OVERRIDE: sandbox,
2760
- HARNERY_AGENT_COORD_HARNESS: harness,
2761
- HARNERY_AGENT_COORD_PLATFORM: harness,
2761
+ HARNERY_AGENT_COORD_ADAPTER: adapter,
2762
+ HARNERY_AGENT_COORD_PLATFORM: adapter,
2762
2763
  HARNERY_AGENT_COORD_OFF: "0",
2763
2764
  },
2764
2765
  });
@@ -2893,8 +2894,8 @@ function runPing(name, message, opts) {
2893
2894
  peer_instance_id: peerOwner,
2894
2895
  from: fromName,
2895
2896
  body,
2896
- scratch_path: doc.path,
2897
- scratch_bytes: doc.bytes,
2897
+ journal_path: doc.path,
2898
+ journal_bytes: doc.bytes,
2898
2899
  };
2899
2900
  if (opts.json) {
2900
2901
  emit.config({ format: "json" });
@@ -3109,7 +3110,7 @@ function emitCouncilStateEvent(type, manifest, extraData) {
3109
3110
  type,
3110
3111
  owner: myOwner,
3111
3112
  session: hb?.session_id ?? myOwner,
3112
- harness: normalizeHarness(hb?.platform),
3113
+ adapter: normalizeAdapter(hb?.platform),
3113
3114
  data: { council_id: manifest.council_id, ...extraData },
3114
3115
  });
3115
3116
  }
@@ -3214,7 +3215,7 @@ function runCouncilCreate(objective, opts) {
3214
3215
  type: "council.open",
3215
3216
  owner: myOwner,
3216
3217
  session: myHbForEmit?.session_id ?? myOwner,
3217
- harness: normalizeHarness(myHbForEmit?.platform),
3218
+ adapter: normalizeAdapter(myHbForEmit?.platform),
3218
3219
  data: {
3219
3220
  council_id: councilId,
3220
3221
  topic: trimmedObjective,
@@ -3223,7 +3224,7 @@ function runCouncilCreate(objective, opts) {
3223
3224
  },
3224
3225
  });
3225
3226
  }
3226
- // Best-effort: ping each currently-active member's scratchpad with a
3227
+ // Best-effort: ping each currently-active member's journal with a
3227
3228
  // handoff entry pointing them at the council. Members not currently active
3228
3229
  // get nothing here; the Phase 2 SessionStart adapter will surface the
3229
3230
  // invite on their next session.
@@ -3646,7 +3647,7 @@ function runCouncilSetSteward(id, stewardArg, opts) {
3646
3647
  const known_names = known.map((a) => a.name).join(", ") || "(none)";
3647
3648
  emit.error({
3648
3649
  code: "steward_not_known",
3649
- message: `'${steward}' is not a known agent (active heartbeats + scratchpads archived in the last 30 days). Pass --allow-unknown to bootstrap. Known: ${known_names}`,
3650
+ message: `'${steward}' is not a known agent (active heartbeats + journals archived in the last 30 days). Pass --allow-unknown to bootstrap. Known: ${known_names}`,
3650
3651
  });
3651
3652
  process.exit(1);
3652
3653
  }
@@ -3679,7 +3680,7 @@ function runCouncilSetSteward(id, stewardArg, opts) {
3679
3680
  emit.text(`council ${next.council_id} steward set to ${label}.\n`);
3680
3681
  }
3681
3682
  }
3682
- /** Build a markdown transcript of every round's contributions on disk. */
3683
+ /** Build a markdown journal of every round's contributions on disk. */
3683
3684
  function buildTranscript(manifest) {
3684
3685
  const body = councilBodyDir(manifest.council_id);
3685
3686
  const out = [];
@@ -3749,7 +3750,7 @@ function runCouncilContribute(id, opts) {
3749
3750
  }
3750
3751
  // Resolve the contributor name. Two paths:
3751
3752
  // 1. --as <member> override: caller explicitly names the council seat. Used
3752
- // for cross-harness councils where each reviewer agent has a different
3753
+ // for cross-adapter councils where each reviewer agent has a different
3753
3754
  // auto-generated session name from a different name pool; they can
3754
3755
  // contribute under a fixed seat name without renaming the session.
3755
3756
  // 2. Heartbeat-derived (default): resolve owner via ppid walk + read the
@@ -3936,7 +3937,7 @@ function runCouncilPrompt(id, member, opts) {
3936
3937
  process.exit(1);
3937
3938
  }
3938
3939
  // Resolve caller identity (steward authority check). Same --as override
3939
- // shape as `contribute` for cross-harness scripting.
3940
+ // shape as `contribute` for cross-adapter scripting.
3940
3941
  let callerName;
3941
3942
  let actualName = null;
3942
3943
  if (opts.as) {
@@ -4142,7 +4143,7 @@ function runCouncilAdvance(id, opts) {
4142
4143
  * Shared advance helper used by both `advance` and auto-advance from
4143
4144
  * `contribute`. Increments current_round, flips round_status back to open,
4144
4145
  * creates the new round directory, writes the manifest, and pings each
4145
- * member's scratchpad with the advance notification.
4146
+ * member's journal with the advance notification.
4146
4147
  */
4147
4148
  function advanceCouncil(manifest, force) {
4148
4149
  const nextRound = manifest.current_round + 1;
@@ -4156,7 +4157,7 @@ function advanceCouncil(manifest, force) {
4156
4157
  if (rd && !existsSync(rd))
4157
4158
  mkdirSync(rd, { recursive: true });
4158
4159
  writeManifest(next);
4159
- // Ping each member's scratchpad with the advance notification.
4160
+ // Ping each member's journal with the advance notification.
4160
4161
  // (Convener already knows; we skip pinging them if they convened it from
4161
4162
  // their own session.)
4162
4163
  const myOwner = resolveOwner();
@@ -4172,7 +4173,7 @@ function advanceCouncil(manifest, force) {
4172
4173
  appendEntry(memberOwner, "handoff", `from council advance (${manifest.council_id}): round ${nextRound} is now open${force ? " (advanced with --force; some round-N members dropped)" : ""}. Run 'harn agents council show ${manifest.council_id}' to read prior round + 'harn agents council contribute ${manifest.council_id}' to weigh in.`);
4173
4174
  }
4174
4175
  catch {
4175
- /* best-effort; member scratchpad may not exist yet */
4176
+ /* best-effort; member journal may not exist yet */
4176
4177
  }
4177
4178
  }
4178
4179
  return next;
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { EmitContext, HarneryProgramContext } from "../commander.js";
3
+ export declare function registerArtifactsCommand(program: Command, emit: EmitContext, context?: HarneryProgramContext): void;
4
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/commands/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAa1E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAmGN"}
@@ -0,0 +1,143 @@
1
+ import { monorepoRoot, readHeartbeat, resolveOwner } from "../core/agents/index.js";
2
+ import { cleanArtifacts, createArtifact, inventoryArtifacts, releaseArtifact, renewArtifact, showArtifact, } from "../core/artifacts/index.js";
3
+ import { artifactDefaultRetentionDays, coordFreshnessSeconds } from "../core/config.js";
4
+ export function registerArtifactsCommand(program, emit, context) {
5
+ const root = program
6
+ .command("artifacts")
7
+ .alias("artifact")
8
+ .description("Manage repository-local working artifacts under .harnery/artifacts/");
9
+ root
10
+ .command("create <slug>")
11
+ .description("Create one managed artifact workspace and print its path.")
12
+ .requiredOption("--purpose <text>", "What the files are for")
13
+ .option("--days <n>", "Retention in days (default from artifacts.default_retention_days)")
14
+ .action((slug, opts) => {
15
+ run(emit, () => {
16
+ const repoRoot = requireRepoRoot(context);
17
+ const actor = currentActor();
18
+ const retentionDays = opts.days
19
+ ? parseDays(opts.days)
20
+ : artifactDefaultRetentionDays(repoRoot);
21
+ const created = createArtifact(repoRoot, {
22
+ slug,
23
+ purpose: opts.purpose,
24
+ retentionDays,
25
+ actor,
26
+ });
27
+ emit.data({
28
+ path: created.path,
29
+ artifact_id: created.manifest.artifact_id,
30
+ expires_at: created.manifest.retention.expires_at,
31
+ owner_instance_id: actor?.instance_id ?? null,
32
+ });
33
+ });
34
+ });
35
+ root
36
+ .command("list")
37
+ .description("Inventory every artifact workspace with its cleanup classification.")
38
+ .action(() => {
39
+ run(emit, () => {
40
+ const repoRoot = requireRepoRoot(context);
41
+ const rows = inventoryArtifacts(repoRoot, {
42
+ freshnessSeconds: coordFreshnessSeconds(repoRoot),
43
+ });
44
+ emit.data({ rows, meta: summarize(rows) });
45
+ });
46
+ });
47
+ root
48
+ .command("show <ref>")
49
+ .description("Show one artifact by id, directory name, or direct-child path.")
50
+ .action((ref) => {
51
+ run(emit, () => {
52
+ const repoRoot = requireRepoRoot(context);
53
+ emit.data(showArtifact(repoRoot, ref, {
54
+ freshnessSeconds: coordFreshnessSeconds(repoRoot),
55
+ }));
56
+ });
57
+ });
58
+ root
59
+ .command("renew <ref>")
60
+ .description("Set a new retention window. Renewal does not mark the artifact active.")
61
+ .requiredOption("--days <n>", "Days from now")
62
+ .requiredOption("--reason <text>", "Why the extra retention is needed")
63
+ .action((ref, opts) => {
64
+ run(emit, () => {
65
+ const repoRoot = requireRepoRoot(context);
66
+ const manifest = renewArtifact(repoRoot, ref, parseDays(opts.days), opts.reason, {
67
+ actor: currentActor(),
68
+ });
69
+ emit.data(manifest);
70
+ });
71
+ });
72
+ root
73
+ .command("release <ref>")
74
+ .description("Release active-owner protection without shortening retention.")
75
+ .action((ref) => {
76
+ run(emit, () => {
77
+ const repoRoot = requireRepoRoot(context);
78
+ emit.data(releaseArtifact(repoRoot, ref, { actor: currentActor() }));
79
+ });
80
+ });
81
+ root
82
+ .command("clean")
83
+ .description("Preview expired artifact deletion; pass --yes to delete.")
84
+ .option("--yes", "Permanently delete entries classified managed-expired")
85
+ .action((opts) => {
86
+ run(emit, () => {
87
+ const repoRoot = requireRepoRoot(context);
88
+ const rows = cleanArtifacts(repoRoot, {
89
+ yes: opts.yes,
90
+ freshnessSeconds: coordFreshnessSeconds(repoRoot),
91
+ });
92
+ emit.data({ rows, meta: summarize(rows) });
93
+ });
94
+ });
95
+ }
96
+ function currentActor() {
97
+ const instanceId = resolveOwner();
98
+ if (!instanceId)
99
+ return undefined;
100
+ const hb = readHeartbeat(instanceId);
101
+ return {
102
+ instance_id: instanceId,
103
+ session_id: hb?.session_id,
104
+ name: hb?.name,
105
+ };
106
+ }
107
+ function requireRepoRoot(context) {
108
+ const root = context?.repoRoot ?? monorepoRoot();
109
+ if (!root)
110
+ throw new Error("not inside a Git repository");
111
+ return root;
112
+ }
113
+ function parseDays(value) {
114
+ const parsed = Number(value);
115
+ if (!Number.isInteger(parsed) || parsed <= 0 || parsed > 3650) {
116
+ throw new Error("--days must be between 1 and 3650");
117
+ }
118
+ return parsed;
119
+ }
120
+ function summarize(rows) {
121
+ const classifications = {};
122
+ for (const row of rows) {
123
+ classifications[row.classification] = (classifications[row.classification] ?? 0) + 1;
124
+ }
125
+ return {
126
+ total: rows.length,
127
+ classifications,
128
+ would_delete: rows.filter((row) => row.action === "would-delete").length,
129
+ deleted: rows.filter((row) => row.action === "deleted").length,
130
+ };
131
+ }
132
+ function run(emit, fn) {
133
+ try {
134
+ fn();
135
+ }
136
+ catch (error) {
137
+ emit.error({
138
+ code: "artifact_failed",
139
+ message: error instanceof Error ? error.message : String(error),
140
+ });
141
+ emit.setExitCode(1);
142
+ }
143
+ }
@@ -6,7 +6,7 @@
6
6
  * paths and are init'd on first `harn backup init`. Subcommands:
7
7
  *
8
8
  * init restic init the repo (one-time)
9
- * snapshot restic backup .harnery/
9
+ * snapshot restic backup .harnery/ (working artifacts excluded)
10
10
  * list restic snapshots
11
11
  * restore restic restore <id>
12
12
  * prune restic forget --keep-daily 7 --keep-weekly 4 --prune
@@ -1 +1 @@
1
- {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4EnD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAuM/E"}
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA4EnD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAqN/E"}
@@ -6,7 +6,7 @@
6
6
  * paths and are init'd on first `harn backup init`. Subcommands:
7
7
  *
8
8
  * init restic init the repo (one-time)
9
- * snapshot restic backup .harnery/
9
+ * snapshot restic backup .harnery/ (working artifacts excluded)
10
10
  * list restic snapshots
11
11
  * restore restic restore <id>
12
12
  * prune restic forget --keep-daily 7 --keep-weekly 4 --prune
@@ -109,12 +109,13 @@ export function registerBackupCommand(program, emit) {
109
109
  backup
110
110
  .command("snapshot")
111
111
  .description("Take a restic snapshot of .harnery/ (excluding events.ndjson and " +
112
- ".lock files by default). Pass --target to back up a different path.")
112
+ ".lock files and artifacts/ by default). Pass --target to back up a different path.")
113
113
  .option("--target <path>", "Path to snapshot (default: .harnery/ from cwd walk-up)")
114
114
  .option("--tag <tag>", "Restic tag (repeatable)", collect, [])
115
115
  .option("--repo <path>", "Repository path")
116
116
  .option("--password-file <path>", "Password file")
117
117
  .option("--include-events", "Don't exclude events.ndjson (default: excluded; large + machine-local)")
118
+ .option("--include-artifacts", "Include managed working artifacts (default: excluded; potentially large + ephemeral)")
118
119
  .action((opts) => {
119
120
  if (!checkRestic(emit)) {
120
121
  emit.setExitCode(1);
@@ -135,6 +136,8 @@ export function registerBackupCommand(program, emit) {
135
136
  passThrough.push("--exclude", ".lock");
136
137
  passThrough.push("--exclude", ".log.lock");
137
138
  }
139
+ if (!opts.includeArtifacts)
140
+ passThrough.push("--exclude", "artifacts");
138
141
  for (const t of opts.tag) {
139
142
  passThrough.push("--tag", t);
140
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAiJ1E,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAiQN"}
1
+ {"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAuL1E,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAoWN"}