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,19 +1,25 @@
1
1
  /**
2
2
  * UserPromptSubmit UX renderer. Combines the peer-refresh dedup, the
3
- * council-pending hash-dedup, and the Cursor set-task staleness nudge.
3
+ * council-pending hash-dedup, the cross-adapter first-session naming nudge,
4
+ * the Cursor/Codex set-task staleness nudge, and the Codex status-footer
5
+ * reminder.
4
6
  * agent-hook's user_prompt.submit post-emit handler calls this
5
- * and forwards the result as the harness-shaped additionalContext payload.
7
+ * and forwards the result as the adapter-shaped additionalContext payload.
6
8
  *
7
- * Three hash-dedup'd subsections combined into one additionalContext payload:
9
+ * Four subsections combined into one additionalContext payload:
8
10
  * 1. Peer table: semantically-relevant peer fields hashed; only re-emits
9
11
  * when peers change (name + instance_id + session_id + kind + started_at
10
12
  * + sorted(files_touched) + platform, sorted by instance_id).
11
13
  * 2. Council pending: pending open-council IDs hashed; re-emits when the
12
14
  * ID set changes.
13
- * 3. Task staleness nudge (cursor only, since CC enforces via the Stop hook
14
- * transcript scan). Fires when `task` is null or `task_updated_at` is
15
- * older than HARNERY_TASK_STALE_SECONDS (default 1800 = 30 min). Hash-deduped
16
- * against the previous nudge state.
15
+ * 3. Focus nudge. Before the first set-task in a human-facing session, tells
16
+ * every adapter to reproduce set-task's suggested session name in a fenced
17
+ * code block. Cursor/Codex additionally get the existing unset/stale-task
18
+ * reminder because their Stop hooks do not enforce task declarations as
19
+ * reliably as Claude Code's.
20
+ * 4. Codex status footer: a non-deduplicated reminder to put the live status
21
+ * box after the substantive answer. Stop stays observe-only, so missing the
22
+ * footer can never trigger a replacement response.
17
23
  *
18
24
  * Hash files live at:
19
25
  * .harnery/.last-peer-hash.<instance_id>
@@ -26,6 +32,7 @@ import { createHash } from "node:crypto";
26
32
  import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
27
33
  import { join } from "node:path";
28
34
  import { coordEnv } from "../../../lib/env.js";
35
+ import { resolveBinName } from "../../config.js";
29
36
  import { readRemoteMachines } from "../../presence/index.js";
30
37
  import { formatPendingCouncils } from "./session-context.js";
31
38
  /**
@@ -37,7 +44,7 @@ import { formatPendingCouncils } from "./session-context.js";
37
44
  * councils are pending, matching the bash behavior).
38
45
  */
39
46
  export function renderPromptContext(opts) {
40
- const { coordRoot, instanceId, sessionId, agentName, taskNudge } = opts;
47
+ const { coordRoot, instanceId, sessionId, agentName, sessionNameNudge, taskNudge, statusFooterNudge, } = opts;
41
48
  const sections = [];
42
49
  // 1. Peer table with hash dedup.
43
50
  const peerTable = computePeerTableIfChanged(coordRoot, instanceId, sessionId);
@@ -49,19 +56,42 @@ export function renderPromptContext(opts) {
49
56
  if (councilMsg)
50
57
  sections.push(councilMsg);
51
58
  }
52
- // 3. Task staleness nudge (cursor only).
53
- if (taskNudge) {
54
- const nudgeMsg = computeTaskNudgeIfChanged(coordRoot, instanceId);
59
+ // 3. First-session naming for every adapter, plus unset/stale-task reminders
60
+ // for Cursor/Codex. One state machine avoids a second generic "task unset"
61
+ // reminder immediately after the first-session reminder has been deduped.
62
+ if (sessionNameNudge || taskNudge) {
63
+ const nudgeMsg = computeFocusNudgeIfChanged(coordRoot, instanceId, {
64
+ sessionNameNudge: sessionNameNudge ?? false,
65
+ taskNudge: taskNudge ?? false,
66
+ });
55
67
  if (nudgeMsg)
56
68
  sections.push(nudgeMsg);
57
69
  }
70
+ // 4. Codex gets this on every prompt. It is intentionally not hash-deduped:
71
+ // the reminder must be fresh in the model's context when it writes the reply.
72
+ // Missing it is harmless because Codex Stop enforcement remains observe-only.
73
+ if (statusFooterNudge) {
74
+ const statusMsg = renderStatusFooterReminder(coordRoot, instanceId);
75
+ if (statusMsg)
76
+ sections.push(statusMsg);
77
+ }
58
78
  return sections.join("\n\n");
59
79
  }
60
- /** The set-task staleness nudge for Cursor.
61
- * Emits a one-line reminder when `task` is null or `task_updated_at` is older
62
- * than HARNERY_TASK_STALE_SECONDS (default 1800). Hash-deduped against previous
63
- * nudge state. */
64
- function computeTaskNudgeIfChanged(coordRoot, selfInstanceId) {
80
+ function renderStatusFooterReminder(coordRoot, selfInstanceId) {
81
+ const hb = readHeartbeat(join(coordRoot, ".harnery", "active", `${selfInstanceId}.json`));
82
+ if (!hb || hb.kind === "subagent" || hb.kind === "transient" || hb.workflow_run_id)
83
+ return "";
84
+ const bin = resolveBinName(coordRoot);
85
+ return ("Codex status footer: complete the user's request first. " +
86
+ `Then run \`${bin} agents status\` as your final shell call and append its stdout verbatim in a fenced code block at the bottom of the same substantive reply. ` +
87
+ "Keep the answer intact. If the footer is missed, do not retry or replace the reply; the Stop hook is observe-only.");
88
+ }
89
+ /**
90
+ * First-session naming for every adapter, followed by Cursor/Codex task
91
+ * staleness checks. The absence of `task_updated_at` is the same invariant
92
+ * `agents set-task` uses for `first_of_session`; clears still stamp the field.
93
+ */
94
+ function computeFocusNudgeIfChanged(coordRoot, selfInstanceId, opts) {
65
95
  const hbPath = join(coordRoot, ".harnery", "active", `${selfInstanceId}.json`);
66
96
  if (!existsSync(hbPath))
67
97
  return "";
@@ -72,39 +102,52 @@ function computeTaskNudgeIfChanged(coordRoot, selfInstanceId) {
72
102
  catch {
73
103
  return "";
74
104
  }
105
+ const hashFile = join(coordRoot, ".harnery", `.last-task-nudge-hash.${selfInstanceId}`);
106
+ // Subagents and workflow children have no human-owned session/tab to rename.
107
+ if (hb.kind === "subagent" || hb.kind === "transient" || hb.workflow_run_id) {
108
+ clearHashFile(hashFile);
109
+ return "";
110
+ }
111
+ const bin = resolveBinName(coordRoot);
75
112
  const threshold = Number.parseInt(coordEnv("TASK_STALE_SECONDS") ?? "1800", 10);
76
113
  const taskValue = hb.task ?? "";
77
114
  let needsNudge = false;
78
115
  let message = "";
79
- if (!taskValue) {
116
+ let nudgeKind = "";
117
+ if (opts.sessionNameNudge && !hb.task_updated_at) {
118
+ needsNudge = true;
119
+ nudgeKind = "session-name";
120
+ message =
121
+ `New session: run \`${bin} agents set-task "<2-5 word session topic>"\` as your first tool call. ` +
122
+ "When it returns `first_of_session: true`, reproduce its `suggested_session_name` value by itself inside a fenced code block at the very top of your reply so the operator can one-click-copy it as the session/tab title. " +
123
+ "Then continue with the task; that first `set-task` also satisfies this turn's focus declaration.";
124
+ }
125
+ else if (opts.taskNudge && !taskValue) {
80
126
  needsNudge = true;
127
+ nudgeKind = "task-unset";
81
128
  message =
82
- "Heads up: your `task` field is unset. Run `agents set-task \"<short focus>\"` so peers + the coord dashboard can see what you're working on. (Cursor sessions can't enforce this from the Stop hook the way Claude Code does, so this is a one-time soft reminder per staleness state.)";
129
+ `Heads up: your \`task\` field is unset. Run \`${bin} agents set-task "<short focus>"\` so peers + the coord dashboard can see what you're working on. ` +
130
+ "(This adapter cannot enforce the declaration from its Stop hook as reliably as Claude Code, so this is a one-time soft reminder per staleness state.)";
83
131
  }
84
- else if (hb.task_updated_at) {
132
+ else if (opts.taskNudge && hb.task_updated_at) {
85
133
  const updatedSec = Math.floor(Date.parse(hb.task_updated_at) / 1000);
86
134
  const nowSec = Math.floor(Date.now() / 1000);
87
135
  if (Number.isFinite(updatedSec) && updatedSec > 0) {
88
136
  const ageSec = nowSec - updatedSec;
89
137
  if (ageSec > threshold) {
90
138
  needsNudge = true;
91
- message = `Heads up: your \`task\` field hasn't changed in ${ageSec}s (threshold ${threshold}s). If you've moved on from "${taskValue.slice(0, 60)}", update via \`agents set-task "<new focus>"\`. Pass an empty string to clear.`;
139
+ nudgeKind = "task-stale";
140
+ message = `Heads up: your \`task\` field hasn't changed in ${ageSec}s (threshold ${threshold}s). If you've moved on from "${taskValue.slice(0, 60)}", update via \`${bin} agents set-task "<new focus>"\`. Pass an empty string to clear.`;
92
141
  }
93
142
  }
94
143
  }
95
- const hashFile = join(coordRoot, ".harnery", `.last-task-nudge-hash.${selfInstanceId}`);
96
144
  if (!needsNudge) {
97
- try {
98
- if (existsSync(hashFile))
99
- rmSync(hashFile, { force: true });
100
- }
101
- catch {
102
- /* swallow */
103
- }
145
+ clearHashFile(hashFile);
104
146
  return "";
105
147
  }
106
- // Dedup on a state-hash (task value + threshold) so same-state turns don't re-nudge.
107
- const state = `${taskValue}|stale=1|threshold=${threshold}`;
148
+ // Dedup on kind + task state so the first-session reminder does not turn into
149
+ // a generic "task unset" reminder on the next prompt before set-task runs.
150
+ const state = `${nudgeKind}|task=${taskValue}|updated=${hb.task_updated_at ?? ""}|threshold=${threshold}`;
108
151
  const newHash = sha256Hex16(state);
109
152
  const oldHash = safeRead(hashFile);
110
153
  if (oldHash && oldHash === newHash)
@@ -269,6 +312,15 @@ function safeRead(path) {
269
312
  return "";
270
313
  }
271
314
  }
315
+ function clearHashFile(path) {
316
+ try {
317
+ if (existsSync(path))
318
+ rmSync(path, { force: true });
319
+ }
320
+ catch {
321
+ /* swallow */
322
+ }
323
+ }
272
324
  function sha256Hex16(input) {
273
325
  return createHash("sha256").update(input).digest("hex").slice(0, 16);
274
326
  }
@@ -12,7 +12,7 @@ export interface RenderOpts {
12
12
  instanceId: string;
13
13
  sessionId: string;
14
14
  agentName?: string;
15
- /** Harness label rendered in parens after the self-name (e.g. "Cursor", "Codex").
15
+ /** Adapter label rendered in parens after the self-name (e.g. "Cursor", "Codex").
16
16
  * Claude Code omits it. */
17
17
  platformLabel?: string;
18
18
  }
@@ -10,7 +10,7 @@ import { spawnSync } from "node:child_process";
10
10
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
11
11
  import { join } from "node:path";
12
12
  import { resolveBinName, resolveHooksSetupHint } from "../../config.js";
13
- import { harneryVersion, loadHarnessWiring } from "../../hooks/harness/wiring.js";
13
+ import { harneryVersion, loadAdapterWiring } from "../../hooks/adapter/wiring.js";
14
14
  import { readRemoteMachines } from "../../presence/index.js";
15
15
  /**
16
16
  * Build the combined SessionStart systemMessage. Returns the additionalContext
@@ -52,11 +52,11 @@ export function renderSessionContext(opts) {
52
52
  const wiringSummary = `Coordination hooks are NOT wired: the E-guard will not block conflicting commits, and post-commit claim pruning will not run. ${fix} Detected:\n${wiringIssues.map((i) => ` - ${i}`).join("\n")}`;
53
53
  messages.push(wiringSummary);
54
54
  }
55
- // 5. Harness-hook drift: a harnery upgrade changed the hook set, but this
56
- // project's settings file hasn't been re-wired. Only fires for a harness the
55
+ // 5. Adapter-hook drift: a harnery upgrade changed the hook set, but this
56
+ // project's settings file hasn't been re-wired. Only fires for a adapter the
57
57
  // project already opted into (≥1 hook wired), so it never nags a project that
58
58
  // simply has a settings file. Remedy is always `<bin> init` (idempotent).
59
- const drift = loadHarnessWiring(coordRoot);
59
+ const drift = loadAdapterWiring(coordRoot);
60
60
  if (drift.length > 0) {
61
61
  const bin = resolveBinName(coordRoot);
62
62
  const ver = harneryVersion();
@@ -69,7 +69,7 @@ export function renderSessionContext(opts) {
69
69
  bits.push(`orphaned: ${d.orphans.join(", ")}`);
70
70
  return ` - ${d.settingsFile} — ${bits.join("; ")}`;
71
71
  });
72
- messages.push(`Harnery hook wiring is out of date${verPart}: an upgrade changed the hook set but the harness ` +
72
+ messages.push(`Harnery hook wiring is out of date${verPart}: an upgrade changed the hook set but the adapter ` +
73
73
  `settings file hasn't been re-wired, so the new hook(s) won't fire. Run \`${bin} init\` to wire them ` +
74
74
  `(idempotent, additive).\n${lines.join("\n")}`);
75
75
  }
@@ -13,12 +13,8 @@
13
13
  * Reads from `.harnery/active/<id>.json`, the single canonical heartbeat
14
14
  * location after Phase 8 collapsed the v1/v2 dual-write.
15
15
  */
16
- export type VerdictResult = {
17
- allow: boolean;
18
- exit_code: 0 | 2;
19
- rule: string;
20
- reason?: string;
21
- };
16
+ export type { VerdictResult } from "./verdict.js";
17
+ import type { VerdictResult } from "./verdict.js";
22
18
  export interface ClaimRequest {
23
19
  rule: "claim";
24
20
  instance_id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"claim-conflict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/claim-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAeF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,aAAa,CAoGjF"}
1
+ {"version":3,"file":"claim-conflict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/claim-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAelD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,aAAa,CAoGjF"}
@@ -290,7 +290,7 @@ function pruneClaimFromPeer(coordRoot, instanceId, relPath) {
290
290
  event_type: "claim.release",
291
291
  instance_id: instanceId,
292
292
  session_id: body.session_id ?? instanceId,
293
- harness: platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code",
293
+ adapter: platform === "cursor" ? "cursor" : platform === "codex" ? "codex" : "claude-code",
294
294
  source: "agent-coord",
295
295
  data: { path: target, reason: "heal" },
296
296
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
@@ -20,8 +20,8 @@
20
20
  * in that set are matched with the staged-is-gitlink rule.
21
21
  */
22
22
  import { spawnSync } from "node:child_process";
23
- import { existsSync, readdirSync, readFileSync } from "node:fs";
24
- import { join } from "node:path";
23
+ import { appendFileSync, existsSync, readdirSync, readFileSync } from "node:fs";
24
+ import { basename, dirname, join } from "node:path";
25
25
  import { coordFreshnessSeconds } from "../../config.js";
26
26
  import { instanceHasLivePid } from "../state/pidmap.js";
27
27
  export function evaluateCommit(coordRoot, req) {
@@ -134,12 +134,37 @@ function findOverlap(staged, files, coordRoot, stagedIsGitlink) {
134
134
  }
135
135
  return null;
136
136
  }
137
+ /**
138
+ * Repository-discovery environment that git exports to its own hooks.
139
+ *
140
+ * A hook runs with GIT_DIR (and friends) already pointing at the repository
141
+ * being committed, and every child inherits them. That silently outranks `cwd`,
142
+ * so a probe launched from some other directory still interrogates the hook's
143
+ * repository. Committing inside a submodule therefore asked the submodule about
144
+ * superproject paths and vice versa, and the answers were wrong in whichever
145
+ * direction did not match. Scrubbing these lets git rediscover the repository
146
+ * from `cwd`, which is the whole point of choosing a `cwd` per path.
147
+ */
148
+ const GIT_DISCOVERY_VARS = [
149
+ "GIT_DIR",
150
+ "GIT_WORK_TREE",
151
+ "GIT_COMMON_DIR",
152
+ "GIT_INDEX_FILE",
153
+ "GIT_OBJECT_DIRECTORY",
154
+ "GIT_ALTERNATE_OBJECT_DIRECTORIES",
155
+ "GIT_PREFIX",
156
+ "GIT_NAMESPACE",
157
+ ];
158
+ /** Run a read-only git probe in `cwd`, free of the caller's repo environment. */
159
+ function gitProbe(args, cwd) {
160
+ const env = { ...process.env };
161
+ for (const v of GIT_DISCOVERY_VARS)
162
+ delete env[v];
163
+ const result = spawnSync("git", args, { cwd, env, encoding: "utf8", timeout: 2000 });
164
+ return { status: result.status ?? 1, stdout: result.stdout ?? "" };
165
+ }
137
166
  function isGitlinkInIndex(coordRoot, path) {
138
- const result = spawnSync("git", ["ls-files", "--stage", "--", path], {
139
- cwd: coordRoot,
140
- encoding: "utf8",
141
- timeout: 2000,
142
- });
167
+ const result = gitProbe(["ls-files", "--stage", "--", path], coordRoot);
143
168
  if (result.status !== 0)
144
169
  return false;
145
170
  // ls-files --stage emits "<mode> <sha> <stage>\t<path>"; mode 160000 = gitlink.
@@ -147,43 +172,94 @@ function isGitlinkInIndex(coordRoot, path) {
147
172
  }
148
173
  function isHolderSelfAttributed(coordRoot, holderId, stagedSet, peers) {
149
174
  // Gate B (cheaper): live foreign pid-map entry blocks self-attribution.
150
- if (holderHasLiveForeignPid(coordRoot, holderId))
175
+ if (holderHasLiveForeignPid(coordRoot, holderId)) {
176
+ debugGate(coordRoot, { holder: holderId, gate: "B", reason: "live_pid_anchor" });
151
177
  return false;
178
+ }
152
179
  // Gate A: every held path is either in the staged set or already clean in HEAD.
153
180
  const holder = peers.find((p) => p.instance_id === holderId);
154
- if (!holder)
181
+ if (!holder) {
182
+ debugGate(coordRoot, { holder: holderId, gate: "A", reason: "holder_not_found" });
155
183
  return false;
184
+ }
156
185
  const files = holder.files_touched ?? [];
157
- if (files.length === 0)
186
+ if (files.length === 0) {
187
+ debugGate(coordRoot, { holder: holderId, gate: "A", reason: "holder_holds_nothing" });
158
188
  return false;
189
+ }
159
190
  for (const held of files) {
160
191
  if (stagedSet.has(held))
161
192
  continue;
162
193
  if (isPathCleanInHead(coordRoot, held))
163
194
  continue;
195
+ if (isPathIgnoredByGit(coordRoot, held))
196
+ continue;
197
+ debugGate(coordRoot, { holder: holderId, gate: "A", reason: "path_unverifiable", path: held });
164
198
  return false;
165
199
  }
166
200
  return true;
167
201
  }
202
+ /**
203
+ * Append one line explaining a refused gate, when HARNERY_COORD_DEBUG is set.
204
+ *
205
+ * Worth carrying permanently: the deciding state lives inside a git hook, whose
206
+ * stderr the caller discards and whose process is gone before anyone can look.
207
+ * Reconstructing a refusal afterwards means guessing, because the holder's claim
208
+ * set has moved on by then. This turns that into evidence.
209
+ */
210
+ function debugGate(coordRoot, detail) {
211
+ if (!process.env.HARNERY_COORD_DEBUG)
212
+ return;
213
+ try {
214
+ appendFileSync(join(coordRoot, ".harnery", "coord-debug.ndjson"), `${JSON.stringify({ event: "self_attribution_refused", pid: process.pid, ...detail })}\n`, "utf8");
215
+ }
216
+ catch {
217
+ /* diagnostics never break a verdict */
218
+ }
219
+ }
220
+ /**
221
+ * Does git ignore this path?
222
+ *
223
+ * Such a claim is safe to look past. Agents write journal files into ignored
224
+ * directories constantly, and each one used to leave a claim that Gate A could
225
+ * never vouch for: not staged, not tracked, therefore "unknown", therefore
226
+ * blocked. That defeated self-attribution for the rest of a session and taught
227
+ * agents to reach for the bypass. An ignored path cannot enter anyone's commit,
228
+ * so it cannot be work this commit might clobber. A merely untracked path is a
229
+ * different matter and still counts against the holder, since anybody could add
230
+ * it.
231
+ */
232
+ function isPathIgnoredByGit(coordRoot, relPath) {
233
+ const abs = join(coordRoot, relPath);
234
+ const cwd = dirname(abs);
235
+ if (!existsSync(cwd))
236
+ return false;
237
+ // check-ignore exits 0 when the path is ignored, 1 when it is not.
238
+ return gitProbe(["check-ignore", "--quiet", "--", basename(abs)], cwd).status === 0;
239
+ }
168
240
  function holderHasLiveForeignPid(coordRoot, holderId) {
169
241
  return instanceHasLivePid(coordRoot, holderId);
170
242
  }
171
243
  function isPathCleanInHead(coordRoot, relPath) {
172
244
  // Path is tracked + diff-clean against HEAD = "already committed, holder
173
245
  // hasn't released the claim yet". Counts as self-attributable.
174
- const tracked = spawnSync("git", ["ls-files", "--error-unmatch", "--", relPath], {
175
- cwd: coordRoot,
176
- encoding: "utf8",
177
- timeout: 2000,
178
- });
179
- if (tracked.status !== 0)
246
+ //
247
+ // Ask the repository that actually tracks the path, by running git from the
248
+ // file's own directory instead of the coord root. Claims are recorded
249
+ // monorepo-relative, so a submodule file arrives here as `sub/src/x.ts`, and
250
+ // the superproject does not track submodule contents: asking it always
251
+ // answered "not tracked". Gate A therefore failed for every submodule path,
252
+ // self-attribution never suppressed a submodule commit, and the operator paid
253
+ // a HARNERY_AGENT_COORD_BYPASS=1 per commit. Running from the file's directory
254
+ // lands in the submodule's own repo and handles any nesting depth.
255
+ const abs = join(coordRoot, relPath);
256
+ const cwd = dirname(abs);
257
+ const base = basename(abs);
258
+ if (!existsSync(cwd))
259
+ return false;
260
+ if (gitProbe(["ls-files", "--error-unmatch", "--", base], cwd).status !== 0)
180
261
  return false;
181
- const diff = spawnSync("git", ["diff", "--quiet", "HEAD", "--", relPath], {
182
- cwd: coordRoot,
183
- encoding: "utf8",
184
- timeout: 2000,
185
- });
186
- return diff.status === 0;
262
+ return gitProbe(["diff", "--quiet", "HEAD", "--", base], cwd).status === 0;
187
263
  }
188
264
  function readActivePeers(coordRoot) {
189
265
  const dir = join(coordRoot, ".harnery", "active");
@@ -2,6 +2,10 @@
2
2
  * Stop-hook verdict: rule 1/3, 2/3, 3/3 enforcement evaluated
3
3
  * from the canonical event stream alone (no transcript scan).
4
4
  *
5
+ * Codex is observe-only: its Stop continuation can replace the user-facing
6
+ * answer in clients that retain only the final continuation response.
7
+ *
8
+ * Enforced adapters:
5
9
  * Rule 1/3: `state.status_checked` event with matching turn boundary exists.
6
10
  * Rule 2/3: latest `turn.stop` event has `status_box_present: true` (or the
7
11
  * stop currently firing carries that field via the in-flight event
@@ -12,19 +16,15 @@
12
16
  * the current turn, rules 1/3 and 3/3 do not apply. Rule 2/3 still applies
13
17
  * as a user-visible mobile cue.
14
18
  */
15
- export type VerdictResult = {
16
- allow: boolean;
17
- exit_code: 0 | 2;
18
- rule: string;
19
- reason?: string;
20
- };
19
+ export type { VerdictResult } from "./verdict.js";
20
+ import type { VerdictResult } from "./verdict.js";
21
21
  export interface StopHookRequest {
22
22
  rule: "stop-hook";
23
23
  instance_id: string;
24
24
  session_id?: string;
25
- /** Firing harness. Selects the end-of-turn ack signal (see `ackSignalFor`).
25
+ /** Firing adapter. Selects the end-of-turn ack signal (see `ackSignalFor`).
26
26
  * Undefined → Claude Code semantics (transcript-scanned status box). */
27
- harness?: string;
27
+ adapter?: string;
28
28
  /** Wall-clock cutoff for the current turn; events strictly after this are not yet relevant. */
29
29
  now_ms?: number;
30
30
  /** Override the turn-window discovery (used by tests). */
@@ -36,7 +36,7 @@ export interface StopHookRequest {
36
36
  bypass?: boolean;
37
37
  /** Headless child spawned by `harn workflow` (HARNERY_WORKFLOW_CHILD=1).
38
38
  * The end-of-turn ritual exists to surface status to a HUMAN reader; a
39
- * workflow child reports to the engine's journal instead, so the ritual is
39
+ * workflow child reports to the engine's transcript instead, so the ritual is
40
40
  * meaningless there — worse, blocking burns the child's turn budget on
41
41
  * re-prompts (observed as error_max_turns in the Phase 1 spike). Exempting
42
42
  * here, rather than disabling the child's hooks wholesale, keeps heartbeat +
@@ -1 +1 @@
1
- {"version":3,"file":"stop-hook.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/stop-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAcF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;4EACwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,yFAAyF;IACzF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;iFAM6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA+BD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,aAAa,CAoGvF"}
1
+ {"version":3,"file":"stop-hook.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/stop-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAclD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;4EACwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,yFAAyF;IACzF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;iFAM6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA+BD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,aAAa,CAmHvF"}
@@ -2,6 +2,10 @@
2
2
  * Stop-hook verdict: rule 1/3, 2/3, 3/3 enforcement evaluated
3
3
  * from the canonical event stream alone (no transcript scan).
4
4
  *
5
+ * Codex is observe-only: its Stop continuation can replace the user-facing
6
+ * answer in clients that retain only the final continuation response.
7
+ *
8
+ * Enforced adapters:
5
9
  * Rule 1/3: `state.status_checked` event with matching turn boundary exists.
6
10
  * Rule 2/3: latest `turn.stop` event has `status_box_present: true` (or the
7
11
  * stop currently firing carries that field via the in-flight event
@@ -15,8 +19,8 @@
15
19
  import { existsSync, readFileSync } from "node:fs";
16
20
  import { join } from "node:path";
17
21
  import { resolveBinName } from "../../config.js";
18
- function ackSignalFor(harness) {
19
- return harness === "cursor" ? "status_checked" : "status_box_present";
22
+ function ackSignalFor(adapter) {
23
+ return adapter === "cursor" ? "status_checked" : "status_box_present";
20
24
  }
21
25
  const RECENT_EVENT_WINDOW_LINES = 5_000;
22
26
  /**
@@ -41,6 +45,20 @@ export function evaluateStopHook(coordRoot, req) {
41
45
  reason: "HARNERY_WORKFLOW_CHILD=1: headless workflow child; ritual not applicable",
42
46
  };
43
47
  }
48
+ // A blocked Codex Stop does not reject the turn. Codex creates a continuation
49
+ // prompt and asks the model to answer again. Some clients retain only that
50
+ // final continuation response, so a coordination reminder can replace a
51
+ // correct user-facing answer with status output. The Stop path has already
52
+ // emitted turn.stop and projected the coordination state before this verdict
53
+ // runs. Keep that telemetry, but never continue a Codex turn for this ritual.
54
+ if (req.adapter === "codex") {
55
+ return {
56
+ allow: true,
57
+ exit_code: 0,
58
+ rule: "stop-hook.codex_observe_only",
59
+ reason: "Codex Stop continuations must not replace the user-facing answer",
60
+ };
61
+ }
44
62
  let events;
45
63
  try {
46
64
  events = readRecentEvents(coordRoot, RECENT_EVENT_WINDOW_LINES);
@@ -84,15 +102,15 @@ export function evaluateStopHook(coordRoot, req) {
84
102
  // fired turn.stop is already in the stream.
85
103
  const latestTurnStop = [...inTurn].reverse().find((e) => e.event_type === "turn.stop");
86
104
  const boxPresent = latestTurnStop ? Boolean(latestTurnStop.data.status_box_present) : false;
87
- // Harness-aware end-of-turn ack signal (see `ackSignalFor`). On Cursor the
105
+ // Adapter-aware end-of-turn ack signal (see `ackSignalFor`). On Cursor the
88
106
  // ack is `status_checked` (running `harn agents status` shows the box inline);
89
107
  // on Claude Code / Codex it's the transcript-scanned `status_box_present`.
90
108
  // The matching block helper carries the right "how to fix" message.
91
- const ackSignal = ackSignalFor(req.harness);
109
+ const ackSignal = ackSignalFor(req.adapter);
92
110
  const ackPresent = ackSignal === "status_checked" ? statusChecked : boxPresent;
93
111
  const ackBlock = ackSignal === "status_checked" ? rule13Block : rule23Block;
94
112
  // Pure-prose-turn exemption: only the ack signal applies. Parity
95
- // across harnesses: CC requires the box; Cursor requires status_checked.
113
+ // across adapters: CC requires the box; Cursor requires status_checked.
96
114
  if (!toolPreUseInTurn) {
97
115
  if (!ackPresent) {
98
116
  return ackBlock();
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The shape every coordination rule returns.
3
+ *
4
+ * Declared here once. The claim-conflict and stop-hook rules each carried a
5
+ * byte-identical private copy, which is how two rules drift into disagreeing
6
+ * about what a verdict is.
7
+ */
8
+ export type VerdictResult = {
9
+ allow: boolean;
10
+ exit_code: 0 | 2;
11
+ rule: string;
12
+ reason?: string;
13
+ };
14
+ //# sourceMappingURL=verdict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/verdict.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -11,7 +11,7 @@ import { randomBytes } from "node:crypto";
11
11
  import { existsSync, readFileSync } from "node:fs";
12
12
  import { dirname, resolve } from "node:path";
13
13
  // Kept dependency-light: vendored verbatim into a downstream consumer, so no coordEnv import.
14
- import { normalizeHarness, resolveEmitRoot } from "./canonical-emit.js";
14
+ import { normalizeAdapter, resolveEmitRoot } from "./canonical-emit.js";
15
15
  import { emit } from "./events/emit.js";
16
16
  /**
17
17
  * Resolved path of the ndjson sidecar file. Lives inside `.harnery/` so a
@@ -100,7 +100,7 @@ function enrichFromHeartbeat(coordRoot, instanceId) {
100
100
  const hb = JSON.parse(readFileSync(hbPath, "utf8"));
101
101
  const enrichment = {
102
102
  session_id: hb.session_id || instanceId,
103
- harness: normalizeHarness(hb.platform),
103
+ adapter: normalizeAdapter(hb.platform),
104
104
  at: now,
105
105
  };
106
106
  enrichCache.set(instanceId, enrichment);
@@ -151,7 +151,7 @@ function emitCanonicalCommand(type, fields) {
151
151
  event_type: eventType,
152
152
  instance_id: instanceId,
153
153
  session_id: enrich.session_id,
154
- harness: enrich.harness,
154
+ adapter: enrich.adapter,
155
155
  data: canonicalData(type, fields),
156
156
  });
157
157
  }
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * This module owns: lifecycle (advance, close, archive, unarchive, delete)
9
9
  * and steward reassignment. Council CREATION + contribution writes stay
10
- * separate (operator-side, harness-agnostic).
10
+ * separate (operator-side, adapter-agnostic).
11
11
  */
12
12
  export declare function advanceCouncil(coordRoot: string, councilId: string, opts?: {
13
13
  force?: boolean;
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * This module owns: lifecycle (advance, close, archive, unarchive, delete)
9
9
  * and steward reassignment. Council CREATION + contribution writes stay
10
- * separate (operator-side, harness-agnostic).
10
+ * separate (operator-side, adapter-agnostic).
11
11
  */
12
12
  import { cpSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
13
13
  import { dirname, join } from "node:path";
@@ -12,7 +12,7 @@ import type { CanonicalEvent } from "../events/consume.js";
12
12
  export interface V2Heartbeat {
13
13
  instance_id: string;
14
14
  session_id: string;
15
- harness: string;
15
+ adapter: string;
16
16
  agent_id?: string;
17
17
  name?: string;
18
18
  kind?: "session" | "subagent" | "transient";
@@ -20,8 +20,9 @@ export interface V2Heartbeat {
20
20
  platform?: string;
21
21
  subagent_call_id?: string;
22
22
  parent_session_id?: string;
23
- /** Set iff this owner is a `workflow run` child (joins to the run journal). */
23
+ /** Set iff this owner is a `workflow run` child (joins to the run transcript). */
24
24
  workflow_run_id?: string;
25
+ workflow_agent_id?: string;
25
26
  started_at?: string;
26
27
  last_heartbeat: string;
27
28
  last_tool?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-projector.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-projector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,OAAO,EAAE;QACP,cAAc,EAAE,CAAC,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,cAAc,EAAE,GAChC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;CAAE,CAoD9D;AAyXD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3E"}
1
+ {"version":3,"file":"heartbeat-projector.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/state/heartbeat-projector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,OAAO,EAAE;QACP,cAAc,EAAE,CAAC,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,cAAc,EAAE,GAChC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;CAAE,CAoD9D;AA4XD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3E"}